|
@@ -387,6 +387,10 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue,
|
|
|
status = PORT_PLC;
|
|
|
port_change_bit = "link state";
|
|
|
break;
|
|
|
+ case USB_PORT_FEAT_C_PORT_CONFIG_ERROR:
|
|
|
+ status = PORT_CEC;
|
|
|
+ port_change_bit = "config error";
|
|
|
+ break;
|
|
|
default:
|
|
|
/* Should never happen */
|
|
|
return;
|
|
@@ -588,6 +592,8 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
|
|
|
status |= USB_PORT_STAT_C_LINK_STATE << 16;
|
|
|
if ((raw_port_status & PORT_WRC))
|
|
|
status |= USB_PORT_STAT_C_BH_RESET << 16;
|
|
|
+ if ((raw_port_status & PORT_CEC))
|
|
|
+ status |= USB_PORT_STAT_C_CONFIG_ERROR << 16;
|
|
|
}
|
|
|
|
|
|
if (hcd->speed != HCD_USB3) {
|
|
@@ -1005,6 +1011,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
case USB_PORT_FEAT_C_OVER_CURRENT:
|
|
|
case USB_PORT_FEAT_C_ENABLE:
|
|
|
case USB_PORT_FEAT_C_PORT_LINK_STATE:
|
|
|
+ case USB_PORT_FEAT_C_PORT_CONFIG_ERROR:
|
|
|
xhci_clear_port_change_bit(xhci, wValue, wIndex,
|
|
|
port_array[wIndex], temp);
|
|
|
break;
|
|
@@ -1069,7 +1076,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|
|
*/
|
|
|
status = bus_state->resuming_ports;
|
|
|
|
|
|
- mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC;
|
|
|
+ mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC | PORT_CEC;
|
|
|
|
|
|
spin_lock_irqsave(&xhci->lock, flags);
|
|
|
/* For each port, did anything change? If so, set that bit in buf. */
|