diff options
Diffstat (limited to 'drivers/infiniband/core/sysfs.c')
-rw-r--r-- | drivers/infiniband/core/sysfs.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c index d11ceff2b4e4..b153dee1e0fa 100644 --- a/drivers/infiniband/core/sysfs.c +++ b/drivers/infiniband/core/sysfs.c @@ -1031,8 +1031,6 @@ static void setup_hw_stats(struct ib_device *device, struct ib_port *port, goto err; port->hw_stats_ag = hsag; port->hw_stats = stats; - if (device->port_data) - device->port_data[port_num].hw_stats = stats; } else { struct kobject *kobj = &device->dev.kobj; ret = sysfs_create_group(kobj, hsag); @@ -1053,6 +1051,14 @@ err_free_stats: kfree(stats); } +struct rdma_hw_stats *ib_get_hw_stats_port(struct ib_device *ibdev, + u32 port_num) +{ + if (!ibdev->port_data || !rdma_is_port_valid(ibdev, port_num)) + return NULL; + return ibdev->port_data[port_num].sysfs->hw_stats; +} + static int add_port(struct ib_core_device *coredev, int port_num) { struct ib_device *device = rdma_device_to_ibdev(&coredev->dev); @@ -1171,6 +1177,8 @@ static int add_port(struct ib_core_device *coredev, int port_num) setup_hw_stats(device, p, port_num); list_add_tail(&p->kobj.entry, &coredev->port_list); + if (device->port_data && is_full_dev) + device->port_data[port_num].sysfs = p; kobject_uevent(&p->kobj, KOBJ_ADD); return 0; @@ -1361,7 +1369,7 @@ void ib_free_port_attrs(struct ib_core_device *coredev) free_hsag(&port->kobj, port->hw_stats_ag); kfree(port->hw_stats); if (device->port_data && is_full_dev) - device->port_data[port->port_num].hw_stats = NULL; + device->port_data[port->port_num].sysfs = NULL; if (port->pma_table) sysfs_remove_group(p, port->pma_table); |