CHROMIUMOS: mwifiex: Set timeout for mwifiex_wait_queue_complete
authorPaul Stewart <pstew@chromium.org>
Mon, 15 Oct 2012 22:36:52 +0000 (15:36 -0700)
committerGerrit <chrome-bot@google.com>
Tue, 16 Oct 2012 00:46:59 +0000 (17:46 -0700)
Wait 5 seconds for completion in mwifiex_wait_queue_complete.
If this fails, output a warning, and wait another 5 seconds.
If this fails, crash (instead of hanging the system).

Signed-off-by: Paul Stewart <pstew@chromium.org>
BUG=chrome-os-partner:15129
TEST=Boot and associate to network.

Change-Id: Ifa12beebbc98d96e7aed2cda6e4d94c23306da5d
Reviewed-on: https://gerrit.chromium.org/gerrit/35624
Reviewed-by: Doug Anderson <dianders@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Commit-Ready: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sta_ioctl.c

index b081171..e9fba5f 100644 (file)
@@ -116,6 +116,8 @@ enum {
 
 #define MWIFIEX_EVENT_HEADER_LEN           4
 
+#define MWIFIEX_QUEUE_TIMEOUT_MSEC             5000
+
 struct mwifiex_dbg {
        u32 num_cmd_host_to_card_failure;
        u32 num_cmd_sleep_cfm_host_to_card_failure;
index 252d8fa..4a6acd0 100644 (file)
@@ -59,6 +59,7 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
        bool cancel_flag = false;
        int status;
        struct cmd_ctrl_node *cmd_queued;
+       int ret;
 
        if (!adapter->cmd_queued)
                return 0;
@@ -70,8 +71,18 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
        atomic_inc(&adapter->cmd_pending);
 
        /* Wait for completion */
-       wait_event_interruptible(adapter->cmd_wait_q.wait,
-                                *(cmd_queued->condition));
+       ret = wait_event_interruptible_timeout(adapter->cmd_wait_q.wait,
+                               *(cmd_queued->condition),
+                               msecs_to_jiffies(MWIFIEX_QUEUE_TIMEOUT_MSEC));
+       if (ret == 0) {
+               WARN_ON(1);
+               /* Let's give waiting one more try, and then reboot */
+               ret = wait_event_interruptible_timeout(adapter->cmd_wait_q.wait,
+                               *(cmd_queued->condition),
+                               msecs_to_jiffies(MWIFIEX_QUEUE_TIMEOUT_MSEC));
+               BUG_ON(ret == 0);
+       }
+
        if (!*(cmd_queued->condition))
                cancel_flag = true;