diff options
Diffstat (limited to 'drivers/usb/wusbcore')
-rw-r--r-- | drivers/usb/wusbcore/wa-xfer.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c index cf1097963f8b..0b1cb65348ac 100644 --- a/drivers/usb/wusbcore/wa-xfer.c +++ b/drivers/usb/wusbcore/wa-xfer.c | |||
@@ -114,8 +114,8 @@ static void wa_xfer_delayed_run(struct wa_rpipe *); | |||
114 | * struct). | 114 | * struct). |
115 | */ | 115 | */ |
116 | struct wa_seg { | 116 | struct wa_seg { |
117 | struct urb urb; | 117 | struct urb tr_urb; /* transfer request urb. */ |
118 | struct urb *dto_urb; /* for data output? */ | 118 | struct urb *dto_urb; /* for data output. */ |
119 | struct list_head list_node; /* for rpipe->req_list */ | 119 | struct list_head list_node; /* for rpipe->req_list */ |
120 | struct wa_xfer *xfer; /* out xfer */ | 120 | struct wa_xfer *xfer; /* out xfer */ |
121 | u8 index; /* which segment we are */ | 121 | u8 index; /* which segment we are */ |
@@ -127,11 +127,11 @@ struct wa_seg { | |||
127 | 127 | ||
128 | static inline void wa_seg_init(struct wa_seg *seg) | 128 | static inline void wa_seg_init(struct wa_seg *seg) |
129 | { | 129 | { |
130 | usb_init_urb(&seg->urb); | 130 | usb_init_urb(&seg->tr_urb); |
131 | 131 | ||
132 | /* set the remaining memory to 0. */ | 132 | /* set the remaining memory to 0. */ |
133 | memset(((void *)seg) + sizeof(seg->urb), 0, | 133 | memset(((void *)seg) + sizeof(seg->tr_urb), 0, |
134 | sizeof(*seg) - sizeof(seg->urb)); | 134 | sizeof(*seg) - sizeof(seg->tr_urb)); |
135 | } | 135 | } |
136 | 136 | ||
137 | /* | 137 | /* |
@@ -179,7 +179,7 @@ static void wa_xfer_destroy(struct kref *_xfer) | |||
179 | unsigned cnt; | 179 | unsigned cnt; |
180 | for (cnt = 0; cnt < xfer->segs; cnt++) { | 180 | for (cnt = 0; cnt < xfer->segs; cnt++) { |
181 | usb_free_urb(xfer->seg[cnt]->dto_urb); | 181 | usb_free_urb(xfer->seg[cnt]->dto_urb); |
182 | usb_free_urb(&xfer->seg[cnt]->urb); | 182 | usb_free_urb(&xfer->seg[cnt]->tr_urb); |
183 | } | 183 | } |
184 | } | 184 | } |
185 | kfree(xfer); | 185 | kfree(xfer); |
@@ -494,12 +494,12 @@ static void __wa_xfer_setup_hdr0(struct wa_xfer *xfer, | |||
494 | /* | 494 | /* |
495 | * Callback for the OUT data phase of the segment request | 495 | * Callback for the OUT data phase of the segment request |
496 | * | 496 | * |
497 | * Check wa_seg_cb(); most comments also apply here because this | 497 | * Check wa_seg_tr_cb(); most comments also apply here because this |
498 | * function does almost the same thing and they work closely | 498 | * function does almost the same thing and they work closely |
499 | * together. | 499 | * together. |
500 | * | 500 | * |
501 | * If the seg request has failed but this DTO phase has succeeded, | 501 | * If the seg request has failed but this DTO phase has succeeded, |
502 | * wa_seg_cb() has already failed the segment and moved the | 502 | * wa_seg_tr_cb() has already failed the segment and moved the |
503 | * status to WA_SEG_ERROR, so this will go through 'case 0' and | 503 | * status to WA_SEG_ERROR, so this will go through 'case 0' and |
504 | * effectively do nothing. | 504 | * effectively do nothing. |
505 | */ | 505 | */ |
@@ -576,7 +576,7 @@ static void wa_seg_dto_cb(struct urb *urb) | |||
576 | * as in that case, wa_seg_dto_cb will do it when the OUT data phase | 576 | * as in that case, wa_seg_dto_cb will do it when the OUT data phase |
577 | * finishes. | 577 | * finishes. |
578 | */ | 578 | */ |
579 | static void wa_seg_cb(struct urb *urb) | 579 | static void wa_seg_tr_cb(struct urb *urb) |
580 | { | 580 | { |
581 | struct wa_seg *seg = urb->context; | 581 | struct wa_seg *seg = urb->context; |
582 | struct wa_xfer *xfer = seg->xfer; | 582 | struct wa_xfer *xfer = seg->xfer; |
@@ -740,11 +740,11 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) | |||
740 | wa_seg_init(seg); | 740 | wa_seg_init(seg); |
741 | seg->xfer = xfer; | 741 | seg->xfer = xfer; |
742 | seg->index = cnt; | 742 | seg->index = cnt; |
743 | usb_fill_bulk_urb(&seg->urb, usb_dev, | 743 | usb_fill_bulk_urb(&seg->tr_urb, usb_dev, |
744 | usb_sndbulkpipe(usb_dev, | 744 | usb_sndbulkpipe(usb_dev, |
745 | dto_epd->bEndpointAddress), | 745 | dto_epd->bEndpointAddress), |
746 | &seg->xfer_hdr, xfer_hdr_size, | 746 | &seg->xfer_hdr, xfer_hdr_size, |
747 | wa_seg_cb, seg); | 747 | wa_seg_tr_cb, seg); |
748 | buf_itr_size = min(buf_size, xfer->seg_size); | 748 | buf_itr_size = min(buf_size, xfer->seg_size); |
749 | if (xfer->is_inbound == 0 && buf_size > 0) { | 749 | if (xfer->is_inbound == 0 && buf_size > 0) { |
750 | /* outbound data. */ | 750 | /* outbound data. */ |
@@ -888,12 +888,14 @@ static int __wa_seg_submit(struct wa_rpipe *rpipe, struct wa_xfer *xfer, | |||
888 | struct wa_seg *seg) | 888 | struct wa_seg *seg) |
889 | { | 889 | { |
890 | int result; | 890 | int result; |
891 | result = usb_submit_urb(&seg->urb, GFP_ATOMIC); | 891 | /* submit the transfer request. */ |
892 | result = usb_submit_urb(&seg->tr_urb, GFP_ATOMIC); | ||
892 | if (result < 0) { | 893 | if (result < 0) { |
893 | printk(KERN_ERR "xfer %p#%u: REQ submit failed: %d\n", | 894 | printk(KERN_ERR "xfer %p#%u: REQ submit failed: %d\n", |
894 | xfer, seg->index, result); | 895 | xfer, seg->index, result); |
895 | goto error_seg_submit; | 896 | goto error_seg_submit; |
896 | } | 897 | } |
898 | /* submit the out data if this is an out request. */ | ||
897 | if (seg->dto_urb) { | 899 | if (seg->dto_urb) { |
898 | result = usb_submit_urb(seg->dto_urb, GFP_ATOMIC); | 900 | result = usb_submit_urb(seg->dto_urb, GFP_ATOMIC); |
899 | if (result < 0) { | 901 | if (result < 0) { |
@@ -907,7 +909,7 @@ static int __wa_seg_submit(struct wa_rpipe *rpipe, struct wa_xfer *xfer, | |||
907 | return 0; | 909 | return 0; |
908 | 910 | ||
909 | error_dto_submit: | 911 | error_dto_submit: |
910 | usb_unlink_urb(&seg->urb); | 912 | usb_unlink_urb(&seg->tr_urb); |
911 | error_seg_submit: | 913 | error_seg_submit: |
912 | seg->status = WA_SEG_ERROR; | 914 | seg->status = WA_SEG_ERROR; |
913 | seg->result = result; | 915 | seg->result = result; |
@@ -1313,7 +1315,7 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb) | |||
1313 | break; | 1315 | break; |
1314 | case WA_SEG_SUBMITTED: | 1316 | case WA_SEG_SUBMITTED: |
1315 | seg->status = WA_SEG_ABORTED; | 1317 | seg->status = WA_SEG_ABORTED; |
1316 | usb_unlink_urb(&seg->urb); | 1318 | usb_unlink_urb(&seg->tr_urb); |
1317 | if (xfer->is_inbound == 0) | 1319 | if (xfer->is_inbound == 0) |
1318 | usb_unlink_urb(seg->dto_urb); | 1320 | usb_unlink_urb(seg->dto_urb); |
1319 | xfer->segs_done++; | 1321 | xfer->segs_done++; |