]> git.karo-electronics.de Git - linux-beck.git/commitdiff
wlcore: wait for roc complete only for the first roc command
authorVictor Goldenshtein <victorg@ti.com>
Mon, 14 May 2012 13:07:38 +0000 (16:07 +0300)
committerLuciano Coelho <coelho@ti.com>
Tue, 5 Jun 2012 17:24:32 +0000 (20:24 +0300)
In some multi role scenarios the driver might send multi
roc requests without sending a croc first, the fw queues
those requests and starts service the next roc request as
soon as the driver sends a croc for the previous one. So,
if the fw rocs on channel X and driver asks to roc also
on channel Y, the fw will not start service Y (and will
not send roc complete event for this request) until the
driver releases the fw with croc X.

Signed-off-by: Victor Goldenshtein <victorg@ti.com>
Signed-off-by: Igal Chernobelsky <igalc@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wlcore/cmd.c

index e8c650dec18ca1067556a102dd299ee457347bad..df8d672b1f06219956dbae2467e376db8629a50e 100644 (file)
@@ -1606,19 +1606,25 @@ out:
 int wl12xx_roc(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 role_id)
 {
        int ret = 0;
+       bool is_first_roc;
 
        if (WARN_ON(test_bit(role_id, wl->roc_map)))
                return 0;
 
+       is_first_roc = (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) >=
+                       WL12XX_MAX_ROLES);
+
        ret = wl12xx_cmd_roc(wl, wlvif, role_id);
        if (ret < 0)
                goto out;
 
-       ret = wl1271_cmd_wait_for_event(wl,
-                                       REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID);
-       if (ret < 0) {
-               wl1271_error("cmd roc event completion error");
-               goto out;
+       if (is_first_roc) {
+               ret = wl1271_cmd_wait_for_event(wl,
+                                          REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID);
+               if (ret < 0) {
+                       wl1271_error("cmd roc event completion error");
+                       goto out;
+               }
        }
 
        __set_bit(role_id, wl->roc_map);