|
@@ -681,35 +681,22 @@ get_orphaned_ccwdev_by_dev_id(struct channel_subsystem *css,
|
|
|
return dev ? to_ccwdev(dev) : NULL;
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-ccw_device_add_changed(struct work_struct *work)
|
|
|
-{
|
|
|
- struct ccw_device_private *priv;
|
|
|
- struct ccw_device *cdev;
|
|
|
-
|
|
|
- priv = container_of(work, struct ccw_device_private, kick_work);
|
|
|
- cdev = priv->cdev;
|
|
|
- if (device_add(&cdev->dev)) {
|
|
|
- put_device(&cdev->dev);
|
|
|
- return;
|
|
|
- }
|
|
|
- set_bit(1, &cdev->private->registered);
|
|
|
-}
|
|
|
-
|
|
|
-void ccw_device_do_unreg_rereg(struct work_struct *work)
|
|
|
+void ccw_device_do_unbind_bind(struct work_struct *work)
|
|
|
{
|
|
|
struct ccw_device_private *priv;
|
|
|
struct ccw_device *cdev;
|
|
|
struct subchannel *sch;
|
|
|
+ int ret;
|
|
|
|
|
|
priv = container_of(work, struct ccw_device_private, kick_work);
|
|
|
cdev = priv->cdev;
|
|
|
sch = to_subchannel(cdev->dev.parent);
|
|
|
|
|
|
- ccw_device_unregister(cdev);
|
|
|
- PREPARE_WORK(&cdev->private->kick_work,
|
|
|
- ccw_device_add_changed);
|
|
|
- queue_work(ccw_device_work, &cdev->private->kick_work);
|
|
|
+ if (test_bit(1, &cdev->private->registered)) {
|
|
|
+ device_release_driver(&cdev->dev);
|
|
|
+ ret = device_attach(&cdev->dev);
|
|
|
+ WARN_ON(ret == -ENODEV);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void
|