wl12xx: schedule recovery on command timeout
authorArik Nemtsov <arik@wizery.com>
Mon, 18 Apr 2011 11:15:23 +0000 (14:15 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 2 May 2011 07:31:03 +0000 (10:31 +0300)
We use a long timeout (2 seconds) when sending commands to the FW.
When a command times out, it means the FW is stuck, and we should
commence recovery.

This should make recovery times shorter as we'll recover on the first
timeout indication.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/cmd.c

index a9ffdd8..d8596ae 100644 (file)
@@ -76,7 +76,7 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
                if (time_after(jiffies, timeout)) {
                        wl1271_error("command complete timeout");
                        ret = -ETIMEDOUT;
-                       goto out;
+                       goto fail;
                }
 
                poll_count++;
@@ -96,14 +96,17 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
        status = le16_to_cpu(cmd->status);
        if (status != CMD_STATUS_SUCCESS) {
                wl1271_error("command execute failure %d", status);
-               ieee80211_queue_work(wl->hw, &wl->recovery_work);
                ret = -EIO;
+               goto fail;
        }
 
        wl1271_write32(wl, ACX_REG_INTERRUPT_ACK,
                       WL1271_ACX_INTR_CMD_COMPLETE);
+       return 0;
 
-out:
+fail:
+       WARN_ON(1);
+       ieee80211_queue_work(wl->hw, &wl->recovery_work);
        return ret;
 }