blob: ddc729cc8a882d8d4fce8adc0a46e9a00a11a164 [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 /* host_int_addBASession(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid,0, */
2264 /* BA_SESSION_DEFAULT_BUFFER_SIZE,BA_SESSION_DEFAULT_TIMEOUT); */
2265 } else {
2266 PRINT_D(HOSTINF_DBG, "MAC status : %d and Connect Status : %d\n", u8MacStatus, strConnectInfo.u16ConnectStatus);
2267 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
Dean Lee72ed4dc2015-06-12 14:11:44 +09002268 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002269 }
2270
2271 /* Deallocation */
2272 if (strConnectInfo.pu8RespIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002273 kfree(strConnectInfo.pu8RespIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002274 strConnectInfo.pu8RespIEs = NULL;
2275 }
2276
2277 if (strConnectInfo.pu8ReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002278 kfree(strConnectInfo.pu8ReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002279 strConnectInfo.pu8ReqIEs = NULL;
2280 }
2281
2282
2283 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
2284 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002285 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002286 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
2287 }
2288
2289 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002290 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002291 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
2292 }
2293
2294 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2295 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002296 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002297 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
2298 }
2299
2300 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
2301 (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED)) {
2302 /* Disassociation or Deauthentication frame has been received */
2303 PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW\n");
2304
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002305 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002306
2307 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002308 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running OBSS Scan >>\n\n");
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002309 del_timer(&pstrWFIDrv->hScanTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002310 Handle_ScanDone((void *)pstrWFIDrv, SCAN_EVENT_ABORTED);
2311 }
2312
2313 strDisconnectNotifInfo.u16reason = 0;
2314 strDisconnectNotifInfo.ie = NULL;
2315 strDisconnectNotifInfo.ie_len = 0;
2316
2317 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult != NULL) {
Dean Lee72ed4dc2015-06-12 14:11:44 +09002318 g_obtainingIP = false;
Johnny Kim218dc402015-08-13 13:41:19 +09002319 host_int_set_power_mgmt(pstrWFIDrv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002320
2321 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_DISCONN_NOTIF,
2322 NULL,
2323 0,
2324 &strDisconnectNotifInfo,
2325 pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid);
2326
2327 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002328 PRINT_ER("Connect result callback function is NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002329 }
2330
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002331 memset(pstrWFIDrv->au8AssociatedBSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002332
2333
2334 /* Deallocation */
2335
2336 /* if Information Elements were retrieved from the Received deauth/disassoc frame, then they
2337 * should be deallocated here */
2338 /*
2339 * if(strDisconnectNotifInfo.ie != NULL)
2340 * {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002341 * kfree(strDisconnectNotifInfo.ie);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002342 * strDisconnectNotifInfo.ie = NULL;
2343 * }
2344 */
2345
2346 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
2347 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002348 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002349 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
2350 }
2351
2352 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002353 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002354 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
2355 }
2356
2357 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2358 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002359 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002360 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
2361 }
2362
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002363 /*Freeing flushed join request params on receiving*/
2364 /*MAC_DISCONNECTED while connected*/
Johnny Kim8a625ca2015-08-20 16:32:50 +09002365 if (gu8FlushedJoinReq != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002366 kfree(gu8FlushedJoinReq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002367 gu8FlushedJoinReq = NULL;
2368 }
Johnny Kim8a625ca2015-08-20 16:32:50 +09002369 if (gu8FlushedInfoElemAsoc != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002370 kfree(gu8FlushedInfoElemAsoc);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002371 gu8FlushedInfoElemAsoc = NULL;
2372 }
2373
2374 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
Dean Lee72ed4dc2015-06-12 14:11:44 +09002375 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002376
2377 } else if ((u8MacStatus == MAC_DISCONNECTED) &&
2378 (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult != NULL)) {
2379 PRINT_D(HOSTINF_DBG, "Received MAC_DISCONNECTED from the FW while scanning\n");
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002380 PRINT_D(HOSTINF_DBG, "\n\n<< Abort the running Scan >>\n\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002381 /*Abort the running scan*/
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002382 del_timer(&pstrWFIDrv->hScanTimer);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02002383 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult)
Johnny Kim2b05df52015-08-13 13:41:21 +09002384 Handle_ScanDone(pstrWFIDrv, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002385
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002386 }
2387
2388 }
2389
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002390 /* Deallocate pstrRcvdGnrlAsyncInfo->pu8Buffer which was prevoisuly allocated by the sending thread */
2391 if (pstrRcvdGnrlAsyncInfo->pu8Buffer != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002392 kfree(pstrRcvdGnrlAsyncInfo->pu8Buffer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002393 pstrRcvdGnrlAsyncInfo->pu8Buffer = NULL;
2394 }
2395
2396 return s32Error;
2397}
2398
2399/**
2400 * @brief Handle_Key
2401 * @details Sending config packet to firmware to set key
Tony Choc98387a2015-09-21 12:16:40 +09002402 * @param[in] struct key_attr *pstrHostIFkeyAttr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002403 * @return Error code.
2404 * @author
2405 * @date
2406 * @version 1.0
2407 */
Tony Choc98387a2015-09-21 12:16:40 +09002408static int Handle_Key(tstrWILC_WFIDrv *drvHandler,
2409 struct key_attr *pstrHostIFkeyAttr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002410{
Leo Kime6e12662015-09-16 18:36:03 +09002411 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002412 tstrWID strWID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002413 tstrWID strWIDList[5];
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09002414 u8 i;
2415 u8 *pu8keybuf;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002416 s8 s8idxarray[1];
2417 s8 ret = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002418 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2419
2420
2421 switch (pstrHostIFkeyAttr->enuKeyType) {
2422
2423
2424 case WEP:
2425
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002426 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY_AP) {
2427
2428 PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
2429 PRINT_D(GENERIC_DBG, "ID Hostint is %d\n", (pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx));
Chaehyun Limd85f5322015-06-11 14:35:54 +09002430 strWIDList[0].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002431 strWIDList[0].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002432 strWIDList[0].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002433 strWIDList[0].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8mode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002434
2435 strWIDList[1].u16WIDid = WID_AUTH_TYPE;
2436 strWIDList[1].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002437 strWIDList[1].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002438 strWIDList[1].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.tenuAuth_type));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002439
Chaehyun Limd85f5322015-06-11 14:35:54 +09002440 strWIDList[2].u16WIDid = (u16)WID_KEY_ID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002441 strWIDList[2].enuWIDtype = WID_CHAR;
2442
Chaehyun Limca356ad2015-06-11 14:35:57 +09002443 strWIDList[2].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx));
Dean Lee576917a2015-06-15 11:58:57 +09002444 strWIDList[2].s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002445
2446
Glen Leef3052582015-09-10 12:03:04 +09002447 pu8keybuf = kmalloc(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002448
2449
2450 if (pu8keybuf == NULL) {
2451 PRINT_ER("No buffer to send Key\n");
2452 return -1;
2453 }
2454
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002455 memcpy(pu8keybuf, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002456 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen);
2457
2458
Chaehyun Lim49188af2015-08-11 10:32:41 +09002459 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002460
Chaehyun Limd85f5322015-06-11 14:35:54 +09002461 strWIDList[3].u16WIDid = (u16)WID_WEP_KEY_VALUE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002462 strWIDList[3].enuWIDtype = WID_STR;
2463 strWIDList[3].s32ValueSize = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002464 strWIDList[3].ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002465
2466
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002467 s32Error = send_config_pkt(SET_CFG, strWIDList, 4, true,
2468 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002469 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002470
2471
2472 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002473
2474 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY) {
2475 PRINT_D(HOSTINF_DBG, "Handling WEP key\n");
Glen Leef3052582015-09-10 12:03:04 +09002476 pu8keybuf = kmalloc(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen + 2, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002477 if (pu8keybuf == NULL) {
2478 PRINT_ER("No buffer to send Key\n");
2479 return -1;
2480 }
2481 pu8keybuf[0] = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx;
2482
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002483 memcpy(pu8keybuf + 1, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002484
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002485 memcpy(pu8keybuf + 2, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002486 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen);
2487
Chaehyun Lim49188af2015-08-11 10:32:41 +09002488 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002489
Chaehyun Limd85f5322015-06-11 14:35:54 +09002490 strWID.u16WIDid = (u16)WID_ADD_WEP_KEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002491 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002492 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002493 strWID.s32ValueSize = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen + 2;
2494
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002495 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2496 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002497 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002498 } else if (pstrHostIFkeyAttr->u8KeyAction & REMOVEKEY) {
2499
2500 PRINT_D(HOSTINF_DBG, "Removing key\n");
Chaehyun Limd85f5322015-06-11 14:35:54 +09002501 strWID.u16WIDid = (u16)WID_REMOVE_WEP_KEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002502 strWID.enuWIDtype = WID_STR;
2503
Chaehyun Limca356ad2015-06-11 14:35:57 +09002504 s8idxarray[0] = (s8)pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002505 strWID.ps8WidVal = s8idxarray;
2506 strWID.s32ValueSize = 1;
2507
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002508 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2509 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002510 } else {
Chaehyun Limd85f5322015-06-11 14:35:54 +09002511 strWID.u16WIDid = (u16)WID_KEY_ID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002512 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002513 strWID.ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx));
Dean Lee576917a2015-06-15 11:58:57 +09002514 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002515
2516 PRINT_D(HOSTINF_DBG, "Setting default key index\n");
2517
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002518 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2519 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002520 }
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002521 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002522 break;
2523
2524 case WPARxGtk:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002525 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY_AP) {
Glen Leef3052582015-09-10 12:03:04 +09002526 pu8keybuf = kmalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002527 if (pu8keybuf == NULL) {
2528 PRINT_ER("No buffer to send RxGTK Key\n");
2529 ret = -1;
2530 goto _WPARxGtk_end_case_;
2531 }
2532
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002533 memset(pu8keybuf, 0, RX_MIC_KEY_MSG_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002534
2535
2536 /*|----------------------------------------------------------------------------|
2537 * |Sta Address | Key RSC | KeyID | Key Length | Temporal Key | Rx Michael Key |
2538 * |------------|---------|-------|------------|---------------|----------------|
2539 | 6 bytes | 8 byte |1 byte | 1 byte | 16 bytes | 8 bytes |*/
2540
2541
2542
2543 if (pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq != NULL)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002544 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq, 8);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002545
2546
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002547 memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002548
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002549 memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002550
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002551 memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002552 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2553 /* pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode = 0X51; */
Chaehyun Limd85f5322015-06-11 14:35:54 +09002554 strWIDList[0].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002555 strWIDList[0].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002556 strWIDList[0].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002557 strWIDList[0].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002558
Chaehyun Limd85f5322015-06-11 14:35:54 +09002559 strWIDList[1].u16WIDid = (u16)WID_ADD_RX_GTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002560 strWIDList[1].enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002561 strWIDList[1].ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002562 strWIDList[1].s32ValueSize = RX_MIC_KEY_MSG_LEN;
2563
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002564 s32Error = send_config_pkt(SET_CFG, strWIDList, 2, true,
2565 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002566
Chaehyun Lim49188af2015-08-11 10:32:41 +09002567 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002568
2569 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002570 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002571 /* ///////////////////////// */
2572 }
2573
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002574 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY) {
2575 PRINT_D(HOSTINF_DBG, "Handling group key(Rx) function\n");
2576
Glen Leef3052582015-09-10 12:03:04 +09002577 pu8keybuf = kmalloc(RX_MIC_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002578 if (pu8keybuf == NULL) {
2579 PRINT_ER("No buffer to send RxGTK Key\n");
2580 ret = -1;
2581 goto _WPARxGtk_end_case_;
2582 }
2583
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002584 memset(pu8keybuf, 0, RX_MIC_KEY_MSG_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002585
2586
2587 /*|----------------------------------------------------------------------------|
2588 * |Sta Address | Key RSC | KeyID | Key Length | Temporal Key | Rx Michael Key |
2589 * |------------|---------|-------|------------|---------------|----------------|
2590 | 6 bytes | 8 byte |1 byte | 1 byte | 16 bytes | 8 bytes |*/
2591
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05302592 if (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002593 memcpy(pu8keybuf, pstrWFIDrv->au8AssociatedBSSID, ETH_ALEN);
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05302594 else
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002595 PRINT_ER("Couldn't handle WPARxGtk while enuHostIFstate is not HOST_IF_CONNECTED\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002596
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002597 memcpy(pu8keybuf + 6, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq, 8);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002598
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002599 memcpy(pu8keybuf + 14, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002600
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002601 memcpy(pu8keybuf + 15, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
2602 memcpy(pu8keybuf + 16, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002603 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2604
Chaehyun Limd85f5322015-06-11 14:35:54 +09002605 strWID.u16WIDid = (u16)WID_ADD_RX_GTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002606 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002607 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002608 strWID.s32ValueSize = RX_MIC_KEY_MSG_LEN;
2609
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002610 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2611 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002612
Chaehyun Lim49188af2015-08-11 10:32:41 +09002613 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002614
2615 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002616 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002617 /* ///////////////////////// */
2618 }
2619_WPARxGtk_end_case_:
Chaehyun Lim49188af2015-08-11 10:32:41 +09002620 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key);
2621 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002622 if (ret == -1)
2623 return ret;
2624
2625 break;
2626
2627 case WPAPtk:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002628 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY_AP) {
2629
2630
Glen Leef3052582015-09-10 12:03:04 +09002631 pu8keybuf = kmalloc(PTK_KEY_MSG_LEN + 1, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002632
2633
2634
2635 if (pu8keybuf == NULL) {
2636 PRINT_ER("No buffer to send PTK Key\n");
2637 ret = -1;
2638 goto _WPAPtk_end_case_;
2639
2640 }
2641
2642 /*|-----------------------------------------------------------------------------|
2643 * |Station address | keyidx |Key Length |Temporal Key | Rx Michael Key |Tx Michael Key |
2644 * |----------------|------------ |--------------|----------------|---------------|
2645 | 6 bytes | 1 byte | 1byte | 16 bytes | 8 bytes | 8 bytes |
2646 |-----------------------------------------------------------------------------|*/
2647
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002648 memcpy(pu8keybuf, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8macaddr, 6); /*1 bytes Key Length */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002649
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002650 memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx, 1);
2651 memcpy(pu8keybuf + 7, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002652 /*16 byte TK*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002653 memcpy(pu8keybuf + 8, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002654 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2655
2656
Chaehyun Limd85f5322015-06-11 14:35:54 +09002657 strWIDList[0].u16WIDid = (u16)WID_11I_MODE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002658 strWIDList[0].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09002659 strWIDList[0].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09002660 strWIDList[0].ps8WidVal = (s8 *)(&(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002661
Chaehyun Limd85f5322015-06-11 14:35:54 +09002662 strWIDList[1].u16WIDid = (u16)WID_ADD_PTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002663 strWIDList[1].enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002664 strWIDList[1].ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002665 strWIDList[1].s32ValueSize = PTK_KEY_MSG_LEN + 1;
2666
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002667 s32Error = send_config_pkt(SET_CFG, strWIDList, 2, true,
2668 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002669 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002670
2671 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002672 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002673 /* ///////////////////////// */
2674 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002675 if (pstrHostIFkeyAttr->u8KeyAction & ADDKEY) {
2676
2677
Glen Leef3052582015-09-10 12:03:04 +09002678 pu8keybuf = kmalloc(PTK_KEY_MSG_LEN, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002679
2680
2681
2682 if (pu8keybuf == NULL) {
2683 PRINT_ER("No buffer to send PTK Key\n");
2684 ret = -1;
2685 goto _WPAPtk_end_case_;
2686
2687 }
2688
2689 /*|-----------------------------------------------------------------------------|
2690 * |Station address | Key Length | Temporal Key | Rx Michael Key |Tx Michael Key |
2691 * |----------------|------------|--------------|----------------|---------------|
2692 | 6 bytes | 1byte | 16 bytes | 8 bytes | 8 bytes |
2693 |-----------------------------------------------------------------------------|*/
2694
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002695 memcpy(pu8keybuf, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8macaddr, 6); /*1 bytes Key Length */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002696
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002697 memcpy(pu8keybuf + 6, &pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002698 /*16 byte TK*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002699 memcpy(pu8keybuf + 7, pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002700 pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen);
2701
2702
Chaehyun Limd85f5322015-06-11 14:35:54 +09002703 strWID.u16WIDid = (u16)WID_ADD_PTK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002704 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002705 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002706 strWID.s32ValueSize = PTK_KEY_MSG_LEN;
2707
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002708 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2709 get_id_from_handler(pstrWFIDrv));
Chaehyun Lim49188af2015-08-11 10:32:41 +09002710 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002711
2712 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002713 up(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002714 /* ///////////////////////// */
2715 }
2716
2717_WPAPtk_end_case_:
Chaehyun Lim49188af2015-08-11 10:32:41 +09002718 kfree(pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFwpaAttr.pu8key);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002719 if (ret == -1)
2720 return ret;
2721
2722 break;
2723
2724
2725 case PMKSA:
2726
2727 PRINT_D(HOSTINF_DBG, "Handling PMKSA key\n");
2728
Glen Leef3052582015-09-10 12:03:04 +09002729 pu8keybuf = kmalloc((pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid * PMKSA_KEY_LEN) + 1, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002730 if (pu8keybuf == NULL) {
2731 PRINT_ER("No buffer to send PMKSA Key\n");
2732 return -1;
2733 }
2734
2735 pu8keybuf[0] = pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid;
2736
2737 for (i = 0; i < pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid; i++) {
2738
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09002739 memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + 1), pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].bssid, ETH_ALEN);
2740 memcpy(pu8keybuf + ((PMKSA_KEY_LEN * i) + ETH_ALEN + 1), pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].pmkid, PMKID_LEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002741 }
2742
Chaehyun Limd85f5322015-06-11 14:35:54 +09002743 strWID.u16WIDid = (u16)WID_PMKID_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002744 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002745 strWID.ps8WidVal = (s8 *)pu8keybuf;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002746 strWID.s32ValueSize = (pstrHostIFkeyAttr->uniHostIFkeyAttr.strHostIFpmkidAttr.numpmkid * PMKSA_KEY_LEN) + 1;
2747
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002748 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2749 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002750
Chaehyun Lim49188af2015-08-11 10:32:41 +09002751 kfree(pu8keybuf);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002752 break;
2753 }
2754
2755 if (s32Error)
2756 PRINT_ER("Failed to send key config packet\n");
2757
2758
2759 return s32Error;
2760}
2761
2762
2763/**
2764 * @brief Handle_Disconnect
2765 * @details Sending config packet to firmware to disconnect
2766 * @param[in] NONE
2767 * @return NONE
2768 * @author
2769 * @date
2770 * @version 1.0
2771 */
Johnny Kim2b05df52015-08-13 13:41:21 +09002772static void Handle_Disconnect(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002773{
2774 tstrWID strWID;
2775
Leo Kime6e12662015-09-16 18:36:03 +09002776 s32 s32Error = 0;
Chaehyun Limd85f5322015-06-11 14:35:54 +09002777 u16 u16DummyReasonCode = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002778 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2779
2780
Chaehyun Limd85f5322015-06-11 14:35:54 +09002781 strWID.u16WIDid = (u16)WID_DISCONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002782 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002783 strWID.ps8WidVal = (s8 *)&u16DummyReasonCode;
Dean Lee576917a2015-06-15 11:58:57 +09002784 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002785
2786
2787
2788 PRINT_D(HOSTINF_DBG, "Sending disconnect request\n");
2789
Dean Lee72ed4dc2015-06-12 14:11:44 +09002790 g_obtainingIP = false;
Johnny Kim218dc402015-08-13 13:41:19 +09002791 host_int_set_power_mgmt(pstrWFIDrv, 0, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002792
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002793 memset(u8ConnectedSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002794
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002795 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
2796 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002797
2798 if (s32Error) {
2799 PRINT_ER("Failed to send dissconect config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002800 } else {
2801 tstrDisconnectNotifInfo strDisconnectNotifInfo;
2802
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002803 memset(&strDisconnectNotifInfo, 0, sizeof(tstrDisconnectNotifInfo));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002804
2805 strDisconnectNotifInfo.u16reason = 0;
2806 strDisconnectNotifInfo.ie = NULL;
2807 strDisconnectNotifInfo.ie_len = 0;
2808
2809 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002810 del_timer(&pstrWFIDrv->hScanTimer);
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002811 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_ABORTED, NULL,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002812 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
2813
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002814 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002815 }
2816
2817 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult != NULL) {
2818
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002819 /*Stop connect timer, if connection in progress*/
2820 if (pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
2821 PRINT_D(HOSTINF_DBG, "Upper layer requested termination of connection\n");
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07002822 del_timer(&pstrWFIDrv->hConnectTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002823 }
2824
2825 pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult(CONN_DISCONN_EVENT_DISCONN_NOTIF, NULL,
2826 0, &strDisconnectNotifInfo, pstrWFIDrv->strWILC_UsrConnReq.u32UserConnectPvoid);
2827 } else {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02002828 PRINT_ER("strWILC_UsrConnReq.pfUserConnectResult = NULL\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002829 }
2830
Dean Lee72ed4dc2015-06-12 14:11:44 +09002831 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002832
2833 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
2834
Chaehyun Lim2cc46832015-08-07 09:02:01 +09002835 memset(pstrWFIDrv->au8AssociatedBSSID, 0, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002836
2837
2838 /* Deallocation */
2839 pstrWFIDrv->strWILC_UsrConnReq.ssidLen = 0;
2840 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002841 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002842 pstrWFIDrv->strWILC_UsrConnReq.pu8ssid = NULL;
2843 }
2844
2845 if (pstrWFIDrv->strWILC_UsrConnReq.pu8bssid != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002846 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8bssid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002847 pstrWFIDrv->strWILC_UsrConnReq.pu8bssid = NULL;
2848 }
2849
2850 pstrWFIDrv->strWILC_UsrConnReq.ConnReqIEsLen = 0;
2851 if (pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002852 kfree(pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002853 pstrWFIDrv->strWILC_UsrConnReq.pu8ConnReqIEs = NULL;
2854 }
2855
2856
Johnny Kim8a625ca2015-08-20 16:32:50 +09002857 if (gu8FlushedJoinReq != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002858 kfree(gu8FlushedJoinReq);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002859 gu8FlushedJoinReq = NULL;
2860 }
Johnny Kim8a625ca2015-08-20 16:32:50 +09002861 if (gu8FlushedInfoElemAsoc != NULL && gu8FlushedJoinReqDrvHandler == drvHandler) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09002862 kfree(gu8FlushedInfoElemAsoc);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002863 gu8FlushedInfoElemAsoc = NULL;
2864 }
2865
2866 }
2867
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002868 /* ////////////////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002869 up(&(pstrWFIDrv->hSemTestDisconnectBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002870 /* ///////////////////////// */
2871
2872}
2873
2874
Johnny Kim2b05df52015-08-13 13:41:21 +09002875void resolve_disconnect_aberration(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002876{
2877 tstrWILC_WFIDrv *pstrWFIDrv;
2878
2879 pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09002880 if (pstrWFIDrv == NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002881 return;
2882 if ((pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) || (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTING)) {
2883 PRINT_D(HOSTINF_DBG, "\n\n<< correcting Supplicant state machine >>\n\n");
Johnny Kim218dc402015-08-13 13:41:19 +09002884 host_int_disconnect(pstrWFIDrv, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002885 }
2886}
Johnny Kim2b05df52015-08-13 13:41:21 +09002887static s32 Switch_Log_Terminal(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002888{
2889
2890
Leo Kime6e12662015-09-16 18:36:03 +09002891 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002892 tstrWID strWID;
2893 static char dummy = 9;
2894 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2895
Chaehyun Limd85f5322015-06-11 14:35:54 +09002896 strWID.u16WIDid = (u16)WID_LOGTerminal_Switch;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002897 strWID.enuWIDtype = WID_CHAR;
2898 strWID.ps8WidVal = &dummy;
Dean Lee576917a2015-06-15 11:58:57 +09002899 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002900
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002901 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
2902 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002903
2904
2905 if (s32Error) {
2906 PRINT_D(HOSTINF_DBG, "Failed to switch log terminal\n");
Leo Kim24db7132015-09-16 18:36:01 +09002907 PRINT_ER("Failed to switch log terminal\n");
2908 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002909 }
2910
Leo Kim24db7132015-09-16 18:36:01 +09002911 PRINT_INFO(HOSTINF_DBG, "MAC address set ::\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002912
2913 return s32Error;
2914}
2915
2916/**
2917 * @brief Handle_GetChnl
2918 * @details Sending config packet to get channel
2919 * @param[in] NONE
2920 * @return NONE
2921 *
2922 * @author
2923 * @date
2924 * @version 1.0
2925 */
Johnny Kim2b05df52015-08-13 13:41:21 +09002926static s32 Handle_GetChnl(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002927{
2928
Leo Kime6e12662015-09-16 18:36:03 +09002929 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002930 tstrWID strWID;
2931 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
2932 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02002933
Chaehyun Limd85f5322015-06-11 14:35:54 +09002934 strWID.u16WIDid = (u16)WID_CURRENT_CHANNEL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002935 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09002936 strWID.ps8WidVal = (s8 *)&gu8Chnl;
Dean Lee576917a2015-06-15 11:58:57 +09002937 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002938
2939 PRINT_D(HOSTINF_DBG, "Getting channel value\n");
2940
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002941 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
2942 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002943 /*get the value by searching the local copy*/
2944 if (s32Error) {
2945 PRINT_ER("Failed to get channel number\n");
Leo Kim24db7132015-09-16 18:36:01 +09002946 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002947 }
2948
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002949 up(&(pstrWFIDrv->hSemGetCHNL));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002950
2951 return s32Error;
2952
2953
2954
2955}
2956
2957
2958/**
2959 * @brief Handle_GetRssi
2960 * @details Sending config packet to get RSSI
2961 * @param[in] NONE
2962 * @return NONE
2963 * @author
2964 * @date
2965 * @version 1.0
2966 */
Johnny Kim2b05df52015-08-13 13:41:21 +09002967static void Handle_GetRssi(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002968{
Leo Kime6e12662015-09-16 18:36:03 +09002969 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002970 tstrWID strWID;
2971 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2972
Chaehyun Limd85f5322015-06-11 14:35:54 +09002973 strWID.u16WIDid = (u16)WID_RSSI;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002974 strWID.enuWIDtype = WID_CHAR;
2975 strWID.ps8WidVal = &gs8Rssi;
Dean Lee576917a2015-06-15 11:58:57 +09002976 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002977
2978 /*Sending Cfg*/
2979 PRINT_D(HOSTINF_DBG, "Getting RSSI value\n");
2980
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09002981 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
2982 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002983 if (s32Error) {
2984 PRINT_ER("Failed to get RSSI value\n");
Leo Kim24db7132015-09-16 18:36:01 +09002985 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002986 }
2987
Arnd Bergmann83383ea2015-06-01 21:06:43 +02002988 up(&(pstrWFIDrv->hSemGetRSSI));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002989
2990
2991}
2992
2993
Johnny Kim2b05df52015-08-13 13:41:21 +09002994static void Handle_GetLinkspeed(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002995{
Leo Kime6e12662015-09-16 18:36:03 +09002996 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09002997 tstrWID strWID;
2998 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
2999
3000 gs8lnkspd = 0;
3001
Chaehyun Limd85f5322015-06-11 14:35:54 +09003002 strWID.u16WIDid = (u16)WID_LINKSPEED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003003 strWID.enuWIDtype = WID_CHAR;
3004 strWID.ps8WidVal = &gs8lnkspd;
Dean Lee576917a2015-06-15 11:58:57 +09003005 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003006 /*Sending Cfg*/
3007 PRINT_D(HOSTINF_DBG, "Getting LINKSPEED value\n");
3008
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003009 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
3010 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003011 if (s32Error) {
3012 PRINT_ER("Failed to get LINKSPEED value\n");
Leo Kim24db7132015-09-16 18:36:01 +09003013 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003014 }
3015
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003016 up(&(pstrWFIDrv->hSemGetLINKSPEED));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003017
3018
3019}
3020
Johnny Kim2b05df52015-08-13 13:41:21 +09003021s32 Handle_GetStatistics(tstrWILC_WFIDrv *drvHandler, tstrStatistics *pstrStatistics)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003022{
3023 tstrWID strWIDList[5];
Chaehyun Limfbc2fe12015-09-15 14:06:16 +09003024 u32 u32WidsCount = 0, s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003025
3026 strWIDList[u32WidsCount].u16WIDid = WID_LINKSPEED;
3027 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09003028 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003029 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u8LinkSpeed));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003030 u32WidsCount++;
3031
3032 strWIDList[u32WidsCount].u16WIDid = WID_RSSI;
3033 strWIDList[u32WidsCount].enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09003034 strWIDList[u32WidsCount].s32ValueSize = sizeof(char);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003035 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->s8RSSI));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003036 u32WidsCount++;
3037
3038 strWIDList[u32WidsCount].u16WIDid = WID_SUCCESS_FRAME_COUNT;
3039 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003040 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003041 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u32TxCount));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003042 u32WidsCount++;
3043
3044 strWIDList[u32WidsCount].u16WIDid = WID_RECEIVED_FRAGMENT_COUNT;
3045 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003046 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003047 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u32RxCount));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003048 u32WidsCount++;
3049
3050 strWIDList[u32WidsCount].u16WIDid = WID_FAILED_COUNT;
3051 strWIDList[u32WidsCount].enuWIDtype = WID_INT;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003052 strWIDList[u32WidsCount].s32ValueSize = sizeof(u32);
Chaehyun Limca356ad2015-06-11 14:35:57 +09003053 strWIDList[u32WidsCount].ps8WidVal = (s8 *)(&(pstrStatistics->u32TxFailureCount));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003054 u32WidsCount++;
3055
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003056 s32Error = send_config_pkt(GET_CFG, strWIDList, u32WidsCount, false,
3057 get_id_from_handler(drvHandler));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003058
Leo Kim24db7132015-09-16 18:36:01 +09003059 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003060 PRINT_ER("Failed to send scan paramters config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +09003061
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003062 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003063 return 0;
3064
3065}
3066
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003067/**
3068 * @brief Handle_Get_InActiveTime
3069 * @details Sending config packet to set mac adddress for station and
3070 * get inactive time
3071 * @param[in] NONE
3072 * @return NONE
3073 *
3074 * @author
3075 * @date
3076 * @version 1.0
3077 */
Tony Cho3d1eac02015-09-21 12:16:49 +09003078static s32 Handle_Get_InActiveTime(tstrWILC_WFIDrv *drvHandler,
3079 struct sta_inactive_t *strHostIfStaInactiveT)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003080{
3081
Leo Kime6e12662015-09-16 18:36:03 +09003082 s32 s32Error = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003083 u8 *stamac;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003084 tstrWID strWID;
3085 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3086
3087
Chaehyun Limd85f5322015-06-11 14:35:54 +09003088 strWID.u16WIDid = (u16)WID_SET_STA_MAC_INACTIVE_TIME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003089 strWID.enuWIDtype = WID_STR;
3090 strWID.s32ValueSize = ETH_ALEN;
Glen Leef3052582015-09-10 12:03:04 +09003091 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003092
3093
3094 stamac = strWID.ps8WidVal;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003095 memcpy(stamac, strHostIfStaInactiveT->mac, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003096
3097
3098 PRINT_D(CFG80211_DBG, "SETING STA inactive time\n");
3099
3100
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003101 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3102 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003103 /*get the value by searching the local copy*/
3104 if (s32Error) {
3105 PRINT_ER("Failed to SET incative time\n");
Leo Kim24db7132015-09-16 18:36:01 +09003106 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003107 }
3108
3109
Chaehyun Limd85f5322015-06-11 14:35:54 +09003110 strWID.u16WIDid = (u16)WID_GET_INACTIVE_TIME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003111 strWID.enuWIDtype = WID_INT;
Chaehyun Limca356ad2015-06-11 14:35:57 +09003112 strWID.ps8WidVal = (s8 *)&gu32InactiveTime;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09003113 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003114
3115
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003116 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
3117 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003118 /*get the value by searching the local copy*/
3119 if (s32Error) {
3120 PRINT_ER("Failed to get incative time\n");
Leo Kim24db7132015-09-16 18:36:01 +09003121 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003122 }
3123
3124
3125 PRINT_D(CFG80211_DBG, "Getting inactive time : %d\n", gu32InactiveTime);
3126
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003127 up(&(pstrWFIDrv->hSemInactiveTime));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003128
3129 return s32Error;
3130
3131
3132
3133}
3134
3135
3136/**
3137 * @brief Handle_AddBeacon
3138 * @details Sending config packet to add beacon
Tony Cho7f33fec2015-09-30 18:44:30 +09003139 * @param[in] struct beacon_attr *pstrSetBeaconParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003140 * @return NONE
3141 * @author
3142 * @date
3143 * @version 1.0
3144 */
Tony Cho902362b2015-09-21 12:16:44 +09003145static void Handle_AddBeacon(tstrWILC_WFIDrv *drvHandler,
Tony Cho7f33fec2015-09-30 18:44:30 +09003146 struct beacon_attr *pstrSetBeaconParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003147{
Leo Kime6e12662015-09-16 18:36:03 +09003148 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003149 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003150 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003151 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003152
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003153 PRINT_D(HOSTINF_DBG, "Adding BEACON\n");
3154
Chaehyun Limd85f5322015-06-11 14:35:54 +09003155 strWID.u16WIDid = (u16)WID_ADD_BEACON;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003156 strWID.enuWIDtype = WID_BIN;
3157 strWID.s32ValueSize = pstrSetBeaconParam->u32HeadLen + pstrSetBeaconParam->u32TailLen + 16;
Glen Leef3052582015-09-10 12:03:04 +09003158 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003159 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003160 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003161
3162 pu8CurrByte = strWID.ps8WidVal;
3163 *pu8CurrByte++ = (pstrSetBeaconParam->u32Interval & 0xFF);
3164 *pu8CurrByte++ = ((pstrSetBeaconParam->u32Interval >> 8) & 0xFF);
3165 *pu8CurrByte++ = ((pstrSetBeaconParam->u32Interval >> 16) & 0xFF);
3166 *pu8CurrByte++ = ((pstrSetBeaconParam->u32Interval >> 24) & 0xFF);
3167
3168 *pu8CurrByte++ = (pstrSetBeaconParam->u32DTIMPeriod & 0xFF);
3169 *pu8CurrByte++ = ((pstrSetBeaconParam->u32DTIMPeriod >> 8) & 0xFF);
3170 *pu8CurrByte++ = ((pstrSetBeaconParam->u32DTIMPeriod >> 16) & 0xFF);
3171 *pu8CurrByte++ = ((pstrSetBeaconParam->u32DTIMPeriod >> 24) & 0xFF);
3172
3173 *pu8CurrByte++ = (pstrSetBeaconParam->u32HeadLen & 0xFF);
3174 *pu8CurrByte++ = ((pstrSetBeaconParam->u32HeadLen >> 8) & 0xFF);
3175 *pu8CurrByte++ = ((pstrSetBeaconParam->u32HeadLen >> 16) & 0xFF);
3176 *pu8CurrByte++ = ((pstrSetBeaconParam->u32HeadLen >> 24) & 0xFF);
3177
3178 memcpy(pu8CurrByte, pstrSetBeaconParam->pu8Head, pstrSetBeaconParam->u32HeadLen);
3179 pu8CurrByte += pstrSetBeaconParam->u32HeadLen;
3180
3181 *pu8CurrByte++ = (pstrSetBeaconParam->u32TailLen & 0xFF);
3182 *pu8CurrByte++ = ((pstrSetBeaconParam->u32TailLen >> 8) & 0xFF);
3183 *pu8CurrByte++ = ((pstrSetBeaconParam->u32TailLen >> 16) & 0xFF);
3184 *pu8CurrByte++ = ((pstrSetBeaconParam->u32TailLen >> 24) & 0xFF);
3185
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003186 if (pstrSetBeaconParam->pu8Tail > 0)
3187 memcpy(pu8CurrByte, pstrSetBeaconParam->pu8Tail, pstrSetBeaconParam->u32TailLen);
3188 pu8CurrByte += pstrSetBeaconParam->u32TailLen;
3189
3190
3191
3192 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003193 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3194 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003195 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003196 PRINT_ER("Failed to send add beacon config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003197
Leo Kim24db7132015-09-16 18:36:01 +09003198ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003199 kfree(strWID.ps8WidVal);
3200 kfree(pstrSetBeaconParam->pu8Head);
3201 kfree(pstrSetBeaconParam->pu8Tail);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003202}
3203
3204
3205/**
3206 * @brief Handle_AddBeacon
3207 * @details Sending config packet to delete beacon
Tony Cho80bf88362015-09-30 18:44:29 +09003208 * @param[in] tstrWILC_WFIDrv *drvHandler
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003209 * @return NONE
3210 * @author
3211 * @date
3212 * @version 1.0
3213 */
Tony Cho80bf88362015-09-30 18:44:29 +09003214static void Handle_DelBeacon(tstrWILC_WFIDrv *drvHandler)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003215{
Leo Kime6e12662015-09-16 18:36:03 +09003216 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003217 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003218 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003219 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003220
Chaehyun Limd85f5322015-06-11 14:35:54 +09003221 strWID.u16WIDid = (u16)WID_DEL_BEACON;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003222 strWID.enuWIDtype = WID_CHAR;
Dean Lee576917a2015-06-15 11:58:57 +09003223 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003224 strWID.ps8WidVal = &gu8DelBcn;
3225
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003226 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003227 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003228
3229 pu8CurrByte = strWID.ps8WidVal;
3230
3231 PRINT_D(HOSTINF_DBG, "Deleting BEACON\n");
3232 /* TODO: build del beacon message*/
3233
3234 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003235 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3236 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003237 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003238 PRINT_ER("Failed to send delete beacon config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003239}
3240
3241
3242/**
3243 * @brief WILC_HostIf_PackStaParam
3244 * @details Handling packing of the station params in a buffer
Tony Cho6a89ba92015-09-21 12:16:46 +09003245 * @param[in] u8* pu8Buffer, struct add_sta_param *pstrStationParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003246 * @return NONE
3247 * @author
3248 * @date
3249 * @version 1.0
3250 */
Tony Cho6a89ba92015-09-21 12:16:46 +09003251static u32 WILC_HostIf_PackStaParam(u8 *pu8Buffer,
3252 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003253{
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003254 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003255
3256 pu8CurrByte = pu8Buffer;
3257
3258 PRINT_D(HOSTINF_DBG, "Packing STA params\n");
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003259 memcpy(pu8CurrByte, pstrStationParam->au8BSSID, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003260 pu8CurrByte += ETH_ALEN;
3261
3262 *pu8CurrByte++ = pstrStationParam->u16AssocID & 0xFF;
3263 *pu8CurrByte++ = (pstrStationParam->u16AssocID >> 8) & 0xFF;
3264
3265 *pu8CurrByte++ = pstrStationParam->u8NumRates;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003266 if (pstrStationParam->u8NumRates > 0)
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003267 memcpy(pu8CurrByte, pstrStationParam->pu8Rates, pstrStationParam->u8NumRates);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003268 pu8CurrByte += pstrStationParam->u8NumRates;
3269
3270 *pu8CurrByte++ = pstrStationParam->bIsHTSupported;
3271 *pu8CurrByte++ = pstrStationParam->u16HTCapInfo & 0xFF;
3272 *pu8CurrByte++ = (pstrStationParam->u16HTCapInfo >> 8) & 0xFF;
3273
3274 *pu8CurrByte++ = pstrStationParam->u8AmpduParams;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003275 memcpy(pu8CurrByte, pstrStationParam->au8SuppMCsSet, WILC_SUPP_MCS_SET_SIZE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003276 pu8CurrByte += WILC_SUPP_MCS_SET_SIZE;
3277
3278 *pu8CurrByte++ = pstrStationParam->u16HTExtParams & 0xFF;
3279 *pu8CurrByte++ = (pstrStationParam->u16HTExtParams >> 8) & 0xFF;
3280
3281 *pu8CurrByte++ = pstrStationParam->u32TxBeamformingCap & 0xFF;
3282 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 8) & 0xFF;
3283 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 16) & 0xFF;
3284 *pu8CurrByte++ = (pstrStationParam->u32TxBeamformingCap >> 24) & 0xFF;
3285
3286 *pu8CurrByte++ = pstrStationParam->u8ASELCap;
3287
3288 *pu8CurrByte++ = pstrStationParam->u16FlagsMask & 0xFF;
3289 *pu8CurrByte++ = (pstrStationParam->u16FlagsMask >> 8) & 0xFF;
3290
3291 *pu8CurrByte++ = pstrStationParam->u16FlagsSet & 0xFF;
3292 *pu8CurrByte++ = (pstrStationParam->u16FlagsSet >> 8) & 0xFF;
3293
3294 return pu8CurrByte - pu8Buffer;
3295}
3296
3297/**
3298 * @brief Handle_AddStation
3299 * @details Sending config packet to add station
Tony Cho6a89ba92015-09-21 12:16:46 +09003300 * @param[in] struct add_sta_param *pstrStationParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003301 * @return NONE
3302 * @author
3303 * @date
3304 * @version 1.0
3305 */
Tony Cho6a89ba92015-09-21 12:16:46 +09003306static void Handle_AddStation(tstrWILC_WFIDrv *drvHandler,
3307 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003308{
Leo Kime6e12662015-09-16 18:36:03 +09003309 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003310 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003311 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003312 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003313
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003314 PRINT_D(HOSTINF_DBG, "Handling add station\n");
Chaehyun Limd85f5322015-06-11 14:35:54 +09003315 strWID.u16WIDid = (u16)WID_ADD_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003316 strWID.enuWIDtype = WID_BIN;
3317 strWID.s32ValueSize = WILC_ADD_STA_LENGTH + pstrStationParam->u8NumRates;
3318
Glen Leef3052582015-09-10 12:03:04 +09003319 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003320 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003321 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003322
3323 pu8CurrByte = strWID.ps8WidVal;
3324 pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
3325
3326 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003327 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3328 get_id_from_handler(pstrWFIDrv));
Leo Kime6e12662015-09-16 18:36:03 +09003329 if (s32Error != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003330 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003331
Leo Kim24db7132015-09-16 18:36:01 +09003332ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003333 kfree(pstrStationParam->pu8Rates);
3334 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003335}
3336
3337/**
3338 * @brief Handle_DelAllSta
3339 * @details Sending config packet to delete station
3340 * @param[in] tstrHostIFDelSta* pstrDelStaParam
3341 * @return NONE
3342 * @author
3343 * @date
3344 * @version 1.0
3345 */
Tony Chob4e644e2015-09-21 12:17:00 +09003346static void Handle_DelAllSta(tstrWILC_WFIDrv *drvHandler,
3347 struct del_all_sta *pstrDelAllStaParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003348{
Leo Kime6e12662015-09-16 18:36:03 +09003349 s32 s32Error = 0;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003350
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003351 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003352 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003353 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003354 u8 i;
Chaehyun Lim37034802015-06-11 14:34:32 +09003355 u8 au8Zero_Buff[6] = {0};
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003356
Chaehyun Limd85f5322015-06-11 14:35:54 +09003357 strWID.u16WIDid = (u16)WID_DEL_ALL_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003358 strWID.enuWIDtype = WID_STR;
3359 strWID.s32ValueSize = (pstrDelAllStaParam->u8Num_AssocSta * ETH_ALEN) + 1;
3360
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003361 PRINT_D(HOSTINF_DBG, "Handling delete station\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003362
Glen Leef3052582015-09-10 12:03:04 +09003363 strWID.ps8WidVal = kmalloc((pstrDelAllStaParam->u8Num_AssocSta * ETH_ALEN) + 1, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003364 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003365 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003366
3367 pu8CurrByte = strWID.ps8WidVal;
3368
3369 *(pu8CurrByte++) = pstrDelAllStaParam->u8Num_AssocSta;
3370
3371 for (i = 0; i < MAX_NUM_STA; i++) {
3372 if (memcmp(pstrDelAllStaParam->au8Sta_DelAllSta[i], au8Zero_Buff, ETH_ALEN))
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003373 memcpy(pu8CurrByte, pstrDelAllStaParam->au8Sta_DelAllSta[i], ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003374 else
3375 continue;
3376
3377 pu8CurrByte += ETH_ALEN;
3378 }
3379
3380 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003381 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3382 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003383 if (s32Error)
Luis de Bethencourt83cc9be2015-06-26 16:47:28 +02003384 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003385
Leo Kim24db7132015-09-16 18:36:01 +09003386ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003387 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003388
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003389 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003390}
3391
3392
3393/**
3394 * @brief Handle_DelStation
3395 * @details Sending config packet to delete station
Tony Chofb93a1e2015-09-21 12:16:57 +09003396 * @param[in] struct del_sta *pstrDelStaParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003397 * @return NONE
3398 * @author
3399 * @date
3400 * @version 1.0
3401 */
Tony Chofb93a1e2015-09-21 12:16:57 +09003402static void Handle_DelStation(tstrWILC_WFIDrv *drvHandler,
3403 struct del_sta *pstrDelStaParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003404{
Leo Kime6e12662015-09-16 18:36:03 +09003405 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003406 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003407 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003408 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3409
Chaehyun Limd85f5322015-06-11 14:35:54 +09003410 strWID.u16WIDid = (u16)WID_REMOVE_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003411 strWID.enuWIDtype = WID_BIN;
3412 strWID.s32ValueSize = ETH_ALEN;
3413
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003414 PRINT_D(HOSTINF_DBG, "Handling delete station\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003415
Glen Leef3052582015-09-10 12:03:04 +09003416 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003417 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003418 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003419
3420 pu8CurrByte = strWID.ps8WidVal;
3421
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003422 memcpy(pu8CurrByte, pstrDelStaParam->au8MacAddr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003423
3424 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003425 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3426 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003427 if (s32Error)
Luis de Bethencourt83cc9be2015-06-26 16:47:28 +02003428 PRINT_ER("Failed to send add station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003429
Leo Kim24db7132015-09-16 18:36:01 +09003430ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003431 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003432}
3433
3434
3435/**
3436 * @brief Handle_EditStation
3437 * @details Sending config packet to edit station
Tony Cho6a89ba92015-09-21 12:16:46 +09003438 * @param[in] struct add_sta_param *pstrStationParam
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003439 * @return NONE
3440 * @author
3441 * @date
3442 * @version 1.0
3443 */
Tony Cho6a89ba92015-09-21 12:16:46 +09003444static void Handle_EditStation(tstrWILC_WFIDrv *drvHandler,
3445 struct add_sta_param *pstrStationParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003446{
Leo Kime6e12662015-09-16 18:36:03 +09003447 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003448 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003449 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003450 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3451
Chaehyun Limd85f5322015-06-11 14:35:54 +09003452 strWID.u16WIDid = (u16)WID_EDIT_STA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003453 strWID.enuWIDtype = WID_BIN;
3454 strWID.s32ValueSize = WILC_ADD_STA_LENGTH + pstrStationParam->u8NumRates;
3455
3456 PRINT_D(HOSTINF_DBG, "Handling edit station\n");
Glen Leef3052582015-09-10 12:03:04 +09003457 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003458 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003459 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003460
3461 pu8CurrByte = strWID.ps8WidVal;
3462 pu8CurrByte += WILC_HostIf_PackStaParam(pu8CurrByte, pstrStationParam);
3463
3464 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003465 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3466 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003467 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003468 PRINT_ER("Failed to send edit station config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003469
Leo Kim24db7132015-09-16 18:36:01 +09003470ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003471 kfree(pstrStationParam->pu8Rates);
3472 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003473}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003474
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003475/**
3476 * @brief Handle_RemainOnChan
3477 * @details Sending config packet to edit station
3478 * @param[in] tstrWILC_AddStaParam* pstrStationParam
3479 * @return NONE
3480 * @author
3481 * @date
3482 * @version 1.0
3483 */
Tony Cho2f9c03f2015-09-21 12:16:58 +09003484static int Handle_RemainOnChan(tstrWILC_WFIDrv *drvHandler,
3485 struct remain_ch *pstrHostIfRemainOnChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003486{
Leo Kime6e12662015-09-16 18:36:03 +09003487 s32 s32Error = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003488 u8 u8remain_on_chan_flag;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003489 tstrWID strWID;
3490 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
3491
3492 /*If it's a pendig remain-on-channel, don't overwrite gWFiDrvHandle values (since incoming msg is garbbage)*/
3493 if (!pstrWFIDrv->u8RemainOnChan_pendingreq) {
3494 pstrWFIDrv->strHostIfRemainOnChan.pVoid = pstrHostIfRemainOnChan->pVoid;
3495 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanExpired = pstrHostIfRemainOnChan->pRemainOnChanExpired;
3496 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanReady = pstrHostIfRemainOnChan->pRemainOnChanReady;
3497 pstrWFIDrv->strHostIfRemainOnChan.u16Channel = pstrHostIfRemainOnChan->u16Channel;
3498 pstrWFIDrv->strHostIfRemainOnChan.u32ListenSessionID = pstrHostIfRemainOnChan->u32ListenSessionID;
3499 } else {
3500 /*Set the channel to use it as a wid val*/
3501 pstrHostIfRemainOnChan->u16Channel = pstrWFIDrv->strHostIfRemainOnChan.u16Channel;
3502 }
3503
3504 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult != NULL) {
3505 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while scanning return\n");
3506 pstrWFIDrv->u8RemainOnChan_pendingreq = 1;
Leo Kim24db7132015-09-16 18:36:01 +09003507 s32Error = -EBUSY;
3508 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003509 }
3510 if (pstrWFIDrv->enuHostIFstate == HOST_IF_WAITING_CONN_RESP) {
3511 PRINT_INFO(GENERIC_DBG, "Required to remain on chan while connecting return\n");
Leo Kim24db7132015-09-16 18:36:01 +09003512 s32Error = -EBUSY;
3513 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003514 }
3515
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003516 if (g_obtainingIP || connecting) {
3517 PRINT_D(GENERIC_DBG, "[handle_scan]: Don't do obss scan until IP adresss is obtained\n");
Leo Kim24db7132015-09-16 18:36:01 +09003518 s32Error = -EBUSY;
3519 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003520 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003521
3522 PRINT_D(HOSTINF_DBG, "Setting channel :%d\n", pstrHostIfRemainOnChan->u16Channel);
3523
Dean Lee72ed4dc2015-06-12 14:11:44 +09003524 u8remain_on_chan_flag = true;
Chaehyun Limd85f5322015-06-11 14:35:54 +09003525 strWID.u16WIDid = (u16)WID_REMAIN_ON_CHAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003526 strWID.enuWIDtype = WID_STR;
3527 strWID.s32ValueSize = 2;
Glen Leef3052582015-09-10 12:03:04 +09003528 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003529
Leo Kim24db7132015-09-16 18:36:01 +09003530 if (strWID.ps8WidVal == NULL) {
3531 s32Error = -ENOMEM;
3532 goto ERRORHANDLER;
3533 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003534
3535 strWID.ps8WidVal[0] = u8remain_on_chan_flag;
Chaehyun Limca356ad2015-06-11 14:35:57 +09003536 strWID.ps8WidVal[1] = (s8)pstrHostIfRemainOnChan->u16Channel;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003537
3538 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003539 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3540 get_id_from_handler(pstrWFIDrv));
Leo Kime6e12662015-09-16 18:36:03 +09003541 if (s32Error != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003542 PRINT_ER("Failed to set remain on channel\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003543
Leo Kim24db7132015-09-16 18:36:01 +09003544ERRORHANDLER:
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003545 {
3546 P2P_LISTEN_STATE = 1;
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07003547 pstrWFIDrv->hRemainOnChannel.data = (unsigned long)pstrWFIDrv;
3548 mod_timer(&pstrWFIDrv->hRemainOnChannel,
3549 jiffies +
3550 msecs_to_jiffies(pstrHostIfRemainOnChan->u32duration));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003551
3552 /*Calling CFG ready_on_channel*/
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003553 if (pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanReady)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003554 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanReady(pstrWFIDrv->strHostIfRemainOnChan.pVoid);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003555
3556 if (pstrWFIDrv->u8RemainOnChan_pendingreq)
3557 pstrWFIDrv->u8RemainOnChan_pendingreq = 0;
3558 }
3559 return s32Error;
3560}
3561
3562/**
3563 * @brief Handle_RegisterFrame
3564 * @details
3565 * @param[in]
3566 * @return NONE
3567 * @author
3568 * @date
3569 * @version 1.0
3570 */
Tony Chobc37c5d2015-09-21 12:16:59 +09003571static int Handle_RegisterFrame(tstrWILC_WFIDrv *drvHandler,
3572 struct reg_frame *pstrHostIfRegisterFrame)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003573{
Leo Kime6e12662015-09-16 18:36:03 +09003574 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003575 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003576 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003577 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3578
3579 PRINT_D(HOSTINF_DBG, "Handling frame register Flag : %d FrameType: %d\n", pstrHostIfRegisterFrame->bReg, pstrHostIfRegisterFrame->u16FrameType);
3580
3581 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +09003582 strWID.u16WIDid = (u16)WID_REGISTER_FRAME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003583 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003584 strWID.ps8WidVal = kmalloc(sizeof(u16) + 2, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003585 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003586 return -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003587
3588 pu8CurrByte = strWID.ps8WidVal;
3589
3590 *pu8CurrByte++ = pstrHostIfRegisterFrame->bReg;
3591 *pu8CurrByte++ = pstrHostIfRegisterFrame->u8Regid;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003592 memcpy(pu8CurrByte, &(pstrHostIfRegisterFrame->u16FrameType), sizeof(u16));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003593
3594
Chaehyun Limd85f5322015-06-11 14:35:54 +09003595 strWID.s32ValueSize = sizeof(u16) + 2;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003596
3597
3598 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003599 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3600 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003601 if (s32Error) {
3602 PRINT_ER("Failed to frame register config packet\n");
Leo Kim24db7132015-09-16 18:36:01 +09003603 s32Error = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003604 }
3605
3606 return s32Error;
3607
3608}
3609
3610/**
3611 * @brief Handle_ListenStateExpired
3612 * @details Handle of listen state expiration
3613 * @param[in] NONE
3614 * @return Error code.
3615 * @author
3616 * @date
3617 * @version 1.0
3618 */
3619#define FALSE_FRMWR_CHANNEL 100
Tony Cho2f9c03f2015-09-21 12:16:58 +09003620static u32 Handle_ListenStateExpired(tstrWILC_WFIDrv *drvHandler,
3621 struct remain_ch *pstrHostIfRemainOnChan)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003622{
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003623 u8 u8remain_on_chan_flag;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003624 tstrWID strWID;
Leo Kime6e12662015-09-16 18:36:03 +09003625 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003626 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *) drvHandler;
3627
3628 PRINT_D(HOSTINF_DBG, "CANCEL REMAIN ON CHAN\n");
3629
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003630 /*Make sure we are already in listen state*/
3631 /*This is to handle duplicate expiry messages (listen timer fired and supplicant called cancel_remain_on_channel())*/
3632 if (P2P_LISTEN_STATE) {
Dean Lee72ed4dc2015-06-12 14:11:44 +09003633 u8remain_on_chan_flag = false;
Chaehyun Limd85f5322015-06-11 14:35:54 +09003634 strWID.u16WIDid = (u16)WID_REMAIN_ON_CHAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003635 strWID.enuWIDtype = WID_STR;
3636 strWID.s32ValueSize = 2;
Glen Leef3052582015-09-10 12:03:04 +09003637 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003638
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003639 if (strWID.ps8WidVal == NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003640 PRINT_ER("Failed to allocate memory\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003641
3642 strWID.ps8WidVal[0] = u8remain_on_chan_flag;
3643 strWID.ps8WidVal[1] = FALSE_FRMWR_CHANNEL;
3644
3645 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003646 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3647 get_id_from_handler(pstrWFIDrv));
Leo Kime6e12662015-09-16 18:36:03 +09003648 if (s32Error != 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003649 PRINT_ER("Failed to set remain on channel\n");
3650 goto _done_;
3651 }
3652
3653 if (pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanExpired) {
3654 pstrWFIDrv->strHostIfRemainOnChan.pRemainOnChanExpired(pstrWFIDrv->strHostIfRemainOnChan.pVoid
3655 , pstrHostIfRemainOnChan->u32ListenSessionID);
3656 }
3657 P2P_LISTEN_STATE = 0;
3658 } else {
3659 PRINT_D(GENERIC_DBG, "Not in listen state\n");
Leo Kime6e12662015-09-16 18:36:03 +09003660 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003661 }
3662
3663_done_:
3664 return s32Error;
3665}
3666
3667
3668/**
3669 * @brief ListenTimerCB
3670 * @details Callback function of remain-on-channel timer
3671 * @param[in] NONE
3672 * @return Error code.
3673 * @author
3674 * @date
3675 * @version 1.0
3676 */
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003677static void ListenTimerCB(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003678{
Leo Kime6e12662015-09-16 18:36:03 +09003679 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09003680 struct host_if_msg msg;
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07003681 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)arg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003682 /*Stopping remain-on-channel timer*/
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07003683 del_timer(&pstrWFIDrv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003684
3685 /* prepare the Timer Callback message */
Tony Cho143eb952015-09-21 12:16:32 +09003686 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09003687 msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
Tony Cho143eb952015-09-21 12:16:32 +09003688 msg.drvHandler = pstrWFIDrv;
Tony Cho070d3652015-09-30 18:55:10 +09003689 msg.body.remain_on_ch.u32ListenSessionID = pstrWFIDrv->strHostIfRemainOnChan.u32ListenSessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003690
3691 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09003692 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003693 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09003694 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003695}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003696
3697/**
3698 * @brief Handle_EditStation
3699 * @details Sending config packet to edit station
3700 * @param[in] tstrWILC_AddStaParam* pstrStationParam
3701 * @return NONE
3702 * @author
3703 * @date
3704 * @version 1.0
3705 */
Tony Cho5a008f12015-09-21 12:16:48 +09003706static void Handle_PowerManagement(tstrWILC_WFIDrv *drvHandler,
3707 struct power_mgmt_param *strPowerMgmtParam)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003708{
Leo Kime6e12662015-09-16 18:36:03 +09003709 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003710 tstrWID strWID;
Chaehyun Limca356ad2015-06-11 14:35:57 +09003711 s8 s8PowerMode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003712 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02003713
Chaehyun Limd85f5322015-06-11 14:35:54 +09003714 strWID.u16WIDid = (u16)WID_POWER_MANAGEMENT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003715
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05303716 if (strPowerMgmtParam->bIsEnabled == true)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003717 s8PowerMode = MIN_FAST_PS;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05303718 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003719 s8PowerMode = NO_POWERSAVE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003720 PRINT_D(HOSTINF_DBG, "Handling power mgmt to %d\n", s8PowerMode);
3721 strWID.ps8WidVal = &s8PowerMode;
Dean Lee576917a2015-06-15 11:58:57 +09003722 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003723
3724 PRINT_D(HOSTINF_DBG, "Handling Power Management\n");
3725
3726 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003727 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3728 get_id_from_handler(pstrWFIDrv));
Leo Kim24db7132015-09-16 18:36:01 +09003729 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003730 PRINT_ER("Failed to send power management config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003731}
3732
3733/**
3734 * @brief Handle_SetMulticastFilter
3735 * @details Set Multicast filter in firmware
Tony Cho641210a2015-09-21 12:16:52 +09003736 * @param[in] struct set_multicast *strHostIfSetMulti
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003737 * @return NONE
3738 * @author asobhy
3739 * @date
3740 * @version 1.0
3741 */
Tony Cho641210a2015-09-21 12:16:52 +09003742static void Handle_SetMulticastFilter(tstrWILC_WFIDrv *drvHandler,
3743 struct set_multicast *strHostIfSetMulti)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003744{
Leo Kime6e12662015-09-16 18:36:03 +09003745 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003746 tstrWID strWID;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09003747 u8 *pu8CurrByte;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003748
3749 PRINT_D(HOSTINF_DBG, "Setup Multicast Filter\n");
3750
Chaehyun Limd85f5322015-06-11 14:35:54 +09003751 strWID.u16WIDid = (u16)WID_SETUP_MULTICAST_FILTER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003752 strWID.enuWIDtype = WID_BIN;
Tony Cho641210a2015-09-21 12:16:52 +09003753 strWID.s32ValueSize = sizeof(struct set_multicast) + ((strHostIfSetMulti->u32count) * ETH_ALEN);
Glen Leef3052582015-09-10 12:03:04 +09003754 strWID.ps8WidVal = kmalloc(strWID.s32ValueSize, GFP_KERNEL);
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02003755 if (strWID.ps8WidVal == NULL)
Leo Kim24db7132015-09-16 18:36:01 +09003756 goto ERRORHANDLER;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003757
3758 pu8CurrByte = strWID.ps8WidVal;
3759 *pu8CurrByte++ = (strHostIfSetMulti->bIsEnabled & 0xFF);
3760 *pu8CurrByte++ = ((strHostIfSetMulti->bIsEnabled >> 8) & 0xFF);
3761 *pu8CurrByte++ = ((strHostIfSetMulti->bIsEnabled >> 16) & 0xFF);
3762 *pu8CurrByte++ = ((strHostIfSetMulti->bIsEnabled >> 24) & 0xFF);
3763
3764 *pu8CurrByte++ = (strHostIfSetMulti->u32count & 0xFF);
3765 *pu8CurrByte++ = ((strHostIfSetMulti->u32count >> 8) & 0xFF);
3766 *pu8CurrByte++ = ((strHostIfSetMulti->u32count >> 16) & 0xFF);
3767 *pu8CurrByte++ = ((strHostIfSetMulti->u32count >> 24) & 0xFF);
3768
3769 if ((strHostIfSetMulti->u32count) > 0)
3770 memcpy(pu8CurrByte, gau8MulticastMacAddrList, ((strHostIfSetMulti->u32count) * ETH_ALEN));
3771
3772 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003773 s32Error = send_config_pkt(SET_CFG, &strWID, 1, false,
3774 get_id_from_handler(drvHandler));
Leo Kim24db7132015-09-16 18:36:01 +09003775 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003776 PRINT_ER("Failed to send setup multicast config packet\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003777
Leo Kim24db7132015-09-16 18:36:01 +09003778ERRORHANDLER:
Greg Kroah-Hartman969effe2015-08-14 19:15:34 -07003779 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003780
3781}
3782
3783
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003784/**
3785 * @brief Handle_AddBASession
3786 * @details Add block ack session
3787 * @param[in] tstrHostIFSetMulti* strHostIfSetMulti
3788 * @return NONE
3789 * @author Amr Abdel-Moghny
3790 * @date Feb. 2014
3791 * @version 9.0
3792 */
Tony Cho54265472015-09-21 12:16:56 +09003793static s32 Handle_AddBASession(tstrWILC_WFIDrv *drvHandler,
3794 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003795{
Leo Kime6e12662015-09-16 18:36:03 +09003796 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003797 tstrWID strWID;
3798 int AddbaTimeout = 100;
3799 char *ptr = NULL;
3800 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3801
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003802 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 +09003803 strHostIfBASessionInfo->au8Bssid[0],
3804 strHostIfBASessionInfo->au8Bssid[1],
3805 strHostIfBASessionInfo->au8Bssid[2],
3806 strHostIfBASessionInfo->u16BufferSize,
3807 strHostIfBASessionInfo->u16SessionTimeout,
3808 strHostIfBASessionInfo->u8Ted);
3809
Chaehyun Limd85f5322015-06-11 14:35:54 +09003810 strWID.u16WIDid = (u16)WID_11E_P_ACTION_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003811 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003812 strWID.ps8WidVal = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003813 strWID.s32ValueSize = BLOCK_ACK_REQ_SIZE;
3814 ptr = strWID.ps8WidVal;
3815 /* *ptr++ = 0x14; */
3816 *ptr++ = 0x14;
3817 *ptr++ = 0x3;
3818 *ptr++ = 0x0;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003819 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003820 ptr += ETH_ALEN;
3821 *ptr++ = strHostIfBASessionInfo->u8Ted;
3822 /* BA Policy*/
3823 *ptr++ = 1;
3824 /* Buffer size*/
3825 *ptr++ = (strHostIfBASessionInfo->u16BufferSize & 0xFF);
3826 *ptr++ = ((strHostIfBASessionInfo->u16BufferSize >> 16) & 0xFF);
3827 /* BA timeout*/
3828 *ptr++ = (strHostIfBASessionInfo->u16SessionTimeout & 0xFF);
3829 *ptr++ = ((strHostIfBASessionInfo->u16SessionTimeout >> 16) & 0xFF);
3830 /* ADDBA timeout*/
3831 *ptr++ = (AddbaTimeout & 0xFF);
3832 *ptr++ = ((AddbaTimeout >> 16) & 0xFF);
3833 /* Group Buffer Max Frames*/
3834 *ptr++ = 8;
3835 /* Group Buffer Timeout */
3836 *ptr++ = 0;
3837
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003838 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3839 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003840 if (s32Error)
3841 PRINT_D(HOSTINF_DBG, "Couldn't open BA Session\n");
3842
3843
Chaehyun Limd85f5322015-06-11 14:35:54 +09003844 strWID.u16WIDid = (u16)WID_11E_P_ACTION_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003845 strWID.enuWIDtype = WID_STR;
3846 strWID.s32ValueSize = 15;
3847 ptr = strWID.ps8WidVal;
3848 /* *ptr++ = 0x14; */
3849 *ptr++ = 15;
3850 *ptr++ = 7;
3851 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003852 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003853 ptr += ETH_ALEN;
3854 /* TID*/
3855 *ptr++ = strHostIfBASessionInfo->u8Ted;
3856 /* Max Num MSDU */
3857 *ptr++ = 8;
3858 /* BA timeout*/
3859 *ptr++ = (strHostIfBASessionInfo->u16BufferSize & 0xFF);
3860 *ptr++ = ((strHostIfBASessionInfo->u16SessionTimeout >> 16) & 0xFF);
3861 /*Ack-Policy */
3862 *ptr++ = 3;
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003863 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3864 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003865
3866 if (strWID.ps8WidVal != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09003867 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003868
3869 return s32Error;
3870
3871}
3872
3873
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003874/**
3875 * @brief Handle_DelBASession
3876 * @details Delete block ack session
3877 * @param[in] tstrHostIFSetMulti* strHostIfSetMulti
3878 * @return NONE
3879 * @author Amr Abdel-Moghny
3880 * @date Feb. 2013
3881 * @version 9.0
3882 */
Tony Cho54265472015-09-21 12:16:56 +09003883static s32 Handle_DelBASession(tstrWILC_WFIDrv *drvHandler,
3884 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003885{
Leo Kime6e12662015-09-16 18:36:03 +09003886 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003887 tstrWID strWID;
3888 char *ptr = NULL;
3889 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3890
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003891 PRINT_D(GENERIC_DBG, "Delete Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\n",
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003892 strHostIfBASessionInfo->au8Bssid[0],
3893 strHostIfBASessionInfo->au8Bssid[1],
3894 strHostIfBASessionInfo->au8Bssid[2],
3895 strHostIfBASessionInfo->u8Ted);
3896
Chaehyun Limd85f5322015-06-11 14:35:54 +09003897 strWID.u16WIDid = (u16)WID_11E_P_ACTION_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003898 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003899 strWID.ps8WidVal = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003900 strWID.s32ValueSize = BLOCK_ACK_REQ_SIZE;
3901 ptr = strWID.ps8WidVal;
3902 /* *ptr++ = 0x14; */
3903 *ptr++ = 0x14;
3904 *ptr++ = 0x3;
3905 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003906 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003907 ptr += ETH_ALEN;
3908 *ptr++ = strHostIfBASessionInfo->u8Ted;
3909 /* BA direction = recipent*/
3910 *ptr++ = 0;
3911 /* Delba Reason */
3912 *ptr++ = 32; /* Unspecific QOS reason */
3913
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003914 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3915 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003916 if (s32Error)
3917 PRINT_D(HOSTINF_DBG, "Couldn't delete BA Session\n");
3918
3919
Chaehyun Limd85f5322015-06-11 14:35:54 +09003920 strWID.u16WIDid = (u16)WID_11E_P_ACTION_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003921 strWID.enuWIDtype = WID_STR;
3922 strWID.s32ValueSize = 15;
3923 ptr = strWID.ps8WidVal;
3924 /* *ptr++ = 0x14; */
3925 *ptr++ = 15;
3926 *ptr++ = 7;
3927 *ptr++ = 0x3;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003928 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003929 ptr += ETH_ALEN;
3930 /* TID*/
3931 *ptr++ = strHostIfBASessionInfo->u8Ted;
3932
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003933 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3934 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003935
3936 if (strWID.ps8WidVal != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09003937 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003938
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003939 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003940
3941 return s32Error;
3942
3943}
3944
3945
3946/**
3947 * @brief Handle_DelAllRxBASessions
3948 * @details Delete all Rx BA sessions
3949 * @param[in] tstrHostIFSetMulti* strHostIfSetMulti
3950 * @return NONE
3951 * @author Abdelrahman Sobhy
3952 * @date Feb. 2013
3953 * @version 9.0
3954 */
Tony Cho54265472015-09-21 12:16:56 +09003955static s32 Handle_DelAllRxBASessions(tstrWILC_WFIDrv *drvHandler,
3956 struct ba_session_info *strHostIfBASessionInfo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003957{
Leo Kime6e12662015-09-16 18:36:03 +09003958 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003959 tstrWID strWID;
3960 char *ptr = NULL;
3961 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)drvHandler;
3962
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02003963 PRINT_D(GENERIC_DBG, "Delete Block Ack session with\nBSSID = %.2x:%.2x:%.2x\nTID=%d\n",
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003964 strHostIfBASessionInfo->au8Bssid[0],
3965 strHostIfBASessionInfo->au8Bssid[1],
3966 strHostIfBASessionInfo->au8Bssid[2],
3967 strHostIfBASessionInfo->u8Ted);
3968
Chaehyun Limd85f5322015-06-11 14:35:54 +09003969 strWID.u16WIDid = (u16)WID_DEL_ALL_RX_BA;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003970 strWID.enuWIDtype = WID_STR;
Glen Leef3052582015-09-10 12:03:04 +09003971 strWID.ps8WidVal = kmalloc(BLOCK_ACK_REQ_SIZE, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003972 strWID.s32ValueSize = BLOCK_ACK_REQ_SIZE;
3973 ptr = strWID.ps8WidVal;
3974 *ptr++ = 0x14;
3975 *ptr++ = 0x3;
3976 *ptr++ = 0x2;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09003977 memcpy(ptr, strHostIfBASessionInfo->au8Bssid, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003978 ptr += ETH_ALEN;
3979 *ptr++ = strHostIfBASessionInfo->u8Ted;
3980 /* BA direction = recipent*/
3981 *ptr++ = 0;
3982 /* Delba Reason */
3983 *ptr++ = 32; /* Unspecific QOS reason */
3984
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09003985 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
3986 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003987 if (s32Error)
3988 PRINT_D(HOSTINF_DBG, "Couldn't delete BA Session\n");
3989
3990
3991 if (strWID.ps8WidVal != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09003992 kfree(strWID.ps8WidVal);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003993
Arnd Bergmann83383ea2015-06-01 21:06:43 +02003994 up(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09003995
3996 return s32Error;
3997
3998}
3999
4000/**
4001 * @brief hostIFthread
4002 * @details Main thread to handle message queue requests
4003 * @param[in] void* pvArg
4004 * @return NONE
4005 * @author
4006 * @date
4007 * @version 1.0
4008 */
Arnd Bergmann1999bd52015-05-29 22:52:14 +02004009static int hostIFthread(void *pvArg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004010{
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004011 u32 u32Ret;
Tony Cho143eb952015-09-21 12:16:32 +09004012 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004013 tstrWILC_WFIDrv *pstrWFIDrv;
4014
Tony Cho143eb952015-09-21 12:16:32 +09004015 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004016
4017 while (1) {
Tony Cho143eb952015-09-21 12:16:32 +09004018 wilc_mq_recv(&gMsgQHostIF, &msg, sizeof(struct host_if_msg), &u32Ret);
4019 pstrWFIDrv = (tstrWILC_WFIDrv *)msg.drvHandler;
Tony Choa9f812a2015-09-21 12:16:33 +09004020 if (msg.id == HOST_IF_MSG_EXIT) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004021 PRINT_D(GENERIC_DBG, "THREAD: Exiting HostIfThread\n");
4022 break;
4023 }
4024
4025
4026 /*Re-Queue HIF message*/
4027 if ((!g_wilc_initialized)) {
4028 PRINT_D(GENERIC_DBG, "--WAIT--");
Greg Kroah-Hartman80e29c72015-08-14 19:42:23 -07004029 usleep_range(200 * 1000, 200 * 1000);
Tony Cho143eb952015-09-21 12:16:32 +09004030 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004031 continue;
4032 }
4033
Tony Choa9f812a2015-09-21 12:16:33 +09004034 if (msg.id == HOST_IF_MSG_CONNECT && pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult != NULL) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004035 PRINT_D(HOSTINF_DBG, "Requeue connect request till scan done received\n");
Tony Cho143eb952015-09-21 12:16:32 +09004036 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Greg Kroah-Hartman80e29c72015-08-14 19:42:23 -07004037 usleep_range(2 * 1000, 2 * 1000);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004038 continue;
4039 }
4040
Tony Choa9f812a2015-09-21 12:16:33 +09004041 switch (msg.id) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004042 case HOST_IF_MSG_Q_IDLE:
4043 Handle_wait_msg_q_empty();
4044 break;
4045
4046 case HOST_IF_MSG_SCAN:
Tony Cho4528bdb2015-09-30 18:44:20 +09004047 Handle_Scan(msg.drvHandler, &msg.body.scan_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004048 break;
4049
4050 case HOST_IF_MSG_CONNECT:
Tony Cho3f501972015-09-30 18:44:21 +09004051 Handle_Connect(msg.drvHandler, &msg.body.con_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004052 break;
4053
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004054 case HOST_IF_MSG_FLUSH_CONNECT:
Tony Cho143eb952015-09-21 12:16:32 +09004055 Handle_FlushConnect(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004056 break;
4057
4058 case HOST_IF_MSG_RCVD_NTWRK_INFO:
Tony Cho02d19462015-09-30 18:44:22 +09004059 Handle_RcvdNtwrkInfo(msg.drvHandler, &msg.body.net_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004060 break;
4061
4062 case HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO:
Tony Cho66add622015-09-30 18:44:23 +09004063 Handle_RcvdGnrlAsyncInfo(msg.drvHandler, &msg.body.async_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004064 break;
4065
4066 case HOST_IF_MSG_KEY:
Tony Cho18990bf2015-09-30 18:44:24 +09004067 Handle_Key(msg.drvHandler, &msg.body.key_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004068 break;
4069
4070 case HOST_IF_MSG_CFG_PARAMS:
4071
Tony Choa2340c32015-09-30 18:44:25 +09004072 Handle_CfgParam(msg.drvHandler, &msg.body.cfg_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004073 break;
4074
4075 case HOST_IF_MSG_SET_CHANNEL:
Tony Choffd6dbc2015-09-30 18:44:28 +09004076 Handle_SetChannel(msg.drvHandler, &msg.body.channel_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004077 break;
4078
4079 case HOST_IF_MSG_DISCONNECT:
Tony Cho143eb952015-09-21 12:16:32 +09004080 Handle_Disconnect(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004081 break;
4082
4083 case HOST_IF_MSG_RCVD_SCAN_COMPLETE:
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07004084 del_timer(&pstrWFIDrv->hScanTimer);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004085 PRINT_D(HOSTINF_DBG, "scan completed successfully\n");
4086
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004087 /*Allow chip sleep, only if both interfaces are not connected*/
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004088 if (!linux_wlan_get_num_conn_ifcs())
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004089 chip_sleep_manually(INFINITE_SLEEP_TIME);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004090
Tony Cho143eb952015-09-21 12:16:32 +09004091 Handle_ScanDone(msg.drvHandler, SCAN_EVENT_DONE);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004092
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004093 if (pstrWFIDrv->u8RemainOnChan_pendingreq)
Tony Cho070d3652015-09-30 18:55:10 +09004094 Handle_RemainOnChan(msg.drvHandler, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004095
4096 break;
4097
4098 case HOST_IF_MSG_GET_RSSI:
Tony Cho143eb952015-09-21 12:16:32 +09004099 Handle_GetRssi(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004100 break;
4101
4102 case HOST_IF_MSG_GET_LINKSPEED:
Tony Cho143eb952015-09-21 12:16:32 +09004103 Handle_GetLinkspeed(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004104 break;
4105
4106 case HOST_IF_MSG_GET_STATISTICS:
Tony Choe60831e2015-10-05 13:50:45 +09004107 Handle_GetStatistics(msg.drvHandler, (tstrStatistics *)msg.body.data);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004108 break;
4109
4110 case HOST_IF_MSG_GET_CHNL:
Tony Cho143eb952015-09-21 12:16:32 +09004111 Handle_GetChnl(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004112 break;
4113
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004114 case HOST_IF_MSG_ADD_BEACON:
Tony Choa98491e2015-09-30 18:44:31 +09004115 Handle_AddBeacon(msg.drvHandler, &msg.body.beacon_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004116 break;
4117
4118 case HOST_IF_MSG_DEL_BEACON:
Tony Cho80bf88362015-09-30 18:44:29 +09004119 Handle_DelBeacon(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004120 break;
4121
4122 case HOST_IF_MSG_ADD_STATION:
Tony Choca8f47f2015-09-30 18:44:32 +09004123 Handle_AddStation(msg.drvHandler, &msg.body.add_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004124 break;
4125
4126 case HOST_IF_MSG_DEL_STATION:
Tony Cho889c25b2015-09-30 18:44:33 +09004127 Handle_DelStation(msg.drvHandler, &msg.body.del_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004128 break;
4129
4130 case HOST_IF_MSG_EDIT_STATION:
Tony Cho4a930962015-09-30 18:44:34 +09004131 Handle_EditStation(msg.drvHandler, &msg.body.edit_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004132 break;
4133
4134 case HOST_IF_MSG_GET_INACTIVETIME:
Tony Cho66bac7f2015-09-30 18:44:37 +09004135 Handle_Get_InActiveTime(msg.drvHandler, &msg.body.mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004136 break;
4137
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004138 case HOST_IF_MSG_SCAN_TIMER_FIRED:
4139 PRINT_D(HOSTINF_DBG, "Scan Timeout\n");
4140
Tony Cho143eb952015-09-21 12:16:32 +09004141 Handle_ScanDone(msg.drvHandler, SCAN_EVENT_ABORTED);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004142 break;
4143
4144 case HOST_IF_MSG_CONNECT_TIMER_FIRED:
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004145 PRINT_D(HOSTINF_DBG, "Connect Timeout\n");
Tony Cho143eb952015-09-21 12:16:32 +09004146 Handle_ConnectTimeout(msg.drvHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004147 break;
4148
4149 case HOST_IF_MSG_POWER_MGMT:
Tony Cho49e1f812015-09-30 18:44:36 +09004150 Handle_PowerManagement(msg.drvHandler, &msg.body.pwr_mgmt_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004151 break;
4152
4153 case HOST_IF_MSG_SET_WFIDRV_HANDLER:
Tony Cho143eb952015-09-21 12:16:32 +09004154 Handle_SetWfiDrvHandler(msg.drvHandler,
Tony Cho5e4377e2015-09-30 18:44:38 +09004155 &msg.body.drv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004156 break;
4157
4158 case HOST_IF_MSG_SET_OPERATION_MODE:
Tony Cho00c46302015-09-30 18:55:06 +09004159 Handle_SetOperationMode(msg.drvHandler, &msg.body.mode);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004160 break;
4161
4162 case HOST_IF_MSG_SET_IPADDRESS:
4163 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
Tony Chofb2d65e2015-09-30 18:44:39 +09004164 Handle_set_IPAddress(msg.drvHandler, msg.body.ip_info.au8IPAddr, msg.body.ip_info.idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004165 break;
4166
4167 case HOST_IF_MSG_GET_IPADDRESS:
4168 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_IPADDRESS\n");
Tony Chofb2d65e2015-09-30 18:44:39 +09004169 Handle_get_IPAddress(msg.drvHandler, msg.body.ip_info.au8IPAddr, msg.body.ip_info.idx);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004170 break;
4171
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004172 case HOST_IF_MSG_SET_MAC_ADDRESS:
Tony Cho15326e22015-09-30 18:55:07 +09004173 Handle_SetMacAddress(msg.drvHandler, &msg.body.set_mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004174 break;
4175
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004176 case HOST_IF_MSG_GET_MAC_ADDRESS:
Tony Choa5848692015-09-30 18:55:08 +09004177 Handle_GetMacAddress(msg.drvHandler, &msg.body.get_mac_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004178 break;
4179
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004180 case HOST_IF_MSG_REMAIN_ON_CHAN:
4181 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REMAIN_ON_CHAN\n");
Tony Cho070d3652015-09-30 18:55:10 +09004182 Handle_RemainOnChan(msg.drvHandler, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004183 break;
4184
4185 case HOST_IF_MSG_REGISTER_FRAME:
4186 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_REGISTER_FRAME\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09004187 Handle_RegisterFrame(msg.drvHandler, &msg.body.reg_frame);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004188 break;
4189
4190 case HOST_IF_MSG_LISTEN_TIMER_FIRED:
Tony Cho070d3652015-09-30 18:55:10 +09004191 Handle_ListenStateExpired(msg.drvHandler, &msg.body.remain_on_ch);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004192 break;
4193
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004194 case HOST_IF_MSG_SET_MULTICAST_FILTER:
4195 PRINT_D(HOSTINF_DBG, "HOST_IF_MSG_SET_MULTICAST_FILTER\n");
Tony Choa079cf4d2015-09-30 18:55:05 +09004196 Handle_SetMulticastFilter(msg.drvHandler, &msg.body.multicast_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004197 break;
4198
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004199 case HOST_IF_MSG_ADD_BA_SESSION:
Tony Choc833b472015-09-30 18:55:09 +09004200 Handle_AddBASession(msg.drvHandler, &msg.body.session_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004201 break;
4202
4203 case HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS:
Tony Choc833b472015-09-30 18:55:09 +09004204 Handle_DelAllRxBASessions(msg.drvHandler, &msg.body.session_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004205 break;
4206
4207 case HOST_IF_MSG_DEL_ALL_STA:
Tony Chob0c1e802015-10-05 13:50:46 +09004208 Handle_DelAllSta(msg.drvHandler, &msg.body.del_all_sta_info);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004209 break;
4210
4211 default:
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004212 PRINT_ER("[Host Interface] undefined Received Msg ID\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004213 break;
4214 }
4215 }
4216
4217 PRINT_D(HOSTINF_DBG, "Releasing thread exit semaphore\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004218 up(&hSemHostIFthrdEnd);
Arnd Bergmann1999bd52015-05-29 22:52:14 +02004219 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004220}
4221
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004222static void TimerCB_Scan(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004223{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004224 void *pvArg = (void *)arg;
Tony Cho143eb952015-09-21 12:16:32 +09004225 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004226
4227 /* prepare the Timer Callback message */
Tony Cho143eb952015-09-21 12:16:32 +09004228 memset(&msg, 0, sizeof(struct host_if_msg));
4229 msg.drvHandler = pvArg;
Tony Choa9f812a2015-09-21 12:16:33 +09004230 msg.id = HOST_IF_MSG_SCAN_TIMER_FIRED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004231
4232 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004233 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004234}
4235
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004236static void TimerCB_Connect(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004237{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07004238 void *pvArg = (void *)arg;
Tony Cho143eb952015-09-21 12:16:32 +09004239 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004240
4241 /* prepare the Timer Callback message */
Tony Cho143eb952015-09-21 12:16:32 +09004242 memset(&msg, 0, sizeof(struct host_if_msg));
4243 msg.drvHandler = pvArg;
Tony Choa9f812a2015-09-21 12:16:33 +09004244 msg.id = HOST_IF_MSG_CONNECT_TIMER_FIRED;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004245
4246 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004247 wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004248}
4249
4250
4251/**
4252 * @brief removes wpa/wpa2 keys
4253 * @details only in BSS STA mode if External Supplicant support is enabled.
4254 * removes all WPA/WPA2 station key entries from MAC hardware.
4255 * @param[in,out] handle to the wifi driver
4256 * @param[in] 6 bytes of Station Adress in the station entry table
4257 * @return Error code indicating success/failure
4258 * @note
4259 * @author zsalah
4260 * @date 8 March 2012
4261 * @version 1.0
4262 */
4263/* Check implementation in core adding 9 bytes to the input! */
Johnny Kim218dc402015-08-13 13:41:19 +09004264s32 host_int_remove_key(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8StaAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004265{
Leo Kime6e12662015-09-16 18:36:03 +09004266 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004267 tstrWID strWID;
4268 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4269
Chaehyun Limd85f5322015-06-11 14:35:54 +09004270 strWID.u16WIDid = (u16)WID_REMOVE_KEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004271 strWID.enuWIDtype = WID_STR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09004272 strWID.ps8WidVal = (s8 *)pu8StaAddress;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004273 strWID.s32ValueSize = 6;
4274
4275 return s32Error;
4276
4277}
4278
4279/**
4280 * @brief removes WEP key
4281 * @details valid only in BSS STA mode if External Supplicant support is enabled.
4282 * remove a WEP key entry from MAC HW.
4283 * The BSS Station automatically finds the index of the entry using its
4284 * BSS ID and removes that entry from the MAC hardware.
4285 * @param[in,out] handle to the wifi driver
4286 * @param[in] 6 bytes of Station Adress in the station entry table
4287 * @return Error code indicating success/failure
4288 * @note NO need for the STA add since it is not used for processing
4289 * @author zsalah
4290 * @date 8 March 2012
4291 * @version 1.0
4292 */
Johnny Kim218dc402015-08-13 13:41:19 +09004293s32 host_int_remove_wep_key(tstrWILC_WFIDrv *hWFIDrv, u8 u8keyIdx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004294{
Leo Kime6e12662015-09-16 18:36:03 +09004295 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004296 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004297 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004298
4299
Leo Kim24db7132015-09-16 18:36:01 +09004300 if (pstrWFIDrv == NULL) {
4301 s32Error = -EFAULT;
4302 PRINT_ER("Failed to send setup multicast config packet\n");
4303 return s32Error;
4304 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004305
4306 /* prepare the Remove Wep 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 = REMOVEKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004313 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004314
4315
4316
Tony Cho18990bf2015-09-30 18:44:24 +09004317 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004318 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8keyIdx;
4319
4320 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004321 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004322 if (s32Error)
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02004323 PRINT_ER("Error in sending message queue : Request to remove WEP key\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004324 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004325
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004326 return s32Error;
4327}
4328
4329/**
4330 * @brief sets WEP default key
4331 * @details Sets the index of the WEP encryption key in use,
4332 * in the key table
4333 * @param[in,out] handle to the wifi driver
4334 * @param[in] key index ( 0, 1, 2, 3)
4335 * @return Error code indicating success/failure
4336 * @note
4337 * @author zsalah
4338 * @date 8 March 2012
4339 * @version 1.0
4340 */
Johnny Kim218dc402015-08-13 13:41:19 +09004341s32 host_int_set_WEPDefaultKeyID(tstrWILC_WFIDrv *hWFIDrv, u8 u8Index)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004342{
Leo Kime6e12662015-09-16 18:36:03 +09004343 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004344 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004345 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004346
4347
Leo Kim24db7132015-09-16 18:36:01 +09004348 if (pstrWFIDrv == NULL) {
4349 s32Error = -EFAULT;
4350 PRINT_ER("driver is null\n");
4351 return s32Error;
4352 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004353
4354 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004355 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004356
4357
Tony Choa9f812a2015-09-21 12:16:33 +09004358 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004359 msg.body.key_info.enuKeyType = WEP;
4360 msg.body.key_info.u8KeyAction = DEFAULTKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004361 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004362
4363
Tony Cho18990bf2015-09-30 18:44:24 +09004364 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004365 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8Index;
4366
4367 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004368 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004369 if (s32Error)
4370 PRINT_ER("Error in sending message queue : Default key index\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004371 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004372
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004373 return s32Error;
4374}
4375
4376/**
4377 * @brief sets WEP deafault key
4378 * @details valid only in BSS STA mode if External Supplicant support is enabled.
4379 * sets WEP key entry into MAC hardware when it receives the
4380 * corresponding request from NDIS.
4381 * @param[in,out] handle to the wifi driver
4382 * @param[in] message containing WEP Key in the following format
4383 *|---------------------------------------|
4384 *|Key ID Value | Key Length | Key |
4385 *|-------------|------------|------------|
4386 | 1byte | 1byte | Key Length |
4387 ||---------------------------------------|
4388 |
4389 * @return Error code indicating success/failure
4390 * @note
4391 * @author zsalah
4392 * @date 8 March 2012
4393 * @version 1.0
4394 */
Johnny Kim218dc402015-08-13 13:41:19 +09004395s32 host_int_add_wep_key_bss_sta(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8WepKey, u8 u8WepKeylen, u8 u8Keyidx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004396{
4397
Leo Kime6e12662015-09-16 18:36:03 +09004398 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004399 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004400 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004401
Leo Kim24db7132015-09-16 18:36:01 +09004402 if (pstrWFIDrv == NULL) {
4403 s32Error = -EFAULT;
4404 PRINT_ER("driver is null\n");
4405 return s32Error;
4406 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004407
4408 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004409 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004410
4411
Tony Choa9f812a2015-09-21 12:16:33 +09004412 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004413 msg.body.key_info.enuKeyType = WEP;
4414 msg.body.key_info.u8KeyAction = ADDKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004415 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004416
4417
Tony Cho18990bf2015-09-30 18:44:24 +09004418 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004419 uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey = kmalloc(u8WepKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004420
Tony Cho18990bf2015-09-30 18:44:24 +09004421 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004422 pu8WepKey, u8WepKeylen);
4423
4424
Tony Cho18990bf2015-09-30 18:44:24 +09004425 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004426 uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen = (u8WepKeylen);
4427
Tony Cho18990bf2015-09-30 18:44:24 +09004428 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004429 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8Keyidx;
4430
4431 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004432 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004433 if (s32Error)
4434 PRINT_ER("Error in sending message queue :WEP Key\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004435 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004436
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004437 return s32Error;
4438
4439}
4440
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004441/**
4442 *
4443 * @brief host_int_add_wep_key_bss_ap
4444 * @details valid only in BSS AP mode if External Supplicant support is enabled.
4445 * sets WEP key entry into MAC hardware when it receives the
4446 *
4447 * corresponding request from NDIS.
4448 * @param[in,out] handle to the wifi driver
4449 *
4450 *
4451 * @return Error code indicating success/failure
4452 * @note
4453 * @author mdaftedar
4454 * @date 28 FEB 2013
4455 * @version 1.0
4456 */
Leo Kim841dfc42015-10-05 15:25:39 +09004457s32 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 +09004458{
4459
Leo Kime6e12662015-09-16 18:36:03 +09004460 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004461 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004462 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004463 u8 i;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004464
Leo Kim24db7132015-09-16 18:36:01 +09004465 if (pstrWFIDrv == NULL) {
4466 s32Error = -EFAULT;
4467 PRINT_ER("driver is null\n");
4468 return s32Error;
4469 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004470
4471 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004472 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004473
4474 if (INFO) {
4475 for (i = 0; i < u8WepKeylen; i++)
4476 PRINT_INFO(HOSTAPD_DBG, "KEY is %x\n", pu8WepKey[i]);
4477 }
Tony Choa9f812a2015-09-21 12:16:33 +09004478 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004479 msg.body.key_info.enuKeyType = WEP;
4480 msg.body.key_info.u8KeyAction = ADDKEY_AP;
Tony Cho143eb952015-09-21 12:16:32 +09004481 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004482
4483
Tony Cho18990bf2015-09-30 18:44:24 +09004484 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004485 uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey = kmalloc(u8WepKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004486
4487
Tony Cho18990bf2015-09-30 18:44:24 +09004488 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwepAttr.pu8WepKey,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004489 pu8WepKey, (u8WepKeylen));
4490
4491
Tony Cho18990bf2015-09-30 18:44:24 +09004492 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004493 uniHostIFkeyAttr.strHostIFwepAttr.u8WepKeylen = (u8WepKeylen);
4494
Tony Cho18990bf2015-09-30 18:44:24 +09004495 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004496 uniHostIFkeyAttr.strHostIFwepAttr.u8Wepidx = u8Keyidx;
4497
Tony Cho18990bf2015-09-30 18:44:24 +09004498 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004499 uniHostIFkeyAttr.strHostIFwepAttr.u8mode = u8mode;
4500
Tony Cho18990bf2015-09-30 18:44:24 +09004501 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004502 uniHostIFkeyAttr.strHostIFwepAttr.tenuAuth_type = tenuAuth_type;
4503 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004504 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004505
4506 if (s32Error)
4507 PRINT_ER("Error in sending message queue :WEP Key\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004508 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004509
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004510 return s32Error;
4511
4512}
Glen Lee108b3432015-09-16 18:53:20 +09004513
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004514/**
4515 * @brief adds ptk Key
4516 * @details
4517 * @param[in,out] handle to the wifi driver
4518 * @param[in] message containing PTK Key in the following format
4519 *|-----------------------------------------------------------------------------|
4520 *|Station address | Key Length | Temporal Key | Rx Michael Key |Tx Michael Key |
4521 *|----------------|------------|--------------|----------------|---------------|
4522 | 6 bytes | 1byte | 16 bytes | 8 bytes | 8 bytes |
4523 ||-----------------------------------------------------------------------------|
4524 * @return Error code indicating success/failure
4525 * @note
4526 * @author zsalah
4527 * @date 8 March 2012
4528 * @version 1.0
4529 */
Johnny Kim218dc402015-08-13 13:41:19 +09004530s32 host_int_add_ptk(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8Ptk, u8 u8PtkKeylen,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004531 const u8 *mac_addr, const u8 *pu8RxMic, const u8 *pu8TxMic, u8 mode, u8 u8Ciphermode, u8 u8Idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004532{
Leo Kime6e12662015-09-16 18:36:03 +09004533 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004534 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004535 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004536 u8 u8KeyLen = u8PtkKeylen;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004537 u32 i;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02004538
Leo Kim24db7132015-09-16 18:36:01 +09004539 if (pstrWFIDrv == NULL) {
4540 s32Error = -EFAULT;
4541 PRINT_ER("driver is null\n");
4542 return s32Error;
4543 }
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004544 if (pu8RxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004545 u8KeyLen += RX_MIC_KEY_LEN;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004546 if (pu8TxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004547 u8KeyLen += TX_MIC_KEY_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004548
4549 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004550 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004551
4552
Tony Choa9f812a2015-09-21 12:16:33 +09004553 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004554 msg.body.key_info.enuKeyType = WPAPtk;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004555 if (mode == AP_MODE) {
Tony Cho18990bf2015-09-30 18:44:24 +09004556 msg.body.key_info.u8KeyAction = ADDKEY_AP;
4557 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004558 uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx = u8Idx;
4559 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004560 if (mode == STATION_MODE)
Tony Cho18990bf2015-09-30 18:44:24 +09004561 msg.body.key_info.u8KeyAction = ADDKEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004562
4563
Tony Cho18990bf2015-09-30 18:44:24 +09004564 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004565 uniHostIFkeyAttr.strHostIFwpaAttr.pu8key = kmalloc(u8PtkKeylen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004566
4567
Tony Cho18990bf2015-09-30 18:44:24 +09004568 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004569 pu8Ptk, u8PtkKeylen);
4570
4571 if (pu8RxMic != NULL) {
4572
Tony Cho18990bf2015-09-30 18:44:24 +09004573 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 16,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004574 pu8RxMic, RX_MIC_KEY_LEN);
4575 if (INFO) {
4576 for (i = 0; i < RX_MIC_KEY_LEN; i++)
4577 PRINT_INFO(CFG80211_DBG, "PairwiseRx[%d] = %x\n", i, pu8RxMic[i]);
4578 }
4579 }
4580 if (pu8TxMic != NULL) {
4581
Tony Cho18990bf2015-09-30 18:44:24 +09004582 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 24,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004583 pu8TxMic, TX_MIC_KEY_LEN);
4584 if (INFO) {
4585 for (i = 0; i < TX_MIC_KEY_LEN; i++)
4586 PRINT_INFO(CFG80211_DBG, "PairwiseTx[%d] = %x\n", i, pu8TxMic[i]);
4587 }
4588 }
4589
Tony Cho18990bf2015-09-30 18:44:24 +09004590 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004591 uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen = u8KeyLen;
4592
Tony Cho18990bf2015-09-30 18:44:24 +09004593 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004594 uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode = u8Ciphermode;
Tony Cho18990bf2015-09-30 18:44:24 +09004595 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004596 uniHostIFkeyAttr.strHostIFwpaAttr.pu8macaddr = mac_addr;
Tony Cho143eb952015-09-21 12:16:32 +09004597 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004598
4599 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004600 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004601
4602 if (s32Error)
4603 PRINT_ER("Error in sending message queue: PTK Key\n");
4604
4605 /* ////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004606 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004607 /* /////// */
4608
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004609 return s32Error;
4610}
4611
4612/**
4613 * @brief adds Rx GTk Key
4614 * @details
4615 * @param[in,out] handle to the wifi driver
4616 * @param[in] pu8RxGtk : contains temporal key | Rx Mic | Tx Mic
4617 * u8GtkKeylen :The total key length
4618 *
4619 * @return Error code indicating success/failure
4620 * @note
4621 * @author zsalah
4622 * @date 8 March 2012
4623 * @version 1.0
4624 */
Johnny Kim218dc402015-08-13 13:41:19 +09004625s32 host_int_add_rx_gtk(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8RxGtk, u8 u8GtkKeylen,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004626 u8 u8KeyIdx, u32 u32KeyRSClen, const u8 *KeyRSC,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004627 const u8 *pu8RxMic, const u8 *pu8TxMic, u8 mode, u8 u8Ciphermode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004628{
Leo Kime6e12662015-09-16 18:36:03 +09004629 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004630 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004631 struct host_if_msg msg;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004632 u8 u8KeyLen = u8GtkKeylen;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004633
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 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004640 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004641
4642
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004643 if (pu8RxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004644 u8KeyLen += RX_MIC_KEY_LEN;
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02004645 if (pu8TxMic != NULL)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004646 u8KeyLen += TX_MIC_KEY_LEN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004647 if (KeyRSC != NULL) {
Tony Cho18990bf2015-09-30 18:44:24 +09004648 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004649 uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq = kmalloc(u32KeyRSClen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004650
Tony Cho18990bf2015-09-30 18:44:24 +09004651 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8seq,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004652 KeyRSC, u32KeyRSClen);
4653 }
4654
4655
Tony Choa9f812a2015-09-21 12:16:33 +09004656 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004657 msg.body.key_info.enuKeyType = WPARxGtk;
Tony Cho143eb952015-09-21 12:16:32 +09004658 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004659
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004660 if (mode == AP_MODE) {
Tony Cho18990bf2015-09-30 18:44:24 +09004661 msg.body.key_info.u8KeyAction = ADDKEY_AP;
4662 msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.u8Ciphermode = u8Ciphermode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004663 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004664 if (mode == STATION_MODE)
Tony Cho18990bf2015-09-30 18:44:24 +09004665 msg.body.key_info.u8KeyAction = ADDKEY;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004666
4667
Tony Cho18990bf2015-09-30 18:44:24 +09004668 msg.body.key_info.
Glen Leef3052582015-09-10 12:03:04 +09004669 uniHostIFkeyAttr.strHostIFwpaAttr.pu8key = kmalloc(u8KeyLen, GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004670
Tony Cho18990bf2015-09-30 18:44:24 +09004671 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004672 pu8RxGtk, u8GtkKeylen);
4673
4674 if (pu8RxMic != NULL) {
4675
Tony Cho18990bf2015-09-30 18:44:24 +09004676 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 16,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004677 pu8RxMic, RX_MIC_KEY_LEN);
4678
4679 }
4680 if (pu8TxMic != NULL) {
4681
Tony Cho18990bf2015-09-30 18:44:24 +09004682 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFwpaAttr.pu8key + 24,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004683 pu8TxMic, TX_MIC_KEY_LEN);
4684
4685 }
4686
Tony Cho18990bf2015-09-30 18:44:24 +09004687 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004688 uniHostIFkeyAttr.strHostIFwpaAttr.u8keyidx = u8KeyIdx;
Tony Cho18990bf2015-09-30 18:44:24 +09004689 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004690 uniHostIFkeyAttr.strHostIFwpaAttr.u8Keylen = u8KeyLen;
4691
Tony Cho18990bf2015-09-30 18:44:24 +09004692 msg.body.key_info.
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004693 uniHostIFkeyAttr.strHostIFwpaAttr.u8seqlen = u32KeyRSClen;
4694
4695
4696
4697 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004698 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004699 if (s32Error)
4700 PRINT_ER("Error in sending message queue: RX GTK\n");
4701 /* ////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004702 down(&(pstrWFIDrv->hSemTestKeyBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004703 /* /////// */
4704
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004705 return s32Error;
4706}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004707
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004708/**
4709 * @brief host_int_set_pmkid_info
4710 * @details caches the pmkid valid only in BSS STA mode if External Supplicant
4711 * support is enabled. This Function sets the PMKID in firmware
4712 * when host drivr receives the corresponding request from NDIS.
4713 * The firmware then includes theset PMKID in the appropriate
4714 * management frames
4715 * @param[in,out] handle to the wifi driver
4716 * @param[in] message containing PMKID Info in the following format
4717 *|-----------------------------------------------------------------|
4718 *|NumEntries | BSSID[1] | PMKID[1] | ... | BSSID[K] | PMKID[K] |
4719 *|-----------|------------|----------|-------|----------|----------|
4720 | 1 | 6 | 16 | ... | 6 | 16 |
4721 ||-----------------------------------------------------------------|
4722 * @return Error code indicating success/failure
4723 * @note
4724 * @author zsalah
4725 * @date 8 March 2012
4726 * @version 1.0
4727 */
Leo Kima949f902015-10-05 15:25:44 +09004728s32 host_int_set_pmkid_info(tstrWILC_WFIDrv *hWFIDrv, struct host_if_pmkid_attr *pu8PmkidInfoArray)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004729{
Leo Kime6e12662015-09-16 18:36:03 +09004730 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004731 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09004732 struct host_if_msg msg;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004733 u32 i;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004734
4735
Leo Kim24db7132015-09-16 18:36:01 +09004736 if (pstrWFIDrv == NULL) {
4737 s32Error = -EFAULT;
4738 PRINT_ER("driver is null\n");
4739 return s32Error;
4740 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004741
4742 /* prepare the Key Message */
Tony Cho143eb952015-09-21 12:16:32 +09004743 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004744
Tony Choa9f812a2015-09-21 12:16:33 +09004745 msg.id = HOST_IF_MSG_KEY;
Tony Cho18990bf2015-09-30 18:44:24 +09004746 msg.body.key_info.enuKeyType = PMKSA;
4747 msg.body.key_info.u8KeyAction = ADDKEY;
Tony Cho143eb952015-09-21 12:16:32 +09004748 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004749
4750 for (i = 0; i < pu8PmkidInfoArray->numpmkid; i++) {
4751
Tony Cho18990bf2015-09-30 18:44:24 +09004752 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].bssid, &pu8PmkidInfoArray->pmkidlist[i].bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004753 ETH_ALEN);
4754
Tony Cho18990bf2015-09-30 18:44:24 +09004755 memcpy(msg.body.key_info.uniHostIFkeyAttr.strHostIFpmkidAttr.pmkidlist[i].pmkid, &pu8PmkidInfoArray->pmkidlist[i].pmkid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004756 PMKID_LEN);
4757 }
4758
4759 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004760 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004761 if (s32Error)
4762 PRINT_ER(" Error in sending messagequeue: PMKID Info\n");
4763
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004764 return s32Error;
4765}
4766
4767/**
4768 * @brief gets the cached the pmkid info
4769 * @details valid only in BSS STA mode if External Supplicant
4770 * support is enabled. This Function sets the PMKID in firmware
4771 * when host drivr receives the corresponding request from NDIS.
4772 * The firmware then includes theset PMKID in the appropriate
4773 * management frames
4774 * @param[in,out] handle to the wifi driver,
4775 * message containing PMKID Info in the following format
4776 *|-----------------------------------------------------------------|
4777 *|NumEntries | BSSID[1] | PMKID[1] | ... | BSSID[K] | PMKID[K] |
4778 *|-----------|------------|----------|-------|----------|----------|
4779 | 1 | 6 | 16 | ... | 6 | 16 |
4780 ||-----------------------------------------------------------------|
4781 * @param[in]
4782 * @return Error code indicating success/failure
4783 * @note
4784 * @author zsalah
4785 * @date 8 March 2012
4786 * @version 1.0
4787 */
Johnny Kim218dc402015-08-13 13:41:19 +09004788s32 host_int_get_pmkid_info(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8PmkidInfoArray,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09004789 u32 u32PmkidInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004790{
Leo Kime6e12662015-09-16 18:36:03 +09004791 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004792 tstrWID strWID;
4793 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4794
Chaehyun Limd85f5322015-06-11 14:35:54 +09004795 strWID.u16WIDid = (u16)WID_PMKID_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004796 strWID.enuWIDtype = WID_STR;
4797 strWID.s32ValueSize = u32PmkidInfoLen;
4798 strWID.ps8WidVal = pu8PmkidInfoArray;
4799
4800 return s32Error;
4801}
4802
4803/**
4804 * @brief sets the pass phrase
4805 * @details AP/STA mode. This function gives the pass phrase used to
4806 * generate the Pre-Shared Key when WPA/WPA2 is enabled
4807 * The length of the field can vary from 8 to 64 bytes,
4808 * the lower layer should get the
4809 * @param[in,out] handle to the wifi driver,
4810 * @param[in] String containing PSK
4811 * @return Error code indicating success/failure
4812 * @note
4813 * @author zsalah
4814 * @date 8 March 2012
4815 * @version 1.0
4816 */
Johnny Kim218dc402015-08-13 13:41:19 +09004817s32 host_int_set_RSNAConfigPSKPassPhrase(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8PassPhrase,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004818 u8 u8Psklength)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004819{
Leo Kime6e12662015-09-16 18:36:03 +09004820 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004821 tstrWID strWID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004822
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004823 /*validating psk length*/
4824 if ((u8Psklength > 7) && (u8Psklength < 65)) {
Chaehyun Limd85f5322015-06-11 14:35:54 +09004825 strWID.u16WIDid = (u16)WID_11I_PSK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004826 strWID.enuWIDtype = WID_STR;
4827 strWID.ps8WidVal = pu8PassPhrase;
4828 strWID.s32ValueSize = u8Psklength;
4829 }
4830
4831 return s32Error;
4832}
4833/**
4834 * @brief host_int_get_MacAddress
4835 * @details gets mac address
4836 * @param[in,out] handle to the wifi driver,
4837 *
4838 * @return Error code indicating success/failure
4839 * @note
4840 * @author mdaftedar
4841 * @date 19 April 2012
4842 * @version 1.0
4843 */
Johnny Kim218dc402015-08-13 13:41:19 +09004844s32 host_int_get_MacAddress(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8MacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004845{
Leo Kime6e12662015-09-16 18:36:03 +09004846 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004847 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004848
4849
4850 /* prepare the Message */
Tony Cho143eb952015-09-21 12:16:32 +09004851 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004852
Tony Choa9f812a2015-09-21 12:16:33 +09004853 msg.id = HOST_IF_MSG_GET_MAC_ADDRESS;
Tony Choa5848692015-09-30 18:55:08 +09004854 msg.body.get_mac_info.u8MacAddress = pu8MacAddress;
Tony Cho143eb952015-09-21 12:16:32 +09004855 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004856 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09004857 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004858 if (s32Error) {
4859 PRINT_ER("Failed to send get mac address\n");
Leo Kime6e12662015-09-16 18:36:03 +09004860 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004861 }
4862
Arnd Bergmann83383ea2015-06-01 21:06:43 +02004863 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004864 return s32Error;
4865}
4866
4867/**
4868 * @brief host_int_set_MacAddress
4869 * @details sets mac address
4870 * @param[in,out] handle to the wifi driver,
4871 *
4872 * @return Error code indicating success/failure
4873 * @note
4874 * @author mabubakr
4875 * @date 16 July 2012
4876 * @version 1.0
4877 */
Johnny Kim218dc402015-08-13 13:41:19 +09004878s32 host_int_set_MacAddress(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8MacAddress)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004879{
Leo Kime6e12662015-09-16 18:36:03 +09004880 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09004881 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004882
4883 PRINT_D(GENERIC_DBG, "mac addr = %x:%x:%x\n", pu8MacAddress[0], pu8MacAddress[1], pu8MacAddress[2]);
4884
4885 /* prepare setting mac address message */
Tony Cho143eb952015-09-21 12:16:32 +09004886 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09004887 msg.id = HOST_IF_MSG_SET_MAC_ADDRESS;
Tony Cho15326e22015-09-30 18:55:07 +09004888 memcpy(msg.body.set_mac_info.u8MacAddress, pu8MacAddress, ETH_ALEN);
Tony Cho143eb952015-09-21 12:16:32 +09004889 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004890
Tony Cho143eb952015-09-21 12:16:32 +09004891 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kim24db7132015-09-16 18:36:01 +09004892 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004893 PRINT_ER("Failed to send message queue: Set mac address\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004894
4895 return s32Error;
4896
4897}
4898
4899/**
4900 * @brief host_int_get_RSNAConfigPSKPassPhrase
4901 * @details gets the pass phrase:AP/STA mode. This function gets the pass phrase used to
4902 * generate the Pre-Shared Key when WPA/WPA2 is enabled
4903 * The length of the field can vary from 8 to 64 bytes,
4904 * the lower layer should get the
4905 * @param[in,out] handle to the wifi driver,
4906 * String containing PSK
4907 * @return Error code indicating success/failure
4908 * @note
4909 * @author zsalah
4910 * @date 8 March 2012
4911 * @version 1.0
4912 */
Johnny Kim218dc402015-08-13 13:41:19 +09004913s32 host_int_get_RSNAConfigPSKPassPhrase(tstrWILC_WFIDrv *hWFIDrv,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09004914 u8 *pu8PassPhrase, u8 u8Psklength)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004915{
Leo Kime6e12662015-09-16 18:36:03 +09004916 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004917 tstrWID strWID;
4918 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4919
Chaehyun Limd85f5322015-06-11 14:35:54 +09004920 strWID.u16WIDid = (u16)WID_11I_PSK;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004921 strWID.enuWIDtype = WID_STR;
4922 strWID.s32ValueSize = u8Psklength;
4923 strWID.ps8WidVal = pu8PassPhrase;
4924
4925 return s32Error;
4926}
4927
4928/**
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004929 * @brief sets a start scan request
4930 * @details
4931 * @param[in,out] handle to the wifi driver,
4932 * @param[in] Scan Source one of the following values
4933 * DEFAULT_SCAN 0
4934 * USER_SCAN BIT0
4935 * OBSS_PERIODIC_SCAN BIT1
4936 * OBSS_ONETIME_SCAN BIT2
4937 * @return Error code indicating success/failure
4938 * @note
4939 * @author zsalah
4940 * @date 8 March 2012
4941 * @version 1.0
4942 */
Johnny Kim218dc402015-08-13 13:41:19 +09004943s32 host_int_set_start_scan_req(tstrWILC_WFIDrv *hWFIDrv, u8 scanSource)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004944{
Leo Kime6e12662015-09-16 18:36:03 +09004945 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004946 tstrWID strWID;
4947 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4948
Chaehyun Limd85f5322015-06-11 14:35:54 +09004949 strWID.u16WIDid = (u16)WID_START_SCAN_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004950 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09004951 strWID.ps8WidVal = (s8 *)&scanSource;
Dean Lee576917a2015-06-15 11:58:57 +09004952 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004953
4954 return s32Error;
4955}
4956
4957/**
4958 * @brief host_int_get_start_scan_req
4959 * @details gets a start scan request
4960 * @param[in,out] handle to the wifi driver,
4961 * @param[in] Scan Source one of the following values
4962 * DEFAULT_SCAN 0
4963 * USER_SCAN BIT0
4964 * OBSS_PERIODIC_SCAN BIT1
4965 * OBSS_ONETIME_SCAN BIT2
4966 * @return Error code indicating success/failure
4967 * @note
4968 * @author zsalah
4969 * @date 8 March 2012
4970 * @version 1.0
4971 */
4972
Johnny Kim218dc402015-08-13 13:41:19 +09004973s32 host_int_get_start_scan_req(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8ScanSource)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004974{
Leo Kime6e12662015-09-16 18:36:03 +09004975 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004976 tstrWID strWID;
4977 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
4978
Chaehyun Limd85f5322015-06-11 14:35:54 +09004979 strWID.u16WIDid = (u16)WID_START_SCAN_REQ;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004980 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09004981 strWID.ps8WidVal = (s8 *)pu8ScanSource;
Dean Lee576917a2015-06-15 11:58:57 +09004982 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09004983
4984 return s32Error;
4985}
4986
4987/**
4988 * @brief host_int_set_join_req
4989 * @details sets a join request
4990 * @param[in,out] handle to the wifi driver,
4991 * @param[in] Index of the bss descriptor
4992 * @return Error code indicating success/failure
4993 * @note
4994 * @author zsalah
4995 * @date 8 March 2012
4996 * @version 1.0
4997 */
Johnny Kim218dc402015-08-13 13:41:19 +09004998s32 host_int_set_join_req(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8bssid,
Arnd Bergmann057d1e92015-06-01 21:06:44 +02004999 const u8 *pu8ssid, size_t ssidLen,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09005000 const u8 *pu8IEs, size_t IEsLen,
Leo Kimb6ab85f2015-10-05 15:25:38 +09005001 wilc_connect_result pfConnectResult, void *pvUserArg,
Leo Kim841dfc42015-10-05 15:25:39 +09005002 u8 u8security, enum AUTHTYPE tenuAuth_type,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09005003 u8 u8channel,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005004 void *pJoinParams)
5005{
Leo Kime6e12662015-09-16 18:36:03 +09005006 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005007 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005008 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005009 tenuScanConnTimer enuScanConnTimer;
5010
Leo Kim24db7132015-09-16 18:36:01 +09005011 if (pstrWFIDrv == NULL || pfConnectResult == NULL) {
5012 s32Error = -EFAULT;
5013 PRINT_ER("Driver is null\n");
5014 return s32Error;
5015 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005016
5017 if (hWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005018 PRINT_ER("Driver is null\n");
5019 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005020 }
5021
5022 if (pJoinParams == NULL) {
5023 PRINT_ER("Unable to Join - JoinParams is NULL\n");
Leo Kim24db7132015-09-16 18:36:01 +09005024 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005025 }
Leo Kim24db7132015-09-16 18:36:01 +09005026
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005027 /* prepare the Connect Message */
Tony Cho143eb952015-09-21 12:16:32 +09005028 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005029
Tony Choa9f812a2015-09-21 12:16:33 +09005030 msg.id = HOST_IF_MSG_CONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005031
Tony Cho3f501972015-09-30 18:44:21 +09005032 msg.body.con_info.u8security = u8security;
5033 msg.body.con_info.tenuAuth_type = tenuAuth_type;
5034 msg.body.con_info.u8channel = u8channel;
5035 msg.body.con_info.pfConnectResult = pfConnectResult;
5036 msg.body.con_info.pvUserArg = pvUserArg;
5037 msg.body.con_info.pJoinParams = pJoinParams;
Tony Cho143eb952015-09-21 12:16:32 +09005038 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005039
5040 if (pu8bssid != NULL) {
Tony Cho3f501972015-09-30 18:44:21 +09005041 msg.body.con_info.pu8bssid = kmalloc(6, GFP_KERNEL); /* will be deallocated by the receiving thread */
5042 memcpy(msg.body.con_info.pu8bssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005043 pu8bssid, 6);
5044 }
5045
5046 if (pu8ssid != NULL) {
Tony Cho3f501972015-09-30 18:44:21 +09005047 msg.body.con_info.ssidLen = ssidLen;
5048 msg.body.con_info.pu8ssid = kmalloc(ssidLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
5049 memcpy(msg.body.con_info.pu8ssid,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005050
5051 pu8ssid, ssidLen);
5052 }
5053
5054 if (pu8IEs != NULL) {
Tony Cho3f501972015-09-30 18:44:21 +09005055 msg.body.con_info.IEsLen = IEsLen;
5056 msg.body.con_info.pu8IEs = kmalloc(IEsLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
5057 memcpy(msg.body.con_info.pu8IEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005058 pu8IEs, IEsLen);
5059 }
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05305060 if (pstrWFIDrv->enuHostIFstate < HOST_IF_CONNECTING)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005061 pstrWFIDrv->enuHostIFstate = HOST_IF_CONNECTING;
Chandra S Gorentla78174ad2015-08-08 17:41:36 +05305062 else
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005063 PRINT_D(GENERIC_DBG, "Don't set state to 'connecting' as state is %d\n", pstrWFIDrv->enuHostIFstate);
5064
5065 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005066 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005067 if (s32Error) {
5068 PRINT_ER("Failed to send message queue: Set join request\n");
Leo Kim24db7132015-09-16 18:36:01 +09005069 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005070 }
5071
5072 enuScanConnTimer = CONNECT_TIMER;
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07005073 pstrWFIDrv->hConnectTimer.data = (unsigned long)hWFIDrv;
5074 mod_timer(&pstrWFIDrv->hConnectTimer,
5075 jiffies + msecs_to_jiffies(HOST_IF_CONNECT_TIMEOUT));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005076
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005077 return s32Error;
5078}
5079
5080/**
5081 * @brief Flush a join request parameters to FW, but actual connection
5082 * @details The function is called in situation where WILC is connected to AP and
5083 * required to switch to hybrid FW for P2P connection
5084 * @param[in] handle to the wifi driver,
5085 * @return Error code indicating success/failure
5086 * @note
5087 * @author Amr Abdel-Moghny
5088 * @date 19 DEC 2013
5089 * @version 8.0
5090 */
5091
Johnny Kim218dc402015-08-13 13:41:19 +09005092s32 host_int_flush_join_req(tstrWILC_WFIDrv *hWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005093{
Leo Kime6e12662015-09-16 18:36:03 +09005094 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005095 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005096
5097 if (!gu8FlushedJoinReq) {
Leo Kime6e12662015-09-16 18:36:03 +09005098 s32Error = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005099 return s32Error;
5100 }
5101
5102
Leo Kim24db7132015-09-16 18:36:01 +09005103 if (hWFIDrv == NULL) {
5104 s32Error = -EFAULT;
5105 PRINT_ER("Driver is null\n");
5106 return s32Error;
5107 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005108
Tony Choa9f812a2015-09-21 12:16:33 +09005109 msg.id = HOST_IF_MSG_FLUSH_CONNECT;
Tony Cho143eb952015-09-21 12:16:32 +09005110 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005111
5112 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005113 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005114 if (s32Error) {
5115 PRINT_ER("Failed to send message queue: Flush join request\n");
Leo Kim24db7132015-09-16 18:36:01 +09005116 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005117 }
5118
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005119 return s32Error;
5120}
5121
5122/**
5123 * @brief host_int_disconnect
5124 * @details disconnects from the currently associated network
5125 * @param[in,out] handle to the wifi driver,
5126 * @param[in] Reason Code of the Disconnection
5127 * @return Error code indicating success/failure
5128 * @note
5129 * @author zsalah
5130 * @date 8 March 2012
5131 * @version 1.0
5132 */
Johnny Kim218dc402015-08-13 13:41:19 +09005133s32 host_int_disconnect(tstrWILC_WFIDrv *hWFIDrv, u16 u16ReasonCode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005134{
Leo Kime6e12662015-09-16 18:36:03 +09005135 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005136 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005137 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5138
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005139 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005140 PRINT_ER("Driver is null\n");
5141 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005142 }
5143
5144 /* prepare the Disconnect Message */
Tony Cho143eb952015-09-21 12:16:32 +09005145 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005146
Tony Choa9f812a2015-09-21 12:16:33 +09005147 msg.id = HOST_IF_MSG_DISCONNECT;
Tony Cho143eb952015-09-21 12:16:32 +09005148 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005149
5150 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005151 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005152 if (s32Error)
5153 PRINT_ER("Failed to send message queue: disconnect\n");
5154 /* ////////////// */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005155 down(&(pstrWFIDrv->hSemTestDisconnectBlock));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005156 /* /////// */
5157
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005158 return s32Error;
5159}
5160
5161/**
5162 * @brief host_int_disconnect_station
5163 * @details disconnects a sta
5164 * @param[in,out] handle to the wifi driver,
5165 * @param[in] Association Id of the station to be disconnected
5166 * @return Error code indicating success/failure
5167 * @note
5168 * @author zsalah
5169 * @date 8 March 2012
5170 * @version 1.0
5171 */
Johnny Kim218dc402015-08-13 13:41:19 +09005172s32 host_int_disconnect_station(tstrWILC_WFIDrv *hWFIDrv, u8 assoc_id)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005173{
Leo Kime6e12662015-09-16 18:36:03 +09005174 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005175 tstrWID strWID;
5176 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
5177
Chaehyun Limd85f5322015-06-11 14:35:54 +09005178 strWID.u16WIDid = (u16)WID_DISCONNECT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005179 strWID.enuWIDtype = WID_CHAR;
Chaehyun Limca356ad2015-06-11 14:35:57 +09005180 strWID.ps8WidVal = (s8 *)&assoc_id;
Dean Lee576917a2015-06-15 11:58:57 +09005181 strWID.s32ValueSize = sizeof(char);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005182
5183 return s32Error;
5184}
5185
5186/**
5187 * @brief host_int_get_assoc_req_info
5188 * @details gets a Association request info
5189 * @param[in,out] handle to the wifi driver,
5190 * Message containg assoc. req info in the following format
5191 * ------------------------------------------------------------------------
5192 | Management Frame Format |
5193 ||-------------------------------------------------------------------|
5194 ||Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS |
5195 ||-------------|--------|--|--|-----|----------------|----------|----|
5196 | 2 |2 |6 |6 |6 | 2 |0 - 2312 | 4 |
5197 ||-------------------------------------------------------------------|
5198 | |
5199 | Association Request Frame - Frame Body |
5200 ||-------------------------------------------------------------------|
5201 | Capability Information | Listen Interval | SSID | Supported Rates |
5202 ||------------------------|-----------------|------|-----------------|
5203 | 2 | 2 | 2-34 | 3-10 |
5204 | ---------------------------------------------------------------------
5205 * @return Error code indicating success/failure
5206 * @note
5207 * @author zsalah
5208 * @date 8 March 2012
5209 * @version 1.0
5210 */
5211
Johnny Kim218dc402015-08-13 13:41:19 +09005212s32 host_int_get_assoc_req_info(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8AssocReqInfo,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005213 u32 u32AssocReqInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005214{
Leo Kime6e12662015-09-16 18:36:03 +09005215 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005216 tstrWID strWID;
5217 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
5218
Chaehyun Limd85f5322015-06-11 14:35:54 +09005219 strWID.u16WIDid = (u16)WID_ASSOC_REQ_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005220 strWID.enuWIDtype = WID_STR;
5221 strWID.ps8WidVal = pu8AssocReqInfo;
5222 strWID.s32ValueSize = u32AssocReqInfoLen;
5223
5224
5225 return s32Error;
5226}
5227
5228/**
5229 * @brief gets a Association Response info
5230 * @details
5231 * @param[in,out] handle to the wifi driver,
5232 * Message containg assoc. resp info
5233 * @return Error code indicating success/failure
5234 * @note
5235 * @author zsalah
5236 * @date 8 March 2012
5237 * @version 1.0
5238 */
Johnny Kim218dc402015-08-13 13:41:19 +09005239s32 host_int_get_assoc_res_info(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8AssocRespInfo,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005240 u32 u32MaxAssocRespInfoLen, u32 *pu32RcvdAssocRespInfoLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005241{
Leo Kime6e12662015-09-16 18:36:03 +09005242 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005243 tstrWID strWID;
5244 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5245
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005246 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005247 PRINT_ER("Driver is null\n");
5248 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005249 }
5250
Chaehyun Limd85f5322015-06-11 14:35:54 +09005251 strWID.u16WIDid = (u16)WID_ASSOC_RES_INFO;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005252 strWID.enuWIDtype = WID_STR;
5253 strWID.ps8WidVal = pu8AssocRespInfo;
5254 strWID.s32ValueSize = u32MaxAssocRespInfoLen;
5255
5256
5257 /* Sending Configuration packet */
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09005258 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
5259 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005260 if (s32Error) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005261 *pu32RcvdAssocRespInfoLen = 0;
Leo Kim24db7132015-09-16 18:36:01 +09005262 PRINT_ER("Failed to send association response config packet\n");
5263 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005264 } else {
5265 *pu32RcvdAssocRespInfoLen = strWID.s32ValueSize;
5266 }
5267
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005268 return s32Error;
5269}
5270
5271/**
5272 * @brief gets a Association Response info
5273 * @details Valid only in STA mode. This function gives the RSSI
5274 * values observed in all the channels at the time of scanning.
5275 * The length of the field is 1 greater that the total number of
5276 * channels supported. Byte 0 contains the number of channels while
5277 * each of Byte N contains the observed RSSI value for the channel index N.
5278 * @param[in,out] handle to the wifi driver,
5279 * array of scanned channels' RSSI
5280 * @return Error code indicating success/failure
5281 * @note
5282 * @author zsalah
5283 * @date 8 March 2012
5284 * @version 1.0
5285 */
Johnny Kim218dc402015-08-13 13:41:19 +09005286s32 host_int_get_rx_power_level(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8RxPowerLevel,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005287 u32 u32RxPowerLevelLen)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005288{
Leo Kime6e12662015-09-16 18:36:03 +09005289 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005290 tstrWID strWID;
5291 /* tstrWILC_WFIDrv * pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv; */
5292
Chaehyun Limd85f5322015-06-11 14:35:54 +09005293 strWID.u16WIDid = (u16)WID_RX_POWER_LEVEL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005294 strWID.enuWIDtype = WID_STR;
5295 strWID.ps8WidVal = pu8RxPowerLevel;
5296 strWID.s32ValueSize = u32RxPowerLevelLen;
5297
5298
5299 return s32Error;
5300}
5301
5302/**
5303 * @brief sets a channel
5304 * @details
5305 * @param[in,out] handle to the wifi driver,
5306 * @param[in] Index of the channel to be set
5307 *|-------------------------------------------------------------------|
5308 | CHANNEL1 CHANNEL2 .... CHANNEL14 |
5309 | Input: 1 2 14 |
5310 ||-------------------------------------------------------------------|
5311 * @return Error code indicating success/failure
5312 * @note
5313 * @author zsalah
5314 * @date 8 March 2012
5315 * @version 1.0
5316 */
Chaehyun Lim5ba48ec2015-10-02 21:44:52 +09005317int host_int_set_mac_chnl_num(tstrWILC_WFIDrv *wfi_drv, u8 channel)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005318{
Chaehyun Lim792fb252015-10-05 11:07:22 +09005319 int result;
Tony Cho143eb952015-09-21 12:16:32 +09005320 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005321
Chaehyun Lim157da212015-10-05 11:07:21 +09005322 if (!wfi_drv) {
Leo Kim24db7132015-09-16 18:36:01 +09005323 PRINT_ER("driver is null\n");
5324 return -EFAULT;
5325 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005326
5327 /* prepare the set channel message */
Tony Cho143eb952015-09-21 12:16:32 +09005328 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005329 msg.id = HOST_IF_MSG_SET_CHANNEL;
Chaehyun Lim1c5833c2015-10-02 21:44:51 +09005330 msg.body.channel_info.u8SetChan = channel;
Chaehyun Lim5ba48ec2015-10-02 21:44:52 +09005331 msg.drvHandler = wfi_drv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005332
Chaehyun Lim1ef58e42015-10-02 21:44:49 +09005333 result = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
5334 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09005335 PRINT_ER("wilc mq send fail\n");
Chaehyun Lim792fb252015-10-05 11:07:22 +09005336 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005337 }
5338
Chaehyun Lim792fb252015-10-05 11:07:22 +09005339 return 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005340}
5341
5342
Chaehyun Lim244efb12015-10-02 21:44:53 +09005343int host_int_wait_msg_queue_idle(void)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005344{
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005345 int result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005346
Tony Cho143eb952015-09-21 12:16:32 +09005347 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005348
5349 /* prepare the set driver handler message */
5350
Tony Cho143eb952015-09-21 12:16:32 +09005351 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005352 msg.id = HOST_IF_MSG_Q_IDLE;
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005353 result = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
5354 if (result) {
Leo Kim24db7132015-09-16 18:36:01 +09005355 PRINT_ER("wilc mq send fail\n");
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005356 result = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005357 }
5358
5359 /* wait untill MSG Q is empty */
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005360 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005361
Chaehyun Lim6d6c9bb2015-10-02 21:44:54 +09005362 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005363}
5364
Johnny Kim218dc402015-08-13 13:41:19 +09005365s32 host_int_set_wfi_drv_handler(tstrWILC_WFIDrv *u32address)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005366{
Leo Kime6e12662015-09-16 18:36:03 +09005367 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005368
Tony Cho143eb952015-09-21 12:16:32 +09005369 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005370
5371
5372 /* prepare the set driver handler message */
5373
Tony Cho143eb952015-09-21 12:16:32 +09005374 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005375 msg.id = HOST_IF_MSG_SET_WFIDRV_HANDLER;
Tony Cho5e4377e2015-09-30 18:44:38 +09005376 msg.body.drv.u32Address = get_id_from_handler(u32address);
Tony Cho143eb952015-09-21 12:16:32 +09005377 msg.drvHandler = u32address;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005378
Tony Cho143eb952015-09-21 12:16:32 +09005379 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kim24db7132015-09-16 18:36:01 +09005380 if (s32Error) {
5381 PRINT_ER("wilc mq send fail\n");
5382 s32Error = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005383 }
5384
5385 return s32Error;
5386}
5387
5388
5389
Johnny Kim218dc402015-08-13 13:41:19 +09005390s32 host_int_set_operation_mode(tstrWILC_WFIDrv *hWFIDrv, u32 u32mode)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005391{
Leo Kime6e12662015-09-16 18:36:03 +09005392 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005393
Tony Cho143eb952015-09-21 12:16:32 +09005394 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005395
5396
5397 /* prepare the set driver handler message */
5398
Tony Cho143eb952015-09-21 12:16:32 +09005399 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005400 msg.id = HOST_IF_MSG_SET_OPERATION_MODE;
Tony Cho00c46302015-09-30 18:55:06 +09005401 msg.body.mode.u32Mode = u32mode;
Tony Cho143eb952015-09-21 12:16:32 +09005402 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005403
Tony Cho143eb952015-09-21 12:16:32 +09005404 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kim24db7132015-09-16 18:36:01 +09005405 if (s32Error) {
5406 PRINT_ER("wilc mq send fail\n");
5407 s32Error = -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005408 }
5409
5410 return s32Error;
5411}
5412
5413/**
5414 * @brief gets the current channel index
5415 * @details
5416 * @param[in,out] handle to the wifi driver,
5417 * current channel index
5418 *|-----------------------------------------------------------------------|
5419 | CHANNEL1 CHANNEL2 .... CHANNEL14 |
5420 | Input: 1 2 14 |
5421 ||-----------------------------------------------------------------------|
5422 * @return Error code indicating success/failure
5423 * @note
5424 * @author zsalah
5425 * @date 8 March 2012
5426 * @version 1.0
5427 */
Johnny Kim218dc402015-08-13 13:41:19 +09005428s32 host_int_get_host_chnl_num(tstrWILC_WFIDrv *hWFIDrv, u8 *pu8ChNo)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005429{
Leo Kime6e12662015-09-16 18:36:03 +09005430 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005431 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005432 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005433
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005434 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005435 PRINT_ER("driver is null\n");
5436 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005437 }
5438
5439 /* prepare the Get Channel Message */
Tony Cho143eb952015-09-21 12:16:32 +09005440 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005441
Tony Choa9f812a2015-09-21 12:16:33 +09005442 msg.id = HOST_IF_MSG_GET_CHNL;
Tony Cho143eb952015-09-21 12:16:32 +09005443 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005444
5445 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005446 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005447 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09005448 PRINT_ER("wilc mq send fail\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005449 down(&(pstrWFIDrv->hSemGetCHNL));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005450 /* gu8Chnl = 11; */
5451
5452 *pu8ChNo = gu8Chnl;
5453
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005454 return s32Error;
5455
5456
5457}
5458
5459
5460/**
5461 * @brief host_int_test_set_int_wid
5462 * @details Test function for setting wids
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005463 * @param[in,out] WILC_WFIDrvHandle hWFIDrv, u32 u32TestMemAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005464 * @return Error code indicating success/failure
5465 * @note
5466 * @author zsalah
5467 * @date 8 March 2012
5468 * @version 1.0
5469 */
Johnny Kim218dc402015-08-13 13:41:19 +09005470s32 host_int_test_set_int_wid(tstrWILC_WFIDrv *hWFIDrv, u32 u32TestMemAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005471{
Leo Kime6e12662015-09-16 18:36:03 +09005472 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005473 tstrWID strWID;
5474 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5475
5476
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005477 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005478 PRINT_ER("driver is null\n");
5479 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005480 }
5481
5482 /*prepare configuration packet*/
Chaehyun Limd85f5322015-06-11 14:35:54 +09005483 strWID.u16WIDid = (u16)WID_MEMORY_ADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005484 strWID.enuWIDtype = WID_INT;
Dean Lee576917a2015-06-15 11:58:57 +09005485 strWID.ps8WidVal = (char *)&u32TestMemAddr;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005486 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005487
5488 /*Sending Cfg*/
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09005489 s32Error = send_config_pkt(SET_CFG, &strWID, 1, true,
5490 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005491 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09005492 PRINT_ER("Failed to set wid value\n");
5493 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005494 } else {
5495 PRINT_D(HOSTINF_DBG, "Successfully set wid value\n");
5496
5497 }
5498
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005499 return s32Error;
5500}
5501
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005502/**
5503 * @brief host_int_get_inactive_time
5504 * @details
5505 * @param[in,out] handle to the wifi driver,
5506 * current sta macaddress, inactive_time
5507 * @return
5508 * @note
5509 * @author
5510 * @date
5511 * @version 1.0
5512 */
Johnny Kim218dc402015-08-13 13:41:19 +09005513s32 host_int_get_inactive_time(tstrWILC_WFIDrv *hWFIDrv, const u8 *mac, u32 *pu32InactiveTime)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005514{
Leo Kime6e12662015-09-16 18:36:03 +09005515 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005516 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005517 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005518
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005519 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005520 PRINT_ER("driver is null\n");
5521 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005522 }
5523
Tony Cho143eb952015-09-21 12:16:32 +09005524 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005525
5526
Tony Cho66bac7f2015-09-30 18:44:37 +09005527 memcpy(msg.body.mac_info.mac,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005528 mac, ETH_ALEN);
5529
Tony Choa9f812a2015-09-21 12:16:33 +09005530 msg.id = HOST_IF_MSG_GET_INACTIVETIME;
Tony Cho143eb952015-09-21 12:16:32 +09005531 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005532
5533 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005534 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005535 if (s32Error)
5536 PRINT_ER("Failed to send get host channel param's message queue ");
5537
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005538 down(&(pstrWFIDrv->hSemInactiveTime));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005539
5540 *pu32InactiveTime = gu32InactiveTime;
5541
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005542 return s32Error;
5543}
Glen Lee108b3432015-09-16 18:53:20 +09005544
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005545/**
5546 * @brief host_int_test_get_int_wid
5547 * @details Test function for getting wids
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005548 * @param[in,out] WILC_WFIDrvHandle hWFIDrv, u32* pu32TestMemAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005549 * @return Error code indicating success/failure
5550 * @note
5551 * @author zsalah
5552 * @date 8 March 2012
5553 * @version 1.0
5554 */
Johnny Kim218dc402015-08-13 13:41:19 +09005555s32 host_int_test_get_int_wid(tstrWILC_WFIDrv *hWFIDrv, u32 *pu32TestMemAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005556{
5557
Leo Kime6e12662015-09-16 18:36:03 +09005558 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005559 tstrWID strWID;
5560 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5561
5562
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005563 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005564 PRINT_ER("driver is null\n");
5565 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005566 }
5567
Chaehyun Limd85f5322015-06-11 14:35:54 +09005568 strWID.u16WIDid = (u16)WID_MEMORY_ADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005569 strWID.enuWIDtype = WID_INT;
Chaehyun Limca356ad2015-06-11 14:35:57 +09005570 strWID.ps8WidVal = (s8 *)pu32TestMemAddr;
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09005571 strWID.s32ValueSize = sizeof(u32);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005572
Chaehyun Limcf32c3c2015-09-22 22:47:38 +09005573 s32Error = send_config_pkt(GET_CFG, &strWID, 1, true,
5574 get_id_from_handler(pstrWFIDrv));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005575 /*get the value by searching the local copy*/
5576 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09005577 PRINT_ER("Failed to get wid value\n");
5578 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005579 } else {
5580 PRINT_D(HOSTINF_DBG, "Successfully got wid value\n");
5581
5582 }
5583
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005584 return s32Error;
5585}
5586
5587
5588/**
5589 * @brief host_int_get_rssi
5590 * @details gets the currently maintained RSSI value for the station.
5591 * The received signal strength value in dB.
5592 * The range of valid values is -128 to 0.
5593 * @param[in,out] handle to the wifi driver,
5594 * rssi value in dB
5595 * @return Error code indicating success/failure
5596 * @note
5597 * @author zsalah
5598 * @date 8 March 2012
5599 * @version 1.0
5600 */
Johnny Kim218dc402015-08-13 13:41:19 +09005601s32 host_int_get_rssi(tstrWILC_WFIDrv *hWFIDrv, s8 *ps8Rssi)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005602{
Leo Kime6e12662015-09-16 18:36:03 +09005603 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005604 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005605 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5606
5607
5608 /* prepare the Get RSSI Message */
Tony Cho143eb952015-09-21 12:16:32 +09005609 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005610
Tony Choa9f812a2015-09-21 12:16:33 +09005611 msg.id = HOST_IF_MSG_GET_RSSI;
Tony Cho143eb952015-09-21 12:16:32 +09005612 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005613
5614 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005615 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005616 if (s32Error) {
5617 PRINT_ER("Failed to send get host channel param's message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09005618 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005619 }
5620
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005621 down(&(pstrWFIDrv->hSemGetRSSI));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005622
5623
5624 if (ps8Rssi == NULL) {
5625 PRINT_ER("RSS pointer value is null");
Leo Kime6e12662015-09-16 18:36:03 +09005626 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005627 }
5628
5629
5630 *ps8Rssi = gs8Rssi;
5631
5632
5633 return s32Error;
5634}
5635
Johnny Kim218dc402015-08-13 13:41:19 +09005636s32 host_int_get_link_speed(tstrWILC_WFIDrv *hWFIDrv, s8 *ps8lnkspd)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005637{
Tony Cho143eb952015-09-21 12:16:32 +09005638 struct host_if_msg msg;
Leo Kime6e12662015-09-16 18:36:03 +09005639 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005640
5641 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5642
5643
5644
5645 /* prepare the Get LINKSPEED Message */
Tony Cho143eb952015-09-21 12:16:32 +09005646 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005647
Tony Choa9f812a2015-09-21 12:16:33 +09005648 msg.id = HOST_IF_MSG_GET_LINKSPEED;
Tony Cho143eb952015-09-21 12:16:32 +09005649 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005650
5651 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005652 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005653 if (s32Error) {
5654 PRINT_ER("Failed to send GET_LINKSPEED to message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09005655 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005656 }
5657
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005658 down(&(pstrWFIDrv->hSemGetLINKSPEED));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005659
5660
5661 if (ps8lnkspd == NULL) {
5662 PRINT_ER("LINKSPEED pointer value is null");
Leo Kime6e12662015-09-16 18:36:03 +09005663 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005664 }
5665
5666
5667 *ps8lnkspd = gs8lnkspd;
5668
5669
5670 return s32Error;
5671}
5672
Johnny Kim218dc402015-08-13 13:41:19 +09005673s32 host_int_get_statistics(tstrWILC_WFIDrv *hWFIDrv, tstrStatistics *pstrStatistics)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005674{
Leo Kime6e12662015-09-16 18:36:03 +09005675 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005676 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005677
5678
5679 /* prepare the Get RSSI Message */
Tony Cho143eb952015-09-21 12:16:32 +09005680 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005681
Tony Choa9f812a2015-09-21 12:16:33 +09005682 msg.id = HOST_IF_MSG_GET_STATISTICS;
Tony Choe60831e2015-10-05 13:50:45 +09005683 msg.body.data = (char *)pstrStatistics;
Tony Cho143eb952015-09-21 12:16:32 +09005684 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005685 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005686 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005687 if (s32Error) {
5688 PRINT_ER("Failed to send get host channel param's message queue ");
Leo Kime6e12662015-09-16 18:36:03 +09005689 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005690 }
5691
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005692 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005693 return s32Error;
5694}
5695
5696
5697/**
5698 * @brief host_int_scan
5699 * @details scans a set of channels
5700 * @param[in,out] handle to the wifi driver,
5701 * @param[in] Scan source
5702 * Scan Type PASSIVE_SCAN = 0,
5703 * ACTIVE_SCAN = 1
5704 * Channels Array
5705 * Channels Array length
5706 * Scan Callback function
5707 * @return Error code indicating success/failure
5708 * @note
5709 * @author zsalah
5710 * @date 8 March 2012
5711 * @version 1.0
5712 */
Johnny Kim218dc402015-08-13 13:41:19 +09005713s32 host_int_scan(tstrWILC_WFIDrv *hWFIDrv, u8 u8ScanSource,
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09005714 u8 u8ScanType, u8 *pu8ChnlFreqList,
5715 u8 u8ChnlListLen, const u8 *pu8IEs,
Leo Kimba1d1a62015-10-05 15:25:36 +09005716 size_t IEsLen, wilc_scan_result ScanResult,
Leo Kim607db442015-10-05 15:25:37 +09005717 void *pvUserArg,
5718 struct hidden_network *pstrHiddenNetwork)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005719{
Leo Kime6e12662015-09-16 18:36:03 +09005720 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005721 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09005722 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005723 tenuScanConnTimer enuScanConnTimer;
5724
Leo Kim24db7132015-09-16 18:36:01 +09005725 if (pstrWFIDrv == NULL || ScanResult == NULL) {
5726 PRINT_ER("pstrWFIDrv or ScanResult = NULL\n");
5727 return -EFAULT;
5728 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005729
5730 /* prepare the Scan Message */
Tony Cho143eb952015-09-21 12:16:32 +09005731 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005732
Tony Choa9f812a2015-09-21 12:16:33 +09005733 msg.id = HOST_IF_MSG_SCAN;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005734
5735 if (pstrHiddenNetwork != NULL) {
Tony Cho4528bdb2015-09-30 18:44:20 +09005736 msg.body.scan_info.strHiddenNetwork.pstrHiddenNetworkInfo = pstrHiddenNetwork->pstrHiddenNetworkInfo;
5737 msg.body.scan_info.strHiddenNetwork.u8ssidnum = pstrHiddenNetwork->u8ssidnum;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005738
5739 } else
5740 PRINT_D(HOSTINF_DBG, "pstrHiddenNetwork IS EQUAL TO NULL\n");
5741
Tony Cho143eb952015-09-21 12:16:32 +09005742 msg.drvHandler = hWFIDrv;
Tony Cho4528bdb2015-09-30 18:44:20 +09005743 msg.body.scan_info.u8ScanSource = u8ScanSource;
5744 msg.body.scan_info.u8ScanType = u8ScanType;
5745 msg.body.scan_info.pfScanResult = ScanResult;
5746 msg.body.scan_info.pvUserArg = pvUserArg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005747
Tony Cho4528bdb2015-09-30 18:44:20 +09005748 msg.body.scan_info.u8ChnlListLen = u8ChnlListLen;
5749 msg.body.scan_info.pu8ChnlFreqList = kmalloc(u8ChnlListLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
5750 memcpy(msg.body.scan_info.pu8ChnlFreqList,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005751 pu8ChnlFreqList, u8ChnlListLen);
5752
Tony Cho4528bdb2015-09-30 18:44:20 +09005753 msg.body.scan_info.IEsLen = IEsLen;
5754 msg.body.scan_info.pu8IEs = kmalloc(IEsLen, GFP_KERNEL); /* will be deallocated by the receiving thread */
5755 memcpy(msg.body.scan_info.pu8IEs,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005756 pu8IEs, IEsLen);
5757
5758 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005759 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005760 if (s32Error) {
Leo Kim24db7132015-09-16 18:36:01 +09005761 PRINT_ER("Error in sending message queue\n");
5762 return -EINVAL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005763 }
5764
5765 enuScanConnTimer = SCAN_TIMER;
5766 PRINT_D(HOSTINF_DBG, ">> Starting the SCAN timer\n");
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07005767 pstrWFIDrv->hScanTimer.data = (unsigned long)hWFIDrv;
5768 mod_timer(&pstrWFIDrv->hScanTimer,
5769 jiffies + msecs_to_jiffies(HOST_IF_SCAN_TIMEOUT));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005770
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005771 return s32Error;
5772
5773}
5774/**
5775 * @brief hif_set_cfg
5776 * @details sets configuration wids values
5777 * @param[in,out] handle to the wifi driver,
5778 * @param[in] WID, WID value
5779 * @return Error code indicating success/failure
5780 * @note
5781 * @author zsalah
5782 * @date 8 March 2012
5783 * @version 1.0
5784 */
Leo Kim95296502015-10-05 15:25:46 +09005785s32 hif_set_cfg(tstrWILC_WFIDrv *hWFIDrv, struct cfg_param_val *pstrCfgParamVal)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005786{
5787
Leo Kime6e12662015-09-16 18:36:03 +09005788 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005789 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5790
Tony Cho143eb952015-09-21 12:16:32 +09005791 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005792
5793
Leo Kim24db7132015-09-16 18:36:01 +09005794 if (pstrWFIDrv == NULL) {
5795 PRINT_ER("pstrWFIDrv NULL\n");
5796 return -EFAULT;
5797 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005798 /* prepare the WiphyParams Message */
Tony Cho143eb952015-09-21 12:16:32 +09005799 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09005800 msg.id = HOST_IF_MSG_CFG_PARAMS;
Tony Choa2340c32015-09-30 18:44:25 +09005801 msg.body.cfg_info.pstrCfgParamVal = *pstrCfgParamVal;
Tony Cho143eb952015-09-21 12:16:32 +09005802 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005803
Tony Cho143eb952015-09-21 12:16:32 +09005804 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005805
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005806 return s32Error;
5807
5808}
5809
5810
5811/**
5812 * @brief hif_get_cfg
5813 * @details gets configuration wids values
5814 * @param[in,out] handle to the wifi driver,
5815 * WID value
5816 * @param[in] WID,
5817 * @return Error code indicating success/failure
5818 * @note
5819 * @author zsalah
5820 *
5821 * @date 8 March 2012
5822 * @version 1.0
5823 */
Johnny Kim218dc402015-08-13 13:41:19 +09005824s32 hif_get_cfg(tstrWILC_WFIDrv *hWFIDrv, u16 u16WID, u16 *pu16WID_Value)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005825{
Leo Kime6e12662015-09-16 18:36:03 +09005826 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005827 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
5828
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005829 down(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005830
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09005831 if (pstrWFIDrv == NULL) {
Leo Kim24db7132015-09-16 18:36:01 +09005832 PRINT_ER("pstrWFIDrv NULL\n");
5833 return -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005834 }
5835 PRINT_D(HOSTINF_DBG, "Getting configuration parameters\n");
5836 switch (u16WID) {
5837
5838 case WID_BSS_TYPE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005839 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.bss_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005840 break;
5841
5842 case WID_AUTH_TYPE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005843 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.auth_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005844 break;
5845
5846 case WID_AUTH_TIMEOUT:
5847 *pu16WID_Value = pstrWFIDrv->strCfgValues.auth_timeout;
5848 break;
5849
5850 case WID_POWER_MANAGEMENT:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005851 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.power_mgmt_mode;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005852 break;
5853
5854 case WID_SHORT_RETRY_LIMIT:
5855 *pu16WID_Value = pstrWFIDrv->strCfgValues.short_retry_limit;
5856 break;
5857
5858 case WID_LONG_RETRY_LIMIT:
5859 *pu16WID_Value = pstrWFIDrv->strCfgValues.long_retry_limit;
5860 break;
5861
5862 case WID_FRAG_THRESHOLD:
5863 *pu16WID_Value = pstrWFIDrv->strCfgValues.frag_threshold;
5864 break;
5865
5866 case WID_RTS_THRESHOLD:
5867 *pu16WID_Value = pstrWFIDrv->strCfgValues.rts_threshold;
5868 break;
5869
5870 case WID_PREAMBLE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005871 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.preamble_type;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005872 break;
5873
5874 case WID_SHORT_SLOT_ALLOWED:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005875 *pu16WID_Value = (u16) pstrWFIDrv->strCfgValues.short_slot_allowed;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005876 break;
5877
5878 case WID_11N_TXOP_PROT_DISABLE:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005879 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.txop_prot_disabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005880 break;
5881
5882 case WID_BEACON_INTERVAL:
5883 *pu16WID_Value = pstrWFIDrv->strCfgValues.beacon_interval;
5884 break;
5885
5886 case WID_DTIM_PERIOD:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005887 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.dtim_period;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005888 break;
5889
5890 case WID_SITE_SURVEY:
Chaehyun Limd85f5322015-06-11 14:35:54 +09005891 *pu16WID_Value = (u16)pstrWFIDrv->strCfgValues.site_survey_enabled;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005892 break;
5893
5894 case WID_SITE_SURVEY_SCAN_TIME:
5895 *pu16WID_Value = pstrWFIDrv->strCfgValues.site_survey_scan_time;
5896 break;
5897
5898 case WID_ACTIVE_SCAN_TIME:
5899 *pu16WID_Value = pstrWFIDrv->strCfgValues.active_scan_time;
5900 break;
5901
5902 case WID_PASSIVE_SCAN_TIME:
5903 *pu16WID_Value = pstrWFIDrv->strCfgValues.passive_scan_time;
5904 break;
5905
5906 case WID_CURRENT_TX_RATE:
5907 *pu16WID_Value = pstrWFIDrv->strCfgValues.curr_tx_rate;
5908 break;
5909
5910 default:
5911 break;
5912 }
5913
Arnd Bergmann83383ea2015-06-01 21:06:43 +02005914 up(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005915
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005916 return s32Error;
5917
5918}
5919
5920/*****************************************************************************/
5921/* Notification Functions */
5922/*****************************************************************************/
5923/**
5924 * @brief notifies host with join and leave requests
5925 * @details This function prepares an Information frame having the
5926 * information about a joining/leaving station.
5927 * @param[in,out] handle to the wifi driver,
5928 * @param[in] 6 byte Sta Adress
5929 * Join or leave flag:
5930 * Join = 1,
5931 * Leave =0
5932 * @return Error code indicating success/failure
5933 * @note
5934 * @author zsalah
5935 * @date 8 March 2012
5936 * @version 1.0
5937 */
5938void host_int_send_join_leave_info_to_host
Dean Lee72ed4dc2015-06-12 14:11:44 +09005939 (u16 assocId, u8 *stationAddr, bool joining)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005940{
5941}
5942/**
5943 * @brief notifies host with stations found in scan
5944 * @details sends the beacon/probe response from scan
5945 * @param[in,out] handle to the wifi driver,
5946 * @param[in] Sta Address,
5947 * Frame length,
5948 * Rssi of the Station found
5949 * @return Error code indicating success/failure
5950 * @note
5951 * @author zsalah
5952 * @date 8 March 2012
5953 * @version 1.0
5954 */
5955
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005956static void GetPeriodicRSSI(unsigned long arg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005957{
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07005958 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)arg;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02005959
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005960 if (pstrWFIDrv == NULL) {
5961 PRINT_ER("Driver handler is NULL\n");
5962 return;
5963 }
5964
5965 if (pstrWFIDrv->enuHostIFstate == HOST_IF_CONNECTED) {
Leo Kime6e12662015-09-16 18:36:03 +09005966 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09005967 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005968
5969 /* prepare the Get RSSI Message */
Tony Cho143eb952015-09-21 12:16:32 +09005970 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005971
Tony Choa9f812a2015-09-21 12:16:33 +09005972 msg.id = HOST_IF_MSG_GET_RSSI;
Tony Cho143eb952015-09-21 12:16:32 +09005973 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005974
5975 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09005976 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005977 if (s32Error) {
5978 PRINT_ER("Failed to send get host channel param's message queue ");
5979 return;
5980 }
5981 }
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07005982 g_hPeriodicRSSI.data = (unsigned long)pstrWFIDrv;
5983 mod_timer(&g_hPeriodicRSSI, jiffies + msecs_to_jiffies(5000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005984}
5985
5986
5987void host_int_send_network_info_to_host
Chaehyun Limca356ad2015-06-11 14:35:57 +09005988 (u8 *macStartAddress, u16 u16RxFrameLen, s8 s8Rssi)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09005989{
5990}
5991/**
5992 * @brief host_int_init
5993 * @details host interface initialization function
5994 * @param[in,out] handle to the wifi driver,
5995 * @note
5996 * @author zsalah
5997 * @date 8 March 2012
5998 * @version 1.0
5999 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006000static u32 clients_count;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006001
Johnny Kim218dc402015-08-13 13:41:19 +09006002s32 host_int_init(tstrWILC_WFIDrv **phWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006003{
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006004 s32 result = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006005 tstrWILC_WFIDrv *pstrWFIDrv;
Johnny Kimd42ab082015-08-20 16:32:52 +09006006 int err;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006007
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006008 PRINT_D(HOSTINF_DBG, "Initializing host interface for client %d\n", clients_count + 1);
6009
Dean Lee72ed4dc2015-06-12 14:11:44 +09006010 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006011
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006012 sema_init(&hWaitResponse, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006013
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006014 /*Allocate host interface private structure*/
Chaehyun Lim27a82eb2015-09-22 18:34:55 +09006015 pstrWFIDrv = kzalloc(sizeof(tstrWILC_WFIDrv), GFP_KERNEL);
Chaehyun Lim16042962015-09-22 18:34:56 +09006016 if (!pstrWFIDrv) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006017 result = -ENOMEM;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006018 goto _fail_timer_2;
6019 }
Johnny Kim218dc402015-08-13 13:41:19 +09006020 *phWFIDrv = pstrWFIDrv;
Johnny Kimd42ab082015-08-20 16:32:52 +09006021 err = add_handler_in_list(pstrWFIDrv);
6022 if (err) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006023 result = -EFAULT;
Johnny Kimd42ab082015-08-20 16:32:52 +09006024 goto _fail_timer_2;
6025 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006026
Dean Lee72ed4dc2015-06-12 14:11:44 +09006027 g_obtainingIP = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006028
Johnny Kim8a143302015-06-10 17:06:46 +09006029 PRINT_D(HOSTINF_DBG, "Global handle pointer value=%p\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006030 if (clients_count == 0) {
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006031 sema_init(&hSemHostIFthrdEnd, 0);
6032 sema_init(&hSemDeinitDrvHandle, 0);
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006033 sema_init(&hSemHostIntDeinit, 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006034 }
6035
Chaehyun Limdddaba12015-09-22 18:35:01 +09006036 sema_init(&pstrWFIDrv->hSemTestKeyBlock, 0);
6037 sema_init(&pstrWFIDrv->hSemTestDisconnectBlock, 0);
6038 sema_init(&pstrWFIDrv->hSemGetRSSI, 0);
6039 sema_init(&pstrWFIDrv->hSemGetLINKSPEED, 0);
6040 sema_init(&pstrWFIDrv->hSemGetCHNL, 0);
6041 sema_init(&pstrWFIDrv->hSemInactiveTime, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006042
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006043 PRINT_D(HOSTINF_DBG, "INIT: CLIENT COUNT %d\n", clients_count);
6044
6045 if (clients_count == 0) {
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006046 result = wilc_mq_create(&gMsgQHostIF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006047
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006048 if (result < 0) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006049 PRINT_ER("Failed to creat MQ\n");
6050 goto _fail_;
6051 }
Arnd Bergmann1999bd52015-05-29 22:52:14 +02006052 HostIFthreadHandler = kthread_run(hostIFthread, NULL, "WILC_kthread");
6053 if (IS_ERR(HostIFthreadHandler)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006054 PRINT_ER("Failed to creat Thread\n");
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006055 result = -EFAULT;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006056 goto _fail_mq_;
6057 }
Greg Kroah-Hartman507d7fc2015-08-17 12:59:42 -07006058 setup_timer(&g_hPeriodicRSSI, GetPeriodicRSSI,
6059 (unsigned long)pstrWFIDrv);
Greg Kroah-Hartman9eb06642015-08-17 11:10:55 -07006060 mod_timer(&g_hPeriodicRSSI, jiffies + msecs_to_jiffies(5000));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006061 }
6062
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07006063 setup_timer(&pstrWFIDrv->hScanTimer, TimerCB_Scan, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006064
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07006065 setup_timer(&pstrWFIDrv->hConnectTimer, TimerCB_Connect, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006066
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006067 /*Remain on channel timer*/
Greg Kroah-Hartman93dee8e2015-08-14 20:28:32 -07006068 setup_timer(&pstrWFIDrv->hRemainOnChannel, ListenTimerCB, 0);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006069
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006070 sema_init(&(pstrWFIDrv->gtOsCfgValuesSem), 1);
Chaehyun Limdddaba12015-09-22 18:35:01 +09006071 down(&pstrWFIDrv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006072
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006073 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006074
6075 /*Initialize CFG WIDS Defualt Values*/
6076
6077 pstrWFIDrv->strCfgValues.site_survey_enabled = SITE_SURVEY_OFF;
6078 pstrWFIDrv->strCfgValues.scan_source = DEFAULT_SCAN;
6079 pstrWFIDrv->strCfgValues.active_scan_time = ACTIVE_SCAN_TIME;
6080 pstrWFIDrv->strCfgValues.passive_scan_time = PASSIVE_SCAN_TIME;
6081 pstrWFIDrv->strCfgValues.curr_tx_rate = AUTORATE;
6082
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006083 pstrWFIDrv->u64P2p_MgmtTimeout = 0;
6084
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006085 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",
6086
6087 pstrWFIDrv->strCfgValues.site_survey_enabled, pstrWFIDrv->strCfgValues.scan_source,
6088 pstrWFIDrv->strCfgValues.active_scan_time, pstrWFIDrv->strCfgValues.passive_scan_time,
6089 pstrWFIDrv->strCfgValues.curr_tx_rate);
6090
Chaehyun Limdddaba12015-09-22 18:35:01 +09006091 up(&pstrWFIDrv->gtOsCfgValuesSem);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006092
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006093 clients_count++; /* increase number of created entities */
6094
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006095 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006096
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006097_fail_timer_2:
Chaehyun Limdddaba12015-09-22 18:35:01 +09006098 up(&pstrWFIDrv->gtOsCfgValuesSem);
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006099 del_timer_sync(&pstrWFIDrv->hConnectTimer);
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006100 del_timer_sync(&pstrWFIDrv->hScanTimer);
Arnd Bergmann1999bd52015-05-29 22:52:14 +02006101 kthread_stop(HostIFthreadHandler);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006102_fail_mq_:
Chaehyun Lim1b128f62015-08-19 15:59:08 +09006103 wilc_mq_destroy(&gMsgQHostIF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006104_fail_:
Chaehyun Lim5b09bd32015-09-22 18:34:59 +09006105 return result;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006106}
6107/**
6108 * @brief host_int_deinit
6109 * @details host interface initialization function
6110 * @param[in,out] handle to the wifi driver,
6111 * @note
6112 * @author zsalah
6113 * @date 8 March 2012
6114 * @version 1.0
6115 */
6116
Johnny Kim218dc402015-08-13 13:41:19 +09006117s32 host_int_deinit(tstrWILC_WFIDrv *hWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006118{
Leo Kime6e12662015-09-16 18:36:03 +09006119 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006120 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006121 int ret;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006122
6123 /*obtain driver handle*/
6124 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006125
6126 if (pstrWFIDrv == NULL) {
6127 PRINT_ER("pstrWFIDrv = NULL\n");
6128 return 0;
6129 }
6130
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006131 down(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006132
6133 terminated_handle = pstrWFIDrv;
6134 PRINT_D(HOSTINF_DBG, "De-initializing host interface for client %d\n", clients_count);
6135
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006136 /*Destroy all timers before acquiring hSemDeinitDrvHandle*/
6137 /*to guarantee handling all messages befor proceeding*/
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006138 if (del_timer_sync(&pstrWFIDrv->hScanTimer)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006139 PRINT_D(HOSTINF_DBG, ">> Scan timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006140 /* msleep(HOST_IF_SCAN_TIMEOUT+1000); */
6141 }
6142
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006143 if (del_timer_sync(&pstrWFIDrv->hConnectTimer)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006144 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006145 /* msleep(HOST_IF_CONNECT_TIMEOUT+1000); */
6146 }
6147
6148
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006149 if (del_timer_sync(&g_hPeriodicRSSI)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006150 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006151 /* msleep(HOST_IF_CONNECT_TIMEOUT+1000); */
6152 }
6153
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006154 /*Destroy Remain-onchannel Timer*/
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006155 del_timer_sync(&pstrWFIDrv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006156
Johnny Kim218dc402015-08-13 13:41:19 +09006157 host_int_set_wfi_drv_handler(NULL);
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006158 down(&hSemDeinitDrvHandle);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006159
6160
6161 /*Calling the CFG80211 scan done function with the abort flag set to true*/
6162 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006163 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult(SCAN_EVENT_ABORTED, NULL,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006164 pstrWFIDrv->strWILC_UsrScanReq.u32UserScanPvoid, NULL);
6165
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006166 pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006167 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006168
6169 pstrWFIDrv->enuHostIFstate = HOST_IF_IDLE;
6170
Dean Lee72ed4dc2015-06-12 14:11:44 +09006171 gbScanWhileConnected = false;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006172
Tony Cho143eb952015-09-21 12:16:32 +09006173 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006174
6175 if (clients_count == 1) {
Greg Kroah-Hartman4183e972015-08-14 20:11:16 -07006176 if (del_timer_sync(&g_hPeriodicRSSI)) {
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006177 PRINT_D(HOSTINF_DBG, ">> Connect timer is active\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006178 /* msleep(HOST_IF_CONNECT_TIMEOUT+1000); */
6179 }
Tony Choa9f812a2015-09-21 12:16:33 +09006180 msg.id = HOST_IF_MSG_EXIT;
Tony Cho143eb952015-09-21 12:16:32 +09006181 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006182
6183
Tony Cho143eb952015-09-21 12:16:32 +09006184 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kime6e12662015-09-16 18:36:03 +09006185 if (s32Error != 0)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006186 PRINT_ER("Error in sending deinit's message queue message function: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006187
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006188 down(&hSemHostIFthrdEnd);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006189
Chaehyun Lim1b128f62015-08-19 15:59:08 +09006190 wilc_mq_destroy(&gMsgQHostIF);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006191 }
6192
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006193 down(&(pstrWFIDrv->gtOsCfgValuesSem));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006194
6195 /*Setting the gloabl driver handler with NULL*/
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006196 /* gWFiDrvHandle = NULL; */
Johnny Kimd42ab082015-08-20 16:32:52 +09006197 ret = remove_handler_in_list(pstrWFIDrv);
6198 if (ret)
Leo Kime6e12662015-09-16 18:36:03 +09006199 s32Error = -ENOENT;
Johnny Kimd42ab082015-08-20 16:32:52 +09006200
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006201 if (pstrWFIDrv != NULL) {
Chaehyun Lim49188af2015-08-11 10:32:41 +09006202 kfree(pstrWFIDrv);
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006203 /* pstrWFIDrv=NULL; */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006204
6205 }
6206
6207 clients_count--; /* Decrease number of created entities */
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006208 terminated_handle = NULL;
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006209 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006210 return s32Error;
6211}
6212
6213
6214/**
6215 * @brief NetworkInfoReceived
6216 * @details function to to be called when network info packet is received
6217 * @param[in] pu8Buffer the received packet
6218 * @param[in] u32Length length of the received packet
6219 * @return none
6220 * @note
6221 * @author
6222 * @date 1 Mar 2012
6223 * @version 1.0
6224 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006225void NetworkInfoReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006226{
Leo Kime6e12662015-09-16 18:36:03 +09006227 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006228 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006229 int id;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006230 tstrWILC_WFIDrv *pstrWFIDrv = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006231
Johnny Kimd42ab082015-08-20 16:32:52 +09006232 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
6233 pstrWFIDrv = get_handler_from_id(id);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006234
6235
6236
6237
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006238 if (pstrWFIDrv == NULL || pstrWFIDrv == terminated_handle) {
Johnny Kim8a143302015-06-10 17:06:46 +09006239 PRINT_ER("NetworkInfo received but driver not init[%p]\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006240 return;
6241 }
6242
6243 /* prepare the Asynchronous Network Info message */
Tony Cho143eb952015-09-21 12:16:32 +09006244 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006245
Tony Choa9f812a2015-09-21 12:16:33 +09006246 msg.id = HOST_IF_MSG_RCVD_NTWRK_INFO;
Tony Cho143eb952015-09-21 12:16:32 +09006247 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006248
Tony Cho02d19462015-09-30 18:44:22 +09006249 msg.body.net_info.u32Length = u32Length;
6250 msg.body.net_info.pu8Buffer = kmalloc(u32Length, GFP_KERNEL); /* will be deallocated by the receiving thread */
6251 memcpy(msg.body.net_info.pu8Buffer,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006252 pu8Buffer, u32Length);
6253
6254 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09006255 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006256 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006257 PRINT_ER("Error in sending network info message queue message parameters: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006258}
6259
6260/**
6261 * @brief GnrlAsyncInfoReceived
6262 * @details function to be called when general Asynchronous info packet is received
6263 * @param[in] pu8Buffer the received packet
6264 * @param[in] u32Length length of the received packet
6265 * @return none
6266 * @note
6267 * @author
6268 * @date 15 Mar 2012
6269 * @version 1.0
6270 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006271void GnrlAsyncInfoReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006272{
Leo Kime6e12662015-09-16 18:36:03 +09006273 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006274 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006275 int id;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006276 tstrWILC_WFIDrv *pstrWFIDrv = NULL;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006277
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006278 down(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006279
Johnny Kimd42ab082015-08-20 16:32:52 +09006280 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
6281 pstrWFIDrv = get_handler_from_id(id);
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006282 PRINT_D(HOSTINF_DBG, "General asynchronous info packet received\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006283
6284
6285 if (pstrWFIDrv == NULL || pstrWFIDrv == terminated_handle) {
6286 PRINT_D(HOSTINF_DBG, "Wifi driver handler is equal to NULL\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006287 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006288 return;
6289 }
6290
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006291 if (pstrWFIDrv->strWILC_UsrConnReq.pfUserConnectResult == NULL) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006292 /* received mac status is not needed when there is no current Connect Request */
6293 PRINT_ER("Received mac status is not needed when there is no current Connect Reques\n");
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006294 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006295 return;
6296 }
6297
6298 /* prepare the General Asynchronous Info message */
Tony Cho143eb952015-09-21 12:16:32 +09006299 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006300
6301
Tony Choa9f812a2015-09-21 12:16:33 +09006302 msg.id = HOST_IF_MSG_RCVD_GNRL_ASYNC_INFO;
Tony Cho143eb952015-09-21 12:16:32 +09006303 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006304
6305
Tony Cho66add622015-09-30 18:44:23 +09006306 msg.body.async_info.u32Length = u32Length;
6307 msg.body.async_info.pu8Buffer = kmalloc(u32Length, GFP_KERNEL); /* will be deallocated by the receiving thread */
6308 memcpy(msg.body.async_info.pu8Buffer,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006309 pu8Buffer, u32Length);
6310
6311 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09006312 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006313 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006314 PRINT_ER("Error in sending message queue asynchronous message info: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006315
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006316 up(&hSemHostIntDeinit);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006317}
6318
6319/**
6320 * @brief host_int_ScanCompleteReceived
6321 * @details Setting scan complete received notifcation in message queue
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006322 * @param[in] u8* pu8Buffer, u32 u32Length
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006323 * @return Error code.
6324 * @author
6325 * @date
6326 * @version 1.0
6327 */
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006328void host_int_ScanCompleteReceived(u8 *pu8Buffer, u32 u32Length)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006329{
Leo Kime6e12662015-09-16 18:36:03 +09006330 s32 s32Error = 0;
Tony Cho143eb952015-09-21 12:16:32 +09006331 struct host_if_msg msg;
Johnny Kimd42ab082015-08-20 16:32:52 +09006332 int id;
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006333 tstrWILC_WFIDrv *pstrWFIDrv = NULL;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006334
Johnny Kimd42ab082015-08-20 16:32:52 +09006335 id = ((pu8Buffer[u32Length - 4]) | (pu8Buffer[u32Length - 3] << 8) | (pu8Buffer[u32Length - 2] << 16) | (pu8Buffer[u32Length - 1] << 24));
6336 pstrWFIDrv = get_handler_from_id(id);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006337
6338
Johnny Kim8a143302015-06-10 17:06:46 +09006339 PRINT_D(GENERIC_DBG, "Scan notification received %p\n", pstrWFIDrv);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006340
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006341 if (pstrWFIDrv == NULL || pstrWFIDrv == terminated_handle)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006342 return;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006343
6344 /*if there is an ongoing scan request*/
6345 if (pstrWFIDrv->strWILC_UsrScanReq.pfUserScanResult) {
6346 /* prepare theScan Done message */
Tony Cho143eb952015-09-21 12:16:32 +09006347 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006348
Tony Choa9f812a2015-09-21 12:16:33 +09006349 msg.id = HOST_IF_MSG_RCVD_SCAN_COMPLETE;
Tony Cho143eb952015-09-21 12:16:32 +09006350 msg.drvHandler = pstrWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006351
6352
6353 /* will be deallocated by the receiving thread */
6354 /*no need to send message body*/
6355
Tony Cho410c2482015-09-21 12:16:35 +09006356 /*msg.body.strScanComplete.u32Length = u32Length;
6357 * msg.body.strScanComplete.pu8Buffer = (u8*)WILC_MALLOC(u32Length);
6358 * memcpy(msg.body.strScanComplete.pu8Buffer,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006359 * pu8Buffer, u32Length); */
6360
6361 /* send the message */
Tony Cho143eb952015-09-21 12:16:32 +09006362 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006363 if (s32Error)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006364 PRINT_ER("Error in sending message queue scan complete parameters: Error(%d)\n", s32Error);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006365 }
6366
6367
6368 return;
6369
6370}
6371
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006372/**
6373 * @brief host_int_remain_on_channel
6374 * @details
6375 * @param[in] Handle to wifi driver
6376 * Duration to remain on channel
6377 * Channel to remain on
6378 * Pointer to fn to be called on receive frames in listen state
6379 * Pointer to remain-on-channel expired fn
6380 * Priv
6381 * @return Error code.
6382 * @author
6383 * @date
6384 * @version 1.0
6385 */
Leo Kimfdc22a42015-10-05 15:25:49 +09006386s32 host_int_remain_on_channel(tstrWILC_WFIDrv *hWFIDrv, u32 u32SessionID, u32 u32duration, u16 chan, wilc_remain_on_chan_expired RemainOnChanExpired, tWILCpfRemainOnChanReady RemainOnChanReady, void *pvUserArg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006387{
Leo Kime6e12662015-09-16 18:36:03 +09006388 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006389 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006390 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006391
Leo Kim24db7132015-09-16 18:36:01 +09006392 if (pstrWFIDrv == NULL) {
6393 PRINT_ER("driver is null\n");
6394 return -EFAULT;
6395 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006396
6397 /* prepare the remainonchan Message */
Tony Cho143eb952015-09-21 12:16:32 +09006398 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006399
6400 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006401 msg.id = HOST_IF_MSG_REMAIN_ON_CHAN;
Tony Cho070d3652015-09-30 18:55:10 +09006402 msg.body.remain_on_ch.u16Channel = chan;
6403 msg.body.remain_on_ch.pRemainOnChanExpired = RemainOnChanExpired;
6404 msg.body.remain_on_ch.pRemainOnChanReady = RemainOnChanReady;
6405 msg.body.remain_on_ch.pVoid = pvUserArg;
6406 msg.body.remain_on_ch.u32duration = u32duration;
6407 msg.body.remain_on_ch.u32ListenSessionID = u32SessionID;
Tony Cho143eb952015-09-21 12:16:32 +09006408 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006409
Tony Cho143eb952015-09-21 12:16:32 +09006410 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006411 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006412 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006413
6414 return s32Error;
6415}
6416
6417/**
6418 * @brief host_int_ListenStateExpired
6419 * @details
6420 * @param[in] Handle to wifi driver
6421 * Duration to remain on channel
6422 * Channel to remain on
6423 * Pointer to fn to be called on receive frames in listen state
6424 * Pointer to remain-on-channel expired fn
6425 * Priv
6426 * @return Error code.
6427 * @author
6428 * @date
6429 * @version 1.0
6430 */
Johnny Kim218dc402015-08-13 13:41:19 +09006431s32 host_int_ListenStateExpired(tstrWILC_WFIDrv *hWFIDrv, u32 u32SessionID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006432{
Leo Kime6e12662015-09-16 18:36:03 +09006433 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006434 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006435 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006436
Leo Kim24db7132015-09-16 18:36:01 +09006437 if (pstrWFIDrv == NULL) {
6438 PRINT_ER("driver is null\n");
6439 return -EFAULT;
6440 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006441
6442 /*Stopping remain-on-channel timer*/
Greg Kroah-Hartman8972d0f2015-08-14 20:04:13 -07006443 del_timer(&pstrWFIDrv->hRemainOnChannel);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006444
6445 /* prepare the timer fire Message */
Tony Cho143eb952015-09-21 12:16:32 +09006446 memset(&msg, 0, sizeof(struct host_if_msg));
Tony Choa9f812a2015-09-21 12:16:33 +09006447 msg.id = HOST_IF_MSG_LISTEN_TIMER_FIRED;
Tony Cho143eb952015-09-21 12:16:32 +09006448 msg.drvHandler = hWFIDrv;
Tony Cho070d3652015-09-30 18:55:10 +09006449 msg.body.remain_on_ch.u32ListenSessionID = u32SessionID;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006450
Tony Cho143eb952015-09-21 12:16:32 +09006451 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006452 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006453 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006454
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006455 return s32Error;
6456}
6457
6458/**
6459 * @brief host_int_frame_register
6460 * @details
6461 * @param[in] Handle to wifi driver
6462 * @return Error code.
6463 * @author
6464 * @date
6465 * @version 1.0*/
Johnny Kim218dc402015-08-13 13:41:19 +09006466s32 host_int_frame_register(tstrWILC_WFIDrv *hWFIDrv, u16 u16FrameType, bool bReg)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006467{
Leo Kime6e12662015-09-16 18:36:03 +09006468 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006469 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006470 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006471
Leo Kim24db7132015-09-16 18:36:01 +09006472 if (pstrWFIDrv == NULL) {
6473 PRINT_ER("driver is null\n");
6474 return -EFAULT;
6475 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006476
Tony Cho143eb952015-09-21 12:16:32 +09006477 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006478
6479 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006480 msg.id = HOST_IF_MSG_REGISTER_FRAME;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006481 switch (u16FrameType) {
6482 case ACTION:
6483 PRINT_D(HOSTINF_DBG, "ACTION\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09006484 msg.body.reg_frame.u8Regid = ACTION_FRM_IDX;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006485 break;
6486
6487 case PROBE_REQ:
6488 PRINT_D(HOSTINF_DBG, "PROBE REQ\n");
Tony Cho5c4008d2015-10-05 13:50:44 +09006489 msg.body.reg_frame.u8Regid = PROBE_REQ_IDX;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006490 break;
6491
6492 default:
6493 PRINT_D(HOSTINF_DBG, "Not valid frame type\n");
6494 break;
6495 }
Tony Cho5c4008d2015-10-05 13:50:44 +09006496 msg.body.reg_frame.u16FrameType = u16FrameType;
6497 msg.body.reg_frame.bReg = bReg;
Tony Cho143eb952015-09-21 12:16:32 +09006498 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006499
Tony Cho143eb952015-09-21 12:16:32 +09006500 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006501 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006502 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006503
6504 return s32Error;
6505
6506
6507}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006508
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006509/**
6510 * @brief host_int_add_beacon
6511 * @details Setting add beacon params in message queue
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006512 * @param[in] WILC_WFIDrvHandle hWFIDrv, u32 u32Interval,
6513 * u32 u32DTIMPeriod,u32 u32HeadLen, u8* pu8Head,
6514 * u32 u32TailLen, u8* pu8Tail
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006515 * @return Error code.
6516 * @author
6517 * @date
6518 * @version 1.0
6519 */
Johnny Kim218dc402015-08-13 13:41:19 +09006520s32 host_int_add_beacon(tstrWILC_WFIDrv *hWFIDrv, u32 u32Interval,
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006521 u32 u32DTIMPeriod,
6522 u32 u32HeadLen, u8 *pu8Head,
6523 u32 u32TailLen, u8 *pu8Tail)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006524{
Leo Kime6e12662015-09-16 18:36:03 +09006525 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006526 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006527 struct host_if_msg msg;
Tony Choa98491e2015-09-30 18:44:31 +09006528 struct beacon_attr *pstrSetBeaconParam = &msg.body.beacon_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006529
Leo Kim24db7132015-09-16 18:36:01 +09006530 if (pstrWFIDrv == NULL) {
6531 PRINT_ER("driver is null\n");
6532 return -EFAULT;
6533 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006534
Tony Cho143eb952015-09-21 12:16:32 +09006535 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006536
6537 PRINT_D(HOSTINF_DBG, "Setting adding beacon message queue params\n");
6538
6539
6540 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006541 msg.id = HOST_IF_MSG_ADD_BEACON;
Tony Cho143eb952015-09-21 12:16:32 +09006542 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006543 pstrSetBeaconParam->u32Interval = u32Interval;
6544 pstrSetBeaconParam->u32DTIMPeriod = u32DTIMPeriod;
6545 pstrSetBeaconParam->u32HeadLen = u32HeadLen;
Glen Leef3052582015-09-10 12:03:04 +09006546 pstrSetBeaconParam->pu8Head = kmalloc(u32HeadLen, GFP_KERNEL);
Leo Kim24db7132015-09-16 18:36:01 +09006547 if (pstrSetBeaconParam->pu8Head == NULL) {
6548 s32Error = -ENOMEM;
6549 goto ERRORHANDLER;
6550 }
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006551 memcpy(pstrSetBeaconParam->pu8Head, pu8Head, u32HeadLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006552 pstrSetBeaconParam->u32TailLen = u32TailLen;
6553
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006554 if (u32TailLen > 0) {
Glen Leef3052582015-09-10 12:03:04 +09006555 pstrSetBeaconParam->pu8Tail = kmalloc(u32TailLen, GFP_KERNEL);
Leo Kim24db7132015-09-16 18:36:01 +09006556 if (pstrSetBeaconParam->pu8Tail == NULL) {
6557 s32Error = -ENOMEM;
6558 goto ERRORHANDLER;
6559 }
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006560 memcpy(pstrSetBeaconParam->pu8Tail, pu8Tail, u32TailLen);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006561 } else {
6562 pstrSetBeaconParam->pu8Tail = NULL;
6563 }
6564
Tony Cho143eb952015-09-21 12:16:32 +09006565 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006566 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006567 PRINT_ER("wilc mq send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006568
Leo Kim24db7132015-09-16 18:36:01 +09006569ERRORHANDLER:
6570 if (s32Error) {
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006571 if (pstrSetBeaconParam->pu8Head != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09006572 kfree(pstrSetBeaconParam->pu8Head);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006573
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006574 if (pstrSetBeaconParam->pu8Tail != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09006575 kfree(pstrSetBeaconParam->pu8Tail);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006576 }
6577
6578 return s32Error;
6579
6580}
6581
6582
6583/**
6584 * @brief host_int_del_beacon
6585 * @details Setting add beacon params in message queue
6586 * @param[in] WILC_WFIDrvHandle hWFIDrv
6587 * @return Error code.
6588 * @author
6589 * @date
6590 * @version 1.0
6591 */
Johnny Kim218dc402015-08-13 13:41:19 +09006592s32 host_int_del_beacon(tstrWILC_WFIDrv *hWFIDrv)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006593{
Leo Kime6e12662015-09-16 18:36:03 +09006594 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006595 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006596 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006597
Leo Kim24db7132015-09-16 18:36:01 +09006598 if (pstrWFIDrv == NULL) {
6599 PRINT_ER("driver is null\n");
6600 return -EFAULT;
6601 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006602
6603 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006604 msg.id = HOST_IF_MSG_DEL_BEACON;
Tony Cho143eb952015-09-21 12:16:32 +09006605 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006606 PRINT_D(HOSTINF_DBG, "Setting deleting beacon message queue params\n");
6607
Tony Cho143eb952015-09-21 12:16:32 +09006608 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Leo Kim7dc1d0c2015-09-16 18:36:00 +09006609 if (s32Error)
6610 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006611
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006612 return s32Error;
6613}
6614
6615
6616/**
6617 * @brief host_int_add_station
6618 * @details Setting add station params in message queue
Tony Cho6a89ba92015-09-21 12:16:46 +09006619 * @param[in] WILC_WFIDrvHandle hWFIDrv, struct add_sta_param *pstrStaParams
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006620 * @return Error code.
6621 * @author
6622 * @date
6623 * @version 1.0
6624 */
Tony Cho6a89ba92015-09-21 12:16:46 +09006625s32 host_int_add_station(tstrWILC_WFIDrv *hWFIDrv,
6626 struct add_sta_param *pstrStaParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006627{
Leo Kime6e12662015-09-16 18:36:03 +09006628 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006629 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006630 struct host_if_msg msg;
Tony Choca8f47f2015-09-30 18:44:32 +09006631 struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006632
6633
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
Tony Cho143eb952015-09-21 12:16:32 +09006639 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006640
6641 PRINT_D(HOSTINF_DBG, "Setting adding station message queue params\n");
6642
6643
6644 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006645 msg.id = HOST_IF_MSG_ADD_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;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006654
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
6659
Tony Cho143eb952015-09-21 12:16:32 +09006660 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006661 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006662 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006663 return s32Error;
6664}
6665
6666/**
6667 * @brief host_int_del_station
6668 * @details Setting delete station params in message queue
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006669 * @param[in] WILC_WFIDrvHandle hWFIDrv, u8* pu8MacAddr
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006670 * @return Error code.
6671 * @author
6672 * @date
6673 * @version 1.0
6674 */
Johnny Kim218dc402015-08-13 13:41:19 +09006675s32 host_int_del_station(tstrWILC_WFIDrv *hWFIDrv, const u8 *pu8MacAddr)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006676{
Leo Kime6e12662015-09-16 18:36:03 +09006677 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006678 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006679 struct host_if_msg msg;
Tony Cho889c25b2015-09-30 18:44:33 +09006680 struct del_sta *pstrDelStationMsg = &msg.body.del_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006681
Leo Kim24db7132015-09-16 18:36:01 +09006682 if (pstrWFIDrv == NULL) {
6683 PRINT_ER("driver is null\n");
6684 return -EFAULT;
6685 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006686
Tony Cho143eb952015-09-21 12:16:32 +09006687 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006688
6689 PRINT_D(HOSTINF_DBG, "Setting deleting station message queue params\n");
6690
6691
6692
6693 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006694 msg.id = HOST_IF_MSG_DEL_STATION;
Tony Cho143eb952015-09-21 12:16:32 +09006695 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006696
Greg Kroah-Hartmanb1413b62015-06-02 14:11:12 +09006697 if (pu8MacAddr == NULL)
Chaehyun Lim2cc46832015-08-07 09:02:01 +09006698 memset(pstrDelStationMsg->au8MacAddr, 255, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006699 else
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006700 memcpy(pstrDelStationMsg->au8MacAddr, pu8MacAddr, ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006701
Tony Cho143eb952015-09-21 12:16:32 +09006702 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006703 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006704 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006705 return s32Error;
6706}
6707/**
6708 * @brief host_int_del_allstation
6709 * @details Setting del station params in message queue
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006710 * @param[in] WILC_WFIDrvHandle hWFIDrv, u8 pu8MacAddr[][ETH_ALEN]s
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006711 * @return Error code.
6712 * @author
6713 * @date
6714 * @version 1.0
6715 */
Johnny Kim218dc402015-08-13 13:41:19 +09006716s32 host_int_del_allstation(tstrWILC_WFIDrv *hWFIDrv, u8 pu8MacAddr[][ETH_ALEN])
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006717{
Leo Kime6e12662015-09-16 18:36:03 +09006718 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006719 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006720 struct host_if_msg msg;
Tony Chob0c1e802015-10-05 13:50:46 +09006721 struct del_all_sta *pstrDelAllStationMsg = &msg.body.del_all_sta_info;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006722 u8 au8Zero_Buff[ETH_ALEN] = {0};
Chaehyun Lim4e4467f2015-06-11 14:35:55 +09006723 u32 i;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006724 u8 u8AssocNumb = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006725
6726
Leo Kim24db7132015-09-16 18:36:01 +09006727 if (pstrWFIDrv == NULL) {
6728 PRINT_ER("driver is null\n");
6729 return -EFAULT;
6730 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006731
Tony Cho143eb952015-09-21 12:16:32 +09006732 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006733
6734 PRINT_D(HOSTINF_DBG, "Setting deauthenticating station message queue params\n");
6735
6736 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006737 msg.id = HOST_IF_MSG_DEL_ALL_STA;
Tony Cho143eb952015-09-21 12:16:32 +09006738 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006739
6740 /* Handling situation of deauthenticing all associated stations*/
6741 for (i = 0; i < MAX_NUM_STA; i++) {
6742 if (memcmp(pu8MacAddr[i], au8Zero_Buff, ETH_ALEN)) {
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006743 memcpy(pstrDelAllStationMsg->au8Sta_DelAllSta[i], pu8MacAddr[i], ETH_ALEN);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006744 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],
6745 pstrDelAllStationMsg->au8Sta_DelAllSta[i][5]);
6746 u8AssocNumb++;
6747 }
6748 }
6749 if (!u8AssocNumb) {
6750 PRINT_D(CFG80211_DBG, "NO ASSOCIATED STAS\n");
6751 return s32Error;
6752 }
6753
6754 pstrDelAllStationMsg->u8Num_AssocSta = u8AssocNumb;
Tony Cho143eb952015-09-21 12:16:32 +09006755 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006756
6757
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006758 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006759 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006760
Arnd Bergmann83383ea2015-06-01 21:06:43 +02006761 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006762
6763 return s32Error;
6764
6765}
6766
6767/**
6768 * @brief host_int_edit_station
6769 * @details Setting edit station params in message queue
Tony Cho6a89ba92015-09-21 12:16:46 +09006770 * @param[in] WILC_WFIDrvHandle hWFIDrv, struct add_sta_param *pstrStaParams
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006771 * @return Error code.
6772 * @author
6773 * @date
6774 * @version 1.0
6775 */
Tony Cho6a89ba92015-09-21 12:16:46 +09006776s32 host_int_edit_station(tstrWILC_WFIDrv *hWFIDrv,
6777 struct add_sta_param *pstrStaParams)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006778{
Leo Kime6e12662015-09-16 18:36:03 +09006779 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006780 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006781 struct host_if_msg msg;
Tony Choca8f47f2015-09-30 18:44:32 +09006782 struct add_sta_param *pstrAddStationMsg = &msg.body.add_sta_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006783
Leo Kim24db7132015-09-16 18:36:01 +09006784 if (pstrWFIDrv == NULL) {
6785 PRINT_ER("driver is null\n");
6786 return -EFAULT;
6787 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006788
6789 PRINT_D(HOSTINF_DBG, "Setting editing station message queue params\n");
6790
Tony Cho143eb952015-09-21 12:16:32 +09006791 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006792
6793
6794 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006795 msg.id = HOST_IF_MSG_EDIT_STATION;
Tony Cho143eb952015-09-21 12:16:32 +09006796 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006797
Tony Cho6a89ba92015-09-21 12:16:46 +09006798 memcpy(pstrAddStationMsg, pstrStaParams, sizeof(struct add_sta_param));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006799 if (pstrAddStationMsg->u8NumRates > 0) {
Glen Leef3052582015-09-10 12:03:04 +09006800 u8 *rates = kmalloc(pstrAddStationMsg->u8NumRates, GFP_KERNEL);
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006801
Leo Kim7ae43362015-09-16 18:35:59 +09006802 if (!rates)
6803 return -ENOMEM;
6804
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006805 memcpy(rates, pstrStaParams->pu8Rates, pstrAddStationMsg->u8NumRates);
Arnd Bergmann057d1e92015-06-01 21:06:44 +02006806 pstrAddStationMsg->pu8Rates = rates;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006807 }
6808
Tony Cho143eb952015-09-21 12:16:32 +09006809 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006810 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006811 PRINT_ER("wilc_mq_send fail\n");
6812
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006813 return s32Error;
6814}
Glen Lee108b3432015-09-16 18:53:20 +09006815
Johnny Kim218dc402015-08-13 13:41:19 +09006816s32 host_int_set_power_mgmt(tstrWILC_WFIDrv *hWFIDrv, bool bIsEnabled, u32 u32Timeout)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006817{
Leo Kime6e12662015-09-16 18:36:03 +09006818 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006819 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006820 struct host_if_msg msg;
Tony Cho49e1f812015-09-30 18:44:36 +09006821 struct power_mgmt_param *pstrPowerMgmtParam = &msg.body.pwr_mgmt_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006822
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006823 PRINT_INFO(HOSTINF_DBG, "\n\n>> Setting PS to %d <<\n\n", bIsEnabled);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006824
Leo Kim24db7132015-09-16 18:36:01 +09006825 if (pstrWFIDrv == NULL) {
6826 PRINT_ER("driver is null\n");
6827 return -EFAULT;
6828 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006829
6830 PRINT_D(HOSTINF_DBG, "Setting Power management message queue params\n");
6831
Tony Cho143eb952015-09-21 12:16:32 +09006832 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006833
6834
6835 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006836 msg.id = HOST_IF_MSG_POWER_MGMT;
Tony Cho143eb952015-09-21 12:16:32 +09006837 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006838
6839 pstrPowerMgmtParam->bIsEnabled = bIsEnabled;
6840 pstrPowerMgmtParam->u32Timeout = u32Timeout;
6841
6842
Tony Cho143eb952015-09-21 12:16:32 +09006843 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006844 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006845 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006846 return s32Error;
6847}
6848
Johnny Kim218dc402015-08-13 13:41:19 +09006849s32 host_int_setup_multicast_filter(tstrWILC_WFIDrv *hWFIDrv, bool bIsEnabled, u32 u32count)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006850{
Leo Kime6e12662015-09-16 18:36:03 +09006851 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006852
6853 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09006854 struct host_if_msg msg;
Tony Choa079cf4d2015-09-30 18:55:05 +09006855 struct set_multicast *pstrMulticastFilterParam = &msg.body.multicast_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006856
6857
Leo Kim24db7132015-09-16 18:36:01 +09006858 if (pstrWFIDrv == NULL) {
6859 PRINT_ER("driver is null\n");
6860 return -EFAULT;
6861 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006862
6863 PRINT_D(HOSTINF_DBG, "Setting Multicast Filter params\n");
6864
Tony Cho143eb952015-09-21 12:16:32 +09006865 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006866
6867
6868 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09006869 msg.id = HOST_IF_MSG_SET_MULTICAST_FILTER;
Tony Cho143eb952015-09-21 12:16:32 +09006870 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006871
6872 pstrMulticastFilterParam->bIsEnabled = bIsEnabled;
6873 pstrMulticastFilterParam->u32count = u32count;
6874
Tony Cho143eb952015-09-21 12:16:32 +09006875 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02006876 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09006877 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006878 return s32Error;
6879}
6880
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006881/**
6882 * @brief host_int_ParseJoinBssParam
6883 * @details Parse Needed Join Parameters and save it in a new JoinBssParam entry
6884 * @param[in] tstrNetworkInfo* ptstrNetworkInfo
6885 * @return
6886 * @author zsalah
6887 * @date
6888 * @version 1.0**/
6889static void *host_int_ParseJoinBssParam(tstrNetworkInfo *ptstrNetworkInfo)
6890{
6891 tstrJoinBssParam *pNewJoinBssParam = NULL;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006892 u8 *pu8IEs;
Chaehyun Limd85f5322015-06-11 14:35:54 +09006893 u16 u16IEsLen;
6894 u16 index = 0;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006895 u8 suppRatesNo = 0;
6896 u8 extSuppRatesNo;
Chaehyun Limd85f5322015-06-11 14:35:54 +09006897 u16 jumpOffset;
Greg Kroah-Hartman63d03e42015-06-02 14:16:04 +09006898 u8 pcipherCount;
6899 u8 authCount;
6900 u8 pcipherTotalCount = 0;
6901 u8 authTotalCount = 0;
6902 u8 i, j;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006903
6904 pu8IEs = ptstrNetworkInfo->pu8IEs;
6905 u16IEsLen = ptstrNetworkInfo->u16IEsLen;
6906
Glen Leef3052582015-09-10 12:03:04 +09006907 pNewJoinBssParam = kmalloc(sizeof(tstrJoinBssParam), GFP_KERNEL);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006908 if (pNewJoinBssParam != NULL) {
Chaehyun Lim2cc46832015-08-07 09:02:01 +09006909 memset(pNewJoinBssParam, 0, sizeof(tstrJoinBssParam));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006910 pNewJoinBssParam->dtim_period = ptstrNetworkInfo->u8DtimPeriod;
6911 pNewJoinBssParam->beacon_period = ptstrNetworkInfo->u16BeaconPeriod;
6912 pNewJoinBssParam->cap_info = ptstrNetworkInfo->u16CapInfo;
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006913 memcpy(pNewJoinBssParam->au8bssid, ptstrNetworkInfo->au8bssid, 6);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006914 /*for(i=0; i<6;i++)
6915 * PRINT_D(HOSTINF_DBG,"%c",pNewJoinBssParam->au8bssid[i]);*/
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09006916 memcpy((u8 *)pNewJoinBssParam->ssid, ptstrNetworkInfo->au8ssid, ptstrNetworkInfo->u8SsidLen + 1);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006917 pNewJoinBssParam->ssidLen = ptstrNetworkInfo->u8SsidLen;
Chaehyun Lim2cc46832015-08-07 09:02:01 +09006918 memset(pNewJoinBssParam->rsn_pcip_policy, 0xFF, 3);
6919 memset(pNewJoinBssParam->rsn_auth_policy, 0xFF, 3);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006920 /*for(i=0; i<pNewJoinBssParam->ssidLen;i++)
6921 * PRINT_D(HOSTINF_DBG,"%c",pNewJoinBssParam->ssid[i]);*/
6922
6923 /* parse supported rates: */
6924 while (index < u16IEsLen) {
6925 /* supportedRates IE */
6926 if (pu8IEs[index] == SUPP_RATES_IE) {
6927 /* PRINT_D(HOSTINF_DBG, "Supported Rates\n"); */
6928 suppRatesNo = pu8IEs[index + 1];
6929 pNewJoinBssParam->supp_rates[0] = suppRatesNo;
6930 index += 2; /* skipping ID and length bytes; */
6931
6932 for (i = 0; i < suppRatesNo; i++) {
6933 pNewJoinBssParam->supp_rates[i + 1] = pu8IEs[index + i];
6934 /* PRINT_D(HOSTINF_DBG,"%0x ",pNewJoinBssParam->supp_rates[i+1]); */
6935 }
6936 index += suppRatesNo;
6937 continue;
6938 }
6939 /* Ext SupportedRates IE */
6940 else if (pu8IEs[index] == EXT_SUPP_RATES_IE) {
6941 /* PRINT_D(HOSTINF_DBG, "Extended Supported Rates\n"); */
6942 /* checking if no of ext. supp and supp rates < max limit */
6943 extSuppRatesNo = pu8IEs[index + 1];
6944 if (extSuppRatesNo > (MAX_RATES_SUPPORTED - suppRatesNo))
6945 pNewJoinBssParam->supp_rates[0] = MAX_RATES_SUPPORTED;
6946 else
6947 pNewJoinBssParam->supp_rates[0] += extSuppRatesNo;
6948 index += 2;
6949 /* pNewJoinBssParam.supp_rates[0] contains now old number not the ext. no */
6950 for (i = 0; i < (pNewJoinBssParam->supp_rates[0] - suppRatesNo); i++) {
6951 pNewJoinBssParam->supp_rates[suppRatesNo + i + 1] = pu8IEs[index + i];
6952 /* PRINT_D(HOSTINF_DBG,"%0x ",pNewJoinBssParam->supp_rates[suppRatesNo+i+1]); */
6953 }
6954 index += extSuppRatesNo;
6955 continue;
6956 }
6957 /* HT Cap. IE */
6958 else if (pu8IEs[index] == HT_CAPABILITY_IE) {
6959 /* if IE found set the flag */
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09006960 pNewJoinBssParam->ht_capable = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006961 index += pu8IEs[index + 1] + 2; /* ID,Length bytes and IE body */
6962 /* PRINT_D(HOSTINF_DBG,"HT_CAPABALE\n"); */
6963 continue;
6964 } else if ((pu8IEs[index] == WMM_IE) && /* WMM Element ID */
6965 (pu8IEs[index + 2] == 0x00) && (pu8IEs[index + 3] == 0x50) &&
6966 (pu8IEs[index + 4] == 0xF2) && /* OUI */
6967 (pu8IEs[index + 5] == 0x02) && /* OUI Type */
6968 ((pu8IEs[index + 6] == 0x00) || (pu8IEs[index + 6] == 0x01)) && /* OUI Sub Type */
6969 (pu8IEs[index + 7] == 0x01)) {
6970 /* Presence of WMM Info/Param element indicates WMM capability */
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09006971 pNewJoinBssParam->wmm_cap = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006972
6973 /* Check if Bit 7 is set indicating U-APSD capability */
Anish Bhattffda2032015-09-29 12:15:49 -07006974 if (pu8IEs[index + 8] & BIT(7))
Chaehyun Lim0be1eb72015-06-13 15:41:18 +09006975 pNewJoinBssParam->uapsd_cap = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006976 index += pu8IEs[index + 1] + 2;
6977 continue;
6978 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006979 else if ((pu8IEs[index] == P2P_IE) && /* P2P Element ID */
6980 (pu8IEs[index + 2] == 0x50) && (pu8IEs[index + 3] == 0x6f) &&
6981 (pu8IEs[index + 4] == 0x9a) && /* OUI */
6982 (pu8IEs[index + 5] == 0x09) && (pu8IEs[index + 6] == 0x0c)) { /* OUI Type */
Chaehyun Limd85f5322015-06-11 14:35:54 +09006983 u16 u16P2P_count;
Luis de Bethencourt78c87592015-06-26 16:45:14 +02006984
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006985 pNewJoinBssParam->tsf = ptstrNetworkInfo->u32Tsf;
6986 pNewJoinBssParam->u8NoaEnbaled = 1;
6987 pNewJoinBssParam->u8Index = pu8IEs[index + 9];
6988
6989 /* Check if Bit 7 is set indicating Opss capability */
Anish Bhattffda2032015-09-29 12:15:49 -07006990 if (pu8IEs[index + 10] & BIT(7)) {
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006991 pNewJoinBssParam->u8OppEnable = 1;
6992 pNewJoinBssParam->u8CtWindow = pu8IEs[index + 10];
6993 } else
6994 pNewJoinBssParam->u8OppEnable = 0;
6995 /* HOSTINF_DBG */
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006996 PRINT_D(GENERIC_DBG, "P2P Dump\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006997 for (i = 0; i < pu8IEs[index + 7]; i++)
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02006998 PRINT_D(GENERIC_DBG, " %x\n", pu8IEs[index + 9 + i]);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09006999
7000 pNewJoinBssParam->u8Count = pu8IEs[index + 11];
7001 u16P2P_count = index + 12;
7002
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09007003 memcpy(pNewJoinBssParam->au8Duration, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007004 u16P2P_count += 4;
7005
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09007006 memcpy(pNewJoinBssParam->au8Interval, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007007 u16P2P_count += 4;
7008
Chaehyun Limd00d2ba2015-08-10 11:33:19 +09007009 memcpy(pNewJoinBssParam->au8StartTime, pu8IEs + u16P2P_count, 4);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007010
7011 index += pu8IEs[index + 1] + 2;
7012 continue;
7013
7014 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007015 else if ((pu8IEs[index] == RSN_IE) ||
7016 ((pu8IEs[index] == WPA_IE) && (pu8IEs[index + 2] == 0x00) &&
7017 (pu8IEs[index + 3] == 0x50) && (pu8IEs[index + 4] == 0xF2) &&
7018 (pu8IEs[index + 5] == 0x01))) {
Chaehyun Limd85f5322015-06-11 14:35:54 +09007019 u16 rsnIndex = index;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007020 /*PRINT_D(HOSTINF_DBG,"RSN IE Length:%d\n",pu8IEs[rsnIndex+1]);
7021 * for(i=0; i<pu8IEs[rsnIndex+1]; i++)
7022 * {
7023 * PRINT_D(HOSTINF_DBG,"%0x ",pu8IEs[rsnIndex+2+i]);
7024 * }*/
7025 if (pu8IEs[rsnIndex] == RSN_IE) {
7026 pNewJoinBssParam->mode_802_11i = 2;
7027 /* PRINT_D(HOSTINF_DBG,"\nRSN_IE\n"); */
7028 } else { /* check if rsn was previously parsed */
7029 if (pNewJoinBssParam->mode_802_11i == 0)
7030 pNewJoinBssParam->mode_802_11i = 1;
7031 /* PRINT_D(HOSTINF_DBG,"\nWPA_IE\n"); */
7032 rsnIndex += 4;
7033 }
7034 rsnIndex += 7; /* skipping id, length, version(2B) and first 3 bytes of gcipher */
7035 pNewJoinBssParam->rsn_grp_policy = pu8IEs[rsnIndex];
7036 rsnIndex++;
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02007037 /* PRINT_D(HOSTINF_DBG,"Group Policy: %0x\n",pNewJoinBssParam->rsn_grp_policy); */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007038 /* initialize policies with invalid values */
7039
7040 jumpOffset = pu8IEs[rsnIndex] * 4; /* total no.of bytes of pcipher field (count*4) */
7041
7042 /*parsing pairwise cipher*/
7043
7044 /* saving 3 pcipher max. */
7045 pcipherCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
7046 rsnIndex += 2; /* jump 2 bytes of pcipher count */
7047
Luis de Bethencourt03b2d5e2015-06-26 16:45:58 +02007048 /* PRINT_D(HOSTINF_DBG,"\npcipher:%d\n",pcipherCount); */
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007049 for (i = pcipherTotalCount, j = 0; i < pcipherCount + pcipherTotalCount && i < 3; i++, j++) {
7050 /* each count corresponds to 4 bytes, only last byte is saved */
7051 pNewJoinBssParam->rsn_pcip_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
7052 /* PRINT_D(HOSTINF_DBG,"PAIR policy = [%0x,%0x]\n",pNewJoinBssParam->rsn_pcip_policy[i],i); */
7053 }
7054 pcipherTotalCount += pcipherCount;
7055 rsnIndex += jumpOffset;
7056
7057 jumpOffset = pu8IEs[rsnIndex] * 4;
7058
7059 /*parsing AKM suite (auth_policy)*/
7060 /* saving 3 auth policies max. */
7061 authCount = (pu8IEs[rsnIndex] > 3) ? 3 : pu8IEs[rsnIndex];
7062 rsnIndex += 2; /* jump 2 bytes of pcipher count */
7063
7064 for (i = authTotalCount, j = 0; i < authTotalCount + authCount; i++, j++) {
7065 /* each count corresponds to 4 bytes, only last byte is saved */
7066 pNewJoinBssParam->rsn_auth_policy[i] = pu8IEs[rsnIndex + ((j + 1) * 4) - 1];
7067 }
7068 authTotalCount += authCount;
7069 rsnIndex += jumpOffset;
7070 /*pasring rsn cap. only if rsn IE*/
7071 if (pu8IEs[index] == RSN_IE) {
7072 pNewJoinBssParam->rsn_cap[0] = pu8IEs[rsnIndex];
7073 pNewJoinBssParam->rsn_cap[1] = pu8IEs[rsnIndex + 1];
7074 rsnIndex += 2;
7075 }
Abdul Hussainf717c0eb2015-06-16 09:49:49 +00007076 pNewJoinBssParam->rsn_found = true;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007077 index += pu8IEs[index + 1] + 2; /* ID,Length bytes and IE body */
7078 continue;
7079 } else
7080 index += pu8IEs[index + 1] + 2; /* ID,Length bytes and IE body */
7081
7082 }
7083
7084
7085 }
7086
7087 return (void *)pNewJoinBssParam;
7088
7089}
7090
7091void host_int_freeJoinParams(void *pJoinParams)
7092{
7093 if ((tstrJoinBssParam *)pJoinParams != NULL)
Chaehyun Lim49188af2015-08-11 10:32:41 +09007094 kfree((tstrJoinBssParam *)pJoinParams);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007095 else
7096 PRINT_ER("Unable to FREE null pointer\n");
7097}
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007098
7099/**
7100 * @brief host_int_addBASession
7101 * @details Open a block Ack session with the given parameters
7102 * @param[in] tstrNetworkInfo* ptstrNetworkInfo
7103 * @return
7104 * @author anoureldin
7105 * @date
7106 * @version 1.0**/
7107
Johnny Kim2b05df52015-08-13 13:41:21 +09007108static int host_int_addBASession(tstrWILC_WFIDrv *hWFIDrv, char *pBSSID, char TID, short int BufferSize,
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007109 short int SessionTimeout, void *drvHandler)
7110{
Leo Kime6e12662015-09-16 18:36:03 +09007111 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007112 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007113 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09007114 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007115
Leo Kim24db7132015-09-16 18:36:01 +09007116 if (pstrWFIDrv == NULL) {
7117 PRINT_ER("driver is null\n");
7118 return -EFAULT;
7119 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007120
Tony Cho143eb952015-09-21 12:16:32 +09007121 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007122
7123 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007124 msg.id = HOST_IF_MSG_ADD_BA_SESSION;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007125
7126 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
7127 pBASessionInfo->u8Ted = TID;
7128 pBASessionInfo->u16BufferSize = BufferSize;
7129 pBASessionInfo->u16SessionTimeout = SessionTimeout;
Tony Cho143eb952015-09-21 12:16:32 +09007130 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007131
Tony Cho143eb952015-09-21 12:16:32 +09007132 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007133 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007134 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007135
7136 return s32Error;
7137}
7138
7139
Johnny Kim218dc402015-08-13 13:41:19 +09007140s32 host_int_delBASession(tstrWILC_WFIDrv *hWFIDrv, char *pBSSID, char TID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007141{
Leo Kime6e12662015-09-16 18:36:03 +09007142 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007143 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007144 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09007145 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007146
Leo Kim24db7132015-09-16 18:36:01 +09007147 if (pstrWFIDrv == NULL) {
7148 PRINT_ER("driver is null\n");
7149 return -EFAULT;
7150 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007151
Tony Cho143eb952015-09-21 12:16:32 +09007152 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007153
7154 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007155 msg.id = HOST_IF_MSG_DEL_BA_SESSION;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007156
7157 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
7158 pBASessionInfo->u8Ted = TID;
Tony Cho143eb952015-09-21 12:16:32 +09007159 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007160
Tony Cho143eb952015-09-21 12:16:32 +09007161 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007162 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007163 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007164
Arnd Bergmann83383ea2015-06-01 21:06:43 +02007165 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007166
7167 return s32Error;
7168}
7169
Johnny Kim218dc402015-08-13 13:41:19 +09007170s32 host_int_del_All_Rx_BASession(tstrWILC_WFIDrv *hWFIDrv, char *pBSSID, char TID)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007171{
Leo Kime6e12662015-09-16 18:36:03 +09007172 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007173 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007174 struct host_if_msg msg;
Tony Choc833b472015-09-30 18:55:09 +09007175 struct ba_session_info *pBASessionInfo = &msg.body.session_info;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007176
Leo Kim24db7132015-09-16 18:36:01 +09007177 if (pstrWFIDrv == NULL) {
7178 PRINT_ER("driver is null\n");
7179 return -EFAULT;
7180 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007181
Tony Cho143eb952015-09-21 12:16:32 +09007182 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007183
7184 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007185 msg.id = HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007186
7187 memcpy(pBASessionInfo->au8Bssid, pBSSID, ETH_ALEN);
7188 pBASessionInfo->u8Ted = TID;
Tony Cho143eb952015-09-21 12:16:32 +09007189 msg.drvHandler = hWFIDrv;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007190
Tony Cho143eb952015-09-21 12:16:32 +09007191 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007192 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007193 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007194
Arnd Bergmann83383ea2015-06-01 21:06:43 +02007195 down(&hWaitResponse);
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007196
7197 return s32Error;
7198}
7199
7200/**
7201 * @brief host_int_setup_ipaddress
7202 * @details setup IP in firmware
7203 * @param[in] Handle to wifi driver
7204 * @return Error code.
7205 * @author Abdelrahman Sobhy
7206 * @date
7207 * @version 1.0*/
Johnny Kim218dc402015-08-13 13:41:19 +09007208s32 host_int_setup_ipaddress(tstrWILC_WFIDrv *hWFIDrv, u8 *u16ipadd, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007209{
Leo Kime6e12662015-09-16 18:36:03 +09007210 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007211 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007212 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007213
7214 /* TODO: Enable This feature on softap firmware */
7215 return 0;
7216
Leo Kim24db7132015-09-16 18:36:01 +09007217 if (pstrWFIDrv == NULL) {
7218 PRINT_ER("driver is null\n");
7219 return -EFAULT;
7220 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007221
Tony Cho143eb952015-09-21 12:16:32 +09007222 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007223
7224 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007225 msg.id = HOST_IF_MSG_SET_IPADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007226
Tony Chofb2d65e2015-09-30 18:44:39 +09007227 msg.body.ip_info.au8IPAddr = u16ipadd;
Tony Cho143eb952015-09-21 12:16:32 +09007228 msg.drvHandler = hWFIDrv;
Tony Chofb2d65e2015-09-30 18:44:39 +09007229 msg.body.ip_info.idx = idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007230
Tony Cho143eb952015-09-21 12:16:32 +09007231 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007232 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007233 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007234
7235 return s32Error;
7236
7237
7238}
7239
7240/**
7241 * @brief host_int_get_ipaddress
7242 * @details Get IP from firmware
7243 * @param[in] Handle to wifi driver
7244 * @return Error code.
7245 * @author Abdelrahman Sobhy
7246 * @date
7247 * @version 1.0*/
Johnny Kim218dc402015-08-13 13:41:19 +09007248s32 host_int_get_ipaddress(tstrWILC_WFIDrv *hWFIDrv, u8 *u16ipadd, u8 idx)
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007249{
Leo Kime6e12662015-09-16 18:36:03 +09007250 s32 s32Error = 0;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007251 tstrWILC_WFIDrv *pstrWFIDrv = (tstrWILC_WFIDrv *)hWFIDrv;
Tony Cho143eb952015-09-21 12:16:32 +09007252 struct host_if_msg msg;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007253
Leo Kim24db7132015-09-16 18:36:01 +09007254 if (pstrWFIDrv == NULL) {
7255 PRINT_ER("driver is null\n");
7256 return -EFAULT;
7257 }
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007258
Tony Cho143eb952015-09-21 12:16:32 +09007259 memset(&msg, 0, sizeof(struct host_if_msg));
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007260
7261 /* prepare the WiphyParams Message */
Tony Choa9f812a2015-09-21 12:16:33 +09007262 msg.id = HOST_IF_MSG_GET_IPADDRESS;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007263
Tony Chofb2d65e2015-09-30 18:44:39 +09007264 msg.body.ip_info.au8IPAddr = u16ipadd;
Tony Cho143eb952015-09-21 12:16:32 +09007265 msg.drvHandler = hWFIDrv;
Tony Chofb2d65e2015-09-30 18:44:39 +09007266 msg.body.ip_info.idx = idx;
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007267
Tony Cho143eb952015-09-21 12:16:32 +09007268 s32Error = wilc_mq_send(&gMsgQHostIF, &msg, sizeof(struct host_if_msg));
Luis de Bethencourt2b9d5b42015-06-26 16:44:24 +02007269 if (s32Error)
Leo Kim24db7132015-09-16 18:36:01 +09007270 PRINT_ER("wilc_mq_send fail\n");
Johnny Kimc5c77ba2015-05-11 14:30:56 +09007271
7272 return s32Error;
7273
7274
7275}