On 25.01.2015 10:13, Sneeker Yeh wrote: Oh, and one more thing:
> > +static void xhci_try_to_clear_csc(struct usb_hcd *hcd, int dev_port_num) > +{ > + int max_ports; > + struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + __le32 __iomem **port_array; > + u32 status; > + > + /* print debug info */ > + if (hcd->speed == HCD_USB3) { > + max_ports = xhci->num_usb3_ports; > + port_array = xhci->usb3_ports; > + } else { > + max_ports = xhci->num_usb2_ports; > + port_array = xhci->usb2_ports; > + } > + > + if (dev_port_num > max_ports) { > + xhci_err(xhci, "%s() port number invalid", __func__); > + return; > + } > + status = readl(port_array[dev_port_num - 1]); > + > + /* write 1 to clear */ > + if (!(status & PORT_CONNECT) && (status & PORT_CSC)) > + writel(status & PORT_CSC, port_array[0]); We don't want to write back all the bits we read from the PORTSC register. Use the xhci_put_state_to_neutral(status) helper function to mask out some RW1C bits. This in addition to writing to the correct PORTSC register as I previously mentioned. -Mathias -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html