diff options
-rw-r--r-- | drivers/net/wireless/ti/wl12xx/acx.h | 14 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wl12xx/main.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wl18xx/acx.h | 20 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wl18xx/main.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wlcore/acx.h | 27 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wlcore/main.c | 13 |
6 files changed, 71 insertions, 21 deletions
diff --git a/drivers/net/wireless/ti/wl12xx/acx.h b/drivers/net/wireless/ti/wl12xx/acx.h index 1be0f2d31b19..2a26868b837d 100644 --- a/drivers/net/wireless/ti/wl12xx/acx.h +++ b/drivers/net/wireless/ti/wl12xx/acx.h | |||
@@ -26,6 +26,20 @@ | |||
26 | #include "../wlcore/wlcore.h" | 26 | #include "../wlcore/wlcore.h" |
27 | #include "../wlcore/acx.h" | 27 | #include "../wlcore/acx.h" |
28 | 28 | ||
29 | #define WL12XX_ACX_ALL_EVENTS_VECTOR (WL1271_ACX_INTR_WATCHDOG | \ | ||
30 | WL1271_ACX_INTR_INIT_COMPLETE | \ | ||
31 | WL1271_ACX_INTR_EVENT_A | \ | ||
32 | WL1271_ACX_INTR_EVENT_B | \ | ||
33 | WL1271_ACX_INTR_CMD_COMPLETE | \ | ||
34 | WL1271_ACX_INTR_HW_AVAILABLE | \ | ||
35 | WL1271_ACX_INTR_DATA) | ||
36 | |||
37 | #define WL12XX_INTR_MASK (WL1271_ACX_INTR_WATCHDOG | \ | ||
38 | WL1271_ACX_INTR_EVENT_A | \ | ||
39 | WL1271_ACX_INTR_EVENT_B | \ | ||
40 | WL1271_ACX_INTR_HW_AVAILABLE | \ | ||
41 | WL1271_ACX_INTR_DATA) | ||
42 | |||
29 | struct wl1271_acx_host_config_bitmap { | 43 | struct wl1271_acx_host_config_bitmap { |
30 | struct acx_header header; | 44 | struct acx_header header; |
31 | 45 | ||
diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c index 41017baaf253..f74d76c95a7f 100644 --- a/drivers/net/wireless/ti/wl12xx/main.c +++ b/drivers/net/wireless/ti/wl12xx/main.c | |||
@@ -1034,11 +1034,11 @@ static void wl12xx_pre_upload(struct wl1271 *wl) | |||
1034 | 1034 | ||
1035 | static void wl12xx_enable_interrupts(struct wl1271 *wl) | 1035 | static void wl12xx_enable_interrupts(struct wl1271 *wl) |
1036 | { | 1036 | { |
1037 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_ALL_EVENTS_VECTOR); | 1037 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL12XX_ACX_ALL_EVENTS_VECTOR); |
1038 | 1038 | ||
1039 | wlcore_enable_interrupts(wl); | 1039 | wlcore_enable_interrupts(wl); |
1040 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, | 1040 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, |
1041 | WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK)); | 1041 | WL1271_ACX_INTR_ALL & ~(WL12XX_INTR_MASK)); |
1042 | 1042 | ||
1043 | wl1271_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL); | 1043 | wl1271_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL); |
1044 | } | 1044 | } |
diff --git a/drivers/net/wireless/ti/wl18xx/acx.h b/drivers/net/wireless/ti/wl18xx/acx.h index cb6fd85d077f..7d74b031f114 100644 --- a/drivers/net/wireless/ti/wl18xx/acx.h +++ b/drivers/net/wireless/ti/wl18xx/acx.h | |||
@@ -28,6 +28,26 @@ | |||
28 | /* numbers of bits the length field takes (add 1 for the actual number) */ | 28 | /* numbers of bits the length field takes (add 1 for the actual number) */ |
29 | #define WL18XX_HOST_IF_LEN_SIZE_FIELD 15 | 29 | #define WL18XX_HOST_IF_LEN_SIZE_FIELD 15 |
30 | 30 | ||
31 | #define WL18XX_ACX_EVENTS_VECTOR_PG1 (WL1271_ACX_INTR_WATCHDOG | \ | ||
32 | WL1271_ACX_INTR_INIT_COMPLETE | \ | ||
33 | WL1271_ACX_INTR_EVENT_A | \ | ||
34 | WL1271_ACX_INTR_EVENT_B | \ | ||
35 | WL1271_ACX_INTR_CMD_COMPLETE | \ | ||
36 | WL1271_ACX_INTR_HW_AVAILABLE | \ | ||
37 | WL1271_ACX_INTR_DATA) | ||
38 | |||
39 | #define WL18XX_ACX_EVENTS_VECTOR_PG2 (WL18XX_ACX_EVENTS_VECTOR_PG1 | \ | ||
40 | WL1271_ACX_SW_INTR_WATCHDOG) | ||
41 | |||
42 | #define WL18XX_INTR_MASK_PG1 (WL1271_ACX_INTR_WATCHDOG | \ | ||
43 | WL1271_ACX_INTR_EVENT_A | \ | ||
44 | WL1271_ACX_INTR_EVENT_B | \ | ||
45 | WL1271_ACX_INTR_HW_AVAILABLE | \ | ||
46 | WL1271_ACX_INTR_DATA) | ||
47 | |||
48 | #define WL18XX_INTR_MASK_PG2 (WL18XX_INTR_MASK_PG1 | \ | ||
49 | WL1271_ACX_SW_INTR_WATCHDOG) | ||
50 | |||
31 | struct wl18xx_acx_host_config_bitmap { | 51 | struct wl18xx_acx_host_config_bitmap { |
32 | struct acx_header header; | 52 | struct acx_header header; |
33 | 53 | ||
diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c index bdf4ee12914d..84f8e27c29ab 100644 --- a/drivers/net/wireless/ti/wl18xx/main.c +++ b/drivers/net/wireless/ti/wl18xx/main.c | |||
@@ -776,11 +776,21 @@ static void wl18xx_set_mac_and_phy(struct wl1271 *wl) | |||
776 | 776 | ||
777 | static void wl18xx_enable_interrupts(struct wl1271 *wl) | 777 | static void wl18xx_enable_interrupts(struct wl1271 *wl) |
778 | { | 778 | { |
779 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_ALL_EVENTS_VECTOR); | 779 | u32 event_mask, intr_mask; |
780 | |||
781 | if (wl->chip.id == CHIP_ID_185x_PG10) { | ||
782 | event_mask = WL18XX_ACX_EVENTS_VECTOR_PG1; | ||
783 | intr_mask = WL18XX_INTR_MASK_PG1; | ||
784 | } else { | ||
785 | event_mask = WL18XX_ACX_EVENTS_VECTOR_PG2; | ||
786 | intr_mask = WL18XX_INTR_MASK_PG2; | ||
787 | } | ||
788 | |||
789 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, event_mask); | ||
780 | 790 | ||
781 | wlcore_enable_interrupts(wl); | 791 | wlcore_enable_interrupts(wl); |
782 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, | 792 | wlcore_write_reg(wl, REG_INTERRUPT_MASK, |
783 | WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK)); | 793 | WL1271_ACX_INTR_ALL & ~intr_mask); |
784 | } | 794 | } |
785 | 795 | ||
786 | static int wl18xx_boot(struct wl1271 *wl) | 796 | static int wl18xx_boot(struct wl1271 *wl) |
diff --git a/drivers/net/wireless/ti/wlcore/acx.h b/drivers/net/wireless/ti/wlcore/acx.h index 46c300d4dea4..c0181258b722 100644 --- a/drivers/net/wireless/ti/wlcore/acx.h +++ b/drivers/net/wireless/ti/wlcore/acx.h | |||
@@ -51,21 +51,18 @@ | |||
51 | #define WL1271_ACX_INTR_TRACE_A BIT(7) | 51 | #define WL1271_ACX_INTR_TRACE_A BIT(7) |
52 | /* Trace message on MBOX #B */ | 52 | /* Trace message on MBOX #B */ |
53 | #define WL1271_ACX_INTR_TRACE_B BIT(8) | 53 | #define WL1271_ACX_INTR_TRACE_B BIT(8) |
54 | 54 | /* SW FW Initiated interrupt Watchdog timer expiration */ | |
55 | #define WL1271_ACX_INTR_ALL 0xFFFFFFFF | 55 | #define WL1271_ACX_SW_INTR_WATCHDOG BIT(9) |
56 | #define WL1271_ACX_ALL_EVENTS_VECTOR (WL1271_ACX_INTR_WATCHDOG | \ | 56 | |
57 | WL1271_ACX_INTR_INIT_COMPLETE | \ | 57 | #define WL1271_ACX_INTR_ALL 0xFFFFFFFF |
58 | WL1271_ACX_INTR_EVENT_A | \ | 58 | |
59 | WL1271_ACX_INTR_EVENT_B | \ | 59 | /* all possible interrupts - only appropriate ones will be masked in */ |
60 | WL1271_ACX_INTR_CMD_COMPLETE | \ | 60 | #define WLCORE_ALL_INTR_MASK (WL1271_ACX_INTR_WATCHDOG | \ |
61 | WL1271_ACX_INTR_HW_AVAILABLE | \ | 61 | WL1271_ACX_INTR_EVENT_A | \ |
62 | WL1271_ACX_INTR_DATA) | 62 | WL1271_ACX_INTR_EVENT_B | \ |
63 | 63 | WL1271_ACX_INTR_HW_AVAILABLE | \ | |
64 | #define WL1271_INTR_MASK (WL1271_ACX_INTR_WATCHDOG | \ | 64 | WL1271_ACX_INTR_DATA | \ |
65 | WL1271_ACX_INTR_EVENT_A | \ | 65 | WL1271_ACX_SW_INTR_WATCHDOG) |
66 | WL1271_ACX_INTR_EVENT_B | \ | ||
67 | WL1271_ACX_INTR_HW_AVAILABLE | \ | ||
68 | WL1271_ACX_INTR_DATA) | ||
69 | 66 | ||
70 | /* Target's information element */ | 67 | /* Target's information element */ |
71 | struct acx_header { | 68 | struct acx_header { |
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c index 8800a63539e3..176a3117889b 100644 --- a/drivers/net/wireless/ti/wlcore/main.c +++ b/drivers/net/wireless/ti/wlcore/main.c | |||
@@ -535,14 +535,23 @@ static irqreturn_t wl1271_irq(int irq, void *cookie) | |||
535 | wlcore_hw_tx_immediate_compl(wl); | 535 | wlcore_hw_tx_immediate_compl(wl); |
536 | 536 | ||
537 | intr = le32_to_cpu(wl->fw_status_1->intr); | 537 | intr = le32_to_cpu(wl->fw_status_1->intr); |
538 | intr &= WL1271_INTR_MASK; | 538 | intr &= WLCORE_ALL_INTR_MASK; |
539 | if (!intr) { | 539 | if (!intr) { |
540 | done = true; | 540 | done = true; |
541 | continue; | 541 | continue; |
542 | } | 542 | } |
543 | 543 | ||
544 | if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) { | 544 | if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) { |
545 | wl1271_error("watchdog interrupt received! " | 545 | wl1271_error("HW watchdog interrupt received! starting recovery."); |
546 | wl->watchdog_recovery = true; | ||
547 | wl12xx_queue_recovery_work(wl); | ||
548 | |||
549 | /* restarting the chip. ignore any other interrupt. */ | ||
550 | goto out; | ||
551 | } | ||
552 | |||
553 | if (unlikely(intr & WL1271_ACX_SW_INTR_WATCHDOG)) { | ||
554 | wl1271_error("SW watchdog interrupt received! " | ||
546 | "starting recovery."); | 555 | "starting recovery."); |
547 | wl->watchdog_recovery = true; | 556 | wl->watchdog_recovery = true; |
548 | wl12xx_queue_recovery_work(wl); | 557 | wl12xx_queue_recovery_work(wl); |