blob: 7867078acc528022656d36bdb039c1098061b826 [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"
Johnny Kimc5c77ba2015-05-11 14:30:56 +09009
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +090010extern u8 connecting;
Johnny Kimc5c77ba2015-05-11 14:30:56 +090011
Greg Kroah-Hartmanda711eb2015-08-14 19:46:06 -070012extern struct timer_list hDuringIpTimer;
Johnny Kimc5c77ba2015-05-11 14:30:56 +090013
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +090014extern u8 g_wilc_initialized;
Johnny Kimc5c77ba2015-05-11 14:30:56 +090015
16/* Message types of the Host IF Message Queue*/
Chaehyun Lim9eac3a12015-06-18 22:08:51 +090017#define HOST_IF_MSG_SCAN 0
18#define HOST_IF_MSG_CONNECT 1
19#define HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO 2
20#define HOST_IF_MSG_KEY 3
21#define HOST_IF_MSG_RCVD_NTWRK_INFO 4
22#define HOST_IF_MSG_RCVD_SCAN_COMPLETE 5
23#define HOST_IF_MSG_CFG_PARAMS 6
24#define HOST_IF_MSG_SET_CHANNEL 7
25#define HOST_IF_MSG_DISCONNECT 8
26#define HOST_IF_MSG_GET_RSSI 9
27#define HOST_IF_MSG_GET_CHNL 10
28#define HOST_IF_MSG_ADD_BEACON 11
29#define HOST_IF_MSG_DEL_BEACON 12
30#define HOST_IF_MSG_ADD_STATION 13
31#define HOST_IF_MSG_DEL_STATION 14
32#define HOST_IF_MSG_EDIT_STATION 15
33#define HOST_IF_MSG_SCAN_TIMER_FIRED 16
34#define HOST_IF_MSG_CONNECT_TIMER_FIRED 17
35#define HOST_IF_MSG_POWER_MGMT 18
36#define HOST_IF_MSG_GET_INACTIVETIME 19
37#define HOST_IF_MSG_REMAIN_ON_CHAN 20
38#define HOST_IF_MSG_REGISTER_FRAME 21
39#define HOST_IF_MSG_LISTEN_TIMER_FIRED 22
40#define HOST_IF_MSG_GET_LINKSPEED 23
41#define HOST_IF_MSG_SET_WFIDRV_HANDLER 24
42#define HOST_IF_MSG_SET_MAC_ADDRESS 25
43#define HOST_IF_MSG_GET_MAC_ADDRESS 26
44#define HOST_IF_MSG_SET_OPERATION_MODE 27
45#define HOST_IF_MSG_SET_IPADDRESS 28
46#define HOST_IF_MSG_GET_IPADDRESS 29
47#define HOST_IF_MSG_FLUSH_CONNECT 30
48#define HOST_IF_MSG_GET_STATISTICS 31
49#define HOST_IF_MSG_SET_MULTICAST_FILTER 32
50#define HOST_IF_MSG_ADD_BA_SESSION 33
51#define HOST_IF_MSG_DEL_BA_SESSION 34
52#define HOST_IF_MSG_Q_IDLE 35
53#define HOST_IF_MSG_DEL_ALL_STA 36
54#define HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS 34
55#define HOST_IF_MSG_EXIT 100
Johnny Kimc5c77ba2015-05-11 14:30:56 +090056
Chaehyun Lime54d5b72015-06-18 22:08:50 +090057#define HOST_IF_SCAN_TIMEOUT 4000
58#define HOST_IF_CONNECT_TIMEOUT 9500
Johnny Kimc5c77ba2015-05-11 14:30:56 +090059
Chaehyun Lime54d5b72015-06-18 22:08:50 +090060#define BA_SESSION_DEFAULT_BUFFER_SIZE 16
61#define BA_SESSION_DEFAULT_TIMEOUT 1000
62#define BLOCK_ACK_REQ_SIZE 0x14
Johnny Kimc5c77ba2015-05-11 14:30:56 +090063
64/*!
Tony Cho361ff842015-09-21 12:16:41 +090065 * @struct cfg_param_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +090066 * @brief Structure to hold Host IF CFG Params Attributes
67 * @details
68 * @todo
69 * @sa
70 * @author Mai Daftedar
71 * @date 02 April 2012
72 * @version 1.0
73 */
Tony Cho361ff842015-09-21 12:16:41 +090074struct cfg_param_attr {
Leo Kim95296502015-10-05 15:25:46 +090075 struct cfg_param_val pstrCfgParamVal;
Tony Cho361ff842015-09-21 12:16:41 +090076};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090077
78/*!
Leo Kim4372d3d2015-10-05 15:25:43 +090079 * @struct host_if_wpa_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +090080 * @brief Structure to hold Host IF Scan Attributes
81 * @details
82 * @todo
83 * @sa
84 * @author Mai Daftedar
85 * @date 25 March 2012
86 * @version 1.0
87 */
Leo Kim4372d3d2015-10-05 15:25:43 +090088struct host_if_wpa_attr {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +090089 u8 *pu8key;
90 const u8 *pu8macaddr;
91 u8 *pu8seq;
92 u8 u8seqlen;
93 u8 u8keyidx;
94 u8 u8Keylen;
95 u8 u8Ciphermode;
Leo Kim4372d3d2015-10-05 15:25:43 +090096};
Johnny Kimc5c77ba2015-05-11 14:30:56 +090097
98
99/*!
Leo Kimc276c442015-10-05 15:25:42 +0900100 * @struct host_if_wep_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900101 * @brief Structure to hold Host IF Scan Attributes
102 * @details
103 * @todo
104 * @sa
105 * @author Mai Daftedar
106 * @date 25 March 2012
107 * @version 1.0
108 */
Leo Kimc276c442015-10-05 15:25:42 +0900109struct host_if_wep_attr {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900110 u8 *pu8WepKey;
111 u8 u8WepKeylen;
112 u8 u8Wepidx;
113 u8 u8mode;
Leo Kim841dfc42015-10-05 15:25:39 +0900114 enum AUTHTYPE tenuAuth_type;
Leo Kimc276c442015-10-05 15:25:42 +0900115};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900116
117/*!
Leo Kim40cc2c92015-10-05 15:25:41 +0900118 * @struct host_if_key_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900119 * @brief Structure to hold Host IF Scan Attributes
120 * @details
121 * @todo
122 * @sa
123 * @author Mai Daftedar
124 * @date 25 March 2012
125 * @version 1.0
126 */
Leo Kim40cc2c92015-10-05 15:25:41 +0900127union host_if_key_attr {
Leo Kimc276c442015-10-05 15:25:42 +0900128 struct host_if_wep_attr strHostIFwepAttr;
Leo Kim4372d3d2015-10-05 15:25:43 +0900129 struct host_if_wpa_attr strHostIFwpaAttr;
Leo Kima949f902015-10-05 15:25:44 +0900130 struct host_if_pmkid_attr strHostIFpmkidAttr;
Leo Kim40cc2c92015-10-05 15:25:41 +0900131};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900132
133/*!
Tony Choc98387a2015-09-21 12:16:40 +0900134 * @struct key_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900135 * @brief Structure to hold Host IF Scan Attributes
136 * @details
137 * @todo
138 * @sa
139 * @author Mai Daftedar
140 * @date 25 March 2012
141 * @version 1.0
142 */
Tony Choc98387a2015-09-21 12:16:40 +0900143struct key_attr {
Leo Kimb9d96332015-10-05 15:25:40 +0900144 enum KEY_TYPE enuKeyType;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900145 u8 u8KeyAction;
Leo Kim40cc2c92015-10-05 15:25:41 +0900146 union host_if_key_attr uniHostIFkeyAttr;
Tony Choc98387a2015-09-21 12:16:40 +0900147};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900148
149
150
151
152/*!
Tony Choc476feb2015-09-21 12:16:36 +0900153 * @struct scan_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900154 * @brief Structure to hold Host IF Scan Attributes
155 * @details
156 * @todo
157 * @sa
158 * @author Mostafa Abu Bakr
159 * @date 25 March 2012
160 * @version 1.0
161 */
Tony Choc476feb2015-09-21 12:16:36 +0900162struct scan_attr {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900163 u8 u8ScanSource;
164 u8 u8ScanType;
165 u8 *pu8ChnlFreqList;
166 u8 u8ChnlListLen;
167 u8 *pu8IEs;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900168 size_t IEsLen;
Leo Kimba1d1a62015-10-05 15:25:36 +0900169 wilc_scan_result pfScanResult;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900170 void *pvUserArg;
Leo Kim607db442015-10-05 15:25:37 +0900171 struct hidden_network strHiddenNetwork;
Tony Choc476feb2015-09-21 12:16:36 +0900172};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900173
174/*!
Tony Cho120ae592015-09-21 12:16:37 +0900175 * @struct connect_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900176 * @brief Structure to hold Host IF Connect Attributes
177 * @details
178 * @todo
179 * @sa
180 * @author Mostafa Abu Bakr
181 * @date 25 March 2012
182 * @version 1.0
183 */
Tony Cho120ae592015-09-21 12:16:37 +0900184struct connect_attr {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900185 u8 *pu8bssid;
186 u8 *pu8ssid;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900187 size_t ssidLen;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900188 u8 *pu8IEs;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900189 size_t IEsLen;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900190 u8 u8security;
Leo Kimb6ab85f2015-10-05 15:25:38 +0900191 wilc_connect_result pfConnectResult;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900192 void *pvUserArg;
Leo Kim841dfc42015-10-05 15:25:39 +0900193 enum AUTHTYPE tenuAuth_type;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900194 u8 u8channel;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900195 void *pJoinParams;
Tony Cho120ae592015-09-21 12:16:37 +0900196};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900197
198/*!
Tony Chof23a9ea2015-09-21 12:16:39 +0900199 * @struct rcvd_async_info
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900200 * @brief Structure to hold Received General Asynchronous info
201 * @details
202 * @todo
203 * @sa
204 * @author Mostafa Abu Bakr
205 * @date 25 March 2012
206 * @version 1.0
207 */
Tony Chof23a9ea2015-09-21 12:16:39 +0900208struct rcvd_async_info {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900209 u8 *pu8Buffer;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900210 u32 u32Length;
Tony Chof23a9ea2015-09-21 12:16:39 +0900211};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900212
213/*!
Tony Cho94bdfe42015-09-30 18:44:27 +0900214 * @struct channel_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900215 * @brief Set Channel message body
216 * @details
217 * @todo
218 * @sa
219 * @author Mai Daftedar
220 * @date 25 March 2012
221 * @version 1.0
222 */
Tony Cho94bdfe42015-09-30 18:44:27 +0900223struct channel_attr {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900224 u8 u8SetChan;
Tony Cho326b3232015-09-21 12:16:42 +0900225};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900226
227/*!
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900228 * @struct tstrScanComplete
229 * @brief hold received Async. Scan Complete message body
230 * @details
231 * @todo
232 * @sa
233 * @author zsalah
234 * @date 25 March 2012
235 * @version 1.0
236 */
237/*typedef struct _tstrScanComplete
238 * {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900239 * u8* pu8Buffer;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900240 * u32 u32Length;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900241 * } tstrScanComplete;*/
242
243/*!
Tony Cho7f33fec2015-09-30 18:44:30 +0900244 * @struct beacon_attr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900245 * @brief Set Beacon message body
246 * @details
247 * @todo
248 * @sa
249 * @author Adham Abozaeid
250 * @date 10 July 2012
251 * @version 1.0
252 */
Tony Cho7f33fec2015-09-30 18:44:30 +0900253struct beacon_attr {
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900254 u32 u32Interval; /*!< Beacon Interval. Period between two successive beacons on air */
255 u32 u32DTIMPeriod; /*!< DTIM Period. Indicates how many Beacon frames
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900256 * (including the current frame) appear before the next DTIM */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900257 u32 u32HeadLen; /*!< Length of the head buffer in bytes */
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900258 u8 *pu8Head; /*!< Pointer to the beacon's head buffer. Beacon's head is the part
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900259 * from the beacon's start till the TIM element, NOT including the TIM */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900260 u32 u32TailLen; /*!< Length of the tail buffer in bytes */
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900261 u8 *pu8Tail; /*!< Pointer to the beacon's tail buffer. Beacon's tail starts just
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900262 * after the TIM inormation element */
Tony Cho902362b2015-09-21 12:16:44 +0900263};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900264
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900265/*!
Tony Cho641210a2015-09-21 12:16:52 +0900266 * @struct set_multicast
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900267 * @brief set Multicast filter Address
268 * @details
269 * @todo
270 * @sa
271 * @author Abdelrahman Sobhy
272 * @date 30 August 2013
273 * @version 1.0 Description
274 */
275
Tony Cho641210a2015-09-21 12:16:52 +0900276struct set_multicast {
Dean Lee72ed4dc2015-06-12 14:11:44 +0900277 bool bIsEnabled;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900278 u32 u32count;
Tony Cho641210a2015-09-21 12:16:52 +0900279};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900280
281/*!
Tony Chob4e644e2015-09-21 12:17:00 +0900282 * @struct del_all_sta
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900283 * @brief Deauth station message body
284 * @details
285 * @todo
286 * @sa
287 * @author Mai Daftedar
288 * @date 09 April 2014
289 * @version 1.0 Description
290 */
Tony Chob4e644e2015-09-21 12:17:00 +0900291struct del_all_sta {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900292 u8 au8Sta_DelAllSta[MAX_NUM_STA][ETH_ALEN];
293 u8 u8Num_AssocSta;
Tony Chob4e644e2015-09-21 12:17:00 +0900294};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900295
296/*!
Tony Chofb93a1e2015-09-21 12:16:57 +0900297 * @struct del_sta
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900298 * @brief Delete station message body
299 * @details
300 * @todo
301 * @sa
302 * @author Adham Abozaeid
303 * @date 15 July 2012
304 * @version 1.0 Description
305 */
Tony Chofb93a1e2015-09-21 12:16:57 +0900306struct del_sta {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900307 u8 au8MacAddr[ETH_ALEN];
Tony Chofb93a1e2015-09-21 12:16:57 +0900308};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900309
310/*!
Tony Cho5a008f12015-09-21 12:16:48 +0900311 * @struct power_mgmt_param
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900312 * @brief Power management message body
313 * @details
314 * @todo
315 * @sa
316 * @author Adham Abozaeid
317 * @date 24 November 2012
318 * @version 1.0
319 */
Tony Cho5a008f12015-09-21 12:16:48 +0900320struct power_mgmt_param {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900321
Dean Lee72ed4dc2015-06-12 14:11:44 +0900322 bool bIsEnabled;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900323 u32 u32Timeout;
Tony Cho5a008f12015-09-21 12:16:48 +0900324};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900325
326/*!
Tony Cho15191ea2015-09-21 12:16:50 +0900327 * @struct set_ip_addr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900328 * @brief set IP Address message body
329 * @details
330 * @todo
331 * @sa
332 * @author Abdelrahman Sobhy
333 * @date 30 August 2013
334 * @version 1.0 Description
335 */
Tony Cho15191ea2015-09-21 12:16:50 +0900336struct set_ip_addr {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900337 u8 *au8IPAddr;
338 u8 idx;
Tony Cho15191ea2015-09-21 12:16:50 +0900339};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900340
341/*!
Tony Cho3d1eac02015-09-21 12:16:49 +0900342 * @struct sta_inactive_t
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900343 * @brief Get station message body
344 * @details
345 * @todo
346 * @sa
347 * @author Mai Daftedar
348 * @date 16 April 2013
349 * @version 1.0
350 */
Tony Cho3d1eac02015-09-21 12:16:49 +0900351struct sta_inactive_t {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900352 u8 mac[6];
Tony Cho3d1eac02015-09-21 12:16:49 +0900353};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900354/**/
355/*!
Tony Chodfc76632015-09-21 12:16:34 +0900356 * @union message_body
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900357 * @brief Message body for the Host Interface message_q
358 * @details
359 * @todo
360 * @sa
361 * @author Mostafa Abu Bakr
362 * @date 25 March 2012
363 * @version 1.0
364 */
Tony Chodfc76632015-09-21 12:16:34 +0900365union message_body {
Tony Cho4528bdb2015-09-30 18:44:20 +0900366 struct scan_attr scan_info;
Tony Cho3f501972015-09-30 18:44:21 +0900367 struct connect_attr con_info;
Tony Cho02d19462015-09-30 18:44:22 +0900368 struct rcvd_net_info net_info;
Tony Cho66add622015-09-30 18:44:23 +0900369 struct rcvd_async_info async_info;
Tony Cho18990bf2015-09-30 18:44:24 +0900370 struct key_attr key_info;
Tony Choa2340c32015-09-30 18:44:25 +0900371 struct cfg_param_attr cfg_info;
Tony Choffd6dbc2015-09-30 18:44:28 +0900372 struct channel_attr channel_info;
Tony Choa98491e2015-09-30 18:44:31 +0900373 struct beacon_attr beacon_info;
Tony Choca8f47f2015-09-30 18:44:32 +0900374 struct add_sta_param add_sta_info;
Tony Cho889c25b2015-09-30 18:44:33 +0900375 struct del_sta del_sta_info;
Tony Cho4a930962015-09-30 18:44:34 +0900376 struct add_sta_param edit_sta_info;
Tony Cho49e1f812015-09-30 18:44:36 +0900377 struct power_mgmt_param pwr_mgmt_info;
Tony Cho66bac7f2015-09-30 18:44:37 +0900378 struct sta_inactive_t mac_info;
Tony Chofb2d65e2015-09-30 18:44:39 +0900379 struct set_ip_addr ip_info;
Tony Cho5e4377e2015-09-30 18:44:38 +0900380 struct drv_handler drv;
Tony Choa079cf4d2015-09-30 18:55:05 +0900381 struct set_multicast multicast_info;
Tony Cho00c46302015-09-30 18:55:06 +0900382 struct op_mode mode;
Tony Cho15326e22015-09-30 18:55:07 +0900383 struct set_mac_addr set_mac_info;
Tony Choa5848692015-09-30 18:55:08 +0900384 struct get_mac_addr get_mac_info;
Tony Choc833b472015-09-30 18:55:09 +0900385 struct ba_session_info session_info;
Tony Cho070d3652015-09-30 18:55:10 +0900386 struct remain_ch remain_on_ch;
Tony Cho5c4008d2015-10-05 13:50:44 +0900387 struct reg_frame reg_frame;
Tony Choe60831e2015-10-05 13:50:45 +0900388 char *data;
Tony Chob0c1e802015-10-05 13:50:46 +0900389 struct del_all_sta del_all_sta_info;
Tony Chodfc76632015-09-21 12:16:34 +0900390};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900391
392/*!
Tony Cho3a8c41b2015-09-18 18:11:04 +0900393 * @struct struct host_if_msg
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900394 * @brief Host Interface message
395 * @details
396 * @todo
397 * @sa
398 * @author Mostafa Abu Bakr
399 * @date 25 March 2012
400 * @version 1.0
401 */
Tony Cho3a8c41b2015-09-18 18:11:04 +0900402struct host_if_msg {
Tony Choa9f812a2015-09-21 12:16:33 +0900403 u16 id; /*!< Message ID */
Tony Cho410c2482015-09-21 12:16:35 +0900404 union message_body body; /*!< Message body */
Johnny Kim11f58c82015-08-13 13:41:20 +0900405 tstrWILC_WFIDrv *drvHandler;
Tony Cho3a8c41b2015-09-18 18:11:04 +0900406};
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900407
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900408typedef struct _tstrWidJoinReqExt {
Dean Lee576917a2015-06-15 11:58:57 +0900409 char SSID[MAX_SSID_LEN];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900410 u8 u8channel;
411 u8 BSSID[6];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900412} tstrWidJoinReqExt;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900413
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900414/*Struct containg joinParam of each AP*/
415typedef struct _tstrJoinBssParam {
416 BSSTYPE_T bss_type;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900417 u8 dtim_period;
Chaehyun Limd85f5322015-06-11 14:35:54 +0900418 u16 beacon_period;
419 u16 cap_info;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900420 u8 au8bssid[6];
Dean Lee576917a2015-06-15 11:58:57 +0900421 char ssid[MAX_SSID_LEN];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900422 u8 ssidLen;
423 u8 supp_rates[MAX_RATES_SUPPORTED + 1];
424 u8 ht_capable;
425 u8 wmm_cap;
426 u8 uapsd_cap;
Dean Lee72ed4dc2015-06-12 14:11:44 +0900427 bool rsn_found;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900428 u8 rsn_grp_policy;
429 u8 mode_802_11i;
430 u8 rsn_pcip_policy[3];
431 u8 rsn_auth_policy[3];
432 u8 rsn_cap[2];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900433 struct _tstrJoinParam *nextJoinBss;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900434 u32 tsf;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900435 u8 u8NoaEnbaled;
436 u8 u8OppEnable;
437 u8 u8CtWindow;
438 u8 u8Count;
439 u8 u8Index;
440 u8 au8Duration[4];
441 u8 au8Interval[4];
442 u8 au8StartTime[4];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900443} tstrJoinBssParam;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900444/*a linked list table containing needed join parameters entries for each AP found in most recent scan*/
445typedef struct _tstrBssTable {
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900446 u8 u8noBssEntries;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900447 tstrJoinBssParam *head;
448 tstrJoinBssParam *tail;
449} tstrBssTable;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900450
451typedef enum {
452 SCAN_TIMER = 0,
453 CONNECT_TIMER = 1,
454 SCAN_CONNECT_TIMER_FORCE_32BIT = 0xFFFFFFFF
455} tenuScanConnTimer;
456
457/*****************************************************************************/
458/* */
459/* Global Variabls */
460/* */
461/*****************************************************************************/
Johnny Kimd42ab082015-08-20 16:32:52 +0900462/* Zero is not used, because a zero ID means termination */
463static tstrWILC_WFIDrv *wfidrv_list[NUM_CONCURRENT_IFC + 1];
Daniel Machon6fdb3022015-07-06 19:48:04 +0200464tstrWILC_WFIDrv *terminated_handle;
465tstrWILC_WFIDrv *gWFiDrvHandle;
Dean Lee72ed4dc2015-06-12 14:11:44 +0900466bool g_obtainingIP = false;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900467u8 P2P_LISTEN_STATE;
Arnd Bergmann1999bd52015-05-29 22:52:14 +0200468static struct task_struct *HostIFthreadHandler;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900469static WILC_MsgQueueHandle gMsgQHostIF;
Arnd Bergmann83383ea2015-06-01 21:06:43 +0200470static struct semaphore hSemHostIFthrdEnd;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900471
Arnd Bergmann83383ea2015-06-01 21:06:43 +0200472struct semaphore hSemDeinitDrvHandle;
473static struct semaphore hWaitResponse;
474struct semaphore hSemHostIntDeinit;
Greg Kroah-Hartmanda711eb2015-08-14 19:46:06 -0700475struct timer_list g_hPeriodicRSSI;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900476
477
478
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900479u8 gau8MulticastMacAddrList[WILC_MULTICAST_TABLE_SIZE][ETH_ALEN];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900480
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900481static u8 gapu8RcvdAssocResp[MAX_ASSOC_RESP_FRAME_SIZE];
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900482
Dean Lee72ed4dc2015-06-12 14:11:44 +0900483bool gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900484
Chaehyun Limca356ad2015-06-11 14:35:57 +0900485static s8 gs8Rssi;
486static s8 gs8lnkspd;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900487static u8 gu8Chnl;
488static u8 gs8SetIP[2][4];
489static u8 gs8GetIP[2][4];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900490static u32 gu32InactiveTime;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900491static u8 gu8DelBcn;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900492static u32 gu32WidConnRstHack;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900493
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900494u8 *gu8FlushedJoinReq;
495u8 *gu8FlushedInfoElemAsoc;
496u8 gu8Flushed11iMode;
497u8 gu8FlushedAuthType;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900498u32 gu32FlushedJoinReqSize;
499u32 gu32FlushedInfoElemAsocSize;
Johnny Kim8a625ca2015-08-20 16:32:50 +0900500tstrWILC_WFIDrv *gu8FlushedJoinReqDrvHandler;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900501#define REAL_JOIN_REQ 0
502#define FLUSHED_JOIN_REQ 1
503#define FLUSHED_BYTE_POS 79 /* Position the byte indicating flushing in the flushed request */
504
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900505static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900506
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900507extern void chip_sleep_manually(u32 u32SleepTime);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900508extern int linux_wlan_get_num_conn_ifcs(void);
509
Johnny Kimd42ab082015-08-20 16:32:52 +0900510static int add_handler_in_list(tstrWILC_WFIDrv *handler)
511{
512 int i;
513
514 for (i = 1; i < ARRAY_SIZE(wfidrv_list); i++) {
515 if (!wfidrv_list[i]) {
516 wfidrv_list[i] = handler;
517 return 0;
518 }
519 }
520
521 return -ENOBUFS;
522}
523
524static int remove_handler_in_list(tstrWILC_WFIDrv *handler)
525{
526 int i;
527
528 for (i = 1; i < ARRAY_SIZE(wfidrv_list); i++) {
529 if (wfidrv_list[i] == handler) {
530 wfidrv_list[i] = NULL;
531 return 0;
532 }
533 }
534
535 return -EINVAL;
536}
537
538static int get_id_from_handler(tstrWILC_WFIDrv *handler)
539{
540 int i;
541
542 if (!handler)
543 return 0;
544
545 for (i = 1; i < ARRAY_SIZE(wfidrv_list); i++) {
546 if (wfidrv_list[i] == handler)
547 return i;
548 }
549
550 return 0;
551}
552
553static tstrWILC_WFIDrv *get_handler_from_id(int id)
554{
Dan Carpenter6ae9ac02015-09-15 09:54:33 +0300555 if (id <= 0 || id >= ARRAY_SIZE(wfidrv_list))
Johnny Kimd42ab082015-08-20 16:32:52 +0900556 return NULL;
557 return wfidrv_list[id];
558}
559
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900560/**
561 * @brief Handle_SetChannel
562 * @details Sending config packet to firmware to set channel
Tony Cho94bdfe42015-09-30 18:44:27 +0900563 * @param[in] struct channel_attr *pstrHostIFSetChan
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900564 * @return Error code.
565 * @author
566 * @date
567 * @version 1.0
568 */
Tony Cho326b3232015-09-21 12:16:42 +0900569static s32 Handle_SetChannel(tstrWILC_WFIDrv *drvHandler,
Tony Cho94bdfe42015-09-30 18:44:27 +0900570 struct channel_attr *pstrHostIFSetChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900571{
572
Leo Kime6e12662015-09-16 18:36:03 +0900573 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900574 tstrWID strWID;
575 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
576
577 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900578 strWID.u16WIDid = (u16)WID_CURRENT_CHANNEL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900579 strWID.enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +0900580 strWID.ps8WidVal = (char *)&(pstrHostIFSetChan->u8SetChan);
581 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900582
583 PRINT_D(HOSTINF_DBG, "Setting channel\n");
584 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900585 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
586 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900587 if (s32Error) {
588 PRINT_ER("Failed to set channel\n");
Leo Kim24db7132015-09-16 18:36:01 +0900589 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900590 }
591
592 return s32Error;
593}
594/**
595 * @brief Handle_SetWfiDrvHandler
596 * @details Sending config packet to firmware to set driver handler
Tony Cho127f9d92015-09-21 12:16:51 +0900597 * @param[in] void * drvHandler,
598 * struct drv_handler *pstrHostIfSetDrvHandler
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900599 * @return Error code.
600 * @author
601 * @date
602 * @version 1.0
603 */
Johnny Kim53a84402015-08-20 16:32:51 +0900604static s32 Handle_SetWfiDrvHandler(tstrWILC_WFIDrv *drvHandler,
Tony Cho127f9d92015-09-21 12:16:51 +0900605 struct drv_handler *pstrHostIfSetDrvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900606{
607
Leo Kime6e12662015-09-16 18:36:03 +0900608 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900609 tstrWID strWID;
Johnny Kim53a84402015-08-20 16:32:51 +0900610 tstrWILC_WFIDrv *pstrWFIDrv = drvHandler;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900611
612
613 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900614 strWID.u16WIDid = (u16)WID_SET_DRV_HANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900615 strWID.enuWIDtype = WID_INT;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900616 strWID.ps8WidVal = (s8 *)&(pstrHostIfSetDrvHandler->u32Address);
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900617 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900618
619 /*Sending Cfg*/
620
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900621 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
622 pstrHostIfSetDrvHandler->u32Address);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900623
Johnny Kim53a84402015-08-20 16:32:51 +0900624 if (pstrWFIDrv == NULL)
Arnd Bergmann83383ea2015-06-01 21:06:43 +0200625 up(&hSemDeinitDrvHandle);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900626
627
628 if (s32Error) {
629 PRINT_ER("Failed to set driver handler\n");
Leo Kim24db7132015-09-16 18:36:01 +0900630 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900631 }
632
633 return s32Error;
634}
635
636/**
637 * @brief Handle_SetWfiAPDrvHandler
638 * @details Sending config packet to firmware to set driver handler
639 * @param[in] void * drvHandler,tstrHostIfSetDrvHandler* pstrHostIfSetDrvHandler
640 * @return Error code.
641 * @author
642 * @date
643 * @version 1.0
644 */
Tony Cho801bee52015-09-21 12:16:53 +0900645static s32 Handle_SetOperationMode(tstrWILC_WFIDrv *drvHandler,
646 struct op_mode *pstrHostIfSetOperationMode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900647{
648
Leo Kime6e12662015-09-16 18:36:03 +0900649 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900650 tstrWID strWID;
651 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
652
653
654 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900655 strWID.u16WIDid = (u16)WID_SET_OPERATION_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900656 strWID.enuWIDtype = WID_INT;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900657 strWID.ps8WidVal = (s8 *)&(pstrHostIfSetOperationMode->u32Mode);
Chaehyun Lim4e4467f2015-06-11 14:35:55 +0900658 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900659
660 /*Sending Cfg*/
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +0200661 PRINT_INFO(HOSTINF_DBG, "pstrWFIDrv= %p\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900662
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900663 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
664 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900665
666
Johnny Kimc590b9a2015-09-08 17:07:59 +0900667 if ((pstrHostIfSetOperationMode->u32Mode) == IDLE_MODE)
Arnd Bergmann83383ea2015-06-01 21:06:43 +0200668 up(&hSemDeinitDrvHandle);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900669
670
671 if (s32Error) {
672 PRINT_ER("Failed to set driver handler\n");
Leo Kim24db7132015-09-16 18:36:01 +0900673 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900674 }
675
676 return s32Error;
677}
678
679/**
680 * @brief host_int_set_IPAddress
681 * @details Setting IP address params in message queue
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900682 * @param[in] WILC_WFIDrvHandle hWFIDrv, u8* pu8IPAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900683 * @return Error code.
684 * @author
685 * @date
686 * @version 1.0
687 */
Johnny Kim2b05df52015-08-13 13:41:21 +0900688s32 Handle_set_IPAddress(tstrWILC_WFIDrv *drvHandler, u8 *pu8IPAddr, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900689{
690
Leo Kime6e12662015-09-16 18:36:03 +0900691 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900692 tstrWID strWID;
693 char firmwareIPAddress[4] = {0};
694 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
695
696 if (pu8IPAddr[0] < 192)
697 pu8IPAddr[0] = 0;
698
Luis de Bethencourtb3a02832015-06-26 17:40:25 +0200699 PRINT_INFO(HOSTINF_DBG, "Indx = %d, Handling set IP = %pI4\n", idx, pu8IPAddr);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900700
Chaehyun Limd00d2ba2015-08-10 11:33:19 +0900701 memcpy(gs8SetIP[idx], pu8IPAddr, IP_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900702
703 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900704 strWID.u16WIDid = (u16)WID_IP_ADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900705 strWID.enuWIDtype = WID_STR;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900706 strWID.ps8WidVal = (u8 *)pu8IPAddr;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900707 strWID.s32ValueSize = IP_ALEN;
708
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900709 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
710 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900711
712
Johnny Kim218dc402015-08-13 13:41:19 +0900713 host_int_get_ipaddress(drvHandler, firmwareIPAddress, idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900714
715 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +0900716 PRINT_ER("Failed to set IP address\n");
717 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900718 }
719
Leo Kim24db7132015-09-16 18:36:01 +0900720 PRINT_INFO(HOSTINF_DBG, "IP address set\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900721
722 return s32Error;
723}
724
725
726/**
727 * @brief Handle_get_IPAddress
728 * @details Setting IP address params in message queue
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900729 * @param[in] WILC_WFIDrvHandle hWFIDrv, u8* pu8IPAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900730 * @return Error code.
731 * @author
732 * @date
733 * @version 1.0
734 */
Johnny Kim2b05df52015-08-13 13:41:21 +0900735s32 Handle_get_IPAddress(tstrWILC_WFIDrv *drvHandler, u8 *pu8IPAddr, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900736{
737
Leo Kime6e12662015-09-16 18:36:03 +0900738 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900739 tstrWID strWID;
740 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
741
742 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900743 strWID.u16WIDid = (u16)WID_IP_ADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900744 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +0900745 strWID.ps8WidVal = kmalloc(IP_ALEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900746 strWID.s32ValueSize = IP_ALEN;
747
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900748 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
749 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900750
Luis de Bethencourtb3a02832015-06-26 17:40:25 +0200751 PRINT_INFO(HOSTINF_DBG, "%pI4\n", strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900752
Chaehyun Limd00d2ba2015-08-10 11:33:19 +0900753 memcpy(gs8GetIP[idx], strWID.ps8WidVal, IP_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900754
755 /*get the value by searching the local copy*/
Chaehyun Lim49188af2015-08-11 10:32:41 +0900756 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900757
Chaehyun Lim1a646e72015-08-07 09:02:03 +0900758 if (memcmp(gs8GetIP[idx], gs8SetIP[idx], IP_ALEN) != 0)
Johnny Kim218dc402015-08-13 13:41:19 +0900759 host_int_setup_ipaddress(pstrWFIDrv, gs8SetIP[idx], idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900760
Leo Kime6e12662015-09-16 18:36:03 +0900761 if (s32Error != 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900762 PRINT_ER("Failed to get IP address\n");
Leo Kim24db7132015-09-16 18:36:01 +0900763 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900764 }
765
Leo Kim24db7132015-09-16 18:36:01 +0900766 PRINT_INFO(HOSTINF_DBG, "IP address retrieved:: u8IfIdx = %d\n", idx);
767 PRINT_INFO(HOSTINF_DBG, "%pI4\n", gs8GetIP[idx]);
768 PRINT_INFO(HOSTINF_DBG, "\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900769
770 return s32Error;
771}
772
773
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900774/**
775 * @brief Handle_SetMacAddress
776 * @details Setting mac address
777 * @param[in] void * drvHandler,tstrHostIfSetDrvHandler* pstrHostIfSetDrvHandler
778 * @return Error code.
779 * @author Amr Abdel-Moghny
780 * @date November 2013
781 * @version 7.0
782 */
Tony Chob7611a82015-09-21 12:16:54 +0900783static s32 Handle_SetMacAddress(tstrWILC_WFIDrv *drvHandler,
784 struct set_mac_addr *pstrHostIfSetMacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900785{
786
Leo Kime6e12662015-09-16 18:36:03 +0900787 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900788 tstrWID strWID;
789 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Glen Leef3052582015-09-10 12:03:04 +0900790 u8 *mac_buf = kmalloc(ETH_ALEN, GFP_KERNEL);
Luis de Bethencourt78c87592015-06-26 16:45:14 +0200791
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900792 if (mac_buf == NULL) {
793 PRINT_ER("No buffer to send mac address\n");
Leo Kime6e12662015-09-16 18:36:03 +0900794 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900795 }
Chaehyun Limd00d2ba2015-08-10 11:33:19 +0900796 memcpy(mac_buf, pstrHostIfSetMacAddress->u8MacAddress, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900797
798 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900799 strWID.u16WIDid = (u16)WID_MAC_ADDR;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900800 strWID.enuWIDtype = WID_STR;
801 strWID.ps8WidVal = mac_buf;
802 strWID.s32ValueSize = ETH_ALEN;
Alexander Kuleshov310a28f2015-09-04 00:48:14 +0600803 PRINT_D(GENERIC_DBG, "mac addr = :%pM\n", strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900804 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900805 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
806 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900807 if (s32Error) {
808 PRINT_ER("Failed to set mac address\n");
Leo Kim24db7132015-09-16 18:36:01 +0900809 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900810 }
811
Chaehyun Lim49188af2015-08-11 10:32:41 +0900812 kfree(mac_buf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900813 return s32Error;
814}
815
816
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900817/**
818 * @brief Handle_GetMacAddress
819 * @details Getting mac address
820 * @param[in] void * drvHandler,tstrHostIfSetDrvHandler* pstrHostIfSetDrvHandler
821 * @return Error code.
822 * @author Amr Abdel-Moghny
823 * @date JAN 2013
824 * @version 8.0
825 */
Tony Chofcd27c52015-09-21 12:16:55 +0900826static s32 Handle_GetMacAddress(tstrWILC_WFIDrv *drvHandler,
827 struct get_mac_addr *pstrHostIfGetMacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900828{
829
Leo Kime6e12662015-09-16 18:36:03 +0900830 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900831 tstrWID strWID;
832
833 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +0900834 strWID.u16WIDid = (u16)WID_MAC_ADDR;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900835 strWID.enuWIDtype = WID_STR;
836 strWID.ps8WidVal = pstrHostIfGetMacAddress->u8MacAddress;
837 strWID.s32ValueSize = ETH_ALEN;
838
839 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +0900840 s32Error = send_config_pkt(GET_CFG, &strWID, 1, false,
841 get_id_from_handler(drvHandler));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900842 if (s32Error) {
843 PRINT_ER("Failed to get mac address\n");
Leo Kim24db7132015-09-16 18:36:01 +0900844 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900845 }
Arnd Bergmann83383ea2015-06-01 21:06:43 +0200846 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900847
848 return s32Error;
849}
850
851
852/**
853 * @brief Handle_CfgParam
854 * @details Sending config packet to firmware to set CFG params
Tony Cho361ff842015-09-21 12:16:41 +0900855 * @param[in] struct cfg_param_attr *strHostIFCfgParamAttr
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900856 * @return Error code.
857 * @author
858 * @date
859 * @version 1.0
860 */
Tony Cho361ff842015-09-21 12:16:41 +0900861static s32 Handle_CfgParam(tstrWILC_WFIDrv *drvHandler,
862 struct cfg_param_attr *strHostIFCfgParamAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900863{
Leo Kime6e12662015-09-16 18:36:03 +0900864 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900865 tstrWID strWIDList[32];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900866 u8 u8WidCnt = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900867 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
868
869
Arnd Bergmann83383ea2015-06-01 21:06:43 +0200870 down(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900871
872
873 PRINT_D(HOSTINF_DBG, "Setting CFG params\n");
874
875 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & BSS_TYPE) {
876 /*----------------------------------------------------------*/
877 /*Input Value: INFRASTRUCTURE = 1, */
878 /* INDEPENDENT= 2, */
879 /* ANY_BSS= 3 */
880 /*----------------------------------------------------------*/
881 /* validate input then copy>> need to check value 4 and 5 */
882 if (strHostIFCfgParamAttr->pstrCfgParamVal.bss_type < 6) {
883 strWIDList[u8WidCnt].u16WIDid = WID_BSS_TYPE;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900884 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.bss_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900885 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +0900886 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900887 pstrWFIDrv->strCfgValues.bss_type = (u8)strHostIFCfgParamAttr->pstrCfgParamVal.bss_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900888 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900889 PRINT_ER("check value 6 over\n");
890 s32Error = -EINVAL;
891 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900892 }
893 u8WidCnt++;
894 }
895 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & AUTH_TYPE) {
896 /*------------------------------------------------------*/
897 /*Input Values: OPEN_SYSTEM = 0, */
898 /* SHARED_KEY = 1, */
899 /* ANY = 2 */
900 /*------------------------------------------------------*/
901 /*validate Possible values*/
902 if ((strHostIFCfgParamAttr->pstrCfgParamVal.auth_type) == 1 || (strHostIFCfgParamAttr->pstrCfgParamVal.auth_type) == 2 || (strHostIFCfgParamAttr->pstrCfgParamVal.auth_type) == 5) {
903 strWIDList[u8WidCnt].u16WIDid = WID_AUTH_TYPE;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900904 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900905 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +0900906 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900907 pstrWFIDrv->strCfgValues.auth_type = (u8)strHostIFCfgParamAttr->pstrCfgParamVal.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900908 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900909 PRINT_ER("Impossible value \n");
910 s32Error = -EINVAL;
911 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900912 }
913 u8WidCnt++;
914 }
915 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & AUTHEN_TIMEOUT) {
916 /* range is 1 to 65535. */
917 if (strHostIFCfgParamAttr->pstrCfgParamVal.auth_timeout > 0 && strHostIFCfgParamAttr->pstrCfgParamVal.auth_timeout < 65536) {
918 strWIDList[u8WidCnt].u16WIDid = WID_AUTH_TIMEOUT;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900919 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.auth_timeout;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900920 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +0900921 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900922 pstrWFIDrv->strCfgValues.auth_timeout = strHostIFCfgParamAttr->pstrCfgParamVal.auth_timeout;
923 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900924 PRINT_ER("Range(1 ~ 65535) over\n");
925 s32Error = -EINVAL;
926 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900927 }
928 u8WidCnt++;
929 }
930 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & POWER_MANAGEMENT) {
931 /*-----------------------------------------------------------*/
932 /*Input Values: NO_POWERSAVE = 0, */
933 /* MIN_FAST_PS = 1, */
934 /* MAX_FAST_PS = 2, */
935 /* MIN_PSPOLL_PS = 3, */
936 /* MAX_PSPOLL_PS = 4 */
937 /*----------------------------------------------------------*/
938 if (strHostIFCfgParamAttr->pstrCfgParamVal.power_mgmt_mode < 5) {
939 strWIDList[u8WidCnt].u16WIDid = WID_POWER_MANAGEMENT;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900940 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.power_mgmt_mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900941 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +0900942 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +0900943 pstrWFIDrv->strCfgValues.power_mgmt_mode = (u8)strHostIFCfgParamAttr->pstrCfgParamVal.power_mgmt_mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900944 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900945 PRINT_ER("Invalide power mode\n");
946 s32Error = -EINVAL;
947 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900948 }
949 u8WidCnt++;
950 }
951 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & RETRY_SHORT) {
952 /* range from 1 to 256 */
953 if ((strHostIFCfgParamAttr->pstrCfgParamVal.short_retry_limit > 0) && (strHostIFCfgParamAttr->pstrCfgParamVal.short_retry_limit < 256)) {
954 strWIDList[u8WidCnt].u16WIDid = WID_SHORT_RETRY_LIMIT;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900955 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.short_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900956 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +0900957 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900958 pstrWFIDrv->strCfgValues.short_retry_limit = strHostIFCfgParamAttr->pstrCfgParamVal.short_retry_limit;
959 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900960 PRINT_ER("Range(1~256) over\n");
961 s32Error = -EINVAL;
962 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900963 }
964 u8WidCnt++;
965 }
966 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & RETRY_LONG) {
967 /* range from 1 to 256 */
968 if ((strHostIFCfgParamAttr->pstrCfgParamVal.long_retry_limit > 0) && (strHostIFCfgParamAttr->pstrCfgParamVal.long_retry_limit < 256)) {
969 strWIDList[u8WidCnt].u16WIDid = WID_LONG_RETRY_LIMIT;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900970 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.long_retry_limit;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900971
972 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +0900973 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900974 pstrWFIDrv->strCfgValues.long_retry_limit = strHostIFCfgParamAttr->pstrCfgParamVal.long_retry_limit;
975 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900976 PRINT_ER("Range(1~256) over\n");
977 s32Error = -EINVAL;
978 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900979 }
980 u8WidCnt++;
981 }
982 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & FRAG_THRESHOLD) {
983
984 if (strHostIFCfgParamAttr->pstrCfgParamVal.frag_threshold > 255 && strHostIFCfgParamAttr->pstrCfgParamVal.frag_threshold < 7937) {
985 strWIDList[u8WidCnt].u16WIDid = WID_FRAG_THRESHOLD;
Chaehyun Limca356ad2015-06-11 14:35:57 +0900986 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.frag_threshold;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900987 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +0900988 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900989 pstrWFIDrv->strCfgValues.frag_threshold = strHostIFCfgParamAttr->pstrCfgParamVal.frag_threshold;
990 } else {
Leo Kim24db7132015-09-16 18:36:01 +0900991 PRINT_ER("Threshold Range fail\n");
992 s32Error = -EINVAL;
993 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +0900994 }
995 u8WidCnt++;
996 }
997 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & RTS_THRESHOLD) {
998 /* range 256 to 65535 */
999 if (strHostIFCfgParamAttr->pstrCfgParamVal.rts_threshold > 255 && strHostIFCfgParamAttr->pstrCfgParamVal.rts_threshold < 65536) {
1000 strWIDList[u8WidCnt].u16WIDid = WID_RTS_THRESHOLD;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001001 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.rts_threshold;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001002 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001003 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001004 pstrWFIDrv->strCfgValues.rts_threshold = strHostIFCfgParamAttr->pstrCfgParamVal.rts_threshold;
1005 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001006 PRINT_ER("Threshold Range fail\n");
1007 s32Error = -EINVAL;
1008 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001009 }
1010 u8WidCnt++;
1011 }
1012 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & PREAMBLE) {
1013 /*-----------------------------------------------------*/
1014 /*Input Values: Short= 0, */
1015 /* Long= 1, */
1016 /* Auto= 2 */
1017 /*------------------------------------------------------*/
1018 if (strHostIFCfgParamAttr->pstrCfgParamVal.preamble_type < 3) {
1019 strWIDList[u8WidCnt].u16WIDid = WID_PREAMBLE;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001020 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.preamble_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001021 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001022 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001023 pstrWFIDrv->strCfgValues.preamble_type = strHostIFCfgParamAttr->pstrCfgParamVal.preamble_type;
1024 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001025 PRINT_ER("Preamle Range(0~2) over\n");
1026 s32Error = -EINVAL;
1027 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001028 }
1029 u8WidCnt++;
1030 }
1031 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & SHORT_SLOT_ALLOWED) {
1032 if (strHostIFCfgParamAttr->pstrCfgParamVal.short_slot_allowed < 2) {
1033 strWIDList[u8WidCnt].u16WIDid = WID_SHORT_SLOT_ALLOWED;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001034 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.short_slot_allowed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001035 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001036 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001037 pstrWFIDrv->strCfgValues.short_slot_allowed = (u8)strHostIFCfgParamAttr->pstrCfgParamVal.short_slot_allowed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001038 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001039 PRINT_ER("Short slot(2) over\n");
1040 s32Error = -EINVAL;
1041 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001042 }
1043 u8WidCnt++;
1044 }
1045 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & TXOP_PROT_DISABLE) {
1046 /*Description: used to Disable RTS-CTS protection for TXOP burst*/
1047 /*transmission when the acknowledgement policy is No-Ack or Block-Ack */
1048 /* this information is useful for external supplicant */
1049 /*Input Values: 1 for enable and 0 for disable. */
1050 if (strHostIFCfgParamAttr->pstrCfgParamVal.txop_prot_disabled < 2) {
1051 strWIDList[u8WidCnt].u16WIDid = WID_11N_TXOP_PROT_DISABLE;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001052 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.txop_prot_disabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001053 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001054 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001055 pstrWFIDrv->strCfgValues.txop_prot_disabled = (u8)strHostIFCfgParamAttr->pstrCfgParamVal.txop_prot_disabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001056 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001057 PRINT_ER("TXOP prot disable\n");
1058 s32Error = -EINVAL;
1059 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001060 }
1061 u8WidCnt++;
1062 }
1063 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & BEACON_INTERVAL) {
1064 /* range is 1 to 65535. */
1065 if (strHostIFCfgParamAttr->pstrCfgParamVal.beacon_interval > 0 && strHostIFCfgParamAttr->pstrCfgParamVal.beacon_interval < 65536) {
1066 strWIDList[u8WidCnt].u16WIDid = WID_BEACON_INTERVAL;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001067 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.beacon_interval;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001068 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001069 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001070 pstrWFIDrv->strCfgValues.beacon_interval = strHostIFCfgParamAttr->pstrCfgParamVal.beacon_interval;
1071 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001072 PRINT_ER("Beacon interval(1~65535) fail\n");
1073 s32Error = -EINVAL;
1074 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001075 }
1076 u8WidCnt++;
1077 }
1078 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & DTIM_PERIOD) {
1079 /* range is 1 to 255. */
1080 if (strHostIFCfgParamAttr->pstrCfgParamVal.dtim_period > 0 && strHostIFCfgParamAttr->pstrCfgParamVal.dtim_period < 256) {
1081 strWIDList[u8WidCnt].u16WIDid = WID_DTIM_PERIOD;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001082 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.dtim_period;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001083 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001084 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001085 pstrWFIDrv->strCfgValues.dtim_period = strHostIFCfgParamAttr->pstrCfgParamVal.dtim_period;
1086 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001087 PRINT_ER("DTIM range(1~255) fail\n");
1088 s32Error = -EINVAL;
1089 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001090 }
1091 u8WidCnt++;
1092 }
1093 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & SITE_SURVEY) {
1094 /*----------------------------------------------------------------------*/
1095 /*Input Values: SITE_SURVEY_1CH = 0, i.e.: currently set channel */
1096 /* SITE_SURVEY_ALL_CH = 1, */
1097 /* SITE_SURVEY_OFF = 2 */
1098 /*----------------------------------------------------------------------*/
1099 if (strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_enabled < 3) {
1100 strWIDList[u8WidCnt].u16WIDid = WID_SITE_SURVEY;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001101 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001102 strWIDList[u8WidCnt].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001103 strWIDList[u8WidCnt].s32ValueSize = sizeof(char);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001104 pstrWFIDrv->strCfgValues.site_survey_enabled = (u8)strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001105 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001106 PRINT_ER("Site survey disable\n");
1107 s32Error = -EINVAL;
1108 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001109 }
1110 u8WidCnt++;
1111 }
1112 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & SITE_SURVEY_SCAN_TIME) {
1113 /* range is 1 to 65535. */
1114 if (strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_scan_time > 0 && strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_scan_time < 65536) {
1115 strWIDList[u8WidCnt].u16WIDid = WID_SITE_SURVEY_SCAN_TIME;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001116 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001117 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001118 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001119 pstrWFIDrv->strCfgValues.site_survey_scan_time = strHostIFCfgParamAttr->pstrCfgParamVal.site_survey_scan_time;
1120 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001121 PRINT_ER("Site survey scan time(1~65535) over\n");
1122 s32Error = -EINVAL;
1123 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001124 }
1125 u8WidCnt++;
1126 }
1127 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & ACTIVE_SCANTIME) {
1128 /* range is 1 to 65535. */
1129 if (strHostIFCfgParamAttr->pstrCfgParamVal.active_scan_time > 0 && strHostIFCfgParamAttr->pstrCfgParamVal.active_scan_time < 65536) {
1130 strWIDList[u8WidCnt].u16WIDid = WID_ACTIVE_SCAN_TIME;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001131 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.active_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001132 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001133 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001134 pstrWFIDrv->strCfgValues.active_scan_time = strHostIFCfgParamAttr->pstrCfgParamVal.active_scan_time;
1135 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001136 PRINT_ER("Active scan time(1~65535) over\n");
1137 s32Error = -EINVAL;
1138 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001139 }
1140 u8WidCnt++;
1141 }
1142 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & PASSIVE_SCANTIME) {
1143 /* range is 1 to 65535. */
1144 if (strHostIFCfgParamAttr->pstrCfgParamVal.passive_scan_time > 0 && strHostIFCfgParamAttr->pstrCfgParamVal.passive_scan_time < 65536) {
1145 strWIDList[u8WidCnt].u16WIDid = WID_PASSIVE_SCAN_TIME;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001146 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&strHostIFCfgParamAttr->pstrCfgParamVal.passive_scan_time;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001147 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001148 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001149 pstrWFIDrv->strCfgValues.passive_scan_time = strHostIFCfgParamAttr->pstrCfgParamVal.passive_scan_time;
1150 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001151 PRINT_ER("Passive scan time(1~65535) over\n");
1152 s32Error = -EINVAL;
1153 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001154 }
1155 u8WidCnt++;
1156 }
1157 if (strHostIFCfgParamAttr->pstrCfgParamVal.u32SetCfgFlag & CURRENT_TX_RATE) {
Leo Kim430a78c2015-10-05 15:25:48 +09001158 enum CURRENT_TXRATE curr_tx_rate = strHostIFCfgParamAttr->pstrCfgParamVal.curr_tx_rate;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001159 /*----------------------------------------------------------------------*/
1160 /*Rates: 1 2 5.5 11 6 9 12 18 24 36 48 54 Auto */
1161 /*InputValues: 1 2 3 4 5 6 7 8 9 10 11 12 0 */
1162 /*----------------------------------------------------------------------*/
1163 /* validate rate */
1164 if (curr_tx_rate == AUTORATE || curr_tx_rate == MBPS_1
1165 || curr_tx_rate == MBPS_2 || curr_tx_rate == MBPS_5_5
1166 || curr_tx_rate == MBPS_11 || curr_tx_rate == MBPS_6
1167 || curr_tx_rate == MBPS_9 || curr_tx_rate == MBPS_12
1168 || curr_tx_rate == MBPS_18 || curr_tx_rate == MBPS_24
1169 || curr_tx_rate == MBPS_36 || curr_tx_rate == MBPS_48 || curr_tx_rate == MBPS_54) {
1170 strWIDList[u8WidCnt].u16WIDid = WID_CURRENT_TX_RATE;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001171 strWIDList[u8WidCnt].ps8WidVal = (s8 *)&curr_tx_rate;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001172 strWIDList[u8WidCnt].enuWIDtype = WID_SHORT;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001173 strWIDList[u8WidCnt].s32ValueSize = sizeof(u16);
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001174 pstrWFIDrv->strCfgValues.curr_tx_rate = (u8)curr_tx_rate;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001175 } else {
Leo Kim24db7132015-09-16 18:36:01 +09001176 PRINT_ER("out of TX rate\n");
1177 s32Error = -EINVAL;
1178 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001179 }
1180 u8WidCnt++;
1181 }
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09001182 s32Error = send_config_pkt(SET_CFG, strWIDList, u8WidCnt, false,
1183 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001184
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001185 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001186 PRINT_ER("Error in setting CFG params\n");
1187
Leo Kim24db7132015-09-16 18:36:01 +09001188ERRORHANDLER:
Arnd Bergmann83383ea2015-06-01 21:06:43 +02001189 up(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001190 return s32Error;
1191}
1192
1193
1194/**
1195 * @brief Handle_wait_msg_q_empty
1196 * @details this should be the last msg and then the msg Q becomes idle
1197 * @param[in] tstrHostIFscanAttr* pstrHostIFscanAttr
1198 * @return Error code.
1199 * @author
1200 * @date
1201 * @version 1.0
1202 */
Chaehyun Limfb4ec9c2015-06-11 14:35:59 +09001203static s32 Handle_wait_msg_q_empty(void)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001204{
Leo Kime6e12662015-09-16 18:36:03 +09001205 s32 s32Error = 0;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02001206
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001207 g_wilc_initialized = 0;
Arnd Bergmann83383ea2015-06-01 21:06:43 +02001208 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001209 return s32Error;
1210}
1211
1212/**
1213 * @brief Handle_Scan
1214 * @details Sending config packet to firmware to set the scan params
Tony Choc476feb2015-09-21 12:16:36 +09001215 * @param[in] struct scan_attr *pstrHostIFscanAttr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001216 * @return Error code.
1217 * @author
1218 * @date
1219 * @version 1.0
1220 */
Tony Choc476feb2015-09-21 12:16:36 +09001221static s32 Handle_Scan(tstrWILC_WFIDrv *drvHandler,
1222 struct scan_attr *pstrHostIFscanAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001223{
Leo Kime6e12662015-09-16 18:36:03 +09001224 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001225 tstrWID strWIDList[5];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001226 u32 u32WidsCount = 0;
1227 u32 i;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001228 u8 *pu8Buffer;
1229 u8 valuesize = 0;
1230 u8 *pu8HdnNtwrksWidVal = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001231 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
1232
1233 PRINT_D(HOSTINF_DBG, "Setting SCAN params\n");
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001234 PRINT_D(HOSTINF_DBG, "Scanning: In [%d] state\n", pstrWFIDrv->enuHostIFstate);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001235
1236 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult = pstrHostIFscanAttr->pfScanResult;
1237 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid = pstrHostIFscanAttr->pvUserArg;
1238
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001239 if ((pstrWFIDrv->enuHostIFstate >= HOST_IF_SCANNING) && (pstrWFIDrv->enuHostIFstate < HOST_IF_CONNECTED)) {
1240 /* here we either in HOST_IF_SCANNING, HOST_IF_WAITING_CONN_REQ or HOST_IF_WAITING_CONN_RESP */
1241 PRINT_D(GENERIC_DBG, "Don't scan we are already in [%d] state\n", pstrWFIDrv->enuHostIFstate);
Leo Kim24db7132015-09-16 18:36:01 +09001242 PRINT_ER("Already scan\n");
1243 s32Error = -EBUSY;
1244 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001245 }
1246
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001247 if (g_obtainingIP || connecting) {
1248 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
Leo Kim24db7132015-09-16 18:36:01 +09001249 PRINT_ER("Don't do obss scan\n");
1250 s32Error = -EBUSY;
1251 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001252 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001253
1254 PRINT_D(HOSTINF_DBG, "Setting SCAN params\n");
1255
1256
1257 pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount = 0;
1258
Chaehyun Limd85f5322015-06-11 14:35:54 +09001259 strWIDList[u32WidsCount].u16WIDid = (u16)WID_SSID_PROBE_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001260 strWIDList[u32WidsCount].enuWIDtype = WID_STR;
1261
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001262 for (i = 0; i < pstrHostIFscanAttr->strHiddenNetwork.u8ssidnum; i++)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001263 valuesize += ((pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo[i].u8ssidlen) + 1);
Glen Leef3052582015-09-10 12:03:04 +09001264 pu8HdnNtwrksWidVal = kmalloc(valuesize + 1, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001265 strWIDList[u32WidsCount].ps8WidVal = pu8HdnNtwrksWidVal;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09001266 if (strWIDList[u32WidsCount].ps8WidVal != NULL) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001267 pu8Buffer = strWIDList[u32WidsCount].ps8WidVal;
1268
1269 *pu8Buffer++ = pstrHostIFscanAttr->strHiddenNetwork.u8ssidnum;
1270
1271 PRINT_D(HOSTINF_DBG, "In Handle_ProbeRequest number of ssid %d\n", pstrHostIFscanAttr->strHiddenNetwork.u8ssidnum);
1272
1273 for (i = 0; i < pstrHostIFscanAttr->strHiddenNetwork.u8ssidnum; i++) {
1274 *pu8Buffer++ = pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo[i].u8ssidlen;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001275 memcpy(pu8Buffer, pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo[i].pu8ssid, pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo[i].u8ssidlen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001276 pu8Buffer += pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo[i].u8ssidlen;
1277 }
1278
1279
1280
Chaehyun Limfb4ec9c2015-06-11 14:35:59 +09001281 strWIDList[u32WidsCount].s32ValueSize = (s32)(valuesize + 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001282 u32WidsCount++;
1283 }
1284
1285 /*filling cfg param array*/
1286
1287 /* if((pstrHostIFscanAttr->pu8IEs != NULL) && (pstrHostIFscanAttr->IEsLen != 0)) */
1288 {
1289 /* IEs to be inserted in Probe Request */
1290 strWIDList[u32WidsCount].u16WIDid = WID_INFO_ELEMENT_PROBE;
1291 strWIDList[u32WidsCount].enuWIDtype = WID_BIN_DATA;
1292 strWIDList[u32WidsCount].ps8WidVal = pstrHostIFscanAttr->pu8IEs;
1293 strWIDList[u32WidsCount].s32ValueSize = pstrHostIFscanAttr->IEsLen;
1294 u32WidsCount++;
1295 }
1296
1297 /*Scan Type*/
1298 strWIDList[u32WidsCount].u16WIDid = WID_SCAN_TYPE;
1299 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001300 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001301 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrHostIFscanAttr->u8ScanType));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001302 u32WidsCount++;
1303
1304 /*list of channels to be scanned*/
1305 strWIDList[u32WidsCount].u16WIDid = WID_SCAN_CHANNEL_LIST;
1306 strWIDList[u32WidsCount].enuWIDtype = WID_BIN_DATA;
1307
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001308 if (pstrHostIFscanAttr->pu8ChnlFreqList != NULL && pstrHostIFscanAttr->u8ChnlListLen > 0) {
1309 int i;
1310
1311 for (i = 0; i < pstrHostIFscanAttr->u8ChnlListLen; i++) {
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001312 if (pstrHostIFscanAttr->pu8ChnlFreqList[i] > 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001313 pstrHostIFscanAttr->pu8ChnlFreqList[i] = pstrHostIFscanAttr->pu8ChnlFreqList[i] - 1;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001314 }
1315 }
1316
1317 strWIDList[u32WidsCount].ps8WidVal = pstrHostIFscanAttr->pu8ChnlFreqList;
1318 strWIDList[u32WidsCount].s32ValueSize = pstrHostIFscanAttr->u8ChnlListLen;
1319 u32WidsCount++;
1320
1321 /*Scan Request*/
1322 strWIDList[u32WidsCount].u16WIDid = WID_START_SCAN_REQ;
1323 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001324 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001325 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrHostIFscanAttr->u8ScanSource));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001326 u32WidsCount++;
1327
1328 /*keep the state as is , no need to change it*/
1329 /* gWFiDrvHandle->enuHostIFstate = HOST_IF_SCANNING; */
1330
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05301331 if (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED)
Dean Lee72ed4dc2015-06-12 14:11:44 +09001332 gbScanWhileConnected = true;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05301333 else if (pstrWFIDrv->enuHostIFstate == HOST_IF_IDLE)
Dean Lee72ed4dc2015-06-12 14:11:44 +09001334 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001335
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09001336 s32Error = send_config_pkt(SET_CFG, strWIDList, u32WidsCount, false,
1337 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001338
Leo Kim24db7132015-09-16 18:36:01 +09001339 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001340 PRINT_ER("Failed to send scan paramters config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +09001341 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001342 PRINT_D(HOSTINF_DBG, "Successfully sent SCAN params config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001343
Leo Kim24db7132015-09-16 18:36:01 +09001344ERRORHANDLER:
1345 if (s32Error) {
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07001346 del_timer(&pstrWFIDrv->hScanTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001347 /*if there is an ongoing scan request*/
1348 Handle_ScanDone(drvHandler, SCAN_EVENT_ABORTED);
1349 }
1350
1351 /* Deallocate pstrHostIFscanAttr->u8ChnlListLen which was prevoisuly allocated by the sending thread */
1352 if (pstrHostIFscanAttr->pu8ChnlFreqList != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001353 kfree(pstrHostIFscanAttr->pu8ChnlFreqList);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001354 pstrHostIFscanAttr->pu8ChnlFreqList = NULL;
1355 }
1356
1357 /* Deallocate pstrHostIFscanAttr->pu8IEs which was previously allocated by the sending thread */
1358 if (pstrHostIFscanAttr->pu8IEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001359 kfree(pstrHostIFscanAttr->pu8IEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001360 pstrHostIFscanAttr->pu8IEs = NULL;
1361 }
1362 if (pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001363 kfree(pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001364 pstrHostIFscanAttr->strHiddenNetwork.pstrHiddenNetworkInfo = NULL;
1365 }
1366
1367 /* Deallocate pstrHostIFscanAttr->u8ChnlListLen which was prevoisuly allocated by the sending thread */
1368 if (pstrHostIFscanAttr->pu8ChnlFreqList != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001369 kfree(pstrHostIFscanAttr->pu8ChnlFreqList);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001370 pstrHostIFscanAttr->pu8ChnlFreqList = NULL;
1371 }
1372
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001373 if (pu8HdnNtwrksWidVal != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09001374 kfree(pu8HdnNtwrksWidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001375
1376 return s32Error;
1377}
1378
1379/**
1380 * @brief Handle_ScanDone
1381 * @details Call scan notification callback function
1382 * @param[in] NONE
1383 * @return Error code.
1384 * @author
1385 * @date
1386 * @version 1.0
1387 */
Johnny Kim2b05df52015-08-13 13:41:21 +09001388static s32 Handle_ScanDone(tstrWILC_WFIDrv *drvHandler, tenuScanEvent enuEvent)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001389{
Leo Kime6e12662015-09-16 18:36:03 +09001390 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001391
1392 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
1393
1394
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001395 u8 u8abort_running_scan;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001396 tstrWID strWID;
1397
1398
1399 PRINT_D(HOSTINF_DBG, "in Handle_ScanDone()\n");
1400
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001401 /*Ask FW to abort the running scan, if any*/
1402 if (enuEvent == SCAN_EVENT_ABORTED) {
1403 PRINT_D(GENERIC_DBG, "Abort running scan\n");
1404 u8abort_running_scan = 1;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001405 strWID.u16WIDid = (u16)WID_ABORT_RUNNING_SCAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001406 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001407 strWID.ps8WidVal = (s8 *)&u8abort_running_scan;
Dean Lee576917a2015-06-15 11:58:57 +09001408 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001409
1410 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09001411 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
1412 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09001413 if (s32Error) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001414 PRINT_ER("Failed to set abort running scan\n");
Leo Kim24db7132015-09-16 18:36:01 +09001415 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001416 }
1417 }
1418
1419 if (pstrWFIDrv == NULL) {
1420 PRINT_ER("Driver handler is NULL\n");
1421 return s32Error;
1422 }
1423
1424 /*if there is an ongoing scan request*/
1425 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09001426 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(enuEvent, NULL,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001427 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
1428 /*delete current scan request*/
1429 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult = NULL;
1430 }
1431
1432 return s32Error;
1433}
1434
1435/**
1436 * @brief Handle_Connect
1437 * @details Sending config packet to firmware to starting connection
Tony Cho120ae592015-09-21 12:16:37 +09001438 * @param[in] struct connect_attr *pstrHostIFconnectAttr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001439 * @return Error code.
1440 * @author
1441 * @date
1442 * @version 1.0
1443 */
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001444u8 u8ConnectedSSID[6] = {0};
Tony Cho120ae592015-09-21 12:16:37 +09001445static s32 Handle_Connect(tstrWILC_WFIDrv *drvHandler,
1446 struct connect_attr *pstrHostIFconnectAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001447{
1448 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
Leo Kime6e12662015-09-16 18:36:03 +09001449 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001450 tstrWID strWIDList[8];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001451 u32 u32WidsCount = 0, dummyval = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001452 /* char passphrase[] = "12345678"; */
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001453 u8 *pu8CurrByte = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001454 tstrJoinBssParam *ptstrJoinBssParam;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001455
1456 PRINT_D(GENERIC_DBG, "Handling connect request\n");
1457
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001458 /* if we try to connect to an already connected AP then discard the request */
1459
Chaehyun Lim1a646e72015-08-07 09:02:03 +09001460 if (memcmp(pstrHostIFconnectAttr->pu8bssid, u8ConnectedSSID, ETH_ALEN) == 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001461
Leo Kime6e12662015-09-16 18:36:03 +09001462 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001463 PRINT_ER("Trying to connect to an already connected AP, Discard connect request\n");
1464 return s32Error;
1465 }
1466
1467 PRINT_INFO(HOSTINF_DBG, "Saving connection parameters in global structure\n");
1468
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001469 ptstrJoinBssParam = (tstrJoinBssParam *)pstrHostIFconnectAttr->pJoinParams;
1470 if (ptstrJoinBssParam == NULL) {
1471 PRINT_ER("Required BSSID not found\n");
Leo Kim24db7132015-09-16 18:36:01 +09001472 s32Error = -ENOENT;
1473 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001474 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001475
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001476 if (pstrHostIFconnectAttr->pu8bssid != NULL) {
Glen Leef3052582015-09-10 12:03:04 +09001477 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = kmalloc(6, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001478 memcpy(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid, pstrHostIFconnectAttr->pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001479 }
1480
1481 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = pstrHostIFconnectAttr->ssidLen;
1482 if (pstrHostIFconnectAttr->pu8ssid != NULL) {
Glen Leef3052582015-09-10 12:03:04 +09001483 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = kmalloc(pstrHostIFconnectAttr->ssidLen + 1, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001484 memcpy(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid, pstrHostIFconnectAttr->pu8ssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001485 pstrHostIFconnectAttr->ssidLen);
1486 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid[pstrHostIFconnectAttr->ssidLen] = '\0';
1487 }
1488
1489 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = pstrHostIFconnectAttr->IEsLen;
1490 if (pstrHostIFconnectAttr->pu8IEs != NULL) {
Glen Leef3052582015-09-10 12:03:04 +09001491 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = kmalloc(pstrHostIFconnectAttr->IEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001492 memcpy(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs, pstrHostIFconnectAttr->pu8IEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001493 pstrHostIFconnectAttr->IEsLen);
1494 }
1495
1496 pstrWFIDrv->strWILC_UsrConnReq.u8security = pstrHostIFconnectAttr->u8security;
1497 pstrWFIDrv->strWILC_UsrConnReq.tenuAuth_type = pstrHostIFconnectAttr->tenuAuth_type;
1498 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult = pstrHostIFconnectAttr->pfConnectResult;
1499 pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid = pstrHostIFconnectAttr->pvUserArg;
1500
1501 strWIDList[u32WidsCount].u16WIDid = WID_SUCCESS_FRAME_COUNT;
1502 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001503 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001504 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(dummyval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001505 u32WidsCount++;
1506
1507 strWIDList[u32WidsCount].u16WIDid = WID_RECEIVED_FRAGMENT_COUNT;
1508 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001509 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001510 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(dummyval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001511 u32WidsCount++;
1512
1513 strWIDList[u32WidsCount].u16WIDid = WID_FAILED_COUNT;
1514 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001515 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001516 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(dummyval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001517 u32WidsCount++;
1518
1519 /* if((gWFiDrvHandle->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) && */
1520 /* (gWFiDrvHandle->strWILC_UsrConnReq.ConnReqIEsLen != 0)) */
1521 {
1522 /* IEs to be inserted in Association Request */
1523 strWIDList[u32WidsCount].u16WIDid = WID_INFO_ELEMENT_ASSOCIATE;
1524 strWIDList[u32WidsCount].enuWIDtype = WID_BIN_DATA;
1525 strWIDList[u32WidsCount].ps8WidVal = pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs;
1526 strWIDList[u32WidsCount].s32ValueSize = pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen;
1527 u32WidsCount++;
1528
Chaehyun Lim1a646e72015-08-07 09:02:03 +09001529 if (memcmp("DIRECT-", pstrHostIFconnectAttr->pu8ssid, 7)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001530
1531 gu32FlushedInfoElemAsocSize = pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen;
Glen Leef3052582015-09-10 12:03:04 +09001532 gu8FlushedInfoElemAsoc = kmalloc(gu32FlushedInfoElemAsocSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001533 memcpy(gu8FlushedInfoElemAsoc, pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs,
1534 gu32FlushedInfoElemAsocSize);
1535 }
1536 }
Chaehyun Limd85f5322015-06-11 14:35:54 +09001537 strWIDList[u32WidsCount].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001538 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001539 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001540 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrWFIDrv->strWILC_UsrConnReq.u8security));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001541 u32WidsCount++;
1542
Chaehyun Lim1a646e72015-08-07 09:02:03 +09001543 if (memcmp("DIRECT-", pstrHostIFconnectAttr->pu8ssid, 7))
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001544 gu8Flushed11iMode = pstrWFIDrv->strWILC_UsrConnReq.u8security;
1545
1546 PRINT_INFO(HOSTINF_DBG, "Encrypt Mode = %x\n", pstrWFIDrv->strWILC_UsrConnReq.u8security);
1547
1548
Chaehyun Limd85f5322015-06-11 14:35:54 +09001549 strWIDList[u32WidsCount].u16WIDid = (u16)WID_AUTH_TYPE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001550 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001551 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001552 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&pstrWFIDrv->strWILC_UsrConnReq.tenuAuth_type);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001553 u32WidsCount++;
1554
Chaehyun Lim1a646e72015-08-07 09:02:03 +09001555 if (memcmp("DIRECT-", pstrHostIFconnectAttr->pu8ssid, 7))
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001556 gu8FlushedAuthType = (u8)pstrWFIDrv->strWILC_UsrConnReq.tenuAuth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001557
1558 PRINT_INFO(HOSTINF_DBG, "Authentication Type = %x\n", pstrWFIDrv->strWILC_UsrConnReq.tenuAuth_type);
1559 /*
Chaehyun Limd85f5322015-06-11 14:35:54 +09001560 * strWIDList[u32WidsCount].u16WIDid = (u16)WID_11I_PSK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001561 * strWIDList[u32WidsCount].enuWIDtype = WID_STR;
1562 * strWIDList[u32WidsCount].s32ValueSize = sizeof(passphrase);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001563 * strWIDList[u32WidsCount].ps8WidVal = (s8*)(passphrase);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001564 * u32WidsCount++;
1565 */
1566
1567 PRINT_D(HOSTINF_DBG, "Connecting to network of SSID %s on channel %d\n",
1568 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid, pstrHostIFconnectAttr->u8channel);
1569
Chaehyun Limd85f5322015-06-11 14:35:54 +09001570 strWIDList[u32WidsCount].u16WIDid = (u16)WID_JOIN_REQ_EXTENDED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001571 strWIDList[u32WidsCount].enuWIDtype = WID_STR;
1572
1573 /*Sending NoA attributes during connection*/
1574 strWIDList[u32WidsCount].s32ValueSize = 112; /* 79; */
Glen Leef3052582015-09-10 12:03:04 +09001575 strWIDList[u32WidsCount].ps8WidVal = kmalloc(strWIDList[u32WidsCount].s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001576
Chaehyun Lim1a646e72015-08-07 09:02:03 +09001577 if (memcmp("DIRECT-", pstrHostIFconnectAttr->pu8ssid, 7)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001578 gu32FlushedJoinReqSize = strWIDList[u32WidsCount].s32ValueSize;
Glen Leef3052582015-09-10 12:03:04 +09001579 gu8FlushedJoinReq = kmalloc(gu32FlushedJoinReqSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001580 }
Leo Kim24db7132015-09-16 18:36:01 +09001581 if (strWIDList[u32WidsCount].ps8WidVal == NULL) {
1582 s32Error = -EFAULT;
1583 goto ERRORHANDLER;
1584 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001585
1586 pu8CurrByte = strWIDList[u32WidsCount].ps8WidVal;
1587
1588
1589 if (pstrHostIFconnectAttr->pu8ssid != NULL) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001590 memcpy(pu8CurrByte, pstrHostIFconnectAttr->pu8ssid, pstrHostIFconnectAttr->ssidLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001591 pu8CurrByte[pstrHostIFconnectAttr->ssidLen] = '\0';
1592 }
1593 pu8CurrByte += MAX_SSID_LEN;
1594
1595 /* BSS type*/
1596 *(pu8CurrByte++) = INFRASTRUCTURE;
1597 /* Channel*/
1598 if ((pstrHostIFconnectAttr->u8channel >= 1) && (pstrHostIFconnectAttr->u8channel <= 14)) {
1599 *(pu8CurrByte++) = pstrHostIFconnectAttr->u8channel;
1600 } else {
1601 PRINT_ER("Channel out of range\n");
1602 *(pu8CurrByte++) = 0xFF;
1603 }
1604 /* Cap Info*/
1605 *(pu8CurrByte++) = (ptstrJoinBssParam->cap_info) & 0xFF;
1606 *(pu8CurrByte++) = ((ptstrJoinBssParam->cap_info) >> 8) & 0xFF;
1607 PRINT_D(HOSTINF_DBG, "* Cap Info %0x*\n", (*(pu8CurrByte - 2) | ((*(pu8CurrByte - 1)) << 8)));
1608
1609 /* sa*/
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001610 if (pstrHostIFconnectAttr->pu8bssid != NULL)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001611 memcpy(pu8CurrByte, pstrHostIFconnectAttr->pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001612 pu8CurrByte += 6;
1613
1614 /* bssid*/
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001615 if (pstrHostIFconnectAttr->pu8bssid != NULL)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001616 memcpy(pu8CurrByte, pstrHostIFconnectAttr->pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001617 pu8CurrByte += 6;
1618
1619 /* Beacon Period*/
1620 *(pu8CurrByte++) = (ptstrJoinBssParam->beacon_period) & 0xFF;
1621 *(pu8CurrByte++) = ((ptstrJoinBssParam->beacon_period) >> 8) & 0xFF;
1622 PRINT_D(HOSTINF_DBG, "* Beacon Period %d*\n", (*(pu8CurrByte - 2) | ((*(pu8CurrByte - 1)) << 8)));
1623 /* DTIM Period*/
1624 *(pu8CurrByte++) = ptstrJoinBssParam->dtim_period;
1625 PRINT_D(HOSTINF_DBG, "* DTIM Period %d*\n", (*(pu8CurrByte - 1)));
1626 /* Supported rates*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001627 memcpy(pu8CurrByte, ptstrJoinBssParam->supp_rates, MAX_RATES_SUPPORTED + 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001628 pu8CurrByte += (MAX_RATES_SUPPORTED + 1);
1629
1630 /* wmm cap*/
1631 *(pu8CurrByte++) = ptstrJoinBssParam->wmm_cap;
1632 PRINT_D(HOSTINF_DBG, "* wmm cap%d*\n", (*(pu8CurrByte - 1)));
1633 /* uapsd cap*/
1634 *(pu8CurrByte++) = ptstrJoinBssParam->uapsd_cap;
1635
1636 /* ht cap*/
1637 *(pu8CurrByte++) = ptstrJoinBssParam->ht_capable;
1638 /* copy this information to the user request */
1639 pstrWFIDrv->strWILC_UsrConnReq.IsHTCapable = ptstrJoinBssParam->ht_capable;
1640
1641 /* rsn found*/
1642 *(pu8CurrByte++) = ptstrJoinBssParam->rsn_found;
1643 PRINT_D(HOSTINF_DBG, "* rsn found %d*\n", *(pu8CurrByte - 1));
1644 /* rsn group policy*/
1645 *(pu8CurrByte++) = ptstrJoinBssParam->rsn_grp_policy;
1646 PRINT_D(HOSTINF_DBG, "* rsn group policy %0x*\n", (*(pu8CurrByte - 1)));
1647 /* mode_802_11i*/
1648 *(pu8CurrByte++) = ptstrJoinBssParam->mode_802_11i;
1649 PRINT_D(HOSTINF_DBG, "* mode_802_11i %d*\n", (*(pu8CurrByte - 1)));
1650 /* rsn pcip policy*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001651 memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_pcip_policy, sizeof(ptstrJoinBssParam->rsn_pcip_policy));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001652 pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_pcip_policy);
1653
1654 /* rsn auth policy*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001655 memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_auth_policy, sizeof(ptstrJoinBssParam->rsn_auth_policy));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001656 pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_auth_policy);
1657
1658 /* rsn auth policy*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001659 memcpy(pu8CurrByte, ptstrJoinBssParam->rsn_cap, sizeof(ptstrJoinBssParam->rsn_cap));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001660 pu8CurrByte += sizeof(ptstrJoinBssParam->rsn_cap);
1661
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001662 *(pu8CurrByte++) = REAL_JOIN_REQ;
1663
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001664 *(pu8CurrByte++) = ptstrJoinBssParam->u8NoaEnbaled;
1665 if (ptstrJoinBssParam->u8NoaEnbaled) {
1666 PRINT_D(HOSTINF_DBG, "NOA present\n");
1667
1668 *(pu8CurrByte++) = (ptstrJoinBssParam->tsf) & 0xFF;
1669 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 8) & 0xFF;
1670 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 16) & 0xFF;
1671 *(pu8CurrByte++) = ((ptstrJoinBssParam->tsf) >> 24) & 0xFF;
1672
1673 *(pu8CurrByte++) = ptstrJoinBssParam->u8Index;
1674
1675 *(pu8CurrByte++) = ptstrJoinBssParam->u8OppEnable;
1676
1677 if (ptstrJoinBssParam->u8OppEnable)
1678 *(pu8CurrByte++) = ptstrJoinBssParam->u8CtWindow;
1679
1680 *(pu8CurrByte++) = ptstrJoinBssParam->u8Count;
1681
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001682 memcpy(pu8CurrByte, ptstrJoinBssParam->au8Duration, sizeof(ptstrJoinBssParam->au8Duration));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001683
1684 pu8CurrByte += sizeof(ptstrJoinBssParam->au8Duration);
1685
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001686 memcpy(pu8CurrByte, ptstrJoinBssParam->au8Interval, sizeof(ptstrJoinBssParam->au8Interval));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001687
1688 pu8CurrByte += sizeof(ptstrJoinBssParam->au8Interval);
1689
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001690 memcpy(pu8CurrByte, ptstrJoinBssParam->au8StartTime, sizeof(ptstrJoinBssParam->au8StartTime));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001691
1692 pu8CurrByte += sizeof(ptstrJoinBssParam->au8StartTime);
1693
1694 } else
1695 PRINT_D(HOSTINF_DBG, "NOA not present\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001696
1697 /* keep the buffer at the start of the allocated pointer to use it with the free*/
1698 pu8CurrByte = strWIDList[u32WidsCount].ps8WidVal;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001699 u32WidsCount++;
1700
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001701 /* A temporary workaround to avoid handling the misleading MAC_DISCONNECTED raised from the
1702 * firmware at chip reset when processing the WIDs of the Connect Request.
1703 * (This workaround should be removed in the future when the Chip reset of the Connect WIDs is disabled) */
1704 /* ////////////////////// */
1705 gu32WidConnRstHack = 0;
1706 /* ////////////////////// */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001707
Chaehyun Lim1a646e72015-08-07 09:02:03 +09001708 if (memcmp("DIRECT-", pstrHostIFconnectAttr->pu8ssid, 7)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001709 memcpy(gu8FlushedJoinReq, pu8CurrByte, gu32FlushedJoinReqSize);
Johnny Kim8a625ca2015-08-20 16:32:50 +09001710 gu8FlushedJoinReqDrvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001711 }
1712
1713 PRINT_D(GENERIC_DBG, "send HOST_IF_WAITING_CONN_RESP\n");
1714
1715 if (pstrHostIFconnectAttr->pu8bssid != NULL) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001716 memcpy(u8ConnectedSSID, pstrHostIFconnectAttr->pu8bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001717
Alexander Kuleshov310a28f2015-09-04 00:48:14 +06001718 PRINT_D(GENERIC_DBG, "save Bssid = %pM\n", pstrHostIFconnectAttr->pu8bssid);
1719 PRINT_D(GENERIC_DBG, "save bssid = %pM\n", u8ConnectedSSID);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001720 }
1721
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09001722 s32Error = send_config_pkt(SET_CFG, strWIDList, u32WidsCount, false,
1723 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001724 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09001725 PRINT_ER("failed to send config packet\n");
1726 s32Error = -EFAULT;
1727 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001728 } else {
1729 PRINT_D(GENERIC_DBG, "set HOST_IF_WAITING_CONN_RESP\n");
1730 pstrWFIDrv->enuHostIFstate = HOST_IF_WAITING_CONN_RESP;
1731 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001732
Leo Kim24db7132015-09-16 18:36:01 +09001733ERRORHANDLER:
1734 if (s32Error) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001735 tstrConnectInfo strConnectInfo;
1736
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07001737 del_timer(&pstrWFIDrv->hConnectTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001738
1739 PRINT_D(HOSTINF_DBG, "could not start connecting to the required network\n");
1740
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001741 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001742
1743 if (pstrHostIFconnectAttr->pfConnectResult != NULL) {
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001744 if (pstrHostIFconnectAttr->pu8bssid != NULL)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001745 memcpy(strConnectInfo.au8bssid, pstrHostIFconnectAttr->pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001746
1747 if (pstrHostIFconnectAttr->pu8IEs != NULL) {
1748 strConnectInfo.ReqIEsLen = pstrHostIFconnectAttr->IEsLen;
Glen Leef3052582015-09-10 12:03:04 +09001749 strConnectInfo.pu8ReqIEs = kmalloc(pstrHostIFconnectAttr->IEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001750 memcpy(strConnectInfo.pu8ReqIEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001751 pstrHostIFconnectAttr->pu8IEs,
1752 pstrHostIFconnectAttr->IEsLen);
1753 }
1754
1755 pstrHostIFconnectAttr->pfConnectResult(CONN_DISCONN_EVENT_CONN_RESP,
1756 &strConnectInfo,
1757 MAC_DISCONNECTED,
1758 NULL,
1759 pstrHostIFconnectAttr->pvUserArg);
1760 /*Change state to idle*/
1761 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
1762 /* Deallocation */
1763 if (strConnectInfo.pu8ReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001764 kfree(strConnectInfo.pu8ReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001765 strConnectInfo.pu8ReqIEs = NULL;
1766 }
1767
1768 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001769 PRINT_ER("Connect callback function pointer is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001770 }
1771 }
1772
1773 PRINT_D(HOSTINF_DBG, "Deallocating connection parameters\n");
1774 /* Deallocate pstrHostIFconnectAttr->pu8bssid which was prevoisuly allocated by the sending thread */
1775 if (pstrHostIFconnectAttr->pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001776 kfree(pstrHostIFconnectAttr->pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001777 pstrHostIFconnectAttr->pu8bssid = NULL;
1778 }
1779
1780 /* Deallocate pstrHostIFconnectAttr->pu8ssid which was prevoisuly allocated by the sending thread */
1781 if (pstrHostIFconnectAttr->pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001782 kfree(pstrHostIFconnectAttr->pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001783 pstrHostIFconnectAttr->pu8ssid = NULL;
1784 }
1785
1786 /* Deallocate pstrHostIFconnectAttr->pu8IEs which was prevoisuly allocated by the sending thread */
1787 if (pstrHostIFconnectAttr->pu8IEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001788 kfree(pstrHostIFconnectAttr->pu8IEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001789 pstrHostIFconnectAttr->pu8IEs = NULL;
1790 }
1791
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001792 if (pu8CurrByte != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09001793 kfree(pu8CurrByte);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001794 return s32Error;
1795}
1796
1797/**
1798 * @brief Handle_FlushConnect
1799 * @details Sending config packet to firmware to flush an old connection
1800 * after switching FW from station one to hybrid one
1801 * @param[in] void * drvHandler
1802 * @return Error code.
1803 * @author Amr Abdel-Moghny
1804 * @date 19 DEC 2013
1805 * @version 8.0
1806 */
1807
Johnny Kim2b05df52015-08-13 13:41:21 +09001808static s32 Handle_FlushConnect(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001809{
Leo Kime6e12662015-09-16 18:36:03 +09001810 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001811 tstrWID strWIDList[5];
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001812 u32 u32WidsCount = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09001813 u8 *pu8CurrByte = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001814
1815
1816 /* IEs to be inserted in Association Request */
1817 strWIDList[u32WidsCount].u16WIDid = WID_INFO_ELEMENT_ASSOCIATE;
1818 strWIDList[u32WidsCount].enuWIDtype = WID_BIN_DATA;
1819 strWIDList[u32WidsCount].ps8WidVal = gu8FlushedInfoElemAsoc;
1820 strWIDList[u32WidsCount].s32ValueSize = gu32FlushedInfoElemAsocSize;
1821 u32WidsCount++;
1822
Chaehyun Limd85f5322015-06-11 14:35:54 +09001823 strWIDList[u32WidsCount].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001824 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001825 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001826 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(gu8Flushed11iMode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001827 u32WidsCount++;
1828
1829
1830
Chaehyun Limd85f5322015-06-11 14:35:54 +09001831 strWIDList[u32WidsCount].u16WIDid = (u16)WID_AUTH_TYPE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001832 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09001833 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09001834 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&gu8FlushedAuthType);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001835 u32WidsCount++;
1836
Chaehyun Limd85f5322015-06-11 14:35:54 +09001837 strWIDList[u32WidsCount].u16WIDid = (u16)WID_JOIN_REQ_EXTENDED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001838 strWIDList[u32WidsCount].enuWIDtype = WID_STR;
1839 strWIDList[u32WidsCount].s32ValueSize = gu32FlushedJoinReqSize;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001840 strWIDList[u32WidsCount].ps8WidVal = (s8 *)gu8FlushedJoinReq;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001841 pu8CurrByte = strWIDList[u32WidsCount].ps8WidVal;
1842
1843 pu8CurrByte += FLUSHED_BYTE_POS;
1844 *(pu8CurrByte) = FLUSHED_JOIN_REQ;
1845
1846 u32WidsCount++;
1847
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09001848 s32Error = send_config_pkt(SET_CFG, strWIDList, u32WidsCount, false,
1849 get_id_from_handler(gu8FlushedJoinReqDrvHandler));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001850 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09001851 PRINT_ER("failed to send config packet\n");
1852 s32Error = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001853 }
1854
1855 return s32Error;
1856}
1857
1858/**
1859 * @brief Handle_ConnectTimeout
1860 * @details Call connect notification callback function indicating connection failure
1861 * @param[in] NONE
1862 * @return Error code.
1863 * @author
1864 * @date
1865 * @version 1.0
1866 */
Johnny Kim2b05df52015-08-13 13:41:21 +09001867static s32 Handle_ConnectTimeout(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001868{
Leo Kime6e12662015-09-16 18:36:03 +09001869 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001870 tstrConnectInfo strConnectInfo;
1871 tstrWID strWID;
Chaehyun Limd85f5322015-06-11 14:35:54 +09001872 u16 u16DummyReasonCode = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001873 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
1874
1875 if (pstrWFIDrv == NULL) {
1876 PRINT_ER("Driver handler is NULL\n");
1877 return s32Error;
1878 }
1879
1880 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
1881
Dean Lee72ed4dc2015-06-12 14:11:44 +09001882 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001883
1884
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001885 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001886
1887
1888 /* First, we will notify the upper layer with the Connection failure {through the Connect Callback function},
1889 * then we will notify our firmware also with the Connection failure {through sending to it Cfg packet carrying
1890 * WID_DISCONNECT} */
1891 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult != NULL) {
1892 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001893 memcpy(strConnectInfo.au8bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001894 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid, 6);
1895 }
1896
1897 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
1898 strConnectInfo.ReqIEsLen = pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen;
Glen Leef3052582015-09-10 12:03:04 +09001899 strConnectInfo.pu8ReqIEs = kmalloc(pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09001900 memcpy(strConnectInfo.pu8ReqIEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001901 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs,
1902 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen);
1903 }
1904
1905 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_CONN_RESP,
1906 &strConnectInfo,
1907 MAC_DISCONNECTED,
1908 NULL,
1909 pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid);
1910
1911 /* Deallocation of strConnectInfo.pu8ReqIEs */
1912 if (strConnectInfo.pu8ReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001913 kfree(strConnectInfo.pu8ReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001914 strConnectInfo.pu8ReqIEs = NULL;
1915 }
1916 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02001917 PRINT_ER("Connect callback function pointer is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001918 }
1919
1920 /* Here we will notify our firmware also with the Connection failure {through sending to it Cfg packet carrying
1921 * WID_DISCONNECT} */
Chaehyun Limd85f5322015-06-11 14:35:54 +09001922 strWID.u16WIDid = (u16)WID_DISCONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001923 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09001924 strWID.ps8WidVal = (s8 *)&u16DummyReasonCode;
Dean Lee576917a2015-06-15 11:58:57 +09001925 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001926
1927 PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
1928
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09001929 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
1930 get_id_from_handler(pstrWFIDrv));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02001931 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001932 PRINT_ER("Failed to send dissconect config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001933
1934 /* Deallocation of the Saved Connect Request in the global Handle */
1935 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
1936 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001937 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001938 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
1939 }
1940
1941 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001942 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001943 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
1944 }
1945
1946 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
1947 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001948 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001949 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
1950 }
1951
Chaehyun Lim2cc46832015-08-07 09:02:01 +09001952 memset(u8ConnectedSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001953 /*Freeing flushed join request params on connect timeout*/
Johnny Kim8a625ca2015-08-20 16:32:50 +09001954 if (gu8FlushedJoinReq != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001955 kfree(gu8FlushedJoinReq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001956 gu8FlushedJoinReq = NULL;
1957 }
Johnny Kim8a625ca2015-08-20 16:32:50 +09001958 if (gu8FlushedInfoElemAsoc != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09001959 kfree(gu8FlushedInfoElemAsoc);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001960 gu8FlushedInfoElemAsoc = NULL;
1961 }
1962
1963 return s32Error;
1964}
1965
1966/**
1967 * @brief Handle_RcvdNtwrkInfo
1968 * @details Handling received network information
Tony Cho3bbd59f2015-09-21 12:16:38 +09001969 * @param[in] struct rcvd_net_info *pstrRcvdNetworkInfo
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001970 * @return Error code.
1971 * @author
1972 * @date
1973 * @version 1.0
1974 */
Tony Cho3bbd59f2015-09-21 12:16:38 +09001975static s32 Handle_RcvdNtwrkInfo(tstrWILC_WFIDrv *drvHandler,
1976 struct rcvd_net_info *pstrRcvdNetworkInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001977{
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09001978 u32 i;
Dean Lee72ed4dc2015-06-12 14:11:44 +09001979 bool bNewNtwrkFound;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001980
1981
1982
Leo Kime6e12662015-09-16 18:36:03 +09001983 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001984 tstrNetworkInfo *pstrNetworkInfo = NULL;
1985 void *pJoinParams = NULL;
1986
1987 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
1988
1989
1990
Dean Lee72ed4dc2015-06-12 14:11:44 +09001991 bNewNtwrkFound = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001992 PRINT_INFO(HOSTINF_DBG, "Handling received network info\n");
1993
1994 /*if there is a an ongoing scan request*/
1995 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
1996 PRINT_D(HOSTINF_DBG, "State: Scanning, parsing network information received\n");
Chaehyun Lima1f7f642015-09-22 22:47:44 +09001997 parse_network_info(pstrRcvdNetworkInfo->pu8Buffer, &pstrNetworkInfo);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09001998 if ((pstrNetworkInfo == NULL)
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09001999 || (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult == NULL)) {
Leo Kim24db7132015-09-16 18:36:01 +09002000 PRINT_ER("driver is null\n");
2001 s32Error = -EINVAL;
2002 goto done;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002003 }
2004
2005 /* check whether this network is discovered before */
2006 for (i = 0; i < pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount; i++) {
2007
2008 if ((pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].au8bssid != NULL) &&
2009 (pstrNetworkInfo->au8bssid != NULL)) {
Chaehyun Lim1a646e72015-08-07 09:02:03 +09002010 if (memcmp(pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].au8bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002011 pstrNetworkInfo->au8bssid, 6) == 0) {
2012 if (pstrNetworkInfo->s8rssi <= pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].s8rssi) {
2013 /*we have already found this network with better rssi, so keep the old cached one and don't
2014 * send anything to the upper layer */
2015 PRINT_D(HOSTINF_DBG, "Network previously discovered\n");
2016 goto done;
2017 } else {
2018 /* here the same already found network is found again but with a better rssi, so just update
2019 * the rssi for this cached network and send this updated network to the upper layer but
2020 * don't add a new record for it */
2021 pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[i].s8rssi = pstrNetworkInfo->s8rssi;
Dean Lee72ed4dc2015-06-12 14:11:44 +09002022 bNewNtwrkFound = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002023 break;
2024 }
2025 }
2026 }
2027 }
2028
Dean Lee72ed4dc2015-06-12 14:11:44 +09002029 if (bNewNtwrkFound == true) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002030 /* here it is confirmed that it is a new discovered network,
2031 * so add its record then call the User CallBack function */
2032
2033 PRINT_D(HOSTINF_DBG, "New network found\n");
2034
2035 if (pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount < MAX_NUM_SCANNED_NETWORKS) {
2036 pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount].s8rssi = pstrNetworkInfo->s8rssi;
2037
2038 if ((pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount].au8bssid != NULL)
2039 && (pstrNetworkInfo->au8bssid != NULL)) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002040 memcpy(pstrWFIDrv->strWILC_UsrScanReq.astrFoundNetworkInfo[pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount].au8bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002041 pstrNetworkInfo->au8bssid, 6);
2042
2043 pstrWFIDrv->strWILC_UsrScanReq.u32RcvdChCount++;
2044
Dean Lee72ed4dc2015-06-12 14:11:44 +09002045 pstrNetworkInfo->bNewNetwork = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002046 /* add new BSS to JoinBssTable */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002047 pJoinParams = host_int_ParseJoinBssParam(pstrNetworkInfo);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002048
2049 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_NETWORK_FOUND, pstrNetworkInfo,
2050 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid,
2051 pJoinParams);
2052
2053
2054 }
2055 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002056 PRINT_WRN(HOSTINF_DBG, "Discovered networks exceeded max. limit\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002057 }
2058 } else {
Dean Lee72ed4dc2015-06-12 14:11:44 +09002059 pstrNetworkInfo->bNewNetwork = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002060 /* just call the User CallBack function to send the same discovered network with its updated RSSI */
2061 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_NETWORK_FOUND, pstrNetworkInfo,
2062 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
2063 }
2064 }
2065
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002066done:
2067 /* Deallocate pstrRcvdNetworkInfo->pu8Buffer which was prevoisuly allocated by the sending thread */
2068 if (pstrRcvdNetworkInfo->pu8Buffer != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002069 kfree(pstrRcvdNetworkInfo->pu8Buffer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002070 pstrRcvdNetworkInfo->pu8Buffer = NULL;
2071 }
2072
2073 /*free structure allocated*/
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002074 if (pstrNetworkInfo != NULL) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002075 DeallocateNetworkInfo(pstrNetworkInfo);
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002076 pstrNetworkInfo = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002077 }
2078
2079 return s32Error;
2080}
2081
2082/**
2083 * @brief Handle_RcvdGnrlAsyncInfo
2084 * @details Handling received asynchrous general network information
Tony Chof23a9ea2015-09-21 12:16:39 +09002085 * @param[in] struct rcvd_async_info *pstrRcvdGnrlAsyncInfo
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002086 * @return Error code.
2087 * @author
2088 * @date
2089 * @version 1.0
2090 */
Tony Chof23a9ea2015-09-21 12:16:39 +09002091static s32 Handle_RcvdGnrlAsyncInfo(tstrWILC_WFIDrv *drvHandler,
2092 struct rcvd_async_info *pstrRcvdGnrlAsyncInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002093{
2094 /* TODO: mostafa: till now, this function just handles only the received mac status msg, */
2095 /* which carries only 1 WID which have WID ID = WID_STATUS */
Leo Kime6e12662015-09-16 18:36:03 +09002096 s32 s32Error = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002097 u8 u8MsgType = 0;
2098 u8 u8MsgID = 0;
Chaehyun Limd85f5322015-06-11 14:35:54 +09002099 u16 u16MsgLen = 0;
2100 u16 u16WidID = (u16)WID_NIL;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002101 u8 u8WidLen = 0;
2102 u8 u8MacStatus;
2103 u8 u8MacStatusReasonCode;
2104 u8 u8MacStatusAdditionalInfo;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002105 tstrConnectInfo strConnectInfo;
2106 tstrDisconnectNotifInfo strDisconnectNotifInfo;
Leo Kime6e12662015-09-16 18:36:03 +09002107 s32 s32Err = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002108 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002109
Leo Kim234837d2015-09-22 14:34:43 +09002110 if (!pstrWFIDrv) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002111 PRINT_ER("Driver handler is NULL\n");
Leo Kim234837d2015-09-22 14:34:43 +09002112 return -ENODEV;
2113 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002114 PRINT_D(GENERIC_DBG, "Current State = %d,Received state = %d\n", pstrWFIDrv->enuHostIFstate,
2115 pstrRcvdGnrlAsyncInfo->pu8Buffer[7]);
2116
2117 if ((pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) ||
2118 (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED) ||
2119 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
2120 if ((pstrRcvdGnrlAsyncInfo->pu8Buffer == NULL) ||
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002121 (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult == NULL)) {
Leo Kim24db7132015-09-16 18:36:01 +09002122 PRINT_ER("driver is null\n");
2123 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002124 }
2125
2126 u8MsgType = pstrRcvdGnrlAsyncInfo->pu8Buffer[0];
2127
2128 /* Check whether the received message type is 'I' */
2129 if ('I' != u8MsgType) {
2130 PRINT_ER("Received Message format incorrect.\n");
Leo Kim24db7132015-09-16 18:36:01 +09002131 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002132 }
2133
2134 /* Extract message ID */
2135 u8MsgID = pstrRcvdGnrlAsyncInfo->pu8Buffer[1];
2136
2137 /* Extract message Length */
2138 u16MsgLen = MAKE_WORD16(pstrRcvdGnrlAsyncInfo->pu8Buffer[2], pstrRcvdGnrlAsyncInfo->pu8Buffer[3]);
2139
2140 /* Extract WID ID [expected to be = WID_STATUS] */
2141 u16WidID = MAKE_WORD16(pstrRcvdGnrlAsyncInfo->pu8Buffer[4], pstrRcvdGnrlAsyncInfo->pu8Buffer[5]);
2142
2143 /* Extract WID Length [expected to be = 1] */
2144 u8WidLen = pstrRcvdGnrlAsyncInfo->pu8Buffer[6];
2145
2146 /* get the WID value [expected to be one of two values: either MAC_CONNECTED = (1) or MAC_DISCONNECTED = (0)] */
2147 u8MacStatus = pstrRcvdGnrlAsyncInfo->pu8Buffer[7];
2148 u8MacStatusReasonCode = pstrRcvdGnrlAsyncInfo->pu8Buffer[8];
2149 u8MacStatusAdditionalInfo = pstrRcvdGnrlAsyncInfo->pu8Buffer[9];
2150 PRINT_INFO(HOSTINF_DBG, "Recieved MAC status = %d with Reason = %d , Info = %d\n", u8MacStatus, u8MacStatusReasonCode, u8MacStatusAdditionalInfo);
2151 if (pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
2152 /* our station had sent Association Request frame, so here it will get the Association Response frame then parse it */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09002153 u32 u32RcvdAssocRespInfoLen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002154 tstrConnectRespInfo *pstrConnectRespInfo = NULL;
2155
2156 PRINT_D(HOSTINF_DBG, "Recieved MAC status = %d with Reason = %d , Code = %d\n", u8MacStatus, u8MacStatusReasonCode, u8MacStatusAdditionalInfo);
2157
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002158 memset(&strConnectInfo, 0, sizeof(tstrConnectInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002159
2160 if (u8MacStatus == MAC_CONNECTED) {
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002161 memset(gapu8RcvdAssocResp, 0, MAX_ASSOC_RESP_FRAME_SIZE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002162
Johnny Kim218dc402015-08-13 13:41:19 +09002163 host_int_get_assoc_res_info(pstrWFIDrv,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002164 gapu8RcvdAssocResp,
2165 MAX_ASSOC_RESP_FRAME_SIZE,
2166 &u32RcvdAssocRespInfoLen);
2167
2168 PRINT_INFO(HOSTINF_DBG, "Received association response with length = %d\n", u32RcvdAssocRespInfoLen);
2169
2170 if (u32RcvdAssocRespInfoLen != 0) {
2171
2172 PRINT_D(HOSTINF_DBG, "Parsing association response\n");
2173 s32Err = ParseAssocRespInfo(gapu8RcvdAssocResp, u32RcvdAssocRespInfoLen,
2174 &pstrConnectRespInfo);
2175 if (s32Err) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002176 PRINT_ER("ParseAssocRespInfo() returned error %d\n", s32Err);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002177 } else {
2178 /* use the necessary parsed Info from the Received Association Response */
2179 strConnectInfo.u16ConnectStatus = pstrConnectRespInfo->u16ConnectStatus;
2180
2181 if (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE) {
2182 PRINT_INFO(HOSTINF_DBG, "Association response received : Successful connection status\n");
2183 if (pstrConnectRespInfo->pu8RespIEs != NULL) {
2184 strConnectInfo.u16RespIEsLen = pstrConnectRespInfo->u16RespIEsLen;
2185
2186
Glen Leef3052582015-09-10 12:03:04 +09002187 strConnectInfo.pu8RespIEs = kmalloc(pstrConnectRespInfo->u16RespIEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002188 memcpy(strConnectInfo.pu8RespIEs, pstrConnectRespInfo->pu8RespIEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002189 pstrConnectRespInfo->u16RespIEsLen);
2190 }
2191 }
2192
2193 /* deallocate the Assoc. Resp. parsed structure as it is not needed anymore */
2194 if (pstrConnectRespInfo != NULL) {
2195 DeallocateAssocRespInfo(pstrConnectRespInfo);
2196 pstrConnectRespInfo = NULL;
2197 }
2198 }
2199 }
2200 }
2201
2202 /* The station has just received mac status and it also received assoc. response which
2203 * it was waiting for.
2204 * So check first the matching between the received mac status and the received status code in Asoc Resp */
2205 if ((u8MacStatus == MAC_CONNECTED) &&
2206 (strConnectInfo.u16ConnectStatus != SUCCESSFUL_STATUSCODE)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002207 PRINT_ER("Received MAC status is MAC_CONNECTED while the received status code in Asoc Resp is not SUCCESSFUL_STATUSCODE\n");
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002208 memset(u8ConnectedSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002209
2210 } else if (u8MacStatus == MAC_DISCONNECTED) {
2211 PRINT_ER("Received MAC status is MAC_DISCONNECTED\n");
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002212 memset(u8ConnectedSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002213 }
2214
2215 /* TODO: mostafa: correct BSSID should be retrieved from actual BSSID received from AP */
2216 /* through a structure of type tstrConnectRespInfo */
2217 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
2218 PRINT_D(HOSTINF_DBG, "Retrieving actual BSSID from AP\n");
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002219 memcpy(strConnectInfo.au8bssid, pstrWFIDrv->strWILC_UsrConnReq.pu8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002220
2221 if ((u8MacStatus == MAC_CONNECTED) &&
2222 (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE)) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002223 memcpy(pstrWFIDrv->au8AssociatedBSSID,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002224 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid, ETH_ALEN);
2225 }
2226 }
2227
2228
2229 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
2230 strConnectInfo.ReqIEsLen = pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen;
Glen Leef3052582015-09-10 12:03:04 +09002231 strConnectInfo.pu8ReqIEs = kmalloc(pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen, GFP_KERNEL);
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002232 memcpy(strConnectInfo.pu8ReqIEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002233 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs,
2234 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen);
2235 }
2236
2237
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002238 del_timer(&pstrWFIDrv->hConnectTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002239 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_CONN_RESP,
2240 &strConnectInfo,
2241 u8MacStatus,
2242 NULL,
2243 pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid);
2244
2245
2246 /* if received mac status is MAC_CONNECTED and
2247 * received status code in Asoc Resp is SUCCESSFUL_STATUSCODE, change state to CONNECTED
2248 * else change state to IDLE */
2249 if ((u8MacStatus == MAC_CONNECTED) &&
2250 (strConnectInfo.u16ConnectStatus == SUCCESSFUL_STATUSCODE)) {
Johnny Kim218dc402015-08-13 13:41:19 +09002251 host_int_set_power_mgmt(pstrWFIDrv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002252
2253 PRINT_D(HOSTINF_DBG, "MAC status : CONNECTED and Connect Status : Successful\n");
2254 pstrWFIDrv->enuHostIFstate = HOST_IF_CONNECTED;
2255
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002256 PRINT_D(GENERIC_DBG, "Obtaining an IP, Disable Scan\n");
Dean Lee72ed4dc2015-06-12 14:11:44 +09002257 g_obtainingIP = true;
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07002258 mod_timer(&hDuringIpTimer,
2259 jiffies + msecs_to_jiffies(10000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002260
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002261 /* open a BA session if possible */
2262 /* if(pstrWFIDrv->strWILC_UsrConnReq.IsHTCapable) */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002263 /* BA_SESSION_DEFAULT_BUFFER_SIZE,BA_SESSION_DEFAULT_TIMEOUT); */
2264 } else {
2265 PRINT_D(HOSTINF_DBG, "MAC status : %d and Connect Status : %d\n", u8MacStatus, strConnectInfo.u16ConnectStatus);
2266 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
Dean Lee72ed4dc2015-06-12 14:11:44 +09002267 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002268 }
2269
2270 /* Deallocation */
2271 if (strConnectInfo.pu8RespIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002272 kfree(strConnectInfo.pu8RespIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002273 strConnectInfo.pu8RespIEs = NULL;
2274 }
2275
2276 if (strConnectInfo.pu8ReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002277 kfree(strConnectInfo.pu8ReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002278 strConnectInfo.pu8ReqIEs = NULL;
2279 }
2280
2281
2282 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
2283 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002284 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002285 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
2286 }
2287
2288 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002289 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002290 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
2291 }
2292
2293 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2294 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002295 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002296 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
2297 }
2298
2299 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
2300 (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED)) {
2301 /* Disassociation or Deauthentication frame has been received */
2302 PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW\n");
2303
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002304 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002305
2306 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002307 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running OBSS Scan >>\n\n");
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002308 del_timer(&pstrWFIDrv->hScanTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002309 Handle_ScanDone((void *)pstrWFIDrv, SCAN_EVENT_ABORTED);
2310 }
2311
2312 strDisconnectNotifInfo.u16reason = 0;
2313 strDisconnectNotifInfo.ie = NULL;
2314 strDisconnectNotifInfo.ie_len = 0;
2315
2316 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult != NULL) {
Dean Lee72ed4dc2015-06-12 14:11:44 +09002317 g_obtainingIP = false;
Johnny Kim218dc402015-08-13 13:41:19 +09002318 host_int_set_power_mgmt(pstrWFIDrv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002319
2320 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_DISCONN_NOTIF,
2321 NULL,
2322 0,
2323 &strDisconnectNotifInfo,
2324 pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid);
2325
2326 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002327 PRINT_ER("Connect result callback function is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002328 }
2329
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002330 memset(pstrWFIDrv->au8AssociatedBSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002331
2332
2333 /* Deallocation */
2334
2335 /* if Information Elements were retrieved from the Received deauth/disassoc frame, then they
2336 * should be deallocated here */
2337 /*
2338 * if(strDisconnectNotifInfo.ie != NULL)
2339 * {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002340 * kfree(strDisconnectNotifInfo.ie);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002341 * strDisconnectNotifInfo.ie = NULL;
2342 * }
2343 */
2344
2345 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
2346 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002347 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002348 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
2349 }
2350
2351 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002352 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002353 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
2354 }
2355
2356 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2357 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002358 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002359 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
2360 }
2361
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002362 /*Freeing flushed join request params on receiving*/
2363 /*MAC_DISCONNECTED while connected*/
Johnny Kim8a625ca2015-08-20 16:32:50 +09002364 if (gu8FlushedJoinReq != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002365 kfree(gu8FlushedJoinReq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002366 gu8FlushedJoinReq = NULL;
2367 }
Johnny Kim8a625ca2015-08-20 16:32:50 +09002368 if (gu8FlushedInfoElemAsoc != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002369 kfree(gu8FlushedInfoElemAsoc);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002370 gu8FlushedInfoElemAsoc = NULL;
2371 }
2372
2373 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
Dean Lee72ed4dc2015-06-12 14:11:44 +09002374 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002375
2376 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
2377 (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult != NULL)) {
2378 PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW while scanning\n");
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002379 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running Scan >>\n\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002380 /*Abort the running scan*/
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002381 del_timer(&pstrWFIDrv->hScanTimer);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02002382 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult)
Johnny Kim2b05df52015-08-13 13:41:21 +09002383 Handle_ScanDone(pstrWFIDrv, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002384
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002385 }
2386
2387 }
2388
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002389 /* Deallocate pstrRcvdGnrlAsyncInfo->pu8Buffer which was prevoisuly allocated by the sending thread */
2390 if (pstrRcvdGnrlAsyncInfo->pu8Buffer != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002391 kfree(pstrRcvdGnrlAsyncInfo->pu8Buffer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002392 pstrRcvdGnrlAsyncInfo->pu8Buffer = NULL;
2393 }
2394
2395 return s32Error;
2396}
2397
2398/**
2399 * @brief Handle_Key
2400 * @details Sending config packet to firmware to set key
Tony Choc98387a2015-09-21 12:16:40 +09002401 * @param[in] struct key_attr *pstrHostIFkeyAttr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002402 * @return Error code.
2403 * @author
2404 * @date
2405 * @version 1.0
2406 */
Tony Choc98387a2015-09-21 12:16:40 +09002407static int Handle_Key(tstrWILC_WFIDrv *drvHandler,
2408 struct key_attr *pstrHostIFkeyAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002409{
Leo Kime6e12662015-09-16 18:36:03 +09002410 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002411 tstrWID strWID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002412 tstrWID strWIDList[5];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002413 u8 i;
2414 u8 *pu8keybuf;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002415 s8 s8idxarray[1];
2416 s8 ret = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002417 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2418
2419
2420 switch (pstrHostIFkeyAttr->enuKeyType) {
2421
2422
2423 case WEP:
2424
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002425 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY_AP) {
2426
2427 PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
2428 PRINT_D(GENERIC_DBG, "ID Hostint is %d\n", (pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx));
Chaehyun Limd85f5322015-06-11 14:35:54 +09002429 strWIDList[0].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002430 strWIDList[0].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002431 strWIDList[0].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002432 strWIDList[0].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8mode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002433
2434 strWIDList[1].u16WIDid = WID_AUTH_TYPE;
2435 strWIDList[1].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002436 strWIDList[1].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002437 strWIDList[1].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.tenuAuth_type));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002438
Chaehyun Limd85f5322015-06-11 14:35:54 +09002439 strWIDList[2].u16WIDid = (u16)WID_KEY_ID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002440 strWIDList[2].enuWIDtype = WID_CHAR;
2441
Chaehyun Limca356ad2015-06-11 14:35:57 +09002442 strWIDList[2].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx));
Dean Lee576917a2015-06-15 11:58:57 +09002443 strWIDList[2].s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002444
2445
Glen Leef3052582015-09-10 12:03:04 +09002446 pu8keybuf = kmalloc(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002447
2448
2449 if (pu8keybuf == NULL) {
2450 PRINT_ER("No buffer to send Key\n");
2451 return -1;
2452 }
2453
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002454 memcpy(pu8keybuf, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002455 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen);
2456
2457
Chaehyun Lim49188af2015-08-11 10:32:41 +09002458 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002459
Chaehyun Limd85f5322015-06-11 14:35:54 +09002460 strWIDList[3].u16WIDid = (u16)WID_WEP_KEY_VALUE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002461 strWIDList[3].enuWIDtype = WID_STR;
2462 strWIDList[3].s32ValueSize = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002463 strWIDList[3].ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002464
2465
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002466 s32Error = send_config_pkt(SET_CFG, strWIDList, 4, true,
2467 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002468 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002469
2470
2471 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002472
2473 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY) {
2474 PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
Glen Leef3052582015-09-10 12:03:04 +09002475 pu8keybuf = kmalloc(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen + 2, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002476 if (pu8keybuf == NULL) {
2477 PRINT_ER("No buffer to send Key\n");
2478 return -1;
2479 }
2480 pu8keybuf[0] = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx;
2481
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002482 memcpy(pu8keybuf + 1, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002483
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002484 memcpy(pu8keybuf + 2, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002485 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen);
2486
Chaehyun Lim49188af2015-08-11 10:32:41 +09002487 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002488
Chaehyun Limd85f5322015-06-11 14:35:54 +09002489 strWID.u16WIDid = (u16)WID_ADD_WEP_KEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002490 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002491 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002492 strWID.s32ValueSize = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen + 2;
2493
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002494 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2495 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002496 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002497 } else if (pstrHostIFkeyAttr->u8KeyAction & REMOVEKEY) {
2498
2499 PRINT_D(HOSTINF_DBG, "Removing key\n");
Chaehyun Limd85f5322015-06-11 14:35:54 +09002500 strWID.u16WIDid = (u16)WID_REMOVE_WEP_KEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002501 strWID.enuWIDtype = WID_STR;
2502
Chaehyun Limca356ad2015-06-11 14:35:57 +09002503 s8idxarray[0] = (s8)pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002504 strWID.ps8WidVal = s8idxarray;
2505 strWID.s32ValueSize = 1;
2506
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002507 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2508 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002509 } else {
Chaehyun Limd85f5322015-06-11 14:35:54 +09002510 strWID.u16WIDid = (u16)WID_KEY_ID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002511 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002512 strWID.ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx));
Dean Lee576917a2015-06-15 11:58:57 +09002513 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002514
2515 PRINT_D(HOSTINF_DBG, "Setting default key index\n");
2516
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002517 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2518 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002519 }
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002520 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002521 break;
2522
2523 case WPARxGtk:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002524 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY_AP) {
Glen Leef3052582015-09-10 12:03:04 +09002525 pu8keybuf = kmalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002526 if (pu8keybuf == NULL) {
2527 PRINT_ER("No buffer to send RxGTK Key\n");
2528 ret = -1;
2529 goto _WPARxGtk_end_case_;
2530 }
2531
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002532 memset(pu8keybuf, 0, RX_MIC_KEY_MSG_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002533
2534
2535 /*|----------------------------------------------------------------------------|
2536 * |Sta Address | Key RSC | KeyID | Key Length | Temporal Key | Rx Michael Key |
2537 * |------------|---------|-------|------------|---------------|----------------|
2538 | 6 bytes | 8 byte |1 byte | 1 byte | 16 bytes | 8 bytes |*/
2539
2540
2541
2542 if (pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq != NULL)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002543 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq, 8);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002544
2545
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002546 memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002547
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002548 memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002549
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002550 memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002551 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2552 /* pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode = 0X51; */
Chaehyun Limd85f5322015-06-11 14:35:54 +09002553 strWIDList[0].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002554 strWIDList[0].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002555 strWIDList[0].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002556 strWIDList[0].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002557
Chaehyun Limd85f5322015-06-11 14:35:54 +09002558 strWIDList[1].u16WIDid = (u16)WID_ADD_RX_GTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002559 strWIDList[1].enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002560 strWIDList[1].ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002561 strWIDList[1].s32ValueSize = RX_MIC_KEY_MSG_LEN;
2562
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002563 s32Error = send_config_pkt(SET_CFG, strWIDList, 2, true,
2564 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002565
Chaehyun Lim49188af2015-08-11 10:32:41 +09002566 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002567
2568 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002569 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002570 /* ///////////////////////// */
2571 }
2572
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002573 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY) {
2574 PRINT_D(HOSTINF_DBG, "Handling group key(Rx) function\n");
2575
Glen Leef3052582015-09-10 12:03:04 +09002576 pu8keybuf = kmalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002577 if (pu8keybuf == NULL) {
2578 PRINT_ER("No buffer to send RxGTK Key\n");
2579 ret = -1;
2580 goto _WPARxGtk_end_case_;
2581 }
2582
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002583 memset(pu8keybuf, 0, RX_MIC_KEY_MSG_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002584
2585
2586 /*|----------------------------------------------------------------------------|
2587 * |Sta Address | Key RSC | KeyID | Key Length | Temporal Key | Rx Michael Key |
2588 * |------------|---------|-------|------------|---------------|----------------|
2589 | 6 bytes | 8 byte |1 byte | 1 byte | 16 bytes | 8 bytes |*/
2590
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05302591 if (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002592 memcpy(pu8keybuf, pstrWFIDrv->au8AssociatedBSSID, ETH_ALEN);
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05302593 else
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002594 PRINT_ER("Couldn't handle WPARxGtk while enuHostIFstate is not HOST_IF_CONNECTED\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002595
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002596 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq, 8);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002597
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002598 memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002599
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002600 memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
2601 memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002602 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2603
Chaehyun Limd85f5322015-06-11 14:35:54 +09002604 strWID.u16WIDid = (u16)WID_ADD_RX_GTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002605 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002606 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002607 strWID.s32ValueSize = RX_MIC_KEY_MSG_LEN;
2608
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002609 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2610 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002611
Chaehyun Lim49188af2015-08-11 10:32:41 +09002612 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002613
2614 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002615 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002616 /* ///////////////////////// */
2617 }
2618_WPARxGtk_end_case_:
Chaehyun Lim49188af2015-08-11 10:32:41 +09002619 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key);
2620 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002621 if (ret == -1)
2622 return ret;
2623
2624 break;
2625
2626 case WPAPtk:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002627 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY_AP) {
2628
2629
Glen Leef3052582015-09-10 12:03:04 +09002630 pu8keybuf = kmalloc(PTK_KEY_MSG_LEN + 1, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002631
2632
2633
2634 if (pu8keybuf == NULL) {
2635 PRINT_ER("No buffer to send PTK Key\n");
2636 ret = -1;
2637 goto _WPAPtk_end_case_;
2638
2639 }
2640
2641 /*|-----------------------------------------------------------------------------|
2642 * |Station address | keyidx |Key Length |Temporal Key | Rx Michael Key |Tx Michael Key |
2643 * |----------------|------------ |--------------|----------------|---------------|
2644 | 6 bytes | 1 byte | 1byte | 16 bytes | 8 bytes | 8 bytes |
2645 |-----------------------------------------------------------------------------|*/
2646
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002647 memcpy(pu8keybuf, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8macaddr, 6); /*1 bytes Key Length */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002648
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002649 memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx, 1);
2650 memcpy(pu8keybuf + 7, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002651 /*16 byte TK*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002652 memcpy(pu8keybuf + 8, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002653 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2654
2655
Chaehyun Limd85f5322015-06-11 14:35:54 +09002656 strWIDList[0].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002657 strWIDList[0].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002658 strWIDList[0].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002659 strWIDList[0].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002660
Chaehyun Limd85f5322015-06-11 14:35:54 +09002661 strWIDList[1].u16WIDid = (u16)WID_ADD_PTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002662 strWIDList[1].enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002663 strWIDList[1].ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002664 strWIDList[1].s32ValueSize = PTK_KEY_MSG_LEN + 1;
2665
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002666 s32Error = send_config_pkt(SET_CFG, strWIDList, 2, true,
2667 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002668 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002669
2670 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002671 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002672 /* ///////////////////////// */
2673 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002674 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY) {
2675
2676
Glen Leef3052582015-09-10 12:03:04 +09002677 pu8keybuf = kmalloc(PTK_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002678
2679
2680
2681 if (pu8keybuf == NULL) {
2682 PRINT_ER("No buffer to send PTK Key\n");
2683 ret = -1;
2684 goto _WPAPtk_end_case_;
2685
2686 }
2687
2688 /*|-----------------------------------------------------------------------------|
2689 * |Station address | Key Length | Temporal Key | Rx Michael Key |Tx Michael Key |
2690 * |----------------|------------|--------------|----------------|---------------|
2691 | 6 bytes | 1byte | 16 bytes | 8 bytes | 8 bytes |
2692 |-----------------------------------------------------------------------------|*/
2693
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002694 memcpy(pu8keybuf, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8macaddr, 6); /*1 bytes Key Length */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002695
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002696 memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002697 /*16 byte TK*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002698 memcpy(pu8keybuf + 7, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002699 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2700
2701
Chaehyun Limd85f5322015-06-11 14:35:54 +09002702 strWID.u16WIDid = (u16)WID_ADD_PTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002703 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002704 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002705 strWID.s32ValueSize = PTK_KEY_MSG_LEN;
2706
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002707 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2708 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002709 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002710
2711 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002712 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002713 /* ///////////////////////// */
2714 }
2715
2716_WPAPtk_end_case_:
Chaehyun Lim49188af2015-08-11 10:32:41 +09002717 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002718 if (ret == -1)
2719 return ret;
2720
2721 break;
2722
2723
2724 case PMKSA:
2725
2726 PRINT_D(HOSTINF_DBG, "Handling PMKSA key\n");
2727
Glen Leef3052582015-09-10 12:03:04 +09002728 pu8keybuf = kmalloc((pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid * PMKSA_KEY_LEN) + 1, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002729 if (pu8keybuf == NULL) {
2730 PRINT_ER("No buffer to send PMKSA Key\n");
2731 return -1;
2732 }
2733
2734 pu8keybuf[0] = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid;
2735
2736 for (i = 0; i < pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid; i++) {
2737
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002738 memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + 1), pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].bssid, ETH_ALEN);
2739 memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + ETH_ALEN + 1), pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].pmkid, PMKID_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002740 }
2741
Chaehyun Limd85f5322015-06-11 14:35:54 +09002742 strWID.u16WIDid = (u16)WID_PMKID_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002743 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002744 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002745 strWID.s32ValueSize = (pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid * PMKSA_KEY_LEN) + 1;
2746
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002747 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2748 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002749
Chaehyun Lim49188af2015-08-11 10:32:41 +09002750 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002751 break;
2752 }
2753
2754 if (s32Error)
2755 PRINT_ER("Failed to send key config packet\n");
2756
2757
2758 return s32Error;
2759}
2760
2761
2762/**
2763 * @brief Handle_Disconnect
2764 * @details Sending config packet to firmware to disconnect
2765 * @param[in] NONE
2766 * @return NONE
2767 * @author
2768 * @date
2769 * @version 1.0
2770 */
Johnny Kim2b05df52015-08-13 13:41:21 +09002771static void Handle_Disconnect(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002772{
2773 tstrWID strWID;
2774
Leo Kime6e12662015-09-16 18:36:03 +09002775 s32 s32Error = 0;
Chaehyun Limd85f5322015-06-11 14:35:54 +09002776 u16 u16DummyReasonCode = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002777 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2778
2779
Chaehyun Limd85f5322015-06-11 14:35:54 +09002780 strWID.u16WIDid = (u16)WID_DISCONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002781 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002782 strWID.ps8WidVal = (s8 *)&u16DummyReasonCode;
Dean Lee576917a2015-06-15 11:58:57 +09002783 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002784
2785
2786
2787 PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
2788
Dean Lee72ed4dc2015-06-12 14:11:44 +09002789 g_obtainingIP = false;
Johnny Kim218dc402015-08-13 13:41:19 +09002790 host_int_set_power_mgmt(pstrWFIDrv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002791
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002792 memset(u8ConnectedSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002793
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002794 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
2795 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002796
2797 if (s32Error) {
2798 PRINT_ER("Failed to send dissconect config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002799 } else {
2800 tstrDisconnectNotifInfo strDisconnectNotifInfo;
2801
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002802 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002803
2804 strDisconnectNotifInfo.u16reason = 0;
2805 strDisconnectNotifInfo.ie = NULL;
2806 strDisconnectNotifInfo.ie_len = 0;
2807
2808 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002809 del_timer(&pstrWFIDrv->hScanTimer);
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002810 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_ABORTED, NULL,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002811 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
2812
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002813 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002814 }
2815
2816 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult != NULL) {
2817
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002818 /*Stop connect timer, if connection in progress*/
2819 if (pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
2820 PRINT_D(HOSTINF_DBG, "Upper layer requested termination of connection\n");
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002821 del_timer(&pstrWFIDrv->hConnectTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002822 }
2823
2824 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_DISCONN_NOTIF, NULL,
2825 0, &strDisconnectNotifInfo, pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid);
2826 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002827 PRINT_ER("strWILC_UsrConnReq.pfUserConnectResult = NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002828 }
2829
Dean Lee72ed4dc2015-06-12 14:11:44 +09002830 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002831
2832 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
2833
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002834 memset(pstrWFIDrv->au8AssociatedBSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002835
2836
2837 /* Deallocation */
2838 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
2839 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002840 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002841 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
2842 }
2843
2844 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002845 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002846 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
2847 }
2848
2849 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2850 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002851 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002852 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
2853 }
2854
2855
Johnny Kim8a625ca2015-08-20 16:32:50 +09002856 if (gu8FlushedJoinReq != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002857 kfree(gu8FlushedJoinReq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002858 gu8FlushedJoinReq = NULL;
2859 }
Johnny Kim8a625ca2015-08-20 16:32:50 +09002860 if (gu8FlushedInfoElemAsoc != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002861 kfree(gu8FlushedInfoElemAsoc);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002862 gu8FlushedInfoElemAsoc = NULL;
2863 }
2864
2865 }
2866
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002867 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002868 up(&(pstrWFIDrv->hSemTestDisconnectBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002869 /* ///////////////////////// */
2870
2871}
2872
2873
Johnny Kim2b05df52015-08-13 13:41:21 +09002874void resolve_disconnect_aberration(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002875{
2876 tstrWILC_WFIDrv *pstrWFIDrv;
2877
2878 pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002879 if (pstrWFIDrv == NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002880 return;
2881 if ((pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) || (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTING)) {
2882 PRINT_D(HOSTINF_DBG, "\n\n<< correcting Supplicant state machine >>\n\n");
Johnny Kim218dc402015-08-13 13:41:19 +09002883 host_int_disconnect(pstrWFIDrv, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002884 }
2885}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002886
2887/**
2888 * @brief Handle_GetChnl
2889 * @details Sending config packet to get channel
2890 * @param[in] NONE
2891 * @return NONE
2892 *
2893 * @author
2894 * @date
2895 * @version 1.0
2896 */
Johnny Kim2b05df52015-08-13 13:41:21 +09002897static s32 Handle_GetChnl(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002898{
2899
Leo Kime6e12662015-09-16 18:36:03 +09002900 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002901 tstrWID strWID;
2902 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
2903 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002904
Chaehyun Limd85f5322015-06-11 14:35:54 +09002905 strWID.u16WIDid = (u16)WID_CURRENT_CHANNEL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002906 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002907 strWID.ps8WidVal = (s8 *)&gu8Chnl;
Dean Lee576917a2015-06-15 11:58:57 +09002908 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002909
2910 PRINT_D(HOSTINF_DBG, "Getting channel value\n");
2911
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002912 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
2913 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002914 /*get the value by searching the local copy*/
2915 if (s32Error) {
2916 PRINT_ER("Failed to get channel number\n");
Leo Kim24db7132015-09-16 18:36:01 +09002917 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002918 }
2919
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002920 up(&(pstrWFIDrv->hSemGetCHNL));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002921
2922 return s32Error;
2923
2924
2925
2926}
2927
2928
2929/**
2930 * @brief Handle_GetRssi
2931 * @details Sending config packet to get RSSI
2932 * @param[in] NONE
2933 * @return NONE
2934 * @author
2935 * @date
2936 * @version 1.0
2937 */
Johnny Kim2b05df52015-08-13 13:41:21 +09002938static void Handle_GetRssi(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002939{
Leo Kime6e12662015-09-16 18:36:03 +09002940 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002941 tstrWID strWID;
2942 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2943
Chaehyun Limd85f5322015-06-11 14:35:54 +09002944 strWID.u16WIDid = (u16)WID_RSSI;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002945 strWID.enuWIDtype = WID_CHAR;
2946 strWID.ps8WidVal = &gs8Rssi;
Dean Lee576917a2015-06-15 11:58:57 +09002947 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002948
2949 /*Sending Cfg*/
2950 PRINT_D(HOSTINF_DBG, "Getting RSSI value\n");
2951
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002952 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
2953 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002954 if (s32Error) {
2955 PRINT_ER("Failed to get RSSI value\n");
Leo Kim24db7132015-09-16 18:36:01 +09002956 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002957 }
2958
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002959 up(&(pstrWFIDrv->hSemGetRSSI));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002960
2961
2962}
2963
2964
Johnny Kim2b05df52015-08-13 13:41:21 +09002965static void Handle_GetLinkspeed(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002966{
Leo Kime6e12662015-09-16 18:36:03 +09002967 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002968 tstrWID strWID;
2969 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2970
2971 gs8lnkspd = 0;
2972
Chaehyun Limd85f5322015-06-11 14:35:54 +09002973 strWID.u16WIDid = (u16)WID_LINKSPEED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002974 strWID.enuWIDtype = WID_CHAR;
2975 strWID.ps8WidVal = &gs8lnkspd;
Dean Lee576917a2015-06-15 11:58:57 +09002976 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002977 /*Sending Cfg*/
2978 PRINT_D(HOSTINF_DBG, "Getting LINKSPEED value\n");
2979
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002980 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
2981 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002982 if (s32Error) {
2983 PRINT_ER("Failed to get LINKSPEED value\n");
Leo Kim24db7132015-09-16 18:36:01 +09002984 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002985 }
2986
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002987 up(&(pstrWFIDrv->hSemGetLINKSPEED));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002988
2989
2990}
2991
Johnny Kim2b05df52015-08-13 13:41:21 +09002992s32 Handle_GetStatistics(tstrWILC_WFIDrv *drvHandler, tstrStatistics *pstrStatistics)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002993{
2994 tstrWID strWIDList[5];
Chaehyun Limfbc2fe12015-09-15 14:06:16 +09002995 u32 u32WidsCount = 0, s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002996
2997 strWIDList[u32WidsCount].u16WIDid = WID_LINKSPEED;
2998 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002999 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003000 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u8LinkSpeed));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003001 u32WidsCount++;
3002
3003 strWIDList[u32WidsCount].u16WIDid = WID_RSSI;
3004 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09003005 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003006 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->s8RSSI));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003007 u32WidsCount++;
3008
3009 strWIDList[u32WidsCount].u16WIDid = WID_SUCCESS_FRAME_COUNT;
3010 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003011 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003012 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u32TxCount));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003013 u32WidsCount++;
3014
3015 strWIDList[u32WidsCount].u16WIDid = WID_RECEIVED_FRAGMENT_COUNT;
3016 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003017 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003018 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u32RxCount));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003019 u32WidsCount++;
3020
3021 strWIDList[u32WidsCount].u16WIDid = WID_FAILED_COUNT;
3022 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003023 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003024 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u32TxFailureCount));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003025 u32WidsCount++;
3026
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003027 s32Error = send_config_pkt(GET_CFG, strWIDList, u32WidsCount, false,
3028 get_id_from_handler(drvHandler));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003029
Leo Kim24db7132015-09-16 18:36:01 +09003030 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003031 PRINT_ER("Failed to send scan paramters config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +09003032
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003033 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003034 return 0;
3035
3036}
3037
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003038/**
3039 * @brief Handle_Get_InActiveTime
3040 * @details Sending config packet to set mac adddress for station and
3041 * get inactive time
3042 * @param[in] NONE
3043 * @return NONE
3044 *
3045 * @author
3046 * @date
3047 * @version 1.0
3048 */
Tony Cho3d1eac02015-09-21 12:16:49 +09003049static s32 Handle_Get_InActiveTime(tstrWILC_WFIDrv *drvHandler,
3050 struct sta_inactive_t *strHostIfStaInactiveT)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003051{
3052
Leo Kime6e12662015-09-16 18:36:03 +09003053 s32 s32Error = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003054 u8 *stamac;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003055 tstrWID strWID;
3056 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3057
3058
Chaehyun Limd85f5322015-06-11 14:35:54 +09003059 strWID.u16WIDid = (u16)WID_SET_STA_MAC_INACTIVE_TIME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003060 strWID.enuWIDtype = WID_STR;
3061 strWID.s32ValueSize = ETH_ALEN;
Glen Leef3052582015-09-10 12:03:04 +09003062 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003063
3064
3065 stamac = strWID.ps8WidVal;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003066 memcpy(stamac, strHostIfStaInactiveT->mac, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003067
3068
3069 PRINT_D(CFG80211_DBG, "SETING STA inactive time\n");
3070
3071
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003072 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3073 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003074 /*get the value by searching the local copy*/
3075 if (s32Error) {
3076 PRINT_ER("Failed to SET incative time\n");
Leo Kim24db7132015-09-16 18:36:01 +09003077 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003078 }
3079
3080
Chaehyun Limd85f5322015-06-11 14:35:54 +09003081 strWID.u16WIDid = (u16)WID_GET_INACTIVE_TIME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003082 strWID.enuWIDtype = WID_INT;
Chaehyun Limca356ad2015-06-11 14:35:57 +09003083 strWID.ps8WidVal = (s8 *)&gu32InactiveTime;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003084 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003085
3086
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003087 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
3088 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003089 /*get the value by searching the local copy*/
3090 if (s32Error) {
3091 PRINT_ER("Failed to get incative time\n");
Leo Kim24db7132015-09-16 18:36:01 +09003092 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003093 }
3094
3095
3096 PRINT_D(CFG80211_DBG, "Getting inactive time : %d\n", gu32InactiveTime);
3097
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003098 up(&(pstrWFIDrv->hSemInactiveTime));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003099
3100 return s32Error;
3101
3102
3103
3104}
3105
3106
3107/**
3108 * @brief Handle_AddBeacon
3109 * @details Sending config packet to add beacon
Tony Cho7f33fec2015-09-30 18:44:30 +09003110 * @param[in] struct beacon_attr *pstrSetBeaconParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003111 * @return NONE
3112 * @author
3113 * @date
3114 * @version 1.0
3115 */
Tony Cho902362b2015-09-21 12:16:44 +09003116static void Handle_AddBeacon(tstrWILC_WFIDrv *drvHandler,
Tony Cho7f33fec2015-09-30 18:44:30 +09003117 struct beacon_attr *pstrSetBeaconParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003118{
Leo Kime6e12662015-09-16 18:36:03 +09003119 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003120 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003121 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003122 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003123
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003124 PRINT_D(HOSTINF_DBG, "Adding BEACON\n");
3125
Chaehyun Limd85f5322015-06-11 14:35:54 +09003126 strWID.u16WIDid = (u16)WID_ADD_BEACON;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003127 strWID.enuWIDtype = WID_BIN;
3128 strWID.s32ValueSize = pstrSetBeaconParam->u32HeadLen + pstrSetBeaconParam->u32TailLen + 16;
Glen Leef3052582015-09-10 12:03:04 +09003129 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003130 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003131 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003132
3133 pu8CurrByte = strWID.ps8WidVal;
3134 *pu8CurrByte++ = (pstrSetBeaconParam->u32Interval & 0xFF);
3135 *pu8CurrByte++ = ((pstrSetBeaconParam->u32Interval >> 8) & 0xFF);
3136 *pu8CurrByte++ = ((pstrSetBeaconParam->u32Interval >> 16) & 0xFF);
3137 *pu8CurrByte++ = ((pstrSetBeaconParam->u32Interval >> 24) & 0xFF);
3138
3139 *pu8CurrByte++ = (pstrSetBeaconParam->u32DTIMPeriod & 0xFF);
3140 *pu8CurrByte++ = ((pstrSetBeaconParam->u32DTIMPeriod >> 8) & 0xFF);
3141 *pu8CurrByte++ = ((pstrSetBeaconParam->u32DTIMPeriod >> 16) & 0xFF);
3142 *pu8CurrByte++ = ((pstrSetBeaconParam->u32DTIMPeriod >> 24) & 0xFF);
3143
3144 *pu8CurrByte++ = (pstrSetBeaconParam->u32HeadLen & 0xFF);
3145 *pu8CurrByte++ = ((pstrSetBeaconParam->u32HeadLen >> 8) & 0xFF);
3146 *pu8CurrByte++ = ((pstrSetBeaconParam->u32HeadLen >> 16) & 0xFF);
3147 *pu8CurrByte++ = ((pstrSetBeaconParam->u32HeadLen >> 24) & 0xFF);
3148
3149 memcpy(pu8CurrByte, pstrSetBeaconParam->pu8Head, pstrSetBeaconParam->u32HeadLen);
3150 pu8CurrByte += pstrSetBeaconParam->u32HeadLen;
3151
3152 *pu8CurrByte++ = (pstrSetBeaconParam->u32TailLen & 0xFF);
3153 *pu8CurrByte++ = ((pstrSetBeaconParam->u32TailLen >> 8) & 0xFF);
3154 *pu8CurrByte++ = ((pstrSetBeaconParam->u32TailLen >> 16) & 0xFF);
3155 *pu8CurrByte++ = ((pstrSetBeaconParam->u32TailLen >> 24) & 0xFF);
3156
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003157 if (pstrSetBeaconParam->pu8Tail > 0)
3158 memcpy(pu8CurrByte, pstrSetBeaconParam->pu8Tail, pstrSetBeaconParam->u32TailLen);
3159 pu8CurrByte += pstrSetBeaconParam->u32TailLen;
3160
3161
3162
3163 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003164 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3165 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003166 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003167 PRINT_ER("Failed to send add beacon config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003168
Leo Kim24db7132015-09-16 18:36:01 +09003169ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003170 kfree(strWID.ps8WidVal);
3171 kfree(pstrSetBeaconParam->pu8Head);
3172 kfree(pstrSetBeaconParam->pu8Tail);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003173}
3174
3175
3176/**
3177 * @brief Handle_AddBeacon
3178 * @details Sending config packet to delete beacon
Tony Cho80bf88362015-09-30 18:44:29 +09003179 * @param[in] tstrWILC_WFIDrv *drvHandler
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003180 * @return NONE
3181 * @author
3182 * @date
3183 * @version 1.0
3184 */
Tony Cho80bf88362015-09-30 18:44:29 +09003185static void Handle_DelBeacon(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003186{
Leo Kime6e12662015-09-16 18:36:03 +09003187 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003188 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003189 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003190 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003191
Chaehyun Limd85f5322015-06-11 14:35:54 +09003192 strWID.u16WIDid = (u16)WID_DEL_BEACON;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003193 strWID.enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09003194 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003195 strWID.ps8WidVal = &gu8DelBcn;
3196
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003197 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003198 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003199
3200 pu8CurrByte = strWID.ps8WidVal;
3201
3202 PRINT_D(HOSTINF_DBG, "Deleting BEACON\n");
3203 /* TODO: build del beacon message*/
3204
3205 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003206 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3207 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003208 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003209 PRINT_ER("Failed to send delete beacon config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003210}
3211
3212
3213/**
3214 * @brief WILC_HostIf_PackStaParam
3215 * @details Handling packing of the station params in a buffer
Tony Cho6a89ba92015-09-21 12:16:46 +09003216 * @param[in] u8* pu8Buffer, struct add_sta_param *pstrStationParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003217 * @return NONE
3218 * @author
3219 * @date
3220 * @version 1.0
3221 */
Tony Cho6a89ba92015-09-21 12:16:46 +09003222static u32 WILC_HostIf_PackStaParam(u8 *pu8Buffer,
3223 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003224{
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003225 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003226
3227 pu8CurrByte = pu8Buffer;
3228
3229 PRINT_D(HOSTINF_DBG, "Packing STA params\n");
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003230 memcpy(pu8CurrByte, pstrStationParam->au8BSSID, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003231 pu8CurrByte += ETH_ALEN;
3232
3233 *pu8CurrByte++ = pstrStationParam->u16AssocID & 0xFF;
3234 *pu8CurrByte++ = (pstrStationParam->u16AssocID >> 8) & 0xFF;
3235
3236 *pu8CurrByte++ = pstrStationParam->u8NumRates;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003237 if (pstrStationParam->u8NumRates > 0)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003238 memcpy(pu8CurrByte, pstrStationParam->pu8Rates, pstrStationParam->u8NumRates);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003239 pu8CurrByte += pstrStationParam->u8NumRates;
3240
3241 *pu8CurrByte++ = pstrStationParam->bIsHTSupported;
3242 *pu8CurrByte++ = pstrStationParam->u16HTCapInfo & 0xFF;
3243 *pu8CurrByte++ = (pstrStationParam->u16HTCapInfo >> 8) & 0xFF;
3244
3245 *pu8CurrByte++ = pstrStationParam->u8AmpduParams;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003246 memcpy(pu8CurrByte, pstrStationParam->au8SuppMCsSet, WILC_SUPP_MCS_SET_SIZE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003247 pu8CurrByte += WILC_SUPP_MCS_SET_SIZE;
3248
3249 *pu8CurrByte++ = pstrStationParam->u16HTExtParams & 0xFF;
3250 *pu8CurrByte++ = (pstrStationParam->u16HTExtParams >> 8) & 0xFF;
3251
3252 *pu8CurrByte++ = pstrStationParam->u32TxBeamformingCap & 0xFF;
3253 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 8) & 0xFF;
3254 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 16) & 0xFF;
3255 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 24) & 0xFF;
3256
3257 *pu8CurrByte++ = pstrStationParam->u8ASELCap;
3258
3259 *pu8CurrByte++ = pstrStationParam->u16FlagsMask & 0xFF;
3260 *pu8CurrByte++ = (pstrStationParam->u16FlagsMask >> 8) & 0xFF;
3261
3262 *pu8CurrByte++ = pstrStationParam->u16FlagsSet & 0xFF;
3263 *pu8CurrByte++ = (pstrStationParam->u16FlagsSet >> 8) & 0xFF;
3264
3265 return pu8CurrByte - pu8Buffer;
3266}
3267
3268/**
3269 * @brief Handle_AddStation
3270 * @details Sending config packet to add station
Tony Cho6a89ba92015-09-21 12:16:46 +09003271 * @param[in] struct add_sta_param *pstrStationParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003272 * @return NONE
3273 * @author
3274 * @date
3275 * @version 1.0
3276 */
Tony Cho6a89ba92015-09-21 12:16:46 +09003277static void Handle_AddStation(tstrWILC_WFIDrv *drvHandler,
3278 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003279{
Leo Kime6e12662015-09-16 18:36:03 +09003280 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003281 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003282 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003283 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003284
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003285 PRINT_D(HOSTINF_DBG, "Handling add station\n");
Chaehyun Limd85f5322015-06-11 14:35:54 +09003286 strWID.u16WIDid = (u16)WID_ADD_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003287 strWID.enuWIDtype = WID_BIN;
3288 strWID.s32ValueSize = WILC_ADD_STA_LENGTH + pstrStationParam->u8NumRates;
3289
Glen Leef3052582015-09-10 12:03:04 +09003290 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003291 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003292 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003293
3294 pu8CurrByte = strWID.ps8WidVal;
3295 pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
3296
3297 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003298 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3299 get_id_from_handler(pstrWFIDrv));
Leo Kime6e12662015-09-16 18:36:03 +09003300 if (s32Error != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003301 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003302
Leo Kim24db7132015-09-16 18:36:01 +09003303ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003304 kfree(pstrStationParam->pu8Rates);
3305 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003306}
3307
3308/**
3309 * @brief Handle_DelAllSta
3310 * @details Sending config packet to delete station
3311 * @param[in] tstrHostIFDelSta* pstrDelStaParam
3312 * @return NONE
3313 * @author
3314 * @date
3315 * @version 1.0
3316 */
Tony Chob4e644e2015-09-21 12:17:00 +09003317static void Handle_DelAllSta(tstrWILC_WFIDrv *drvHandler,
3318 struct del_all_sta *pstrDelAllStaParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003319{
Leo Kime6e12662015-09-16 18:36:03 +09003320 s32 s32Error = 0;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003321
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003322 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003323 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003324 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003325 u8 i;
Chaehyun Lim37034802015-06-11 14:34:32 +09003326 u8 au8Zero_Buff[6] = {0};
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003327
Chaehyun Limd85f5322015-06-11 14:35:54 +09003328 strWID.u16WIDid = (u16)WID_DEL_ALL_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003329 strWID.enuWIDtype = WID_STR;
3330 strWID.s32ValueSize = (pstrDelAllStaParam->u8Num_AssocSta * ETH_ALEN) + 1;
3331
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003332 PRINT_D(HOSTINF_DBG, "Handling delete station\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003333
Glen Leef3052582015-09-10 12:03:04 +09003334 strWID.ps8WidVal = kmalloc((pstrDelAllStaParam->u8Num_AssocSta * ETH_ALEN) + 1, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003335 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003336 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003337
3338 pu8CurrByte = strWID.ps8WidVal;
3339
3340 *(pu8CurrByte++) = pstrDelAllStaParam->u8Num_AssocSta;
3341
3342 for (i = 0; i < MAX_NUM_STA; i++) {
3343 if (memcmp(pstrDelAllStaParam->au8Sta_DelAllSta[i], au8Zero_Buff, ETH_ALEN))
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003344 memcpy(pu8CurrByte, pstrDelAllStaParam->au8Sta_DelAllSta[i], ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003345 else
3346 continue;
3347
3348 pu8CurrByte += ETH_ALEN;
3349 }
3350
3351 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003352 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3353 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003354 if (s32Error)
Luis de Bethencourt83cc9be2015-06-26 16:47:28 +02003355 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003356
Leo Kim24db7132015-09-16 18:36:01 +09003357ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003358 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003359
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003360 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003361}
3362
3363
3364/**
3365 * @brief Handle_DelStation
3366 * @details Sending config packet to delete station
Tony Chofb93a1e2015-09-21 12:16:57 +09003367 * @param[in] struct del_sta *pstrDelStaParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003368 * @return NONE
3369 * @author
3370 * @date
3371 * @version 1.0
3372 */
Tony Chofb93a1e2015-09-21 12:16:57 +09003373static void Handle_DelStation(tstrWILC_WFIDrv *drvHandler,
3374 struct del_sta *pstrDelStaParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003375{
Leo Kime6e12662015-09-16 18:36:03 +09003376 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003377 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003378 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003379 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3380
Chaehyun Limd85f5322015-06-11 14:35:54 +09003381 strWID.u16WIDid = (u16)WID_REMOVE_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003382 strWID.enuWIDtype = WID_BIN;
3383 strWID.s32ValueSize = ETH_ALEN;
3384
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003385 PRINT_D(HOSTINF_DBG, "Handling delete station\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003386
Glen Leef3052582015-09-10 12:03:04 +09003387 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003388 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003389 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003390
3391 pu8CurrByte = strWID.ps8WidVal;
3392
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003393 memcpy(pu8CurrByte, pstrDelStaParam->au8MacAddr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003394
3395 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003396 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3397 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003398 if (s32Error)
Luis de Bethencourt83cc9be2015-06-26 16:47:28 +02003399 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003400
Leo Kim24db7132015-09-16 18:36:01 +09003401ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003402 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003403}
3404
3405
3406/**
3407 * @brief Handle_EditStation
3408 * @details Sending config packet to edit station
Tony Cho6a89ba92015-09-21 12:16:46 +09003409 * @param[in] struct add_sta_param *pstrStationParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003410 * @return NONE
3411 * @author
3412 * @date
3413 * @version 1.0
3414 */
Tony Cho6a89ba92015-09-21 12:16:46 +09003415static void Handle_EditStation(tstrWILC_WFIDrv *drvHandler,
3416 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003417{
Leo Kime6e12662015-09-16 18:36:03 +09003418 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003419 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003420 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003421 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3422
Chaehyun Limd85f5322015-06-11 14:35:54 +09003423 strWID.u16WIDid = (u16)WID_EDIT_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003424 strWID.enuWIDtype = WID_BIN;
3425 strWID.s32ValueSize = WILC_ADD_STA_LENGTH + pstrStationParam->u8NumRates;
3426
3427 PRINT_D(HOSTINF_DBG, "Handling edit station\n");
Glen Leef3052582015-09-10 12:03:04 +09003428 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003429 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003430 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003431
3432 pu8CurrByte = strWID.ps8WidVal;
3433 pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
3434
3435 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003436 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3437 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003438 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003439 PRINT_ER("Failed to send edit station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003440
Leo Kim24db7132015-09-16 18:36:01 +09003441ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003442 kfree(pstrStationParam->pu8Rates);
3443 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003444}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003445
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003446/**
3447 * @brief Handle_RemainOnChan
3448 * @details Sending config packet to edit station
3449 * @param[in] tstrWILC_AddStaParam* pstrStationParam
3450 * @return NONE
3451 * @author
3452 * @date
3453 * @version 1.0
3454 */
Tony Cho2f9c03f2015-09-21 12:16:58 +09003455static int Handle_RemainOnChan(tstrWILC_WFIDrv *drvHandler,
3456 struct remain_ch *pstrHostIfRemainOnChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003457{
Leo Kime6e12662015-09-16 18:36:03 +09003458 s32 s32Error = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003459 u8 u8remain_on_chan_flag;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003460 tstrWID strWID;
3461 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
3462
3463 /*If it's a pendig remain-on-channel, don't overwrite gWFiDrvHandle values (since incoming msg is garbbage)*/
3464 if (!pstrWFIDrv->u8RemainOnChan_pendingreq) {
3465 pstrWFIDrv->strHostIfRemainOnChan.pVoid = pstrHostIfRemainOnChan->pVoid;
3466 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanExpired = pstrHostIfRemainOnChan->pRemainOnChanExpired;
3467 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanReady = pstrHostIfRemainOnChan->pRemainOnChanReady;
3468 pstrWFIDrv->strHostIfRemainOnChan.u16Channel = pstrHostIfRemainOnChan->u16Channel;
3469 pstrWFIDrv->strHostIfRemainOnChan.u32ListenSessionID = pstrHostIfRemainOnChan->u32ListenSessionID;
3470 } else {
3471 /*Set the channel to use it as a wid val*/
3472 pstrHostIfRemainOnChan->u16Channel = pstrWFIDrv->strHostIfRemainOnChan.u16Channel;
3473 }
3474
3475 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult != NULL) {
3476 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while scanning return\n");
3477 pstrWFIDrv->u8RemainOnChan_pendingreq = 1;
Leo Kim24db7132015-09-16 18:36:01 +09003478 s32Error = -EBUSY;
3479 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003480 }
3481 if (pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
3482 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while connecting return\n");
Leo Kim24db7132015-09-16 18:36:01 +09003483 s32Error = -EBUSY;
3484 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003485 }
3486
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003487 if (g_obtainingIP || connecting) {
3488 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
Leo Kim24db7132015-09-16 18:36:01 +09003489 s32Error = -EBUSY;
3490 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003491 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003492
3493 PRINT_D(HOSTINF_DBG, "Setting channel :%d\n", pstrHostIfRemainOnChan->u16Channel);
3494
Dean Lee72ed4dc2015-06-12 14:11:44 +09003495 u8remain_on_chan_flag = true;
Chaehyun Limd85f5322015-06-11 14:35:54 +09003496 strWID.u16WIDid = (u16)WID_REMAIN_ON_CHAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003497 strWID.enuWIDtype = WID_STR;
3498 strWID.s32ValueSize = 2;
Glen Leef3052582015-09-10 12:03:04 +09003499 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003500
Leo Kim24db7132015-09-16 18:36:01 +09003501 if (strWID.ps8WidVal == NULL) {
3502 s32Error = -ENOMEM;
3503 goto ERRORHANDLER;
3504 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003505
3506 strWID.ps8WidVal[0] = u8remain_on_chan_flag;
Chaehyun Limca356ad2015-06-11 14:35:57 +09003507 strWID.ps8WidVal[1] = (s8)pstrHostIfRemainOnChan->u16Channel;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003508
3509 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003510 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3511 get_id_from_handler(pstrWFIDrv));
Leo Kime6e12662015-09-16 18:36:03 +09003512 if (s32Error != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003513 PRINT_ER("Failed to set remain on channel\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003514
Leo Kim24db7132015-09-16 18:36:01 +09003515ERRORHANDLER:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003516 {
3517 P2P_LISTEN_STATE = 1;
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07003518 pstrWFIDrv->hRemainOnChannel.data = (unsigned long)pstrWFIDrv;
3519 mod_timer(&pstrWFIDrv->hRemainOnChannel,
3520 jiffies +
3521 msecs_to_jiffies(pstrHostIfRemainOnChan->u32duration));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003522
3523 /*Calling CFG ready_on_channel*/
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003524 if (pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanReady)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003525 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanReady(pstrWFIDrv->strHostIfRemainOnChan.pVoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003526
3527 if (pstrWFIDrv->u8RemainOnChan_pendingreq)
3528 pstrWFIDrv->u8RemainOnChan_pendingreq = 0;
3529 }
3530 return s32Error;
3531}
3532
3533/**
3534 * @brief Handle_RegisterFrame
3535 * @details
3536 * @param[in]
3537 * @return NONE
3538 * @author
3539 * @date
3540 * @version 1.0
3541 */
Tony Chobc37c5d2015-09-21 12:16:59 +09003542static int Handle_RegisterFrame(tstrWILC_WFIDrv *drvHandler,
3543 struct reg_frame *pstrHostIfRegisterFrame)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003544{
Leo Kime6e12662015-09-16 18:36:03 +09003545 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003546 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003547 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003548 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3549
3550 PRINT_D(HOSTINF_DBG, "Handling frame register Flag : %d FrameType: %d\n", pstrHostIfRegisterFrame->bReg, pstrHostIfRegisterFrame->u16FrameType);
3551
3552 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +09003553 strWID.u16WIDid = (u16)WID_REGISTER_FRAME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003554 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003555 strWID.ps8WidVal = kmalloc(sizeof(u16) + 2, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003556 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003557 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003558
3559 pu8CurrByte = strWID.ps8WidVal;
3560
3561 *pu8CurrByte++ = pstrHostIfRegisterFrame->bReg;
3562 *pu8CurrByte++ = pstrHostIfRegisterFrame->u8Regid;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003563 memcpy(pu8CurrByte, &(pstrHostIfRegisterFrame->u16FrameType), sizeof(u16));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003564
3565
Chaehyun Limd85f5322015-06-11 14:35:54 +09003566 strWID.s32ValueSize = sizeof(u16) + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003567
3568
3569 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003570 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3571 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003572 if (s32Error) {
3573 PRINT_ER("Failed to frame register config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +09003574 s32Error = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003575 }
3576
3577 return s32Error;
3578
3579}
3580
3581/**
3582 * @brief Handle_ListenStateExpired
3583 * @details Handle of listen state expiration
3584 * @param[in] NONE
3585 * @return Error code.
3586 * @author
3587 * @date
3588 * @version 1.0
3589 */
3590#define FALSE_FRMWR_CHANNEL 100
Tony Cho2f9c03f2015-09-21 12:16:58 +09003591static u32 Handle_ListenStateExpired(tstrWILC_WFIDrv *drvHandler,
3592 struct remain_ch *pstrHostIfRemainOnChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003593{
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003594 u8 u8remain_on_chan_flag;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003595 tstrWID strWID;
Leo Kime6e12662015-09-16 18:36:03 +09003596 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003597 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
3598
3599 PRINT_D(HOSTINF_DBG, "CANCEL REMAIN ON CHAN\n");
3600
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003601 /*Make sure we are already in listen state*/
3602 /*This is to handle duplicate expiry messages (listen timer fired and supplicant called cancel_remain_on_channel())*/
3603 if (P2P_LISTEN_STATE) {
Dean Lee72ed4dc2015-06-12 14:11:44 +09003604 u8remain_on_chan_flag = false;
Chaehyun Limd85f5322015-06-11 14:35:54 +09003605 strWID.u16WIDid = (u16)WID_REMAIN_ON_CHAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003606 strWID.enuWIDtype = WID_STR;
3607 strWID.s32ValueSize = 2;
Glen Leef3052582015-09-10 12:03:04 +09003608 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003609
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003610 if (strWID.ps8WidVal == NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003611 PRINT_ER("Failed to allocate memory\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003612
3613 strWID.ps8WidVal[0] = u8remain_on_chan_flag;
3614 strWID.ps8WidVal[1] = FALSE_FRMWR_CHANNEL;
3615
3616 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003617 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3618 get_id_from_handler(pstrWFIDrv));
Leo Kime6e12662015-09-16 18:36:03 +09003619 if (s32Error != 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003620 PRINT_ER("Failed to set remain on channel\n");
3621 goto _done_;
3622 }
3623
3624 if (pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanExpired) {
3625 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanExpired(pstrWFIDrv->strHostIfRemainOnChan.pVoid
3626 , pstrHostIfRemainOnChan->u32ListenSessionID);
3627 }
3628 P2P_LISTEN_STATE = 0;
3629 } else {
3630 PRINT_D(GENERIC_DBG, "Not in listen state\n");
Leo Kime6e12662015-09-16 18:36:03 +09003631 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003632 }
3633
3634_done_:
3635 return s32Error;
3636}
3637
3638
3639/**
3640 * @brief ListenTimerCB
3641 * @details Callback function of remain-on-channel timer
3642 * @param[in] NONE
3643 * @return Error code.
3644 * @author
3645 * @date
3646 * @version 1.0
3647 */
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003648static void ListenTimerCB(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003649{
Leo Kime6e12662015-09-16 18:36:03 +09003650 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003651 struct host_if_msg msg;
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003652 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)arg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003653 /*Stopping remain-on-channel timer*/
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07003654 del_timer(&pstrWFIDrv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003655
3656 /* prepare the Timer Callback message */
Tony Cho143eb952015-09-21 12:16:32 +09003657 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003658 msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
Tony Cho143eb952015-09-21 12:16:32 +09003659 msg.drvHandler = pstrWFIDrv;
Tony Cho070d3652015-09-30 18:55:10 +09003660 msg.body.remain_on_ch.u32ListenSessionID = pstrWFIDrv->strHostIfRemainOnChan.u32ListenSessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003661
3662 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09003663 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003664 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09003665 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003666}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003667
3668/**
3669 * @brief Handle_EditStation
3670 * @details Sending config packet to edit station
3671 * @param[in] tstrWILC_AddStaParam* pstrStationParam
3672 * @return NONE
3673 * @author
3674 * @date
3675 * @version 1.0
3676 */
Tony Cho5a008f12015-09-21 12:16:48 +09003677static void Handle_PowerManagement(tstrWILC_WFIDrv *drvHandler,
3678 struct power_mgmt_param *strPowerMgmtParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003679{
Leo Kime6e12662015-09-16 18:36:03 +09003680 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003681 tstrWID strWID;
Chaehyun Limca356ad2015-06-11 14:35:57 +09003682 s8 s8PowerMode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003683 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003684
Chaehyun Limd85f5322015-06-11 14:35:54 +09003685 strWID.u16WIDid = (u16)WID_POWER_MANAGEMENT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003686
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05303687 if (strPowerMgmtParam->bIsEnabled == true)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003688 s8PowerMode = MIN_FAST_PS;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05303689 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003690 s8PowerMode = NO_POWERSAVE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003691 PRINT_D(HOSTINF_DBG, "Handling power mgmt to %d\n", s8PowerMode);
3692 strWID.ps8WidVal = &s8PowerMode;
Dean Lee576917a2015-06-15 11:58:57 +09003693 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003694
3695 PRINT_D(HOSTINF_DBG, "Handling Power Management\n");
3696
3697 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003698 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3699 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003700 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003701 PRINT_ER("Failed to send power management config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003702}
3703
3704/**
3705 * @brief Handle_SetMulticastFilter
3706 * @details Set Multicast filter in firmware
Tony Cho641210a2015-09-21 12:16:52 +09003707 * @param[in] struct set_multicast *strHostIfSetMulti
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003708 * @return NONE
3709 * @author asobhy
3710 * @date
3711 * @version 1.0
3712 */
Tony Cho641210a2015-09-21 12:16:52 +09003713static void Handle_SetMulticastFilter(tstrWILC_WFIDrv *drvHandler,
3714 struct set_multicast *strHostIfSetMulti)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003715{
Leo Kime6e12662015-09-16 18:36:03 +09003716 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003717 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003718 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003719
3720 PRINT_D(HOSTINF_DBG, "Setup Multicast Filter\n");
3721
Chaehyun Limd85f5322015-06-11 14:35:54 +09003722 strWID.u16WIDid = (u16)WID_SETUP_MULTICAST_FILTER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003723 strWID.enuWIDtype = WID_BIN;
Tony Cho641210a2015-09-21 12:16:52 +09003724 strWID.s32ValueSize = sizeof(struct set_multicast) + ((strHostIfSetMulti->u32count) * ETH_ALEN);
Glen Leef3052582015-09-10 12:03:04 +09003725 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003726 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003727 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003728
3729 pu8CurrByte = strWID.ps8WidVal;
3730 *pu8CurrByte++ = (strHostIfSetMulti->bIsEnabled & 0xFF);
3731 *pu8CurrByte++ = ((strHostIfSetMulti->bIsEnabled >> 8) & 0xFF);
3732 *pu8CurrByte++ = ((strHostIfSetMulti->bIsEnabled >> 16) & 0xFF);
3733 *pu8CurrByte++ = ((strHostIfSetMulti->bIsEnabled >> 24) & 0xFF);
3734
3735 *pu8CurrByte++ = (strHostIfSetMulti->u32count & 0xFF);
3736 *pu8CurrByte++ = ((strHostIfSetMulti->u32count >> 8) & 0xFF);
3737 *pu8CurrByte++ = ((strHostIfSetMulti->u32count >> 16) & 0xFF);
3738 *pu8CurrByte++ = ((strHostIfSetMulti->u32count >> 24) & 0xFF);
3739
3740 if ((strHostIfSetMulti->u32count) > 0)
3741 memcpy(pu8CurrByte, gau8MulticastMacAddrList, ((strHostIfSetMulti->u32count) * ETH_ALEN));
3742
3743 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003744 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3745 get_id_from_handler(drvHandler));
Leo Kim24db7132015-09-16 18:36:01 +09003746 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003747 PRINT_ER("Failed to send setup multicast config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003748
Leo Kim24db7132015-09-16 18:36:01 +09003749ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003750 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003751
3752}
3753
3754
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003755/**
3756 * @brief Handle_AddBASession
3757 * @details Add block ack session
3758 * @param[in] tstrHostIFSetMulti* strHostIfSetMulti
3759 * @return NONE
3760 * @author Amr Abdel-Moghny
3761 * @date Feb. 2014
3762 * @version 9.0
3763 */
Tony Cho54265472015-09-21 12:16:56 +09003764static s32 Handle_AddBASession(tstrWILC_WFIDrv *drvHandler,
3765 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003766{
Leo Kime6e12662015-09-16 18:36:03 +09003767 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003768 tstrWID strWID;
3769 int AddbaTimeout = 100;
3770 char *ptr = NULL;
3771 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3772
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003773 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 +09003774 strHostIfBASessionInfo->au8Bssid[0],
3775 strHostIfBASessionInfo->au8Bssid[1],
3776 strHostIfBASessionInfo->au8Bssid[2],
3777 strHostIfBASessionInfo->u16BufferSize,
3778 strHostIfBASessionInfo->u16SessionTimeout,
3779 strHostIfBASessionInfo->u8Ted);
3780
Chaehyun Limd85f5322015-06-11 14:35:54 +09003781 strWID.u16WIDid = (u16)WID_11E_P_ACTION_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003782 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003783 strWID.ps8WidVal = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003784 strWID.s32ValueSize = BLOCK_ACK_REQ_SIZE;
3785 ptr = strWID.ps8WidVal;
3786 /* *ptr++ = 0x14; */
3787 *ptr++ = 0x14;
3788 *ptr++ = 0x3;
3789 *ptr++ = 0x0;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003790 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003791 ptr += ETH_ALEN;
3792 *ptr++ = strHostIfBASessionInfo->u8Ted;
3793 /* BA Policy*/
3794 *ptr++ = 1;
3795 /* Buffer size*/
3796 *ptr++ = (strHostIfBASessionInfo->u16BufferSize & 0xFF);
3797 *ptr++ = ((strHostIfBASessionInfo->u16BufferSize >> 16) & 0xFF);
3798 /* BA timeout*/
3799 *ptr++ = (strHostIfBASessionInfo->u16SessionTimeout & 0xFF);
3800 *ptr++ = ((strHostIfBASessionInfo->u16SessionTimeout >> 16) & 0xFF);
3801 /* ADDBA timeout*/
3802 *ptr++ = (AddbaTimeout & 0xFF);
3803 *ptr++ = ((AddbaTimeout >> 16) & 0xFF);
3804 /* Group Buffer Max Frames*/
3805 *ptr++ = 8;
3806 /* Group Buffer Timeout */
3807 *ptr++ = 0;
3808
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003809 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3810 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003811 if (s32Error)
3812 PRINT_D(HOSTINF_DBG, "Couldn't open BA Session\n");
3813
3814
Chaehyun Limd85f5322015-06-11 14:35:54 +09003815 strWID.u16WIDid = (u16)WID_11E_P_ACTION_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003816 strWID.enuWIDtype = WID_STR;
3817 strWID.s32ValueSize = 15;
3818 ptr = strWID.ps8WidVal;
3819 /* *ptr++ = 0x14; */
3820 *ptr++ = 15;
3821 *ptr++ = 7;
3822 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003823 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003824 ptr += ETH_ALEN;
3825 /* TID*/
3826 *ptr++ = strHostIfBASessionInfo->u8Ted;
3827 /* Max Num MSDU */
3828 *ptr++ = 8;
3829 /* BA timeout*/
3830 *ptr++ = (strHostIfBASessionInfo->u16BufferSize & 0xFF);
3831 *ptr++ = ((strHostIfBASessionInfo->u16SessionTimeout >> 16) & 0xFF);
3832 /*Ack-Policy */
3833 *ptr++ = 3;
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003834 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3835 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003836
3837 if (strWID.ps8WidVal != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09003838 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003839
3840 return s32Error;
3841
3842}
3843
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003844/**
3845 * @brief Handle_DelAllRxBASessions
3846 * @details Delete all Rx BA sessions
3847 * @param[in] tstrHostIFSetMulti* strHostIfSetMulti
3848 * @return NONE
3849 * @author Abdelrahman Sobhy
3850 * @date Feb. 2013
3851 * @version 9.0
3852 */
Tony Cho54265472015-09-21 12:16:56 +09003853static s32 Handle_DelAllRxBASessions(tstrWILC_WFIDrv *drvHandler,
3854 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003855{
Leo Kime6e12662015-09-16 18:36:03 +09003856 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003857 tstrWID strWID;
3858 char *ptr = NULL;
3859 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3860
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003861 PRINT_D(GENERIC_DBG, "Delete Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\n",
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003862 strHostIfBASessionInfo->au8Bssid[0],
3863 strHostIfBASessionInfo->au8Bssid[1],
3864 strHostIfBASessionInfo->au8Bssid[2],
3865 strHostIfBASessionInfo->u8Ted);
3866
Chaehyun Limd85f5322015-06-11 14:35:54 +09003867 strWID.u16WIDid = (u16)WID_DEL_ALL_RX_BA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003868 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003869 strWID.ps8WidVal = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003870 strWID.s32ValueSize = BLOCK_ACK_REQ_SIZE;
3871 ptr = strWID.ps8WidVal;
3872 *ptr++ = 0x14;
3873 *ptr++ = 0x3;
3874 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003875 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003876 ptr += ETH_ALEN;
3877 *ptr++ = strHostIfBASessionInfo->u8Ted;
3878 /* BA direction = recipent*/
3879 *ptr++ = 0;
3880 /* Delba Reason */
3881 *ptr++ = 32; /* Unspecific QOS reason */
3882
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003883 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3884 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003885 if (s32Error)
3886 PRINT_D(HOSTINF_DBG, "Couldn't delete BA Session\n");
3887
3888
3889 if (strWID.ps8WidVal != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09003890 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003891
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003892 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003893
3894 return s32Error;
3895
3896}
3897
3898/**
3899 * @brief hostIFthread
3900 * @details Main thread to handle message queue requests
3901 * @param[in] void* pvArg
3902 * @return NONE
3903 * @author
3904 * @date
3905 * @version 1.0
3906 */
Arnd Bergmann1999bd52015-05-29 22:52:14 +02003907static int hostIFthread(void *pvArg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003908{
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003909 u32 u32Ret;
Tony Cho143eb952015-09-21 12:16:32 +09003910 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003911 tstrWILC_WFIDrv *pstrWFIDrv;
3912
Tony Cho143eb952015-09-21 12:16:32 +09003913 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003914
3915 while (1) {
Tony Cho143eb952015-09-21 12:16:32 +09003916 wilc_mq_recv(&gMsgQHostIF, &msg, sizeof(struct host_if_msg), &u32Ret);
3917 pstrWFIDrv = (tstrWILC_WFIDrv *)msg.drvHandler;
Tony Choa9f812a2015-09-21 12:16:33 +09003918 if (msg.id == HOST_IF_MSG_EXIT) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003919 PRINT_D(GENERIC_DBG, "THREAD: Exiting HostIfThread\n");
3920 break;
3921 }
3922
3923
3924 /*Re-Queue HIF message*/
3925 if ((!g_wilc_initialized)) {
3926 PRINT_D(GENERIC_DBG, "--WAIT--");
Greg Kroah-Hartman80e29c72015-08-14 19:42:23 -07003927 usleep_range(200 * 1000, 200 * 1000);
Tony Cho143eb952015-09-21 12:16:32 +09003928 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003929 continue;
3930 }
3931
Tony Choa9f812a2015-09-21 12:16:33 +09003932 if (msg.id == HOST_IF_MSG_CONNECT && pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult != NULL) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003933 PRINT_D(HOSTINF_DBG, "Requeue connect request till scan done received\n");
Tony Cho143eb952015-09-21 12:16:32 +09003934 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Greg Kroah-Hartman80e29c72015-08-14 19:42:23 -07003935 usleep_range(2 * 1000, 2 * 1000);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003936 continue;
3937 }
3938
Tony Choa9f812a2015-09-21 12:16:33 +09003939 switch (msg.id) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003940 case HOST_IF_MSG_Q_IDLE:
3941 Handle_wait_msg_q_empty();
3942 break;
3943
3944 case HOST_IF_MSG_SCAN:
Tony Cho4528bdb2015-09-30 18:44:20 +09003945 Handle_Scan(msg.drvHandler, &msg.body.scan_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003946 break;
3947
3948 case HOST_IF_MSG_CONNECT:
Tony Cho3f501972015-09-30 18:44:21 +09003949 Handle_Connect(msg.drvHandler, &msg.body.con_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003950 break;
3951
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003952 case HOST_IF_MSG_FLUSH_CONNECT:
Tony Cho143eb952015-09-21 12:16:32 +09003953 Handle_FlushConnect(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003954 break;
3955
3956 case HOST_IF_MSG_RCVD_NTWRK_INFO:
Tony Cho02d19462015-09-30 18:44:22 +09003957 Handle_RcvdNtwrkInfo(msg.drvHandler, &msg.body.net_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003958 break;
3959
3960 case HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO:
Tony Cho66add622015-09-30 18:44:23 +09003961 Handle_RcvdGnrlAsyncInfo(msg.drvHandler, &msg.body.async_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003962 break;
3963
3964 case HOST_IF_MSG_KEY:
Tony Cho18990bf2015-09-30 18:44:24 +09003965 Handle_Key(msg.drvHandler, &msg.body.key_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003966 break;
3967
3968 case HOST_IF_MSG_CFG_PARAMS:
3969
Tony Choa2340c32015-09-30 18:44:25 +09003970 Handle_CfgParam(msg.drvHandler, &msg.body.cfg_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003971 break;
3972
3973 case HOST_IF_MSG_SET_CHANNEL:
Tony Choffd6dbc2015-09-30 18:44:28 +09003974 Handle_SetChannel(msg.drvHandler, &msg.body.channel_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003975 break;
3976
3977 case HOST_IF_MSG_DISCONNECT:
Tony Cho143eb952015-09-21 12:16:32 +09003978 Handle_Disconnect(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003979 break;
3980
3981 case HOST_IF_MSG_RCVD_SCAN_COMPLETE:
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07003982 del_timer(&pstrWFIDrv->hScanTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003983 PRINT_D(HOSTINF_DBG, "scan completed successfully\n");
3984
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003985 /*Allow chip sleep, only if both interfaces are not connected*/
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003986 if (!linux_wlan_get_num_conn_ifcs())
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003987 chip_sleep_manually(INFINITE_SLEEP_TIME);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003988
Tony Cho143eb952015-09-21 12:16:32 +09003989 Handle_ScanDone(msg.drvHandler, SCAN_EVENT_DONE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003990
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003991 if (pstrWFIDrv->u8RemainOnChan_pendingreq)
Tony Cho070d3652015-09-30 18:55:10 +09003992 Handle_RemainOnChan(msg.drvHandler, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003993
3994 break;
3995
3996 case HOST_IF_MSG_GET_RSSI:
Tony Cho143eb952015-09-21 12:16:32 +09003997 Handle_GetRssi(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003998 break;
3999
4000 case HOST_IF_MSG_GET_LINKSPEED:
Tony Cho143eb952015-09-21 12:16:32 +09004001 Handle_GetLinkspeed(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004002 break;
4003
4004 case HOST_IF_MSG_GET_STATISTICS:
Tony Choe60831e2015-10-05 13:50:45 +09004005 Handle_GetStatistics(msg.drvHandler, (tstrStatistics *)msg.body.data);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004006 break;
4007
4008 case HOST_IF_MSG_GET_CHNL:
Tony Cho143eb952015-09-21 12:16:32 +09004009 Handle_GetChnl(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004010 break;
4011
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004012 case HOST_IF_MSG_ADD_BEACON:
Tony Choa98491e2015-09-30 18:44:31 +09004013 Handle_AddBeacon(msg.drvHandler, &msg.body.beacon_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004014 break;
4015
4016 case HOST_IF_MSG_DEL_BEACON:
Tony Cho80bf88362015-09-30 18:44:29 +09004017 Handle_DelBeacon(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004018 break;
4019
4020 case HOST_IF_MSG_ADD_STATION:
Tony Choca8f47f2015-09-30 18:44:32 +09004021 Handle_AddStation(msg.drvHandler, &msg.body.add_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004022 break;
4023
4024 case HOST_IF_MSG_DEL_STATION:
Tony Cho889c25b2015-09-30 18:44:33 +09004025 Handle_DelStation(msg.drvHandler, &msg.body.del_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004026 break;
4027
4028 case HOST_IF_MSG_EDIT_STATION:
Tony Cho4a930962015-09-30 18:44:34 +09004029 Handle_EditStation(msg.drvHandler, &msg.body.edit_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004030 break;
4031
4032 case HOST_IF_MSG_GET_INACTIVETIME:
Tony Cho66bac7f2015-09-30 18:44:37 +09004033 Handle_Get_InActiveTime(msg.drvHandler, &msg.body.mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004034 break;
4035
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004036 case HOST_IF_MSG_SCAN_TIMER_FIRED:
4037 PRINT_D(HOSTINF_DBG, "Scan Timeout\n");
4038
Tony Cho143eb952015-09-21 12:16:32 +09004039 Handle_ScanDone(msg.drvHandler, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004040 break;
4041
4042 case HOST_IF_MSG_CONNECT_TIMER_FIRED:
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004043 PRINT_D(HOSTINF_DBG, "Connect Timeout\n");
Tony Cho143eb952015-09-21 12:16:32 +09004044 Handle_ConnectTimeout(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004045 break;
4046
4047 case HOST_IF_MSG_POWER_MGMT:
Tony Cho49e1f812015-09-30 18:44:36 +09004048 Handle_PowerManagement(msg.drvHandler, &msg.body.pwr_mgmt_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004049 break;
4050
4051 case HOST_IF_MSG_SET_WFIDRV_HANDLER:
Tony Cho143eb952015-09-21 12:16:32 +09004052 Handle_SetWfiDrvHandler(msg.drvHandler,
Tony Cho5e4377e2015-09-30 18:44:38 +09004053 &msg.body.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004054 break;
4055
4056 case HOST_IF_MSG_SET_OPERATION_MODE:
Tony Cho00c46302015-09-30 18:55:06 +09004057 Handle_SetOperationMode(msg.drvHandler, &msg.body.mode);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004058 break;
4059
4060 case HOST_IF_MSG_SET_IPADDRESS:
4061 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
Tony Chofb2d65e2015-09-30 18:44:39 +09004062 Handle_set_IPAddress(msg.drvHandler, msg.body.ip_info.au8IPAddr, msg.body.ip_info.idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004063 break;
4064
4065 case HOST_IF_MSG_GET_IPADDRESS:
4066 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
Tony Chofb2d65e2015-09-30 18:44:39 +09004067 Handle_get_IPAddress(msg.drvHandler, msg.body.ip_info.au8IPAddr, msg.body.ip_info.idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004068 break;
4069
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004070 case HOST_IF_MSG_SET_MAC_ADDRESS:
Tony Cho15326e22015-09-30 18:55:07 +09004071 Handle_SetMacAddress(msg.drvHandler, &msg.body.set_mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004072 break;
4073
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004074 case HOST_IF_MSG_GET_MAC_ADDRESS:
Tony Choa5848692015-09-30 18:55:08 +09004075 Handle_GetMacAddress(msg.drvHandler, &msg.body.get_mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004076 break;
4077
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004078 case HOST_IF_MSG_REMAIN_ON_CHAN:
4079 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REMAIN_ON_CHAN\n");
Tony Cho070d3652015-09-30 18:55:10 +09004080 Handle_RemainOnChan(msg.drvHandler, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004081 break;
4082
4083 case HOST_IF_MSG_REGISTER_FRAME:
4084 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REGISTER_FRAME\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09004085 Handle_RegisterFrame(msg.drvHandler, &msg.body.reg_frame);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004086 break;
4087
4088 case HOST_IF_MSG_LISTEN_TIMER_FIRED:
Tony Cho070d3652015-09-30 18:55:10 +09004089 Handle_ListenStateExpired(msg.drvHandler, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004090 break;
4091
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004092 case HOST_IF_MSG_SET_MULTICAST_FILTER:
4093 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_MULTICAST_FILTER\n");
Tony Choa079cf4d2015-09-30 18:55:05 +09004094 Handle_SetMulticastFilter(msg.drvHandler, &msg.body.multicast_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004095 break;
4096
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004097 case HOST_IF_MSG_ADD_BA_SESSION:
Tony Choc833b472015-09-30 18:55:09 +09004098 Handle_AddBASession(msg.drvHandler, &msg.body.session_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004099 break;
4100
4101 case HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS:
Tony Choc833b472015-09-30 18:55:09 +09004102 Handle_DelAllRxBASessions(msg.drvHandler, &msg.body.session_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004103 break;
4104
4105 case HOST_IF_MSG_DEL_ALL_STA:
Tony Chob0c1e802015-10-05 13:50:46 +09004106 Handle_DelAllSta(msg.drvHandler, &msg.body.del_all_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004107 break;
4108
4109 default:
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004110 PRINT_ER("[Host Interface] undefined Received Msg ID\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004111 break;
4112 }
4113 }
4114
4115 PRINT_D(HOSTINF_DBG, "Releasing thread exit semaphore\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004116 up(&hSemHostIFthrdEnd);
Arnd Bergmann1999bd52015-05-29 22:52:14 +02004117 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004118}
4119
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004120static void TimerCB_Scan(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004121{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004122 void *pvArg = (void *)arg;
Tony Cho143eb952015-09-21 12:16:32 +09004123 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004124
4125 /* prepare the Timer Callback message */
Tony Cho143eb952015-09-21 12:16:32 +09004126 memset(&msg, 0, sizeof(struct host_if_msg));
4127 msg.drvHandler = pvArg;
Tony Choa9f812a2015-09-21 12:16:33 +09004128 msg.id = HOST_IF_MSG_SCAN_TIMER_FIRED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004129
4130 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004131 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004132}
4133
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004134static void TimerCB_Connect(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004135{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004136 void *pvArg = (void *)arg;
Tony Cho143eb952015-09-21 12:16:32 +09004137 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004138
4139 /* prepare the Timer Callback message */
Tony Cho143eb952015-09-21 12:16:32 +09004140 memset(&msg, 0, sizeof(struct host_if_msg));
4141 msg.drvHandler = pvArg;
Tony Choa9f812a2015-09-21 12:16:33 +09004142 msg.id = HOST_IF_MSG_CONNECT_TIMER_FIRED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004143
4144 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004145 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004146}
4147
4148
4149/**
4150 * @brief removes wpa/wpa2 keys
4151 * @details only in BSS STA mode if External Supplicant support is enabled.
4152 * removes all WPA/WPA2 station key entries from MAC hardware.
4153 * @param[in,out] handle to the wifi driver
4154 * @param[in] 6 bytes of Station Adress in the station entry table
4155 * @return Error code indicating success/failure
4156 * @note
4157 * @author zsalah
4158 * @date 8 March 2012
4159 * @version 1.0
4160 */
4161/* Check implementation in core adding 9 bytes to the input! */
Johnny Kim218dc402015-08-13 13:41:19 +09004162s32 host_int_remove_key(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8StaAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004163{
Leo Kime6e12662015-09-16 18:36:03 +09004164 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004165 tstrWID strWID;
4166 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4167
Chaehyun Limd85f5322015-06-11 14:35:54 +09004168 strWID.u16WIDid = (u16)WID_REMOVE_KEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004169 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09004170 strWID.ps8WidVal = (s8 *)pu8StaAddress;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004171 strWID.s32ValueSize = 6;
4172
4173 return s32Error;
4174
4175}
4176
4177/**
4178 * @brief removes WEP key
4179 * @details valid only in BSS STA mode if External Supplicant support is enabled.
4180 * remove a WEP key entry from MAC HW.
4181 * The BSS Station automatically finds the index of the entry using its
4182 * BSS ID and removes that entry from the MAC hardware.
4183 * @param[in,out] handle to the wifi driver
4184 * @param[in] 6 bytes of Station Adress in the station entry table
4185 * @return Error code indicating success/failure
4186 * @note NO need for the STA add since it is not used for processing
4187 * @author zsalah
4188 * @date 8 March 2012
4189 * @version 1.0
4190 */
Chaehyun Lim517af2f2015-10-05 19:34:59 +09004191int host_int_remove_wep_key(tstrWILC_WFIDrv *wfi_drv, u8 index)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004192{
Chaehyun Lim33e8ce22015-10-05 19:34:57 +09004193 int s32Error = 0;
Chaehyun Limc54a9fb2015-10-05 19:34:58 +09004194 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)wfi_drv;
Tony Cho143eb952015-09-21 12:16:32 +09004195 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004196
4197
Leo Kim24db7132015-09-16 18:36:01 +09004198 if (pstrWFIDrv == NULL) {
4199 s32Error = -EFAULT;
4200 PRINT_ER("Failed to send setup multicast config packet\n");
4201 return s32Error;
4202 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004203
4204 /* prepare the Remove Wep Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004205 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004206
4207
Tony Choa9f812a2015-09-21 12:16:33 +09004208 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004209 msg.body.key_info.enuKeyType = WEP;
4210 msg.body.key_info.u8KeyAction = REMOVEKEY;
Chaehyun Limc54a9fb2015-10-05 19:34:58 +09004211 msg.drvHandler = wfi_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004212
4213
4214
Tony Cho18990bf2015-09-30 18:44:24 +09004215 msg.body.key_info.
Chaehyun Lim517af2f2015-10-05 19:34:59 +09004216 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = index;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004217
4218 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004219 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004220 if (s32Error)
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004221 PRINT_ER("Error in sending message queue : Request to remove WEP key\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004222 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004223
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004224 return s32Error;
4225}
4226
4227/**
4228 * @brief sets WEP default key
4229 * @details Sets the index of the WEP encryption key in use,
4230 * in the key table
4231 * @param[in,out] handle to the wifi driver
4232 * @param[in] key index ( 0, 1, 2, 3)
4233 * @return Error code indicating success/failure
4234 * @note
4235 * @author zsalah
4236 * @date 8 March 2012
4237 * @version 1.0
4238 */
Johnny Kim218dc402015-08-13 13:41:19 +09004239s32 host_int_set_WEPDefaultKeyID(tstrWILC_WFIDrv *hWFIDrv, u8 u8Index)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004240{
Leo Kime6e12662015-09-16 18:36:03 +09004241 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004242 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004243 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004244
4245
Leo Kim24db7132015-09-16 18:36:01 +09004246 if (pstrWFIDrv == NULL) {
4247 s32Error = -EFAULT;
4248 PRINT_ER("driver is null\n");
4249 return s32Error;
4250 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004251
4252 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004253 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004254
4255
Tony Choa9f812a2015-09-21 12:16:33 +09004256 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004257 msg.body.key_info.enuKeyType = WEP;
4258 msg.body.key_info.u8KeyAction = DEFAULTKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004259 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004260
4261
Tony Cho18990bf2015-09-30 18:44:24 +09004262 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004263 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8Index;
4264
4265 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004266 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004267 if (s32Error)
4268 PRINT_ER("Error in sending message queue : Default key index\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004269 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004270
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004271 return s32Error;
4272}
4273
4274/**
4275 * @brief sets WEP deafault key
4276 * @details valid only in BSS STA mode if External Supplicant support is enabled.
4277 * sets WEP key entry into MAC hardware when it receives the
4278 * corresponding request from NDIS.
4279 * @param[in,out] handle to the wifi driver
4280 * @param[in] message containing WEP Key in the following format
4281 *|---------------------------------------|
4282 *|Key ID Value | Key Length | Key |
4283 *|-------------|------------|------------|
4284 | 1byte | 1byte | Key Length |
4285 ||---------------------------------------|
4286 |
4287 * @return Error code indicating success/failure
4288 * @note
4289 * @author zsalah
4290 * @date 8 March 2012
4291 * @version 1.0
4292 */
Johnny Kim218dc402015-08-13 13:41:19 +09004293s32 host_int_add_wep_key_bss_sta(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8WepKey, u8 u8WepKeylen, u8 u8Keyidx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004294{
4295
Leo Kime6e12662015-09-16 18:36:03 +09004296 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004297 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004298 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004299
Leo Kim24db7132015-09-16 18:36:01 +09004300 if (pstrWFIDrv == NULL) {
4301 s32Error = -EFAULT;
4302 PRINT_ER("driver is null\n");
4303 return s32Error;
4304 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004305
4306 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004307 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004308
4309
Tony Choa9f812a2015-09-21 12:16:33 +09004310 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004311 msg.body.key_info.enuKeyType = WEP;
4312 msg.body.key_info.u8KeyAction = ADDKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004313 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004314
4315
Tony Cho18990bf2015-09-30 18:44:24 +09004316 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004317 uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey = kmalloc(u8WepKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004318
Tony Cho18990bf2015-09-30 18:44:24 +09004319 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004320 pu8WepKey, u8WepKeylen);
4321
4322
Tony Cho18990bf2015-09-30 18:44:24 +09004323 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004324 uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen = (u8WepKeylen);
4325
Tony Cho18990bf2015-09-30 18:44:24 +09004326 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004327 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8Keyidx;
4328
4329 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004330 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004331 if (s32Error)
4332 PRINT_ER("Error in sending message queue :WEP Key\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004333 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004334
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004335 return s32Error;
4336
4337}
4338
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004339/**
4340 *
4341 * @brief host_int_add_wep_key_bss_ap
4342 * @details valid only in BSS AP mode if External Supplicant support is enabled.
4343 * sets WEP key entry into MAC hardware when it receives the
4344 *
4345 * corresponding request from NDIS.
4346 * @param[in,out] handle to the wifi driver
4347 *
4348 *
4349 * @return Error code indicating success/failure
4350 * @note
4351 * @author mdaftedar
4352 * @date 28 FEB 2013
4353 * @version 1.0
4354 */
Leo Kim841dfc42015-10-05 15:25:39 +09004355s32 host_int_add_wep_key_bss_ap(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8WepKey, u8 u8WepKeylen, u8 u8Keyidx, u8 u8mode, enum AUTHTYPE tenuAuth_type)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004356{
4357
Leo Kime6e12662015-09-16 18:36:03 +09004358 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004359 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004360 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004361 u8 i;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004362
Leo Kim24db7132015-09-16 18:36:01 +09004363 if (pstrWFIDrv == NULL) {
4364 s32Error = -EFAULT;
4365 PRINT_ER("driver is null\n");
4366 return s32Error;
4367 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004368
4369 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004370 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004371
4372 if (INFO) {
4373 for (i = 0; i < u8WepKeylen; i++)
4374 PRINT_INFO(HOSTAPD_DBG, "KEY is %x\n", pu8WepKey[i]);
4375 }
Tony Choa9f812a2015-09-21 12:16:33 +09004376 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004377 msg.body.key_info.enuKeyType = WEP;
4378 msg.body.key_info.u8KeyAction = ADDKEY_AP;
Tony Cho143eb952015-09-21 12:16:32 +09004379 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004380
4381
Tony Cho18990bf2015-09-30 18:44:24 +09004382 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004383 uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey = kmalloc(u8WepKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004384
4385
Tony Cho18990bf2015-09-30 18:44:24 +09004386 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004387 pu8WepKey, (u8WepKeylen));
4388
4389
Tony Cho18990bf2015-09-30 18:44:24 +09004390 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004391 uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen = (u8WepKeylen);
4392
Tony Cho18990bf2015-09-30 18:44:24 +09004393 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004394 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8Keyidx;
4395
Tony Cho18990bf2015-09-30 18:44:24 +09004396 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004397 uniHostIFkeyAttr.strHostIFwepAttr.u8mode = u8mode;
4398
Tony Cho18990bf2015-09-30 18:44:24 +09004399 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004400 uniHostIFkeyAttr.strHostIFwepAttr.tenuAuth_type = tenuAuth_type;
4401 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004402 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004403
4404 if (s32Error)
4405 PRINT_ER("Error in sending message queue :WEP Key\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004406 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004407
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004408 return s32Error;
4409
4410}
Glen Lee108b3432015-09-16 18:53:20 +09004411
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004412/**
4413 * @brief adds ptk Key
4414 * @details
4415 * @param[in,out] handle to the wifi driver
4416 * @param[in] message containing PTK Key in the following format
4417 *|-----------------------------------------------------------------------------|
4418 *|Station address | Key Length | Temporal Key | Rx Michael Key |Tx Michael Key |
4419 *|----------------|------------|--------------|----------------|---------------|
4420 | 6 bytes | 1byte | 16 bytes | 8 bytes | 8 bytes |
4421 ||-----------------------------------------------------------------------------|
4422 * @return Error code indicating success/failure
4423 * @note
4424 * @author zsalah
4425 * @date 8 March 2012
4426 * @version 1.0
4427 */
Johnny Kim218dc402015-08-13 13:41:19 +09004428s32 host_int_add_ptk(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8Ptk, u8 u8PtkKeylen,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004429 const u8 *mac_addr, const u8 *pu8RxMic, const u8 *pu8TxMic, u8 mode, u8 u8Ciphermode, u8 u8Idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004430{
Leo Kime6e12662015-09-16 18:36:03 +09004431 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004432 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004433 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004434 u8 u8KeyLen = u8PtkKeylen;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004435 u32 i;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02004436
Leo Kim24db7132015-09-16 18:36:01 +09004437 if (pstrWFIDrv == NULL) {
4438 s32Error = -EFAULT;
4439 PRINT_ER("driver is null\n");
4440 return s32Error;
4441 }
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004442 if (pu8RxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004443 u8KeyLen += RX_MIC_KEY_LEN;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004444 if (pu8TxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004445 u8KeyLen += TX_MIC_KEY_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004446
4447 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004448 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004449
4450
Tony Choa9f812a2015-09-21 12:16:33 +09004451 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004452 msg.body.key_info.enuKeyType = WPAPtk;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004453 if (mode == AP_MODE) {
Tony Cho18990bf2015-09-30 18:44:24 +09004454 msg.body.key_info.u8KeyAction = ADDKEY_AP;
4455 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004456 uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx = u8Idx;
4457 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004458 if (mode == STATION_MODE)
Tony Cho18990bf2015-09-30 18:44:24 +09004459 msg.body.key_info.u8KeyAction = ADDKEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004460
4461
Tony Cho18990bf2015-09-30 18:44:24 +09004462 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004463 uniHostIFkeyAttr.strHostIFwpaAttr.pu8key = kmalloc(u8PtkKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004464
4465
Tony Cho18990bf2015-09-30 18:44:24 +09004466 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004467 pu8Ptk, u8PtkKeylen);
4468
4469 if (pu8RxMic != NULL) {
4470
Tony Cho18990bf2015-09-30 18:44:24 +09004471 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 16,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004472 pu8RxMic, RX_MIC_KEY_LEN);
4473 if (INFO) {
4474 for (i = 0; i < RX_MIC_KEY_LEN; i++)
4475 PRINT_INFO(CFG80211_DBG, "PairwiseRx[%d] = %x\n", i, pu8RxMic[i]);
4476 }
4477 }
4478 if (pu8TxMic != NULL) {
4479
Tony Cho18990bf2015-09-30 18:44:24 +09004480 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 24,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004481 pu8TxMic, TX_MIC_KEY_LEN);
4482 if (INFO) {
4483 for (i = 0; i < TX_MIC_KEY_LEN; i++)
4484 PRINT_INFO(CFG80211_DBG, "PairwiseTx[%d] = %x\n", i, pu8TxMic[i]);
4485 }
4486 }
4487
Tony Cho18990bf2015-09-30 18:44:24 +09004488 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004489 uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen = u8KeyLen;
4490
Tony Cho18990bf2015-09-30 18:44:24 +09004491 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004492 uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode = u8Ciphermode;
Tony Cho18990bf2015-09-30 18:44:24 +09004493 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004494 uniHostIFkeyAttr.strHostIFwpaAttr.pu8macaddr = mac_addr;
Tony Cho143eb952015-09-21 12:16:32 +09004495 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004496
4497 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004498 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004499
4500 if (s32Error)
4501 PRINT_ER("Error in sending message queue: PTK Key\n");
4502
4503 /* ////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004504 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004505 /* /////// */
4506
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004507 return s32Error;
4508}
4509
4510/**
4511 * @brief adds Rx GTk Key
4512 * @details
4513 * @param[in,out] handle to the wifi driver
4514 * @param[in] pu8RxGtk : contains temporal key | Rx Mic | Tx Mic
4515 * u8GtkKeylen :The total key length
4516 *
4517 * @return Error code indicating success/failure
4518 * @note
4519 * @author zsalah
4520 * @date 8 March 2012
4521 * @version 1.0
4522 */
Johnny Kim218dc402015-08-13 13:41:19 +09004523s32 host_int_add_rx_gtk(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8RxGtk, u8 u8GtkKeylen,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004524 u8 u8KeyIdx, u32 u32KeyRSClen, const u8 *KeyRSC,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004525 const u8 *pu8RxMic, const u8 *pu8TxMic, u8 mode, u8 u8Ciphermode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004526{
Leo Kime6e12662015-09-16 18:36:03 +09004527 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004528 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004529 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004530 u8 u8KeyLen = u8GtkKeylen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004531
Leo Kim24db7132015-09-16 18:36:01 +09004532 if (pstrWFIDrv == NULL) {
4533 s32Error = -EFAULT;
4534 PRINT_ER("driver is null\n");
4535 return s32Error;
4536 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004537 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004538 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004539
4540
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004541 if (pu8RxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004542 u8KeyLen += RX_MIC_KEY_LEN;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004543 if (pu8TxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004544 u8KeyLen += TX_MIC_KEY_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004545 if (KeyRSC != NULL) {
Tony Cho18990bf2015-09-30 18:44:24 +09004546 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004547 uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq = kmalloc(u32KeyRSClen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004548
Tony Cho18990bf2015-09-30 18:44:24 +09004549 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004550 KeyRSC, u32KeyRSClen);
4551 }
4552
4553
Tony Choa9f812a2015-09-21 12:16:33 +09004554 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004555 msg.body.key_info.enuKeyType = WPARxGtk;
Tony Cho143eb952015-09-21 12:16:32 +09004556 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004557
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004558 if (mode == AP_MODE) {
Tony Cho18990bf2015-09-30 18:44:24 +09004559 msg.body.key_info.u8KeyAction = ADDKEY_AP;
4560 msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode = u8Ciphermode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004561 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004562 if (mode == STATION_MODE)
Tony Cho18990bf2015-09-30 18:44:24 +09004563 msg.body.key_info.u8KeyAction = ADDKEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004564
4565
Tony Cho18990bf2015-09-30 18:44:24 +09004566 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004567 uniHostIFkeyAttr.strHostIFwpaAttr.pu8key = kmalloc(u8KeyLen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004568
Tony Cho18990bf2015-09-30 18:44:24 +09004569 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004570 pu8RxGtk, u8GtkKeylen);
4571
4572 if (pu8RxMic != NULL) {
4573
Tony Cho18990bf2015-09-30 18:44:24 +09004574 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 16,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004575 pu8RxMic, RX_MIC_KEY_LEN);
4576
4577 }
4578 if (pu8TxMic != NULL) {
4579
Tony Cho18990bf2015-09-30 18:44:24 +09004580 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 24,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004581 pu8TxMic, TX_MIC_KEY_LEN);
4582
4583 }
4584
Tony Cho18990bf2015-09-30 18:44:24 +09004585 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004586 uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx = u8KeyIdx;
Tony Cho18990bf2015-09-30 18:44:24 +09004587 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004588 uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen = u8KeyLen;
4589
Tony Cho18990bf2015-09-30 18:44:24 +09004590 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004591 uniHostIFkeyAttr.strHostIFwpaAttr.u8seqlen = u32KeyRSClen;
4592
4593
4594
4595 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004596 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004597 if (s32Error)
4598 PRINT_ER("Error in sending message queue: RX GTK\n");
4599 /* ////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004600 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004601 /* /////// */
4602
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004603 return s32Error;
4604}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004605
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004606/**
4607 * @brief host_int_set_pmkid_info
4608 * @details caches the pmkid valid only in BSS STA mode if External Supplicant
4609 * support is enabled. This Function sets the PMKID in firmware
4610 * when host drivr receives the corresponding request from NDIS.
4611 * The firmware then includes theset PMKID in the appropriate
4612 * management frames
4613 * @param[in,out] handle to the wifi driver
4614 * @param[in] message containing PMKID Info in the following format
4615 *|-----------------------------------------------------------------|
4616 *|NumEntries | BSSID[1] | PMKID[1] | ... | BSSID[K] | PMKID[K] |
4617 *|-----------|------------|----------|-------|----------|----------|
4618 | 1 | 6 | 16 | ... | 6 | 16 |
4619 ||-----------------------------------------------------------------|
4620 * @return Error code indicating success/failure
4621 * @note
4622 * @author zsalah
4623 * @date 8 March 2012
4624 * @version 1.0
4625 */
Leo Kima949f902015-10-05 15:25:44 +09004626s32 host_int_set_pmkid_info(tstrWILC_WFIDrv *hWFIDrv, struct host_if_pmkid_attr *pu8PmkidInfoArray)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004627{
Leo Kime6e12662015-09-16 18:36:03 +09004628 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004629 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004630 struct host_if_msg msg;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004631 u32 i;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004632
4633
Leo Kim24db7132015-09-16 18:36:01 +09004634 if (pstrWFIDrv == NULL) {
4635 s32Error = -EFAULT;
4636 PRINT_ER("driver is null\n");
4637 return s32Error;
4638 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004639
4640 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004641 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004642
Tony Choa9f812a2015-09-21 12:16:33 +09004643 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004644 msg.body.key_info.enuKeyType = PMKSA;
4645 msg.body.key_info.u8KeyAction = ADDKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004646 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004647
4648 for (i = 0; i < pu8PmkidInfoArray->numpmkid; i++) {
4649
Tony Cho18990bf2015-09-30 18:44:24 +09004650 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].bssid, &pu8PmkidInfoArray->pmkidlist[i].bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004651 ETH_ALEN);
4652
Tony Cho18990bf2015-09-30 18:44:24 +09004653 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].pmkid, &pu8PmkidInfoArray->pmkidlist[i].pmkid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004654 PMKID_LEN);
4655 }
4656
4657 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004658 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004659 if (s32Error)
4660 PRINT_ER(" Error in sending messagequeue: PMKID Info\n");
4661
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004662 return s32Error;
4663}
4664
4665/**
4666 * @brief gets the cached the pmkid info
4667 * @details valid only in BSS STA mode if External Supplicant
4668 * support is enabled. This Function sets the PMKID in firmware
4669 * when host drivr receives the corresponding request from NDIS.
4670 * The firmware then includes theset PMKID in the appropriate
4671 * management frames
4672 * @param[in,out] handle to the wifi driver,
4673 * message containing PMKID Info in the following format
4674 *|-----------------------------------------------------------------|
4675 *|NumEntries | BSSID[1] | PMKID[1] | ... | BSSID[K] | PMKID[K] |
4676 *|-----------|------------|----------|-------|----------|----------|
4677 | 1 | 6 | 16 | ... | 6 | 16 |
4678 ||-----------------------------------------------------------------|
4679 * @param[in]
4680 * @return Error code indicating success/failure
4681 * @note
4682 * @author zsalah
4683 * @date 8 March 2012
4684 * @version 1.0
4685 */
Johnny Kim218dc402015-08-13 13:41:19 +09004686s32 host_int_get_pmkid_info(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8PmkidInfoArray,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004687 u32 u32PmkidInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004688{
Leo Kime6e12662015-09-16 18:36:03 +09004689 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004690 tstrWID strWID;
4691 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4692
Chaehyun Limd85f5322015-06-11 14:35:54 +09004693 strWID.u16WIDid = (u16)WID_PMKID_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004694 strWID.enuWIDtype = WID_STR;
4695 strWID.s32ValueSize = u32PmkidInfoLen;
4696 strWID.ps8WidVal = pu8PmkidInfoArray;
4697
4698 return s32Error;
4699}
4700
4701/**
4702 * @brief sets the pass phrase
4703 * @details AP/STA mode. This function gives the pass phrase used to
4704 * generate the Pre-Shared Key when WPA/WPA2 is enabled
4705 * The length of the field can vary from 8 to 64 bytes,
4706 * the lower layer should get the
4707 * @param[in,out] handle to the wifi driver,
4708 * @param[in] String containing PSK
4709 * @return Error code indicating success/failure
4710 * @note
4711 * @author zsalah
4712 * @date 8 March 2012
4713 * @version 1.0
4714 */
Johnny Kim218dc402015-08-13 13:41:19 +09004715s32 host_int_set_RSNAConfigPSKPassPhrase(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8PassPhrase,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004716 u8 u8Psklength)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004717{
Leo Kime6e12662015-09-16 18:36:03 +09004718 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004719 tstrWID strWID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004720
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004721 /*validating psk length*/
4722 if ((u8Psklength > 7) && (u8Psklength < 65)) {
Chaehyun Limd85f5322015-06-11 14:35:54 +09004723 strWID.u16WIDid = (u16)WID_11I_PSK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004724 strWID.enuWIDtype = WID_STR;
4725 strWID.ps8WidVal = pu8PassPhrase;
4726 strWID.s32ValueSize = u8Psklength;
4727 }
4728
4729 return s32Error;
4730}
4731/**
4732 * @brief host_int_get_MacAddress
4733 * @details gets mac address
4734 * @param[in,out] handle to the wifi driver,
4735 *
4736 * @return Error code indicating success/failure
4737 * @note
4738 * @author mdaftedar
4739 * @date 19 April 2012
4740 * @version 1.0
4741 */
Johnny Kim218dc402015-08-13 13:41:19 +09004742s32 host_int_get_MacAddress(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8MacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004743{
Leo Kime6e12662015-09-16 18:36:03 +09004744 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004745 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004746
4747
4748 /* prepare the Message */
Tony Cho143eb952015-09-21 12:16:32 +09004749 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004750
Tony Choa9f812a2015-09-21 12:16:33 +09004751 msg.id = HOST_IF_MSG_GET_MAC_ADDRESS;
Tony Choa5848692015-09-30 18:55:08 +09004752 msg.body.get_mac_info.u8MacAddress = pu8MacAddress;
Tony Cho143eb952015-09-21 12:16:32 +09004753 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004754 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004755 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004756 if (s32Error) {
4757 PRINT_ER("Failed to send get mac address\n");
Leo Kime6e12662015-09-16 18:36:03 +09004758 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004759 }
4760
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004761 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004762 return s32Error;
4763}
4764
4765/**
4766 * @brief host_int_set_MacAddress
4767 * @details sets mac address
4768 * @param[in,out] handle to the wifi driver,
4769 *
4770 * @return Error code indicating success/failure
4771 * @note
4772 * @author mabubakr
4773 * @date 16 July 2012
4774 * @version 1.0
4775 */
Johnny Kim218dc402015-08-13 13:41:19 +09004776s32 host_int_set_MacAddress(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8MacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004777{
Leo Kime6e12662015-09-16 18:36:03 +09004778 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004779 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004780
4781 PRINT_D(GENERIC_DBG, "mac addr = %x:%x:%x\n", pu8MacAddress[0], pu8MacAddress[1], pu8MacAddress[2]);
4782
4783 /* prepare setting mac address message */
Tony Cho143eb952015-09-21 12:16:32 +09004784 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09004785 msg.id = HOST_IF_MSG_SET_MAC_ADDRESS;
Tony Cho15326e22015-09-30 18:55:07 +09004786 memcpy(msg.body.set_mac_info.u8MacAddress, pu8MacAddress, ETH_ALEN);
Tony Cho143eb952015-09-21 12:16:32 +09004787 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004788
Tony Cho143eb952015-09-21 12:16:32 +09004789 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kim24db7132015-09-16 18:36:01 +09004790 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004791 PRINT_ER("Failed to send message queue: Set mac address\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004792
4793 return s32Error;
4794
4795}
4796
4797/**
4798 * @brief host_int_get_RSNAConfigPSKPassPhrase
4799 * @details gets the pass phrase:AP/STA mode. This function gets the pass phrase used to
4800 * generate the Pre-Shared Key when WPA/WPA2 is enabled
4801 * The length of the field can vary from 8 to 64 bytes,
4802 * the lower layer should get the
4803 * @param[in,out] handle to the wifi driver,
4804 * String containing PSK
4805 * @return Error code indicating success/failure
4806 * @note
4807 * @author zsalah
4808 * @date 8 March 2012
4809 * @version 1.0
4810 */
Johnny Kim218dc402015-08-13 13:41:19 +09004811s32 host_int_get_RSNAConfigPSKPassPhrase(tstrWILC_WFIDrv *hWFIDrv,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004812 u8 *pu8PassPhrase, u8 u8Psklength)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004813{
Leo Kime6e12662015-09-16 18:36:03 +09004814 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004815 tstrWID strWID;
4816 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4817
Chaehyun Limd85f5322015-06-11 14:35:54 +09004818 strWID.u16WIDid = (u16)WID_11I_PSK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004819 strWID.enuWIDtype = WID_STR;
4820 strWID.s32ValueSize = u8Psklength;
4821 strWID.ps8WidVal = pu8PassPhrase;
4822
4823 return s32Error;
4824}
4825
4826/**
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004827 * @brief sets a start scan request
4828 * @details
4829 * @param[in,out] handle to the wifi driver,
4830 * @param[in] Scan Source one of the following values
4831 * DEFAULT_SCAN 0
4832 * USER_SCAN BIT0
4833 * OBSS_PERIODIC_SCAN BIT1
4834 * OBSS_ONETIME_SCAN BIT2
4835 * @return Error code indicating success/failure
4836 * @note
4837 * @author zsalah
4838 * @date 8 March 2012
4839 * @version 1.0
4840 */
Johnny Kim218dc402015-08-13 13:41:19 +09004841s32 host_int_set_start_scan_req(tstrWILC_WFIDrv *hWFIDrv, u8 scanSource)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004842{
Leo Kime6e12662015-09-16 18:36:03 +09004843 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004844 tstrWID strWID;
4845 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4846
Chaehyun Limd85f5322015-06-11 14:35:54 +09004847 strWID.u16WIDid = (u16)WID_START_SCAN_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004848 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09004849 strWID.ps8WidVal = (s8 *)&scanSource;
Dean Lee576917a2015-06-15 11:58:57 +09004850 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004851
4852 return s32Error;
4853}
4854
4855/**
4856 * @brief host_int_get_start_scan_req
4857 * @details gets a start scan request
4858 * @param[in,out] handle to the wifi driver,
4859 * @param[in] Scan Source one of the following values
4860 * DEFAULT_SCAN 0
4861 * USER_SCAN BIT0
4862 * OBSS_PERIODIC_SCAN BIT1
4863 * OBSS_ONETIME_SCAN BIT2
4864 * @return Error code indicating success/failure
4865 * @note
4866 * @author zsalah
4867 * @date 8 March 2012
4868 * @version 1.0
4869 */
4870
Johnny Kim218dc402015-08-13 13:41:19 +09004871s32 host_int_get_start_scan_req(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8ScanSource)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004872{
Leo Kime6e12662015-09-16 18:36:03 +09004873 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004874 tstrWID strWID;
4875 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4876
Chaehyun Limd85f5322015-06-11 14:35:54 +09004877 strWID.u16WIDid = (u16)WID_START_SCAN_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004878 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09004879 strWID.ps8WidVal = (s8 *)pu8ScanSource;
Dean Lee576917a2015-06-15 11:58:57 +09004880 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004881
4882 return s32Error;
4883}
4884
4885/**
4886 * @brief host_int_set_join_req
4887 * @details sets a join request
4888 * @param[in,out] handle to the wifi driver,
4889 * @param[in] Index of the bss descriptor
4890 * @return Error code indicating success/failure
4891 * @note
4892 * @author zsalah
4893 * @date 8 March 2012
4894 * @version 1.0
4895 */
Johnny Kim218dc402015-08-13 13:41:19 +09004896s32 host_int_set_join_req(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8bssid,
Arnd Bergmann057d1e92015-06-01 21:06:44 +02004897 const u8 *pu8ssid, size_t ssidLen,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004898 const u8 *pu8IEs, size_t IEsLen,
Leo Kimb6ab85f2015-10-05 15:25:38 +09004899 wilc_connect_result pfConnectResult, void *pvUserArg,
Leo Kim841dfc42015-10-05 15:25:39 +09004900 u8 u8security, enum AUTHTYPE tenuAuth_type,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004901 u8 u8channel,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004902 void *pJoinParams)
4903{
Leo Kime6e12662015-09-16 18:36:03 +09004904 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004905 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004906 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004907 tenuScanConnTimer enuScanConnTimer;
4908
Leo Kim24db7132015-09-16 18:36:01 +09004909 if (pstrWFIDrv == NULL || pfConnectResult == NULL) {
4910 s32Error = -EFAULT;
4911 PRINT_ER("Driver is null\n");
4912 return s32Error;
4913 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004914
4915 if (hWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09004916 PRINT_ER("Driver is null\n");
4917 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004918 }
4919
4920 if (pJoinParams == NULL) {
4921 PRINT_ER("Unable to Join - JoinParams is NULL\n");
Leo Kim24db7132015-09-16 18:36:01 +09004922 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004923 }
Leo Kim24db7132015-09-16 18:36:01 +09004924
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004925 /* prepare the Connect Message */
Tony Cho143eb952015-09-21 12:16:32 +09004926 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004927
Tony Choa9f812a2015-09-21 12:16:33 +09004928 msg.id = HOST_IF_MSG_CONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004929
Tony Cho3f501972015-09-30 18:44:21 +09004930 msg.body.con_info.u8security = u8security;
4931 msg.body.con_info.tenuAuth_type = tenuAuth_type;
4932 msg.body.con_info.u8channel = u8channel;
4933 msg.body.con_info.pfConnectResult = pfConnectResult;
4934 msg.body.con_info.pvUserArg = pvUserArg;
4935 msg.body.con_info.pJoinParams = pJoinParams;
Tony Cho143eb952015-09-21 12:16:32 +09004936 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004937
4938 if (pu8bssid != NULL) {
Tony Cho3f501972015-09-30 18:44:21 +09004939 msg.body.con_info.pu8bssid = kmalloc(6, GFP_KERNEL); /* will be deallocated by the receiving thread */
4940 memcpy(msg.body.con_info.pu8bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004941 pu8bssid, 6);
4942 }
4943
4944 if (pu8ssid != NULL) {
Tony Cho3f501972015-09-30 18:44:21 +09004945 msg.body.con_info.ssidLen = ssidLen;
4946 msg.body.con_info.pu8ssid = kmalloc(ssidLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
4947 memcpy(msg.body.con_info.pu8ssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004948
4949 pu8ssid, ssidLen);
4950 }
4951
4952 if (pu8IEs != NULL) {
Tony Cho3f501972015-09-30 18:44:21 +09004953 msg.body.con_info.IEsLen = IEsLen;
4954 msg.body.con_info.pu8IEs = kmalloc(IEsLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
4955 memcpy(msg.body.con_info.pu8IEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004956 pu8IEs, IEsLen);
4957 }
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05304958 if (pstrWFIDrv->enuHostIFstate < HOST_IF_CONNECTING)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004959 pstrWFIDrv->enuHostIFstate = HOST_IF_CONNECTING;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05304960 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004961 PRINT_D(GENERIC_DBG, "Don't set state to 'connecting' as state is %d\n", pstrWFIDrv->enuHostIFstate);
4962
4963 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004964 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004965 if (s32Error) {
4966 PRINT_ER("Failed to send message queue: Set join request\n");
Leo Kim24db7132015-09-16 18:36:01 +09004967 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004968 }
4969
4970 enuScanConnTimer = CONNECT_TIMER;
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07004971 pstrWFIDrv->hConnectTimer.data = (unsigned long)hWFIDrv;
4972 mod_timer(&pstrWFIDrv->hConnectTimer,
4973 jiffies + msecs_to_jiffies(HOST_IF_CONNECT_TIMEOUT));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004974
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004975 return s32Error;
4976}
4977
4978/**
4979 * @brief Flush a join request parameters to FW, but actual connection
4980 * @details The function is called in situation where WILC is connected to AP and
4981 * required to switch to hybrid FW for P2P connection
4982 * @param[in] handle to the wifi driver,
4983 * @return Error code indicating success/failure
4984 * @note
4985 * @author Amr Abdel-Moghny
4986 * @date 19 DEC 2013
4987 * @version 8.0
4988 */
4989
Johnny Kim218dc402015-08-13 13:41:19 +09004990s32 host_int_flush_join_req(tstrWILC_WFIDrv *hWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004991{
Leo Kime6e12662015-09-16 18:36:03 +09004992 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004993 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004994
4995 if (!gu8FlushedJoinReq) {
Leo Kime6e12662015-09-16 18:36:03 +09004996 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004997 return s32Error;
4998 }
4999
5000
Leo Kim24db7132015-09-16 18:36:01 +09005001 if (hWFIDrv == NULL) {
5002 s32Error = -EFAULT;
5003 PRINT_ER("Driver is null\n");
5004 return s32Error;
5005 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005006
Tony Choa9f812a2015-09-21 12:16:33 +09005007 msg.id = HOST_IF_MSG_FLUSH_CONNECT;
Tony Cho143eb952015-09-21 12:16:32 +09005008 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005009
5010 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005011 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005012 if (s32Error) {
5013 PRINT_ER("Failed to send message queue: Flush join request\n");
Leo Kim24db7132015-09-16 18:36:01 +09005014 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005015 }
5016
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005017 return s32Error;
5018}
5019
5020/**
5021 * @brief host_int_disconnect
5022 * @details disconnects from the currently associated network
5023 * @param[in,out] handle to the wifi driver,
5024 * @param[in] Reason Code of the Disconnection
5025 * @return Error code indicating success/failure
5026 * @note
5027 * @author zsalah
5028 * @date 8 March 2012
5029 * @version 1.0
5030 */
Johnny Kim218dc402015-08-13 13:41:19 +09005031s32 host_int_disconnect(tstrWILC_WFIDrv *hWFIDrv, u16 u16ReasonCode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005032{
Leo Kime6e12662015-09-16 18:36:03 +09005033 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005034 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005035 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5036
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005037 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005038 PRINT_ER("Driver is null\n");
5039 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005040 }
5041
5042 /* prepare the Disconnect Message */
Tony Cho143eb952015-09-21 12:16:32 +09005043 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005044
Tony Choa9f812a2015-09-21 12:16:33 +09005045 msg.id = HOST_IF_MSG_DISCONNECT;
Tony Cho143eb952015-09-21 12:16:32 +09005046 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005047
5048 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005049 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005050 if (s32Error)
5051 PRINT_ER("Failed to send message queue: disconnect\n");
5052 /* ////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005053 down(&(pstrWFIDrv->hSemTestDisconnectBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005054 /* /////// */
5055
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005056 return s32Error;
5057}
5058
5059/**
5060 * @brief host_int_disconnect_station
5061 * @details disconnects a sta
5062 * @param[in,out] handle to the wifi driver,
5063 * @param[in] Association Id of the station to be disconnected
5064 * @return Error code indicating success/failure
5065 * @note
5066 * @author zsalah
5067 * @date 8 March 2012
5068 * @version 1.0
5069 */
Johnny Kim218dc402015-08-13 13:41:19 +09005070s32 host_int_disconnect_station(tstrWILC_WFIDrv *hWFIDrv, u8 assoc_id)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005071{
Leo Kime6e12662015-09-16 18:36:03 +09005072 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005073 tstrWID strWID;
5074 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
5075
Chaehyun Limd85f5322015-06-11 14:35:54 +09005076 strWID.u16WIDid = (u16)WID_DISCONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005077 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09005078 strWID.ps8WidVal = (s8 *)&assoc_id;
Dean Lee576917a2015-06-15 11:58:57 +09005079 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005080
5081 return s32Error;
5082}
5083
5084/**
5085 * @brief host_int_get_assoc_req_info
5086 * @details gets a Association request info
5087 * @param[in,out] handle to the wifi driver,
5088 * Message containg assoc. req info in the following format
5089 * ------------------------------------------------------------------------
5090 | Management Frame Format |
5091 ||-------------------------------------------------------------------|
5092 ||Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS |
5093 ||-------------|--------|--|--|-----|----------------|----------|----|
5094 | 2 |2 |6 |6 |6 | 2 |0 - 2312 | 4 |
5095 ||-------------------------------------------------------------------|
5096 | |
5097 | Association Request Frame - Frame Body |
5098 ||-------------------------------------------------------------------|
5099 | Capability Information | Listen Interval | SSID | Supported Rates |
5100 ||------------------------|-----------------|------|-----------------|
5101 | 2 | 2 | 2-34 | 3-10 |
5102 | ---------------------------------------------------------------------
5103 * @return Error code indicating success/failure
5104 * @note
5105 * @author zsalah
5106 * @date 8 March 2012
5107 * @version 1.0
5108 */
5109
Johnny Kim218dc402015-08-13 13:41:19 +09005110s32 host_int_get_assoc_req_info(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8AssocReqInfo,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005111 u32 u32AssocReqInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005112{
Leo Kime6e12662015-09-16 18:36:03 +09005113 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005114 tstrWID strWID;
5115 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
5116
Chaehyun Limd85f5322015-06-11 14:35:54 +09005117 strWID.u16WIDid = (u16)WID_ASSOC_REQ_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005118 strWID.enuWIDtype = WID_STR;
5119 strWID.ps8WidVal = pu8AssocReqInfo;
5120 strWID.s32ValueSize = u32AssocReqInfoLen;
5121
5122
5123 return s32Error;
5124}
5125
5126/**
5127 * @brief gets a Association Response info
5128 * @details
5129 * @param[in,out] handle to the wifi driver,
5130 * Message containg assoc. resp info
5131 * @return Error code indicating success/failure
5132 * @note
5133 * @author zsalah
5134 * @date 8 March 2012
5135 * @version 1.0
5136 */
Johnny Kim218dc402015-08-13 13:41:19 +09005137s32 host_int_get_assoc_res_info(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8AssocRespInfo,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005138 u32 u32MaxAssocRespInfoLen, u32 *pu32RcvdAssocRespInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005139{
Leo Kime6e12662015-09-16 18:36:03 +09005140 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005141 tstrWID strWID;
5142 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5143
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005144 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005145 PRINT_ER("Driver is null\n");
5146 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005147 }
5148
Chaehyun Limd85f5322015-06-11 14:35:54 +09005149 strWID.u16WIDid = (u16)WID_ASSOC_RES_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005150 strWID.enuWIDtype = WID_STR;
5151 strWID.ps8WidVal = pu8AssocRespInfo;
5152 strWID.s32ValueSize = u32MaxAssocRespInfoLen;
5153
5154
5155 /* Sending Configuration packet */
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09005156 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
5157 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005158 if (s32Error) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005159 *pu32RcvdAssocRespInfoLen = 0;
Leo Kim24db7132015-09-16 18:36:01 +09005160 PRINT_ER("Failed to send association response config packet\n");
5161 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005162 } else {
5163 *pu32RcvdAssocRespInfoLen = strWID.s32ValueSize;
5164 }
5165
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005166 return s32Error;
5167}
5168
5169/**
5170 * @brief gets a Association Response info
5171 * @details Valid only in STA mode. This function gives the RSSI
5172 * values observed in all the channels at the time of scanning.
5173 * The length of the field is 1 greater that the total number of
5174 * channels supported. Byte 0 contains the number of channels while
5175 * each of Byte N contains the observed RSSI value for the channel index N.
5176 * @param[in,out] handle to the wifi driver,
5177 * array of scanned channels' RSSI
5178 * @return Error code indicating success/failure
5179 * @note
5180 * @author zsalah
5181 * @date 8 March 2012
5182 * @version 1.0
5183 */
Johnny Kim218dc402015-08-13 13:41:19 +09005184s32 host_int_get_rx_power_level(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8RxPowerLevel,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005185 u32 u32RxPowerLevelLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005186{
Leo Kime6e12662015-09-16 18:36:03 +09005187 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005188 tstrWID strWID;
5189 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
5190
Chaehyun Limd85f5322015-06-11 14:35:54 +09005191 strWID.u16WIDid = (u16)WID_RX_POWER_LEVEL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005192 strWID.enuWIDtype = WID_STR;
5193 strWID.ps8WidVal = pu8RxPowerLevel;
5194 strWID.s32ValueSize = u32RxPowerLevelLen;
5195
5196
5197 return s32Error;
5198}
5199
5200/**
5201 * @brief sets a channel
5202 * @details
5203 * @param[in,out] handle to the wifi driver,
5204 * @param[in] Index of the channel to be set
5205 *|-------------------------------------------------------------------|
5206 | CHANNEL1 CHANNEL2 .... CHANNEL14 |
5207 | Input: 1 2 14 |
5208 ||-------------------------------------------------------------------|
5209 * @return Error code indicating success/failure
5210 * @note
5211 * @author zsalah
5212 * @date 8 March 2012
5213 * @version 1.0
5214 */
Chaehyun Lim5ba48ec2015-10-02 21:44:52 +09005215int host_int_set_mac_chnl_num(tstrWILC_WFIDrv *wfi_drv, u8 channel)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005216{
Chaehyun Lim792fb252015-10-05 11:07:22 +09005217 int result;
Tony Cho143eb952015-09-21 12:16:32 +09005218 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005219
Chaehyun Lim157da212015-10-05 11:07:21 +09005220 if (!wfi_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09005221 PRINT_ER("driver is null\n");
5222 return -EFAULT;
5223 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005224
5225 /* prepare the set channel message */
Tony Cho143eb952015-09-21 12:16:32 +09005226 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005227 msg.id = HOST_IF_MSG_SET_CHANNEL;
Chaehyun Lim1c5833c2015-10-02 21:44:51 +09005228 msg.body.channel_info.u8SetChan = channel;
Chaehyun Lim5ba48ec2015-10-02 21:44:52 +09005229 msg.drvHandler = wfi_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005230
Chaehyun Lim1ef58e42015-10-02 21:44:49 +09005231 result = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
5232 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09005233 PRINT_ER("wilc mq send fail\n");
Chaehyun Lim792fb252015-10-05 11:07:22 +09005234 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005235 }
5236
Chaehyun Lim792fb252015-10-05 11:07:22 +09005237 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005238}
5239
Chaehyun Lim244efb12015-10-02 21:44:53 +09005240int host_int_wait_msg_queue_idle(void)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005241{
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005242 int result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005243
Tony Cho143eb952015-09-21 12:16:32 +09005244 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005245
5246 /* prepare the set driver handler message */
5247
Tony Cho143eb952015-09-21 12:16:32 +09005248 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005249 msg.id = HOST_IF_MSG_Q_IDLE;
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005250 result = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
5251 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09005252 PRINT_ER("wilc mq send fail\n");
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005253 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005254 }
5255
5256 /* wait untill MSG Q is empty */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005257 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005258
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005259 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005260}
5261
Chaehyun Lim3c5f3e52015-10-05 19:34:48 +09005262int host_int_set_wfi_drv_handler(tstrWILC_WFIDrv *address)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005263{
Chaehyun Lima0941012015-10-05 19:34:47 +09005264 int result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005265
Tony Cho143eb952015-09-21 12:16:32 +09005266 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005267
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005268 /* prepare the set driver handler message */
5269
Tony Cho143eb952015-09-21 12:16:32 +09005270 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005271 msg.id = HOST_IF_MSG_SET_WFIDRV_HANDLER;
Chaehyun Lim3c5f3e52015-10-05 19:34:48 +09005272 msg.body.drv.u32Address = get_id_from_handler(address);
5273 msg.drvHandler = address;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005274
Chaehyun Lima0941012015-10-05 19:34:47 +09005275 result = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
5276 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09005277 PRINT_ER("wilc mq send fail\n");
Chaehyun Lima0941012015-10-05 19:34:47 +09005278 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005279 }
5280
Chaehyun Lima0941012015-10-05 19:34:47 +09005281 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005282}
5283
Chaehyun Lim49fb6f72015-10-05 19:34:52 +09005284int host_int_set_operation_mode(tstrWILC_WFIDrv *wfi_drv, u32 mode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005285{
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09005286 int result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005287
Tony Cho143eb952015-09-21 12:16:32 +09005288 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005289
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005290 /* prepare the set driver handler message */
5291
Tony Cho143eb952015-09-21 12:16:32 +09005292 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005293 msg.id = HOST_IF_MSG_SET_OPERATION_MODE;
Chaehyun Lim49fb6f72015-10-05 19:34:52 +09005294 msg.body.mode.u32Mode = mode;
Chaehyun Lim23081922015-10-05 19:34:51 +09005295 msg.drvHandler = wfi_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005296
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09005297 result = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
5298 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09005299 PRINT_ER("wilc mq send fail\n");
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09005300 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005301 }
5302
Chaehyun Lima0c1ee02015-10-05 19:34:50 +09005303 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005304}
5305
5306/**
5307 * @brief gets the current channel index
5308 * @details
5309 * @param[in,out] handle to the wifi driver,
5310 * current channel index
5311 *|-----------------------------------------------------------------------|
5312 | CHANNEL1 CHANNEL2 .... CHANNEL14 |
5313 | Input: 1 2 14 |
5314 ||-----------------------------------------------------------------------|
5315 * @return Error code indicating success/failure
5316 * @note
5317 * @author zsalah
5318 * @date 8 March 2012
5319 * @version 1.0
5320 */
Johnny Kim218dc402015-08-13 13:41:19 +09005321s32 host_int_get_host_chnl_num(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8ChNo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005322{
Leo Kime6e12662015-09-16 18:36:03 +09005323 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005324 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005325 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005326
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005327 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005328 PRINT_ER("driver is null\n");
5329 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005330 }
5331
5332 /* prepare the Get Channel Message */
Tony Cho143eb952015-09-21 12:16:32 +09005333 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005334
Tony Choa9f812a2015-09-21 12:16:33 +09005335 msg.id = HOST_IF_MSG_GET_CHNL;
Tony Cho143eb952015-09-21 12:16:32 +09005336 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005337
5338 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005339 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005340 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09005341 PRINT_ER("wilc mq send fail\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005342 down(&(pstrWFIDrv->hSemGetCHNL));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005343 /* gu8Chnl = 11; */
5344
5345 *pu8ChNo = gu8Chnl;
5346
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005347 return s32Error;
5348
5349
5350}
5351
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005352/**
5353 * @brief host_int_get_inactive_time
5354 * @details
5355 * @param[in,out] handle to the wifi driver,
5356 * current sta macaddress, inactive_time
5357 * @return
5358 * @note
5359 * @author
5360 * @date
5361 * @version 1.0
5362 */
Johnny Kim218dc402015-08-13 13:41:19 +09005363s32 host_int_get_inactive_time(tstrWILC_WFIDrv *hWFIDrv, const u8 *mac, u32 *pu32InactiveTime)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005364{
Leo Kime6e12662015-09-16 18:36:03 +09005365 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005366 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005367 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005368
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005369 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005370 PRINT_ER("driver is null\n");
5371 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005372 }
5373
Tony Cho143eb952015-09-21 12:16:32 +09005374 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005375
5376
Tony Cho66bac7f2015-09-30 18:44:37 +09005377 memcpy(msg.body.mac_info.mac,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005378 mac, ETH_ALEN);
5379
Tony Choa9f812a2015-09-21 12:16:33 +09005380 msg.id = HOST_IF_MSG_GET_INACTIVETIME;
Tony Cho143eb952015-09-21 12:16:32 +09005381 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005382
5383 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005384 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005385 if (s32Error)
5386 PRINT_ER("Failed to send get host channel param's message queue ");
5387
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005388 down(&(pstrWFIDrv->hSemInactiveTime));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005389
5390 *pu32InactiveTime = gu32InactiveTime;
5391
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005392 return s32Error;
5393}
Glen Lee108b3432015-09-16 18:53:20 +09005394
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005395/**
5396 * @brief host_int_test_get_int_wid
5397 * @details Test function for getting wids
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005398 * @param[in,out] WILC_WFIDrvHandle hWFIDrv, u32* pu32TestMemAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005399 * @return Error code indicating success/failure
5400 * @note
5401 * @author zsalah
5402 * @date 8 March 2012
5403 * @version 1.0
5404 */
Johnny Kim218dc402015-08-13 13:41:19 +09005405s32 host_int_test_get_int_wid(tstrWILC_WFIDrv *hWFIDrv, u32 *pu32TestMemAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005406{
5407
Leo Kime6e12662015-09-16 18:36:03 +09005408 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005409 tstrWID strWID;
5410 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5411
5412
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005413 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005414 PRINT_ER("driver is null\n");
5415 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005416 }
5417
Chaehyun Limd85f5322015-06-11 14:35:54 +09005418 strWID.u16WIDid = (u16)WID_MEMORY_ADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005419 strWID.enuWIDtype = WID_INT;
Chaehyun Limca356ad2015-06-11 14:35:57 +09005420 strWID.ps8WidVal = (s8 *)pu32TestMemAddr;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005421 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005422
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09005423 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
5424 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005425 /*get the value by searching the local copy*/
5426 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09005427 PRINT_ER("Failed to get wid value\n");
5428 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005429 } else {
5430 PRINT_D(HOSTINF_DBG, "Successfully got wid value\n");
5431
5432 }
5433
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005434 return s32Error;
5435}
5436
5437
5438/**
5439 * @brief host_int_get_rssi
5440 * @details gets the currently maintained RSSI value for the station.
5441 * The received signal strength value in dB.
5442 * The range of valid values is -128 to 0.
5443 * @param[in,out] handle to the wifi driver,
5444 * rssi value in dB
5445 * @return Error code indicating success/failure
5446 * @note
5447 * @author zsalah
5448 * @date 8 March 2012
5449 * @version 1.0
5450 */
Johnny Kim218dc402015-08-13 13:41:19 +09005451s32 host_int_get_rssi(tstrWILC_WFIDrv *hWFIDrv, s8 *ps8Rssi)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005452{
Leo Kime6e12662015-09-16 18:36:03 +09005453 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005454 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005455 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5456
5457
5458 /* prepare the Get RSSI Message */
Tony Cho143eb952015-09-21 12:16:32 +09005459 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005460
Tony Choa9f812a2015-09-21 12:16:33 +09005461 msg.id = HOST_IF_MSG_GET_RSSI;
Tony Cho143eb952015-09-21 12:16:32 +09005462 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005463
5464 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005465 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005466 if (s32Error) {
5467 PRINT_ER("Failed to send get host channel param's message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09005468 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005469 }
5470
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005471 down(&(pstrWFIDrv->hSemGetRSSI));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005472
5473
5474 if (ps8Rssi == NULL) {
5475 PRINT_ER("RSS pointer value is null");
Leo Kime6e12662015-09-16 18:36:03 +09005476 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005477 }
5478
5479
5480 *ps8Rssi = gs8Rssi;
5481
5482
5483 return s32Error;
5484}
5485
Johnny Kim218dc402015-08-13 13:41:19 +09005486s32 host_int_get_link_speed(tstrWILC_WFIDrv *hWFIDrv, s8 *ps8lnkspd)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005487{
Tony Cho143eb952015-09-21 12:16:32 +09005488 struct host_if_msg msg;
Leo Kime6e12662015-09-16 18:36:03 +09005489 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005490
5491 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5492
5493
5494
5495 /* prepare the Get LINKSPEED Message */
Tony Cho143eb952015-09-21 12:16:32 +09005496 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005497
Tony Choa9f812a2015-09-21 12:16:33 +09005498 msg.id = HOST_IF_MSG_GET_LINKSPEED;
Tony Cho143eb952015-09-21 12:16:32 +09005499 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005500
5501 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005502 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005503 if (s32Error) {
5504 PRINT_ER("Failed to send GET_LINKSPEED to message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09005505 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005506 }
5507
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005508 down(&(pstrWFIDrv->hSemGetLINKSPEED));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005509
5510
5511 if (ps8lnkspd == NULL) {
5512 PRINT_ER("LINKSPEED pointer value is null");
Leo Kime6e12662015-09-16 18:36:03 +09005513 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005514 }
5515
5516
5517 *ps8lnkspd = gs8lnkspd;
5518
5519
5520 return s32Error;
5521}
5522
Johnny Kim218dc402015-08-13 13:41:19 +09005523s32 host_int_get_statistics(tstrWILC_WFIDrv *hWFIDrv, tstrStatistics *pstrStatistics)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005524{
Leo Kime6e12662015-09-16 18:36:03 +09005525 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005526 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005527
5528
5529 /* prepare the Get RSSI Message */
Tony Cho143eb952015-09-21 12:16:32 +09005530 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005531
Tony Choa9f812a2015-09-21 12:16:33 +09005532 msg.id = HOST_IF_MSG_GET_STATISTICS;
Tony Choe60831e2015-10-05 13:50:45 +09005533 msg.body.data = (char *)pstrStatistics;
Tony Cho143eb952015-09-21 12:16:32 +09005534 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005535 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005536 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005537 if (s32Error) {
5538 PRINT_ER("Failed to send get host channel param's message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09005539 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005540 }
5541
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005542 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005543 return s32Error;
5544}
5545
5546
5547/**
5548 * @brief host_int_scan
5549 * @details scans a set of channels
5550 * @param[in,out] handle to the wifi driver,
5551 * @param[in] Scan source
5552 * Scan Type PASSIVE_SCAN = 0,
5553 * ACTIVE_SCAN = 1
5554 * Channels Array
5555 * Channels Array length
5556 * Scan Callback function
5557 * @return Error code indicating success/failure
5558 * @note
5559 * @author zsalah
5560 * @date 8 March 2012
5561 * @version 1.0
5562 */
Johnny Kim218dc402015-08-13 13:41:19 +09005563s32 host_int_scan(tstrWILC_WFIDrv *hWFIDrv, u8 u8ScanSource,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09005564 u8 u8ScanType, u8 *pu8ChnlFreqList,
5565 u8 u8ChnlListLen, const u8 *pu8IEs,
Leo Kimba1d1a62015-10-05 15:25:36 +09005566 size_t IEsLen, wilc_scan_result ScanResult,
Leo Kim607db442015-10-05 15:25:37 +09005567 void *pvUserArg,
5568 struct hidden_network *pstrHiddenNetwork)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005569{
Leo Kime6e12662015-09-16 18:36:03 +09005570 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005571 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005572 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005573 tenuScanConnTimer enuScanConnTimer;
5574
Leo Kim24db7132015-09-16 18:36:01 +09005575 if (pstrWFIDrv == NULL || ScanResult == NULL) {
5576 PRINT_ER("pstrWFIDrv or ScanResult = NULL\n");
5577 return -EFAULT;
5578 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005579
5580 /* prepare the Scan Message */
Tony Cho143eb952015-09-21 12:16:32 +09005581 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005582
Tony Choa9f812a2015-09-21 12:16:33 +09005583 msg.id = HOST_IF_MSG_SCAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005584
5585 if (pstrHiddenNetwork != NULL) {
Tony Cho4528bdb2015-09-30 18:44:20 +09005586 msg.body.scan_info.strHiddenNetwork.pstrHiddenNetworkInfo = pstrHiddenNetwork->pstrHiddenNetworkInfo;
5587 msg.body.scan_info.strHiddenNetwork.u8ssidnum = pstrHiddenNetwork->u8ssidnum;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005588
5589 } else
5590 PRINT_D(HOSTINF_DBG, "pstrHiddenNetwork IS EQUAL TO NULL\n");
5591
Tony Cho143eb952015-09-21 12:16:32 +09005592 msg.drvHandler = hWFIDrv;
Tony Cho4528bdb2015-09-30 18:44:20 +09005593 msg.body.scan_info.u8ScanSource = u8ScanSource;
5594 msg.body.scan_info.u8ScanType = u8ScanType;
5595 msg.body.scan_info.pfScanResult = ScanResult;
5596 msg.body.scan_info.pvUserArg = pvUserArg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005597
Tony Cho4528bdb2015-09-30 18:44:20 +09005598 msg.body.scan_info.u8ChnlListLen = u8ChnlListLen;
5599 msg.body.scan_info.pu8ChnlFreqList = kmalloc(u8ChnlListLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
5600 memcpy(msg.body.scan_info.pu8ChnlFreqList,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005601 pu8ChnlFreqList, u8ChnlListLen);
5602
Tony Cho4528bdb2015-09-30 18:44:20 +09005603 msg.body.scan_info.IEsLen = IEsLen;
5604 msg.body.scan_info.pu8IEs = kmalloc(IEsLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
5605 memcpy(msg.body.scan_info.pu8IEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005606 pu8IEs, IEsLen);
5607
5608 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005609 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005610 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09005611 PRINT_ER("Error in sending message queue\n");
5612 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005613 }
5614
5615 enuScanConnTimer = SCAN_TIMER;
5616 PRINT_D(HOSTINF_DBG, ">> Starting the SCAN timer\n");
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07005617 pstrWFIDrv->hScanTimer.data = (unsigned long)hWFIDrv;
5618 mod_timer(&pstrWFIDrv->hScanTimer,
5619 jiffies + msecs_to_jiffies(HOST_IF_SCAN_TIMEOUT));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005620
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005621 return s32Error;
5622
5623}
5624/**
5625 * @brief hif_set_cfg
5626 * @details sets configuration wids values
5627 * @param[in,out] handle to the wifi driver,
5628 * @param[in] WID, WID value
5629 * @return Error code indicating success/failure
5630 * @note
5631 * @author zsalah
5632 * @date 8 March 2012
5633 * @version 1.0
5634 */
Leo Kim95296502015-10-05 15:25:46 +09005635s32 hif_set_cfg(tstrWILC_WFIDrv *hWFIDrv, struct cfg_param_val *pstrCfgParamVal)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005636{
5637
Leo Kime6e12662015-09-16 18:36:03 +09005638 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005639 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5640
Tony Cho143eb952015-09-21 12:16:32 +09005641 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005642
5643
Leo Kim24db7132015-09-16 18:36:01 +09005644 if (pstrWFIDrv == NULL) {
5645 PRINT_ER("pstrWFIDrv NULL\n");
5646 return -EFAULT;
5647 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005648 /* prepare the WiphyParams Message */
Tony Cho143eb952015-09-21 12:16:32 +09005649 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005650 msg.id = HOST_IF_MSG_CFG_PARAMS;
Tony Choa2340c32015-09-30 18:44:25 +09005651 msg.body.cfg_info.pstrCfgParamVal = *pstrCfgParamVal;
Tony Cho143eb952015-09-21 12:16:32 +09005652 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005653
Tony Cho143eb952015-09-21 12:16:32 +09005654 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005655
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005656 return s32Error;
5657
5658}
5659
5660
5661/**
5662 * @brief hif_get_cfg
5663 * @details gets configuration wids values
5664 * @param[in,out] handle to the wifi driver,
5665 * WID value
5666 * @param[in] WID,
5667 * @return Error code indicating success/failure
5668 * @note
5669 * @author zsalah
5670 *
5671 * @date 8 March 2012
5672 * @version 1.0
5673 */
Johnny Kim218dc402015-08-13 13:41:19 +09005674s32 hif_get_cfg(tstrWILC_WFIDrv *hWFIDrv, u16 u16WID, u16 *pu16WID_Value)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005675{
Leo Kime6e12662015-09-16 18:36:03 +09005676 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005677 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5678
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005679 down(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005680
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005681 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005682 PRINT_ER("pstrWFIDrv NULL\n");
5683 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005684 }
5685 PRINT_D(HOSTINF_DBG, "Getting configuration parameters\n");
5686 switch (u16WID) {
5687
5688 case WID_BSS_TYPE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005689 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.bss_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005690 break;
5691
5692 case WID_AUTH_TYPE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005693 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005694 break;
5695
5696 case WID_AUTH_TIMEOUT:
5697 *pu16WID_Value = pstrWFIDrv->strCfgValues.auth_timeout;
5698 break;
5699
5700 case WID_POWER_MANAGEMENT:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005701 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.power_mgmt_mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005702 break;
5703
5704 case WID_SHORT_RETRY_LIMIT:
5705 *pu16WID_Value = pstrWFIDrv->strCfgValues.short_retry_limit;
5706 break;
5707
5708 case WID_LONG_RETRY_LIMIT:
5709 *pu16WID_Value = pstrWFIDrv->strCfgValues.long_retry_limit;
5710 break;
5711
5712 case WID_FRAG_THRESHOLD:
5713 *pu16WID_Value = pstrWFIDrv->strCfgValues.frag_threshold;
5714 break;
5715
5716 case WID_RTS_THRESHOLD:
5717 *pu16WID_Value = pstrWFIDrv->strCfgValues.rts_threshold;
5718 break;
5719
5720 case WID_PREAMBLE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005721 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.preamble_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005722 break;
5723
5724 case WID_SHORT_SLOT_ALLOWED:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005725 *pu16WID_Value = (u16) pstrWFIDrv->strCfgValues.short_slot_allowed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005726 break;
5727
5728 case WID_11N_TXOP_PROT_DISABLE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005729 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.txop_prot_disabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005730 break;
5731
5732 case WID_BEACON_INTERVAL:
5733 *pu16WID_Value = pstrWFIDrv->strCfgValues.beacon_interval;
5734 break;
5735
5736 case WID_DTIM_PERIOD:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005737 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.dtim_period;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005738 break;
5739
5740 case WID_SITE_SURVEY:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005741 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.site_survey_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005742 break;
5743
5744 case WID_SITE_SURVEY_SCAN_TIME:
5745 *pu16WID_Value = pstrWFIDrv->strCfgValues.site_survey_scan_time;
5746 break;
5747
5748 case WID_ACTIVE_SCAN_TIME:
5749 *pu16WID_Value = pstrWFIDrv->strCfgValues.active_scan_time;
5750 break;
5751
5752 case WID_PASSIVE_SCAN_TIME:
5753 *pu16WID_Value = pstrWFIDrv->strCfgValues.passive_scan_time;
5754 break;
5755
5756 case WID_CURRENT_TX_RATE:
5757 *pu16WID_Value = pstrWFIDrv->strCfgValues.curr_tx_rate;
5758 break;
5759
5760 default:
5761 break;
5762 }
5763
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005764 up(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005765
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005766 return s32Error;
5767
5768}
5769
5770/*****************************************************************************/
5771/* Notification Functions */
5772/*****************************************************************************/
5773/**
5774 * @brief notifies host with join and leave requests
5775 * @details This function prepares an Information frame having the
5776 * information about a joining/leaving station.
5777 * @param[in,out] handle to the wifi driver,
5778 * @param[in] 6 byte Sta Adress
5779 * Join or leave flag:
5780 * Join = 1,
5781 * Leave =0
5782 * @return Error code indicating success/failure
5783 * @note
5784 * @author zsalah
5785 * @date 8 March 2012
5786 * @version 1.0
5787 */
5788void host_int_send_join_leave_info_to_host
Dean Lee72ed4dc2015-06-12 14:11:44 +09005789 (u16 assocId, u8 *stationAddr, bool joining)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005790{
5791}
5792/**
5793 * @brief notifies host with stations found in scan
5794 * @details sends the beacon/probe response from scan
5795 * @param[in,out] handle to the wifi driver,
5796 * @param[in] Sta Address,
5797 * Frame length,
5798 * Rssi of the Station found
5799 * @return Error code indicating success/failure
5800 * @note
5801 * @author zsalah
5802 * @date 8 March 2012
5803 * @version 1.0
5804 */
5805
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005806static void GetPeriodicRSSI(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005807{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005808 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)arg;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02005809
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005810 if (pstrWFIDrv == NULL) {
5811 PRINT_ER("Driver handler is NULL\n");
5812 return;
5813 }
5814
5815 if (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED) {
Leo Kime6e12662015-09-16 18:36:03 +09005816 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005817 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005818
5819 /* prepare the Get RSSI Message */
Tony Cho143eb952015-09-21 12:16:32 +09005820 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005821
Tony Choa9f812a2015-09-21 12:16:33 +09005822 msg.id = HOST_IF_MSG_GET_RSSI;
Tony Cho143eb952015-09-21 12:16:32 +09005823 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005824
5825 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005826 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005827 if (s32Error) {
5828 PRINT_ER("Failed to send get host channel param's message queue ");
5829 return;
5830 }
5831 }
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07005832 g_hPeriodicRSSI.data = (unsigned long)pstrWFIDrv;
5833 mod_timer(&g_hPeriodicRSSI, jiffies + msecs_to_jiffies(5000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005834}
5835
5836
5837void host_int_send_network_info_to_host
Chaehyun Limca356ad2015-06-11 14:35:57 +09005838 (u8 *macStartAddress, u16 u16RxFrameLen, s8 s8Rssi)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005839{
5840}
5841/**
5842 * @brief host_int_init
5843 * @details host interface initialization function
5844 * @param[in,out] handle to the wifi driver,
5845 * @note
5846 * @author zsalah
5847 * @date 8 March 2012
5848 * @version 1.0
5849 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005850static u32 clients_count;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005851
Johnny Kim218dc402015-08-13 13:41:19 +09005852s32 host_int_init(tstrWILC_WFIDrv **phWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005853{
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005854 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005855 tstrWILC_WFIDrv *pstrWFIDrv;
Johnny Kimd42ab082015-08-20 16:32:52 +09005856 int err;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005857
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005858 PRINT_D(HOSTINF_DBG, "Initializing host interface for client %d\n", clients_count + 1);
5859
Dean Lee72ed4dc2015-06-12 14:11:44 +09005860 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005861
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005862 sema_init(&hWaitResponse, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005863
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005864 /*Allocate host interface private structure*/
Chaehyun Lim27a82eb2015-09-22 18:34:55 +09005865 pstrWFIDrv = kzalloc(sizeof(tstrWILC_WFIDrv), GFP_KERNEL);
Chaehyun Lim16042962015-09-22 18:34:56 +09005866 if (!pstrWFIDrv) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005867 result = -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005868 goto _fail_timer_2;
5869 }
Johnny Kim218dc402015-08-13 13:41:19 +09005870 *phWFIDrv = pstrWFIDrv;
Johnny Kimd42ab082015-08-20 16:32:52 +09005871 err = add_handler_in_list(pstrWFIDrv);
5872 if (err) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005873 result = -EFAULT;
Johnny Kimd42ab082015-08-20 16:32:52 +09005874 goto _fail_timer_2;
5875 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005876
Dean Lee72ed4dc2015-06-12 14:11:44 +09005877 g_obtainingIP = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005878
Johnny Kim8a143302015-06-10 17:06:46 +09005879 PRINT_D(HOSTINF_DBG, "Global handle pointer value=%p\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005880 if (clients_count == 0) {
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005881 sema_init(&hSemHostIFthrdEnd, 0);
5882 sema_init(&hSemDeinitDrvHandle, 0);
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005883 sema_init(&hSemHostIntDeinit, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005884 }
5885
Chaehyun Limdddaba12015-09-22 18:35:01 +09005886 sema_init(&pstrWFIDrv->hSemTestKeyBlock, 0);
5887 sema_init(&pstrWFIDrv->hSemTestDisconnectBlock, 0);
5888 sema_init(&pstrWFIDrv->hSemGetRSSI, 0);
5889 sema_init(&pstrWFIDrv->hSemGetLINKSPEED, 0);
5890 sema_init(&pstrWFIDrv->hSemGetCHNL, 0);
5891 sema_init(&pstrWFIDrv->hSemInactiveTime, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005892
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005893 PRINT_D(HOSTINF_DBG, "INIT: CLIENT COUNT %d\n", clients_count);
5894
5895 if (clients_count == 0) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005896 result = wilc_mq_create(&gMsgQHostIF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005897
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005898 if (result < 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005899 PRINT_ER("Failed to creat MQ\n");
5900 goto _fail_;
5901 }
Arnd Bergmann1999bd52015-05-29 22:52:14 +02005902 HostIFthreadHandler = kthread_run(hostIFthread, NULL, "WILC_kthread");
5903 if (IS_ERR(HostIFthreadHandler)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005904 PRINT_ER("Failed to creat Thread\n");
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005905 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005906 goto _fail_mq_;
5907 }
Greg Kroah-Hartman507d7fc2015-08-17 12:59:42 -07005908 setup_timer(&g_hPeriodicRSSI, GetPeriodicRSSI,
5909 (unsigned long)pstrWFIDrv);
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07005910 mod_timer(&g_hPeriodicRSSI, jiffies + msecs_to_jiffies(5000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005911 }
5912
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005913 setup_timer(&pstrWFIDrv->hScanTimer, TimerCB_Scan, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005914
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005915 setup_timer(&pstrWFIDrv->hConnectTimer, TimerCB_Connect, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005916
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005917 /*Remain on channel timer*/
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005918 setup_timer(&pstrWFIDrv->hRemainOnChannel, ListenTimerCB, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005919
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005920 sema_init(&(pstrWFIDrv->gtOsCfgValuesSem), 1);
Chaehyun Limdddaba12015-09-22 18:35:01 +09005921 down(&pstrWFIDrv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005922
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005923 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005924
5925 /*Initialize CFG WIDS Defualt Values*/
5926
5927 pstrWFIDrv->strCfgValues.site_survey_enabled = SITE_SURVEY_OFF;
5928 pstrWFIDrv->strCfgValues.scan_source = DEFAULT_SCAN;
5929 pstrWFIDrv->strCfgValues.active_scan_time = ACTIVE_SCAN_TIME;
5930 pstrWFIDrv->strCfgValues.passive_scan_time = PASSIVE_SCAN_TIME;
5931 pstrWFIDrv->strCfgValues.curr_tx_rate = AUTORATE;
5932
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005933 pstrWFIDrv->u64P2p_MgmtTimeout = 0;
5934
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005935 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",
5936
5937 pstrWFIDrv->strCfgValues.site_survey_enabled, pstrWFIDrv->strCfgValues.scan_source,
5938 pstrWFIDrv->strCfgValues.active_scan_time, pstrWFIDrv->strCfgValues.passive_scan_time,
5939 pstrWFIDrv->strCfgValues.curr_tx_rate);
5940
Chaehyun Limdddaba12015-09-22 18:35:01 +09005941 up(&pstrWFIDrv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005942
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005943 clients_count++; /* increase number of created entities */
5944
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005945 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005946
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005947_fail_timer_2:
Chaehyun Limdddaba12015-09-22 18:35:01 +09005948 up(&pstrWFIDrv->gtOsCfgValuesSem);
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07005949 del_timer_sync(&pstrWFIDrv->hConnectTimer);
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07005950 del_timer_sync(&pstrWFIDrv->hScanTimer);
Arnd Bergmann1999bd52015-05-29 22:52:14 +02005951 kthread_stop(HostIFthreadHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005952_fail_mq_:
Chaehyun Lim1b128f62015-08-19 15:59:08 +09005953 wilc_mq_destroy(&gMsgQHostIF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005954_fail_:
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09005955 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005956}
5957/**
5958 * @brief host_int_deinit
5959 * @details host interface initialization function
5960 * @param[in,out] handle to the wifi driver,
5961 * @note
5962 * @author zsalah
5963 * @date 8 March 2012
5964 * @version 1.0
5965 */
5966
Johnny Kim218dc402015-08-13 13:41:19 +09005967s32 host_int_deinit(tstrWILC_WFIDrv *hWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005968{
Leo Kime6e12662015-09-16 18:36:03 +09005969 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005970 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09005971 int ret;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005972
5973 /*obtain driver handle*/
5974 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005975
5976 if (pstrWFIDrv == NULL) {
5977 PRINT_ER("pstrWFIDrv = NULL\n");
5978 return 0;
5979 }
5980
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005981 down(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005982
5983 terminated_handle = pstrWFIDrv;
5984 PRINT_D(HOSTINF_DBG, "De-initializing host interface for client %d\n", clients_count);
5985
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005986 /*Destroy all timers before acquiring hSemDeinitDrvHandle*/
5987 /*to guarantee handling all messages befor proceeding*/
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07005988 if (del_timer_sync(&pstrWFIDrv->hScanTimer)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02005989 PRINT_D(HOSTINF_DBG, ">> Scan timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005990 /* msleep(HOST_IF_SCAN_TIMEOUT+1000); */
5991 }
5992
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07005993 if (del_timer_sync(&pstrWFIDrv->hConnectTimer)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02005994 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005995 /* msleep(HOST_IF_CONNECT_TIMEOUT+1000); */
5996 }
5997
5998
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07005999 if (del_timer_sync(&g_hPeriodicRSSI)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006000 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006001 /* msleep(HOST_IF_CONNECT_TIMEOUT+1000); */
6002 }
6003
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006004 /*Destroy Remain-onchannel Timer*/
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006005 del_timer_sync(&pstrWFIDrv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006006
Johnny Kim218dc402015-08-13 13:41:19 +09006007 host_int_set_wfi_drv_handler(NULL);
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006008 down(&hSemDeinitDrvHandle);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006009
6010
6011 /*Calling the CFG80211 scan done function with the abort flag set to true*/
6012 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006013 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_ABORTED, NULL,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006014 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
6015
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006016 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006017 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006018
6019 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
6020
Dean Lee72ed4dc2015-06-12 14:11:44 +09006021 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006022
Tony Cho143eb952015-09-21 12:16:32 +09006023 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006024
6025 if (clients_count == 1) {
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006026 if (del_timer_sync(&g_hPeriodicRSSI)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006027 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006028 /* msleep(HOST_IF_CONNECT_TIMEOUT+1000); */
6029 }
Tony Choa9f812a2015-09-21 12:16:33 +09006030 msg.id = HOST_IF_MSG_EXIT;
Tony Cho143eb952015-09-21 12:16:32 +09006031 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006032
6033
Tony Cho143eb952015-09-21 12:16:32 +09006034 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kime6e12662015-09-16 18:36:03 +09006035 if (s32Error != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006036 PRINT_ER("Error in sending deinit's message queue message function: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006037
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006038 down(&hSemHostIFthrdEnd);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006039
Chaehyun Lim1b128f62015-08-19 15:59:08 +09006040 wilc_mq_destroy(&gMsgQHostIF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006041 }
6042
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006043 down(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006044
6045 /*Setting the gloabl driver handler with NULL*/
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006046 /* gWFiDrvHandle = NULL; */
Johnny Kimd42ab082015-08-20 16:32:52 +09006047 ret = remove_handler_in_list(pstrWFIDrv);
6048 if (ret)
Leo Kime6e12662015-09-16 18:36:03 +09006049 s32Error = -ENOENT;
Johnny Kimd42ab082015-08-20 16:32:52 +09006050
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006051 if (pstrWFIDrv != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09006052 kfree(pstrWFIDrv);
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006053 /* pstrWFIDrv=NULL; */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006054
6055 }
6056
6057 clients_count--; /* Decrease number of created entities */
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006058 terminated_handle = NULL;
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006059 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006060 return s32Error;
6061}
6062
6063
6064/**
6065 * @brief NetworkInfoReceived
6066 * @details function to to be called when network info packet is received
6067 * @param[in] pu8Buffer the received packet
6068 * @param[in] u32Length length of the received packet
6069 * @return none
6070 * @note
6071 * @author
6072 * @date 1 Mar 2012
6073 * @version 1.0
6074 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006075void NetworkInfoReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006076{
Leo Kime6e12662015-09-16 18:36:03 +09006077 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006078 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006079 int id;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006080 tstrWILC_WFIDrv *pstrWFIDrv = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006081
Johnny Kimd42ab082015-08-20 16:32:52 +09006082 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
6083 pstrWFIDrv = get_handler_from_id(id);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006084
6085
6086
6087
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006088 if (pstrWFIDrv == NULL || pstrWFIDrv == terminated_handle) {
Johnny Kim8a143302015-06-10 17:06:46 +09006089 PRINT_ER("NetworkInfo received but driver not init[%p]\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006090 return;
6091 }
6092
6093 /* prepare the Asynchronous Network Info message */
Tony Cho143eb952015-09-21 12:16:32 +09006094 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006095
Tony Choa9f812a2015-09-21 12:16:33 +09006096 msg.id = HOST_IF_MSG_RCVD_NTWRK_INFO;
Tony Cho143eb952015-09-21 12:16:32 +09006097 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006098
Tony Cho02d19462015-09-30 18:44:22 +09006099 msg.body.net_info.u32Length = u32Length;
6100 msg.body.net_info.pu8Buffer = kmalloc(u32Length, GFP_KERNEL); /* will be deallocated by the receiving thread */
6101 memcpy(msg.body.net_info.pu8Buffer,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006102 pu8Buffer, u32Length);
6103
6104 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09006105 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006106 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006107 PRINT_ER("Error in sending network info message queue message parameters: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006108}
6109
6110/**
6111 * @brief GnrlAsyncInfoReceived
6112 * @details function to be called when general Asynchronous info packet is received
6113 * @param[in] pu8Buffer the received packet
6114 * @param[in] u32Length length of the received packet
6115 * @return none
6116 * @note
6117 * @author
6118 * @date 15 Mar 2012
6119 * @version 1.0
6120 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006121void GnrlAsyncInfoReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006122{
Leo Kime6e12662015-09-16 18:36:03 +09006123 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006124 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006125 int id;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006126 tstrWILC_WFIDrv *pstrWFIDrv = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006127
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006128 down(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006129
Johnny Kimd42ab082015-08-20 16:32:52 +09006130 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
6131 pstrWFIDrv = get_handler_from_id(id);
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006132 PRINT_D(HOSTINF_DBG, "General asynchronous info packet received\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006133
6134
6135 if (pstrWFIDrv == NULL || pstrWFIDrv == terminated_handle) {
6136 PRINT_D(HOSTINF_DBG, "Wifi driver handler is equal to NULL\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006137 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006138 return;
6139 }
6140
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006141 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult == NULL) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006142 /* received mac status is not needed when there is no current Connect Request */
6143 PRINT_ER("Received mac status is not needed when there is no current Connect Reques\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006144 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006145 return;
6146 }
6147
6148 /* prepare the General Asynchronous Info message */
Tony Cho143eb952015-09-21 12:16:32 +09006149 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006150
6151
Tony Choa9f812a2015-09-21 12:16:33 +09006152 msg.id = HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO;
Tony Cho143eb952015-09-21 12:16:32 +09006153 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006154
6155
Tony Cho66add622015-09-30 18:44:23 +09006156 msg.body.async_info.u32Length = u32Length;
6157 msg.body.async_info.pu8Buffer = kmalloc(u32Length, GFP_KERNEL); /* will be deallocated by the receiving thread */
6158 memcpy(msg.body.async_info.pu8Buffer,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006159 pu8Buffer, u32Length);
6160
6161 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09006162 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006163 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006164 PRINT_ER("Error in sending message queue asynchronous message info: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006165
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006166 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006167}
6168
6169/**
6170 * @brief host_int_ScanCompleteReceived
6171 * @details Setting scan complete received notifcation in message queue
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006172 * @param[in] u8* pu8Buffer, u32 u32Length
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006173 * @return Error code.
6174 * @author
6175 * @date
6176 * @version 1.0
6177 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006178void host_int_ScanCompleteReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006179{
Leo Kime6e12662015-09-16 18:36:03 +09006180 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006181 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006182 int id;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006183 tstrWILC_WFIDrv *pstrWFIDrv = NULL;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006184
Johnny Kimd42ab082015-08-20 16:32:52 +09006185 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
6186 pstrWFIDrv = get_handler_from_id(id);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006187
6188
Johnny Kim8a143302015-06-10 17:06:46 +09006189 PRINT_D(GENERIC_DBG, "Scan notification received %p\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006190
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006191 if (pstrWFIDrv == NULL || pstrWFIDrv == terminated_handle)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006192 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006193
6194 /*if there is an ongoing scan request*/
6195 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
6196 /* prepare theScan Done message */
Tony Cho143eb952015-09-21 12:16:32 +09006197 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006198
Tony Choa9f812a2015-09-21 12:16:33 +09006199 msg.id = HOST_IF_MSG_RCVD_SCAN_COMPLETE;
Tony Cho143eb952015-09-21 12:16:32 +09006200 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006201
6202
6203 /* will be deallocated by the receiving thread */
6204 /*no need to send message body*/
6205
Tony Cho410c2482015-09-21 12:16:35 +09006206 /*msg.body.strScanComplete.u32Length = u32Length;
6207 * msg.body.strScanComplete.pu8Buffer = (u8*)WILC_MALLOC(u32Length);
6208 * memcpy(msg.body.strScanComplete.pu8Buffer,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006209 * pu8Buffer, u32Length); */
6210
6211 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09006212 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006213 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006214 PRINT_ER("Error in sending message queue scan complete parameters: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006215 }
6216
6217
6218 return;
6219
6220}
6221
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006222/**
6223 * @brief host_int_remain_on_channel
6224 * @details
6225 * @param[in] Handle to wifi driver
6226 * Duration to remain on channel
6227 * Channel to remain on
6228 * Pointer to fn to be called on receive frames in listen state
6229 * Pointer to remain-on-channel expired fn
6230 * Priv
6231 * @return Error code.
6232 * @author
6233 * @date
6234 * @version 1.0
6235 */
Leo Kimfc1848a2015-10-05 15:25:50 +09006236s32 host_int_remain_on_channel(tstrWILC_WFIDrv *hWFIDrv, u32 u32SessionID, u32 u32duration, u16 chan, wilc_remain_on_chan_expired RemainOnChanExpired, wilc_remain_on_chan_ready RemainOnChanReady, void *pvUserArg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006237{
Leo Kime6e12662015-09-16 18:36:03 +09006238 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006239 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006240 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006241
Leo Kim24db7132015-09-16 18:36:01 +09006242 if (pstrWFIDrv == NULL) {
6243 PRINT_ER("driver is null\n");
6244 return -EFAULT;
6245 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006246
6247 /* prepare the remainonchan Message */
Tony Cho143eb952015-09-21 12:16:32 +09006248 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006249
6250 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006251 msg.id = HOST_IF_MSG_REMAIN_ON_CHAN;
Tony Cho070d3652015-09-30 18:55:10 +09006252 msg.body.remain_on_ch.u16Channel = chan;
6253 msg.body.remain_on_ch.pRemainOnChanExpired = RemainOnChanExpired;
6254 msg.body.remain_on_ch.pRemainOnChanReady = RemainOnChanReady;
6255 msg.body.remain_on_ch.pVoid = pvUserArg;
6256 msg.body.remain_on_ch.u32duration = u32duration;
6257 msg.body.remain_on_ch.u32ListenSessionID = u32SessionID;
Tony Cho143eb952015-09-21 12:16:32 +09006258 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006259
Tony Cho143eb952015-09-21 12:16:32 +09006260 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006261 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006262 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006263
6264 return s32Error;
6265}
6266
6267/**
6268 * @brief host_int_ListenStateExpired
6269 * @details
6270 * @param[in] Handle to wifi driver
6271 * Duration to remain on channel
6272 * Channel to remain on
6273 * Pointer to fn to be called on receive frames in listen state
6274 * Pointer to remain-on-channel expired fn
6275 * Priv
6276 * @return Error code.
6277 * @author
6278 * @date
6279 * @version 1.0
6280 */
Johnny Kim218dc402015-08-13 13:41:19 +09006281s32 host_int_ListenStateExpired(tstrWILC_WFIDrv *hWFIDrv, u32 u32SessionID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006282{
Leo Kime6e12662015-09-16 18:36:03 +09006283 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006284 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006285 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006286
Leo Kim24db7132015-09-16 18:36:01 +09006287 if (pstrWFIDrv == NULL) {
6288 PRINT_ER("driver is null\n");
6289 return -EFAULT;
6290 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006291
6292 /*Stopping remain-on-channel timer*/
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07006293 del_timer(&pstrWFIDrv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006294
6295 /* prepare the timer fire Message */
Tony Cho143eb952015-09-21 12:16:32 +09006296 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09006297 msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
Tony Cho143eb952015-09-21 12:16:32 +09006298 msg.drvHandler = hWFIDrv;
Tony Cho070d3652015-09-30 18:55:10 +09006299 msg.body.remain_on_ch.u32ListenSessionID = u32SessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006300
Tony Cho143eb952015-09-21 12:16:32 +09006301 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006302 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006303 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006304
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006305 return s32Error;
6306}
6307
6308/**
6309 * @brief host_int_frame_register
6310 * @details
6311 * @param[in] Handle to wifi driver
6312 * @return Error code.
6313 * @author
6314 * @date
6315 * @version 1.0*/
Johnny Kim218dc402015-08-13 13:41:19 +09006316s32 host_int_frame_register(tstrWILC_WFIDrv *hWFIDrv, u16 u16FrameType, bool bReg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006317{
Leo Kime6e12662015-09-16 18:36:03 +09006318 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006319 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006320 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006321
Leo Kim24db7132015-09-16 18:36:01 +09006322 if (pstrWFIDrv == NULL) {
6323 PRINT_ER("driver is null\n");
6324 return -EFAULT;
6325 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006326
Tony Cho143eb952015-09-21 12:16:32 +09006327 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006328
6329 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006330 msg.id = HOST_IF_MSG_REGISTER_FRAME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006331 switch (u16FrameType) {
6332 case ACTION:
6333 PRINT_D(HOSTINF_DBG, "ACTION\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09006334 msg.body.reg_frame.u8Regid = ACTION_FRM_IDX;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006335 break;
6336
6337 case PROBE_REQ:
6338 PRINT_D(HOSTINF_DBG, "PROBE REQ\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09006339 msg.body.reg_frame.u8Regid = PROBE_REQ_IDX;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006340 break;
6341
6342 default:
6343 PRINT_D(HOSTINF_DBG, "Not valid frame type\n");
6344 break;
6345 }
Tony Cho5c4008d2015-10-05 13:50:44 +09006346 msg.body.reg_frame.u16FrameType = u16FrameType;
6347 msg.body.reg_frame.bReg = bReg;
Tony Cho143eb952015-09-21 12:16:32 +09006348 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006349
Tony Cho143eb952015-09-21 12:16:32 +09006350 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006351 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006352 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006353
6354 return s32Error;
6355
6356
6357}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006358
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006359/**
6360 * @brief host_int_add_beacon
6361 * @details Setting add beacon params in message queue
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006362 * @param[in] WILC_WFIDrvHandle hWFIDrv, u32 u32Interval,
6363 * u32 u32DTIMPeriod,u32 u32HeadLen, u8* pu8Head,
6364 * u32 u32TailLen, u8* pu8Tail
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006365 * @return Error code.
6366 * @author
6367 * @date
6368 * @version 1.0
6369 */
Johnny Kim218dc402015-08-13 13:41:19 +09006370s32 host_int_add_beacon(tstrWILC_WFIDrv *hWFIDrv, u32 u32Interval,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006371 u32 u32DTIMPeriod,
6372 u32 u32HeadLen, u8 *pu8Head,
6373 u32 u32TailLen, u8 *pu8Tail)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006374{
Leo Kime6e12662015-09-16 18:36:03 +09006375 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006376 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006377 struct host_if_msg msg;
Tony Choa98491e2015-09-30 18:44:31 +09006378 struct beacon_attr *pstrSetBeaconParam = &msg.body.beacon_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006379
Leo Kim24db7132015-09-16 18:36:01 +09006380 if (pstrWFIDrv == NULL) {
6381 PRINT_ER("driver is null\n");
6382 return -EFAULT;
6383 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006384
Tony Cho143eb952015-09-21 12:16:32 +09006385 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006386
6387 PRINT_D(HOSTINF_DBG, "Setting adding beacon message queue params\n");
6388
6389
6390 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006391 msg.id = HOST_IF_MSG_ADD_BEACON;
Tony Cho143eb952015-09-21 12:16:32 +09006392 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006393 pstrSetBeaconParam->u32Interval = u32Interval;
6394 pstrSetBeaconParam->u32DTIMPeriod = u32DTIMPeriod;
6395 pstrSetBeaconParam->u32HeadLen = u32HeadLen;
Glen Leef3052582015-09-10 12:03:04 +09006396 pstrSetBeaconParam->pu8Head = kmalloc(u32HeadLen, GFP_KERNEL);
Leo Kim24db7132015-09-16 18:36:01 +09006397 if (pstrSetBeaconParam->pu8Head == NULL) {
6398 s32Error = -ENOMEM;
6399 goto ERRORHANDLER;
6400 }
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006401 memcpy(pstrSetBeaconParam->pu8Head, pu8Head, u32HeadLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006402 pstrSetBeaconParam->u32TailLen = u32TailLen;
6403
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006404 if (u32TailLen > 0) {
Glen Leef3052582015-09-10 12:03:04 +09006405 pstrSetBeaconParam->pu8Tail = kmalloc(u32TailLen, GFP_KERNEL);
Leo Kim24db7132015-09-16 18:36:01 +09006406 if (pstrSetBeaconParam->pu8Tail == NULL) {
6407 s32Error = -ENOMEM;
6408 goto ERRORHANDLER;
6409 }
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006410 memcpy(pstrSetBeaconParam->pu8Tail, pu8Tail, u32TailLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006411 } else {
6412 pstrSetBeaconParam->pu8Tail = NULL;
6413 }
6414
Tony Cho143eb952015-09-21 12:16:32 +09006415 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006416 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006417 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006418
Leo Kim24db7132015-09-16 18:36:01 +09006419ERRORHANDLER:
6420 if (s32Error) {
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006421 if (pstrSetBeaconParam->pu8Head != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09006422 kfree(pstrSetBeaconParam->pu8Head);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006423
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006424 if (pstrSetBeaconParam->pu8Tail != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09006425 kfree(pstrSetBeaconParam->pu8Tail);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006426 }
6427
6428 return s32Error;
6429
6430}
6431
6432
6433/**
6434 * @brief host_int_del_beacon
6435 * @details Setting add beacon params in message queue
6436 * @param[in] WILC_WFIDrvHandle hWFIDrv
6437 * @return Error code.
6438 * @author
6439 * @date
6440 * @version 1.0
6441 */
Johnny Kim218dc402015-08-13 13:41:19 +09006442s32 host_int_del_beacon(tstrWILC_WFIDrv *hWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006443{
Leo Kime6e12662015-09-16 18:36:03 +09006444 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006445 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006446 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006447
Leo Kim24db7132015-09-16 18:36:01 +09006448 if (pstrWFIDrv == NULL) {
6449 PRINT_ER("driver is null\n");
6450 return -EFAULT;
6451 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006452
6453 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006454 msg.id = HOST_IF_MSG_DEL_BEACON;
Tony Cho143eb952015-09-21 12:16:32 +09006455 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006456 PRINT_D(HOSTINF_DBG, "Setting deleting beacon message queue params\n");
6457
Tony Cho143eb952015-09-21 12:16:32 +09006458 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kim7dc1d0c2015-09-16 18:36:00 +09006459 if (s32Error)
6460 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006461
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006462 return s32Error;
6463}
6464
6465
6466/**
6467 * @brief host_int_add_station
6468 * @details Setting add station params in message queue
Tony Cho6a89ba92015-09-21 12:16:46 +09006469 * @param[in] WILC_WFIDrvHandle hWFIDrv, struct add_sta_param *pstrStaParams
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006470 * @return Error code.
6471 * @author
6472 * @date
6473 * @version 1.0
6474 */
Tony Cho6a89ba92015-09-21 12:16:46 +09006475s32 host_int_add_station(tstrWILC_WFIDrv *hWFIDrv,
6476 struct add_sta_param *pstrStaParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006477{
Leo Kime6e12662015-09-16 18:36:03 +09006478 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006479 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006480 struct host_if_msg msg;
Tony Choca8f47f2015-09-30 18:44:32 +09006481 struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006482
6483
Leo Kim24db7132015-09-16 18:36:01 +09006484 if (pstrWFIDrv == NULL) {
6485 PRINT_ER("driver is null\n");
6486 return -EFAULT;
6487 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006488
Tony Cho143eb952015-09-21 12:16:32 +09006489 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006490
6491 PRINT_D(HOSTINF_DBG, "Setting adding station message queue params\n");
6492
6493
6494 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006495 msg.id = HOST_IF_MSG_ADD_STATION;
Tony Cho143eb952015-09-21 12:16:32 +09006496 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006497
Tony Cho6a89ba92015-09-21 12:16:46 +09006498 memcpy(pstrAddStationMsg, pstrStaParams, sizeof(struct add_sta_param));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006499 if (pstrAddStationMsg->u8NumRates > 0) {
Glen Leef3052582015-09-10 12:03:04 +09006500 u8 *rates = kmalloc(pstrAddStationMsg->u8NumRates, GFP_KERNEL);
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006501
Leo Kim7ae43362015-09-16 18:35:59 +09006502 if (!rates)
6503 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006504
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006505 memcpy(rates, pstrStaParams->pu8Rates, pstrAddStationMsg->u8NumRates);
Arnd Bergmann057d1e92015-06-01 21:06:44 +02006506 pstrAddStationMsg->pu8Rates = rates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006507 }
6508
6509
Tony Cho143eb952015-09-21 12:16:32 +09006510 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006511 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006512 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006513 return s32Error;
6514}
6515
6516/**
6517 * @brief host_int_del_station
6518 * @details Setting delete station params in message queue
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006519 * @param[in] WILC_WFIDrvHandle hWFIDrv, u8* pu8MacAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006520 * @return Error code.
6521 * @author
6522 * @date
6523 * @version 1.0
6524 */
Johnny Kim218dc402015-08-13 13:41:19 +09006525s32 host_int_del_station(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8MacAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006526{
Leo Kime6e12662015-09-16 18:36:03 +09006527 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006528 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006529 struct host_if_msg msg;
Tony Cho889c25b2015-09-30 18:44:33 +09006530 struct del_sta *pstrDelStationMsg = &msg.body.del_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006531
Leo Kim24db7132015-09-16 18:36:01 +09006532 if (pstrWFIDrv == NULL) {
6533 PRINT_ER("driver is null\n");
6534 return -EFAULT;
6535 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006536
Tony Cho143eb952015-09-21 12:16:32 +09006537 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006538
6539 PRINT_D(HOSTINF_DBG, "Setting deleting station message queue params\n");
6540
6541
6542
6543 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006544 msg.id = HOST_IF_MSG_DEL_STATION;
Tony Cho143eb952015-09-21 12:16:32 +09006545 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006546
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006547 if (pu8MacAddr == NULL)
Chaehyun Lim2cc46832015-08-07 09:02:01 +09006548 memset(pstrDelStationMsg->au8MacAddr, 255, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006549 else
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006550 memcpy(pstrDelStationMsg->au8MacAddr, pu8MacAddr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006551
Tony Cho143eb952015-09-21 12:16:32 +09006552 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006553 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006554 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006555 return s32Error;
6556}
6557/**
6558 * @brief host_int_del_allstation
6559 * @details Setting del station params in message queue
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006560 * @param[in] WILC_WFIDrvHandle hWFIDrv, u8 pu8MacAddr[][ETH_ALEN]s
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006561 * @return Error code.
6562 * @author
6563 * @date
6564 * @version 1.0
6565 */
Johnny Kim218dc402015-08-13 13:41:19 +09006566s32 host_int_del_allstation(tstrWILC_WFIDrv *hWFIDrv, u8 pu8MacAddr[][ETH_ALEN])
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006567{
Leo Kime6e12662015-09-16 18:36:03 +09006568 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006569 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006570 struct host_if_msg msg;
Tony Chob0c1e802015-10-05 13:50:46 +09006571 struct del_all_sta *pstrDelAllStationMsg = &msg.body.del_all_sta_info;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006572 u8 au8Zero_Buff[ETH_ALEN] = {0};
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006573 u32 i;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006574 u8 u8AssocNumb = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006575
6576
Leo Kim24db7132015-09-16 18:36:01 +09006577 if (pstrWFIDrv == NULL) {
6578 PRINT_ER("driver is null\n");
6579 return -EFAULT;
6580 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006581
Tony Cho143eb952015-09-21 12:16:32 +09006582 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006583
6584 PRINT_D(HOSTINF_DBG, "Setting deauthenticating station message queue params\n");
6585
6586 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006587 msg.id = HOST_IF_MSG_DEL_ALL_STA;
Tony Cho143eb952015-09-21 12:16:32 +09006588 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006589
6590 /* Handling situation of deauthenticing all associated stations*/
6591 for (i = 0; i < MAX_NUM_STA; i++) {
6592 if (memcmp(pu8MacAddr[i], au8Zero_Buff, ETH_ALEN)) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006593 memcpy(pstrDelAllStationMsg->au8Sta_DelAllSta[i], pu8MacAddr[i], ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006594 PRINT_D(CFG80211_DBG, "BSSID = %x%x%x%x%x%x\n", pstrDelAllStationMsg->au8Sta_DelAllSta[i][0], pstrDelAllStationMsg->au8Sta_DelAllSta[i][1], pstrDelAllStationMsg->au8Sta_DelAllSta[i][2], pstrDelAllStationMsg->au8Sta_DelAllSta[i][3], pstrDelAllStationMsg->au8Sta_DelAllSta[i][4],
6595 pstrDelAllStationMsg->au8Sta_DelAllSta[i][5]);
6596 u8AssocNumb++;
6597 }
6598 }
6599 if (!u8AssocNumb) {
6600 PRINT_D(CFG80211_DBG, "NO ASSOCIATED STAS\n");
6601 return s32Error;
6602 }
6603
6604 pstrDelAllStationMsg->u8Num_AssocSta = u8AssocNumb;
Tony Cho143eb952015-09-21 12:16:32 +09006605 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006606
6607
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006608 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006609 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006610
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006611 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006612
6613 return s32Error;
6614
6615}
6616
6617/**
6618 * @brief host_int_edit_station
6619 * @details Setting edit station params in message queue
Tony Cho6a89ba92015-09-21 12:16:46 +09006620 * @param[in] WILC_WFIDrvHandle hWFIDrv, struct add_sta_param *pstrStaParams
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006621 * @return Error code.
6622 * @author
6623 * @date
6624 * @version 1.0
6625 */
Tony Cho6a89ba92015-09-21 12:16:46 +09006626s32 host_int_edit_station(tstrWILC_WFIDrv *hWFIDrv,
6627 struct add_sta_param *pstrStaParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006628{
Leo Kime6e12662015-09-16 18:36:03 +09006629 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006630 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006631 struct host_if_msg msg;
Tony Choca8f47f2015-09-30 18:44:32 +09006632 struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006633
Leo Kim24db7132015-09-16 18:36:01 +09006634 if (pstrWFIDrv == NULL) {
6635 PRINT_ER("driver is null\n");
6636 return -EFAULT;
6637 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006638
6639 PRINT_D(HOSTINF_DBG, "Setting editing station message queue params\n");
6640
Tony Cho143eb952015-09-21 12:16:32 +09006641 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006642
6643
6644 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006645 msg.id = HOST_IF_MSG_EDIT_STATION;
Tony Cho143eb952015-09-21 12:16:32 +09006646 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006647
Tony Cho6a89ba92015-09-21 12:16:46 +09006648 memcpy(pstrAddStationMsg, pstrStaParams, sizeof(struct add_sta_param));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006649 if (pstrAddStationMsg->u8NumRates > 0) {
Glen Leef3052582015-09-10 12:03:04 +09006650 u8 *rates = kmalloc(pstrAddStationMsg->u8NumRates, GFP_KERNEL);
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006651
Leo Kim7ae43362015-09-16 18:35:59 +09006652 if (!rates)
6653 return -ENOMEM;
6654
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006655 memcpy(rates, pstrStaParams->pu8Rates, pstrAddStationMsg->u8NumRates);
Arnd Bergmann057d1e92015-06-01 21:06:44 +02006656 pstrAddStationMsg->pu8Rates = rates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006657 }
6658
Tony Cho143eb952015-09-21 12:16:32 +09006659 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006660 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006661 PRINT_ER("wilc_mq_send fail\n");
6662
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006663 return s32Error;
6664}
Glen Lee108b3432015-09-16 18:53:20 +09006665
Johnny Kim218dc402015-08-13 13:41:19 +09006666s32 host_int_set_power_mgmt(tstrWILC_WFIDrv *hWFIDrv, bool bIsEnabled, u32 u32Timeout)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006667{
Leo Kime6e12662015-09-16 18:36:03 +09006668 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006669 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006670 struct host_if_msg msg;
Tony Cho49e1f812015-09-30 18:44:36 +09006671 struct power_mgmt_param *pstrPowerMgmtParam = &msg.body.pwr_mgmt_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006672
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006673 PRINT_INFO(HOSTINF_DBG, "\n\n>> Setting PS to %d <<\n\n", bIsEnabled);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006674
Leo Kim24db7132015-09-16 18:36:01 +09006675 if (pstrWFIDrv == NULL) {
6676 PRINT_ER("driver is null\n");
6677 return -EFAULT;
6678 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006679
6680 PRINT_D(HOSTINF_DBG, "Setting Power management message queue params\n");
6681
Tony Cho143eb952015-09-21 12:16:32 +09006682 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006683
6684
6685 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006686 msg.id = HOST_IF_MSG_POWER_MGMT;
Tony Cho143eb952015-09-21 12:16:32 +09006687 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006688
6689 pstrPowerMgmtParam->bIsEnabled = bIsEnabled;
6690 pstrPowerMgmtParam->u32Timeout = u32Timeout;
6691
6692
Tony Cho143eb952015-09-21 12:16:32 +09006693 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006694 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006695 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006696 return s32Error;
6697}
6698
Johnny Kim218dc402015-08-13 13:41:19 +09006699s32 host_int_setup_multicast_filter(tstrWILC_WFIDrv *hWFIDrv, bool bIsEnabled, u32 u32count)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006700{
Leo Kime6e12662015-09-16 18:36:03 +09006701 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006702
6703 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006704 struct host_if_msg msg;
Tony Choa079cf4d2015-09-30 18:55:05 +09006705 struct set_multicast *pstrMulticastFilterParam = &msg.body.multicast_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006706
6707
Leo Kim24db7132015-09-16 18:36:01 +09006708 if (pstrWFIDrv == NULL) {
6709 PRINT_ER("driver is null\n");
6710 return -EFAULT;
6711 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006712
6713 PRINT_D(HOSTINF_DBG, "Setting Multicast Filter params\n");
6714
Tony Cho143eb952015-09-21 12:16:32 +09006715 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006716
6717
6718 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006719 msg.id = HOST_IF_MSG_SET_MULTICAST_FILTER;
Tony Cho143eb952015-09-21 12:16:32 +09006720 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006721
6722 pstrMulticastFilterParam->bIsEnabled = bIsEnabled;
6723 pstrMulticastFilterParam->u32count = u32count;
6724
Tony Cho143eb952015-09-21 12:16:32 +09006725 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006726 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006727 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006728 return s32Error;
6729}
6730
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006731/**
6732 * @brief host_int_ParseJoinBssParam
6733 * @details Parse Needed Join Parameters and save it in a new JoinBssParam entry
6734 * @param[in] tstrNetworkInfo* ptstrNetworkInfo
6735 * @return
6736 * @author zsalah
6737 * @date
6738 * @version 1.0**/
6739static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo)
6740{
6741 tstrJoinBssParam *pNewJoinBssParam = NULL;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006742 u8 *pu8IEs;
Chaehyun Limd85f5322015-06-11 14:35:54 +09006743 u16 u16IEsLen;
6744 u16 index = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006745 u8 suppRatesNo = 0;
6746 u8 extSuppRatesNo;
Chaehyun Limd85f5322015-06-11 14:35:54 +09006747 u16 jumpOffset;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006748 u8 pcipherCount;
6749 u8 authCount;
6750 u8 pcipherTotalCount = 0;
6751 u8 authTotalCount = 0;
6752 u8 i, j;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006753
6754 pu8IEs = ptstrNetworkInfo->pu8IEs;
6755 u16IEsLen = ptstrNetworkInfo->u16IEsLen;
6756
Glen Leef3052582015-09-10 12:03:04 +09006757 pNewJoinBssParam = kmalloc(sizeof(tstrJoinBssParam), GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006758 if (pNewJoinBssParam != NULL) {
Chaehyun Lim2cc46832015-08-07 09:02:01 +09006759 memset(pNewJoinBssParam, 0, sizeof(tstrJoinBssParam));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006760 pNewJoinBssParam->dtim_period = ptstrNetworkInfo->u8DtimPeriod;
6761 pNewJoinBssParam->beacon_period = ptstrNetworkInfo->u16BeaconPeriod;
6762 pNewJoinBssParam->cap_info = ptstrNetworkInfo->u16CapInfo;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006763 memcpy(pNewJoinBssParam->au8bssid, ptstrNetworkInfo->au8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006764 /*for(i=0; i<6;i++)
6765 * PRINT_D(HOSTINF_DBG,"%c",pNewJoinBssParam->au8bssid[i]);*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006766 memcpy((u8 *)pNewJoinBssParam->ssid, ptstrNetworkInfo->au8ssid, ptstrNetworkInfo->u8SsidLen + 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006767 pNewJoinBssParam->ssidLen = ptstrNetworkInfo->u8SsidLen;
Chaehyun Lim2cc46832015-08-07 09:02:01 +09006768 memset(pNewJoinBssParam->rsn_pcip_policy, 0xFF, 3);
6769 memset(pNewJoinBssParam->rsn_auth_policy, 0xFF, 3);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006770 /*for(i=0; i<pNewJoinBssParam->ssidLen;i++)
6771 * PRINT_D(HOSTINF_DBG,"%c",pNewJoinBssParam->ssid[i]);*/
6772
6773 /* parse supported rates: */
6774 while (index < u16IEsLen) {
6775 /* supportedRates IE */
6776 if (pu8IEs[index] == SUPP_RATES_IE) {
6777 /* PRINT_D(HOSTINF_DBG, "Supported Rates\n"); */
6778 suppRatesNo = pu8IEs[index + 1];
6779 pNewJoinBssParam->supp_rates[0] = suppRatesNo;
6780 index += 2; /* skipping ID and length bytes; */
6781
6782 for (i = 0; i < suppRatesNo; i++) {
6783 pNewJoinBssParam->supp_rates[i + 1] = pu8IEs[index + i];
6784 /* PRINT_D(HOSTINF_DBG,"%0x ",pNewJoinBssParam->supp_rates[i+1]); */
6785 }
6786 index += suppRatesNo;
6787 continue;
6788 }
6789 /* Ext SupportedRates IE */
6790 else if (pu8IEs[index] == EXT_SUPP_RATES_IE) {
6791 /* PRINT_D(HOSTINF_DBG, "Extended Supported Rates\n"); */
6792 /* checking if no of ext. supp and supp rates < max limit */
6793 extSuppRatesNo = pu8IEs[index + 1];
6794 if (extSuppRatesNo > (MAX_RATES_SUPPORTED - suppRatesNo))
6795 pNewJoinBssParam->supp_rates[0] = MAX_RATES_SUPPORTED;
6796 else
6797 pNewJoinBssParam->supp_rates[0] += extSuppRatesNo;
6798 index += 2;
6799 /* pNewJoinBssParam.supp_rates[0] contains now old number not the ext. no */
6800 for (i = 0; i < (pNewJoinBssParam->supp_rates[0] - suppRatesNo); i++) {
6801 pNewJoinBssParam->supp_rates[suppRatesNo + i + 1] = pu8IEs[index + i];
6802 /* PRINT_D(HOSTINF_DBG,"%0x ",pNewJoinBssParam->supp_rates[suppRatesNo+i+1]); */
6803 }
6804 index += extSuppRatesNo;
6805 continue;
6806 }
6807 /* HT Cap. IE */
6808 else if (pu8IEs[index] == HT_CAPABILITY_IE) {
6809 /* if IE found set the flag */
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09006810 pNewJoinBssParam->ht_capable = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006811 index += pu8IEs[index + 1] + 2; /* ID,Length bytes and IE body */
6812 /* PRINT_D(HOSTINF_DBG,"HT_CAPABALE\n"); */
6813 continue;
6814 } else if ((pu8IEs[index] == WMM_IE) && /* WMM Element ID */
6815 (pu8IEs[index + 2] == 0x00) && (pu8IEs[index + 3] == 0x50) &&
6816 (pu8IEs[index + 4] == 0xF2) && /* OUI */
6817 (pu8IEs[index + 5] == 0x02) && /* OUI Type */
6818 ((pu8IEs[index + 6] == 0x00) || (pu8IEs[index + 6] == 0x01)) && /* OUI Sub Type */
6819 (pu8IEs[index + 7] == 0x01)) {
6820 /* Presence of WMM Info/Param element indicates WMM capability */
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09006821 pNewJoinBssParam->wmm_cap = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006822
6823 /* Check if Bit 7 is set indicating U-APSD capability */
Anish Bhattffda2032015-09-29 12:15:49 -07006824 if (pu8IEs[index + 8] & BIT(7))
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09006825 pNewJoinBssParam->uapsd_cap = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006826 index += pu8IEs[index + 1] + 2;
6827 continue;
6828 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006829 else if ((pu8IEs[index] == P2P_IE) && /* P2P Element ID */
6830 (pu8IEs[index + 2] == 0x50) && (pu8IEs[index + 3] == 0x6f) &&
6831 (pu8IEs[index + 4] == 0x9a) && /* OUI */
6832 (pu8IEs[index + 5] == 0x09) && (pu8IEs[index + 6] == 0x0c)) { /* OUI Type */
Chaehyun Limd85f5322015-06-11 14:35:54 +09006833 u16 u16P2P_count;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006834
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006835 pNewJoinBssParam->tsf = ptstrNetworkInfo->u32Tsf;
6836 pNewJoinBssParam->u8NoaEnbaled = 1;
6837 pNewJoinBssParam->u8Index = pu8IEs[index + 9];
6838
6839 /* Check if Bit 7 is set indicating Opss capability */
Anish Bhattffda2032015-09-29 12:15:49 -07006840 if (pu8IEs[index + 10] & BIT(7)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006841 pNewJoinBssParam->u8OppEnable = 1;
6842 pNewJoinBssParam->u8CtWindow = pu8IEs[index + 10];
6843 } else
6844 pNewJoinBssParam->u8OppEnable = 0;
6845 /* HOSTINF_DBG */
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006846 PRINT_D(GENERIC_DBG, "P2P Dump\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006847 for (i = 0; i < pu8IEs[index + 7]; i++)
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006848 PRINT_D(GENERIC_DBG, " %x\n", pu8IEs[index + 9 + i]);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006849
6850 pNewJoinBssParam->u8Count = pu8IEs[index + 11];
6851 u16P2P_count = index + 12;
6852
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006853 memcpy(pNewJoinBssParam->au8Duration, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006854 u16P2P_count += 4;
6855
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006856 memcpy(pNewJoinBssParam->au8Interval, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006857 u16P2P_count += 4;
6858
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006859 memcpy(pNewJoinBssParam->au8StartTime, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006860
6861 index += pu8IEs[index + 1] + 2;
6862 continue;
6863
6864 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006865 else if ((pu8IEs[index] == RSN_IE) ||
6866 ((pu8IEs[index] == WPA_IE) && (pu8IEs[index + 2] == 0x00) &&
6867 (pu8IEs[index + 3] == 0x50) && (pu8IEs[index + 4] == 0xF2) &&
6868 (pu8IEs[index + 5] == 0x01))) {
Chaehyun Limd85f5322015-06-11 14:35:54 +09006869 u16 rsnIndex = index;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006870 /*PRINT_D(HOSTINF_DBG,"RSN IE Length:%d\n",pu8IEs[rsnIndex+1]);
6871 * for(i=0; i<pu8IEs[rsnIndex+1]; i++)
6872 * {
6873 * PRINT_D(HOSTINF_DBG,"%0x ",pu8IEs[rsnIndex+2+i]);
6874 * }*/
6875 if (pu8IEs[rsnIndex] == RSN_IE) {
6876 pNewJoinBssParam->mode_802_11i = 2;
6877 /* PRINT_D(HOSTINF_DBG,"\nRSN_IE\n"); */
6878 } else { /* check if rsn was previously parsed */
6879 if (pNewJoinBssParam->mode_802_11i == 0)
6880 pNewJoinBssParam->mode_802_11i = 1;
6881 /* PRINT_D(HOSTINF_DBG,"\nWPA_IE\n"); */
6882 rsnIndex += 4;
6883 }
6884 rsnIndex += 7; /* skipping id, length, version(2B) and first 3 bytes of gcipher */
6885 pNewJoinBssParam->rsn_grp_policy = pu8IEs[rsnIndex];
6886 rsnIndex++;
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006887 /* PRINT_D(HOSTINF_DBG,"Group Policy: %0x\n",pNewJoinBssParam->rsn_grp_policy); */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006888 /* initialize policies with invalid values */
6889
6890 jumpOffset = pu8IEs[rsnIndex] * 4; /* total no.of bytes of pcipher field (count*4) */
6891
6892 /*parsing pairwise cipher*/
6893
6894 /* saving 3 pcipher max. */
6895 pcipherCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
6896 rsnIndex += 2; /* jump 2 bytes of pcipher count */
6897
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006898 /* PRINT_D(HOSTINF_DBG,"\npcipher:%d\n",pcipherCount); */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006899 for (i = pcipherTotalCount, j = 0; i < pcipherCount + pcipherTotalCount && i < 3; i++, j++) {
6900 /* each count corresponds to 4 bytes, only last byte is saved */
6901 pNewJoinBssParam->rsn_pcip_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
6902 /* PRINT_D(HOSTINF_DBG,"PAIR policy = [%0x,%0x]\n",pNewJoinBssParam->rsn_pcip_policy[i],i); */
6903 }
6904 pcipherTotalCount += pcipherCount;
6905 rsnIndex += jumpOffset;
6906
6907 jumpOffset = pu8IEs[rsnIndex] * 4;
6908
6909 /*parsing AKM suite (auth_policy)*/
6910 /* saving 3 auth policies max. */
6911 authCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
6912 rsnIndex += 2; /* jump 2 bytes of pcipher count */
6913
6914 for (i = authTotalCount, j = 0; i < authTotalCount + authCount; i++, j++) {
6915 /* each count corresponds to 4 bytes, only last byte is saved */
6916 pNewJoinBssParam->rsn_auth_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
6917 }
6918 authTotalCount += authCount;
6919 rsnIndex += jumpOffset;
6920 /*pasring rsn cap. only if rsn IE*/
6921 if (pu8IEs[index] == RSN_IE) {
6922 pNewJoinBssParam->rsn_cap[0] = pu8IEs[rsnIndex];
6923 pNewJoinBssParam->rsn_cap[1] = pu8IEs[rsnIndex + 1];
6924 rsnIndex += 2;
6925 }
Abdul Hussainf717c0eb2015-06-16 09:49:49 +00006926 pNewJoinBssParam->rsn_found = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006927 index += pu8IEs[index + 1] + 2; /* ID,Length bytes and IE body */
6928 continue;
6929 } else
6930 index += pu8IEs[index + 1] + 2; /* ID,Length bytes and IE body */
6931
6932 }
6933
6934
6935 }
6936
6937 return (void *)pNewJoinBssParam;
6938
6939}
6940
6941void host_int_freeJoinParams(void *pJoinParams)
6942{
6943 if ((tstrJoinBssParam *)pJoinParams != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09006944 kfree((tstrJoinBssParam *)pJoinParams);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006945 else
6946 PRINT_ER("Unable to FREE null pointer\n");
6947}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006948
Johnny Kim218dc402015-08-13 13:41:19 +09006949s32 host_int_delBASession(tstrWILC_WFIDrv *hWFIDrv, char *pBSSID, char TID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006950{
Leo Kime6e12662015-09-16 18:36:03 +09006951 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006952 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006953 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09006954 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006955
Leo Kim24db7132015-09-16 18:36:01 +09006956 if (pstrWFIDrv == NULL) {
6957 PRINT_ER("driver is null\n");
6958 return -EFAULT;
6959 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006960
Tony Cho143eb952015-09-21 12:16:32 +09006961 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006962
6963 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006964 msg.id = HOST_IF_MSG_DEL_BA_SESSION;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006965
6966 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
6967 pBASessionInfo->u8Ted = TID;
Tony Cho143eb952015-09-21 12:16:32 +09006968 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006969
Tony Cho143eb952015-09-21 12:16:32 +09006970 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006971 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006972 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006973
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006974 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006975
6976 return s32Error;
6977}
6978
Johnny Kim218dc402015-08-13 13:41:19 +09006979s32 host_int_del_All_Rx_BASession(tstrWILC_WFIDrv *hWFIDrv, char *pBSSID, char TID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006980{
Leo Kime6e12662015-09-16 18:36:03 +09006981 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006982 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006983 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09006984 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006985
Leo Kim24db7132015-09-16 18:36:01 +09006986 if (pstrWFIDrv == NULL) {
6987 PRINT_ER("driver is null\n");
6988 return -EFAULT;
6989 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006990
Tony Cho143eb952015-09-21 12:16:32 +09006991 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006992
6993 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006994 msg.id = HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006995
6996 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
6997 pBASessionInfo->u8Ted = TID;
Tony Cho143eb952015-09-21 12:16:32 +09006998 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006999
Tony Cho143eb952015-09-21 12:16:32 +09007000 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007001 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007002 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007003
Arnd Bergmann83383ea2015-06-01 21:06:43 +02007004 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007005
7006 return s32Error;
7007}
7008
7009/**
7010 * @brief host_int_setup_ipaddress
7011 * @details setup IP in firmware
7012 * @param[in] Handle to wifi driver
7013 * @return Error code.
7014 * @author Abdelrahman Sobhy
7015 * @date
7016 * @version 1.0*/
Johnny Kim218dc402015-08-13 13:41:19 +09007017s32 host_int_setup_ipaddress(tstrWILC_WFIDrv *hWFIDrv, u8 *u16ipadd, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007018{
Leo Kime6e12662015-09-16 18:36:03 +09007019 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007020 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007021 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007022
7023 /* TODO: Enable This feature on softap firmware */
7024 return 0;
7025
Leo Kim24db7132015-09-16 18:36:01 +09007026 if (pstrWFIDrv == NULL) {
7027 PRINT_ER("driver is null\n");
7028 return -EFAULT;
7029 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007030
Tony Cho143eb952015-09-21 12:16:32 +09007031 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007032
7033 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007034 msg.id = HOST_IF_MSG_SET_IPADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007035
Tony Chofb2d65e2015-09-30 18:44:39 +09007036 msg.body.ip_info.au8IPAddr = u16ipadd;
Tony Cho143eb952015-09-21 12:16:32 +09007037 msg.drvHandler = hWFIDrv;
Tony Chofb2d65e2015-09-30 18:44:39 +09007038 msg.body.ip_info.idx = idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007039
Tony Cho143eb952015-09-21 12:16:32 +09007040 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007041 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007042 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007043
7044 return s32Error;
7045
7046
7047}
7048
7049/**
7050 * @brief host_int_get_ipaddress
7051 * @details Get IP from firmware
7052 * @param[in] Handle to wifi driver
7053 * @return Error code.
7054 * @author Abdelrahman Sobhy
7055 * @date
7056 * @version 1.0*/
Johnny Kim218dc402015-08-13 13:41:19 +09007057s32 host_int_get_ipaddress(tstrWILC_WFIDrv *hWFIDrv, u8 *u16ipadd, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007058{
Leo Kime6e12662015-09-16 18:36:03 +09007059 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007060 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007061 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007062
Leo Kim24db7132015-09-16 18:36:01 +09007063 if (pstrWFIDrv == NULL) {
7064 PRINT_ER("driver is null\n");
7065 return -EFAULT;
7066 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007067
Tony Cho143eb952015-09-21 12:16:32 +09007068 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007069
7070 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007071 msg.id = HOST_IF_MSG_GET_IPADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007072
Tony Chofb2d65e2015-09-30 18:44:39 +09007073 msg.body.ip_info.au8IPAddr = u16ipadd;
Tony Cho143eb952015-09-21 12:16:32 +09007074 msg.drvHandler = hWFIDrv;
Tony Chofb2d65e2015-09-30 18:44:39 +09007075 msg.body.ip_info.idx = idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007076
Tony Cho143eb952015-09-21 12:16:32 +09007077 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007078 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007079 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007080
7081 return s32Error;
7082
7083
7084}