ipath_sysfs.c revision 15cba26f42c13ca30cbb4388f132ac0ddf4df538
13e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan/* 287427da55bc03dbce7906a5b09ed50279d654d28John Gregor * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved. 33e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * Copyright (c) 2006 PathScale, Inc. All rights reserved. 43e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 53e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * This software is available to you under a choice of one of two 63e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * licenses. You may choose to be licensed under the terms of the GNU 73e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * General Public License (GPL) Version 2, available from the file 83e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * COPYING in the main directory of this source tree, or the 93e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * OpenIB.org BSD license below: 103e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 113e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * Redistribution and use in source and binary forms, with or 123e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * without modification, are permitted provided that the following 133e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * conditions are met: 143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * - Redistributions of source code must retain the above 163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * copyright notice, this list of conditions and the following 173e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * disclaimer. 183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * - Redistributions in binary form must reproduce the above 203e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * copyright notice, this list of conditions and the following 213e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * disclaimer in the documentation and/or other materials 223e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * provided with the distribution. 233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 243e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 293e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * SOFTWARE. 323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan */ 333e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan#include <linux/ctype.h> 353e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 363e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan#include "ipath_kernel.h" 3727b678dd04a636f2c351816f4b3042c8815d4e9dBryan O'Sullivan#include "ipath_common.h" 383e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 393e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan/** 403e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * ipath_parse_ushort - parse an unsigned short value in an arbitrary base 413e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * @str: the string containing the number 423e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * @valp: where to put the result 433e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 443e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * returns the number of bytes consumed, or negative value on error 453e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan */ 463e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanint ipath_parse_ushort(const char *str, unsigned short *valp) 473e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 483e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan unsigned long val; 493e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *end; 503e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret; 513e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 523e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (!isdigit(str[0])) { 533e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 573e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan val = simple_strtoul(str, &end, 0); 583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (val > 0xffff) { 603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan *valp = val; 653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 663e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = end + 1 - str; 673e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret == 0) 683e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 693e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 703e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 713e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 723e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_version(struct device_driver *dev, char *buf) 753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan /* The string printed here is already newline-terminated. */ 77b55f4f06c834a67f949a5219c5f97ffafa240989Bryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%s", ib_ipath_version); 783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_num_units(struct device_driver *dev, char *buf) 813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%d\n", 833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_count_units(NULL, NULL, NULL)); 843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_status(struct device *dev, 873e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ssize_t ret; 923e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (!dd->ipath_statusp) { 943e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = scnprintf(buf, PAGE_SIZE, "0x%llx\n", 993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan (unsigned long long) *(dd->ipath_statusp)); 1003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1013e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 1023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 1033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 1043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic const char *ipath_status_str[] = { 1063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "Initted", 1073e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "Disabled", 1083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "Admin_Disabled", 1090fd41363e0785247b7c19127318abc8b5eacc86bBryan O'Sullivan "", /* This used to be the old "OIB_SMA" status. */ 1100fd41363e0785247b7c19127318abc8b5eacc86bBryan O'Sullivan "", /* This used to be the old "SMA" status. */ 1113e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "Present", 1123e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "IB_link_up", 1133e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "IB_configured", 1143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "NoIBcable", 1153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "Fatal_Hardware_Error", 1163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan NULL, 1173e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 1183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_status_str(struct device *dev, 1203e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 1213e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 1223e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 1233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 1243e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int i, any; 1253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u64 s; 1263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ssize_t ret; 1273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (!dd->ipath_statusp) { 1293e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 1303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 1313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 1323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1333e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan s = *(dd->ipath_statusp); 1343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan *buf = '\0'; 1353e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan for (any = i = 0; s && ipath_status_str[i]; i++) { 1363e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (s & 1) { 1373e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (any && strlcat(buf, " ", PAGE_SIZE) >= 1383e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan PAGE_SIZE) 1393e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan /* overflow */ 1403e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan break; 1413e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (strlcat(buf, ipath_status_str[i], 1423e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan PAGE_SIZE) >= PAGE_SIZE) 1433e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan break; 1443e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan any = 1; 1453e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 1463e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan s >>= 1; 1473e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 1483e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (any) 1493e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan strlcat(buf, "\n", PAGE_SIZE); 1503e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1513e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = strlen(buf); 1523e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1533e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 1543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 1553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 1563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 1573e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_boardversion(struct device *dev, 1583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 1593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 1603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 1613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 1623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan /* The string printed here is already newline-terminated. */ 1633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%s", dd->ipath_boardversion); 1643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 1653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 16615cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbellstatic ssize_t show_lmc(struct device *dev, 16715cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell struct device_attribute *attr, 16815cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell char *buf) 16915cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell{ 17015cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell struct ipath_devdata *dd = dev_get_drvdata(dev); 17115cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 17215cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_lmc); 17315cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell} 17415cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 17515cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbellstatic ssize_t store_lmc(struct device *dev, 17615cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell struct device_attribute *attr, 17715cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell const char *buf, 17815cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell size_t count) 17915cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell{ 18015cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell struct ipath_devdata *dd = dev_get_drvdata(dev); 18115cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell u16 lmc = 0; 18215cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell int ret; 18315cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 18415cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell ret = ipath_parse_ushort(buf, &lmc); 18515cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell if (ret < 0) 18615cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell goto invalid; 18715cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 18815cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell if (lmc > 7) { 18915cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell ret = -EINVAL; 19015cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell goto invalid; 19115cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell } 19215cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 19315cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell ipath_set_lid(dd, dd->ipath_lid, lmc); 19415cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 19515cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell goto bail; 19615cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbellinvalid: 19715cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell ipath_dev_err(dd, "attempt to set invalid LMC %u\n", lmc); 19815cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbellbail: 19915cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell return ret; 20015cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell} 20115cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell 2023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_lid(struct device *dev, 2033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 2043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 2053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 2063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 2073e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "0x%x\n", dd->ipath_lid); 2093e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 2103e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2113e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_lid(struct device *dev, 2123e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 2133e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 2143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 2153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 2163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 2171eb68b990aab4c007e520acae39c74d8116693bcBryan O'Sullivan u16 lid = 0; 2183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret; 2193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2203e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_parse_ushort(buf, &lid); 2213e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret < 0) 2223e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 2233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 22427b678dd04a636f2c351816f4b3042c8815d4e9dBryan O'Sullivan if (lid == 0 || lid >= IPATH_MULTICAST_LID_BASE) { 2253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 2263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 2273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 2283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 22915cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell ipath_set_lid(dd, lid, dd->ipath_lmc); 2303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 2323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivaninvalid: 2331eb68b990aab4c007e520acae39c74d8116693bcBryan O'Sullivan ipath_dev_err(dd, "attempt to set invalid LID 0x%x\n", lid); 2343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 2353e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 2363e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 2373e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2383e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_mlid(struct device *dev, 2393e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 2403e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 2413e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 2423e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 2433e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2443e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "0x%x\n", dd->ipath_mlid); 2453e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 2463e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2473e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_mlid(struct device *dev, 2483e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 2493e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 2503e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 2513e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 2523e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 2533e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u16 mlid; 2543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret; 2553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_parse_ushort(buf, &mlid); 25727b678dd04a636f2c351816f4b3042c8815d4e9dBryan O'Sullivan if (ret < 0 || mlid < IPATH_MULTICAST_LID_BASE) 2583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 2593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd->ipath_mlid = mlid; 2613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 2633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivaninvalid: 2643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_dev_err(dd, "attempt to set invalid MLID\n"); 2653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 2663e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 2673e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 2683e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2693e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_guid(struct device *dev, 2703e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 2713e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 2723e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 2733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 2743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u8 *guid; 2753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan guid = (u8 *) & (dd->ipath_guid); 2773e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, 2793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", 2803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan guid[0], guid[1], guid[2], guid[3], 2813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan guid[4], guid[5], guid[6], guid[7]); 2823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 2833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_guid(struct device *dev, 2853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 2863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 2873e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 2883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 2893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 2903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ssize_t ret; 2913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan unsigned short guid[8]; 29211b054fe1d453954449a86de178bb98274bb86efBryan O'Sullivan __be64 new_guid; 2933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u8 *ng; 2943e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int i; 2953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 2963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (sscanf(buf, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", 2973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &guid[0], &guid[1], &guid[2], &guid[3], 2983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &guid[4], &guid[5], &guid[6], &guid[7]) != 8) 2993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 3003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 30111b054fe1d453954449a86de178bb98274bb86efBryan O'Sullivan ng = (u8 *) &new_guid; 3023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan for (i = 0; i < 8; i++) { 3043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (guid[i] > 0xff) 3053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 3063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ng[i] = guid[i]; 3073e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 3083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 30911b054fe1d453954449a86de178bb98274bb86efBryan O'Sullivan if (new_guid == 0) 31011b054fe1d453954449a86de178bb98274bb86efBryan O'Sullivan goto invalid; 31111b054fe1d453954449a86de178bb98274bb86efBryan O'Sullivan 31211b054fe1d453954449a86de178bb98274bb86efBryan O'Sullivan dd->ipath_guid = new_guid; 3133e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd->ipath_nguid = 1; 3143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = strlen(buf); 3163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 3173e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivaninvalid: 3193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_dev_err(dd, "attempt to set invalid GUID\n"); 3203e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 3213e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3223e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 3233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 3243e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 3253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_nguid(struct device *dev, 3273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 3283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 3293e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 3303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 3313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_nguid); 3333e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 3343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3359929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivanstatic ssize_t show_nports(struct device *dev, 3369929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan struct device_attribute *attr, 3379929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan char *buf) 3389929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan{ 3399929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 3409929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan 3419929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan /* Return the number of user ports available. */ 3429929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_cfgports - 1); 3439929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan} 3449929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan 3453e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_serial(struct device *dev, 3463e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 3473e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 3483e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 3493e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 3503e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3513e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan buf[sizeof dd->ipath_serial] = '\0'; 3523e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan memcpy(buf, dd->ipath_serial, sizeof dd->ipath_serial); 3533e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan strcat(buf, "\n"); 3543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return strlen(buf); 3553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 3563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3573e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_unit(struct device *dev, 3583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 3593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 3603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 3613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 3623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_unit); 3643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 3653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3663e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan#define DEVICE_COUNTER(name, attr) \ 3673e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan static ssize_t show_counter_##name(struct device *dev, \ 3683e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, \ 3693e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) \ 3703e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan { \ 3713e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); \ 3723e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(\ 3733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan buf, PAGE_SIZE, "%llu\n", (unsigned long long) \ 3743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_snap_cntr( \ 3753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd, offsetof(struct infinipath_counters, \ 3763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan attr) / sizeof(u64))); \ 3773e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } \ 3783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan static DEVICE_ATTR(name, S_IRUGO, show_counter_##name, NULL); 3793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 3803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(ib_link_downeds, IBLinkDownedCnt); 3813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(ib_link_err_recoveries, IBLinkErrRecoveryCnt); 3823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(ib_status_changes, IBStatusChangeCnt); 3833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(ib_symbol_errs, IBSymbolErrCnt); 3843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(lb_flow_stalls, LBFlowStallCnt); 3853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(lb_ints, LBIntCnt); 3863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_bad_formats, RxBadFormatCnt); 3873e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_buf_ovfls, RxBufOvflCnt); 3883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_data_pkts, RxDataPktCnt); 3893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_dropped_pkts, RxDroppedPktCnt); 3903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_dwords, RxDwordCnt); 3913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_ebps, RxEBPCnt); 3923e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_flow_ctrl_errs, RxFlowCtrlErrCnt); 3933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_flow_pkts, RxFlowPktCnt); 3943e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_icrc_errs, RxICRCErrCnt); 3953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_len_errs, RxLenErrCnt); 3963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_link_problems, RxLinkProblemCnt); 3973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_lpcrc_errs, RxLPCRCErrCnt); 3983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_max_min_len_errs, RxMaxMinLenErrCnt); 3993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p0_hdr_egr_ovfls, RxP0HdrEgrOvflCnt); 4003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p1_hdr_egr_ovfls, RxP1HdrEgrOvflCnt); 4013e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p2_hdr_egr_ovfls, RxP2HdrEgrOvflCnt); 4023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p3_hdr_egr_ovfls, RxP3HdrEgrOvflCnt); 4033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p4_hdr_egr_ovfls, RxP4HdrEgrOvflCnt); 4043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p5_hdr_egr_ovfls, RxP5HdrEgrOvflCnt); 4053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p6_hdr_egr_ovfls, RxP6HdrEgrOvflCnt); 4063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p7_hdr_egr_ovfls, RxP7HdrEgrOvflCnt); 4073e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_p8_hdr_egr_ovfls, RxP8HdrEgrOvflCnt); 4083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_pkey_mismatches, RxPKeyMismatchCnt); 4093e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_tid_full_errs, RxTIDFullErrCnt); 4103e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_tid_valid_errs, RxTIDValidErrCnt); 4113e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(rx_vcrc_errs, RxVCRCErrCnt); 4123e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_data_pkts, TxDataPktCnt); 4133e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_dropped_pkts, TxDroppedPktCnt); 4143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_dwords, TxDwordCnt); 4153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_flow_pkts, TxFlowPktCnt); 4163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_flow_stalls, TxFlowStallCnt); 4173e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_len_errs, TxLenErrCnt); 4183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_max_min_len_errs, TxMaxMinLenErrCnt); 4193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_underruns, TxUnderrunCnt); 4203e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'SullivanDEVICE_COUNTER(tx_unsup_vl_errs, TxUnsupVLErrCnt); 4213e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 4223e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic struct attribute *dev_counter_attributes[] = { 4233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_ib_link_downeds.attr, 4243e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_ib_link_err_recoveries.attr, 4253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_ib_status_changes.attr, 4263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_ib_symbol_errs.attr, 4273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_lb_flow_stalls.attr, 4283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_lb_ints.attr, 4293e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_bad_formats.attr, 4303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_buf_ovfls.attr, 4313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_data_pkts.attr, 4323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_dropped_pkts.attr, 4333e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_dwords.attr, 4343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_ebps.attr, 4353e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_flow_ctrl_errs.attr, 4363e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_flow_pkts.attr, 4373e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_icrc_errs.attr, 4383e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_len_errs.attr, 4393e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_link_problems.attr, 4403e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_lpcrc_errs.attr, 4413e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_max_min_len_errs.attr, 4423e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p0_hdr_egr_ovfls.attr, 4433e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p1_hdr_egr_ovfls.attr, 4443e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p2_hdr_egr_ovfls.attr, 4453e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p3_hdr_egr_ovfls.attr, 4463e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p4_hdr_egr_ovfls.attr, 4473e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p5_hdr_egr_ovfls.attr, 4483e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p6_hdr_egr_ovfls.attr, 4493e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p7_hdr_egr_ovfls.attr, 4503e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_p8_hdr_egr_ovfls.attr, 4513e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_pkey_mismatches.attr, 4523e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_tid_full_errs.attr, 4533e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_tid_valid_errs.attr, 4543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_rx_vcrc_errs.attr, 4553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_data_pkts.attr, 4563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_dropped_pkts.attr, 4573e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_dwords.attr, 4583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_flow_pkts.attr, 4593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_flow_stalls.attr, 4603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_len_errs.attr, 4613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_max_min_len_errs.attr, 4623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_underruns.attr, 4633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_tx_unsup_vl_errs.attr, 4643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan NULL 4653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 4663e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 4673e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic struct attribute_group dev_counter_attr_group = { 4683e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan .name = "counters", 4693e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan .attrs = dev_counter_attributes 4703e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 4713e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 4723e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_reset(struct device *dev, 4733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 4743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 4753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 4763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 4773e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 4783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret; 4793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 4803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (count < 5 || memcmp(buf, "reset", 5)) { 4813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 4823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 4833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 4843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 4853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (dd->ipath_flags & IPATH_DISABLED) { 4863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan /* 4873e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * post-reset init would re-enable interrupts, etc. 4883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * so don't allow reset on disabled devices. Not 4893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * perfect error, but about the best choice. 4903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan */ 4913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dev_info(dev,"Unit %d is disabled, can't reset\n", 4923e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd->ipath_unit); 4933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = -EINVAL; 4943e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 4953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_reset_device(dd->ipath_unit); 4963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 4973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret<0 ? ret : count; 4983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 4993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_link_state(struct device *dev, 5013e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 5023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 5033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 5043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 5053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 5063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret, r; 5073e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u16 state; 5083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5093e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_parse_ushort(buf, &state); 5103e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret < 0) 5113e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 5123e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 51334b2aafea38efdf02cd8107a6e1057e2a297c447Bryan O'Sullivan r = ipath_set_linkstate(dd, state); 5143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (r < 0) { 5153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = r; 5163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 5173e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 5183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 5203e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivaninvalid: 5213e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_dev_err(dd, "attempt to set invalid link state\n"); 5223e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 5233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 5243e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 5253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_mtu(struct device *dev, 5273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 5283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 5293e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 5303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 5313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_ibmtu); 5323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 5333e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_mtu(struct device *dev, 5353e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 5363e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 5373e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 5383e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 5393e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 5403e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ssize_t ret; 5413e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u16 mtu = 0; 5423e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int r; 5433e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5443e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_parse_ushort(buf, &mtu); 5453e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret < 0) 5463e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto invalid; 5473e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 54834b2aafea38efdf02cd8107a6e1057e2a297c447Bryan O'Sullivan r = ipath_set_mtu(dd, mtu); 5493e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (r < 0) 5503e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = r; 5513e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5523e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 5533e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivaninvalid: 5543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_dev_err(dd, "attempt to set invalid MTU\n"); 5553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 5563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 5573e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 5583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t show_enabled(struct device *dev, 5603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 5613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char *buf) 5623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 5633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 5643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return scnprintf(buf, PAGE_SIZE, "%u\n", 5653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan (dd->ipath_flags & IPATH_DISABLED) ? 0 : 1); 5663e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 5673e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5683e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic ssize_t store_enabled(struct device *dev, 5693e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct device_attribute *attr, 5703e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan const char *buf, 5713e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan size_t count) 5723e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 5733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 5743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ssize_t ret; 5753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan u16 enable = 0; 5763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5773e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_parse_ushort(buf, &enable); 5783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret < 0) { 5793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_dev_err(dd, "attempt to use non-numeric on enable\n"); 5803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 5813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 5823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (enable) { 5843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (!(dd->ipath_flags & IPATH_DISABLED)) 5853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 5863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 5873e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dev_info(dev, "Enabling unit %d\n", dd->ipath_unit); 5883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan /* same as post-reset */ 5893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = ipath_init_chip(dd, 1); 5903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret) 5913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_dev_err(dd, "Failed to enable unit %d\n", 5923e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd->ipath_unit); 5933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan else { 5943e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd->ipath_flags &= ~IPATH_DISABLED; 5953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan *dd->ipath_statusp &= ~IPATH_STATUS_ADMIN_DISABLED; 5963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 5973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 5983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan else if (!(dd->ipath_flags & IPATH_DISABLED)) { 5993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dev_info(dev, "Disabling unit %d\n", dd->ipath_unit); 6003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ipath_shutdown_device(dd); 6013e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan dd->ipath_flags |= IPATH_DISABLED; 6023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan *dd->ipath_statusp |= IPATH_STATUS_ADMIN_DISABLED; 6033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan } 6043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 6053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 6063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 6073e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 6083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 60930fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivanstatic ssize_t store_rx_pol_inv(struct device *dev, 61030fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan struct device_attribute *attr, 61130fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan const char *buf, 61230fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan size_t count) 61330fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan{ 61430fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan struct ipath_devdata *dd = dev_get_drvdata(dev); 61530fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan int ret, r; 61630fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan u16 val; 61730fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan 61830fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan ret = ipath_parse_ushort(buf, &val); 61930fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan if (ret < 0) 62030fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan goto invalid; 62130fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan 62230fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan r = ipath_set_rx_pol_inv(dd, val); 62330fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan if (r < 0) { 62430fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan ret = r; 62530fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan goto bail; 62630fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan } 62730fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan 62830fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan goto bail; 62930fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivaninvalid: 63030fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan ipath_dev_err(dd, "attempt to set invalid Rx Polarity invert\n"); 63130fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivanbail: 63230fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan return ret; 63330fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan} 63430fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan 63582466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaughstatic ssize_t store_led_override(struct device *dev, 63682466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh struct device_attribute *attr, 63782466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh const char *buf, 63882466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh size_t count) 63982466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh{ 64082466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh struct ipath_devdata *dd = dev_get_drvdata(dev); 64182466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh int ret; 64282466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh u16 val; 64382466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh 64482466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh ret = ipath_parse_ushort(buf, &val); 64582466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh if (ret > 0) 64682466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh ipath_set_led_override(dd, val); 64782466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh else 64882466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh ipath_dev_err(dd, "attempt to set invalid LED override\n"); 64982466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh return ret; 65082466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh} 65182466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh 652aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaughstatic ssize_t show_logged_errs(struct device *dev, 653aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh struct device_attribute *attr, 654aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh char *buf) 655aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh{ 656aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh struct ipath_devdata *dd = dev_get_drvdata(dev); 657aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh int idx, count; 658aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh 659aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh /* force consistency with actual EEPROM */ 660aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh if (ipath_update_eeprom_log(dd) != 0) 661aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh return -ENXIO; 662aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh 663aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh count = 0; 664aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh for (idx = 0; idx < IPATH_EEP_LOG_CNT; ++idx) { 665aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh count += scnprintf(buf + count, PAGE_SIZE - count, "%d%c", 666aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh dd->ipath_eep_st_errs[idx], 667aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh idx == (IPATH_EEP_LOG_CNT - 1) ? '\n' : ' '); 668aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh } 669aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh 670aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh return count; 671aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh} 67230fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan 6733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DRIVER_ATTR(num_units, S_IRUGO, show_num_units, NULL); 6743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DRIVER_ATTR(version, S_IRUGO, show_version, NULL); 6753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 6763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic struct attribute *driver_attributes[] = { 6773e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &driver_attr_num_units.attr, 6783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &driver_attr_version.attr, 6793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan NULL 6803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 6813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 6823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic struct attribute_group driver_attr_group = { 6833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan .attrs = driver_attributes 6843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 6853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 6863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(guid, S_IWUSR | S_IRUGO, show_guid, store_guid); 68715cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbellstatic DEVICE_ATTR(lmc, S_IWUSR | S_IRUGO, show_lmc, store_lmc); 6883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(lid, S_IWUSR | S_IRUGO, show_lid, store_lid); 6893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(link_state, S_IWUSR, NULL, store_link_state); 6903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(mlid, S_IWUSR | S_IRUGO, show_mlid, store_mlid); 6913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(mtu, S_IWUSR | S_IRUGO, show_mtu, store_mtu); 6923e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(enabled, S_IWUSR | S_IRUGO, show_enabled, store_enabled); 6933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(nguid, S_IRUGO, show_nguid, NULL); 6949929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivanstatic DEVICE_ATTR(nports, S_IRUGO, show_nports, NULL); 6953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(reset, S_IWUSR, NULL, store_reset); 6963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL); 6973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(status, S_IRUGO, show_status, NULL); 6983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(status_str, S_IRUGO, show_status_str, NULL); 6993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL); 7003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic DEVICE_ATTR(unit, S_IRUGO, show_unit, NULL); 70130fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivanstatic DEVICE_ATTR(rx_pol_inv, S_IWUSR, NULL, store_rx_pol_inv); 70282466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaughstatic DEVICE_ATTR(led_override, S_IWUSR, NULL, store_led_override); 703aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaughstatic DEVICE_ATTR(logged_errors, S_IRUGO, show_logged_errs, NULL); 7043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic struct attribute *dev_attributes[] = { 7063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_guid.attr, 70715cba26f42c13ca30cbb4388f132ac0ddf4df538Ralph Campbell &dev_attr_lmc.attr, 7083e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_lid.attr, 7093e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_link_state.attr, 7103e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_mlid.attr, 7113e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_mtu.attr, 7123e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_nguid.attr, 7139929b0fb0f35f54371e9364bab809bcd753f9d3aBryan O'Sullivan &dev_attr_nports.attr, 7143e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_serial.attr, 7153e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_status.attr, 7163e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_status_str.attr, 7173e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_boardversion.attr, 7183e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_unit.attr, 7193e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan &dev_attr_enabled.attr, 72030fc5c3130bdbc7cc051a2d6054ad38360d408a8Bryan O'Sullivan &dev_attr_rx_pol_inv.attr, 72182466f00ec6ef0a5ca7ea8991c731af2ec561c7dMichael Albaugh &dev_attr_led_override.attr, 722aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh &dev_attr_logged_errors.attr, 7233e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan NULL 7243e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 7253e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7263e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanstatic struct attribute_group dev_attr_group = { 7273e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan .attrs = dev_attributes 7283e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan}; 7293e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7303e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan/** 7313e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * ipath_expose_reset - create a device reset file 7323e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * @dev: the device structure 7333e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * 7343e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * Only expose a file that lets us reset the device after someone 7353e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * enters diag mode. A device reset is quite likely to crash the 7363e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * machine entirely, so we don't want to normally make it 7373e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan * available. 738755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan * 739755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan * Called with ipath_mutex held. 7403e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan */ 7413e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanint ipath_expose_reset(struct device *dev) 7423e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 743755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan static int exposed; 744755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan int ret; 745755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan 746755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan if (!exposed) { 747755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan ret = device_create_file(dev, &dev_attr_reset); 748755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan exposed = 1; 749755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan } 750755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan else 751755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan ret = 0; 752755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan 753755e4ca4a9885b79a14169ab5b615920eb38a32aBryan O'Sullivan return ret; 7543e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 7553e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7563e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanint ipath_driver_create_group(struct device_driver *drv) 7573e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 7583e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret; 7593e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7603e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = sysfs_create_group(&drv->kobj, &driver_attr_group); 7613e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7623e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 7633e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 7643e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7653e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanvoid ipath_driver_remove_group(struct device_driver *drv) 7663e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 7673e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan sysfs_remove_group(&drv->kobj, &driver_attr_group); 7683e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 7693e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7703e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanint ipath_device_create_group(struct device *dev, struct ipath_devdata *dd) 7713e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 7723e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan int ret; 7733e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char unit[5]; 7743e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7753e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = sysfs_create_group(&dev->kobj, &dev_attr_group); 7763e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret) 7773e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 7783e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7793e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = sysfs_create_group(&dev->kobj, &dev_counter_attr_group); 7803e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret) 7813e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail_attrs; 7823e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7833e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan snprintf(unit, sizeof(unit), "%02d", dd->ipath_unit); 7843e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan ret = sysfs_create_link(&dev->driver->kobj, &dev->kobj, unit); 7853e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan if (ret == 0) 7863e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan goto bail; 7873e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7883e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan sysfs_remove_group(&dev->kobj, &dev_counter_attr_group); 7893e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail_attrs: 7903e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan sysfs_remove_group(&dev->kobj, &dev_attr_group); 7913e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanbail: 7923e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan return ret; 7933e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 7943e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7953e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivanvoid ipath_device_remove_group(struct device *dev, struct ipath_devdata *dd) 7963e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan{ 7973e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan char unit[5]; 7983e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 7993e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan snprintf(unit, sizeof(unit), "%02d", dd->ipath_unit); 8003e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan sysfs_remove_link(&dev->driver->kobj, unit); 8013e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 8023e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan sysfs_remove_group(&dev->kobj, &dev_counter_attr_group); 8033e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan sysfs_remove_group(&dev->kobj, &dev_attr_group); 8043e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan 8053e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan device_remove_file(dev, &dev_attr_reset); 8063e9b4a5eb4ae4936feeea256c0105e078c7702cdBryan O'Sullivan} 807