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 <[email protected]>
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Jérôme Duval
2024-08-01 04:24:54 +00:00
committed by waddlesplash
parent 0f73d13bda
commit 6aab5c47c2
6 changed files with 19 additions and 8 deletions
@@ -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;
+1 -1
View File
@@ -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;
}
@@ -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;
@@ -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;
@@ -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;
+12 -5
View File
@@ -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)