|
@@ -112,7 +112,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,
|
|
|
|
|
|
/* If PSI table exists, add the custom speed attributes from it */
|
|
|
if (usb3_1 && xhci->usb3_rhub.psi_count) {
|
|
|
- u32 ssp_cap_base, bm_attrib, psi;
|
|
|
+ u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp;
|
|
|
int offset;
|
|
|
|
|
|
ssp_cap_base = USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE;
|
|
@@ -139,6 +139,15 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,
|
|
|
for (i = 0; i < xhci->usb3_rhub.psi_count; i++) {
|
|
|
psi = xhci->usb3_rhub.psi[i];
|
|
|
psi &= ~USB_SSP_SUBLINK_SPEED_RSVD;
|
|
|
+ psi_exp = XHCI_EXT_PORT_PSIE(psi);
|
|
|
+ psi_mant = XHCI_EXT_PORT_PSIM(psi);
|
|
|
+
|
|
|
+ /* Shift to Gbps and set SSP Link BIT(14) if 10Gpbs */
|
|
|
+ for (; psi_exp < 3; psi_exp++)
|
|
|
+ psi_mant /= 1000;
|
|
|
+ if (psi_mant >= 10)
|
|
|
+ psi |= BIT(14);
|
|
|
+
|
|
|
if ((psi & PLT_MASK) == PLT_SYM) {
|
|
|
/* Symmetric, create SSA RX and TX from one PSI entry */
|
|
|
put_unaligned_le32(psi, &buf[offset]);
|