Staging: comedi: fix usbdux timeout bug
authorBernd Porr <BerndPorr@f2s.com>
Mon, 16 Nov 2009 01:12:02 +0000 (01:12 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 20:23:03 +0000 (12:23 -0800)
I've fixed a bug in the USBDUX driver which caused timeouts while
sending commands to the boards. This was mainly because of one bulk
transfer which had a timeout of 1ms (!). I've now set all timeouts to
1000ms.

From: Bernd Porr <BerndPorr@f2s.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/comedi/drivers/usbdux.c

index cec028e..f2dab1a 100644 (file)
@@ -1,4 +1,4 @@
-#define DRIVER_VERSION "v2.2"
+#define DRIVER_VERSION "v2.3"
 #define DRIVER_AUTHOR "Bernd Porr, BerndPorr@f2s.com"
 #define DRIVER_DESC "Stirling/ITL USB-DUX -- Bernd.Porr@f2s.com"
 /*
@@ -80,6 +80,7 @@ sampling rate. If you sample two channels you get 4kHz and so on.
  * 2.0:  PWM seems to be stable and is not interfering with the other functions
  * 2.1:  changed PWM API
  * 2.2:  added firmware kernel request to fix an udev problem
+ * 2.3:  corrected a bug in bulk timeouts which were far too short
  *
  */
 
@@ -101,8 +102,8 @@ sampling rate. If you sample two channels you get 4kHz and so on.
 
 #define BOARDNAME "usbdux"
 
-/* timeout for the USB-transfer */
-#define EZTIMEOUT 30
+/* timeout for the USB-transfer in ms*/
+#define BULK_TIMEOUT 1000
 
 /* constants for "firmware" upload and download */
 #define USBDUXSUB_FIRMWARE 0xA0
@@ -750,7 +751,7 @@ static int usbduxsub_start(struct usbduxsub *usbduxsub)
                                  /* Length */
                                  1,
                                  /* Timeout */
-                                 EZTIMEOUT);
+                                 BULK_TIMEOUT);
        if (errcode < 0) {
                dev_err(&usbduxsub->interface->dev,
                        "comedi_: control msg failed (start)\n");
@@ -780,7 +781,7 @@ static int usbduxsub_stop(struct usbduxsub *usbduxsub)
                                  /* Length */
                                  1,
                                  /* Timeout */
-                                 EZTIMEOUT);
+                                 BULK_TIMEOUT);
        if (errcode < 0) {
                dev_err(&usbduxsub->interface->dev,
                        "comedi_: control msg failed (stop)\n");
@@ -810,7 +811,7 @@ static int usbduxsub_upload(struct usbduxsub *usbduxsub,
                                  /* length */
                                  len,
                                  /* timeout */
-                                 EZTIMEOUT);
+                                 BULK_TIMEOUT);
        dev_dbg(&usbduxsub->interface->dev, "comedi_: result=%d\n", errcode);
        if (errcode < 0) {
                dev_err(&usbduxsub->interface->dev, "comedi_: upload failed\n");
@@ -1110,7 +1111,7 @@ static int send_dux_commands(struct usbduxsub *this_usbduxsub, int cmd_type)
                              usb_sndbulkpipe(this_usbduxsub->usbdev,
                                              COMMAND_OUT_EP),
                              this_usbduxsub->dux_commands, SIZEOFDUXBUFFER,
-                             &nsent, 10);
+                             &nsent, BULK_TIMEOUT);
        if (result < 0)
                dev_err(&this_usbduxsub->interface->dev, "comedi%d: "
                        "could not transmit dux_command to the usb-device, "
@@ -1130,7 +1131,7 @@ static int receive_dux_commands(struct usbduxsub *this_usbduxsub, int command)
                                      usb_rcvbulkpipe(this_usbduxsub->usbdev,
                                                      COMMAND_IN_EP),
                                      this_usbduxsub->insnBuffer, SIZEINSNBUF,
-                                     &nrec, 1);
+                                     &nrec, BULK_TIMEOUT);
                if (result < 0) {
                        dev_err(&this_usbduxsub->interface->dev, "comedi%d: "
                                "insn: USB error %d while receiving DUX command"