usb: xhci: Set 'Error Count' to 0 for isoch endpoints
authorBin Meng <bmeng.cn@gmail.com>
Mon, 18 Sep 2017 13:40:49 +0000 (06:40 -0700)
committerMarek Vasut <marex@denx.de>
Sun, 1 Oct 2017 14:32:54 +0000 (16:32 +0200)
Per xHCI spec, 'Error Count' should be set to 0 for isoch endpoints.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
drivers/usb/host/xhci.c

index dfb188d5e4681c1f468c89824cb452b8bb9c80ae..93737b083cb8a31023ef921aee3a8da399f711c1 100644 (file)
@@ -511,6 +511,7 @@ static int xhci_set_configuration(struct usb_device *udev)
        unsigned int mult;
        unsigned int max_burst;
        unsigned int avg_trb_len;
+       unsigned int err_count = 0;
 
        out_ctx = virt_dev->out_ctx;
        in_ctx = virt_dev->in_ctx;
@@ -588,9 +589,12 @@ static int xhci_set_configuration(struct usb_device *udev)
                        cpu_to_le32(MAX_PACKET
                        (get_unaligned(&endpt_desc->wMaxPacketSize)));
 
+               /* Allow 3 retries for everything but isoc, set CErr = 3 */
+               if (!usb_endpoint_xfer_isoc(endpt_desc))
+                       err_count = 3;
                ep_ctx[ep_index]->ep_info2 |=
                        cpu_to_le32(MAX_BURST(max_burst) |
-                       ((3 & ERROR_COUNT_MASK) << ERROR_COUNT_SHIFT));
+                       ERROR_COUNT(err_count));
 
                trb_64 = (uintptr_t)
                                virt_dev->eps[ep_index].ring->enqueue;