Alan,

I looked at uhci_scan_schedule today, and it seems to me that the code
which prevents re-entry is completely superfluous. I do not see a code
path which would loop back through usb_giveback_urb and end in
uhci_scan_schedule again. It is only called from ->stop, suspend,
and an interrupt. The access from other CPU is bracketed with uhci->lock.

What do you think about dropping this code?

I only noticed because Fujitsu submitted a patch for RHEL which backports
this stuff, and they fumbled with spinlocks. But on their platform it's
an instant death. Apparently, this mechanism is never excercised.
It must be a carryover from some old implementation.

-- Pete

diff -urp -X dontdiff linux-2.6.16-git13/drivers/usb/host/uhci-hcd.h 
linux-2.6.16-git13-uhci/drivers/usb/host/uhci-hcd.h
--- linux-2.6.16-git13/drivers/usb/host/uhci-hcd.h      2006-03-27 
07:48:23.000000000 -0800
+++ linux-2.6.16-git13-uhci/drivers/usb/host/uhci-hcd.h 2006-03-29 
19:00:52.000000000 -0800
@@ -406,8 +406,6 @@ struct uhci_hcd {
        unsigned int is_stopped;
 #define UHCI_IS_STOPPED                9999            /* Larger than a frame 
# */
 
-       unsigned int scan_in_progress:1;        /* Schedule scan is running */
-       unsigned int need_rescan:1;             /* Redo the schedule scan */
        unsigned int hc_inaccessible:1;         /* HC is suspended or dead */
        unsigned int working_RD:1;              /* Suspended root hub doesn't
                                                   need to be polled */
diff -urp -X dontdiff linux-2.6.16-git13/drivers/usb/host/uhci-q.c 
linux-2.6.16-git13-uhci/drivers/usb/host/uhci-q.c
--- linux-2.6.16-git13/drivers/usb/host/uhci-q.c        2006-03-27 
07:48:23.000000000 -0800
+++ linux-2.6.16-git13-uhci/drivers/usb/host/uhci-q.c   2006-03-29 
18:58:23.000000000 -0800
@@ -1355,15 +1355,6 @@ static void uhci_scan_schedule(struct uh
        int i;
        struct uhci_qh *qh;
 
-       /* Don't allow re-entrant calls */
-       if (uhci->scan_in_progress) {
-               uhci->need_rescan = 1;
-               return;
-       }
-       uhci->scan_in_progress = 1;
- rescan:
-       uhci->need_rescan = 0;
-
        uhci_clear_next_interrupt(uhci);
        uhci_get_current_frame_number(uhci);
 
@@ -1381,10 +1372,6 @@ static void uhci_scan_schedule(struct uh
                }
        }
 
-       if (uhci->need_rescan)
-               goto rescan;
-       uhci->scan_in_progress = 0;
-
        /* If the controller is stopped, we can finish these off right now */
        if (uhci->is_stopped)
                uhci_free_pending_tds(uhci);


-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to