OSDN Git Service

RDMA/drivers: Use core provided API for registering device attributes
authorParav Pandit <parav@mellanox.com>
Thu, 11 Oct 2018 19:31:54 +0000 (22:31 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 17 Oct 2018 09:45:01 +0000 (03:45 -0600)
Use rdma_set_device_sysfs_group() to register device attributes and
simplify the driver.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
23 files changed:
drivers/infiniband/hw/bnxt_re/main.c
drivers/infiniband/hw/cxgb3/iwch_provider.c
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/sysfs.c
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/i40iw/i40iw_verbs.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx5/ib_rep.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/nes/nes_verbs.c
drivers/infiniband/hw/ocrdma/ocrdma_main.c
drivers/infiniband/hw/qedr/main.c
drivers/infiniband/hw/qib/qib.h
drivers/infiniband/hw/qib/qib_sysfs.c
drivers/infiniband/hw/qib/qib_verbs.c
drivers/infiniband/hw/usnic/usnic_ib_main.c
drivers/infiniband/hw/usnic/usnic_ib_sysfs.c
drivers/infiniband/hw/usnic/usnic_ib_sysfs.h
drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
drivers/infiniband/sw/rxe/rxe_verbs.c

index e5d4b12..cf22826 100644 (file)
@@ -535,6 +535,34 @@ static struct bnxt_en_dev *bnxt_re_dev_probe(struct net_device *netdev)
        return en_dev;
 }
 
+static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr,
+                          char *buf)
+{
+       struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
+
+       return scnprintf(buf, PAGE_SIZE, "0x%x\n", rdev->en_dev->pdev->vendor);
+}
+static DEVICE_ATTR_RO(hw_rev);
+
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
+{
+       struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
+
+       return scnprintf(buf, PAGE_SIZE, "%s\n", rdev->ibdev.node_desc);
+}
+static DEVICE_ATTR_RO(hca_type);
+
+static struct attribute *bnxt_re_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       NULL
+};
+
+static const struct attribute_group bnxt_re_dev_attr_group = {
+       .attrs = bnxt_re_attributes,
+};
+
 static void bnxt_re_unregister_ib(struct bnxt_re_dev *rdev)
 {
        ib_unregister_device(&rdev->ibdev);
@@ -638,34 +666,11 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)
        ibdev->get_hw_stats             = bnxt_re_ib_get_hw_stats;
        ibdev->alloc_hw_stats           = bnxt_re_ib_alloc_hw_stats;
 
+       rdma_set_device_sysfs_group(ibdev, &bnxt_re_dev_attr_group);
        ibdev->driver_id = RDMA_DRIVER_BNXT_RE;
        return ib_register_device(ibdev, "bnxt_re%d", NULL);
 }
 
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
-{
-       struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
-
-       return scnprintf(buf, PAGE_SIZE, "0x%x\n", rdev->en_dev->pdev->vendor);
-}
-
-static ssize_t show_hca(struct device *device, struct device_attribute *attr,
-                       char *buf)
-{
-       struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
-
-       return scnprintf(buf, PAGE_SIZE, "%s\n", rdev->ibdev.node_desc);
-}
-
-static DEVICE_ATTR(hw_rev, 0444, show_rev, NULL);
-static DEVICE_ATTR(hca_type, 0444, show_hca, NULL);
-
-static struct device_attribute *bnxt_re_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type
-};
-
 static void bnxt_re_dev_remove(struct bnxt_re_dev *rdev)
 {
        dev_put(rdev->netdev);
@@ -1200,12 +1205,9 @@ static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev)
 
 static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev)
 {
-       int i, rc;
+       int rc;
 
        if (test_and_clear_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) {
-               for (i = 0; i < ARRAY_SIZE(bnxt_re_attributes); i++)
-                       device_remove_file(&rdev->ibdev.dev,
-                                          bnxt_re_attributes[i]);
                /* Cleanup ib dev */
                bnxt_re_unregister_ib(rdev);
        }
@@ -1255,7 +1257,7 @@ static void bnxt_re_worker(struct work_struct *work)
 
 static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
 {
-       int i, j, rc;
+       int rc;
 
        bool locked;
 
@@ -1375,20 +1377,6 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
        }
        set_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags);
        dev_info(rdev_to_dev(rdev), "Device registered successfully");
-       for (i = 0; i < ARRAY_SIZE(bnxt_re_attributes); i++) {
-               rc = device_create_file(&rdev->ibdev.dev,
-                                       bnxt_re_attributes[i]);
-               if (rc) {
-                       dev_err(rdev_to_dev(rdev),
-                               "Failed to create IB sysfs: %#x", rc);
-                       /* Must clean up all created device files */
-                       for (j = 0; j < i; j++)
-                               device_remove_file(&rdev->ibdev.dev,
-                                                  bnxt_re_attributes[j]);
-                       bnxt_re_unregister_ib(rdev);
-                       goto fail;
-               }
-       }
        ib_get_eth_speed(&rdev->ibdev, 1, &rdev->active_speed,
                         &rdev->active_width);
        set_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags);
index 39530cc..ebbec02 100644 (file)
@@ -1127,17 +1127,18 @@ static int iwch_query_port(struct ib_device *ibdev,
        return 0;
 }
 
-static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *dev,
+                          struct device_attribute *attr, char *buf)
 {
        struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev,
                                                 ibdev.dev);
        pr_debug("%s dev 0x%p\n", __func__, dev);
        return sprintf(buf, "%d\n", iwch_dev->rdev.t3cdev_p->type);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev,
                                                 ibdev.dev);
@@ -1148,9 +1149,10 @@ static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
        lldev->ethtool_ops->get_drvinfo(lldev, &info);
        return sprintf(buf, "%s\n", info.driver);
 }
+static DEVICE_ATTR_RO(hca_type);
 
-static ssize_t show_board(struct device *dev, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev,
                                                 ibdev.dev);
@@ -1158,6 +1160,7 @@ static ssize_t show_board(struct device *dev, struct device_attribute *attr,
        return sprintf(buf, "%x.%x\n", iwch_dev->rdev.rnic_info.pdev->vendor,
                       iwch_dev->rdev.rnic_info.pdev->device);
 }
+static DEVICE_ATTR_RO(board_id);
 
 enum counters {
        IPINRECEIVES,
@@ -1274,14 +1277,15 @@ static int iwch_get_mib(struct ib_device *ibdev, struct rdma_hw_stats *stats,
        return stats->num_counters;
 }
 
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
+static struct attribute *iwch_class_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL
+};
 
-static struct device_attribute *iwch_class_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id,
+static const struct attribute_group iwch_attr_group = {
+       .attrs = iwch_class_attributes,
 };
 
 static int iwch_port_immutable(struct ib_device *ibdev, u8 port_num,
@@ -1316,7 +1320,6 @@ static void get_dev_fw_ver_str(struct ib_device *ibdev, char *str)
 int iwch_register_device(struct iwch_dev *dev)
 {
        int ret;
-       int i;
 
        pr_debug("%s iwch_dev %p\n", __func__, dev);
        memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
@@ -1401,33 +1404,16 @@ int iwch_register_device(struct iwch_dev *dev)
               sizeof(dev->ibdev.iwcm->ifname));
 
        dev->ibdev.driver_id = RDMA_DRIVER_CXGB3;
+       rdma_set_device_sysfs_group(&dev->ibdev, &iwch_attr_group);
        ret = ib_register_device(&dev->ibdev, "cxgb3_%d", NULL);
        if (ret)
-               goto bail1;
-
-       for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i) {
-               ret = device_create_file(&dev->ibdev.dev,
-                                        iwch_class_attributes[i]);
-               if (ret) {
-                       goto bail2;
-               }
-       }
-       return 0;
-bail2:
-       ib_unregister_device(&dev->ibdev);
-bail1:
-       kfree(dev->ibdev.iwcm);
+               kfree(dev->ibdev.iwcm);
        return ret;
 }
 
 void iwch_unregister_device(struct iwch_dev *dev)
 {
-       int i;
-
        pr_debug("%s iwch_dev %p\n", __func__, dev);
-       for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i)
-               device_remove_file(&dev->ibdev.dev,
-                                  iwch_class_attributes[i]);
        ib_unregister_device(&dev->ibdev);
        kfree(dev->ibdev.iwcm);
        return;
index 416f8d1..cbb3c0d 100644 (file)
@@ -373,8 +373,8 @@ static int c4iw_query_port(struct ib_device *ibdev, u8 port,
        return 0;
 }
 
-static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *dev,
+                          struct device_attribute *attr, char *buf)
 {
        struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev,
                                                 ibdev.dev);
@@ -382,9 +382,10 @@ static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
        return sprintf(buf, "%d\n",
                       CHELSIO_CHIP_RELEASE(c4iw_dev->rdev.lldi.adapter_type));
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev,
                                                 ibdev.dev);
@@ -395,9 +396,10 @@ static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
        lldev->ethtool_ops->get_drvinfo(lldev, &info);
        return sprintf(buf, "%s\n", info.driver);
 }
+static DEVICE_ATTR_RO(hca_type);
 
-static ssize_t show_board(struct device *dev, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *dev, struct device_attribute *attr,
+                            char *buf)
 {
        struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev,
                                                 ibdev.dev);
@@ -405,6 +407,7 @@ static ssize_t show_board(struct device *dev, struct device_attribute *attr,
        return sprintf(buf, "%x.%x\n", c4iw_dev->rdev.lldi.pdev->vendor,
                       c4iw_dev->rdev.lldi.pdev->device);
 }
+static DEVICE_ATTR_RO(board_id);
 
 enum counters {
        IP4INSEGS,
@@ -461,14 +464,15 @@ static int c4iw_get_mib(struct ib_device *ibdev,
        return stats->num_counters;
 }
 
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
+static struct attribute *c4iw_class_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL
+};
 
-static struct device_attribute *c4iw_class_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id,
+static const struct attribute_group c4iw_attr_group = {
+       .attrs = c4iw_class_attributes,
 };
 
 static int c4iw_port_immutable(struct ib_device *ibdev, u8 port_num,
@@ -530,7 +534,6 @@ static int fill_res_entry(struct sk_buff *msg, struct rdma_restrack_entry *res)
 void c4iw_register_device(struct work_struct *work)
 {
        int ret;
-       int i;
        struct uld_ctx *ctx = container_of(work, struct uld_ctx, reg_work);
        struct c4iw_dev *dev = ctx->dev;
 
@@ -625,20 +628,13 @@ void c4iw_register_device(struct work_struct *work)
        memcpy(dev->ibdev.iwcm->ifname, dev->rdev.lldi.ports[0]->name,
               sizeof(dev->ibdev.iwcm->ifname));
 
+       rdma_set_device_sysfs_group(&dev->ibdev, &c4iw_attr_group);
        dev->ibdev.driver_id = RDMA_DRIVER_CXGB4;
        ret = ib_register_device(&dev->ibdev, "cxgb4_%d", NULL);
        if (ret)
                goto err_kfree_iwcm;
-
-       for (i = 0; i < ARRAY_SIZE(c4iw_class_attributes); ++i) {
-               ret = device_create_file(&dev->ibdev.dev,
-                                        c4iw_class_attributes[i]);
-               if (ret)
-                       goto err_unregister_device;
-       }
        return;
-err_unregister_device:
-       ib_unregister_device(&dev->ibdev);
+
 err_kfree_iwcm:
        kfree(dev->ibdev.iwcm);
 err_dealloc_ctx:
@@ -650,12 +646,7 @@ err_dealloc_ctx:
 
 void c4iw_unregister_device(struct c4iw_dev *dev)
 {
-       int i;
-
        pr_debug("c4iw_dev %p\n", dev);
-       for (i = 0; i < ARRAY_SIZE(c4iw_class_attributes); ++i)
-               device_remove_file(&dev->ibdev.dev,
-                                  c4iw_class_attributes[i]);
        ib_unregister_device(&dev->ibdev);
        kfree(dev->ibdev.iwcm);
        return;
index d3d5717..1401b6e 100644 (file)
@@ -1968,6 +1968,7 @@ static inline u32 get_rcvhdrtail(const struct hfi1_ctxtdata *rcd)
  */
 
 extern const char ib_hfi1_version[];
+extern const struct attribute_group ib_hfi1_attr_group;
 
 int hfi1_device_create(struct hfi1_devdata *dd);
 void hfi1_device_remove(struct hfi1_devdata *dd);
index 25e8673..2be513d 100644 (file)
@@ -494,17 +494,18 @@ static struct kobj_type hfi1_vl2mtu_ktype = {
  * Start of per-unit (or driver, in some cases, but replicated
  * per unit) functions (these get a device *)
  */
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr,
+                          char *buf)
 {
        struct hfi1_ibdev *dev =
                container_of(device, struct hfi1_ibdev, rdi.ibdev.dev);
 
        return sprintf(buf, "%x\n", dd_from_dev(dev)->minrev);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_hfi(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t board_id_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct hfi1_ibdev *dev =
                container_of(device, struct hfi1_ibdev, rdi.ibdev.dev);
@@ -517,8 +518,9 @@ static ssize_t show_hfi(struct device *device, struct device_attribute *attr,
                ret = scnprintf(buf, PAGE_SIZE, "%s\n", dd->boardname);
        return ret;
 }
+static DEVICE_ATTR_RO(board_id);
 
-static ssize_t show_boardversion(struct device *device,
+static ssize_t boardversion_show(struct device *device,
                                 struct device_attribute *attr, char *buf)
 {
        struct hfi1_ibdev *dev =
@@ -528,8 +530,9 @@ static ssize_t show_boardversion(struct device *device,
        /* The string printed here is already newline-terminated. */
        return scnprintf(buf, PAGE_SIZE, "%s", dd->boardversion);
 }
+static DEVICE_ATTR_RO(boardversion);
 
-static ssize_t show_nctxts(struct device *device,
+static ssize_t nctxts_show(struct device *device,
                           struct device_attribute *attr, char *buf)
 {
        struct hfi1_ibdev *dev =
@@ -546,8 +549,9 @@ static ssize_t show_nctxts(struct device *device,
                         min(dd->num_user_contexts,
                             (u32)dd->sc_sizes[SC_USER].count));
 }
+static DEVICE_ATTR_RO(nctxts);
 
-static ssize_t show_nfreectxts(struct device *device,
+static ssize_t nfreectxts_show(struct device *device,
                               struct device_attribute *attr, char *buf)
 {
        struct hfi1_ibdev *dev =
@@ -557,8 +561,9 @@ static ssize_t show_nfreectxts(struct device *device,
        /* Return the number of free user ports (contexts) available. */
        return scnprintf(buf, PAGE_SIZE, "%u\n", dd->freectxts);
 }
+static DEVICE_ATTR_RO(nfreectxts);
 
-static ssize_t show_serial(struct device *device,
+static ssize_t serial_show(struct device *device,
                           struct device_attribute *attr, char *buf)
 {
        struct hfi1_ibdev *dev =
@@ -567,8 +572,9 @@ static ssize_t show_serial(struct device *device,
 
        return scnprintf(buf, PAGE_SIZE, "%s", dd->serial);
 }
+static DEVICE_ATTR_RO(serial);
 
-static ssize_t store_chip_reset(struct device *device,
+static ssize_t chip_reset_store(struct device *device,
                                struct device_attribute *attr, const char *buf,
                                size_t count)
 {
@@ -586,6 +592,7 @@ static ssize_t store_chip_reset(struct device *device,
 bail:
        return ret < 0 ? ret : count;
 }
+static DEVICE_ATTR_WO(chip_reset);
 
 /*
  * Convert the reported temperature from an integer (reported in
@@ -598,7 +605,7 @@ bail:
 /*
  * Dump tempsense values, in decimal, to ease shell-scripts.
  */
-static ssize_t show_tempsense(struct device *device,
+static ssize_t tempsense_show(struct device *device,
                              struct device_attribute *attr, char *buf)
 {
        struct hfi1_ibdev *dev =
@@ -622,6 +629,7 @@ static ssize_t show_tempsense(struct device *device,
        }
        return ret;
 }
+static DEVICE_ATTR_RO(tempsense);
 
 /*
  * end of per-unit (or driver, in some cases, but replicated
@@ -629,24 +637,20 @@ static ssize_t show_tempsense(struct device *device,
  */
 
 /* start of per-unit file structures and support code */
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_hfi, NULL);
-static DEVICE_ATTR(nctxts, S_IRUGO, show_nctxts, NULL);
-static DEVICE_ATTR(nfreectxts, S_IRUGO, show_nfreectxts, NULL);
-static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL);
-static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL);
-static DEVICE_ATTR(tempsense, S_IRUGO, show_tempsense, NULL);
-static DEVICE_ATTR(chip_reset, S_IWUSR, NULL, store_chip_reset);
-
-static struct device_attribute *hfi1_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_board_id,
-       &dev_attr_nctxts,
-       &dev_attr_nfreectxts,
-       &dev_attr_serial,
-       &dev_attr_boardversion,
-       &dev_attr_tempsense,
-       &dev_attr_chip_reset,
+static struct attribute *hfi1_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_board_id.attr,
+       &dev_attr_nctxts.attr,
+       &dev_attr_nfreectxts.attr,
+       &dev_attr_serial.attr,
+       &dev_attr_boardversion.attr,
+       &dev_attr_tempsense.attr,
+       &dev_attr_chip_reset.attr,
+       NULL,
+};
+
+const struct attribute_group ib_hfi1_attr_group = {
+       .attrs = hfi1_attributes,
 };
 
 int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
@@ -832,12 +836,6 @@ int hfi1_verbs_register_sysfs(struct hfi1_devdata *dd)
        struct device *class_dev = &dev->dev;
        int i, j, ret;
 
-       for (i = 0; i < ARRAY_SIZE(hfi1_attributes); ++i) {
-               ret = device_create_file(&dev->dev, hfi1_attributes[i]);
-               if (ret)
-                       goto bail;
-       }
-
        for (i = 0; i < dd->num_sdma; i++) {
                ret = kobject_init_and_add(&dd->per_sdma[i].kobj,
                                           &sde_ktype, &class_dev->kobj,
@@ -855,9 +853,6 @@ int hfi1_verbs_register_sysfs(struct hfi1_devdata *dd)
 
        return 0;
 bail:
-       for (i = 0; i < ARRAY_SIZE(hfi1_attributes); ++i)
-               device_remove_file(&dev->dev, hfi1_attributes[i]);
-
        for (i = 0; i < dd->num_sdma; i++)
                kobject_del(&dd->per_sdma[i].kobj);
 
index 5fc27a9..48e11e5 100644 (file)
@@ -1751,6 +1751,9 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd)
                              i,
                              ppd->pkeys);
 
+       rdma_set_device_sysfs_group(&dd->verbs_dev.rdi.ibdev,
+                                   &ib_hfi1_attr_group);
+
        ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_HFI1);
        if (ret)
                goto err_verbs_txreq;
index cb2aef8..1028758 100644 (file)
@@ -2135,10 +2135,10 @@ static int i40iw_dereg_mr(struct ib_mr *ib_mr)
 }
 
 /**
- * i40iw_show_rev
+ * hw_rev_show
  */
-static ssize_t i40iw_show_rev(struct device *dev,
-                             struct device_attribute *attr, char *buf)
+static ssize_t hw_rev_show(struct device *dev,
+                          struct device_attribute *attr, char *buf)
 {
        struct i40iw_ib_device *iwibdev = container_of(dev,
                                                       struct i40iw_ib_device,
@@ -2147,34 +2147,37 @@ static ssize_t i40iw_show_rev(struct device *dev,
 
        return sprintf(buf, "%x\n", hw_rev);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
 /**
- * i40iw_show_hca
+ * hca_type_show
  */
-static ssize_t i40iw_show_hca(struct device *dev,
-                             struct device_attribute *attr, char *buf)
+static ssize_t hca_type_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "I40IW\n");
 }
+static DEVICE_ATTR_RO(hca_type);
 
 /**
- * i40iw_show_board
+ * board_id_show
  */
-static ssize_t i40iw_show_board(struct device *dev,
-                               struct device_attribute *attr,
-                               char *buf)
+static ssize_t board_id_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "%.*s\n", 32, "I40IW Board ID");
 }
+static DEVICE_ATTR_RO(board_id);
 
-static DEVICE_ATTR(hw_rev, S_IRUGO, i40iw_show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, i40iw_show_hca, NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, i40iw_show_board, NULL);
+static struct attribute *i40iw_dev_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL
+};
 
-static struct device_attribute *i40iw_dev_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id
+static const struct attribute_group i40iw_attr_group = {
+       .attrs = i40iw_dev_attributes,
 };
 
 /**
@@ -2850,20 +2853,6 @@ void i40iw_port_ibevent(struct i40iw_device *iwdev)
 }
 
 /**
- * i40iw_unregister_rdma_device - unregister of iwarp from IB
- * @iwibdev: rdma device ptr
- */
-static void i40iw_unregister_rdma_device(struct i40iw_ib_device *iwibdev)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(i40iw_dev_attributes); ++i)
-               device_remove_file(&iwibdev->ibdev.dev,
-                                  i40iw_dev_attributes[i]);
-       ib_unregister_device(&iwibdev->ibdev);
-}
-
-/**
  * i40iw_destroy_rdma_device - destroy rdma device and free resources
  * @iwibdev: IB device ptr
  */
@@ -2872,7 +2861,7 @@ void i40iw_destroy_rdma_device(struct i40iw_ib_device *iwibdev)
        if (!iwibdev)
                return;
 
-       i40iw_unregister_rdma_device(iwibdev);
+       ib_unregister_device(&iwibdev->ibdev);
        kfree(iwibdev->ibdev.iwcm);
        iwibdev->ibdev.iwcm = NULL;
        wait_event_timeout(iwibdev->iwdev->close_wq,
@@ -2887,32 +2876,19 @@ void i40iw_destroy_rdma_device(struct i40iw_ib_device *iwibdev)
  */
 int i40iw_register_rdma_device(struct i40iw_device *iwdev)
 {
-       int i, ret;
+       int ret;
        struct i40iw_ib_device *iwibdev;
 
        iwdev->iwibdev = i40iw_init_rdma_device(iwdev);
        if (!iwdev->iwibdev)
                return -ENOMEM;
        iwibdev = iwdev->iwibdev;
-
+       rdma_set_device_sysfs_group(&iwibdev->ibdev, &i40iw_attr_group);
        iwibdev->ibdev.driver_id = RDMA_DRIVER_I40IW;
        ret = ib_register_device(&iwibdev->ibdev, "i40iw%d", NULL);
        if (ret)
                goto error;
 
-       for (i = 0; i < ARRAY_SIZE(i40iw_dev_attributes); ++i) {
-               ret =
-                   device_create_file(&iwibdev->ibdev.dev,
-                                      i40iw_dev_attributes[i]);
-               if (ret) {
-                       while (i > 0) {
-                               i--;
-                               device_remove_file(&iwibdev->ibdev.dev, i40iw_dev_attributes[i]);
-                       }
-                       ib_unregister_device(&iwibdev->ibdev);
-                       goto error;
-               }
-       }
        return 0;
 error:
        kfree(iwdev->iwibdev->ibdev.iwcm);
index 81126f1..0def232 100644 (file)
@@ -2039,39 +2039,43 @@ out:
        return err;
 }
 
-static ssize_t show_hca(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mlx4_ib_dev *dev =
                container_of(device, struct mlx4_ib_dev, ib_dev.dev);
        return sprintf(buf, "MT%d\n", dev->dev->persist->pdev->device);
 }
+static DEVICE_ATTR_RO(hca_type);
 
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *device,
+                          struct device_attribute *attr, char *buf)
 {
        struct mlx4_ib_dev *dev =
                container_of(device, struct mlx4_ib_dev, ib_dev.dev);
        return sprintf(buf, "%x\n", dev->dev->rev_id);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_board(struct device *device, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mlx4_ib_dev *dev =
                container_of(device, struct mlx4_ib_dev, ib_dev.dev);
        return sprintf(buf, "%.*s\n", MLX4_BOARD_ID_LEN,
                       dev->dev->board_id);
 }
+static DEVICE_ATTR_RO(board_id);
 
-static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
+static struct attribute *mlx4_class_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL
+};
 
-static struct device_attribute *mlx4_class_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id
+static const struct attribute_group mlx4_attr_group = {
+       .attrs = mlx4_class_attributes,
 };
 
 struct diag_counter {
@@ -2803,6 +2807,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
        if (mlx4_ib_alloc_diag_counters(ibdev))
                goto err_steer_free_bitmap;
 
+       rdma_set_device_sysfs_group(&ibdev->ib_dev, &mlx4_attr_group);
        ibdev->ib_dev.driver_id = RDMA_DRIVER_MLX4;
        if (ib_register_device(&ibdev->ib_dev, "mlx4_%d", NULL))
                goto err_diag_counters;
@@ -2827,12 +2832,6 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
                        goto err_notif;
        }
 
-       for (j = 0; j < ARRAY_SIZE(mlx4_class_attributes); ++j) {
-               if (device_create_file(&ibdev->ib_dev.dev,
-                                      mlx4_class_attributes[j]))
-                       goto err_notif;
-       }
-
        ibdev->ib_active = true;
        mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
                devlink_port_type_ib_set(mlx4_get_devlink_port(dev, i),
index 35a0e04..584ff2e 100644 (file)
@@ -39,9 +39,6 @@ static const struct mlx5_ib_profile rep_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_POST_IB_REG_UMR,
                     mlx5_ib_stage_post_ib_reg_umr_init,
                     NULL),
-       STAGE_CREATE(MLX5_IB_STAGE_CLASS_ATTR,
-                    mlx5_ib_stage_class_attr_init,
-                    NULL),
 };
 
 static int
index b3294a7..be701d4 100644 (file)
@@ -4079,16 +4079,17 @@ static int init_node_data(struct mlx5_ib_dev *dev)
        return mlx5_query_node_guid(dev, &dev->ib_dev.node_guid);
 }
 
-static ssize_t show_fw_pages(struct device *device, struct device_attribute *attr,
-                            char *buf)
+static ssize_t fw_pages_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mlx5_ib_dev *dev =
                container_of(device, struct mlx5_ib_dev, ib_dev.dev);
 
        return sprintf(buf, "%d\n", dev->mdev->priv.fw_pages);
 }
+static DEVICE_ATTR_RO(fw_pages);
 
-static ssize_t show_reg_pages(struct device *device,
+static ssize_t reg_pages_show(struct device *device,
                              struct device_attribute *attr, char *buf)
 {
        struct mlx5_ib_dev *dev =
@@ -4096,44 +4097,47 @@ static ssize_t show_reg_pages(struct device *device,
 
        return sprintf(buf, "%d\n", atomic_read(&dev->mdev->priv.reg_pages));
 }
+static DEVICE_ATTR_RO(reg_pages);
 
-static ssize_t show_hca(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mlx5_ib_dev *dev =
                container_of(device, struct mlx5_ib_dev, ib_dev.dev);
        return sprintf(buf, "MT%d\n", dev->mdev->pdev->device);
 }
+static DEVICE_ATTR_RO(hca_type);
 
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *device,
+                          struct device_attribute *attr, char *buf)
 {
        struct mlx5_ib_dev *dev =
                container_of(device, struct mlx5_ib_dev, ib_dev.dev);
        return sprintf(buf, "%x\n", dev->mdev->rev_id);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_board(struct device *device, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mlx5_ib_dev *dev =
                container_of(device, struct mlx5_ib_dev, ib_dev.dev);
        return sprintf(buf, "%.*s\n", MLX5_BOARD_ID_LEN,
                       dev->mdev->board_id);
 }
+static DEVICE_ATTR_RO(board_id);
 
-static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
-static DEVICE_ATTR(fw_pages, S_IRUGO, show_fw_pages, NULL);
-static DEVICE_ATTR(reg_pages, S_IRUGO, show_reg_pages, NULL);
+static struct attribute *mlx5_class_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       &dev_attr_fw_pages.attr,
+       &dev_attr_reg_pages.attr,
+       NULL,
+};
 
-static struct device_attribute *mlx5_class_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id,
-       &dev_attr_fw_pages,
-       &dev_attr_reg_pages,
+static const struct attribute_group mlx5_attr_group = {
+       .attrs = mlx5_class_attributes,
 };
 
 static void pkey_change_handler(struct work_struct *work)
@@ -6112,6 +6116,7 @@ int mlx5_ib_stage_ib_reg_init(struct mlx5_ib_dev *dev)
 {
        const char *name;
 
+       rdma_set_device_sysfs_group(&dev->ib_dev, &mlx5_attr_group);
        if (!mlx5_lag_is_active(dev->mdev))
                name = "mlx5_%d";
        else
@@ -6146,21 +6151,6 @@ static void mlx5_ib_stage_delay_drop_cleanup(struct mlx5_ib_dev *dev)
        cancel_delay_drop(dev);
 }
 
-int mlx5_ib_stage_class_attr_init(struct mlx5_ib_dev *dev)
-{
-       int err;
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(mlx5_class_attributes); i++) {
-               err = device_create_file(&dev->ib_dev.dev,
-                                        mlx5_class_attributes[i]);
-               if (err)
-                       return err;
-       }
-
-       return 0;
-}
-
 static int mlx5_ib_stage_rep_reg_init(struct mlx5_ib_dev *dev)
 {
        mlx5_ib_register_vport_reps(dev);
@@ -6268,9 +6258,6 @@ static const struct mlx5_ib_profile pf_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_DELAY_DROP,
                     mlx5_ib_stage_delay_drop_init,
                     mlx5_ib_stage_delay_drop_cleanup),
-       STAGE_CREATE(MLX5_IB_STAGE_CLASS_ATTR,
-                    mlx5_ib_stage_class_attr_init,
-                    NULL),
 };
 
 static const struct mlx5_ib_profile nic_rep_profile = {
@@ -6313,9 +6300,6 @@ static const struct mlx5_ib_profile nic_rep_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_POST_IB_REG_UMR,
                     mlx5_ib_stage_post_ib_reg_umr_init,
                     NULL),
-       STAGE_CREATE(MLX5_IB_STAGE_CLASS_ATTR,
-                    mlx5_ib_stage_class_attr_init,
-                    NULL),
        STAGE_CREATE(MLX5_IB_STAGE_REP_REG,
                     mlx5_ib_stage_rep_reg_init,
                     mlx5_ib_stage_rep_reg_cleanup),
index e5ec3fd..8444ea7 100644 (file)
@@ -1201,7 +1201,6 @@ void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev);
 int mlx5_ib_stage_ib_reg_init(struct mlx5_ib_dev *dev);
 void mlx5_ib_stage_ib_reg_cleanup(struct mlx5_ib_dev *dev);
 int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev);
-int mlx5_ib_stage_class_attr_init(struct mlx5_ib_dev *dev);
 void __mlx5_ib_remove(struct mlx5_ib_dev *dev,
                      const struct mlx5_ib_profile *profile,
                      int stage);
index 7bd7e2a..691c6f0 100644 (file)
@@ -1076,16 +1076,17 @@ static int mthca_unmap_fmr(struct list_head *fmr_list)
        return err;
 }
 
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *device,
+                          struct device_attribute *attr, char *buf)
 {
        struct mthca_dev *dev =
                container_of(device, struct mthca_dev, ib_dev.dev);
        return sprintf(buf, "%x\n", dev->rev_id);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_hca(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mthca_dev *dev =
                container_of(device, struct mthca_dev, ib_dev.dev);
@@ -1103,23 +1104,26 @@ static ssize_t show_hca(struct device *device, struct device_attribute *attr,
                return sprintf(buf, "unknown\n");
        }
 }
+static DEVICE_ATTR_RO(hca_type);
 
-static ssize_t show_board(struct device *device, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct mthca_dev *dev =
                container_of(device, struct mthca_dev, ib_dev.dev);
        return sprintf(buf, "%.*s\n", MTHCA_BOARD_ID_LEN, dev->board_id);
 }
+static DEVICE_ATTR_RO(board_id);
 
-static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
+static struct attribute *mthca_dev_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL
+};
 
-static struct device_attribute *mthca_dev_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id
+static const struct attribute_group mthca_attr_group = {
+       .attrs = mthca_dev_attributes,
 };
 
 static int mthca_init_node_data(struct mthca_dev *dev)
@@ -1192,7 +1196,6 @@ static void get_dev_fw_str(struct ib_device *device, char *str)
 int mthca_register_device(struct mthca_dev *dev)
 {
        int ret;
-       int i;
 
        ret = mthca_init_node_data(dev);
        if (ret)
@@ -1295,20 +1298,12 @@ int mthca_register_device(struct mthca_dev *dev)
 
        mutex_init(&dev->cap_mask_mutex);
 
+       rdma_set_device_sysfs_group(&dev->ib_dev, &mthca_attr_group);
        dev->ib_dev.driver_id = RDMA_DRIVER_MTHCA;
        ret = ib_register_device(&dev->ib_dev, "mthca%d", NULL);
        if (ret)
                return ret;
 
-       for (i = 0; i < ARRAY_SIZE(mthca_dev_attributes); ++i) {
-               ret = device_create_file(&dev->ib_dev.dev,
-                                        mthca_dev_attributes[i]);
-               if (ret) {
-                       ib_unregister_device(&dev->ib_dev);
-                       return ret;
-               }
-       }
-
        mthca_start_catas_poll(dev);
 
        return 0;
index 94054bc..92d1cad 100644 (file)
@@ -2556,8 +2556,8 @@ static int nes_dereg_mr(struct ib_mr *ib_mr)
 /**
  * show_rev
  */
-static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *dev,
+                          struct device_attribute *attr, char *buf)
 {
        struct nes_ib_device *nesibdev =
                        container_of(dev, struct nes_ib_device, ibdev.dev);
@@ -2566,40 +2566,40 @@ static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
        nes_debug(NES_DBG_INIT, "\n");
        return sprintf(buf, "%x\n", nesvnic->nesdev->nesadapter->hw_rev);
 }
-
+static DEVICE_ATTR_RO(hw_rev);
 
 /**
  * show_hca
  */
-static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        nes_debug(NES_DBG_INIT, "\n");
        return sprintf(buf, "NES020\n");
 }
-
+static DEVICE_ATTR_RO(hca_type);
 
 /**
  * show_board
  */
-static ssize_t show_board(struct device *dev, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        nes_debug(NES_DBG_INIT, "\n");
        return sprintf(buf, "%.*s\n", 32, "NES020 Board ID");
 }
+static DEVICE_ATTR_RO(board_id);
 
-
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
-
-static struct device_attribute *nes_dev_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id
+static struct attribute *nes_dev_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL
 };
 
+static const struct attribute_group nes_attr_group = {
+       .attrs = nes_dev_attributes,
+};
 
 /**
  * nes_query_qp
@@ -3794,8 +3794,9 @@ int nes_register_ofa_device(struct nes_ib_device *nesibdev)
        struct nes_vnic *nesvnic = nesibdev->nesvnic;
        struct nes_device *nesdev = nesvnic->nesdev;
        struct nes_adapter *nesadapter = nesdev->nesadapter;
-       int i, ret;
+       int ret;
 
+       rdma_set_device_sysfs_group(&nesvnic->nesibdev->ibdev, &nes_attr_group);
        nesvnic->nesibdev->ibdev.driver_id = RDMA_DRIVER_NES;
        ret = ib_register_device(&nesvnic->nesibdev->ibdev, "nes%d", NULL);
        if (ret) {
@@ -3808,19 +3809,6 @@ int nes_register_ofa_device(struct nes_ib_device *nesibdev)
        nesibdev->max_qp = (nesadapter->max_qp-NES_FIRST_QPN) / nesadapter->port_count;
        nesibdev->max_pd = nesadapter->max_pd / nesadapter->port_count;
 
-       for (i = 0; i < ARRAY_SIZE(nes_dev_attributes); ++i) {
-               ret = device_create_file(&nesibdev->ibdev.dev, nes_dev_attributes[i]);
-               if (ret) {
-                       while (i > 0) {
-                               i--;
-                               device_remove_file(&nesibdev->ibdev.dev,
-                                                  nes_dev_attributes[i]);
-                       }
-                       ib_unregister_device(&nesibdev->ibdev);
-                       return ret;
-               }
-       }
-
        nesvnic->of_device_registered = 1;
 
        return 0;
@@ -3833,15 +3821,9 @@ int nes_register_ofa_device(struct nes_ib_device *nesibdev)
 static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev)
 {
        struct nes_vnic *nesvnic = nesibdev->nesvnic;
-       int i;
 
-       for (i = 0; i < ARRAY_SIZE(nes_dev_attributes); ++i) {
-               device_remove_file(&nesibdev->ibdev.dev, nes_dev_attributes[i]);
-       }
-
-       if (nesvnic->of_device_registered) {
+       if (nesvnic->of_device_registered)
                ib_unregister_device(&nesibdev->ibdev);
-       }
 
        nesvnic->of_device_registered = 0;
 }
index 4d3c276..873cc7f 100644 (file)
@@ -114,6 +114,35 @@ static void get_dev_fw_str(struct ib_device *device, char *str)
        snprintf(str, IB_FW_VERSION_NAME_MAX, "%s", &dev->attr.fw_ver[0]);
 }
 
+/* OCRDMA sysfs interface */
+static ssize_t hw_rev_show(struct device *device,
+                          struct device_attribute *attr, char *buf)
+{
+       struct ocrdma_dev *dev = dev_get_drvdata(device);
+
+       return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->nic_info.pdev->vendor);
+}
+static DEVICE_ATTR_RO(hw_rev);
+
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
+{
+       struct ocrdma_dev *dev = dev_get_drvdata(device);
+
+       return scnprintf(buf, PAGE_SIZE, "%s\n", &dev->model_number[0]);
+}
+static DEVICE_ATTR_RO(hca_type);
+
+static struct attribute *ocrdma_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       NULL
+};
+
+static const struct attribute_group ocrdma_attr_group = {
+       .attrs = ocrdma_attributes,
+};
+
 static int ocrdma_register_device(struct ocrdma_dev *dev)
 {
        ocrdma_get_guid(dev, (u8 *)&dev->ibdev.node_guid);
@@ -212,6 +241,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev)
                dev->ibdev.destroy_srq = ocrdma_destroy_srq;
                dev->ibdev.post_srq_recv = ocrdma_post_srq_recv;
        }
+       rdma_set_device_sysfs_group(&dev->ibdev, &ocrdma_attr_group);
        dev->ibdev.driver_id = RDMA_DRIVER_OCRDMA;
        return ib_register_device(&dev->ibdev, "ocrdma%d", NULL);
 }
@@ -259,42 +289,9 @@ static void ocrdma_free_resources(struct ocrdma_dev *dev)
        kfree(dev->cq_tbl);
 }
 
-/* OCRDMA sysfs interface */
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
-{
-       struct ocrdma_dev *dev = dev_get_drvdata(device);
-
-       return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->nic_info.pdev->vendor);
-}
-
-static ssize_t show_hca_type(struct device *device,
-                            struct device_attribute *attr, char *buf)
-{
-       struct ocrdma_dev *dev = dev_get_drvdata(device);
-
-       return scnprintf(buf, PAGE_SIZE, "%s\n", &dev->model_number[0]);
-}
-
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca_type, NULL);
-
-static struct device_attribute *ocrdma_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type
-};
-
-static void ocrdma_remove_sysfiles(struct ocrdma_dev *dev)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(ocrdma_attributes); i++)
-               device_remove_file(&dev->ibdev.dev, ocrdma_attributes[i]);
-}
-
 static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
 {
-       int status = 0, i;
+       int status = 0;
        u8 lstate = 0;
        struct ocrdma_dev *dev;
 
@@ -330,9 +327,6 @@ static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
        if (!status)
                ocrdma_update_link_state(dev, lstate);
 
-       for (i = 0; i < ARRAY_SIZE(ocrdma_attributes); i++)
-               if (device_create_file(&dev->ibdev.dev, ocrdma_attributes[i]))
-                       goto sysfs_err;
        /* Init stats */
        ocrdma_add_port_stats(dev);
        /* Interrupt Moderation */
@@ -347,8 +341,6 @@ static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
                dev_name(&dev->nic_info.pdev->dev), dev->id);
        return dev;
 
-sysfs_err:
-       ocrdma_remove_sysfiles(dev);
 alloc_err:
        ocrdma_free_resources(dev);
        ocrdma_cleanup_hw(dev);
@@ -375,7 +367,6 @@ static void ocrdma_remove(struct ocrdma_dev *dev)
         * of the registered clients.
         */
        cancel_delayed_work_sync(&dev->eqd_work);
-       ocrdma_remove_sysfiles(dev);
        ib_unregister_device(&dev->ibdev);
 
        ocrdma_rem_port_stats(dev);
index cd7b8b3..8d6ff9d 100644 (file)
@@ -133,6 +133,33 @@ static int qedr_iw_port_immutable(struct ib_device *ibdev, u8 port_num,
        return 0;
 }
 
+/* QEDR sysfs interface */
+static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr,
+                          char *buf)
+{
+       struct qedr_dev *dev = dev_get_drvdata(device);
+
+       return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->pdev->vendor);
+}
+static DEVICE_ATTR_RO(hw_rev);
+
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
+{
+       return scnprintf(buf, PAGE_SIZE, "%s\n", "HCA_TYPE_TO_SET");
+}
+static DEVICE_ATTR_RO(hca_type);
+
+static struct attribute *qedr_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       NULL
+};
+
+static const struct attribute_group qedr_attr_group = {
+       .attrs = qedr_attributes,
+};
+
 static int qedr_iw_register_device(struct qedr_dev *dev)
 {
        dev->ibdev.node_type = RDMA_NODE_RNIC;
@@ -260,7 +287,7 @@ static int qedr_register_device(struct qedr_dev *dev)
 
        dev->ibdev.get_link_layer = qedr_link_layer;
        dev->ibdev.get_dev_fw_str = qedr_get_dev_fw_str;
-
+       rdma_set_device_sysfs_group(&dev->ibdev, &qedr_attr_group);
        dev->ibdev.driver_id = RDMA_DRIVER_QEDR;
        return ib_register_device(&dev->ibdev, "qedr%d", NULL);
 }
@@ -402,37 +429,6 @@ err1:
        return rc;
 }
 
-/* QEDR sysfs interface */
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
-{
-       struct qedr_dev *dev = dev_get_drvdata(device);
-
-       return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->pdev->vendor);
-}
-
-static ssize_t show_hca_type(struct device *device,
-                            struct device_attribute *attr, char *buf)
-{
-       return scnprintf(buf, PAGE_SIZE, "%s\n", "HCA_TYPE_TO_SET");
-}
-
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca_type, NULL);
-
-static struct device_attribute *qedr_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type
-};
-
-static void qedr_remove_sysfiles(struct qedr_dev *dev)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(qedr_attributes); i++)
-               device_remove_file(&dev->ibdev.dev, qedr_attributes[i]);
-}
-
 static void qedr_pci_set_atomic(struct qedr_dev *dev, struct pci_dev *pdev)
 {
        int rc = pci_enable_atomic_ops_to_root(pdev,
@@ -853,7 +849,7 @@ static struct qedr_dev *qedr_add(struct qed_dev *cdev, struct pci_dev *pdev,
 {
        struct qed_dev_rdma_info dev_info;
        struct qedr_dev *dev;
-       int rc = 0, i;
+       int rc = 0;
 
        dev = (struct qedr_dev *)ib_alloc_device(sizeof(*dev));
        if (!dev) {
@@ -912,18 +908,12 @@ static struct qedr_dev *qedr_add(struct qed_dev *cdev, struct pci_dev *pdev,
                goto reg_err;
        }
 
-       for (i = 0; i < ARRAY_SIZE(qedr_attributes); i++)
-               if (device_create_file(&dev->ibdev.dev, qedr_attributes[i]))
-                       goto sysfs_err;
-
        if (!test_and_set_bit(QEDR_ENET_STATE_BIT, &dev->enet_state))
                qedr_ib_dispatch_event(dev, QEDR_PORT, IB_EVENT_PORT_ACTIVE);
 
        DP_DEBUG(dev, QEDR_MSG_INIT, "qedr driver loaded successfully\n");
        return dev;
 
-sysfs_err:
-       ib_unregister_device(&dev->ibdev);
 reg_err:
        qedr_sync_free_irqs(dev);
 irq_err:
@@ -942,7 +932,6 @@ static void qedr_remove(struct qedr_dev *dev)
        /* First unregister with stack to stop all the active traffic
         * of the registered clients.
         */
-       qedr_remove_sysfiles(dev);
        ib_unregister_device(&dev->ibdev);
 
        qedr_stop_hw(dev);
index 3461df0..83d2349 100644 (file)
@@ -1390,13 +1390,13 @@ static inline u32 qib_get_hdrqtail(const struct qib_ctxtdata *rcd)
  */
 
 extern const char ib_qib_version[];
+extern const struct attribute_group qib_attr_group;
 
 int qib_device_create(struct qib_devdata *);
 void qib_device_remove(struct qib_devdata *);
 
 int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
                          struct kobject *kobj);
-int qib_verbs_register_sysfs(struct qib_devdata *);
 void qib_verbs_unregister_sysfs(struct qib_devdata *);
 /* Hook for sysfs read of QSFP */
 extern int qib_qsfp_dump(struct qib_pportdata *ppd, char *buf, int len);
index ca2638d..1cf4ca3 100644 (file)
@@ -551,17 +551,18 @@ static struct kobj_type qib_diagc_ktype = {
  * Start of per-unit (or driver, in some cases, but replicated
  * per unit) functions (these get a device *)
  */
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr,
+                          char *buf)
 {
        struct qib_ibdev *dev =
                container_of(device, struct qib_ibdev, rdi.ibdev.dev);
 
        return sprintf(buf, "%x\n", dd_from_dev(dev)->minrev);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_hca(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
                container_of(device, struct qib_ibdev, rdi.ibdev.dev);
@@ -574,15 +575,18 @@ static ssize_t show_hca(struct device *device, struct device_attribute *attr,
                ret = scnprintf(buf, PAGE_SIZE, "%s\n", dd->boardname);
        return ret;
 }
+static DEVICE_ATTR_RO(hca_type);
+static DEVICE_ATTR(board_id, 0444, hca_type_show, NULL);
 
-static ssize_t show_version(struct device *device,
+static ssize_t version_show(struct device *device,
                            struct device_attribute *attr, char *buf)
 {
        /* The string printed here is already newline-terminated. */
        return scnprintf(buf, PAGE_SIZE, "%s", (char *)ib_qib_version);
 }
+static DEVICE_ATTR_RO(version);
 
-static ssize_t show_boardversion(struct device *device,
+static ssize_t boardversion_show(struct device *device,
                                 struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
@@ -592,9 +596,9 @@ static ssize_t show_boardversion(struct device *device,
        /* The string printed here is already newline-terminated. */
        return scnprintf(buf, PAGE_SIZE, "%s", dd->boardversion);
 }
+static DEVICE_ATTR_RO(boardversion);
 
-
-static ssize_t show_localbus_info(struct device *device,
+static ssize_t localbus_info_show(struct device *device,
                                  struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
@@ -604,9 +608,9 @@ static ssize_t show_localbus_info(struct device *device,
        /* The string printed here is already newline-terminated. */
        return scnprintf(buf, PAGE_SIZE, "%s", dd->lbus_info);
 }
+static DEVICE_ATTR_RO(localbus_info);
 
-
-static ssize_t show_nctxts(struct device *device,
+static ssize_t nctxts_show(struct device *device,
                           struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
@@ -620,9 +624,10 @@ static ssize_t show_nctxts(struct device *device,
                        (dd->first_user_ctxt > dd->cfgctxts) ? 0 :
                        (dd->cfgctxts - dd->first_user_ctxt));
 }
+static DEVICE_ATTR_RO(nctxts);
 
-static ssize_t show_nfreectxts(struct device *device,
-                          struct device_attribute *attr, char *buf)
+static ssize_t nfreectxts_show(struct device *device,
+                              struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
                container_of(device, struct qib_ibdev, rdi.ibdev.dev);
@@ -631,8 +636,9 @@ static ssize_t show_nfreectxts(struct device *device,
        /* Return the number of free user ports (contexts) available. */
        return scnprintf(buf, PAGE_SIZE, "%u\n", dd->freectxts);
 }
+static DEVICE_ATTR_RO(nfreectxts);
 
-static ssize_t show_serial(struct device *device,
+static ssize_t serial_show(struct device *device,
                           struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
@@ -644,8 +650,9 @@ static ssize_t show_serial(struct device *device,
        strcat(buf, "\n");
        return strlen(buf);
 }
+static DEVICE_ATTR_RO(serial);
 
-static ssize_t store_chip_reset(struct device *device,
+static ssize_t chip_reset_store(struct device *device,
                                struct device_attribute *attr, const char *buf,
                                size_t count)
 {
@@ -663,11 +670,12 @@ static ssize_t store_chip_reset(struct device *device,
 bail:
        return ret < 0 ? ret : count;
 }
+static DEVICE_ATTR_WO(chip_reset);
 
 /*
  * Dump tempsense regs. in decimal, to ease shell-scripts.
  */
-static ssize_t show_tempsense(struct device *device,
+static ssize_t tempsense_show(struct device *device,
                              struct device_attribute *attr, char *buf)
 {
        struct qib_ibdev *dev =
@@ -695,6 +703,7 @@ static ssize_t show_tempsense(struct device *device,
                                *(signed char *)(regvals + 7));
        return ret;
 }
+static DEVICE_ATTR_RO(tempsense);
 
 /*
  * end of per-unit (or driver, in some cases, but replicated
@@ -702,30 +711,23 @@ static ssize_t show_tempsense(struct device *device,
  */
 
 /* start of per-unit file structures and support code */
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_hca, NULL);
-static DEVICE_ATTR(version, S_IRUGO, show_version, NULL);
-static DEVICE_ATTR(nctxts, S_IRUGO, show_nctxts, NULL);
-static DEVICE_ATTR(nfreectxts, S_IRUGO, show_nfreectxts, NULL);
-static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL);
-static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL);
-static DEVICE_ATTR(tempsense, S_IRUGO, show_tempsense, NULL);
-static DEVICE_ATTR(localbus_info, S_IRUGO, show_localbus_info, NULL);
-static DEVICE_ATTR(chip_reset, S_IWUSR, NULL, store_chip_reset);
-
-static struct device_attribute *qib_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id,
-       &dev_attr_version,
-       &dev_attr_nctxts,
-       &dev_attr_nfreectxts,
-       &dev_attr_serial,
-       &dev_attr_boardversion,
-       &dev_attr_tempsense,
-       &dev_attr_localbus_info,
-       &dev_attr_chip_reset,
+static struct attribute *qib_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       &dev_attr_version.attr,
+       &dev_attr_nctxts.attr,
+       &dev_attr_nfreectxts.attr,
+       &dev_attr_serial.attr,
+       &dev_attr_boardversion.attr,
+       &dev_attr_tempsense.attr,
+       &dev_attr_localbus_info.attr,
+       &dev_attr_chip_reset.attr,
+       NULL,
+};
+
+const struct attribute_group qib_attr_group = {
+       .attrs = qib_attributes,
 };
 
 int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
@@ -827,27 +829,6 @@ bail:
 }
 
 /*
- * Register and create our files in /sys/class/infiniband.
- */
-int qib_verbs_register_sysfs(struct qib_devdata *dd)
-{
-       struct ib_device *dev = &dd->verbs_dev.rdi.ibdev;
-       int i, ret;
-
-       for (i = 0; i < ARRAY_SIZE(qib_attributes); ++i) {
-               ret = device_create_file(&dev->dev, qib_attributes[i]);
-               if (ret)
-                       goto bail;
-       }
-
-       return 0;
-bail:
-       for (i = 0; i < ARRAY_SIZE(qib_attributes); ++i)
-               device_remove_file(&dev->dev, qib_attributes[i]);
-       return ret;
-}
-
-/*
  * Unregister and remove our files in /sys/class/infiniband.
  */
 void qib_verbs_unregister_sysfs(struct qib_devdata *dd)
index 8a45964..4b0f576 100644 (file)
@@ -1625,19 +1625,14 @@ int qib_register_ib_device(struct qib_devdata *dd)
                              i,
                              dd->rcd[ctxt]->pkeys);
        }
+       rdma_set_device_sysfs_group(&dd->verbs_dev.rdi.ibdev, &qib_attr_group);
 
        ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_QIB);
        if (ret)
                goto err_tx;
 
-       ret = qib_verbs_register_sysfs(dd);
-       if (ret)
-               goto err_class;
-
        return ret;
 
-err_class:
-       rvt_unregister_device(&dd->verbs_dev.rdi);
 err_tx:
        while (!list_empty(&dev->txreq_free)) {
                struct list_head *l = dev->txreq_free.next;
index e3f98fe..73bd00f 100644 (file)
@@ -417,6 +417,8 @@ static void *usnic_ib_device_add(struct pci_dev *dev)
 
 
        us_ibdev->ib_dev.driver_id = RDMA_DRIVER_USNIC;
+       rdma_set_device_sysfs_group(&us_ibdev->ib_dev, &usnic_attr_group);
+
        if (ib_register_device(&us_ibdev->ib_dev, "usnic_%d", NULL))
                goto err_fwd_dealloc;
 
index fab4cb7..a7e4b2c 100644 (file)
@@ -46,9 +46,8 @@
 #include "usnic_ib_sysfs.h"
 #include "usnic_log.h"
 
-static ssize_t usnic_ib_show_board(struct device *device,
-                                       struct device_attribute *attr,
-                                       char *buf)
+static ssize_t board_id_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev =
                container_of(device, struct usnic_ib_dev, ib_dev.dev);
@@ -60,13 +59,13 @@ static ssize_t usnic_ib_show_board(struct device *device,
 
        return scnprintf(buf, PAGE_SIZE, "%hu\n", subsystem_device_id);
 }
+static DEVICE_ATTR_RO(board_id);
 
 /*
  * Report the configuration for this PF
  */
 static ssize_t
-usnic_ib_show_config(struct device *device, struct device_attribute *attr,
-                       char *buf)
+config_show(struct device *device, struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev;
        char *ptr;
@@ -126,10 +125,10 @@ usnic_ib_show_config(struct device *device, struct device_attribute *attr,
 
        return ptr - buf;
 }
+static DEVICE_ATTR_RO(config);
 
 static ssize_t
-usnic_ib_show_iface(struct device *device, struct device_attribute *attr,
-                       char *buf)
+iface_show(struct device *device, struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev;
 
@@ -138,10 +137,10 @@ usnic_ib_show_iface(struct device *device, struct device_attribute *attr,
        return scnprintf(buf, PAGE_SIZE, "%s\n",
                        netdev_name(us_ibdev->netdev));
 }
+static DEVICE_ATTR_RO(iface);
 
 static ssize_t
-usnic_ib_show_max_vf(struct device *device, struct device_attribute *attr,
-                       char *buf)
+max_vf_show(struct device *device, struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev;
 
@@ -150,10 +149,10 @@ usnic_ib_show_max_vf(struct device *device, struct device_attribute *attr,
        return scnprintf(buf, PAGE_SIZE, "%u\n",
                        kref_read(&us_ibdev->vf_cnt));
 }
+static DEVICE_ATTR_RO(max_vf);
 
 static ssize_t
-usnic_ib_show_qp_per_vf(struct device *device, struct device_attribute *attr,
-                       char *buf)
+qp_per_vf_show(struct device *device, struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev;
        int qp_per_vf;
@@ -165,10 +164,10 @@ usnic_ib_show_qp_per_vf(struct device *device, struct device_attribute *attr,
        return scnprintf(buf, PAGE_SIZE,
                                "%d\n", qp_per_vf);
 }
+static DEVICE_ATTR_RO(qp_per_vf);
 
 static ssize_t
-usnic_ib_show_cq_per_vf(struct device *device, struct device_attribute *attr,
-                       char *buf)
+cq_per_vf_show(struct device *device, struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev;
 
@@ -177,21 +176,20 @@ usnic_ib_show_cq_per_vf(struct device *device, struct device_attribute *attr,
        return scnprintf(buf, PAGE_SIZE, "%d\n",
                        us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_CQ]);
 }
+static DEVICE_ATTR_RO(cq_per_vf);
+
+static struct attribute *usnic_class_attributes[] = {
+       &dev_attr_board_id.attr,
+       &dev_attr_config.attr,
+       &dev_attr_iface.attr,
+       &dev_attr_max_vf.attr,
+       &dev_attr_qp_per_vf.attr,
+       &dev_attr_cq_per_vf.attr,
+       NULL
+};
 
-static DEVICE_ATTR(board_id, S_IRUGO, usnic_ib_show_board, NULL);
-static DEVICE_ATTR(config, S_IRUGO, usnic_ib_show_config, NULL);
-static DEVICE_ATTR(iface, S_IRUGO, usnic_ib_show_iface, NULL);
-static DEVICE_ATTR(max_vf, S_IRUGO, usnic_ib_show_max_vf, NULL);
-static DEVICE_ATTR(qp_per_vf, S_IRUGO, usnic_ib_show_qp_per_vf, NULL);
-static DEVICE_ATTR(cq_per_vf, S_IRUGO, usnic_ib_show_cq_per_vf, NULL);
-
-static struct device_attribute *usnic_class_attributes[] = {
-       &dev_attr_board_id,
-       &dev_attr_config,
-       &dev_attr_iface,
-       &dev_attr_max_vf,
-       &dev_attr_qp_per_vf,
-       &dev_attr_cq_per_vf,
+const struct attribute_group usnic_attr_group = {
+       .attrs = usnic_class_attributes,
 };
 
 struct qpn_attribute {
@@ -278,18 +276,6 @@ static struct kobj_type usnic_ib_qpn_type = {
 
 int usnic_ib_sysfs_register_usdev(struct usnic_ib_dev *us_ibdev)
 {
-       int i;
-       int err;
-       for (i = 0; i < ARRAY_SIZE(usnic_class_attributes); ++i) {
-               err = device_create_file(&us_ibdev->ib_dev.dev,
-                                               usnic_class_attributes[i]);
-               if (err) {
-                       usnic_err("Failed to create device file %d for %s eith err %d",
-                               i, dev_name(&us_ibdev->ib_dev.dev), err);
-                       return -EINVAL;
-               }
-       }
-
        /* create kernel object for looking at individual QPs */
        kobject_get(&us_ibdev->ib_dev.dev.kobj);
        us_ibdev->qpn_kobj = kobject_create_and_add("qpn",
@@ -304,12 +290,6 @@ int usnic_ib_sysfs_register_usdev(struct usnic_ib_dev *us_ibdev)
 
 void usnic_ib_sysfs_unregister_usdev(struct usnic_ib_dev *us_ibdev)
 {
-       int i;
-       for (i = 0; i < ARRAY_SIZE(usnic_class_attributes); ++i) {
-               device_remove_file(&us_ibdev->ib_dev.dev,
-                                       usnic_class_attributes[i]);
-       }
-
        kobject_put(us_ibdev->qpn_kobj);
 }
 
index 3d98e16..b1f064c 100644 (file)
@@ -41,4 +41,6 @@ void usnic_ib_sysfs_unregister_usdev(struct usnic_ib_dev *us_ibdev);
 void usnic_ib_sysfs_qpn_add(struct usnic_ib_qp_grp *qp_grp);
 void usnic_ib_sysfs_qpn_remove(struct usnic_ib_qp_grp *qp_grp);
 
+extern const struct attribute_group usnic_attr_group;
+
 #endif /* !USNIC_IB_SYSFS_H_ */
index c1e3198..398443f 100644 (file)
@@ -65,32 +65,36 @@ static struct workqueue_struct *event_wq;
 static int pvrdma_add_gid(const struct ib_gid_attr *attr, void **context);
 static int pvrdma_del_gid(const struct ib_gid_attr *attr, void **context);
 
-static ssize_t show_hca(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "VMW_PVRDMA-%s\n", DRV_VERSION);
 }
+static DEVICE_ATTR_RO(hca_type);
 
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
-                       char *buf)
+static ssize_t hw_rev_show(struct device *device,
+                          struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "%d\n", PVRDMA_REV_ID);
 }
+static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t show_board(struct device *device, struct device_attribute *attr,
-                         char *buf)
+static ssize_t board_id_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
 {
        return sprintf(buf, "%d\n", PVRDMA_BOARD_ID);
 }
+static DEVICE_ATTR_RO(board_id);
 
-static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,           NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,           NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
+static struct attribute *pvrdma_class_attributes[] = {
+       &dev_attr_hw_rev.attr,
+       &dev_attr_hca_type.attr,
+       &dev_attr_board_id.attr,
+       NULL,
+};
 
-static struct device_attribute *pvrdma_class_attributes[] = {
-       &dev_attr_hw_rev,
-       &dev_attr_hca_type,
-       &dev_attr_board_id
+static const struct attribute_group pvrdma_attr_group = {
+       .attrs = pvrdma_class_attributes,
 };
 
 static void pvrdma_get_fw_ver_str(struct ib_device *device, char *str)
@@ -160,7 +164,6 @@ static struct net_device *pvrdma_get_netdev(struct ib_device *ibdev,
 static int pvrdma_register_device(struct pvrdma_dev *dev)
 {
        int ret = -1;
-       int i = 0;
 
        dev->ib_dev.node_guid = dev->dsr->caps.node_guid;
        dev->sys_image_guid = dev->dsr->caps.sys_image_guid;
@@ -265,24 +268,16 @@ static int pvrdma_register_device(struct pvrdma_dev *dev)
        }
        dev->ib_dev.driver_id = RDMA_DRIVER_VMW_PVRDMA;
        spin_lock_init(&dev->srq_tbl_lock);
+       rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group);
 
        ret = ib_register_device(&dev->ib_dev, "vmw_pvrdma%d", NULL);
        if (ret)
                goto err_srq_free;
 
-       for (i = 0; i < ARRAY_SIZE(pvrdma_class_attributes); ++i) {
-               ret = device_create_file(&dev->ib_dev.dev,
-                                        pvrdma_class_attributes[i]);
-               if (ret)
-                       goto err_class;
-       }
-
        dev->ib_active = true;
 
        return 0;
 
-err_class:
-       ib_unregister_device(&dev->ib_dev);
 err_srq_free:
        kfree(dev->srq_tbl);
 err_qp_free:
index e4da5b6..9c19f20 100644 (file)
@@ -1148,14 +1148,18 @@ static ssize_t parent_show(struct device *device,
 
 static DEVICE_ATTR_RO(parent);
 
-static struct device_attribute *rxe_dev_attributes[] = {
-       &dev_attr_parent,
+static struct attribute *rxe_dev_attributes[] = {
+       &dev_attr_parent.attr,
+       NULL
+};
+
+static const struct attribute_group rxe_attr_group = {
+       .attrs = rxe_dev_attributes,
 };
 
 int rxe_register_device(struct rxe_dev *rxe)
 {
        int err;
-       int i;
        struct ib_device *dev = &rxe->ib_dev;
        struct crypto_shash *tfm;
 
@@ -1259,6 +1263,7 @@ int rxe_register_device(struct rxe_dev *rxe)
        }
        rxe->tfm = tfm;
 
+       rdma_set_device_sysfs_group(dev, &rxe_attr_group);
        dev->driver_id = RDMA_DRIVER_RXE;
        err = ib_register_device(dev, "rxe%d", NULL);
        if (err) {
@@ -1266,19 +1271,8 @@ int rxe_register_device(struct rxe_dev *rxe)
                goto err1;
        }
 
-       for (i = 0; i < ARRAY_SIZE(rxe_dev_attributes); ++i) {
-               err = device_create_file(&dev->dev, rxe_dev_attributes[i]);
-               if (err) {
-                       pr_warn("%s failed with error %d for attr number %d\n",
-                               __func__, err, i);
-                       goto err2;
-               }
-       }
-
        return 0;
 
-err2:
-       ib_unregister_device(dev);
 err1:
        crypto_free_shash(rxe->tfm);
 
@@ -1287,12 +1281,8 @@ err1:
 
 int rxe_unregister_device(struct rxe_dev *rxe)
 {
-       int i;
        struct ib_device *dev = &rxe->ib_dev;
 
-       for (i = 0; i < ARRAY_SIZE(rxe_dev_attributes); ++i)
-               device_remove_file(&dev->dev, rxe_dev_attributes[i]);
-
        ib_unregister_device(dev);
 
        return 0;