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