diff options
-rw-r--r-- | drivers/usb/dwc2/hcd.c | 29 | ||||
-rw-r--r-- | drivers/usb/dwc2/hcd.h | 20 | ||||
-rw-r--r-- | drivers/usb/dwc2/hcd_intr.c | 5 | ||||
-rw-r--r-- | drivers/usb/dwc2/hcd_queue.c | 10 |
4 files changed, 37 insertions, 27 deletions
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index b50ec3714fd8..5c51bf5506d1 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c | |||
@@ -2608,7 +2608,7 @@ static int dwc2_assign_and_init_hc(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) | |||
2608 | chan->dev_addr = dwc2_hcd_get_dev_addr(&urb->pipe_info); | 2608 | chan->dev_addr = dwc2_hcd_get_dev_addr(&urb->pipe_info); |
2609 | chan->ep_num = dwc2_hcd_get_ep_num(&urb->pipe_info); | 2609 | chan->ep_num = dwc2_hcd_get_ep_num(&urb->pipe_info); |
2610 | chan->speed = qh->dev_speed; | 2610 | chan->speed = qh->dev_speed; |
2611 | chan->max_packet = dwc2_max_packet(qh->maxp); | 2611 | chan->max_packet = qh->maxp; |
2612 | 2612 | ||
2613 | chan->xfer_started = 0; | 2613 | chan->xfer_started = 0; |
2614 | chan->halt_status = DWC2_HC_XFER_NO_HALT_STATUS; | 2614 | chan->halt_status = DWC2_HC_XFER_NO_HALT_STATUS; |
@@ -2686,7 +2686,7 @@ static int dwc2_assign_and_init_hc(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) | |||
2686 | * This value may be modified when the transfer is started | 2686 | * This value may be modified when the transfer is started |
2687 | * to reflect the actual transfer length | 2687 | * to reflect the actual transfer length |
2688 | */ | 2688 | */ |
2689 | chan->multi_count = dwc2_hb_mult(qh->maxp); | 2689 | chan->multi_count = qh->maxp_mult; |
2690 | 2690 | ||
2691 | if (hsotg->params.dma_desc_enable) { | 2691 | if (hsotg->params.dma_desc_enable) { |
2692 | chan->desc_list_addr = qh->desc_list_dma; | 2692 | chan->desc_list_addr = qh->desc_list_dma; |
@@ -3806,19 +3806,21 @@ static struct dwc2_hcd_urb *dwc2_hcd_urb_alloc(struct dwc2_hsotg *hsotg, | |||
3806 | 3806 | ||
3807 | static void dwc2_hcd_urb_set_pipeinfo(struct dwc2_hsotg *hsotg, | 3807 | static void dwc2_hcd_urb_set_pipeinfo(struct dwc2_hsotg *hsotg, |
3808 | struct dwc2_hcd_urb *urb, u8 dev_addr, | 3808 | struct dwc2_hcd_urb *urb, u8 dev_addr, |
3809 | u8 ep_num, u8 ep_type, u8 ep_dir, u16 mps) | 3809 | u8 ep_num, u8 ep_type, u8 ep_dir, |
3810 | u16 maxp, u16 maxp_mult) | ||
3810 | { | 3811 | { |
3811 | if (dbg_perio() || | 3812 | if (dbg_perio() || |
3812 | ep_type == USB_ENDPOINT_XFER_BULK || | 3813 | ep_type == USB_ENDPOINT_XFER_BULK || |
3813 | ep_type == USB_ENDPOINT_XFER_CONTROL) | 3814 | ep_type == USB_ENDPOINT_XFER_CONTROL) |
3814 | dev_vdbg(hsotg->dev, | 3815 | dev_vdbg(hsotg->dev, |
3815 | "addr=%d, ep_num=%d, ep_dir=%1x, ep_type=%1x, mps=%d\n", | 3816 | "addr=%d, ep_num=%d, ep_dir=%1x, ep_type=%1x, maxp=%d (%d mult)\n", |
3816 | dev_addr, ep_num, ep_dir, ep_type, mps); | 3817 | dev_addr, ep_num, ep_dir, ep_type, maxp, maxp_mult); |
3817 | urb->pipe_info.dev_addr = dev_addr; | 3818 | urb->pipe_info.dev_addr = dev_addr; |
3818 | urb->pipe_info.ep_num = ep_num; | 3819 | urb->pipe_info.ep_num = ep_num; |
3819 | urb->pipe_info.pipe_type = ep_type; | 3820 | urb->pipe_info.pipe_type = ep_type; |
3820 | urb->pipe_info.pipe_dir = ep_dir; | 3821 | urb->pipe_info.pipe_dir = ep_dir; |
3821 | urb->pipe_info.mps = mps; | 3822 | urb->pipe_info.maxp = maxp; |
3823 | urb->pipe_info.maxp_mult = maxp_mult; | ||
3822 | } | 3824 | } |
3823 | 3825 | ||
3824 | /* | 3826 | /* |
@@ -3909,8 +3911,9 @@ void dwc2_hcd_dump_state(struct dwc2_hsotg *hsotg) | |||
3909 | dwc2_hcd_is_pipe_in(&urb->pipe_info) ? | 3911 | dwc2_hcd_is_pipe_in(&urb->pipe_info) ? |
3910 | "IN" : "OUT"); | 3912 | "IN" : "OUT"); |
3911 | dev_dbg(hsotg->dev, | 3913 | dev_dbg(hsotg->dev, |
3912 | " Max packet size: %d\n", | 3914 | " Max packet size: %d (%d mult)\n", |
3913 | dwc2_hcd_get_mps(&urb->pipe_info)); | 3915 | dwc2_hcd_get_maxp(&urb->pipe_info), |
3916 | dwc2_hcd_get_maxp_mult(&urb->pipe_info)); | ||
3914 | dev_dbg(hsotg->dev, | 3917 | dev_dbg(hsotg->dev, |
3915 | " transfer_buffer: %p\n", | 3918 | " transfer_buffer: %p\n", |
3916 | urb->buf); | 3919 | urb->buf); |
@@ -4510,8 +4513,10 @@ static void dwc2_dump_urb_info(struct usb_hcd *hcd, struct urb *urb, | |||
4510 | } | 4513 | } |
4511 | 4514 | ||
4512 | dev_vdbg(hsotg->dev, " Speed: %s\n", speed); | 4515 | dev_vdbg(hsotg->dev, " Speed: %s\n", speed); |
4513 | dev_vdbg(hsotg->dev, " Max packet size: %d\n", | 4516 | dev_vdbg(hsotg->dev, " Max packet size: %d (%d mult)\n", |
4514 | usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe))); | 4517 | usb_endpoint_maxp(&urb->ep->desc), |
4518 | usb_endpoint_maxp_mult(&urb->ep->desc)); | ||
4519 | |||
4515 | dev_vdbg(hsotg->dev, " Data buffer length: %d\n", | 4520 | dev_vdbg(hsotg->dev, " Data buffer length: %d\n", |
4516 | urb->transfer_buffer_length); | 4521 | urb->transfer_buffer_length); |
4517 | dev_vdbg(hsotg->dev, " Transfer buffer: %p, Transfer DMA: %08lx\n", | 4522 | dev_vdbg(hsotg->dev, " Transfer buffer: %p, Transfer DMA: %08lx\n", |
@@ -4594,8 +4599,8 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, | |||
4594 | dwc2_hcd_urb_set_pipeinfo(hsotg, dwc2_urb, usb_pipedevice(urb->pipe), | 4599 | dwc2_hcd_urb_set_pipeinfo(hsotg, dwc2_urb, usb_pipedevice(urb->pipe), |
4595 | usb_pipeendpoint(urb->pipe), ep_type, | 4600 | usb_pipeendpoint(urb->pipe), ep_type, |
4596 | usb_pipein(urb->pipe), | 4601 | usb_pipein(urb->pipe), |
4597 | usb_maxpacket(urb->dev, urb->pipe, | 4602 | usb_endpoint_maxp(&ep->desc), |
4598 | !(usb_pipein(urb->pipe)))); | 4603 | usb_endpoint_maxp_mult(&ep->desc)); |
4599 | 4604 | ||
4600 | buf = urb->transfer_buffer; | 4605 | buf = urb->transfer_buffer; |
4601 | 4606 | ||
diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h index c089ffa1f0a8..ce6445a06588 100644 --- a/drivers/usb/dwc2/hcd.h +++ b/drivers/usb/dwc2/hcd.h | |||
@@ -171,7 +171,8 @@ struct dwc2_hcd_pipe_info { | |||
171 | u8 ep_num; | 171 | u8 ep_num; |
172 | u8 pipe_type; | 172 | u8 pipe_type; |
173 | u8 pipe_dir; | 173 | u8 pipe_dir; |
174 | u16 mps; | 174 | u16 maxp; |
175 | u16 maxp_mult; | ||
175 | }; | 176 | }; |
176 | 177 | ||
177 | struct dwc2_hcd_iso_packet_desc { | 178 | struct dwc2_hcd_iso_packet_desc { |
@@ -264,6 +265,7 @@ struct dwc2_hs_transfer_time { | |||
264 | * - USB_ENDPOINT_XFER_ISOC | 265 | * - USB_ENDPOINT_XFER_ISOC |
265 | * @ep_is_in: Endpoint direction | 266 | * @ep_is_in: Endpoint direction |
266 | * @maxp: Value from wMaxPacketSize field of Endpoint Descriptor | 267 | * @maxp: Value from wMaxPacketSize field of Endpoint Descriptor |
268 | * @maxp_mult: Multiplier for maxp | ||
267 | * @dev_speed: Device speed. One of the following values: | 269 | * @dev_speed: Device speed. One of the following values: |
268 | * - USB_SPEED_LOW | 270 | * - USB_SPEED_LOW |
269 | * - USB_SPEED_FULL | 271 | * - USB_SPEED_FULL |
@@ -340,6 +342,7 @@ struct dwc2_qh { | |||
340 | u8 ep_type; | 342 | u8 ep_type; |
341 | u8 ep_is_in; | 343 | u8 ep_is_in; |
342 | u16 maxp; | 344 | u16 maxp; |
345 | u16 maxp_mult; | ||
343 | u8 dev_speed; | 346 | u8 dev_speed; |
344 | u8 data_toggle; | 347 | u8 data_toggle; |
345 | u8 ping_state; | 348 | u8 ping_state; |
@@ -503,9 +506,14 @@ static inline u8 dwc2_hcd_get_pipe_type(struct dwc2_hcd_pipe_info *pipe) | |||
503 | return pipe->pipe_type; | 506 | return pipe->pipe_type; |
504 | } | 507 | } |
505 | 508 | ||
506 | static inline u16 dwc2_hcd_get_mps(struct dwc2_hcd_pipe_info *pipe) | 509 | static inline u16 dwc2_hcd_get_maxp(struct dwc2_hcd_pipe_info *pipe) |
510 | { | ||
511 | return pipe->maxp; | ||
512 | } | ||
513 | |||
514 | static inline u16 dwc2_hcd_get_maxp_mult(struct dwc2_hcd_pipe_info *pipe) | ||
507 | { | 515 | { |
508 | return pipe->mps; | 516 | return pipe->maxp_mult; |
509 | } | 517 | } |
510 | 518 | ||
511 | static inline u8 dwc2_hcd_get_dev_addr(struct dwc2_hcd_pipe_info *pipe) | 519 | static inline u8 dwc2_hcd_get_dev_addr(struct dwc2_hcd_pipe_info *pipe) |
@@ -620,12 +628,6 @@ static inline bool dbg_urb(struct urb *urb) | |||
620 | static inline bool dbg_perio(void) { return false; } | 628 | static inline bool dbg_perio(void) { return false; } |
621 | #endif | 629 | #endif |
622 | 630 | ||
623 | /* High bandwidth multiplier as encoded in highspeed endpoint descriptors */ | ||
624 | #define dwc2_hb_mult(wmaxpacketsize) (1 + (((wmaxpacketsize) >> 11) & 0x03)) | ||
625 | |||
626 | /* Packet size for any kind of endpoint descriptor */ | ||
627 | #define dwc2_max_packet(wmaxpacketsize) ((wmaxpacketsize) & 0x07ff) | ||
628 | |||
629 | /* | 631 | /* |
630 | * Returns true if frame1 index is greater than frame2 index. The comparison | 632 | * Returns true if frame1 index is greater than frame2 index. The comparison |
631 | * is done modulo FRLISTEN_64_SIZE. This accounts for the rollover of the | 633 | * is done modulo FRLISTEN_64_SIZE. This accounts for the rollover of the |
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c index 88b5dcf3aefc..a052d39b4375 100644 --- a/drivers/usb/dwc2/hcd_intr.c +++ b/drivers/usb/dwc2/hcd_intr.c | |||
@@ -1617,8 +1617,9 @@ static void dwc2_hc_ahberr_intr(struct dwc2_hsotg *hsotg, | |||
1617 | 1617 | ||
1618 | dev_err(hsotg->dev, " Speed: %s\n", speed); | 1618 | dev_err(hsotg->dev, " Speed: %s\n", speed); |
1619 | 1619 | ||
1620 | dev_err(hsotg->dev, " Max packet size: %d\n", | 1620 | dev_err(hsotg->dev, " Max packet size: %d (mult %d)\n", |
1621 | dwc2_hcd_get_mps(&urb->pipe_info)); | 1621 | dwc2_hcd_get_maxp(&urb->pipe_info), |
1622 | dwc2_hcd_get_maxp_mult(&urb->pipe_info)); | ||
1622 | dev_err(hsotg->dev, " Data buffer length: %d\n", urb->length); | 1623 | dev_err(hsotg->dev, " Data buffer length: %d\n", urb->length); |
1623 | dev_err(hsotg->dev, " Transfer buffer: %p, Transfer DMA: %08lx\n", | 1624 | dev_err(hsotg->dev, " Transfer buffer: %p, Transfer DMA: %08lx\n", |
1624 | urb->buf, (unsigned long)urb->dma); | 1625 | urb->buf, (unsigned long)urb->dma); |
diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c index ea3aa640c15c..68bbac64b753 100644 --- a/drivers/usb/dwc2/hcd_queue.c +++ b/drivers/usb/dwc2/hcd_queue.c | |||
@@ -708,7 +708,7 @@ static void dwc2_hs_pmap_unschedule(struct dwc2_hsotg *hsotg, | |||
708 | static int dwc2_uframe_schedule_split(struct dwc2_hsotg *hsotg, | 708 | static int dwc2_uframe_schedule_split(struct dwc2_hsotg *hsotg, |
709 | struct dwc2_qh *qh) | 709 | struct dwc2_qh *qh) |
710 | { | 710 | { |
711 | int bytecount = dwc2_hb_mult(qh->maxp) * dwc2_max_packet(qh->maxp); | 711 | int bytecount = qh->maxp_mult * qh->maxp; |
712 | int ls_search_slice; | 712 | int ls_search_slice; |
713 | int err = 0; | 713 | int err = 0; |
714 | int host_interval_in_sched; | 714 | int host_interval_in_sched; |
@@ -1332,7 +1332,7 @@ static int dwc2_check_max_xfer_size(struct dwc2_hsotg *hsotg, | |||
1332 | u32 max_channel_xfer_size; | 1332 | u32 max_channel_xfer_size; |
1333 | int status = 0; | 1333 | int status = 0; |
1334 | 1334 | ||
1335 | max_xfer_size = dwc2_max_packet(qh->maxp) * dwc2_hb_mult(qh->maxp); | 1335 | max_xfer_size = qh->maxp * qh->maxp_mult; |
1336 | max_channel_xfer_size = hsotg->params.max_transfer_size; | 1336 | max_channel_xfer_size = hsotg->params.max_transfer_size; |
1337 | 1337 | ||
1338 | if (max_xfer_size > max_channel_xfer_size) { | 1338 | if (max_xfer_size > max_channel_xfer_size) { |
@@ -1517,8 +1517,9 @@ static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, | |||
1517 | u32 prtspd = (hprt & HPRT0_SPD_MASK) >> HPRT0_SPD_SHIFT; | 1517 | u32 prtspd = (hprt & HPRT0_SPD_MASK) >> HPRT0_SPD_SHIFT; |
1518 | bool do_split = (prtspd == HPRT0_SPD_HIGH_SPEED && | 1518 | bool do_split = (prtspd == HPRT0_SPD_HIGH_SPEED && |
1519 | dev_speed != USB_SPEED_HIGH); | 1519 | dev_speed != USB_SPEED_HIGH); |
1520 | int maxp = dwc2_hcd_get_mps(&urb->pipe_info); | 1520 | int maxp = dwc2_hcd_get_maxp(&urb->pipe_info); |
1521 | int bytecount = dwc2_hb_mult(maxp) * dwc2_max_packet(maxp); | 1521 | int maxp_mult = dwc2_hcd_get_maxp_mult(&urb->pipe_info); |
1522 | int bytecount = maxp_mult * maxp; | ||
1522 | char *speed, *type; | 1523 | char *speed, *type; |
1523 | 1524 | ||
1524 | /* Initialize QH */ | 1525 | /* Initialize QH */ |
@@ -1531,6 +1532,7 @@ static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, | |||
1531 | 1532 | ||
1532 | qh->data_toggle = DWC2_HC_PID_DATA0; | 1533 | qh->data_toggle = DWC2_HC_PID_DATA0; |
1533 | qh->maxp = maxp; | 1534 | qh->maxp = maxp; |
1535 | qh->maxp_mult = maxp_mult; | ||
1534 | INIT_LIST_HEAD(&qh->qtd_list); | 1536 | INIT_LIST_HEAD(&qh->qtd_list); |
1535 | INIT_LIST_HEAD(&qh->qh_list_entry); | 1537 | INIT_LIST_HEAD(&qh->qh_list_entry); |
1536 | 1538 | ||