18 #include <linux/kernel.h>
20 #include <linux/slab.h>
24 #include "../../wusbcore/wusbhc.h"
42 INIT_LIST_HEAD(&qset->
stds);
55 struct usb_device *usb_dev = urb->dev;
61 is_out = usb_pipeout(urb->pipe);
79 if (usb_pipecontrol(urb->pipe))
85 phy_rate = fls(phy_rates) - 1;
86 if (phy_rate > whc->
wusbhc.phy_rate)
87 phy_rate = whc->
wusbhc.phy_rate;
93 | usb_pipe_to_qh_type(urb->pipe)
129 qset->
qh.err_count = 0;
130 qset->
qh.scratch[0] = 0;
131 qset->
qh.scratch[1] = 0;
132 qset->
qh.scratch[2] = 0;
134 memset(&qset->
qh.overlay, 0,
sizeof(qset->
qh.overlay));
163 qset = urb->
ep->hcpriv;
170 urb->ep->hcpriv = qset;
171 qset_fill_qh(whc, qset, urb);
208 if (usb_pipecontrol(std->
urb->pipe))
213 if (whc_std_last(std) && usb_pipeout(std->
urb->pipe))
227 }
else if (usb_pipein(std->
urb->pipe))
255 static void qset_remove_qtd(
struct whc *whc,
struct whc_qset *qset)
264 static void qset_copy_bounce_to_sg(
struct whc *whc,
struct whc_std *
std)
271 remaining = std->
len;
279 len =
min(sg->
length - offset, remaining);
280 memcpy(sg_virt(sg) + offset, bounce, len);
286 if (offset >= sg->
length) {
303 bool is_out = usb_pipeout(std->
urb->pipe);
314 qset_copy_bounce_to_sg(whc, std);
331 static void qset_remove_qtds(
struct whc *whc,
struct whc_qset *qset,
340 qset_remove_qtd(whc, qset);
348 static void qset_free_stds(
struct whc_qset *qset,
struct urb *urb)
358 static int qset_fill_page_list(
struct whc *whc,
struct whc_std *std,
gfp_t mem_flags)
372 ep = dma_addr + std->
len;
396 struct whc *whc = qset->
whc;
410 spin_unlock_irqrestore(&whc->
lock, flags);
413 static struct whc_std *qset_new_std(
struct whc *whc,
struct whc_qset *qset,
414 struct urb *urb,
gfp_t mem_flags)
418 std = kzalloc(
sizeof(
struct whc_std), mem_flags);
431 static int qset_add_urb_sg(
struct whc *whc,
struct whc_qset *qset,
struct urb *urb,
444 remaining = urb->transfer_buffer_length;
448 size_t dma_remaining;
452 if (remaining == 0) {
459 while (dma_remaining) {
480 std = qset_new_std(whc, qset, urb, mem_flags);
488 dma_len = dma_remaining;
505 ep = dma_addr + dma_len;
512 if (new_pl_virt ==
NULL) {
524 prev_end = dma_addr = ep;
525 dma_remaining -= dma_len;
526 remaining -= dma_len;
550 static int qset_add_urb_sg_linearize(
struct whc *whc,
struct whc_qset *qset,
551 struct urb *urb,
gfp_t mem_flags)
553 bool is_out = usb_pipeout(urb->pipe);
565 remaining = urb->transfer_buffer_length;
572 if (remaining == 0) {
576 sg_remaining =
min_t(
size_t, remaining, sg->
length);
579 while (sg_remaining) {
580 if (!std || std->
len == max_std_len) {
581 std = qset_new_std(whc, qset, urb, mem_flags);
593 len =
min(sg_remaining, max_std_len - std->
len);
596 memcpy(bounce, orig, len);
619 if (qset_fill_page_list(whc, std, mem_flags) < 0)
639 int remaining = urb->transfer_buffer_length;
644 wurb = kzalloc(
sizeof(
struct whc_urb), mem_flags);
653 ret = qset_add_urb_sg(whc, qset, urb, mem_flags);
655 qset_free_stds(qset, urb);
656 ret = qset_add_urb_sg_linearize(whc, qset, urb, mem_flags);
664 if (ntds_remaining == 0)
667 while (ntds_remaining) {
675 std = qset_new_std(whc, qset, urb, mem_flags);
683 if (qset_fill_page_list(whc, std, mem_flags) < 0)
687 remaining -= std_len;
688 transfer_dma += std_len;
694 qset_free_stds(qset, urb);
704 struct urb *urb,
int status)
707 struct whc_urb *wurb = urb->hcpriv;
711 spin_unlock(&whc->
lock);
713 spin_lock(&whc->
lock);
723 static int get_urb_status_from_qtd(
struct urb *urb,
u32 status)
727 return usb_pipein(urb->pipe) ? -
ENOSR : -
ECOMM;
734 if (usb_pipein(urb->pipe)
735 && (urb->transfer_flags & URB_SHORT_NOT_OK)
736 && urb->actual_length < urb->transfer_buffer_length)
753 struct urb *urb = std->
urb;
764 complete = whc_std_last(std);
766 qset_remove_qtd(whc, qset);
774 qset_remove_qtds(whc, qset, urb);
805 struct urb *urb = std->
urb;
810 qset_remove_qtds(whc, qset, urb);
816 qset_remove_qtd(whc, qset);