Commit 1fd2794f authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville

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: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 74441130
...@@ -126,7 +126,7 @@ void wl1271_event_mbox_config(struct wl1271 *wl) ...@@ -126,7 +126,7 @@ void wl1271_event_mbox_config(struct wl1271 *wl)
wl->mbox_ptr[0], wl->mbox_ptr[1]); wl->mbox_ptr[0], wl->mbox_ptr[1]);
} }
int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num) int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num, bool do_ack)
{ {
struct event_mailbox mbox; struct event_mailbox mbox;
int ret; int ret;
...@@ -146,7 +146,9 @@ int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num) ...@@ -146,7 +146,9 @@ int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num)
return ret; return ret;
/* then we let the firmware know it can go on...*/ /* then we let the firmware know it can go on...*/
wl1271_spi_write32(wl, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_EVENT_ACK); if (do_ack)
wl1271_spi_write32(wl, ACX_REG_INTERRUPT_TRIG,
INTR_TRIG_EVENT_ACK);
return 0; return 0;
} }
...@@ -105,6 +105,6 @@ struct event_mailbox { ...@@ -105,6 +105,6 @@ struct event_mailbox {
int wl1271_event_unmask(struct wl1271 *wl); int wl1271_event_unmask(struct wl1271 *wl);
void wl1271_event_mbox_config(struct wl1271 *wl); void wl1271_event_mbox_config(struct wl1271 *wl);
int wl1271_event_handle(struct wl1271 *wl, u8 mbox); int wl1271_event_handle(struct wl1271 *wl, u8 mbox, bool do_ack);
#endif #endif
...@@ -437,14 +437,15 @@ static void wl1271_irq_work(struct work_struct *work) ...@@ -437,14 +437,15 @@ static void wl1271_irq_work(struct work_struct *work)
intr &= WL1271_INTR_MASK; intr &= WL1271_INTR_MASK;
if (intr & (WL1271_ACX_INTR_EVENT_A | if (intr & WL1271_ACX_INTR_EVENT_A) {
WL1271_ACX_INTR_EVENT_B)) { bool do_ack = (intr & WL1271_ACX_INTR_EVENT_B) ? false : true;
wl1271_debug(DEBUG_IRQ, wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
"WL1271_ACX_INTR_EVENT (0x%x)", intr); wl1271_event_handle(wl, 0, do_ack);
if (intr & WL1271_ACX_INTR_EVENT_A) }
wl1271_event_handle(wl, 0);
else if (intr & WL1271_ACX_INTR_EVENT_B) {
wl1271_event_handle(wl, 1); wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
wl1271_event_handle(wl, 1, true);
} }
if (intr & WL1271_ACX_INTR_INIT_COMPLETE) if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment