On Mon, 18 Feb 2002, Greg KH wrote:

> Here's the 2.4 version of the patch.  Anyone have any problems with it?
> 
> How about the time delay patch on top of this patch Martin?

OK, I've updated it for 2.4.18-rc2, applies after the usb_port_status
thing. Debounce delay is now 400ms, which seems to be sufficient for
different problematic devices like some bluetooth dongles. And I've
removed the low-speed special delay (RHbug #23670) because we have now
an unconditional delay of 400ms at least which should make it obsolete.
But I have no device which would really need this for serious testing
- my Logitech mouse is happy either way.

I've done some additional testing with a device doing loops of connect- 
disconnect-cycles with 50ms interval forever - just to see what would
happen to khubd in an extremely noisy situation: as expected, khubd gets
livelocked in the debounce loop and no further disconnect or connect event
from other ports are reported to usbcore. Once the bad-behaving guy gets
unplugged the queued events are delivered and everything works as usual.

Johannes, Pete - if it's ok for you I'd like to suggest this could go into
early 2.4.19-pre series.
Greg, AFAICS the only change required for application to 2.5.5-pre1 is:

-static void usb_hub_port_connect_change(struct usb_device *hub, int port,
+static void usb_hub_port_connect_change(struct usb_hub *hubstate, int port,

in the 1st hunk's trailing context - so I assume it's ok not to duplicate?

Martin

----------------

--- v2.4.18-rc2-md/drivers/usb/hub.c.portsts    Tue Feb 19 15:38:21 2002
+++ v2.4.18-rc2-md/drivers/usb/hub.c    Tue Feb 19 17:30:46 2002
@@ -609,6 +609,49 @@
                        port + 1, hub->devnum, ret);
 }
 
+/* USB 2.0 spec, 7.1.7.3 / fig 7-29:
+ *
+ * Between connect detection and reset signaling there must be a delay
+ * of 100ms at least for debounce and power-settling. The corresponding
+ * timer shall restart whenever the downstream port detects a disconnect.
+ * 
+ * Apparently there are some bluetooth and irda-dongles and a number
+ * of low-speed devices which require longer delays of about 200-400ms.
+ * Not covered by the spec - but easy to deal with.
+ *
+ * This implementation uses 400ms minimum debounce timeout and checks
+ * every 10ms for transient disconnects to restart the delay.
+ */
+
+#define HUB_DEBOUNCE_TIMEOUT   400
+#define HUB_DEBOUNCE_STEP      10
+
+/* return: -1 on error, 0 on success, 1 on disconnect.  */
+static int usb_hub_port_debounce(struct usb_device *hub, int port)
+{
+       int ret;
+       unsigned delay_time;
+       u16 portchange, portstatus;
+
+       for (delay_time = 0; delay_time < HUB_DEBOUNCE_TIMEOUT; /* empty */ ) {
+
+               /* wait debounce step increment */
+               wait_ms(HUB_DEBOUNCE_STEP);
+
+               ret = usb_hub_port_status(hub, port, &portstatus, &portchange);
+               if (ret < 0)
+                       return -1;
+
+               if ((portchange & USB_PORT_STAT_C_CONNECTION)) {
+                       usb_clear_port_feature(hub, port+1, 
+USB_PORT_FEAT_C_CONNECTION);
+                       delay_time = 0;
+               }
+               else
+                       delay_time += HUB_DEBOUNCE_STEP;
+       }
+       return ((portstatus&USB_PORT_STAT_CONNECTION)) ? 0 : 1;
+}
+
 static void usb_hub_port_connect_change(struct usb_device *hub, int port,
                                        u16 portstatus, u16 portchange)
 {
@@ -635,11 +678,10 @@
                return;
        }
 
-       /* Some low speed devices have problems with the quick delay, so */
-       /*  be a bit pessimistic with those devices. RHbug #23670 */
-       if (portstatus & USB_PORT_STAT_LOW_SPEED) {
-               wait_ms(400);
-               delay = HUB_LONG_RESET_TIME;
+       if (usb_hub_port_debounce(hub, port)) {
+               err("connect-debounce failed, port %d disabled", port+1);
+               usb_hub_port_disable(hub, port);
+               return;
        }
 
        down(&usb_address0_sem);


_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to