]> git.itanic.dy.fi Git - linux-stable/commitdiff
usb: xhci-mtk: add only one extra CS for FS/LS INTR
authorChunfeng Yun <chunfeng.yun@mediatek.com>
Mon, 8 Mar 2021 02:51:53 +0000 (10:51 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Sep 2022 09:04:01 +0000 (11:04 +0200)
[ Upstream commit 1bf661daf6b084bc4d753f55b54f35dc98709685 ]

In USB2 Spec:
"11.18.5 TT Response Generation
In general, there will be two (or more) complete-split
transactions scheduled for a periodic endpoint.
However, for interrupt endpoints, the maximum size of
the full-/low-speed transaction guarantees that it can
never require more than two complete-split transactions.
Two complete-split transactions are only required
when the transaction spans a microframe boundary."

Due to the maxp is 64, and less then 188 (at most in one
microframe), seems never span boundary, so use only one CS
for FS/LS interrupt transfer, this will save some bandwidth.

Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
Link: https://lore.kernel.org/r/5b9ff09f53d23cf9e5c5437db4ffc18b798bf60c.1615170625.git.chunfeng.yun@mediatek.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Stable-dep-of: 548011957d1d ("usb: xhci-mtk: relax TT periodic bandwidth allocation")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/host/xhci-mtk-sch.c

index 450fa22b7dc76821dcbf4de869060d49aa41963b..59ba25ca018d5db198f08dbfccd4c4e12d81433e 100644 (file)
@@ -408,13 +408,11 @@ static int check_sch_tt(struct usb_device *udev,
 {
        struct mu3h_sch_tt *tt = sch_ep->sch_tt;
        u32 extra_cs_count;
-       u32 fs_budget_start;
        u32 start_ss, last_ss;
        u32 start_cs, last_cs;
        int i;
 
        start_ss = offset % 8;
-       fs_budget_start = (start_ss + 1) % 8;
 
        if (sch_ep->ep_type == ISOC_OUT_EP) {
                last_ss = start_ss + sch_ep->cs_count - 1;
@@ -450,16 +448,14 @@ static int check_sch_tt(struct usb_device *udev,
                if (sch_ep->ep_type == ISOC_IN_EP)
                        extra_cs_count = (last_cs == 7) ? 1 : 2;
                else /*  ep_type : INTR IN / INTR OUT */
-                       extra_cs_count = (fs_budget_start == 6) ? 1 : 2;
+                       extra_cs_count = 1;
 
                cs_count += extra_cs_count;
                if (cs_count > 7)
                        cs_count = 7; /* HW limit */
 
-               for (i = 0; i < cs_count + 2; i++) {
-                       if (test_bit(offset + i, tt->ss_bit_map))
-                               return -ERANGE;
-               }
+               if (test_bit(offset, tt->ss_bit_map))
+                       return -ERANGE;
 
                sch_ep->cs_count = cs_count;
                /* one for ss, the other for idle */