xhci: order superspeed ports first
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									7bd3055ffd
								
							
						
					
					
						commit
						7bafd8889e
					
				@ -498,6 +498,7 @@ typedef struct XHCIEvRingSeg {
 | 
				
			|||||||
enum xhci_flags {
 | 
					enum xhci_flags {
 | 
				
			||||||
    XHCI_FLAG_USE_MSI = 1,
 | 
					    XHCI_FLAG_USE_MSI = 1,
 | 
				
			||||||
    XHCI_FLAG_USE_MSI_X,
 | 
					    XHCI_FLAG_USE_MSI_X,
 | 
				
			||||||
 | 
					    XHCI_FLAG_SS_FIRST,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
 | 
					static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
 | 
				
			||||||
@ -714,10 +715,18 @@ static XHCIPort *xhci_lookup_port(XHCIState *xhci, struct USBPort *uport)
 | 
				
			|||||||
    case USB_SPEED_LOW:
 | 
					    case USB_SPEED_LOW:
 | 
				
			||||||
    case USB_SPEED_FULL:
 | 
					    case USB_SPEED_FULL:
 | 
				
			||||||
    case USB_SPEED_HIGH:
 | 
					    case USB_SPEED_HIGH:
 | 
				
			||||||
        index = uport->index;
 | 
					        if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
 | 
				
			||||||
 | 
					            index = uport->index + xhci->numports_3;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            index = uport->index;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case USB_SPEED_SUPER:
 | 
					    case USB_SPEED_SUPER:
 | 
				
			||||||
        index = uport->index + xhci->numports_2;
 | 
					        if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
 | 
				
			||||||
 | 
					            index = uport->index;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            index = uport->index + xhci->numports_2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
@ -2972,7 +2981,11 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, unsigned size)
 | 
				
			|||||||
        ret = 0x20425355; /* "USB " */
 | 
					        ret = 0x20425355; /* "USB " */
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 0x28: /* Supported Protocol:08 */
 | 
					    case 0x28: /* Supported Protocol:08 */
 | 
				
			||||||
        ret = 0x00000001 | (xhci->numports_2<<8);
 | 
					        if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
 | 
				
			||||||
 | 
					            ret = (xhci->numports_2<<8) | (xhci->numports_3+1);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            ret = (xhci->numports_2<<8) | 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 0x2c: /* Supported Protocol:0c */
 | 
					    case 0x2c: /* Supported Protocol:0c */
 | 
				
			||||||
        ret = 0x00000000; /* reserved */
 | 
					        ret = 0x00000000; /* reserved */
 | 
				
			||||||
@ -2984,7 +2997,11 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, unsigned size)
 | 
				
			|||||||
        ret = 0x20425355; /* "USB " */
 | 
					        ret = 0x20425355; /* "USB " */
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 0x38: /* Supported Protocol:08 */
 | 
					    case 0x38: /* Supported Protocol:08 */
 | 
				
			||||||
        ret = 0x00000000 | (xhci->numports_2+1) | (xhci->numports_3<<8);
 | 
					        if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
 | 
				
			||||||
 | 
					            ret = (xhci->numports_3<<8) | 1;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            ret = (xhci->numports_3<<8) | (xhci->numports_2+1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 0x3c: /* Supported Protocol:0c */
 | 
					    case 0x3c: /* Supported Protocol:0c */
 | 
				
			||||||
        ret = 0x00000000; /* reserved */
 | 
					        ret = 0x00000000; /* reserved */
 | 
				
			||||||
@ -3517,8 +3534,13 @@ static void usb_xhci_init(XHCIState *xhci)
 | 
				
			|||||||
    for (i = 0; i < usbports; i++) {
 | 
					    for (i = 0; i < usbports; i++) {
 | 
				
			||||||
        speedmask = 0;
 | 
					        speedmask = 0;
 | 
				
			||||||
        if (i < xhci->numports_2) {
 | 
					        if (i < xhci->numports_2) {
 | 
				
			||||||
            port = &xhci->ports[i];
 | 
					            if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
 | 
				
			||||||
            port->portnr = i + 1;
 | 
					                port = &xhci->ports[i + xhci->numports_3];
 | 
				
			||||||
 | 
					                port->portnr = i + 1 + xhci->numports_3;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                port = &xhci->ports[i];
 | 
				
			||||||
 | 
					                port->portnr = i + 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            port->uport = &xhci->uports[i];
 | 
					            port->uport = &xhci->uports[i];
 | 
				
			||||||
            port->speedmask =
 | 
					            port->speedmask =
 | 
				
			||||||
                USB_SPEED_MASK_LOW  |
 | 
					                USB_SPEED_MASK_LOW  |
 | 
				
			||||||
@ -3528,8 +3550,13 @@ static void usb_xhci_init(XHCIState *xhci)
 | 
				
			|||||||
            speedmask |= port->speedmask;
 | 
					            speedmask |= port->speedmask;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (i < xhci->numports_3) {
 | 
					        if (i < xhci->numports_3) {
 | 
				
			||||||
            port = &xhci->ports[i + xhci->numports_2];
 | 
					            if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
 | 
				
			||||||
            port->portnr = i + 1 + xhci->numports_2;
 | 
					                port = &xhci->ports[i];
 | 
				
			||||||
 | 
					                port->portnr = i + 1;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                port = &xhci->ports[i + xhci->numports_2];
 | 
				
			||||||
 | 
					                port->portnr = i + 1 + xhci->numports_2;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            port->uport = &xhci->uports[i];
 | 
					            port->uport = &xhci->uports[i];
 | 
				
			||||||
            port->speedmask = USB_SPEED_MASK_SUPER;
 | 
					            port->speedmask = USB_SPEED_MASK_SUPER;
 | 
				
			||||||
            snprintf(port->name, sizeof(port->name), "usb3 port #%d", i+1);
 | 
					            snprintf(port->name, sizeof(port->name), "usb3 port #%d", i+1);
 | 
				
			||||||
@ -3788,6 +3815,8 @@ static const VMStateDescription vmstate_xhci = {
 | 
				
			|||||||
static Property xhci_properties[] = {
 | 
					static Property xhci_properties[] = {
 | 
				
			||||||
    DEFINE_PROP_BIT("msi",      XHCIState, flags, XHCI_FLAG_USE_MSI, true),
 | 
					    DEFINE_PROP_BIT("msi",      XHCIState, flags, XHCI_FLAG_USE_MSI, true),
 | 
				
			||||||
    DEFINE_PROP_BIT("msix",     XHCIState, flags, XHCI_FLAG_USE_MSI_X, true),
 | 
					    DEFINE_PROP_BIT("msix",     XHCIState, flags, XHCI_FLAG_USE_MSI_X, true),
 | 
				
			||||||
 | 
					    DEFINE_PROP_BIT("superspeed-ports-first",
 | 
				
			||||||
 | 
					                    XHCIState, flags, XHCI_FLAG_SS_FIRST, true),
 | 
				
			||||||
    DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
 | 
					    DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
 | 
				
			||||||
    DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
 | 
					    DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
 | 
				
			||||||
    DEFINE_PROP_UINT32("p2",    XHCIState, numports_2, 4),
 | 
					    DEFINE_PROP_UINT32("p2",    XHCIState, numports_2, 4),
 | 
				
			||||||
 | 
				
			|||||||
@ -271,6 +271,10 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
 | 
				
			|||||||
            .driver   = "apic",\
 | 
					            .driver   = "apic",\
 | 
				
			||||||
            .property = "version",\
 | 
					            .property = "version",\
 | 
				
			||||||
            .value    = stringify(0x11),\
 | 
					            .value    = stringify(0x11),\
 | 
				
			||||||
 | 
					        },{\
 | 
				
			||||||
 | 
					            .driver   = "nec-usb-xhci",\
 | 
				
			||||||
 | 
					            .property = "superspeed-ports-first",\
 | 
				
			||||||
 | 
					            .value    = "off",\
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PC_COMPAT_1_7 \
 | 
					#define PC_COMPAT_1_7 \
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user