X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=carlfw%2Fusb%2Fmain.c;fp=carlfw%2Fusb%2Fmain.c;h=c2ad6c3d71fcc79fc4b1bc082430f796931745cd;hb=6476369c2c6d4ba487408cb5daff8df0480d6b4a;hp=95aac88b86b1d8d2a5d9f0027260495fa6365196;hpb=7b5eda181245312c9b4f444d5cb2ed997ec5b6c3;p=carl9170fw.git diff --git a/carlfw/usb/main.c b/carlfw/usb/main.c index 95aac88..c2ad6c3 100644 --- a/carlfw/usb/main.c +++ b/carlfw/usb/main.c @@ -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 @@ -381,13 +382,22 @@ static void usb_handler(uint8_t usb_interrupt_level1) if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_SUSPEND) { usb_suspend_ack(); - disable_watchdog(); + fw.suspend_mode = CARL9170_HOST_SUSPENDED; - /* GO_TO_SUSPEND stops the CPU clock too. */ - orb(AR9170_USB_REG_MAIN_CTRL, AR9170_USB_MAIN_CTRL_GO_TO_SUSPEND); + if (!(fw.usb.device_feature & USB_DEVICE_REMOTE_WAKEUP)) { + 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(); + } } if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_RESUME) { + fw.suspend_mode = CARL9170_HOST_AWAKE; + andl(AR9170_USB_REG_WAKE_UP, AR9170_USB_WAKE_UP_WAKE); + usb_resume_ack(); reboot(); } @@ -407,3 +417,11 @@ void handle_usb(void) usb_trigger_in(); } +void usb_timer(void) +{ +#ifdef CONFIG_CARL9170FW_WOL + if (fw.suspend_mode == CARL9170_AWAKE_HOST) { + orl(AR9170_USB_REG_WAKE_UP, AR9170_USB_WAKE_UP_WAKE); + } +#endif /* CONFIG_CARL9170FW_WOL */ +}