Unlike usb_unlink_urb, usb_kill_urb guarantees that completion handlers have
finished running before it returns. The bunch of disconnect code that waited
for completion handlers can now go away.
Signed-off-by: Duncan Sands <[EMAIL PROTECTED]>
--- local-tree.orig/drivers/usb/misc/speedtch.c 2004-09-01 11:28:24.000000000 +0200
+++ local-tree/drivers/usb/misc/speedtch.c 2004-09-21 17:10:25.316570368 +0200
@@ -1220,9 +1220,7 @@
static void udsl_usb_disconnect (struct usb_interface *intf)
{
struct udsl_instance_data *instance = usb_get_intfdata (intf);
- struct list_head *pos;
- unsigned int count;
- int result, i;
+ int i;
dbg ("udsl_usb_disconnect entered");
@@ -1237,27 +1235,7 @@
tasklet_disable (&instance->receive_tasklet);
for (i = 0; i < num_rcv_urbs; i++)
- if ((result = usb_unlink_urb (instance->receivers [i].urb)) < 0)
- dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d
returned %d!", i, result);
-
- /* wait for completion handlers to finish */
- do {
- count = 0;
- spin_lock_irq (&instance->receive_lock);
- list_for_each (pos, &instance->spare_receivers) {
- ++count;
- DEBUG_ON (count > num_rcv_urbs);
- }
- spin_unlock_irq (&instance->receive_lock);
-
- dbg ("udsl_usb_disconnect: found %u spare receivers", count);
-
- if (count == num_rcv_urbs)
- break;
-
- set_current_state (TASK_RUNNING);
- schedule ();
- } while (1);
+ usb_kill_urb (instance->receivers [i].urb);
/* no need to take the spinlock */
INIT_LIST_HEAD (&instance->filled_receive_buffers);
@@ -1275,27 +1253,7 @@
tasklet_disable (&instance->send_tasklet);
for (i = 0; i < num_snd_urbs; i++)
- if ((result = usb_unlink_urb (instance->senders [i].urb)) < 0)
- dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d
returned %d!", i, result);
-
- /* wait for completion handlers to finish */
- do {
- count = 0;
- spin_lock_irq (&instance->send_lock);
- list_for_each (pos, &instance->spare_senders) {
- ++count;
- DEBUG_ON (count > num_snd_urbs);
- }
- spin_unlock_irq (&instance->send_lock);
-
- dbg ("udsl_usb_disconnect: found %u spare senders", count);
-
- if (count == num_snd_urbs)
- break;
-
- set_current_state (TASK_RUNNING);
- schedule ();
- } while (1);
+ usb_kill_urb (instance->senders [i].urb);
/* no need to take the spinlock */
INIT_LIST_HEAD (&instance->spare_senders);
-------------------------------------------------------
This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170
Project Admins to receive an Apple iPod Mini FREE for your judgement on
who ports your project to Linux PPC the best. Sponsored by IBM.
Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel