USB: usb-storage: merge CB and CBI transport routines

This patch (as1173) merges usb-storage's CB and CBI transports into a
single routine.  So much of their code is common, it's silly to keep
them separate.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Alan Stern 2008-11-20 14:20:03 -05:00 committed by Greg Kroah-Hartman
parent 12aae68a20
commit 64648a9dc4
3 changed files with 10 additions and 55 deletions

View file

@ -756,10 +756,10 @@ void usb_stor_stop_transport(struct us_data *us)
} }
/* /*
* Control/Bulk/Interrupt transport * Control/Bulk and Control/Bulk/Interrupt transport
*/ */
int usb_stor_CBI_transport(struct scsi_cmnd *srb, struct us_data *us) int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
{ {
unsigned int transfer_length = scsi_bufflen(srb); unsigned int transfer_length = scsi_bufflen(srb);
unsigned int pipe = 0; unsigned int pipe = 0;
@ -801,6 +801,13 @@ int usb_stor_CBI_transport(struct scsi_cmnd *srb, struct us_data *us)
} }
/* STATUS STAGE */ /* STATUS STAGE */
/* NOTE: CB does not have a status stage. Silly, I know. So
* we have to catch this at a higher level.
*/
if (us->protocol != US_PR_CBI)
return USB_STOR_TRANSPORT_GOOD;
result = usb_stor_intr_transfer(us, us->iobuf, 2); result = usb_stor_intr_transfer(us, us->iobuf, 2);
US_DEBUGP("Got interrupt data (0x%x, 0x%x)\n", US_DEBUGP("Got interrupt data (0x%x, 0x%x)\n",
us->iobuf[0], us->iobuf[1]); us->iobuf[0], us->iobuf[1]);
@ -854,56 +861,6 @@ int usb_stor_CBI_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_FAILED; return USB_STOR_TRANSPORT_FAILED;
} }
/*
* Control/Bulk transport
*/
int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
{
unsigned int transfer_length = scsi_bufflen(srb);
int result;
/* COMMAND STAGE */
/* let's send the command via the control pipe */
result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
US_CBI_ADSC,
USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0,
us->ifnum, srb->cmnd, srb->cmd_len);
/* 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) {
return USB_STOR_TRANSPORT_ERROR;
}
/* DATA STAGE */
/* transfer the data payload for this command, if one exists*/
if (transfer_length) {
unsigned int pipe = srb->sc_data_direction == DMA_FROM_DEVICE ?
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_srb(us, pipe, srb);
US_DEBUGP("CB data stage result is 0x%x\n", result);
/* if we stalled the data transfer it means command failed */
if (result == USB_STOR_XFER_STALLED)
return USB_STOR_TRANSPORT_FAILED;
if (result > USB_STOR_XFER_STALLED)
return USB_STOR_TRANSPORT_ERROR;
}
/* STATUS STAGE */
/* NOTE: CB does not have a status stage. Silly, I know. So
* we have to catch this at a higher level.
*/
return USB_STOR_TRANSPORT_GOOD;
}
/* /*
* Bulk only transport * Bulk only transport
*/ */

View file

@ -113,8 +113,6 @@ struct bulk_cs_wrap {
#define US_CBI_ADSC 0 #define US_CBI_ADSC 0
extern int usb_stor_CBI_transport(struct scsi_cmnd *, struct us_data*);
extern int usb_stor_CB_transport(struct scsi_cmnd *, struct us_data*); extern int usb_stor_CB_transport(struct scsi_cmnd *, struct us_data*);
extern int usb_stor_CB_reset(struct us_data*); extern int usb_stor_CB_reset(struct us_data*);

View file

@ -591,7 +591,7 @@ static int get_transport(struct us_data *us)
case US_PR_CBI: case US_PR_CBI:
us->transport_name = "Control/Bulk/Interrupt"; us->transport_name = "Control/Bulk/Interrupt";
us->transport = usb_stor_CBI_transport; us->transport = usb_stor_CB_transport;
us->transport_reset = usb_stor_CB_reset; us->transport_reset = usb_stor_CB_reset;
us->max_lun = 7; us->max_lun = 7;
break; break;