ChangeSet 1.2181.4.21, 2005/03/17 17:57:47-08:00, [EMAIL PROTECTED]

        [PATCH] USB: Prevent hub driver interference during port reset
        
        This patch causes the hub driver to ignore ports that are being reset by
        another driver.  Without this protection khubd will sometimes notice 
that
        the port is behaving funny while the reset is taking place and will
        unilaterally disconnect it, which is not what we want.
        
        Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
        Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>



 hub.c |    4 ++++
 hub.h |    1 +
 2 files changed, 5 insertions(+)


diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c    2005-03-30 15:08:35 -08:00
+++ b/drivers/usb/core/hub.c    2005-03-30 15:08:35 -08:00
@@ -2644,6 +2644,8 @@
 
                /* deal with port status changes */
                for (i = 1; i <= hub->descriptor->bNbrPorts; i++) {
+                       if (test_bit(i, hub->busy_bits))
+                               continue;
                        connect_change = test_bit(i, hub->change_bits);
                        if (!test_and_clear_bit(i, hub->event_bits) &&
                                        !connect_change && !hub->activating)
@@ -2949,6 +2951,7 @@
                hub_pre_reset(hub);
        }
 
+       set_bit(port1, parent_hub->busy_bits);
        for (i = 0; i < SET_CONFIG_TRIES; ++i) {
 
                /* ep0 maxpacket size may change; let the HCD know about it.
@@ -2958,6 +2961,7 @@
                if (ret >= 0)
                        break;
        }
+       clear_bit(port1, parent_hub->busy_bits);
        if (ret < 0)
                goto re_enumerate;
  
diff -Nru a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
--- a/drivers/usb/core/hub.h    2005-03-30 15:08:35 -08:00
+++ b/drivers/usb/core/hub.h    2005-03-30 15:08:35 -08:00
@@ -205,6 +205,7 @@
        unsigned long           event_bits[1];  /* status change bitmask */
        unsigned long           change_bits[1]; /* ports with logical connect
                                                        status change */
+       unsigned long           busy_bits[1];   /* ports being reset */
 #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
 #error event_bits[] is too short!
 #endif
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to