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:
committed by
waddlesplash
parent
0f73d13bda
commit
6aab5c47c2
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user