fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / infiniband / hw / ipath / ipath_sysfs.c
index f323791..ffa6318 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2006 QLogic, Inc. All rights reserved.
  * Copyright (c) 2006 PathScale, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -34,8 +35,7 @@
 #include <linux/pci.h>
 
 #include "ipath_kernel.h"
-#include "ips_common.h"
-#include "ipath_layer.h"
+#include "ipath_common.h"
 
 /**
  * ipath_parse_ushort - parse an unsigned short value in an arbitrary base
@@ -75,7 +75,7 @@ bail:
 static ssize_t show_version(struct device_driver *dev, char *buf)
 {
        /* The string printed here is already newline-terminated. */
-       return scnprintf(buf, PAGE_SIZE, "%s", ipath_core_version);
+       return scnprintf(buf, PAGE_SIZE, "%s", ib_ipath_version);
 }
 
 static ssize_t show_num_units(struct device_driver *dev, char *buf)
@@ -84,99 +84,6 @@ static ssize_t show_num_units(struct device_driver *dev, char *buf)
                         ipath_count_units(NULL, NULL, NULL));
 }
 
-#define DRIVER_STAT(name, attr) \
-       static ssize_t show_stat_##name(struct device_driver *dev, \
-                                       char *buf) \
-       { \
-               return scnprintf( \
-                       buf, PAGE_SIZE, "%llu\n", \
-                       (unsigned long long) ipath_stats.sps_ ##attr); \
-       } \
-       static DRIVER_ATTR(name, S_IRUGO, show_stat_##name, NULL)
-
-DRIVER_STAT(intrs, ints);
-DRIVER_STAT(err_intrs, errints);
-DRIVER_STAT(errs, errs);
-DRIVER_STAT(pkt_errs, pkterrs);
-DRIVER_STAT(crc_errs, crcerrs);
-DRIVER_STAT(hw_errs, hwerrs);
-DRIVER_STAT(ib_link, iblink);
-DRIVER_STAT(port0_pkts, port0pkts);
-DRIVER_STAT(ether_spkts, ether_spkts);
-DRIVER_STAT(ether_rpkts, ether_rpkts);
-DRIVER_STAT(sma_spkts, sma_spkts);
-DRIVER_STAT(sma_rpkts, sma_rpkts);
-DRIVER_STAT(hdrq_full, hdrqfull);
-DRIVER_STAT(etid_full, etidfull);
-DRIVER_STAT(no_piobufs, nopiobufs);
-DRIVER_STAT(ports, ports);
-DRIVER_STAT(pkey0, pkeys[0]);
-DRIVER_STAT(pkey1, pkeys[1]);
-DRIVER_STAT(pkey2, pkeys[2]);
-DRIVER_STAT(pkey3, pkeys[3]);
-/* XXX fix the following when dynamic table of devices used */
-DRIVER_STAT(lid0, lid[0]);
-DRIVER_STAT(lid1, lid[1]);
-DRIVER_STAT(lid2, lid[2]);
-DRIVER_STAT(lid3, lid[3]);
-
-DRIVER_STAT(nports, nports);
-DRIVER_STAT(null_intr, nullintr);
-DRIVER_STAT(max_pkts_call, maxpkts_call);
-DRIVER_STAT(avg_pkts_call, avgpkts_call);
-DRIVER_STAT(page_locks, pagelocks);
-DRIVER_STAT(page_unlocks, pageunlocks);
-DRIVER_STAT(krdrops, krdrops);
-/* XXX fix the following when dynamic table of devices used */
-DRIVER_STAT(mlid0, mlid[0]);
-DRIVER_STAT(mlid1, mlid[1]);
-DRIVER_STAT(mlid2, mlid[2]);
-DRIVER_STAT(mlid3, mlid[3]);
-
-static struct attribute *driver_stat_attributes[] = {
-       &driver_attr_intrs.attr,
-       &driver_attr_err_intrs.attr,
-       &driver_attr_errs.attr,
-       &driver_attr_pkt_errs.attr,
-       &driver_attr_crc_errs.attr,
-       &driver_attr_hw_errs.attr,
-       &driver_attr_ib_link.attr,
-       &driver_attr_port0_pkts.attr,
-       &driver_attr_ether_spkts.attr,
-       &driver_attr_ether_rpkts.attr,
-       &driver_attr_sma_spkts.attr,
-       &driver_attr_sma_rpkts.attr,
-       &driver_attr_hdrq_full.attr,
-       &driver_attr_etid_full.attr,
-       &driver_attr_no_piobufs.attr,
-       &driver_attr_ports.attr,
-       &driver_attr_pkey0.attr,
-       &driver_attr_pkey1.attr,
-       &driver_attr_pkey2.attr,
-       &driver_attr_pkey3.attr,
-       &driver_attr_lid0.attr,
-       &driver_attr_lid1.attr,
-       &driver_attr_lid2.attr,
-       &driver_attr_lid3.attr,
-       &driver_attr_nports.attr,
-       &driver_attr_null_intr.attr,
-       &driver_attr_max_pkts_call.attr,
-       &driver_attr_avg_pkts_call.attr,
-       &driver_attr_page_locks.attr,
-       &driver_attr_page_unlocks.attr,
-       &driver_attr_krdrops.attr,
-       &driver_attr_mlid0.attr,
-       &driver_attr_mlid1.attr,
-       &driver_attr_mlid2.attr,
-       &driver_attr_mlid3.attr,
-       NULL
-};
-
-static struct attribute_group driver_stat_attr_group = {
-       .name = "stats",
-       .attrs = driver_stat_attributes
-};
-
 static ssize_t show_status(struct device *dev,
                           struct device_attribute *attr,
                           char *buf)
@@ -200,8 +107,8 @@ static const char *ipath_status_str[] = {
        "Initted",
        "Disabled",
        "Admin_Disabled",
-       "OIB_SMA",
-       "SMA",
+       "", /* This used to be the old "OIB_SMA" status. */
+       "", /* This used to be the old "SMA" status. */
        "Present",
        "IB_link_up",
        "IB_configured",
@@ -272,23 +179,23 @@ static ssize_t store_lid(struct device *dev,
                          size_t count)
 {
        struct ipath_devdata *dd = dev_get_drvdata(dev);
-       u16 lid;
+       u16 lid = 0;
        int ret;
 
        ret = ipath_parse_ushort(buf, &lid);
        if (ret < 0)
                goto invalid;
 
-       if (lid == 0 || lid >= 0xc000) {
+       if (lid == 0 || lid >= IPATH_MULTICAST_LID_BASE) {
                ret = -EINVAL;
                goto invalid;
        }
 
-       ipath_set_sps_lid(dd, lid, 0);
+       ipath_set_lid(dd, lid, 0);
 
        goto bail;
 invalid:
-       ipath_dev_err(dd, "attempt to set invalid LID\n");
+       ipath_dev_err(dd, "attempt to set invalid LID 0x%x\n", lid);
 bail:
        return ret;
 }
@@ -308,19 +215,14 @@ static ssize_t store_mlid(struct device *dev,
                          size_t count)
 {
        struct ipath_devdata *dd = dev_get_drvdata(dev);
-       int unit;
        u16 mlid;
        int ret;
 
        ret = ipath_parse_ushort(buf, &mlid);
-       if (ret < 0)
+       if (ret < 0 || mlid < IPATH_MULTICAST_LID_BASE)
                goto invalid;
 
-       unit = dd->ipath_unit;
-
        dd->ipath_mlid = mlid;
-       ipath_stats.sps_mlid[unit] = mlid;
-       ipath_layer_intr(dd, IPATH_LAYER_INT_BCAST);
 
        goto bail;
 invalid:
@@ -352,7 +254,7 @@ static ssize_t store_guid(struct device *dev,
        struct ipath_devdata *dd = dev_get_drvdata(dev);
        ssize_t ret;
        unsigned short guid[8];
-       __be64 nguid;
+       __be64 new_guid;
        u8 *ng;
        int i;
 
@@ -361,7 +263,7 @@ static ssize_t store_guid(struct device *dev,
                   &guid[4], &guid[5], &guid[6], &guid[7]) != 8)
                goto invalid;
 
-       ng = (u8 *) &nguid;
+       ng = (u8 *) &new_guid;
 
        for (i = 0; i < 8; i++) {
                if (guid[i] > 0xff)
@@ -369,7 +271,10 @@ static ssize_t store_guid(struct device *dev,
                ng[i] = guid[i];
        }
 
-       dd->ipath_guid = nguid;
+       if (new_guid == 0)
+               goto invalid;
+
+       dd->ipath_guid = new_guid;
        dd->ipath_nguid = 1;
 
        ret = strlen(buf);
@@ -392,6 +297,16 @@ static ssize_t show_nguid(struct device *dev,
        return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_nguid);
 }
 
+static ssize_t show_nports(struct device *dev,
+                          struct device_attribute *attr,
+                          char *buf)
+{
+       struct ipath_devdata *dd = dev_get_drvdata(dev);
+
+       /* Return the number of user ports available. */
+       return scnprintf(buf, PAGE_SIZE, "%u\n", dd->ipath_cfgports - 1);
+}
+
 static ssize_t show_serial(struct device *dev,
                           struct device_attribute *attr,
                           char *buf)
@@ -560,7 +475,7 @@ static ssize_t store_link_state(struct device *dev,
        if (ret < 0)
                goto invalid;
 
-       r = ipath_layer_set_linkstate(dd, state);
+       r = ipath_set_linkstate(dd, state);
        if (r < 0) {
                ret = r;
                goto bail;
@@ -595,7 +510,7 @@ static ssize_t store_mtu(struct device *dev,
        if (ret < 0)
                goto invalid;
 
-       r = ipath_layer_set_mtu(dd, mtu);
+       r = ipath_set_mtu(dd, mtu);
        if (r < 0)
                ret = r;
 
@@ -656,6 +571,33 @@ bail:
        return ret;
 }
 
+static ssize_t store_rx_pol_inv(struct device *dev,
+                         struct device_attribute *attr,
+                         const char *buf,
+                         size_t count)
+{
+       struct ipath_devdata *dd = dev_get_drvdata(dev);
+       int ret, r;
+       u16 val;
+
+       ret = ipath_parse_ushort(buf, &val);
+       if (ret < 0)
+               goto invalid;
+
+       r = ipath_set_rx_pol_inv(dd, val);
+       if (r < 0) {
+               ret = r;
+               goto bail;
+       }
+
+       goto bail;
+invalid:
+       ipath_dev_err(dd, "attempt to set invalid Rx Polarity invert\n");
+bail:
+       return ret;
+}
+
+
 static DRIVER_ATTR(num_units, S_IRUGO, show_num_units, NULL);
 static DRIVER_ATTR(version, S_IRUGO, show_version, NULL);
 
@@ -676,12 +618,14 @@ static DEVICE_ATTR(mlid, S_IWUSR | S_IRUGO, show_mlid, store_mlid);
 static DEVICE_ATTR(mtu, S_IWUSR | S_IRUGO, show_mtu, store_mtu);
 static DEVICE_ATTR(enabled, S_IWUSR | S_IRUGO, show_enabled, store_enabled);
 static DEVICE_ATTR(nguid, S_IRUGO, show_nguid, NULL);
+static DEVICE_ATTR(nports, S_IRUGO, show_nports, NULL);
 static DEVICE_ATTR(reset, S_IWUSR, NULL, store_reset);
 static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL);
 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
 static DEVICE_ATTR(status_str, S_IRUGO, show_status_str, NULL);
 static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL);
 static DEVICE_ATTR(unit, S_IRUGO, show_unit, NULL);
+static DEVICE_ATTR(rx_pol_inv, S_IWUSR, NULL, store_rx_pol_inv);
 
 static struct attribute *dev_attributes[] = {
        &dev_attr_guid.attr,
@@ -690,12 +634,14 @@ static struct attribute *dev_attributes[] = {
        &dev_attr_mlid.attr,
        &dev_attr_mtu.attr,
        &dev_attr_nguid.attr,
+       &dev_attr_nports.attr,
        &dev_attr_serial.attr,
        &dev_attr_status.attr,
        &dev_attr_status_str.attr,
        &dev_attr_boardversion.attr,
        &dev_attr_unit.attr,
        &dev_attr_enabled.attr,
+       &dev_attr_rx_pol_inv.attr,
        NULL
 };
 
@@ -734,20 +680,12 @@ int ipath_driver_create_group(struct device_driver *drv)
        int ret;
 
        ret = sysfs_create_group(&drv->kobj, &driver_attr_group);
-       if (ret)
-               goto bail;
 
-       ret = sysfs_create_group(&drv->kobj, &driver_stat_attr_group);
-       if (ret)
-               sysfs_remove_group(&drv->kobj, &driver_attr_group);
-
-bail:
        return ret;
 }
 
 void ipath_driver_remove_group(struct device_driver *drv)
 {
-       sysfs_remove_group(&drv->kobj, &driver_stat_attr_group);
        sysfs_remove_group(&drv->kobj, &driver_attr_group);
 }