ChangeSet 1.866, 2002/12/10 14:18:40-08:00, [EMAIL PROTECTED]
[PATCH] Patch for debounce in 2.5
I was getting annoyed that nobody fixed the obviously broken
debounce loop, so I had to go ahead and fix that.
diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c Fri Dec 13 17:19:23 2002
+++ b/drivers/usb/core/hub.c Fri Dec 13 17:19:23 2002
@@ -768,35 +768,49 @@
* Not covered by the spec - but easy to deal with.
*
* This implementation uses 400ms minimum debounce timeout and checks
- * every 100ms for transient disconnects to restart the delay.
+ * every 25ms for transient disconnects to restart the delay.
*/
#define HUB_DEBOUNCE_TIMEOUT 400
-#define HUB_DEBOUNCE_STEP 100
+#define HUB_DEBOUNCE_STEP 25
+#define HUB_DEBOUNCE_STABLE 4
/* 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;
+ int delay_time, stable_count;
u16 portchange, portstatus;
+ unsigned connection;
- for (delay_time = 0; delay_time < HUB_DEBOUNCE_TIMEOUT; /* empty */ ) {
-
- /* wait debounce step increment */
+ connection = 0;
+ stable_count = 0;
+ for (delay_time = 0; delay_time < HUB_DEBOUNCE_TIMEOUT; delay_time +=
+HUB_DEBOUNCE_STEP) {
wait_ms(HUB_DEBOUNCE_STEP);
ret = usb_hub_port_status(hub, port, &portstatus, &portchange);
if (ret < 0)
return -1;
+ if ((portstatus & USB_PORT_STAT_CONNECTION) == connection) {
+ if (connection) {
+ if (++stable_count == HUB_DEBOUNCE_STABLE)
+ break;
+ }
+ } else {
+ stable_count = 0;
+ }
+ connection = portstatus & USB_PORT_STAT_CONNECTION;
+
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;
}
+
+ /* XXX Replace this with dbg() when 2.6 is about to ship. */
+ info("debounce: hub %d port %d: delay %dms stable %d status 0x%x\n",
+ hub->devnum, port, delay_time, stable_count, portstatus);
+
return ((portstatus&USB_PORT_STAT_CONNECTION)) ? 0 : 1;
}
-------------------------------------------------------
This sf.net email is sponsored by:
With Great Power, Comes Great Responsibility
Learn to use your power at OSDN's High Performance Computing Channel
http://hpc.devchannel.org/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel