[adm5120] fix usb mis-cleanup after r27162 (#9581)
[openwrt.git] / target / linux / adm5120 / files / drivers / usb / host / adm5120-pm.c
index bd99776..0ccf829 100644 (file)
@@ -1,10 +1,16 @@
 /*
 /*
- * OHCI HCD (Host Controller Driver) for USB.
+ * ADM5120 HCD (Host Controller Driver) for USB
  *
  *
- * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
- * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
+ * Copyright (C) 2007-2008 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * This file was derived from fragments of the OHCI driver.
+ *   (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
+ *   (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
+ *
+ *  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.
  *
  *
- * This file is licenced under GPL
  */
 
 #define OHCI_SCHED_ENABLES \
  */
 
 #define OHCI_SCHED_ENABLES \
@@ -377,9 +383,8 @@ static int admhc_restart(struct admhcd *ahcd)
                                        ed, ed->state);
                }
 
                                        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);
        }
        finish_unlinks(ahcd, 0);
        spin_unlock_irq(&ahcd->lock);
@@ -427,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)
 {
 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)
        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 */
 }
 
 #endif /* CONFIG_PM */
This page took 0.031469 seconds and 4 git commands to generate.