ChangeSet 1.791, 2002/12/05 14:21:38-08:00, randy.dunlap@verizon.net [PATCH] tiglusb timeouts It addresses the timeout parameter in the tiglusb driver. 1. timeout could be 0, causing a divide-by-zero. The patch prevents this. 2. The timeout value to usb_bulk_msg() could be rounded down to cause a divide-by-zero if timeout was < 10, e.g. 9, in: result = usb_bulk_msg (s->dev, pipe, buffer, bytes_to_read, &bytes_read, HZ / (timeout / 10)); 9 / 10 == 0 => divide-by-zero !! 3. The timeout value above doesn't do very well on converting timeout to tenths of seconds. Even for the default timeout value of 15 (1.5 seconds), it becomes: HZ / (15 / 10) == HZ / 1 == HZ, or 1 second. The patch corrects this formula to use: (HZ * 10) / timeout diff -Nru a/drivers/usb/tiglusb.c b/drivers/usb/tiglusb.c --- a/drivers/usb/tiglusb.c Thu Dec 5 14:48:26 2002 +++ b/drivers/usb/tiglusb.c Thu Dec 5 14:48:26 2002 @@ -185,7 +185,7 @@ pipe = usb_rcvbulkpipe (s->dev, 1); result = usb_bulk_msg (s->dev, pipe, buffer, bytes_to_read, - &bytes_read, HZ / (timeout / 10)); + &bytes_read, HZ * 10 / timeout); if (result == -ETIMEDOUT) { /* NAK */ ret = result; if (!bytes_read) { @@ -242,7 +242,7 @@ pipe = usb_sndbulkpipe (s->dev, 2); result = usb_bulk_msg (s->dev, pipe, buffer, bytes_to_write, - &bytes_written, HZ / (timeout / 10)); + &bytes_written, HZ * 10 / timeout); if (result == -ETIMEDOUT) { /* NAK */ warn ("tiglusb_write, NAK received."); @@ -446,6 +446,8 @@ if (ints[0] > 0) { timeout = ints[1]; } + if (!timeout) + timeout = TIMAXTIME; return 1; } @@ -487,6 +489,9 @@ info (DRIVER_DESC ", " DRIVER_VERSION); + if (!timeout) + timeout = TIMAXTIME; + return 0; } @@ -509,6 +514,6 @@ MODULE_LICENSE (DRIVER_LICENSE); MODULE_PARM (timeout, "i"); -MODULE_PARM_DESC (timeout, "Timeout (default=1.5 seconds)"); +MODULE_PARM_DESC (timeout, "Timeout in tenths of seconds (default=1.5 seconds)"); /* --------------------------------------------------------------------- */