From aa397ac43f2def2f2d96b199d4e18e3bc4bb38e1 Mon Sep 17 00:00:00 2001 From: Matthew Dharm <mdharm-usb@one-eyed-alien.net> Date: Sun, 6 Apr 2003 20:17:40 -0700 Subject: [PATCH] [PATCH] usb-storage: fix CB/CBI When we fixed the error handling, we accidentally made a mistake. A STALL on a control endpoint isn't necessarily a fatal thing -- it can be used to indicate a command failure. This fixes bugzilla bug #510. - A control endpoint stall when sending the command to a CB/CBI device is legal. Our error handling was just a little too agressive. --- drivers/usb/storage/transport.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 0c59028691d0..f2141e202f01 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -297,10 +297,11 @@ static int interpret_urb_result(struct us_data *us, unsigned int pipe, /* stalled */ case -EPIPE: - /* for control endpoints, a stall indicates a protocol error */ + /* for control endpoints, (used by CB[I]) a stall indicates + * a failed command */ if (usb_pipecontrol(pipe)) { US_DEBUGP("-- stall on control pipe\n"); - return USB_STOR_XFER_ERROR; + return USB_STOR_XFER_STALLED; } /* for other sorts of endpoint, clear the stall */ @@ -750,8 +751,14 @@ int usb_stor_CBI_transport(Scsi_Cmnd *srb, struct us_data *us) /* check the return code for the command */ US_DEBUGP("Call to usb_stor_ctrl_transfer() returned %d\n", result); + + /* if we stalled the command, it means command failed */ + if (result == USB_STOR_XFER_STALLED) { + return USB_STOR_TRANSPORT_FAILED; + } + + /* Uh oh... serious problem here */ if (result != USB_STOR_XFER_GOOD) { - /* Uh oh... serious problem here */ return USB_STOR_TRANSPORT_ERROR; } @@ -834,8 +841,14 @@ int usb_stor_CB_transport(Scsi_Cmnd *srb, struct us_data *us) /* check the return code for the command */ US_DEBUGP("Call to usb_stor_ctrl_transfer() returned %d\n", result); + + /* if we stalled the command, it means command failed */ + if (result == USB_STOR_XFER_STALLED) { + return USB_STOR_TRANSPORT_FAILED; + } + + /* Uh oh... serious problem here */ if (result != USB_STOR_XFER_GOOD) { - /* Uh oh... serious problem here */ return USB_STOR_TRANSPORT_ERROR; } -- 2.30.9