Skip to content

Commit

Permalink
wl1271: Fix event handling mechanism
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Juuso Oikarinen authored and John W. Linville committed Oct 27, 2009
1 parent 7444113 commit 1fd2794
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 11 deletions.
6 changes: 4 additions & 2 deletions drivers/net/wireless/wl12xx/wl1271_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ void wl1271_event_mbox_config(struct wl1271 *wl)
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;
int ret;
Expand All @@ -146,7 +146,9 @@ int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num)
return ret;

/* 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;
}
2 changes: 1 addition & 1 deletion drivers/net/wireless/wl12xx/wl1271_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,6 @@ struct event_mailbox {

int wl1271_event_unmask(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
17 changes: 9 additions & 8 deletions drivers/net/wireless/wl12xx/wl1271_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,14 +437,15 @@ static void wl1271_irq_work(struct work_struct *work)

intr &= WL1271_INTR_MASK;

if (intr & (WL1271_ACX_INTR_EVENT_A |
WL1271_ACX_INTR_EVENT_B)) {
wl1271_debug(DEBUG_IRQ,
"WL1271_ACX_INTR_EVENT (0x%x)", intr);
if (intr & WL1271_ACX_INTR_EVENT_A)
wl1271_event_handle(wl, 0);
else
wl1271_event_handle(wl, 1);
if (intr & WL1271_ACX_INTR_EVENT_A) {
bool do_ack = (intr & WL1271_ACX_INTR_EVENT_B) ? false : true;
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
wl1271_event_handle(wl, 0, do_ack);
}

if (intr & WL1271_ACX_INTR_EVENT_B) {
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
wl1271_event_handle(wl, 1, true);
}

if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
Expand Down

0 comments on commit 1fd2794

Please sign in to comment.