|
@@ -34,8 +34,6 @@ struct lvs_rh {
|
|
|
struct usb_hub_descriptor descriptor;
|
|
|
/* urb for polling interrupt pipe */
|
|
|
struct urb *urb;
|
|
|
- /* LVS RH work queue */
|
|
|
- struct workqueue_struct *rh_queue;
|
|
|
/* LVH RH work */
|
|
|
struct work_struct rh_work;
|
|
|
/* RH port status */
|
|
@@ -355,7 +353,7 @@ static void lvs_rh_irq(struct urb *urb)
|
|
|
{
|
|
|
struct lvs_rh *lvs = urb->context;
|
|
|
|
|
|
- queue_work(lvs->rh_queue, &lvs->rh_work);
|
|
|
+ schedule_work(&lvs->rh_work);
|
|
|
}
|
|
|
|
|
|
static int lvs_rh_probe(struct usb_interface *intf,
|
|
@@ -402,19 +400,12 @@ static int lvs_rh_probe(struct usb_interface *intf,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- lvs->rh_queue = create_singlethread_workqueue("lvs_rh_queue");
|
|
|
- if (!lvs->rh_queue) {
|
|
|
- dev_err(&intf->dev, "couldn't create workqueue\n");
|
|
|
- ret = -ENOMEM;
|
|
|
- goto free_urb;
|
|
|
- }
|
|
|
-
|
|
|
INIT_WORK(&lvs->rh_work, lvs_rh_work);
|
|
|
|
|
|
ret = sysfs_create_group(&intf->dev.kobj, &lvs_attr_group);
|
|
|
if (ret < 0) {
|
|
|
dev_err(&intf->dev, "Failed to create sysfs node %d\n", ret);
|
|
|
- goto destroy_queue;
|
|
|
+ goto free_urb;
|
|
|
}
|
|
|
|
|
|
pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress);
|
|
@@ -432,8 +423,6 @@ static int lvs_rh_probe(struct usb_interface *intf,
|
|
|
|
|
|
sysfs_remove:
|
|
|
sysfs_remove_group(&intf->dev.kobj, &lvs_attr_group);
|
|
|
-destroy_queue:
|
|
|
- destroy_workqueue(lvs->rh_queue);
|
|
|
free_urb:
|
|
|
usb_free_urb(lvs->urb);
|
|
|
return ret;
|
|
@@ -444,7 +433,7 @@ static void lvs_rh_disconnect(struct usb_interface *intf)
|
|
|
struct lvs_rh *lvs = usb_get_intfdata(intf);
|
|
|
|
|
|
sysfs_remove_group(&intf->dev.kobj, &lvs_attr_group);
|
|
|
- destroy_workqueue(lvs->rh_queue);
|
|
|
+ flush_work(&lvs->rh_work);
|
|
|
usb_free_urb(lvs->urb);
|
|
|
}
|
|
|
|