From 6aab5c47c21a6162c55d414ae0291c8fab3bb7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Wed, 31 Jul 2024 20:49:21 +0200 Subject: [PATCH] XHCI: define the SuperSpeedPlus ID for 10Gbps connection speed can be found on USB 3.1 xhci controllers in the PORTSC register Change-Id: I11df7e22ca1ab71b42325f8c3db1e4745287feeb Reviewed-on: https://review.haiku-os.org/c/haiku/+/7923 Haiku-Format: Haiku-format Bot Tested-by: Commit checker robot Reviewed-by: waddlesplash --- src/add-ons/kernel/bus_managers/usb/Device.cpp | 2 +- src/add-ons/kernel/bus_managers/usb/Hub.cpp | 2 +- src/add-ons/kernel/bus_managers/usb/Pipe.cpp | 2 ++ .../kernel/bus_managers/usb/Transfer.cpp | 1 + .../kernel/bus_managers/usb/usb_private.h | 3 ++- src/add-ons/kernel/busses/usb/xhci.cpp | 17 ++++++++++++----- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/usb/Device.cpp b/src/add-ons/kernel/bus_managers/usb/Device.cpp index 2ebca76d9e..7e59844a4d 100644 --- a/src/add-ons/kernel/bus_managers/usb/Device.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Device.cpp @@ -536,7 +536,7 @@ Device::InitEndpoints(int32 interfaceIndex) Pipe* pipe = NULL; usb_endpoint_ss_companion_descriptor* comp_descr = NULL; - if (fSpeed == USB_SPEED_SUPERSPEED) { + if (fSpeed >= USB_SPEED_SUPERSPEED) { // We should have a companion descriptor for this device. // Let's find it: it'll be the "i"th one. size_t k = 0; diff --git a/src/add-ons/kernel/bus_managers/usb/Hub.cpp b/src/add-ons/kernel/bus_managers/usb/Hub.cpp index 10cf558e8c..370a477589 100644 --- a/src/add-ons/kernel/bus_managers/usb/Hub.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Hub.cpp @@ -287,7 +287,7 @@ Hub::Explore(change_item **changeList) // transaction translator for the device. int8 hubAddress = HubAddress(); uint8 hubPort = HubPort(); - if (Speed() == USB_SPEED_HIGHSPEED || Speed() == USB_SPEED_SUPERSPEED) { + if (Speed() == USB_SPEED_HIGHSPEED || Speed() >= USB_SPEED_SUPERSPEED) { hubAddress = DeviceAddress(); hubPort = i + 1; } diff --git a/src/add-ons/kernel/bus_managers/usb/Pipe.cpp b/src/add-ons/kernel/bus_managers/usb/Pipe.cpp index cac95e3678..70ed4af57e 100644 --- a/src/add-ons/kernel/bus_managers/usb/Pipe.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Pipe.cpp @@ -192,6 +192,7 @@ BulkPipe::InitCommon(int8 deviceAddress, uint8 endpointAddress, maxPacketSize = 512; break; case USB_SPEED_SUPERSPEED: + case USB_SPEED_SUPERSPEEDPLUS: maxPacketSize = 1024; break; @@ -400,6 +401,7 @@ ControlPipe::InitCommon(int8 deviceAddress, uint8 endpointAddress, maxPacketSize = 64; break; case USB_SPEED_SUPERSPEED: + case USB_SPEED_SUPERSPEEDPLUS: maxPacketSize = 512; break; diff --git a/src/add-ons/kernel/bus_managers/usb/Transfer.cpp b/src/add-ons/kernel/bus_managers/usb/Transfer.cpp index 268c17bfd8..6a725f744d 100644 --- a/src/add-ons/kernel/bus_managers/usb/Transfer.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Transfer.cpp @@ -303,6 +303,7 @@ Transfer::_CalculateBandwidth() } case USB_SPEED_SUPERSPEED: + case USB_SPEED_SUPERSPEEDPLUS: { // TODO it should only be useful for isochronous type bandwidthNS = 0; diff --git a/src/add-ons/kernel/bus_managers/usb/usb_private.h b/src/add-ons/kernel/bus_managers/usb/usb_private.h index dbad91b16c..52c751a775 100644 --- a/src/add-ons/kernel/bus_managers/usb/usb_private.h +++ b/src/add-ons/kernel/bus_managers/usb/usb_private.h @@ -101,7 +101,8 @@ typedef enum { USB_SPEED_FULLSPEED, USB_SPEED_HIGHSPEED, USB_SPEED_SUPERSPEED, - USB_SPEED_MAX = USB_SPEED_SUPERSPEED + USB_SPEED_SUPERSPEEDPLUS, + USB_SPEED_MAX = USB_SPEED_SUPERSPEEDPLUS } usb_speed; diff --git a/src/add-ons/kernel/busses/usb/xhci.cpp b/src/add-ons/kernel/busses/usb/xhci.cpp index 8efc6bdada..598d8344f2 100644 --- a/src/add-ons/kernel/busses/usb/xhci.cpp +++ b/src/add-ons/kernel/busses/usb/xhci.cpp @@ -1596,6 +1596,9 @@ XHCI::AllocateDevice(Hub *parent, int8 hubAddress, uint8 hubPort, case USB_SPEED_SUPERSPEED: dwslot0 |= SLOT_0_SPEED(4); break; + case USB_SPEED_SUPERSPEEDPLUS: + dwslot0 |= SLOT_0_SPEED(5); + break; default: TRACE_ERROR("unknown usb speed\n"); break; @@ -2198,6 +2201,7 @@ XHCI::ConfigureEndpoint(xhci_endpoint* ep, uint8 slot, uint8 number, uint8 type, case USB_SPEED_HIGHSPEED: case USB_SPEED_SUPERSPEED: + case USB_SPEED_SUPERSPEEDPLUS: default: // Convert 1-16 into 0-15. calcInterval = min_c(max_c(interval, 1), 16) - 1; @@ -2216,7 +2220,7 @@ XHCI::ConfigureEndpoint(xhci_endpoint* ep, uint8 slot, uint8 number, uint8 type, if (speed == USB_SPEED_HIGHSPEED && (type & (USB_OBJECT_INTERRUPT_PIPE | USB_OBJECT_ISO_PIPE)) != 0) { maxBurst = (maxPacketSize & 0x1800) >> 11; - } else if (speed != USB_SPEED_SUPERSPEED) { + } else if (speed < USB_SPEED_SUPERSPEED) { maxBurst = 0; } dwendpoint1 |= ENDPOINT_1_MAXBURST(maxBurst); @@ -2255,7 +2259,7 @@ XHCI::ConfigureEndpoint(xhci_endpoint* ep, uint8 slot, uint8 number, uint8 type, // for isochronous endpoints that specifies the maximum ESIT payload. // We don't fetch this yet, so just fall back to the USB2 computation // method if bytesPerInterval is 0. - if (speed == USB_SPEED_SUPERSPEED && bytesPerInterval != 0) + if (speed >= USB_SPEED_SUPERSPEED && bytesPerInterval != 0) dwendpoint4 |= ENDPOINT_4_MAXESITPAYLOAD(bytesPerInterval); else if (speed >= USB_SPEED_HIGHSPEED) dwendpoint4 |= ENDPOINT_4_MAXESITPAYLOAD((maxBurst + 1) * maxPacketSize); @@ -2302,6 +2306,9 @@ XHCI::GetPortSpeed(uint8 index, usb_speed* speed) case 4: *speed = USB_SPEED_SUPERSPEED; break; + case 5: + *speed = USB_SPEED_SUPERSPEEDPLUS; + break; default: TRACE_ALWAYS("nonstandard port speed %" B_PRId32 ", assuming SuperSpeed\n", PS_SPEED_GET(portStatus)); @@ -2344,12 +2351,12 @@ XHCI::GetPortStatus(uint8 index, usb_port_status* status) if (portStatus & PS_PR) status->status |= PORT_STATUS_RESET; if (portStatus & PS_PP) { - if (fPortSpeeds[index] == USB_SPEED_SUPERSPEED) + if (fPortSpeeds[index] >= USB_SPEED_SUPERSPEED) status->status |= PORT_STATUS_SS_POWER; else status->status |= PORT_STATUS_POWER; } - if (fPortSpeeds[index] == USB_SPEED_SUPERSPEED) + if (fPortSpeeds[index] >= USB_SPEED_SUPERSPEED) status->status |= portStatus & PS_PLS_MASK; // build the change @@ -2362,7 +2369,7 @@ XHCI::GetPortStatus(uint8 index, usb_port_status* status) if (portStatus & PS_PRC) status->change |= PORT_STATUS_RESET; - if (fPortSpeeds[index] == USB_SPEED_SUPERSPEED) { + if (fPortSpeeds[index] >= USB_SPEED_SUPERSPEED) { if (portStatus & PS_PLC) status->change |= PORT_CHANGE_LINK_STATE; if (portStatus & PS_WRC)