aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunfeng Yun <chunfeng.yun@mediatek.com>2018-09-20 12:13:35 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-09-28 09:04:45 -0400
commite995dccadaf99e216cf5410463941d978c455c58 (patch)
tree956de600400325e9efe8b3fa0284d9d5de22a5ab
parent08e469de87a2534fda7a4605d33a2f287bd74684 (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.c17
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)