blob: 2d12672e7c18dcdade4e7fb3ae9e7291741aba25 [file] [log] [blame]
Chaehyun Lime215a872015-09-30 08:15:41 +09001#include <linux/slab.h>
2#include <linux/time.h>
3#include <linux/kthread.h>
4#include <linux/delay.h>
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005#include "host_interface.h"
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006#include "coreconfigurator.h"
Chaehyun Lim53660122015-09-17 16:48:49 +09007#include "wilc_wlan_if.h"
Chaehyun Limf23eb982015-09-23 18:03:47 +09008#include "wilc_msgqueue.h"
Shraddha Barke281dd5a2015-10-05 17:00:33 +05309#include <linux/etherdevice.h>
Glen Leed53822192015-10-27 18:27:49 +090010#include "wilc_wfi_netdevice.h"
Johnny Kimc5c77ba2015-05-11 14:30:56 +090011
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +090012extern u8 connecting;
Johnny Kimc5c77ba2015-05-11 14:30:56 +090013
Greg Kroah-Hartmanda711eb2015-08-14 19:46:06 -070014extern struct timer_list hDuringIpTimer;
Johnny Kimc5c77ba2015-05-11 14:30:56 +090015
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +090016extern u8 g_wilc_initialized;
Johnny Kimc5c77ba2015-05-11 14:30:56 +090017
Chaehyun Lim9eac3a12015-06-18 22:08:51 +090018#define HOST_IF_MSG_SCAN 0
19#define HOST_IF_MSG_CONNECT 1
20#define HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO 2
21#define HOST_IF_MSG_KEY 3
22#define HOST_IF_MSG_RCVD_NTWRK_INFO 4
23#define HOST_IF_MSG_RCVD_SCAN_COMPLETE 5
24#define HOST_IF_MSG_CFG_PARAMS 6
25#define HOST_IF_MSG_SET_CHANNEL 7
26#define HOST_IF_MSG_DISCONNECT 8
27#define HOST_IF_MSG_GET_RSSI 9
28#define HOST_IF_MSG_GET_CHNL 10
29#define HOST_IF_MSG_ADD_BEACON 11
30#define HOST_IF_MSG_DEL_BEACON 12
31#define HOST_IF_MSG_ADD_STATION 13
32#define HOST_IF_MSG_DEL_STATION 14
33#define HOST_IF_MSG_EDIT_STATION 15
34#define HOST_IF_MSG_SCAN_TIMER_FIRED 16
35#define HOST_IF_MSG_CONNECT_TIMER_FIRED 17
36#define HOST_IF_MSG_POWER_MGMT 18
37#define HOST_IF_MSG_GET_INACTIVETIME 19
38#define HOST_IF_MSG_REMAIN_ON_CHAN 20
39#define HOST_IF_MSG_REGISTER_FRAME 21
40#define HOST_IF_MSG_LISTEN_TIMER_FIRED 22
41#define HOST_IF_MSG_GET_LINKSPEED 23
42#define HOST_IF_MSG_SET_WFIDRV_HANDLER 24
43#define HOST_IF_MSG_SET_MAC_ADDRESS 25
44#define HOST_IF_MSG_GET_MAC_ADDRESS 26
45#define HOST_IF_MSG_SET_OPERATION_MODE 27
46#define HOST_IF_MSG_SET_IPADDRESS 28
47#define HOST_IF_MSG_GET_IPADDRESS 29
48#define HOST_IF_MSG_FLUSH_CONNECT 30
49#define HOST_IF_MSG_GET_STATISTICS 31
50#define HOST_IF_MSG_SET_MULTICAST_FILTER 32
51#define HOST_IF_MSG_ADD_BA_SESSION 33
52#define HOST_IF_MSG_DEL_BA_SESSION 34
53#define HOST_IF_MSG_Q_IDLE 35
54#define HOST_IF_MSG_DEL_ALL_STA 36
55#define HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS 34
56#define HOST_IF_MSG_EXIT 100
Johnny Kimc5c77ba2015-05-11 14:30:56 +090057
Chaehyun Lime54d5b72015-06-18 22:08:50 +090058#define HOST_IF_SCAN_TIMEOUT 4000
59#define HOST_IF_CONNECT_TIMEOUT 9500
Johnny Kimc5c77ba2015-05-11 14:30:56 +090060
Chaehyun Lime54d5b72015-06-18 22:08:50 +090061#define BA_SESSION_DEFAULT_BUFFER_SIZE 16
62#define BA_SESSION_DEFAULT_TIMEOUT 1000
63#define BLOCK_ACK_REQ_SIZE 0x14
Leo Kim9f3295a2015-10-19 18:26:10 +090064#define FALSE_FRMWR_CHANNEL 100
Johnny Kimc5c77ba2015-05-11 14:30:56 +090065
Tony Cho361ff842015-09-21 12:16:41 +090066struct cfg_param_attr {
Tony Cho221371e2015-10-12 16:56:06 +090067 struct cfg_param_val cfg_attr_info;
Tony Cho361ff842015-09-21 12:16:41 +090068};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090069
Leo Kim4372d3d2015-10-05 15:25:43 +090070struct host_if_wpa_attr {
Leo Kim124968fc2015-10-13 19:49:30 +090071 u8 *key;
Leo Kim248080a2015-10-13 19:49:31 +090072 const u8 *mac_addr;
Leo Kim0e74c002015-10-13 19:49:32 +090073 u8 *seq;
Leo Kimdacc5942015-10-13 19:49:33 +090074 u8 seq_len;
Leo Kime2dfbac2015-10-13 19:49:34 +090075 u8 index;
Leo Kim6acf2912015-10-13 19:49:35 +090076 u8 key_len;
Leo Kim7b2ebb22015-10-13 19:49:36 +090077 u8 mode;
Leo Kim4372d3d2015-10-05 15:25:43 +090078};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090079
Leo Kimc276c442015-10-05 15:25:42 +090080struct host_if_wep_attr {
Tony Choe5538d32015-10-12 16:56:11 +090081 u8 *key;
Tony Chod520e352015-10-12 16:56:12 +090082 u8 key_len;
Tony Cho259b3aa2015-10-12 16:56:13 +090083 u8 index;
Tony Chob5eaff12015-10-12 16:56:14 +090084 u8 mode;
Tony Cho7fa252e2015-10-12 16:56:15 +090085 enum AUTHTYPE auth_type;
Leo Kimc276c442015-10-05 15:25:42 +090086};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090087
Leo Kim40cc2c92015-10-05 15:25:41 +090088union host_if_key_attr {
Tony Cho2ed7a2f2015-10-12 16:56:08 +090089 struct host_if_wep_attr wep;
Tony Choe3501a42015-10-12 16:56:09 +090090 struct host_if_wpa_attr wpa;
Tony Cho610e3862015-10-12 16:56:10 +090091 struct host_if_pmkid_attr pmkid;
Leo Kim40cc2c92015-10-05 15:25:41 +090092};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090093
Tony Choc98387a2015-09-21 12:16:40 +090094struct key_attr {
Leo Kim8e9f4272015-10-13 19:49:27 +090095 enum KEY_TYPE type;
Leo Kim0d17e382015-10-13 19:49:28 +090096 u8 action;
Leo Kim73b2e382015-10-13 19:49:29 +090097 union host_if_key_attr attr;
Tony Choc98387a2015-09-21 12:16:40 +090098};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090099
Tony Choc476feb2015-09-21 12:16:36 +0900100struct scan_attr {
Leo Kim42568892015-10-13 19:49:37 +0900101 u8 src;
Leo Kim1e276c82015-10-13 19:49:38 +0900102 u8 type;
Leo Kim82eeb0a2015-10-13 19:49:40 +0900103 u8 *ch_freq_list;
Leo Kimf97bd9c2015-10-13 19:49:41 +0900104 u8 ch_list_len;
Leo Kimd6f19aa2015-10-13 19:49:42 +0900105 u8 *ies;
Leo Kim7b1f76c2015-10-13 19:49:43 +0900106 size_t ies_len;
Leo Kimc17c6da2015-10-13 19:49:44 +0900107 wilc_scan_result result;
Leo Kim5f2b50c2015-10-13 19:49:45 +0900108 void *arg;
Leo Kim629b9ca2015-10-13 19:49:46 +0900109 struct hidden_network hidden_network;
Tony Choc476feb2015-09-21 12:16:36 +0900110};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900111
Tony Cho120ae592015-09-21 12:16:37 +0900112struct connect_attr {
Leo Kim9254db02015-10-13 19:49:49 +0900113 u8 *bssid;
Leo Kimf7bbd9c2015-10-13 19:49:50 +0900114 u8 *ssid;
Leo Kim8b3c9fa2015-10-13 19:49:51 +0900115 size_t ssid_len;
Leo Kim2ea158c2015-10-13 19:49:52 +0900116 u8 *ies;
Leo Kimb59d5c52015-10-13 19:49:53 +0900117 size_t ies_len;
Leo Kima64fd672015-10-13 19:49:54 +0900118 u8 security;
Leo Kim6abcc112015-10-13 19:49:55 +0900119 wilc_connect_result result;
Leo Kim8f38db82015-10-13 19:49:56 +0900120 void *arg;
Leo Kim61b4fd02015-10-13 19:49:57 +0900121 enum AUTHTYPE auth_type;
Leo Kim0d1527e2015-10-13 19:49:58 +0900122 u8 ch;
Leo Kimf2bed2c2015-10-13 19:49:59 +0900123 void *params;
Tony Cho120ae592015-09-21 12:16:37 +0900124};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900125
Tony Chof23a9ea2015-09-21 12:16:39 +0900126struct rcvd_async_info {
Leo Kim33722ac72015-10-13 19:50:00 +0900127 u8 *buffer;
Leo Kimf94f4882015-10-13 19:50:01 +0900128 u32 len;
Tony Chof23a9ea2015-09-21 12:16:39 +0900129};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900130
Tony Cho94bdfe42015-09-30 18:44:27 +0900131struct channel_attr {
Leo Kim730ee052015-10-13 19:50:02 +0900132 u8 set_ch;
Tony Cho326b3232015-09-21 12:16:42 +0900133};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900134
Tony Cho7f33fec2015-09-30 18:44:30 +0900135struct beacon_attr {
Leo Kim12262dd2015-10-13 19:50:03 +0900136 u32 interval;
Leo Kime76ab772015-10-13 19:50:04 +0900137 u32 dtim_period;
Leo Kim51c66182015-10-13 19:50:05 +0900138 u32 head_len;
Leo Kim8ce528b2015-10-13 19:50:06 +0900139 u8 *head;
Leo Kim030c57e2015-10-13 19:50:07 +0900140 u32 tail_len;
Leo Kim7dbcb6d32015-10-13 19:50:08 +0900141 u8 *tail;
Tony Cho902362b2015-09-21 12:16:44 +0900142};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900143
Tony Cho641210a2015-09-21 12:16:52 +0900144struct set_multicast {
Leo Kimbae636eb2015-10-13 20:02:04 +0900145 bool enabled;
Leo Kimadab2f72015-10-13 20:02:05 +0900146 u32 cnt;
Tony Cho641210a2015-09-21 12:16:52 +0900147};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900148
Tony Chob4e644e2015-09-21 12:17:00 +0900149struct del_all_sta {
Leo Kime51b9212015-10-13 19:50:09 +0900150 u8 del_all_sta[MAX_NUM_STA][ETH_ALEN];
Leo Kim8ba18032015-10-13 19:50:10 +0900151 u8 assoc_sta;
Tony Chob4e644e2015-09-21 12:17:00 +0900152};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900153
Tony Chofb93a1e2015-09-21 12:16:57 +0900154struct del_sta {
Leo Kime4839d32015-10-13 20:02:06 +0900155 u8 mac_addr[ETH_ALEN];
Tony Chofb93a1e2015-09-21 12:16:57 +0900156};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900157
Tony Cho5a008f12015-09-21 12:16:48 +0900158struct power_mgmt_param {
Leo Kim33c70c12015-10-13 20:02:07 +0900159 bool enabled;
Leo Kim937918f2015-10-13 20:02:08 +0900160 u32 timeout;
Tony Cho5a008f12015-09-21 12:16:48 +0900161};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900162
Tony Cho15191ea2015-09-21 12:16:50 +0900163struct set_ip_addr {
Leo Kim78675be2015-10-13 20:02:09 +0900164 u8 *ip_addr;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900165 u8 idx;
Tony Cho15191ea2015-09-21 12:16:50 +0900166};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900167
Tony Cho3d1eac02015-09-21 12:16:49 +0900168struct sta_inactive_t {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900169 u8 mac[6];
Tony Cho3d1eac02015-09-21 12:16:49 +0900170};
Leo Kimae4dfa52015-10-13 19:49:26 +0900171
Tony Chodfc76632015-09-21 12:16:34 +0900172union message_body {
Tony Cho4528bdb2015-09-30 18:44:20 +0900173 struct scan_attr scan_info;
Tony Cho3f501972015-09-30 18:44:21 +0900174 struct connect_attr con_info;
Tony Cho02d19462015-09-30 18:44:22 +0900175 struct rcvd_net_info net_info;
Tony Cho66add622015-09-30 18:44:23 +0900176 struct rcvd_async_info async_info;
Tony Cho18990bf2015-09-30 18:44:24 +0900177 struct key_attr key_info;
Tony Choa2340c32015-09-30 18:44:25 +0900178 struct cfg_param_attr cfg_info;
Tony Choffd6dbc2015-09-30 18:44:28 +0900179 struct channel_attr channel_info;
Tony Choa98491e2015-09-30 18:44:31 +0900180 struct beacon_attr beacon_info;
Tony Choca8f47f2015-09-30 18:44:32 +0900181 struct add_sta_param add_sta_info;
Tony Cho889c25b2015-09-30 18:44:33 +0900182 struct del_sta del_sta_info;
Tony Cho4a930962015-09-30 18:44:34 +0900183 struct add_sta_param edit_sta_info;
Tony Cho49e1f812015-09-30 18:44:36 +0900184 struct power_mgmt_param pwr_mgmt_info;
Tony Cho66bac7f2015-09-30 18:44:37 +0900185 struct sta_inactive_t mac_info;
Tony Chofb2d65e2015-09-30 18:44:39 +0900186 struct set_ip_addr ip_info;
Tony Cho5e4377e2015-09-30 18:44:38 +0900187 struct drv_handler drv;
Tony Choa079cf4d2015-09-30 18:55:05 +0900188 struct set_multicast multicast_info;
Tony Cho00c46302015-09-30 18:55:06 +0900189 struct op_mode mode;
Tony Cho15326e22015-09-30 18:55:07 +0900190 struct set_mac_addr set_mac_info;
Tony Choa5848692015-09-30 18:55:08 +0900191 struct get_mac_addr get_mac_info;
Tony Choc833b472015-09-30 18:55:09 +0900192 struct ba_session_info session_info;
Tony Cho070d3652015-09-30 18:55:10 +0900193 struct remain_ch remain_on_ch;
Tony Cho5c4008d2015-10-05 13:50:44 +0900194 struct reg_frame reg_frame;
Tony Choe60831e2015-10-05 13:50:45 +0900195 char *data;
Tony Chob0c1e802015-10-05 13:50:46 +0900196 struct del_all_sta del_all_sta_info;
Tony Chodfc76632015-09-21 12:16:34 +0900197};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900198
Tony Cho3a8c41b2015-09-18 18:11:04 +0900199struct host_if_msg {
Leo Kimae4dfa52015-10-13 19:49:26 +0900200 u16 id;
201 union message_body body;
Leo Kim2482a792015-10-12 16:55:36 +0900202 struct host_if_drv *drv;
Tony Cho3a8c41b2015-09-18 18:11:04 +0900203};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900204
Leo Kime0a12212015-10-12 16:55:49 +0900205struct join_bss_param {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900206 BSSTYPE_T bss_type;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900207 u8 dtim_period;
Chaehyun Limd85f5322015-06-11 14:35:54 +0900208 u16 beacon_period;
209 u16 cap_info;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900210 u8 au8bssid[6];
Dean Lee576917a2015-06-15 11:58:57 +0900211 char ssid[MAX_SSID_LEN];
Leo Kim619d27b2015-10-15 13:24:42 +0900212 u8 ssid_len;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900213 u8 supp_rates[MAX_RATES_SUPPORTED + 1];
214 u8 ht_capable;
215 u8 wmm_cap;
216 u8 uapsd_cap;
Dean Lee72ed4dc2015-06-12 14:11:44 +0900217 bool rsn_found;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900218 u8 rsn_grp_policy;
219 u8 mode_802_11i;
220 u8 rsn_pcip_policy[3];
221 u8 rsn_auth_policy[3];
222 u8 rsn_cap[2];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900223 u32 tsf;
Leo Kim7a8d51d2015-10-15 13:24:43 +0900224 u8 noa_enabled;
Leo Kimd72b33c2015-10-15 13:24:44 +0900225 u8 opp_enabled;
Leo Kim99b66942015-10-15 13:24:45 +0900226 u8 ct_window;
Leo Kimc21047e2015-10-15 13:24:46 +0900227 u8 cnt;
Leo Kimcc179002015-10-15 13:24:47 +0900228 u8 idx;
Leo Kim109e6ca2015-10-15 13:24:48 +0900229 u8 duration[4];
Leo Kim1d8b76b2015-10-15 13:24:49 +0900230 u8 interval[4];
Leo Kim4be55e22015-10-28 15:59:27 +0900231 u8 start_time[4];
Leo Kime0a12212015-10-12 16:55:49 +0900232};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900233
Leo Kim441dc602015-10-12 16:55:35 +0900234static struct host_if_drv *wfidrv_list[NUM_CONCURRENT_IFC + 1];
235struct host_if_drv *terminated_handle;
Leo Kimf2fc9f62015-10-13 19:49:47 +0900236bool g_obtainingIP;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900237u8 P2P_LISTEN_STATE;
Leo Kimc2115d82015-10-15 13:24:52 +0900238static struct task_struct *hif_thread_handler;
Leo Kimcb067dc2015-10-15 13:24:53 +0900239static WILC_MsgQueueHandle hif_msg_q;
Leo Kim834e0cb2015-10-15 13:24:54 +0900240static struct semaphore hif_sema_thread;
kbuild test robot413f9302015-10-15 14:07:41 +0800241static struct semaphore hif_sema_driver;
Leo Kim2d25af82015-10-15 13:24:56 +0900242static struct semaphore hif_sema_wait_response;
kbuild test robot17225002015-10-15 14:21:32 +0800243static struct semaphore hif_sema_deinit;
kbuild test robot24aadb82015-10-15 14:32:40 +0800244static struct timer_list periodic_rssi;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900245
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900246u8 gau8MulticastMacAddrList[WILC_MULTICAST_TABLE_SIZE][ETH_ALEN];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900247
Leo Kima633c0b2015-10-15 13:24:59 +0900248static u8 rcv_assoc_resp[MAX_ASSOC_RESP_FRAME_SIZE];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900249
kbuild test robotf64321c2015-10-15 14:46:26 +0800250static bool scan_while_connected;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900251
Leo Kim144b7b22015-10-15 13:25:01 +0900252static s8 rssi;
Leo Kim75327a02015-10-15 13:25:02 +0900253static s8 link_speed;
Leo Kim95ebb0f2015-10-15 13:25:03 +0900254static u8 ch_no;
Leo Kim078b1e92015-10-15 13:25:04 +0900255static u8 set_ip[2][4];
Leo Kim1e75d012015-10-15 13:25:05 +0900256static u8 get_ip[2][4];
Leo Kimad269062015-10-15 13:25:06 +0900257static u32 inactive_time;
Leo Kima74c7bf2015-10-15 13:25:07 +0900258static u8 del_beacon;
Leo Kim7178aed2015-10-19 18:26:09 +0900259static u32 clients_count;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900260
kbuild test robotef599192015-10-15 15:04:15 +0800261static u8 *join_req;
Leo Kim48ce2462015-10-15 13:25:10 +0900262u8 *info_element;
kbuild test robot23047d52015-10-15 15:18:34 +0800263static u8 mode_11i;
Leo Kimfba49892015-10-15 13:25:12 +0900264u8 auth_type;
Leo Kim0626baa2015-10-15 13:25:13 +0900265u32 join_req_size;
kbuild test robot5e0e7c22015-10-15 15:47:44 +0800266static u32 info_element_size;
kbuild test robot23fba592015-10-15 15:59:53 +0800267static struct host_if_drv *join_req_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900268#define REAL_JOIN_REQ 0
269#define FLUSHED_JOIN_REQ 1
Leo Kimae4dfa52015-10-13 19:49:26 +0900270#define FLUSHED_BYTE_POS 79
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900271
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900272static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900273
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900274extern void chip_sleep_manually(u32 u32SleepTime);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900275extern int linux_wlan_get_num_conn_ifcs(void);
276
Leo Kim441dc602015-10-12 16:55:35 +0900277static int add_handler_in_list(struct host_if_drv *handler)
Johnny Kimd42ab082015-08-20 16:32:52 +0900278{
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
Leo Kim441dc602015-10-12 16:55:35 +0900291static int remove_handler_in_list(struct host_if_drv *handler)
Johnny Kimd42ab082015-08-20 16:32:52 +0900292{
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
Leo Kim441dc602015-10-12 16:55:35 +0900305static int get_id_from_handler(struct host_if_drv *handler)
Johnny Kimd42ab082015-08-20 16:32:52 +0900306{
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
Leo Kim441dc602015-10-12 16:55:35 +0900320static struct host_if_drv *get_handler_from_id(int id)
Johnny Kimd42ab082015-08-20 16:32:52 +0900321{
Dan Carpenter6ae9ac02015-09-15 09:54:33 +0300322 if (id <= 0 || id >= ARRAY_SIZE(wfidrv_list))
Johnny Kimd42ab082015-08-20 16:32:52 +0900323 return NULL;
324 return wfidrv_list[id];
325}
326
Tony Choa4ab1ad2015-10-12 16:56:05 +0900327static s32 Handle_SetChannel(struct host_if_drv *hif_drv,
Tony Cho94bdfe42015-09-30 18:44:27 +0900328 struct channel_attr *pstrHostIFSetChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900329{
Leo Kim31390ee2015-10-19 18:26:08 +0900330 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900331 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900332
Leo Kim45102f82015-10-28 15:59:28 +0900333 wid.id = (u16)WID_CURRENT_CHANNEL;
334 wid.type = WID_CHAR;
335 wid.val = (char *)&pstrHostIFSetChan->set_ch;
336 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900337
338 PRINT_D(HOSTINF_DBG, "Setting channel\n");
Leo Kimae4dfa52015-10-13 19:49:26 +0900339
Leo Kim45102f82015-10-28 15:59:28 +0900340 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900341 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +0900342
343 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900344 PRINT_ER("Failed to set channel\n");
Leo Kim24db7132015-09-16 18:36:01 +0900345 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900346 }
347
Leo Kim31390ee2015-10-19 18:26:08 +0900348 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900349}
Leo Kimae4dfa52015-10-13 19:49:26 +0900350
Tony Choa4ab1ad2015-10-12 16:56:05 +0900351static s32 Handle_SetWfiDrvHandler(struct host_if_drv *hif_drv,
Tony Cho127f9d92015-09-21 12:16:51 +0900352 struct drv_handler *pstrHostIfSetDrvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900353{
Leo Kim31390ee2015-10-19 18:26:08 +0900354 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900355 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900356
Leo Kim45102f82015-10-28 15:59:28 +0900357 wid.id = (u16)WID_SET_DRV_HANDLER;
358 wid.type = WID_INT;
Leo Kima7f3b122015-10-28 15:59:29 +0900359 wid.val = (s8 *)&pstrHostIfSetDrvHandler->handler;
Leo Kim45102f82015-10-28 15:59:28 +0900360 wid.size = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900361
Leo Kim45102f82015-10-28 15:59:28 +0900362 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kima7f3b122015-10-28 15:59:29 +0900363 pstrHostIfSetDrvHandler->handler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900364
Tony Choa4ab1ad2015-10-12 16:56:05 +0900365 if (!hif_drv)
Leo Kim27ff2162015-10-15 13:24:55 +0900366 up(&hif_sema_driver);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900367
Leo Kim31390ee2015-10-19 18:26:08 +0900368 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900369 PRINT_ER("Failed to set driver handler\n");
Leo Kim24db7132015-09-16 18:36:01 +0900370 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900371 }
372
Leo Kim31390ee2015-10-19 18:26:08 +0900373 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900374}
375
Tony Choa4ab1ad2015-10-12 16:56:05 +0900376static s32 Handle_SetOperationMode(struct host_if_drv *hif_drv,
Tony Cho801bee52015-09-21 12:16:53 +0900377 struct op_mode *pstrHostIfSetOperationMode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900378{
Leo Kim31390ee2015-10-19 18:26:08 +0900379 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900380 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900381
Leo Kim45102f82015-10-28 15:59:28 +0900382 wid.id = (u16)WID_SET_OPERATION_MODE;
383 wid.type = WID_INT;
Leo Kimc96debf2015-10-28 15:59:30 +0900384 wid.val = (s8 *)&pstrHostIfSetOperationMode->mode;
Leo Kim45102f82015-10-28 15:59:28 +0900385 wid.size = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900386
Leo Kim45102f82015-10-28 15:59:28 +0900387 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900388 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900389
Leo Kimc96debf2015-10-28 15:59:30 +0900390 if ((pstrHostIfSetOperationMode->mode) == IDLE_MODE)
Leo Kim27ff2162015-10-15 13:24:55 +0900391 up(&hif_sema_driver);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900392
Leo Kim31390ee2015-10-19 18:26:08 +0900393 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900394 PRINT_ER("Failed to set driver handler\n");
Leo Kim24db7132015-09-16 18:36:01 +0900395 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900396 }
397
Leo Kim31390ee2015-10-19 18:26:08 +0900398 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900399}
400
Tony Choa4ab1ad2015-10-12 16:56:05 +0900401s32 Handle_set_IPAddress(struct host_if_drv *hif_drv, u8 *pu8IPAddr, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900402{
Leo Kim31390ee2015-10-19 18:26:08 +0900403 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900404 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900405 char firmwareIPAddress[4] = {0};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900406
407 if (pu8IPAddr[0] < 192)
408 pu8IPAddr[0] = 0;
409
Luis de Bethencourtb3a02832015-06-26 17:40:25 +0200410 PRINT_INFO(HOSTINF_DBG, "Indx = %d, Handling set IP = %pI4\n", idx, pu8IPAddr);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900411
Leo Kim078b1e92015-10-15 13:25:04 +0900412 memcpy(set_ip[idx], pu8IPAddr, IP_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900413
Leo Kim45102f82015-10-28 15:59:28 +0900414 wid.id = (u16)WID_IP_ADDRESS;
415 wid.type = WID_STR;
416 wid.val = (u8 *)pu8IPAddr;
417 wid.size = IP_ALEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900418
Leo Kim45102f82015-10-28 15:59:28 +0900419 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900420 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900421
Tony Choa4ab1ad2015-10-12 16:56:05 +0900422 host_int_get_ipaddress(hif_drv, firmwareIPAddress, idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900423
Leo Kim31390ee2015-10-19 18:26:08 +0900424 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +0900425 PRINT_ER("Failed to set IP address\n");
426 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900427 }
428
Leo Kim24db7132015-09-16 18:36:01 +0900429 PRINT_INFO(HOSTINF_DBG, "IP address set\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900430
Leo Kim31390ee2015-10-19 18:26:08 +0900431 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900432}
433
Tony Choa4ab1ad2015-10-12 16:56:05 +0900434s32 Handle_get_IPAddress(struct host_if_drv *hif_drv, u8 *pu8IPAddr, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900435{
Leo Kim31390ee2015-10-19 18:26:08 +0900436 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900437 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900438
Leo Kim45102f82015-10-28 15:59:28 +0900439 wid.id = (u16)WID_IP_ADDRESS;
440 wid.type = WID_STR;
441 wid.val = kmalloc(IP_ALEN, GFP_KERNEL);
442 wid.size = IP_ALEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900443
Leo Kim45102f82015-10-28 15:59:28 +0900444 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900445 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900446
Leo Kim45102f82015-10-28 15:59:28 +0900447 PRINT_INFO(HOSTINF_DBG, "%pI4\n", wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900448
Leo Kim45102f82015-10-28 15:59:28 +0900449 memcpy(get_ip[idx], wid.val, IP_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900450
Leo Kim45102f82015-10-28 15:59:28 +0900451 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900452
Leo Kim1e75d012015-10-15 13:25:05 +0900453 if (memcmp(get_ip[idx], set_ip[idx], IP_ALEN) != 0)
Leo Kim078b1e92015-10-15 13:25:04 +0900454 host_int_setup_ipaddress(hif_drv, set_ip[idx], idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900455
Leo Kim31390ee2015-10-19 18:26:08 +0900456 if (result != 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900457 PRINT_ER("Failed to get IP address\n");
Leo Kim24db7132015-09-16 18:36:01 +0900458 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900459 }
460
Leo Kim24db7132015-09-16 18:36:01 +0900461 PRINT_INFO(HOSTINF_DBG, "IP address retrieved:: u8IfIdx = %d\n", idx);
Leo Kim1e75d012015-10-15 13:25:05 +0900462 PRINT_INFO(HOSTINF_DBG, "%pI4\n", get_ip[idx]);
Leo Kim24db7132015-09-16 18:36:01 +0900463 PRINT_INFO(HOSTINF_DBG, "\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900464
Leo Kim31390ee2015-10-19 18:26:08 +0900465 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900466}
467
Tony Choa4ab1ad2015-10-12 16:56:05 +0900468static s32 Handle_SetMacAddress(struct host_if_drv *hif_drv,
Tony Chob7611a82015-09-21 12:16:54 +0900469 struct set_mac_addr *pstrHostIfSetMacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900470{
Leo Kim31390ee2015-10-19 18:26:08 +0900471 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900472 struct wid wid;
Glen Leef3052582015-09-10 12:03:04 +0900473 u8 *mac_buf = kmalloc(ETH_ALEN, GFP_KERNEL);
Leo Kimc09389a2015-10-28 15:59:24 +0900474
Leo Kim91109e12015-10-19 18:26:13 +0900475 if (!mac_buf) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900476 PRINT_ER("No buffer to send mac address\n");
Leo Kime6e12662015-09-16 18:36:03 +0900477 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900478 }
Leo Kimae5e4522015-10-28 15:59:31 +0900479 memcpy(mac_buf, pstrHostIfSetMacAddress->mac_addr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900480
Leo Kim45102f82015-10-28 15:59:28 +0900481 wid.id = (u16)WID_MAC_ADDR;
482 wid.type = WID_STR;
483 wid.val = mac_buf;
484 wid.size = ETH_ALEN;
485 PRINT_D(GENERIC_DBG, "mac addr = :%pM\n", wid.val);
Leo Kimae4dfa52015-10-13 19:49:26 +0900486
Leo Kim45102f82015-10-28 15:59:28 +0900487 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900488 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +0900489 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900490 PRINT_ER("Failed to set mac address\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900491 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900492 }
493
Chaehyun Lim49188af2015-08-11 10:32:41 +0900494 kfree(mac_buf);
Leo Kim31390ee2015-10-19 18:26:08 +0900495 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900496}
497
Tony Choa4ab1ad2015-10-12 16:56:05 +0900498static s32 Handle_GetMacAddress(struct host_if_drv *hif_drv,
Tony Chofcd27c52015-09-21 12:16:55 +0900499 struct get_mac_addr *pstrHostIfGetMacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900500{
Leo Kim31390ee2015-10-19 18:26:08 +0900501 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +0900502 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900503
Leo Kim45102f82015-10-28 15:59:28 +0900504 wid.id = (u16)WID_MAC_ADDR;
505 wid.type = WID_STR;
506 wid.val = pstrHostIfGetMacAddress->u8MacAddress;
507 wid.size = ETH_ALEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900508
Leo Kim45102f82015-10-28 15:59:28 +0900509 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900510 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +0900511
512 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900513 PRINT_ER("Failed to get mac address\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900514 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900515 }
Leo Kim2d25af82015-10-15 13:24:56 +0900516 up(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900517
Leo Kim31390ee2015-10-19 18:26:08 +0900518 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900519}
520
Tony Choa4ab1ad2015-10-12 16:56:05 +0900521static s32 Handle_CfgParam(struct host_if_drv *hif_drv,
Tony Cho361ff842015-09-21 12:16:41 +0900522 struct cfg_param_attr *strHostIFCfgParamAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900523{
Leo Kim31390ee2015-10-19 18:26:08 +0900524 s32 result = 0;
Leo Kime9e0c262015-10-12 16:55:41 +0900525 struct wid strWIDList[32];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900526 u8 u8WidCnt = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900527
Tony Choa4ab1ad2015-10-12 16:56:05 +0900528 down(&hif_drv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900529
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900530 PRINT_D(HOSTINF_DBG, "Setting CFG params\n");
531
Tony Cho87c05b22015-10-12 16:56:07 +0900532 if (strHostIFCfgParamAttr->cfg_attr_info.flag & BSS_TYPE) {
Tony Cho221371e2015-10-12 16:56:06 +0900533 if (strHostIFCfgParamAttr->cfg_attr_info.bss_type < 6) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900534 strWIDList[u8WidCnt].id = WID_BSS_TYPE;
Tony Cho221371e2015-10-12 16:56:06 +0900535 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.bss_type;
Leo Kim416d8322015-10-12 16:55:43 +0900536 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900537 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900538 hif_drv->strCfgValues.bss_type = (u8)strHostIFCfgParamAttr->cfg_attr_info.bss_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900539 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900540 PRINT_ER("check value 6 over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900541 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900542 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900543 }
544 u8WidCnt++;
545 }
Tony Cho87c05b22015-10-12 16:56:07 +0900546 if (strHostIFCfgParamAttr->cfg_attr_info.flag & AUTH_TYPE) {
Tony Cho221371e2015-10-12 16:56:06 +0900547 if ((strHostIFCfgParamAttr->cfg_attr_info.auth_type) == 1 || (strHostIFCfgParamAttr->cfg_attr_info.auth_type) == 2 || (strHostIFCfgParamAttr->cfg_attr_info.auth_type) == 5) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900548 strWIDList[u8WidCnt].id = WID_AUTH_TYPE;
Tony Cho221371e2015-10-12 16:56:06 +0900549 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.auth_type;
Leo Kim416d8322015-10-12 16:55:43 +0900550 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900551 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900552 hif_drv->strCfgValues.auth_type = (u8)strHostIFCfgParamAttr->cfg_attr_info.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900553 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900554 PRINT_ER("Impossible value \n");
Leo Kim31390ee2015-10-19 18:26:08 +0900555 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900556 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900557 }
558 u8WidCnt++;
559 }
Tony Cho87c05b22015-10-12 16:56:07 +0900560 if (strHostIFCfgParamAttr->cfg_attr_info.flag & AUTHEN_TIMEOUT) {
Tony Cho221371e2015-10-12 16:56:06 +0900561 if (strHostIFCfgParamAttr->cfg_attr_info.auth_timeout > 0 && strHostIFCfgParamAttr->cfg_attr_info.auth_timeout < 65536) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900562 strWIDList[u8WidCnt].id = WID_AUTH_TIMEOUT;
Tony Cho221371e2015-10-12 16:56:06 +0900563 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.auth_timeout;
Leo Kim416d8322015-10-12 16:55:43 +0900564 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900565 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900566 hif_drv->strCfgValues.auth_timeout = strHostIFCfgParamAttr->cfg_attr_info.auth_timeout;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900567 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900568 PRINT_ER("Range(1 ~ 65535) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900569 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900570 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900571 }
572 u8WidCnt++;
573 }
Tony Cho87c05b22015-10-12 16:56:07 +0900574 if (strHostIFCfgParamAttr->cfg_attr_info.flag & POWER_MANAGEMENT) {
Tony Cho221371e2015-10-12 16:56:06 +0900575 if (strHostIFCfgParamAttr->cfg_attr_info.power_mgmt_mode < 5) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900576 strWIDList[u8WidCnt].id = WID_POWER_MANAGEMENT;
Tony Cho221371e2015-10-12 16:56:06 +0900577 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.power_mgmt_mode;
Leo Kim416d8322015-10-12 16:55:43 +0900578 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900579 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900580 hif_drv->strCfgValues.power_mgmt_mode = (u8)strHostIFCfgParamAttr->cfg_attr_info.power_mgmt_mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900581 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900582 PRINT_ER("Invalide power mode\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900583 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900584 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900585 }
586 u8WidCnt++;
587 }
Tony Cho87c05b22015-10-12 16:56:07 +0900588 if (strHostIFCfgParamAttr->cfg_attr_info.flag & RETRY_SHORT) {
Tony Cho221371e2015-10-12 16:56:06 +0900589 if ((strHostIFCfgParamAttr->cfg_attr_info.short_retry_limit > 0) && (strHostIFCfgParamAttr->cfg_attr_info.short_retry_limit < 256)) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900590 strWIDList[u8WidCnt].id = WID_SHORT_RETRY_LIMIT;
Tony Cho221371e2015-10-12 16:56:06 +0900591 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.short_retry_limit;
Leo Kim416d8322015-10-12 16:55:43 +0900592 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900593 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900594 hif_drv->strCfgValues.short_retry_limit = strHostIFCfgParamAttr->cfg_attr_info.short_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900595 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900596 PRINT_ER("Range(1~256) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900597 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900598 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900599 }
600 u8WidCnt++;
601 }
Tony Cho87c05b22015-10-12 16:56:07 +0900602 if (strHostIFCfgParamAttr->cfg_attr_info.flag & RETRY_LONG) {
Tony Cho221371e2015-10-12 16:56:06 +0900603 if ((strHostIFCfgParamAttr->cfg_attr_info.long_retry_limit > 0) && (strHostIFCfgParamAttr->cfg_attr_info.long_retry_limit < 256)) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900604 strWIDList[u8WidCnt].id = WID_LONG_RETRY_LIMIT;
Tony Cho221371e2015-10-12 16:56:06 +0900605 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.long_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900606
Leo Kim416d8322015-10-12 16:55:43 +0900607 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900608 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900609 hif_drv->strCfgValues.long_retry_limit = strHostIFCfgParamAttr->cfg_attr_info.long_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900610 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900611 PRINT_ER("Range(1~256) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900612 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900613 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900614 }
615 u8WidCnt++;
616 }
Tony Cho87c05b22015-10-12 16:56:07 +0900617 if (strHostIFCfgParamAttr->cfg_attr_info.flag & FRAG_THRESHOLD) {
Tony Cho221371e2015-10-12 16:56:06 +0900618 if (strHostIFCfgParamAttr->cfg_attr_info.frag_threshold > 255 && strHostIFCfgParamAttr->cfg_attr_info.frag_threshold < 7937) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900619 strWIDList[u8WidCnt].id = WID_FRAG_THRESHOLD;
Tony Cho221371e2015-10-12 16:56:06 +0900620 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.frag_threshold;
Leo Kim416d8322015-10-12 16:55:43 +0900621 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900622 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900623 hif_drv->strCfgValues.frag_threshold = strHostIFCfgParamAttr->cfg_attr_info.frag_threshold;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900624 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900625 PRINT_ER("Threshold Range fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900626 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900627 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900628 }
629 u8WidCnt++;
630 }
Tony Cho87c05b22015-10-12 16:56:07 +0900631 if (strHostIFCfgParamAttr->cfg_attr_info.flag & RTS_THRESHOLD) {
Tony Cho221371e2015-10-12 16:56:06 +0900632 if (strHostIFCfgParamAttr->cfg_attr_info.rts_threshold > 255 && strHostIFCfgParamAttr->cfg_attr_info.rts_threshold < 65536) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900633 strWIDList[u8WidCnt].id = WID_RTS_THRESHOLD;
Tony Cho221371e2015-10-12 16:56:06 +0900634 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.rts_threshold;
Leo Kim416d8322015-10-12 16:55:43 +0900635 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900636 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900637 hif_drv->strCfgValues.rts_threshold = strHostIFCfgParamAttr->cfg_attr_info.rts_threshold;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900638 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900639 PRINT_ER("Threshold Range fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900640 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900641 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900642 }
643 u8WidCnt++;
644 }
Tony Cho87c05b22015-10-12 16:56:07 +0900645 if (strHostIFCfgParamAttr->cfg_attr_info.flag & PREAMBLE) {
Tony Cho221371e2015-10-12 16:56:06 +0900646 if (strHostIFCfgParamAttr->cfg_attr_info.preamble_type < 3) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900647 strWIDList[u8WidCnt].id = WID_PREAMBLE;
Tony Cho221371e2015-10-12 16:56:06 +0900648 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.preamble_type;
Leo Kim416d8322015-10-12 16:55:43 +0900649 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900650 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900651 hif_drv->strCfgValues.preamble_type = strHostIFCfgParamAttr->cfg_attr_info.preamble_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900652 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900653 PRINT_ER("Preamle Range(0~2) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900654 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900655 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900656 }
657 u8WidCnt++;
658 }
Tony Cho87c05b22015-10-12 16:56:07 +0900659 if (strHostIFCfgParamAttr->cfg_attr_info.flag & SHORT_SLOT_ALLOWED) {
Tony Cho221371e2015-10-12 16:56:06 +0900660 if (strHostIFCfgParamAttr->cfg_attr_info.short_slot_allowed < 2) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900661 strWIDList[u8WidCnt].id = WID_SHORT_SLOT_ALLOWED;
Tony Cho221371e2015-10-12 16:56:06 +0900662 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.short_slot_allowed;
Leo Kim416d8322015-10-12 16:55:43 +0900663 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900664 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900665 hif_drv->strCfgValues.short_slot_allowed = (u8)strHostIFCfgParamAttr->cfg_attr_info.short_slot_allowed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900666 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900667 PRINT_ER("Short slot(2) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900668 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900669 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900670 }
671 u8WidCnt++;
672 }
Tony Cho87c05b22015-10-12 16:56:07 +0900673 if (strHostIFCfgParamAttr->cfg_attr_info.flag & TXOP_PROT_DISABLE) {
Tony Cho221371e2015-10-12 16:56:06 +0900674 if (strHostIFCfgParamAttr->cfg_attr_info.txop_prot_disabled < 2) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900675 strWIDList[u8WidCnt].id = WID_11N_TXOP_PROT_DISABLE;
Tony Cho221371e2015-10-12 16:56:06 +0900676 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.txop_prot_disabled;
Leo Kim416d8322015-10-12 16:55:43 +0900677 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900678 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900679 hif_drv->strCfgValues.txop_prot_disabled = (u8)strHostIFCfgParamAttr->cfg_attr_info.txop_prot_disabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900680 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900681 PRINT_ER("TXOP prot disable\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900682 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900683 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900684 }
685 u8WidCnt++;
686 }
Tony Cho87c05b22015-10-12 16:56:07 +0900687 if (strHostIFCfgParamAttr->cfg_attr_info.flag & BEACON_INTERVAL) {
Tony Cho221371e2015-10-12 16:56:06 +0900688 if (strHostIFCfgParamAttr->cfg_attr_info.beacon_interval > 0 && strHostIFCfgParamAttr->cfg_attr_info.beacon_interval < 65536) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900689 strWIDList[u8WidCnt].id = WID_BEACON_INTERVAL;
Tony Cho221371e2015-10-12 16:56:06 +0900690 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.beacon_interval;
Leo Kim416d8322015-10-12 16:55:43 +0900691 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900692 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900693 hif_drv->strCfgValues.beacon_interval = strHostIFCfgParamAttr->cfg_attr_info.beacon_interval;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900694 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900695 PRINT_ER("Beacon interval(1~65535) fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900696 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900697 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900698 }
699 u8WidCnt++;
700 }
Tony Cho87c05b22015-10-12 16:56:07 +0900701 if (strHostIFCfgParamAttr->cfg_attr_info.flag & DTIM_PERIOD) {
Tony Cho221371e2015-10-12 16:56:06 +0900702 if (strHostIFCfgParamAttr->cfg_attr_info.dtim_period > 0 && strHostIFCfgParamAttr->cfg_attr_info.dtim_period < 256) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900703 strWIDList[u8WidCnt].id = WID_DTIM_PERIOD;
Tony Cho221371e2015-10-12 16:56:06 +0900704 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.dtim_period;
Leo Kim416d8322015-10-12 16:55:43 +0900705 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900706 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900707 hif_drv->strCfgValues.dtim_period = strHostIFCfgParamAttr->cfg_attr_info.dtim_period;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900708 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900709 PRINT_ER("DTIM range(1~255) fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900710 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900711 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900712 }
713 u8WidCnt++;
714 }
Tony Cho87c05b22015-10-12 16:56:07 +0900715 if (strHostIFCfgParamAttr->cfg_attr_info.flag & SITE_SURVEY) {
Tony Cho221371e2015-10-12 16:56:06 +0900716 if (strHostIFCfgParamAttr->cfg_attr_info.site_survey_enabled < 3) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900717 strWIDList[u8WidCnt].id = WID_SITE_SURVEY;
Tony Cho221371e2015-10-12 16:56:06 +0900718 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.site_survey_enabled;
Leo Kim416d8322015-10-12 16:55:43 +0900719 strWIDList[u8WidCnt].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900720 strWIDList[u8WidCnt].size = sizeof(char);
Tony Cho221371e2015-10-12 16:56:06 +0900721 hif_drv->strCfgValues.site_survey_enabled = (u8)strHostIFCfgParamAttr->cfg_attr_info.site_survey_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900722 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900723 PRINT_ER("Site survey disable\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900724 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900725 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900726 }
727 u8WidCnt++;
728 }
Tony Cho87c05b22015-10-12 16:56:07 +0900729 if (strHostIFCfgParamAttr->cfg_attr_info.flag & SITE_SURVEY_SCAN_TIME) {
Tony Cho221371e2015-10-12 16:56:06 +0900730 if (strHostIFCfgParamAttr->cfg_attr_info.site_survey_scan_time > 0 && strHostIFCfgParamAttr->cfg_attr_info.site_survey_scan_time < 65536) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900731 strWIDList[u8WidCnt].id = WID_SITE_SURVEY_SCAN_TIME;
Tony Cho221371e2015-10-12 16:56:06 +0900732 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.site_survey_scan_time;
Leo Kim416d8322015-10-12 16:55:43 +0900733 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900734 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900735 hif_drv->strCfgValues.site_survey_scan_time = strHostIFCfgParamAttr->cfg_attr_info.site_survey_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900736 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900737 PRINT_ER("Site survey scan time(1~65535) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900738 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900739 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900740 }
741 u8WidCnt++;
742 }
Tony Cho87c05b22015-10-12 16:56:07 +0900743 if (strHostIFCfgParamAttr->cfg_attr_info.flag & ACTIVE_SCANTIME) {
Tony Cho221371e2015-10-12 16:56:06 +0900744 if (strHostIFCfgParamAttr->cfg_attr_info.active_scan_time > 0 && strHostIFCfgParamAttr->cfg_attr_info.active_scan_time < 65536) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900745 strWIDList[u8WidCnt].id = WID_ACTIVE_SCAN_TIME;
Tony Cho221371e2015-10-12 16:56:06 +0900746 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.active_scan_time;
Leo Kim416d8322015-10-12 16:55:43 +0900747 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900748 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900749 hif_drv->strCfgValues.active_scan_time = strHostIFCfgParamAttr->cfg_attr_info.active_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900750 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900751 PRINT_ER("Active scan time(1~65535) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900752 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900753 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900754 }
755 u8WidCnt++;
756 }
Tony Cho87c05b22015-10-12 16:56:07 +0900757 if (strHostIFCfgParamAttr->cfg_attr_info.flag & PASSIVE_SCANTIME) {
Tony Cho221371e2015-10-12 16:56:06 +0900758 if (strHostIFCfgParamAttr->cfg_attr_info.passive_scan_time > 0 && strHostIFCfgParamAttr->cfg_attr_info.passive_scan_time < 65536) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900759 strWIDList[u8WidCnt].id = WID_PASSIVE_SCAN_TIME;
Tony Cho221371e2015-10-12 16:56:06 +0900760 strWIDList[u8WidCnt].val = (s8 *)&strHostIFCfgParamAttr->cfg_attr_info.passive_scan_time;
Leo Kim416d8322015-10-12 16:55:43 +0900761 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900762 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Cho221371e2015-10-12 16:56:06 +0900763 hif_drv->strCfgValues.passive_scan_time = strHostIFCfgParamAttr->cfg_attr_info.passive_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900764 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900765 PRINT_ER("Passive scan time(1~65535) over\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900766 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900767 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900768 }
769 u8WidCnt++;
770 }
Tony Cho87c05b22015-10-12 16:56:07 +0900771 if (strHostIFCfgParamAttr->cfg_attr_info.flag & CURRENT_TX_RATE) {
Tony Cho221371e2015-10-12 16:56:06 +0900772 enum CURRENT_TXRATE curr_tx_rate = strHostIFCfgParamAttr->cfg_attr_info.curr_tx_rate;
Leo Kimc09389a2015-10-28 15:59:24 +0900773
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900774 if (curr_tx_rate == AUTORATE || curr_tx_rate == MBPS_1
775 || curr_tx_rate == MBPS_2 || curr_tx_rate == MBPS_5_5
776 || curr_tx_rate == MBPS_11 || curr_tx_rate == MBPS_6
777 || curr_tx_rate == MBPS_9 || curr_tx_rate == MBPS_12
778 || curr_tx_rate == MBPS_18 || curr_tx_rate == MBPS_24
779 || curr_tx_rate == MBPS_36 || curr_tx_rate == MBPS_48 || curr_tx_rate == MBPS_54) {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900780 strWIDList[u8WidCnt].id = WID_CURRENT_TX_RATE;
Leo Kim900bb4a2015-10-12 16:55:46 +0900781 strWIDList[u8WidCnt].val = (s8 *)&curr_tx_rate;
Leo Kim416d8322015-10-12 16:55:43 +0900782 strWIDList[u8WidCnt].type = WID_SHORT;
Leo Kim2fd3e442015-10-12 16:55:45 +0900783 strWIDList[u8WidCnt].size = sizeof(u16);
Tony Choa4ab1ad2015-10-12 16:56:05 +0900784 hif_drv->strCfgValues.curr_tx_rate = (u8)curr_tx_rate;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900785 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900786 PRINT_ER("out of TX rate\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900787 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +0900788 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900789 }
790 u8WidCnt++;
791 }
Leo Kim31390ee2015-10-19 18:26:08 +0900792
793 result = send_config_pkt(SET_CFG, strWIDList, u8WidCnt,
Leo Kim8c8360b2015-10-19 18:26:12 +0900794 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900795
Leo Kim31390ee2015-10-19 18:26:08 +0900796 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900797 PRINT_ER("Error in setting CFG params\n");
798
Leo Kim24db7132015-09-16 18:36:01 +0900799ERRORHANDLER:
Tony Choa4ab1ad2015-10-12 16:56:05 +0900800 up(&hif_drv->gtOsCfgValuesSem);
Leo Kim31390ee2015-10-19 18:26:08 +0900801 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900802}
803
Chaehyun Limfb4ec9c2015-06-11 14:35:59 +0900804static s32 Handle_wait_msg_q_empty(void)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900805{
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900806 g_wilc_initialized = 0;
Leo Kim2d25af82015-10-15 13:24:56 +0900807 up(&hif_sema_wait_response);
Leo Kimb68d820b2015-10-12 16:55:37 +0900808 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900809}
810
Tony Choa4ab1ad2015-10-12 16:56:05 +0900811static s32 Handle_Scan(struct host_if_drv *hif_drv,
Tony Choc476feb2015-09-21 12:16:36 +0900812 struct scan_attr *pstrHostIFscanAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900813{
Leo Kim31390ee2015-10-19 18:26:08 +0900814 s32 result = 0;
Leo Kime9e0c262015-10-12 16:55:41 +0900815 struct wid strWIDList[5];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900816 u32 u32WidsCount = 0;
817 u32 i;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900818 u8 *pu8Buffer;
819 u8 valuesize = 0;
820 u8 *pu8HdnNtwrksWidVal = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900821
822 PRINT_D(HOSTINF_DBG, "Setting SCAN params\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +0900823 PRINT_D(HOSTINF_DBG, "Scanning: In [%d] state\n", hif_drv->enuHostIFstate);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900824
Leo Kimc17c6da2015-10-13 19:49:44 +0900825 hif_drv->strWILC_UsrScanReq.pfUserScanResult = pstrHostIFscanAttr->result;
Leo Kim5f2b50c2015-10-13 19:49:45 +0900826 hif_drv->strWILC_UsrScanReq.u32UserScanPvoid = pstrHostIFscanAttr->arg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900827
Tony Choa4ab1ad2015-10-12 16:56:05 +0900828 if ((hif_drv->enuHostIFstate >= HOST_IF_SCANNING) && (hif_drv->enuHostIFstate < HOST_IF_CONNECTED)) {
Tony Choa4ab1ad2015-10-12 16:56:05 +0900829 PRINT_D(GENERIC_DBG, "Don't scan we are already in [%d] state\n", hif_drv->enuHostIFstate);
Leo Kim24db7132015-09-16 18:36:01 +0900830 PRINT_ER("Already scan\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900831 result = -EBUSY;
Leo Kim24db7132015-09-16 18:36:01 +0900832 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900833 }
834
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900835 if (g_obtainingIP || connecting) {
836 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
Leo Kim24db7132015-09-16 18:36:01 +0900837 PRINT_ER("Don't do obss scan\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900838 result = -EBUSY;
Leo Kim24db7132015-09-16 18:36:01 +0900839 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900840 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900841
842 PRINT_D(HOSTINF_DBG, "Setting SCAN params\n");
843
Tony Choa4ab1ad2015-10-12 16:56:05 +0900844 hif_drv->strWILC_UsrScanReq.u32RcvdChCount = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900845
Leo Kimdaaf16b2015-10-12 16:55:44 +0900846 strWIDList[u32WidsCount].id = (u16)WID_SSID_PROBE_REQ;
Leo Kim416d8322015-10-12 16:55:43 +0900847 strWIDList[u32WidsCount].type = WID_STR;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900848
Leo Kim629b9ca2015-10-13 19:49:46 +0900849 for (i = 0; i < pstrHostIFscanAttr->hidden_network.u8ssidnum; i++)
850 valuesize += ((pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen) + 1);
Glen Leef3052582015-09-10 12:03:04 +0900851 pu8HdnNtwrksWidVal = kmalloc(valuesize + 1, GFP_KERNEL);
Leo Kim900bb4a2015-10-12 16:55:46 +0900852 strWIDList[u32WidsCount].val = pu8HdnNtwrksWidVal;
Leo Kim91109e12015-10-19 18:26:13 +0900853 if (strWIDList[u32WidsCount].val) {
Leo Kim900bb4a2015-10-12 16:55:46 +0900854 pu8Buffer = strWIDList[u32WidsCount].val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900855
Leo Kim629b9ca2015-10-13 19:49:46 +0900856 *pu8Buffer++ = pstrHostIFscanAttr->hidden_network.u8ssidnum;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900857
Leo Kim629b9ca2015-10-13 19:49:46 +0900858 PRINT_D(HOSTINF_DBG, "In Handle_ProbeRequest number of ssid %d\n", pstrHostIFscanAttr->hidden_network.u8ssidnum);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900859
Leo Kim629b9ca2015-10-13 19:49:46 +0900860 for (i = 0; i < pstrHostIFscanAttr->hidden_network.u8ssidnum; i++) {
861 *pu8Buffer++ = pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen;
862 memcpy(pu8Buffer, pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].pu8ssid, pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen);
863 pu8Buffer += pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo[i].u8ssidlen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900864 }
865
Leo Kim2fd3e442015-10-12 16:55:45 +0900866 strWIDList[u32WidsCount].size = (s32)(valuesize + 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900867 u32WidsCount++;
868 }
869
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900870 {
Leo Kimdaaf16b2015-10-12 16:55:44 +0900871 strWIDList[u32WidsCount].id = WID_INFO_ELEMENT_PROBE;
Leo Kim416d8322015-10-12 16:55:43 +0900872 strWIDList[u32WidsCount].type = WID_BIN_DATA;
Leo Kimd6f19aa2015-10-13 19:49:42 +0900873 strWIDList[u32WidsCount].val = pstrHostIFscanAttr->ies;
Leo Kim7b1f76c2015-10-13 19:49:43 +0900874 strWIDList[u32WidsCount].size = pstrHostIFscanAttr->ies_len;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900875 u32WidsCount++;
876 }
877
Leo Kimdaaf16b2015-10-12 16:55:44 +0900878 strWIDList[u32WidsCount].id = WID_SCAN_TYPE;
Leo Kim416d8322015-10-12 16:55:43 +0900879 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900880 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +0900881 strWIDList[u32WidsCount].val = (s8 *)&pstrHostIFscanAttr->type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900882 u32WidsCount++;
883
Leo Kimdaaf16b2015-10-12 16:55:44 +0900884 strWIDList[u32WidsCount].id = WID_SCAN_CHANNEL_LIST;
Leo Kim416d8322015-10-12 16:55:43 +0900885 strWIDList[u32WidsCount].type = WID_BIN_DATA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900886
Leo Kim91109e12015-10-19 18:26:13 +0900887 if (pstrHostIFscanAttr->ch_freq_list &&
888 pstrHostIFscanAttr->ch_list_len > 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900889 int i;
890
Leo Kimf97bd9c2015-10-13 19:49:41 +0900891 for (i = 0; i < pstrHostIFscanAttr->ch_list_len; i++) {
Leo Kim82eeb0a2015-10-13 19:49:40 +0900892 if (pstrHostIFscanAttr->ch_freq_list[i] > 0)
893 pstrHostIFscanAttr->ch_freq_list[i] = pstrHostIFscanAttr->ch_freq_list[i] - 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900894 }
895 }
896
Leo Kim82eeb0a2015-10-13 19:49:40 +0900897 strWIDList[u32WidsCount].val = pstrHostIFscanAttr->ch_freq_list;
Leo Kimf97bd9c2015-10-13 19:49:41 +0900898 strWIDList[u32WidsCount].size = pstrHostIFscanAttr->ch_list_len;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900899 u32WidsCount++;
900
Leo Kimdaaf16b2015-10-12 16:55:44 +0900901 strWIDList[u32WidsCount].id = WID_START_SCAN_REQ;
Leo Kim416d8322015-10-12 16:55:43 +0900902 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +0900903 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +0900904 strWIDList[u32WidsCount].val = (s8 *)&pstrHostIFscanAttr->src;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900905 u32WidsCount++;
906
Tony Choa4ab1ad2015-10-12 16:56:05 +0900907 if (hif_drv->enuHostIFstate == HOST_IF_CONNECTED)
Leo Kimca8540e42015-10-15 13:25:00 +0900908 scan_while_connected = true;
Tony Choa4ab1ad2015-10-12 16:56:05 +0900909 else if (hif_drv->enuHostIFstate == HOST_IF_IDLE)
Leo Kimca8540e42015-10-15 13:25:00 +0900910 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900911
Leo Kim31390ee2015-10-19 18:26:08 +0900912 result = send_config_pkt(SET_CFG, strWIDList, u32WidsCount,
Leo Kim8c8360b2015-10-19 18:26:12 +0900913 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900914
Leo Kim31390ee2015-10-19 18:26:08 +0900915 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900916 PRINT_ER("Failed to send scan paramters config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +0900917 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900918 PRINT_D(HOSTINF_DBG, "Successfully sent SCAN params config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900919
Leo Kim24db7132015-09-16 18:36:01 +0900920ERRORHANDLER:
Leo Kim31390ee2015-10-19 18:26:08 +0900921 if (result) {
Tony Choa4ab1ad2015-10-12 16:56:05 +0900922 del_timer(&hif_drv->hScanTimer);
Tony Choa4ab1ad2015-10-12 16:56:05 +0900923 Handle_ScanDone(hif_drv, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900924 }
925
Shraddha Barke95f840f2015-10-14 07:29:19 +0530926 kfree(pstrHostIFscanAttr->ch_freq_list);
927 pstrHostIFscanAttr->ch_freq_list = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900928
Shraddha Barke95f840f2015-10-14 07:29:19 +0530929 kfree(pstrHostIFscanAttr->ies);
930 pstrHostIFscanAttr->ies = NULL;
931 kfree(pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo);
932 pstrHostIFscanAttr->hidden_network.pstrHiddenNetworkInfo = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900933
Shraddha Barke95f840f2015-10-14 07:29:19 +0530934 kfree(pu8HdnNtwrksWidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900935
Leo Kim31390ee2015-10-19 18:26:08 +0900936 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900937}
938
Tony Choa4ab1ad2015-10-12 16:56:05 +0900939static s32 Handle_ScanDone(struct host_if_drv *hif_drv,
940 enum scan_event enuEvent)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900941{
Leo Kim31390ee2015-10-19 18:26:08 +0900942 s32 result = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900943 u8 u8abort_running_scan;
Leo Kim45102f82015-10-28 15:59:28 +0900944 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900945
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900946 PRINT_D(HOSTINF_DBG, "in Handle_ScanDone()\n");
947
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900948 if (enuEvent == SCAN_EVENT_ABORTED) {
949 PRINT_D(GENERIC_DBG, "Abort running scan\n");
950 u8abort_running_scan = 1;
Leo Kim45102f82015-10-28 15:59:28 +0900951 wid.id = (u16)WID_ABORT_RUNNING_SCAN;
952 wid.type = WID_CHAR;
953 wid.val = (s8 *)&u8abort_running_scan;
954 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900955
Leo Kim45102f82015-10-28 15:59:28 +0900956 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +0900957 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +0900958
959 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900960 PRINT_ER("Failed to set abort running scan\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900961 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900962 }
963 }
964
Tony Choa4ab1ad2015-10-12 16:56:05 +0900965 if (!hif_drv) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900966 PRINT_ER("Driver handler is NULL\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900967 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900968 }
969
Tony Choa4ab1ad2015-10-12 16:56:05 +0900970 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
971 hif_drv->strWILC_UsrScanReq.pfUserScanResult(enuEvent, NULL,
972 hif_drv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
Tony Choa4ab1ad2015-10-12 16:56:05 +0900973 hif_drv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900974 }
975
Leo Kim31390ee2015-10-19 18:26:08 +0900976 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900977}
978
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900979u8 u8ConnectedSSID[6] = {0};
Tony Choa4ab1ad2015-10-12 16:56:05 +0900980static s32 Handle_Connect(struct host_if_drv *hif_drv,
Tony Cho120ae592015-09-21 12:16:37 +0900981 struct connect_attr *pstrHostIFconnectAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900982{
Leo Kim31390ee2015-10-19 18:26:08 +0900983 s32 result = 0;
Leo Kime9e0c262015-10-12 16:55:41 +0900984 struct wid strWIDList[8];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900985 u32 u32WidsCount = 0, dummyval = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900986 u8 *pu8CurrByte = NULL;
Leo Kime0a12212015-10-12 16:55:49 +0900987 struct join_bss_param *ptstrJoinBssParam;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900988
989 PRINT_D(GENERIC_DBG, "Handling connect request\n");
990
Leo Kim9254db02015-10-13 19:49:49 +0900991 if (memcmp(pstrHostIFconnectAttr->bssid, u8ConnectedSSID, ETH_ALEN) == 0) {
Leo Kim31390ee2015-10-19 18:26:08 +0900992 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900993 PRINT_ER("Trying to connect to an already connected AP, Discard connect request\n");
Leo Kim31390ee2015-10-19 18:26:08 +0900994 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900995 }
996
997 PRINT_INFO(HOSTINF_DBG, "Saving connection parameters in global structure\n");
998
Leo Kimf2bed2c2015-10-13 19:49:59 +0900999 ptstrJoinBssParam = (struct join_bss_param *)pstrHostIFconnectAttr->params;
Leo Kim91109e12015-10-19 18:26:13 +09001000 if (!ptstrJoinBssParam) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001001 PRINT_ER("Required BSSID not found\n");
Leo Kim31390ee2015-10-19 18:26:08 +09001002 result = -ENOENT;
Leo Kim24db7132015-09-16 18:36:01 +09001003 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001004 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001005
Leo Kim91109e12015-10-19 18:26:13 +09001006 if (pstrHostIFconnectAttr->bssid) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001007 hif_drv->strWILC_UsrConnReq.pu8bssid = kmalloc(6, GFP_KERNEL);
Leo Kim9254db02015-10-13 19:49:49 +09001008 memcpy(hif_drv->strWILC_UsrConnReq.pu8bssid, pstrHostIFconnectAttr->bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001009 }
1010
Leo Kim8b3c9fa2015-10-13 19:49:51 +09001011 hif_drv->strWILC_UsrConnReq.ssidLen = pstrHostIFconnectAttr->ssid_len;
Leo Kim91109e12015-10-19 18:26:13 +09001012 if (pstrHostIFconnectAttr->ssid) {
Leo Kim8b3c9fa2015-10-13 19:49:51 +09001013 hif_drv->strWILC_UsrConnReq.pu8ssid = kmalloc(pstrHostIFconnectAttr->ssid_len + 1, GFP_KERNEL);
Leo Kim8c8360b2015-10-19 18:26:12 +09001014 memcpy(hif_drv->strWILC_UsrConnReq.pu8ssid,
1015 pstrHostIFconnectAttr->ssid,
1016 pstrHostIFconnectAttr->ssid_len);
Leo Kim8b3c9fa2015-10-13 19:49:51 +09001017 hif_drv->strWILC_UsrConnReq.pu8ssid[pstrHostIFconnectAttr->ssid_len] = '\0';
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001018 }
1019
Leo Kimb59d5c52015-10-13 19:49:53 +09001020 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen = pstrHostIFconnectAttr->ies_len;
Leo Kim91109e12015-10-19 18:26:13 +09001021 if (pstrHostIFconnectAttr->ies) {
Leo Kimb59d5c52015-10-13 19:49:53 +09001022 hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs = kmalloc(pstrHostIFconnectAttr->ies_len, GFP_KERNEL);
Leo Kim8c8360b2015-10-19 18:26:12 +09001023 memcpy(hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs,
1024 pstrHostIFconnectAttr->ies,
1025 pstrHostIFconnectAttr->ies_len);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001026 }
1027
Leo Kima64fd672015-10-13 19:49:54 +09001028 hif_drv->strWILC_UsrConnReq.u8security = pstrHostIFconnectAttr->security;
Leo Kim61b4fd02015-10-13 19:49:57 +09001029 hif_drv->strWILC_UsrConnReq.tenuAuth_type = pstrHostIFconnectAttr->auth_type;
Leo Kim6abcc112015-10-13 19:49:55 +09001030 hif_drv->strWILC_UsrConnReq.pfUserConnectResult = pstrHostIFconnectAttr->result;
Leo Kim8f38db82015-10-13 19:49:56 +09001031 hif_drv->strWILC_UsrConnReq.u32UserConnectPvoid = pstrHostIFconnectAttr->arg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001032
Leo Kimdaaf16b2015-10-12 16:55:44 +09001033 strWIDList[u32WidsCount].id = WID_SUCCESS_FRAME_COUNT;
Leo Kim416d8322015-10-12 16:55:43 +09001034 strWIDList[u32WidsCount].type = WID_INT;
Leo Kim2fd3e442015-10-12 16:55:45 +09001035 strWIDList[u32WidsCount].size = sizeof(u32);
Leo Kim900bb4a2015-10-12 16:55:46 +09001036 strWIDList[u32WidsCount].val = (s8 *)(&(dummyval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001037 u32WidsCount++;
1038
Leo Kimdaaf16b2015-10-12 16:55:44 +09001039 strWIDList[u32WidsCount].id = WID_RECEIVED_FRAGMENT_COUNT;
Leo Kim416d8322015-10-12 16:55:43 +09001040 strWIDList[u32WidsCount].type = WID_INT;
Leo Kim2fd3e442015-10-12 16:55:45 +09001041 strWIDList[u32WidsCount].size = sizeof(u32);
Leo Kim900bb4a2015-10-12 16:55:46 +09001042 strWIDList[u32WidsCount].val = (s8 *)(&(dummyval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001043 u32WidsCount++;
1044
Leo Kimdaaf16b2015-10-12 16:55:44 +09001045 strWIDList[u32WidsCount].id = WID_FAILED_COUNT;
Leo Kim416d8322015-10-12 16:55:43 +09001046 strWIDList[u32WidsCount].type = WID_INT;
Leo Kim2fd3e442015-10-12 16:55:45 +09001047 strWIDList[u32WidsCount].size = sizeof(u32);
Leo Kim900bb4a2015-10-12 16:55:46 +09001048 strWIDList[u32WidsCount].val = (s8 *)(&(dummyval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001049 u32WidsCount++;
1050
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001051 {
Leo Kimdaaf16b2015-10-12 16:55:44 +09001052 strWIDList[u32WidsCount].id = WID_INFO_ELEMENT_ASSOCIATE;
Leo Kim416d8322015-10-12 16:55:43 +09001053 strWIDList[u32WidsCount].type = WID_BIN_DATA;
Tony Choa4ab1ad2015-10-12 16:56:05 +09001054 strWIDList[u32WidsCount].val = hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs;
1055 strWIDList[u32WidsCount].size = hif_drv->strWILC_UsrConnReq.ConnReqIEsLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001056 u32WidsCount++;
1057
Leo Kimf7bbd9c2015-10-13 19:49:50 +09001058 if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7)) {
Leo Kimdfef7b82015-10-15 13:25:14 +09001059 info_element_size = hif_drv->strWILC_UsrConnReq.ConnReqIEsLen;
1060 info_element = kmalloc(info_element_size, GFP_KERNEL);
Leo Kim48ce2462015-10-15 13:25:10 +09001061 memcpy(info_element, hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs,
Leo Kimdfef7b82015-10-15 13:25:14 +09001062 info_element_size);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001063 }
1064 }
Leo Kimdaaf16b2015-10-12 16:55:44 +09001065 strWIDList[u32WidsCount].id = (u16)WID_11I_MODE;
Leo Kim416d8322015-10-12 16:55:43 +09001066 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001067 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09001068 strWIDList[u32WidsCount].val = (s8 *)&hif_drv->strWILC_UsrConnReq.u8security;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001069 u32WidsCount++;
1070
Leo Kimf7bbd9c2015-10-13 19:49:50 +09001071 if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7))
Leo Kim1bd9d442015-10-15 13:25:11 +09001072 mode_11i = hif_drv->strWILC_UsrConnReq.u8security;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001073
Tony Choa4ab1ad2015-10-12 16:56:05 +09001074 PRINT_INFO(HOSTINF_DBG, "Encrypt Mode = %x\n", hif_drv->strWILC_UsrConnReq.u8security);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001075
Leo Kimdaaf16b2015-10-12 16:55:44 +09001076 strWIDList[u32WidsCount].id = (u16)WID_AUTH_TYPE;
Leo Kim416d8322015-10-12 16:55:43 +09001077 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001078 strWIDList[u32WidsCount].size = sizeof(char);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001079 strWIDList[u32WidsCount].val = (s8 *)(&hif_drv->strWILC_UsrConnReq.tenuAuth_type);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001080 u32WidsCount++;
1081
Leo Kimf7bbd9c2015-10-13 19:49:50 +09001082 if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7))
Leo Kimfba49892015-10-15 13:25:12 +09001083 auth_type = (u8)hif_drv->strWILC_UsrConnReq.tenuAuth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001084
Tony Choa4ab1ad2015-10-12 16:56:05 +09001085 PRINT_INFO(HOSTINF_DBG, "Authentication Type = %x\n", hif_drv->strWILC_UsrConnReq.tenuAuth_type);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001086 PRINT_D(HOSTINF_DBG, "Connecting to network of SSID %s on channel %d\n",
Leo Kim0d1527e2015-10-13 19:49:58 +09001087 hif_drv->strWILC_UsrConnReq.pu8ssid, pstrHostIFconnectAttr->ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001088
Leo Kimdaaf16b2015-10-12 16:55:44 +09001089 strWIDList[u32WidsCount].id = (u16)WID_JOIN_REQ_EXTENDED;
Leo Kim416d8322015-10-12 16:55:43 +09001090 strWIDList[u32WidsCount].type = WID_STR;
Leo Kimae4dfa52015-10-13 19:49:26 +09001091 strWIDList[u32WidsCount].size = 112;
Leo Kim900bb4a2015-10-12 16:55:46 +09001092 strWIDList[u32WidsCount].val = kmalloc(strWIDList[u32WidsCount].size, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001093
Leo Kimf7bbd9c2015-10-13 19:49:50 +09001094 if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7)) {
Leo Kim0626baa2015-10-15 13:25:13 +09001095 join_req_size = strWIDList[u32WidsCount].size;
1096 join_req = kmalloc(join_req_size, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001097 }
Leo Kim91109e12015-10-19 18:26:13 +09001098 if (!strWIDList[u32WidsCount].val) {
Leo Kim31390ee2015-10-19 18:26:08 +09001099 result = -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09001100 goto ERRORHANDLER;
1101 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001102
Leo Kim900bb4a2015-10-12 16:55:46 +09001103 pu8CurrByte = strWIDList[u32WidsCount].val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001104
Leo Kim91109e12015-10-19 18:26:13 +09001105 if (pstrHostIFconnectAttr->ssid) {
Leo Kim8b3c9fa2015-10-13 19:49:51 +09001106 memcpy(pu8CurrByte, pstrHostIFconnectAttr->ssid, pstrHostIFconnectAttr->ssid_len);
1107 pu8CurrByte[pstrHostIFconnectAttr->ssid_len] = '\0';
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001108 }
1109 pu8CurrByte += MAX_SSID_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001110 *(pu8CurrByte++) = INFRASTRUCTURE;
Leo Kimae4dfa52015-10-13 19:49:26 +09001111
Leo Kim0d1527e2015-10-13 19:49:58 +09001112 if ((pstrHostIFconnectAttr->ch >= 1) && (pstrHostIFconnectAttr->ch <= 14)) {
1113 *(pu8CurrByte++) = pstrHostIFconnectAttr->ch;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001114 } else {
1115 PRINT_ER("Channel out of range\n");
1116 *(pu8CurrByte++) = 0xFF;
1117 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001118 *(pu8CurrByte++) = (ptstrJoinBssParam->cap_info) & 0xFF;
1119 *(pu8CurrByte++) = ((ptstrJoinBssParam->cap_info) >> 8) & 0xFF;
1120 PRINT_D(HOSTINF_DBG, "* Cap Info %0x*\n", (*(pu8CurrByte - 2) | ((*(pu8CurrByte - 1)) << 8)));
1121
Leo Kim91109e12015-10-19 18:26:13 +09001122 if (pstrHostIFconnectAttr->bssid)
Leo Kim9254db02015-10-13 19:49:49 +09001123 memcpy(pu8CurrByte, pstrHostIFconnectAttr->bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001124 pu8CurrByte += 6;
1125
Tony Choc0f52fb2015-10-20 17:10:46 +09001126 if (pstrHostIFconnectAttr->bssid)
1127 memcpy(pu8CurrByte, pstrHostIFconnectAttr->bssid, 6);
1128 pu8CurrByte += 6;
1129
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001130 *(pu8CurrByte++) = (ptstrJoinBssParam->beacon_period) & 0xFF;
1131 *(pu8CurrByte++) = ((ptstrJoinBssParam->beacon_period) >> 8) & 0xFF;
1132 PRINT_D(HOSTINF_DBG, "* Beacon Period %d*\n", (*(pu8CurrByte - 2) | ((*(pu8CurrByte - 1)) << 8)));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001133 *(pu8CurrByte++) = ptstrJoinBssParam->dtim_period;
1134 PRINT_D(HOSTINF_DBG, "* DTIM Period %d*\n", (*(pu8CurrByte - 1)));
Leo Kimae4dfa52015-10-13 19:49:26 +09001135
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001136 memcpy(pu8CurrByte, ptstrJoinBssParam->supp_rates, MAX_RATES_SUPPORTED + 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001137 pu8CurrByte += (MAX_RATES_SUPPORTED + 1);
1138
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001139 *(pu8CurrByte++) = ptstrJoinBssParam->wmm_cap;
1140 PRINT_D(HOSTINF_DBG, "* wmm cap%d*\n", (*(pu8CurrByte - 1)));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001141 *(pu8CurrByte++) = ptstrJoinBssParam->uapsd_cap;
1142
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001143 *(pu8CurrByte++) = ptstrJoinBssParam->ht_capable;
Tony Choa4ab1ad2015-10-12 16:56:05 +09001144 hif_drv->strWILC_UsrConnReq.IsHTCapable = ptstrJoinBssParam->ht_capable;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001145
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001146 *(pu8CurrByte++) = ptstrJoinBssParam->rsn_found;
1147 PRINT_D(HOSTINF_DBG, "* rsn found %d*\n", *(pu8CurrByte - 1));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001148 *(pu8CurrByte++) = ptstrJoinBssParam->rsn_grp_policy;
1149 PRINT_D(HOSTINF_DBG, "* rsn group policy %0x*\n", (*(pu8CurrByte - 1)));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001150 *(pu8CurrByte++) = ptstrJoinBssParam->mode_802_11i;
1151 PRINT_D(HOSTINF_DBG, "* mode_802_11i %d*\n", (*(pu8CurrByte - 1)));
Leo Kimae4dfa52015-10-13 19:49:26 +09001152
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001153 memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_pcip_policy, sizeof(ptstrJoinBssParam->rsn_pcip_policy));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001154 pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_pcip_policy);
1155
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001156 memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_auth_policy, sizeof(ptstrJoinBssParam->rsn_auth_policy));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001157 pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_auth_policy);
1158
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001159 memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_cap, sizeof(ptstrJoinBssParam->rsn_cap));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001160 pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_cap);
1161
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001162 *(pu8CurrByte++) = REAL_JOIN_REQ;
Leo Kim7a8d51d2015-10-15 13:24:43 +09001163 *(pu8CurrByte++) = ptstrJoinBssParam->noa_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001164
Leo Kim7a8d51d2015-10-15 13:24:43 +09001165 if (ptstrJoinBssParam->noa_enabled) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001166 PRINT_D(HOSTINF_DBG, "NOA present\n");
1167
1168 *(pu8CurrByte++) = (ptstrJoinBssParam->tsf) & 0xFF;
1169 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 8) & 0xFF;
1170 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 16) & 0xFF;
1171 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 24) & 0xFF;
1172
Leo Kimd72b33c2015-10-15 13:24:44 +09001173 *(pu8CurrByte++) = ptstrJoinBssParam->opp_enabled;
Leo Kimcc179002015-10-15 13:24:47 +09001174 *(pu8CurrByte++) = ptstrJoinBssParam->idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001175
Leo Kimd72b33c2015-10-15 13:24:44 +09001176 if (ptstrJoinBssParam->opp_enabled)
Leo Kim99b66942015-10-15 13:24:45 +09001177 *(pu8CurrByte++) = ptstrJoinBssParam->ct_window;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001178
Leo Kimc21047e2015-10-15 13:24:46 +09001179 *(pu8CurrByte++) = ptstrJoinBssParam->cnt;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001180
Leo Kim109e6ca2015-10-15 13:24:48 +09001181 memcpy(pu8CurrByte, ptstrJoinBssParam->duration, sizeof(ptstrJoinBssParam->duration));
1182 pu8CurrByte += sizeof(ptstrJoinBssParam->duration);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001183
Leo Kim1d8b76b2015-10-15 13:24:49 +09001184 memcpy(pu8CurrByte, ptstrJoinBssParam->interval, sizeof(ptstrJoinBssParam->interval));
1185 pu8CurrByte += sizeof(ptstrJoinBssParam->interval);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001186
Leo Kim4be55e22015-10-28 15:59:27 +09001187 memcpy(pu8CurrByte, ptstrJoinBssParam->start_time, sizeof(ptstrJoinBssParam->start_time));
1188 pu8CurrByte += sizeof(ptstrJoinBssParam->start_time);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001189 } else
1190 PRINT_D(HOSTINF_DBG, "NOA not present\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001191
Leo Kim900bb4a2015-10-12 16:55:46 +09001192 pu8CurrByte = strWIDList[u32WidsCount].val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001193 u32WidsCount++;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001194
Leo Kimf7bbd9c2015-10-13 19:49:50 +09001195 if (memcmp("DIRECT-", pstrHostIFconnectAttr->ssid, 7)) {
Leo Kim0626baa2015-10-15 13:25:13 +09001196 memcpy(join_req, pu8CurrByte, join_req_size);
Leo Kim870515c2015-10-15 13:25:15 +09001197 join_req_drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001198 }
1199
1200 PRINT_D(GENERIC_DBG, "send HOST_IF_WAITING_CONN_RESP\n");
1201
Leo Kim91109e12015-10-19 18:26:13 +09001202 if (pstrHostIFconnectAttr->bssid) {
Leo Kim9254db02015-10-13 19:49:49 +09001203 memcpy(u8ConnectedSSID, pstrHostIFconnectAttr->bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001204
Leo Kim9254db02015-10-13 19:49:49 +09001205 PRINT_D(GENERIC_DBG, "save Bssid = %pM\n", pstrHostIFconnectAttr->bssid);
Alexander Kuleshov310a28f2015-09-04 00:48:14 +06001206 PRINT_D(GENERIC_DBG, "save bssid = %pM\n", u8ConnectedSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001207 }
1208
Leo Kim31390ee2015-10-19 18:26:08 +09001209 result = send_config_pkt(SET_CFG, strWIDList, u32WidsCount,
Leo Kim8c8360b2015-10-19 18:26:12 +09001210 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09001211 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09001212 PRINT_ER("failed to send config packet\n");
Leo Kim31390ee2015-10-19 18:26:08 +09001213 result = -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09001214 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001215 } else {
1216 PRINT_D(GENERIC_DBG, "set HOST_IF_WAITING_CONN_RESP\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09001217 hif_drv->enuHostIFstate = HOST_IF_WAITING_CONN_RESP;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001218 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001219
Leo Kim24db7132015-09-16 18:36:01 +09001220ERRORHANDLER:
Leo Kim31390ee2015-10-19 18:26:08 +09001221 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001222 tstrConnectInfo strConnectInfo;
1223
Tony Choa4ab1ad2015-10-12 16:56:05 +09001224 del_timer(&hif_drv->hConnectTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001225
1226 PRINT_D(HOSTINF_DBG, "could not start connecting to the required network\n");
1227
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001228 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001229
Leo Kim91109e12015-10-19 18:26:13 +09001230 if (pstrHostIFconnectAttr->result) {
1231 if (pstrHostIFconnectAttr->bssid)
Leo Kim9254db02015-10-13 19:49:49 +09001232 memcpy(strConnectInfo.au8bssid, pstrHostIFconnectAttr->bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001233
Leo Kim91109e12015-10-19 18:26:13 +09001234 if (pstrHostIFconnectAttr->ies) {
Leo Kimb59d5c52015-10-13 19:49:53 +09001235 strConnectInfo.ReqIEsLen = pstrHostIFconnectAttr->ies_len;
1236 strConnectInfo.pu8ReqIEs = kmalloc(pstrHostIFconnectAttr->ies_len, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001237 memcpy(strConnectInfo.pu8ReqIEs,
Leo Kim8c8360b2015-10-19 18:26:12 +09001238 pstrHostIFconnectAttr->ies,
1239 pstrHostIFconnectAttr->ies_len);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001240 }
1241
Leo Kim6abcc112015-10-13 19:49:55 +09001242 pstrHostIFconnectAttr->result(CONN_DISCONN_EVENT_CONN_RESP,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001243 &strConnectInfo,
1244 MAC_DISCONNECTED,
1245 NULL,
Leo Kim8f38db82015-10-13 19:49:56 +09001246 pstrHostIFconnectAttr->arg);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001247 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Shraddha Barke95f840f2015-10-14 07:29:19 +05301248 kfree(strConnectInfo.pu8ReqIEs);
1249 strConnectInfo.pu8ReqIEs = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001250
1251 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001252 PRINT_ER("Connect callback function pointer is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001253 }
1254 }
1255
1256 PRINT_D(HOSTINF_DBG, "Deallocating connection parameters\n");
Shraddha Barke95f840f2015-10-14 07:29:19 +05301257 kfree(pstrHostIFconnectAttr->bssid);
1258 pstrHostIFconnectAttr->bssid = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001259
Shraddha Barke95f840f2015-10-14 07:29:19 +05301260 kfree(pstrHostIFconnectAttr->ssid);
1261 pstrHostIFconnectAttr->ssid = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001262
Shraddha Barke95f840f2015-10-14 07:29:19 +05301263 kfree(pstrHostIFconnectAttr->ies);
1264 pstrHostIFconnectAttr->ies = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001265
Shraddha Barke95f840f2015-10-14 07:29:19 +05301266 kfree(pu8CurrByte);
Leo Kim31390ee2015-10-19 18:26:08 +09001267 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001268}
1269
Tony Choa4ab1ad2015-10-12 16:56:05 +09001270static s32 Handle_FlushConnect(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001271{
Leo Kim31390ee2015-10-19 18:26:08 +09001272 s32 result = 0;
Leo Kime9e0c262015-10-12 16:55:41 +09001273 struct wid strWIDList[5];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001274 u32 u32WidsCount = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001275 u8 *pu8CurrByte = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001276
Leo Kimdaaf16b2015-10-12 16:55:44 +09001277 strWIDList[u32WidsCount].id = WID_INFO_ELEMENT_ASSOCIATE;
Leo Kim416d8322015-10-12 16:55:43 +09001278 strWIDList[u32WidsCount].type = WID_BIN_DATA;
Leo Kim48ce2462015-10-15 13:25:10 +09001279 strWIDList[u32WidsCount].val = info_element;
Leo Kimdfef7b82015-10-15 13:25:14 +09001280 strWIDList[u32WidsCount].size = info_element_size;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001281 u32WidsCount++;
1282
Leo Kimdaaf16b2015-10-12 16:55:44 +09001283 strWIDList[u32WidsCount].id = (u16)WID_11I_MODE;
Leo Kim416d8322015-10-12 16:55:43 +09001284 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001285 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kim1bd9d442015-10-15 13:25:11 +09001286 strWIDList[u32WidsCount].val = (s8 *)(&(mode_11i));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001287 u32WidsCount++;
1288
Leo Kimdaaf16b2015-10-12 16:55:44 +09001289 strWIDList[u32WidsCount].id = (u16)WID_AUTH_TYPE;
Leo Kim416d8322015-10-12 16:55:43 +09001290 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001291 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kimfba49892015-10-15 13:25:12 +09001292 strWIDList[u32WidsCount].val = (s8 *)(&auth_type);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001293 u32WidsCount++;
1294
Leo Kimdaaf16b2015-10-12 16:55:44 +09001295 strWIDList[u32WidsCount].id = (u16)WID_JOIN_REQ_EXTENDED;
Leo Kim416d8322015-10-12 16:55:43 +09001296 strWIDList[u32WidsCount].type = WID_STR;
Leo Kim0626baa2015-10-15 13:25:13 +09001297 strWIDList[u32WidsCount].size = join_req_size;
Leo Kim044a64102015-10-15 13:25:09 +09001298 strWIDList[u32WidsCount].val = (s8 *)join_req;
Leo Kim900bb4a2015-10-12 16:55:46 +09001299 pu8CurrByte = strWIDList[u32WidsCount].val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001300
1301 pu8CurrByte += FLUSHED_BYTE_POS;
1302 *(pu8CurrByte) = FLUSHED_JOIN_REQ;
1303
1304 u32WidsCount++;
1305
Leo Kim31390ee2015-10-19 18:26:08 +09001306 result = send_config_pkt(SET_CFG, strWIDList, u32WidsCount,
Leo Kim8c8360b2015-10-19 18:26:12 +09001307 get_id_from_handler(join_req_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09001308 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09001309 PRINT_ER("failed to send config packet\n");
Leo Kim31390ee2015-10-19 18:26:08 +09001310 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001311 }
1312
Leo Kim31390ee2015-10-19 18:26:08 +09001313 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001314}
1315
Tony Choa4ab1ad2015-10-12 16:56:05 +09001316static s32 Handle_ConnectTimeout(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001317{
Leo Kim31390ee2015-10-19 18:26:08 +09001318 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001319 tstrConnectInfo strConnectInfo;
Leo Kim45102f82015-10-28 15:59:28 +09001320 struct wid wid;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001321 u16 u16DummyReasonCode = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001322
Tony Choa4ab1ad2015-10-12 16:56:05 +09001323 if (!hif_drv) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001324 PRINT_ER("Driver handler is NULL\n");
Leo Kim31390ee2015-10-19 18:26:08 +09001325 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001326 }
1327
Tony Choa4ab1ad2015-10-12 16:56:05 +09001328 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001329
Leo Kimca8540e42015-10-15 13:25:00 +09001330 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001331
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001332 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001333
Leo Kim91109e12015-10-19 18:26:13 +09001334 if (hif_drv->strWILC_UsrConnReq.pfUserConnectResult) {
1335 if (hif_drv->strWILC_UsrConnReq.pu8bssid) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001336 memcpy(strConnectInfo.au8bssid,
Leo Kim8c8360b2015-10-19 18:26:12 +09001337 hif_drv->strWILC_UsrConnReq.pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001338 }
1339
Leo Kim91109e12015-10-19 18:26:13 +09001340 if (hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001341 strConnectInfo.ReqIEsLen = hif_drv->strWILC_UsrConnReq.ConnReqIEsLen;
1342 strConnectInfo.pu8ReqIEs = kmalloc(hif_drv->strWILC_UsrConnReq.ConnReqIEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001343 memcpy(strConnectInfo.pu8ReqIEs,
Leo Kim8c8360b2015-10-19 18:26:12 +09001344 hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs,
1345 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001346 }
1347
Tony Choa4ab1ad2015-10-12 16:56:05 +09001348 hif_drv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_CONN_RESP,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001349 &strConnectInfo,
1350 MAC_DISCONNECTED,
1351 NULL,
Tony Choa4ab1ad2015-10-12 16:56:05 +09001352 hif_drv->strWILC_UsrConnReq.u32UserConnectPvoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001353
Shraddha Barke95f840f2015-10-14 07:29:19 +05301354 kfree(strConnectInfo.pu8ReqIEs);
1355 strConnectInfo.pu8ReqIEs = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001356 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001357 PRINT_ER("Connect callback function pointer is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001358 }
1359
Leo Kim45102f82015-10-28 15:59:28 +09001360 wid.id = (u16)WID_DISCONNECT;
1361 wid.type = WID_CHAR;
1362 wid.val = (s8 *)&u16DummyReasonCode;
1363 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001364
1365 PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
1366
Leo Kim45102f82015-10-28 15:59:28 +09001367 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001368 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09001369 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001370 PRINT_ER("Failed to send dissconect config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001371
Tony Choa4ab1ad2015-10-12 16:56:05 +09001372 hif_drv->strWILC_UsrConnReq.ssidLen = 0;
1373 kfree(hif_drv->strWILC_UsrConnReq.pu8ssid);
1374 kfree(hif_drv->strWILC_UsrConnReq.pu8bssid);
1375 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
1376 kfree(hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001377
Shraddha Barke281dd5a2015-10-05 17:00:33 +05301378 eth_zero_addr(u8ConnectedSSID);
Leo Kimae4dfa52015-10-13 19:49:26 +09001379
Leo Kim91109e12015-10-19 18:26:13 +09001380 if (join_req && join_req_drv == hif_drv) {
Leo Kim044a64102015-10-15 13:25:09 +09001381 kfree(join_req);
1382 join_req = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001383 }
Leo Kim48ce2462015-10-15 13:25:10 +09001384
Leo Kim91109e12015-10-19 18:26:13 +09001385 if (info_element && join_req_drv == hif_drv) {
Leo Kim48ce2462015-10-15 13:25:10 +09001386 kfree(info_element);
1387 info_element = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001388 }
1389
Leo Kim31390ee2015-10-19 18:26:08 +09001390 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001391}
1392
Tony Choa4ab1ad2015-10-12 16:56:05 +09001393static s32 Handle_RcvdNtwrkInfo(struct host_if_drv *hif_drv,
Tony Cho3bbd59f2015-09-21 12:16:38 +09001394 struct rcvd_net_info *pstrRcvdNetworkInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001395{
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001396 u32 i;
Dean Lee72ed4dc2015-06-12 14:11:44 +09001397 bool bNewNtwrkFound;
Leo Kim31390ee2015-10-19 18:26:08 +09001398 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001399 tstrNetworkInfo *pstrNetworkInfo = NULL;
1400 void *pJoinParams = NULL;
1401
Dean Lee72ed4dc2015-06-12 14:11:44 +09001402 bNewNtwrkFound = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001403 PRINT_INFO(HOSTINF_DBG, "Handling received network info\n");
1404
Tony Choa4ab1ad2015-10-12 16:56:05 +09001405 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001406 PRINT_D(HOSTINF_DBG, "State: Scanning, parsing network information received\n");
Leo Kimb021b802015-10-13 20:02:10 +09001407 parse_network_info(pstrRcvdNetworkInfo->buffer, &pstrNetworkInfo);
Leo Kim91109e12015-10-19 18:26:13 +09001408 if ((!pstrNetworkInfo) ||
1409 (!hif_drv->strWILC_UsrScanReq.pfUserScanResult)) {
Leo Kim24db7132015-09-16 18:36:01 +09001410 PRINT_ER("driver is null\n");
Leo Kim31390ee2015-10-19 18:26:08 +09001411 result = -EINVAL;
Leo Kim24db7132015-09-16 18:36:01 +09001412 goto done;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001413 }
1414
Tony Choa4ab1ad2015-10-12 16:56:05 +09001415 for (i = 0; i < hif_drv->strWILC_UsrScanReq.u32RcvdChCount; i++) {
Leo Kim91109e12015-10-19 18:26:13 +09001416 if ((hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].au8bssid) &&
1417 (pstrNetworkInfo->au8bssid)) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001418 if (memcmp(hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].au8bssid,
Leo Kim8c8360b2015-10-19 18:26:12 +09001419 pstrNetworkInfo->au8bssid, 6) == 0) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001420 if (pstrNetworkInfo->s8rssi <= hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].s8rssi) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001421 PRINT_D(HOSTINF_DBG, "Network previously discovered\n");
1422 goto done;
1423 } else {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001424 hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].s8rssi = pstrNetworkInfo->s8rssi;
Dean Lee72ed4dc2015-06-12 14:11:44 +09001425 bNewNtwrkFound = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001426 break;
1427 }
1428 }
1429 }
1430 }
1431
Punit Vara047e6642015-10-25 04:01:25 +05301432 if (bNewNtwrkFound) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001433 PRINT_D(HOSTINF_DBG, "New network found\n");
1434
Tony Choa4ab1ad2015-10-12 16:56:05 +09001435 if (hif_drv->strWILC_UsrScanReq.u32RcvdChCount < MAX_NUM_SCANNED_NETWORKS) {
1436 hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[hif_drv->strWILC_UsrScanReq.u32RcvdChCount].s8rssi = pstrNetworkInfo->s8rssi;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001437
Leo Kim91109e12015-10-19 18:26:13 +09001438 if (hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[hif_drv->strWILC_UsrScanReq.u32RcvdChCount].au8bssid &&
1439 pstrNetworkInfo->au8bssid) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001440 memcpy(hif_drv->strWILC_UsrScanReq.astrFoundNetworkInfo[hif_drv->strWILC_UsrScanReq.u32RcvdChCount].au8bssid,
Leo Kim8c8360b2015-10-19 18:26:12 +09001441 pstrNetworkInfo->au8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001442
Tony Choa4ab1ad2015-10-12 16:56:05 +09001443 hif_drv->strWILC_UsrScanReq.u32RcvdChCount++;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001444
Dean Lee72ed4dc2015-06-12 14:11:44 +09001445 pstrNetworkInfo->bNewNetwork = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001446 pJoinParams = host_int_ParseJoinBssParam(pstrNetworkInfo);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001447
Tony Choa4ab1ad2015-10-12 16:56:05 +09001448 hif_drv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_NETWORK_FOUND, pstrNetworkInfo,
1449 hif_drv->strWILC_UsrScanReq.u32UserScanPvoid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001450 pJoinParams);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001451 }
1452 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001453 PRINT_WRN(HOSTINF_DBG, "Discovered networks exceeded max. limit\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001454 }
1455 } else {
Dean Lee72ed4dc2015-06-12 14:11:44 +09001456 pstrNetworkInfo->bNewNetwork = false;
Tony Choa4ab1ad2015-10-12 16:56:05 +09001457 hif_drv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_NETWORK_FOUND, pstrNetworkInfo,
1458 hif_drv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001459 }
1460 }
1461
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001462done:
Shraddha Barke95f840f2015-10-14 07:29:19 +05301463 kfree(pstrRcvdNetworkInfo->buffer);
1464 pstrRcvdNetworkInfo->buffer = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001465
Leo Kim91109e12015-10-19 18:26:13 +09001466 if (pstrNetworkInfo) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001467 DeallocateNetworkInfo(pstrNetworkInfo);
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09001468 pstrNetworkInfo = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001469 }
1470
Leo Kim31390ee2015-10-19 18:26:08 +09001471 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001472}
1473
Tony Choa4ab1ad2015-10-12 16:56:05 +09001474static s32 Handle_RcvdGnrlAsyncInfo(struct host_if_drv *hif_drv,
Tony Chof23a9ea2015-09-21 12:16:39 +09001475 struct rcvd_async_info *pstrRcvdGnrlAsyncInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001476{
Leo Kim31390ee2015-10-19 18:26:08 +09001477 s32 result = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001478 u8 u8MsgType = 0;
1479 u8 u8MsgID = 0;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001480 u16 u16MsgLen = 0;
1481 u16 u16WidID = (u16)WID_NIL;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001482 u8 u8WidLen = 0;
1483 u8 u8MacStatus;
1484 u8 u8MacStatusReasonCode;
1485 u8 u8MacStatusAdditionalInfo;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001486 tstrConnectInfo strConnectInfo;
1487 tstrDisconnectNotifInfo strDisconnectNotifInfo;
Leo Kime6e12662015-09-16 18:36:03 +09001488 s32 s32Err = 0;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02001489
Tony Choa4ab1ad2015-10-12 16:56:05 +09001490 if (!hif_drv) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001491 PRINT_ER("Driver handler is NULL\n");
Leo Kim234837d2015-09-22 14:34:43 +09001492 return -ENODEV;
1493 }
Tony Choa4ab1ad2015-10-12 16:56:05 +09001494 PRINT_D(GENERIC_DBG, "Current State = %d,Received state = %d\n", hif_drv->enuHostIFstate,
Leo Kim33722ac72015-10-13 19:50:00 +09001495 pstrRcvdGnrlAsyncInfo->buffer[7]);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001496
Tony Choa4ab1ad2015-10-12 16:56:05 +09001497 if ((hif_drv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) ||
1498 (hif_drv->enuHostIFstate == HOST_IF_CONNECTED) ||
1499 hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
Leo Kim91109e12015-10-19 18:26:13 +09001500 if (!pstrRcvdGnrlAsyncInfo->buffer ||
1501 !hif_drv->strWILC_UsrConnReq.pfUserConnectResult) {
Leo Kim24db7132015-09-16 18:36:01 +09001502 PRINT_ER("driver is null\n");
1503 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001504 }
1505
Leo Kim33722ac72015-10-13 19:50:00 +09001506 u8MsgType = pstrRcvdGnrlAsyncInfo->buffer[0];
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001507
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001508 if ('I' != u8MsgType) {
1509 PRINT_ER("Received Message format incorrect.\n");
Leo Kim24db7132015-09-16 18:36:01 +09001510 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001511 }
1512
Leo Kim33722ac72015-10-13 19:50:00 +09001513 u8MsgID = pstrRcvdGnrlAsyncInfo->buffer[1];
1514 u16MsgLen = MAKE_WORD16(pstrRcvdGnrlAsyncInfo->buffer[2], pstrRcvdGnrlAsyncInfo->buffer[3]);
1515 u16WidID = MAKE_WORD16(pstrRcvdGnrlAsyncInfo->buffer[4], pstrRcvdGnrlAsyncInfo->buffer[5]);
1516 u8WidLen = pstrRcvdGnrlAsyncInfo->buffer[6];
1517 u8MacStatus = pstrRcvdGnrlAsyncInfo->buffer[7];
1518 u8MacStatusReasonCode = pstrRcvdGnrlAsyncInfo->buffer[8];
1519 u8MacStatusAdditionalInfo = pstrRcvdGnrlAsyncInfo->buffer[9];
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001520 PRINT_INFO(HOSTINF_DBG, "Recieved MAC status = %d with Reason = %d , Info = %d\n", u8MacStatus, u8MacStatusReasonCode, u8MacStatusAdditionalInfo);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001521 if (hif_drv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001522 u32 u32RcvdAssocRespInfoLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001523 tstrConnectRespInfo *pstrConnectRespInfo = NULL;
1524
1525 PRINT_D(HOSTINF_DBG, "Recieved MAC status = %d with Reason = %d , Code = %d\n", u8MacStatus, u8MacStatusReasonCode, u8MacStatusAdditionalInfo);
1526
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001527 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001528
1529 if (u8MacStatus == MAC_CONNECTED) {
Leo Kima633c0b2015-10-15 13:24:59 +09001530 memset(rcv_assoc_resp, 0, MAX_ASSOC_RESP_FRAME_SIZE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001531
Tony Choa4ab1ad2015-10-12 16:56:05 +09001532 host_int_get_assoc_res_info(hif_drv,
Leo Kima633c0b2015-10-15 13:24:59 +09001533 rcv_assoc_resp,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001534 MAX_ASSOC_RESP_FRAME_SIZE,
1535 &u32RcvdAssocRespInfoLen);
1536
1537 PRINT_INFO(HOSTINF_DBG, "Received association response with length = %d\n", u32RcvdAssocRespInfoLen);
1538
1539 if (u32RcvdAssocRespInfoLen != 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001540 PRINT_D(HOSTINF_DBG, "Parsing association response\n");
Leo Kima633c0b2015-10-15 13:24:59 +09001541 s32Err = ParseAssocRespInfo(rcv_assoc_resp, u32RcvdAssocRespInfoLen,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001542 &pstrConnectRespInfo);
1543 if (s32Err) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001544 PRINT_ER("ParseAssocRespInfo() returned error %d\n", s32Err);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001545 } else {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001546 strConnectInfo.u16ConnectStatus = pstrConnectRespInfo->u16ConnectStatus;
1547
1548 if (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE) {
1549 PRINT_INFO(HOSTINF_DBG, "Association response received : Successful connection status\n");
Leo Kim91109e12015-10-19 18:26:13 +09001550 if (pstrConnectRespInfo->pu8RespIEs) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001551 strConnectInfo.u16RespIEsLen = pstrConnectRespInfo->u16RespIEsLen;
Glen Leef3052582015-09-10 12:03:04 +09001552 strConnectInfo.pu8RespIEs = kmalloc(pstrConnectRespInfo->u16RespIEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001553 memcpy(strConnectInfo.pu8RespIEs, pstrConnectRespInfo->pu8RespIEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001554 pstrConnectRespInfo->u16RespIEsLen);
1555 }
1556 }
1557
Leo Kim91109e12015-10-19 18:26:13 +09001558 if (pstrConnectRespInfo) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001559 DeallocateAssocRespInfo(pstrConnectRespInfo);
1560 pstrConnectRespInfo = NULL;
1561 }
1562 }
1563 }
1564 }
1565
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001566 if ((u8MacStatus == MAC_CONNECTED) &&
1567 (strConnectInfo.u16ConnectStatus != SUCCESSFUL_STATUSCODE)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001568 PRINT_ER("Received MAC status is MAC_CONNECTED while the received status code in Asoc Resp is not SUCCESSFUL_STATUSCODE\n");
Shraddha Barke281dd5a2015-10-05 17:00:33 +05301569 eth_zero_addr(u8ConnectedSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001570
1571 } else if (u8MacStatus == MAC_DISCONNECTED) {
1572 PRINT_ER("Received MAC status is MAC_DISCONNECTED\n");
Shraddha Barke281dd5a2015-10-05 17:00:33 +05301573 eth_zero_addr(u8ConnectedSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001574 }
1575
Leo Kim91109e12015-10-19 18:26:13 +09001576 if (hif_drv->strWILC_UsrConnReq.pu8bssid) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001577 PRINT_D(HOSTINF_DBG, "Retrieving actual BSSID from AP\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09001578 memcpy(strConnectInfo.au8bssid, hif_drv->strWILC_UsrConnReq.pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001579
1580 if ((u8MacStatus == MAC_CONNECTED) &&
1581 (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE)) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001582 memcpy(hif_drv->au8AssociatedBSSID,
1583 hif_drv->strWILC_UsrConnReq.pu8bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001584 }
1585 }
1586
Leo Kim91109e12015-10-19 18:26:13 +09001587 if (hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001588 strConnectInfo.ReqIEsLen = hif_drv->strWILC_UsrConnReq.ConnReqIEsLen;
1589 strConnectInfo.pu8ReqIEs = kmalloc(hif_drv->strWILC_UsrConnReq.ConnReqIEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001590 memcpy(strConnectInfo.pu8ReqIEs,
Tony Choa4ab1ad2015-10-12 16:56:05 +09001591 hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs,
1592 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001593 }
1594
Tony Choa4ab1ad2015-10-12 16:56:05 +09001595 del_timer(&hif_drv->hConnectTimer);
1596 hif_drv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_CONN_RESP,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001597 &strConnectInfo,
1598 u8MacStatus,
1599 NULL,
Tony Choa4ab1ad2015-10-12 16:56:05 +09001600 hif_drv->strWILC_UsrConnReq.u32UserConnectPvoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001601
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001602 if ((u8MacStatus == MAC_CONNECTED) &&
1603 (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE)) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09001604 host_int_set_power_mgmt(hif_drv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001605
1606 PRINT_D(HOSTINF_DBG, "MAC status : CONNECTED and Connect Status : Successful\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09001607 hif_drv->enuHostIFstate = HOST_IF_CONNECTED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001608
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001609 PRINT_D(GENERIC_DBG, "Obtaining an IP, Disable Scan\n");
Dean Lee72ed4dc2015-06-12 14:11:44 +09001610 g_obtainingIP = true;
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07001611 mod_timer(&hDuringIpTimer,
1612 jiffies + msecs_to_jiffies(10000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001613 } else {
1614 PRINT_D(HOSTINF_DBG, "MAC status : %d and Connect Status : %d\n", u8MacStatus, strConnectInfo.u16ConnectStatus);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001615 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Leo Kimca8540e42015-10-15 13:25:00 +09001616 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001617 }
1618
Shraddha Barke95f840f2015-10-14 07:29:19 +05301619 kfree(strConnectInfo.pu8RespIEs);
1620 strConnectInfo.pu8RespIEs = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001621
Shraddha Barke95f840f2015-10-14 07:29:19 +05301622 kfree(strConnectInfo.pu8ReqIEs);
1623 strConnectInfo.pu8ReqIEs = NULL;
Tony Choa4ab1ad2015-10-12 16:56:05 +09001624 hif_drv->strWILC_UsrConnReq.ssidLen = 0;
1625 kfree(hif_drv->strWILC_UsrConnReq.pu8ssid);
1626 kfree(hif_drv->strWILC_UsrConnReq.pu8bssid);
1627 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
1628 kfree(hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001629 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
Tony Choa4ab1ad2015-10-12 16:56:05 +09001630 (hif_drv->enuHostIFstate == HOST_IF_CONNECTED)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001631 PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW\n");
1632
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001633 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001634
Tony Choa4ab1ad2015-10-12 16:56:05 +09001635 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001636 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running OBSS Scan >>\n\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09001637 del_timer(&hif_drv->hScanTimer);
1638 Handle_ScanDone((void *)hif_drv, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001639 }
1640
1641 strDisconnectNotifInfo.u16reason = 0;
1642 strDisconnectNotifInfo.ie = NULL;
1643 strDisconnectNotifInfo.ie_len = 0;
1644
Leo Kim91109e12015-10-19 18:26:13 +09001645 if (hif_drv->strWILC_UsrConnReq.pfUserConnectResult) {
Dean Lee72ed4dc2015-06-12 14:11:44 +09001646 g_obtainingIP = false;
Tony Choa4ab1ad2015-10-12 16:56:05 +09001647 host_int_set_power_mgmt(hif_drv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001648
Tony Choa4ab1ad2015-10-12 16:56:05 +09001649 hif_drv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_DISCONN_NOTIF,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001650 NULL,
1651 0,
1652 &strDisconnectNotifInfo,
Tony Choa4ab1ad2015-10-12 16:56:05 +09001653 hif_drv->strWILC_UsrConnReq.u32UserConnectPvoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001654
1655 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001656 PRINT_ER("Connect result callback function is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001657 }
1658
Tony Choa4ab1ad2015-10-12 16:56:05 +09001659 eth_zero_addr(hif_drv->au8AssociatedBSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001660
Tony Choa4ab1ad2015-10-12 16:56:05 +09001661 hif_drv->strWILC_UsrConnReq.ssidLen = 0;
1662 kfree(hif_drv->strWILC_UsrConnReq.pu8ssid);
1663 kfree(hif_drv->strWILC_UsrConnReq.pu8bssid);
1664 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
1665 kfree(hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001666
Leo Kim91109e12015-10-19 18:26:13 +09001667 if (join_req && join_req_drv == hif_drv) {
Leo Kim044a64102015-10-15 13:25:09 +09001668 kfree(join_req);
1669 join_req = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001670 }
Leo Kim48ce2462015-10-15 13:25:10 +09001671
Leo Kim91109e12015-10-19 18:26:13 +09001672 if (info_element && join_req_drv == hif_drv) {
Leo Kim48ce2462015-10-15 13:25:10 +09001673 kfree(info_element);
1674 info_element = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001675 }
1676
Tony Choa4ab1ad2015-10-12 16:56:05 +09001677 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Leo Kimca8540e42015-10-15 13:25:00 +09001678 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001679
1680 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
Leo Kim91109e12015-10-19 18:26:13 +09001681 (hif_drv->strWILC_UsrScanReq.pfUserScanResult)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001682 PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW while scanning\n");
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001683 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running Scan >>\n\n");
Leo Kimae4dfa52015-10-13 19:49:26 +09001684
Tony Choa4ab1ad2015-10-12 16:56:05 +09001685 del_timer(&hif_drv->hScanTimer);
1686 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult)
1687 Handle_ScanDone(hif_drv, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001688 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001689 }
1690
Shraddha Barke95f840f2015-10-14 07:29:19 +05301691 kfree(pstrRcvdGnrlAsyncInfo->buffer);
1692 pstrRcvdGnrlAsyncInfo->buffer = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001693
Leo Kim31390ee2015-10-19 18:26:08 +09001694 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001695}
1696
Tony Choa4ab1ad2015-10-12 16:56:05 +09001697static int Handle_Key(struct host_if_drv *hif_drv,
Tony Choc98387a2015-09-21 12:16:40 +09001698 struct key_attr *pstrHostIFkeyAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001699{
Leo Kim31390ee2015-10-19 18:26:08 +09001700 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09001701 struct wid wid;
Leo Kime9e0c262015-10-12 16:55:41 +09001702 struct wid strWIDList[5];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001703 u8 i;
1704 u8 *pu8keybuf;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001705 s8 s8idxarray[1];
1706 s8 ret = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001707
Leo Kim8e9f4272015-10-13 19:49:27 +09001708 switch (pstrHostIFkeyAttr->type) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001709 case WEP:
1710
Leo Kim0d17e382015-10-13 19:49:28 +09001711 if (pstrHostIFkeyAttr->action & ADDKEY_AP) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001712 PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
Leo Kimbafaa692015-10-28 15:59:21 +09001713 PRINT_D(GENERIC_DBG, "ID Hostint is %d\n", pstrHostIFkeyAttr->attr.wep.index);
Leo Kimdaaf16b2015-10-12 16:55:44 +09001714 strWIDList[0].id = (u16)WID_11I_MODE;
Leo Kim416d8322015-10-12 16:55:43 +09001715 strWIDList[0].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001716 strWIDList[0].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09001717 strWIDList[0].val = (s8 *)&pstrHostIFkeyAttr->attr.wep.mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001718
Leo Kimdaaf16b2015-10-12 16:55:44 +09001719 strWIDList[1].id = WID_AUTH_TYPE;
Leo Kim416d8322015-10-12 16:55:43 +09001720 strWIDList[1].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001721 strWIDList[1].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09001722 strWIDList[1].val = (s8 *)&pstrHostIFkeyAttr->attr.wep.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001723
Leo Kimdaaf16b2015-10-12 16:55:44 +09001724 strWIDList[2].id = (u16)WID_KEY_ID;
Leo Kim416d8322015-10-12 16:55:43 +09001725 strWIDList[2].type = WID_CHAR;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001726
Leo Kimbafaa692015-10-28 15:59:21 +09001727 strWIDList[2].val = (s8 *)&pstrHostIFkeyAttr->attr.wep.index;
Leo Kim2fd3e442015-10-12 16:55:45 +09001728 strWIDList[2].size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001729
Shraddha Barke543f5b12015-10-16 10:47:11 +05301730 pu8keybuf = kmemdup(pstrHostIFkeyAttr->attr.wep.key,
1731 pstrHostIFkeyAttr->attr.wep.key_len,
1732 GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001733
1734 if (pu8keybuf == NULL) {
1735 PRINT_ER("No buffer to send Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001736 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001737 }
1738
Leo Kim73b2e382015-10-13 19:49:29 +09001739 kfree(pstrHostIFkeyAttr->attr.wep.key);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001740
Leo Kimdaaf16b2015-10-12 16:55:44 +09001741 strWIDList[3].id = (u16)WID_WEP_KEY_VALUE;
Leo Kim416d8322015-10-12 16:55:43 +09001742 strWIDList[3].type = WID_STR;
Leo Kim73b2e382015-10-13 19:49:29 +09001743 strWIDList[3].size = pstrHostIFkeyAttr->attr.wep.key_len;
Leo Kim900bb4a2015-10-12 16:55:46 +09001744 strWIDList[3].val = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001745
Leo Kim31390ee2015-10-19 18:26:08 +09001746 result = send_config_pkt(SET_CFG, strWIDList, 4,
Leo Kim8c8360b2015-10-19 18:26:12 +09001747 get_id_from_handler(hif_drv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09001748 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001749 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001750
Leo Kim0d17e382015-10-13 19:49:28 +09001751 if (pstrHostIFkeyAttr->action & ADDKEY) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001752 PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
Leo Kim73b2e382015-10-13 19:49:29 +09001753 pu8keybuf = kmalloc(pstrHostIFkeyAttr->attr.wep.key_len + 2, GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09001754 if (!pu8keybuf) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001755 PRINT_ER("No buffer to send Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001756 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001757 }
Leo Kim73b2e382015-10-13 19:49:29 +09001758 pu8keybuf[0] = pstrHostIFkeyAttr->attr.wep.index;
1759 memcpy(pu8keybuf + 1, &pstrHostIFkeyAttr->attr.wep.key_len, 1);
1760 memcpy(pu8keybuf + 2, pstrHostIFkeyAttr->attr.wep.key,
Leo Kim8c8360b2015-10-19 18:26:12 +09001761 pstrHostIFkeyAttr->attr.wep.key_len);
Leo Kim73b2e382015-10-13 19:49:29 +09001762 kfree(pstrHostIFkeyAttr->attr.wep.key);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001763
Leo Kim45102f82015-10-28 15:59:28 +09001764 wid.id = (u16)WID_ADD_WEP_KEY;
1765 wid.type = WID_STR;
1766 wid.val = (s8 *)pu8keybuf;
1767 wid.size = pstrHostIFkeyAttr->attr.wep.key_len + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001768
Leo Kim45102f82015-10-28 15:59:28 +09001769 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001770 get_id_from_handler(hif_drv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09001771 kfree(pu8keybuf);
Leo Kim0d17e382015-10-13 19:49:28 +09001772 } else if (pstrHostIFkeyAttr->action & REMOVEKEY) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001773 PRINT_D(HOSTINF_DBG, "Removing key\n");
Leo Kim45102f82015-10-28 15:59:28 +09001774 wid.id = (u16)WID_REMOVE_WEP_KEY;
1775 wid.type = WID_STR;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001776
Leo Kim73b2e382015-10-13 19:49:29 +09001777 s8idxarray[0] = (s8)pstrHostIFkeyAttr->attr.wep.index;
Leo Kim45102f82015-10-28 15:59:28 +09001778 wid.val = s8idxarray;
1779 wid.size = 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001780
Leo Kim45102f82015-10-28 15:59:28 +09001781 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001782 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001783 } else {
Leo Kim45102f82015-10-28 15:59:28 +09001784 wid.id = (u16)WID_KEY_ID;
1785 wid.type = WID_CHAR;
1786 wid.val = (s8 *)&pstrHostIFkeyAttr->attr.wep.index;
1787 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001788
1789 PRINT_D(HOSTINF_DBG, "Setting default key index\n");
1790
Leo Kim45102f82015-10-28 15:59:28 +09001791 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001792 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001793 }
Tony Choa4ab1ad2015-10-12 16:56:05 +09001794 up(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001795 break;
1796
1797 case WPARxGtk:
Leo Kim0d17e382015-10-13 19:49:28 +09001798 if (pstrHostIFkeyAttr->action & ADDKEY_AP) {
Shraddha Barkeb156f1e2015-10-13 23:07:00 +05301799 pu8keybuf = kzalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09001800 if (!pu8keybuf) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001801 PRINT_ER("No buffer to send RxGTK Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001802 ret = -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001803 goto _WPARxGtk_end_case_;
1804 }
1805
Leo Kim91109e12015-10-19 18:26:13 +09001806 if (pstrHostIFkeyAttr->attr.wpa.seq)
Leo Kim0e74c002015-10-13 19:49:32 +09001807 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->attr.wpa.seq, 8);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001808
Leo Kime2dfbac2015-10-13 19:49:34 +09001809 memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->attr.wpa.index, 1);
Leo Kim6acf2912015-10-13 19:49:35 +09001810 memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
Leo Kim124968fc2015-10-13 19:49:30 +09001811 memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->attr.wpa.key,
Leo Kim8c8360b2015-10-19 18:26:12 +09001812 pstrHostIFkeyAttr->attr.wpa.key_len);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001813
Leo Kimdaaf16b2015-10-12 16:55:44 +09001814 strWIDList[0].id = (u16)WID_11I_MODE;
Leo Kim416d8322015-10-12 16:55:43 +09001815 strWIDList[0].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001816 strWIDList[0].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09001817 strWIDList[0].val = (s8 *)&pstrHostIFkeyAttr->attr.wpa.mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001818
Leo Kimdaaf16b2015-10-12 16:55:44 +09001819 strWIDList[1].id = (u16)WID_ADD_RX_GTK;
Leo Kim416d8322015-10-12 16:55:43 +09001820 strWIDList[1].type = WID_STR;
Leo Kim900bb4a2015-10-12 16:55:46 +09001821 strWIDList[1].val = (s8 *)pu8keybuf;
Leo Kim2fd3e442015-10-12 16:55:45 +09001822 strWIDList[1].size = RX_MIC_KEY_MSG_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001823
Leo Kim31390ee2015-10-19 18:26:08 +09001824 result = send_config_pkt(SET_CFG, strWIDList, 2,
Leo Kim8c8360b2015-10-19 18:26:12 +09001825 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001826
Chaehyun Lim49188af2015-08-11 10:32:41 +09001827 kfree(pu8keybuf);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001828 up(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001829 }
1830
Leo Kim0d17e382015-10-13 19:49:28 +09001831 if (pstrHostIFkeyAttr->action & ADDKEY) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001832 PRINT_D(HOSTINF_DBG, "Handling group key(Rx) function\n");
1833
Shraddha Barkeb156f1e2015-10-13 23:07:00 +05301834 pu8keybuf = kzalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001835 if (pu8keybuf == NULL) {
1836 PRINT_ER("No buffer to send RxGTK Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001837 ret = -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001838 goto _WPARxGtk_end_case_;
1839 }
1840
Tony Choa4ab1ad2015-10-12 16:56:05 +09001841 if (hif_drv->enuHostIFstate == HOST_IF_CONNECTED)
1842 memcpy(pu8keybuf, hif_drv->au8AssociatedBSSID, ETH_ALEN);
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05301843 else
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001844 PRINT_ER("Couldn't handle WPARxGtk while enuHostIFstate is not HOST_IF_CONNECTED\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001845
Leo Kim0e74c002015-10-13 19:49:32 +09001846 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->attr.wpa.seq, 8);
Leo Kime2dfbac2015-10-13 19:49:34 +09001847 memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->attr.wpa.index, 1);
Leo Kim6acf2912015-10-13 19:49:35 +09001848 memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
Leo Kim124968fc2015-10-13 19:49:30 +09001849 memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->attr.wpa.key,
Leo Kim8c8360b2015-10-19 18:26:12 +09001850 pstrHostIFkeyAttr->attr.wpa.key_len);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001851
Leo Kim45102f82015-10-28 15:59:28 +09001852 wid.id = (u16)WID_ADD_RX_GTK;
1853 wid.type = WID_STR;
1854 wid.val = (s8 *)pu8keybuf;
1855 wid.size = RX_MIC_KEY_MSG_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001856
Leo Kim45102f82015-10-28 15:59:28 +09001857 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001858 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001859
Chaehyun Lim49188af2015-08-11 10:32:41 +09001860 kfree(pu8keybuf);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001861 up(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001862 }
1863_WPARxGtk_end_case_:
Leo Kim124968fc2015-10-13 19:49:30 +09001864 kfree(pstrHostIFkeyAttr->attr.wpa.key);
Leo Kim0e74c002015-10-13 19:49:32 +09001865 kfree(pstrHostIFkeyAttr->attr.wpa.seq);
Luis de Bethencourt90819872015-10-26 05:52:50 +00001866 if (ret)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001867 return ret;
1868
1869 break;
1870
1871 case WPAPtk:
Leo Kim0d17e382015-10-13 19:49:28 +09001872 if (pstrHostIFkeyAttr->action & ADDKEY_AP) {
Glen Leef3052582015-09-10 12:03:04 +09001873 pu8keybuf = kmalloc(PTK_KEY_MSG_LEN + 1, GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09001874 if (!pu8keybuf) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001875 PRINT_ER("No buffer to send PTK Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001876 ret = -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001877 goto _WPAPtk_end_case_;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001878 }
1879
Leo Kim248080a2015-10-13 19:49:31 +09001880 memcpy(pu8keybuf, pstrHostIFkeyAttr->attr.wpa.mac_addr, 6);
Leo Kime2dfbac2015-10-13 19:49:34 +09001881 memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->attr.wpa.index, 1);
Leo Kim6acf2912015-10-13 19:49:35 +09001882 memcpy(pu8keybuf + 7, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
Leo Kim124968fc2015-10-13 19:49:30 +09001883 memcpy(pu8keybuf + 8, pstrHostIFkeyAttr->attr.wpa.key,
Leo Kim8c8360b2015-10-19 18:26:12 +09001884 pstrHostIFkeyAttr->attr.wpa.key_len);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001885
Leo Kimdaaf16b2015-10-12 16:55:44 +09001886 strWIDList[0].id = (u16)WID_11I_MODE;
Leo Kim416d8322015-10-12 16:55:43 +09001887 strWIDList[0].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09001888 strWIDList[0].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09001889 strWIDList[0].val = (s8 *)&pstrHostIFkeyAttr->attr.wpa.mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001890
Leo Kimdaaf16b2015-10-12 16:55:44 +09001891 strWIDList[1].id = (u16)WID_ADD_PTK;
Leo Kim416d8322015-10-12 16:55:43 +09001892 strWIDList[1].type = WID_STR;
Leo Kim900bb4a2015-10-12 16:55:46 +09001893 strWIDList[1].val = (s8 *)pu8keybuf;
Leo Kim2fd3e442015-10-12 16:55:45 +09001894 strWIDList[1].size = PTK_KEY_MSG_LEN + 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001895
Leo Kim31390ee2015-10-19 18:26:08 +09001896 result = send_config_pkt(SET_CFG, strWIDList, 2,
Leo Kim8c8360b2015-10-19 18:26:12 +09001897 get_id_from_handler(hif_drv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09001898 kfree(pu8keybuf);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001899 up(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001900 }
Leo Kim0d17e382015-10-13 19:49:28 +09001901 if (pstrHostIFkeyAttr->action & ADDKEY) {
Glen Leef3052582015-09-10 12:03:04 +09001902 pu8keybuf = kmalloc(PTK_KEY_MSG_LEN, GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09001903 if (!pu8keybuf) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001904 PRINT_ER("No buffer to send PTK Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001905 ret = -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001906 goto _WPAPtk_end_case_;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001907 }
1908
Leo Kim248080a2015-10-13 19:49:31 +09001909 memcpy(pu8keybuf, pstrHostIFkeyAttr->attr.wpa.mac_addr, 6);
Leo Kim6acf2912015-10-13 19:49:35 +09001910 memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->attr.wpa.key_len, 1);
Leo Kim124968fc2015-10-13 19:49:30 +09001911 memcpy(pu8keybuf + 7, pstrHostIFkeyAttr->attr.wpa.key,
Leo Kim8c8360b2015-10-19 18:26:12 +09001912 pstrHostIFkeyAttr->attr.wpa.key_len);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001913
Leo Kim45102f82015-10-28 15:59:28 +09001914 wid.id = (u16)WID_ADD_PTK;
1915 wid.type = WID_STR;
1916 wid.val = (s8 *)pu8keybuf;
1917 wid.size = PTK_KEY_MSG_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001918
Leo Kim45102f82015-10-28 15:59:28 +09001919 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001920 get_id_from_handler(hif_drv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09001921 kfree(pu8keybuf);
Tony Choa4ab1ad2015-10-12 16:56:05 +09001922 up(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001923 }
1924
1925_WPAPtk_end_case_:
Leo Kim124968fc2015-10-13 19:49:30 +09001926 kfree(pstrHostIFkeyAttr->attr.wpa.key);
Luis de Bethencourt90819872015-10-26 05:52:50 +00001927 if (ret)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001928 return ret;
1929
1930 break;
1931
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001932 case PMKSA:
1933
1934 PRINT_D(HOSTINF_DBG, "Handling PMKSA key\n");
1935
Leo Kim73b2e382015-10-13 19:49:29 +09001936 pu8keybuf = kmalloc((pstrHostIFkeyAttr->attr.pmkid.numpmkid * PMKSA_KEY_LEN) + 1, GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09001937 if (!pu8keybuf) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001938 PRINT_ER("No buffer to send PMKSA Key\n");
Luis de Bethencourt90819872015-10-26 05:52:50 +00001939 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001940 }
1941
Leo Kim73b2e382015-10-13 19:49:29 +09001942 pu8keybuf[0] = pstrHostIFkeyAttr->attr.pmkid.numpmkid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001943
Leo Kim73b2e382015-10-13 19:49:29 +09001944 for (i = 0; i < pstrHostIFkeyAttr->attr.pmkid.numpmkid; i++) {
1945 memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + 1), pstrHostIFkeyAttr->attr.pmkid.pmkidlist[i].bssid, ETH_ALEN);
1946 memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + ETH_ALEN + 1), pstrHostIFkeyAttr->attr.pmkid.pmkidlist[i].pmkid, PMKID_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001947 }
1948
Leo Kim45102f82015-10-28 15:59:28 +09001949 wid.id = (u16)WID_PMKID_INFO;
1950 wid.type = WID_STR;
1951 wid.val = (s8 *)pu8keybuf;
1952 wid.size = (pstrHostIFkeyAttr->attr.pmkid.numpmkid * PMKSA_KEY_LEN) + 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001953
Leo Kim45102f82015-10-28 15:59:28 +09001954 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001955 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001956
Chaehyun Lim49188af2015-08-11 10:32:41 +09001957 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001958 break;
1959 }
1960
Leo Kim31390ee2015-10-19 18:26:08 +09001961 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001962 PRINT_ER("Failed to send key config packet\n");
1963
Leo Kim31390ee2015-10-19 18:26:08 +09001964 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001965}
1966
Tony Choa4ab1ad2015-10-12 16:56:05 +09001967static void Handle_Disconnect(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001968{
Leo Kim45102f82015-10-28 15:59:28 +09001969 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001970
Leo Kim31390ee2015-10-19 18:26:08 +09001971 s32 result = 0;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001972 u16 u16DummyReasonCode = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001973
Leo Kim45102f82015-10-28 15:59:28 +09001974 wid.id = (u16)WID_DISCONNECT;
1975 wid.type = WID_CHAR;
1976 wid.val = (s8 *)&u16DummyReasonCode;
1977 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001978
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001979 PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
1980
Dean Lee72ed4dc2015-06-12 14:11:44 +09001981 g_obtainingIP = false;
Tony Choa4ab1ad2015-10-12 16:56:05 +09001982 host_int_set_power_mgmt(hif_drv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001983
Shraddha Barke281dd5a2015-10-05 17:00:33 +05301984 eth_zero_addr(u8ConnectedSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001985
Leo Kim45102f82015-10-28 15:59:28 +09001986 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09001987 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001988
Leo Kim31390ee2015-10-19 18:26:08 +09001989 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001990 PRINT_ER("Failed to send dissconect config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001991 } else {
1992 tstrDisconnectNotifInfo strDisconnectNotifInfo;
1993
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001994 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001995
1996 strDisconnectNotifInfo.u16reason = 0;
1997 strDisconnectNotifInfo.ie = NULL;
1998 strDisconnectNotifInfo.ie_len = 0;
1999
Tony Choa4ab1ad2015-10-12 16:56:05 +09002000 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
2001 del_timer(&hif_drv->hScanTimer);
2002 hif_drv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_ABORTED, NULL,
2003 hif_drv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002004
Tony Choa4ab1ad2015-10-12 16:56:05 +09002005 hif_drv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002006 }
2007
Leo Kim91109e12015-10-19 18:26:13 +09002008 if (hif_drv->strWILC_UsrConnReq.pfUserConnectResult) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09002009 if (hif_drv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002010 PRINT_D(HOSTINF_DBG, "Upper layer requested termination of connection\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09002011 del_timer(&hif_drv->hConnectTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002012 }
2013
Tony Choa4ab1ad2015-10-12 16:56:05 +09002014 hif_drv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_DISCONN_NOTIF, NULL,
2015 0, &strDisconnectNotifInfo, hif_drv->strWILC_UsrConnReq.u32UserConnectPvoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002016 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002017 PRINT_ER("strWILC_UsrConnReq.pfUserConnectResult = NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002018 }
2019
Leo Kimca8540e42015-10-15 13:25:00 +09002020 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002021
Tony Choa4ab1ad2015-10-12 16:56:05 +09002022 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002023
Tony Choa4ab1ad2015-10-12 16:56:05 +09002024 eth_zero_addr(hif_drv->au8AssociatedBSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002025
Tony Choa4ab1ad2015-10-12 16:56:05 +09002026 hif_drv->strWILC_UsrConnReq.ssidLen = 0;
2027 kfree(hif_drv->strWILC_UsrConnReq.pu8ssid);
2028 kfree(hif_drv->strWILC_UsrConnReq.pu8bssid);
2029 hif_drv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2030 kfree(hif_drv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002031
Leo Kim91109e12015-10-19 18:26:13 +09002032 if (join_req && join_req_drv == hif_drv) {
Leo Kim044a64102015-10-15 13:25:09 +09002033 kfree(join_req);
2034 join_req = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002035 }
Leo Kim48ce2462015-10-15 13:25:10 +09002036
Leo Kim91109e12015-10-19 18:26:13 +09002037 if (info_element && join_req_drv == hif_drv) {
Leo Kim48ce2462015-10-15 13:25:10 +09002038 kfree(info_element);
2039 info_element = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002040 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002041 }
2042
Tony Choa4ab1ad2015-10-12 16:56:05 +09002043 up(&hif_drv->hSemTestDisconnectBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002044}
2045
Tony Choa4ab1ad2015-10-12 16:56:05 +09002046void resolve_disconnect_aberration(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002047{
Tony Choa4ab1ad2015-10-12 16:56:05 +09002048 if (!hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002049 return;
Tony Choa4ab1ad2015-10-12 16:56:05 +09002050 if ((hif_drv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) || (hif_drv->enuHostIFstate == HOST_IF_CONNECTING)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002051 PRINT_D(HOSTINF_DBG, "\n\n<< correcting Supplicant state machine >>\n\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09002052 host_int_disconnect(hif_drv, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002053 }
2054}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002055
Tony Choa4ab1ad2015-10-12 16:56:05 +09002056static s32 Handle_GetChnl(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002057{
Leo Kim31390ee2015-10-19 18:26:08 +09002058 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002059 struct wid wid;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002060
Leo Kim45102f82015-10-28 15:59:28 +09002061 wid.id = (u16)WID_CURRENT_CHANNEL;
2062 wid.type = WID_CHAR;
2063 wid.val = (s8 *)&ch_no;
2064 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002065
2066 PRINT_D(HOSTINF_DBG, "Getting channel value\n");
2067
Leo Kim45102f82015-10-28 15:59:28 +09002068 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002069 get_id_from_handler(hif_drv));
Leo Kimae4dfa52015-10-13 19:49:26 +09002070
Leo Kim31390ee2015-10-19 18:26:08 +09002071 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002072 PRINT_ER("Failed to get channel number\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002073 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002074 }
2075
Tony Choa4ab1ad2015-10-12 16:56:05 +09002076 up(&hif_drv->hSemGetCHNL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002077
Leo Kim31390ee2015-10-19 18:26:08 +09002078 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002079}
2080
Tony Choa4ab1ad2015-10-12 16:56:05 +09002081static void Handle_GetRssi(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002082{
Leo Kim31390ee2015-10-19 18:26:08 +09002083 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002084 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002085
Leo Kim45102f82015-10-28 15:59:28 +09002086 wid.id = (u16)WID_RSSI;
2087 wid.type = WID_CHAR;
2088 wid.val = &rssi;
2089 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002090
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002091 PRINT_D(HOSTINF_DBG, "Getting RSSI value\n");
2092
Leo Kim45102f82015-10-28 15:59:28 +09002093 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002094 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002095 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002096 PRINT_ER("Failed to get RSSI value\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002097 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002098 }
2099
Tony Choa4ab1ad2015-10-12 16:56:05 +09002100 up(&hif_drv->hSemGetRSSI);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002101}
2102
Tony Choa4ab1ad2015-10-12 16:56:05 +09002103static void Handle_GetLinkspeed(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002104{
Leo Kim31390ee2015-10-19 18:26:08 +09002105 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002106 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002107
Leo Kim75327a02015-10-15 13:25:02 +09002108 link_speed = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002109
Leo Kim45102f82015-10-28 15:59:28 +09002110 wid.id = (u16)WID_LINKSPEED;
2111 wid.type = WID_CHAR;
2112 wid.val = &link_speed;
2113 wid.size = sizeof(char);
Leo Kimae4dfa52015-10-13 19:49:26 +09002114
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002115 PRINT_D(HOSTINF_DBG, "Getting LINKSPEED value\n");
2116
Leo Kim45102f82015-10-28 15:59:28 +09002117 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002118 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002119 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002120 PRINT_ER("Failed to get LINKSPEED value\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002121 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002122 }
2123
Leo Kimbafaa692015-10-28 15:59:21 +09002124 up(&hif_drv->hSemGetLINKSPEED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002125}
2126
Tony Choa4ab1ad2015-10-12 16:56:05 +09002127s32 Handle_GetStatistics(struct host_if_drv *hif_drv, struct rf_info *pstrStatistics)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002128{
Leo Kime9e0c262015-10-12 16:55:41 +09002129 struct wid strWIDList[5];
Leo Kim31390ee2015-10-19 18:26:08 +09002130 u32 u32WidsCount = 0, result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002131
Leo Kimdaaf16b2015-10-12 16:55:44 +09002132 strWIDList[u32WidsCount].id = WID_LINKSPEED;
Leo Kim416d8322015-10-12 16:55:43 +09002133 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09002134 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09002135 strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->u8LinkSpeed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002136 u32WidsCount++;
2137
Leo Kimdaaf16b2015-10-12 16:55:44 +09002138 strWIDList[u32WidsCount].id = WID_RSSI;
Leo Kim416d8322015-10-12 16:55:43 +09002139 strWIDList[u32WidsCount].type = WID_CHAR;
Leo Kim2fd3e442015-10-12 16:55:45 +09002140 strWIDList[u32WidsCount].size = sizeof(char);
Leo Kimbafaa692015-10-28 15:59:21 +09002141 strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->s8RSSI;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002142 u32WidsCount++;
2143
Leo Kimdaaf16b2015-10-12 16:55:44 +09002144 strWIDList[u32WidsCount].id = WID_SUCCESS_FRAME_COUNT;
Leo Kim416d8322015-10-12 16:55:43 +09002145 strWIDList[u32WidsCount].type = WID_INT;
Leo Kim2fd3e442015-10-12 16:55:45 +09002146 strWIDList[u32WidsCount].size = sizeof(u32);
Leo Kimbafaa692015-10-28 15:59:21 +09002147 strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->u32TxCount;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002148 u32WidsCount++;
2149
Leo Kimdaaf16b2015-10-12 16:55:44 +09002150 strWIDList[u32WidsCount].id = WID_RECEIVED_FRAGMENT_COUNT;
Leo Kim416d8322015-10-12 16:55:43 +09002151 strWIDList[u32WidsCount].type = WID_INT;
Leo Kim2fd3e442015-10-12 16:55:45 +09002152 strWIDList[u32WidsCount].size = sizeof(u32);
Leo Kimbafaa692015-10-28 15:59:21 +09002153 strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->u32RxCount;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002154 u32WidsCount++;
2155
Leo Kimdaaf16b2015-10-12 16:55:44 +09002156 strWIDList[u32WidsCount].id = WID_FAILED_COUNT;
Leo Kim416d8322015-10-12 16:55:43 +09002157 strWIDList[u32WidsCount].type = WID_INT;
Leo Kim2fd3e442015-10-12 16:55:45 +09002158 strWIDList[u32WidsCount].size = sizeof(u32);
Leo Kimbafaa692015-10-28 15:59:21 +09002159 strWIDList[u32WidsCount].val = (s8 *)&pstrStatistics->u32TxFailureCount;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002160 u32WidsCount++;
2161
Leo Kim31390ee2015-10-19 18:26:08 +09002162 result = send_config_pkt(GET_CFG, strWIDList, u32WidsCount,
Leo Kim8c8360b2015-10-19 18:26:12 +09002163 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002164
Leo Kim31390ee2015-10-19 18:26:08 +09002165 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002166 PRINT_ER("Failed to send scan paramters config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +09002167
Leo Kim2d25af82015-10-15 13:24:56 +09002168 up(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002169 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002170}
2171
Tony Choa4ab1ad2015-10-12 16:56:05 +09002172static s32 Handle_Get_InActiveTime(struct host_if_drv *hif_drv,
Tony Cho3d1eac02015-09-21 12:16:49 +09002173 struct sta_inactive_t *strHostIfStaInactiveT)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002174{
Leo Kim31390ee2015-10-19 18:26:08 +09002175 s32 result = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002176 u8 *stamac;
Leo Kim45102f82015-10-28 15:59:28 +09002177 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002178
Leo Kim45102f82015-10-28 15:59:28 +09002179 wid.id = (u16)WID_SET_STA_MAC_INACTIVE_TIME;
2180 wid.type = WID_STR;
2181 wid.size = ETH_ALEN;
2182 wid.val = kmalloc(wid.size, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002183
Leo Kim45102f82015-10-28 15:59:28 +09002184 stamac = wid.val;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002185 memcpy(stamac, strHostIfStaInactiveT->mac, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002186
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002187 PRINT_D(CFG80211_DBG, "SETING STA inactive time\n");
2188
Leo Kim45102f82015-10-28 15:59:28 +09002189 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002190 get_id_from_handler(hif_drv));
Leo Kimae4dfa52015-10-13 19:49:26 +09002191
Leo Kim31390ee2015-10-19 18:26:08 +09002192 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002193 PRINT_ER("Failed to SET incative time\n");
Leo Kim24db7132015-09-16 18:36:01 +09002194 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002195 }
2196
Leo Kim45102f82015-10-28 15:59:28 +09002197 wid.id = (u16)WID_GET_INACTIVE_TIME;
2198 wid.type = WID_INT;
2199 wid.val = (s8 *)&inactive_time;
2200 wid.size = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002201
Leo Kim45102f82015-10-28 15:59:28 +09002202 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002203 get_id_from_handler(hif_drv));
Leo Kimae4dfa52015-10-13 19:49:26 +09002204
Leo Kim31390ee2015-10-19 18:26:08 +09002205 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002206 PRINT_ER("Failed to get incative time\n");
Leo Kim24db7132015-09-16 18:36:01 +09002207 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002208 }
2209
Leo Kimad269062015-10-15 13:25:06 +09002210 PRINT_D(CFG80211_DBG, "Getting inactive time : %d\n", inactive_time);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002211
Tony Choa4ab1ad2015-10-12 16:56:05 +09002212 up(&hif_drv->hSemInactiveTime);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002213
Leo Kim31390ee2015-10-19 18:26:08 +09002214 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002215}
2216
Tony Choa4ab1ad2015-10-12 16:56:05 +09002217static void Handle_AddBeacon(struct host_if_drv *hif_drv,
Tony Cho7f33fec2015-09-30 18:44:30 +09002218 struct beacon_attr *pstrSetBeaconParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002219{
Leo Kim31390ee2015-10-19 18:26:08 +09002220 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002221 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002222 u8 *pu8CurrByte;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002223
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002224 PRINT_D(HOSTINF_DBG, "Adding BEACON\n");
2225
Leo Kim45102f82015-10-28 15:59:28 +09002226 wid.id = (u16)WID_ADD_BEACON;
2227 wid.type = WID_BIN;
2228 wid.size = pstrSetBeaconParam->head_len + pstrSetBeaconParam->tail_len + 16;
2229 wid.val = kmalloc(wid.size, GFP_KERNEL);
2230 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002231 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002232
Leo Kim45102f82015-10-28 15:59:28 +09002233 pu8CurrByte = wid.val;
Leo Kim12262dd2015-10-13 19:50:03 +09002234 *pu8CurrByte++ = (pstrSetBeaconParam->interval & 0xFF);
2235 *pu8CurrByte++ = ((pstrSetBeaconParam->interval >> 8) & 0xFF);
2236 *pu8CurrByte++ = ((pstrSetBeaconParam->interval >> 16) & 0xFF);
2237 *pu8CurrByte++ = ((pstrSetBeaconParam->interval >> 24) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002238
Leo Kime76ab772015-10-13 19:50:04 +09002239 *pu8CurrByte++ = (pstrSetBeaconParam->dtim_period & 0xFF);
2240 *pu8CurrByte++ = ((pstrSetBeaconParam->dtim_period >> 8) & 0xFF);
2241 *pu8CurrByte++ = ((pstrSetBeaconParam->dtim_period >> 16) & 0xFF);
2242 *pu8CurrByte++ = ((pstrSetBeaconParam->dtim_period >> 24) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002243
Leo Kim51c66182015-10-13 19:50:05 +09002244 *pu8CurrByte++ = (pstrSetBeaconParam->head_len & 0xFF);
2245 *pu8CurrByte++ = ((pstrSetBeaconParam->head_len >> 8) & 0xFF);
2246 *pu8CurrByte++ = ((pstrSetBeaconParam->head_len >> 16) & 0xFF);
2247 *pu8CurrByte++ = ((pstrSetBeaconParam->head_len >> 24) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002248
Leo Kim8ce528b2015-10-13 19:50:06 +09002249 memcpy(pu8CurrByte, pstrSetBeaconParam->head, pstrSetBeaconParam->head_len);
Leo Kim51c66182015-10-13 19:50:05 +09002250 pu8CurrByte += pstrSetBeaconParam->head_len;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002251
Leo Kim030c57e2015-10-13 19:50:07 +09002252 *pu8CurrByte++ = (pstrSetBeaconParam->tail_len & 0xFF);
2253 *pu8CurrByte++ = ((pstrSetBeaconParam->tail_len >> 8) & 0xFF);
2254 *pu8CurrByte++ = ((pstrSetBeaconParam->tail_len >> 16) & 0xFF);
2255 *pu8CurrByte++ = ((pstrSetBeaconParam->tail_len >> 24) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002256
Leo Kim7dbcb6d32015-10-13 19:50:08 +09002257 if (pstrSetBeaconParam->tail > 0)
2258 memcpy(pu8CurrByte, pstrSetBeaconParam->tail, pstrSetBeaconParam->tail_len);
Leo Kim030c57e2015-10-13 19:50:07 +09002259 pu8CurrByte += pstrSetBeaconParam->tail_len;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002260
Leo Kim45102f82015-10-28 15:59:28 +09002261 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002262 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002263 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002264 PRINT_ER("Failed to send add beacon config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002265
Leo Kim24db7132015-09-16 18:36:01 +09002266ERRORHANDLER:
Leo Kim45102f82015-10-28 15:59:28 +09002267 kfree(wid.val);
Leo Kim8ce528b2015-10-13 19:50:06 +09002268 kfree(pstrSetBeaconParam->head);
Leo Kim7dbcb6d32015-10-13 19:50:08 +09002269 kfree(pstrSetBeaconParam->tail);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002270}
2271
Tony Choa4ab1ad2015-10-12 16:56:05 +09002272static void Handle_DelBeacon(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002273{
Leo Kim31390ee2015-10-19 18:26:08 +09002274 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002275 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002276 u8 *pu8CurrByte;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002277
Leo Kim45102f82015-10-28 15:59:28 +09002278 wid.id = (u16)WID_DEL_BEACON;
2279 wid.type = WID_CHAR;
2280 wid.size = sizeof(char);
2281 wid.val = &del_beacon;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002282
Leo Kim45102f82015-10-28 15:59:28 +09002283 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002284 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002285
Leo Kim45102f82015-10-28 15:59:28 +09002286 pu8CurrByte = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002287
2288 PRINT_D(HOSTINF_DBG, "Deleting BEACON\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002289
Leo Kim45102f82015-10-28 15:59:28 +09002290 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002291 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002292 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002293 PRINT_ER("Failed to send delete beacon config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002294}
2295
Tony Cho6a89ba92015-09-21 12:16:46 +09002296static u32 WILC_HostIf_PackStaParam(u8 *pu8Buffer,
2297 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002298{
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002299 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002300
2301 pu8CurrByte = pu8Buffer;
2302
2303 PRINT_D(HOSTINF_DBG, "Packing STA params\n");
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002304 memcpy(pu8CurrByte, pstrStationParam->au8BSSID, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002305 pu8CurrByte += ETH_ALEN;
2306
2307 *pu8CurrByte++ = pstrStationParam->u16AssocID & 0xFF;
2308 *pu8CurrByte++ = (pstrStationParam->u16AssocID >> 8) & 0xFF;
2309
2310 *pu8CurrByte++ = pstrStationParam->u8NumRates;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02002311 if (pstrStationParam->u8NumRates > 0)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002312 memcpy(pu8CurrByte, pstrStationParam->pu8Rates, pstrStationParam->u8NumRates);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002313 pu8CurrByte += pstrStationParam->u8NumRates;
2314
2315 *pu8CurrByte++ = pstrStationParam->bIsHTSupported;
2316 *pu8CurrByte++ = pstrStationParam->u16HTCapInfo & 0xFF;
2317 *pu8CurrByte++ = (pstrStationParam->u16HTCapInfo >> 8) & 0xFF;
2318
2319 *pu8CurrByte++ = pstrStationParam->u8AmpduParams;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002320 memcpy(pu8CurrByte, pstrStationParam->au8SuppMCsSet, WILC_SUPP_MCS_SET_SIZE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002321 pu8CurrByte += WILC_SUPP_MCS_SET_SIZE;
2322
2323 *pu8CurrByte++ = pstrStationParam->u16HTExtParams & 0xFF;
2324 *pu8CurrByte++ = (pstrStationParam->u16HTExtParams >> 8) & 0xFF;
2325
2326 *pu8CurrByte++ = pstrStationParam->u32TxBeamformingCap & 0xFF;
2327 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 8) & 0xFF;
2328 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 16) & 0xFF;
2329 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 24) & 0xFF;
2330
2331 *pu8CurrByte++ = pstrStationParam->u8ASELCap;
2332
2333 *pu8CurrByte++ = pstrStationParam->u16FlagsMask & 0xFF;
2334 *pu8CurrByte++ = (pstrStationParam->u16FlagsMask >> 8) & 0xFF;
2335
2336 *pu8CurrByte++ = pstrStationParam->u16FlagsSet & 0xFF;
2337 *pu8CurrByte++ = (pstrStationParam->u16FlagsSet >> 8) & 0xFF;
2338
2339 return pu8CurrByte - pu8Buffer;
2340}
2341
Tony Choa4ab1ad2015-10-12 16:56:05 +09002342static void Handle_AddStation(struct host_if_drv *hif_drv,
Tony Cho6a89ba92015-09-21 12:16:46 +09002343 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002344{
Leo Kim31390ee2015-10-19 18:26:08 +09002345 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002346 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002347 u8 *pu8CurrByte;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002348
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002349 PRINT_D(HOSTINF_DBG, "Handling add station\n");
Leo Kim45102f82015-10-28 15:59:28 +09002350 wid.id = (u16)WID_ADD_STA;
2351 wid.type = WID_BIN;
2352 wid.size = WILC_ADD_STA_LENGTH + pstrStationParam->u8NumRates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002353
Leo Kim45102f82015-10-28 15:59:28 +09002354 wid.val = kmalloc(wid.size, GFP_KERNEL);
2355 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002356 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002357
Leo Kim45102f82015-10-28 15:59:28 +09002358 pu8CurrByte = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002359 pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
2360
Leo Kim45102f82015-10-28 15:59:28 +09002361 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002362 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002363 if (result != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002364 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002365
Leo Kim24db7132015-09-16 18:36:01 +09002366ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07002367 kfree(pstrStationParam->pu8Rates);
Leo Kim45102f82015-10-28 15:59:28 +09002368 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002369}
2370
Tony Choa4ab1ad2015-10-12 16:56:05 +09002371static void Handle_DelAllSta(struct host_if_drv *hif_drv,
Tony Chob4e644e2015-09-21 12:17:00 +09002372 struct del_all_sta *pstrDelAllStaParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002373{
Leo Kim31390ee2015-10-19 18:26:08 +09002374 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002375 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002376 u8 *pu8CurrByte;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002377 u8 i;
Chaehyun Lim37034802015-06-11 14:34:32 +09002378 u8 au8Zero_Buff[6] = {0};
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002379
Leo Kim45102f82015-10-28 15:59:28 +09002380 wid.id = (u16)WID_DEL_ALL_STA;
2381 wid.type = WID_STR;
2382 wid.size = (pstrDelAllStaParam->assoc_sta * ETH_ALEN) + 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002383
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002384 PRINT_D(HOSTINF_DBG, "Handling delete station\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002385
Leo Kim45102f82015-10-28 15:59:28 +09002386 wid.val = kmalloc((pstrDelAllStaParam->assoc_sta * ETH_ALEN) + 1, GFP_KERNEL);
2387 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002388 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002389
Leo Kim45102f82015-10-28 15:59:28 +09002390 pu8CurrByte = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002391
Leo Kim8ba18032015-10-13 19:50:10 +09002392 *(pu8CurrByte++) = pstrDelAllStaParam->assoc_sta;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002393
2394 for (i = 0; i < MAX_NUM_STA; i++) {
Leo Kime51b9212015-10-13 19:50:09 +09002395 if (memcmp(pstrDelAllStaParam->del_all_sta[i], au8Zero_Buff, ETH_ALEN))
2396 memcpy(pu8CurrByte, pstrDelAllStaParam->del_all_sta[i], ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002397 else
2398 continue;
2399
2400 pu8CurrByte += ETH_ALEN;
2401 }
2402
Leo Kim45102f82015-10-28 15:59:28 +09002403 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002404 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002405 if (result)
Luis de Bethencourt83cc9be2015-06-26 16:47:28 +02002406 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002407
Leo Kim24db7132015-09-16 18:36:01 +09002408ERRORHANDLER:
Leo Kim45102f82015-10-28 15:59:28 +09002409 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002410
Leo Kim2d25af82015-10-15 13:24:56 +09002411 up(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002412}
2413
Tony Choa4ab1ad2015-10-12 16:56:05 +09002414static void Handle_DelStation(struct host_if_drv *hif_drv,
Tony Chofb93a1e2015-09-21 12:16:57 +09002415 struct del_sta *pstrDelStaParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002416{
Leo Kim31390ee2015-10-19 18:26:08 +09002417 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002418 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002419 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002420
Leo Kim45102f82015-10-28 15:59:28 +09002421 wid.id = (u16)WID_REMOVE_STA;
2422 wid.type = WID_BIN;
2423 wid.size = ETH_ALEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002424
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002425 PRINT_D(HOSTINF_DBG, "Handling delete station\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002426
Leo Kim45102f82015-10-28 15:59:28 +09002427 wid.val = kmalloc(wid.size, GFP_KERNEL);
2428 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002429 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002430
Leo Kim45102f82015-10-28 15:59:28 +09002431 pu8CurrByte = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002432
Leo Kime4839d32015-10-13 20:02:06 +09002433 memcpy(pu8CurrByte, pstrDelStaParam->mac_addr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002434
Leo Kim45102f82015-10-28 15:59:28 +09002435 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002436 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002437 if (result)
Luis de Bethencourt83cc9be2015-06-26 16:47:28 +02002438 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002439
Leo Kim24db7132015-09-16 18:36:01 +09002440ERRORHANDLER:
Leo Kim45102f82015-10-28 15:59:28 +09002441 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002442}
2443
Tony Choa4ab1ad2015-10-12 16:56:05 +09002444static void Handle_EditStation(struct host_if_drv *hif_drv,
Tony Cho6a89ba92015-09-21 12:16:46 +09002445 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002446{
Leo Kim31390ee2015-10-19 18:26:08 +09002447 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002448 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002449 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002450
Leo Kim45102f82015-10-28 15:59:28 +09002451 wid.id = (u16)WID_EDIT_STA;
2452 wid.type = WID_BIN;
2453 wid.size = WILC_ADD_STA_LENGTH + pstrStationParam->u8NumRates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002454
2455 PRINT_D(HOSTINF_DBG, "Handling edit station\n");
Leo Kim45102f82015-10-28 15:59:28 +09002456 wid.val = kmalloc(wid.size, GFP_KERNEL);
2457 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002458 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002459
Leo Kim45102f82015-10-28 15:59:28 +09002460 pu8CurrByte = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002461 pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
2462
Leo Kim45102f82015-10-28 15:59:28 +09002463 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002464 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002465 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002466 PRINT_ER("Failed to send edit station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002467
Leo Kim24db7132015-09-16 18:36:01 +09002468ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07002469 kfree(pstrStationParam->pu8Rates);
Leo Kim45102f82015-10-28 15:59:28 +09002470 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002471}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002472
Tony Choa4ab1ad2015-10-12 16:56:05 +09002473static int Handle_RemainOnChan(struct host_if_drv *hif_drv,
Tony Cho2f9c03f2015-09-21 12:16:58 +09002474 struct remain_ch *pstrHostIfRemainOnChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002475{
Leo Kim31390ee2015-10-19 18:26:08 +09002476 s32 result = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002477 u8 u8remain_on_chan_flag;
Leo Kim45102f82015-10-28 15:59:28 +09002478 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002479
Tony Choa4ab1ad2015-10-12 16:56:05 +09002480 if (!hif_drv->u8RemainOnChan_pendingreq) {
2481 hif_drv->strHostIfRemainOnChan.pVoid = pstrHostIfRemainOnChan->pVoid;
2482 hif_drv->strHostIfRemainOnChan.pRemainOnChanExpired = pstrHostIfRemainOnChan->pRemainOnChanExpired;
2483 hif_drv->strHostIfRemainOnChan.pRemainOnChanReady = pstrHostIfRemainOnChan->pRemainOnChanReady;
2484 hif_drv->strHostIfRemainOnChan.u16Channel = pstrHostIfRemainOnChan->u16Channel;
2485 hif_drv->strHostIfRemainOnChan.u32ListenSessionID = pstrHostIfRemainOnChan->u32ListenSessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002486 } else {
Tony Choa4ab1ad2015-10-12 16:56:05 +09002487 pstrHostIfRemainOnChan->u16Channel = hif_drv->strHostIfRemainOnChan.u16Channel;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002488 }
2489
Leo Kim91109e12015-10-19 18:26:13 +09002490 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002491 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while scanning return\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09002492 hif_drv->u8RemainOnChan_pendingreq = 1;
Leo Kim31390ee2015-10-19 18:26:08 +09002493 result = -EBUSY;
Leo Kim24db7132015-09-16 18:36:01 +09002494 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002495 }
Tony Choa4ab1ad2015-10-12 16:56:05 +09002496 if (hif_drv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002497 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while connecting return\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002498 result = -EBUSY;
Leo Kim24db7132015-09-16 18:36:01 +09002499 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002500 }
2501
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002502 if (g_obtainingIP || connecting) {
2503 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002504 result = -EBUSY;
Leo Kim24db7132015-09-16 18:36:01 +09002505 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002506 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002507
2508 PRINT_D(HOSTINF_DBG, "Setting channel :%d\n", pstrHostIfRemainOnChan->u16Channel);
2509
Dean Lee72ed4dc2015-06-12 14:11:44 +09002510 u8remain_on_chan_flag = true;
Leo Kim45102f82015-10-28 15:59:28 +09002511 wid.id = (u16)WID_REMAIN_ON_CHAN;
2512 wid.type = WID_STR;
2513 wid.size = 2;
2514 wid.val = kmalloc(wid.size, GFP_KERNEL);
2515 if (!wid.val) {
Leo Kim31390ee2015-10-19 18:26:08 +09002516 result = -ENOMEM;
Leo Kim24db7132015-09-16 18:36:01 +09002517 goto ERRORHANDLER;
2518 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002519
Leo Kim45102f82015-10-28 15:59:28 +09002520 wid.val[0] = u8remain_on_chan_flag;
2521 wid.val[1] = (s8)pstrHostIfRemainOnChan->u16Channel;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002522
Leo Kim45102f82015-10-28 15:59:28 +09002523 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002524 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002525 if (result != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002526 PRINT_ER("Failed to set remain on channel\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002527
Leo Kim24db7132015-09-16 18:36:01 +09002528ERRORHANDLER:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002529 {
2530 P2P_LISTEN_STATE = 1;
Tony Choa4ab1ad2015-10-12 16:56:05 +09002531 hif_drv->hRemainOnChannel.data = (unsigned long)hif_drv;
2532 mod_timer(&hif_drv->hRemainOnChannel,
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07002533 jiffies +
2534 msecs_to_jiffies(pstrHostIfRemainOnChan->u32duration));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002535
Tony Choa4ab1ad2015-10-12 16:56:05 +09002536 if (hif_drv->strHostIfRemainOnChan.pRemainOnChanReady)
2537 hif_drv->strHostIfRemainOnChan.pRemainOnChanReady(hif_drv->strHostIfRemainOnChan.pVoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002538
Tony Choa4ab1ad2015-10-12 16:56:05 +09002539 if (hif_drv->u8RemainOnChan_pendingreq)
2540 hif_drv->u8RemainOnChan_pendingreq = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002541 }
Leo Kim31390ee2015-10-19 18:26:08 +09002542
2543 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002544}
2545
Tony Choa4ab1ad2015-10-12 16:56:05 +09002546static int Handle_RegisterFrame(struct host_if_drv *hif_drv,
Tony Chobc37c5d2015-09-21 12:16:59 +09002547 struct reg_frame *pstrHostIfRegisterFrame)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002548{
Leo Kim31390ee2015-10-19 18:26:08 +09002549 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002550 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002551 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002552
2553 PRINT_D(HOSTINF_DBG, "Handling frame register Flag : %d FrameType: %d\n", pstrHostIfRegisterFrame->bReg, pstrHostIfRegisterFrame->u16FrameType);
2554
Leo Kim45102f82015-10-28 15:59:28 +09002555 wid.id = (u16)WID_REGISTER_FRAME;
2556 wid.type = WID_STR;
2557 wid.val = kmalloc(sizeof(u16) + 2, GFP_KERNEL);
2558 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002559 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002560
Leo Kim45102f82015-10-28 15:59:28 +09002561 pu8CurrByte = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002562
2563 *pu8CurrByte++ = pstrHostIfRegisterFrame->bReg;
2564 *pu8CurrByte++ = pstrHostIfRegisterFrame->u8Regid;
Leo Kimbafaa692015-10-28 15:59:21 +09002565 memcpy(pu8CurrByte, &pstrHostIfRegisterFrame->u16FrameType,
2566 sizeof(u16));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002567
Leo Kim45102f82015-10-28 15:59:28 +09002568 wid.size = sizeof(u16) + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002569
Leo Kim45102f82015-10-28 15:59:28 +09002570 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002571 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002572 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002573 PRINT_ER("Failed to frame register config packet\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002574 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002575 }
2576
Leo Kim31390ee2015-10-19 18:26:08 +09002577 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002578}
2579
Tony Choa4ab1ad2015-10-12 16:56:05 +09002580static u32 Handle_ListenStateExpired(struct host_if_drv *hif_drv,
Tony Cho2f9c03f2015-09-21 12:16:58 +09002581 struct remain_ch *pstrHostIfRemainOnChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002582{
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002583 u8 u8remain_on_chan_flag;
Leo Kim45102f82015-10-28 15:59:28 +09002584 struct wid wid;
Leo Kim31390ee2015-10-19 18:26:08 +09002585 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002586
2587 PRINT_D(HOSTINF_DBG, "CANCEL REMAIN ON CHAN\n");
2588
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002589 if (P2P_LISTEN_STATE) {
Dean Lee72ed4dc2015-06-12 14:11:44 +09002590 u8remain_on_chan_flag = false;
Leo Kim45102f82015-10-28 15:59:28 +09002591 wid.id = (u16)WID_REMAIN_ON_CHAN;
2592 wid.type = WID_STR;
2593 wid.size = 2;
2594 wid.val = kmalloc(wid.size, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002595
Leo Kim45102f82015-10-28 15:59:28 +09002596 if (!wid.val)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002597 PRINT_ER("Failed to allocate memory\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002598
Leo Kim45102f82015-10-28 15:59:28 +09002599 wid.val[0] = u8remain_on_chan_flag;
2600 wid.val[1] = FALSE_FRMWR_CHANNEL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002601
Leo Kim45102f82015-10-28 15:59:28 +09002602 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002603 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002604 if (result != 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002605 PRINT_ER("Failed to set remain on channel\n");
2606 goto _done_;
2607 }
2608
Tony Choa4ab1ad2015-10-12 16:56:05 +09002609 if (hif_drv->strHostIfRemainOnChan.pRemainOnChanExpired) {
2610 hif_drv->strHostIfRemainOnChan.pRemainOnChanExpired(hif_drv->strHostIfRemainOnChan.pVoid
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002611 , pstrHostIfRemainOnChan->u32ListenSessionID);
2612 }
2613 P2P_LISTEN_STATE = 0;
2614 } else {
2615 PRINT_D(GENERIC_DBG, "Not in listen state\n");
Leo Kim31390ee2015-10-19 18:26:08 +09002616 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002617 }
2618
2619_done_:
Leo Kim31390ee2015-10-19 18:26:08 +09002620 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002621}
2622
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07002623static void ListenTimerCB(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002624{
Leo Kim31390ee2015-10-19 18:26:08 +09002625 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09002626 struct host_if_msg msg;
Tony Choa4ab1ad2015-10-12 16:56:05 +09002627 struct host_if_drv *hif_drv = (struct host_if_drv *)arg;
Leo Kimae4dfa52015-10-13 19:49:26 +09002628
Tony Choa4ab1ad2015-10-12 16:56:05 +09002629 del_timer(&hif_drv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002630
Tony Cho143eb952015-09-21 12:16:32 +09002631 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09002632 msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
Tony Choa4ab1ad2015-10-12 16:56:05 +09002633 msg.drv = hif_drv;
2634 msg.body.remain_on_ch.u32ListenSessionID = hif_drv->strHostIfRemainOnChan.u32ListenSessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002635
Leo Kim31390ee2015-10-19 18:26:08 +09002636 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
2637 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09002638 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002639}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002640
Tony Choa4ab1ad2015-10-12 16:56:05 +09002641static void Handle_PowerManagement(struct host_if_drv *hif_drv,
Tony Cho5a008f12015-09-21 12:16:48 +09002642 struct power_mgmt_param *strPowerMgmtParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002643{
Leo Kim31390ee2015-10-19 18:26:08 +09002644 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002645 struct wid wid;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002646 s8 s8PowerMode;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002647
Leo Kim45102f82015-10-28 15:59:28 +09002648 wid.id = (u16)WID_POWER_MANAGEMENT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002649
Punit Vara047e6642015-10-25 04:01:25 +05302650 if (strPowerMgmtParam->enabled)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002651 s8PowerMode = MIN_FAST_PS;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05302652 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002653 s8PowerMode = NO_POWERSAVE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002654 PRINT_D(HOSTINF_DBG, "Handling power mgmt to %d\n", s8PowerMode);
Leo Kim45102f82015-10-28 15:59:28 +09002655 wid.val = &s8PowerMode;
2656 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002657
2658 PRINT_D(HOSTINF_DBG, "Handling Power Management\n");
2659
Leo Kim45102f82015-10-28 15:59:28 +09002660 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002661 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002662 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002663 PRINT_ER("Failed to send power management config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002664}
2665
Tony Choa4ab1ad2015-10-12 16:56:05 +09002666static void Handle_SetMulticastFilter(struct host_if_drv *hif_drv,
Tony Cho641210a2015-09-21 12:16:52 +09002667 struct set_multicast *strHostIfSetMulti)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002668{
Leo Kim31390ee2015-10-19 18:26:08 +09002669 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002670 struct wid wid;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002671 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002672
2673 PRINT_D(HOSTINF_DBG, "Setup Multicast Filter\n");
2674
Leo Kim45102f82015-10-28 15:59:28 +09002675 wid.id = (u16)WID_SETUP_MULTICAST_FILTER;
2676 wid.type = WID_BIN;
2677 wid.size = sizeof(struct set_multicast) + ((strHostIfSetMulti->cnt) * ETH_ALEN);
2678 wid.val = kmalloc(wid.size, GFP_KERNEL);
2679 if (!wid.val)
Leo Kim24db7132015-09-16 18:36:01 +09002680 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002681
Leo Kim45102f82015-10-28 15:59:28 +09002682 pu8CurrByte = wid.val;
Leo Kimbae636eb2015-10-13 20:02:04 +09002683 *pu8CurrByte++ = (strHostIfSetMulti->enabled & 0xFF);
2684 *pu8CurrByte++ = ((strHostIfSetMulti->enabled >> 8) & 0xFF);
2685 *pu8CurrByte++ = ((strHostIfSetMulti->enabled >> 16) & 0xFF);
2686 *pu8CurrByte++ = ((strHostIfSetMulti->enabled >> 24) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002687
Leo Kimadab2f72015-10-13 20:02:05 +09002688 *pu8CurrByte++ = (strHostIfSetMulti->cnt & 0xFF);
2689 *pu8CurrByte++ = ((strHostIfSetMulti->cnt >> 8) & 0xFF);
2690 *pu8CurrByte++ = ((strHostIfSetMulti->cnt >> 16) & 0xFF);
2691 *pu8CurrByte++ = ((strHostIfSetMulti->cnt >> 24) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002692
Leo Kimadab2f72015-10-13 20:02:05 +09002693 if ((strHostIfSetMulti->cnt) > 0)
2694 memcpy(pu8CurrByte, gau8MulticastMacAddrList, ((strHostIfSetMulti->cnt) * ETH_ALEN));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002695
Leo Kim45102f82015-10-28 15:59:28 +09002696 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002697 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002698 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002699 PRINT_ER("Failed to send setup multicast config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002700
Leo Kim24db7132015-09-16 18:36:01 +09002701ERRORHANDLER:
Leo Kim45102f82015-10-28 15:59:28 +09002702 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002703}
2704
Tony Choa4ab1ad2015-10-12 16:56:05 +09002705static s32 Handle_AddBASession(struct host_if_drv *hif_drv,
Tony Cho54265472015-09-21 12:16:56 +09002706 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002707{
Leo Kim31390ee2015-10-19 18:26:08 +09002708 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002709 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002710 int AddbaTimeout = 100;
2711 char *ptr = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002712
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002713 PRINT_D(HOSTINF_DBG, "Opening Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\nBufferSize == %d\nSessionTimeOut = %d\n",
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002714 strHostIfBASessionInfo->au8Bssid[0],
2715 strHostIfBASessionInfo->au8Bssid[1],
2716 strHostIfBASessionInfo->au8Bssid[2],
2717 strHostIfBASessionInfo->u16BufferSize,
2718 strHostIfBASessionInfo->u16SessionTimeout,
2719 strHostIfBASessionInfo->u8Ted);
2720
Leo Kim45102f82015-10-28 15:59:28 +09002721 wid.id = (u16)WID_11E_P_ACTION_REQ;
2722 wid.type = WID_STR;
2723 wid.val = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
2724 wid.size = BLOCK_ACK_REQ_SIZE;
2725 ptr = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002726 *ptr++ = 0x14;
2727 *ptr++ = 0x3;
2728 *ptr++ = 0x0;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002729 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002730 ptr += ETH_ALEN;
2731 *ptr++ = strHostIfBASessionInfo->u8Ted;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002732 *ptr++ = 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002733 *ptr++ = (strHostIfBASessionInfo->u16BufferSize & 0xFF);
2734 *ptr++ = ((strHostIfBASessionInfo->u16BufferSize >> 16) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002735 *ptr++ = (strHostIfBASessionInfo->u16SessionTimeout & 0xFF);
2736 *ptr++ = ((strHostIfBASessionInfo->u16SessionTimeout >> 16) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002737 *ptr++ = (AddbaTimeout & 0xFF);
2738 *ptr++ = ((AddbaTimeout >> 16) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002739 *ptr++ = 8;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002740 *ptr++ = 0;
2741
Leo Kim45102f82015-10-28 15:59:28 +09002742 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002743 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002744 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002745 PRINT_D(HOSTINF_DBG, "Couldn't open BA Session\n");
2746
Leo Kim45102f82015-10-28 15:59:28 +09002747 wid.id = (u16)WID_11E_P_ACTION_REQ;
2748 wid.type = WID_STR;
2749 wid.size = 15;
2750 ptr = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002751 *ptr++ = 15;
2752 *ptr++ = 7;
2753 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002754 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002755 ptr += ETH_ALEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002756 *ptr++ = strHostIfBASessionInfo->u8Ted;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002757 *ptr++ = 8;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002758 *ptr++ = (strHostIfBASessionInfo->u16BufferSize & 0xFF);
2759 *ptr++ = ((strHostIfBASessionInfo->u16SessionTimeout >> 16) & 0xFF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002760 *ptr++ = 3;
Leo Kim45102f82015-10-28 15:59:28 +09002761 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002762 get_id_from_handler(hif_drv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002763
Leo Kim45102f82015-10-28 15:59:28 +09002764 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002765
Leo Kim31390ee2015-10-19 18:26:08 +09002766 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002767}
2768
Tony Choa4ab1ad2015-10-12 16:56:05 +09002769static s32 Handle_DelAllRxBASessions(struct host_if_drv *hif_drv,
Tony Cho54265472015-09-21 12:16:56 +09002770 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002771{
Leo Kim31390ee2015-10-19 18:26:08 +09002772 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09002773 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002774 char *ptr = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002775
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002776 PRINT_D(GENERIC_DBG, "Delete Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\n",
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002777 strHostIfBASessionInfo->au8Bssid[0],
2778 strHostIfBASessionInfo->au8Bssid[1],
2779 strHostIfBASessionInfo->au8Bssid[2],
2780 strHostIfBASessionInfo->u8Ted);
2781
Leo Kim45102f82015-10-28 15:59:28 +09002782 wid.id = (u16)WID_DEL_ALL_RX_BA;
2783 wid.type = WID_STR;
2784 wid.val = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
2785 wid.size = BLOCK_ACK_REQ_SIZE;
2786 ptr = wid.val;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002787 *ptr++ = 0x14;
2788 *ptr++ = 0x3;
2789 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002790 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002791 ptr += ETH_ALEN;
2792 *ptr++ = strHostIfBASessionInfo->u8Ted;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002793 *ptr++ = 0;
Leo Kimae4dfa52015-10-13 19:49:26 +09002794 *ptr++ = 32;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002795
Leo Kim45102f82015-10-28 15:59:28 +09002796 result = send_config_pkt(SET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09002797 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09002798 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002799 PRINT_D(HOSTINF_DBG, "Couldn't delete BA Session\n");
2800
Leo Kim45102f82015-10-28 15:59:28 +09002801 kfree(wid.val);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002802
Leo Kim2d25af82015-10-15 13:24:56 +09002803 up(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002804
Leo Kim31390ee2015-10-19 18:26:08 +09002805 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002806}
2807
Arnd Bergmann1999bd52015-05-29 22:52:14 +02002808static int hostIFthread(void *pvArg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002809{
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09002810 u32 u32Ret;
Tony Cho143eb952015-09-21 12:16:32 +09002811 struct host_if_msg msg;
Tony Choa4ab1ad2015-10-12 16:56:05 +09002812 struct host_if_drv *hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002813
Tony Cho143eb952015-09-21 12:16:32 +09002814 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002815
2816 while (1) {
Leo Kimcb067dc2015-10-15 13:24:53 +09002817 wilc_mq_recv(&hif_msg_q, &msg, sizeof(struct host_if_msg), &u32Ret);
Tony Choa4ab1ad2015-10-12 16:56:05 +09002818 hif_drv = (struct host_if_drv *)msg.drv;
Tony Choa9f812a2015-09-21 12:16:33 +09002819 if (msg.id == HOST_IF_MSG_EXIT) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002820 PRINT_D(GENERIC_DBG, "THREAD: Exiting HostIfThread\n");
2821 break;
2822 }
2823
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002824 if ((!g_wilc_initialized)) {
2825 PRINT_D(GENERIC_DBG, "--WAIT--");
Greg Kroah-Hartman80e29c72015-08-14 19:42:23 -07002826 usleep_range(200 * 1000, 200 * 1000);
Leo Kimcb067dc2015-10-15 13:24:53 +09002827 wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002828 continue;
2829 }
2830
Leo Kim91109e12015-10-19 18:26:13 +09002831 if (msg.id == HOST_IF_MSG_CONNECT &&
2832 hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002833 PRINT_D(HOSTINF_DBG, "Requeue connect request till scan done received\n");
Leo Kimcb067dc2015-10-15 13:24:53 +09002834 wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Greg Kroah-Hartman80e29c72015-08-14 19:42:23 -07002835 usleep_range(2 * 1000, 2 * 1000);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002836 continue;
2837 }
2838
Tony Choa9f812a2015-09-21 12:16:33 +09002839 switch (msg.id) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002840 case HOST_IF_MSG_Q_IDLE:
2841 Handle_wait_msg_q_empty();
2842 break;
2843
2844 case HOST_IF_MSG_SCAN:
Leo Kim2482a792015-10-12 16:55:36 +09002845 Handle_Scan(msg.drv, &msg.body.scan_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002846 break;
2847
2848 case HOST_IF_MSG_CONNECT:
Leo Kim2482a792015-10-12 16:55:36 +09002849 Handle_Connect(msg.drv, &msg.body.con_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002850 break;
2851
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002852 case HOST_IF_MSG_FLUSH_CONNECT:
Leo Kim2482a792015-10-12 16:55:36 +09002853 Handle_FlushConnect(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002854 break;
2855
2856 case HOST_IF_MSG_RCVD_NTWRK_INFO:
Leo Kim2482a792015-10-12 16:55:36 +09002857 Handle_RcvdNtwrkInfo(msg.drv, &msg.body.net_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002858 break;
2859
2860 case HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO:
Leo Kim2482a792015-10-12 16:55:36 +09002861 Handle_RcvdGnrlAsyncInfo(msg.drv, &msg.body.async_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002862 break;
2863
2864 case HOST_IF_MSG_KEY:
Leo Kim2482a792015-10-12 16:55:36 +09002865 Handle_Key(msg.drv, &msg.body.key_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002866 break;
2867
2868 case HOST_IF_MSG_CFG_PARAMS:
2869
Leo Kim2482a792015-10-12 16:55:36 +09002870 Handle_CfgParam(msg.drv, &msg.body.cfg_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002871 break;
2872
2873 case HOST_IF_MSG_SET_CHANNEL:
Leo Kim2482a792015-10-12 16:55:36 +09002874 Handle_SetChannel(msg.drv, &msg.body.channel_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002875 break;
2876
2877 case HOST_IF_MSG_DISCONNECT:
Leo Kim2482a792015-10-12 16:55:36 +09002878 Handle_Disconnect(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002879 break;
2880
2881 case HOST_IF_MSG_RCVD_SCAN_COMPLETE:
Tony Choa4ab1ad2015-10-12 16:56:05 +09002882 del_timer(&hif_drv->hScanTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002883 PRINT_D(HOSTINF_DBG, "scan completed successfully\n");
2884
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02002885 if (!linux_wlan_get_num_conn_ifcs())
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002886 chip_sleep_manually(INFINITE_SLEEP_TIME);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002887
Leo Kim2482a792015-10-12 16:55:36 +09002888 Handle_ScanDone(msg.drv, SCAN_EVENT_DONE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002889
Tony Choa4ab1ad2015-10-12 16:56:05 +09002890 if (hif_drv->u8RemainOnChan_pendingreq)
Leo Kim2482a792015-10-12 16:55:36 +09002891 Handle_RemainOnChan(msg.drv, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002892
2893 break;
2894
2895 case HOST_IF_MSG_GET_RSSI:
Leo Kim2482a792015-10-12 16:55:36 +09002896 Handle_GetRssi(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002897 break;
2898
2899 case HOST_IF_MSG_GET_LINKSPEED:
Leo Kim2482a792015-10-12 16:55:36 +09002900 Handle_GetLinkspeed(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002901 break;
2902
2903 case HOST_IF_MSG_GET_STATISTICS:
Leo Kim03e7b9c2015-10-12 16:55:58 +09002904 Handle_GetStatistics(msg.drv, (struct rf_info *)msg.body.data);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002905 break;
2906
2907 case HOST_IF_MSG_GET_CHNL:
Leo Kim2482a792015-10-12 16:55:36 +09002908 Handle_GetChnl(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002909 break;
2910
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002911 case HOST_IF_MSG_ADD_BEACON:
Leo Kim2482a792015-10-12 16:55:36 +09002912 Handle_AddBeacon(msg.drv, &msg.body.beacon_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002913 break;
2914
2915 case HOST_IF_MSG_DEL_BEACON:
Leo Kim2482a792015-10-12 16:55:36 +09002916 Handle_DelBeacon(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002917 break;
2918
2919 case HOST_IF_MSG_ADD_STATION:
Leo Kim2482a792015-10-12 16:55:36 +09002920 Handle_AddStation(msg.drv, &msg.body.add_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002921 break;
2922
2923 case HOST_IF_MSG_DEL_STATION:
Leo Kim2482a792015-10-12 16:55:36 +09002924 Handle_DelStation(msg.drv, &msg.body.del_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002925 break;
2926
2927 case HOST_IF_MSG_EDIT_STATION:
Leo Kim2482a792015-10-12 16:55:36 +09002928 Handle_EditStation(msg.drv, &msg.body.edit_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002929 break;
2930
2931 case HOST_IF_MSG_GET_INACTIVETIME:
Leo Kim2482a792015-10-12 16:55:36 +09002932 Handle_Get_InActiveTime(msg.drv, &msg.body.mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002933 break;
2934
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002935 case HOST_IF_MSG_SCAN_TIMER_FIRED:
2936 PRINT_D(HOSTINF_DBG, "Scan Timeout\n");
2937
Leo Kim2482a792015-10-12 16:55:36 +09002938 Handle_ScanDone(msg.drv, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002939 break;
2940
2941 case HOST_IF_MSG_CONNECT_TIMER_FIRED:
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002942 PRINT_D(HOSTINF_DBG, "Connect Timeout\n");
Leo Kim2482a792015-10-12 16:55:36 +09002943 Handle_ConnectTimeout(msg.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002944 break;
2945
2946 case HOST_IF_MSG_POWER_MGMT:
Leo Kim2482a792015-10-12 16:55:36 +09002947 Handle_PowerManagement(msg.drv, &msg.body.pwr_mgmt_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002948 break;
2949
2950 case HOST_IF_MSG_SET_WFIDRV_HANDLER:
Leo Kim2482a792015-10-12 16:55:36 +09002951 Handle_SetWfiDrvHandler(msg.drv,
Tony Cho5e4377e2015-09-30 18:44:38 +09002952 &msg.body.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002953 break;
2954
2955 case HOST_IF_MSG_SET_OPERATION_MODE:
Leo Kim2482a792015-10-12 16:55:36 +09002956 Handle_SetOperationMode(msg.drv, &msg.body.mode);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002957 break;
2958
2959 case HOST_IF_MSG_SET_IPADDRESS:
2960 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
Leo Kim78675be2015-10-13 20:02:09 +09002961 Handle_set_IPAddress(msg.drv, msg.body.ip_info.ip_addr, msg.body.ip_info.idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002962 break;
2963
2964 case HOST_IF_MSG_GET_IPADDRESS:
2965 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
Leo Kim78675be2015-10-13 20:02:09 +09002966 Handle_get_IPAddress(msg.drv, msg.body.ip_info.ip_addr, msg.body.ip_info.idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002967 break;
2968
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002969 case HOST_IF_MSG_SET_MAC_ADDRESS:
Leo Kim2482a792015-10-12 16:55:36 +09002970 Handle_SetMacAddress(msg.drv, &msg.body.set_mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002971 break;
2972
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002973 case HOST_IF_MSG_GET_MAC_ADDRESS:
Leo Kim2482a792015-10-12 16:55:36 +09002974 Handle_GetMacAddress(msg.drv, &msg.body.get_mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002975 break;
2976
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002977 case HOST_IF_MSG_REMAIN_ON_CHAN:
2978 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REMAIN_ON_CHAN\n");
Leo Kim2482a792015-10-12 16:55:36 +09002979 Handle_RemainOnChan(msg.drv, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002980 break;
2981
2982 case HOST_IF_MSG_REGISTER_FRAME:
2983 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REGISTER_FRAME\n");
Leo Kim2482a792015-10-12 16:55:36 +09002984 Handle_RegisterFrame(msg.drv, &msg.body.reg_frame);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002985 break;
2986
2987 case HOST_IF_MSG_LISTEN_TIMER_FIRED:
Leo Kim2482a792015-10-12 16:55:36 +09002988 Handle_ListenStateExpired(msg.drv, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002989 break;
2990
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002991 case HOST_IF_MSG_SET_MULTICAST_FILTER:
2992 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_MULTICAST_FILTER\n");
Leo Kim2482a792015-10-12 16:55:36 +09002993 Handle_SetMulticastFilter(msg.drv, &msg.body.multicast_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002994 break;
2995
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002996 case HOST_IF_MSG_ADD_BA_SESSION:
Leo Kim2482a792015-10-12 16:55:36 +09002997 Handle_AddBASession(msg.drv, &msg.body.session_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002998 break;
2999
3000 case HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS:
Leo Kim2482a792015-10-12 16:55:36 +09003001 Handle_DelAllRxBASessions(msg.drv, &msg.body.session_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003002 break;
3003
3004 case HOST_IF_MSG_DEL_ALL_STA:
Leo Kim2482a792015-10-12 16:55:36 +09003005 Handle_DelAllSta(msg.drv, &msg.body.del_all_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003006 break;
3007
3008 default:
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003009 PRINT_ER("[Host Interface] undefined Received Msg ID\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003010 break;
3011 }
3012 }
3013
3014 PRINT_D(HOSTINF_DBG, "Releasing thread exit semaphore\n");
Leo Kim834e0cb2015-10-15 13:24:54 +09003015 up(&hif_sema_thread);
Arnd Bergmann1999bd52015-05-29 22:52:14 +02003016 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003017}
3018
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003019static void TimerCB_Scan(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003020{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003021 void *pvArg = (void *)arg;
Tony Cho143eb952015-09-21 12:16:32 +09003022 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003023
Tony Cho143eb952015-09-21 12:16:32 +09003024 memset(&msg, 0, sizeof(struct host_if_msg));
Leo Kim2482a792015-10-12 16:55:36 +09003025 msg.drv = pvArg;
Tony Choa9f812a2015-09-21 12:16:33 +09003026 msg.id = HOST_IF_MSG_SCAN_TIMER_FIRED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003027
Leo Kimcb067dc2015-10-15 13:24:53 +09003028 wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003029}
3030
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003031static void TimerCB_Connect(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003032{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003033 void *pvArg = (void *)arg;
Tony Cho143eb952015-09-21 12:16:32 +09003034 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003035
Tony Cho143eb952015-09-21 12:16:32 +09003036 memset(&msg, 0, sizeof(struct host_if_msg));
Leo Kim2482a792015-10-12 16:55:36 +09003037 msg.drv = pvArg;
Tony Choa9f812a2015-09-21 12:16:33 +09003038 msg.id = HOST_IF_MSG_CONNECT_TIMER_FIRED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003039
Leo Kimcb067dc2015-10-15 13:24:53 +09003040 wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003041}
3042
Tony Choa4ab1ad2015-10-12 16:56:05 +09003043s32 host_int_remove_key(struct host_if_drv *hif_drv, const u8 *pu8StaAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003044{
Leo Kim45102f82015-10-28 15:59:28 +09003045 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003046
Leo Kim45102f82015-10-28 15:59:28 +09003047 wid.id = (u16)WID_REMOVE_KEY;
3048 wid.type = WID_STR;
3049 wid.val = (s8 *)pu8StaAddress;
3050 wid.size = 6;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003051
Leo Kimb68d820b2015-10-12 16:55:37 +09003052 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003053}
3054
Tony Choa4ab1ad2015-10-12 16:56:05 +09003055int host_int_remove_wep_key(struct host_if_drv *hif_drv, u8 index)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003056{
Chaehyun Lim9e5e8b42015-10-05 19:35:00 +09003057 int result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003058 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003059
Tony Choa4ab1ad2015-10-12 16:56:05 +09003060 if (!hif_drv) {
Chaehyun Lim9e5e8b42015-10-05 19:35:00 +09003061 result = -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003062 PRINT_ER("Failed to send setup multicast config packet\n");
Chaehyun Lim9e5e8b42015-10-05 19:35:00 +09003063 return result;
Leo Kim24db7132015-09-16 18:36:01 +09003064 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003065
Tony Cho143eb952015-09-21 12:16:32 +09003066 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003067
Tony Choa9f812a2015-09-21 12:16:33 +09003068 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003069 msg.body.key_info.type = WEP;
Leo Kim0d17e382015-10-13 19:49:28 +09003070 msg.body.key_info.action = REMOVEKEY;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003071 msg.drv = hif_drv;
Leo Kim73b2e382015-10-13 19:49:29 +09003072 msg.body.key_info.attr.wep.index = index;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003073
Leo Kimcb067dc2015-10-15 13:24:53 +09003074 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Chaehyun Lim9e5e8b42015-10-05 19:35:00 +09003075 if (result)
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003076 PRINT_ER("Error in sending message queue : Request to remove WEP key\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09003077 down(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003078
Chaehyun Lim9e5e8b42015-10-05 19:35:00 +09003079 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003080}
3081
Chaehyun Limdf8b4832015-10-26 09:44:45 +09003082int host_int_set_wep_default_key(struct host_if_drv *hif_drv, u8 index)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003083{
Chaehyun Lim5b41c7c2015-10-26 09:44:42 +09003084 int result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003085 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003086
Tony Choa4ab1ad2015-10-12 16:56:05 +09003087 if (!hif_drv) {
Leo Kim31390ee2015-10-19 18:26:08 +09003088 result = -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003089 PRINT_ER("driver is null\n");
Leo Kim31390ee2015-10-19 18:26:08 +09003090 return result;
Leo Kim24db7132015-09-16 18:36:01 +09003091 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003092
Tony Cho143eb952015-09-21 12:16:32 +09003093 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003094
Tony Choa9f812a2015-09-21 12:16:33 +09003095 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003096 msg.body.key_info.type = WEP;
Leo Kim0d17e382015-10-13 19:49:28 +09003097 msg.body.key_info.action = DEFAULTKEY;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003098 msg.drv = hif_drv;
Chaehyun Lime91d0342015-10-26 09:44:44 +09003099 msg.body.key_info.attr.wep.index = index;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003100
Leo Kim31390ee2015-10-19 18:26:08 +09003101 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3102 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003103 PRINT_ER("Error in sending message queue : Default key index\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09003104 down(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003105
Leo Kim31390ee2015-10-19 18:26:08 +09003106 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003107}
3108
Tony Choa4ab1ad2015-10-12 16:56:05 +09003109s32 host_int_add_wep_key_bss_sta(struct host_if_drv *hif_drv,
3110 const u8 *pu8WepKey,
3111 u8 u8WepKeylen,
3112 u8 u8Keyidx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003113{
Leo Kim31390ee2015-10-19 18:26:08 +09003114 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003115 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003116
Tony Choa4ab1ad2015-10-12 16:56:05 +09003117 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003118 PRINT_ER("driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003119 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003120 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003121
Tony Cho143eb952015-09-21 12:16:32 +09003122 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003123
Tony Choa9f812a2015-09-21 12:16:33 +09003124 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003125 msg.body.key_info.type = WEP;
Leo Kim0d17e382015-10-13 19:49:28 +09003126 msg.body.key_info.action = ADDKEY;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003127 msg.drv = hif_drv;
Leo Kim73b2e382015-10-13 19:49:29 +09003128 msg.body.key_info.attr.wep.key = kmalloc(u8WepKeylen, GFP_KERNEL);
3129 memcpy(msg.body.key_info.attr.wep.key, pu8WepKey, u8WepKeylen);
3130 msg.body.key_info.attr.wep.key_len = (u8WepKeylen);
3131 msg.body.key_info.attr.wep.index = u8Keyidx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003132
Leo Kim31390ee2015-10-19 18:26:08 +09003133 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3134 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003135 PRINT_ER("Error in sending message queue :WEP Key\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09003136 down(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003137
Leo Kim31390ee2015-10-19 18:26:08 +09003138 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003139}
3140
Tony Choa4ab1ad2015-10-12 16:56:05 +09003141s32 host_int_add_wep_key_bss_ap(struct host_if_drv *hif_drv,
3142 const u8 *pu8WepKey,
3143 u8 u8WepKeylen,
3144 u8 u8Keyidx,
3145 u8 u8mode,
3146 enum AUTHTYPE tenuAuth_type)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003147{
Leo Kim31390ee2015-10-19 18:26:08 +09003148 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003149 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003150 u8 i;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003151
Tony Choa4ab1ad2015-10-12 16:56:05 +09003152 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003153 PRINT_ER("driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003154 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003155 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003156
Tony Cho143eb952015-09-21 12:16:32 +09003157 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003158
3159 if (INFO) {
3160 for (i = 0; i < u8WepKeylen; i++)
3161 PRINT_INFO(HOSTAPD_DBG, "KEY is %x\n", pu8WepKey[i]);
3162 }
Tony Choa9f812a2015-09-21 12:16:33 +09003163 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003164 msg.body.key_info.type = WEP;
Leo Kim0d17e382015-10-13 19:49:28 +09003165 msg.body.key_info.action = ADDKEY_AP;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003166 msg.drv = hif_drv;
Leo Kim73b2e382015-10-13 19:49:29 +09003167 msg.body.key_info.attr.wep.key = kmalloc(u8WepKeylen, GFP_KERNEL);
3168 memcpy(msg.body.key_info.attr.wep.key, pu8WepKey, (u8WepKeylen));
3169 msg.body.key_info.attr.wep.key_len = (u8WepKeylen);
3170 msg.body.key_info.attr.wep.index = u8Keyidx;
3171 msg.body.key_info.attr.wep.mode = u8mode;
3172 msg.body.key_info.attr.wep.auth_type = tenuAuth_type;
Leo Kimae4dfa52015-10-13 19:49:26 +09003173
Leo Kim31390ee2015-10-19 18:26:08 +09003174 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003175
Leo Kim31390ee2015-10-19 18:26:08 +09003176 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003177 PRINT_ER("Error in sending message queue :WEP Key\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09003178 down(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003179
Leo Kim31390ee2015-10-19 18:26:08 +09003180 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003181}
Glen Lee108b3432015-09-16 18:53:20 +09003182
Tony Choa4ab1ad2015-10-12 16:56:05 +09003183s32 host_int_add_ptk(struct host_if_drv *hif_drv, const u8 *pu8Ptk,
3184 u8 u8PtkKeylen, const u8 *mac_addr,
3185 const u8 *pu8RxMic, const u8 *pu8TxMic,
3186 u8 mode, u8 u8Ciphermode, u8 u8Idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003187{
Leo Kim31390ee2015-10-19 18:26:08 +09003188 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003189 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003190 u8 u8KeyLen = u8PtkKeylen;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003191 u32 i;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003192
Tony Choa4ab1ad2015-10-12 16:56:05 +09003193 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003194 PRINT_ER("driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003195 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003196 }
Leo Kim91109e12015-10-19 18:26:13 +09003197
3198 if (pu8RxMic)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003199 u8KeyLen += RX_MIC_KEY_LEN;
Leo Kim91109e12015-10-19 18:26:13 +09003200
3201 if (pu8TxMic)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003202 u8KeyLen += TX_MIC_KEY_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003203
Tony Cho143eb952015-09-21 12:16:32 +09003204 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003205
Tony Choa9f812a2015-09-21 12:16:33 +09003206 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003207 msg.body.key_info.type = WPAPtk;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003208 if (mode == AP_MODE) {
Leo Kim0d17e382015-10-13 19:49:28 +09003209 msg.body.key_info.action = ADDKEY_AP;
Leo Kime2dfbac2015-10-13 19:49:34 +09003210 msg.body.key_info.attr.wpa.index = u8Idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003211 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003212 if (mode == STATION_MODE)
Leo Kim0d17e382015-10-13 19:49:28 +09003213 msg.body.key_info.action = ADDKEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003214
Leo Kim124968fc2015-10-13 19:49:30 +09003215 msg.body.key_info.attr.wpa.key = kmalloc(u8PtkKeylen, GFP_KERNEL);
3216 memcpy(msg.body.key_info.attr.wpa.key, pu8Ptk, u8PtkKeylen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003217
Leo Kim91109e12015-10-19 18:26:13 +09003218 if (pu8RxMic) {
Leo Kim124968fc2015-10-13 19:49:30 +09003219 memcpy(msg.body.key_info.attr.wpa.key + 16, pu8RxMic, RX_MIC_KEY_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003220 if (INFO) {
3221 for (i = 0; i < RX_MIC_KEY_LEN; i++)
3222 PRINT_INFO(CFG80211_DBG, "PairwiseRx[%d] = %x\n", i, pu8RxMic[i]);
3223 }
3224 }
Leo Kim91109e12015-10-19 18:26:13 +09003225 if (pu8TxMic) {
Leo Kim124968fc2015-10-13 19:49:30 +09003226 memcpy(msg.body.key_info.attr.wpa.key + 24, pu8TxMic, TX_MIC_KEY_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003227 if (INFO) {
3228 for (i = 0; i < TX_MIC_KEY_LEN; i++)
3229 PRINT_INFO(CFG80211_DBG, "PairwiseTx[%d] = %x\n", i, pu8TxMic[i]);
3230 }
3231 }
3232
Leo Kim6acf2912015-10-13 19:49:35 +09003233 msg.body.key_info.attr.wpa.key_len = u8KeyLen;
Leo Kim248080a2015-10-13 19:49:31 +09003234 msg.body.key_info.attr.wpa.mac_addr = mac_addr;
Leo Kim7b2ebb22015-10-13 19:49:36 +09003235 msg.body.key_info.attr.wpa.mode = u8Ciphermode;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003236 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003237
Leo Kim31390ee2015-10-19 18:26:08 +09003238 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003239
Leo Kim31390ee2015-10-19 18:26:08 +09003240 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003241 PRINT_ER("Error in sending message queue: PTK Key\n");
3242
Tony Choa4ab1ad2015-10-12 16:56:05 +09003243 down(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003244
Leo Kim31390ee2015-10-19 18:26:08 +09003245 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003246}
3247
Tony Choa4ab1ad2015-10-12 16:56:05 +09003248s32 host_int_add_rx_gtk(struct host_if_drv *hif_drv, const u8 *pu8RxGtk,
3249 u8 u8GtkKeylen, u8 u8KeyIdx,
3250 u32 u32KeyRSClen, const u8 *KeyRSC,
3251 const u8 *pu8RxMic, const u8 *pu8TxMic,
3252 u8 mode, u8 u8Ciphermode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003253{
Leo Kim31390ee2015-10-19 18:26:08 +09003254 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003255 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003256 u8 u8KeyLen = u8GtkKeylen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003257
Tony Choa4ab1ad2015-10-12 16:56:05 +09003258 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003259 PRINT_ER("driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003260 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003261 }
Tony Cho143eb952015-09-21 12:16:32 +09003262 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003263
Leo Kim91109e12015-10-19 18:26:13 +09003264 if (pu8RxMic)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003265 u8KeyLen += RX_MIC_KEY_LEN;
Leo Kim91109e12015-10-19 18:26:13 +09003266
3267 if (pu8TxMic)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003268 u8KeyLen += TX_MIC_KEY_LEN;
Leo Kim91109e12015-10-19 18:26:13 +09003269
3270 if (KeyRSC) {
Leo Kim0e74c002015-10-13 19:49:32 +09003271 msg.body.key_info.attr.wpa.seq = kmalloc(u32KeyRSClen, GFP_KERNEL);
3272 memcpy(msg.body.key_info.attr.wpa.seq, KeyRSC, u32KeyRSClen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003273 }
3274
Tony Choa9f812a2015-09-21 12:16:33 +09003275 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003276 msg.body.key_info.type = WPARxGtk;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003277 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003278
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003279 if (mode == AP_MODE) {
Leo Kim0d17e382015-10-13 19:49:28 +09003280 msg.body.key_info.action = ADDKEY_AP;
Leo Kim7b2ebb22015-10-13 19:49:36 +09003281 msg.body.key_info.attr.wpa.mode = u8Ciphermode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003282 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003283 if (mode == STATION_MODE)
Leo Kim0d17e382015-10-13 19:49:28 +09003284 msg.body.key_info.action = ADDKEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003285
Leo Kim124968fc2015-10-13 19:49:30 +09003286 msg.body.key_info.attr.wpa.key = kmalloc(u8KeyLen, GFP_KERNEL);
3287 memcpy(msg.body.key_info.attr.wpa.key, pu8RxGtk, u8GtkKeylen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003288
Leo Kimd1666e22015-10-28 15:59:22 +09003289 if (pu8RxMic)
3290 memcpy(msg.body.key_info.attr.wpa.key + 16, pu8RxMic,
3291 RX_MIC_KEY_LEN);
Leo Kim91109e12015-10-19 18:26:13 +09003292
Leo Kimd1666e22015-10-28 15:59:22 +09003293 if (pu8TxMic)
3294 memcpy(msg.body.key_info.attr.wpa.key + 24, pu8TxMic,
3295 TX_MIC_KEY_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003296
Leo Kime2dfbac2015-10-13 19:49:34 +09003297 msg.body.key_info.attr.wpa.index = u8KeyIdx;
Leo Kim6acf2912015-10-13 19:49:35 +09003298 msg.body.key_info.attr.wpa.key_len = u8KeyLen;
Leo Kimdacc5942015-10-13 19:49:33 +09003299 msg.body.key_info.attr.wpa.seq_len = u32KeyRSClen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003300
Leo Kim31390ee2015-10-19 18:26:08 +09003301 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3302 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003303 PRINT_ER("Error in sending message queue: RX GTK\n");
Leo Kimae4dfa52015-10-13 19:49:26 +09003304
Tony Choa4ab1ad2015-10-12 16:56:05 +09003305 down(&hif_drv->hSemTestKeyBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003306
Leo Kim31390ee2015-10-19 18:26:08 +09003307 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003308}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003309
Tony Choa4ab1ad2015-10-12 16:56:05 +09003310s32 host_int_set_pmkid_info(struct host_if_drv *hif_drv, struct host_if_pmkid_attr *pu8PmkidInfoArray)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003311{
Leo Kim31390ee2015-10-19 18:26:08 +09003312 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003313 struct host_if_msg msg;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003314 u32 i;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003315
Tony Choa4ab1ad2015-10-12 16:56:05 +09003316 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003317 PRINT_ER("driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003318 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003319 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003320
Tony Cho143eb952015-09-21 12:16:32 +09003321 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003322
Tony Choa9f812a2015-09-21 12:16:33 +09003323 msg.id = HOST_IF_MSG_KEY;
Leo Kim8e9f4272015-10-13 19:49:27 +09003324 msg.body.key_info.type = PMKSA;
Leo Kim0d17e382015-10-13 19:49:28 +09003325 msg.body.key_info.action = ADDKEY;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003326 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003327
3328 for (i = 0; i < pu8PmkidInfoArray->numpmkid; i++) {
Leo Kim8c8360b2015-10-19 18:26:12 +09003329 memcpy(msg.body.key_info.attr.pmkid.pmkidlist[i].bssid,
3330 &pu8PmkidInfoArray->pmkidlist[i].bssid, ETH_ALEN);
3331 memcpy(msg.body.key_info.attr.pmkid.pmkidlist[i].pmkid,
3332 &pu8PmkidInfoArray->pmkidlist[i].pmkid, PMKID_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003333 }
3334
Leo Kim31390ee2015-10-19 18:26:08 +09003335 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3336 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003337 PRINT_ER(" Error in sending messagequeue: PMKID Info\n");
3338
Leo Kim31390ee2015-10-19 18:26:08 +09003339 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003340}
3341
Tony Choa4ab1ad2015-10-12 16:56:05 +09003342s32 host_int_get_pmkid_info(struct host_if_drv *hif_drv,
3343 u8 *pu8PmkidInfoArray,
3344 u32 u32PmkidInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003345{
Leo Kim45102f82015-10-28 15:59:28 +09003346 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003347
Leo Kim45102f82015-10-28 15:59:28 +09003348 wid.id = (u16)WID_PMKID_INFO;
3349 wid.type = WID_STR;
3350 wid.size = u32PmkidInfoLen;
3351 wid.val = pu8PmkidInfoArray;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003352
Leo Kimb68d820b2015-10-12 16:55:37 +09003353 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003354}
3355
Tony Choa4ab1ad2015-10-12 16:56:05 +09003356s32 host_int_set_RSNAConfigPSKPassPhrase(struct host_if_drv *hif_drv,
3357 u8 *pu8PassPhrase,
3358 u8 u8Psklength)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003359{
Leo Kim45102f82015-10-28 15:59:28 +09003360 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003361
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003362 if ((u8Psklength > 7) && (u8Psklength < 65)) {
Leo Kim45102f82015-10-28 15:59:28 +09003363 wid.id = (u16)WID_11I_PSK;
3364 wid.type = WID_STR;
3365 wid.val = pu8PassPhrase;
3366 wid.size = u8Psklength;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003367 }
3368
Leo Kimb68d820b2015-10-12 16:55:37 +09003369 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003370}
Leo Kimae4dfa52015-10-13 19:49:26 +09003371
Tony Choa4ab1ad2015-10-12 16:56:05 +09003372s32 host_int_get_MacAddress(struct host_if_drv *hif_drv, u8 *pu8MacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003373{
Leo Kim31390ee2015-10-19 18:26:08 +09003374 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003375 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003376
Tony Cho143eb952015-09-21 12:16:32 +09003377 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003378
Tony Choa9f812a2015-09-21 12:16:33 +09003379 msg.id = HOST_IF_MSG_GET_MAC_ADDRESS;
Tony Choa5848692015-09-30 18:55:08 +09003380 msg.body.get_mac_info.u8MacAddress = pu8MacAddress;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003381 msg.drv = hif_drv;
Leo Kimae4dfa52015-10-13 19:49:26 +09003382
Leo Kim31390ee2015-10-19 18:26:08 +09003383 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3384 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003385 PRINT_ER("Failed to send get mac address\n");
Leo Kime6e12662015-09-16 18:36:03 +09003386 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003387 }
3388
Leo Kim2d25af82015-10-15 13:24:56 +09003389 down(&hif_sema_wait_response);
Leo Kim31390ee2015-10-19 18:26:08 +09003390 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003391}
3392
Tony Choa4ab1ad2015-10-12 16:56:05 +09003393s32 host_int_set_MacAddress(struct host_if_drv *hif_drv, u8 *pu8MacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003394{
Leo Kim31390ee2015-10-19 18:26:08 +09003395 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003396 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003397
3398 PRINT_D(GENERIC_DBG, "mac addr = %x:%x:%x\n", pu8MacAddress[0], pu8MacAddress[1], pu8MacAddress[2]);
3399
Tony Cho143eb952015-09-21 12:16:32 +09003400 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003401 msg.id = HOST_IF_MSG_SET_MAC_ADDRESS;
Leo Kimae5e4522015-10-28 15:59:31 +09003402 memcpy(msg.body.set_mac_info.mac_addr, pu8MacAddress, ETH_ALEN);
Tony Choa4ab1ad2015-10-12 16:56:05 +09003403 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003404
Leo Kim31390ee2015-10-19 18:26:08 +09003405 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3406 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003407 PRINT_ER("Failed to send message queue: Set mac address\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003408
Leo Kim31390ee2015-10-19 18:26:08 +09003409 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003410}
3411
Tony Choa4ab1ad2015-10-12 16:56:05 +09003412s32 host_int_get_RSNAConfigPSKPassPhrase(struct host_if_drv *hif_drv,
3413 u8 *pu8PassPhrase, u8 u8Psklength)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003414{
Leo Kim45102f82015-10-28 15:59:28 +09003415 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003416
Leo Kim45102f82015-10-28 15:59:28 +09003417 wid.id = (u16)WID_11I_PSK;
3418 wid.type = WID_STR;
3419 wid.size = u8Psklength;
3420 wid.val = pu8PassPhrase;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003421
Leo Kimb68d820b2015-10-12 16:55:37 +09003422 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003423}
3424
Tony Choa4ab1ad2015-10-12 16:56:05 +09003425s32 host_int_set_start_scan_req(struct host_if_drv *hif_drv, u8 scanSource)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003426{
Leo Kim45102f82015-10-28 15:59:28 +09003427 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003428
Leo Kim45102f82015-10-28 15:59:28 +09003429 wid.id = (u16)WID_START_SCAN_REQ;
3430 wid.type = WID_CHAR;
3431 wid.val = (s8 *)&scanSource;
3432 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003433
Leo Kimb68d820b2015-10-12 16:55:37 +09003434 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003435}
3436
Tony Choa4ab1ad2015-10-12 16:56:05 +09003437s32 host_int_get_start_scan_req(struct host_if_drv *hif_drv, u8 *pu8ScanSource)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003438{
Leo Kim45102f82015-10-28 15:59:28 +09003439 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003440
Leo Kim45102f82015-10-28 15:59:28 +09003441 wid.id = (u16)WID_START_SCAN_REQ;
3442 wid.type = WID_CHAR;
3443 wid.val = (s8 *)pu8ScanSource;
3444 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003445
Leo Kimb68d820b2015-10-12 16:55:37 +09003446 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003447}
3448
Tony Choa4ab1ad2015-10-12 16:56:05 +09003449s32 host_int_set_join_req(struct host_if_drv *hif_drv, u8 *pu8bssid,
3450 const u8 *pu8ssid, size_t ssidLen,
3451 const u8 *pu8IEs, size_t IEsLen,
3452 wilc_connect_result pfConnectResult, void *pvUserArg,
3453 u8 u8security, enum AUTHTYPE tenuAuth_type,
3454 u8 u8channel, void *pJoinParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003455{
Leo Kim31390ee2015-10-19 18:26:08 +09003456 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003457 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003458
Leo Kim91109e12015-10-19 18:26:13 +09003459 if (!hif_drv || !pfConnectResult) {
Leo Kim24db7132015-09-16 18:36:01 +09003460 PRINT_ER("Driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003461 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003462 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003463
Leo Kim91109e12015-10-19 18:26:13 +09003464 if (!pJoinParams) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003465 PRINT_ER("Unable to Join - JoinParams is NULL\n");
Leo Kim24db7132015-09-16 18:36:01 +09003466 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003467 }
Leo Kim24db7132015-09-16 18:36:01 +09003468
Tony Cho143eb952015-09-21 12:16:32 +09003469 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003470
Tony Choa9f812a2015-09-21 12:16:33 +09003471 msg.id = HOST_IF_MSG_CONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003472
Leo Kima64fd672015-10-13 19:49:54 +09003473 msg.body.con_info.security = u8security;
Leo Kim61b4fd02015-10-13 19:49:57 +09003474 msg.body.con_info.auth_type = tenuAuth_type;
Leo Kim0d1527e2015-10-13 19:49:58 +09003475 msg.body.con_info.ch = u8channel;
Leo Kim6abcc112015-10-13 19:49:55 +09003476 msg.body.con_info.result = pfConnectResult;
Leo Kim8f38db82015-10-13 19:49:56 +09003477 msg.body.con_info.arg = pvUserArg;
Leo Kimf2bed2c2015-10-13 19:49:59 +09003478 msg.body.con_info.params = pJoinParams;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003479 msg.drv = hif_drv ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003480
Leo Kim91109e12015-10-19 18:26:13 +09003481 if (pu8bssid) {
Leo Kim9254db02015-10-13 19:49:49 +09003482 msg.body.con_info.bssid = kmalloc(6, GFP_KERNEL);
3483 memcpy(msg.body.con_info.bssid, pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003484 }
3485
Leo Kim91109e12015-10-19 18:26:13 +09003486 if (pu8ssid) {
Leo Kim8b3c9fa2015-10-13 19:49:51 +09003487 msg.body.con_info.ssid_len = ssidLen;
Leo Kimf7bbd9c2015-10-13 19:49:50 +09003488 msg.body.con_info.ssid = kmalloc(ssidLen, GFP_KERNEL);
3489 memcpy(msg.body.con_info.ssid, pu8ssid, ssidLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003490 }
3491
Leo Kim91109e12015-10-19 18:26:13 +09003492 if (pu8IEs) {
Leo Kimb59d5c52015-10-13 19:49:53 +09003493 msg.body.con_info.ies_len = IEsLen;
Leo Kim2ea158c2015-10-13 19:49:52 +09003494 msg.body.con_info.ies = kmalloc(IEsLen, GFP_KERNEL);
3495 memcpy(msg.body.con_info.ies, pu8IEs, IEsLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003496 }
Tony Choa4ab1ad2015-10-12 16:56:05 +09003497 if (hif_drv->enuHostIFstate < HOST_IF_CONNECTING)
3498 hif_drv->enuHostIFstate = HOST_IF_CONNECTING;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05303499 else
Tony Choa4ab1ad2015-10-12 16:56:05 +09003500 PRINT_D(GENERIC_DBG, "Don't set state to 'connecting' as state is %d\n", hif_drv->enuHostIFstate);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003501
Leo Kim31390ee2015-10-19 18:26:08 +09003502 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3503 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003504 PRINT_ER("Failed to send message queue: Set join request\n");
Leo Kim24db7132015-09-16 18:36:01 +09003505 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003506 }
3507
Tony Choa4ab1ad2015-10-12 16:56:05 +09003508 hif_drv->hConnectTimer.data = (unsigned long)hif_drv;
3509 mod_timer(&hif_drv->hConnectTimer,
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07003510 jiffies + msecs_to_jiffies(HOST_IF_CONNECT_TIMEOUT));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003511
Leo Kim31390ee2015-10-19 18:26:08 +09003512 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003513}
3514
Tony Choa4ab1ad2015-10-12 16:56:05 +09003515s32 host_int_flush_join_req(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003516{
Leo Kim31390ee2015-10-19 18:26:08 +09003517 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003518 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003519
Leo Kim7717880782015-10-19 18:26:11 +09003520 if (!join_req)
3521 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003522
Tony Choa4ab1ad2015-10-12 16:56:05 +09003523 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003524 PRINT_ER("Driver is null\n");
Leo Kim7717880782015-10-19 18:26:11 +09003525 return -EFAULT;
Leo Kim24db7132015-09-16 18:36:01 +09003526 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003527
Tony Choa9f812a2015-09-21 12:16:33 +09003528 msg.id = HOST_IF_MSG_FLUSH_CONNECT;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003529 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003530
Leo Kim31390ee2015-10-19 18:26:08 +09003531 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3532 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003533 PRINT_ER("Failed to send message queue: Flush join request\n");
Leo Kim24db7132015-09-16 18:36:01 +09003534 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003535 }
3536
Leo Kim31390ee2015-10-19 18:26:08 +09003537 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003538}
3539
Tony Choa4ab1ad2015-10-12 16:56:05 +09003540s32 host_int_disconnect(struct host_if_drv *hif_drv, u16 u16ReasonCode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003541{
Leo Kim31390ee2015-10-19 18:26:08 +09003542 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003543 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003544
Tony Choa4ab1ad2015-10-12 16:56:05 +09003545 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003546 PRINT_ER("Driver is null\n");
3547 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003548 }
3549
Tony Cho143eb952015-09-21 12:16:32 +09003550 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003551
Tony Choa9f812a2015-09-21 12:16:33 +09003552 msg.id = HOST_IF_MSG_DISCONNECT;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003553 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003554
Leo Kim31390ee2015-10-19 18:26:08 +09003555 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3556 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003557 PRINT_ER("Failed to send message queue: disconnect\n");
Leo Kimae4dfa52015-10-13 19:49:26 +09003558
Tony Choa4ab1ad2015-10-12 16:56:05 +09003559 down(&hif_drv->hSemTestDisconnectBlock);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003560
Leo Kim31390ee2015-10-19 18:26:08 +09003561 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003562}
3563
Tony Choa4ab1ad2015-10-12 16:56:05 +09003564s32 host_int_disconnect_station(struct host_if_drv *hif_drv, u8 assoc_id)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003565{
Leo Kim45102f82015-10-28 15:59:28 +09003566 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003567
Leo Kim45102f82015-10-28 15:59:28 +09003568 wid.id = (u16)WID_DISCONNECT;
3569 wid.type = WID_CHAR;
3570 wid.val = (s8 *)&assoc_id;
3571 wid.size = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003572
Leo Kimb68d820b2015-10-12 16:55:37 +09003573 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003574}
3575
Leo Kim8c8360b2015-10-19 18:26:12 +09003576s32 host_int_get_assoc_req_info(struct host_if_drv *hif_drv,
3577 u8 *pu8AssocReqInfo,
3578 u32 u32AssocReqInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003579{
Leo Kim45102f82015-10-28 15:59:28 +09003580 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003581
Leo Kim45102f82015-10-28 15:59:28 +09003582 wid.id = (u16)WID_ASSOC_REQ_INFO;
3583 wid.type = WID_STR;
3584 wid.val = pu8AssocReqInfo;
3585 wid.size = u32AssocReqInfoLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003586
Leo Kimb68d820b2015-10-12 16:55:37 +09003587 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003588}
3589
Leo Kim8c8360b2015-10-19 18:26:12 +09003590s32 host_int_get_assoc_res_info(struct host_if_drv *hif_drv,
3591 u8 *pu8AssocRespInfo,
3592 u32 u32MaxAssocRespInfoLen,
3593 u32 *pu32RcvdAssocRespInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003594{
Leo Kim31390ee2015-10-19 18:26:08 +09003595 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09003596 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003597
Tony Choa4ab1ad2015-10-12 16:56:05 +09003598 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003599 PRINT_ER("Driver is null\n");
3600 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003601 }
3602
Leo Kim45102f82015-10-28 15:59:28 +09003603 wid.id = (u16)WID_ASSOC_RES_INFO;
3604 wid.type = WID_STR;
3605 wid.val = pu8AssocRespInfo;
3606 wid.size = u32MaxAssocRespInfoLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003607
Leo Kim45102f82015-10-28 15:59:28 +09003608 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09003609 get_id_from_handler(hif_drv));
Leo Kim31390ee2015-10-19 18:26:08 +09003610 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003611 *pu32RcvdAssocRespInfoLen = 0;
Leo Kim24db7132015-09-16 18:36:01 +09003612 PRINT_ER("Failed to send association response config packet\n");
3613 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003614 } else {
Leo Kim45102f82015-10-28 15:59:28 +09003615 *pu32RcvdAssocRespInfoLen = wid.size;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003616 }
3617
Leo Kim31390ee2015-10-19 18:26:08 +09003618 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003619}
3620
Leo Kim8c8360b2015-10-19 18:26:12 +09003621s32 host_int_get_rx_power_level(struct host_if_drv *hif_drv,
3622 u8 *pu8RxPowerLevel,
3623 u32 u32RxPowerLevelLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003624{
Leo Kim45102f82015-10-28 15:59:28 +09003625 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003626
Leo Kim45102f82015-10-28 15:59:28 +09003627 wid.id = (u16)WID_RX_POWER_LEVEL;
3628 wid.type = WID_STR;
3629 wid.val = pu8RxPowerLevel;
3630 wid.size = u32RxPowerLevelLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003631
Leo Kimb68d820b2015-10-12 16:55:37 +09003632 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003633}
3634
Tony Choa4ab1ad2015-10-12 16:56:05 +09003635int host_int_set_mac_chnl_num(struct host_if_drv *hif_drv, u8 channel)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003636{
Chaehyun Lim792fb252015-10-05 11:07:22 +09003637 int result;
Tony Cho143eb952015-09-21 12:16:32 +09003638 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003639
Tony Choa4ab1ad2015-10-12 16:56:05 +09003640 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003641 PRINT_ER("driver is null\n");
3642 return -EFAULT;
3643 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003644
Tony Cho143eb952015-09-21 12:16:32 +09003645 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003646 msg.id = HOST_IF_MSG_SET_CHANNEL;
Leo Kim730ee052015-10-13 19:50:02 +09003647 msg.body.channel_info.set_ch = channel;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003648 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003649
Leo Kimcb067dc2015-10-15 13:24:53 +09003650 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Chaehyun Lim1ef58e42015-10-02 21:44:49 +09003651 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09003652 PRINT_ER("wilc mq send fail\n");
Chaehyun Lim792fb252015-10-05 11:07:22 +09003653 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003654 }
3655
Chaehyun Lim792fb252015-10-05 11:07:22 +09003656 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003657}
3658
Chaehyun Lim244efb12015-10-02 21:44:53 +09003659int host_int_wait_msg_queue_idle(void)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003660{
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09003661 int result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003662 struct host_if_msg msg;
Leo Kimc09389a2015-10-28 15:59:24 +09003663
Tony Cho143eb952015-09-21 12:16:32 +09003664 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003665 msg.id = HOST_IF_MSG_Q_IDLE;
Leo Kimcb067dc2015-10-15 13:24:53 +09003666 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09003667 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09003668 PRINT_ER("wilc mq send fail\n");
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09003669 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003670 }
3671
Leo Kim2d25af82015-10-15 13:24:56 +09003672 down(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003673
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09003674 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003675}
3676
Tony Choa4ab1ad2015-10-12 16:56:05 +09003677int host_int_set_wfi_drv_handler(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003678{
Chaehyun Lima0941012015-10-05 19:34:47 +09003679 int result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003680 struct host_if_msg msg;
Leo Kimc09389a2015-10-28 15:59:24 +09003681
Tony Cho143eb952015-09-21 12:16:32 +09003682 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003683 msg.id = HOST_IF_MSG_SET_WFIDRV_HANDLER;
Leo Kima7f3b122015-10-28 15:59:29 +09003684 msg.body.drv.handler = get_id_from_handler(hif_drv);
Tony Choa4ab1ad2015-10-12 16:56:05 +09003685 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003686
Leo Kimcb067dc2015-10-15 13:24:53 +09003687 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Chaehyun Lima0941012015-10-05 19:34:47 +09003688 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09003689 PRINT_ER("wilc mq send fail\n");
Chaehyun Lima0941012015-10-05 19:34:47 +09003690 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003691 }
3692
Chaehyun Lima0941012015-10-05 19:34:47 +09003693 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003694}
3695
Tony Choa4ab1ad2015-10-12 16:56:05 +09003696int host_int_set_operation_mode(struct host_if_drv *hif_drv, u32 mode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003697{
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09003698 int result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003699 struct host_if_msg msg;
Leo Kimc09389a2015-10-28 15:59:24 +09003700
Tony Cho143eb952015-09-21 12:16:32 +09003701 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003702 msg.id = HOST_IF_MSG_SET_OPERATION_MODE;
Leo Kimc96debf2015-10-28 15:59:30 +09003703 msg.body.mode.mode = mode;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003704 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003705
Leo Kimcb067dc2015-10-15 13:24:53 +09003706 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09003707 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09003708 PRINT_ER("wilc mq send fail\n");
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09003709 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003710 }
3711
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09003712 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003713}
3714
Tony Choa4ab1ad2015-10-12 16:56:05 +09003715s32 host_int_get_host_chnl_num(struct host_if_drv *hif_drv, u8 *pu8ChNo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003716{
Leo Kim31390ee2015-10-19 18:26:08 +09003717 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003718 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003719
Tony Choa4ab1ad2015-10-12 16:56:05 +09003720 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003721 PRINT_ER("driver is null\n");
3722 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003723 }
3724
Tony Cho143eb952015-09-21 12:16:32 +09003725 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003726
Tony Choa9f812a2015-09-21 12:16:33 +09003727 msg.id = HOST_IF_MSG_GET_CHNL;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003728 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003729
Leo Kim31390ee2015-10-19 18:26:08 +09003730 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3731 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09003732 PRINT_ER("wilc mq send fail\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09003733 down(&hif_drv->hSemGetCHNL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003734
Leo Kim95ebb0f2015-10-15 13:25:03 +09003735 *pu8ChNo = ch_no;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003736
Leo Kim31390ee2015-10-19 18:26:08 +09003737 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003738}
3739
Tony Choa4ab1ad2015-10-12 16:56:05 +09003740s32 host_int_get_inactive_time(struct host_if_drv *hif_drv,
3741 const u8 *mac, u32 *pu32InactiveTime)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003742{
Leo Kim31390ee2015-10-19 18:26:08 +09003743 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003744 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003745
Tony Choa4ab1ad2015-10-12 16:56:05 +09003746 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003747 PRINT_ER("driver is null\n");
3748 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003749 }
3750
Tony Cho143eb952015-09-21 12:16:32 +09003751 memset(&msg, 0, sizeof(struct host_if_msg));
Leo Kim8c8360b2015-10-19 18:26:12 +09003752 memcpy(msg.body.mac_info.mac, mac, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003753
Tony Choa9f812a2015-09-21 12:16:33 +09003754 msg.id = HOST_IF_MSG_GET_INACTIVETIME;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003755 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003756
Leo Kim31390ee2015-10-19 18:26:08 +09003757 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3758 if (result)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003759 PRINT_ER("Failed to send get host channel param's message queue ");
3760
Tony Choa4ab1ad2015-10-12 16:56:05 +09003761 down(&hif_drv->hSemInactiveTime);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003762
Leo Kimad269062015-10-15 13:25:06 +09003763 *pu32InactiveTime = inactive_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003764
Leo Kim31390ee2015-10-19 18:26:08 +09003765 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003766}
Glen Lee108b3432015-09-16 18:53:20 +09003767
Tony Choa4ab1ad2015-10-12 16:56:05 +09003768s32 host_int_test_get_int_wid(struct host_if_drv *hif_drv, u32 *pu32TestMemAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003769{
Leo Kim31390ee2015-10-19 18:26:08 +09003770 s32 result = 0;
Leo Kim45102f82015-10-28 15:59:28 +09003771 struct wid wid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003772
Tony Choa4ab1ad2015-10-12 16:56:05 +09003773 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09003774 PRINT_ER("driver is null\n");
3775 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003776 }
3777
Leo Kim45102f82015-10-28 15:59:28 +09003778 wid.id = (u16)WID_MEMORY_ADDRESS;
3779 wid.type = WID_INT;
3780 wid.val = (s8 *)pu32TestMemAddr;
3781 wid.size = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003782
Leo Kim45102f82015-10-28 15:59:28 +09003783 result = send_config_pkt(GET_CFG, &wid, 1,
Leo Kim8c8360b2015-10-19 18:26:12 +09003784 get_id_from_handler(hif_drv));
Leo Kimae4dfa52015-10-13 19:49:26 +09003785
Leo Kim31390ee2015-10-19 18:26:08 +09003786 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09003787 PRINT_ER("Failed to get wid value\n");
3788 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003789 } else {
3790 PRINT_D(HOSTINF_DBG, "Successfully got wid value\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003791 }
3792
Leo Kim31390ee2015-10-19 18:26:08 +09003793 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003794}
3795
Tony Choa4ab1ad2015-10-12 16:56:05 +09003796s32 host_int_get_rssi(struct host_if_drv *hif_drv, s8 *ps8Rssi)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003797{
Leo Kim31390ee2015-10-19 18:26:08 +09003798 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003799 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003800
Leo Kimc09389a2015-10-28 15:59:24 +09003801 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003802 msg.id = HOST_IF_MSG_GET_RSSI;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003803 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003804
Leo Kim31390ee2015-10-19 18:26:08 +09003805 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3806 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003807 PRINT_ER("Failed to send get host channel param's message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09003808 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003809 }
3810
Tony Choa4ab1ad2015-10-12 16:56:05 +09003811 down(&hif_drv->hSemGetRSSI);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003812
Leo Kim91109e12015-10-19 18:26:13 +09003813 if (!ps8Rssi) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003814 PRINT_ER("RSS pointer value is null");
Leo Kime6e12662015-09-16 18:36:03 +09003815 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003816 }
3817
Leo Kim144b7b22015-10-15 13:25:01 +09003818 *ps8Rssi = rssi;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003819
Leo Kim31390ee2015-10-19 18:26:08 +09003820 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003821}
3822
Tony Choa4ab1ad2015-10-12 16:56:05 +09003823s32 host_int_get_link_speed(struct host_if_drv *hif_drv, s8 *ps8lnkspd)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003824{
Tony Cho143eb952015-09-21 12:16:32 +09003825 struct host_if_msg msg;
Leo Kim31390ee2015-10-19 18:26:08 +09003826 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003827
Leo Kimc09389a2015-10-28 15:59:24 +09003828 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003829 msg.id = HOST_IF_MSG_GET_LINKSPEED;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003830 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003831
Leo Kim31390ee2015-10-19 18:26:08 +09003832 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3833 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003834 PRINT_ER("Failed to send GET_LINKSPEED to message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09003835 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003836 }
3837
Tony Choa4ab1ad2015-10-12 16:56:05 +09003838 down(&hif_drv->hSemGetLINKSPEED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003839
Leo Kim91109e12015-10-19 18:26:13 +09003840 if (!ps8lnkspd) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003841 PRINT_ER("LINKSPEED pointer value is null");
Leo Kime6e12662015-09-16 18:36:03 +09003842 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003843 }
3844
Leo Kim75327a02015-10-15 13:25:02 +09003845 *ps8lnkspd = link_speed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003846
Leo Kim31390ee2015-10-19 18:26:08 +09003847 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003848}
3849
Tony Choa4ab1ad2015-10-12 16:56:05 +09003850s32 host_int_get_statistics(struct host_if_drv *hif_drv, struct rf_info *pstrStatistics)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003851{
Leo Kim31390ee2015-10-19 18:26:08 +09003852 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003853 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003854
Leo Kimc09389a2015-10-28 15:59:24 +09003855 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003856 msg.id = HOST_IF_MSG_GET_STATISTICS;
Tony Choe60831e2015-10-05 13:50:45 +09003857 msg.body.data = (char *)pstrStatistics;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003858 msg.drv = hif_drv;
Leo Kimae4dfa52015-10-13 19:49:26 +09003859
Leo Kim31390ee2015-10-19 18:26:08 +09003860 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3861 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003862 PRINT_ER("Failed to send get host channel param's message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09003863 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003864 }
3865
Leo Kim2d25af82015-10-15 13:24:56 +09003866 down(&hif_sema_wait_response);
Leo Kim31390ee2015-10-19 18:26:08 +09003867 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003868}
3869
Tony Choa4ab1ad2015-10-12 16:56:05 +09003870s32 host_int_scan(struct host_if_drv *hif_drv, u8 u8ScanSource,
3871 u8 u8ScanType, u8 *pu8ChnlFreqList,
3872 u8 u8ChnlListLen, const u8 *pu8IEs,
3873 size_t IEsLen, wilc_scan_result ScanResult,
3874 void *pvUserArg, struct hidden_network *pstrHiddenNetwork)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003875{
Leo Kim31390ee2015-10-19 18:26:08 +09003876 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003877 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003878
Leo Kim91109e12015-10-19 18:26:13 +09003879 if (!hif_drv || !ScanResult) {
Tony Choa4ab1ad2015-10-12 16:56:05 +09003880 PRINT_ER("hif_drv or ScanResult = NULL\n");
Leo Kim24db7132015-09-16 18:36:01 +09003881 return -EFAULT;
3882 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003883
Tony Cho143eb952015-09-21 12:16:32 +09003884 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003885
Tony Choa9f812a2015-09-21 12:16:33 +09003886 msg.id = HOST_IF_MSG_SCAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003887
Leo Kim91109e12015-10-19 18:26:13 +09003888 if (pstrHiddenNetwork) {
Leo Kim629b9ca2015-10-13 19:49:46 +09003889 msg.body.scan_info.hidden_network.pstrHiddenNetworkInfo = pstrHiddenNetwork->pstrHiddenNetworkInfo;
3890 msg.body.scan_info.hidden_network.u8ssidnum = pstrHiddenNetwork->u8ssidnum;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003891
3892 } else
3893 PRINT_D(HOSTINF_DBG, "pstrHiddenNetwork IS EQUAL TO NULL\n");
3894
Tony Choa4ab1ad2015-10-12 16:56:05 +09003895 msg.drv = hif_drv;
Leo Kim42568892015-10-13 19:49:37 +09003896 msg.body.scan_info.src = u8ScanSource;
Leo Kim1e276c82015-10-13 19:49:38 +09003897 msg.body.scan_info.type = u8ScanType;
Leo Kimc17c6da2015-10-13 19:49:44 +09003898 msg.body.scan_info.result = ScanResult;
Leo Kim5f2b50c2015-10-13 19:49:45 +09003899 msg.body.scan_info.arg = pvUserArg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003900
Leo Kimf97bd9c2015-10-13 19:49:41 +09003901 msg.body.scan_info.ch_list_len = u8ChnlListLen;
Leo Kim82eeb0a2015-10-13 19:49:40 +09003902 msg.body.scan_info.ch_freq_list = kmalloc(u8ChnlListLen, GFP_KERNEL);
3903 memcpy(msg.body.scan_info.ch_freq_list, pu8ChnlFreqList, u8ChnlListLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003904
Leo Kim7b1f76c2015-10-13 19:49:43 +09003905 msg.body.scan_info.ies_len = IEsLen;
Leo Kimd6f19aa2015-10-13 19:49:42 +09003906 msg.body.scan_info.ies = kmalloc(IEsLen, GFP_KERNEL);
3907 memcpy(msg.body.scan_info.ies, pu8IEs, IEsLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003908
Leo Kim31390ee2015-10-19 18:26:08 +09003909 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
3910 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09003911 PRINT_ER("Error in sending message queue\n");
3912 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003913 }
3914
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003915 PRINT_D(HOSTINF_DBG, ">> Starting the SCAN timer\n");
Tony Choa4ab1ad2015-10-12 16:56:05 +09003916 hif_drv->hScanTimer.data = (unsigned long)hif_drv;
3917 mod_timer(&hif_drv->hScanTimer,
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07003918 jiffies + msecs_to_jiffies(HOST_IF_SCAN_TIMEOUT));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003919
Leo Kim31390ee2015-10-19 18:26:08 +09003920 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003921}
Leo Kimae4dfa52015-10-13 19:49:26 +09003922
Tony Choa4ab1ad2015-10-12 16:56:05 +09003923s32 hif_set_cfg(struct host_if_drv *hif_drv,
3924 struct cfg_param_val *pstrCfgParamVal)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003925{
Leo Kim31390ee2015-10-19 18:26:08 +09003926 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003927 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003928
Tony Choa4ab1ad2015-10-12 16:56:05 +09003929 if (!hif_drv) {
3930 PRINT_ER("hif_drv NULL\n");
Leo Kim24db7132015-09-16 18:36:01 +09003931 return -EFAULT;
3932 }
Leo Kimae4dfa52015-10-13 19:49:26 +09003933
Tony Cho143eb952015-09-21 12:16:32 +09003934 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003935 msg.id = HOST_IF_MSG_CFG_PARAMS;
Tony Cho221371e2015-10-12 16:56:06 +09003936 msg.body.cfg_info.cfg_attr_info = *pstrCfgParamVal;
Tony Choa4ab1ad2015-10-12 16:56:05 +09003937 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003938
Leo Kim31390ee2015-10-19 18:26:08 +09003939 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003940
Leo Kim31390ee2015-10-19 18:26:08 +09003941 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003942}
3943
Tony Choa4ab1ad2015-10-12 16:56:05 +09003944s32 hif_get_cfg(struct host_if_drv *hif_drv, u16 u16WID, u16 *pu16WID_Value)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003945{
Leo Kim31390ee2015-10-19 18:26:08 +09003946 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003947
Tony Choa4ab1ad2015-10-12 16:56:05 +09003948 down(&hif_drv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003949
Tony Choa4ab1ad2015-10-12 16:56:05 +09003950 if (!hif_drv) {
3951 PRINT_ER("hif_drv NULL\n");
Leo Kim24db7132015-09-16 18:36:01 +09003952 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003953 }
3954 PRINT_D(HOSTINF_DBG, "Getting configuration parameters\n");
3955 switch (u16WID) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003956 case WID_BSS_TYPE:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003957 *pu16WID_Value = (u16)hif_drv->strCfgValues.bss_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003958 break;
3959
3960 case WID_AUTH_TYPE:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003961 *pu16WID_Value = (u16)hif_drv->strCfgValues.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003962 break;
3963
3964 case WID_AUTH_TIMEOUT:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003965 *pu16WID_Value = hif_drv->strCfgValues.auth_timeout;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003966 break;
3967
3968 case WID_POWER_MANAGEMENT:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003969 *pu16WID_Value = (u16)hif_drv->strCfgValues.power_mgmt_mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003970 break;
3971
3972 case WID_SHORT_RETRY_LIMIT:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003973 *pu16WID_Value = hif_drv->strCfgValues.short_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003974 break;
3975
3976 case WID_LONG_RETRY_LIMIT:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003977 *pu16WID_Value = hif_drv->strCfgValues.long_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003978 break;
3979
3980 case WID_FRAG_THRESHOLD:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003981 *pu16WID_Value = hif_drv->strCfgValues.frag_threshold;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003982 break;
3983
3984 case WID_RTS_THRESHOLD:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003985 *pu16WID_Value = hif_drv->strCfgValues.rts_threshold;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003986 break;
3987
3988 case WID_PREAMBLE:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003989 *pu16WID_Value = (u16)hif_drv->strCfgValues.preamble_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003990 break;
3991
3992 case WID_SHORT_SLOT_ALLOWED:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003993 *pu16WID_Value = (u16) hif_drv->strCfgValues.short_slot_allowed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003994 break;
3995
3996 case WID_11N_TXOP_PROT_DISABLE:
Tony Choa4ab1ad2015-10-12 16:56:05 +09003997 *pu16WID_Value = (u16)hif_drv->strCfgValues.txop_prot_disabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003998 break;
3999
4000 case WID_BEACON_INTERVAL:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004001 *pu16WID_Value = hif_drv->strCfgValues.beacon_interval;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004002 break;
4003
4004 case WID_DTIM_PERIOD:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004005 *pu16WID_Value = (u16)hif_drv->strCfgValues.dtim_period;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004006 break;
4007
4008 case WID_SITE_SURVEY:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004009 *pu16WID_Value = (u16)hif_drv->strCfgValues.site_survey_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004010 break;
4011
4012 case WID_SITE_SURVEY_SCAN_TIME:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004013 *pu16WID_Value = hif_drv->strCfgValues.site_survey_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004014 break;
4015
4016 case WID_ACTIVE_SCAN_TIME:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004017 *pu16WID_Value = hif_drv->strCfgValues.active_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004018 break;
4019
4020 case WID_PASSIVE_SCAN_TIME:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004021 *pu16WID_Value = hif_drv->strCfgValues.passive_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004022 break;
4023
4024 case WID_CURRENT_TX_RATE:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004025 *pu16WID_Value = hif_drv->strCfgValues.curr_tx_rate;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004026 break;
4027
4028 default:
4029 break;
4030 }
4031
Tony Choa4ab1ad2015-10-12 16:56:05 +09004032 up(&hif_drv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004033
Leo Kim31390ee2015-10-19 18:26:08 +09004034 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004035}
4036
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004037static void GetPeriodicRSSI(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004038{
Tony Choa4ab1ad2015-10-12 16:56:05 +09004039 struct host_if_drv *hif_drv = (struct host_if_drv *)arg;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02004040
Tony Choa4ab1ad2015-10-12 16:56:05 +09004041 if (!hif_drv) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004042 PRINT_ER("Driver handler is NULL\n");
4043 return;
4044 }
4045
Tony Choa4ab1ad2015-10-12 16:56:05 +09004046 if (hif_drv->enuHostIFstate == HOST_IF_CONNECTED) {
Leo Kim31390ee2015-10-19 18:26:08 +09004047 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004048 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004049
Tony Cho143eb952015-09-21 12:16:32 +09004050 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004051
Tony Choa9f812a2015-09-21 12:16:33 +09004052 msg.id = HOST_IF_MSG_GET_RSSI;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004053 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004054
Leo Kim31390ee2015-10-19 18:26:08 +09004055 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4056 if (result) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004057 PRINT_ER("Failed to send get host channel param's message queue ");
4058 return;
4059 }
4060 }
Leo Kim262f55e2015-10-15 13:24:58 +09004061 periodic_rssi.data = (unsigned long)hif_drv;
4062 mod_timer(&periodic_rssi, jiffies + msecs_to_jiffies(5000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004063}
4064
Glen Leed53822192015-10-27 18:27:49 +09004065s32 host_int_init(struct net_device *dev, struct host_if_drv **hif_drv_handler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004066{
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004067 s32 result = 0;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004068 struct host_if_drv *hif_drv;
Johnny Kimd42ab082015-08-20 16:32:52 +09004069 int err;
Glen Leed53822192015-10-27 18:27:49 +09004070 perInterface_wlan_t *nic;
4071 struct wilc *wilc;
4072
4073 nic = netdev_priv(dev);
4074 wilc = nic->wilc;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004075
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004076 PRINT_D(HOSTINF_DBG, "Initializing host interface for client %d\n", clients_count + 1);
4077
Leo Kimca8540e42015-10-15 13:25:00 +09004078 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004079
Leo Kim2d25af82015-10-15 13:24:56 +09004080 sema_init(&hif_sema_wait_response, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004081
Tony Choa4ab1ad2015-10-12 16:56:05 +09004082 hif_drv = kzalloc(sizeof(struct host_if_drv), GFP_KERNEL);
4083 if (!hif_drv) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004084 result = -ENOMEM;
Vincent Stehlé17db84e2015-10-07 07:08:25 +02004085 goto _fail_;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004086 }
Tony Choa4ab1ad2015-10-12 16:56:05 +09004087 *hif_drv_handler = hif_drv;
4088 err = add_handler_in_list(hif_drv);
Johnny Kimd42ab082015-08-20 16:32:52 +09004089 if (err) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004090 result = -EFAULT;
Johnny Kimd42ab082015-08-20 16:32:52 +09004091 goto _fail_timer_2;
4092 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004093
Dean Lee72ed4dc2015-06-12 14:11:44 +09004094 g_obtainingIP = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004095
Tony Choa4ab1ad2015-10-12 16:56:05 +09004096 PRINT_D(HOSTINF_DBG, "Global handle pointer value=%p\n", hif_drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004097 if (clients_count == 0) {
Leo Kim834e0cb2015-10-15 13:24:54 +09004098 sema_init(&hif_sema_thread, 0);
Leo Kim27ff2162015-10-15 13:24:55 +09004099 sema_init(&hif_sema_driver, 0);
Leo Kim440e89932015-10-15 13:24:57 +09004100 sema_init(&hif_sema_deinit, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004101 }
4102
Tony Choa4ab1ad2015-10-12 16:56:05 +09004103 sema_init(&hif_drv->hSemTestKeyBlock, 0);
4104 sema_init(&hif_drv->hSemTestDisconnectBlock, 0);
4105 sema_init(&hif_drv->hSemGetRSSI, 0);
4106 sema_init(&hif_drv->hSemGetLINKSPEED, 0);
4107 sema_init(&hif_drv->hSemGetCHNL, 0);
4108 sema_init(&hif_drv->hSemInactiveTime, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004109
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004110 PRINT_D(HOSTINF_DBG, "INIT: CLIENT COUNT %d\n", clients_count);
4111
4112 if (clients_count == 0) {
Leo Kimcb067dc2015-10-15 13:24:53 +09004113 result = wilc_mq_create(&hif_msg_q);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004114
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004115 if (result < 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004116 PRINT_ER("Failed to creat MQ\n");
4117 goto _fail_;
4118 }
Leo Kimc2115d82015-10-15 13:24:52 +09004119
Glen Leed53822192015-10-27 18:27:49 +09004120 hif_thread_handler = kthread_run(hostIFthread, wilc,
4121 "WILC_kthread");
Leo Kimc2115d82015-10-15 13:24:52 +09004122
4123 if (IS_ERR(hif_thread_handler)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004124 PRINT_ER("Failed to creat Thread\n");
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004125 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004126 goto _fail_mq_;
4127 }
Leo Kim262f55e2015-10-15 13:24:58 +09004128 setup_timer(&periodic_rssi, GetPeriodicRSSI,
Tony Choa4ab1ad2015-10-12 16:56:05 +09004129 (unsigned long)hif_drv);
Leo Kim262f55e2015-10-15 13:24:58 +09004130 mod_timer(&periodic_rssi, jiffies + msecs_to_jiffies(5000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004131 }
4132
Tony Choa4ab1ad2015-10-12 16:56:05 +09004133 setup_timer(&hif_drv->hScanTimer, TimerCB_Scan, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004134
Tony Choa4ab1ad2015-10-12 16:56:05 +09004135 setup_timer(&hif_drv->hConnectTimer, TimerCB_Connect, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004136
Tony Choa4ab1ad2015-10-12 16:56:05 +09004137 setup_timer(&hif_drv->hRemainOnChannel, ListenTimerCB, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004138
Leo Kimbafaa692015-10-28 15:59:21 +09004139 sema_init(&hif_drv->gtOsCfgValuesSem, 1);
Tony Choa4ab1ad2015-10-12 16:56:05 +09004140 down(&hif_drv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004141
Tony Choa4ab1ad2015-10-12 16:56:05 +09004142 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004143 hif_drv->strCfgValues.site_survey_enabled = SITE_SURVEY_OFF;
4144 hif_drv->strCfgValues.scan_source = DEFAULT_SCAN;
4145 hif_drv->strCfgValues.active_scan_time = ACTIVE_SCAN_TIME;
4146 hif_drv->strCfgValues.passive_scan_time = PASSIVE_SCAN_TIME;
4147 hif_drv->strCfgValues.curr_tx_rate = AUTORATE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004148
Tony Choa4ab1ad2015-10-12 16:56:05 +09004149 hif_drv->u64P2p_MgmtTimeout = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004150
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004151 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",
4152
Tony Choa4ab1ad2015-10-12 16:56:05 +09004153 hif_drv->strCfgValues.site_survey_enabled, hif_drv->strCfgValues.scan_source,
4154 hif_drv->strCfgValues.active_scan_time, hif_drv->strCfgValues.passive_scan_time,
4155 hif_drv->strCfgValues.curr_tx_rate);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004156
Tony Choa4ab1ad2015-10-12 16:56:05 +09004157 up(&hif_drv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004158
Leo Kimae4dfa52015-10-13 19:49:26 +09004159 clients_count++;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004160
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004161 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004162
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004163_fail_timer_2:
Tony Choa4ab1ad2015-10-12 16:56:05 +09004164 up(&hif_drv->gtOsCfgValuesSem);
4165 del_timer_sync(&hif_drv->hConnectTimer);
4166 del_timer_sync(&hif_drv->hScanTimer);
Leo Kimc2115d82015-10-15 13:24:52 +09004167 kthread_stop(hif_thread_handler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004168_fail_mq_:
Leo Kimcb067dc2015-10-15 13:24:53 +09004169 wilc_mq_destroy(&hif_msg_q);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004170_fail_:
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09004171 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004172}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004173
Tony Choa4ab1ad2015-10-12 16:56:05 +09004174s32 host_int_deinit(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004175{
Leo Kim31390ee2015-10-19 18:26:08 +09004176 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004177 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09004178 int ret;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004179
Tony Choa4ab1ad2015-10-12 16:56:05 +09004180 if (!hif_drv) {
4181 PRINT_ER("hif_drv = NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004182 return 0;
4183 }
4184
Leo Kim440e89932015-10-15 13:24:57 +09004185 down(&hif_sema_deinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004186
Tony Choa4ab1ad2015-10-12 16:56:05 +09004187 terminated_handle = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004188 PRINT_D(HOSTINF_DBG, "De-initializing host interface for client %d\n", clients_count);
4189
Leo Kimd1666e22015-10-28 15:59:22 +09004190 if (del_timer_sync(&hif_drv->hScanTimer))
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004191 PRINT_D(HOSTINF_DBG, ">> Scan timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004192
Leo Kimd1666e22015-10-28 15:59:22 +09004193 if (del_timer_sync(&hif_drv->hConnectTimer))
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004194 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004195
Leo Kim262f55e2015-10-15 13:24:58 +09004196 if (del_timer_sync(&periodic_rssi))
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004197 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004198
Tony Choa4ab1ad2015-10-12 16:56:05 +09004199 del_timer_sync(&hif_drv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004200
Johnny Kim218dc402015-08-13 13:41:19 +09004201 host_int_set_wfi_drv_handler(NULL);
Leo Kim27ff2162015-10-15 13:24:55 +09004202 down(&hif_sema_driver);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004203
Tony Choa4ab1ad2015-10-12 16:56:05 +09004204 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
4205 hif_drv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_ABORTED, NULL,
4206 hif_drv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004207
Tony Choa4ab1ad2015-10-12 16:56:05 +09004208 hif_drv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004209 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004210
Tony Choa4ab1ad2015-10-12 16:56:05 +09004211 hif_drv->enuHostIFstate = HOST_IF_IDLE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004212
Leo Kimca8540e42015-10-15 13:25:00 +09004213 scan_while_connected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004214
Tony Cho143eb952015-09-21 12:16:32 +09004215 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004216
4217 if (clients_count == 1) {
Leo Kim262f55e2015-10-15 13:24:58 +09004218 if (del_timer_sync(&periodic_rssi))
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004219 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Leo Kim262f55e2015-10-15 13:24:58 +09004220
Tony Choa9f812a2015-09-21 12:16:33 +09004221 msg.id = HOST_IF_MSG_EXIT;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004222 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004223
Leo Kim31390ee2015-10-19 18:26:08 +09004224 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4225 if (result != 0)
4226 PRINT_ER("Error in sending deinit's message queue message function: Error(%d)\n", result);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004227
Leo Kim834e0cb2015-10-15 13:24:54 +09004228 down(&hif_sema_thread);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004229
Leo Kimcb067dc2015-10-15 13:24:53 +09004230 wilc_mq_destroy(&hif_msg_q);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004231 }
4232
Leo Kimbafaa692015-10-28 15:59:21 +09004233 down(&hif_drv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004234
Tony Choa4ab1ad2015-10-12 16:56:05 +09004235 ret = remove_handler_in_list(hif_drv);
Johnny Kimd42ab082015-08-20 16:32:52 +09004236 if (ret)
Leo Kim31390ee2015-10-19 18:26:08 +09004237 result = -ENOENT;
Johnny Kimd42ab082015-08-20 16:32:52 +09004238
Tony Choa4ab1ad2015-10-12 16:56:05 +09004239 kfree(hif_drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004240
Leo Kimae4dfa52015-10-13 19:49:26 +09004241 clients_count--;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09004242 terminated_handle = NULL;
Leo Kim440e89932015-10-15 13:24:57 +09004243 up(&hif_sema_deinit);
Leo Kim31390ee2015-10-19 18:26:08 +09004244 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004245}
4246
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004247void NetworkInfoReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004248{
Leo Kim31390ee2015-10-19 18:26:08 +09004249 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004250 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09004251 int id;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004252 struct host_if_drv *hif_drv = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004253
Johnny Kimd42ab082015-08-20 16:32:52 +09004254 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
Tony Choa4ab1ad2015-10-12 16:56:05 +09004255 hif_drv = get_handler_from_id(id);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004256
Tony Choa4ab1ad2015-10-12 16:56:05 +09004257 if (!hif_drv || hif_drv == terminated_handle) {
4258 PRINT_ER("NetworkInfo received but driver not init[%p]\n", hif_drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004259 return;
4260 }
4261
Tony Cho143eb952015-09-21 12:16:32 +09004262 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004263
Tony Choa9f812a2015-09-21 12:16:33 +09004264 msg.id = HOST_IF_MSG_RCVD_NTWRK_INFO;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004265 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004266
Leo Kim3bffac62015-10-13 20:02:11 +09004267 msg.body.net_info.len = u32Length;
Leo Kimb021b802015-10-13 20:02:10 +09004268 msg.body.net_info.buffer = kmalloc(u32Length, GFP_KERNEL);
4269 memcpy(msg.body.net_info.buffer, pu8Buffer, u32Length);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004270
Leo Kim31390ee2015-10-19 18:26:08 +09004271 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4272 if (result)
4273 PRINT_ER("Error in sending network info message queue message parameters: Error(%d)\n", result);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004274}
4275
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004276void GnrlAsyncInfoReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004277{
Leo Kim31390ee2015-10-19 18:26:08 +09004278 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004279 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09004280 int id;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004281 struct host_if_drv *hif_drv = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004282
Leo Kim440e89932015-10-15 13:24:57 +09004283 down(&hif_sema_deinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004284
Johnny Kimd42ab082015-08-20 16:32:52 +09004285 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
Tony Choa4ab1ad2015-10-12 16:56:05 +09004286 hif_drv = get_handler_from_id(id);
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004287 PRINT_D(HOSTINF_DBG, "General asynchronous info packet received\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004288
Tony Choa4ab1ad2015-10-12 16:56:05 +09004289 if (!hif_drv || hif_drv == terminated_handle) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004290 PRINT_D(HOSTINF_DBG, "Wifi driver handler is equal to NULL\n");
Leo Kim440e89932015-10-15 13:24:57 +09004291 up(&hif_sema_deinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004292 return;
4293 }
4294
Tony Choa4ab1ad2015-10-12 16:56:05 +09004295 if (!hif_drv->strWILC_UsrConnReq.pfUserConnectResult) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004296 PRINT_ER("Received mac status is not needed when there is no current Connect Reques\n");
Leo Kim440e89932015-10-15 13:24:57 +09004297 up(&hif_sema_deinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004298 return;
4299 }
4300
Tony Cho143eb952015-09-21 12:16:32 +09004301 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004302
Tony Choa9f812a2015-09-21 12:16:33 +09004303 msg.id = HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004304 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004305
Leo Kimf94f4882015-10-13 19:50:01 +09004306 msg.body.async_info.len = u32Length;
Leo Kim33722ac72015-10-13 19:50:00 +09004307 msg.body.async_info.buffer = kmalloc(u32Length, GFP_KERNEL);
4308 memcpy(msg.body.async_info.buffer, pu8Buffer, u32Length);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004309
Leo Kim31390ee2015-10-19 18:26:08 +09004310 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4311 if (result)
4312 PRINT_ER("Error in sending message queue asynchronous message info: Error(%d)\n", result);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004313
Leo Kim440e89932015-10-15 13:24:57 +09004314 up(&hif_sema_deinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004315}
4316
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004317void host_int_ScanCompleteReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004318{
Leo Kim31390ee2015-10-19 18:26:08 +09004319 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004320 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09004321 int id;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004322 struct host_if_drv *hif_drv = NULL;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02004323
Johnny Kimd42ab082015-08-20 16:32:52 +09004324 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
Tony Choa4ab1ad2015-10-12 16:56:05 +09004325 hif_drv = get_handler_from_id(id);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004326
Tony Choa4ab1ad2015-10-12 16:56:05 +09004327 PRINT_D(GENERIC_DBG, "Scan notification received %p\n", hif_drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004328
Tony Choa4ab1ad2015-10-12 16:56:05 +09004329 if (!hif_drv || hif_drv == terminated_handle)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004330 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004331
Tony Choa4ab1ad2015-10-12 16:56:05 +09004332 if (hif_drv->strWILC_UsrScanReq.pfUserScanResult) {
Tony Cho143eb952015-09-21 12:16:32 +09004333 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004334
Tony Choa9f812a2015-09-21 12:16:33 +09004335 msg.id = HOST_IF_MSG_RCVD_SCAN_COMPLETE;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004336 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004337
Leo Kim31390ee2015-10-19 18:26:08 +09004338 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4339 if (result)
4340 PRINT_ER("Error in sending message queue scan complete parameters: Error(%d)\n", result);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004341 }
4342
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004343 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004344}
4345
Tony Choa4ab1ad2015-10-12 16:56:05 +09004346s32 host_int_remain_on_channel(struct host_if_drv *hif_drv, u32 u32SessionID,
4347 u32 u32duration, u16 chan,
4348 wilc_remain_on_chan_expired RemainOnChanExpired,
4349 wilc_remain_on_chan_ready RemainOnChanReady,
4350 void *pvUserArg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004351{
Leo Kim31390ee2015-10-19 18:26:08 +09004352 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004353 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004354
Tony Choa4ab1ad2015-10-12 16:56:05 +09004355 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004356 PRINT_ER("driver is null\n");
4357 return -EFAULT;
4358 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004359
Tony Cho143eb952015-09-21 12:16:32 +09004360 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004361
Tony Choa9f812a2015-09-21 12:16:33 +09004362 msg.id = HOST_IF_MSG_REMAIN_ON_CHAN;
Tony Cho070d3652015-09-30 18:55:10 +09004363 msg.body.remain_on_ch.u16Channel = chan;
4364 msg.body.remain_on_ch.pRemainOnChanExpired = RemainOnChanExpired;
4365 msg.body.remain_on_ch.pRemainOnChanReady = RemainOnChanReady;
4366 msg.body.remain_on_ch.pVoid = pvUserArg;
4367 msg.body.remain_on_ch.u32duration = u32duration;
4368 msg.body.remain_on_ch.u32ListenSessionID = u32SessionID;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004369 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004370
Leo Kim31390ee2015-10-19 18:26:08 +09004371 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4372 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004373 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004374
Leo Kim31390ee2015-10-19 18:26:08 +09004375 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004376}
4377
Tony Choa4ab1ad2015-10-12 16:56:05 +09004378s32 host_int_ListenStateExpired(struct host_if_drv *hif_drv, u32 u32SessionID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004379{
Leo Kim31390ee2015-10-19 18:26:08 +09004380 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004381 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004382
Tony Choa4ab1ad2015-10-12 16:56:05 +09004383 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004384 PRINT_ER("driver is null\n");
4385 return -EFAULT;
4386 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004387
Tony Choa4ab1ad2015-10-12 16:56:05 +09004388 del_timer(&hif_drv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004389
Tony Cho143eb952015-09-21 12:16:32 +09004390 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09004391 msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004392 msg.drv = hif_drv;
Tony Cho070d3652015-09-30 18:55:10 +09004393 msg.body.remain_on_ch.u32ListenSessionID = u32SessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004394
Leo Kim31390ee2015-10-19 18:26:08 +09004395 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4396 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004397 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004398
Leo Kim31390ee2015-10-19 18:26:08 +09004399 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004400}
4401
Tony Choa4ab1ad2015-10-12 16:56:05 +09004402s32 host_int_frame_register(struct host_if_drv *hif_drv, u16 u16FrameType, bool bReg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004403{
Leo Kim31390ee2015-10-19 18:26:08 +09004404 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004405 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004406
Tony Choa4ab1ad2015-10-12 16:56:05 +09004407 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004408 PRINT_ER("driver is null\n");
4409 return -EFAULT;
4410 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004411
Tony Cho143eb952015-09-21 12:16:32 +09004412 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004413
Tony Choa9f812a2015-09-21 12:16:33 +09004414 msg.id = HOST_IF_MSG_REGISTER_FRAME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004415 switch (u16FrameType) {
4416 case ACTION:
4417 PRINT_D(HOSTINF_DBG, "ACTION\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09004418 msg.body.reg_frame.u8Regid = ACTION_FRM_IDX;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004419 break;
4420
4421 case PROBE_REQ:
4422 PRINT_D(HOSTINF_DBG, "PROBE REQ\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09004423 msg.body.reg_frame.u8Regid = PROBE_REQ_IDX;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004424 break;
4425
4426 default:
4427 PRINT_D(HOSTINF_DBG, "Not valid frame type\n");
4428 break;
4429 }
Tony Cho5c4008d2015-10-05 13:50:44 +09004430 msg.body.reg_frame.u16FrameType = u16FrameType;
4431 msg.body.reg_frame.bReg = bReg;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004432 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004433
Leo Kim31390ee2015-10-19 18:26:08 +09004434 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4435 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004436 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004437
Leo Kim31390ee2015-10-19 18:26:08 +09004438 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004439}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004440
Tony Choa4ab1ad2015-10-12 16:56:05 +09004441s32 host_int_add_beacon(struct host_if_drv *hif_drv, u32 u32Interval,
4442 u32 u32DTIMPeriod, u32 u32HeadLen, u8 *pu8Head,
4443 u32 u32TailLen, u8 *pu8Tail)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004444{
Leo Kim31390ee2015-10-19 18:26:08 +09004445 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004446 struct host_if_msg msg;
Tony Choa98491e2015-09-30 18:44:31 +09004447 struct beacon_attr *pstrSetBeaconParam = &msg.body.beacon_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004448
Tony Choa4ab1ad2015-10-12 16:56:05 +09004449 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004450 PRINT_ER("driver is null\n");
4451 return -EFAULT;
4452 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004453
Tony Cho143eb952015-09-21 12:16:32 +09004454 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004455
4456 PRINT_D(HOSTINF_DBG, "Setting adding beacon message queue params\n");
4457
Tony Choa9f812a2015-09-21 12:16:33 +09004458 msg.id = HOST_IF_MSG_ADD_BEACON;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004459 msg.drv = hif_drv;
Leo Kim12262dd2015-10-13 19:50:03 +09004460 pstrSetBeaconParam->interval = u32Interval;
Leo Kime76ab772015-10-13 19:50:04 +09004461 pstrSetBeaconParam->dtim_period = u32DTIMPeriod;
Leo Kim51c66182015-10-13 19:50:05 +09004462 pstrSetBeaconParam->head_len = u32HeadLen;
Shraddha Barke543f5b12015-10-16 10:47:11 +05304463 pstrSetBeaconParam->head = kmemdup(pu8Head, u32HeadLen, GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09004464 if (!pstrSetBeaconParam->head) {
Leo Kim31390ee2015-10-19 18:26:08 +09004465 result = -ENOMEM;
Leo Kim24db7132015-09-16 18:36:01 +09004466 goto ERRORHANDLER;
4467 }
Leo Kim030c57e2015-10-13 19:50:07 +09004468 pstrSetBeaconParam->tail_len = u32TailLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004469
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004470 if (u32TailLen > 0) {
Shraddha Barke543f5b12015-10-16 10:47:11 +05304471 pstrSetBeaconParam->tail = kmemdup(pu8Tail, u32TailLen,
4472 GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09004473 if (!pstrSetBeaconParam->tail) {
Leo Kim31390ee2015-10-19 18:26:08 +09004474 result = -ENOMEM;
Leo Kim24db7132015-09-16 18:36:01 +09004475 goto ERRORHANDLER;
4476 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004477 } else {
Leo Kim7dbcb6d32015-10-13 19:50:08 +09004478 pstrSetBeaconParam->tail = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004479 }
4480
Leo Kim31390ee2015-10-19 18:26:08 +09004481 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4482 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004483 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004484
Leo Kim24db7132015-09-16 18:36:01 +09004485ERRORHANDLER:
Leo Kim31390ee2015-10-19 18:26:08 +09004486 if (result) {
Shraddha Barke95f840f2015-10-14 07:29:19 +05304487 kfree(pstrSetBeaconParam->head);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004488
Shraddha Barke95f840f2015-10-14 07:29:19 +05304489 kfree(pstrSetBeaconParam->tail);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004490 }
4491
Leo Kim31390ee2015-10-19 18:26:08 +09004492 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004493}
4494
Tony Choa4ab1ad2015-10-12 16:56:05 +09004495s32 host_int_del_beacon(struct host_if_drv *hif_drv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004496{
Leo Kim31390ee2015-10-19 18:26:08 +09004497 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004498 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004499
Tony Choa4ab1ad2015-10-12 16:56:05 +09004500 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004501 PRINT_ER("driver is null\n");
4502 return -EFAULT;
4503 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004504
Tony Choa9f812a2015-09-21 12:16:33 +09004505 msg.id = HOST_IF_MSG_DEL_BEACON;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004506 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004507 PRINT_D(HOSTINF_DBG, "Setting deleting beacon message queue params\n");
4508
Leo Kim31390ee2015-10-19 18:26:08 +09004509 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4510 if (result)
Leo Kim7dc1d0c2015-09-16 18:36:00 +09004511 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004512
Leo Kim31390ee2015-10-19 18:26:08 +09004513 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004514}
4515
Tony Choa4ab1ad2015-10-12 16:56:05 +09004516s32 host_int_add_station(struct host_if_drv *hif_drv,
Tony Cho6a89ba92015-09-21 12:16:46 +09004517 struct add_sta_param *pstrStaParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004518{
Leo Kim31390ee2015-10-19 18:26:08 +09004519 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004520 struct host_if_msg msg;
Tony Choca8f47f2015-09-30 18:44:32 +09004521 struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004522
Tony Choa4ab1ad2015-10-12 16:56:05 +09004523 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004524 PRINT_ER("driver is null\n");
4525 return -EFAULT;
4526 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004527
Tony Cho143eb952015-09-21 12:16:32 +09004528 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004529
4530 PRINT_D(HOSTINF_DBG, "Setting adding station message queue params\n");
4531
Tony Choa9f812a2015-09-21 12:16:33 +09004532 msg.id = HOST_IF_MSG_ADD_STATION;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004533 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004534
Tony Cho6a89ba92015-09-21 12:16:46 +09004535 memcpy(pstrAddStationMsg, pstrStaParams, sizeof(struct add_sta_param));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004536 if (pstrAddStationMsg->u8NumRates > 0) {
Glen Leef3052582015-09-10 12:03:04 +09004537 u8 *rates = kmalloc(pstrAddStationMsg->u8NumRates, GFP_KERNEL);
Leo Kimc09389a2015-10-28 15:59:24 +09004538
Leo Kim7ae43362015-09-16 18:35:59 +09004539 if (!rates)
4540 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004541
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09004542 memcpy(rates, pstrStaParams->pu8Rates, pstrAddStationMsg->u8NumRates);
Arnd Bergmann057d1e92015-06-01 21:06:44 +02004543 pstrAddStationMsg->pu8Rates = rates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004544 }
4545
Leo Kim31390ee2015-10-19 18:26:08 +09004546 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4547 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004548 PRINT_ER("wilc_mq_send fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +09004549 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004550}
4551
Tony Choa4ab1ad2015-10-12 16:56:05 +09004552s32 host_int_del_station(struct host_if_drv *hif_drv, const u8 *pu8MacAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004553{
Leo Kim31390ee2015-10-19 18:26:08 +09004554 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004555 struct host_if_msg msg;
Tony Cho889c25b2015-09-30 18:44:33 +09004556 struct del_sta *pstrDelStationMsg = &msg.body.del_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004557
Tony Choa4ab1ad2015-10-12 16:56:05 +09004558 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004559 PRINT_ER("driver is null\n");
4560 return -EFAULT;
4561 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004562
Tony Cho143eb952015-09-21 12:16:32 +09004563 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004564
4565 PRINT_D(HOSTINF_DBG, "Setting deleting station message queue params\n");
4566
Tony Choa9f812a2015-09-21 12:16:33 +09004567 msg.id = HOST_IF_MSG_DEL_STATION;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004568 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004569
Leo Kim91109e12015-10-19 18:26:13 +09004570 if (!pu8MacAddr)
Leo Kime4839d32015-10-13 20:02:06 +09004571 memset(pstrDelStationMsg->mac_addr, 255, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004572 else
Leo Kime4839d32015-10-13 20:02:06 +09004573 memcpy(pstrDelStationMsg->mac_addr, pu8MacAddr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004574
Leo Kim31390ee2015-10-19 18:26:08 +09004575 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4576 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004577 PRINT_ER("wilc_mq_send fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +09004578 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004579}
Leo Kimae4dfa52015-10-13 19:49:26 +09004580
Tony Choa4ab1ad2015-10-12 16:56:05 +09004581s32 host_int_del_allstation(struct host_if_drv *hif_drv,
Leo Kim441dc602015-10-12 16:55:35 +09004582 u8 pu8MacAddr[][ETH_ALEN])
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004583{
Leo Kim31390ee2015-10-19 18:26:08 +09004584 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004585 struct host_if_msg msg;
Tony Chob0c1e802015-10-05 13:50:46 +09004586 struct del_all_sta *pstrDelAllStationMsg = &msg.body.del_all_sta_info;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004587 u8 au8Zero_Buff[ETH_ALEN] = {0};
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004588 u32 i;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004589 u8 u8AssocNumb = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004590
Tony Choa4ab1ad2015-10-12 16:56:05 +09004591 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004592 PRINT_ER("driver is null\n");
4593 return -EFAULT;
4594 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004595
Tony Cho143eb952015-09-21 12:16:32 +09004596 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004597
4598 PRINT_D(HOSTINF_DBG, "Setting deauthenticating station message queue params\n");
4599
Tony Choa9f812a2015-09-21 12:16:33 +09004600 msg.id = HOST_IF_MSG_DEL_ALL_STA;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004601 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004602
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004603 for (i = 0; i < MAX_NUM_STA; i++) {
4604 if (memcmp(pu8MacAddr[i], au8Zero_Buff, ETH_ALEN)) {
Leo Kime51b9212015-10-13 19:50:09 +09004605 memcpy(pstrDelAllStationMsg->del_all_sta[i], pu8MacAddr[i], ETH_ALEN);
4606 PRINT_D(CFG80211_DBG, "BSSID = %x%x%x%x%x%x\n",
4607 pstrDelAllStationMsg->del_all_sta[i][0],
4608 pstrDelAllStationMsg->del_all_sta[i][1],
4609 pstrDelAllStationMsg->del_all_sta[i][2],
4610 pstrDelAllStationMsg->del_all_sta[i][3],
4611 pstrDelAllStationMsg->del_all_sta[i][4],
4612 pstrDelAllStationMsg->del_all_sta[i][5]);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004613 u8AssocNumb++;
4614 }
4615 }
4616 if (!u8AssocNumb) {
4617 PRINT_D(CFG80211_DBG, "NO ASSOCIATED STAS\n");
Leo Kim31390ee2015-10-19 18:26:08 +09004618 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004619 }
4620
Leo Kim8ba18032015-10-13 19:50:10 +09004621 pstrDelAllStationMsg->assoc_sta = u8AssocNumb;
Leo Kim31390ee2015-10-19 18:26:08 +09004622 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004623
Leo Kim31390ee2015-10-19 18:26:08 +09004624 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004625 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004626
Leo Kim2d25af82015-10-15 13:24:56 +09004627 down(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004628
Leo Kim31390ee2015-10-19 18:26:08 +09004629 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004630}
4631
Tony Choa4ab1ad2015-10-12 16:56:05 +09004632s32 host_int_edit_station(struct host_if_drv *hif_drv,
Tony Cho6a89ba92015-09-21 12:16:46 +09004633 struct add_sta_param *pstrStaParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004634{
Leo Kim31390ee2015-10-19 18:26:08 +09004635 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004636 struct host_if_msg msg;
Tony Choca8f47f2015-09-30 18:44:32 +09004637 struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004638
Tony Choa4ab1ad2015-10-12 16:56:05 +09004639 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004640 PRINT_ER("driver is null\n");
4641 return -EFAULT;
4642 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004643
4644 PRINT_D(HOSTINF_DBG, "Setting editing station message queue params\n");
4645
Tony Cho143eb952015-09-21 12:16:32 +09004646 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004647
Tony Choa9f812a2015-09-21 12:16:33 +09004648 msg.id = HOST_IF_MSG_EDIT_STATION;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004649 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004650
Tony Cho6a89ba92015-09-21 12:16:46 +09004651 memcpy(pstrAddStationMsg, pstrStaParams, sizeof(struct add_sta_param));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004652 if (pstrAddStationMsg->u8NumRates > 0) {
Glen Leef3052582015-09-10 12:03:04 +09004653 u8 *rates = kmalloc(pstrAddStationMsg->u8NumRates, GFP_KERNEL);
Leo Kimc09389a2015-10-28 15:59:24 +09004654
Leo Kim7ae43362015-09-16 18:35:59 +09004655 if (!rates)
4656 return -ENOMEM;
4657
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09004658 memcpy(rates, pstrStaParams->pu8Rates, pstrAddStationMsg->u8NumRates);
Arnd Bergmann057d1e92015-06-01 21:06:44 +02004659 pstrAddStationMsg->pu8Rates = rates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004660 }
4661
Leo Kim31390ee2015-10-19 18:26:08 +09004662 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4663 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004664 PRINT_ER("wilc_mq_send fail\n");
4665
Leo Kim31390ee2015-10-19 18:26:08 +09004666 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004667}
Glen Lee108b3432015-09-16 18:53:20 +09004668
Tony Choa4ab1ad2015-10-12 16:56:05 +09004669s32 host_int_set_power_mgmt(struct host_if_drv *hif_drv,
4670 bool bIsEnabled,
4671 u32 u32Timeout)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004672{
Leo Kim31390ee2015-10-19 18:26:08 +09004673 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004674 struct host_if_msg msg;
Tony Cho49e1f812015-09-30 18:44:36 +09004675 struct power_mgmt_param *pstrPowerMgmtParam = &msg.body.pwr_mgmt_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004676
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004677 PRINT_INFO(HOSTINF_DBG, "\n\n>> Setting PS to %d <<\n\n", bIsEnabled);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004678
Tony Choa4ab1ad2015-10-12 16:56:05 +09004679 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004680 PRINT_ER("driver is null\n");
4681 return -EFAULT;
4682 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004683
4684 PRINT_D(HOSTINF_DBG, "Setting Power management message queue params\n");
4685
Tony Cho143eb952015-09-21 12:16:32 +09004686 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004687
Tony Choa9f812a2015-09-21 12:16:33 +09004688 msg.id = HOST_IF_MSG_POWER_MGMT;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004689 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004690
Leo Kim33c70c12015-10-13 20:02:07 +09004691 pstrPowerMgmtParam->enabled = bIsEnabled;
Leo Kim937918f2015-10-13 20:02:08 +09004692 pstrPowerMgmtParam->timeout = u32Timeout;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004693
Leo Kim31390ee2015-10-19 18:26:08 +09004694 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4695 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004696 PRINT_ER("wilc_mq_send fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +09004697 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004698}
4699
Tony Choa4ab1ad2015-10-12 16:56:05 +09004700s32 host_int_setup_multicast_filter(struct host_if_drv *hif_drv,
4701 bool bIsEnabled,
4702 u32 u32count)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004703{
Leo Kim31390ee2015-10-19 18:26:08 +09004704 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004705 struct host_if_msg msg;
Tony Choa079cf4d2015-09-30 18:55:05 +09004706 struct set_multicast *pstrMulticastFilterParam = &msg.body.multicast_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004707
Tony Choa4ab1ad2015-10-12 16:56:05 +09004708 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004709 PRINT_ER("driver is null\n");
4710 return -EFAULT;
4711 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004712
4713 PRINT_D(HOSTINF_DBG, "Setting Multicast Filter params\n");
4714
Tony Cho143eb952015-09-21 12:16:32 +09004715 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004716
Tony Choa9f812a2015-09-21 12:16:33 +09004717 msg.id = HOST_IF_MSG_SET_MULTICAST_FILTER;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004718 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004719
Leo Kimbae636eb2015-10-13 20:02:04 +09004720 pstrMulticastFilterParam->enabled = bIsEnabled;
Leo Kimadab2f72015-10-13 20:02:05 +09004721 pstrMulticastFilterParam->cnt = u32count;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004722
Leo Kim31390ee2015-10-19 18:26:08 +09004723 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4724 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004725 PRINT_ER("wilc_mq_send fail\n");
Leo Kim31390ee2015-10-19 18:26:08 +09004726 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004727}
4728
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004729static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo)
4730{
Leo Kime0a12212015-10-12 16:55:49 +09004731 struct join_bss_param *pNewJoinBssParam = NULL;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004732 u8 *pu8IEs;
Chaehyun Limd85f5322015-06-11 14:35:54 +09004733 u16 u16IEsLen;
4734 u16 index = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004735 u8 suppRatesNo = 0;
4736 u8 extSuppRatesNo;
Chaehyun Limd85f5322015-06-11 14:35:54 +09004737 u16 jumpOffset;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004738 u8 pcipherCount;
4739 u8 authCount;
4740 u8 pcipherTotalCount = 0;
4741 u8 authTotalCount = 0;
4742 u8 i, j;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004743
4744 pu8IEs = ptstrNetworkInfo->pu8IEs;
4745 u16IEsLen = ptstrNetworkInfo->u16IEsLen;
4746
Shraddha Barkeb156f1e2015-10-13 23:07:00 +05304747 pNewJoinBssParam = kzalloc(sizeof(struct join_bss_param), GFP_KERNEL);
Leo Kim91109e12015-10-19 18:26:13 +09004748 if (pNewJoinBssParam) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004749 pNewJoinBssParam->dtim_period = ptstrNetworkInfo->u8DtimPeriod;
4750 pNewJoinBssParam->beacon_period = ptstrNetworkInfo->u16BeaconPeriod;
4751 pNewJoinBssParam->cap_info = ptstrNetworkInfo->u16CapInfo;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09004752 memcpy(pNewJoinBssParam->au8bssid, ptstrNetworkInfo->au8bssid, 6);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09004753 memcpy((u8 *)pNewJoinBssParam->ssid, ptstrNetworkInfo->au8ssid, ptstrNetworkInfo->u8SsidLen + 1);
Leo Kim619d27b2015-10-15 13:24:42 +09004754 pNewJoinBssParam->ssid_len = ptstrNetworkInfo->u8SsidLen;
Chaehyun Lim2cc46832015-08-07 09:02:01 +09004755 memset(pNewJoinBssParam->rsn_pcip_policy, 0xFF, 3);
4756 memset(pNewJoinBssParam->rsn_auth_policy, 0xFF, 3);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004757
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004758 while (index < u16IEsLen) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004759 if (pu8IEs[index] == SUPP_RATES_IE) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004760 suppRatesNo = pu8IEs[index + 1];
4761 pNewJoinBssParam->supp_rates[0] = suppRatesNo;
Leo Kimae4dfa52015-10-13 19:49:26 +09004762 index += 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004763
Leo Kimd1666e22015-10-28 15:59:22 +09004764 for (i = 0; i < suppRatesNo; i++)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004765 pNewJoinBssParam->supp_rates[i + 1] = pu8IEs[index + i];
Leo Kimd1666e22015-10-28 15:59:22 +09004766
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004767 index += suppRatesNo;
4768 continue;
Leo Kimae4dfa52015-10-13 19:49:26 +09004769 } else if (pu8IEs[index] == EXT_SUPP_RATES_IE) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004770 extSuppRatesNo = pu8IEs[index + 1];
4771 if (extSuppRatesNo > (MAX_RATES_SUPPORTED - suppRatesNo))
4772 pNewJoinBssParam->supp_rates[0] = MAX_RATES_SUPPORTED;
4773 else
4774 pNewJoinBssParam->supp_rates[0] += extSuppRatesNo;
4775 index += 2;
Leo Kimd1666e22015-10-28 15:59:22 +09004776 for (i = 0; i < (pNewJoinBssParam->supp_rates[0] - suppRatesNo); i++)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004777 pNewJoinBssParam->supp_rates[suppRatesNo + i + 1] = pu8IEs[index + i];
Leo Kimd1666e22015-10-28 15:59:22 +09004778
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004779 index += extSuppRatesNo;
4780 continue;
Leo Kimae4dfa52015-10-13 19:49:26 +09004781 } else if (pu8IEs[index] == HT_CAPABILITY_IE) {
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09004782 pNewJoinBssParam->ht_capable = true;
Leo Kimae4dfa52015-10-13 19:49:26 +09004783 index += pu8IEs[index + 1] + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004784 continue;
Leo Kimae4dfa52015-10-13 19:49:26 +09004785 } else if ((pu8IEs[index] == WMM_IE) &&
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004786 (pu8IEs[index + 2] == 0x00) && (pu8IEs[index + 3] == 0x50) &&
Leo Kimae4dfa52015-10-13 19:49:26 +09004787 (pu8IEs[index + 4] == 0xF2) &&
4788 (pu8IEs[index + 5] == 0x02) &&
4789 ((pu8IEs[index + 6] == 0x00) || (pu8IEs[index + 6] == 0x01)) &&
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004790 (pu8IEs[index + 7] == 0x01)) {
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09004791 pNewJoinBssParam->wmm_cap = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004792
Anish Bhattffda2032015-09-29 12:15:49 -07004793 if (pu8IEs[index + 8] & BIT(7))
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09004794 pNewJoinBssParam->uapsd_cap = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004795 index += pu8IEs[index + 1] + 2;
4796 continue;
Leo Kimae4dfa52015-10-13 19:49:26 +09004797 } else if ((pu8IEs[index] == P2P_IE) &&
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004798 (pu8IEs[index + 2] == 0x50) && (pu8IEs[index + 3] == 0x6f) &&
Leo Kimae4dfa52015-10-13 19:49:26 +09004799 (pu8IEs[index + 4] == 0x9a) &&
4800 (pu8IEs[index + 5] == 0x09) && (pu8IEs[index + 6] == 0x0c)) {
Chaehyun Limd85f5322015-06-11 14:35:54 +09004801 u16 u16P2P_count;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02004802
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004803 pNewJoinBssParam->tsf = ptstrNetworkInfo->u32Tsf;
Leo Kim7a8d51d2015-10-15 13:24:43 +09004804 pNewJoinBssParam->noa_enabled = 1;
Leo Kimcc179002015-10-15 13:24:47 +09004805 pNewJoinBssParam->idx = pu8IEs[index + 9];
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004806
Anish Bhattffda2032015-09-29 12:15:49 -07004807 if (pu8IEs[index + 10] & BIT(7)) {
Leo Kimd72b33c2015-10-15 13:24:44 +09004808 pNewJoinBssParam->opp_enabled = 1;
Leo Kim99b66942015-10-15 13:24:45 +09004809 pNewJoinBssParam->ct_window = pu8IEs[index + 10];
Leo Kimd72b33c2015-10-15 13:24:44 +09004810 } else {
4811 pNewJoinBssParam->opp_enabled = 0;
4812 }
Leo Kimae4dfa52015-10-13 19:49:26 +09004813
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004814 PRINT_D(GENERIC_DBG, "P2P Dump\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004815 for (i = 0; i < pu8IEs[index + 7]; i++)
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004816 PRINT_D(GENERIC_DBG, " %x\n", pu8IEs[index + 9 + i]);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004817
Leo Kimc21047e2015-10-15 13:24:46 +09004818 pNewJoinBssParam->cnt = pu8IEs[index + 11];
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004819 u16P2P_count = index + 12;
4820
Leo Kim109e6ca2015-10-15 13:24:48 +09004821 memcpy(pNewJoinBssParam->duration, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004822 u16P2P_count += 4;
4823
Leo Kim1d8b76b2015-10-15 13:24:49 +09004824 memcpy(pNewJoinBssParam->interval, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004825 u16P2P_count += 4;
4826
Leo Kim4be55e22015-10-28 15:59:27 +09004827 memcpy(pNewJoinBssParam->start_time, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004828
4829 index += pu8IEs[index + 1] + 2;
4830 continue;
4831
Leo Kimae4dfa52015-10-13 19:49:26 +09004832 } else if ((pu8IEs[index] == RSN_IE) ||
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004833 ((pu8IEs[index] == WPA_IE) && (pu8IEs[index + 2] == 0x00) &&
4834 (pu8IEs[index + 3] == 0x50) && (pu8IEs[index + 4] == 0xF2) &&
4835 (pu8IEs[index + 5] == 0x01))) {
Chaehyun Limd85f5322015-06-11 14:35:54 +09004836 u16 rsnIndex = index;
Leo Kimae4dfa52015-10-13 19:49:26 +09004837
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004838 if (pu8IEs[rsnIndex] == RSN_IE) {
4839 pNewJoinBssParam->mode_802_11i = 2;
Leo Kimae4dfa52015-10-13 19:49:26 +09004840 } else {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004841 if (pNewJoinBssParam->mode_802_11i == 0)
4842 pNewJoinBssParam->mode_802_11i = 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004843 rsnIndex += 4;
4844 }
Leo Kimae4dfa52015-10-13 19:49:26 +09004845
4846 rsnIndex += 7;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004847 pNewJoinBssParam->rsn_grp_policy = pu8IEs[rsnIndex];
4848 rsnIndex++;
Leo Kimae4dfa52015-10-13 19:49:26 +09004849 jumpOffset = pu8IEs[rsnIndex] * 4;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004850 pcipherCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
Leo Kimae4dfa52015-10-13 19:49:26 +09004851 rsnIndex += 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004852
Leo Kimd1666e22015-10-28 15:59:22 +09004853 for (i = pcipherTotalCount, j = 0; i < pcipherCount + pcipherTotalCount && i < 3; i++, j++)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004854 pNewJoinBssParam->rsn_pcip_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
Leo Kimd1666e22015-10-28 15:59:22 +09004855
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004856 pcipherTotalCount += pcipherCount;
4857 rsnIndex += jumpOffset;
4858
4859 jumpOffset = pu8IEs[rsnIndex] * 4;
4860
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004861 authCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
Leo Kimae4dfa52015-10-13 19:49:26 +09004862 rsnIndex += 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004863
Leo Kimd1666e22015-10-28 15:59:22 +09004864 for (i = authTotalCount, j = 0; i < authTotalCount + authCount; i++, j++)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004865 pNewJoinBssParam->rsn_auth_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
Leo Kimd1666e22015-10-28 15:59:22 +09004866
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004867 authTotalCount += authCount;
4868 rsnIndex += jumpOffset;
Leo Kimae4dfa52015-10-13 19:49:26 +09004869
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004870 if (pu8IEs[index] == RSN_IE) {
4871 pNewJoinBssParam->rsn_cap[0] = pu8IEs[rsnIndex];
4872 pNewJoinBssParam->rsn_cap[1] = pu8IEs[rsnIndex + 1];
4873 rsnIndex += 2;
4874 }
Abdul Hussainf717c0eb2015-06-16 09:49:49 +00004875 pNewJoinBssParam->rsn_found = true;
Leo Kimae4dfa52015-10-13 19:49:26 +09004876 index += pu8IEs[index + 1] + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004877 continue;
4878 } else
Leo Kimae4dfa52015-10-13 19:49:26 +09004879 index += pu8IEs[index + 1] + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004880 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004881 }
4882
4883 return (void *)pNewJoinBssParam;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004884}
4885
4886void host_int_freeJoinParams(void *pJoinParams)
4887{
Leo Kim91109e12015-10-19 18:26:13 +09004888 if ((struct bss_param *)pJoinParams)
Leo Kime0a12212015-10-12 16:55:49 +09004889 kfree((struct bss_param *)pJoinParams);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004890 else
4891 PRINT_ER("Unable to FREE null pointer\n");
4892}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004893
Tony Choa4ab1ad2015-10-12 16:56:05 +09004894s32 host_int_delBASession(struct host_if_drv *hif_drv, char *pBSSID, char TID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004895{
Leo Kim31390ee2015-10-19 18:26:08 +09004896 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004897 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09004898 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004899
Tony Choa4ab1ad2015-10-12 16:56:05 +09004900 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004901 PRINT_ER("driver is null\n");
4902 return -EFAULT;
4903 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004904
Tony Cho143eb952015-09-21 12:16:32 +09004905 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004906
Tony Choa9f812a2015-09-21 12:16:33 +09004907 msg.id = HOST_IF_MSG_DEL_BA_SESSION;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004908
4909 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
4910 pBASessionInfo->u8Ted = TID;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004911 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004912
Leo Kim31390ee2015-10-19 18:26:08 +09004913 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4914 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004915 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004916
Leo Kim2d25af82015-10-15 13:24:56 +09004917 down(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004918
Leo Kim31390ee2015-10-19 18:26:08 +09004919 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004920}
4921
Tony Choa4ab1ad2015-10-12 16:56:05 +09004922s32 host_int_del_All_Rx_BASession(struct host_if_drv *hif_drv,
4923 char *pBSSID,
4924 char TID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004925{
Leo Kim31390ee2015-10-19 18:26:08 +09004926 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004927 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09004928 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004929
Tony Choa4ab1ad2015-10-12 16:56:05 +09004930 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004931 PRINT_ER("driver is null\n");
4932 return -EFAULT;
4933 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004934
Tony Cho143eb952015-09-21 12:16:32 +09004935 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004936
Tony Choa9f812a2015-09-21 12:16:33 +09004937 msg.id = HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004938
4939 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
4940 pBASessionInfo->u8Ted = TID;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004941 msg.drv = hif_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004942
Leo Kim31390ee2015-10-19 18:26:08 +09004943 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4944 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004945 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004946
Leo Kim2d25af82015-10-15 13:24:56 +09004947 down(&hif_sema_wait_response);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004948
Leo Kim31390ee2015-10-19 18:26:08 +09004949 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004950}
4951
Tony Choa4ab1ad2015-10-12 16:56:05 +09004952s32 host_int_setup_ipaddress(struct host_if_drv *hif_drv, u8 *u16ipadd, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004953{
Leo Kim31390ee2015-10-19 18:26:08 +09004954 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004955 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004956
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004957 return 0;
4958
Tony Choa4ab1ad2015-10-12 16:56:05 +09004959 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004960 PRINT_ER("driver is null\n");
4961 return -EFAULT;
4962 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004963
Tony Cho143eb952015-09-21 12:16:32 +09004964 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004965
Tony Choa9f812a2015-09-21 12:16:33 +09004966 msg.id = HOST_IF_MSG_SET_IPADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004967
Leo Kim78675be2015-10-13 20:02:09 +09004968 msg.body.ip_info.ip_addr = u16ipadd;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004969 msg.drv = hif_drv;
Tony Chofb2d65e2015-09-30 18:44:39 +09004970 msg.body.ip_info.idx = idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004971
Leo Kim31390ee2015-10-19 18:26:08 +09004972 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4973 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004974 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004975
Leo Kim31390ee2015-10-19 18:26:08 +09004976 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004977}
4978
Tony Choa4ab1ad2015-10-12 16:56:05 +09004979s32 host_int_get_ipaddress(struct host_if_drv *hif_drv, u8 *u16ipadd, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004980{
Leo Kim31390ee2015-10-19 18:26:08 +09004981 s32 result = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004982 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004983
Tony Choa4ab1ad2015-10-12 16:56:05 +09004984 if (!hif_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09004985 PRINT_ER("driver is null\n");
4986 return -EFAULT;
4987 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004988
Tony Cho143eb952015-09-21 12:16:32 +09004989 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004990
Tony Choa9f812a2015-09-21 12:16:33 +09004991 msg.id = HOST_IF_MSG_GET_IPADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004992
Leo Kim78675be2015-10-13 20:02:09 +09004993 msg.body.ip_info.ip_addr = u16ipadd;
Tony Choa4ab1ad2015-10-12 16:56:05 +09004994 msg.drv = hif_drv;
Tony Chofb2d65e2015-09-30 18:44:39 +09004995 msg.body.ip_info.idx = idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004996
Leo Kim31390ee2015-10-19 18:26:08 +09004997 result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
4998 if (result)
Leo Kim24db7132015-09-16 18:36:01 +09004999 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005000
Leo Kim31390ee2015-10-19 18:26:08 +09005001 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005002}