ChangeSet 1.738.5.24, 2002/10/13 13:48:00-07:00, mdharm-usb@one-eyed-alien.net [PATCH] usb-storage: cache pipe values This patch to usb-storage makes all pipe values used by the driver an unsigned int (like they should be), and caches them in the device data structure. diff -Nru a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c --- a/drivers/usb/storage/freecom.c Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/freecom.c Sun Oct 13 17:08:47 2002 @@ -173,7 +173,7 @@ static int freecom_readdata (Scsi_Cmnd *srb, struct us_data *us, - int ipipe, int opipe, int count) + unsigned int ipipe, unsigned int opipe, int count) { freecom_udata_t extra = (freecom_udata_t) us->extra; struct freecom_xfer_wrap *fxfr = @@ -214,7 +214,7 @@ static int freecom_writedata (Scsi_Cmnd *srb, struct us_data *us, - int ipipe, int opipe, int count) + int unsigned ipipe, unsigned int opipe, int count) { freecom_udata_t extra = (freecom_udata_t) us->extra; struct freecom_xfer_wrap *fxfr = @@ -262,7 +262,7 @@ { struct freecom_cb_wrap *fcb; struct freecom_status *fst; - int ipipe, opipe; /* We need both pipes. */ + unsigned int ipipe, opipe; /* We need both pipes. */ int result; int partial; int length; @@ -276,8 +276,8 @@ US_DEBUGP("Freecom TRANSPORT STARTED\n"); /* Get handles for both transports. */ - opipe = usb_sndbulkpipe (us->pusb_dev, us->ep_out); - ipipe = usb_rcvbulkpipe (us->pusb_dev, us->ep_in); + opipe = us->send_bulk_pipe; + ipipe = us->recv_bulk_pipe; /* The ATAPI Command always goes out first. */ fcb->Type = FCM_PACKET_ATAPI | 0x00; @@ -515,8 +515,7 @@ } } - result = usb_control_msg(us->pusb_dev, - usb_rcvctrlpipe(us->pusb_dev, 0), + result = usb_control_msg(us->pusb_dev, us->recv_ctrl_pipe, 0x4c, 0xc0, 0x4346, 0x0, buffer, 0x20, 3*HZ); buffer[32] = '\0'; US_DEBUGP("String returned from FC init is: %s\n", buffer); @@ -528,8 +527,7 @@ */ /* send reset */ - result = usb_control_msg(us->pusb_dev, - usb_sndctrlpipe(us->pusb_dev, 0), + result = usb_control_msg(us->pusb_dev, us->send_ctrl_pipe, 0x4d, 0x40, 0x24d8, 0x0, NULL, 0x0, 3*HZ); US_DEBUGP("result from activate reset is %d\n", result); @@ -537,8 +535,7 @@ mdelay(250); /* clear reset */ - result = usb_control_msg(us->pusb_dev, - usb_sndctrlpipe(us->pusb_dev, 0), + result = usb_control_msg(us->pusb_dev, us->send_ctrl_pipe, 0x4d, 0x40, 0x24f8, 0x0, NULL, 0x0, 3*HZ); US_DEBUGP("result from clear reset is %d\n", result); diff -Nru a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c --- a/drivers/usb/storage/initializers.c Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/initializers.c Sun Oct 13 17:08:47 2002 @@ -50,7 +50,7 @@ int result; US_DEBUGP("Attempting to init eUSCSI bridge...\n"); - result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0), + result = usb_control_msg(us->pusb_dev, us->send_ctrl_pipe, 0x0C, USB_RECIP_INTERFACE | USB_TYPE_VENDOR, 0x01, 0x0, &data, 0x1, 5*HZ); US_DEBUGP("-- result is %d\n", result); diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c --- a/drivers/usb/storage/isd200.c Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/isd200.c Sun Oct 13 17:08:47 2002 @@ -408,13 +408,13 @@ { int result; int partial; - int pipe; + unsigned int pipe; /* calculate the appropriate pipe information */ if (dataDirection == SCSI_DATA_READ) - pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); + pipe = us->recv_bulk_pipe; else - pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); + pipe = us->send_bulk_pipe; /* transfer the data */ US_DEBUGP("isd200_transfer_partial(): xfer %d bytes\n", length); @@ -546,7 +546,6 @@ struct bulk_cb_wrap bcb; struct bulk_cs_wrap bcs; int result; - int pipe; int partial; unsigned int transfer_amount; @@ -566,9 +565,6 @@ bcb.Length = AtaCdbLength; - /* construct the pipe handle */ - pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); - /* copy the command payload */ memset(bcb.CDB, 0, sizeof(bcb.CDB)); memcpy(bcb.CDB, AtaCdb, bcb.Length); @@ -578,8 +574,8 @@ le32_to_cpu(bcb.Signature), bcb.Tag, (bcb.Lun >> 4), (bcb.Lun & 0xFF), le32_to_cpu(bcb.DataTransferLength), bcb.Flags, bcb.Length); - result = usb_stor_bulk_msg(us, &bcb, pipe, US_BULK_CB_WRAP_LEN, - &partial); + result = usb_stor_bulk_msg(us, &bcb, us->send_bulk_pipe, + US_BULK_CB_WRAP_LEN, &partial); US_DEBUGP("Bulk command transfer result=%d\n", result); /* did we abort this command? */ @@ -589,8 +585,9 @@ else if (result == -EPIPE) { /* if we stall, we need to clear it before we go on */ - US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); - if (usb_stor_clear_halt(us, pipe) < 0) + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", + us->send_bulk_pipe); + if (usb_stor_clear_halt(us, us->send_bulk_pipe) < 0) return ISD200_TRANSPORT_ERROR; } else if (result) return ISD200_TRANSPORT_ERROR; @@ -608,13 +605,10 @@ * an explanation of how this code works. */ - /* construct the pipe handle */ - pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); - /* get CSW for device status */ US_DEBUGP("Attempting to get CSW...\n"); - result = usb_stor_bulk_msg(us, &bcs, pipe, US_BULK_CS_WRAP_LEN, - &partial); + result = usb_stor_bulk_msg(us, &bcs, us->recv_bulk_pipe, + US_BULK_CS_WRAP_LEN, &partial); /* did we abort this command? */ if (atomic_read(&us->sm_state) == US_STATE_ABORTING) { return ISD200_TRANSPORT_ABORTED; @@ -622,13 +616,14 @@ /* did the attempt to read the CSW fail? */ if (result == -EPIPE) { - US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); - if (usb_stor_clear_halt(us, pipe) < 0) + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", + us->recv_bulk_pipe); + if (usb_stor_clear_halt(us, us->recv_bulk_pipe) < 0) return ISD200_TRANSPORT_ERROR; /* get the status again */ US_DEBUGP("Attempting to get CSW (2nd try)...\n"); - result = usb_stor_bulk_msg(us, &bcs, pipe, + result = usb_stor_bulk_msg(us, &bcs, us->recv_bulk_pipe, US_BULK_CS_WRAP_LEN, &partial); /* if the command was aborted, indicate that */ @@ -638,8 +633,9 @@ /* if it fails again, we need a reset and return an error*/ if (result == -EPIPE) { - US_DEBUGP("clearing halt for pipe 0x%x\n", pipe); - usb_stor_clear_halt(us, pipe); + US_DEBUGP("clearing halt for pipe 0x%x\n", + us->recv_bulk_pipe); + usb_stor_clear_halt(us, us->recv_bulk_pipe); return ISD200_TRANSPORT_ERROR; } } @@ -937,7 +933,7 @@ /* let's send the command via the control pipe */ result = usb_stor_control_msg( us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x01, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, 0x0000, @@ -978,7 +974,7 @@ result = usb_stor_control_msg( us, - usb_rcvctrlpipe(us->pusb_dev,0), + us->recv_ctrl_pipe, 0x02, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 0x0000, diff -Nru a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c --- a/drivers/usb/storage/jumpshot.c Sun Oct 13 17:08:46 2002 +++ b/drivers/usb/storage/jumpshot.c Sun Oct 13 17:08:46 2002 @@ -95,8 +95,7 @@ return USB_STOR_TRANSPORT_ERROR; // send the setup - rc = usb_storage_send_control(us, - usb_rcvctrlpipe(us->pusb_dev, 0), + rc = usb_storage_send_control(us, us->recv_ctrl_pipe, 0, 0xA0, 0, 7, &reply, 1); if (rc != USB_STOR_TRANSPORT_GOOD) @@ -160,8 +159,7 @@ command[5] |= (sector >> 24) & 0x0F; // send the setup + command - result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev, 0), + result = usb_storage_send_control(us, us->send_ctrl_pipe, 0, 0x20, 0, 1, command, 7); if (result != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -247,8 +245,7 @@ command[5] |= (sector >> 24) & 0x0F; // send the setup + command - result = usb_storage_send_control( - us, usb_sndctrlpipe(us->pusb_dev, 0), + result = usb_storage_send_control(us, us->send_ctrl_pipe, 0, 0x20, 0, 1, command, 7); // send the data @@ -302,8 +299,7 @@ return USB_STOR_TRANSPORT_ERROR; // send the setup - rc = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev, 0), + rc = usb_storage_send_control(us, us->send_ctrl_pipe, 0, 0x20, 0, 6, command, 2); if (rc != USB_STOR_TRANSPORT_GOOD) { diff -Nru a/drivers/usb/storage/raw_bulk.c b/drivers/usb/storage/raw_bulk.c --- a/drivers/usb/storage/raw_bulk.c Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/raw_bulk.c Sun Oct 13 17:08:47 2002 @@ -40,7 +40,7 @@ int usb_storage_send_control(struct us_data *us, - int pipe, + unsigned int pipe, unsigned char request, unsigned char requesttype, unsigned int value, @@ -85,12 +85,12 @@ unsigned int len, unsigned int *act_len) { int result; - int pipe; + unsigned int pipe; if (direction == SCSI_DATA_READ) - pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); + pipe = us->recv_bulk_pipe; else - pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); + pipe = us->send_bulk_pipe; result = usb_stor_bulk_msg(us, data, pipe, len, act_len); diff -Nru a/drivers/usb/storage/raw_bulk.h b/drivers/usb/storage/raw_bulk.h --- a/drivers/usb/storage/raw_bulk.h Sun Oct 13 17:08:46 2002 +++ b/drivers/usb/storage/raw_bulk.h Sun Oct 13 17:08:46 2002 @@ -3,7 +3,7 @@ /* usb bulk */ extern int usb_storage_send_control( - struct us_data *us, int pipe, + struct us_data *us, unsigned int pipe, unsigned char request, unsigned char requesttype, unsigned int value, unsigned int index, unsigned char *xfer_data, unsigned int xfer_len); diff -Nru a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c --- a/drivers/usb/storage/sddr09.c Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/sddr09.c Sun Oct 13 17:08:47 2002 @@ -224,15 +224,15 @@ unsigned char direction, unsigned char *xfer_data, unsigned int xfer_len) { - int pipe; + unsigned int pipe; unsigned char requesttype = (0x41 | direction); // Get the receive or send control pipe number if (direction == USB_DIR_IN) - pipe = usb_rcvctrlpipe(us->pusb_dev,0); + pipe = us->recv_ctrl_pipe; else - pipe = usb_sndctrlpipe(us->pusb_dev,0); + pipe = us->send_ctrl_pipe; return usb_storage_send_control(us, pipe, request, requesttype, 0, 0, xfer_data, xfer_len); diff -Nru a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c --- a/drivers/usb/storage/shuttle_usbat.c Sun Oct 13 17:08:46 2002 +++ b/drivers/usb/storage/shuttle_usbat.c Sun Oct 13 17:08:46 2002 @@ -50,12 +50,6 @@ #include #include -extern int usb_stor_control_msg(struct us_data *us, unsigned int pipe, - u8 request, u8 requesttype, u16 value, u16 index, - void *data, u16 size); -extern int usb_stor_bulk_msg(struct us_data *us, void *data, int pipe, - unsigned int len, unsigned int *act_len); - #define short_pack(LSB,MSB) ( ((u16)(LSB)) | ( ((u16)(MSB))<<8 ) ) #define LSB_of(s) ((s)&0xFF) #define MSB_of(s) ((s)>>8) @@ -70,7 +64,7 @@ int result; result = usb_storage_send_control(us, - usb_rcvctrlpipe(us->pusb_dev,0), + us->recv_ctrl_pipe, access, 0xC0, (u16)reg, @@ -89,7 +83,7 @@ int result; result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, access|0x01, 0x40, short_pack(reg, content), @@ -115,7 +109,7 @@ }; result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x80, 0x40, 0, @@ -140,7 +134,7 @@ }; result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x80, 0x40, 0, @@ -222,7 +216,7 @@ }; result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x80, 0x40, 0, @@ -293,7 +287,7 @@ */ result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x80, 0x40, 0, @@ -352,8 +346,7 @@ if (direction==SCSI_DATA_READ && i==0) { if (usb_stor_clear_halt(us, - usb_sndbulkpipe(us->pusb_dev, - us->ep_out)) < 0) + us->send_bulk_pipe) < 0) return USB_STOR_TRANSPORT_ERROR; } @@ -413,7 +406,7 @@ } result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x80, 0x40, 0, @@ -439,7 +432,7 @@ int result; result = usb_storage_send_control(us, - usb_rcvctrlpipe(us->pusb_dev,0), + us->recv_ctrl_pipe, 0x82, 0xC0, 0, @@ -457,7 +450,7 @@ int result; result = usb_storage_send_control(us, - usb_sndctrlpipe(us->pusb_dev,0), + us->send_ctrl_pipe, 0x82, 0x40, short_pack(enable_flags, data_flags), diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c --- a/drivers/usb/storage/transport.c Sun Oct 13 17:08:46 2002 +++ b/drivers/usb/storage/transport.c Sun Oct 13 17:08:47 2002 @@ -488,7 +488,7 @@ /* This is our function to emulate usb_bulk_msg() with enough control * to make aborts/resets/timeouts work */ -int usb_stor_bulk_msg(struct us_data *us, void *data, int pipe, +int usb_stor_bulk_msg(struct us_data *us, void *data, unsigned int pipe, unsigned int len, unsigned int *act_len) { int status; @@ -515,13 +515,12 @@ * Since many vendors in this space limit their testing to interoperability * with these two OSes, specification violations like this one are common. */ -int usb_stor_clear_halt(struct us_data *us, int pipe) +int usb_stor_clear_halt(struct us_data *us, unsigned int pipe) { int result; int endp = usb_pipeendpoint(pipe) | (usb_pipein(pipe) << 7); - result = usb_stor_control_msg(us, - usb_sndctrlpipe(us->pusb_dev, 0), + result = usb_stor_control_msg(us, us->send_ctrl_pipe, USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0); /* note: no 3*HZ timeout */ US_DEBUGP("usb_stor_clear_halt: result=%d\n", result); @@ -556,13 +555,13 @@ { int result; int partial; - int pipe; + unsigned int pipe; - /* calculate the appropriate pipe information */ + /* get the appropriate pipe value */ if (us->srb->sc_data_direction == SCSI_DATA_READ) - pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); + pipe = us->recv_bulk_pipe; else - pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); + pipe = us->send_bulk_pipe; /* transfer the data */ US_DEBUGP("usb_stor_transfer_partial(): xfer %d bytes\n", length); @@ -985,7 +984,7 @@ /* COMMAND STAGE */ /* let's send the command via the control pipe */ - result = usb_stor_control_msg(us, usb_sndctrlpipe(us->pusb_dev,0), + result = usb_stor_control_msg(us, us->send_ctrl_pipe, US_CBI_ADSC, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, us->ifnum, srb->cmnd, srb->cmd_len); @@ -1097,7 +1096,7 @@ /* COMMAND STAGE */ /* let's send the command via the control pipe */ - result = usb_stor_control_msg(us, usb_sndctrlpipe(us->pusb_dev,0), + result = usb_stor_control_msg(us, us->send_ctrl_pipe, US_CBI_ADSC, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, us->ifnum, srb->cmnd, srb->cmd_len); @@ -1153,12 +1152,12 @@ { unsigned char data; int result; - int pipe; - /* issue the command -- use usb_control_msg() because - * this is not a scsi queued-command */ - pipe = usb_rcvctrlpipe(us->pusb_dev, 0); - result = usb_control_msg(us->pusb_dev, pipe, + /* Issue the command -- use usb_control_msg() because this is + * not a scsi queued-command. Also note that at this point the + * cached pipe values have not yet been stored. */ + result = usb_control_msg(us->pusb_dev, + usb_rcvctrlpipe(us->pusb_dev, 0), US_BULK_GET_MAX_LUN, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, @@ -1180,7 +1179,6 @@ struct bulk_cb_wrap bcb; struct bulk_cs_wrap bcs; int result; - int pipe; int partial; /* set up the command wrapper */ @@ -1193,9 +1191,6 @@ bcb.Lun |= srb->target << 4; bcb.Length = srb->cmd_len; - /* construct the pipe handle */ - pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); - /* copy the command payload */ memset(bcb.CDB, 0, sizeof(bcb.CDB)); memcpy(bcb.CDB, srb->cmnd, bcb.Length); @@ -1205,8 +1200,8 @@ le32_to_cpu(bcb.Signature), bcb.Tag, (bcb.Lun >> 4), (bcb.Lun & 0x0F), bcb.DataTransferLength, bcb.Flags, bcb.Length); - result = usb_stor_bulk_msg(us, &bcb, pipe, US_BULK_CB_WRAP_LEN, - &partial); + result = usb_stor_bulk_msg(us, &bcb, us->send_bulk_pipe, + US_BULK_CB_WRAP_LEN, &partial); US_DEBUGP("Bulk command transfer result=%d\n", result); /* did we abort this command? */ @@ -1217,8 +1212,9 @@ /* if we stall, we need to clear it before we go on */ if (result == -EPIPE) { - US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); - result = usb_stor_clear_halt(us, pipe); + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", + us->send_bulk_pipe); + result = usb_stor_clear_halt(us, us->send_bulk_pipe); /* did we abort this command? */ if (atomic_read(&us->sm_state) == US_STATE_ABORTING) { @@ -1251,13 +1247,10 @@ * an explanation of how this code works. */ - /* construct the pipe handle */ - pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); - /* get CSW for device status */ US_DEBUGP("Attempting to get CSW...\n"); - result = usb_stor_bulk_msg(us, &bcs, pipe, US_BULK_CS_WRAP_LEN, - &partial); + result = usb_stor_bulk_msg(us, &bcs, us->recv_bulk_pipe, + US_BULK_CS_WRAP_LEN, &partial); /* did we abort this command? */ if (atomic_read(&us->sm_state) == US_STATE_ABORTING) { @@ -1267,8 +1260,9 @@ /* did the attempt to read the CSW fail? */ if (result == -EPIPE) { - US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); - result = usb_stor_clear_halt(us, pipe); + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", + us->recv_bulk_pipe); + result = usb_stor_clear_halt(us, us->recv_bulk_pipe); /* did we abort this command? */ if (atomic_read(&us->sm_state) == US_STATE_ABORTING) { @@ -1280,7 +1274,7 @@ /* get the status again */ US_DEBUGP("Attempting to get CSW (2nd try)...\n"); - result = usb_stor_bulk_msg(us, &bcs, pipe, + result = usb_stor_bulk_msg(us, &bcs, us->recv_bulk_pipe, US_BULK_CS_WRAP_LEN, &partial); /* did we abort this command? */ @@ -1291,8 +1285,9 @@ /* if it fails again, we need a reset and return an error*/ if (result == -EPIPE) { - US_DEBUGP("clearing halt for pipe 0x%x\n", pipe); - result = usb_stor_clear_halt(us, pipe); + US_DEBUGP("clearing halt for pipe 0x%x\n", + us->recv_bulk_pipe); + result = usb_stor_clear_halt(us, us->recv_bulk_pipe); /* did we abort this command? */ if (atomic_read(&us->sm_state) == US_STATE_ABORTING) { @@ -1364,7 +1359,7 @@ * following a powerup or USB attach event. */ /* Use usb_control_msg() because this is not a queued-command */ - result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + result = usb_control_msg(us->pusb_dev, us->send_ctrl_pipe, request, requesttype, value, index, data, size, 20*HZ); if (result < 0) @@ -1377,14 +1372,12 @@ /* Use usb_clear_halt() because this is not a queued-command */ US_DEBUGP("Soft reset: clearing bulk-in endpoint halt\n"); - result = usb_clear_halt(us->pusb_dev, - usb_rcvbulkpipe(us->pusb_dev, us->ep_in)); + result = usb_clear_halt(us->pusb_dev, us->recv_bulk_pipe); if (result < 0) goto Done; US_DEBUGP("Soft reset: clearing bulk-out endpoint halt\n"); - result = usb_clear_halt(us->pusb_dev, - usb_sndbulkpipe(us->pusb_dev, us->ep_out)); + result = usb_clear_halt(us->pusb_dev, us->send_bulk_pipe); Done: diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h --- a/drivers/usb/storage/transport.h Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/transport.h Sun Oct 13 17:08:47 2002 @@ -153,12 +153,12 @@ extern void usb_stor_abort_transport(struct us_data*); extern int usb_stor_transfer_partial(struct us_data*, char*, int); -extern int usb_stor_bulk_msg(struct us_data *us, void *data, int pipe, - unsigned int len, unsigned int *act_len); +extern int usb_stor_bulk_msg(struct us_data *us, void *data, + unsigned int pipe, unsigned int len, unsigned int *act_len); extern int usb_stor_control_msg(struct us_data *us, unsigned int pipe, u8 request, u8 requesttype, u16 value, u16 index, void *data, u16 size); -extern int usb_stor_clear_halt(struct us_data*, int ); +extern int usb_stor_clear_halt(struct us_data*, unsigned int pipe); extern void usb_stor_transfer(Scsi_Cmnd*, struct us_data*); #endif diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c --- a/drivers/usb/storage/usb.c Sun Oct 13 17:08:46 2002 +++ b/drivers/usb/storage/usb.c Sun Oct 13 17:08:46 2002 @@ -525,6 +525,12 @@ int maxp; int result; + /* calculate and store the pipe values */ + ss->send_bulk_pipe = usb_sndbulkpipe(ss->pusb_dev, ss->ep_out); + ss->recv_bulk_pipe = usb_rcvbulkpipe(ss->pusb_dev, ss->ep_in); + ss->send_ctrl_pipe = usb_sndctrlpipe(ss->pusb_dev, 0); + ss->recv_ctrl_pipe = usb_rcvctrlpipe(ss->pusb_dev, 0); + /* allocate the usb_ctrlrequest for control packets */ US_DEBUGP("Allocating usb_ctrlrequest\n"); ss->dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); diff -Nru a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h --- a/drivers/usb/storage/usb.h Sun Oct 13 17:08:47 2002 +++ b/drivers/usb/storage/usb.h Sun Oct 13 17:08:47 2002 @@ -134,6 +134,10 @@ struct semaphore dev_semaphore; /* protect pusb_dev */ struct usb_device *pusb_dev; /* this usb_device */ unsigned long flags; /* from filter initially */ + unsigned int send_bulk_pipe; /* cached pipe values */ + unsigned int recv_bulk_pipe; + unsigned int send_ctrl_pipe; + unsigned int recv_ctrl_pipe; /* information about the device -- always good */ char vendor[USB_STOR_STRING_LEN];