Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: xhci-mtk: supports SSP without external USB3 gen2 hub

Supports SSP scheduling only for SSP device directly connected
to root hub but not through external USB3 gen2 hub which need
use a new scheduling way.

Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Chunfeng Yun and committed by
Greg Kroah-Hartman
e995dcca 08e469de

+11 -6
+11 -6
drivers/usb/host/xhci-mtk-sch.c
··· 13 13 #include "xhci.h" 14 14 #include "xhci-mtk.h" 15 15 16 + #define SSP_BW_BOUNDARY 130000 16 17 #define SS_BW_BOUNDARY 51000 17 18 /* table 5-5. High-speed Isoc Transaction Limits in usb_20 spec */ 18 19 #define HS_BW_BOUNDARY 6144 ··· 26 25 #define TT_MICROFRAMES_MAX 9 27 26 28 27 /* mtk scheduler bitmasks */ 29 - #define EP_BPKTS(p) ((p) & 0x3f) 28 + #define EP_BPKTS(p) ((p) & 0x7f) 30 29 #define EP_BCSCOUNT(p) (((p) & 0x7) << 8) 31 30 #define EP_BBM(p) ((p) << 11) 32 31 #define EP_BOFFSET(p) ((p) & 0x3fff) ··· 57 56 58 57 virt_dev = xhci->devs[udev->slot_id]; 59 58 60 - if (udev->speed == USB_SPEED_SUPER) { 59 + if (udev->speed >= USB_SPEED_SUPER) { 61 60 if (usb_endpoint_dir_out(&ep->desc)) 62 61 bw_index = (virt_dev->real_port - 1) * 2; 63 62 else ··· 178 177 179 178 if (is_fs_or_ls(udev->speed)) 180 179 len_bw_budget_table = TT_MICROFRAMES_MAX; 181 - else if ((udev->speed == USB_SPEED_SUPER) 180 + else if ((udev->speed >= USB_SPEED_SUPER) 182 181 && usb_endpoint_xfer_isoc(&ep->desc)) 183 182 len_bw_budget_table = get_esit(ep_ctx); 184 183 else ··· 250 249 sch_ep->pkts = max_burst + 1; 251 250 sch_ep->bw_cost_per_microframe = maxpkt * sch_ep->pkts; 252 251 bwb_table[0] = sch_ep->bw_cost_per_microframe; 253 - } else if (udev->speed == USB_SPEED_SUPER) { 252 + } else if (udev->speed >= USB_SPEED_SUPER) { 254 253 /* usb3_r1 spec section4.4.7 & 4.4.8 */ 255 254 sch_ep->cs_count = 0; 256 255 sch_ep->burst_mode = 1; ··· 512 511 break; 513 512 } 514 513 515 - bw_boundary = (udev->speed == USB_SPEED_SUPER) 516 - ? SS_BW_BOUNDARY : HS_BW_BOUNDARY; 514 + if (udev->speed == USB_SPEED_SUPER_PLUS) 515 + bw_boundary = SSP_BW_BOUNDARY; 516 + else if (udev->speed == USB_SPEED_SUPER) 517 + bw_boundary = SS_BW_BOUNDARY; 518 + else 519 + bw_boundary = HS_BW_BOUNDARY; 517 520 518 521 /* check bandwidth */ 519 522 if (min_bw > bw_boundary)