Added 'work_comp' completion in 'host_if_msg'. It allows handling the
sync call to wait for sepecific completion event.
The commands can be run in sync way waiting for their specific
completion event.
Added is_sync flag in wilc_create_work_queue() to handle the sync call to
host interface.

After adding completion as part of host_if_msg now
below completion are not required
 comp_test_key_block;
 comp_test_disconn_block
 comp_get_rssi
 comp_inactive_time
 hif_wait_response

Modified wilc_get_statistics() API to handle get statistic in sync &
async way.

Signed-off-by: Ajay Singh <ajay.kat...@microchip.com>
---
 drivers/staging/wilc1000/host_interface.c         | 256 +++++++++++-----------
 drivers/staging/wilc1000/host_interface.h         |   7 +-
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |   2 +-
 3 files changed, 132 insertions(+), 133 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index cb627b0..27516f7 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -149,6 +149,8 @@ struct host_if_msg {
        struct wilc_vif *vif;
        struct work_struct work;
        void (*fn)(struct work_struct *ws);
+       struct completion work_comp;
+       bool is_sync;
 };
 
 struct join_bss_param {
@@ -186,7 +188,6 @@ static u8 p2p_listen_state;
 static struct workqueue_struct *hif_workqueue;
 static struct completion hif_thread_comp;
 static struct completion hif_driver_comp;
-static struct completion hif_wait_response;
 static struct mutex hif_deinit_lock;
 static struct timer_list periodic_rssi;
 static struct wilc_vif *periodic_rssi_vif;
@@ -205,8 +206,10 @@ static void *host_int_parse_join_bss_param(struct 
network_info *info);
 static int host_int_get_ipaddress(struct wilc_vif *vif, u8 *ip_addr, u8 idx);
 static s32 handle_scan_done(struct wilc_vif *vif, enum scan_event evt);
 
+/* 'msg' should be free by the caller for syc */
 static struct host_if_msg*
-wilc_alloc_work(struct wilc_vif *vif, void (*work_fun)(struct work_struct *))
+wilc_alloc_work(struct wilc_vif *vif, void (*work_fun)(struct work_struct *),
+               bool is_sync)
 {
        struct host_if_msg *msg;
 
@@ -218,6 +221,9 @@ wilc_alloc_work(struct wilc_vif *vif, void 
(*work_fun)(struct work_struct *))
                return ERR_PTR(-ENOMEM);
        msg->fn = work_fun;
        msg->vif = vif;
+       msg->is_sync = is_sync;
+       if (is_sync)
+               init_completion(&msg->work_comp);
 
        return msg;
 }
@@ -434,8 +440,8 @@ static void handle_get_mac_address(struct work_struct *work)
 
        if (ret)
                netdev_err(vif->ndev, "Failed to get mac address\n");
-       complete(&hif_wait_response);
-       kfree(msg);
+       complete(&msg->work_comp);
+       /* free 'msg' data later, in caller */
        complete(&hif_thread_comp);
 }
 
@@ -1618,7 +1624,7 @@ static void handle_key(struct work_struct *work)
                                                      wilc_get_vif_idx(vif));
                }
 out_wep:
-               complete(&hif_drv->comp_test_key_block);
+               complete(&msg->work_comp);
                break;
 
        case WPA_RX_GTK:
@@ -1682,7 +1688,7 @@ static void handle_key(struct work_struct *work)
                        kfree(key_buf);
                }
 out_wpa_rx_gtk:
-               complete(&hif_drv->comp_test_key_block);
+               complete(&msg->work_comp);
                kfree(hif_key->attr.wpa.key);
                kfree(hif_key->attr.wpa.seq);
                break;
@@ -1739,19 +1745,21 @@ static void handle_key(struct work_struct *work)
                }
 
 out_wpa_ptk:
-               complete(&hif_drv->comp_test_key_block);
+               complete(&msg->work_comp);
                kfree(hif_key->attr.wpa.key);
                break;
 
        case PMKSA:
                result = wilc_pmksa_key_copy(vif, hif_key);
+               /*free 'msg', this case it not a sync call*/
+               kfree(msg);
                break;
        }
 
        if (result)
                netdev_err(vif->ndev, "Failed to send key config packet\n");
 
-       kfree(msg);
+       /* free 'msg' data in caller sync call */
        complete(&hif_thread_comp);
 }
 
@@ -1825,8 +1833,8 @@ static void handle_disconnect(struct work_struct *work)
 
 out:
 
-       complete(&hif_drv->comp_test_disconn_block);
-       kfree(msg);
+       complete(&msg->work_comp);
+       /* free 'msg' in caller after receiving completion */
        complete(&hif_thread_comp);
 }
 
@@ -1856,8 +1864,8 @@ static void handle_get_rssi(struct work_struct *work)
        if (result)
                netdev_err(vif->ndev, "Failed to get RSSI value\n");
 
-       complete(&vif->hif_drv->comp_get_rssi);
-       kfree(msg);
+       complete(&msg->work_comp);
+       /* free 'msg' data in caller */
        complete(&hif_thread_comp);
 }
 
@@ -1912,9 +1920,12 @@ static void handle_get_statistics(struct work_struct 
*work)
        else if (stats->link_speed != DEFAULT_LINK_SPEED)
                wilc_enable_tcp_ack_filter(false);
 
-       if (stats != &vif->wilc->dummy_statistics)
-               complete(&hif_wait_response);
-       kfree(msg);
+       /* free 'msg' for async command, for sync caller will free it */
+       if (msg->is_sync)
+               complete(&msg->work_comp);
+       else
+               kfree(msg);
+
        complete(&hif_thread_comp);
 }
 
@@ -1925,7 +1936,6 @@ static void handle_get_inactive_time(struct work_struct 
*work)
        struct sta_inactive_t *hif_sta_inactive = &msg->body.mac_info;
        s32 result = 0;
        struct wid wid;
-       struct host_if_drv *hif_drv = vif->hif_drv;
 
        wid.id = (u16)WID_SET_STA_MAC_INACTIVE_TIME;
        wid.type = WID_STR;
@@ -1957,9 +1967,8 @@ static void handle_get_inactive_time(struct work_struct 
*work)
                netdev_err(vif->ndev, "Failed to get inactive time\n");
 
 out:
-       complete(&hif_drv->comp_inactive_time);
-
-       kfree(msg);
+       /* free 'msg' data in caller */
+       complete(&msg->work_comp);
        complete(&hif_thread_comp);
 }
 
@@ -2143,8 +2152,8 @@ static void handle_del_all_sta(struct work_struct *work)
 error:
        kfree(wid.val);
 
-       complete(&hif_wait_response);
-       kfree(msg);
+       /* free 'msg' data in caller */
+       complete(&msg->work_comp);
        complete(&hif_thread_comp);
 }
 
@@ -2365,7 +2374,7 @@ static void listen_timer_cb(struct timer_list *t)
 
        del_timer(&vif->hif_drv->remain_on_ch_timer);
 
-       msg = wilc_alloc_work(vif, handle_listen_state_expired);
+       msg = wilc_alloc_work(vif, handle_listen_state_expired, false);
        if (IS_ERR(msg))
                return;
 
@@ -2487,7 +2496,7 @@ static void handle_get_tx_pwr(struct work_struct *work)
        if (ret)
                netdev_err(vif->ndev, "Failed to get TX PWR\n");
 
-       complete(&hif_wait_response);
+       complete(&msg->work_comp);
        complete(&hif_thread_comp);
 }
 
@@ -2513,8 +2522,8 @@ static void handle_hif_exit_work(struct work_struct *work)
 {
        struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
 
-       kfree(msg);
-       complete(&hif_thread_comp);
+       /* free 'msg' data in caller */
+       complete(&msg->work_comp);
 }
 
 static void handle_scan_complete(struct work_struct *work)
@@ -2542,7 +2551,7 @@ static void timer_scan_cb(struct timer_list *t)
        struct host_if_msg *msg;
        int result;
 
-       msg = wilc_alloc_work(vif, handle_scan_timer);
+       msg = wilc_alloc_work(vif, handle_scan_timer, false);
        if (IS_ERR(msg))
                return;
 
@@ -2559,7 +2568,7 @@ static void timer_connect_cb(struct timer_list *t)
        struct host_if_msg *msg;
        int result;
 
-       msg = wilc_alloc_work(vif, handle_connect_timeout);
+       msg = wilc_alloc_work(vif, handle_connect_timeout, false);
        if (IS_ERR(msg))
                return;
 
@@ -2580,7 +2589,7 @@ int wilc_remove_wep_key(struct wilc_vif *vif, u8 index)
                return result;
        }
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2589,13 +2598,12 @@ int wilc_remove_wep_key(struct wilc_vif *vif, u8 index)
        msg->body.key_info.attr.wep.index = index;
 
        result = wilc_enqueue_cmd(msg);
-       if (result) {
+       if (result)
                netdev_err(vif->ndev, "Request to remove WEP key\n");
-               kfree(msg);
-       } else {
-               wait_for_completion(&hif_drv->comp_test_key_block);
-       }
+       else
+               wait_for_completion(&msg->work_comp);
 
+       kfree(msg);
        return result;
 }
 
@@ -2611,7 +2619,7 @@ int wilc_set_wep_default_keyid(struct wilc_vif *vif, u8 
index)
                return result;
        }
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2620,13 +2628,12 @@ int wilc_set_wep_default_keyid(struct wilc_vif *vif, u8 
index)
        msg->body.key_info.attr.wep.index = index;
 
        result = wilc_enqueue_cmd(msg);
-       if (result) {
+       if (result)
                netdev_err(vif->ndev, "Default key index\n");
-               kfree(msg);
-       } else {
-               wait_for_completion(&hif_drv->comp_test_key_block);
-       }
+       else
+               wait_for_completion(&msg->work_comp);
 
+       kfree(msg);
        return result;
 }
 
@@ -2642,7 +2649,7 @@ int wilc_add_wep_key_bss_sta(struct wilc_vif *vif, const 
u8 *key, u8 len,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2661,7 +2668,8 @@ int wilc_add_wep_key_bss_sta(struct wilc_vif *vif, const 
u8 *key, u8 len,
        if (result)
                goto free_key;
 
-       wait_for_completion(&hif_drv->comp_test_key_block);
+       wait_for_completion(&msg->work_comp);
+       kfree(msg);
        return 0;
 
 free_key:
@@ -2684,7 +2692,7 @@ int wilc_add_wep_key_bss_ap(struct wilc_vif *vif, const 
u8 *key, u8 len,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2705,7 +2713,8 @@ int wilc_add_wep_key_bss_ap(struct wilc_vif *vif, const 
u8 *key, u8 len,
        if (result)
                goto free_key;
 
-       wait_for_completion(&hif_drv->comp_test_key_block);
+       wait_for_completion(&msg->work_comp);
+       kfree(msg);
        return 0;
 
 free_key:
@@ -2736,7 +2745,7 @@ int wilc_add_ptk(struct wilc_vif *vif, const u8 *ptk, u8 
ptk_key_len,
        if (tx_mic)
                key_len += TX_MIC_KEY_LEN;
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2772,7 +2781,8 @@ int wilc_add_ptk(struct wilc_vif *vif, const u8 *ptk, u8 
ptk_key_len,
                goto free_key;
        }
 
-       wait_for_completion(&hif_drv->comp_test_key_block);
+       wait_for_completion(&msg->work_comp);
+       kfree(msg);
        return 0;
 
 free_key:
@@ -2798,7 +2808,7 @@ int wilc_add_rx_gtk(struct wilc_vif *vif, const u8 
*rx_gtk, u8 gtk_key_len,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2851,7 +2861,8 @@ int wilc_add_rx_gtk(struct wilc_vif *vif, const u8 
*rx_gtk, u8 gtk_key_len,
                goto free_key;
        }
 
-       wait_for_completion(&hif_drv->comp_test_key_block);
+       wait_for_completion(&msg->work_comp);
+       kfree(msg);
        return 0;
 
 free_key:
@@ -2872,7 +2883,7 @@ int wilc_set_pmkid_info(struct wilc_vif *vif,
        struct host_if_msg *msg;
        int i;
 
-       msg = wilc_alloc_work(vif, handle_key);
+       msg = wilc_alloc_work(vif, handle_key, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -2900,20 +2911,20 @@ int wilc_get_mac_address(struct wilc_vif *vif, u8 
*mac_addr)
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_get_mac_address);
+       msg = wilc_alloc_work(vif, handle_get_mac_address, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
        msg->body.get_mac_info.mac_addr = mac_addr;
 
        result = wilc_enqueue_cmd(msg);
-       if (result) {
+       if (result)
                netdev_err(vif->ndev, "Failed to send get mac address\n");
-               kfree(msg);
-               return -EFAULT;
-       }
+       else
+               wait_for_completion(&msg->work_comp);
+
+       kfree(msg);
 
-       wait_for_completion(&hif_wait_response);
        return result;
 }
 
@@ -2937,7 +2948,7 @@ int wilc_set_join_req(struct wilc_vif *vif, u8 *bssid, 
const u8 *ssid,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_connect);
+       msg = wilc_alloc_work(vif, handle_connect, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3013,18 +3024,17 @@ int wilc_disconnect(struct wilc_vif *vif, u16 
reason_code)
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_disconnect);
+       msg = wilc_alloc_work(vif, handle_disconnect, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
        result = wilc_enqueue_cmd(msg);
-       if (result) {
+       if (result)
                netdev_err(vif->ndev, "Failed to send message: disconnect\n");
-               kfree(msg);
-       } else {
-               wait_for_completion(&hif_drv->comp_test_disconn_block);
-       }
+       else
+               wait_for_completion(&msg->work_comp);
 
+       kfree(msg);
        return result;
 }
 
@@ -3058,7 +3068,7 @@ int wilc_set_mac_chnl_num(struct wilc_vif *vif, u8 
channel)
        int result;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_set_channel);
+       msg = wilc_alloc_work(vif, handle_set_channel, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3079,7 +3089,7 @@ int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int 
index, u8 mode,
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_set_wfi_drv_handler);
+       msg = wilc_alloc_work(vif, handle_set_wfi_drv_handler, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3101,7 +3111,7 @@ int wilc_set_operation_mode(struct wilc_vif *vif, u32 
mode)
        int result = 0;
        struct host_if_msg *msg;
 
-       msg  = wilc_alloc_work(vif, handle_set_operation_mode);
+       msg  = wilc_alloc_work(vif, handle_set_operation_mode, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3127,21 +3137,20 @@ s32 wilc_get_inactive_time(struct wilc_vif *vif, const 
u8 *mac,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_get_inactive_time);
+       msg = wilc_alloc_work(vif, handle_get_inactive_time, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
        memcpy(msg->body.mac_info.mac, mac, ETH_ALEN);
 
        result = wilc_enqueue_cmd(msg);
-       if (result) {
+       if (result)
                netdev_err(vif->ndev, "Failed to send get host ch param\n");
-               kfree(msg);
-       } else {
-               wait_for_completion(&hif_drv->comp_inactive_time);
-       }
+       else
+               wait_for_completion(&msg->work_comp);
 
        *out_val = inactive_time;
+       kfree(msg);
 
        return result;
 }
@@ -3150,37 +3159,36 @@ int wilc_get_rssi(struct wilc_vif *vif, s8 *rssi_level)
 {
        int result = 0;
        struct host_if_msg *msg;
-       struct host_if_drv *hif_drv = vif->hif_drv;
 
-       msg = wilc_alloc_work(vif, handle_get_rssi);
+       if (!rssi_level) {
+               netdev_err(vif->ndev, "RSS pointer value is null\n");
+               return -EFAULT;
+       }
+
+       msg = wilc_alloc_work(vif, handle_get_rssi, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
        result = wilc_enqueue_cmd(msg);
        if (result) {
                netdev_err(vif->ndev, "Failed to send get host ch param\n");
-               kfree(msg);
-               return result;
-       }
-
-       wait_for_completion(&hif_drv->comp_get_rssi);
-
-       if (!rssi_level) {
-               netdev_err(vif->ndev, "RSS pointer value is null\n");
-               return -EFAULT;
+       } else {
+               wait_for_completion(&msg->work_comp);
+               *rssi_level = rssi;
        }
 
-       *rssi_level = rssi;
+       kfree(msg);
 
        return result;
 }
 
-int wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats)
+int
+wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats, bool is_sync)
 {
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_get_statistics);
+       msg = wilc_alloc_work(vif, handle_get_statistics, is_sync);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3193,8 +3201,11 @@ int wilc_get_statistics(struct wilc_vif *vif, struct 
rf_info *stats)
                return result;
        }
 
-       if (stats != &vif->wilc->dummy_statistics)
-               wait_for_completion(&hif_wait_response);
+       if (is_sync) {
+               wait_for_completion(&msg->work_comp);
+               kfree(msg);
+       }
+
        return result;
 }
 
@@ -3213,7 +3224,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 
scan_type,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_scan);
+       msg = wilc_alloc_work(vif, handle_scan, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3280,7 +3291,7 @@ int wilc_hif_set_cfg(struct wilc_vif *vif,
                return -EFAULT;
        }
 
-       msg = wilc_alloc_work(vif, handle_cfg_param);
+       msg = wilc_alloc_work(vif, handle_cfg_param, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3302,7 +3313,7 @@ static void get_periodic_rssi(struct timer_list *unused)
        }
 
        if (vif->hif_drv->hif_state == HOST_IF_CONNECTED)
-               wilc_get_statistics(vif, &vif->wilc->dummy_statistics);
+               wilc_get_statistics(vif, &vif->wilc->dummy_statistics, false);
 
        mod_timer(&periodic_rssi, jiffies + msecs_to_jiffies(5000));
 }
@@ -3317,8 +3328,6 @@ int wilc_init(struct net_device *dev, struct host_if_drv 
**hif_drv_handler)
        vif = netdev_priv(dev);
        wilc = vif->wilc;
 
-       init_completion(&hif_wait_response);
-
        hif_drv  = kzalloc(sizeof(*hif_drv), GFP_KERNEL);
        if (!hif_drv)
                return -ENOMEM;
@@ -3339,11 +3348,6 @@ int wilc_init(struct net_device *dev, struct host_if_drv 
**hif_drv_handler)
                mutex_init(&hif_deinit_lock);
        }
 
-       init_completion(&hif_drv->comp_test_key_block);
-       init_completion(&hif_drv->comp_test_disconn_block);
-       init_completion(&hif_drv->comp_get_rssi);
-       init_completion(&hif_drv->comp_inactive_time);
-
        if (clients_count == 0) {
                hif_workqueue = create_singlethread_workqueue("WILC_wq");
                if (!hif_workqueue) {
@@ -3414,7 +3418,7 @@ int wilc_deinit(struct wilc_vif *vif)
        if (clients_count == 1) {
                struct host_if_msg *msg;
 
-               msg = wilc_alloc_work(vif, handle_hif_exit_work);
+               msg = wilc_alloc_work(vif, handle_hif_exit_work, true);
                if (IS_ERR(msg))
                        return PTR_ERR(msg);
 
@@ -3422,8 +3426,8 @@ int wilc_deinit(struct wilc_vif *vif)
                if (result)
                        netdev_err(vif->ndev, "deinit : Error(%d)\n", result);
                else
-                       wait_for_completion(&hif_thread_comp);
-
+                       wait_for_completion(&msg->work_comp);
+               kfree(msg);
                destroy_workqueue(hif_workqueue);
        }
 
@@ -3457,7 +3461,7 @@ void wilc_network_info_received(struct wilc *wilc, u8 
*buffer, u32 length)
                return;
        }
 
-       msg = wilc_alloc_work(vif, handle_rcvd_ntwrk_info);
+       msg = wilc_alloc_work(vif, handle_rcvd_ntwrk_info, false);
        if (IS_ERR(msg))
                return;
 
@@ -3509,7 +3513,7 @@ void wilc_gnrl_async_info_received(struct wilc *wilc, u8 
*buffer, u32 length)
                return;
        }
 
-       msg = wilc_alloc_work(vif, handle_rcvd_gnrl_async_info);
+       msg = wilc_alloc_work(vif, handle_rcvd_gnrl_async_info, false);
        if (IS_ERR(msg)) {
                mutex_unlock(&hif_deinit_lock);
                return;
@@ -3555,7 +3559,7 @@ void wilc_scan_complete_received(struct wilc *wilc, u8 
*buffer, u32 length)
        if (hif_drv->usr_scan_req.scan_result) {
                struct host_if_msg *msg;
 
-               msg = wilc_alloc_work(vif, handle_scan_complete);
+               msg = wilc_alloc_work(vif, handle_scan_complete, false);
                if (IS_ERR(msg))
                        return;
 
@@ -3576,7 +3580,7 @@ int wilc_remain_on_channel(struct wilc_vif *vif, u32 
session_id,
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_remain_on_chan_work);
+       msg = wilc_alloc_work(vif, handle_remain_on_chan_work, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3609,7 +3613,7 @@ int wilc_listen_state_expired(struct wilc_vif *vif, u32 
session_id)
 
        del_timer(&hif_drv->remain_on_ch_timer);
 
-       msg = wilc_alloc_work(vif, handle_listen_state_expired);
+       msg = wilc_alloc_work(vif, handle_listen_state_expired, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3629,7 +3633,7 @@ int wilc_frame_register(struct wilc_vif *vif, u16 
frame_type, bool reg)
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_register_frame);
+       msg = wilc_alloc_work(vif, handle_register_frame, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3664,7 +3668,7 @@ int wilc_add_beacon(struct wilc_vif *vif, u32 interval, 
u32 dtim_period,
        struct host_if_msg *msg;
        struct beacon_attr *beacon_info;
 
-       msg = wilc_alloc_work(vif, handle_add_beacon);
+       msg = wilc_alloc_work(vif, handle_add_beacon, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3708,7 +3712,7 @@ int wilc_del_beacon(struct wilc_vif *vif)
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_del_beacon);
+       msg = wilc_alloc_work(vif, handle_del_beacon, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3727,7 +3731,7 @@ int wilc_add_station(struct wilc_vif *vif, struct 
add_sta_param *sta_param)
        struct host_if_msg *msg;
        struct add_sta_param *add_sta_info;
 
-       msg = wilc_alloc_work(vif, handle_add_station);
+       msg = wilc_alloc_work(vif, handle_add_station, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3758,7 +3762,7 @@ int wilc_del_station(struct wilc_vif *vif, const u8 
*mac_addr)
        struct host_if_msg *msg;
        struct del_sta *del_sta_info;
 
-       msg = wilc_alloc_work(vif, handle_del_station);
+       msg = wilc_alloc_work(vif, handle_del_station, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3786,7 +3790,7 @@ int wilc_del_allstation(struct wilc_vif *vif, u8 
mac_addr[][ETH_ALEN])
        int i;
        u8 assoc_sta = 0;
 
-       msg = wilc_alloc_work(vif, handle_del_all_sta);
+       msg = wilc_alloc_work(vif, handle_del_all_sta, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3807,12 +3811,12 @@ int wilc_del_allstation(struct wilc_vif *vif, u8 
mac_addr[][ETH_ALEN])
        del_all_sta_info->assoc_sta = assoc_sta;
        result = wilc_enqueue_cmd(msg);
 
-       if (result) {
+       if (result)
                netdev_err(vif->ndev, "wilc_mq_send fail\n");
-               kfree(msg);
-       } else {
-               wait_for_completion(&hif_wait_response);
-       }
+       else
+               wait_for_completion(&msg->work_comp);
+
+       kfree(msg);
 
        return result;
 }
@@ -3824,7 +3828,7 @@ int wilc_edit_station(struct wilc_vif *vif,
        struct host_if_msg *msg;
        struct add_sta_param *add_sta_info;
 
-       msg = wilc_alloc_work(vif, handle_edit_station);
+       msg = wilc_alloc_work(vif, handle_edit_station, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3858,7 +3862,7 @@ int wilc_set_power_mgmt(struct wilc_vif *vif, bool 
enabled, u32 timeout)
        if (wilc_wlan_get_num_conn_ifcs(vif->wilc) == 2 && enabled)
                return 0;
 
-       msg = wilc_alloc_work(vif, handle_power_management);
+       msg = wilc_alloc_work(vif, handle_power_management, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -3879,7 +3883,7 @@ int wilc_setup_multicast_filter(struct wilc_vif *vif, 
bool enabled,
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_set_mcast_filter);
+       msg = wilc_alloc_work(vif, handle_set_mcast_filter, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -4064,7 +4068,7 @@ int wilc_setup_ipaddress(struct wilc_vif *vif, u8 
*ip_addr, u8 idx)
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_set_ip_address);
+       msg = wilc_alloc_work(vif, handle_set_ip_address, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -4085,7 +4089,7 @@ static int host_int_get_ipaddress(struct wilc_vif *vif, 
u8 *ip_addr, u8 idx)
        int result = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_get_ip_address);
+       msg = wilc_alloc_work(vif, handle_get_ip_address, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -4106,7 +4110,7 @@ int wilc_set_tx_power(struct wilc_vif *vif, u8 tx_power)
        int ret = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_set_tx_pwr);
+       msg = wilc_alloc_work(vif, handle_set_tx_pwr, false);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
@@ -4126,20 +4130,18 @@ int wilc_get_tx_power(struct wilc_vif *vif, u8 
*tx_power)
        int ret = 0;
        struct host_if_msg *msg;
 
-       msg = wilc_alloc_work(vif, handle_get_tx_pwr);
+       msg = wilc_alloc_work(vif, handle_get_tx_pwr, true);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
        ret = wilc_enqueue_cmd(msg);
        if (ret) {
                netdev_err(vif->ndev, "Failed to get TX PWR\n");
-               kfree(msg);
-               return ret;
+       } else {
+               wait_for_completion(&msg->work_comp);
+               *tx_power = msg->body.tx_power.tx_pwr;
        }
 
-       wait_for_completion(&hif_wait_response);
-
-       *tx_power = msg->body.tx_power.tx_pwr;
        /* free 'msg' after copying data */
        kfree(msg);
        return ret;
diff --git a/drivers/staging/wilc1000/host_interface.h 
b/drivers/staging/wilc1000/host_interface.h
index 068b587..0ea22ab 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -273,10 +273,6 @@ struct host_if_drv {
        struct cfg_param_attr cfg_values;
        /*lock to protect concurrent setting of cfg params*/
        struct mutex cfg_values_lock;
-       struct completion comp_test_key_block;
-       struct completion comp_test_disconn_block;
-       struct completion comp_get_rssi;
-       struct completion comp_inactive_time;
 
        struct timer_list scan_timer;
        struct wilc_vif *scan_timer_vif;
@@ -359,7 +355,8 @@ int wilc_frame_register(struct wilc_vif *vif, u16 
frame_type, bool reg);
 int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mode,
                             u8 ifc_id);
 int wilc_set_operation_mode(struct wilc_vif *vif, u32 mode);
-int wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats);
+int wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats,
+                       bool is_sync);
 void wilc_resolve_disconnect_aberration(struct wilc_vif *vif);
 int wilc_get_vif_idx(struct wilc_vif *vif);
 int wilc_set_tx_power(struct wilc_vif *vif, u8 tx_power);
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index e248702..1f09925 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -1148,7 +1148,7 @@ static int get_station(struct wiphy *wiphy, struct 
net_device *dev,
        } else if (vif->iftype == STATION_MODE) {
                struct rf_info stats;
 
-               wilc_get_statistics(vif, &stats);
+               wilc_get_statistics(vif, &stats, true);
 
                sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL) |
                                 BIT(NL80211_STA_INFO_RX_PACKETS) |
-- 
2.7.4

Reply via email to