Commit f9a5d70c authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Martin Schwidefsky

s390/ccwgroup: tie a ccwgroup driver to its ccw driver

When grouping devices, the ccwgroup core only checks whether all of the
devices are bound to the same ccw_driver. It has no means of checking
if the requesting ccwgroup driver actually supports this device type.
qeth implements its own device matching in qeth_core_probe_device(),
while ctcm and lcs currently have no sanity-checking at all.

Enable ccwgroup drivers to optionally defer the device type checking to
the ccwgroup core, by specifying their supported ccw_driver.
This allows us drop the device type matching from qeth, and improves
the robustness of ctcm and lcs.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
Acked-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent bf7fa038
...@@ -41,6 +41,7 @@ struct ccwgroup_device { ...@@ -41,6 +41,7 @@ struct ccwgroup_device {
* @thaw: undo work done in @freeze * @thaw: undo work done in @freeze
* @restore: callback for restoring after hibernation * @restore: callback for restoring after hibernation
* @driver: embedded driver structure * @driver: embedded driver structure
* @ccw_driver: supported ccw_driver (optional)
*/ */
struct ccwgroup_driver { struct ccwgroup_driver {
int (*setup) (struct ccwgroup_device *); int (*setup) (struct ccwgroup_device *);
...@@ -55,6 +56,7 @@ struct ccwgroup_driver { ...@@ -55,6 +56,7 @@ struct ccwgroup_driver {
int (*restore)(struct ccwgroup_device *); int (*restore)(struct ccwgroup_device *);
struct device_driver driver; struct device_driver driver;
struct ccw_driver *ccw_driver;
}; };
extern int ccwgroup_driver_register (struct ccwgroup_driver *cdriver); extern int ccwgroup_driver_register (struct ccwgroup_driver *cdriver);
......
...@@ -373,6 +373,12 @@ int ccwgroup_create_dev(struct device *parent, struct ccwgroup_driver *gdrv, ...@@ -373,6 +373,12 @@ int ccwgroup_create_dev(struct device *parent, struct ccwgroup_driver *gdrv,
rc = -EINVAL; rc = -EINVAL;
goto error; goto error;
} }
/* Check if the devices are bound to the required ccw driver. */
if (gdev->count && gdrv && gdrv->ccw_driver &&
gdev->cdev[0]->drv != gdrv->ccw_driver) {
rc = -EINVAL;
goto error;
}
dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev)); dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev));
gdev->dev.groups = ccwgroup_attr_groups; gdev->dev.groups = ccwgroup_attr_groups;
......
...@@ -1761,6 +1761,7 @@ static struct ccwgroup_driver ctcm_group_driver = { ...@@ -1761,6 +1761,7 @@ static struct ccwgroup_driver ctcm_group_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = CTC_DRIVER_NAME, .name = CTC_DRIVER_NAME,
}, },
.ccw_driver = &ctcm_ccw_driver,
.setup = ctcm_probe_device, .setup = ctcm_probe_device,
.remove = ctcm_remove_device, .remove = ctcm_remove_device,
.set_online = ctcm_new_device, .set_online = ctcm_new_device,
......
...@@ -2396,6 +2396,7 @@ static struct ccwgroup_driver lcs_group_driver = { ...@@ -2396,6 +2396,7 @@ static struct ccwgroup_driver lcs_group_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "lcs", .name = "lcs",
}, },
.ccw_driver = &lcs_ccw_driver,
.setup = lcs_probe_device, .setup = lcs_probe_device,
.remove = lcs_remove_device, .remove = lcs_remove_device,
.set_online = lcs_new_device, .set_online = lcs_new_device,
......
...@@ -5875,6 +5875,7 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = { ...@@ -5875,6 +5875,7 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "qeth", .name = "qeth",
}, },
.ccw_driver = &qeth_ccw_driver,
.setup = qeth_core_probe_device, .setup = qeth_core_probe_device,
.remove = qeth_core_remove_device, .remove = qeth_core_remove_device,
.set_online = qeth_core_set_online, .set_online = qeth_core_set_online,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment