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