This should be caught on the suspend side so
that you can still service the ports that do not
have the over current condition.
A single port in OC makes resume unreliable,
so the only thing to do is not suspend.
The following worked for me:
static int suspend_allowed(struct uhci_hcd *uhci)
{
unsigned int io_addr = uhci->io_addr;
int i;
if (!uhci->hcd.pdev ||
(uhci->hcd.pdev->vendor != PCI_VENDOR_ID_INTEL) ||
(uhci->hcd.pdev->device != PCI_DEVICE_ID_INTEL_82371AB_2))
return 1;
/* This is a 82371AB/EB/MB USB controller which has a bug that
* causes false resume indications if any port has an
* over current condition. If we do a global suspend then
* the controller thrashes back and forth between suspend and wakeup.
*
* Some motherboards using the 82371AB/EB/MB (but not the USB portion)
* appear to hardwire the over current inputs active to disable
* the USB ports..
*/
/* check for over current condition on all ports */
for (i = 0; i < uhci->rh_numports; i++) {
if (inw(io_addr + USBPORTSC1 + i * 2) & 0x0400)
return 0;
}
return 1;
}
static void suspend_hc(struct uhci_hcd *uhci)
{
unsigned int io_addr = uhci->io_addr;
if (!suspend_allowed(uhci))
return;
-- Paul Fulghum, paulkf@microgate.com Microgate Corporation, http://www.microgate.com
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/