X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/b4f5ad450602411b30e6d9849ce0406a93ffb597..75a19f0fc032643378d200cfcd3acb38ee6ffcc1:/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 e10a8e95d..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,13 +1,16 @@ /* * ADM5120 HCD (Host Controller Driver) for USB * - * Copyright (C) 2007 Gabor Juhos + * Copyright (C) 2007-2008 Gabor Juhos * * This file was derived from fragments of the OHCI driver. * (C) Copyright 1999 Roman Weissgaerber * (C) Copyright 2000-2004 David Brownell * - * This file is licenced under the GPL. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * */ #define OHCI_SCHED_ENABLES \ @@ -380,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); @@ -430,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 */