]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/wilc1000/host_interface.c
9616a6136619df353a6261b02b9496de2ef90c75
[karo-tx-linux.git] / drivers / staging / wilc1000 / host_interface.c
1 #include <linux/slab.h>
2 #include <linux/time.h>
3 #include <linux/kthread.h>
4 #include <linux/delay.h>
5 #include "host_interface.h"
6 #include "coreconfigurator.h"
7 #include "wilc_wlan_if.h"
8 #include "wilc_msgqueue.h"
9 #include <linux/etherdevice.h>
10 #include "wilc_wfi_netdevice.h"
11
12 extern u8 connecting;
13
14 extern struct timer_list hDuringIpTimer;
15
16 extern u8 g_wilc_initialized;
17
18 #define HOST_IF_MSG_SCAN                        0
19 #define HOST_IF_MSG_CONNECT                     1
20 #define HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO        2
21 #define HOST_IF_MSG_KEY                         3
22 #define HOST_IF_MSG_RCVD_NTWRK_INFO             4
23 #define HOST_IF_MSG_RCVD_SCAN_COMPLETE          5
24 #define HOST_IF_MSG_CFG_PARAMS                  6
25 #define HOST_IF_MSG_SET_CHANNEL                 7
26 #define HOST_IF_MSG_DISCONNECT                  8
27 #define HOST_IF_MSG_GET_RSSI                    9
28 #define HOST_IF_MSG_GET_CHNL                    10
29 #define HOST_IF_MSG_ADD_BEACON                  11
30 #define HOST_IF_MSG_DEL_BEACON                  12
31 #define HOST_IF_MSG_ADD_STATION                 13
32 #define HOST_IF_MSG_DEL_STATION                 14
33 #define HOST_IF_MSG_EDIT_STATION                15
34 #define HOST_IF_MSG_SCAN_TIMER_FIRED            16
35 #define HOST_IF_MSG_CONNECT_TIMER_FIRED         17
36 #define HOST_IF_MSG_POWER_MGMT                  18
37 #define HOST_IF_MSG_GET_INACTIVETIME            19
38 #define HOST_IF_MSG_REMAIN_ON_CHAN              20
39 #define HOST_IF_MSG_REGISTER_FRAME              21
40 #define HOST_IF_MSG_LISTEN_TIMER_FIRED          22
41 #define HOST_IF_MSG_GET_LINKSPEED               23
42 #define HOST_IF_MSG_SET_WFIDRV_HANDLER          24
43 #define HOST_IF_MSG_SET_MAC_ADDRESS             25
44 #define HOST_IF_MSG_GET_MAC_ADDRESS             26
45 #define HOST_IF_MSG_SET_OPERATION_MODE          27
46 #define HOST_IF_MSG_SET_IPADDRESS               28
47 #define HOST_IF_MSG_GET_IPADDRESS               29
48 #define HOST_IF_MSG_FLUSH_CONNECT               30
49 #define HOST_IF_MSG_GET_STATISTICS              31
50 #define HOST_IF_MSG_SET_MULTICAST_FILTER        32
51 #define HOST_IF_MSG_ADD_BA_SESSION              33
52 #define HOST_IF_MSG_DEL_BA_SESSION              34
53 #define HOST_IF_MSG_Q_IDLE                      35
54 #define HOST_IF_MSG_DEL_ALL_STA                 36
55 #define HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS      34
56 #define HOST_IF_MSG_EXIT                        100
57
58 #define HOST_IF_SCAN_TIMEOUT                    4000
59 #define HOST_IF_CONNECT_TIMEOUT                 9500
60
61 #define BA_SESSION_DEFAULT_BUFFER_SIZE          16
62 #define BA_SESSION_DEFAULT_TIMEOUT              1000
63 #define BLOCK_ACK_REQ_SIZE                      0x14
64 #define FALSE_FRMWR_CHANNEL                     100
65
66 struct cfg_param_attr {
67         struct cfg_param_val cfg_attr_info;
68 };
69
70 struct host_if_wpa_attr {
71         u8 *key;
72         const u8 *mac_addr;
73         u8 *seq;
74         u8 seq_len;
75         u8 index;
76         u8 key_len;
77         u8 mode;
78 };
79
80 struct host_if_wep_attr {
81         u8 *key;
82         u8 key_len;
83         u8 index;
84         u8 mode;
85         enum AUTHTYPE auth_type;
86 };
87
88 union host_if_key_attr {
89         struct host_if_wep_attr wep;
90         struct host_if_wpa_attr wpa;
91         struct host_if_pmkid_attr pmkid;
92 };
93
94 struct key_attr {
95         enum KEY_TYPE type;
96         u8 action;
97         union host_if_key_attr attr;
98 };
99
100 struct scan_attr {
101         u8 src;
102         u8 type;
103         u8 *ch_freq_list;
104         u8 ch_list_len;
105         u8 *ies;
106         size_t ies_len;
107         wilc_scan_result result;
108         void *arg;
109         struct hidden_network hidden_network;
110 };
111
112 struct connect_attr {
113         u8 *bssid;
114         u8 *ssid;
115         size_t ssid_len;
116         u8 *ies;
117         size_t ies_len;
118         u8 security;
119         wilc_connect_result result;
120         void *arg;
121         enum AUTHTYPE auth_type;
122         u8 ch;
123         void *params;
124 };
125
126 struct rcvd_async_info {
127         u8 *buffer;
128         u32 len;
129 };
130
131 struct channel_attr {
132         u8 set_ch;
133 };
134
135 struct beacon_attr {
136         u32 interval;
137         u32 dtim_period;
138         u32 head_len;
139         u8 *head;
140         u32 tail_len;
141         u8 *tail;
142 };
143
144 struct set_multicast {
145         bool enabled;
146         u32 cnt;
147 };
148
149 struct del_all_sta {
150         u8 del_all_sta[MAX_NUM_STA][ETH_ALEN];
151         u8 assoc_sta;
152 };
153
154 struct del_sta {
155         u8 mac_addr[ETH_ALEN];
156 };
157
158 struct power_mgmt_param {
159         bool enabled;
160         u32 timeout;
161 };
162
163 struct set_ip_addr {
164         u8 *ip_addr;
165         u8 idx;
166 };
167
168 struct sta_inactive_t {
169         u8 mac[6];
170 };
171
172 union message_body {
173         struct scan_attr scan_info;
174         struct connect_attr con_info;
175         struct rcvd_net_info net_info;
176         struct rcvd_async_info async_info;
177         struct key_attr key_info;
178         struct cfg_param_attr cfg_info;
179         struct channel_attr channel_info;
180         struct beacon_attr beacon_info;
181         struct add_sta_param add_sta_info;
182         struct del_sta del_sta_info;
183         struct add_sta_param edit_sta_info;
184         struct power_mgmt_param pwr_mgmt_info;
185         struct sta_inactive_t mac_info;
186         struct set_ip_addr ip_info;
187         struct drv_handler drv;
188         struct set_multicast multicast_info;
189         struct op_mode mode;
190         struct set_mac_addr set_mac_info;
191         struct get_mac_addr get_mac_info;
192         struct ba_session_info session_info;
193         struct remain_ch remain_on_ch;
194         struct reg_frame reg_frame;
195         char *data;
196         struct del_all_sta del_all_sta_info;
197 };
198
199 struct host_if_msg {
200         u16 id;
201         union message_body body;
202         struct host_if_drv *drv;
203 };
204
205 struct join_bss_param {
206         BSSTYPE_T bss_type;
207         u8 dtim_period;
208         u16 beacon_period;
209         u16 cap_info;
210         u8 au8bssid[6];
211         char ssid[MAX_SSID_LEN];
212         u8 ssid_len;
213         u8 supp_rates[MAX_RATES_SUPPORTED + 1];
214         u8 ht_capable;
215         u8 wmm_cap;
216         u8 uapsd_cap;
217         bool rsn_found;
218         u8 rsn_grp_policy;
219         u8 mode_802_11i;
220         u8 rsn_pcip_policy[3];
221         u8 rsn_auth_policy[3];
222         u8 rsn_cap[2];
223         u32 tsf;
224         u8 noa_enabled;
225         u8 opp_enabled;
226         u8 ct_window;
227         u8 cnt;
228         u8 idx;
229         u8 duration[4];
230         u8 interval[4];
231         u8 start_time[4];
232 };
233
234 static struct host_if_drv *wfidrv_list[NUM_CONCURRENT_IFC + 1];
235 struct host_if_drv *terminated_handle;
236 bool g_obtainingIP;
237 u8 P2P_LISTEN_STATE;
238 static struct task_struct *hif_thread_handler;
239 static WILC_MsgQueueHandle hif_msg_q;
240 static struct semaphore hif_sema_thread;
241 static struct semaphore hif_sema_driver;
242 static struct semaphore hif_sema_wait_response;
243 static struct semaphore hif_sema_deinit;
244 static struct timer_list periodic_rssi;
245
246 u8 multicast_mac_addr_list[WILC_MULTICAST_TABLE_SIZE][ETH_ALEN];
247
248 static u8 rcv_assoc_resp[MAX_ASSOC_RESP_FRAME_SIZE];
249
250 static bool scan_while_connected;
251
252 static s8 rssi;
253 static s8 link_speed;
254 static u8 ch_no;
255 static u8 set_ip[2][4];
256 static u8 get_ip[2][4];
257 static u32 inactive_time;
258 static u8 del_beacon;
259 static u32 clients_count;
260
261 static u8 *join_req;
262 u8 *info_element;
263 static u8 mode_11i;
264 u8 auth_type;
265 u32 join_req_size;
266 static u32 info_element_size;
267 static struct host_if_drv *join_req_drv;
268 #define REAL_JOIN_REQ 0
269 #define FLUSHED_JOIN_REQ 1
270 #define FLUSHED_BYTE_POS 79
271
272 static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo);
273
274 extern int linux_wlan_get_num_conn_ifcs(void);
275
276 static int add_handler_in_list(struct host_if_drv *handler)
277 {
278         int i;
279
280         for (i = 1; i < ARRAY_SIZE(wfidrv_list); i++) {
281                 if (!wfidrv_list[i]) {
282                         wfidrv_list[i] = handler;
283                         return 0;
284                 }
285         }
286
287         return -ENOBUFS;
288 }
289
290 static int remove_handler_in_list(struct host_if_drv *handler)
291 {
292         int i;
293
294         for (i = 1; i < ARRAY_SIZE(wfidrv_list); i++) {
295                 if (wfidrv_list[i] == handler) {
296                         wfidrv_list[i] = NULL;
297                         return 0;
298                 }
299         }
300
301         return -EINVAL;
302 }
303
304 static int get_id_from_handler(struct host_if_drv *handler)
305 {
306         int i;
307
308         if (!handler)
309                 return 0;
310
311         for (i = 1; i < ARRAY_SIZE(wfidrv_list); i++) {
312                 if (wfidrv_list[i] == handler)
313                         return i;
314         }
315
316         return 0;
317 }
318
319 static struct host_if_drv *get_handler_from_id(int id)
320 {
321         if (id <= 0 || id >= ARRAY_SIZE(wfidrv_list))
322                 return NULL;
323         return wfidrv_list[id];
324 }
325
326 static s32 handle_set_channel(struct host_if_drv *hif_drv,
327                               struct channel_attr *hif_set_ch)
328 {
329         s32 result = 0;
330         struct wid wid;
331
332         wid.id = (u16)WID_CURRENT_CHANNEL;
333         wid.type = WID_CHAR;
334         wid.val = (char *)&hif_set_ch->set_ch;
335         wid.size = sizeof(char);
336
337         PRINT_D(HOSTINF_DBG, "Setting channel\n");
338
339         result = send_config_pkt(SET_CFG, &wid, 1,
340                                  get_id_from_handler(hif_drv));
341
342         if (result) {
343                 PRINT_ER("Failed to set channel\n");
344                 return -EINVAL;
345         }
346
347         return result;
348 }
349
350 static s32 handle_set_wfi_drv_handler(struct host_if_drv *hif_drv,
351                                       struct drv_handler *hif_drv_handler)
352 {
353         s32 result = 0;
354         struct wid wid;
355
356         wid.id = (u16)WID_SET_DRV_HANDLER;
357         wid.type = WID_INT;
358         wid.val = (s8 *)&hif_drv_handler->handler;
359         wid.size = sizeof(u32);
360
361         result = send_config_pkt(SET_CFG, &wid, 1, hif_drv_handler->handler);
362
363         if (!hif_drv)
364                 up(&hif_sema_driver);
365
366         if (result) {
367                 PRINT_ER("Failed to set driver handler\n");
368                 return -EINVAL;
369         }
370
371         return result;
372 }
373
374 static s32 handle_set_operation_mode(struct host_if_drv *hif_drv,
375                                      struct op_mode *hif_op_mode)
376 {
377         s32 result = 0;
378         struct wid wid;
379
380         wid.id = (u16)WID_SET_OPERATION_MODE;
381         wid.type = WID_INT;
382         wid.val = (s8 *)&hif_op_mode->mode;
383         wid.size = sizeof(u32);
384
385         result = send_config_pkt(SET_CFG, &wid, 1,
386                                  get_id_from_handler(hif_drv));
387
388         if ((hif_op_mode->mode) == IDLE_MODE)
389                 up(&hif_sema_driver);
390
391         if (result) {
392                 PRINT_ER("Failed to set driver handler\n");
393                 return -EINVAL;
394         }
395
396         return result;
397 }
398
399 s32 handle_set_ip_address(struct host_if_drv *hif_drv, u8 *ip_addr, u8 idx)
400 {
401         s32 result = 0;
402         struct wid wid;
403         char firmware_ip_addr[4] = {0};
404
405         if (ip_addr[0] < 192)
406                 ip_addr[0] = 0;
407
408         PRINT_INFO(HOSTINF_DBG, "Indx = %d, Handling set  IP = %pI4\n",
409                    idx, ip_addr);
410
411         memcpy(set_ip[idx], ip_addr, IP_ALEN);
412
413         wid.id = (u16)WID_IP_ADDRESS;
414         wid.type = WID_STR;
415         wid.val = (u8 *)ip_addr;
416         wid.size = IP_ALEN;
417
418         result = send_config_pkt(SET_CFG, &wid, 1,
419                                  get_id_from_handler(hif_drv));
420
421         host_int_get_ipaddress(hif_drv, firmware_ip_addr, idx);
422
423         if (result) {
424                 PRINT_ER("Failed to set IP address\n");
425                 return -EINVAL;
426         }
427
428         PRINT_INFO(HOSTINF_DBG, "IP address set\n");
429
430         return result;
431 }
432
433 s32 handle_get_ip_address(struct host_if_drv *hif_drv, u8 idx)
434 {
435         s32 result = 0;
436         struct wid wid;
437
438         wid.id = (u16)WID_IP_ADDRESS;
439         wid.type = WID_STR;
440         wid.val = kmalloc(IP_ALEN, GFP_KERNEL);
441         wid.size = IP_ALEN;
442
443         result = send_config_pkt(GET_CFG, &wid, 1,
444                                  get_id_from_handler(hif_drv));
445
446         PRINT_INFO(HOSTINF_DBG, "%pI4\n", wid.val);
447
448         memcpy(get_ip[idx], wid.val, IP_ALEN);
449
450         kfree(wid.val);
451
452         if (memcmp(get_ip[idx], set_ip[idx], IP_ALEN) != 0)
453                 host_int_setup_ipaddress(hif_drv, set_ip[idx], idx);
454
455         if (result != 0) {
456                 PRINT_ER("Failed to get IP address\n");
457                 return -EINVAL;
458         }
459
460         PRINT_INFO(HOSTINF_DBG, "IP address retrieved:: u8IfIdx = %d\n", idx);
461         PRINT_INFO(HOSTINF_DBG, "%pI4\n", get_ip[idx]);
462         PRINT_INFO(HOSTINF_DBG, "\n");
463
464         return result;
465 }
466
467 static s32 handle_set_mac_address(struct host_if_drv *hif_drv,
468                                   struct set_mac_addr *set_mac_addr)
469 {
470         s32 result = 0;
471         struct wid wid;
472         u8 *mac_buf = kmalloc(ETH_ALEN, GFP_KERNEL);
473
474         if (!mac_buf) {
475                 PRINT_ER("No buffer to send mac address\n");
476                 return -EFAULT;
477         }
478         memcpy(mac_buf, set_mac_addr->mac_addr, ETH_ALEN);
479
480         wid.id = (u16)WID_MAC_ADDR;
481         wid.type = WID_STR;
482         wid.val = mac_buf;
483         wid.size = ETH_ALEN;
484         PRINT_D(GENERIC_DBG, "mac addr = :%pM\n", wid.val);
485
486         result = send_config_pkt(SET_CFG, &wid, 1,
487                                  get_id_from_handler(hif_drv));
488         if (result) {
489                 PRINT_ER("Failed to set mac address\n");
490                 result = -EFAULT;
491         }
492
493         kfree(mac_buf);
494         return result;
495 }
496
497 static s32 handle_get_mac_address(struct host_if_drv *hif_drv,
498                                   struct get_mac_addr *get_mac_addr)
499 {
500         s32 result = 0;
501         struct wid wid;
502
503         wid.id = (u16)WID_MAC_ADDR;
504         wid.type = WID_STR;
505         wid.val = get_mac_addr->mac_addr;
506         wid.size = ETH_ALEN;
507
508         result = send_config_pkt(GET_CFG, &wid, 1,
509                                  get_id_from_handler(hif_drv));
510
511         if (result) {
512                 PRINT_ER("Failed to get mac address\n");
513                 result = -EFAULT;
514         }
515         up(&hif_sema_wait_response);
516
517         return result;
518 }
519
520 static s32 handle_cfg_param(struct host_if_drv *hif_drv,
521                             struct cfg_param_attr *cfg_param_attr)
522 {
523         s32 result = 0;
524         struct wid wid_list[32];
525         u8 wid_cnt = 0;
526
527         down(&hif_drv->sem_cfg_values);
528
529         PRINT_D(HOSTINF_DBG, "Setting CFG params\n");
530
531         if (cfg_param_attr->cfg_attr_info.flag & BSS_TYPE) {
532                 if (cfg_param_attr->cfg_attr_info.bss_type < 6) {
533                         wid_list[wid_cnt].id = WID_BSS_TYPE;
534                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.bss_type;
535                         wid_list[wid_cnt].type = WID_CHAR;
536                         wid_list[wid_cnt].size = sizeof(char);
537                         hif_drv->cfg_values.bss_type = (u8)cfg_param_attr->cfg_attr_info.bss_type;
538                 } else {
539                         PRINT_ER("check value 6 over\n");
540                         result = -EINVAL;
541                         goto ERRORHANDLER;
542                 }
543                 wid_cnt++;
544         }
545         if (cfg_param_attr->cfg_attr_info.flag & AUTH_TYPE) {
546                 if (cfg_param_attr->cfg_attr_info.auth_type == 1 ||
547                     cfg_param_attr->cfg_attr_info.auth_type == 2 ||
548                     cfg_param_attr->cfg_attr_info.auth_type == 5) {
549                         wid_list[wid_cnt].id = WID_AUTH_TYPE;
550                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.auth_type;
551                         wid_list[wid_cnt].type = WID_CHAR;
552                         wid_list[wid_cnt].size = sizeof(char);
553                         hif_drv->cfg_values.auth_type = (u8)cfg_param_attr->cfg_attr_info.auth_type;
554                 } else {
555                         PRINT_ER("Impossible value \n");
556                         result = -EINVAL;
557                         goto ERRORHANDLER;
558                 }
559                 wid_cnt++;
560         }
561         if (cfg_param_attr->cfg_attr_info.flag & AUTHEN_TIMEOUT) {
562                 if (cfg_param_attr->cfg_attr_info.auth_timeout > 0 &&
563                     cfg_param_attr->cfg_attr_info.auth_timeout < 65536) {
564                         wid_list[wid_cnt].id = WID_AUTH_TIMEOUT;
565                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.auth_timeout;
566                         wid_list[wid_cnt].type = WID_SHORT;
567                         wid_list[wid_cnt].size = sizeof(u16);
568                         hif_drv->cfg_values.auth_timeout = cfg_param_attr->cfg_attr_info.auth_timeout;
569                 } else {
570                         PRINT_ER("Range(1 ~ 65535) over\n");
571                         result = -EINVAL;
572                         goto ERRORHANDLER;
573                 }
574                 wid_cnt++;
575         }
576         if (cfg_param_attr->cfg_attr_info.flag & POWER_MANAGEMENT) {
577                 if (cfg_param_attr->cfg_attr_info.power_mgmt_mode < 5) {
578                         wid_list[wid_cnt].id = WID_POWER_MANAGEMENT;
579                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.power_mgmt_mode;
580                         wid_list[wid_cnt].type = WID_CHAR;
581                         wid_list[wid_cnt].size = sizeof(char);
582                         hif_drv->cfg_values.power_mgmt_mode = (u8)cfg_param_attr->cfg_attr_info.power_mgmt_mode;
583                 } else {
584                         PRINT_ER("Invalide power mode\n");
585                         result = -EINVAL;
586                         goto ERRORHANDLER;
587                 }
588                 wid_cnt++;
589         }
590         if (cfg_param_attr->cfg_attr_info.flag & RETRY_SHORT) {
591                 if (cfg_param_attr->cfg_attr_info.short_retry_limit > 0 &&
592                     cfg_param_attr->cfg_attr_info.short_retry_limit < 256) {
593                         wid_list[wid_cnt].id = WID_SHORT_RETRY_LIMIT;
594                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.short_retry_limit;
595                         wid_list[wid_cnt].type = WID_SHORT;
596                         wid_list[wid_cnt].size = sizeof(u16);
597                         hif_drv->cfg_values.short_retry_limit = cfg_param_attr->cfg_attr_info.short_retry_limit;
598                 } else {
599                         PRINT_ER("Range(1~256) over\n");
600                         result = -EINVAL;
601                         goto ERRORHANDLER;
602                 }
603                 wid_cnt++;
604         }
605         if (cfg_param_attr->cfg_attr_info.flag & RETRY_LONG) {
606                 if (cfg_param_attr->cfg_attr_info.long_retry_limit > 0 &&
607                     cfg_param_attr->cfg_attr_info.long_retry_limit < 256) {
608                         wid_list[wid_cnt].id = WID_LONG_RETRY_LIMIT;
609                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.long_retry_limit;
610                         wid_list[wid_cnt].type = WID_SHORT;
611                         wid_list[wid_cnt].size = sizeof(u16);
612                         hif_drv->cfg_values.long_retry_limit = cfg_param_attr->cfg_attr_info.long_retry_limit;
613                 } else {
614                         PRINT_ER("Range(1~256) over\n");
615                         result = -EINVAL;
616                         goto ERRORHANDLER;
617                 }
618                 wid_cnt++;
619         }
620         if (cfg_param_attr->cfg_attr_info.flag & FRAG_THRESHOLD) {
621                 if (cfg_param_attr->cfg_attr_info.frag_threshold > 255 &&
622                     cfg_param_attr->cfg_attr_info.frag_threshold < 7937) {
623                         wid_list[wid_cnt].id = WID_FRAG_THRESHOLD;
624                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.frag_threshold;
625                         wid_list[wid_cnt].type = WID_SHORT;
626                         wid_list[wid_cnt].size = sizeof(u16);
627                         hif_drv->cfg_values.frag_threshold = cfg_param_attr->cfg_attr_info.frag_threshold;
628                 } else {
629                         PRINT_ER("Threshold Range fail\n");
630                         result = -EINVAL;
631                         goto ERRORHANDLER;
632                 }
633                 wid_cnt++;
634         }
635         if (cfg_param_attr->cfg_attr_info.flag & RTS_THRESHOLD) {
636                 if (cfg_param_attr->cfg_attr_info.rts_threshold > 255 &&
637                     cfg_param_attr->cfg_attr_info.rts_threshold < 65536) {
638                         wid_list[wid_cnt].id = WID_RTS_THRESHOLD;
639                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.rts_threshold;
640                         wid_list[wid_cnt].type = WID_SHORT;
641                         wid_list[wid_cnt].size = sizeof(u16);
642                         hif_drv->cfg_values.rts_threshold = cfg_param_attr->cfg_attr_info.rts_threshold;
643                 } else {
644                         PRINT_ER("Threshold Range fail\n");
645                         result = -EINVAL;
646                         goto ERRORHANDLER;
647                 }
648                 wid_cnt++;
649         }
650         if (cfg_param_attr->cfg_attr_info.flag & PREAMBLE) {
651                 if (cfg_param_attr->cfg_attr_info.preamble_type < 3) {
652                         wid_list[wid_cnt].id = WID_PREAMBLE;
653                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.preamble_type;
654                         wid_list[wid_cnt].type = WID_CHAR;
655                         wid_list[wid_cnt].size = sizeof(char);
656                         hif_drv->cfg_values.preamble_type = cfg_param_attr->cfg_attr_info.preamble_type;
657                 } else {
658                         PRINT_ER("Preamle Range(0~2) over\n");
659                         result = -EINVAL;
660                         goto ERRORHANDLER;
661                 }
662                 wid_cnt++;
663         }
664         if (cfg_param_attr->cfg_attr_info.flag & SHORT_SLOT_ALLOWED) {
665                 if (cfg_param_attr->cfg_attr_info.short_slot_allowed < 2) {
666                         wid_list[wid_cnt].id = WID_SHORT_SLOT_ALLOWED;
667                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.short_slot_allowed;
668                         wid_list[wid_cnt].type = WID_CHAR;
669                         wid_list[wid_cnt].size = sizeof(char);
670                         hif_drv->cfg_values.short_slot_allowed = (u8)cfg_param_attr->cfg_attr_info.short_slot_allowed;
671                 } else {
672                         PRINT_ER("Short slot(2) over\n");
673                         result = -EINVAL;
674                         goto ERRORHANDLER;
675                 }
676                 wid_cnt++;
677         }
678         if (cfg_param_attr->cfg_attr_info.flag & TXOP_PROT_DISABLE) {
679                 if (cfg_param_attr->cfg_attr_info.txop_prot_disabled < 2) {
680                         wid_list[wid_cnt].id = WID_11N_TXOP_PROT_DISABLE;
681                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.txop_prot_disabled;
682                         wid_list[wid_cnt].type = WID_CHAR;
683                         wid_list[wid_cnt].size = sizeof(char);
684                         hif_drv->cfg_values.txop_prot_disabled = (u8)cfg_param_attr->cfg_attr_info.txop_prot_disabled;
685                 } else {
686                         PRINT_ER("TXOP prot disable\n");
687                         result = -EINVAL;
688                         goto ERRORHANDLER;
689                 }
690                 wid_cnt++;
691         }
692         if (cfg_param_attr->cfg_attr_info.flag & BEACON_INTERVAL) {
693                 if (cfg_param_attr->cfg_attr_info.beacon_interval > 0 &&
694                     cfg_param_attr->cfg_attr_info.beacon_interval < 65536) {
695                         wid_list[wid_cnt].id = WID_BEACON_INTERVAL;
696                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.beacon_interval;
697                         wid_list[wid_cnt].type = WID_SHORT;
698                         wid_list[wid_cnt].size = sizeof(u16);
699                         hif_drv->cfg_values.beacon_interval = cfg_param_attr->cfg_attr_info.beacon_interval;
700                 } else {
701                         PRINT_ER("Beacon interval(1~65535) fail\n");
702                         result = -EINVAL;
703                         goto ERRORHANDLER;
704                 }
705                 wid_cnt++;
706         }
707         if (cfg_param_attr->cfg_attr_info.flag & DTIM_PERIOD) {
708                 if (cfg_param_attr->cfg_attr_info.dtim_period > 0 &&
709                     cfg_param_attr->cfg_attr_info.dtim_period < 256) {
710                         wid_list[wid_cnt].id = WID_DTIM_PERIOD;
711                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.dtim_period;
712                         wid_list[wid_cnt].type = WID_CHAR;
713                         wid_list[wid_cnt].size = sizeof(char);
714                         hif_drv->cfg_values.dtim_period = cfg_param_attr->cfg_attr_info.dtim_period;
715                 } else {
716                         PRINT_ER("DTIM range(1~255) fail\n");
717                         result = -EINVAL;
718                         goto ERRORHANDLER;
719                 }
720                 wid_cnt++;
721         }
722         if (cfg_param_attr->cfg_attr_info.flag & SITE_SURVEY) {
723                 if (cfg_param_attr->cfg_attr_info.site_survey_enabled < 3) {
724                         wid_list[wid_cnt].id = WID_SITE_SURVEY;
725                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.site_survey_enabled;
726                         wid_list[wid_cnt].type = WID_CHAR;
727                         wid_list[wid_cnt].size = sizeof(char);
728                         hif_drv->cfg_values.site_survey_enabled = (u8)cfg_param_attr->cfg_attr_info.site_survey_enabled;
729                 } else {
730                         PRINT_ER("Site survey disable\n");
731                         result = -EINVAL;
732                         goto ERRORHANDLER;
733                 }
734                 wid_cnt++;
735         }
736         if (cfg_param_attr->cfg_attr_info.flag & SITE_SURVEY_SCAN_TIME) {
737                 if (cfg_param_attr->cfg_attr_info.site_survey_scan_time > 0 &&
738                     cfg_param_attr->cfg_attr_info.site_survey_scan_time < 65536) {
739                         wid_list[wid_cnt].id = WID_SITE_SURVEY_SCAN_TIME;
740                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.site_survey_scan_time;
741                         wid_list[wid_cnt].type = WID_SHORT;
742                         wid_list[wid_cnt].size = sizeof(u16);
743                         hif_drv->cfg_values.site_survey_scan_time = cfg_param_attr->cfg_attr_info.site_survey_scan_time;
744                 } else {
745                         PRINT_ER("Site survey scan time(1~65535) over\n");
746                         result = -EINVAL;
747                         goto ERRORHANDLER;
748                 }
749                 wid_cnt++;
750         }
751         if (cfg_param_attr->cfg_attr_info.flag & ACTIVE_SCANTIME) {
752                 if (cfg_param_attr->cfg_attr_info.active_scan_time > 0 &&
753                     cfg_param_attr->cfg_attr_info.active_scan_time < 65536) {
754                         wid_list[wid_cnt].id = WID_ACTIVE_SCAN_TIME;
755                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.active_scan_time;
756                         wid_list[wid_cnt].type = WID_SHORT;
757                         wid_list[wid_cnt].size = sizeof(u16);
758                         hif_drv->cfg_values.active_scan_time = cfg_param_attr->cfg_attr_info.active_scan_time;
759                 } else {
760                         PRINT_ER("Active scan time(1~65535) over\n");
761                         result = -EINVAL;
762                         goto ERRORHANDLER;
763                 }
764                 wid_cnt++;
765         }
766         if (cfg_param_attr->cfg_attr_info.flag & PASSIVE_SCANTIME) {
767                 if (cfg_param_attr->cfg_attr_info.passive_scan_time > 0 &&
768                     cfg_param_attr->cfg_attr_info.passive_scan_time < 65536) {
769                         wid_list[wid_cnt].id = WID_PASSIVE_SCAN_TIME;
770                         wid_list[wid_cnt].val = (s8 *)&cfg_param_attr->cfg_attr_info.passive_scan_time;
771                         wid_list[wid_cnt].type = WID_SHORT;
772                         wid_list[wid_cnt].size = sizeof(u16);
773                         hif_drv->cfg_values.passive_scan_time = cfg_param_attr->cfg_attr_info.passive_scan_time;
774                 } else {
775                         PRINT_ER("Passive scan time(1~65535) over\n");
776                         result = -EINVAL;
777                         goto ERRORHANDLER;
778                 }
779                 wid_cnt++;
780         }
781         if (cfg_param_attr->cfg_attr_info.flag & CURRENT_TX_RATE) {
782                 enum CURRENT_TXRATE curr_tx_rate = cfg_param_attr->cfg_attr_info.curr_tx_rate;
783
784                 if (curr_tx_rate == AUTORATE || curr_tx_rate == MBPS_1
785                     || curr_tx_rate == MBPS_2 || curr_tx_rate == MBPS_5_5
786                     || curr_tx_rate == MBPS_11 || curr_tx_rate == MBPS_6
787                     || curr_tx_rate == MBPS_9 || curr_tx_rate == MBPS_12
788                     || curr_tx_rate == MBPS_18 || curr_tx_rate == MBPS_24
789                     || curr_tx_rate == MBPS_36 || curr_tx_rate == MBPS_48 || curr_tx_rate == MBPS_54) {
790                         wid_list[wid_cnt].id = WID_CURRENT_TX_RATE;
791                         wid_list[wid_cnt].val = (s8 *)&curr_tx_rate;
792                         wid_list[wid_cnt].type = WID_SHORT;
793                         wid_list[wid_cnt].size = sizeof(u16);
794                         hif_drv->cfg_values.curr_tx_rate = (u8)curr_tx_rate;
795                 } else {
796                         PRINT_ER("out of TX rate\n");
797                         result = -EINVAL;
798                         goto ERRORHANDLER;
799                 }
800                 wid_cnt++;
801         }
802
803         result = send_config_pkt(SET_CFG, wid_list, wid_cnt,
804                                  get_id_from_handler(hif_drv));
805
806         if (result)
807                 PRINT_ER("Error in setting CFG params\n");
808
809 ERRORHANDLER:
810         up(&hif_drv->sem_cfg_values);
811         return result;
812 }
813
814 static void Handle_wait_msg_q_empty(void)
815 {
816         g_wilc_initialized = 0;
817         up(&hif_sema_wait_response);
818 }
819
820 static s32 Handle_Scan(struct host_if_drv *hif_drv,
821                        struct scan_attr *pstrHostIFscanAttr)
822 {
823         s32 result = 0;
824         struct wid strWIDList[5];
825         u32 u32WidsCount = 0;
826         u32 i;
827         u8 *pu8Buffer;
828         u8 valuesize = 0;
829         u8 *pu8HdnNtwrksWidVal = NULL;
830
831         PRINT_D(HOSTINF_DBG, "Setting SCAN params\n");
832         PRINT_D(HOSTINF_DBG, "Scanning: In [%d] state\n", hif_drv->hif_state);
833
834         hif_drv->usr_scan_req.scan_result = pstrHostIFscanAttr->result;
835         hif_drv->usr_scan_req.arg = pstrHostIFscanAttr->arg;
836
837         if ((hif_drv->hif_state >= HOST_IF_SCANNING) &&
838             (hif_drv->hif_state < HOST_IF_CONNECTED)) {
839                 PRINT_D(GENERIC_DBG, "Don't scan already in [%d] state\n",
840                         hif_drv->hif_state);
841                 PRINT_ER("Already scan\n");
842                 result = -EBUSY;
843                 goto ERRORHANDLER;
844         }
845
846         if (g_obtainingIP || connecting) {
847                 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
848                 PRINT_ER("Don't do obss scan\n");
849                 result = -EBUSY;
850                 goto ERRORHANDLER;
851         }
852
853         PRINT_D(HOSTINF_DBG, "Setting SCAN params\n");
854
855         hif_drv->usr_scan_req.rcvd_ch_cnt = 0;
856
857         strWIDList[u32WidsCount].id = (u16)WID_SSID_PROBE_REQ;
858         strWIDList[u32WidsCount].type = WID_STR;
859
860         for (i = 0; i < pstrHostIFscanAttr->hidden_network.u8ssidnum; i++)
861                 valuesize += ((pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen) + 1);
862         pu8HdnNtwrksWidVal = kmalloc(valuesize + 1, GFP_KERNEL);
863         strWIDList[u32WidsCount].val = pu8HdnNtwrksWidVal;
864         if (strWIDList[u32WidsCount].val) {
865                 pu8Buffer = strWIDList[u32WidsCount].val;
866
867                 *pu8Buffer++ = pstrHostIFscanAttr->hidden_network.u8ssidnum;
868
869                 PRINT_D(HOSTINF_DBG, "In Handle_ProbeRequest number of ssid %d\n", pstrHostIFscanAttr->hidden_network.u8ssidnum);
870
871                 for (i = 0; i < pstrHostIFscanAttr->hidden_network.u8ssidnum; i++) {
872                         *pu8Buffer++ = pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen;
873                         memcpy(pu8Buffer, pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].pu8ssid, pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen);
874                         pu8Buffer += pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen;
875                 }
876
877                 strWIDList[u32WidsCount].size = (s32)(valuesize + 1);
878                 u32WidsCount++;
879         }
880
881         {
882                 strWIDList[u32WidsCount].id = WID_INFO_ELEMENT_PROBE;
883                 strWIDList[u32WidsCount].type = WID_BIN_DATA;
884                 strWIDList[u32WidsCount].val = pstrHostIFscanAttr->ies;
885                 strWIDList[u32WidsCount].size = pstrHostIFscanAttr->ies_len;
886                 u32WidsCount++;
887         }
888
889         strWIDList[u32WidsCount].id = WID_SCAN_TYPE;
890         strWIDList[u32WidsCount].type = WID_CHAR;
891         strWIDList[u32WidsCount].size = sizeof(char);
892         strWIDList[u32WidsCount].val = (s8 *)&pstrHostIFscanAttr->type;
893         u32WidsCount++;
894
895         strWIDList[u32WidsCount].id = WID_SCAN_CHANNEL_LIST;
896         strWIDList[u32WidsCount].type = WID_BIN_DATA;
897
898         if (pstrHostIFscanAttr->ch_freq_list &&
899             pstrHostIFscanAttr->ch_list_len > 0) {
900                 int i;
901
902                 for (i = 0; i < pstrHostIFscanAttr->ch_list_len; i++)   {
903                         if (pstrHostIFscanAttr->ch_freq_list[i] > 0)
904                                 pstrHostIFscanAttr->ch_freq_list[i] = pstrHostIFscanAttr->ch_freq_list[i] - 1;
905                 }
906         }
907
908         strWIDList[u32WidsCount].val = pstrHostIFscanAttr->ch_freq_list;
909         strWIDList[u32WidsCount].size = pstrHostIFscanAttr->ch_list_len;
910         u32WidsCount++;
911
912         strWIDList[u32WidsCount].id = WID_START_SCAN_REQ;
913         strWIDList[u32WidsCount].type = WID_CHAR;
914         strWIDList[u32WidsCount].size = sizeof(char);
915         strWIDList[u32WidsCount].val = (s8 *)&pstrHostIFscanAttr->src;
916         u32WidsCount++;
917
918         if (hif_drv->hif_state == HOST_IF_CONNECTED)
919                 scan_while_connected = true;
920         else if (hif_drv->hif_state == HOST_IF_IDLE)
921                 scan_while_connected = false;
922
923         result = send_config_pkt(SET_CFG, strWIDList, u32WidsCount,
924                                  get_id_from_handler(hif_drv));
925
926         if (result)
927                 PRINT_ER("Failed to send scan paramters config packet\n");
928         else
929                 PRINT_D(HOSTINF_DBG, "Successfully sent SCAN params config packet\n");
930
931 ERRORHANDLER:
932         if (result) {
933                 del_timer(&hif_drv->scan_timer);
934                 Handle_ScanDone(hif_drv, SCAN_EVENT_ABORTED);
935         }
936
937         kfree(pstrHostIFscanAttr->ch_freq_list);
938         pstrHostIFscanAttr->ch_freq_list = NULL;
939
940         kfree(pstrHostIFscanAttr->ies);
941         pstrHostIFscanAttr->ies = NULL;
942         kfree(pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo);
943         pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo = NULL;
944
945         kfree(pu8HdnNtwrksWidVal);
946
947         return result;
948 }
949
950 static s32 Handle_ScanDone(struct host_if_drv *hif_drv,
951                            enum scan_event enuEvent)
952 {
953         s32 result = 0;
954         u8 u8abort_running_scan;
955         struct wid wid;
956
957         PRINT_D(HOSTINF_DBG, "in Handle_ScanDone()\n");
958
959         if (enuEvent == SCAN_EVENT_ABORTED) {
960                 PRINT_D(GENERIC_DBG, "Abort running scan\n");
961                 u8abort_running_scan = 1;
962                 wid.id = (u16)WID_ABORT_RUNNING_SCAN;
963                 wid.type = WID_CHAR;
964                 wid.val = (s8 *)&u8abort_running_scan;
965                 wid.size = sizeof(char);
966
967                 result = send_config_pkt(SET_CFG, &wid, 1,
968                                          get_id_from_handler(hif_drv));
969
970                 if (result) {
971                         PRINT_ER("Failed to set abort running scan\n");
972                         result = -EFAULT;
973                 }
974         }
975
976         if (!hif_drv) {
977                 PRINT_ER("Driver handler is NULL\n");
978                 return result;
979         }
980
981         if (hif_drv->usr_scan_req.scan_result) {
982                 hif_drv->usr_scan_req.scan_result(enuEvent, NULL,
983                                                   hif_drv->usr_scan_req.arg, NULL);
984                 hif_drv->usr_scan_req.scan_result = NULL;
985         }
986
987         return result;
988 }
989
990 u8 u8ConnectedSSID[6] = {0};
991 static s32 Handle_Connect(struct host_if_drv *hif_drv,
992                           struct connect_attr *pstrHostIFconnectAttr)
993 {
994         s32 result = 0;
995         struct wid strWIDList[8];
996         u32 u32WidsCount = 0, dummyval = 0;
997         u8 *pu8CurrByte = NULL;
998         struct join_bss_param *ptstrJoinBssParam;
999
1000         PRINT_D(GENERIC_DBG, "Handling connect request\n");
1001
1002         if (memcmp(pstrHostIFconnectAttr->bssid, u8ConnectedSSID, ETH_ALEN) == 0) {
1003                 result = 0;
1004                 PRINT_ER("Trying to connect to an already connected AP, Discard connect request\n");
1005                 return result;
1006         }
1007
1008         PRINT_INFO(HOSTINF_DBG, "Saving connection parameters in global structure\n");
1009
1010         ptstrJoinBssParam = (struct join_bss_param *)pstrHostIFconnectAttr->params;
1011         if (!ptstrJoinBssParam) {
1012                 PRINT_ER("Required BSSID not found\n");
1013                 result = -ENOENT;
1014                 goto ERRORHANDLER;
1015         }
1016
1017         if (pstrHostIFconnectAttr->bssid) {
1018                 hif_drv->usr_conn_req.pu8bssid = kmalloc(6, GFP_KERNEL);
1019                 memcpy(hif_drv->usr_conn_req.pu8bssid, pstrHostIFconnectAttr->bssid, 6);
1020         }
1021
1022         hif_drv->usr_conn_req.ssid_len = pstrHostIFconnectAttr->ssid_len;
1023         if (pstrHostIFconnectAttr->ssid) {
1024                 hif_drv->usr_conn_req.pu8ssid = kmalloc(pstrHostIFconnectAttr->ssid_len + 1, GFP_KERNEL);
1025                 memcpy(hif_drv->usr_conn_req.pu8ssid,
1026                        pstrHostIFconnectAttr->ssid,
1027                        pstrHostIFconnectAttr->ssid_len);
1028                 hif_drv->usr_conn_req.pu8ssid[pstrHostIFconnectAttr->ssid_len] = '\0';
1029         }
1030
1031         hif_drv->usr_conn_req.ies_len = pstrHostIFconnectAttr->ies_len;
1032         if (pstrHostIFconnectAttr->ies) {
1033                 hif_drv->usr_conn_req.ies = kmalloc(pstrHostIFconnectAttr->ies_len, GFP_KERNEL);
1034                 memcpy(hif_drv->usr_conn_req.ies,
1035                        pstrHostIFconnectAttr->ies,
1036                        pstrHostIFconnectAttr->ies_len);
1037         }
1038
1039         hif_drv->usr_conn_req.u8security = pstrHostIFconnectAttr->security;
1040         hif_drv->usr_conn_req.auth_type = pstrHostIFconnectAttr->auth_type;
1041         hif_drv->usr_conn_req.conn_result = pstrHostIFconnectAttr->result;
1042         hif_drv->usr_conn_req.arg = pstrHostIFconnectAttr->arg;
1043
1044         strWIDList[u32WidsCount].id = WID_SUCCESS_FRAME_COUNT;
1045         strWIDList[u32WidsCount].type = WID_INT;
1046         strWIDList[u32WidsCount].size = sizeof(u32);
1047         strWIDList[u32WidsCount].val = (s8 *)(&(dummyval));
1048         u32WidsCount++;
1049
1050         strWIDList[u32WidsCount].id = WID_RECEIVED_FRAGMENT_COUNT;
1051         strWIDList[u32WidsCount].type = WID_INT;
1052         strWIDList[u32WidsCount].size = sizeof(u32);
1053         strWIDList[u32WidsCount].val = (s8 *)(&(dummyval));
1054         u32WidsCount++;
1055
1056         strWIDList[u32WidsCount].id = WID_FAILED_COUNT;
1057         strWIDList[u32WidsCount].type = WID_INT;
1058         strWIDList[u32WidsCount].size = sizeof(u32);
1059         strWIDList[u32WidsCount].val = (s8 *)(&(dummyval));
1060         u32WidsCount++;
1061
1062         {
1063                 strWIDList[u32WidsCount].id = WID_INFO_ELEMENT_ASSOCIATE;
1064                 strWIDList[u32WidsCount].type = WID_BIN_DATA;
1065                 strWIDList[u32WidsCount].val = hif_drv->usr_conn_req.ies;
1066                 strWIDList[u32WidsCount].size = hif_drv->usr_conn_req.ies_len;
1067                 u32WidsCount++;
1068
1069                 if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7)) {
1070                         info_element_size = hif_drv->usr_conn_req.ies_len;
1071                         info_element = kmalloc(info_element_size, GFP_KERNEL);
1072                         memcpy(info_element, hif_drv->usr_conn_req.ies,
1073                                info_element_size);
1074                 }
1075         }
1076         strWIDList[u32WidsCount].id = (u16)WID_11I_MODE;
1077         strWIDList[u32WidsCount].type = WID_CHAR;
1078         strWIDList[u32WidsCount].size = sizeof(char);
1079         strWIDList[u32WidsCount].val = (s8 *)&hif_drv->usr_conn_req.u8security;
1080         u32WidsCount++;
1081
1082         if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7))
1083                 mode_11i = hif_drv->usr_conn_req.u8security;
1084
1085         PRINT_INFO(HOSTINF_DBG, "Encrypt Mode = %x\n", hif_drv->usr_conn_req.u8security);
1086
1087         strWIDList[u32WidsCount].id = (u16)WID_AUTH_TYPE;
1088         strWIDList[u32WidsCount].type = WID_CHAR;
1089         strWIDList[u32WidsCount].size = sizeof(char);
1090         strWIDList[u32WidsCount].val = (s8 *)&hif_drv->usr_conn_req.auth_type;
1091         u32WidsCount++;
1092
1093         if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7))
1094                 auth_type = (u8)hif_drv->usr_conn_req.auth_type;
1095
1096         PRINT_INFO(HOSTINF_DBG, "Authentication Type = %x\n",
1097                    hif_drv->usr_conn_req.auth_type);
1098         PRINT_D(HOSTINF_DBG, "Connecting to network of SSID %s on channel %d\n",
1099                 hif_drv->usr_conn_req.pu8ssid, pstrHostIFconnectAttr->ch);
1100
1101         strWIDList[u32WidsCount].id = (u16)WID_JOIN_REQ_EXTENDED;
1102         strWIDList[u32WidsCount].type = WID_STR;
1103         strWIDList[u32WidsCount].size = 112;
1104         strWIDList[u32WidsCount].val = kmalloc(strWIDList[u32WidsCount].size, GFP_KERNEL);
1105
1106         if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7)) {
1107                 join_req_size = strWIDList[u32WidsCount].size;
1108                 join_req = kmalloc(join_req_size, GFP_KERNEL);
1109         }
1110         if (!strWIDList[u32WidsCount].val) {
1111                 result = -EFAULT;
1112                 goto ERRORHANDLER;
1113         }
1114
1115         pu8CurrByte = strWIDList[u32WidsCount].val;
1116
1117         if (pstrHostIFconnectAttr->ssid) {
1118                 memcpy(pu8CurrByte, pstrHostIFconnectAttr->ssid, pstrHostIFconnectAttr->ssid_len);
1119                 pu8CurrByte[pstrHostIFconnectAttr->ssid_len] = '\0';
1120         }
1121         pu8CurrByte += MAX_SSID_LEN;
1122         *(pu8CurrByte++) = INFRASTRUCTURE;
1123
1124         if ((pstrHostIFconnectAttr->ch >= 1) && (pstrHostIFconnectAttr->ch <= 14)) {
1125                 *(pu8CurrByte++) = pstrHostIFconnectAttr->ch;
1126         } else {
1127                 PRINT_ER("Channel out of range\n");
1128                 *(pu8CurrByte++) = 0xFF;
1129         }
1130         *(pu8CurrByte++)  = (ptstrJoinBssParam->cap_info) & 0xFF;
1131         *(pu8CurrByte++)  = ((ptstrJoinBssParam->cap_info) >> 8) & 0xFF;
1132         PRINT_D(HOSTINF_DBG, "* Cap Info %0x*\n", (*(pu8CurrByte - 2) | ((*(pu8CurrByte - 1)) << 8)));
1133
1134         if (pstrHostIFconnectAttr->bssid)
1135                 memcpy(pu8CurrByte, pstrHostIFconnectAttr->bssid, 6);
1136         pu8CurrByte += 6;
1137
1138         if (pstrHostIFconnectAttr->bssid)
1139                 memcpy(pu8CurrByte, pstrHostIFconnectAttr->bssid, 6);
1140         pu8CurrByte += 6;
1141
1142         *(pu8CurrByte++)  = (ptstrJoinBssParam->beacon_period) & 0xFF;
1143         *(pu8CurrByte++)  = ((ptstrJoinBssParam->beacon_period) >> 8) & 0xFF;
1144         PRINT_D(HOSTINF_DBG, "* Beacon Period %d*\n", (*(pu8CurrByte - 2) | ((*(pu8CurrByte - 1)) << 8)));
1145         *(pu8CurrByte++)  =  ptstrJoinBssParam->dtim_period;
1146         PRINT_D(HOSTINF_DBG, "* DTIM Period %d*\n", (*(pu8CurrByte - 1)));
1147
1148         memcpy(pu8CurrByte, ptstrJoinBssParam->supp_rates, MAX_RATES_SUPPORTED + 1);
1149         pu8CurrByte += (MAX_RATES_SUPPORTED + 1);
1150
1151         *(pu8CurrByte++)  =  ptstrJoinBssParam->wmm_cap;
1152         PRINT_D(HOSTINF_DBG, "* wmm cap%d*\n", (*(pu8CurrByte - 1)));
1153         *(pu8CurrByte++)  = ptstrJoinBssParam->uapsd_cap;
1154
1155         *(pu8CurrByte++)  = ptstrJoinBssParam->ht_capable;
1156         hif_drv->usr_conn_req.ht_capable = ptstrJoinBssParam->ht_capable;
1157
1158         *(pu8CurrByte++)  =  ptstrJoinBssParam->rsn_found;
1159         PRINT_D(HOSTINF_DBG, "* rsn found %d*\n", *(pu8CurrByte - 1));
1160         *(pu8CurrByte++)  =  ptstrJoinBssParam->rsn_grp_policy;
1161         PRINT_D(HOSTINF_DBG, "* rsn group policy %0x*\n", (*(pu8CurrByte - 1)));
1162         *(pu8CurrByte++) =  ptstrJoinBssParam->mode_802_11i;
1163         PRINT_D(HOSTINF_DBG, "* mode_802_11i %d*\n", (*(pu8CurrByte - 1)));
1164
1165         memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_pcip_policy, sizeof(ptstrJoinBssParam->rsn_pcip_policy));
1166         pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_pcip_policy);
1167
1168         memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_auth_policy, sizeof(ptstrJoinBssParam->rsn_auth_policy));
1169         pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_auth_policy);
1170
1171         memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_cap, sizeof(ptstrJoinBssParam->rsn_cap));
1172         pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_cap);
1173
1174         *(pu8CurrByte++) = REAL_JOIN_REQ;
1175         *(pu8CurrByte++) = ptstrJoinBssParam->noa_enabled;
1176
1177         if (ptstrJoinBssParam->noa_enabled) {
1178                 PRINT_D(HOSTINF_DBG, "NOA present\n");
1179
1180                 *(pu8CurrByte++) = (ptstrJoinBssParam->tsf) & 0xFF;
1181                 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 8) & 0xFF;
1182                 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 16) & 0xFF;
1183                 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 24) & 0xFF;
1184
1185                 *(pu8CurrByte++) = ptstrJoinBssParam->opp_enabled;
1186                 *(pu8CurrByte++) = ptstrJoinBssParam->idx;
1187
1188                 if (ptstrJoinBssParam->opp_enabled)
1189                         *(pu8CurrByte++) = ptstrJoinBssParam->ct_window;
1190
1191                 *(pu8CurrByte++) = ptstrJoinBssParam->cnt;
1192
1193                 memcpy(pu8CurrByte, ptstrJoinBssParam->duration, sizeof(ptstrJoinBssParam->duration));
1194                 pu8CurrByte += sizeof(ptstrJoinBssParam->duration);
1195
1196                 memcpy(pu8CurrByte, ptstrJoinBssParam->interval, sizeof(ptstrJoinBssParam->interval));
1197                 pu8CurrByte += sizeof(ptstrJoinBssParam->interval);
1198
1199                 memcpy(pu8CurrByte, ptstrJoinBssParam->start_time, sizeof(ptstrJoinBssParam->start_time));
1200                 pu8CurrByte += sizeof(ptstrJoinBssParam->start_time);
1201         } else
1202                 PRINT_D(HOSTINF_DBG, "NOA not present\n");
1203
1204         pu8CurrByte = strWIDList[u32WidsCount].val;
1205         u32WidsCount++;
1206
1207         if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7)) {
1208                 memcpy(join_req, pu8CurrByte, join_req_size);
1209                 join_req_drv = hif_drv;
1210         }
1211
1212         PRINT_D(GENERIC_DBG, "send HOST_IF_WAITING_CONN_RESP\n");
1213
1214         if (pstrHostIFconnectAttr->bssid) {
1215                 memcpy(u8ConnectedSSID, pstrHostIFconnectAttr->bssid, ETH_ALEN);
1216
1217                 PRINT_D(GENERIC_DBG, "save Bssid = %pM\n", pstrHostIFconnectAttr->bssid);
1218                 PRINT_D(GENERIC_DBG, "save bssid = %pM\n", u8ConnectedSSID);
1219         }
1220
1221         result = send_config_pkt(SET_CFG, strWIDList, u32WidsCount,
1222                                  get_id_from_handler(hif_drv));
1223         if (result) {
1224                 PRINT_ER("failed to send config packet\n");
1225                 result = -EFAULT;
1226                 goto ERRORHANDLER;
1227         } else {
1228                 PRINT_D(GENERIC_DBG, "set HOST_IF_WAITING_CONN_RESP\n");
1229                 hif_drv->hif_state = HOST_IF_WAITING_CONN_RESP;
1230         }
1231
1232 ERRORHANDLER:
1233         if (result) {
1234                 tstrConnectInfo strConnectInfo;
1235
1236                 del_timer(&hif_drv->connect_timer);
1237
1238                 PRINT_D(HOSTINF_DBG, "could not start connecting to the required network\n");
1239
1240                 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
1241
1242                 if (pstrHostIFconnectAttr->result) {
1243                         if (pstrHostIFconnectAttr->bssid)
1244                                 memcpy(strConnectInfo.au8bssid, pstrHostIFconnectAttr->bssid, 6);
1245
1246                         if (pstrHostIFconnectAttr->ies) {
1247                                 strConnectInfo.ReqIEsLen = pstrHostIFconnectAttr->ies_len;
1248                                 strConnectInfo.pu8ReqIEs = kmalloc(pstrHostIFconnectAttr->ies_len, GFP_KERNEL);
1249                                 memcpy(strConnectInfo.pu8ReqIEs,
1250                                        pstrHostIFconnectAttr->ies,
1251                                        pstrHostIFconnectAttr->ies_len);
1252                         }
1253
1254                         pstrHostIFconnectAttr->result(CONN_DISCONN_EVENT_CONN_RESP,
1255                                                                &strConnectInfo,
1256                                                                MAC_DISCONNECTED,
1257                                                                NULL,
1258                                                                pstrHostIFconnectAttr->arg);
1259                         hif_drv->hif_state = HOST_IF_IDLE;
1260                         kfree(strConnectInfo.pu8ReqIEs);
1261                         strConnectInfo.pu8ReqIEs = NULL;
1262
1263                 } else {
1264                         PRINT_ER("Connect callback function pointer is NULL\n");
1265                 }
1266         }
1267
1268         PRINT_D(HOSTINF_DBG, "Deallocating connection parameters\n");
1269         kfree(pstrHostIFconnectAttr->bssid);
1270         pstrHostIFconnectAttr->bssid = NULL;
1271
1272         kfree(pstrHostIFconnectAttr->ssid);
1273         pstrHostIFconnectAttr->ssid = NULL;
1274
1275         kfree(pstrHostIFconnectAttr->ies);
1276         pstrHostIFconnectAttr->ies = NULL;
1277
1278         kfree(pu8CurrByte);
1279         return result;
1280 }
1281
1282 static s32 Handle_FlushConnect(struct host_if_drv *hif_drv)
1283 {
1284         s32 result = 0;
1285         struct wid strWIDList[5];
1286         u32 u32WidsCount = 0;
1287         u8 *pu8CurrByte = NULL;
1288
1289         strWIDList[u32WidsCount].id = WID_INFO_ELEMENT_ASSOCIATE;
1290         strWIDList[u32WidsCount].type = WID_BIN_DATA;
1291         strWIDList[u32WidsCount].val = info_element;
1292         strWIDList[u32WidsCount].size = info_element_size;
1293         u32WidsCount++;
1294
1295         strWIDList[u32WidsCount].id = (u16)WID_11I_MODE;
1296         strWIDList[u32WidsCount].type = WID_CHAR;
1297         strWIDList[u32WidsCount].size = sizeof(char);
1298         strWIDList[u32WidsCount].val = (s8 *)(&(mode_11i));
1299         u32WidsCount++;
1300
1301         strWIDList[u32WidsCount].id = (u16)WID_AUTH_TYPE;
1302         strWIDList[u32WidsCount].type = WID_CHAR;
1303         strWIDList[u32WidsCount].size = sizeof(char);
1304         strWIDList[u32WidsCount].val = (s8 *)(&auth_type);
1305         u32WidsCount++;
1306
1307         strWIDList[u32WidsCount].id = (u16)WID_JOIN_REQ_EXTENDED;
1308         strWIDList[u32WidsCount].type = WID_STR;
1309         strWIDList[u32WidsCount].size = join_req_size;
1310         strWIDList[u32WidsCount].val = (s8 *)join_req;
1311         pu8CurrByte = strWIDList[u32WidsCount].val;
1312
1313         pu8CurrByte += FLUSHED_BYTE_POS;
1314         *(pu8CurrByte) = FLUSHED_JOIN_REQ;
1315
1316         u32WidsCount++;
1317
1318         result = send_config_pkt(SET_CFG, strWIDList, u32WidsCount,
1319                                  get_id_from_handler(join_req_drv));
1320         if (result) {
1321                 PRINT_ER("failed to send config packet\n");
1322                 result = -EINVAL;
1323         }
1324
1325         return result;
1326 }
1327
1328 static s32 Handle_ConnectTimeout(struct host_if_drv *hif_drv)
1329 {
1330         s32 result = 0;
1331         tstrConnectInfo strConnectInfo;
1332         struct wid wid;
1333         u16 u16DummyReasonCode = 0;
1334
1335         if (!hif_drv) {
1336                 PRINT_ER("Driver handler is NULL\n");
1337                 return result;
1338         }
1339
1340         hif_drv->hif_state = HOST_IF_IDLE;
1341
1342         scan_while_connected = false;
1343
1344         memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
1345
1346         if (hif_drv->usr_conn_req.conn_result) {
1347                 if (hif_drv->usr_conn_req.pu8bssid) {
1348                         memcpy(strConnectInfo.au8bssid,
1349                                hif_drv->usr_conn_req.pu8bssid, 6);
1350                 }
1351
1352                 if (hif_drv->usr_conn_req.ies) {
1353                         strConnectInfo.ReqIEsLen = hif_drv->usr_conn_req.ies_len;
1354                         strConnectInfo.pu8ReqIEs = kmalloc(hif_drv->usr_conn_req.ies_len, GFP_KERNEL);
1355                         memcpy(strConnectInfo.pu8ReqIEs,
1356                                hif_drv->usr_conn_req.ies,
1357                                hif_drv->usr_conn_req.ies_len);
1358                 }
1359
1360                 hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_CONN_RESP,
1361                                                   &strConnectInfo,
1362                                                   MAC_DISCONNECTED,
1363                                                   NULL,
1364                                                   hif_drv->usr_conn_req.arg);
1365
1366                 kfree(strConnectInfo.pu8ReqIEs);
1367                 strConnectInfo.pu8ReqIEs = NULL;
1368         } else {
1369                 PRINT_ER("Connect callback function pointer is NULL\n");
1370         }
1371
1372         wid.id = (u16)WID_DISCONNECT;
1373         wid.type = WID_CHAR;
1374         wid.val = (s8 *)&u16DummyReasonCode;
1375         wid.size = sizeof(char);
1376
1377         PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
1378
1379         result = send_config_pkt(SET_CFG, &wid, 1,
1380                                  get_id_from_handler(hif_drv));
1381         if (result)
1382                 PRINT_ER("Failed to send dissconect config packet\n");
1383
1384         hif_drv->usr_conn_req.ssid_len = 0;
1385         kfree(hif_drv->usr_conn_req.pu8ssid);
1386         kfree(hif_drv->usr_conn_req.pu8bssid);
1387         hif_drv->usr_conn_req.ies_len = 0;
1388         kfree(hif_drv->usr_conn_req.ies);
1389
1390         eth_zero_addr(u8ConnectedSSID);
1391
1392         if (join_req && join_req_drv == hif_drv) {
1393                 kfree(join_req);
1394                 join_req = NULL;
1395         }
1396
1397         if (info_element && join_req_drv == hif_drv) {
1398                 kfree(info_element);
1399                 info_element = NULL;
1400         }
1401
1402         return result;
1403 }
1404
1405 static s32 Handle_RcvdNtwrkInfo(struct host_if_drv *hif_drv,
1406                                 struct rcvd_net_info *pstrRcvdNetworkInfo)
1407 {
1408         u32 i;
1409         bool bNewNtwrkFound;
1410         s32 result = 0;
1411         tstrNetworkInfo *pstrNetworkInfo = NULL;
1412         void *pJoinParams = NULL;
1413
1414         bNewNtwrkFound = true;
1415         PRINT_INFO(HOSTINF_DBG, "Handling received network info\n");
1416
1417         if (hif_drv->usr_scan_req.scan_result) {
1418                 PRINT_D(HOSTINF_DBG, "State: Scanning, parsing network information received\n");
1419                 parse_network_info(pstrRcvdNetworkInfo->buffer, &pstrNetworkInfo);
1420                 if ((!pstrNetworkInfo) ||
1421                     (!hif_drv->usr_scan_req.scan_result)) {
1422                         PRINT_ER("driver is null\n");
1423                         result = -EINVAL;
1424                         goto done;
1425                 }
1426
1427                 for (i = 0; i < hif_drv->usr_scan_req.rcvd_ch_cnt; i++) {
1428                         if ((hif_drv->usr_scan_req.net_info[i].au8bssid) &&
1429                             (pstrNetworkInfo->au8bssid)) {
1430                                 if (memcmp(hif_drv->usr_scan_req.net_info[i].au8bssid,
1431                                            pstrNetworkInfo->au8bssid, 6) == 0) {
1432                                         if (pstrNetworkInfo->s8rssi <= hif_drv->usr_scan_req.net_info[i].s8rssi) {
1433                                                 PRINT_D(HOSTINF_DBG, "Network previously discovered\n");
1434                                                 goto done;
1435                                         } else {
1436                                                 hif_drv->usr_scan_req.net_info[i].s8rssi = pstrNetworkInfo->s8rssi;
1437                                                 bNewNtwrkFound = false;
1438                                                 break;
1439                                         }
1440                                 }
1441                         }
1442                 }
1443
1444                 if (bNewNtwrkFound) {
1445                         PRINT_D(HOSTINF_DBG, "New network found\n");
1446
1447                         if (hif_drv->usr_scan_req.rcvd_ch_cnt < MAX_NUM_SCANNED_NETWORKS) {
1448                                 hif_drv->usr_scan_req.net_info[hif_drv->usr_scan_req.rcvd_ch_cnt].s8rssi = pstrNetworkInfo->s8rssi;
1449
1450                                 if (hif_drv->usr_scan_req.net_info[hif_drv->usr_scan_req.rcvd_ch_cnt].au8bssid &&
1451                                     pstrNetworkInfo->au8bssid) {
1452                                         memcpy(hif_drv->usr_scan_req.net_info[hif_drv->usr_scan_req.rcvd_ch_cnt].au8bssid,
1453                                                pstrNetworkInfo->au8bssid, 6);
1454
1455                                         hif_drv->usr_scan_req.rcvd_ch_cnt++;
1456
1457                                         pstrNetworkInfo->bNewNetwork = true;
1458                                         pJoinParams = host_int_ParseJoinBssParam(pstrNetworkInfo);
1459
1460                                         hif_drv->usr_scan_req.scan_result(SCAN_EVENT_NETWORK_FOUND, pstrNetworkInfo,
1461                                                                           hif_drv->usr_scan_req.arg,
1462                                                                           pJoinParams);
1463                                 }
1464                         } else {
1465                                 PRINT_WRN(HOSTINF_DBG, "Discovered networks exceeded max. limit\n");
1466                         }
1467                 } else {
1468                         pstrNetworkInfo->bNewNetwork = false;
1469                         hif_drv->usr_scan_req.scan_result(SCAN_EVENT_NETWORK_FOUND, pstrNetworkInfo,
1470                                                           hif_drv->usr_scan_req.arg, NULL);
1471                 }
1472         }
1473
1474 done:
1475         kfree(pstrRcvdNetworkInfo->buffer);
1476         pstrRcvdNetworkInfo->buffer = NULL;
1477
1478         if (pstrNetworkInfo) {
1479                 DeallocateNetworkInfo(pstrNetworkInfo);
1480                 pstrNetworkInfo = NULL;
1481         }
1482
1483         return result;
1484 }
1485
1486 static s32 Handle_RcvdGnrlAsyncInfo(struct host_if_drv *hif_drv,
1487                                     struct rcvd_async_info *pstrRcvdGnrlAsyncInfo)
1488 {
1489         s32 result = 0;
1490         u8 u8MsgType = 0;
1491         u8 u8MsgID = 0;
1492         u16 u16MsgLen = 0;
1493         u16 u16WidID = (u16)WID_NIL;
1494         u8 u8WidLen  = 0;
1495         u8 u8MacStatus;
1496         u8 u8MacStatusReasonCode;
1497         u8 u8MacStatusAdditionalInfo;
1498         tstrConnectInfo strConnectInfo;
1499         tstrDisconnectNotifInfo strDisconnectNotifInfo;
1500         s32 s32Err = 0;
1501
1502         if (!hif_drv) {
1503                 PRINT_ER("Driver handler is NULL\n");
1504                 return -ENODEV;
1505         }
1506         PRINT_D(GENERIC_DBG, "Current State = %d,Received state = %d\n",
1507                 hif_drv->hif_state, pstrRcvdGnrlAsyncInfo->buffer[7]);
1508
1509         if ((hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) ||
1510             (hif_drv->hif_state == HOST_IF_CONNECTED) ||
1511             hif_drv->usr_scan_req.scan_result) {
1512                 if (!pstrRcvdGnrlAsyncInfo->buffer ||
1513                     !hif_drv->usr_conn_req.conn_result) {
1514                         PRINT_ER("driver is null\n");
1515                         return -EINVAL;
1516                 }
1517
1518                 u8MsgType = pstrRcvdGnrlAsyncInfo->buffer[0];
1519
1520                 if ('I' != u8MsgType) {
1521                         PRINT_ER("Received Message format incorrect.\n");
1522                         return -EFAULT;
1523                 }
1524
1525                 u8MsgID = pstrRcvdGnrlAsyncInfo->buffer[1];
1526                 u16MsgLen = MAKE_WORD16(pstrRcvdGnrlAsyncInfo->buffer[2], pstrRcvdGnrlAsyncInfo->buffer[3]);
1527                 u16WidID = MAKE_WORD16(pstrRcvdGnrlAsyncInfo->buffer[4], pstrRcvdGnrlAsyncInfo->buffer[5]);
1528                 u8WidLen = pstrRcvdGnrlAsyncInfo->buffer[6];
1529                 u8MacStatus  = pstrRcvdGnrlAsyncInfo->buffer[7];
1530                 u8MacStatusReasonCode = pstrRcvdGnrlAsyncInfo->buffer[8];
1531                 u8MacStatusAdditionalInfo = pstrRcvdGnrlAsyncInfo->buffer[9];
1532                 PRINT_INFO(HOSTINF_DBG, "Recieved MAC status = %d with Reason = %d , Info = %d\n", u8MacStatus, u8MacStatusReasonCode, u8MacStatusAdditionalInfo);
1533                 if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) {
1534                         u32 u32RcvdAssocRespInfoLen;
1535                         tstrConnectRespInfo *pstrConnectRespInfo = NULL;
1536
1537                         PRINT_D(HOSTINF_DBG, "Recieved MAC status = %d with Reason = %d , Code = %d\n", u8MacStatus, u8MacStatusReasonCode, u8MacStatusAdditionalInfo);
1538
1539                         memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
1540
1541                         if (u8MacStatus == MAC_CONNECTED) {
1542                                 memset(rcv_assoc_resp, 0, MAX_ASSOC_RESP_FRAME_SIZE);
1543
1544                                 host_int_get_assoc_res_info(hif_drv,
1545                                                             rcv_assoc_resp,
1546                                                             MAX_ASSOC_RESP_FRAME_SIZE,
1547                                                             &u32RcvdAssocRespInfoLen);
1548
1549                                 PRINT_INFO(HOSTINF_DBG, "Received association response with length = %d\n", u32RcvdAssocRespInfoLen);
1550
1551                                 if (u32RcvdAssocRespInfoLen != 0) {
1552                                         PRINT_D(HOSTINF_DBG, "Parsing association response\n");
1553                                         s32Err = ParseAssocRespInfo(rcv_assoc_resp, u32RcvdAssocRespInfoLen,
1554                                                                     &pstrConnectRespInfo);
1555                                         if (s32Err) {
1556                                                 PRINT_ER("ParseAssocRespInfo() returned error %d\n", s32Err);
1557                                         } else {
1558                                                 strConnectInfo.u16ConnectStatus = pstrConnectRespInfo->u16ConnectStatus;
1559
1560                                                 if (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE) {
1561                                                         PRINT_INFO(HOSTINF_DBG, "Association response received : Successful connection status\n");
1562                                                         if (pstrConnectRespInfo->pu8RespIEs) {
1563                                                                 strConnectInfo.u16RespIEsLen = pstrConnectRespInfo->u16RespIEsLen;
1564                                                                 strConnectInfo.pu8RespIEs = kmalloc(pstrConnectRespInfo->u16RespIEsLen, GFP_KERNEL);
1565                                                                 memcpy(strConnectInfo.pu8RespIEs, pstrConnectRespInfo->pu8RespIEs,
1566                                                                             pstrConnectRespInfo->u16RespIEsLen);
1567                                                         }
1568                                                 }
1569
1570                                                 if (pstrConnectRespInfo) {
1571                                                         DeallocateAssocRespInfo(pstrConnectRespInfo);
1572                                                         pstrConnectRespInfo = NULL;
1573                                                 }
1574                                         }
1575                                 }
1576                         }
1577
1578                         if ((u8MacStatus == MAC_CONNECTED) &&
1579                             (strConnectInfo.u16ConnectStatus != SUCCESSFUL_STATUSCODE)) {
1580                                 PRINT_ER("Received MAC status is MAC_CONNECTED while the received status code in Asoc Resp is not SUCCESSFUL_STATUSCODE\n");
1581                                 eth_zero_addr(u8ConnectedSSID);
1582
1583                         } else if (u8MacStatus == MAC_DISCONNECTED)    {
1584                                 PRINT_ER("Received MAC status is MAC_DISCONNECTED\n");
1585                                 eth_zero_addr(u8ConnectedSSID);
1586                         }
1587
1588                         if (hif_drv->usr_conn_req.pu8bssid) {
1589                                 PRINT_D(HOSTINF_DBG, "Retrieving actual BSSID from AP\n");
1590                                 memcpy(strConnectInfo.au8bssid, hif_drv->usr_conn_req.pu8bssid, 6);
1591
1592                                 if ((u8MacStatus == MAC_CONNECTED) &&
1593                                     (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE)) {
1594                                         memcpy(hif_drv->assoc_bssid,
1595                                                hif_drv->usr_conn_req.pu8bssid, ETH_ALEN);
1596                                 }
1597                         }
1598
1599                         if (hif_drv->usr_conn_req.ies) {
1600                                 strConnectInfo.ReqIEsLen = hif_drv->usr_conn_req.ies_len;
1601                                 strConnectInfo.pu8ReqIEs = kmalloc(hif_drv->usr_conn_req.ies_len, GFP_KERNEL);
1602                                 memcpy(strConnectInfo.pu8ReqIEs,
1603                                        hif_drv->usr_conn_req.ies,
1604                                        hif_drv->usr_conn_req.ies_len);
1605                         }
1606
1607                         del_timer(&hif_drv->connect_timer);
1608                         hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_CONN_RESP,
1609                                                           &strConnectInfo,
1610                                                           u8MacStatus,
1611                                                           NULL,
1612                                                           hif_drv->usr_conn_req.arg);
1613
1614                         if ((u8MacStatus == MAC_CONNECTED) &&
1615                             (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE)) {
1616                                 host_int_set_power_mgmt(hif_drv, 0, 0);
1617
1618                                 PRINT_D(HOSTINF_DBG, "MAC status : CONNECTED and Connect Status : Successful\n");
1619                                 hif_drv->hif_state = HOST_IF_CONNECTED;
1620
1621                                 PRINT_D(GENERIC_DBG, "Obtaining an IP, Disable Scan\n");
1622                                 g_obtainingIP = true;
1623                                 mod_timer(&hDuringIpTimer,
1624                                           jiffies + msecs_to_jiffies(10000));
1625                         } else {
1626                                 PRINT_D(HOSTINF_DBG, "MAC status : %d and Connect Status : %d\n", u8MacStatus, strConnectInfo.u16ConnectStatus);
1627                                 hif_drv->hif_state = HOST_IF_IDLE;
1628                                 scan_while_connected = false;
1629                         }
1630
1631                         kfree(strConnectInfo.pu8RespIEs);
1632                         strConnectInfo.pu8RespIEs = NULL;
1633
1634                         kfree(strConnectInfo.pu8ReqIEs);
1635                         strConnectInfo.pu8ReqIEs = NULL;
1636                         hif_drv->usr_conn_req.ssid_len = 0;
1637                         kfree(hif_drv->usr_conn_req.pu8ssid);
1638                         kfree(hif_drv->usr_conn_req.pu8bssid);
1639                         hif_drv->usr_conn_req.ies_len = 0;
1640                         kfree(hif_drv->usr_conn_req.ies);
1641                 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
1642                            (hif_drv->hif_state == HOST_IF_CONNECTED)) {
1643                         PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW\n");
1644
1645                         memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
1646
1647                         if (hif_drv->usr_scan_req.scan_result) {
1648                                 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running OBSS Scan >>\n\n");
1649                                 del_timer(&hif_drv->scan_timer);
1650                                 Handle_ScanDone((void *)hif_drv, SCAN_EVENT_ABORTED);
1651                         }
1652
1653                         strDisconnectNotifInfo.u16reason = 0;
1654                         strDisconnectNotifInfo.ie = NULL;
1655                         strDisconnectNotifInfo.ie_len = 0;
1656
1657                         if (hif_drv->usr_conn_req.conn_result) {
1658                                 g_obtainingIP = false;
1659                                 host_int_set_power_mgmt(hif_drv, 0, 0);
1660
1661                                 hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF,
1662                                                                   NULL,
1663                                                                   0,
1664                                                                   &strDisconnectNotifInfo,
1665                                                                   hif_drv->usr_conn_req.arg);
1666                         } else {
1667                                 PRINT_ER("Connect result callback function is NULL\n");
1668                         }
1669
1670                         eth_zero_addr(hif_drv->assoc_bssid);
1671
1672                         hif_drv->usr_conn_req.ssid_len = 0;
1673                         kfree(hif_drv->usr_conn_req.pu8ssid);
1674                         kfree(hif_drv->usr_conn_req.pu8bssid);
1675                         hif_drv->usr_conn_req.ies_len = 0;
1676                         kfree(hif_drv->usr_conn_req.ies);
1677
1678                         if (join_req && join_req_drv == hif_drv) {
1679                                 kfree(join_req);
1680                                 join_req = NULL;
1681                         }
1682
1683                         if (info_element && join_req_drv == hif_drv) {
1684                                 kfree(info_element);
1685                                 info_element = NULL;
1686                         }
1687
1688                         hif_drv->hif_state = HOST_IF_IDLE;
1689                         scan_while_connected = false;
1690
1691                 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
1692                            (hif_drv->usr_scan_req.scan_result)) {
1693                         PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW while scanning\n");
1694                         PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running Scan >>\n\n");
1695
1696                         del_timer(&hif_drv->scan_timer);
1697                         if (hif_drv->usr_scan_req.scan_result)
1698                                 Handle_ScanDone(hif_drv, SCAN_EVENT_ABORTED);
1699                 }
1700         }
1701
1702         kfree(pstrRcvdGnrlAsyncInfo->buffer);
1703         pstrRcvdGnrlAsyncInfo->buffer = NULL;
1704
1705         return result;
1706 }
1707
1708 static int Handle_Key(struct host_if_drv *hif_drv,
1709                       struct key_attr *pstrHostIFkeyAttr)
1710 {
1711         s32 result = 0;
1712         struct wid wid;
1713         struct wid strWIDList[5];
1714         u8 i;
1715         u8 *pu8keybuf;
1716         s8 s8idxarray[1];
1717         s8 ret = 0;
1718
1719         switch (pstrHostIFkeyAttr->type) {
1720         case WEP:
1721
1722                 if (pstrHostIFkeyAttr->action & ADDKEY_AP) {
1723                         PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
1724                         PRINT_D(GENERIC_DBG, "ID Hostint is %d\n", pstrHostIFkeyAttr->attr.wep.index);
1725                         strWIDList[0].id = (u16)WID_11I_MODE;
1726                         strWIDList[0].type = WID_CHAR;
1727                         strWIDList[0].size = sizeof(char);
1728                         strWIDList[0].val = (s8 *)&pstrHostIFkeyAttr->attr.wep.mode;
1729
1730                         strWIDList[1].id = WID_AUTH_TYPE;
1731                         strWIDList[1].type = WID_CHAR;
1732                         strWIDList[1].size = sizeof(char);
1733                         strWIDList[1].val = (s8 *)&pstrHostIFkeyAttr->attr.wep.auth_type;
1734
1735                         strWIDList[2].id = (u16)WID_KEY_ID;
1736                         strWIDList[2].type = WID_CHAR;
1737
1738                         strWIDList[2].val = (s8 *)&pstrHostIFkeyAttr->attr.wep.index;
1739                         strWIDList[2].size = sizeof(char);
1740
1741                         pu8keybuf = kmemdup(pstrHostIFkeyAttr->attr.wep.key,
1742                                             pstrHostIFkeyAttr->attr.wep.key_len,
1743                                             GFP_KERNEL);
1744
1745                         if (pu8keybuf == NULL) {
1746                                 PRINT_ER("No buffer to send Key\n");
1747                                 return -ENOMEM;
1748                         }
1749
1750                         kfree(pstrHostIFkeyAttr->attr.wep.key);
1751
1752                         strWIDList[3].id = (u16)WID_WEP_KEY_VALUE;
1753                         strWIDList[3].type = WID_STR;
1754                         strWIDList[3].size = pstrHostIFkeyAttr->attr.wep.key_len;
1755                         strWIDList[3].val = (s8 *)pu8keybuf;
1756
1757                         result = send_config_pkt(SET_CFG, strWIDList, 4,
1758                                                  get_id_from_handler(hif_drv));
1759                         kfree(pu8keybuf);
1760                 }
1761
1762                 if (pstrHostIFkeyAttr->action & ADDKEY) {
1763                         PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
1764                         pu8keybuf = kmalloc(pstrHostIFkeyAttr->attr.wep.key_len + 2, GFP_KERNEL);
1765                         if (!pu8keybuf) {
1766                                 PRINT_ER("No buffer to send Key\n");
1767                                 return -ENOMEM;
1768                         }
1769                         pu8keybuf[0] = pstrHostIFkeyAttr->attr.wep.index;
1770                         memcpy(pu8keybuf + 1, &pstrHostIFkeyAttr->attr.wep.key_len, 1);
1771                         memcpy(pu8keybuf + 2, pstrHostIFkeyAttr->attr.wep.key,
1772                                pstrHostIFkeyAttr->attr.wep.key_len);
1773                         kfree(pstrHostIFkeyAttr->attr.wep.key);
1774
1775                         wid.id = (u16)WID_ADD_WEP_KEY;
1776                         wid.type = WID_STR;
1777                         wid.val = (s8 *)pu8keybuf;
1778                         wid.size = pstrHostIFkeyAttr->attr.wep.key_len + 2;
1779
1780                         result = send_config_pkt(SET_CFG, &wid, 1,
1781                                                  get_id_from_handler(hif_drv));
1782                         kfree(pu8keybuf);
1783                 } else if (pstrHostIFkeyAttr->action & REMOVEKEY) {
1784                         PRINT_D(HOSTINF_DBG, "Removing key\n");
1785                         wid.id = (u16)WID_REMOVE_WEP_KEY;
1786                         wid.type = WID_STR;
1787
1788                         s8idxarray[0] = (s8)pstrHostIFkeyAttr->attr.wep.index;
1789                         wid.val = s8idxarray;
1790                         wid.size = 1;
1791
1792                         result = send_config_pkt(SET_CFG, &wid, 1,
1793                                                  get_id_from_handler(hif_drv));
1794                 } else {
1795                         wid.id = (u16)WID_KEY_ID;
1796                         wid.type = WID_CHAR;
1797                         wid.val = (s8 *)&pstrHostIFkeyAttr->attr.wep.index;
1798                         wid.size = sizeof(char);
1799
1800                         PRINT_D(HOSTINF_DBG, "Setting default key index\n");
1801
1802                         result = send_config_pkt(SET_CFG, &wid, 1,
1803                                                  get_id_from_handler(hif_drv));
1804                 }
1805                 up(&hif_drv->sem_test_key_block);
1806                 break;
1807
1808         case WPA_RX_GTK:
1809                 if (pstrHostIFkeyAttr->action & ADDKEY_AP) {
1810                         pu8keybuf = kzalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
1811                         if (!pu8keybuf) {
1812                                 PRINT_ER("No buffer to send RxGTK Key\n");
1813                                 ret = -ENOMEM;
1814                                 goto _WPARxGtk_end_case_;
1815                         }
1816
1817                         if (pstrHostIFkeyAttr->attr.wpa.seq)
1818                                 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->attr.wpa.seq, 8);
1819
1820                         memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->attr.wpa.index, 1);
1821                         memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
1822                         memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->attr.wpa.key,
1823                                pstrHostIFkeyAttr->attr.wpa.key_len);
1824
1825                         strWIDList[0].id = (u16)WID_11I_MODE;
1826                         strWIDList[0].type = WID_CHAR;
1827                         strWIDList[0].size = sizeof(char);
1828                         strWIDList[0].val = (s8 *)&pstrHostIFkeyAttr->attr.wpa.mode;
1829
1830                         strWIDList[1].id = (u16)WID_ADD_RX_GTK;
1831                         strWIDList[1].type = WID_STR;
1832                         strWIDList[1].val = (s8 *)pu8keybuf;
1833                         strWIDList[1].size = RX_MIC_KEY_MSG_LEN;
1834
1835                         result = send_config_pkt(SET_CFG, strWIDList, 2,
1836                                                  get_id_from_handler(hif_drv));
1837
1838                         kfree(pu8keybuf);
1839                         up(&hif_drv->sem_test_key_block);
1840                 }
1841
1842                 if (pstrHostIFkeyAttr->action & ADDKEY) {
1843                         PRINT_D(HOSTINF_DBG, "Handling group key(Rx) function\n");
1844
1845                         pu8keybuf = kzalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
1846                         if (pu8keybuf == NULL) {
1847                                 PRINT_ER("No buffer to send RxGTK Key\n");
1848                                 ret = -ENOMEM;
1849                                 goto _WPARxGtk_end_case_;
1850                         }
1851
1852                         if (hif_drv->hif_state == HOST_IF_CONNECTED)
1853                                 memcpy(pu8keybuf, hif_drv->assoc_bssid, ETH_ALEN);
1854                         else
1855                                 PRINT_ER("Couldn't handle WPARxGtk while state is not HOST_IF_CONNECTED\n");
1856
1857                         memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->attr.wpa.seq, 8);
1858                         memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->attr.wpa.index, 1);
1859                         memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
1860                         memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->attr.wpa.key,
1861                                pstrHostIFkeyAttr->attr.wpa.key_len);
1862
1863                         wid.id = (u16)WID_ADD_RX_GTK;
1864                         wid.type = WID_STR;
1865                         wid.val = (s8 *)pu8keybuf;
1866                         wid.size = RX_MIC_KEY_MSG_LEN;
1867
1868                         result = send_config_pkt(SET_CFG, &wid, 1,
1869                                                  get_id_from_handler(hif_drv));
1870
1871                         kfree(pu8keybuf);
1872                         up(&hif_drv->sem_test_key_block);
1873                 }
1874 _WPARxGtk_end_case_:
1875                 kfree(pstrHostIFkeyAttr->attr.wpa.key);
1876                 kfree(pstrHostIFkeyAttr->attr.wpa.seq);
1877                 if (ret)
1878                         return ret;
1879
1880                 break;
1881
1882         case WPA_PTK:
1883                 if (pstrHostIFkeyAttr->action & ADDKEY_AP) {
1884                         pu8keybuf = kmalloc(PTK_KEY_MSG_LEN + 1, GFP_KERNEL);
1885                         if (!pu8keybuf) {
1886                                 PRINT_ER("No buffer to send PTK Key\n");
1887                                 ret = -ENOMEM;
1888                                 goto _WPAPtk_end_case_;
1889                         }
1890
1891                         memcpy(pu8keybuf, pstrHostIFkeyAttr->attr.wpa.mac_addr, 6);
1892                         memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->attr.wpa.index, 1);
1893                         memcpy(pu8keybuf + 7, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
1894                         memcpy(pu8keybuf + 8, pstrHostIFkeyAttr->attr.wpa.key,
1895                                pstrHostIFkeyAttr->attr.wpa.key_len);
1896
1897                         strWIDList[0].id = (u16)WID_11I_MODE;
1898                         strWIDList[0].type = WID_CHAR;
1899                         strWIDList[0].size = sizeof(char);
1900                         strWIDList[0].val = (s8 *)&pstrHostIFkeyAttr->attr.wpa.mode;
1901
1902                         strWIDList[1].id = (u16)WID_ADD_PTK;
1903                         strWIDList[1].type = WID_STR;
1904                         strWIDList[1].val = (s8 *)pu8keybuf;
1905                         strWIDList[1].size = PTK_KEY_MSG_LEN + 1;
1906
1907                         result = send_config_pkt(SET_CFG, strWIDList, 2,
1908                                                  get_id_from_handler(hif_drv));
1909                         kfree(pu8keybuf);
1910                         up(&hif_drv->sem_test_key_block);
1911                 }
1912                 if (pstrHostIFkeyAttr->action & ADDKEY) {
1913                         pu8keybuf = kmalloc(PTK_KEY_MSG_LEN, GFP_KERNEL);
1914                         if (!pu8keybuf) {
1915                                 PRINT_ER("No buffer to send PTK Key\n");
1916                                 ret = -ENOMEM;
1917                                 goto _WPAPtk_end_case_;
1918                         }
1919
1920                         memcpy(pu8keybuf, pstrHostIFkeyAttr->attr.wpa.mac_addr, 6);
1921                         memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
1922                         memcpy(pu8keybuf + 7, pstrHostIFkeyAttr->attr.wpa.key,
1923                                pstrHostIFkeyAttr->attr.wpa.key_len);
1924
1925                         wid.id = (u16)WID_ADD_PTK;
1926                         wid.type = WID_STR;
1927                         wid.val = (s8 *)pu8keybuf;
1928                         wid.size = PTK_KEY_MSG_LEN;
1929
1930                         result = send_config_pkt(SET_CFG, &wid, 1,
1931                                                  get_id_from_handler(hif_drv));
1932                         kfree(pu8keybuf);
1933                         up(&hif_drv->sem_test_key_block);
1934                 }
1935
1936 _WPAPtk_end_case_:
1937                 kfree(pstrHostIFkeyAttr->attr.wpa.key);
1938                 if (ret)
1939                         return ret;
1940
1941                 break;
1942
1943         case PMKSA:
1944
1945                 PRINT_D(HOSTINF_DBG, "Handling PMKSA key\n");
1946
1947                 pu8keybuf = kmalloc((pstrHostIFkeyAttr->attr.pmkid.numpmkid * PMKSA_KEY_LEN) + 1, GFP_KERNEL);
1948                 if (!pu8keybuf) {
1949                         PRINT_ER("No buffer to send PMKSA Key\n");
1950                         return -ENOMEM;
1951                 }
1952
1953                 pu8keybuf[0] = pstrHostIFkeyAttr->attr.pmkid.numpmkid;
1954
1955                 for (i = 0; i < pstrHostIFkeyAttr->attr.pmkid.numpmkid; i++) {
1956                         memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + 1), pstrHostIFkeyAttr->attr.pmkid.pmkidlist[i].bssid, ETH_ALEN);
1957                         memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + ETH_ALEN + 1), pstrHostIFkeyAttr->attr.pmkid.pmkidlist[i].pmkid, PMKID_LEN);
1958                 }
1959
1960                 wid.id = (u16)WID_PMKID_INFO;
1961                 wid.type = WID_STR;
1962                 wid.val = (s8 *)pu8keybuf;
1963                 wid.size = (pstrHostIFkeyAttr->attr.pmkid.numpmkid * PMKSA_KEY_LEN) + 1;
1964
1965                 result = send_config_pkt(SET_CFG, &wid, 1,
1966                                          get_id_from_handler(hif_drv));
1967
1968                 kfree(pu8keybuf);
1969                 break;
1970         }
1971
1972         if (result)
1973                 PRINT_ER("Failed to send key config packet\n");
1974
1975         return result;
1976 }
1977
1978 static void Handle_Disconnect(struct host_if_drv *hif_drv)
1979 {
1980         struct wid wid;
1981
1982         s32 result = 0;
1983         u16 u16DummyReasonCode = 0;
1984
1985         wid.id = (u16)WID_DISCONNECT;
1986         wid.type = WID_CHAR;
1987         wid.val = (s8 *)&u16DummyReasonCode;
1988         wid.size = sizeof(char);
1989
1990         PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
1991
1992         g_obtainingIP = false;
1993         host_int_set_power_mgmt(hif_drv, 0, 0);
1994
1995         eth_zero_addr(u8ConnectedSSID);
1996
1997         result = send_config_pkt(SET_CFG, &wid, 1,
1998                                  get_id_from_handler(hif_drv));
1999
2000         if (result) {
2001                 PRINT_ER("Failed to send dissconect config packet\n");
2002         } else {
2003                 tstrDisconnectNotifInfo strDisconnectNotifInfo;
2004
2005                 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
2006
2007                 strDisconnectNotifInfo.u16reason = 0;
2008                 strDisconnectNotifInfo.ie = NULL;
2009                 strDisconnectNotifInfo.ie_len = 0;
2010
2011                 if (hif_drv->usr_scan_req.scan_result) {
2012                         del_timer(&hif_drv->scan_timer);
2013                         hif_drv->usr_scan_req.scan_result(SCAN_EVENT_ABORTED,
2014                                                           NULL,
2015                                                           hif_drv->usr_scan_req.arg,
2016                                                           NULL);
2017                         hif_drv->usr_scan_req.scan_result = NULL;
2018                 }
2019
2020                 if (hif_drv->usr_conn_req.conn_result) {
2021                         if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) {
2022                                 PRINT_D(HOSTINF_DBG, "Upper layer requested termination of connection\n");
2023                                 del_timer(&hif_drv->connect_timer);
2024                         }
2025
2026                         hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF,
2027                                                           NULL,
2028                                                           0,
2029                                                           &strDisconnectNotifInfo,
2030                                                           hif_drv->usr_conn_req.arg);
2031                 } else {
2032                         PRINT_ER("usr_conn_req.conn_result = NULL\n");
2033                 }
2034
2035                 scan_while_connected = false;
2036
2037                 hif_drv->hif_state = HOST_IF_IDLE;
2038
2039                 eth_zero_addr(hif_drv->assoc_bssid);
2040
2041                 hif_drv->usr_conn_req.ssid_len = 0;
2042                 kfree(hif_drv->usr_conn_req.pu8ssid);
2043                 kfree(hif_drv->usr_conn_req.pu8bssid);
2044                 hif_drv->usr_conn_req.ies_len = 0;
2045                 kfree(hif_drv->usr_conn_req.ies);
2046
2047                 if (join_req && join_req_drv == hif_drv) {
2048                         kfree(join_req);
2049                         join_req = NULL;
2050                 }
2051
2052                 if (info_element && join_req_drv == hif_drv) {
2053                         kfree(info_element);
2054                         info_element = NULL;
2055                 }
2056         }
2057
2058         up(&hif_drv->sem_test_disconn_block);
2059 }
2060
2061 void resolve_disconnect_aberration(struct host_if_drv *hif_drv)
2062 {
2063         if (!hif_drv)
2064                 return;
2065         if ((hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) ||
2066             (hif_drv->hif_state == HOST_IF_CONNECTING)) {
2067                 PRINT_D(HOSTINF_DBG, "\n\n<< correcting Supplicant state machine >>\n\n");
2068                 host_int_disconnect(hif_drv, 1);
2069         }
2070 }
2071
2072 static s32 Handle_GetChnl(struct host_if_drv *hif_drv)
2073 {
2074         s32 result = 0;
2075         struct wid wid;
2076
2077         wid.id = (u16)WID_CURRENT_CHANNEL;
2078         wid.type = WID_CHAR;
2079         wid.val = (s8 *)&ch_no;
2080         wid.size = sizeof(char);
2081
2082         PRINT_D(HOSTINF_DBG, "Getting channel value\n");
2083
2084         result = send_config_pkt(GET_CFG, &wid, 1,
2085                                  get_id_from_handler(hif_drv));
2086
2087         if (result) {
2088                 PRINT_ER("Failed to get channel number\n");
2089                 result = -EFAULT;
2090         }
2091
2092         up(&hif_drv->sem_get_chnl);
2093
2094         return result;
2095 }
2096
2097 static void Handle_GetRssi(struct host_if_drv *hif_drv)
2098 {
2099         s32 result = 0;
2100         struct wid wid;
2101
2102         wid.id = (u16)WID_RSSI;
2103         wid.type = WID_CHAR;
2104         wid.val = &rssi;
2105         wid.size = sizeof(char);
2106
2107         PRINT_D(HOSTINF_DBG, "Getting RSSI value\n");
2108
2109         result = send_config_pkt(GET_CFG, &wid, 1,
2110                                  get_id_from_handler(hif_drv));
2111         if (result) {
2112                 PRINT_ER("Failed to get RSSI value\n");
2113                 result = -EFAULT;
2114         }
2115
2116         up(&hif_drv->sem_get_rssi);
2117 }
2118
2119 static void Handle_GetLinkspeed(struct host_if_drv *hif_drv)
2120 {
2121         s32 result = 0;
2122         struct wid wid;
2123
2124         link_speed = 0;
2125
2126         wid.id = (u16)WID_LINKSPEED;
2127         wid.type = WID_CHAR;
2128         wid.val = &link_speed;
2129         wid.size = sizeof(char);
2130
2131         PRINT_D(HOSTINF_DBG, "Getting LINKSPEED value\n");
2132
2133         result = send_config_pkt(GET_CFG, &wid, 1,
2134                                  get_id_from_handler(hif_drv));
2135         if (result) {
2136                 PRINT_ER("Failed to get LINKSPEED value\n");
2137                 result = -EFAULT;
2138         }
2139
2140         up(&hif_drv->sem_get_link_speed);
2141 }
2142
2143 s32 Handle_GetStatistics(struct host_if_drv *hif_drv, struct rf_info *pstrStatistics)
2144 {
2145         struct wid strWIDList[5];
2146         u32 u32WidsCount = 0, result = 0;
2147
2148         strWIDList[u32WidsCount].id = WID_LINKSPEED;
2149         strWIDList[u32WidsCount].type = WID_CHAR;
2150         strWIDList[u32WidsCount].size = sizeof(char);
2151         strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->link_speed;
2152         u32WidsCount++;
2153
2154         strWIDList[u32WidsCount].id = WID_RSSI;
2155         strWIDList[u32WidsCount].type = WID_CHAR;
2156         strWIDList[u32WidsCount].size = sizeof(char);
2157         strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->rssi;
2158         u32WidsCount++;
2159
2160         strWIDList[u32WidsCount].id = WID_SUCCESS_FRAME_COUNT;
2161         strWIDList[u32WidsCount].type = WID_INT;
2162         strWIDList[u32WidsCount].size = sizeof(u32);
2163         strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->tx_cnt;
2164         u32WidsCount++;
2165
2166         strWIDList[u32WidsCount].id = WID_RECEIVED_FRAGMENT_COUNT;
2167         strWIDList[u32WidsCount].type = WID_INT;
2168         strWIDList[u32WidsCount].size = sizeof(u32);
2169         strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->rx_cnt;
2170         u32WidsCount++;
2171
2172         strWIDList[u32WidsCount].id = WID_FAILED_COUNT;
2173         strWIDList[u32WidsCount].type = WID_INT;
2174         strWIDList[u32WidsCount].size = sizeof(u32);
2175         strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->tx_fail_cnt;
2176         u32WidsCount++;
2177
2178         result = send_config_pkt(GET_CFG, strWIDList, u32WidsCount,
2179                                  get_id_from_handler(hif_drv));
2180
2181         if (result)
2182                 PRINT_ER("Failed to send scan paramters config packet\n");
2183
2184         up(&hif_sema_wait_response);
2185         return 0;
2186 }
2187
2188 static s32 Handle_Get_InActiveTime(struct host_if_drv *hif_drv,
2189                                    struct sta_inactive_t *strHostIfStaInactiveT)
2190 {
2191         s32 result = 0;
2192         u8 *stamac;
2193         struct wid wid;
2194
2195         wid.id = (u16)WID_SET_STA_MAC_INACTIVE_TIME;
2196         wid.type = WID_STR;
2197         wid.size = ETH_ALEN;
2198         wid.val = kmalloc(wid.size, GFP_KERNEL);
2199
2200         stamac = wid.val;
2201         memcpy(stamac, strHostIfStaInactiveT->mac, ETH_ALEN);
2202
2203         PRINT_D(CFG80211_DBG, "SETING STA inactive time\n");
2204
2205         result = send_config_pkt(SET_CFG, &wid, 1,
2206                                  get_id_from_handler(hif_drv));
2207
2208         if (result) {
2209                 PRINT_ER("Failed to SET incative time\n");
2210                 return -EFAULT;
2211         }
2212
2213         wid.id = (u16)WID_GET_INACTIVE_TIME;
2214         wid.type = WID_INT;
2215         wid.val = (s8 *)&inactive_time;
2216         wid.size = sizeof(u32);
2217
2218         result = send_config_pkt(GET_CFG, &wid, 1,
2219                                  get_id_from_handler(hif_drv));
2220
2221         if (result) {
2222                 PRINT_ER("Failed to get incative time\n");
2223                 return -EFAULT;
2224         }
2225
2226         PRINT_D(CFG80211_DBG, "Getting inactive time : %d\n", inactive_time);
2227
2228         up(&hif_drv->sem_inactive_time);
2229
2230         return result;
2231 }
2232
2233 static void Handle_AddBeacon(struct host_if_drv *hif_drv,
2234                              struct beacon_attr *pstrSetBeaconParam)
2235 {
2236         s32 result = 0;
2237         struct wid wid;
2238         u8 *pu8CurrByte;
2239
2240         PRINT_D(HOSTINF_DBG, "Adding BEACON\n");
2241
2242         wid.id = (u16)WID_ADD_BEACON;
2243         wid.type = WID_BIN;
2244         wid.size = pstrSetBeaconParam->head_len + pstrSetBeaconParam->tail_len + 16;
2245         wid.val = kmalloc(wid.size, GFP_KERNEL);
2246         if (!wid.val)
2247                 goto ERRORHANDLER;
2248
2249         pu8CurrByte = wid.val;
2250         *pu8CurrByte++ = (pstrSetBeaconParam->interval & 0xFF);
2251         *pu8CurrByte++ = ((pstrSetBeaconParam->interval >> 8) & 0xFF);
2252         *pu8CurrByte++ = ((pstrSetBeaconParam->interval >> 16) & 0xFF);
2253         *pu8CurrByte++ = ((pstrSetBeaconParam->interval >> 24) & 0xFF);
2254
2255         *pu8CurrByte++ = (pstrSetBeaconParam->dtim_period & 0xFF);
2256         *pu8CurrByte++ = ((pstrSetBeaconParam->dtim_period >> 8) & 0xFF);
2257         *pu8CurrByte++ = ((pstrSetBeaconParam->dtim_period >> 16) & 0xFF);
2258         *pu8CurrByte++ = ((pstrSetBeaconParam->dtim_period >> 24) & 0xFF);
2259
2260         *pu8CurrByte++ = (pstrSetBeaconParam->head_len & 0xFF);
2261         *pu8CurrByte++ = ((pstrSetBeaconParam->head_len >> 8) & 0xFF);
2262         *pu8CurrByte++ = ((pstrSetBeaconParam->head_len >> 16) & 0xFF);
2263         *pu8CurrByte++ = ((pstrSetBeaconParam->head_len >> 24) & 0xFF);
2264
2265         memcpy(pu8CurrByte, pstrSetBeaconParam->head, pstrSetBeaconParam->head_len);
2266         pu8CurrByte += pstrSetBeaconParam->head_len;
2267
2268         *pu8CurrByte++ = (pstrSetBeaconParam->tail_len & 0xFF);
2269         *pu8CurrByte++ = ((pstrSetBeaconParam->tail_len >> 8) & 0xFF);
2270         *pu8CurrByte++ = ((pstrSetBeaconParam->tail_len >> 16) & 0xFF);
2271         *pu8CurrByte++ = ((pstrSetBeaconParam->tail_len >> 24) & 0xFF);
2272
2273         if (pstrSetBeaconParam->tail > 0)
2274                 memcpy(pu8CurrByte, pstrSetBeaconParam->tail, pstrSetBeaconParam->tail_len);
2275         pu8CurrByte += pstrSetBeaconParam->tail_len;
2276
2277         result = send_config_pkt(SET_CFG, &wid, 1,
2278                                  get_id_from_handler(hif_drv));
2279         if (result)
2280                 PRINT_ER("Failed to send add beacon config packet\n");
2281
2282 ERRORHANDLER:
2283         kfree(wid.val);
2284         kfree(pstrSetBeaconParam->head);
2285         kfree(pstrSetBeaconParam->tail);
2286 }
2287
2288 static void Handle_DelBeacon(struct host_if_drv *hif_drv)
2289 {
2290         s32 result = 0;
2291         struct wid wid;
2292         u8 *pu8CurrByte;
2293
2294         wid.id = (u16)WID_DEL_BEACON;
2295         wid.type = WID_CHAR;
2296         wid.size = sizeof(char);
2297         wid.val = &del_beacon;
2298
2299         if (!wid.val)
2300                 return;
2301
2302         pu8CurrByte = wid.val;
2303
2304         PRINT_D(HOSTINF_DBG, "Deleting BEACON\n");
2305
2306         result = send_config_pkt(SET_CFG, &wid, 1,
2307                                  get_id_from_handler(hif_drv));
2308         if (result)
2309                 PRINT_ER("Failed to send delete beacon config packet\n");
2310 }
2311
2312 static u32 WILC_HostIf_PackStaParam(u8 *pu8Buffer,
2313                                     struct add_sta_param *pstrStationParam)
2314 {
2315         u8 *pu8CurrByte;
2316
2317         pu8CurrByte = pu8Buffer;
2318
2319         PRINT_D(HOSTINF_DBG, "Packing STA params\n");
2320         memcpy(pu8CurrByte, pstrStationParam->bssid, ETH_ALEN);
2321         pu8CurrByte +=  ETH_ALEN;
2322
2323         *pu8CurrByte++ = pstrStationParam->aid & 0xFF;
2324         *pu8CurrByte++ = (pstrStationParam->aid >> 8) & 0xFF;
2325
2326         *pu8CurrByte++ = pstrStationParam->rates_len;
2327         if (pstrStationParam->rates_len > 0)
2328                 memcpy(pu8CurrByte, pstrStationParam->rates,
2329                        pstrStationParam->rates_len);
2330         pu8CurrByte += pstrStationParam->rates_len;
2331
2332         *pu8CurrByte++ = pstrStationParam->ht_supported;
2333         *pu8CurrByte++ = pstrStationParam->ht_capa_info & 0xFF;
2334         *pu8CurrByte++ = (pstrStationParam->ht_capa_info >> 8) & 0xFF;
2335
2336         *pu8CurrByte++ = pstrStationParam->ht_ampdu_params;
2337         memcpy(pu8CurrByte, pstrStationParam->ht_supp_mcs_set,
2338                WILC_SUPP_MCS_SET_SIZE);
2339         pu8CurrByte += WILC_SUPP_MCS_SET_SIZE;
2340
2341         *pu8CurrByte++ = pstrStationParam->ht_ext_params & 0xFF;
2342         *pu8CurrByte++ = (pstrStationParam->ht_ext_params >> 8) & 0xFF;
2343
2344         *pu8CurrByte++ = pstrStationParam->ht_tx_bf_cap & 0xFF;
2345         *pu8CurrByte++ = (pstrStationParam->ht_tx_bf_cap >> 8) & 0xFF;
2346         *pu8CurrByte++ = (pstrStationParam->ht_tx_bf_cap >> 16) & 0xFF;
2347         *pu8CurrByte++ = (pstrStationParam->ht_tx_bf_cap >> 24) & 0xFF;
2348
2349         *pu8CurrByte++ = pstrStationParam->ht_ante_sel;
2350
2351         *pu8CurrByte++ = pstrStationParam->flags_mask & 0xFF;
2352         *pu8CurrByte++ = (pstrStationParam->flags_mask >> 8) & 0xFF;
2353
2354         *pu8CurrByte++ = pstrStationParam->flags_set & 0xFF;
2355         *pu8CurrByte++ = (pstrStationParam->flags_set >> 8) & 0xFF;
2356
2357         return pu8CurrByte - pu8Buffer;
2358 }
2359
2360 static void Handle_AddStation(struct host_if_drv *hif_drv,
2361                               struct add_sta_param *pstrStationParam)
2362 {
2363         s32 result = 0;
2364         struct wid wid;
2365         u8 *pu8CurrByte;
2366
2367         PRINT_D(HOSTINF_DBG, "Handling add station\n");
2368         wid.id = (u16)WID_ADD_STA;
2369         wid.type = WID_BIN;
2370         wid.size = WILC_ADD_STA_LENGTH + pstrStationParam->rates_len;
2371
2372         wid.val = kmalloc(wid.size, GFP_KERNEL);
2373         if (!wid.val)
2374                 goto ERRORHANDLER;
2375
2376         pu8CurrByte = wid.val;
2377         pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
2378
2379         result = send_config_pkt(SET_CFG, &wid, 1,
2380                                  get_id_from_handler(hif_drv));
2381         if (result != 0)
2382                 PRINT_ER("Failed to send add station config packet\n");
2383
2384 ERRORHANDLER:
2385         kfree(pstrStationParam->rates);
2386         kfree(wid.val);
2387 }
2388
2389 static void Handle_DelAllSta(struct host_if_drv *hif_drv,
2390                              struct del_all_sta *pstrDelAllStaParam)
2391 {
2392         s32 result = 0;
2393         struct wid wid;
2394         u8 *pu8CurrByte;
2395         u8 i;
2396         u8 au8Zero_Buff[6] = {0};
2397
2398         wid.id = (u16)WID_DEL_ALL_STA;
2399         wid.type = WID_STR;
2400         wid.size = (pstrDelAllStaParam->assoc_sta * ETH_ALEN) + 1;
2401
2402         PRINT_D(HOSTINF_DBG, "Handling delete station\n");
2403
2404         wid.val = kmalloc((pstrDelAllStaParam->assoc_sta * ETH_ALEN) + 1, GFP_KERNEL);
2405         if (!wid.val)
2406                 goto ERRORHANDLER;
2407
2408         pu8CurrByte = wid.val;
2409
2410         *(pu8CurrByte++) = pstrDelAllStaParam->assoc_sta;
2411
2412         for (i = 0; i < MAX_NUM_STA; i++) {
2413                 if (memcmp(pstrDelAllStaParam->del_all_sta[i], au8Zero_Buff, ETH_ALEN))
2414                         memcpy(pu8CurrByte, pstrDelAllStaParam->del_all_sta[i], ETH_ALEN);
2415                 else
2416                         continue;
2417
2418                 pu8CurrByte += ETH_ALEN;
2419         }
2420
2421         result = send_config_pkt(SET_CFG, &wid, 1,
2422                                  get_id_from_handler(hif_drv));
2423         if (result)
2424                 PRINT_ER("Failed to send add station config packet\n");
2425
2426 ERRORHANDLER:
2427         kfree(wid.val);
2428
2429         up(&hif_sema_wait_response);
2430 }
2431
2432 static void Handle_DelStation(struct host_if_drv *hif_drv,
2433                               struct del_sta *pstrDelStaParam)
2434 {
2435         s32 result = 0;
2436         struct wid wid;
2437         u8 *pu8CurrByte;
2438
2439         wid.id = (u16)WID_REMOVE_STA;
2440         wid.type = WID_BIN;
2441         wid.size = ETH_ALEN;
2442
2443         PRINT_D(HOSTINF_DBG, "Handling delete station\n");
2444
2445         wid.val = kmalloc(wid.size, GFP_KERNEL);
2446         if (!wid.val)
2447                 goto ERRORHANDLER;
2448
2449         pu8CurrByte = wid.val;
2450
2451         memcpy(pu8CurrByte, pstrDelStaParam->mac_addr, ETH_ALEN);
2452
2453         result = send_config_pkt(SET_CFG, &wid, 1,
2454                                  get_id_from_handler(hif_drv));
2455         if (result)
2456                 PRINT_ER("Failed to send add station config packet\n");
2457
2458 ERRORHANDLER:
2459         kfree(wid.val);
2460 }
2461
2462 static void Handle_EditStation(struct host_if_drv *hif_drv,
2463                                struct add_sta_param *pstrStationParam)
2464 {
2465         s32 result = 0;
2466         struct wid wid;
2467         u8 *pu8CurrByte;
2468
2469         wid.id = (u16)WID_EDIT_STA;
2470         wid.type = WID_BIN;
2471         wid.size = WILC_ADD_STA_LENGTH + pstrStationParam->rates_len;
2472
2473         PRINT_D(HOSTINF_DBG, "Handling edit station\n");
2474         wid.val = kmalloc(wid.size, GFP_KERNEL);
2475         if (!wid.val)
2476                 goto ERRORHANDLER;
2477
2478         pu8CurrByte = wid.val;
2479         pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
2480
2481         result = send_config_pkt(SET_CFG, &wid, 1,
2482                                  get_id_from_handler(hif_drv));
2483         if (result)
2484                 PRINT_ER("Failed to send edit station config packet\n");
2485
2486 ERRORHANDLER:
2487         kfree(pstrStationParam->rates);
2488         kfree(wid.val);
2489 }
2490
2491 static int Handle_RemainOnChan(struct host_if_drv *hif_drv,
2492                                struct remain_ch *pstrHostIfRemainOnChan)
2493 {
2494         s32 result = 0;
2495         u8 u8remain_on_chan_flag;
2496         struct wid wid;
2497
2498         if (!hif_drv->remain_on_ch_pending) {
2499                 hif_drv->remain_on_ch.arg = pstrHostIfRemainOnChan->arg;
2500                 hif_drv->remain_on_ch.expired = pstrHostIfRemainOnChan->expired;
2501                 hif_drv->remain_on_ch.ready = pstrHostIfRemainOnChan->ready;
2502                 hif_drv->remain_on_ch.ch = pstrHostIfRemainOnChan->ch;
2503                 hif_drv->remain_on_ch.id = pstrHostIfRemainOnChan->id;
2504         } else {
2505                 pstrHostIfRemainOnChan->ch = hif_drv->remain_on_ch.ch;
2506         }
2507
2508         if (hif_drv->usr_scan_req.scan_result) {
2509                 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while scanning return\n");
2510                 hif_drv->remain_on_ch_pending = 1;
2511                 result = -EBUSY;
2512                 goto ERRORHANDLER;
2513         }
2514         if (hif_drv->hif_state == HOST_IF_WAITING_CONN_RESP) {
2515                 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while connecting return\n");
2516                 result = -EBUSY;
2517                 goto ERRORHANDLER;
2518         }
2519
2520         if (g_obtainingIP || connecting) {
2521                 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
2522                 result = -EBUSY;
2523                 goto ERRORHANDLER;
2524         }
2525
2526         PRINT_D(HOSTINF_DBG, "Setting channel :%d\n",
2527                 pstrHostIfRemainOnChan->ch);
2528
2529         u8remain_on_chan_flag = true;
2530         wid.id = (u16)WID_REMAIN_ON_CHAN;
2531         wid.type = WID_STR;
2532         wid.size = 2;
2533         wid.val = kmalloc(wid.size, GFP_KERNEL);
2534         if (!wid.val) {
2535                 result = -ENOMEM;
2536                 goto ERRORHANDLER;
2537         }
2538
2539         wid.val[0] = u8remain_on_chan_flag;
2540         wid.val[1] = (s8)pstrHostIfRemainOnChan->ch;
2541
2542         result = send_config_pkt(SET_CFG, &wid, 1,
2543                                  get_id_from_handler(hif_drv));
2544         if (result != 0)
2545                 PRINT_ER("Failed to set remain on channel\n");
2546
2547 ERRORHANDLER:
2548         {
2549                 P2P_LISTEN_STATE = 1;
2550                 hif_drv->remain_on_ch_timer.data = (unsigned long)hif_drv;
2551                 mod_timer(&hif_drv->remain_on_ch_timer,
2552                           jiffies +
2553                           msecs_to_jiffies(pstrHostIfRemainOnChan->u32duration));
2554
2555                 if (hif_drv->remain_on_ch.ready)
2556                         hif_drv->remain_on_ch.ready(hif_drv->remain_on_ch.arg);
2557
2558                 if (hif_drv->remain_on_ch_pending)
2559                         hif_drv->remain_on_ch_pending = 0;
2560         }
2561
2562         return result;
2563 }
2564
2565 static int Handle_RegisterFrame(struct host_if_drv *hif_drv,
2566                                 struct reg_frame *pstrHostIfRegisterFrame)
2567 {
2568         s32 result = 0;
2569         struct wid wid;
2570         u8 *pu8CurrByte;
2571
2572         PRINT_D(HOSTINF_DBG, "Handling frame register : %d FrameType: %d\n",
2573                 pstrHostIfRegisterFrame->reg,
2574                 pstrHostIfRegisterFrame->frame_type);
2575
2576         wid.id = (u16)WID_REGISTER_FRAME;
2577         wid.type = WID_STR;
2578         wid.val = kmalloc(sizeof(u16) + 2, GFP_KERNEL);
2579         if (!wid.val)
2580                 return -ENOMEM;
2581
2582         pu8CurrByte = wid.val;
2583
2584         *pu8CurrByte++ = pstrHostIfRegisterFrame->reg;
2585         *pu8CurrByte++ = pstrHostIfRegisterFrame->reg_id;
2586         memcpy(pu8CurrByte, &pstrHostIfRegisterFrame->frame_type, sizeof(u16));
2587
2588         wid.size = sizeof(u16) + 2;
2589
2590         result = send_config_pkt(SET_CFG, &wid, 1,
2591                                  get_id_from_handler(hif_drv));
2592         if (result) {
2593                 PRINT_ER("Failed to frame register config packet\n");
2594                 result = -EINVAL;
2595         }
2596
2597         return result;
2598 }
2599
2600 static u32 Handle_ListenStateExpired(struct host_if_drv *hif_drv,
2601                                      struct remain_ch *pstrHostIfRemainOnChan)
2602 {
2603         u8 u8remain_on_chan_flag;
2604         struct wid wid;
2605         s32 result = 0;
2606
2607         PRINT_D(HOSTINF_DBG, "CANCEL REMAIN ON CHAN\n");
2608
2609         if (P2P_LISTEN_STATE) {
2610                 u8remain_on_chan_flag = false;
2611                 wid.id = (u16)WID_REMAIN_ON_CHAN;
2612                 wid.type = WID_STR;
2613                 wid.size = 2;
2614                 wid.val = kmalloc(wid.size, GFP_KERNEL);
2615
2616                 if (!wid.val)
2617                         PRINT_ER("Failed to allocate memory\n");
2618
2619                 wid.val[0] = u8remain_on_chan_flag;
2620                 wid.val[1] = FALSE_FRMWR_CHANNEL;
2621
2622                 result = send_config_pkt(SET_CFG, &wid, 1,
2623                                          get_id_from_handler(hif_drv));
2624                 if (result != 0) {
2625                         PRINT_ER("Failed to set remain on channel\n");
2626                         goto _done_;
2627                 }
2628
2629                 if (hif_drv->remain_on_ch.expired) {
2630                         hif_drv->remain_on_ch.expired(hif_drv->remain_on_ch.arg,
2631                                                       pstrHostIfRemainOnChan->id);
2632                 }
2633                 P2P_LISTEN_STATE = 0;
2634         } else {
2635                 PRINT_D(GENERIC_DBG, "Not in listen state\n");
2636                 result = -EFAULT;
2637         }
2638
2639 _done_:
2640         return result;
2641 }
2642
2643 static void ListenTimerCB(unsigned long arg)
2644 {
2645         s32 result = 0;
2646         struct host_if_msg msg;
2647         struct host_if_drv *hif_drv = (struct host_if_drv *)arg;
2648
2649         del_timer(&hif_drv->remain_on_ch_timer);
2650
2651         memset(&msg, 0, sizeof(struct host_if_msg));
2652         msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
2653         msg.drv = hif_drv;
2654         msg.body.remain_on_ch.id = hif_drv->remain_on_ch.id;
2655
2656         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
2657         if (result)
2658                 PRINT_ER("wilc_mq_send fail\n");
2659 }
2660
2661 static void Handle_PowerManagement(struct host_if_drv *hif_drv,
2662                                    struct power_mgmt_param *strPowerMgmtParam)
2663 {
2664         s32 result = 0;
2665         struct wid wid;
2666         s8 s8PowerMode;
2667
2668         wid.id = (u16)WID_POWER_MANAGEMENT;
2669
2670         if (strPowerMgmtParam->enabled)
2671                 s8PowerMode = MIN_FAST_PS;
2672         else
2673                 s8PowerMode = NO_POWERSAVE;
2674         PRINT_D(HOSTINF_DBG, "Handling power mgmt to %d\n", s8PowerMode);
2675         wid.val = &s8PowerMode;
2676         wid.size = sizeof(char);
2677
2678         PRINT_D(HOSTINF_DBG, "Handling Power Management\n");
2679
2680         result = send_config_pkt(SET_CFG, &wid, 1,
2681                                  get_id_from_handler(hif_drv));
2682         if (result)
2683                 PRINT_ER("Failed to send power management config packet\n");
2684 }
2685
2686 static void Handle_SetMulticastFilter(struct host_if_drv *hif_drv,
2687                                       struct set_multicast *strHostIfSetMulti)
2688 {
2689         s32 result = 0;
2690         struct wid wid;
2691         u8 *pu8CurrByte;
2692
2693         PRINT_D(HOSTINF_DBG, "Setup Multicast Filter\n");
2694
2695         wid.id = (u16)WID_SETUP_MULTICAST_FILTER;
2696         wid.type = WID_BIN;
2697         wid.size = sizeof(struct set_multicast) + ((strHostIfSetMulti->cnt) * ETH_ALEN);
2698         wid.val = kmalloc(wid.size, GFP_KERNEL);
2699         if (!wid.val)
2700                 goto ERRORHANDLER;
2701
2702         pu8CurrByte = wid.val;
2703         *pu8CurrByte++ = (strHostIfSetMulti->enabled & 0xFF);
2704         *pu8CurrByte++ = ((strHostIfSetMulti->enabled >> 8) & 0xFF);
2705         *pu8CurrByte++ = ((strHostIfSetMulti->enabled >> 16) & 0xFF);
2706         *pu8CurrByte++ = ((strHostIfSetMulti->enabled >> 24) & 0xFF);
2707
2708         *pu8CurrByte++ = (strHostIfSetMulti->cnt & 0xFF);
2709         *pu8CurrByte++ = ((strHostIfSetMulti->cnt >> 8) & 0xFF);
2710         *pu8CurrByte++ = ((strHostIfSetMulti->cnt >> 16) & 0xFF);
2711         *pu8CurrByte++ = ((strHostIfSetMulti->cnt >> 24) & 0xFF);
2712
2713         if ((strHostIfSetMulti->cnt) > 0)
2714                 memcpy(pu8CurrByte, multicast_mac_addr_list,
2715                        ((strHostIfSetMulti->cnt) * ETH_ALEN));
2716
2717         result = send_config_pkt(SET_CFG, &wid, 1,
2718                                  get_id_from_handler(hif_drv));
2719         if (result)
2720                 PRINT_ER("Failed to send setup multicast config packet\n");
2721
2722 ERRORHANDLER:
2723         kfree(wid.val);
2724 }
2725
2726 static s32 Handle_AddBASession(struct host_if_drv *hif_drv,
2727                                struct ba_session_info *strHostIfBASessionInfo)
2728 {
2729         s32 result = 0;
2730         struct wid wid;
2731         int AddbaTimeout = 100;
2732         char *ptr = NULL;
2733
2734         PRINT_D(HOSTINF_DBG, "Opening Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\nBufferSize == %d\nSessionTimeOut = %d\n",
2735                 strHostIfBASessionInfo->bssid[0],
2736                 strHostIfBASessionInfo->bssid[1],
2737                 strHostIfBASessionInfo->bssid[2],
2738                 strHostIfBASessionInfo->buf_size,
2739                 strHostIfBASessionInfo->time_out,
2740                 strHostIfBASessionInfo->tid);
2741
2742         wid.id = (u16)WID_11E_P_ACTION_REQ;
2743         wid.type = WID_STR;
2744         wid.val = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
2745         wid.size = BLOCK_ACK_REQ_SIZE;
2746         ptr = wid.val;
2747         *ptr++ = 0x14;
2748         *ptr++ = 0x3;
2749         *ptr++ = 0x0;
2750         memcpy(ptr, strHostIfBASessionInfo->bssid, ETH_ALEN);
2751         ptr += ETH_ALEN;
2752         *ptr++ = strHostIfBASessionInfo->tid;
2753         *ptr++ = 1;
2754         *ptr++ = (strHostIfBASessionInfo->buf_size & 0xFF);
2755         *ptr++ = ((strHostIfBASessionInfo->buf_size >> 16) & 0xFF);
2756         *ptr++ = (strHostIfBASessionInfo->time_out & 0xFF);
2757         *ptr++ = ((strHostIfBASessionInfo->time_out >> 16) & 0xFF);
2758         *ptr++ = (AddbaTimeout & 0xFF);
2759         *ptr++ = ((AddbaTimeout >> 16) & 0xFF);
2760         *ptr++ = 8;
2761         *ptr++ = 0;
2762
2763         result = send_config_pkt(SET_CFG, &wid, 1,
2764                                  get_id_from_handler(hif_drv));
2765         if (result)
2766                 PRINT_D(HOSTINF_DBG, "Couldn't open BA Session\n");
2767
2768         wid.id = (u16)WID_11E_P_ACTION_REQ;
2769         wid.type = WID_STR;
2770         wid.size = 15;
2771         ptr = wid.val;
2772         *ptr++ = 15;
2773         *ptr++ = 7;
2774         *ptr++ = 0x2;
2775         memcpy(ptr, strHostIfBASessionInfo->bssid, ETH_ALEN);
2776         ptr += ETH_ALEN;
2777         *ptr++ = strHostIfBASessionInfo->tid;
2778         *ptr++ = 8;
2779         *ptr++ = (strHostIfBASessionInfo->buf_size & 0xFF);
2780         *ptr++ = ((strHostIfBASessionInfo->time_out >> 16) & 0xFF);
2781         *ptr++ = 3;
2782         result = send_config_pkt(SET_CFG, &wid, 1,
2783                                  get_id_from_handler(hif_drv));
2784
2785         kfree(wid.val);
2786
2787         return result;
2788 }
2789
2790 static s32 Handle_DelAllRxBASessions(struct host_if_drv *hif_drv,
2791                                      struct ba_session_info *strHostIfBASessionInfo)
2792 {
2793         s32 result = 0;
2794         struct wid wid;
2795         char *ptr = NULL;
2796
2797         PRINT_D(GENERIC_DBG, "Delete Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\n",
2798                 strHostIfBASessionInfo->bssid[0],
2799                 strHostIfBASessionInfo->bssid[1],
2800                 strHostIfBASessionInfo->bssid[2],
2801                 strHostIfBASessionInfo->tid);
2802
2803         wid.id = (u16)WID_DEL_ALL_RX_BA;
2804         wid.type = WID_STR;
2805         wid.val = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
2806         wid.size = BLOCK_ACK_REQ_SIZE;
2807         ptr = wid.val;
2808         *ptr++ = 0x14;
2809         *ptr++ = 0x3;
2810         *ptr++ = 0x2;
2811         memcpy(ptr, strHostIfBASessionInfo->bssid, ETH_ALEN);
2812         ptr += ETH_ALEN;
2813         *ptr++ = strHostIfBASessionInfo->tid;
2814         *ptr++ = 0;
2815         *ptr++ = 32;
2816
2817         result = send_config_pkt(SET_CFG, &wid, 1,
2818                                  get_id_from_handler(hif_drv));
2819         if (result)
2820                 PRINT_D(HOSTINF_DBG, "Couldn't delete BA Session\n");
2821
2822         kfree(wid.val);
2823
2824         up(&hif_sema_wait_response);
2825
2826         return result;
2827 }
2828
2829 static int hostIFthread(void *pvArg)
2830 {
2831         u32 u32Ret;
2832         struct host_if_msg msg;
2833         struct host_if_drv *hif_drv;
2834
2835         memset(&msg, 0, sizeof(struct host_if_msg));
2836
2837         while (1) {
2838                 wilc_mq_recv(&hif_msg_q, &msg, sizeof(struct host_if_msg), &u32Ret);
2839                 hif_drv = (struct host_if_drv *)msg.drv;
2840                 if (msg.id == HOST_IF_MSG_EXIT) {
2841                         PRINT_D(GENERIC_DBG, "THREAD: Exiting HostIfThread\n");
2842                         break;
2843                 }
2844
2845                 if ((!g_wilc_initialized)) {
2846                         PRINT_D(GENERIC_DBG, "--WAIT--");
2847                         usleep_range(200 * 1000, 200 * 1000);
2848                         wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
2849                         continue;
2850                 }
2851
2852                 if (msg.id == HOST_IF_MSG_CONNECT &&
2853                     hif_drv->usr_scan_req.scan_result) {
2854                         PRINT_D(HOSTINF_DBG, "Requeue connect request till scan done received\n");
2855                         wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
2856                         usleep_range(2 * 1000, 2 * 1000);
2857                         continue;
2858                 }
2859
2860                 switch (msg.id) {
2861                 case HOST_IF_MSG_Q_IDLE:
2862                         Handle_wait_msg_q_empty();
2863                         break;
2864
2865                 case HOST_IF_MSG_SCAN:
2866                         Handle_Scan(msg.drv, &msg.body.scan_info);
2867                         break;
2868
2869                 case HOST_IF_MSG_CONNECT:
2870                         Handle_Connect(msg.drv, &msg.body.con_info);
2871                         break;
2872
2873                 case HOST_IF_MSG_FLUSH_CONNECT:
2874                         Handle_FlushConnect(msg.drv);
2875                         break;
2876
2877                 case HOST_IF_MSG_RCVD_NTWRK_INFO:
2878                         Handle_RcvdNtwrkInfo(msg.drv, &msg.body.net_info);
2879                         break;
2880
2881                 case HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO:
2882                         Handle_RcvdGnrlAsyncInfo(msg.drv, &msg.body.async_info);
2883                         break;
2884
2885                 case HOST_IF_MSG_KEY:
2886                         Handle_Key(msg.drv, &msg.body.key_info);
2887                         break;
2888
2889                 case HOST_IF_MSG_CFG_PARAMS:
2890                         handle_cfg_param(msg.drv, &msg.body.cfg_info);
2891                         break;
2892
2893                 case HOST_IF_MSG_SET_CHANNEL:
2894                         handle_set_channel(msg.drv, &msg.body.channel_info);
2895                         break;
2896
2897                 case HOST_IF_MSG_DISCONNECT:
2898                         Handle_Disconnect(msg.drv);
2899                         break;
2900
2901                 case HOST_IF_MSG_RCVD_SCAN_COMPLETE:
2902                         del_timer(&hif_drv->scan_timer);
2903                         PRINT_D(HOSTINF_DBG, "scan completed successfully\n");
2904
2905                         if (!linux_wlan_get_num_conn_ifcs())
2906                                 chip_sleep_manually();
2907
2908                         Handle_ScanDone(msg.drv, SCAN_EVENT_DONE);
2909
2910                         if (hif_drv->remain_on_ch_pending)
2911                                 Handle_RemainOnChan(msg.drv, &msg.body.remain_on_ch);
2912
2913                         break;
2914
2915                 case HOST_IF_MSG_GET_RSSI:
2916                         Handle_GetRssi(msg.drv);
2917                         break;
2918
2919                 case HOST_IF_MSG_GET_LINKSPEED:
2920                         Handle_GetLinkspeed(msg.drv);
2921                         break;
2922
2923                 case HOST_IF_MSG_GET_STATISTICS:
2924                         Handle_GetStatistics(msg.drv, (struct rf_info *)msg.body.data);
2925                         break;
2926
2927                 case HOST_IF_MSG_GET_CHNL:
2928                         Handle_GetChnl(msg.drv);
2929                         break;
2930
2931                 case HOST_IF_MSG_ADD_BEACON:
2932                         Handle_AddBeacon(msg.drv, &msg.body.beacon_info);
2933                         break;
2934
2935                 case HOST_IF_MSG_DEL_BEACON:
2936                         Handle_DelBeacon(msg.drv);
2937                         break;
2938
2939                 case HOST_IF_MSG_ADD_STATION:
2940                         Handle_AddStation(msg.drv, &msg.body.add_sta_info);
2941                         break;
2942
2943                 case HOST_IF_MSG_DEL_STATION:
2944                         Handle_DelStation(msg.drv, &msg.body.del_sta_info);
2945                         break;
2946
2947                 case HOST_IF_MSG_EDIT_STATION:
2948                         Handle_EditStation(msg.drv, &msg.body.edit_sta_info);
2949                         break;
2950
2951                 case HOST_IF_MSG_GET_INACTIVETIME:
2952                         Handle_Get_InActiveTime(msg.drv, &msg.body.mac_info);
2953                         break;
2954
2955                 case HOST_IF_MSG_SCAN_TIMER_FIRED:
2956                         PRINT_D(HOSTINF_DBG, "Scan Timeout\n");
2957
2958                         Handle_ScanDone(msg.drv, SCAN_EVENT_ABORTED);
2959                         break;
2960
2961                 case HOST_IF_MSG_CONNECT_TIMER_FIRED:
2962                         PRINT_D(HOSTINF_DBG, "Connect Timeout\n");
2963                         Handle_ConnectTimeout(msg.drv);
2964                         break;
2965
2966                 case HOST_IF_MSG_POWER_MGMT:
2967                         Handle_PowerManagement(msg.drv, &msg.body.pwr_mgmt_info);
2968                         break;
2969
2970                 case HOST_IF_MSG_SET_WFIDRV_HANDLER:
2971                         handle_set_wfi_drv_handler(msg.drv, &msg.body.drv);
2972                         break;
2973
2974                 case HOST_IF_MSG_SET_OPERATION_MODE:
2975                         handle_set_operation_mode(msg.drv, &msg.body.mode);
2976                         break;
2977
2978                 case HOST_IF_MSG_SET_IPADDRESS:
2979                         PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
2980                         handle_set_ip_address(msg.drv,
2981                                               msg.body.ip_info.ip_addr,
2982                                               msg.body.ip_info.idx);
2983                         break;
2984
2985                 case HOST_IF_MSG_GET_IPADDRESS:
2986                         PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
2987                         handle_get_ip_address(msg.drv, msg.body.ip_info.idx);
2988                         break;
2989
2990                 case HOST_IF_MSG_SET_MAC_ADDRESS:
2991                         handle_set_mac_address(msg.drv,
2992                                                &msg.body.set_mac_info);
2993                         break;
2994
2995                 case HOST_IF_MSG_GET_MAC_ADDRESS:
2996                         handle_get_mac_address(msg.drv,
2997                                                &msg.body.get_mac_info);
2998                         break;
2999
3000                 case HOST_IF_MSG_REMAIN_ON_CHAN:
3001                         PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REMAIN_ON_CHAN\n");
3002                         Handle_RemainOnChan(msg.drv, &msg.body.remain_on_ch);
3003                         break;
3004
3005                 case HOST_IF_MSG_REGISTER_FRAME:
3006                         PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REGISTER_FRAME\n");
3007                         Handle_RegisterFrame(msg.drv, &msg.body.reg_frame);
3008                         break;
3009
3010                 case HOST_IF_MSG_LISTEN_TIMER_FIRED:
3011                         Handle_ListenStateExpired(msg.drv, &msg.body.remain_on_ch);
3012                         break;
3013
3014                 case HOST_IF_MSG_SET_MULTICAST_FILTER:
3015                         PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_MULTICAST_FILTER\n");
3016                         Handle_SetMulticastFilter(msg.drv, &msg.body.multicast_info);
3017                         break;
3018
3019                 case HOST_IF_MSG_ADD_BA_SESSION:
3020                         Handle_AddBASession(msg.drv, &msg.body.session_info);
3021                         break;
3022
3023                 case HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS:
3024                         Handle_DelAllRxBASessions(msg.drv, &msg.body.session_info);
3025                         break;
3026
3027                 case HOST_IF_MSG_DEL_ALL_STA:
3028                         Handle_DelAllSta(msg.drv, &msg.body.del_all_sta_info);
3029                         break;
3030
3031                 default:
3032                         PRINT_ER("[Host Interface] undefined Received Msg ID\n");
3033                         break;
3034                 }
3035         }
3036
3037         PRINT_D(HOSTINF_DBG, "Releasing thread exit semaphore\n");
3038         up(&hif_sema_thread);
3039         return 0;
3040 }
3041
3042 static void TimerCB_Scan(unsigned long arg)
3043 {
3044         void *pvArg = (void *)arg;
3045         struct host_if_msg msg;
3046
3047         memset(&msg, 0, sizeof(struct host_if_msg));
3048         msg.drv = pvArg;
3049         msg.id = HOST_IF_MSG_SCAN_TIMER_FIRED;
3050
3051         wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3052 }
3053
3054 static void TimerCB_Connect(unsigned long arg)
3055 {
3056         void *pvArg = (void *)arg;
3057         struct host_if_msg msg;
3058
3059         memset(&msg, 0, sizeof(struct host_if_msg));
3060         msg.drv = pvArg;
3061         msg.id = HOST_IF_MSG_CONNECT_TIMER_FIRED;
3062
3063         wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3064 }
3065
3066 s32 host_int_remove_key(struct host_if_drv *hif_drv, const u8 *pu8StaAddress)
3067 {
3068         struct wid wid;
3069
3070         wid.id = (u16)WID_REMOVE_KEY;
3071         wid.type = WID_STR;
3072         wid.val = (s8 *)pu8StaAddress;
3073         wid.size = 6;
3074
3075         return 0;
3076 }
3077
3078 int host_int_remove_wep_key(struct host_if_drv *hif_drv, u8 index)
3079 {
3080         int result = 0;
3081         struct host_if_msg msg;
3082
3083         if (!hif_drv) {
3084                 result = -EFAULT;
3085                 PRINT_ER("Failed to send setup multicast config packet\n");
3086                 return result;
3087         }
3088
3089         memset(&msg, 0, sizeof(struct host_if_msg));
3090
3091         msg.id = HOST_IF_MSG_KEY;
3092         msg.body.key_info.type = WEP;
3093         msg.body.key_info.action = REMOVEKEY;
3094         msg.drv = hif_drv;
3095         msg.body.key_info.attr.wep.index = index;
3096
3097         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3098         if (result)
3099                 PRINT_ER("Error in sending message queue : Request to remove WEP key\n");
3100         down(&hif_drv->sem_test_key_block);
3101
3102         return result;
3103 }
3104
3105 int host_int_set_wep_default_key(struct host_if_drv *hif_drv, u8 index)
3106 {
3107         int result = 0;
3108         struct host_if_msg msg;
3109
3110         if (!hif_drv) {
3111                 result = -EFAULT;
3112                 PRINT_ER("driver is null\n");
3113                 return result;
3114         }
3115
3116         memset(&msg, 0, sizeof(struct host_if_msg));
3117
3118         msg.id = HOST_IF_MSG_KEY;
3119         msg.body.key_info.type = WEP;
3120         msg.body.key_info.action = DEFAULTKEY;
3121         msg.drv = hif_drv;
3122         msg.body.key_info.attr.wep.index = index;
3123
3124         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3125         if (result)
3126                 PRINT_ER("Error in sending message queue : Default key index\n");
3127         down(&hif_drv->sem_test_key_block);
3128
3129         return result;
3130 }
3131
3132 int host_int_add_wep_key_bss_sta(struct host_if_drv *hif_drv,
3133                                  const u8 *key,
3134                                  u8 len,
3135                                  u8 index)
3136 {
3137         int result = 0;
3138         struct host_if_msg msg;
3139
3140         if (!hif_drv) {
3141                 PRINT_ER("driver is null\n");
3142                 return -EFAULT;
3143         }
3144
3145         memset(&msg, 0, sizeof(struct host_if_msg));
3146
3147         msg.id = HOST_IF_MSG_KEY;
3148         msg.body.key_info.type = WEP;
3149         msg.body.key_info.action = ADDKEY;
3150         msg.drv = hif_drv;
3151         msg.body.key_info.attr.wep.key = kmemdup(key, len, GFP_KERNEL);
3152         if (!msg.body.key_info.attr.wep.key)
3153                 return -ENOMEM;
3154
3155         msg.body.key_info.attr.wep.key_len = len;
3156         msg.body.key_info.attr.wep.index = index;
3157
3158         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3159         if (result)
3160                 PRINT_ER("Error in sending message queue :WEP Key\n");
3161         down(&hif_drv->sem_test_key_block);
3162
3163         return result;
3164 }
3165
3166 int host_int_add_wep_key_bss_ap(struct host_if_drv *hif_drv,
3167                                 const u8 *key,
3168                                 u8 len,
3169                                 u8 index,
3170                                 u8 mode,
3171                                 enum AUTHTYPE auth_type)
3172 {
3173         int result = 0;
3174         struct host_if_msg msg;
3175         int i;
3176
3177         if (!hif_drv) {
3178                 PRINT_ER("driver is null\n");
3179                 return -EFAULT;
3180         }
3181
3182         memset(&msg, 0, sizeof(struct host_if_msg));
3183
3184         if (INFO) {
3185                 for (i = 0; i < len; i++)
3186                         PRINT_INFO(HOSTAPD_DBG, "KEY is %x\n", key[i]);
3187         }
3188         msg.id = HOST_IF_MSG_KEY;
3189         msg.body.key_info.type = WEP;
3190         msg.body.key_info.action = ADDKEY_AP;
3191         msg.drv = hif_drv;
3192         msg.body.key_info.attr.wep.key = kmemdup(key, len, GFP_KERNEL);
3193         if (!msg.body.key_info.attr.wep.key)
3194                 return -ENOMEM;
3195
3196         msg.body.key_info.attr.wep.key_len = len;
3197         msg.body.key_info.attr.wep.index = index;
3198         msg.body.key_info.attr.wep.mode = mode;
3199         msg.body.key_info.attr.wep.auth_type = auth_type;
3200
3201         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3202
3203         if (result)
3204                 PRINT_ER("Error in sending message queue :WEP Key\n");
3205         down(&hif_drv->sem_test_key_block);
3206
3207         return result;
3208 }
3209
3210 int host_int_add_ptk(struct host_if_drv *hif_drv, const u8 *ptk,
3211                      u8 ptk_key_len, const u8 *mac_addr,
3212                      const u8 *rx_mic, const u8 *pu8TxMic,
3213                      u8 mode, u8 u8Ciphermode, u8 u8Idx)
3214 {
3215         int result = 0;
3216         struct host_if_msg msg;
3217         u8 u8KeyLen = ptk_key_len;
3218         u32 i;
3219
3220         if (!hif_drv) {
3221                 PRINT_ER("driver is null\n");
3222                 return -EFAULT;
3223         }
3224
3225         if (rx_mic)
3226                 u8KeyLen += RX_MIC_KEY_LEN;
3227
3228         if (pu8TxMic)
3229                 u8KeyLen += TX_MIC_KEY_LEN;
3230
3231         memset(&msg, 0, sizeof(struct host_if_msg));
3232
3233         msg.id = HOST_IF_MSG_KEY;
3234         msg.body.key_info.type = WPA_PTK;
3235         if (mode == AP_MODE) {
3236                 msg.body.key_info.action = ADDKEY_AP;
3237                 msg.body.key_info.attr.wpa.index = u8Idx;
3238         }
3239         if (mode == STATION_MODE)
3240                 msg.body.key_info.action = ADDKEY;
3241
3242         msg.body.key_info.attr.wpa.key = kmalloc(ptk_key_len, GFP_KERNEL);
3243         memcpy(msg.body.key_info.attr.wpa.key, ptk, ptk_key_len);
3244
3245         if (rx_mic) {
3246                 memcpy(msg.body.key_info.attr.wpa.key + 16, rx_mic, RX_MIC_KEY_LEN);
3247                 if (INFO) {
3248                         for (i = 0; i < RX_MIC_KEY_LEN; i++)
3249                                 PRINT_INFO(CFG80211_DBG, "PairwiseRx[%d] = %x\n", i, rx_mic[i]);
3250                 }
3251         }
3252         if (pu8TxMic) {
3253                 memcpy(msg.body.key_info.attr.wpa.key + 24, pu8TxMic, TX_MIC_KEY_LEN);
3254                 if (INFO) {
3255                         for (i = 0; i < TX_MIC_KEY_LEN; i++)
3256                                 PRINT_INFO(CFG80211_DBG, "PairwiseTx[%d] = %x\n", i, pu8TxMic[i]);
3257                 }
3258         }
3259
3260         msg.body.key_info.attr.wpa.key_len = u8KeyLen;
3261         msg.body.key_info.attr.wpa.mac_addr = mac_addr;
3262         msg.body.key_info.attr.wpa.mode = u8Ciphermode;
3263         msg.drv = hif_drv;
3264
3265         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3266
3267         if (result)
3268                 PRINT_ER("Error in sending message queue:  PTK Key\n");
3269
3270         down(&hif_drv->sem_test_key_block);
3271
3272         return result;
3273 }
3274
3275 s32 host_int_add_rx_gtk(struct host_if_drv *hif_drv, const u8 *pu8RxGtk,
3276                         u8 u8GtkKeylen, u8 u8KeyIdx,
3277                         u32 u32KeyRSClen, const u8 *KeyRSC,
3278                         const u8 *pu8RxMic, const u8 *pu8TxMic,
3279                         u8 mode, u8 u8Ciphermode)
3280 {
3281         s32 result = 0;
3282         struct host_if_msg msg;
3283         u8 u8KeyLen = u8GtkKeylen;
3284
3285         if (!hif_drv) {
3286                 PRINT_ER("driver is null\n");
3287                 return -EFAULT;
3288         }
3289         memset(&msg, 0, sizeof(struct host_if_msg));
3290
3291         if (pu8RxMic)
3292                 u8KeyLen += RX_MIC_KEY_LEN;
3293
3294         if (pu8TxMic)
3295                 u8KeyLen += TX_MIC_KEY_LEN;
3296
3297         if (KeyRSC) {
3298                 msg.body.key_info.attr.wpa.seq = kmalloc(u32KeyRSClen, GFP_KERNEL);
3299                 memcpy(msg.body.key_info.attr.wpa.seq, KeyRSC, u32KeyRSClen);
3300         }
3301
3302         msg.id = HOST_IF_MSG_KEY;
3303         msg.body.key_info.type = WPA_RX_GTK;
3304         msg.drv = hif_drv;
3305
3306         if (mode == AP_MODE) {
3307                 msg.body.key_info.action = ADDKEY_AP;
3308                 msg.body.key_info.attr.wpa.mode = u8Ciphermode;
3309         }
3310         if (mode == STATION_MODE)
3311                 msg.body.key_info.action = ADDKEY;
3312
3313         msg.body.key_info.attr.wpa.key = kmalloc(u8KeyLen, GFP_KERNEL);
3314         memcpy(msg.body.key_info.attr.wpa.key, pu8RxGtk, u8GtkKeylen);
3315
3316         if (pu8RxMic)
3317                 memcpy(msg.body.key_info.attr.wpa.key + 16, pu8RxMic,
3318                        RX_MIC_KEY_LEN);
3319
3320         if (pu8TxMic)
3321                 memcpy(msg.body.key_info.attr.wpa.key + 24, pu8TxMic,
3322                        TX_MIC_KEY_LEN);
3323
3324         msg.body.key_info.attr.wpa.index = u8KeyIdx;
3325         msg.body.key_info.attr.wpa.key_len = u8KeyLen;
3326         msg.body.key_info.attr.wpa.seq_len = u32KeyRSClen;
3327
3328         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3329         if (result)
3330                 PRINT_ER("Error in sending message queue:  RX GTK\n");
3331
3332         down(&hif_drv->sem_test_key_block);
3333
3334         return result;
3335 }
3336
3337 s32 host_int_set_pmkid_info(struct host_if_drv *hif_drv, struct host_if_pmkid_attr *pu8PmkidInfoArray)
3338 {
3339         s32 result = 0;
3340         struct host_if_msg msg;
3341         u32 i;
3342
3343         if (!hif_drv) {
3344                 PRINT_ER("driver is null\n");
3345                 return -EFAULT;
3346         }
3347
3348         memset(&msg, 0, sizeof(struct host_if_msg));
3349
3350         msg.id = HOST_IF_MSG_KEY;
3351         msg.body.key_info.type = PMKSA;
3352         msg.body.key_info.action = ADDKEY;
3353         msg.drv = hif_drv;
3354
3355         for (i = 0; i < pu8PmkidInfoArray->numpmkid; i++) {
3356                 memcpy(msg.body.key_info.attr.pmkid.pmkidlist[i].bssid,
3357                        &pu8PmkidInfoArray->pmkidlist[i].bssid, ETH_ALEN);
3358                 memcpy(msg.body.key_info.attr.pmkid.pmkidlist[i].pmkid,
3359                        &pu8PmkidInfoArray->pmkidlist[i].pmkid, PMKID_LEN);
3360         }
3361
3362         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3363         if (result)
3364                 PRINT_ER(" Error in sending messagequeue: PMKID Info\n");
3365
3366         return result;
3367 }
3368
3369 s32 host_int_get_pmkid_info(struct host_if_drv *hif_drv,
3370                             u8 *pu8PmkidInfoArray,
3371                             u32 u32PmkidInfoLen)
3372 {
3373         struct wid wid;
3374
3375         wid.id = (u16)WID_PMKID_INFO;
3376         wid.type = WID_STR;
3377         wid.size = u32PmkidInfoLen;
3378         wid.val = pu8PmkidInfoArray;
3379
3380         return 0;
3381 }
3382
3383 s32 host_int_set_RSNAConfigPSKPassPhrase(struct host_if_drv *hif_drv,
3384                                          u8 *pu8PassPhrase,
3385                                          u8 u8Psklength)
3386 {
3387         struct wid wid;
3388
3389         if ((u8Psklength > 7) && (u8Psklength < 65)) {
3390                 wid.id = (u16)WID_11I_PSK;
3391                 wid.type = WID_STR;
3392                 wid.val = pu8PassPhrase;
3393                 wid.size = u8Psklength;
3394         }
3395
3396         return 0;
3397 }
3398
3399 s32 hif_get_mac_address(struct host_if_drv *hif_drv, u8 *pu8MacAddress)
3400 {
3401         s32 result = 0;
3402         struct host_if_msg msg;
3403
3404         memset(&msg, 0, sizeof(struct host_if_msg));
3405
3406         msg.id = HOST_IF_MSG_GET_MAC_ADDRESS;
3407         msg.body.get_mac_info.mac_addr = pu8MacAddress;
3408         msg.drv = hif_drv;
3409
3410         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3411         if (result) {
3412                 PRINT_ER("Failed to send get mac address\n");
3413                 return -EFAULT;
3414         }
3415
3416         down(&hif_sema_wait_response);
3417         return result;
3418 }
3419
3420 s32 host_int_set_MacAddress(struct host_if_drv *hif_drv, u8 *pu8MacAddress)
3421 {
3422         s32 result = 0;
3423         struct host_if_msg msg;
3424
3425         PRINT_D(GENERIC_DBG, "mac addr = %x:%x:%x\n", pu8MacAddress[0], pu8MacAddress[1], pu8MacAddress[2]);
3426
3427         memset(&msg, 0, sizeof(struct host_if_msg));
3428         msg.id = HOST_IF_MSG_SET_MAC_ADDRESS;
3429         memcpy(msg.body.set_mac_info.mac_addr, pu8MacAddress, ETH_ALEN);
3430         msg.drv = hif_drv;
3431
3432         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3433         if (result)
3434                 PRINT_ER("Failed to send message queue: Set mac address\n");
3435
3436         return result;
3437 }
3438
3439 s32 host_int_get_RSNAConfigPSKPassPhrase(struct host_if_drv *hif_drv,
3440                                          u8 *pu8PassPhrase, u8 u8Psklength)
3441 {
3442         struct wid wid;
3443
3444         wid.id = (u16)WID_11I_PSK;
3445         wid.type = WID_STR;
3446         wid.size = u8Psklength;
3447         wid.val = pu8PassPhrase;
3448
3449         return 0;
3450 }
3451
3452 s32 host_int_set_start_scan_req(struct host_if_drv *hif_drv, u8 scanSource)
3453 {
3454         struct wid wid;
3455
3456         wid.id = (u16)WID_START_SCAN_REQ;
3457         wid.type = WID_CHAR;
3458         wid.val = (s8 *)&scanSource;
3459         wid.size = sizeof(char);
3460
3461         return 0;
3462 }
3463
3464 s32 host_int_get_start_scan_req(struct host_if_drv *hif_drv, u8 *pu8ScanSource)
3465 {
3466         struct wid wid;
3467
3468         wid.id = (u16)WID_START_SCAN_REQ;
3469         wid.type = WID_CHAR;
3470         wid.val = (s8 *)pu8ScanSource;
3471         wid.size = sizeof(char);
3472
3473         return 0;
3474 }
3475
3476 s32 host_int_set_join_req(struct host_if_drv *hif_drv, u8 *pu8bssid,
3477                           const u8 *pu8ssid, size_t ssidLen,
3478                           const u8 *pu8IEs, size_t IEsLen,
3479                           wilc_connect_result pfConnectResult, void *pvUserArg,
3480                           u8 u8security, enum AUTHTYPE tenuAuth_type,
3481                           u8 u8channel, void *pJoinParams)
3482 {
3483         s32 result = 0;
3484         struct host_if_msg msg;
3485
3486         if (!hif_drv || !pfConnectResult) {
3487                 PRINT_ER("Driver is null\n");
3488                 return -EFAULT;
3489         }
3490
3491         if (!pJoinParams) {
3492                 PRINT_ER("Unable to Join - JoinParams is NULL\n");
3493                 return -EFAULT;
3494         }
3495
3496         memset(&msg, 0, sizeof(struct host_if_msg));
3497
3498         msg.id = HOST_IF_MSG_CONNECT;
3499
3500         msg.body.con_info.security = u8security;
3501         msg.body.con_info.auth_type = tenuAuth_type;
3502         msg.body.con_info.ch = u8channel;
3503         msg.body.con_info.result = pfConnectResult;
3504         msg.body.con_info.arg = pvUserArg;
3505         msg.body.con_info.params = pJoinParams;
3506         msg.drv = hif_drv ;
3507
3508         if (pu8bssid) {
3509                 msg.body.con_info.bssid = kmalloc(6, GFP_KERNEL);
3510                 memcpy(msg.body.con_info.bssid, pu8bssid, 6);
3511         }
3512
3513         if (pu8ssid) {
3514                 msg.body.con_info.ssid_len = ssidLen;
3515                 msg.body.con_info.ssid = kmalloc(ssidLen, GFP_KERNEL);
3516                 memcpy(msg.body.con_info.ssid, pu8ssid, ssidLen);
3517         }
3518
3519         if (pu8IEs) {
3520                 msg.body.con_info.ies_len = IEsLen;
3521                 msg.body.con_info.ies = kmalloc(IEsLen, GFP_KERNEL);
3522                 memcpy(msg.body.con_info.ies, pu8IEs, IEsLen);
3523         }
3524         if (hif_drv->hif_state < HOST_IF_CONNECTING)
3525                 hif_drv->hif_state = HOST_IF_CONNECTING;
3526         else
3527                 PRINT_D(GENERIC_DBG, "Don't set state to 'connecting' : %d\n",
3528                         hif_drv->hif_state);
3529
3530         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3531         if (result) {
3532                 PRINT_ER("Failed to send message queue: Set join request\n");
3533                 return -EFAULT;
3534         }
3535
3536         hif_drv->connect_timer.data = (unsigned long)hif_drv;
3537         mod_timer(&hif_drv->connect_timer,
3538                   jiffies + msecs_to_jiffies(HOST_IF_CONNECT_TIMEOUT));
3539
3540         return result;
3541 }
3542
3543 s32 host_int_flush_join_req(struct host_if_drv *hif_drv)
3544 {
3545         s32 result = 0;
3546         struct host_if_msg msg;
3547
3548         if (!join_req)
3549                 return -EFAULT;
3550
3551         if (!hif_drv) {
3552                 PRINT_ER("Driver is null\n");
3553                 return -EFAULT;
3554         }
3555
3556         msg.id = HOST_IF_MSG_FLUSH_CONNECT;
3557         msg.drv = hif_drv;
3558
3559         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3560         if (result) {
3561                 PRINT_ER("Failed to send message queue: Flush join request\n");
3562                 return -EFAULT;
3563         }
3564
3565         return result;
3566 }
3567
3568 s32 host_int_disconnect(struct host_if_drv *hif_drv, u16 u16ReasonCode)
3569 {
3570         s32 result = 0;
3571         struct host_if_msg msg;
3572
3573         if (!hif_drv) {
3574                 PRINT_ER("Driver is null\n");
3575                 return -EFAULT;
3576         }
3577
3578         memset(&msg, 0, sizeof(struct host_if_msg));
3579
3580         msg.id = HOST_IF_MSG_DISCONNECT;
3581         msg.drv = hif_drv;
3582
3583         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3584         if (result)
3585                 PRINT_ER("Failed to send message queue: disconnect\n");
3586
3587         down(&hif_drv->sem_test_disconn_block);
3588
3589         return result;
3590 }
3591
3592 s32 host_int_disconnect_station(struct host_if_drv *hif_drv, u8 assoc_id)
3593 {
3594         struct wid wid;
3595
3596         wid.id = (u16)WID_DISCONNECT;
3597         wid.type = WID_CHAR;
3598         wid.val = (s8 *)&assoc_id;
3599         wid.size = sizeof(char);
3600
3601         return 0;
3602 }
3603
3604 s32 host_int_get_assoc_req_info(struct host_if_drv *hif_drv,
3605                                 u8 *pu8AssocReqInfo,
3606                                 u32 u32AssocReqInfoLen)
3607 {
3608         struct wid wid;
3609
3610         wid.id = (u16)WID_ASSOC_REQ_INFO;
3611         wid.type = WID_STR;
3612         wid.val = pu8AssocReqInfo;
3613         wid.size = u32AssocReqInfoLen;
3614
3615         return 0;
3616 }
3617
3618 s32 host_int_get_assoc_res_info(struct host_if_drv *hif_drv,
3619                                 u8 *pu8AssocRespInfo,
3620                                 u32 u32MaxAssocRespInfoLen,
3621                                 u32 *pu32RcvdAssocRespInfoLen)
3622 {
3623         s32 result = 0;
3624         struct wid wid;
3625
3626         if (!hif_drv) {
3627                 PRINT_ER("Driver is null\n");
3628                 return -EFAULT;
3629         }
3630
3631         wid.id = (u16)WID_ASSOC_RES_INFO;
3632         wid.type = WID_STR;
3633         wid.val = pu8AssocRespInfo;
3634         wid.size = u32MaxAssocRespInfoLen;
3635
3636         result = send_config_pkt(GET_CFG, &wid, 1,
3637                                  get_id_from_handler(hif_drv));
3638         if (result) {
3639                 *pu32RcvdAssocRespInfoLen = 0;
3640                 PRINT_ER("Failed to send association response config packet\n");
3641                 return -EINVAL;
3642         } else {
3643                 *pu32RcvdAssocRespInfoLen = wid.size;
3644         }
3645
3646         return result;
3647 }
3648
3649 s32 host_int_get_rx_power_level(struct host_if_drv *hif_drv,
3650                                 u8 *pu8RxPowerLevel,
3651                                 u32 u32RxPowerLevelLen)
3652 {
3653         struct wid wid;
3654
3655         wid.id = (u16)WID_RX_POWER_LEVEL;
3656         wid.type = WID_STR;
3657         wid.val = pu8RxPowerLevel;
3658         wid.size = u32RxPowerLevelLen;
3659
3660         return 0;
3661 }
3662
3663 int host_int_set_mac_chnl_num(struct host_if_drv *hif_drv, u8 channel)
3664 {
3665         int result;
3666         struct host_if_msg msg;
3667
3668         if (!hif_drv) {
3669                 PRINT_ER("driver is null\n");
3670                 return -EFAULT;
3671         }
3672
3673         memset(&msg, 0, sizeof(struct host_if_msg));
3674         msg.id = HOST_IF_MSG_SET_CHANNEL;
3675         msg.body.channel_info.set_ch = channel;
3676         msg.drv = hif_drv;
3677
3678         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3679         if (result) {
3680                 PRINT_ER("wilc mq send fail\n");
3681                 return -EINVAL;
3682         }
3683
3684         return 0;
3685 }
3686
3687 int host_int_wait_msg_queue_idle(void)
3688 {
3689         int result = 0;
3690         struct host_if_msg msg;
3691
3692         memset(&msg, 0, sizeof(struct host_if_msg));
3693         msg.id = HOST_IF_MSG_Q_IDLE;
3694         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3695         if (result) {
3696                 PRINT_ER("wilc mq send fail\n");
3697                 result = -EINVAL;
3698         }
3699
3700         down(&hif_sema_wait_response);
3701
3702         return result;
3703 }
3704
3705 int host_int_set_wfi_drv_handler(struct host_if_drv *hif_drv)
3706 {
3707         int result = 0;
3708         struct host_if_msg msg;
3709
3710         memset(&msg, 0, sizeof(struct host_if_msg));
3711         msg.id = HOST_IF_MSG_SET_WFIDRV_HANDLER;
3712         msg.body.drv.handler = get_id_from_handler(hif_drv);
3713         msg.drv = hif_drv;
3714
3715         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3716         if (result) {
3717                 PRINT_ER("wilc mq send fail\n");
3718                 result = -EINVAL;
3719         }
3720
3721         return result;
3722 }
3723
3724 int host_int_set_operation_mode(struct host_if_drv *hif_drv, u32 mode)
3725 {
3726         int result = 0;
3727         struct host_if_msg msg;
3728
3729         memset(&msg, 0, sizeof(struct host_if_msg));
3730         msg.id = HOST_IF_MSG_SET_OPERATION_MODE;
3731         msg.body.mode.mode = mode;
3732         msg.drv = hif_drv;
3733
3734         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3735         if (result) {
3736                 PRINT_ER("wilc mq send fail\n");
3737                 result = -EINVAL;
3738         }
3739
3740         return result;
3741 }
3742
3743 s32 host_int_get_host_chnl_num(struct host_if_drv *hif_drv, u8 *pu8ChNo)
3744 {
3745         s32 result = 0;
3746         struct host_if_msg msg;
3747
3748         if (!hif_drv) {
3749                 PRINT_ER("driver is null\n");
3750                 return -EFAULT;
3751         }
3752
3753         memset(&msg, 0, sizeof(struct host_if_msg));
3754
3755         msg.id = HOST_IF_MSG_GET_CHNL;
3756         msg.drv = hif_drv;
3757
3758         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3759         if (result)
3760                 PRINT_ER("wilc mq send fail\n");
3761         down(&hif_drv->sem_get_chnl);
3762
3763         *pu8ChNo = ch_no;
3764
3765         return result;
3766 }
3767
3768 s32 host_int_get_inactive_time(struct host_if_drv *hif_drv,
3769                                const u8 *mac, u32 *pu32InactiveTime)
3770 {
3771         s32 result = 0;
3772         struct host_if_msg msg;
3773
3774         if (!hif_drv) {
3775                 PRINT_ER("driver is null\n");
3776                 return -EFAULT;
3777         }
3778
3779         memset(&msg, 0, sizeof(struct host_if_msg));
3780         memcpy(msg.body.mac_info.mac, mac, ETH_ALEN);
3781
3782         msg.id = HOST_IF_MSG_GET_INACTIVETIME;
3783         msg.drv = hif_drv;
3784
3785         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3786         if (result)
3787                 PRINT_ER("Failed to send get host channel param's message queue ");
3788
3789         down(&hif_drv->sem_inactive_time);
3790
3791         *pu32InactiveTime = inactive_time;
3792
3793         return result;
3794 }
3795
3796 s32 host_int_test_get_int_wid(struct host_if_drv *hif_drv, u32 *pu32TestMemAddr)
3797 {
3798         s32 result = 0;
3799         struct wid wid;
3800
3801         if (!hif_drv) {
3802                 PRINT_ER("driver is null\n");
3803                 return -EFAULT;
3804         }
3805
3806         wid.id = (u16)WID_MEMORY_ADDRESS;
3807         wid.type = WID_INT;
3808         wid.val = (s8 *)pu32TestMemAddr;
3809         wid.size = sizeof(u32);
3810
3811         result = send_config_pkt(GET_CFG, &wid, 1,
3812                                  get_id_from_handler(hif_drv));
3813
3814         if (result) {
3815                 PRINT_ER("Failed to get wid value\n");
3816                 return -EINVAL;
3817         } else {
3818                 PRINT_D(HOSTINF_DBG, "Successfully got wid value\n");
3819         }
3820
3821         return result;
3822 }
3823
3824 s32 host_int_get_rssi(struct host_if_drv *hif_drv, s8 *ps8Rssi)
3825 {
3826         s32 result = 0;
3827         struct host_if_msg msg;
3828
3829         memset(&msg, 0, sizeof(struct host_if_msg));
3830         msg.id = HOST_IF_MSG_GET_RSSI;
3831         msg.drv = hif_drv;
3832
3833         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3834         if (result) {
3835                 PRINT_ER("Failed to send get host channel param's message queue ");
3836                 return -EFAULT;
3837         }
3838
3839         down(&hif_drv->sem_get_rssi);
3840
3841         if (!ps8Rssi) {
3842                 PRINT_ER("RSS pointer value is null");
3843                 return -EFAULT;
3844         }
3845
3846         *ps8Rssi = rssi;
3847
3848         return result;
3849 }
3850
3851 s32 host_int_get_link_speed(struct host_if_drv *hif_drv, s8 *ps8lnkspd)
3852 {
3853         struct host_if_msg msg;
3854         s32 result = 0;
3855
3856         memset(&msg, 0, sizeof(struct host_if_msg));
3857         msg.id = HOST_IF_MSG_GET_LINKSPEED;
3858         msg.drv = hif_drv;
3859
3860         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3861         if (result) {
3862                 PRINT_ER("Failed to send GET_LINKSPEED to message queue ");
3863                 return -EFAULT;
3864         }
3865
3866         down(&hif_drv->sem_get_link_speed);
3867
3868         if (!ps8lnkspd) {
3869                 PRINT_ER("LINKSPEED pointer value is null");
3870                 return -EFAULT;
3871         }
3872
3873         *ps8lnkspd = link_speed;
3874
3875         return result;
3876 }
3877
3878 s32 host_int_get_statistics(struct host_if_drv *hif_drv, struct rf_info *pstrStatistics)
3879 {
3880         s32 result = 0;
3881         struct host_if_msg msg;
3882
3883         memset(&msg, 0, sizeof(struct host_if_msg));
3884         msg.id = HOST_IF_MSG_GET_STATISTICS;
3885         msg.body.data = (char *)pstrStatistics;
3886         msg.drv = hif_drv;
3887
3888         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3889         if (result) {
3890                 PRINT_ER("Failed to send get host channel param's message queue ");
3891                 return -EFAULT;
3892         }
3893
3894         down(&hif_sema_wait_response);
3895         return result;
3896 }
3897
3898 s32 host_int_scan(struct host_if_drv *hif_drv, u8 u8ScanSource,
3899                   u8 u8ScanType, u8 *pu8ChnlFreqList,
3900                   u8 u8ChnlListLen, const u8 *pu8IEs,
3901                   size_t IEsLen, wilc_scan_result ScanResult,
3902                   void *pvUserArg, struct hidden_network *pstrHiddenNetwork)
3903 {
3904         s32 result = 0;
3905         struct host_if_msg msg;
3906
3907         if (!hif_drv || !ScanResult) {
3908                 PRINT_ER("hif_drv or ScanResult = NULL\n");
3909                 return -EFAULT;
3910         }
3911
3912         memset(&msg, 0, sizeof(struct host_if_msg));
3913
3914         msg.id = HOST_IF_MSG_SCAN;
3915
3916         if (pstrHiddenNetwork) {
3917                 msg.body.scan_info.hidden_network.pstrHiddenNetworkInfo = pstrHiddenNetwork->pstrHiddenNetworkInfo;
3918                 msg.body.scan_info.hidden_network.u8ssidnum = pstrHiddenNetwork->u8ssidnum;
3919
3920         } else
3921                 PRINT_D(HOSTINF_DBG, "pstrHiddenNetwork IS EQUAL TO NULL\n");
3922
3923         msg.drv = hif_drv;
3924         msg.body.scan_info.src = u8ScanSource;
3925         msg.body.scan_info.type = u8ScanType;
3926         msg.body.scan_info.result = ScanResult;
3927         msg.body.scan_info.arg = pvUserArg;
3928
3929         msg.body.scan_info.ch_list_len = u8ChnlListLen;
3930         msg.body.scan_info.ch_freq_list = kmalloc(u8ChnlListLen, GFP_KERNEL);
3931         memcpy(msg.body.scan_info.ch_freq_list, pu8ChnlFreqList, u8ChnlListLen);
3932
3933         msg.body.scan_info.ies_len = IEsLen;
3934         msg.body.scan_info.ies = kmalloc(IEsLen, GFP_KERNEL);
3935         memcpy(msg.body.scan_info.ies, pu8IEs, IEsLen);
3936
3937         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3938         if (result) {
3939                 PRINT_ER("Error in sending message queue\n");
3940                 return -EINVAL;
3941         }
3942
3943         PRINT_D(HOSTINF_DBG, ">> Starting the SCAN timer\n");
3944         hif_drv->scan_timer.data = (unsigned long)hif_drv;
3945         mod_timer(&hif_drv->scan_timer,
3946                   jiffies + msecs_to_jiffies(HOST_IF_SCAN_TIMEOUT));
3947
3948         return result;
3949 }
3950
3951 s32 hif_set_cfg(struct host_if_drv *hif_drv,
3952                 struct cfg_param_val *pstrCfgParamVal)
3953 {
3954         s32 result = 0;
3955         struct host_if_msg msg;
3956
3957         if (!hif_drv) {
3958                 PRINT_ER("hif_drv NULL\n");
3959                 return -EFAULT;
3960         }
3961
3962         memset(&msg, 0, sizeof(struct host_if_msg));
3963         msg.id = HOST_IF_MSG_CFG_PARAMS;
3964         msg.body.cfg_info.cfg_attr_info = *pstrCfgParamVal;
3965         msg.drv = hif_drv;
3966
3967         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3968
3969         return result;
3970 }
3971
3972 s32 hif_get_cfg(struct host_if_drv *hif_drv, u16 u16WID, u16 *pu16WID_Value)
3973 {
3974         s32 result = 0;
3975
3976         down(&hif_drv->sem_cfg_values);
3977
3978         if (!hif_drv) {
3979                 PRINT_ER("hif_drv NULL\n");
3980                 return -EFAULT;
3981         }
3982         PRINT_D(HOSTINF_DBG, "Getting configuration parameters\n");
3983         switch (u16WID) {
3984         case WID_BSS_TYPE:
3985                 *pu16WID_Value = (u16)hif_drv->cfg_values.bss_type;
3986                 break;
3987
3988         case WID_AUTH_TYPE:
3989                 *pu16WID_Value = (u16)hif_drv->cfg_values.auth_type;
3990                 break;
3991
3992         case WID_AUTH_TIMEOUT:
3993                 *pu16WID_Value = hif_drv->cfg_values.auth_timeout;
3994                 break;
3995
3996         case WID_POWER_MANAGEMENT:
3997                 *pu16WID_Value = (u16)hif_drv->cfg_values.power_mgmt_mode;
3998                 break;
3999
4000         case WID_SHORT_RETRY_LIMIT:
4001                 *pu16WID_Value = hif_drv->cfg_values.short_retry_limit;
4002                 break;
4003
4004         case WID_LONG_RETRY_LIMIT:
4005                 *pu16WID_Value = hif_drv->cfg_values.long_retry_limit;
4006                 break;
4007
4008         case WID_FRAG_THRESHOLD:
4009                 *pu16WID_Value = hif_drv->cfg_values.frag_threshold;
4010                 break;
4011
4012         case WID_RTS_THRESHOLD:
4013                 *pu16WID_Value = hif_drv->cfg_values.rts_threshold;
4014                 break;
4015
4016         case WID_PREAMBLE:
4017                 *pu16WID_Value = (u16)hif_drv->cfg_values.preamble_type;
4018                 break;
4019
4020         case WID_SHORT_SLOT_ALLOWED:
4021                 *pu16WID_Value = (u16)hif_drv->cfg_values.short_slot_allowed;
4022                 break;
4023
4024         case WID_11N_TXOP_PROT_DISABLE:
4025                 *pu16WID_Value = (u16)hif_drv->cfg_values.txop_prot_disabled;
4026                 break;
4027
4028         case WID_BEACON_INTERVAL:
4029                 *pu16WID_Value = hif_drv->cfg_values.beacon_interval;
4030                 break;
4031
4032         case WID_DTIM_PERIOD:
4033                 *pu16WID_Value = (u16)hif_drv->cfg_values.dtim_period;
4034                 break;
4035
4036         case WID_SITE_SURVEY:
4037                 *pu16WID_Value = (u16)hif_drv->cfg_values.site_survey_enabled;
4038                 break;
4039
4040         case WID_SITE_SURVEY_SCAN_TIME:
4041                 *pu16WID_Value = hif_drv->cfg_values.site_survey_scan_time;
4042                 break;
4043
4044         case WID_ACTIVE_SCAN_TIME:
4045                 *pu16WID_Value = hif_drv->cfg_values.active_scan_time;
4046                 break;
4047
4048         case WID_PASSIVE_SCAN_TIME:
4049                 *pu16WID_Value = hif_drv->cfg_values.passive_scan_time;
4050                 break;
4051
4052         case WID_CURRENT_TX_RATE:
4053                 *pu16WID_Value = hif_drv->cfg_values.curr_tx_rate;
4054                 break;
4055
4056         default:
4057                 break;
4058         }
4059
4060         up(&hif_drv->sem_cfg_values);
4061
4062         return result;
4063 }
4064
4065 static void GetPeriodicRSSI(unsigned long arg)
4066 {
4067         struct host_if_drv *hif_drv = (struct host_if_drv *)arg;
4068
4069         if (!hif_drv)   {
4070                 PRINT_ER("Driver handler is NULL\n");
4071                 return;
4072         }
4073
4074         if (hif_drv->hif_state == HOST_IF_CONNECTED) {
4075                 s32 result = 0;
4076                 struct host_if_msg msg;
4077
4078                 memset(&msg, 0, sizeof(struct host_if_msg));
4079
4080                 msg.id = HOST_IF_MSG_GET_RSSI;
4081                 msg.drv = hif_drv;
4082
4083                 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4084                 if (result) {
4085                         PRINT_ER("Failed to send get host channel param's message queue ");
4086                         return;
4087                 }
4088         }
4089         periodic_rssi.data = (unsigned long)hif_drv;
4090         mod_timer(&periodic_rssi, jiffies + msecs_to_jiffies(5000));
4091 }
4092
4093 s32 host_int_init(struct net_device *dev, struct host_if_drv **hif_drv_handler)
4094 {
4095         s32 result = 0;
4096         struct host_if_drv *hif_drv;
4097         int err;
4098         perInterface_wlan_t *nic;
4099         struct wilc *wilc;
4100
4101         nic = netdev_priv(dev);
4102         wilc = nic->wilc;
4103
4104         PRINT_D(HOSTINF_DBG, "Initializing host interface for client %d\n", clients_count + 1);
4105
4106         scan_while_connected = false;
4107
4108         sema_init(&hif_sema_wait_response, 0);
4109
4110         hif_drv  = kzalloc(sizeof(struct host_if_drv), GFP_KERNEL);
4111         if (!hif_drv) {
4112                 result = -ENOMEM;
4113                 goto _fail_;
4114         }
4115         *hif_drv_handler = hif_drv;
4116         err = add_handler_in_list(hif_drv);
4117         if (err) {
4118                 result = -EFAULT;
4119                 goto _fail_timer_2;
4120         }
4121
4122         g_obtainingIP = false;
4123
4124         PRINT_D(HOSTINF_DBG, "Global handle pointer value=%p\n", hif_drv);
4125         if (clients_count == 0) {
4126                 sema_init(&hif_sema_thread, 0);
4127                 sema_init(&hif_sema_driver, 0);
4128                 sema_init(&hif_sema_deinit, 1);
4129         }
4130
4131         sema_init(&hif_drv->sem_test_key_block, 0);
4132         sema_init(&hif_drv->sem_test_disconn_block, 0);
4133         sema_init(&hif_drv->sem_get_rssi, 0);
4134         sema_init(&hif_drv->sem_get_link_speed, 0);
4135         sema_init(&hif_drv->sem_get_chnl, 0);
4136         sema_init(&hif_drv->sem_inactive_time, 0);
4137
4138         PRINT_D(HOSTINF_DBG, "INIT: CLIENT COUNT %d\n", clients_count);
4139
4140         if (clients_count == 0) {
4141                 result = wilc_mq_create(&hif_msg_q);
4142
4143                 if (result < 0) {
4144                         PRINT_ER("Failed to creat MQ\n");
4145                         goto _fail_;
4146                 }
4147
4148                 hif_thread_handler = kthread_run(hostIFthread, wilc,
4149                                                  "WILC_kthread");
4150
4151                 if (IS_ERR(hif_thread_handler)) {
4152                         PRINT_ER("Failed to creat Thread\n");
4153                         result = -EFAULT;
4154                         goto _fail_mq_;
4155                 }
4156                 setup_timer(&periodic_rssi, GetPeriodicRSSI,
4157                             (unsigned long)hif_drv);
4158                 mod_timer(&periodic_rssi, jiffies + msecs_to_jiffies(5000));
4159         }
4160
4161         setup_timer(&hif_drv->scan_timer, TimerCB_Scan, 0);
4162         setup_timer(&hif_drv->connect_timer, TimerCB_Connect, 0);
4163         setup_timer(&hif_drv->remain_on_ch_timer, ListenTimerCB, 0);
4164
4165         sema_init(&hif_drv->sem_cfg_values, 1);
4166         down(&hif_drv->sem_cfg_values);
4167
4168         hif_drv->hif_state = HOST_IF_IDLE;
4169         hif_drv->cfg_values.site_survey_enabled = SITE_SURVEY_OFF;
4170         hif_drv->cfg_values.scan_source = DEFAULT_SCAN;
4171         hif_drv->cfg_values.active_scan_time = ACTIVE_SCAN_TIME;
4172         hif_drv->cfg_values.passive_scan_time = PASSIVE_SCAN_TIME;
4173         hif_drv->cfg_values.curr_tx_rate = AUTORATE;
4174
4175         hif_drv->p2p_timeout = 0;
4176
4177         PRINT_INFO(HOSTINF_DBG, "Initialization values, Site survey value: %d\n Scan source: %d\n Active scan time: %d\n Passive scan time: %d\nCurrent tx Rate = %d\n",
4178                    hif_drv->cfg_values.site_survey_enabled,
4179                    hif_drv->cfg_values.scan_source,
4180                    hif_drv->cfg_values.active_scan_time,
4181                    hif_drv->cfg_values.passive_scan_time,
4182                    hif_drv->cfg_values.curr_tx_rate);
4183
4184         up(&hif_drv->sem_cfg_values);
4185
4186         clients_count++;
4187
4188         return result;
4189
4190 _fail_timer_2:
4191         up(&hif_drv->sem_cfg_values);
4192         del_timer_sync(&hif_drv->connect_timer);
4193         del_timer_sync(&hif_drv->scan_timer);
4194         kthread_stop(hif_thread_handler);
4195 _fail_mq_:
4196         wilc_mq_destroy(&hif_msg_q);
4197 _fail_:
4198         return result;
4199 }
4200
4201 s32 host_int_deinit(struct host_if_drv *hif_drv)
4202 {
4203         s32 result = 0;
4204         struct host_if_msg msg;
4205         int ret;
4206
4207         if (!hif_drv)   {
4208                 PRINT_ER("hif_drv = NULL\n");
4209                 return 0;
4210         }
4211
4212         down(&hif_sema_deinit);
4213
4214         terminated_handle = hif_drv;
4215         PRINT_D(HOSTINF_DBG, "De-initializing host interface for client %d\n", clients_count);
4216
4217         if (del_timer_sync(&hif_drv->scan_timer))
4218                 PRINT_D(HOSTINF_DBG, ">> Scan timer is active\n");
4219
4220         if (del_timer_sync(&hif_drv->connect_timer))
4221                 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
4222
4223         if (del_timer_sync(&periodic_rssi))
4224                 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
4225
4226         del_timer_sync(&hif_drv->remain_on_ch_timer);
4227
4228         host_int_set_wfi_drv_handler(NULL);
4229         down(&hif_sema_driver);
4230
4231         if (hif_drv->usr_scan_req.scan_result) {
4232                 hif_drv->usr_scan_req.scan_result(SCAN_EVENT_ABORTED, NULL,
4233                                                   hif_drv->usr_scan_req.arg, NULL);
4234                 hif_drv->usr_scan_req.scan_result = NULL;
4235         }
4236
4237         hif_drv->hif_state = HOST_IF_IDLE;
4238
4239         scan_while_connected = false;
4240
4241         memset(&msg, 0, sizeof(struct host_if_msg));
4242
4243         if (clients_count == 1) {
4244                 if (del_timer_sync(&periodic_rssi))
4245                         PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
4246
4247                 msg.id = HOST_IF_MSG_EXIT;
4248                 msg.drv = hif_drv;
4249
4250                 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4251                 if (result != 0)
4252                         PRINT_ER("Error in sending deinit's message queue message function: Error(%d)\n", result);
4253
4254                 down(&hif_sema_thread);
4255
4256                 wilc_mq_destroy(&hif_msg_q);
4257         }
4258
4259         down(&hif_drv->sem_cfg_values);
4260
4261         ret = remove_handler_in_list(hif_drv);
4262         if (ret)
4263                 result = -ENOENT;
4264
4265         kfree(hif_drv);
4266
4267         clients_count--;
4268         terminated_handle = NULL;
4269         up(&hif_sema_deinit);
4270         return result;
4271 }
4272
4273 void NetworkInfoReceived(u8 *pu8Buffer, u32 u32Length)
4274 {
4275         s32 result = 0;
4276         struct host_if_msg msg;
4277         int id;
4278         struct host_if_drv *hif_drv = NULL;
4279
4280         id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
4281         hif_drv = get_handler_from_id(id);
4282
4283         if (!hif_drv || hif_drv == terminated_handle)   {
4284                 PRINT_ER("NetworkInfo received but driver not init[%p]\n", hif_drv);
4285                 return;
4286         }
4287
4288         memset(&msg, 0, sizeof(struct host_if_msg));
4289
4290         msg.id = HOST_IF_MSG_RCVD_NTWRK_INFO;
4291         msg.drv = hif_drv;
4292
4293         msg.body.net_info.len = u32Length;
4294         msg.body.net_info.buffer = kmalloc(u32Length, GFP_KERNEL);
4295         memcpy(msg.body.net_info.buffer, pu8Buffer, u32Length);
4296
4297         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4298         if (result)
4299                 PRINT_ER("Error in sending network info message queue message parameters: Error(%d)\n", result);
4300 }
4301
4302 void GnrlAsyncInfoReceived(u8 *pu8Buffer, u32 u32Length)
4303 {
4304         s32 result = 0;
4305         struct host_if_msg msg;
4306         int id;
4307         struct host_if_drv *hif_drv = NULL;
4308
4309         down(&hif_sema_deinit);
4310
4311         id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
4312         hif_drv = get_handler_from_id(id);
4313         PRINT_D(HOSTINF_DBG, "General asynchronous info packet received\n");
4314
4315         if (!hif_drv || hif_drv == terminated_handle) {
4316                 PRINT_D(HOSTINF_DBG, "Wifi driver handler is equal to NULL\n");
4317                 up(&hif_sema_deinit);
4318                 return;
4319         }
4320
4321         if (!hif_drv->usr_conn_req.conn_result) {
4322                 PRINT_ER("Received mac status is not needed when there is no current Connect Reques\n");
4323                 up(&hif_sema_deinit);
4324                 return;
4325         }
4326
4327         memset(&msg, 0, sizeof(struct host_if_msg));
4328
4329         msg.id = HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO;
4330         msg.drv = hif_drv;
4331
4332         msg.body.async_info.len = u32Length;
4333         msg.body.async_info.buffer = kmalloc(u32Length, GFP_KERNEL);
4334         memcpy(msg.body.async_info.buffer, pu8Buffer, u32Length);
4335
4336         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4337         if (result)
4338                 PRINT_ER("Error in sending message queue asynchronous message info: Error(%d)\n", result);
4339
4340         up(&hif_sema_deinit);
4341 }
4342
4343 void host_int_ScanCompleteReceived(u8 *pu8Buffer, u32 u32Length)
4344 {
4345         s32 result = 0;
4346         struct host_if_msg msg;
4347         int id;
4348         struct host_if_drv *hif_drv = NULL;
4349
4350         id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
4351         hif_drv = get_handler_from_id(id);
4352
4353         PRINT_D(GENERIC_DBG, "Scan notification received %p\n", hif_drv);
4354
4355         if (!hif_drv || hif_drv == terminated_handle)
4356                 return;
4357
4358         if (hif_drv->usr_scan_req.scan_result) {
4359                 memset(&msg, 0, sizeof(struct host_if_msg));
4360
4361                 msg.id = HOST_IF_MSG_RCVD_SCAN_COMPLETE;
4362                 msg.drv = hif_drv;
4363
4364                 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4365                 if (result)
4366                         PRINT_ER("Error in sending message queue scan complete parameters: Error(%d)\n", result);
4367         }
4368
4369         return;
4370 }
4371
4372 s32 host_int_remain_on_channel(struct host_if_drv *hif_drv, u32 u32SessionID,
4373                                u32 u32duration, u16 chan,
4374                                wilc_remain_on_chan_expired RemainOnChanExpired,
4375                                wilc_remain_on_chan_ready RemainOnChanReady,
4376                                void *pvUserArg)
4377 {
4378         s32 result = 0;
4379         struct host_if_msg msg;
4380
4381         if (!hif_drv) {
4382                 PRINT_ER("driver is null\n");
4383                 return -EFAULT;
4384         }
4385
4386         memset(&msg, 0, sizeof(struct host_if_msg));
4387
4388         msg.id = HOST_IF_MSG_REMAIN_ON_CHAN;
4389         msg.body.remain_on_ch.ch = chan;
4390         msg.body.remain_on_ch.expired = RemainOnChanExpired;
4391         msg.body.remain_on_ch.ready = RemainOnChanReady;
4392         msg.body.remain_on_ch.arg = pvUserArg;
4393         msg.body.remain_on_ch.u32duration = u32duration;
4394         msg.body.remain_on_ch.id = u32SessionID;
4395         msg.drv = hif_drv;
4396
4397         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4398         if (result)
4399                 PRINT_ER("wilc mq send fail\n");
4400
4401         return result;
4402 }
4403
4404 s32 host_int_ListenStateExpired(struct host_if_drv *hif_drv, u32 u32SessionID)
4405 {
4406         s32 result = 0;
4407         struct host_if_msg msg;
4408
4409         if (!hif_drv) {
4410                 PRINT_ER("driver is null\n");
4411                 return -EFAULT;
4412         }
4413
4414         del_timer(&hif_drv->remain_on_ch_timer);
4415
4416         memset(&msg, 0, sizeof(struct host_if_msg));
4417         msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
4418         msg.drv = hif_drv;
4419         msg.body.remain_on_ch.id = u32SessionID;
4420
4421         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4422         if (result)
4423                 PRINT_ER("wilc mq send fail\n");
4424
4425         return result;
4426 }
4427
4428 s32 host_int_frame_register(struct host_if_drv *hif_drv, u16 u16FrameType, bool bReg)
4429 {
4430         s32 result = 0;
4431         struct host_if_msg msg;
4432
4433         if (!hif_drv) {
4434                 PRINT_ER("driver is null\n");
4435                 return -EFAULT;
4436         }
4437
4438         memset(&msg, 0, sizeof(struct host_if_msg));
4439
4440         msg.id = HOST_IF_MSG_REGISTER_FRAME;
4441         switch (u16FrameType) {
4442         case ACTION:
4443                 PRINT_D(HOSTINF_DBG, "ACTION\n");
4444                 msg.body.reg_frame.reg_id = ACTION_FRM_IDX;
4445                 break;
4446
4447         case PROBE_REQ:
4448                 PRINT_D(HOSTINF_DBG, "PROBE REQ\n");
4449                 msg.body.reg_frame.reg_id = PROBE_REQ_IDX;
4450                 break;
4451
4452         default:
4453                 PRINT_D(HOSTINF_DBG, "Not valid frame type\n");
4454                 break;
4455         }
4456         msg.body.reg_frame.frame_type = u16FrameType;
4457         msg.body.reg_frame.reg = bReg;
4458         msg.drv = hif_drv;
4459
4460         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4461         if (result)
4462                 PRINT_ER("wilc mq send fail\n");
4463
4464         return result;
4465 }
4466
4467 s32 host_int_add_beacon(struct host_if_drv *hif_drv, u32 u32Interval,
4468                         u32 u32DTIMPeriod, u32 u32HeadLen, u8 *pu8Head,
4469                         u32 u32TailLen, u8 *pu8Tail)
4470 {
4471         s32 result = 0;
4472         struct host_if_msg msg;
4473         struct beacon_attr *pstrSetBeaconParam = &msg.body.beacon_info;
4474
4475         if (!hif_drv) {
4476                 PRINT_ER("driver is null\n");
4477                 return -EFAULT;
4478         }
4479
4480         memset(&msg, 0, sizeof(struct host_if_msg));
4481
4482         PRINT_D(HOSTINF_DBG, "Setting adding beacon message queue params\n");
4483
4484         msg.id = HOST_IF_MSG_ADD_BEACON;
4485         msg.drv = hif_drv;
4486         pstrSetBeaconParam->interval = u32Interval;
4487         pstrSetBeaconParam->dtim_period = u32DTIMPeriod;
4488         pstrSetBeaconParam->head_len = u32HeadLen;
4489         pstrSetBeaconParam->head = kmemdup(pu8Head, u32HeadLen, GFP_KERNEL);
4490         if (!pstrSetBeaconParam->head) {
4491                 result = -ENOMEM;
4492                 goto ERRORHANDLER;
4493         }
4494         pstrSetBeaconParam->tail_len = u32TailLen;
4495
4496         if (u32TailLen > 0) {
4497                 pstrSetBeaconParam->tail = kmemdup(pu8Tail, u32TailLen,
4498                                                    GFP_KERNEL);
4499                 if (!pstrSetBeaconParam->tail) {
4500                         result = -ENOMEM;
4501                         goto ERRORHANDLER;
4502                 }
4503         } else {
4504                 pstrSetBeaconParam->tail = NULL;
4505         }
4506
4507         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4508         if (result)
4509                 PRINT_ER("wilc mq send fail\n");
4510
4511 ERRORHANDLER:
4512         if (result) {
4513                 kfree(pstrSetBeaconParam->head);
4514
4515                 kfree(pstrSetBeaconParam->tail);
4516         }
4517
4518         return result;
4519 }
4520
4521 int host_int_del_beacon(struct host_if_drv *hif_drv)
4522 {
4523         int result = 0;
4524         struct host_if_msg msg;
4525
4526         if (!hif_drv) {
4527                 PRINT_ER("driver is null\n");
4528                 return -EFAULT;
4529         }
4530
4531         msg.id = HOST_IF_MSG_DEL_BEACON;
4532         msg.drv = hif_drv;
4533         PRINT_D(HOSTINF_DBG, "Setting deleting beacon message queue params\n");
4534
4535         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4536         if (result)
4537                 PRINT_ER("wilc_mq_send fail\n");
4538
4539         return result;
4540 }
4541
4542 int host_int_add_station(struct host_if_drv *hif_drv,
4543                          struct add_sta_param *sta_param)
4544 {
4545         int result = 0;
4546         struct host_if_msg msg;
4547         struct add_sta_param *add_sta_info = &msg.body.add_sta_info;
4548
4549         if (!hif_drv) {
4550                 PRINT_ER("driver is null\n");
4551                 return -EFAULT;
4552         }
4553
4554         memset(&msg, 0, sizeof(struct host_if_msg));
4555
4556         PRINT_D(HOSTINF_DBG, "Setting adding station message queue params\n");
4557
4558         msg.id = HOST_IF_MSG_ADD_STATION;
4559         msg.drv = hif_drv;
4560
4561         memcpy(add_sta_info, sta_param, sizeof(struct add_sta_param));
4562         if (add_sta_info->rates_len > 0) {
4563                 add_sta_info->rates = kmemdup(sta_param->rates,
4564                                       add_sta_info->rates_len,
4565                                       GFP_KERNEL);
4566                 if (!add_sta_info->rates)
4567                         return -ENOMEM;
4568         }
4569
4570         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4571         if (result)
4572                 PRINT_ER("wilc_mq_send fail\n");
4573         return result;
4574 }
4575
4576 int host_int_del_station(struct host_if_drv *hif_drv, const u8 *mac_addr)
4577 {
4578         int result = 0;
4579         struct host_if_msg msg;
4580         struct del_sta *del_sta_info = &msg.body.del_sta_info;
4581
4582         if (!hif_drv) {
4583                 PRINT_ER("driver is null\n");
4584                 return -EFAULT;
4585         }
4586
4587         memset(&msg, 0, sizeof(struct host_if_msg));
4588
4589         PRINT_D(HOSTINF_DBG, "Setting deleting station message queue params\n");
4590
4591         msg.id = HOST_IF_MSG_DEL_STATION;
4592         msg.drv = hif_drv;
4593
4594         if (!mac_addr)
4595                 eth_broadcast_addr(del_sta_info->mac_addr);
4596         else
4597                 memcpy(del_sta_info->mac_addr, mac_addr, ETH_ALEN);
4598
4599         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4600         if (result)
4601                 PRINT_ER("wilc_mq_send fail\n");
4602         return result;
4603 }
4604
4605 s32 host_int_del_allstation(struct host_if_drv *hif_drv,
4606                             u8 pu8MacAddr[][ETH_ALEN])
4607 {
4608         s32 result = 0;
4609         struct host_if_msg msg;
4610         struct del_all_sta *pstrDelAllStationMsg = &msg.body.del_all_sta_info;
4611         u8 au8Zero_Buff[ETH_ALEN] = {0};
4612         u32 i;
4613         u8 u8AssocNumb = 0;
4614
4615         if (!hif_drv) {
4616                 PRINT_ER("driver is null\n");
4617                 return -EFAULT;
4618         }
4619
4620         memset(&msg, 0, sizeof(struct host_if_msg));
4621
4622         PRINT_D(HOSTINF_DBG, "Setting deauthenticating station message queue params\n");
4623
4624         msg.id = HOST_IF_MSG_DEL_ALL_STA;
4625         msg.drv = hif_drv;
4626
4627         for (i = 0; i < MAX_NUM_STA; i++) {
4628                 if (memcmp(pu8MacAddr[i], au8Zero_Buff, ETH_ALEN)) {
4629                         memcpy(pstrDelAllStationMsg->del_all_sta[i], pu8MacAddr[i], ETH_ALEN);
4630                         PRINT_D(CFG80211_DBG, "BSSID = %x%x%x%x%x%x\n",
4631                                 pstrDelAllStationMsg->del_all_sta[i][0],
4632                                 pstrDelAllStationMsg->del_all_sta[i][1],
4633                                 pstrDelAllStationMsg->del_all_sta[i][2],
4634                                 pstrDelAllStationMsg->del_all_sta[i][3],
4635                                 pstrDelAllStationMsg->del_all_sta[i][4],
4636                                 pstrDelAllStationMsg->del_all_sta[i][5]);
4637                         u8AssocNumb++;
4638                 }
4639         }
4640         if (!u8AssocNumb) {
4641                 PRINT_D(CFG80211_DBG, "NO ASSOCIATED STAS\n");
4642                 return result;
4643         }
4644
4645         pstrDelAllStationMsg->assoc_sta = u8AssocNumb;
4646         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4647
4648         if (result)
4649                 PRINT_ER("wilc_mq_send fail\n");
4650
4651         down(&hif_sema_wait_response);
4652
4653         return result;
4654 }
4655
4656 s32 host_int_edit_station(struct host_if_drv *hif_drv,
4657                           struct add_sta_param *pstrStaParams)
4658 {
4659         s32 result = 0;
4660         struct host_if_msg msg;
4661         struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
4662
4663         if (!hif_drv) {
4664                 PRINT_ER("driver is null\n");
4665                 return -EFAULT;
4666         }
4667
4668         PRINT_D(HOSTINF_DBG, "Setting editing station message queue params\n");
4669
4670         memset(&msg, 0, sizeof(struct host_if_msg));
4671
4672         msg.id = HOST_IF_MSG_EDIT_STATION;
4673         msg.drv = hif_drv;
4674
4675         memcpy(pstrAddStationMsg, pstrStaParams, sizeof(struct add_sta_param));
4676         if (pstrAddStationMsg->rates_len > 0) {
4677                 u8 *rates = kmalloc(pstrAddStationMsg->rates_len, GFP_KERNEL);
4678
4679                 if (!rates)
4680                         return -ENOMEM;
4681
4682                 memcpy(rates, pstrStaParams->rates,
4683                        pstrAddStationMsg->rates_len);
4684                 pstrAddStationMsg->rates = rates;
4685         }
4686
4687         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4688         if (result)
4689                 PRINT_ER("wilc_mq_send fail\n");
4690
4691         return result;
4692 }
4693
4694 s32 host_int_set_power_mgmt(struct host_if_drv *hif_drv,
4695                             bool bIsEnabled,
4696                             u32 u32Timeout)
4697 {
4698         s32 result = 0;
4699         struct host_if_msg msg;
4700         struct power_mgmt_param *pstrPowerMgmtParam = &msg.body.pwr_mgmt_info;
4701
4702         PRINT_INFO(HOSTINF_DBG, "\n\n>> Setting PS to %d <<\n\n", bIsEnabled);
4703
4704         if (!hif_drv) {
4705                 PRINT_ER("driver is null\n");
4706                 return -EFAULT;
4707         }
4708
4709         PRINT_D(HOSTINF_DBG, "Setting Power management message queue params\n");
4710
4711         memset(&msg, 0, sizeof(struct host_if_msg));
4712
4713         msg.id = HOST_IF_MSG_POWER_MGMT;
4714         msg.drv = hif_drv;
4715
4716         pstrPowerMgmtParam->enabled = bIsEnabled;
4717         pstrPowerMgmtParam->timeout = u32Timeout;
4718
4719         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4720         if (result)
4721                 PRINT_ER("wilc_mq_send fail\n");
4722         return result;
4723 }
4724
4725 s32 host_int_setup_multicast_filter(struct host_if_drv *hif_drv,
4726                                     bool bIsEnabled,
4727                                     u32 u32count)
4728 {
4729         s32 result = 0;
4730         struct host_if_msg msg;
4731         struct set_multicast *pstrMulticastFilterParam = &msg.body.multicast_info;
4732
4733         if (!hif_drv) {
4734                 PRINT_ER("driver is null\n");
4735                 return -EFAULT;
4736         }
4737
4738         PRINT_D(HOSTINF_DBG, "Setting Multicast Filter params\n");
4739
4740         memset(&msg, 0, sizeof(struct host_if_msg));
4741
4742         msg.id = HOST_IF_MSG_SET_MULTICAST_FILTER;
4743         msg.drv = hif_drv;
4744
4745         pstrMulticastFilterParam->enabled = bIsEnabled;
4746         pstrMulticastFilterParam->cnt = u32count;
4747
4748         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4749         if (result)
4750                 PRINT_ER("wilc_mq_send fail\n");
4751         return result;
4752 }
4753
4754 static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo)
4755 {
4756         struct join_bss_param *pNewJoinBssParam = NULL;
4757         u8 *pu8IEs;
4758         u16 u16IEsLen;
4759         u16 index = 0;
4760         u8 suppRatesNo = 0;
4761         u8 extSuppRatesNo;
4762         u16 jumpOffset;
4763         u8 pcipherCount;
4764         u8 authCount;
4765         u8 pcipherTotalCount = 0;
4766         u8 authTotalCount = 0;
4767         u8 i, j;
4768
4769         pu8IEs = ptstrNetworkInfo->pu8IEs;
4770         u16IEsLen = ptstrNetworkInfo->u16IEsLen;
4771
4772         pNewJoinBssParam = kzalloc(sizeof(struct join_bss_param), GFP_KERNEL);
4773         if (pNewJoinBssParam) {
4774                 pNewJoinBssParam->dtim_period = ptstrNetworkInfo->u8DtimPeriod;
4775                 pNewJoinBssParam->beacon_period = ptstrNetworkInfo->u16BeaconPeriod;
4776                 pNewJoinBssParam->cap_info = ptstrNetworkInfo->u16CapInfo;
4777                 memcpy(pNewJoinBssParam->au8bssid, ptstrNetworkInfo->au8bssid, 6);
4778                 memcpy((u8 *)pNewJoinBssParam->ssid, ptstrNetworkInfo->au8ssid, ptstrNetworkInfo->u8SsidLen + 1);
4779                 pNewJoinBssParam->ssid_len = ptstrNetworkInfo->u8SsidLen;
4780                 memset(pNewJoinBssParam->rsn_pcip_policy, 0xFF, 3);
4781                 memset(pNewJoinBssParam->rsn_auth_policy, 0xFF, 3);
4782
4783                 while (index < u16IEsLen) {
4784                         if (pu8IEs[index] == SUPP_RATES_IE) {
4785                                 suppRatesNo = pu8IEs[index + 1];
4786                                 pNewJoinBssParam->supp_rates[0] = suppRatesNo;
4787                                 index += 2;
4788
4789                                 for (i = 0; i < suppRatesNo; i++)
4790                                         pNewJoinBssParam->supp_rates[i + 1] = pu8IEs[index + i];
4791
4792                                 index += suppRatesNo;
4793                                 continue;
4794                         } else if (pu8IEs[index] == EXT_SUPP_RATES_IE) {
4795                                 extSuppRatesNo = pu8IEs[index + 1];
4796                                 if (extSuppRatesNo > (MAX_RATES_SUPPORTED - suppRatesNo))
4797                                         pNewJoinBssParam->supp_rates[0] = MAX_RATES_SUPPORTED;
4798                                 else
4799                                         pNewJoinBssParam->supp_rates[0] += extSuppRatesNo;
4800                                 index += 2;
4801                                 for (i = 0; i < (pNewJoinBssParam->supp_rates[0] - suppRatesNo); i++)
4802                                         pNewJoinBssParam->supp_rates[suppRatesNo + i + 1] = pu8IEs[index + i];
4803
4804                                 index += extSuppRatesNo;
4805                                 continue;
4806                         } else if (pu8IEs[index] == HT_CAPABILITY_IE) {
4807                                 pNewJoinBssParam->ht_capable = true;
4808                                 index += pu8IEs[index + 1] + 2;
4809                                 continue;
4810                         } else if ((pu8IEs[index] == WMM_IE) &&
4811                                    (pu8IEs[index + 2] == 0x00) && (pu8IEs[index + 3] == 0x50) &&
4812                                    (pu8IEs[index + 4] == 0xF2) &&
4813                                    (pu8IEs[index + 5] == 0x02) &&
4814                                    ((pu8IEs[index + 6] == 0x00) || (pu8IEs[index + 6] == 0x01)) &&
4815                                    (pu8IEs[index + 7] == 0x01)) {
4816                                 pNewJoinBssParam->wmm_cap = true;
4817
4818                                 if (pu8IEs[index + 8] & BIT(7))
4819                                         pNewJoinBssParam->uapsd_cap = true;
4820                                 index += pu8IEs[index + 1] + 2;
4821                                 continue;
4822                         } else if ((pu8IEs[index] == P2P_IE) &&
4823                                  (pu8IEs[index + 2] == 0x50) && (pu8IEs[index + 3] == 0x6f) &&
4824                                  (pu8IEs[index + 4] == 0x9a) &&
4825                                  (pu8IEs[index + 5] == 0x09) && (pu8IEs[index + 6] == 0x0c)) {
4826                                 u16 u16P2P_count;
4827
4828                                 pNewJoinBssParam->tsf = ptstrNetworkInfo->u32Tsf;
4829                                 pNewJoinBssParam->noa_enabled = 1;
4830                                 pNewJoinBssParam->idx = pu8IEs[index + 9];
4831
4832                                 if (pu8IEs[index + 10] & BIT(7)) {
4833                                         pNewJoinBssParam->opp_enabled = 1;
4834                                         pNewJoinBssParam->ct_window = pu8IEs[index + 10];
4835                                 } else {
4836                                         pNewJoinBssParam->opp_enabled = 0;
4837                                 }
4838
4839                                 PRINT_D(GENERIC_DBG, "P2P Dump\n");
4840                                 for (i = 0; i < pu8IEs[index + 7]; i++)
4841                                         PRINT_D(GENERIC_DBG, " %x\n", pu8IEs[index + 9 + i]);
4842
4843                                 pNewJoinBssParam->cnt = pu8IEs[index + 11];
4844                                 u16P2P_count = index + 12;
4845
4846                                 memcpy(pNewJoinBssParam->duration, pu8IEs + u16P2P_count, 4);
4847                                 u16P2P_count += 4;
4848
4849                                 memcpy(pNewJoinBssParam->interval, pu8IEs + u16P2P_count, 4);
4850                                 u16P2P_count += 4;
4851
4852                                 memcpy(pNewJoinBssParam->start_time, pu8IEs + u16P2P_count, 4);
4853
4854                                 index += pu8IEs[index + 1] + 2;
4855                                 continue;
4856
4857                         } else if ((pu8IEs[index] == RSN_IE) ||
4858                                  ((pu8IEs[index] == WPA_IE) && (pu8IEs[index + 2] == 0x00) &&
4859                                   (pu8IEs[index + 3] == 0x50) && (pu8IEs[index + 4] == 0xF2) &&
4860                                   (pu8IEs[index + 5] == 0x01))) {
4861                                 u16 rsnIndex = index;
4862
4863                                 if (pu8IEs[rsnIndex] == RSN_IE) {
4864                                         pNewJoinBssParam->mode_802_11i = 2;
4865                                 } else {
4866                                         if (pNewJoinBssParam->mode_802_11i == 0)
4867                                                 pNewJoinBssParam->mode_802_11i = 1;
4868                                         rsnIndex += 4;
4869                                 }
4870
4871                                 rsnIndex += 7;
4872                                 pNewJoinBssParam->rsn_grp_policy = pu8IEs[rsnIndex];
4873                                 rsnIndex++;
4874                                 jumpOffset = pu8IEs[rsnIndex] * 4;
4875                                 pcipherCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
4876                                 rsnIndex += 2;
4877
4878                                 for (i = pcipherTotalCount, j = 0; i < pcipherCount + pcipherTotalCount && i < 3; i++, j++)
4879                                         pNewJoinBssParam->rsn_pcip_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
4880
4881                                 pcipherTotalCount += pcipherCount;
4882                                 rsnIndex += jumpOffset;
4883
4884                                 jumpOffset = pu8IEs[rsnIndex] * 4;
4885
4886                                 authCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
4887                                 rsnIndex += 2;
4888
4889                                 for (i = authTotalCount, j = 0; i < authTotalCount + authCount; i++, j++)
4890                                         pNewJoinBssParam->rsn_auth_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
4891
4892                                 authTotalCount += authCount;
4893                                 rsnIndex += jumpOffset;
4894
4895                                 if (pu8IEs[index] == RSN_IE) {
4896                                         pNewJoinBssParam->rsn_cap[0] = pu8IEs[rsnIndex];
4897                                         pNewJoinBssParam->rsn_cap[1] = pu8IEs[rsnIndex + 1];
4898                                         rsnIndex += 2;
4899                                 }
4900                                 pNewJoinBssParam->rsn_found = true;
4901                                 index += pu8IEs[index + 1] + 2;
4902                                 continue;
4903                         } else
4904                                 index += pu8IEs[index + 1] + 2;
4905                 }
4906         }
4907
4908         return (void *)pNewJoinBssParam;
4909 }
4910
4911 void host_int_freeJoinParams(void *pJoinParams)
4912 {
4913         if ((struct bss_param *)pJoinParams)
4914                 kfree((struct bss_param *)pJoinParams);
4915         else
4916                 PRINT_ER("Unable to FREE null pointer\n");
4917 }
4918
4919 s32 host_int_delBASession(struct host_if_drv *hif_drv, char *pBSSID, char TID)
4920 {
4921         s32 result = 0;
4922         struct host_if_msg msg;
4923         struct ba_session_info *pBASessionInfo = &msg.body.session_info;
4924
4925         if (!hif_drv) {
4926                 PRINT_ER("driver is null\n");
4927                 return -EFAULT;
4928         }
4929
4930         memset(&msg, 0, sizeof(struct host_if_msg));
4931
4932         msg.id = HOST_IF_MSG_DEL_BA_SESSION;
4933
4934         memcpy(pBASessionInfo->bssid, pBSSID, ETH_ALEN);
4935         pBASessionInfo->tid = TID;
4936         msg.drv = hif_drv;
4937
4938         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4939         if (result)
4940                 PRINT_ER("wilc_mq_send fail\n");
4941
4942         down(&hif_sema_wait_response);
4943
4944         return result;
4945 }
4946
4947 s32 host_int_del_All_Rx_BASession(struct host_if_drv *hif_drv,
4948                                   char *pBSSID,
4949                                   char TID)
4950 {
4951         s32 result = 0;
4952         struct host_if_msg msg;
4953         struct ba_session_info *pBASessionInfo = &msg.body.session_info;
4954
4955         if (!hif_drv) {
4956                 PRINT_ER("driver is null\n");
4957                 return -EFAULT;
4958         }
4959
4960         memset(&msg, 0, sizeof(struct host_if_msg));
4961
4962         msg.id = HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS;
4963
4964         memcpy(pBASessionInfo->bssid, pBSSID, ETH_ALEN);
4965         pBASessionInfo->tid = TID;
4966         msg.drv = hif_drv;
4967
4968         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4969         if (result)
4970                 PRINT_ER("wilc_mq_send fail\n");
4971
4972         down(&hif_sema_wait_response);
4973
4974         return result;
4975 }
4976
4977 s32 host_int_setup_ipaddress(struct host_if_drv *hif_drv, u8 *u16ipadd, u8 idx)
4978 {
4979         s32 result = 0;
4980         struct host_if_msg msg;
4981
4982         return 0;
4983
4984         if (!hif_drv) {
4985                 PRINT_ER("driver is null\n");
4986                 return -EFAULT;
4987         }
4988
4989         memset(&msg, 0, sizeof(struct host_if_msg));
4990
4991         msg.id = HOST_IF_MSG_SET_IPADDRESS;
4992
4993         msg.body.ip_info.ip_addr = u16ipadd;
4994         msg.drv = hif_drv;
4995         msg.body.ip_info.idx = idx;
4996
4997         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4998         if (result)
4999                 PRINT_ER("wilc_mq_send fail\n");
5000
5001         return result;
5002 }
5003
5004 s32 host_int_get_ipaddress(struct host_if_drv *hif_drv, u8 *u16ipadd, u8 idx)
5005 {
5006         s32 result = 0;
5007         struct host_if_msg msg;
5008
5009         if (!hif_drv) {
5010                 PRINT_ER("driver is null\n");
5011                 return -EFAULT;
5012         }
5013
5014         memset(&msg, 0, sizeof(struct host_if_msg));
5015
5016         msg.id = HOST_IF_MSG_GET_IPADDRESS;
5017
5018         msg.body.ip_info.ip_addr = u16ipadd;
5019         msg.drv = hif_drv;
5020         msg.body.ip_info.idx = idx;
5021
5022         result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
5023         if (result)
5024                 PRINT_ER("wilc_mq_send fail\n");
5025
5026         return result;
5027 }