diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2009-10-13 05:47:54 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-10-27 16:48:11 -0400 |
commit | 1fd2794f36913992798184c464fe8f85753b13e0 (patch) | |
tree | cce0edbd8bb37635a67771aa53b602db1f4b2fb2 /drivers | |
parent | 7444113017b9d5394dc8c4bdf577f9567502417b (diff) |
wl1271: Fix event handling mechanism
The event handling mechanism could miss events if multiple events would
occur simultaneously. Fix event handling mechanism to process all
events.
Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_event.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_event.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_main.c | 17 |
3 files changed, 14 insertions, 11 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_event.c b/drivers/net/wireless/wl12xx/wl1271_event.c index e2d7758ba1c9..a4b11e43f0db 100644 --- a/drivers/net/wireless/wl12xx/wl1271_event.c +++ b/drivers/net/wireless/wl12xx/wl1271_event.c | |||
@@ -126,7 +126,7 @@ void wl1271_event_mbox_config(struct wl1271 *wl) | |||
126 | wl->mbox_ptr[0], wl->mbox_ptr[1]); | 126 | wl->mbox_ptr[0], wl->mbox_ptr[1]); |
127 | } | 127 | } |
128 | 128 | ||
129 | int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num) | 129 | int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num, bool do_ack) |
130 | { | 130 | { |
131 | struct event_mailbox mbox; | 131 | struct event_mailbox mbox; |
132 | int ret; | 132 | int ret; |
@@ -146,7 +146,9 @@ int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num) | |||
146 | return ret; | 146 | return ret; |
147 | 147 | ||
148 | /* then we let the firmware know it can go on...*/ | 148 | /* then we let the firmware know it can go on...*/ |
149 | wl1271_spi_write32(wl, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_EVENT_ACK); | 149 | if (do_ack) |
150 | wl1271_spi_write32(wl, ACX_REG_INTERRUPT_TRIG, | ||
151 | INTR_TRIG_EVENT_ACK); | ||
150 | 152 | ||
151 | return 0; | 153 | return 0; |
152 | } | 154 | } |
diff --git a/drivers/net/wireless/wl12xx/wl1271_event.h b/drivers/net/wireless/wl12xx/wl1271_event.h index 2cdce7c34bf0..adc4653b2616 100644 --- a/drivers/net/wireless/wl12xx/wl1271_event.h +++ b/drivers/net/wireless/wl12xx/wl1271_event.h | |||
@@ -105,6 +105,6 @@ struct event_mailbox { | |||
105 | 105 | ||
106 | int wl1271_event_unmask(struct wl1271 *wl); | 106 | int wl1271_event_unmask(struct wl1271 *wl); |
107 | void wl1271_event_mbox_config(struct wl1271 *wl); | 107 | void wl1271_event_mbox_config(struct wl1271 *wl); |
108 | int wl1271_event_handle(struct wl1271 *wl, u8 mbox); | 108 | int wl1271_event_handle(struct wl1271 *wl, u8 mbox, bool do_ack); |
109 | 109 | ||
110 | #endif | 110 | #endif |
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c index 19dbdb1b38ab..d6d1a4c1b114 100644 --- a/drivers/net/wireless/wl12xx/wl1271_main.c +++ b/drivers/net/wireless/wl12xx/wl1271_main.c | |||
@@ -437,14 +437,15 @@ static void wl1271_irq_work(struct work_struct *work) | |||
437 | 437 | ||
438 | intr &= WL1271_INTR_MASK; | 438 | intr &= WL1271_INTR_MASK; |
439 | 439 | ||
440 | if (intr & (WL1271_ACX_INTR_EVENT_A | | 440 | if (intr & WL1271_ACX_INTR_EVENT_A) { |
441 | WL1271_ACX_INTR_EVENT_B)) { | 441 | bool do_ack = (intr & WL1271_ACX_INTR_EVENT_B) ? false : true; |
442 | wl1271_debug(DEBUG_IRQ, | 442 | wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A"); |
443 | "WL1271_ACX_INTR_EVENT (0x%x)", intr); | 443 | wl1271_event_handle(wl, 0, do_ack); |
444 | if (intr & WL1271_ACX_INTR_EVENT_A) | 444 | } |
445 | wl1271_event_handle(wl, 0); | 445 | |
446 | else | 446 | if (intr & WL1271_ACX_INTR_EVENT_B) { |
447 | wl1271_event_handle(wl, 1); | 447 | wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B"); |
448 | wl1271_event_handle(wl, 1, true); | ||
448 | } | 449 | } |
449 | 450 | ||
450 | if (intr & WL1271_ACX_INTR_INIT_COMPLETE) | 451 | if (intr & WL1271_ACX_INTR_INIT_COMPLETE) |