wil6210: introduce separate completion for WMI
authorDedy Lansky <qca_dlansky@qca.qualcomm.com>
Wed, 10 Sep 2014 13:34:46 +0000 (16:34 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 11 Sep 2014 19:27:38 +0000 (15:27 -0400)
re-use of wmi_ready for both FW ready event and for wmi_call was causing
false "FW not ready" indication in case wmi_call() was invoked while reset
took place.
add wmi_call completion variable instead of re-using wmi_ready.

Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com>
Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/wil6210/main.c
drivers/net/wireless/ath/wil6210/wil6210.h
drivers/net/wireless/ath/wil6210/wmi.c

index d2f2c1e98e9e07a14431b524257a392de195eae4..0857853f675c9936a9d643b68c5be1862c4e5cd3 100644 (file)
@@ -286,6 +286,7 @@ int wil_priv_init(struct wil6210_priv *wil)
        mutex_init(&wil->wmi_mutex);
 
        init_completion(&wil->wmi_ready);
+       init_completion(&wil->wmi_call);
 
        wil->pending_connect_cid = -1;
        setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil);
@@ -536,6 +537,7 @@ int wil_reset(struct wil6210_priv *wil)
        /* init after reset */
        wil->pending_connect_cid = -1;
        reinit_completion(&wil->wmi_ready);
+       reinit_completion(&wil->wmi_call);
 
        wil6210_enable_irq(wil);
 
index 1b119343c6cfc713e982aa52d8fce59e0b280715..f8f99881382d06fad58910a57df8841b574385db 100644 (file)
@@ -399,6 +399,7 @@ struct wil6210_priv {
        struct mutex wmi_mutex;
        struct wil6210_mbox_ctl mbox_ctl;
        struct completion wmi_ready;
+       struct completion wmi_call;
        u16 wmi_seq;
        u16 reply_id; /**< wait for this WMI event */
        void *reply_buf;
index 789c316d0ce65511e0420e70dd7832303712e78a..bd781c7adf2a5f40b513b2ade95e732bed1e7930 100644 (file)
@@ -300,7 +300,7 @@ static void wmi_evt_fw_ready(struct wil6210_priv *wil, int id, void *d,
        wil_dbg_wmi(wil, "WMI: got FW ready event\n");
 
        set_bit(wil_status_fwready, &wil->status);
-       /* reuse wmi_ready for the firmware ready indication */
+       /* let the reset sequence continue */
        complete(&wil->wmi_ready);
 }
 
@@ -764,8 +764,8 @@ int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
        wil->reply_id = reply_id;
        wil->reply_buf = reply;
        wil->reply_size = reply_size;
-       remain = wait_for_completion_timeout(&wil->wmi_ready,
-                       msecs_to_jiffies(to_msec));
+       remain = wait_for_completion_timeout(&wil->wmi_call,
+                                            msecs_to_jiffies(to_msec));
        if (0 == remain) {
                wil_err(wil, "wmi_call(0x%04x->0x%04x) timeout %d msec\n",
                        cmdid, reply_id, to_msec);
@@ -1160,7 +1160,7 @@ static void wmi_event_handle(struct wil6210_priv *wil,
                                                     len - sizeof(*wmi));
                        }
                        wil_dbg_wmi(wil, "Complete WMI 0x%04x\n", id);
-                       complete(&wil->wmi_ready);
+                       complete(&wil->wmi_call);
                        return;
                }
                /* unsolicited event */