[S390] cio: Introduce ccw_bus_type.shutdown.
Introduce a shutdown method for the ccw bus that calls the driver specific shutdown method in struct ccw_driver. Switch zfcp to the new ccw_driver shutdown method. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
committed by
Martin Schwidefsky
parent
a55360df40
commit
958974fb59
@@ -1433,12 +1433,22 @@ ccw_device_remove (struct device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ccw_device_shutdown(struct device *dev)
|
||||||
|
{
|
||||||
|
struct ccw_device *cdev;
|
||||||
|
|
||||||
|
cdev = to_ccwdev(dev);
|
||||||
|
if (cdev->drv && cdev->drv->shutdown)
|
||||||
|
cdev->drv->shutdown(cdev);
|
||||||
|
}
|
||||||
|
|
||||||
struct bus_type ccw_bus_type = {
|
struct bus_type ccw_bus_type = {
|
||||||
.name = "ccw",
|
.name = "ccw",
|
||||||
.match = ccw_bus_match,
|
.match = ccw_bus_match,
|
||||||
.uevent = ccw_uevent,
|
.uevent = ccw_uevent,
|
||||||
.probe = ccw_device_probe,
|
.probe = ccw_device_probe,
|
||||||
.remove = ccw_device_remove,
|
.remove = ccw_device_remove,
|
||||||
|
.shutdown = ccw_device_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -28,7 +28,7 @@ static void zfcp_ccw_remove(struct ccw_device *);
|
|||||||
static int zfcp_ccw_set_online(struct ccw_device *);
|
static int zfcp_ccw_set_online(struct ccw_device *);
|
||||||
static int zfcp_ccw_set_offline(struct ccw_device *);
|
static int zfcp_ccw_set_offline(struct ccw_device *);
|
||||||
static int zfcp_ccw_notify(struct ccw_device *, int);
|
static int zfcp_ccw_notify(struct ccw_device *, int);
|
||||||
static void zfcp_ccw_shutdown(struct device *);
|
static void zfcp_ccw_shutdown(struct ccw_device *);
|
||||||
|
|
||||||
static struct ccw_device_id zfcp_ccw_device_id[] = {
|
static struct ccw_device_id zfcp_ccw_device_id[] = {
|
||||||
{CCW_DEVICE_DEVTYPE(ZFCP_CONTROL_UNIT_TYPE,
|
{CCW_DEVICE_DEVTYPE(ZFCP_CONTROL_UNIT_TYPE,
|
||||||
@@ -51,9 +51,7 @@ static struct ccw_driver zfcp_ccw_driver = {
|
|||||||
.set_online = zfcp_ccw_set_online,
|
.set_online = zfcp_ccw_set_online,
|
||||||
.set_offline = zfcp_ccw_set_offline,
|
.set_offline = zfcp_ccw_set_offline,
|
||||||
.notify = zfcp_ccw_notify,
|
.notify = zfcp_ccw_notify,
|
||||||
.driver = {
|
|
||||||
.shutdown = zfcp_ccw_shutdown,
|
.shutdown = zfcp_ccw_shutdown,
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(ccw, zfcp_ccw_device_id);
|
MODULE_DEVICE_TABLE(ccw, zfcp_ccw_device_id);
|
||||||
@@ -277,12 +275,12 @@ zfcp_ccw_register(void)
|
|||||||
* Makes sure that QDIO queues are down when the system gets stopped.
|
* Makes sure that QDIO queues are down when the system gets stopped.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
zfcp_ccw_shutdown(struct device *dev)
|
zfcp_ccw_shutdown(struct ccw_device *cdev)
|
||||||
{
|
{
|
||||||
struct zfcp_adapter *adapter;
|
struct zfcp_adapter *adapter;
|
||||||
|
|
||||||
down(&zfcp_data.config_sema);
|
down(&zfcp_data.config_sema);
|
||||||
adapter = dev_get_drvdata(dev);
|
adapter = dev_get_drvdata(&cdev->dev);
|
||||||
zfcp_erp_adapter_shutdown(adapter, 0);
|
zfcp_erp_adapter_shutdown(adapter, 0);
|
||||||
zfcp_erp_wait(adapter);
|
zfcp_erp_wait(adapter);
|
||||||
up(&zfcp_data.config_sema);
|
up(&zfcp_data.config_sema);
|
||||||
|
@@ -102,6 +102,7 @@ struct ccw_device {
|
|||||||
* @set_online: called when setting device online
|
* @set_online: called when setting device online
|
||||||
* @set_offline: called when setting device offline
|
* @set_offline: called when setting device offline
|
||||||
* @notify: notify driver of device state changes
|
* @notify: notify driver of device state changes
|
||||||
|
* @shutdown: called at device shutdown
|
||||||
* @driver: embedded device driver structure
|
* @driver: embedded device driver structure
|
||||||
* @name: device driver name
|
* @name: device driver name
|
||||||
*/
|
*/
|
||||||
@@ -113,6 +114,7 @@ struct ccw_driver {
|
|||||||
int (*set_online) (struct ccw_device *);
|
int (*set_online) (struct ccw_device *);
|
||||||
int (*set_offline) (struct ccw_device *);
|
int (*set_offline) (struct ccw_device *);
|
||||||
int (*notify) (struct ccw_device *, int);
|
int (*notify) (struct ccw_device *, int);
|
||||||
|
void (*shutdown) (struct ccw_device *);
|
||||||
struct device_driver driver;
|
struct device_driver driver;
|
||||||
char *name;
|
char *name;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user