ChangeSet 1.1254.1.5, 2003/05/29 15:19:51-07:00, [EMAIL PROTECTED]

[PATCH] USB: storage: collapse one-use functions

This patch collapses some one-use functions into their callers.  It also
clones some code for control transfers so we can implement abortable
control transfers with timeout.

This patch is from Alan Stern.

 Remove usb_stor_bulk_msg() and usb_stor_interrupt_msg().  Move their
 functionality into usb_stor_bulk_transfer_buf() and
 usb_stor_intr_transfer().

 Move the functionality of usb_stor_control_msg() into
 usb_stor_ctrl_transfer().

 Remove the unused act_len parameter from usb_stor_intr_transfer().


 drivers/usb/storage/transport.c |  172 +++++++++++++++-------------------------
 drivers/usb/storage/transport.h |    6 -
 2 files changed, 68 insertions(+), 110 deletions(-)


diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c   Fri May 30 11:35:30 2003
+++ b/drivers/usb/storage/transport.c   Fri May 30 11:35:30 2003
@@ -192,53 +192,6 @@
        return status;
 }
 
-/* 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, unsigned int pipe,
-                     unsigned int len, unsigned int *act_len)
-{
-       int status;
-
-       /* fill and submit the URB */
-       usb_fill_bulk_urb(us->current_urb, us->pusb_dev, pipe, data, len,
-                     usb_stor_blocking_completion, NULL);
-       status = usb_stor_msg_common(us);
-
-       /* store the actual length of the data transferred */
-       *act_len = us->current_urb->actual_length;
-       return status;
-}
-
-/* This is our function to submit interrupt URBs with enough control
- * to make aborts/resets/timeouts work
- *
- * This routine always uses us->recv_intr_pipe as the pipe and
- * us->ep_bInterval as the interrupt interval.
- */
-int usb_stor_interrupt_msg(struct us_data *us, void *data,
-                       unsigned int len, unsigned int *act_len)
-{
-       unsigned int pipe = us->recv_intr_pipe;
-       unsigned int maxp;
-       int status;
-
-       /* calculate the max packet size */
-       maxp = usb_maxpacket(us->pusb_dev, pipe, usb_pipeout(pipe));
-       if (maxp > len)
-               maxp = len;
-
-       /* fill and submit the URB */
-       usb_fill_int_urb(us->current_urb, us->pusb_dev, pipe, data,
-                       maxp, usb_stor_blocking_completion, NULL,
-                       us->ep_bInterval);
-       status = usb_stor_msg_common(us);
-
-       /* store the actual length of the data transferred */
-       *act_len = us->current_urb->actual_length;
-       return status;
-}
-
 /* This is a version of usb_clear_halt() that doesn't read the status from
  * the device -- this is because some devices crash their internal firmware
  * when the status is requested after a halt.
@@ -282,12 +235,12 @@
  * Interpret the results of a URB transfer
  *
  * This function prints appropriate debugging messages, clears halts on
- * bulk endpoints, and translates the status to the corresponding
+ * non-control endpoints, and translates the status to the corresponding
  * USB_STOR_XFER_xxx return code.
  */
 static int interpret_urb_result(struct us_data *us, unsigned int pipe,
-               unsigned int length, int result, unsigned int partial) {
-
+               unsigned int length, int result, unsigned int partial)
+{
        US_DEBUGP("Status code %d; transferred %u/%u\n",
                        result, partial, length);
        switch (result) {
@@ -340,77 +293,88 @@
 }
 
 /*
- * Transfer one control message
- *
- * This function does basically the same thing as usb_stor_control_msg()
- * above, except that return codes are USB_STOR_XFER_xxx rather than the
- * urb status or transfer length.
+ * Transfer one control message, without timeouts, but allowing early
+ * termination.  Return codes are USB_STOR_XFER_xxx.
  */
 int usb_stor_ctrl_transfer(struct us_data *us, unsigned int pipe,
                u8 request, u8 requesttype, u16 value, u16 index,
-               void *data, u16 size) {
+               void *data, u16 size)
+{
        int result;
-       unsigned int partial = 0;
 
-       US_DEBUGP("usb_stor_ctrl_transfer(): rq=%02x rqtype=%02x "
-                       "value=%04x index=%02x len=%u\n",
-                       request, requesttype, value, index, size);
-       result = usb_stor_control_msg(us, pipe, request, requesttype,
-                       value, index, data, size);
-
-       if (result > 0) {       /* Separate out the amount transferred */
-               partial = result;
-               result = 0;
-       }
-       return interpret_urb_result(us, pipe, size, result, partial);
+       US_DEBUGP("%s: rq=%02x rqtype=%02x value=%04x index=%02x len=%u\n",
+                       __FUNCTION__, request, requesttype,
+                       value, index, size);
+
+       /* fill in the devrequest structure */
+       us->dr->bRequestType = requesttype;
+       us->dr->bRequest = request;
+       us->dr->wValue = cpu_to_le16(value);
+       us->dr->wIndex = cpu_to_le16(index);
+       us->dr->wLength = cpu_to_le16(size);
+
+       /* fill and submit the URB */
+       usb_fill_control_urb(us->current_urb, us->pusb_dev, pipe, 
+                        (unsigned char*) us->dr, data, size, 
+                        usb_stor_blocking_completion, NULL);
+       result = usb_stor_msg_common(us);
+
+       return interpret_urb_result(us, pipe, size, result,
+                       us->current_urb->actual_length);
 }
 
 /*
- * Receive one buffer via interrupt transfer
+ * Receive one interrupt buffer, without timeouts, but allowing early
+ * termination.  Return codes are USB_STOR_XFER_xxx.
  *
- * This function does basically the same thing as usb_stor_interrupt_msg()
- * above, except that return codes are USB_STOR_XFER_xxx rather than the
- * urb status.
+ * This routine always uses us->recv_intr_pipe as the pipe and
+ * us->ep_bInterval as the interrupt interval.
  */
-int usb_stor_intr_transfer(struct us_data *us, void *buf,
-               unsigned int length, unsigned int *act_len)
+int usb_stor_intr_transfer(struct us_data *us, void *buf, unsigned int length)
 {
        int result;
-       unsigned int partial;
+       unsigned int pipe = us->recv_intr_pipe;
+       unsigned int maxp;
 
-       /* transfer the data */
-       US_DEBUGP("usb_stor_intr_transfer(): xfer %u bytes\n", length);
-       result = usb_stor_interrupt_msg(us, buf, length, &partial);
-       if (act_len)
-               *act_len = partial;
+       US_DEBUGP("%s: xfer %u bytes\n", __FUNCTION__, length);
+
+       /* calculate the max packet size */
+       maxp = usb_maxpacket(us->pusb_dev, pipe, usb_pipeout(pipe));
+       if (maxp > length)
+               maxp = length;
 
-       return interpret_urb_result(us, us->recv_intr_pipe,
-                       length, result, partial);
+       /* fill and submit the URB */
+       usb_fill_int_urb(us->current_urb, us->pusb_dev, pipe, buf,
+                       maxp, usb_stor_blocking_completion, NULL,
+                       us->ep_bInterval);
+       result = usb_stor_msg_common(us);
+
+       return interpret_urb_result(us, pipe, length, result,
+                       us->current_urb->actual_length);
 }
 
 /*
- * Transfer one buffer via bulk transfer
- *
- * This function does basically the same thing as usb_stor_bulk_msg()
- * above, except that:
- *
- *     1.  If the bulk pipe stalls during the transfer, the halt is
- *         automatically cleared;
- *     2.  Return codes are USB_STOR_XFER_xxx rather than the
- *         urb status or transfer length.
+ * Transfer one buffer via bulk pipe, without timeouts, but allowing early
+ * termination.  Return codes are USB_STOR_XFER_xxx.  If the bulk pipe
+ * stalls during the transfer, the halt is automatically cleared.
  */
 int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe,
        void *buf, unsigned int length, unsigned int *act_len)
 {
        int result;
-       unsigned int partial;
 
-       /* transfer the data */
-       US_DEBUGP("usb_stor_bulk_transfer_buf(): xfer %u bytes\n", length);
-       result = usb_stor_bulk_msg(us, buf, pipe, length, &partial);
+       US_DEBUGP("%s: xfer %u bytes\n", __FUNCTION__, length);
+
+       /* fill and submit the URB */
+       usb_fill_bulk_urb(us->current_urb, us->pusb_dev, pipe, buf, length,
+                     usb_stor_blocking_completion, NULL);
+       result = usb_stor_msg_common(us);
+
+       /* store the actual length of the data transferred */
        if (act_len)
-               *act_len = partial;
-       return interpret_urb_result(us, pipe, length, result, partial);
+               *act_len = us->current_urb->actual_length;
+       return interpret_urb_result(us, pipe, length, result, 
+                       us->current_urb->actual_length);
 }
 
 /*
@@ -424,15 +388,14 @@
                unsigned int *act_len)
 {
        int result;
-       unsigned int partial;
 
        /* don't submit s-g requests during abort/disconnect processing */
        if (us->flags & DONT_SUBMIT)
                return USB_STOR_XFER_ERROR;
 
        /* initialize the scatter-gather request block */
-       US_DEBUGP("usb_stor_bulk_transfer_sglist(): xfer %u bytes, "
-                       "%d entries\n", length, num_sg);
+       US_DEBUGP("%s: xfer %u bytes, %d entries\n", __FUNCTION__,
+                       length, num_sg);
        result = usb_sg_init(us->current_sg, us->pusb_dev, pipe, 0,
                        sg, num_sg, length, SLAB_NOIO);
        if (result) {
@@ -459,10 +422,10 @@
        clear_bit(US_FLIDX_SG_ACTIVE, &us->flags);
 
        result = us->current_sg->status;
-       partial = us->current_sg->bytes;
        if (act_len)
-               *act_len = partial;
-       return interpret_urb_result(us, pipe, length, result, partial);
+               *act_len = us->current_sg->bytes;
+       return interpret_urb_result(us, pipe, length, result,
+                       us->current_sg->bytes);
 }
 
 /*
@@ -775,8 +738,7 @@
        }
 
        /* STATUS STAGE */
-       result = usb_stor_intr_transfer(us, us->irqdata,
-                                       sizeof(us->irqdata), NULL);
+       result = usb_stor_intr_transfer(us, us->irqdata, sizeof(us->irqdata));
        US_DEBUGP("Got interrupt data (0x%x, 0x%x)\n", 
                        us->irqdata[0], us->irqdata[1]);
        if (result != USB_STOR_XFER_GOOD)
diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h
--- a/drivers/usb/storage/transport.h   Fri May 30 11:35:30 2003
+++ b/drivers/usb/storage/transport.h   Fri May 30 11:35:30 2003
@@ -158,20 +158,16 @@
 extern void usb_stor_invoke_transport(Scsi_Cmnd*, struct us_data*);
 extern void usb_stor_stop_transport(struct us_data*);
 
-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_interrupt_msg(struct us_data *us, void *data,
-               unsigned int len, unsigned int *act_len);
 
 extern int usb_stor_clear_halt(struct us_data*, unsigned int pipe);
 extern int usb_stor_ctrl_transfer(struct us_data *us, unsigned int pipe,
                u8 request, u8 requesttype, u16 value, u16 index,
                void *data, u16 size);
 extern int usb_stor_intr_transfer(struct us_data *us, void *buf,
-               unsigned int length, unsigned int *act_len);
+               unsigned int length);
 extern int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe,
                void *buf, unsigned int length, unsigned int *act_len);
 extern int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,



-------------------------------------------------------
This SF.net email is sponsored by: eBay
Get office equipment for less on eBay!
http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to