Patchwork [Lucid,1/3] SRU: Staging: comedi: fix usbdux timeout bug

login
register
mail settings
Submitter Leann Ogasawara
Date April 16, 2010, 5:25 p.m.
Message ID <1271438702.30561.122.camel@emiko>
Download mbox | patch
Permalink /patch/50346/
State Accepted
Delegated to: Andy Whitcroft
Headers show

Comments

Leann Ogasawara - April 16, 2010, 5:25 p.m.
>From 840aaea048c018cae6211588292d228d186fa2ab Mon Sep 17 00:00:00 2001
From: Bernd Porr <BerndPorr@f2s.com>
Date: Mon, 16 Nov 2009 01:12:02 +0000
Subject: [PATCH 1/3] Staging: comedi: fix usbdux timeout bug

BugLink: http://bugs.launchpad.net/bugs/483343

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>

(cherry picked from commit ea25371a78c33e276527361d3ab19393d558b2fd upstream)

Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
---
 drivers/staging/comedi/drivers/usbdux.c |   17 +++++++++--------
 1 files changed, 9 insertions(+), 8 deletions(-)
Andy Whitcroft - April 16, 2010, 6:11 p.m.
On Fri, Apr 16, 2010 at 10:25:02AM -0700, Leann Ogasawara wrote:
> >From 840aaea048c018cae6211588292d228d186fa2ab Mon Sep 17 00:00:00 2001
> From: Bernd Porr <BerndPorr@f2s.com>
> Date: Mon, 16 Nov 2009 01:12:02 +0000
> Subject: [PATCH 1/3] Staging: comedi: fix usbdux timeout bug
> 
> BugLink: http://bugs.launchpad.net/bugs/483343
> 
> 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>
> 
> (cherry picked from commit ea25371a78c33e276527361d3ab19393d558b2fd upstream)
> 
> Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
> ---
>  drivers/staging/comedi/drivers/usbdux.c |   17 +++++++++--------
>  1 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c
> index cca4e86..a4a65b0 100644
> --- a/drivers/staging/comedi/drivers/usbdux.c
> +++ b/drivers/staging/comedi/drivers/usbdux.c
> @@ -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"
> -- 

Looks possible.

Acked-by: Andy Whitcroft <apw@canonical.com>

-apw
Colin King - April 16, 2010, 8:52 p.m.
On Fri, 2010-04-16 at 10:25 -0700, Leann Ogasawara wrote:
> >From 840aaea048c018cae6211588292d228d186fa2ab Mon Sep 17 00:00:00 2001
> From: Bernd Porr <BerndPorr@f2s.com>
> Date: Mon, 16 Nov 2009 01:12:02 +0000
> Subject: [PATCH 1/3] Staging: comedi: fix usbdux timeout bug
> 
> BugLink: http://bugs.launchpad.net/bugs/483343
> 
> 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>
> 
> (cherry picked from commit ea25371a78c33e276527361d3ab19393d558b2fd upstream)
> 
> Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
> ---
>  drivers/staging/comedi/drivers/usbdux.c |   17 +++++++++--------
>  1 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c
> index cca4e86..a4a65b0 100644
> --- a/drivers/staging/comedi/drivers/usbdux.c
> +++ b/drivers/staging/comedi/drivers/usbdux.c
> @@ -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"
> -- 
> 1.7.0
> 

Basically increases timeouts - looks sane.

Acked-by: Colin King <colin.king@canonical.com>

Patch

diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c
index cca4e86..a4a65b0 100644
--- a/drivers/staging/comedi/drivers/usbdux.c
+++ b/drivers/staging/comedi/drivers/usbdux.c
@@ -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"