wlcore: change the wait for event mechanism
authorYoni Divinsky <yoni.divinsky@ti.com>
Wed, 27 Jun 2012 18:35:47 +0000 (21:35 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 10 Jul 2012 16:10:14 +0000 (12:10 -0400)
wlcore needs to wait for certain events for example
for roc complete event. Usually the events are received
from the FW very fast, therefore wlcore can poll with
a short delay and if after a second the event was
not received yet poll with a long (1-5 msec) delay.

This implementation is similar to the sending of
commands to the FW.

Empirically the change reduced the wait for roc event
from ~10-40msec to 100s of usecs.

[replace udelay/msleep with usleep_range - Arik]

Signed-off-by: Yoni Divinsky <yoni.divinsky@ti.com>
Signed-off-by: Arik Nemtsov <arik@wizery.com>
drivers/net/wireless/ti/wlcore/cmd.c

index 087cb01958a701ee0418976ec5dcba0478f5134f..a23949cdaebc832643a938edbf7acf990334a40c 100644 (file)
@@ -39,6 +39,7 @@
 #include "hw_ops.h"
 
 #define WL1271_CMD_FAST_POLL_COUNT       50
+#define WL1271_WAIT_EVENT_FAST_POLL_COUNT 20
 
 /*
  * send command to firmware
@@ -138,6 +139,7 @@ static int wl1271_cmd_wait_for_event_or_timeout(struct wl1271 *wl,
        u32 *events_vector;
        u32 event;
        unsigned long timeout_time;
+       u16 poll_count = 0;
        int ret = 0;
 
        *timeout = false;
@@ -156,7 +158,11 @@ static int wl1271_cmd_wait_for_event_or_timeout(struct wl1271 *wl,
                        goto out;
                }
 
-               msleep(1);
+               poll_count++;
+               if (poll_count < WL1271_WAIT_EVENT_FAST_POLL_COUNT)
+                       usleep_range(50, 51);
+               else
+                       usleep_range(1000, 5000);
 
                /* read from both event fields */
                ret = wlcore_read(wl, wl->mbox_ptr[0], events_vector,