tools: edimax_fw_header: fix suspicious memset usage
[15.05/openwrt.git] / target / linux / adm5120 / files / drivers / usb / host / adm5120-pm.c
index e10a8e9..7d7fc24 100644 (file)
@@ -1,13 +1,16 @@
 /*
  * ADM5120 HCD (Host Controller Driver) for USB
  *
- * Copyright (C) 2007 Gabor Juhos <juhosg at openwrt.org>
+ * 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 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 \
@@ -254,7 +257,7 @@ static int admhc_bus_suspend(struct usb_hcd *hcd)
 
        spin_lock_irq(&ahcd->lock);
 
-       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)))
+       if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
                rc = -ESHUTDOWN;
        else
                rc = admhc_rh_suspend(ahcd, 0);
@@ -272,7 +275,7 @@ static int admhc_bus_resume(struct usb_hcd *hcd)
 
        spin_lock_irq(&ahcd->lock);
 
-       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)))
+       if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
                rc = -ESHUTDOWN;
        else
                rc = admhc_rh_resume(ahcd);
@@ -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 */