usb: xhci-mtk: add only one extra CS for FS/LS INTR
[ 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>
This commit is contained in:
parent
b1e11bc66c
commit
a2566a8dc5
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user