]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/staging/wilc1000/host_interface.c
staging: wilc1000: fix incorrent type in initializer
[linux.git] / drivers / staging / wilc1000 / host_interface.c
index 3d0badc34825f27fb34addab44eec4c4e264455a..4dd9a20f6a0bd93435a865e052abf4d68a1fbdb5 100644 (file)
@@ -6,25 +6,23 @@
 
 #include "wilc_wfi_netdevice.h"
 
-#define HOST_IF_SCAN_TIMEOUT                    4000
-#define HOST_IF_CONNECT_TIMEOUT                 9500
+#define WILC_HIF_SCAN_TIMEOUT_MS                4000
+#define WILC_HIF_CONNECT_TIMEOUT_MS             9500
 
-#define FALSE_FRMWR_CHANNEL                    100
+#define WILC_FALSE_FRMWR_CHANNEL               100
+#define WILC_MAX_RATES_SUPPORTED               12
 
-#define REAL_JOIN_REQ                          0
-
-struct rcvd_async_info {
-       u8 *buffer;
-       u32 len;
+struct wilc_rcvd_mac_info {
+       u8 status;
 };
 
-struct set_multicast {
-       bool enabled;
+struct wilc_set_multicast {
+       u32 enabled;
        u32 cnt;
        u8 *mc_list;
 };
 
-struct del_all_sta {
+struct wilc_del_all_sta {
        u8 assoc_sta;
        u8 mac[WILC_MAX_NUM_STA][ETH_ALEN];
 };
@@ -71,16 +69,16 @@ struct wilc_gtk_key {
        u8 key[0];
 } __packed;
 
-union message_body {
-       struct rcvd_net_info net_info;
-       struct rcvd_async_info async_info;
-       struct set_multicast multicast_info;
-       struct remain_ch remain_on_ch;
+union wilc_message_body {
+       struct wilc_rcvd_net_info net_info;
+       struct wilc_rcvd_mac_info mac_info;
+       struct wilc_set_multicast mc_info;
+       struct wilc_remain_ch remain_on_ch;
        char *data;
 };
 
 struct host_if_msg {
-       union message_body body;
+       union wilc_message_body body;
        struct wilc_vif *vif;
        struct work_struct work;
        void (*fn)(struct work_struct *ws);
@@ -88,37 +86,50 @@ struct host_if_msg {
        bool is_sync;
 };
 
-struct join_bss_param {
-       enum bss_types bss_type;
+struct wilc_noa_opp_enable {
+       u8 ct_window;
+       u8 cnt;
+       __le32 duration;
+       __le32 interval;
+       __le32 start_time;
+} __packed;
+
+struct wilc_noa_opp_disable {
+       u8 cnt;
+       __le32 duration;
+       __le32 interval;
+       __le32 start_time;
+} __packed;
+
+struct wilc_join_bss_param {
+       char ssid[IEEE80211_MAX_SSID_LEN];
+       u8 ssid_terminator;
+       u8 bss_type;
+       u8 ch;
+       __le16 cap_info;
+       u8 sa[ETH_ALEN];
+       u8 bssid[ETH_ALEN];
+       __le16 beacon_period;
        u8 dtim_period;
-       u16 beacon_period;
-       u16 cap_info;
-       u8 bssid[6];
-       char ssid[MAX_SSID_LEN];
-       u8 ssid_len;
-       u8 supp_rates[MAX_RATES_SUPPORTED + 1];
-       u8 ht_capable;
+       u8 supp_rates[WILC_MAX_RATES_SUPPORTED + 1];
        u8 wmm_cap;
        u8 uapsd_cap;
-       bool rsn_found;
+       u8 ht_capable;
+       u8 rsn_found;
        u8 rsn_grp_policy;
        u8 mode_802_11i;
-       u8 rsn_pcip_policy[3];
-       u8 rsn_auth_policy[3];
+       u8 p_suites[3];
+       u8 akm_suites[3];
        u8 rsn_cap[2];
-       u32 tsf;
        u8 noa_enabled;
-       u8 opp_enabled;
-       u8 ct_window;
-       u8 cnt;
+       __le32 tsf_lo;
        u8 idx;
-       u8 duration[4];
-       u8 interval[4];
-       u8 start_time[4];
-};
-
-static struct host_if_drv *terminated_handle;
-static struct mutex hif_deinit_lock;
+       u8 opp_enabled;
+       union {
+               struct wilc_noa_opp_disable opp_dis;
+               struct wilc_noa_opp_enable opp_en;
+       };
+} __packed;
 
 /* 'msg' should be free by the caller for syc */
 static struct host_if_msg*
@@ -185,7 +196,7 @@ static int handle_scan_done(struct wilc_vif *vif, enum scan_event evt)
        u8 abort_running_scan;
        struct wid wid;
        struct host_if_drv *hif_drv = vif->hif_drv;
-       struct user_scan_req *scan_req;
+       struct wilc_user_scan_req *scan_req;
 
        if (evt == SCAN_EVENT_ABORTED) {
                abort_running_scan = 1;
@@ -210,7 +221,7 @@ static int handle_scan_done(struct wilc_vif *vif, enum scan_event evt)
 
        scan_req = &hif_drv->usr_scan_req;
        if (scan_req->scan_result) {
-               scan_req->scan_result(evt, NULL, scan_req->arg, NULL);
+               scan_req->scan_result(evt, NULL, scan_req->arg);
                scan_req->scan_result = NULL;
        }
 
@@ -218,9 +229,10 @@ static int handle_scan_done(struct wilc_vif *vif, enum scan_event evt)
 }
 
 int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type,
-             u8 *ch_freq_list, u8 ch_list_len, const u8 *ies,
-             size_t ies_len, wilc_scan_result scan_result, void *user_arg,
-             struct hidden_network *hidden_net)
+             u8 *ch_freq_list, u8 ch_list_len, const u8 *ies, size_t ies_len,
+             void (*scan_result_fn)(enum scan_event,
+                                    struct wilc_rcvd_net_info *, void *),
+             void *user_arg, struct wilc_probe_ssid *search)
 {
        int result = 0;
        struct wid wid_list[5];
@@ -228,7 +240,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type,
        u32 i;
        u8 *buffer;
        u8 valuesize = 0;
-       u8 *hdn_ntwk_wid_val = NULL;
+       u8 *search_ssid_vals = NULL;
        struct host_if_drv *hif_drv = vif->hif_drv;
 
        if (hif_drv->hif_state >= HOST_IF_SCANNING &&
@@ -246,26 +258,24 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type,
 
        hif_drv->usr_scan_req.ch_cnt = 0;
 
-       if (hidden_net) {
-               wid_list[index].id = WID_SSID_PROBE_REQ;
-               wid_list[index].type = WID_STR;
-
-               for (i = 0; i < hidden_net->n_ssids; i++)
-                       valuesize += ((hidden_net->net_info[i].ssid_len) + 1);
-               hdn_ntwk_wid_val = kmalloc(valuesize + 1, GFP_KERNEL);
-               wid_list[index].val = hdn_ntwk_wid_val;
-               if (wid_list[index].val) {
+       if (search) {
+               for (i = 0; i < search->n_ssids; i++)
+                       valuesize += ((search->ssid_info[i].ssid_len) + 1);
+               search_ssid_vals = kmalloc(valuesize + 1, GFP_KERNEL);
+               if (search_ssid_vals) {
+                       wid_list[index].id = WID_SSID_PROBE_REQ;
+                       wid_list[index].type = WID_STR;
+                       wid_list[index].val = search_ssid_vals;
                        buffer = wid_list[index].val;
 
-                       *buffer++ = hidden_net->n_ssids;
+                       *buffer++ = search->n_ssids;
 
-                       for (i = 0; i < hidden_net->n_ssids; i++) {
-                               *buffer++ = hidden_net->net_info[i].ssid_len;
-                               memcpy(buffer, hidden_net->net_info[i].ssid,
-                                      hidden_net->net_info[i].ssid_len);
-                               buffer += hidden_net->net_info[i].ssid_len;
+                       for (i = 0; i < search->n_ssids; i++) {
+                               *buffer++ = search->ssid_info[i].ssid_len;
+                               memcpy(buffer, search->ssid_info[i].ssid,
+                                      search->ssid_info[i].ssid_len);
+                               buffer += search->ssid_info[i].ssid_len;
                        }
-
                        wid_list[index].size = (s32)(valuesize + 1);
                        index++;
                }
@@ -311,16 +321,16 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type,
                goto error;
        }
 
-       hif_drv->usr_scan_req.scan_result = scan_result;
+       hif_drv->usr_scan_req.scan_result = scan_result_fn;
        hif_drv->usr_scan_req.arg = user_arg;
        hif_drv->scan_timer_vif = vif;
        mod_timer(&hif_drv->scan_timer,
-                 jiffies + msecs_to_jiffies(HOST_IF_SCAN_TIMEOUT));
+                 jiffies + msecs_to_jiffies(WILC_HIF_SCAN_TIMEOUT_MS));
 
 error:
-       if (hidden_net) {
-               kfree(hidden_net->net_info);
-               kfree(hdn_ntwk_wid_val);
+       if (search) {
+               kfree(search->ssid_info);
+               kfree(search_ssid_vals);
        }
 
        return result;
@@ -329,35 +339,16 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type,
 static int wilc_send_connect_wid(struct wilc_vif *vif)
 {
        int result = 0;
-       struct wid wid_list[8];
-       u32 wid_cnt = 0, dummyval = 0;
-       u8 *cur_byte = NULL;
+       struct wid wid_list[4];
+       u32 wid_cnt = 0;
        struct host_if_drv *hif_drv = vif->hif_drv;
-       struct user_conn_req *conn_attr = &hif_drv->usr_conn_req;
-       struct join_bss_param *bss_param = hif_drv->usr_conn_req.param;
-
-       wid_list[wid_cnt].id = WID_SUCCESS_FRAME_COUNT;
-       wid_list[wid_cnt].type = WID_INT;
-       wid_list[wid_cnt].size = sizeof(u32);
-       wid_list[wid_cnt].val = (s8 *)(&(dummyval));
-       wid_cnt++;
-
-       wid_list[wid_cnt].id = WID_RECEIVED_FRAGMENT_COUNT;
-       wid_list[wid_cnt].type = WID_INT;
-       wid_list[wid_cnt].size = sizeof(u32);
-       wid_list[wid_cnt].val = (s8 *)(&(dummyval));
-       wid_cnt++;
-
-       wid_list[wid_cnt].id = WID_FAILED_COUNT;
-       wid_list[wid_cnt].type = WID_INT;
-       wid_list[wid_cnt].size = sizeof(u32);
-       wid_list[wid_cnt].val = (s8 *)(&(dummyval));
-       wid_cnt++;
+       struct wilc_conn_info *conn_attr = &hif_drv->conn_info;
+       struct wilc_join_bss_param *bss_param = conn_attr->param;
 
        wid_list[wid_cnt].id = WID_INFO_ELEMENT_ASSOCIATE;
        wid_list[wid_cnt].type = WID_BIN_DATA;
-       wid_list[wid_cnt].val = conn_attr->ies;
-       wid_list[wid_cnt].size = conn_attr->ies_len;
+       wid_list[wid_cnt].val = conn_attr->req_ies;
+       wid_list[wid_cnt].size = conn_attr->req_ies_len;
        wid_cnt++;
 
        wid_list[wid_cnt].id = WID_11I_MODE;
@@ -374,97 +365,8 @@ static int wilc_send_connect_wid(struct wilc_vif *vif)
 
        wid_list[wid_cnt].id = WID_JOIN_REQ_EXTENDED;
        wid_list[wid_cnt].type = WID_STR;
-       wid_list[wid_cnt].size = 112;
-       wid_list[wid_cnt].val = kmalloc(wid_list[wid_cnt].size, GFP_KERNEL);
-
-       if (!wid_list[wid_cnt].val) {
-               result = -EFAULT;
-               goto error;
-       }
-
-       cur_byte = wid_list[wid_cnt].val;
-
-       if (conn_attr->ssid) {
-               memcpy(cur_byte, conn_attr->ssid, conn_attr->ssid_len);
-               cur_byte[conn_attr->ssid_len] = '\0';
-       }
-       cur_byte += MAX_SSID_LEN;
-       *(cur_byte++) = WILC_FW_BSS_TYPE_INFRA;
-
-       if (conn_attr->ch >= 1 && conn_attr->ch <= 14) {
-               *(cur_byte++) = conn_attr->ch;
-       } else {
-               netdev_err(vif->ndev, "Channel out of range\n");
-               *(cur_byte++) = 0xFF;
-       }
-       put_unaligned_le16(bss_param->cap_info, cur_byte);
-       cur_byte += 2;
-
-       if (conn_attr->bssid)
-               memcpy(cur_byte, conn_attr->bssid, 6);
-       cur_byte += 6;
-
-       if (conn_attr->bssid)
-               memcpy(cur_byte, conn_attr->bssid, 6);
-       cur_byte += 6;
-
-       put_unaligned_le16(bss_param->beacon_period, cur_byte);
-       cur_byte += 2;
-       *(cur_byte++)  =  bss_param->dtim_period;
-
-       memcpy(cur_byte, bss_param->supp_rates, MAX_RATES_SUPPORTED + 1);
-       cur_byte += (MAX_RATES_SUPPORTED + 1);
-
-       *(cur_byte++)  =  bss_param->wmm_cap;
-       *(cur_byte++)  = bss_param->uapsd_cap;
-
-       *(cur_byte++)  = bss_param->ht_capable;
-       conn_attr->ht_capable = bss_param->ht_capable;
-
-       *(cur_byte++)  =  bss_param->rsn_found;
-       *(cur_byte++)  =  bss_param->rsn_grp_policy;
-       *(cur_byte++) =  bss_param->mode_802_11i;
-
-       memcpy(cur_byte, bss_param->rsn_pcip_policy,
-              sizeof(bss_param->rsn_pcip_policy));
-       cur_byte += sizeof(bss_param->rsn_pcip_policy);
-
-       memcpy(cur_byte, bss_param->rsn_auth_policy,
-              sizeof(bss_param->rsn_auth_policy));
-       cur_byte += sizeof(bss_param->rsn_auth_policy);
-
-       memcpy(cur_byte, bss_param->rsn_cap, sizeof(bss_param->rsn_cap));
-       cur_byte += sizeof(bss_param->rsn_cap);
-
-       *(cur_byte++) = REAL_JOIN_REQ;
-       *(cur_byte++) = bss_param->noa_enabled;
-
-       if (bss_param->noa_enabled) {
-               put_unaligned_le32(bss_param->tsf, cur_byte);
-               cur_byte += 4;
-
-               *(cur_byte++) = bss_param->opp_enabled;
-               *(cur_byte++) = bss_param->idx;
-
-               if (bss_param->opp_enabled)
-                       *(cur_byte++) = bss_param->ct_window;
-
-               *(cur_byte++) = bss_param->cnt;
-
-               memcpy(cur_byte, bss_param->duration,
-                      sizeof(bss_param->duration));
-               cur_byte += sizeof(bss_param->duration);
-
-               memcpy(cur_byte, bss_param->interval,
-                      sizeof(bss_param->interval));
-               cur_byte += sizeof(bss_param->interval);
-
-               memcpy(cur_byte, bss_param->start_time,
-                      sizeof(bss_param->start_time));
-               cur_byte += sizeof(bss_param->start_time);
-       }
-
-       cur_byte = wid_list[wid_cnt].val;
+       wid_list[wid_cnt].size = sizeof(*bss_param);
+       wid_list[wid_cnt].val = (u8 *)bss_param;
        wid_cnt++;
 
        result = wilc_send_config_pkt(vif, WILC_SET_CFG, wid_list,
@@ -472,25 +374,17 @@ static int wilc_send_connect_wid(struct wilc_vif *vif)
                                      wilc_get_vif_idx(vif));
        if (result) {
                netdev_err(vif->ndev, "failed to send config packet\n");
-               kfree(cur_byte);
                goto error;
        } else {
                hif_drv->hif_state = HOST_IF_WAITING_CONN_RESP;
        }
 
-       kfree(cur_byte);
        return 0;
 
 error:
 
-       kfree(conn_attr->bssid);
-       conn_attr->bssid = NULL;
-
-       kfree(conn_attr->ssid);
-       conn_attr->ssid = NULL;
-
-       kfree(conn_attr->ies);
-       conn_attr->ies = NULL;
+       kfree(conn_attr->req_ies);
+       conn_attr->req_ies = NULL;
 
        return result;
 }
@@ -500,7 +394,6 @@ static void handle_connect_timeout(struct work_struct *work)
        struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
        struct wilc_vif *vif = msg->vif;
        int result;
-       struct connect_info info;
        struct wid wid;
        u16 dummy_reason_code = 0;
        struct host_if_drv *hif_drv = vif->hif_drv;
@@ -512,31 +405,11 @@ static void handle_connect_timeout(struct work_struct *work)
 
        hif_drv->hif_state = HOST_IF_IDLE;
 
-       memset(&info, 0, sizeof(struct connect_info));
+       if (hif_drv->conn_info.conn_result) {
+               hif_drv->conn_info.conn_result(CONN_DISCONN_EVENT_CONN_RESP,
+                                              WILC_MAC_STATUS_DISCONNECTED,
+                                              hif_drv->conn_info.arg);
 
-       if (hif_drv->usr_conn_req.conn_result) {
-               if (hif_drv->usr_conn_req.bssid) {
-                       memcpy(info.bssid,
-                              hif_drv->usr_conn_req.bssid, 6);
-               }
-
-               if (hif_drv->usr_conn_req.ies) {
-                       info.req_ies_len = hif_drv->usr_conn_req.ies_len;
-                       info.req_ies = kmemdup(hif_drv->usr_conn_req.ies,
-                                              hif_drv->usr_conn_req.ies_len,
-                                              GFP_KERNEL);
-                       if (!info.req_ies)
-                               goto out;
-               }
-
-               hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_CONN_RESP,
-                                                 &info,
-                                                 WILC_MAC_STATUS_DISCONNECTED,
-                                                 NULL,
-                                                 hif_drv->usr_conn_req.arg);
-
-               kfree(info.req_ies);
-               info.req_ies = NULL;
        } else {
                netdev_err(vif->ndev, "%s: conn_result is NULL\n", __func__);
        }
@@ -551,346 +424,174 @@ static void handle_connect_timeout(struct work_struct *work)
        if (result)
                netdev_err(vif->ndev, "Failed to send disconnect\n");
 
-       hif_drv->usr_conn_req.ssid_len = 0;
-       kfree(hif_drv->usr_conn_req.ssid);
-       hif_drv->usr_conn_req.ssid = NULL;
-       kfree(hif_drv->usr_conn_req.bssid);
-       hif_drv->usr_conn_req.bssid = NULL;
-       hif_drv->usr_conn_req.ies_len = 0;
-       kfree(hif_drv->usr_conn_req.ies);
-       hif_drv->usr_conn_req.ies = NULL;
+       hif_drv->conn_info.req_ies_len = 0;
+       kfree(hif_drv->conn_info.req_ies);
+       hif_drv->conn_info.req_ies = NULL;
 
 out:
        kfree(msg);
 }
 
-static void host_int_fill_join_bss_param(struct join_bss_param *param, u8 *ies,
-                                        u16 *out_index, u8 *pcipher_tc,
-                                        u8 *auth_total_cnt, u32 tsf_lo,
-                                        u8 *rates_no)
+void *wilc_parse_join_bss_param(struct cfg80211_bss *bss,
+                               struct cfg80211_crypto_settings *crypto)
 {
-       u8 ext_rates_no;
-       u16 offset;
-       u8 pcipher_cnt;
-       u8 auth_cnt;
-       u8 i, j;
-       u16 index = *out_index;
-
-       if (ies[index] == WLAN_EID_SUPP_RATES) {
-               *rates_no = ies[index + 1];
-               param->supp_rates[0] = *rates_no;
-               index += 2;
-
-               for (i = 0; i < *rates_no; i++)
-                       param->supp_rates[i + 1] = ies[index + i];
-
-               index += *rates_no;
-       } else if (ies[index] == WLAN_EID_EXT_SUPP_RATES) {
-               ext_rates_no = ies[index + 1];
-               if (ext_rates_no > (MAX_RATES_SUPPORTED - *rates_no))
-                       param->supp_rates[0] = MAX_RATES_SUPPORTED;
-               else
-                       param->supp_rates[0] += ext_rates_no;
-               index += 2;
-               for (i = 0; i < (param->supp_rates[0] - *rates_no); i++)
-                       param->supp_rates[*rates_no + i + 1] = ies[index + i];
-
-               index += ext_rates_no;
-       } else if (ies[index] == WLAN_EID_HT_CAPABILITY) {
-               param->ht_capable = true;
-               index += ies[index + 1] + 2;
-       } else if ((ies[index] == WLAN_EID_VENDOR_SPECIFIC) &&
-                  (ies[index + 2] == 0x00) && (ies[index + 3] == 0x50) &&
-                  (ies[index + 4] == 0xF2) && (ies[index + 5] == 0x02) &&
-                  ((ies[index + 6] == 0x00) || (ies[index + 6] == 0x01)) &&
-                  (ies[index + 7] == 0x01)) {
-               param->wmm_cap = true;
-
-               if (ies[index + 8] & BIT(7))
-                       param->uapsd_cap = true;
-               index += ies[index + 1] + 2;
-       } else if ((ies[index] == WLAN_EID_VENDOR_SPECIFIC) &&
-                (ies[index + 2] == 0x50) && (ies[index + 3] == 0x6f) &&
-                (ies[index + 4] == 0x9a) &&
-                (ies[index + 5] == 0x09) && (ies[index + 6] == 0x0c)) {
-               u16 p2p_cnt;
-
-               param->tsf = tsf_lo;
-               param->noa_enabled = 1;
-               param->idx = ies[index + 9];
-
-               if (ies[index + 10] & BIT(7)) {
-                       param->opp_enabled = 1;
-                       param->ct_window = ies[index + 10];
-               } else {
-                       param->opp_enabled = 0;
-               }
-
-               param->cnt = ies[index + 11];
-               p2p_cnt = index + 12;
-
-               memcpy(param->duration, ies + p2p_cnt, 4);
-               p2p_cnt += 4;
-
-               memcpy(param->interval, ies + p2p_cnt, 4);
-               p2p_cnt += 4;
-
-               memcpy(param->start_time, ies + p2p_cnt, 4);
-
-               index += ies[index + 1] + 2;
-       } else if ((ies[index] == WLAN_EID_RSN) ||
-                ((ies[index] == WLAN_EID_VENDOR_SPECIFIC) &&
-                 (ies[index + 2] == 0x00) &&
-                 (ies[index + 3] == 0x50) && (ies[index + 4] == 0xF2) &&
-                 (ies[index + 5] == 0x01))) {
-               u16 rsn_idx = index;
-
-               if (ies[rsn_idx] == WLAN_EID_RSN) {
-                       param->mode_802_11i = 2;
-               } else {
-                       if (param->mode_802_11i == 0)
-                               param->mode_802_11i = 1;
-                       rsn_idx += 4;
-               }
-
-               rsn_idx += 7;
-               param->rsn_grp_policy = ies[rsn_idx];
-               rsn_idx++;
-               offset = ies[rsn_idx] * 4;
-               pcipher_cnt = (ies[rsn_idx] > 3) ? 3 : ies[rsn_idx];
-               rsn_idx += 2;
-
-               i = *pcipher_tc;
-               j = 0;
-               for (; i < (pcipher_cnt + *pcipher_tc) && i < 3; i++, j++) {
-                       u8 *policy =  &param->rsn_pcip_policy[i];
-
-                       *policy = ies[rsn_idx + ((j + 1) * 4) - 1];
-               }
-
-               *pcipher_tc += pcipher_cnt;
-               rsn_idx += offset;
-
-               offset = ies[rsn_idx] * 4;
-
-               auth_cnt = (ies[rsn_idx] > 3) ? 3 : ies[rsn_idx];
-               rsn_idx += 2;
-               i = *auth_total_cnt;
-               j = 0;
-               for (; i < (*auth_total_cnt + auth_cnt); i++, j++) {
-                       u8 *policy =  &param->rsn_auth_policy[i];
-
-                       *policy = ies[rsn_idx + ((j + 1) * 4) - 1];
-               }
-
-               *auth_total_cnt += auth_cnt;
-               rsn_idx += offset;
-
-               if (ies[index] == WLAN_EID_RSN) {
-                       param->rsn_cap[0] = ies[rsn_idx];
-                       param->rsn_cap[1] = ies[rsn_idx + 1];
-                       rsn_idx += 2;
-               }
-               param->rsn_found = true;
-               index += ies[index + 1] + 2;
-       } else {
-               index += ies[index + 1] + 2;
-       }
-
-       *out_index = index;
-}
-
-static void *host_int_parse_join_bss_param(struct network_info *info)
-{
-       struct join_bss_param *param;
-       u16 index = 0;
-       u8 rates_no = 0;
-       u8 pcipher_total_cnt = 0;
-       u8 auth_total_cnt = 0;
+       struct wilc_join_bss_param *param;
+       struct ieee80211_p2p_noa_attr noa_attr;
+       u8 rates_len = 0;
+       const u8 *tim_elm, *ssid_elm, *rates_ie, *supp_rates_ie;
+       const u8 *ht_ie, *wpa_ie, *wmm_ie, *rsn_ie;
+       int ret;
+       const struct cfg80211_bss_ies *ies = rcu_dereference(bss->ies);
 
        param = kzalloc(sizeof(*param), GFP_KERNEL);
        if (!param)
                return NULL;
 
-       param->dtim_period = info->dtim_period;
-       param->beacon_period = info->beacon_period;
-       param->cap_info = info->cap_info;
-       memcpy(param->bssid, info->bssid, 6);
-       memcpy((u8 *)param->ssid, info->ssid, info->ssid_len + 1);
-       param->ssid_len = info->ssid_len;
-       memset(param->rsn_pcip_policy, 0xFF, 3);
-       memset(param->rsn_auth_policy, 0xFF, 3);
-
-       while (index < info->ies_len)
-               host_int_fill_join_bss_param(param, info->ies, &index,
-                                            &pcipher_total_cnt,
-                                            &auth_total_cnt, info->tsf_lo,
-                                            &rates_no);
-
-       return (void *)param;
-}
-
-static inline u8 *get_bssid(struct ieee80211_mgmt *mgmt)
-{
-       if (ieee80211_has_fromds(mgmt->frame_control))
-               return mgmt->sa;
-       else if (ieee80211_has_tods(mgmt->frame_control))
-               return mgmt->da;
-       else
-               return mgmt->bssid;
-}
+       param->beacon_period = cpu_to_le16(bss->beacon_interval);
+       param->cap_info = cpu_to_le16(bss->capability);
+       param->bss_type = WILC_FW_BSS_TYPE_INFRA;
+       param->ch = ieee80211_frequency_to_channel(bss->channel->center_freq);
+       ether_addr_copy(param->bssid, bss->bssid);
 
-static s32 wilc_parse_network_info(u8 *msg_buffer,
-                                  struct network_info **ret_network_info)
-{
-       struct network_info *info;
-       struct ieee80211_mgmt *mgt;
-       u8 *wid_val, *msa, *ies;
-       u16 wid_len, rx_len, ies_len;
-       u8 msg_type;
-       size_t offset;
-       const u8 *ch_elm, *tim_elm, *ssid_elm;
-
-       msg_type = msg_buffer[0];
-       if ('N' != msg_type)
-               return -EFAULT;
+       ssid_elm = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
+       if (ssid_elm) {
+               if (ssid_elm[1] <= IEEE80211_MAX_SSID_LEN)
+                       memcpy(param->ssid, ssid_elm + 2, ssid_elm[1]);
+       }
 
-       wid_len = get_unaligned_le16(&msg_buffer[6]);
-       wid_val = &msg_buffer[8];
+       tim_elm = cfg80211_find_ie(WLAN_EID_TIM, ies->data, ies->len);
+       if (tim_elm && tim_elm[1] >= 2)
+               param->dtim_period = tim_elm[3];
 
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
-       if (!info)
-               return -ENOMEM;
+       memset(param->p_suites, 0xFF, 3);
+       memset(param->akm_suites, 0xFF, 3);
 
-       info->rssi = wid_val[0];
+       rates_ie = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies->data, ies->len);
+       if (rates_ie) {
+               rates_len = rates_ie[1];
+               param->supp_rates[0] = rates_len;
+               memcpy(&param->supp_rates[1], rates_ie + 2, rates_len);
+       }
 
-       msa = &wid_val[1];
-       mgt = (struct ieee80211_mgmt *)&wid_val[1];
-       rx_len = wid_len - 1;
+       supp_rates_ie = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies->data,
+                                        ies->len);
+       if (supp_rates_ie) {
+               if (supp_rates_ie[1] > (WILC_MAX_RATES_SUPPORTED - rates_len))
+                       param->supp_rates[0] = WILC_MAX_RATES_SUPPORTED;
+               else
+                       param->supp_rates[0] += supp_rates_ie[1];
 
-       if (ieee80211_is_probe_resp(mgt->frame_control)) {
-               info->cap_info = le16_to_cpu(mgt->u.probe_resp.capab_info);
-               info->beacon_period = le16_to_cpu(mgt->u.probe_resp.beacon_int);
-               info->tsf = le64_to_cpu(mgt->u.probe_resp.timestamp);
-               info->tsf_lo = (u32)info->tsf;
-               offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
-       } else if (ieee80211_is_beacon(mgt->frame_control)) {
-               info->cap_info = le16_to_cpu(mgt->u.beacon.capab_info);
-               info->beacon_period = le16_to_cpu(mgt->u.beacon.beacon_int);
-               info->tsf = le64_to_cpu(mgt->u.beacon.timestamp);
-               info->tsf_lo = (u32)info->tsf;
-               offset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
-       } else {
-               /* only process probe response and beacon frame */
-               kfree(info);
-               return -EIO;
+               memcpy(&param->supp_rates[rates_len + 1], supp_rates_ie + 2,
+                      (param->supp_rates[0] - rates_len));
        }
 
-       ether_addr_copy(info->bssid, get_bssid(mgt));
+       ht_ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies->data, ies->len);
+       if (ht_ie)
+               param->ht_capable = true;
 
-       ies = mgt->u.beacon.variable;
-       ies_len = rx_len - offset;
-       if (ies_len <= 0) {
-               kfree(info);
-               return -EIO;
+       ret = cfg80211_get_p2p_attr(ies->data, ies->len,
+                                   IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
+                                   (u8 *)&noa_attr, sizeof(noa_attr));
+       if (ret > 0) {
+               param->tsf_lo = cpu_to_le32(ies->tsf);
+               param->noa_enabled = 1;
+               param->idx = noa_attr.index;
+               if (noa_attr.oppps_ctwindow & IEEE80211_P2P_OPPPS_ENABLE_BIT) {
+                       param->opp_enabled = 1;
+                       param->opp_en.ct_window = noa_attr.oppps_ctwindow;
+                       param->opp_en.cnt = noa_attr.desc[0].count;
+                       param->opp_en.duration = noa_attr.desc[0].duration;
+                       param->opp_en.interval = noa_attr.desc[0].interval;
+                       param->opp_en.start_time = noa_attr.desc[0].start_time;
+               } else {
+                       param->opp_enabled = 0;
+                       param->opp_dis.cnt = noa_attr.desc[0].count;
+                       param->opp_dis.duration = noa_attr.desc[0].duration;
+                       param->opp_dis.interval = noa_attr.desc[0].interval;
+                       param->opp_dis.start_time = noa_attr.desc[0].start_time;
+               }
+       }
+       wmm_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                        WLAN_OUI_TYPE_MICROSOFT_WMM,
+                                        ies->data, ies->len);
+       if (wmm_ie) {
+               struct ieee80211_wmm_param_ie *ie;
+
+               ie = (struct ieee80211_wmm_param_ie *)wmm_ie;
+               if ((ie->oui_subtype == 0 || ie->oui_subtype == 1) &&
+                   ie->version == 1) {
+                       param->wmm_cap = true;
+                       if (ie->qos_info & BIT(7))
+                               param->uapsd_cap = true;
+               }
        }
 
-       info->ies = kmemdup(ies, ies_len, GFP_KERNEL);
-       if (!info->ies) {
-               kfree(info);
-               return -ENOMEM;
+       wpa_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                        WLAN_OUI_TYPE_MICROSOFT_WPA,
+                                        ies->data, ies->len);
+       if (wpa_ie) {
+               param->mode_802_11i = 1;
+               param->rsn_found = true;
        }
 
-       info->ies_len = ies_len;
+       rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, ies->data, ies->len);
+       if (rsn_ie) {
+               int offset = 8;
 
-       ssid_elm = cfg80211_find_ie(WLAN_EID_SSID, ies, ies_len);
-       if (ssid_elm) {
-               info->ssid_len = ssid_elm[1];
-               if (info->ssid_len <= IEEE80211_MAX_SSID_LEN)
-                       memcpy(info->ssid, ssid_elm + 2, info->ssid_len);
-               else
-                       info->ssid_len = 0;
+               param->mode_802_11i = 2;
+               param->rsn_found = true;
+               //extract RSN capabilities
+               offset += (rsn_ie[offset] * 4) + 2;
+               offset += (rsn_ie[offset] * 4) + 2;
+               memcpy(param->rsn_cap, &rsn_ie[offset], 2);
        }
 
-       ch_elm = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ies, ies_len);
-       if (ch_elm && ch_elm[1] > 0)
-               info->ch = ch_elm[2];
+       if (param->rsn_found) {
+               int i;
 
-       tim_elm = cfg80211_find_ie(WLAN_EID_TIM, ies, ies_len);
-       if (tim_elm && tim_elm[1] >= 2)
-               info->dtim_period = tim_elm[3];
+               param->rsn_grp_policy = crypto->cipher_group & 0xFF;
+               for (i = 0; i < crypto->n_ciphers_pairwise && i < 3; i++)
+                       param->p_suites[i] = crypto->ciphers_pairwise[i] & 0xFF;
 
-       *ret_network_info = info;
+               for (i = 0; i < crypto->n_akm_suites && i < 3; i++)
+                       param->akm_suites[i] = crypto->akm_suites[i] & 0xFF;
+       }
 
-       return 0;
+       return (void *)param;
 }
 
 static void handle_rcvd_ntwrk_info(struct work_struct *work)
 {
        struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
-       struct wilc_vif *vif = msg->vif;
-       struct rcvd_net_info *rcvd_info = &msg->body.net_info;
-       u32 i;
-       bool found;
-       struct network_info *info = NULL;
-       void *params;
-       struct host_if_drv *hif_drv = vif->hif_drv;
-       struct user_scan_req *scan_req = &hif_drv->usr_scan_req;
-
-       found = true;
+       struct wilc_rcvd_net_info *rcvd_info = &msg->body.net_info;
+       struct wilc_user_scan_req *scan_req = &msg->vif->hif_drv->usr_scan_req;
+       const u8 *ch_elm;
+       u8 *ies;
+       int ies_len;
+       size_t offset;
 
-       if (!scan_req->scan_result)
+       if (ieee80211_is_probe_resp(rcvd_info->mgmt->frame_control))
+               offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
+       else if (ieee80211_is_beacon(rcvd_info->mgmt->frame_control))
+               offset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
+       else
                goto done;
 
-       wilc_parse_network_info(rcvd_info->buffer, &info);
-       if (!info || !scan_req->scan_result) {
-               netdev_err(vif->ndev, "%s: info or scan result NULL\n",
-                          __func__);
+       ies = rcvd_info->mgmt->u.beacon.variable;
+       ies_len = rcvd_info->frame_len - offset;
+       if (ies_len <= 0)
                goto done;
-       }
-
-       for (i = 0; i < scan_req->ch_cnt; i++) {
-               if (memcmp(scan_req->net_info[i].bssid, info->bssid, 6) == 0) {
-                       if (info->rssi <= scan_req->net_info[i].rssi) {
-                               goto done;
-                       } else {
-                               scan_req->net_info[i].rssi = info->rssi;
-                               found = false;
-                               break;
-                       }
-               }
-       }
-
-       if (found) {
-               if (scan_req->ch_cnt < MAX_NUM_SCANNED_NETWORKS) {
-                       scan_req->net_info[scan_req->ch_cnt].rssi = info->rssi;
-
-                       memcpy(scan_req->net_info[scan_req->ch_cnt].bssid,
-                              info->bssid, 6);
-
-                       scan_req->ch_cnt++;
 
-                       info->new_network = true;
-                       params = host_int_parse_join_bss_param(info);
+       ch_elm = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ies, ies_len);
+       if (ch_elm && ch_elm[1] > 0)
+               rcvd_info->ch = ch_elm[2];
 
-                       scan_req->scan_result(SCAN_EVENT_NETWORK_FOUND, info,
-                                              scan_req->arg, params);
-               }
-       } else {
-               info->new_network = false;
-               scan_req->scan_result(SCAN_EVENT_NETWORK_FOUND, info,
-                                     scan_req->arg, NULL);
-       }
+       if (scan_req->scan_result)
+               scan_req->scan_result(SCAN_EVENT_NETWORK_FOUND, rcvd_info,
+                                     scan_req->arg);
 
 done:
-       kfree(rcvd_info->buffer);
-       rcvd_info->buffer = NULL;
-
-       if (info) {
-               kfree(info->ies);
-               kfree(info);
-       }
-
+       kfree(rcvd_info->mgmt);
        kfree(msg);
 }
 
@@ -918,20 +619,8 @@ static void host_int_get_assoc_res_info(struct wilc_vif *vif,
        *rcvd_assoc_resp_info_len = wid.size;
 }
 
-static inline void host_int_free_user_conn_req(struct host_if_drv *hif_drv)
-{
-       hif_drv->usr_conn_req.ssid_len = 0;
-       kfree(hif_drv->usr_conn_req.ssid);
-       hif_drv->usr_conn_req.ssid = NULL;
-       kfree(hif_drv->usr_conn_req.bssid);
-       hif_drv->usr_conn_req.bssid = NULL;
-       hif_drv->usr_conn_req.ies_len = 0;
-       kfree(hif_drv->usr_conn_req.ies);
-       hif_drv->usr_conn_req.ies = NULL;
-}
-
 static s32 wilc_parse_assoc_resp_info(u8 *buffer, u32 buffer_len,
-                                     struct connect_info *ret_conn_info)
+                                     struct wilc_conn_info *ret_conn_info)
 {
        u8 *ies;
        u16 ies_len;
@@ -955,10 +644,8 @@ static s32 wilc_parse_assoc_resp_info(u8 *buffer, u32 buffer_len,
 static inline void host_int_parse_assoc_resp_info(struct wilc_vif *vif,
                                                  u8 mac_status)
 {
-       struct connect_info conn_info;
        struct host_if_drv *hif_drv = vif->hif_drv;
-
-       memset(&conn_info, 0, sizeof(struct connect_info));
+       struct wilc_conn_info *conn_info = &hif_drv->conn_info;
 
        if (mac_status == WILC_MAC_STATUS_CONNECTED) {
                u32 assoc_resp_info_len;
@@ -974,7 +661,7 @@ static inline void host_int_parse_assoc_resp_info(struct wilc_vif *vif,
 
                        err = wilc_parse_assoc_resp_info(hif_drv->assoc_resp,
                                                         assoc_resp_info_len,
-                                                        &conn_info);
+                                                        conn_info);
                        if (err)
                                netdev_err(vif->ndev,
                                           "wilc_parse_assoc_resp_info() returned error %d\n",
@@ -982,31 +669,13 @@ static inline void host_int_parse_assoc_resp_info(struct wilc_vif *vif,
                }
        }
 
-       if (hif_drv->usr_conn_req.bssid) {
-               memcpy(conn_info.bssid, hif_drv->usr_conn_req.bssid, 6);
-
-               if (mac_status == WILC_MAC_STATUS_CONNECTED &&
-                   conn_info.status == WLAN_STATUS_SUCCESS) {
-                       memcpy(hif_drv->assoc_bssid,
-                              hif_drv->usr_conn_req.bssid, ETH_ALEN);
-               }
-       }
-
-       if (hif_drv->usr_conn_req.ies) {
-               conn_info.req_ies = kmemdup(hif_drv->usr_conn_req.ies,
-                                           hif_drv->usr_conn_req.ies_len,
-                                           GFP_KERNEL);
-               if (conn_info.req_ies)
-                       conn_info.req_ies_len = hif_drv->usr_conn_req.ies_len;
-       }
-
        del_timer(&hif_drv->connect_timer);
-       hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_CONN_RESP,
-                                         &conn_info, mac_status, NULL,
-                                         hif_drv->usr_conn_req.arg);
+       conn_info->conn_result(CONN_DISCONN_EVENT_CONN_RESP, mac_status,
+                              hif_drv->conn_info.arg);
 
        if (mac_status == WILC_MAC_STATUS_CONNECTED &&
-           conn_info.status == WLAN_STATUS_SUCCESS) {
+           conn_info->status == WLAN_STATUS_SUCCESS) {
+               ether_addr_copy(hif_drv->assoc_bssid, conn_info->bssid);
                wilc_set_power_mgmt(vif, 0, 0);
 
                hif_drv->hif_state = HOST_IF_CONNECTED;
@@ -1018,44 +687,39 @@ static inline void host_int_parse_assoc_resp_info(struct wilc_vif *vif,
                hif_drv->hif_state = HOST_IF_IDLE;
        }
 
-       kfree(conn_info.resp_ies);
-       conn_info.resp_ies = NULL;
+       kfree(conn_info->resp_ies);
+       conn_info->resp_ies = NULL;
+       conn_info->resp_ies_len = 0;
 
-       kfree(conn_info.req_ies);
-       conn_info.req_ies = NULL;
-       host_int_free_user_conn_req(hif_drv);
+       kfree(conn_info->req_ies);
+       conn_info->req_ies = NULL;
+       conn_info->req_ies_len = 0;
 }
 
 static inline void host_int_handle_disconnect(struct wilc_vif *vif)
 {
-       struct disconnect_info disconn_info;
        struct host_if_drv *hif_drv = vif->hif_drv;
-       wilc_connect_result conn_result = hif_drv->usr_conn_req.conn_result;
-
-       memset(&disconn_info, 0, sizeof(struct disconnect_info));
 
        if (hif_drv->usr_scan_req.scan_result) {
                del_timer(&hif_drv->scan_timer);
                handle_scan_done(vif, SCAN_EVENT_ABORTED);
        }
 
-       disconn_info.reason = 0;
-       disconn_info.ie = NULL;
-       disconn_info.ie_len = 0;
-
-       if (conn_result) {
+       if (hif_drv->conn_info.conn_result) {
                vif->obtaining_ip = false;
                wilc_set_power_mgmt(vif, 0, 0);
 
-               conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF, NULL, 0,
-                           &disconn_info, hif_drv->usr_conn_req.arg);
+               hif_drv->conn_info.conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF,
+                                              0, hif_drv->conn_info.arg);
        } else {
                netdev_err(vif->ndev, "%s: conn_result is NULL\n", __func__);
        }
 
        eth_zero_addr(hif_drv->assoc_bssid);
 
-       host_int_free_user_conn_req(hif_drv);
+       hif_drv->conn_info.req_ies_len = 0;
+       kfree(hif_drv->conn_info.req_ies);
+       hif_drv->conn_info.req_ies = NULL;
        hif_drv->hif_state = HOST_IF_IDLE;
 }
 
@@ -1063,55 +727,30 @@ static void handle_rcvd_gnrl_async_info(struct work_struct *work)
 {
        struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
        struct wilc_vif *vif = msg->vif;
-       struct rcvd_async_info *rcvd_info = &msg->body.async_info;
-       u8 msg_type;
-       u8 mac_status;
+       struct wilc_rcvd_mac_info *mac_info = &msg->body.mac_info;
        struct host_if_drv *hif_drv = vif->hif_drv;
 
-       if (!rcvd_info->buffer) {
-               netdev_err(vif->ndev, "%s: buffer is NULL\n", __func__);
-               goto free_msg;
-       }
-
        if (!hif_drv) {
                netdev_err(vif->ndev, "%s: hif driver is NULL\n", __func__);
-               goto free_rcvd_info;
+               goto free_msg;
        }
 
-       if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP ||
-           hif_drv->hif_state == HOST_IF_CONNECTED ||
-           hif_drv->usr_scan_req.scan_result) {
-               if (!hif_drv->usr_conn_req.conn_result) {
-                       netdev_err(vif->ndev, "%s: conn_result is NULL\n",
-                                  __func__);
-                       goto free_rcvd_info;
-               }
-
-               msg_type = rcvd_info->buffer[0];
-
-               if ('I' != msg_type) {
-                       netdev_err(vif->ndev, "Received Message incorrect.\n");
-                       goto free_rcvd_info;
-               }
+       if (!hif_drv->conn_info.conn_result) {
+               netdev_err(vif->ndev, "%s: conn_result is NULL\n", __func__);
+               goto free_msg;
+       }
 
-               mac_status  = rcvd_info->buffer[7];
-               if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) {
-                       host_int_parse_assoc_resp_info(vif, mac_status);
-               } else if ((mac_status == WILC_MAC_STATUS_DISCONNECTED) &&
-                          (hif_drv->hif_state == HOST_IF_CONNECTED)) {
+       if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) {
+               host_int_parse_assoc_resp_info(vif, mac_info->status);
+       } else if (mac_info->status == WILC_MAC_STATUS_DISCONNECTED) {
+               if (hif_drv->hif_state == HOST_IF_CONNECTED) {
                        host_int_handle_disconnect(vif);
-               } else if ((mac_status == WILC_MAC_STATUS_DISCONNECTED) &&
-                          (hif_drv->usr_scan_req.scan_result)) {
+               } else if (hif_drv->usr_scan_req.scan_result) {
                        del_timer(&hif_drv->scan_timer);
-                       if (hif_drv->usr_scan_req.scan_result)
-                               handle_scan_done(vif, SCAN_EVENT_ABORTED);
+                       handle_scan_done(vif, SCAN_EVENT_ABORTED);
                }
        }
 
-free_rcvd_info:
-       kfree(rcvd_info->buffer);
-       rcvd_info->buffer = NULL;
-
 free_msg:
        kfree(msg);
 }
@@ -1120,9 +759,8 @@ int wilc_disconnect(struct wilc_vif *vif)
 {
        struct wid wid;
        struct host_if_drv *hif_drv = vif->hif_drv;
-       struct disconnect_info disconn_info;
-       struct user_scan_req *scan_req;
-       struct user_conn_req *conn_req;
+       struct wilc_user_scan_req *scan_req;
+       struct wilc_conn_info *conn_info;
        int result;
        u16 dummy_reason_code = 0;
 
@@ -1141,27 +779,21 @@ int wilc_disconnect(struct wilc_vif *vif)
                return result;
        }
 
-       memset(&disconn_info, 0, sizeof(struct disconnect_info));
-
-       disconn_info.reason = 0;
-       disconn_info.ie = NULL;
-       disconn_info.ie_len = 0;
        scan_req = &hif_drv->usr_scan_req;
-       conn_req = &hif_drv->usr_conn_req;
+       conn_info = &hif_drv->conn_info;
 
        if (scan_req->scan_result) {
                del_timer(&hif_drv->scan_timer);
-               scan_req->scan_result(SCAN_EVENT_ABORTED, NULL, scan_req->arg,
-                                     NULL);
+               scan_req->scan_result(SCAN_EVENT_ABORTED, NULL, scan_req->arg);
                scan_req->scan_result = NULL;
        }
 
-       if (conn_req->conn_result) {
+       if (conn_info->conn_result) {
                if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP)
                        del_timer(&hif_drv->connect_timer);
 
-               conn_req->conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF, NULL,
-                                     0, &disconn_info, conn_req->arg);
+               conn_info->conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF, 0,
+                                      conn_info->arg);
        } else {
                netdev_err(vif->ndev, "%s: conn_result is NULL\n", __func__);
        }
@@ -1170,14 +802,9 @@ int wilc_disconnect(struct wilc_vif *vif)
 
        eth_zero_addr(hif_drv->assoc_bssid);
 
-       conn_req->ssid_len = 0;
-       kfree(conn_req->ssid);
-       conn_req->ssid = NULL;
-       kfree(conn_req->bssid);
-       conn_req->bssid = NULL;
-       conn_req->ies_len = 0;
-       kfree(conn_req->ies);
-       conn_req->ies = NULL;
+       conn_info->req_ies_len = 0;
+       kfree(conn_info->req_ies);
+       conn_info->req_ies = NULL;
 
        return 0;
 }
@@ -1285,47 +912,29 @@ static void wilc_hif_pack_sta_param(u8 *cur_byte, const u8 *mac,
 }
 
 static int handle_remain_on_chan(struct wilc_vif *vif,
-                                struct remain_ch *hif_remain_ch)
+                                struct wilc_remain_ch *hif_remain_ch)
 {
        int result;
        u8 remain_on_chan_flag;
        struct wid wid;
        struct host_if_drv *hif_drv = vif->hif_drv;
 
-       if (!hif_drv->remain_on_ch_pending) {
-               hif_drv->remain_on_ch.arg = hif_remain_ch->arg;
-               hif_drv->remain_on_ch.expired = hif_remain_ch->expired;
-               hif_drv->remain_on_ch.ready = hif_remain_ch->ready;
-               hif_drv->remain_on_ch.ch = hif_remain_ch->ch;
-               hif_drv->remain_on_ch.id = hif_remain_ch->id;
-       } else {
-               hif_remain_ch->ch = hif_drv->remain_on_ch.ch;
-       }
+       if (hif_drv->usr_scan_req.scan_result)
+               return -EBUSY;
 
-       if (hif_drv->usr_scan_req.scan_result) {
-               hif_drv->remain_on_ch_pending = 1;
-               result = -EBUSY;
-               goto error;
-       }
-       if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) {
-               result = -EBUSY;
-               goto error;
-       }
+       if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP)
+               return -EBUSY;
 
-       if (vif->obtaining_ip || vif->connecting) {
-               result = -EBUSY;
-               goto error;
-       }
+       if (vif->obtaining_ip || vif->connecting)
+               return -EBUSY;
 
        remain_on_chan_flag = true;
        wid.id = WID_REMAIN_ON_CHAN;
        wid.type = WID_STR;
        wid.size = 2;
        wid.val = kmalloc(wid.size, GFP_KERNEL);
-       if (!wid.val) {
-               result = -ENOMEM;
-               goto error;
-       }
+       if (!wid.val)
+               return -ENOMEM;
 
        wid.val[0] = remain_on_chan_flag;
        wid.val[1] = (s8)hif_remain_ch->ch;
@@ -1333,28 +942,23 @@ static int handle_remain_on_chan(struct wilc_vif *vif,
        result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
                                      wilc_get_vif_idx(vif));
        kfree(wid.val);
-       if (result != 0)
-               netdev_err(vif->ndev, "Failed to set remain on channel\n");
+       if (result)
+               return -EBUSY;
 
-error:
+       hif_drv->remain_on_ch.arg = hif_remain_ch->arg;
+       hif_drv->remain_on_ch.expired = hif_remain_ch->expired;
+       hif_drv->remain_on_ch.ch = hif_remain_ch->ch;
+       hif_drv->remain_on_ch.cookie = hif_remain_ch->cookie;
        hif_drv->remain_on_ch_timer_vif = vif;
-       mod_timer(&hif_drv->remain_on_ch_timer,
-                 jiffies + msecs_to_jiffies(hif_remain_ch->duration));
-
-       if (hif_drv->remain_on_ch.ready)
-               hif_drv->remain_on_ch.ready(hif_drv->remain_on_ch.arg);
-
-       if (hif_drv->remain_on_ch_pending)
-               hif_drv->remain_on_ch_pending = 0;
 
-       return result;
+       return 0;
 }
 
 static void handle_listen_state_expired(struct work_struct *work)
 {
        struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
        struct wilc_vif *vif = msg->vif;
-       struct remain_ch *hif_remain_ch = &msg->body.remain_on_ch;
+       struct wilc_remain_ch *hif_remain_ch = &msg->body.remain_on_ch;
        u8 remain_on_chan_flag;
        struct wid wid;
        int result;
@@ -1372,7 +976,7 @@ static void handle_listen_state_expired(struct work_struct *work)
                        goto free_msg;
 
                wid.val[0] = remain_on_chan_flag;
-               wid.val[1] = FALSE_FRMWR_CHANNEL;
+               wid.val[1] = WILC_FALSE_FRMWR_CHANNEL;
 
                result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
                                              wilc_get_vif_idx(vif));
@@ -1384,7 +988,7 @@ static void handle_listen_state_expired(struct work_struct *work)
 
                if (hif_drv->remain_on_ch.expired) {
                        hif_drv->remain_on_ch.expired(hif_drv->remain_on_ch.arg,
-                                                     hif_remain_ch->id);
+                                                     hif_remain_ch->cookie);
                }
        } else {
                netdev_dbg(vif->ndev, "Not in listen state\n");
@@ -1408,7 +1012,7 @@ static void listen_timer_cb(struct timer_list *t)
        if (IS_ERR(msg))
                return;
 
-       msg->body.remain_on_ch.id = vif->hif_drv->remain_on_ch.id;
+       msg->body.remain_on_ch.cookie = vif->hif_drv->remain_on_ch.cookie;
 
        result = wilc_enqueue_work(msg);
        if (result) {
@@ -1421,32 +1025,27 @@ static void handle_set_mcast_filter(struct work_struct *work)
 {
        struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
        struct wilc_vif *vif = msg->vif;
-       struct set_multicast *hif_set_mc = &msg->body.multicast_info;
+       struct wilc_set_multicast *set_mc = &msg->body.mc_info;
        int result;
        struct wid wid;
        u8 *cur_byte;
 
        wid.id = WID_SETUP_MULTICAST_FILTER;
        wid.type = WID_BIN;
-       wid.size = sizeof(struct set_multicast) + (hif_set_mc->cnt * ETH_ALEN);
+       wid.size = sizeof(struct wilc_set_multicast) + (set_mc->cnt * ETH_ALEN);
        wid.val = kmalloc(wid.size, GFP_KERNEL);
        if (!wid.val)
                goto error;
 
        cur_byte = wid.val;
-       *cur_byte++ = (hif_set_mc->enabled & 0xFF);
-       *cur_byte++ = 0;
-       *cur_byte++ = 0;
-       *cur_byte++ = 0;
+       put_unaligned_le32(set_mc->enabled, cur_byte);
+       cur_byte += 4;
 
-       *cur_byte++ = (hif_set_mc->cnt & 0xFF);
-       *cur_byte++ = ((hif_set_mc->cnt >> 8) & 0xFF);
-       *cur_byte++ = ((hif_set_mc->cnt >> 16) & 0xFF);
-       *cur_byte++ = ((hif_set_mc->cnt >> 24) & 0xFF);
+       put_unaligned_le32(set_mc->cnt, cur_byte);
+       cur_byte += 4;
 
-       if (hif_set_mc->cnt > 0 && hif_set_mc->mc_list)
-               memcpy(cur_byte, hif_set_mc->mc_list,
-                      ((hif_set_mc->cnt) * ETH_ALEN));
+       if (set_mc->cnt > 0 && set_mc->mc_list)
+               memcpy(cur_byte, set_mc->mc_list, set_mc->cnt * ETH_ALEN);
 
        result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
                                      wilc_get_vif_idx(vif));
@@ -1454,7 +1053,7 @@ static void handle_set_mcast_filter(struct work_struct *work)
                netdev_err(vif->ndev, "Failed to send setup multicast\n");
 
 error:
-       kfree(hif_set_mc->mc_list);
+       kfree(set_mc->mc_list);
        kfree(wid.val);
        kfree(msg);
 }
@@ -1479,9 +1078,6 @@ static void handle_scan_complete(struct work_struct *work)
 
        handle_scan_done(msg->vif, SCAN_EVENT_DONE);
 
-       if (msg->vif->hif_drv->remain_on_ch_pending)
-               handle_remain_on_chan(msg->vif,
-                                     &msg->vif->hif_drv->remain_on_ch);
        kfree(msg);
 }
 
@@ -1629,7 +1225,7 @@ int wilc_add_ptk(struct wilc_vif *vif, const u8 *ptk, u8 ptk_key_len,
                 u8 mode, u8 cipher_mode, u8 index)
 {
        int result = 0;
-       u8 t_key_len  = ptk_key_len + RX_MIC_KEY_LEN + TX_MIC_KEY_LEN;
+       u8 t_key_len  = ptk_key_len + WILC_RX_MIC_KEY_LEN + WILC_TX_MIC_KEY_LEN;
 
        if (mode == WILC_AP_MODE) {
                struct wid wid_list[2];
@@ -1651,11 +1247,11 @@ int wilc_add_ptk(struct wilc_vif *vif, const u8 *ptk, u8 ptk_key_len,
 
                if (rx_mic)
                        memcpy(&key_buf->key[ptk_key_len], rx_mic,
-                              RX_MIC_KEY_LEN);
+                              WILC_RX_MIC_KEY_LEN);
 
                if (tx_mic)
-                       memcpy(&key_buf->key[ptk_key_len + RX_MIC_KEY_LEN],
-                              tx_mic, TX_MIC_KEY_LEN);
+                       memcpy(&key_buf->key[ptk_key_len + WILC_RX_MIC_KEY_LEN],
+                              tx_mic, WILC_TX_MIC_KEY_LEN);
 
                wid_list[1].id = WID_ADD_PTK;
                wid_list[1].type = WID_STR;
@@ -1679,11 +1275,11 @@ int wilc_add_ptk(struct wilc_vif *vif, const u8 *ptk, u8 ptk_key_len,
 
                if (rx_mic)
                        memcpy(&key_buf->key[ptk_key_len], rx_mic,
-                              RX_MIC_KEY_LEN);
+                              WILC_RX_MIC_KEY_LEN);
 
                if (tx_mic)
-                       memcpy(&key_buf->key[ptk_key_len + RX_MIC_KEY_LEN],
-                              tx_mic, TX_MIC_KEY_LEN);
+                       memcpy(&key_buf->key[ptk_key_len + WILC_RX_MIC_KEY_LEN],
+                              tx_mic, WILC_TX_MIC_KEY_LEN);
 
                wid.id = WID_ADD_PTK;
                wid.type = WID_STR;
@@ -1704,7 +1300,7 @@ int wilc_add_rx_gtk(struct wilc_vif *vif, const u8 *rx_gtk, u8 gtk_key_len,
 {
        int result = 0;
        struct wilc_gtk_key *gtk_key;
-       int t_key_len = gtk_key_len + RX_MIC_KEY_LEN + TX_MIC_KEY_LEN;
+       int t_key_len = gtk_key_len + WILC_RX_MIC_KEY_LEN + WILC_TX_MIC_KEY_LEN;
 
        gtk_key = kzalloc(sizeof(*gtk_key) + t_key_len, GFP_KERNEL);
        if (!gtk_key)
@@ -1722,11 +1318,11 @@ int wilc_add_rx_gtk(struct wilc_vif *vif, const u8 *rx_gtk, u8 gtk_key_len,
        memcpy(&gtk_key->key[0], rx_gtk, gtk_key_len);
 
        if (rx_mic)
-               memcpy(&gtk_key->key[gtk_key_len], rx_mic, RX_MIC_KEY_LEN);
+               memcpy(&gtk_key->key[gtk_key_len], rx_mic, WILC_RX_MIC_KEY_LEN);
 
        if (tx_mic)
-               memcpy(&gtk_key->key[gtk_key_len + RX_MIC_KEY_LEN],
-                      tx_mic, TX_MIC_KEY_LEN);
+               memcpy(&gtk_key->key[gtk_key_len + WILC_RX_MIC_KEY_LEN],
+                      tx_mic, WILC_TX_MIC_KEY_LEN);
 
        if (mode == WILC_AP_MODE) {
                struct wid wid_list[2];
@@ -1793,61 +1389,22 @@ int wilc_get_mac_address(struct wilc_vif *vif, u8 *mac_addr)
        return result;
 }
 
-int wilc_set_join_req(struct wilc_vif *vif, u8 *bssid, const u8 *ssid,
-                     size_t ssid_len, const u8 *ies, size_t ies_len,
-                     wilc_connect_result connect_result, void *user_arg,
-                     u8 security, enum authtype auth_type,
-                     u8 channel, void *join_params)
+int wilc_set_join_req(struct wilc_vif *vif, u8 *bssid, const u8 *ies,
+                     size_t ies_len)
 {
        int result;
        struct host_if_drv *hif_drv = vif->hif_drv;
-       struct user_conn_req *con_info = &hif_drv->usr_conn_req;
+       struct wilc_conn_info *conn_info = &hif_drv->conn_info;
 
-       if (!hif_drv || !connect_result) {
-               netdev_err(vif->ndev,
-                          "%s: hif driver or connect result is NULL",
-                          __func__);
-               return -EFAULT;
-       }
-
-       if (!join_params) {
-               netdev_err(vif->ndev, "%s: joinparams is NULL\n", __func__);
-               return -EFAULT;
-       }
-
-       if (hif_drv->usr_scan_req.scan_result) {
-               netdev_err(vif->ndev, "%s: Scan in progress\n", __func__);
-               return -EBUSY;
-       }
-
-       con_info->security = security;
-       con_info->auth_type = auth_type;
-       con_info->ch = channel;
-       con_info->conn_result = connect_result;
-       con_info->arg = user_arg;
-       con_info->param = join_params;
-
-       if (bssid) {
-               con_info->bssid = kmemdup(bssid, 6, GFP_KERNEL);
-               if (!con_info->bssid)
-                       return -ENOMEM;
-       }
-
-       if (ssid) {
-               con_info->ssid_len = ssid_len;
-               con_info->ssid = kmemdup(ssid, ssid_len, GFP_KERNEL);
-               if (!con_info->ssid) {
-                       result = -ENOMEM;
-                       goto free_bssid;
-               }
-       }
+       if (bssid)
+               ether_addr_copy(conn_info->bssid, bssid);
 
        if (ies) {
-               con_info->ies_len = ies_len;
-               con_info->ies = kmemdup(ies, ies_len, GFP_KERNEL);
-               if (!con_info->ies) {
+               conn_info->req_ies_len = ies_len;
+               conn_info->req_ies = kmemdup(ies, ies_len, GFP_KERNEL);
+               if (!conn_info->req_ies) {
                        result = -ENOMEM;
-                       goto free_ssid;
+                       return result;
                }
        }
 
@@ -1857,18 +1414,12 @@ int wilc_set_join_req(struct wilc_vif *vif, u8 *bssid, const u8 *ssid,
 
        hif_drv->connect_timer_vif = vif;
        mod_timer(&hif_drv->connect_timer,
-                 jiffies + msecs_to_jiffies(HOST_IF_CONNECT_TIMEOUT));
+                 jiffies + msecs_to_jiffies(WILC_HIF_CONNECT_TIMEOUT_MS));
 
        return 0;
 
 free_ies:
-       kfree(con_info->ies);
-
-free_ssid:
-       kfree(con_info->ssid);
-
-free_bssid:
-       kfree(con_info->bssid);
+       kfree(conn_info->req_ies);
 
        return result;
 }
@@ -1899,6 +1450,9 @@ int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mode,
        int result;
        struct wilc_drv_handler drv;
 
+       if (!hif_drv)
+               return -EFAULT;
+
        wid.id = WID_SET_DRV_HANDLER;
        wid.type = WID_STR;
        wid.size = sizeof(drv);
@@ -1991,7 +1545,7 @@ int wilc_get_rssi(struct wilc_vif *vif, s8 *rssi_level)
        return result;
 }
 
-int wilc_get_stats_async(struct wilc_vif *vif, struct rf_info *stats)
+static int wilc_get_stats_async(struct wilc_vif *vif, struct rf_info *stats)
 {
        int result;
        struct host_if_msg *msg;
@@ -2090,7 +1644,7 @@ int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler)
        vif->obtaining_ip = false;
 
        if (wilc->clients_count == 0)
-               mutex_init(&hif_deinit_lock);
+               mutex_init(&wilc->deinit_lock);
 
        timer_setup(&vif->periodic_rssi, get_periodic_rssi, 0);
        mod_timer(&vif->periodic_rssi, jiffies + msecs_to_jiffies(5000));
@@ -2118,9 +1672,7 @@ int wilc_deinit(struct wilc_vif *vif)
                return -EFAULT;
        }
 
-       mutex_lock(&hif_deinit_lock);
-
-       terminated_handle = hif_drv;
+       mutex_lock(&vif->wilc->deinit_lock);
 
        del_timer_sync(&hif_drv->scan_timer);
        del_timer_sync(&hif_drv->connect_timer);
@@ -2131,18 +1683,16 @@ int wilc_deinit(struct wilc_vif *vif)
 
        if (hif_drv->usr_scan_req.scan_result) {
                hif_drv->usr_scan_req.scan_result(SCAN_EVENT_ABORTED, NULL,
-                                                 hif_drv->usr_scan_req.arg,
-                                                 NULL);
+                                                 hif_drv->usr_scan_req.arg);
                hif_drv->usr_scan_req.scan_result = NULL;
        }
 
        hif_drv->hif_state = HOST_IF_IDLE;
 
        kfree(hif_drv);
-
+       vif->hif_drv = NULL;
        vif->wilc->clients_count--;
-       terminated_handle = NULL;
-       mutex_unlock(&hif_deinit_lock);
+       mutex_unlock(&vif->wilc->deinit_lock);
        return result;
 }
 
@@ -2154,16 +1704,13 @@ void wilc_network_info_received(struct wilc *wilc, u8 *buffer, u32 length)
        struct host_if_drv *hif_drv;
        struct wilc_vif *vif;
 
-       id = buffer[length - 4];
-       id |= (buffer[length - 3] << 8);
-       id |= (buffer[length - 2] << 16);
-       id |= (buffer[length - 1] << 24);
+       id = get_unaligned_le32(&buffer[length - 4]);
        vif = wilc_get_vif_from_idx(wilc, id);
        if (!vif)
                return;
        hif_drv = vif->hif_drv;
 
-       if (!hif_drv || hif_drv == terminated_handle) {
+       if (!hif_drv) {
                netdev_err(vif->ndev, "driver not init[%p]\n", hif_drv);
                return;
        }
@@ -2172,9 +1719,12 @@ void wilc_network_info_received(struct wilc *wilc, u8 *buffer, u32 length)
        if (IS_ERR(msg))
                return;
 
-       msg->body.net_info.len = length;
-       msg->body.net_info.buffer = kmemdup(buffer, length, GFP_KERNEL);
-       if (!msg->body.net_info.buffer) {
+       msg->body.net_info.frame_len = get_unaligned_le16(&buffer[6]) - 1;
+       msg->body.net_info.rssi = buffer[8];
+       msg->body.net_info.mgmt = kmemdup(&buffer[9],
+                                         msg->body.net_info.frame_len,
+                                         GFP_KERNEL);
+       if (!msg->body.net_info.mgmt) {
                kfree(msg);
                return;
        }
@@ -2182,7 +1732,7 @@ void wilc_network_info_received(struct wilc *wilc, u8 *buffer, u32 length)
        result = wilc_enqueue_work(msg);
        if (result) {
                netdev_err(vif->ndev, "%s: enqueue work failed\n", __func__);
-               kfree(msg->body.net_info.buffer);
+               kfree(msg->body.net_info.mgmt);
                kfree(msg);
        }
 }
@@ -2195,53 +1745,42 @@ void wilc_gnrl_async_info_received(struct wilc *wilc, u8 *buffer, u32 length)
        struct host_if_drv *hif_drv;
        struct wilc_vif *vif;
 
-       mutex_lock(&hif_deinit_lock);
+       mutex_lock(&wilc->deinit_lock);
 
-       id = buffer[length - 4];
-       id |= (buffer[length - 3] << 8);
-       id |= (buffer[length - 2] << 16);
-       id |= (buffer[length - 1] << 24);
+       id = get_unaligned_le32(&buffer[length - 4]);
        vif = wilc_get_vif_from_idx(wilc, id);
        if (!vif) {
-               mutex_unlock(&hif_deinit_lock);
+               mutex_unlock(&wilc->deinit_lock);
                return;
        }
 
        hif_drv = vif->hif_drv;
 
-       if (!hif_drv || hif_drv == terminated_handle) {
-               mutex_unlock(&hif_deinit_lock);
+       if (!hif_drv) {
+               mutex_unlock(&wilc->deinit_lock);
                return;
        }
 
-       if (!hif_drv->usr_conn_req.conn_result) {
+       if (!hif_drv->conn_info.conn_result) {
                netdev_err(vif->ndev, "%s: conn_result is NULL\n", __func__);
-               mutex_unlock(&hif_deinit_lock);
+               mutex_unlock(&wilc->deinit_lock);
                return;
        }
 
        msg = wilc_alloc_work(vif, handle_rcvd_gnrl_async_info, false);
        if (IS_ERR(msg)) {
-               mutex_unlock(&hif_deinit_lock);
-               return;
-       }
-
-       msg->body.async_info.len = length;
-       msg->body.async_info.buffer = kmemdup(buffer, length, GFP_KERNEL);
-       if (!msg->body.async_info.buffer) {
-               kfree(msg);
-               mutex_unlock(&hif_deinit_lock);
+               mutex_unlock(&wilc->deinit_lock);
                return;
        }
 
+       msg->body.mac_info.status = buffer[7];
        result = wilc_enqueue_work(msg);
        if (result) {
                netdev_err(vif->ndev, "%s: enqueue work failed\n", __func__);
-               kfree(msg->body.async_info.buffer);
                kfree(msg);
        }
 
-       mutex_unlock(&hif_deinit_lock);
+       mutex_unlock(&wilc->deinit_lock);
 }
 
 void wilc_scan_complete_received(struct wilc *wilc, u8 *buffer, u32 length)
@@ -2251,16 +1790,13 @@ void wilc_scan_complete_received(struct wilc *wilc, u8 *buffer, u32 length)
        struct host_if_drv *hif_drv;
        struct wilc_vif *vif;
 
-       id = buffer[length - 4];
-       id |= buffer[length - 3] << 8;
-       id |= buffer[length - 2] << 16;
-       id |= buffer[length - 1] << 24;
+       id = get_unaligned_le32(&buffer[length - 4]);
        vif = wilc_get_vif_from_idx(wilc, id);
        if (!vif)
                return;
        hif_drv = vif->hif_drv;
 
-       if (!hif_drv || hif_drv == terminated_handle)
+       if (!hif_drv)
                return;
 
        if (hif_drv->usr_scan_req.scan_result) {
@@ -2279,21 +1815,19 @@ void wilc_scan_complete_received(struct wilc *wilc, u8 *buffer, u32 length)
        }
 }
 
-int wilc_remain_on_channel(struct wilc_vif *vif, u32 session_id,
+int wilc_remain_on_channel(struct wilc_vif *vif, u64 cookie,
                           u32 duration, u16 chan,
-                          wilc_remain_on_chan_expired expired,
-                          wilc_remain_on_chan_ready ready,
+                          void (*expired)(void *, u64),
                           void *user_arg)
 {
-       struct remain_ch roc;
+       struct wilc_remain_ch roc;
        int result;
 
        roc.ch = chan;
        roc.expired = expired;
-       roc.ready = ready;
        roc.arg = user_arg;
        roc.duration = duration;
-       roc.id = session_id;
+       roc.cookie = cookie;
        result = handle_remain_on_chan(vif, &roc);
        if (result)
                netdev_err(vif->ndev, "%s: failed to set remain on channel\n",
@@ -2302,7 +1836,7 @@ int wilc_remain_on_channel(struct wilc_vif *vif, u32 session_id,
        return result;
 }
 
-int wilc_listen_state_expired(struct wilc_vif *vif, u32 session_id)
+int wilc_listen_state_expired(struct wilc_vif *vif, u64 cookie)
 {
        int result;
        struct host_if_msg *msg;
@@ -2319,7 +1853,7 @@ int wilc_listen_state_expired(struct wilc_vif *vif, u32 session_id)
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
-       msg->body.remain_on_ch.id = session_id;
+       msg->body.remain_on_ch.cookie = cookie;
 
        result = wilc_enqueue_work(msg);
        if (result) {
@@ -2484,7 +2018,7 @@ int wilc_del_allstation(struct wilc_vif *vif, u8 mac_addr[][ETH_ALEN])
        int result;
        int i;
        u8 assoc_sta = 0;
-       struct del_all_sta del_sta;
+       struct wilc_del_all_sta del_sta;
 
        memset(&del_sta, 0x0, sizeof(del_sta));
        for (i = 0; i < WILC_MAX_NUM_STA; i++) {
@@ -2563,7 +2097,7 @@ int wilc_set_power_mgmt(struct wilc_vif *vif, bool enabled, u32 timeout)
        return result;
 }
 
-int wilc_setup_multicast_filter(struct wilc_vif *vif, bool enabled, u32 count,
+int wilc_setup_multicast_filter(struct wilc_vif *vif, u32 enabled, u32 count,
                                u8 *mc_list)
 {
        int result;
@@ -2573,9 +2107,9 @@ int wilc_setup_multicast_filter(struct wilc_vif *vif, bool enabled, u32 count,
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
-       msg->body.multicast_info.enabled = enabled;
-       msg->body.multicast_info.cnt = count;
-       msg->body.multicast_info.mc_list = mc_list;
+       msg->body.mc_info.enabled = enabled;
+       msg->body.mc_info.cnt = count;
+       msg->body.mc_info.mc_list = mc_list;
 
        result = wilc_enqueue_work(msg);
        if (result) {