diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/dibs/dibs_main.c | 40 | ||||
| -rw-r--r-- | drivers/s390/net/ism_drv.c | 5 |
2 files changed, 44 insertions, 1 deletions
diff --git a/drivers/dibs/dibs_main.c b/drivers/dibs/dibs_main.c index 610b6c452211..b3f21805aa59 100644 --- a/drivers/dibs/dibs_main.c +++ b/drivers/dibs/dibs_main.c @@ -20,6 +20,8 @@ MODULE_DESCRIPTION("Direct Internal Buffer Sharing class"); MODULE_LICENSE("GPL"); +static struct class *dibs_class; + /* use an array rather a list for fast mapping: */ static struct dibs_client *clients[MAX_DIBS_CLIENTS]; static u8 max_client; @@ -105,12 +107,35 @@ struct dibs_dev *dibs_dev_alloc(void) if (!dibs) return dibs; dibs->dev.release = dibs_dev_release; + dibs->dev.class = dibs_class; device_initialize(&dibs->dev); return dibs; } EXPORT_SYMBOL_GPL(dibs_dev_alloc); +static ssize_t fabric_id_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct dibs_dev *dibs; + u16 fabric_id; + + dibs = container_of(dev, struct dibs_dev, dev); + fabric_id = dibs->ops->get_fabric_id(dibs); + + return sysfs_emit(buf, "0x%04x\n", fabric_id); +} +static DEVICE_ATTR_RO(fabric_id); + +static struct attribute *dibs_dev_attrs[] = { + &dev_attr_fabric_id.attr, + NULL, +}; + +static const struct attribute_group dibs_dev_attr_group = { + .attrs = dibs_dev_attrs, +}; + int dibs_dev_add(struct dibs_dev *dibs) { int i, ret; @@ -119,6 +144,11 @@ int dibs_dev_add(struct dibs_dev *dibs) if (ret) return ret; + ret = sysfs_create_group(&dibs->dev.kobj, &dibs_dev_attr_group); + if (ret) { + dev_err(&dibs->dev, "sysfs_create_group failed for dibs_dev\n"); + goto err_device_del; + } mutex_lock(&dibs_dev_list.mutex); mutex_lock(&clients_lock); for (i = 0; i < max_client; ++i) { @@ -130,6 +160,11 @@ int dibs_dev_add(struct dibs_dev *dibs) mutex_unlock(&dibs_dev_list.mutex); return 0; + +err_device_del: + device_del(&dibs->dev); + return ret; + } EXPORT_SYMBOL_GPL(dibs_dev_add); @@ -158,6 +193,10 @@ static int __init dibs_init(void) memset(clients, 0, sizeof(clients)); max_client = 0; + dibs_class = class_create("dibs"); + if (IS_ERR(&dibs_class)) + return PTR_ERR(&dibs_class); + rc = dibs_loopback_init(); if (rc) pr_err("%s fails with %d\n", __func__, rc); @@ -168,6 +207,7 @@ static int __init dibs_init(void) static void __exit dibs_exit(void) { dibs_loopback_exit(); + class_destroy(dibs_class); } module_init(dibs_init); diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c index 4096ea9faa7e..ab1d61eb3e3b 100644 --- a/drivers/s390/net/ism_drv.c +++ b/drivers/s390/net/ism_drv.c @@ -629,6 +629,7 @@ static void ism_dev_exit(struct ism_dev *ism) static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct dibs_dev *dibs; + struct zpci_dev *zdev; struct ism_dev *ism; int ret; @@ -672,7 +673,9 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto err_dibs; dibs->dev.parent = &pdev->dev; - dev_set_name(&dibs->dev, "%s", dev_name(&pdev->dev)); + + zdev = to_zpci(pdev); + dev_set_name(&dibs->dev, "ism%x", zdev->uid ? zdev->uid : zdev->fid); ret = dibs_dev_add(dibs); if (ret) |
