diff options
author | Chunfeng Yun <chunfeng.yun@mediatek.com> | 2018-09-20 12:13:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-28 09:04:45 -0400 |
commit | e995dccadaf99e216cf5410463941d978c455c58 (patch) | |
tree | 956de600400325e9efe8b3fa0284d9d5de22a5ab | |
parent | 08e469de87a2534fda7a4605d33a2f287bd74684 (diff) |
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>
-rw-r--r-- | drivers/usb/host/xhci-mtk-sch.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/usb/host/xhci-mtk-sch.c b/drivers/usb/host/xhci-mtk-sch.c index 36050a1f8037..fea555570ad4 100644 --- a/drivers/usb/host/xhci-mtk-sch.c +++ b/drivers/usb/host/xhci-mtk-sch.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include "xhci.h" | 13 | #include "xhci.h" |
14 | #include "xhci-mtk.h" | 14 | #include "xhci-mtk.h" |
15 | 15 | ||
16 | #define SSP_BW_BOUNDARY 130000 | ||
16 | #define SS_BW_BOUNDARY 51000 | 17 | #define SS_BW_BOUNDARY 51000 |
17 | /* table 5-5. High-speed Isoc Transaction Limits in usb_20 spec */ | 18 | /* table 5-5. High-speed Isoc Transaction Limits in usb_20 spec */ |
18 | #define HS_BW_BOUNDARY 6144 | 19 | #define HS_BW_BOUNDARY 6144 |
@@ -25,7 +26,7 @@ | |||
25 | #define TT_MICROFRAMES_MAX 9 | 26 | #define TT_MICROFRAMES_MAX 9 |
26 | 27 | ||
27 | /* mtk scheduler bitmasks */ | 28 | /* mtk scheduler bitmasks */ |
28 | #define EP_BPKTS(p) ((p) & 0x3f) | 29 | #define EP_BPKTS(p) ((p) & 0x7f) |
29 | #define EP_BCSCOUNT(p) (((p) & 0x7) << 8) | 30 | #define EP_BCSCOUNT(p) (((p) & 0x7) << 8) |
30 | #define EP_BBM(p) ((p) << 11) | 31 | #define EP_BBM(p) ((p) << 11) |
31 | #define EP_BOFFSET(p) ((p) & 0x3fff) | 32 | #define EP_BOFFSET(p) ((p) & 0x3fff) |
@@ -56,7 +57,7 @@ static int get_bw_index(struct xhci_hcd *xhci, struct usb_device *udev, | |||
56 | 57 | ||
57 | virt_dev = xhci->devs[udev->slot_id]; | 58 | virt_dev = xhci->devs[udev->slot_id]; |
58 | 59 | ||
59 | if (udev->speed == USB_SPEED_SUPER) { | 60 | if (udev->speed >= USB_SPEED_SUPER) { |
60 | if (usb_endpoint_dir_out(&ep->desc)) | 61 | if (usb_endpoint_dir_out(&ep->desc)) |
61 | bw_index = (virt_dev->real_port - 1) * 2; | 62 | bw_index = (virt_dev->real_port - 1) * 2; |
62 | else | 63 | else |
@@ -177,7 +178,7 @@ static struct mu3h_sch_ep_info *create_sch_ep(struct usb_device *udev, | |||
177 | 178 | ||
178 | if (is_fs_or_ls(udev->speed)) | 179 | if (is_fs_or_ls(udev->speed)) |
179 | len_bw_budget_table = TT_MICROFRAMES_MAX; | 180 | len_bw_budget_table = TT_MICROFRAMES_MAX; |
180 | else if ((udev->speed == USB_SPEED_SUPER) | 181 | else if ((udev->speed >= USB_SPEED_SUPER) |
181 | && usb_endpoint_xfer_isoc(&ep->desc)) | 182 | && usb_endpoint_xfer_isoc(&ep->desc)) |
182 | len_bw_budget_table = get_esit(ep_ctx); | 183 | len_bw_budget_table = get_esit(ep_ctx); |
183 | else | 184 | else |
@@ -249,7 +250,7 @@ static void setup_sch_info(struct usb_device *udev, | |||
249 | sch_ep->pkts = max_burst + 1; | 250 | sch_ep->pkts = max_burst + 1; |
250 | sch_ep->bw_cost_per_microframe = maxpkt * sch_ep->pkts; | 251 | sch_ep->bw_cost_per_microframe = maxpkt * sch_ep->pkts; |
251 | bwb_table[0] = sch_ep->bw_cost_per_microframe; | 252 | bwb_table[0] = sch_ep->bw_cost_per_microframe; |
252 | } else if (udev->speed == USB_SPEED_SUPER) { | 253 | } else if (udev->speed >= USB_SPEED_SUPER) { |
253 | /* usb3_r1 spec section4.4.7 & 4.4.8 */ | 254 | /* usb3_r1 spec section4.4.7 & 4.4.8 */ |
254 | sch_ep->cs_count = 0; | 255 | sch_ep->cs_count = 0; |
255 | sch_ep->burst_mode = 1; | 256 | sch_ep->burst_mode = 1; |
@@ -511,8 +512,12 @@ static int check_sch_bw(struct usb_device *udev, | |||
511 | break; | 512 | break; |
512 | } | 513 | } |
513 | 514 | ||
514 | bw_boundary = (udev->speed == USB_SPEED_SUPER) | 515 | if (udev->speed == USB_SPEED_SUPER_PLUS) |
515 | ? SS_BW_BOUNDARY : HS_BW_BOUNDARY; | 516 | bw_boundary = SSP_BW_BOUNDARY; |
517 | else if (udev->speed == USB_SPEED_SUPER) | ||
518 | bw_boundary = SS_BW_BOUNDARY; | ||
519 | else | ||
520 | bw_boundary = HS_BW_BOUNDARY; | ||
516 | 521 | ||
517 | /* check bandwidth */ | 522 | /* check bandwidth */ |
518 | if (min_bw > bw_boundary) | 523 | if (min_bw > bw_boundary) |