hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/thunderbolt/usb4.c
....@@ -1636,18 +1636,30 @@
16361636 int downstream_bw)
16371637 {
16381638 u32 val, ubw, dbw, scale;
1639
- int ret;
1639
+ int ret, max_bw;
16401640
1641
- /* Read the used scale, hardware default is 0 */
1642
- ret = tb_port_read(port, &scale, TB_CFG_PORT,
1643
- port->cap_adap + ADP_USB3_CS_3, 1);
1641
+ /* Figure out suitable scale */
1642
+ scale = 0;
1643
+ max_bw = max(upstream_bw, downstream_bw);
1644
+ while (scale < 64) {
1645
+ if (mbps_to_usb3_bw(max_bw, scale) < 4096)
1646
+ break;
1647
+ scale++;
1648
+ }
1649
+
1650
+ if (WARN_ON(scale >= 64))
1651
+ return -EINVAL;
1652
+
1653
+ ret = tb_port_write(port, &scale, TB_CFG_PORT,
1654
+ port->cap_adap + ADP_USB3_CS_3, 1);
16441655 if (ret)
16451656 return ret;
16461657
1647
- scale &= ADP_USB3_CS_3_SCALE_MASK;
16481658 ubw = mbps_to_usb3_bw(upstream_bw, scale);
16491659 dbw = mbps_to_usb3_bw(downstream_bw, scale);
16501660
1661
+ tb_port_dbg(port, "scaled bandwidth %u/%u, scale %u\n", ubw, dbw, scale);
1662
+
16511663 ret = tb_port_read(port, &val, TB_CFG_PORT,
16521664 port->cap_adap + ADP_USB3_CS_2, 1);
16531665 if (ret)