mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
xhci: set pls in xhci_port_update & xhci_port_reset
Set the port link state to the correct values in xhci_port_update and xhci_port_reset functions. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
40030130d1
commit
b62b08282d
1 changed files with 24 additions and 2 deletions
|
@ -2365,33 +2365,55 @@ static void xhci_port_notify(XHCIPort *port, uint32_t bits)
|
||||||
|
|
||||||
static void xhci_port_update(XHCIPort *port, int is_detach)
|
static void xhci_port_update(XHCIPort *port, int is_detach)
|
||||||
{
|
{
|
||||||
|
uint32_t pls = PLS_RX_DETECT;
|
||||||
|
|
||||||
port->portsc = PORTSC_PP;
|
port->portsc = PORTSC_PP;
|
||||||
if (!is_detach && xhci_port_have_device(port)) {
|
if (!is_detach && xhci_port_have_device(port)) {
|
||||||
port->portsc |= PORTSC_CCS;
|
port->portsc |= PORTSC_CCS;
|
||||||
switch (port->uport->dev->speed) {
|
switch (port->uport->dev->speed) {
|
||||||
case USB_SPEED_LOW:
|
case USB_SPEED_LOW:
|
||||||
port->portsc |= PORTSC_SPEED_LOW;
|
port->portsc |= PORTSC_SPEED_LOW;
|
||||||
|
pls = PLS_POLLING;
|
||||||
break;
|
break;
|
||||||
case USB_SPEED_FULL:
|
case USB_SPEED_FULL:
|
||||||
port->portsc |= PORTSC_SPEED_FULL;
|
port->portsc |= PORTSC_SPEED_FULL;
|
||||||
|
pls = PLS_POLLING;
|
||||||
break;
|
break;
|
||||||
case USB_SPEED_HIGH:
|
case USB_SPEED_HIGH:
|
||||||
port->portsc |= PORTSC_SPEED_HIGH;
|
port->portsc |= PORTSC_SPEED_HIGH;
|
||||||
|
pls = PLS_POLLING;
|
||||||
break;
|
break;
|
||||||
case USB_SPEED_SUPER:
|
case USB_SPEED_SUPER:
|
||||||
port->portsc |= PORTSC_SPEED_SUPER;
|
port->portsc |= PORTSC_SPEED_SUPER;
|
||||||
|
port->portsc |= PORTSC_PED;
|
||||||
|
pls = PLS_U0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
set_field(&port->portsc, pls, PORTSC_PLS);
|
||||||
xhci_port_notify(port, PORTSC_CSC);
|
xhci_port_notify(port, PORTSC_CSC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xhci_port_reset(XHCIPort *port)
|
static void xhci_port_reset(XHCIPort *port)
|
||||||
{
|
{
|
||||||
DPRINTF("xhci: port %d reset\n", port);
|
DPRINTF("xhci: port %d reset\n", port);
|
||||||
|
if (!xhci_port_have_device(port)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
usb_device_reset(port->uport->dev);
|
usb_device_reset(port->uport->dev);
|
||||||
port->portsc |= PORTSC_PRC | PORTSC_PED;
|
|
||||||
|
switch (port->uport->dev->speed) {
|
||||||
|
case USB_SPEED_LOW:
|
||||||
|
case USB_SPEED_FULL:
|
||||||
|
case USB_SPEED_HIGH:
|
||||||
|
set_field(&port->portsc, PLS_U0, PORTSC_PLS);
|
||||||
|
port->portsc |= PORTSC_PED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
port->portsc &= ~PORTSC_PR;
|
||||||
|
xhci_port_notify(port, PORTSC_PRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xhci_reset(DeviceState *dev)
|
static void xhci_reset(DeviceState *dev)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue