Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ struct ccwgroup_device {
 * @thaw: undo work done in @freeze
 * @restore: callback for restoring after hibernation
 * @driver: embedded driver structure
 * @ccw_driver: supported ccw_driver (optional)
 */
struct ccwgroup_driver {
	int (*setup) (struct ccwgroup_device *);
@@ -55,6 +56,7 @@ struct ccwgroup_driver {
	int (*restore)(struct ccwgroup_device *);

	struct device_driver driver;
	struct ccw_driver *ccw_driver;
};

extern int  ccwgroup_driver_register   (struct ccwgroup_driver *cdriver);
+6 −0
Original line number Diff line number Diff line
@@ -373,6 +373,12 @@ int ccwgroup_create_dev(struct device *parent, struct ccwgroup_driver *gdrv,
		rc = -EINVAL;
		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));
	gdev->dev.groups = ccwgroup_attr_groups;
+1 −0
Original line number Diff line number Diff line
@@ -1761,6 +1761,7 @@ static struct ccwgroup_driver ctcm_group_driver = {
		.owner	= THIS_MODULE,
		.name	= CTC_DRIVER_NAME,
	},
	.ccw_driver  = &ctcm_ccw_driver,
	.setup	     = ctcm_probe_device,
	.remove      = ctcm_remove_device,
	.set_online  = ctcm_new_device,
+1 −0
Original line number Diff line number Diff line
@@ -2396,6 +2396,7 @@ static struct ccwgroup_driver lcs_group_driver = {
		.owner	= THIS_MODULE,
		.name	= "lcs",
	},
	.ccw_driver  = &lcs_ccw_driver,
	.setup	     = lcs_probe_device,
	.remove      = lcs_remove_device,
	.set_online  = lcs_new_device,
+1 −0
Original line number Diff line number Diff line
@@ -5875,6 +5875,7 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
		.owner = THIS_MODULE,
		.name = "qeth",
	},
	.ccw_driver = &qeth_ccw_driver,
	.setup = qeth_core_probe_device,
	.remove = qeth_core_remove_device,
	.set_online = qeth_core_set_online,