xref: /nrf52832-nimble/rt-thread/components/drivers/wlan/wlan_dev.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2018-08-03     tyx          the first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rthw.h>
12*10465441SEvalZero #include <rtthread.h>
13*10465441SEvalZero #include <wlan_dev.h>
14*10465441SEvalZero #include <wlan_prot.h>
15*10465441SEvalZero 
16*10465441SEvalZero #define DBG_ENABLE
17*10465441SEvalZero #ifdef RT_WLAN_DEV_DEBUG
18*10465441SEvalZero #define DBG_LEVEL DBG_LOG
19*10465441SEvalZero #else
20*10465441SEvalZero #define DBG_LEVEL DBG_INFO
21*10465441SEvalZero #endif
22*10465441SEvalZero #define DBG_SECTION_NAME  "WLAN.dev"
23*10465441SEvalZero #define DBG_COLOR
24*10465441SEvalZero #include <rtdbg.h>
25*10465441SEvalZero 
26*10465441SEvalZero #ifndef RT_DEVICE
27*10465441SEvalZero #define RT_DEVICE(__device) ((rt_device_t)__device)
28*10465441SEvalZero #endif
29*10465441SEvalZero 
30*10465441SEvalZero #define WLAN_DEV_LOCK(_wlan)      (rt_mutex_take(&(_wlan)->lock, RT_WAITING_FOREVER))
31*10465441SEvalZero #define WLAN_DEV_UNLOCK(_wlan)    (rt_mutex_release(&(_wlan)->lock))
32*10465441SEvalZero 
33*10465441SEvalZero #if RT_WLAN_SSID_MAX_LENGTH < 1
34*10465441SEvalZero #error "SSID length is too short"
35*10465441SEvalZero #endif
36*10465441SEvalZero 
37*10465441SEvalZero #if RT_WLAN_BSSID_MAX_LENGTH < 1
38*10465441SEvalZero #error "BSSID length is too short"
39*10465441SEvalZero #endif
40*10465441SEvalZero 
41*10465441SEvalZero #if RT_WLAN_PASSWORD_MAX_LENGTH < 1
42*10465441SEvalZero #error "password length is too short"
43*10465441SEvalZero #endif
44*10465441SEvalZero 
45*10465441SEvalZero #if RT_WLAN_DEV_EVENT_NUM < 2
46*10465441SEvalZero #error "dev num Too little"
47*10465441SEvalZero #endif
48*10465441SEvalZero 
rt_wlan_dev_init(struct rt_wlan_device * device,rt_wlan_mode_t mode)49*10465441SEvalZero rt_err_t rt_wlan_dev_init(struct rt_wlan_device *device, rt_wlan_mode_t mode)
50*10465441SEvalZero {
51*10465441SEvalZero     rt_err_t result = RT_EOK;
52*10465441SEvalZero 
53*10465441SEvalZero     /* init wlan device */
54*10465441SEvalZero     LOG_D("F:%s L:%d is run device:0x%08x mode:%d", __FUNCTION__, __LINE__, device, mode);
55*10465441SEvalZero     if ((device == RT_NULL) || (mode >= RT_WLAN_MODE_MAX))
56*10465441SEvalZero     {
57*10465441SEvalZero         LOG_E("F:%s L:%d Parameter Wrongful device:0x%08x mode:%d", __FUNCTION__, __LINE__, device, mode);
58*10465441SEvalZero         return -RT_ERROR;
59*10465441SEvalZero     }
60*10465441SEvalZero 
61*10465441SEvalZero     result = rt_device_init(RT_DEVICE(device));
62*10465441SEvalZero     if (result != RT_EOK)
63*10465441SEvalZero     {
64*10465441SEvalZero         LOG_E("L:%d wlan init failed", __LINE__);
65*10465441SEvalZero         return -RT_ERROR;
66*10465441SEvalZero     }
67*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_MODE, (void *)&mode);
68*10465441SEvalZero     if (result != RT_EOK)
69*10465441SEvalZero     {
70*10465441SEvalZero         LOG_E("L:%d wlan config mode failed", __LINE__);
71*10465441SEvalZero         return -RT_ERROR;
72*10465441SEvalZero     }
73*10465441SEvalZero     device->mode = mode;
74*10465441SEvalZero     return result;
75*10465441SEvalZero }
76*10465441SEvalZero 
rt_wlan_dev_connect(struct rt_wlan_device * device,struct rt_wlan_info * info,const char * password,int password_len)77*10465441SEvalZero rt_err_t rt_wlan_dev_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len)
78*10465441SEvalZero {
79*10465441SEvalZero     rt_err_t result = RT_EOK;
80*10465441SEvalZero     struct rt_sta_info sta_info;
81*10465441SEvalZero 
82*10465441SEvalZero     if (device == RT_NULL)
83*10465441SEvalZero     {
84*10465441SEvalZero         return -RT_EIO;
85*10465441SEvalZero     }
86*10465441SEvalZero     if (info == RT_NULL)
87*10465441SEvalZero     {
88*10465441SEvalZero         return -RT_ERROR;
89*10465441SEvalZero     }
90*10465441SEvalZero 
91*10465441SEvalZero     if ((password_len > RT_WLAN_PASSWORD_MAX_LENGTH) ||
92*10465441SEvalZero             (info->ssid.len > RT_WLAN_SSID_MAX_LENGTH))
93*10465441SEvalZero     {
94*10465441SEvalZero         LOG_E("L:%d password or ssid is to long", __LINE__);
95*10465441SEvalZero         return -RT_ERROR;
96*10465441SEvalZero     }
97*10465441SEvalZero     rt_memset(&sta_info, 0, sizeof(struct rt_sta_info));
98*10465441SEvalZero     rt_memcpy(&sta_info.ssid, &info->ssid, sizeof(rt_wlan_ssid_t));
99*10465441SEvalZero     rt_memcpy(sta_info.bssid, info->bssid, RT_WLAN_BSSID_MAX_LENGTH);
100*10465441SEvalZero     if (password != RT_NULL)
101*10465441SEvalZero     {
102*10465441SEvalZero         rt_memcpy(sta_info.key.val, password, password_len);
103*10465441SEvalZero         sta_info.key.len = password_len;
104*10465441SEvalZero     }
105*10465441SEvalZero     sta_info.channel = info->channel;
106*10465441SEvalZero     sta_info.security = info->security;
107*10465441SEvalZero 
108*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_JOIN, &sta_info);
109*10465441SEvalZero     return result;
110*10465441SEvalZero }
111*10465441SEvalZero 
rt_wlan_dev_disconnect(struct rt_wlan_device * device)112*10465441SEvalZero rt_err_t rt_wlan_dev_disconnect(struct rt_wlan_device *device)
113*10465441SEvalZero {
114*10465441SEvalZero     rt_err_t result = RT_EOK;
115*10465441SEvalZero 
116*10465441SEvalZero     if (device == RT_NULL)
117*10465441SEvalZero     {
118*10465441SEvalZero         return -RT_EIO;
119*10465441SEvalZero     }
120*10465441SEvalZero 
121*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_DISCONNECT, RT_NULL);
122*10465441SEvalZero     return result;
123*10465441SEvalZero }
124*10465441SEvalZero 
rt_wlan_dev_ap_start(struct rt_wlan_device * device,struct rt_wlan_info * info,const char * password,int password_len)125*10465441SEvalZero rt_err_t rt_wlan_dev_ap_start(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len)
126*10465441SEvalZero {
127*10465441SEvalZero     rt_err_t result = RT_EOK;
128*10465441SEvalZero     struct rt_ap_info ap_info;
129*10465441SEvalZero 
130*10465441SEvalZero     if (device == RT_NULL)
131*10465441SEvalZero     {
132*10465441SEvalZero         return -RT_EIO;
133*10465441SEvalZero     }
134*10465441SEvalZero     if (info == RT_NULL)
135*10465441SEvalZero     {
136*10465441SEvalZero         return -RT_ERROR;
137*10465441SEvalZero     }
138*10465441SEvalZero 
139*10465441SEvalZero     if ((password_len >= RT_WLAN_PASSWORD_MAX_LENGTH) ||
140*10465441SEvalZero             (info->ssid.len >= RT_WLAN_SSID_MAX_LENGTH))
141*10465441SEvalZero     {
142*10465441SEvalZero         LOG_E("L:%d password or ssid is to long", __LINE__);
143*10465441SEvalZero         return -RT_ERROR;
144*10465441SEvalZero     }
145*10465441SEvalZero 
146*10465441SEvalZero     rt_memset(&ap_info, 0, sizeof(struct rt_ap_info));
147*10465441SEvalZero     rt_memcpy(&ap_info.ssid, &info->ssid, sizeof(rt_wlan_ssid_t));
148*10465441SEvalZero     if (password != RT_NULL)
149*10465441SEvalZero     {
150*10465441SEvalZero         rt_memcpy(ap_info.key.val, password, password_len);
151*10465441SEvalZero     }
152*10465441SEvalZero     ap_info.key.len = password_len;
153*10465441SEvalZero     ap_info.hidden = info->hidden;
154*10465441SEvalZero     ap_info.channel = info->channel;
155*10465441SEvalZero     ap_info.security = info->security;
156*10465441SEvalZero 
157*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SOFTAP, &ap_info);
158*10465441SEvalZero     return result;
159*10465441SEvalZero }
160*10465441SEvalZero 
rt_wlan_dev_ap_stop(struct rt_wlan_device * device)161*10465441SEvalZero rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device)
162*10465441SEvalZero {
163*10465441SEvalZero     rt_err_t result = RT_EOK;
164*10465441SEvalZero 
165*10465441SEvalZero     if (device == RT_NULL)
166*10465441SEvalZero     {
167*10465441SEvalZero         return -RT_EIO;
168*10465441SEvalZero     }
169*10465441SEvalZero 
170*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_AP_STOP, RT_NULL);
171*10465441SEvalZero     return result;
172*10465441SEvalZero }
173*10465441SEvalZero 
rt_wlan_dev_ap_deauth(struct rt_wlan_device * device,rt_uint8_t mac[6])174*10465441SEvalZero rt_err_t rt_wlan_dev_ap_deauth(struct rt_wlan_device *device, rt_uint8_t mac[6])
175*10465441SEvalZero {
176*10465441SEvalZero     rt_err_t result = RT_EOK;
177*10465441SEvalZero 
178*10465441SEvalZero     if (device == RT_NULL)
179*10465441SEvalZero     {
180*10465441SEvalZero         return -RT_EIO;
181*10465441SEvalZero     }
182*10465441SEvalZero 
183*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_AP_DEAUTH, mac);
184*10465441SEvalZero     return result;
185*10465441SEvalZero }
186*10465441SEvalZero 
rt_wlan_dev_get_rssi(struct rt_wlan_device * device)187*10465441SEvalZero int rt_wlan_dev_get_rssi(struct rt_wlan_device *device)
188*10465441SEvalZero {
189*10465441SEvalZero     int rssi = 0;
190*10465441SEvalZero     rt_err_t result = RT_EOK;
191*10465441SEvalZero 
192*10465441SEvalZero     if (device == RT_NULL)
193*10465441SEvalZero     {
194*10465441SEvalZero         rt_set_errno(-RT_EIO);
195*10465441SEvalZero         return 0;
196*10465441SEvalZero     }
197*10465441SEvalZero 
198*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_RSSI, &rssi);
199*10465441SEvalZero     if (result != RT_EOK)
200*10465441SEvalZero     {
201*10465441SEvalZero         rt_set_errno(result);
202*10465441SEvalZero         return 0;
203*10465441SEvalZero     }
204*10465441SEvalZero 
205*10465441SEvalZero     return rssi;
206*10465441SEvalZero }
207*10465441SEvalZero 
rt_wlan_dev_get_mac(struct rt_wlan_device * device,rt_uint8_t mac[6])208*10465441SEvalZero rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
209*10465441SEvalZero {
210*10465441SEvalZero     rt_err_t result = RT_EOK;
211*10465441SEvalZero 
212*10465441SEvalZero     if (device == RT_NULL)
213*10465441SEvalZero     {
214*10465441SEvalZero         return -RT_EIO;
215*10465441SEvalZero     }
216*10465441SEvalZero 
217*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_MAC, &mac[0]);
218*10465441SEvalZero     return result;
219*10465441SEvalZero }
220*10465441SEvalZero 
rt_wlan_dev_set_mac(struct rt_wlan_device * device,rt_uint8_t mac[6])221*10465441SEvalZero rt_err_t rt_wlan_dev_set_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
222*10465441SEvalZero {
223*10465441SEvalZero     rt_err_t result = RT_EOK;
224*10465441SEvalZero 
225*10465441SEvalZero     if (device == RT_NULL)
226*10465441SEvalZero     {
227*10465441SEvalZero         return -RT_EIO;
228*10465441SEvalZero     }
229*10465441SEvalZero 
230*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_MAC, &mac[0]);
231*10465441SEvalZero     return result;
232*10465441SEvalZero }
233*10465441SEvalZero 
rt_wlan_dev_set_powersave(struct rt_wlan_device * device,int level)234*10465441SEvalZero rt_err_t rt_wlan_dev_set_powersave(struct rt_wlan_device *device, int level)
235*10465441SEvalZero {
236*10465441SEvalZero     rt_err_t result = RT_EOK;
237*10465441SEvalZero 
238*10465441SEvalZero     if (device == RT_NULL)
239*10465441SEvalZero     {
240*10465441SEvalZero         return -RT_EIO;
241*10465441SEvalZero     }
242*10465441SEvalZero 
243*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_POWERSAVE, &level);
244*10465441SEvalZero     return result;
245*10465441SEvalZero }
246*10465441SEvalZero 
rt_wlan_dev_get_powersave(struct rt_wlan_device * device)247*10465441SEvalZero int rt_wlan_dev_get_powersave(struct rt_wlan_device *device)
248*10465441SEvalZero {
249*10465441SEvalZero     int level = -1;
250*10465441SEvalZero     rt_err_t result = RT_EOK;
251*10465441SEvalZero 
252*10465441SEvalZero     if (device == RT_NULL)
253*10465441SEvalZero     {
254*10465441SEvalZero         rt_set_errno(-RT_EIO);
255*10465441SEvalZero         return -1;
256*10465441SEvalZero     }
257*10465441SEvalZero 
258*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_POWERSAVE, &level);
259*10465441SEvalZero     if (result != RT_EOK)
260*10465441SEvalZero     {
261*10465441SEvalZero         rt_set_errno(result);
262*10465441SEvalZero     }
263*10465441SEvalZero 
264*10465441SEvalZero     return level;
265*10465441SEvalZero }
266*10465441SEvalZero 
rt_wlan_dev_register_event_handler(struct rt_wlan_device * device,rt_wlan_dev_event_t event,rt_wlan_dev_event_handler handler,void * parameter)267*10465441SEvalZero rt_err_t rt_wlan_dev_register_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler, void *parameter)
268*10465441SEvalZero {
269*10465441SEvalZero     int i = 0;
270*10465441SEvalZero     rt_base_t level;
271*10465441SEvalZero 
272*10465441SEvalZero     if (device == RT_NULL)
273*10465441SEvalZero     {
274*10465441SEvalZero         return -RT_EIO;
275*10465441SEvalZero     }
276*10465441SEvalZero     if (event >= RT_WLAN_DEV_EVT_MAX)
277*10465441SEvalZero     {
278*10465441SEvalZero         return -RT_EINVAL;
279*10465441SEvalZero     }
280*10465441SEvalZero 
281*10465441SEvalZero     level = rt_hw_interrupt_disable();
282*10465441SEvalZero     for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
283*10465441SEvalZero     {
284*10465441SEvalZero         if (device->handler_table[event][i].handler == RT_NULL)
285*10465441SEvalZero         {
286*10465441SEvalZero             device->handler_table[event][i].handler = handler;
287*10465441SEvalZero             device->handler_table[event][i].parameter = parameter;
288*10465441SEvalZero             rt_hw_interrupt_enable(level);
289*10465441SEvalZero             return RT_EOK;
290*10465441SEvalZero         }
291*10465441SEvalZero     }
292*10465441SEvalZero     rt_hw_interrupt_enable(level);
293*10465441SEvalZero 
294*10465441SEvalZero     /* No space found */
295*10465441SEvalZero     return -RT_ERROR;
296*10465441SEvalZero }
297*10465441SEvalZero 
rt_wlan_dev_unregister_event_handler(struct rt_wlan_device * device,rt_wlan_dev_event_t event,rt_wlan_dev_event_handler handler)298*10465441SEvalZero rt_err_t rt_wlan_dev_unregister_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler)
299*10465441SEvalZero {
300*10465441SEvalZero     int i = 0;
301*10465441SEvalZero     rt_base_t level;
302*10465441SEvalZero 
303*10465441SEvalZero     if (device == RT_NULL)
304*10465441SEvalZero     {
305*10465441SEvalZero         return -RT_EIO;
306*10465441SEvalZero     }
307*10465441SEvalZero     if (event >= RT_WLAN_DEV_EVT_MAX)
308*10465441SEvalZero     {
309*10465441SEvalZero         return -RT_EINVAL;
310*10465441SEvalZero     }
311*10465441SEvalZero 
312*10465441SEvalZero     level = rt_hw_interrupt_disable();
313*10465441SEvalZero     for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
314*10465441SEvalZero     {
315*10465441SEvalZero         if (device->handler_table[event][i].handler == handler)
316*10465441SEvalZero         {
317*10465441SEvalZero             rt_memset(&device->handler_table[event][i], 0, sizeof(struct rt_wlan_dev_event_desc));
318*10465441SEvalZero             rt_hw_interrupt_enable(level);
319*10465441SEvalZero             return RT_EOK;
320*10465441SEvalZero         }
321*10465441SEvalZero     }
322*10465441SEvalZero     rt_hw_interrupt_enable(level);
323*10465441SEvalZero     /* not find iteam */
324*10465441SEvalZero     return -RT_ERROR;
325*10465441SEvalZero }
326*10465441SEvalZero 
rt_wlan_dev_indicate_event_handle(struct rt_wlan_device * device,rt_wlan_dev_event_t event,struct rt_wlan_buff * buff)327*10465441SEvalZero void rt_wlan_dev_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff)
328*10465441SEvalZero {
329*10465441SEvalZero     void *parameter[RT_WLAN_DEV_EVENT_NUM];
330*10465441SEvalZero     rt_wlan_dev_event_handler handler[RT_WLAN_DEV_EVENT_NUM];
331*10465441SEvalZero     int i;
332*10465441SEvalZero     rt_base_t level;
333*10465441SEvalZero 
334*10465441SEvalZero     if (device == RT_NULL)
335*10465441SEvalZero     {
336*10465441SEvalZero         return;
337*10465441SEvalZero     }
338*10465441SEvalZero     if (event >= RT_WLAN_DEV_EVT_MAX)
339*10465441SEvalZero     {
340*10465441SEvalZero         return;
341*10465441SEvalZero     }
342*10465441SEvalZero 
343*10465441SEvalZero     /* get callback handle */
344*10465441SEvalZero     level = rt_hw_interrupt_disable();
345*10465441SEvalZero     for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
346*10465441SEvalZero     {
347*10465441SEvalZero         handler[i] = device->handler_table[event][i].handler;
348*10465441SEvalZero         parameter[i] = device->handler_table[event][i].parameter;
349*10465441SEvalZero     }
350*10465441SEvalZero     rt_hw_interrupt_enable(level);
351*10465441SEvalZero 
352*10465441SEvalZero     /* run callback */
353*10465441SEvalZero     for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
354*10465441SEvalZero     {
355*10465441SEvalZero         if (handler[i] != RT_NULL)
356*10465441SEvalZero         {
357*10465441SEvalZero             handler[i](device, event, buff, parameter[i]);
358*10465441SEvalZero         }
359*10465441SEvalZero     }
360*10465441SEvalZero }
361*10465441SEvalZero 
rt_wlan_dev_enter_promisc(struct rt_wlan_device * device)362*10465441SEvalZero rt_err_t rt_wlan_dev_enter_promisc(struct rt_wlan_device *device)
363*10465441SEvalZero {
364*10465441SEvalZero     rt_err_t result = RT_EOK;
365*10465441SEvalZero     int enable = 1;
366*10465441SEvalZero 
367*10465441SEvalZero     if (device == RT_NULL)
368*10465441SEvalZero     {
369*10465441SEvalZero         return -RT_EIO;
370*10465441SEvalZero     }
371*10465441SEvalZero 
372*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_PROMISC, &enable);
373*10465441SEvalZero     return result;
374*10465441SEvalZero }
375*10465441SEvalZero 
rt_wlan_dev_exit_promisc(struct rt_wlan_device * device)376*10465441SEvalZero rt_err_t rt_wlan_dev_exit_promisc(struct rt_wlan_device *device)
377*10465441SEvalZero {
378*10465441SEvalZero     rt_err_t result = RT_EOK;
379*10465441SEvalZero     int enable = 0;
380*10465441SEvalZero 
381*10465441SEvalZero     if (device == RT_NULL)
382*10465441SEvalZero     {
383*10465441SEvalZero         return -RT_EIO;
384*10465441SEvalZero     }
385*10465441SEvalZero 
386*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_PROMISC, &enable);
387*10465441SEvalZero     return result;
388*10465441SEvalZero }
389*10465441SEvalZero 
rt_wlan_dev_set_promisc_callback(struct rt_wlan_device * device,rt_wlan_pormisc_callback_t callback)390*10465441SEvalZero rt_err_t rt_wlan_dev_set_promisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback)
391*10465441SEvalZero {
392*10465441SEvalZero     if (device == RT_NULL)
393*10465441SEvalZero     {
394*10465441SEvalZero         return -RT_EIO;
395*10465441SEvalZero     }
396*10465441SEvalZero     device->pormisc_callback = callback;
397*10465441SEvalZero 
398*10465441SEvalZero     return RT_EOK;
399*10465441SEvalZero }
400*10465441SEvalZero 
rt_wlan_dev_promisc_handler(struct rt_wlan_device * device,void * data,int len)401*10465441SEvalZero void rt_wlan_dev_promisc_handler(struct rt_wlan_device *device, void *data, int len)
402*10465441SEvalZero {
403*10465441SEvalZero     rt_wlan_pormisc_callback_t callback;
404*10465441SEvalZero 
405*10465441SEvalZero     if (device == RT_NULL)
406*10465441SEvalZero     {
407*10465441SEvalZero         return;
408*10465441SEvalZero     }
409*10465441SEvalZero 
410*10465441SEvalZero     callback = device->pormisc_callback;
411*10465441SEvalZero 
412*10465441SEvalZero     if (callback != RT_NULL)
413*10465441SEvalZero     {
414*10465441SEvalZero         callback(device, data, len);
415*10465441SEvalZero     }
416*10465441SEvalZero }
417*10465441SEvalZero 
rt_wlan_dev_cfg_filter(struct rt_wlan_device * device,struct rt_wlan_filter * filter)418*10465441SEvalZero rt_err_t rt_wlan_dev_cfg_filter(struct rt_wlan_device *device, struct rt_wlan_filter *filter)
419*10465441SEvalZero {
420*10465441SEvalZero     rt_err_t result = RT_EOK;
421*10465441SEvalZero 
422*10465441SEvalZero     if (device == RT_NULL)
423*10465441SEvalZero     {
424*10465441SEvalZero         return -RT_EIO;
425*10465441SEvalZero     }
426*10465441SEvalZero     if (filter == RT_NULL)
427*10465441SEvalZero     {
428*10465441SEvalZero         return -RT_ERROR;
429*10465441SEvalZero     }
430*10465441SEvalZero 
431*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_FILTER, filter);
432*10465441SEvalZero     return result;
433*10465441SEvalZero }
434*10465441SEvalZero 
rt_wlan_dev_set_channel(struct rt_wlan_device * device,int channel)435*10465441SEvalZero rt_err_t rt_wlan_dev_set_channel(struct rt_wlan_device *device, int channel)
436*10465441SEvalZero {
437*10465441SEvalZero     rt_err_t result = RT_EOK;
438*10465441SEvalZero 
439*10465441SEvalZero     if (device == RT_NULL)
440*10465441SEvalZero     {
441*10465441SEvalZero         return -RT_EIO;
442*10465441SEvalZero     }
443*10465441SEvalZero     if (channel < 0)
444*10465441SEvalZero     {
445*10465441SEvalZero         return -RT_ERROR;
446*10465441SEvalZero     }
447*10465441SEvalZero 
448*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_CHANNEL, &channel);
449*10465441SEvalZero     return result;
450*10465441SEvalZero }
451*10465441SEvalZero 
rt_wlan_dev_get_channel(struct rt_wlan_device * device)452*10465441SEvalZero int rt_wlan_dev_get_channel(struct rt_wlan_device *device)
453*10465441SEvalZero {
454*10465441SEvalZero     rt_err_t result = RT_EOK;
455*10465441SEvalZero     int channel = -1;
456*10465441SEvalZero 
457*10465441SEvalZero     if (device == RT_NULL)
458*10465441SEvalZero     {
459*10465441SEvalZero         rt_set_errno(-RT_EIO);
460*10465441SEvalZero         return -1;
461*10465441SEvalZero     }
462*10465441SEvalZero 
463*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_CHANNEL, &channel);
464*10465441SEvalZero     if (result != RT_EOK)
465*10465441SEvalZero     {
466*10465441SEvalZero         rt_set_errno(result);
467*10465441SEvalZero         return -1;
468*10465441SEvalZero     }
469*10465441SEvalZero 
470*10465441SEvalZero     return channel;
471*10465441SEvalZero }
472*10465441SEvalZero 
rt_wlan_dev_set_country(struct rt_wlan_device * device,rt_country_code_t country_code)473*10465441SEvalZero rt_err_t rt_wlan_dev_set_country(struct rt_wlan_device *device, rt_country_code_t country_code)
474*10465441SEvalZero {
475*10465441SEvalZero     int result = RT_EOK;
476*10465441SEvalZero 
477*10465441SEvalZero     if (device == RT_NULL)
478*10465441SEvalZero     {
479*10465441SEvalZero         return -RT_EIO;
480*10465441SEvalZero     }
481*10465441SEvalZero 
482*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_COUNTRY, &country_code);
483*10465441SEvalZero     return result;
484*10465441SEvalZero }
485*10465441SEvalZero 
rt_wlan_dev_get_country(struct rt_wlan_device * device)486*10465441SEvalZero rt_country_code_t rt_wlan_dev_get_country(struct rt_wlan_device *device)
487*10465441SEvalZero {
488*10465441SEvalZero     int result = RT_EOK;
489*10465441SEvalZero     rt_country_code_t country_code = RT_COUNTRY_UNKNOWN;
490*10465441SEvalZero 
491*10465441SEvalZero     if (device == RT_NULL)
492*10465441SEvalZero     {
493*10465441SEvalZero         rt_set_errno(-RT_EIO);
494*10465441SEvalZero         return RT_COUNTRY_UNKNOWN;
495*10465441SEvalZero     }
496*10465441SEvalZero 
497*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_COUNTRY, &country_code);
498*10465441SEvalZero     if (result != RT_EOK)
499*10465441SEvalZero     {
500*10465441SEvalZero         rt_set_errno(result);
501*10465441SEvalZero         return RT_COUNTRY_UNKNOWN;
502*10465441SEvalZero     }
503*10465441SEvalZero 
504*10465441SEvalZero     return country_code;
505*10465441SEvalZero }
506*10465441SEvalZero 
rt_wlan_dev_scan(struct rt_wlan_device * device,struct rt_wlan_info * info)507*10465441SEvalZero rt_err_t rt_wlan_dev_scan(struct rt_wlan_device *device, struct rt_wlan_info *info)
508*10465441SEvalZero {
509*10465441SEvalZero     struct rt_scan_info scan_info = { 0 };
510*10465441SEvalZero     struct rt_scan_info *p_scan_info = RT_NULL;
511*10465441SEvalZero     rt_err_t result = 0;
512*10465441SEvalZero 
513*10465441SEvalZero     if (device == RT_NULL)
514*10465441SEvalZero     {
515*10465441SEvalZero         return -RT_EIO;
516*10465441SEvalZero     }
517*10465441SEvalZero 
518*10465441SEvalZero     if (info != RT_NULL)
519*10465441SEvalZero     {
520*10465441SEvalZero         if (info->ssid.len >= RT_WLAN_SSID_MAX_LENGTH)
521*10465441SEvalZero         {
522*10465441SEvalZero             LOG_E("L:%d ssid is to long", __LINE__);
523*10465441SEvalZero             return -RT_EINVAL;
524*10465441SEvalZero         }
525*10465441SEvalZero         rt_memcpy(&scan_info.ssid, &info->ssid, sizeof(rt_wlan_ssid_t));
526*10465441SEvalZero         rt_memcpy(scan_info.bssid, info->bssid, RT_WLAN_BSSID_MAX_LENGTH);
527*10465441SEvalZero         scan_info.channel_min = -1;
528*10465441SEvalZero         scan_info.channel_max = -1;
529*10465441SEvalZero         p_scan_info = &scan_info;
530*10465441SEvalZero     }
531*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SCAN, p_scan_info);
532*10465441SEvalZero     return result;
533*10465441SEvalZero }
534*10465441SEvalZero 
rt_wlan_dev_scan_stop(struct rt_wlan_device * device)535*10465441SEvalZero rt_err_t rt_wlan_dev_scan_stop(struct rt_wlan_device *device)
536*10465441SEvalZero {
537*10465441SEvalZero     rt_err_t result = 0;
538*10465441SEvalZero 
539*10465441SEvalZero     if (device == RT_NULL)
540*10465441SEvalZero     {
541*10465441SEvalZero         return -RT_EIO;
542*10465441SEvalZero     }
543*10465441SEvalZero 
544*10465441SEvalZero     result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SCAN_STOP, RT_NULL);
545*10465441SEvalZero     return result;
546*10465441SEvalZero }
547*10465441SEvalZero 
rt_wlan_dev_report_data(struct rt_wlan_device * device,void * buff,int len)548*10465441SEvalZero rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int len)
549*10465441SEvalZero {
550*10465441SEvalZero     return rt_wlan_dev_transfer_prot(device, buff, len);
551*10465441SEvalZero }
552*10465441SEvalZero 
_rt_wlan_dev_init(rt_device_t dev)553*10465441SEvalZero static rt_err_t _rt_wlan_dev_init(rt_device_t dev)
554*10465441SEvalZero {
555*10465441SEvalZero     struct rt_wlan_device *wlan = (struct rt_wlan_device *)dev;
556*10465441SEvalZero     rt_err_t result = RT_EOK;
557*10465441SEvalZero 
558*10465441SEvalZero     rt_mutex_init(&wlan->lock, "wlan_dev", RT_IPC_FLAG_FIFO);
559*10465441SEvalZero 
560*10465441SEvalZero     if (wlan->ops->wlan_init)
561*10465441SEvalZero         result = wlan->ops->wlan_init(wlan);
562*10465441SEvalZero 
563*10465441SEvalZero     if (result == RT_EOK)
564*10465441SEvalZero     {
565*10465441SEvalZero         LOG_I("wlan init success");
566*10465441SEvalZero     }
567*10465441SEvalZero     else
568*10465441SEvalZero     {
569*10465441SEvalZero         LOG_I("wlan init failed");
570*10465441SEvalZero     }
571*10465441SEvalZero 
572*10465441SEvalZero     return result;
573*10465441SEvalZero }
574*10465441SEvalZero 
_rt_wlan_dev_control(rt_device_t dev,int cmd,void * args)575*10465441SEvalZero static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args)
576*10465441SEvalZero {
577*10465441SEvalZero     struct rt_wlan_device *wlan = (struct rt_wlan_device *)dev;
578*10465441SEvalZero     rt_err_t err = RT_EOK;
579*10465441SEvalZero 
580*10465441SEvalZero     RT_ASSERT(dev != RT_NULL);
581*10465441SEvalZero 
582*10465441SEvalZero     WLAN_DEV_LOCK(wlan);
583*10465441SEvalZero 
584*10465441SEvalZero     switch (cmd)
585*10465441SEvalZero     {
586*10465441SEvalZero     case RT_WLAN_CMD_MODE:
587*10465441SEvalZero     {
588*10465441SEvalZero         rt_wlan_mode_t mode = *((rt_wlan_mode_t *)args);
589*10465441SEvalZero 
590*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_MODE, "RT_WLAN_CMD_MODE");
591*10465441SEvalZero         if (wlan->ops->wlan_mode)
592*10465441SEvalZero             err = wlan->ops->wlan_mode(wlan, mode);
593*10465441SEvalZero         break;
594*10465441SEvalZero     }
595*10465441SEvalZero     case RT_WLAN_CMD_SCAN:
596*10465441SEvalZero     {
597*10465441SEvalZero         struct rt_scan_info *scan_info = args;
598*10465441SEvalZero 
599*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SCAN, "RT_WLAN_CMD_SCAN");
600*10465441SEvalZero         if (wlan->ops->wlan_scan)
601*10465441SEvalZero             err = wlan->ops->wlan_scan(wlan, scan_info);
602*10465441SEvalZero         break;
603*10465441SEvalZero     }
604*10465441SEvalZero     case RT_WLAN_CMD_JOIN:
605*10465441SEvalZero     {
606*10465441SEvalZero         struct rt_sta_info *sta_info = args;
607*10465441SEvalZero 
608*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_JOIN, "RT_WLAN_CMD_JOIN");
609*10465441SEvalZero         if (wlan->ops->wlan_join)
610*10465441SEvalZero             err = wlan->ops->wlan_join(wlan, sta_info);
611*10465441SEvalZero         break;
612*10465441SEvalZero     }
613*10465441SEvalZero     case RT_WLAN_CMD_SOFTAP:
614*10465441SEvalZero     {
615*10465441SEvalZero         struct rt_ap_info *ap_info = args;
616*10465441SEvalZero 
617*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SOFTAP, "RT_WLAN_CMD_SOFTAP");
618*10465441SEvalZero         if (wlan->ops->wlan_softap)
619*10465441SEvalZero             err = wlan->ops->wlan_softap(wlan, ap_info);
620*10465441SEvalZero         break;
621*10465441SEvalZero     }
622*10465441SEvalZero     case RT_WLAN_CMD_DISCONNECT:
623*10465441SEvalZero     {
624*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_DISCONNECT, "RT_WLAN_CMD_DISCONNECT");
625*10465441SEvalZero         if (wlan->ops->wlan_disconnect)
626*10465441SEvalZero             err = wlan->ops->wlan_disconnect(wlan);
627*10465441SEvalZero         break;
628*10465441SEvalZero     }
629*10465441SEvalZero     case RT_WLAN_CMD_AP_STOP:
630*10465441SEvalZero     {
631*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_AP_STOP, "RT_WLAN_CMD_AP_STOP");
632*10465441SEvalZero         if (wlan->ops->wlan_ap_stop)
633*10465441SEvalZero             err = wlan->ops->wlan_ap_stop(wlan);
634*10465441SEvalZero         break;
635*10465441SEvalZero     }
636*10465441SEvalZero     case RT_WLAN_CMD_AP_DEAUTH:
637*10465441SEvalZero     {
638*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_AP_DEAUTH, "RT_WLAN_CMD_AP_DEAUTH");
639*10465441SEvalZero         if (wlan->ops->wlan_ap_deauth)
640*10465441SEvalZero             err = wlan->ops->wlan_ap_deauth(wlan, args);
641*10465441SEvalZero         break;
642*10465441SEvalZero     }
643*10465441SEvalZero     case RT_WLAN_CMD_SCAN_STOP:
644*10465441SEvalZero     {
645*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SCAN_STOP, "RT_WLAN_CMD_SCAN_STOP");
646*10465441SEvalZero         if (wlan->ops->wlan_scan_stop)
647*10465441SEvalZero             err = wlan->ops->wlan_scan_stop(wlan);
648*10465441SEvalZero         break;
649*10465441SEvalZero     }
650*10465441SEvalZero     case RT_WLAN_CMD_GET_RSSI:
651*10465441SEvalZero     {
652*10465441SEvalZero         int *rssi = args;
653*10465441SEvalZero 
654*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_RSSI, "RT_WLAN_CMD_GET_RSSI");
655*10465441SEvalZero         if (wlan->ops->wlan_get_rssi)
656*10465441SEvalZero             *rssi = wlan->ops->wlan_get_rssi(wlan);
657*10465441SEvalZero         break;
658*10465441SEvalZero     }
659*10465441SEvalZero     case RT_WLAN_CMD_SET_POWERSAVE:
660*10465441SEvalZero     {
661*10465441SEvalZero         int level = *((int *)args);
662*10465441SEvalZero 
663*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_POWERSAVE, "RT_WLAN_CMD_SET_POWERSAVE");
664*10465441SEvalZero         if (wlan->ops->wlan_set_powersave)
665*10465441SEvalZero             err = wlan->ops->wlan_set_powersave(wlan, level);
666*10465441SEvalZero         break;
667*10465441SEvalZero     }
668*10465441SEvalZero     case RT_WLAN_CMD_GET_POWERSAVE:
669*10465441SEvalZero     {
670*10465441SEvalZero         int *level = args;
671*10465441SEvalZero 
672*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_POWERSAVE, "RT_WLAN_CMD_GET_POWERSAVE");
673*10465441SEvalZero         if (wlan->ops->wlan_get_powersave)
674*10465441SEvalZero             *level = wlan->ops->wlan_get_powersave(wlan);
675*10465441SEvalZero         break;
676*10465441SEvalZero     }
677*10465441SEvalZero     case RT_WLAN_CMD_CFG_PROMISC:
678*10465441SEvalZero     {
679*10465441SEvalZero         rt_bool_t start = *((rt_bool_t *)args);
680*10465441SEvalZero 
681*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_CFG_PROMISC, "RT_WLAN_CMD_CFG_PROMISC");
682*10465441SEvalZero         if (wlan->ops->wlan_cfg_promisc)
683*10465441SEvalZero             err = wlan->ops->wlan_cfg_promisc(wlan, start);
684*10465441SEvalZero         break;
685*10465441SEvalZero     }
686*10465441SEvalZero     case RT_WLAN_CMD_CFG_FILTER:
687*10465441SEvalZero     {
688*10465441SEvalZero         struct rt_wlan_filter *filter = args;
689*10465441SEvalZero 
690*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_CFG_FILTER, "RT_WLAN_CMD_CFG_FILTER");
691*10465441SEvalZero         if (wlan->ops->wlan_cfg_filter)
692*10465441SEvalZero             err = wlan->ops->wlan_cfg_filter(wlan, filter);
693*10465441SEvalZero         break;
694*10465441SEvalZero     }
695*10465441SEvalZero     case RT_WLAN_CMD_SET_CHANNEL:
696*10465441SEvalZero     {
697*10465441SEvalZero         int channel = *(int *)args;
698*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_CHANNEL, "RT_WLAN_CMD_SET_CHANNEL");
699*10465441SEvalZero         if (wlan->ops->wlan_set_channel)
700*10465441SEvalZero             err = wlan->ops->wlan_set_channel(wlan, channel);
701*10465441SEvalZero         break;
702*10465441SEvalZero     }
703*10465441SEvalZero     case RT_WLAN_CMD_GET_CHANNEL:
704*10465441SEvalZero     {
705*10465441SEvalZero         int *channel = args;
706*10465441SEvalZero 
707*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_CHANNEL, "RT_WLAN_CMD_GET_CHANNEL");
708*10465441SEvalZero         if (wlan->ops->wlan_get_channel)
709*10465441SEvalZero             *channel = wlan->ops->wlan_get_channel(wlan);
710*10465441SEvalZero         break;
711*10465441SEvalZero     }
712*10465441SEvalZero     case RT_WLAN_CMD_SET_COUNTRY:
713*10465441SEvalZero     {
714*10465441SEvalZero         rt_country_code_t country = *(rt_country_code_t *)args;
715*10465441SEvalZero 
716*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_COUNTRY, "RT_WLAN_CMD_SET_COUNTRY");
717*10465441SEvalZero         if (wlan->ops->wlan_set_country)
718*10465441SEvalZero             err = wlan->ops->wlan_set_country(wlan, country);
719*10465441SEvalZero         break;
720*10465441SEvalZero     }
721*10465441SEvalZero     case RT_WLAN_CMD_GET_COUNTRY:
722*10465441SEvalZero     {
723*10465441SEvalZero         rt_country_code_t *country = args;
724*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_COUNTRY, "RT_WLAN_CMD_GET_COUNTRY");
725*10465441SEvalZero         if (wlan->ops->wlan_get_country)
726*10465441SEvalZero             *country = wlan->ops->wlan_get_country(wlan);
727*10465441SEvalZero         break;
728*10465441SEvalZero     }
729*10465441SEvalZero     case RT_WLAN_CMD_SET_MAC:
730*10465441SEvalZero     {
731*10465441SEvalZero         rt_uint8_t *mac = args;
732*10465441SEvalZero 
733*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_MAC, "RT_WLAN_CMD_SET_MAC");
734*10465441SEvalZero         if (wlan->ops->wlan_set_mac)
735*10465441SEvalZero             err = wlan->ops->wlan_set_mac(wlan, mac);
736*10465441SEvalZero         break;
737*10465441SEvalZero     }
738*10465441SEvalZero     case RT_WLAN_CMD_GET_MAC:
739*10465441SEvalZero     {
740*10465441SEvalZero         rt_uint8_t *mac = args;
741*10465441SEvalZero 
742*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_MAC, "RT_WLAN_CMD_GET_MAC");
743*10465441SEvalZero         if (wlan->ops->wlan_get_mac)
744*10465441SEvalZero             err = wlan->ops->wlan_get_mac(wlan, mac);
745*10465441SEvalZero         break;
746*10465441SEvalZero     }
747*10465441SEvalZero     default:
748*10465441SEvalZero         LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, -1, "UNKUOWN");
749*10465441SEvalZero         break;
750*10465441SEvalZero     }
751*10465441SEvalZero 
752*10465441SEvalZero     WLAN_DEV_UNLOCK(wlan);
753*10465441SEvalZero 
754*10465441SEvalZero     return err;
755*10465441SEvalZero }
756*10465441SEvalZero 
757*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
758*10465441SEvalZero const static struct rt_device_ops wlan_ops =
759*10465441SEvalZero {
760*10465441SEvalZero     _rt_wlan_dev_init,
761*10465441SEvalZero     RT_NULL,
762*10465441SEvalZero     RT_NULL,
763*10465441SEvalZero     RT_NULL,
764*10465441SEvalZero     RT_NULL,
765*10465441SEvalZero     _rt_wlan_dev_control
766*10465441SEvalZero };
767*10465441SEvalZero #endif
768*10465441SEvalZero 
rt_wlan_dev_register(struct rt_wlan_device * wlan,const char * name,const struct rt_wlan_dev_ops * ops,rt_uint32_t flag,void * user_data)769*10465441SEvalZero rt_err_t rt_wlan_dev_register(struct rt_wlan_device *wlan, const char *name, const struct rt_wlan_dev_ops *ops, rt_uint32_t flag, void *user_data)
770*10465441SEvalZero {
771*10465441SEvalZero     rt_err_t err = RT_EOK;
772*10465441SEvalZero 
773*10465441SEvalZero     if ((wlan == RT_NULL) || (name == RT_NULL) || (ops == RT_NULL))
774*10465441SEvalZero     {
775*10465441SEvalZero         LOG_E("F:%s L:%d parameter Wrongful", __FUNCTION__, __LINE__);
776*10465441SEvalZero         return RT_NULL;
777*10465441SEvalZero     }
778*10465441SEvalZero 
779*10465441SEvalZero     rt_memset(wlan, 0, sizeof(struct rt_wlan_device));
780*10465441SEvalZero 
781*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
782*10465441SEvalZero     wlan->device.ops = &wlan_ops;
783*10465441SEvalZero #else
784*10465441SEvalZero     wlan->device.init       = _rt_wlan_dev_init;
785*10465441SEvalZero     wlan->device.open       = RT_NULL;
786*10465441SEvalZero     wlan->device.close      = RT_NULL;
787*10465441SEvalZero     wlan->device.read       = RT_NULL;
788*10465441SEvalZero     wlan->device.write      = RT_NULL;
789*10465441SEvalZero     wlan->device.control    = _rt_wlan_dev_control;
790*10465441SEvalZero #endif
791*10465441SEvalZero 
792*10465441SEvalZero     wlan->device.user_data  = RT_NULL;
793*10465441SEvalZero 
794*10465441SEvalZero     wlan->device.type = RT_Device_Class_NetIf;
795*10465441SEvalZero 
796*10465441SEvalZero     wlan->ops = ops;
797*10465441SEvalZero     wlan->user_data  = user_data;
798*10465441SEvalZero 
799*10465441SEvalZero     wlan->flags = flag;
800*10465441SEvalZero     err = rt_device_register(&wlan->device, name, RT_DEVICE_FLAG_RDWR);
801*10465441SEvalZero 
802*10465441SEvalZero     LOG_D("F:%s L:%d run", __FUNCTION__, __LINE__);
803*10465441SEvalZero 
804*10465441SEvalZero     return err;
805*10465441SEvalZero }
806