aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>2009-10-13 05:47:54 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-27 16:48:11 -0400
commit1fd2794f36913992798184c464fe8f85753b13e0 (patch)
treecce0edbd8bb37635a67771aa53b602db1f4b2fb2 /drivers
parent7444113017b9d5394dc8c4bdf577f9567502417b (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.c6
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_event.h2
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_main.c17
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
129int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num) 129int 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
106int wl1271_event_unmask(struct wl1271 *wl); 106int wl1271_event_unmask(struct wl1271 *wl);
107void wl1271_event_mbox_config(struct wl1271 *wl); 107void wl1271_event_mbox_config(struct wl1271 *wl);
108int wl1271_event_handle(struct wl1271 *wl, u8 mbox); 108int 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)