AR9170_PWR_RESET_WLAN_MASK);
set(AR9170_PWR_REG_RESET, 0x0);
- clock_set(false, AHB_20_22MHZ);
+ set(AR9170_PWR_REG_CLOCK_SEL, AHB_40MHZ_OSC);
set(AR9170_PWR_REG_PLL_ADDAC, 0x5163); /* 0x502b; */
set(AR9170_PHY_REG_ADC_SERIAL_CTL, AR9170_PHY_ADC_SCTL_SEL_EXTERNAL_RADIO);
set(AR9170_PHY_REG_ADC_SERIAL_CTL, AR9170_PHY_ADC_SCTL_SEL_INTERNAL_ADDAC);
}
-void __noreturn reboot(void)
+static void disable_watchdog(void)
{
+ if (!fw.watchdog_enable)
+ return;
+
/* write watchdog magic pattern for suspend */
andl(AR9170_PWR_REG_WATCH_DOG_MAGIC, 0xffff);
orl(AR9170_PWR_REG_WATCH_DOG_MAGIC, 0x98760000);
/* Disable watchdog */
set(AR9170_TIMER_REG_WATCH_DOG, 0xffff);
+}
+
+void __noreturn reboot(void)
+{
+ disable_watchdog();
/* Turn off power */
turn_power_off();
if (usb_interrupt_level1 & BIT(0)) {
usb_interrupt_level2 = getb(AR9170_USB_REG_INTR_SOURCE_0);
- if (usb_interrupt_level2 & BIT(0))
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC0_SETUP)
usb_ep0setup();
- if (usb_interrupt_level2 & BIT(1))
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC0_IN)
usb_ep0tx();
- if (usb_interrupt_level2 & BIT(2))
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC0_OUT)
usb_ep0rx();
- if (usb_interrupt_level2 & BIT(7)) {
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC0_ABORT) {
/* Clear the command abort interrupt */
- andb(AR9170_USB_REG_INTR_SOURCE_0, 0x7f);
+ andb(AR9170_USB_REG_INTR_SOURCE_0, (uint8_t)
+ ~AR9170_USB_INTR_SRC0_ABORT);
}
- if (usb_interrupt_level2 & BIT(3) ||
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC0_FAIL ||
fw.usb.ep0_action & CARL9170_EP0_STALL) {
/*
* transmission failure.
fw.usb.ep0_action &= ~CARL9170_EP0_STALL;
}
- if (usb_interrupt_level2 & BIT(4) ||
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC0_END ||
fw.usb.ep0_action & CARL9170_EP0_TRIGGER) {
/*
* transmission done.
if (usb_interrupt_level1 & BIT(7)) {
usb_interrupt_level2 = getb(AR9170_USB_REG_INTR_SOURCE_7);
- if (usb_interrupt_level2 & BIT(7))
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_RX0BYTE)
usb_data_out0Byte();
- if (usb_interrupt_level2 & BIT(6))
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_TX0BYTE)
usb_data_in0Byte();
- if (usb_interrupt_level2 & BIT(1)) {
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_RESET) {
usb_reset_ack();
reboot();
}
- if (usb_interrupt_level2 & BIT(2)) {
- /* ACK USB suspend interrupt */
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_SUSPEND) {
usb_suspend_ack();
- /* Set GO_TO_SUSPEND bit to USB main control register */
- setb(AR9170_USB_REG_MAIN_CTRL, BIT(3));
-
- /* add by ygwei for work around USB PHY chirp sequence problem */
- set(0x10f100, 0x12345678);
+ disable_watchdog();
- reboot();
+ /* GO_TO_SUSPEND stops the CPU clock too. */
+ orb(AR9170_USB_REG_MAIN_CTRL, AR9170_USB_MAIN_CTRL_GO_TO_SUSPEND);
}
- if (usb_interrupt_level2 & BIT(3))
+ if (usb_interrupt_level2 & AR9170_USB_INTR_SRC7_USB_RESUME) {
usb_resume_ack();
+ reboot();
+ }
}
}