Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -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)
		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;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -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
+9 −8
Original line number Original line Diff line number Diff line
@@ -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)