carl9170 firmware: fix clock_set parameter mixup
[carl9170fw.git] / carlfw / usb / main.c
index 95aac88b86b1d8d2a5d9f0027260495fa6365196..cdaf760cdf285605e3575bc6803bbc5b649796e4 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (c) 2000-2005 ZyDAS Technology Corporation
  * Copyright (c) 2007-2009 Atheros Communications, Inc.
  * Copyright   2009    Johannes Berg <johannes@sipsolutions.net>
- * Copyright   2009    Christian Lamparter <chunkeey@googlemail.com>
+ * Copyright 2009-2011 Christian Lamparter <chunkeey@googlemail.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,6 +27,7 @@
 #include "printf.h"
 #include "timer.h"
 #include "rom.h"
+#include "wl.h"
 #include "shared/phy.h"
 
 #ifdef CONFIG_CARL9170FW_DEBUG_USB
@@ -244,7 +245,7 @@ static void turn_power_off(void)
                                  AR9170_PWR_RESET_WLAN_MASK);
        set(AR9170_PWR_REG_RESET, 0x0);
 
-       set(AR9170_PWR_REG_CLOCK_SEL, AHB_40MHZ_OSC);
+       clock_set(AHB_20_22MHZ, false);
 
        set(AR9170_PWR_REG_PLL_ADDAC, 0x5163);  /* 0x502b; */
        set(AR9170_PHY_REG_ADC_SERIAL_CTL, AR9170_PHY_ADC_SCTL_SEL_EXTERNAL_RADIO);
@@ -381,14 +382,32 @@ static void usb_handler(uint8_t usb_interrupt_level1)
                if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_SUSPEND) {
                        usb_suspend_ack();
 
+                       fw.suspend_mode = CARL9170_HOST_SUSPENDED;
+
+#ifdef CONFIG_CARL9170FW_WOL
+                       if (!(fw.usb.device_feature & USB_DEVICE_REMOTE_WAKEUP) ||
+                           !fw.wlan.wol.cmd.flags) {
+                               disable_watchdog();
+
+                               /* GO_TO_SUSPEND stops the CPU clock too. */
+                               orb(AR9170_USB_REG_MAIN_CTRL, AR9170_USB_MAIN_CTRL_GO_TO_SUSPEND);
+                       } else {
+                               wlan_prepare_wol();
+                       }
+#else /* CONFIG_CARL9170FW_WOL */
                        disable_watchdog();
 
                        /* GO_TO_SUSPEND stops the CPU clock too. */
                        orb(AR9170_USB_REG_MAIN_CTRL, AR9170_USB_MAIN_CTRL_GO_TO_SUSPEND);
+#endif /* CONFIG_CARL9170FW_WOL */
                }
 
                if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_RESUME) {
                        usb_resume_ack();
+
+                       fw.suspend_mode = CARL9170_HOST_AWAKE;
+                       set(AR9170_USB_REG_WAKE_UP, 0);
+
                        reboot();
                }
        }
@@ -407,3 +426,6 @@ void handle_usb(void)
                usb_trigger_in();
 }
 
+void usb_timer(void)
+{
+}