lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 036/120] usb: xhci-mtk: add only one extra CS for FS/LS INTR
    Date
    From: Chunfeng Yun <chunfeng.yun@mediatek.com>

    [ 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 | 10 +++-------
    1 file changed, 3 insertions(+), 7 deletions(-)

    diff --git a/drivers/usb/host/xhci-mtk-sch.c b/drivers/usb/host/xhci-mtk-sch.c
    index 450fa22b7dc7..59ba25ca018d 100644
    --- a/drivers/usb/host/xhci-mtk-sch.c
    +++ b/drivers/usb/host/xhci-mtk-sch.c
    @@ -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 */
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-09-26 12:41    [W:4.153 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site