diff options
Diffstat (limited to 'drivers/s390/net/ctcm_main.c')
-rw-r--r-- | drivers/s390/net/ctcm_main.c | 52 |
1 files changed, 16 insertions, 36 deletions
diff --git a/drivers/s390/net/ctcm_main.c b/drivers/s390/net/ctcm_main.c index 11f3b071f305..3cd25544a27a 100644 --- a/drivers/s390/net/ctcm_main.c +++ b/drivers/s390/net/ctcm_main.c | |||
@@ -1296,6 +1296,11 @@ static void ctcm_irq_handler(struct ccw_device *cdev, | |||
1296 | 1296 | ||
1297 | } | 1297 | } |
1298 | 1298 | ||
1299 | static const struct device_type ctcm_devtype = { | ||
1300 | .name = "ctcm", | ||
1301 | .groups = ctcm_attr_groups, | ||
1302 | }; | ||
1303 | |||
1299 | /** | 1304 | /** |
1300 | * Add ctcm specific attributes. | 1305 | * Add ctcm specific attributes. |
1301 | * Add ctcm private data. | 1306 | * Add ctcm private data. |
@@ -1307,7 +1312,6 @@ static void ctcm_irq_handler(struct ccw_device *cdev, | |||
1307 | static int ctcm_probe_device(struct ccwgroup_device *cgdev) | 1312 | static int ctcm_probe_device(struct ccwgroup_device *cgdev) |
1308 | { | 1313 | { |
1309 | struct ctcm_priv *priv; | 1314 | struct ctcm_priv *priv; |
1310 | int rc; | ||
1311 | 1315 | ||
1312 | CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, | 1316 | CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, |
1313 | "%s %p", | 1317 | "%s %p", |
@@ -1324,17 +1328,11 @@ static int ctcm_probe_device(struct ccwgroup_device *cgdev) | |||
1324 | put_device(&cgdev->dev); | 1328 | put_device(&cgdev->dev); |
1325 | return -ENOMEM; | 1329 | return -ENOMEM; |
1326 | } | 1330 | } |
1327 | |||
1328 | rc = ctcm_add_files(&cgdev->dev); | ||
1329 | if (rc) { | ||
1330 | kfree(priv); | ||
1331 | put_device(&cgdev->dev); | ||
1332 | return rc; | ||
1333 | } | ||
1334 | priv->buffer_size = CTCM_BUFSIZE_DEFAULT; | 1331 | priv->buffer_size = CTCM_BUFSIZE_DEFAULT; |
1335 | cgdev->cdev[0]->handler = ctcm_irq_handler; | 1332 | cgdev->cdev[0]->handler = ctcm_irq_handler; |
1336 | cgdev->cdev[1]->handler = ctcm_irq_handler; | 1333 | cgdev->cdev[1]->handler = ctcm_irq_handler; |
1337 | dev_set_drvdata(&cgdev->dev, priv); | 1334 | dev_set_drvdata(&cgdev->dev, priv); |
1335 | cgdev->dev.type = &ctcm_devtype; | ||
1338 | 1336 | ||
1339 | return 0; | 1337 | return 0; |
1340 | } | 1338 | } |
@@ -1611,11 +1609,6 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev) | |||
1611 | goto out_dev; | 1609 | goto out_dev; |
1612 | } | 1610 | } |
1613 | 1611 | ||
1614 | if (ctcm_add_attributes(&cgdev->dev)) { | ||
1615 | result = -ENODEV; | ||
1616 | goto out_unregister; | ||
1617 | } | ||
1618 | |||
1619 | strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name)); | 1612 | strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name)); |
1620 | 1613 | ||
1621 | dev_info(&dev->dev, | 1614 | dev_info(&dev->dev, |
@@ -1629,8 +1622,6 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev) | |||
1629 | priv->channel[CTCM_WRITE]->id, priv->protocol); | 1622 | priv->channel[CTCM_WRITE]->id, priv->protocol); |
1630 | 1623 | ||
1631 | return 0; | 1624 | return 0; |
1632 | out_unregister: | ||
1633 | unregister_netdev(dev); | ||
1634 | out_dev: | 1625 | out_dev: |
1635 | ctcm_free_netdevice(dev); | 1626 | ctcm_free_netdevice(dev); |
1636 | out_ccw2: | 1627 | out_ccw2: |
@@ -1669,7 +1660,6 @@ static int ctcm_shutdown_device(struct ccwgroup_device *cgdev) | |||
1669 | /* Close the device */ | 1660 | /* Close the device */ |
1670 | ctcm_close(dev); | 1661 | ctcm_close(dev); |
1671 | dev->flags &= ~IFF_RUNNING; | 1662 | dev->flags &= ~IFF_RUNNING; |
1672 | ctcm_remove_attributes(&cgdev->dev); | ||
1673 | channel_free(priv->channel[CTCM_READ]); | 1663 | channel_free(priv->channel[CTCM_READ]); |
1674 | } else | 1664 | } else |
1675 | dev = NULL; | 1665 | dev = NULL; |
@@ -1711,7 +1701,6 @@ static void ctcm_remove_device(struct ccwgroup_device *cgdev) | |||
1711 | 1701 | ||
1712 | if (cgdev->state == CCWGROUP_ONLINE) | 1702 | if (cgdev->state == CCWGROUP_ONLINE) |
1713 | ctcm_shutdown_device(cgdev); | 1703 | ctcm_shutdown_device(cgdev); |
1714 | ctcm_remove_files(&cgdev->dev); | ||
1715 | dev_set_drvdata(&cgdev->dev, NULL); | 1704 | dev_set_drvdata(&cgdev->dev, NULL); |
1716 | kfree(priv); | 1705 | kfree(priv); |
1717 | put_device(&cgdev->dev); | 1706 | put_device(&cgdev->dev); |
@@ -1778,9 +1767,7 @@ static struct ccwgroup_driver ctcm_group_driver = { | |||
1778 | .owner = THIS_MODULE, | 1767 | .owner = THIS_MODULE, |
1779 | .name = CTC_DRIVER_NAME, | 1768 | .name = CTC_DRIVER_NAME, |
1780 | }, | 1769 | }, |
1781 | .max_slaves = 2, | 1770 | .setup = ctcm_probe_device, |
1782 | .driver_id = 0xC3E3C3D4, /* CTCM */ | ||
1783 | .probe = ctcm_probe_device, | ||
1784 | .remove = ctcm_remove_device, | 1771 | .remove = ctcm_remove_device, |
1785 | .set_online = ctcm_new_device, | 1772 | .set_online = ctcm_new_device, |
1786 | .set_offline = ctcm_shutdown_device, | 1773 | .set_offline = ctcm_shutdown_device, |
@@ -1789,31 +1776,25 @@ static struct ccwgroup_driver ctcm_group_driver = { | |||
1789 | .restore = ctcm_pm_resume, | 1776 | .restore = ctcm_pm_resume, |
1790 | }; | 1777 | }; |
1791 | 1778 | ||
1792 | static ssize_t | 1779 | static ssize_t ctcm_driver_group_store(struct device_driver *ddrv, |
1793 | ctcm_driver_group_store(struct device_driver *ddrv, const char *buf, | 1780 | const char *buf, size_t count) |
1794 | size_t count) | ||
1795 | { | 1781 | { |
1796 | int err; | 1782 | int err; |
1797 | 1783 | ||
1798 | err = ccwgroup_create_from_string(ctcm_root_dev, | 1784 | err = ccwgroup_create_dev(ctcm_root_dev, &ctcm_group_driver, 2, buf); |
1799 | ctcm_group_driver.driver_id, | ||
1800 | &ctcm_ccw_driver, 2, buf); | ||
1801 | return err ? err : count; | 1785 | return err ? err : count; |
1802 | } | 1786 | } |
1803 | |||
1804 | static DRIVER_ATTR(group, 0200, NULL, ctcm_driver_group_store); | 1787 | static DRIVER_ATTR(group, 0200, NULL, ctcm_driver_group_store); |
1805 | 1788 | ||
1806 | static struct attribute *ctcm_group_attrs[] = { | 1789 | static struct attribute *ctcm_drv_attrs[] = { |
1807 | &driver_attr_group.attr, | 1790 | &driver_attr_group.attr, |
1808 | NULL, | 1791 | NULL, |
1809 | }; | 1792 | }; |
1810 | 1793 | static struct attribute_group ctcm_drv_attr_group = { | |
1811 | static struct attribute_group ctcm_group_attr_group = { | 1794 | .attrs = ctcm_drv_attrs, |
1812 | .attrs = ctcm_group_attrs, | ||
1813 | }; | 1795 | }; |
1814 | 1796 | static const struct attribute_group *ctcm_drv_attr_groups[] = { | |
1815 | static const struct attribute_group *ctcm_group_attr_groups[] = { | 1797 | &ctcm_drv_attr_group, |
1816 | &ctcm_group_attr_group, | ||
1817 | NULL, | 1798 | NULL, |
1818 | }; | 1799 | }; |
1819 | 1800 | ||
@@ -1829,7 +1810,6 @@ static const struct attribute_group *ctcm_group_attr_groups[] = { | |||
1829 | */ | 1810 | */ |
1830 | static void __exit ctcm_exit(void) | 1811 | static void __exit ctcm_exit(void) |
1831 | { | 1812 | { |
1832 | driver_remove_file(&ctcm_group_driver.driver, &driver_attr_group); | ||
1833 | ccwgroup_driver_unregister(&ctcm_group_driver); | 1813 | ccwgroup_driver_unregister(&ctcm_group_driver); |
1834 | ccw_driver_unregister(&ctcm_ccw_driver); | 1814 | ccw_driver_unregister(&ctcm_ccw_driver); |
1835 | root_device_unregister(ctcm_root_dev); | 1815 | root_device_unregister(ctcm_root_dev); |
@@ -1867,7 +1847,7 @@ static int __init ctcm_init(void) | |||
1867 | ret = ccw_driver_register(&ctcm_ccw_driver); | 1847 | ret = ccw_driver_register(&ctcm_ccw_driver); |
1868 | if (ret) | 1848 | if (ret) |
1869 | goto ccw_err; | 1849 | goto ccw_err; |
1870 | ctcm_group_driver.driver.groups = ctcm_group_attr_groups; | 1850 | ctcm_group_driver.driver.groups = ctcm_drv_attr_groups; |
1871 | ret = ccwgroup_driver_register(&ctcm_group_driver); | 1851 | ret = ccwgroup_driver_register(&ctcm_group_driver); |
1872 | if (ret) | 1852 | if (ret) |
1873 | goto ccwgroup_err; | 1853 | goto ccwgroup_err; |