X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/9fe061d4a72b5385b469867ba58b9fd40151278c..e1e2d4135228a81a4ed26cda561a52c0c09e6a0f:/target/linux/adm5120/files/drivers/usb/host/adm5120-pm.c?ds=inline diff --git a/target/linux/adm5120/files/drivers/usb/host/adm5120-pm.c b/target/linux/adm5120/files/drivers/usb/host/adm5120-pm.c index ac7bf6cfc..0ccf829c2 100644 --- a/target/linux/adm5120/files/drivers/usb/host/adm5120-pm.c +++ b/target/linux/adm5120/files/drivers/usb/host/adm5120-pm.c @@ -1,7 +1,7 @@ /* * ADM5120 HCD (Host Controller Driver) for USB * - * Copyright (C) 2007,2008 Gabor Juhos + * Copyright (C) 2007-2008 Gabor Juhos * * This file was derived from fragments of the OHCI driver. * (C) Copyright 1999 Roman Weissgaerber @@ -383,9 +383,8 @@ static int admhc_restart(struct admhcd *ahcd) ed, ed->state); } - spin_lock(&urb->lock); - urb->status = -ESHUTDOWN; - spin_unlock(&urb->lock); + if (!urb->unlinked) + urb->unlinked = -ESHUTDOWN; } finish_unlinks(ahcd, 0); spin_unlock_irq(&ahcd->lock); @@ -433,13 +432,17 @@ static inline int admhc_rh_resume(struct admhcd *ahcd) static int admhc_root_hub_state_changes(struct admhcd *ahcd, int changed, int any_connected) { - int poll_rh = 1; - - /* keep on polling until RHSC is enabled */ + /* If INSM is enabled, don't poll */ if (admhc_readl(ahcd, &ahcd->regs->int_enable) & ADMHC_INTR_INSM) - poll_rh = 0; + return 0; - return poll_rh; + /* If no status changes are pending, enable status-change interrupts */ + if (!changed) { + admhc_intr_enable(ahcd, ADMHC_INTR_INSM); + return 0; + } + + return 1; } #endif /* CONFIG_PM */