mirror of
https://github.com/torvalds/linux
synced 2024-09-22 12:26:27 +00:00
wl1251: wait for join command complete event
Poll for join command completion instead of waiting blindly for 10
msecs. There is a timeout of 100 msecs, if the command doesn't complete
by then, we return an error code.
Based on wl1271 patch 99d84c1de8
by Luciano Coelho.
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Acked-by: Kalle Valo <kvalo@adurom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
5b44a1b516
commit
7273b9700b
|
@ -302,7 +302,7 @@ int wl1251_boot_run_firmware(struct wl1251 *wl)
|
||||||
ROAMING_TRIGGER_LOW_RSSI_EVENT_ID |
|
ROAMING_TRIGGER_LOW_RSSI_EVENT_ID |
|
||||||
ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID |
|
ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID |
|
||||||
REGAINED_BSS_EVENT_ID | BT_PTA_SENSE_EVENT_ID |
|
REGAINED_BSS_EVENT_ID | BT_PTA_SENSE_EVENT_ID |
|
||||||
BT_PTA_PREDICTION_EVENT_ID;
|
BT_PTA_PREDICTION_EVENT_ID | JOIN_EVENT_COMPLETE_ID;
|
||||||
|
|
||||||
ret = wl1251_event_unmask(wl);
|
ret = wl1251_event_unmask(wl);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
@ -97,6 +97,35 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Poll the mailbox event field until any of the bits in the mask is set or a
|
||||||
|
* timeout occurs (WL1251_EVENT_TIMEOUT in msecs)
|
||||||
|
*/
|
||||||
|
int wl1251_event_wait(struct wl1251 *wl, u32 mask, int timeout_ms)
|
||||||
|
{
|
||||||
|
u32 events_vector, event;
|
||||||
|
unsigned long timeout;
|
||||||
|
|
||||||
|
timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (time_after(jiffies, timeout))
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
|
msleep(1);
|
||||||
|
|
||||||
|
/* read from both event fields */
|
||||||
|
wl1251_mem_read(wl, wl->mbox_ptr[0], &events_vector,
|
||||||
|
sizeof(events_vector));
|
||||||
|
event = events_vector & mask;
|
||||||
|
wl1251_mem_read(wl, wl->mbox_ptr[1], &events_vector,
|
||||||
|
sizeof(events_vector));
|
||||||
|
event |= events_vector & mask;
|
||||||
|
} while (!event);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int wl1251_event_unmask(struct wl1251 *wl)
|
int wl1251_event_unmask(struct wl1251 *wl)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -117,5 +117,6 @@ struct event_mailbox {
|
||||||
int wl1251_event_unmask(struct wl1251 *wl);
|
int wl1251_event_unmask(struct wl1251 *wl);
|
||||||
void wl1251_event_mbox_config(struct wl1251 *wl);
|
void wl1251_event_mbox_config(struct wl1251 *wl);
|
||||||
int wl1251_event_handle(struct wl1251 *wl, u8 mbox);
|
int wl1251_event_handle(struct wl1251 *wl, u8 mbox);
|
||||||
|
int wl1251_event_wait(struct wl1251 *wl, u32 mask, int timeout_ms);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -339,11 +339,9 @@ static int wl1251_join(struct wl1251 *wl, u8 bss_type, u8 channel,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
ret = wl1251_event_wait(wl, JOIN_EVENT_COMPLETE_ID, 100);
|
||||||
* FIXME: we should wait for JOIN_EVENT_COMPLETE_ID but to simplify
|
if (ret < 0)
|
||||||
* locking we just sleep instead, for now
|
wl1251_warning("join timeout");
|
||||||
*/
|
|
||||||
msleep(10);
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue