2 * Copyright (c) 2007-2008 Atheros Communications Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 /* Module Name : usbdrv.c */
19 /* This module contains network interface up/down related functions.*/
22 /* Platform dependent. */
24 /************************************************************************/
28 #define ZM_PIBSS_MODE 0
32 #define ZM_SHARE_AUTH 0
33 #define ZM_DISABLE_XMIT 0
37 #include "80211core/pub_zfi.h"
39 #include "linux/netlink.h"
40 #include "linux/rtnetlink.h"
42 #include <net/iw_handler.h>
44 #ifdef ZM_HOSTAPD_SUPPORT
45 #include "athr_common.h"
48 extern void zfDumpDescriptor(zdev_t
* dev
, u16_t type
);
49 //extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
52 irqreturn_t
usbdrv_intr(int, void *, struct pt_regs
*);
54 // Network Device interface related function
55 int usbdrv_open(struct net_device
*);
56 int usbdrv_close(struct net_device
*);
57 int usbdrv_change_mtu(struct net_device
*, int);
58 int usbdrv_set_mac(struct net_device
*, void *);
59 int usbdrv_xmit_frame(struct sk_buff
*, struct net_device
*);
60 void usbdrv_set_multi(struct net_device
*);
61 struct net_device_stats
*usbdrv_get_stats(struct net_device
*);
63 //wireless extension helper functions
64 int usbdrv_ioctl_setessid(struct net_device
*dev
, struct iw_point
*erq
);
65 int usbdrv_ioctl_getessid(struct net_device
*dev
, struct iw_point
*erq
);
66 int usbdrv_ioctl_setrts(struct net_device
*dev
, struct iw_param
*rrq
);
67 /* Wireless Extension Handler functions */
68 int usbdrvwext_giwmode(struct net_device
*dev
, struct iw_request_info
* info
,
69 __u32
*mode
, char *extra
);
70 int zfLnxPrivateIoctl(struct usbdrv_private
*macp
, struct zdap_ioctl
*zdreq
);
72 void zfLnx10msTimer(struct net_device
* dev
);
73 int zfUnregisterWdsDev(struct net_device
* parentDev
, u16_t wdsId
);
74 int zfRegisterWdsDev(struct net_device
* parentDev
, u16_t wdsId
);
75 int zfWdsOpen(struct net_device
*dev
);
76 int zfWdsClose(struct net_device
*dev
);
77 int zfLnxVapOpen(struct net_device
*dev
);
78 int zfLnxVapClose(struct net_device
*dev
);
79 int zfLnxVapXmitFrame(struct sk_buff
*skb
, struct net_device
*dev
);
80 int zfLnxRegisterVapDev(struct net_device
* parentDev
, u16_t vapId
);
81 int usbdrv_wpa_ioctl(struct net_device
*dev
, struct athr_wlan_param
*zdparm
);
82 extern u16_t
zfLnxGetVapId(zdev_t
* dev
);
83 extern u16_t
zfLnxCheckTxBufferCnt(zdev_t
*dev
);
84 extern UsbTxQ_t
*zfLnxGetUsbTxBuffer(zdev_t
*dev
);
86 extern u16_t
zfLnxAuthNotify(zdev_t
* dev
, u16_t
* macAddr
);
87 extern u16_t
zfLnxAsocNotify(zdev_t
* dev
, u16_t
* macAddr
, u8_t
* body
, u16_t bodySize
, u16_t port
);
88 extern u16_t
zfLnxDisAsocNotify(zdev_t
* dev
, u8_t
* macAddr
, u16_t port
);
89 extern u16_t
zfLnxApConnectNotify(zdev_t
* dev
, u8_t
* macAddr
, u16_t port
);
90 extern void zfLnxConnectNotify(zdev_t
* dev
, u16_t status
, u16_t
* bssid
);
91 extern void zfLnxScanNotify(zdev_t
* dev
, struct zsScanResult
* result
);
92 extern void zfLnxStatisticsNotify(zdev_t
* dev
, struct zsStastics
* result
);
93 extern void zfLnxMicFailureNotify(zdev_t
* dev
, u16_t
* addr
, u16_t status
);
94 extern void zfLnxApMicFailureNotify(zdev_t
* dev
, u8_t
* addr
, zbuf_t
* buf
);
95 extern void zfLnxIbssPartnerNotify(zdev_t
* dev
, u16_t status
, struct zsPartnerNotifyEvent
*event
);
96 extern void zfLnxMacAddressNotify(zdev_t
* dev
, u8_t
* addr
);
97 extern void zfLnxSendCompleteIndication(zdev_t
* dev
, zbuf_t
* buf
);
98 extern void zfLnxRecvEth(zdev_t
* dev
, zbuf_t
* buf
, u16_t port
);
99 extern void zfLnxRestoreBufData(zdev_t
* dev
, zbuf_t
* buf
);
100 #ifdef ZM_ENABLE_CENC
101 extern u16_t
zfLnxCencAsocNotify(zdev_t
* dev
, u16_t
* macAddr
, u8_t
* body
, u16_t bodySize
, u16_t port
);
102 #endif //ZM_ENABLE_CENC
103 extern void zfLnxWatchDogNotify(zdev_t
* dev
);
104 extern void zfLnxRecv80211(zdev_t
* dev
, zbuf_t
* buf
, struct zsAdditionInfo
* addInfo
);
105 extern u8_t
zfLnxCreateThread(zdev_t
*dev
);
107 /******************************************************************************
108 * P U B L I C D A T A
109 *******************************************************************************
112 /* Definition of Wireless Extension */
114 //wireless extension helper functions
115 extern int usbdrv_ioctl_setessid(struct net_device
*dev
, struct iw_point
*erq
);
116 extern int usbdrv_ioctl_setrts(struct net_device
*dev
, struct iw_param
*rrq
);
117 /* Wireless Extension Handler functions */
118 extern int usbdrvwext_giwname(struct net_device
*dev
, struct iw_request_info
*info
,
119 union iwreq_data
*wrq
, char *extra
);
120 extern int usbdrvwext_siwfreq(struct net_device
*dev
, struct iw_request_info
*info
,
121 struct iw_freq
*freq
, char *extra
);
122 extern int usbdrvwext_giwfreq(struct net_device
*dev
, struct iw_request_info
*info
,
123 struct iw_freq
*freq
, char *extra
);
124 extern int usbdrvwext_siwmode(struct net_device
*dev
, struct iw_request_info
*info
,
125 union iwreq_data
*wrq
, char *extra
);
126 extern int usbdrvwext_giwmode(struct net_device
*dev
, struct iw_request_info
*info
,
127 __u32
*mode
, char *extra
);
128 extern int usbdrvwext_siwsens(struct net_device
*dev
, struct iw_request_info
*info
,
129 struct iw_param
*sens
, char *extra
);
130 extern int usbdrvwext_giwsens(struct net_device
*dev
, struct iw_request_info
*info
,
131 struct iw_param
*sens
, char *extra
);
132 extern int usbdrvwext_giwrange(struct net_device
*dev
, struct iw_request_info
*info
,
133 struct iw_point
*data
, char *extra
);
134 extern int usbdrvwext_siwap(struct net_device
*dev
, struct iw_request_info
*info
,
135 struct sockaddr
*MacAddr
, char *extra
);
136 extern int usbdrvwext_giwap(struct net_device
*dev
, struct iw_request_info
*info
,
137 struct sockaddr
*MacAddr
, char *extra
);
138 extern int usbdrvwext_iwaplist(struct net_device
*dev
, struct iw_request_info
*info
,
139 struct iw_point
*data
, char *extra
);
140 extern int usbdrvwext_siwscan(struct net_device
*dev
, struct iw_request_info
*info
,
141 struct iw_point
*data
, char *extra
);
142 extern int usbdrvwext_giwscan(struct net_device
*dev
, struct iw_request_info
*info
,
143 struct iw_point
*data
, char *extra
);
144 extern int usbdrvwext_siwessid(struct net_device
*dev
, struct iw_request_info
*info
,
145 struct iw_point
*essid
, char *extra
);
146 extern int usbdrvwext_giwessid(struct net_device
*dev
, struct iw_request_info
*info
,
147 struct iw_point
*essid
, char *extra
);
148 extern int usbdrvwext_siwnickn(struct net_device
*dev
, struct iw_request_info
*info
,
149 struct iw_point
*data
, char *nickname
);
150 extern int usbdrvwext_giwnickn(struct net_device
*dev
, struct iw_request_info
*info
,
151 struct iw_point
*data
, char *nickname
);
152 extern int usbdrvwext_siwrate(struct net_device
*dev
, struct iw_request_info
*info
,
153 struct iw_param
*frq
, char *extra
);
154 extern int usbdrvwext_giwrate(struct net_device
*dev
, struct iw_request_info
*info
,
155 struct iw_param
*frq
, char *extra
);
156 extern int usbdrvwext_siwrts(struct net_device
*dev
, struct iw_request_info
*info
,
157 struct iw_param
*rts
, char *extra
);
158 extern int usbdrvwext_giwrts(struct net_device
*dev
, struct iw_request_info
*info
,
159 struct iw_param
*rts
, char *extra
);
160 extern int usbdrvwext_siwfrag(struct net_device
*dev
, struct iw_request_info
*info
,
161 struct iw_param
*frag
, char *extra
);
162 extern int usbdrvwext_giwfrag(struct net_device
*dev
, struct iw_request_info
*info
,
163 struct iw_param
*frag
, char *extra
);
164 extern int usbdrvwext_siwtxpow(struct net_device
*dev
, struct iw_request_info
*info
,
165 struct iw_param
*rrq
, char *extra
);
166 extern int usbdrvwext_giwtxpow(struct net_device
*dev
, struct iw_request_info
*info
,
167 struct iw_param
*rrq
, char *extra
);
168 extern int usbdrvwext_siwretry(struct net_device
*dev
, struct iw_request_info
*info
,
169 struct iw_param
*rrq
, char *extra
);
170 extern int usbdrvwext_giwretry(struct net_device
*dev
, struct iw_request_info
*info
,
171 struct iw_param
*rrq
, char *extra
);
172 extern int usbdrvwext_siwencode(struct net_device
*dev
, struct iw_request_info
*info
,
173 struct iw_point
*erq
, char *key
);
174 extern int usbdrvwext_giwencode(struct net_device
*dev
, struct iw_request_info
*info
,
175 struct iw_point
*erq
, char *key
);
176 extern int usbdrvwext_siwpower(struct net_device
*dev
, struct iw_request_info
*info
,
177 struct iw_param
*frq
, char *extra
);
178 extern int usbdrvwext_giwpower(struct net_device
*dev
, struct iw_request_info
*info
,
179 struct iw_param
*frq
, char *extra
);
180 extern int usbdrv_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
);
182 * Structures to export the Wireless Handlers
185 struct iw_priv_args usbdrv_private_args
[] = {
186 // { SIOCIWFIRSTPRIV + 0x0, 0, 0, "list_bss" },
187 // { SIOCIWFIRSTPRIV + 0x1, 0, 0, "card_reset" },
188 { SIOCIWFIRSTPRIV
+ 0x2, IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "set_auth" }, /* 0 - open, 1 - shared key */
189 { SIOCIWFIRSTPRIV
+ 0x3, 0, IW_PRIV_TYPE_CHAR
| 12, "get_auth" },
190 // { SIOCIWFIRSTPRIV + 0x4, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble" }, /* 0 - long, 1 - short */
191 // { SIOCIWFIRSTPRIV + 0x5, 0, IW_PRIV_TYPE_CHAR | 6, "get_preamble" },
192 // { SIOCIWFIRSTPRIV + 0x6, 0, 0, "cnt" },
193 // { SIOCIWFIRSTPRIV + 0x7, 0, 0, "regs" },
194 // { SIOCIWFIRSTPRIV + 0x8, 0, 0, "probe" },
195 // { SIOCIWFIRSTPRIV + 0x9, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dbg_flag" },
196 // { SIOCIWFIRSTPRIV + 0xA, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "connect" },
197 // { SIOCIWFIRSTPRIV + 0xB, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_mac_mode" },
198 // { SIOCIWFIRSTPRIV + 0xC, 0, IW_PRIV_TYPE_CHAR | 12, "get_mac_mode" },
201 static iw_handler usbdrvwext_handler
[] = {
202 (iw_handler
) NULL
, /* SIOCSIWCOMMIT */
203 (iw_handler
) usbdrvwext_giwname
, /* SIOCGIWNAME */
204 (iw_handler
) NULL
, /* SIOCSIWNWID */
205 (iw_handler
) NULL
, /* SIOCGIWNWID */
206 (iw_handler
) usbdrvwext_siwfreq
, /* SIOCSIWFREQ */
207 (iw_handler
) usbdrvwext_giwfreq
, /* SIOCGIWFREQ */
208 (iw_handler
) usbdrvwext_siwmode
, /* SIOCSIWMODE */
209 (iw_handler
) usbdrvwext_giwmode
, /* SIOCGIWMODE */
210 (iw_handler
) usbdrvwext_siwsens
, /* SIOCSIWSENS */
211 (iw_handler
) usbdrvwext_giwsens
, /* SIOCGIWSENS */
212 (iw_handler
) NULL
, /* not used */ /* SIOCSIWRANGE */
213 (iw_handler
) usbdrvwext_giwrange
, /* SIOCGIWRANGE */
214 (iw_handler
) NULL
, /* not used */ /* SIOCSIWPRIV */
215 (iw_handler
) NULL
, /* kernel code */ /* SIOCGIWPRIV */
216 (iw_handler
) NULL
, /* not used */ /* SIOCSIWSTATS */
217 (iw_handler
) NULL
, /* kernel code */ /* SIOCGIWSTATS */
218 (iw_handler
) NULL
, /* SIOCSIWSPY */
219 (iw_handler
) NULL
, /* SIOCGIWSPY */
220 (iw_handler
) NULL
, /* -- hole -- */
221 (iw_handler
) NULL
, /* -- hole -- */
222 (iw_handler
) usbdrvwext_siwap
, /* SIOCSIWAP */
223 (iw_handler
) usbdrvwext_giwap
, /* SIOCGIWAP */
224 (iw_handler
) NULL
, /* -- hole -- */
225 (iw_handler
) usbdrvwext_iwaplist
, /* SIOCGIWAPLIST */
226 (iw_handler
) usbdrvwext_siwscan
, /* SIOCSIWSCAN */
227 (iw_handler
) usbdrvwext_giwscan
, /* SIOCGIWSCAN */
228 (iw_handler
) usbdrvwext_siwessid
, /* SIOCSIWESSID */
229 (iw_handler
) usbdrvwext_giwessid
, /* SIOCGIWESSID */
231 (iw_handler
) usbdrvwext_siwnickn
, /* SIOCSIWNICKN */
232 (iw_handler
) usbdrvwext_giwnickn
, /* SIOCGIWNICKN */
233 (iw_handler
) NULL
, /* -- hole -- */
234 (iw_handler
) NULL
, /* -- hole -- */
235 (iw_handler
) usbdrvwext_siwrate
, /* SIOCSIWRATE */
236 (iw_handler
) usbdrvwext_giwrate
, /* SIOCGIWRATE */
237 (iw_handler
) usbdrvwext_siwrts
, /* SIOCSIWRTS */
238 (iw_handler
) usbdrvwext_giwrts
, /* SIOCGIWRTS */
239 (iw_handler
) usbdrvwext_siwfrag
, /* SIOCSIWFRAG */
240 (iw_handler
) usbdrvwext_giwfrag
, /* SIOCGIWFRAG */
241 (iw_handler
) usbdrvwext_siwtxpow
, /* SIOCSIWTXPOW */
242 (iw_handler
) usbdrvwext_giwtxpow
, /* SIOCGIWTXPOW */
243 (iw_handler
) usbdrvwext_siwretry
, /* SIOCSIWRETRY */
244 (iw_handler
) usbdrvwext_giwretry
, /* SIOCGIWRETRY */
245 (iw_handler
) usbdrvwext_siwencode
, /* SIOCSIWENCODE */
246 (iw_handler
) usbdrvwext_giwencode
, /* SIOCGIWENCODE */
247 (iw_handler
) usbdrvwext_siwpower
, /* SIOCSIWPOWER */
248 (iw_handler
) usbdrvwext_giwpower
, /* SIOCGIWPOWER */
251 static const iw_handler usbdrv_private_handler
[] =
253 //(iw_handler) usbdrvwext_setparam, /* SIOCWFIRSTPRIV+0 */
254 //(iw_handler) usbdrvwext_getparam, /* SIOCWFIRSTPRIV+1 */
255 //(iw_handler) usbdrvwext_setkey, /* SIOCWFIRSTPRIV+2 */
256 //(iw_handler) usbdrvwext_setwmmparams, /* SIOCWFIRSTPRIV+3 */
257 //(iw_handler) usbdrvwext_delkey, /* SIOCWFIRSTPRIV+4 */
258 //(iw_handler) usbdrvwext_getwmmparams, /* SIOCWFIRSTPRIV+5 */
259 //(iw_handler) usbdrvwext_setmlme, /* SIOCWFIRSTPRIV+6 */
260 //(iw_handler) usbdrvwext_getchaninfo, /* SIOCWFIRSTPRIV+7 */
261 //(iw_handler) usbdrvwext_setoptie, /* SIOCWFIRSTPRIV+8 */
262 //(iw_handler) usbdrvwext_getoptie, /* SIOCWFIRSTPRIV+9 */
263 //(iw_handler) usbdrvwext_addmac, /* SIOCWFIRSTPRIV+10 */
264 //(iw_handler) usbdrvwext_getscanresults, /* SIOCWFIRSTPRIV+11 */
265 //(iw_handler) usbdrvwext_delmac, /* SIOCWFIRSTPRIV+12 */
266 //(iw_handler) usbdrvwext_getchanlist, /* SIOCWFIRSTPRIV+13 */
267 //(iw_handler) usbdrvwext_setchanlist, /* SIOCWFIRSTPRIV+14 */
268 //(iw_handler) NULL, /* SIOCWFIRSTPRIV+15 */
269 //(iw_handler) usbdrvwext_chanswitch, /* SIOCWFIRSTPRIV+16 */
270 //(iw_handler) usbdrvwext_setmode, /* SIOCWFIRSTPRIV+17 */
271 //(iw_handler) usbdrvwext_getmode, /* SIOCWFIRSTPRIV+18 */
272 NULL
, /* SIOCIWFIRSTPRIV */
275 static struct iw_handler_def p80211wext_handler_def
= {
276 .num_standard
= sizeof(usbdrvwext_handler
) / sizeof(iw_handler
),
277 .num_private
= sizeof(usbdrv_private_handler
)/sizeof(iw_handler
),
278 .num_private_args
= sizeof(usbdrv_private_args
)/sizeof(struct iw_priv_args
),
279 .standard
= usbdrvwext_handler
,
280 .private = (iw_handler
*) usbdrv_private_handler
,
281 .private_args
= (struct iw_priv_args
*) usbdrv_private_args
285 //struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
286 //void zfInitWdsStruct(void);
289 struct zsVapStruct vap
[ZM_VAP_PORT_NUMBER
];
290 void zfLnxInitVapStruct(void);
294 * usbdrv_intr - interrupt handler
295 * @irq: the IRQ number
296 * @dev_inst: the net_device struct
297 * @regs: registers (unused)
299 * This routine is the ISR for the usbdrv board. It services
300 * the RX & TX queues & starts the RU if it has stopped due
303 irqreturn_t
usbdrv_intr(int irq
, void *dev_inst
, struct pt_regs
*regs
)
305 struct net_device
*dev
;
306 struct usbdrv_private
*macp
;
312 /* Read register error, card may be unpluged */
313 if (0)//(intr_status == -1)
316 /* the device is closed, don't continue or else bad things may happen. */
317 if (!netif_running(dev
)) {
321 if (macp
->driver_isolated
) {
325 #if (WLAN_HOSTIF == WLAN_PCI)
332 int usbdrv_open(struct net_device
*dev
)
334 struct usbdrv_private
*macp
= dev
->ml_priv
;
338 //unsigned char addr[6];
339 struct zsCbFuncTbl cbFuncTbl
;
341 printk("Enter open()\n");
344 // read_lock(&(macp->isolate_lock));
346 if (macp
->driver_isolated
) {
351 size
= zfiGlobalDataSize(dev
);
352 if ((mem
= kmalloc(size
, GFP_KERNEL
)) == NULL
)
359 memset(&cbFuncTbl
, 0, sizeof(struct zsCbFuncTbl
));
360 cbFuncTbl
.zfcbAuthNotify
= zfLnxAuthNotify
;
361 cbFuncTbl
.zfcbAuthNotify
= zfLnxAuthNotify
;
362 cbFuncTbl
.zfcbAsocNotify
= zfLnxAsocNotify
;
363 cbFuncTbl
.zfcbDisAsocNotify
= zfLnxDisAsocNotify
;
364 cbFuncTbl
.zfcbApConnectNotify
= zfLnxApConnectNotify
;
365 cbFuncTbl
.zfcbConnectNotify
= zfLnxConnectNotify
;
366 cbFuncTbl
.zfcbScanNotify
= zfLnxScanNotify
;
367 cbFuncTbl
.zfcbMicFailureNotify
= zfLnxMicFailureNotify
;
368 cbFuncTbl
.zfcbApMicFailureNotify
= zfLnxApMicFailureNotify
;
369 cbFuncTbl
.zfcbIbssPartnerNotify
= zfLnxIbssPartnerNotify
;
370 cbFuncTbl
.zfcbMacAddressNotify
= zfLnxMacAddressNotify
;
371 cbFuncTbl
.zfcbSendCompleteIndication
= zfLnxSendCompleteIndication
;
372 cbFuncTbl
.zfcbRecvEth
= zfLnxRecvEth
;
373 cbFuncTbl
.zfcbRecv80211
= zfLnxRecv80211
;
374 cbFuncTbl
.zfcbRestoreBufData
= zfLnxRestoreBufData
;
375 #ifdef ZM_ENABLE_CENC
376 cbFuncTbl
.zfcbCencAsocNotify
= zfLnxCencAsocNotify
;
377 #endif //ZM_ENABLE_CENC
378 cbFuncTbl
.zfcbHwWatchDogNotify
= zfLnxWatchDogNotify
;
379 zfiWlanOpen(dev
, &cbFuncTbl
);
383 //u16_t mac[3] = {0x1300, 0xb6d4, 0x5aaf};
384 u16_t mac
[3] = {0x8000, 0x00ab, 0x0000};
385 //zfiWlanSetMacAddress(dev, mac);
388 zfiWlanQueryMacAddress(dev
, addr
);
389 dev
->dev_addr
[0] = addr
[0];
390 dev
->dev_addr
[1] = addr
[1];
391 dev
->dev_addr
[2] = addr
[2];
392 dev
->dev_addr
[3] = addr
[3];
393 dev
->dev_addr
[4] = addr
[4];
394 dev
->dev_addr
[5] = addr
[5];
396 //zfwMacAddressNotify() will be called to setup dev->dev_addr[]
398 zfLnxCreateThread(dev
);
400 mod_timer(&(macp
->hbTimer10ms
), jiffies
+ (1*HZ
)/100); //10 ms
402 netif_carrier_on(dev
);
404 netif_start_queue(dev
);
407 zfiWlanSetWlanMode(dev
, ZM_MODE_AP
);
408 zfiWlanSetBasicRate(dev
, 0xf, 0, 0);
409 zfiWlanSetSSID(dev
, "OTUS_CWY", 8);
410 zfiWlanSetDtimCount(dev
, 3);
414 u8_t key
[16] = {0x12, 0x34, 0x56, 0x78, 0x90};
415 struct zsKeyInfo keyInfo
;
417 keyInfo
.keyLength
= 5;
418 keyInfo
.keyIndex
= 0;
421 zfiWlanSetKey(dev
, keyInfo
);
423 zfiWlanSetEncryMode(dev
, ZM_WEP64
);
426 #if ZM_SHARE_AUTH == 1
427 zfiWlanSetAuthenticationMode(dev
, 1);
428 #endif //#if ZM_SHARE_AUTH == 1
429 #endif //#if ZM_WEP_MOME == 1
431 #elif ZM_PIBSS_MODE == 1
432 zfiWlanSetWlanMode(dev
, ZM_MODE_PSEUDO
);
434 zfiWlanSetWlanMode(dev
, ZM_MODE_INFRASTRUCTURE
);
436 //zfiWlanSetChannel(dev, ZM_CHANNEL, FALSE);
437 zfiWlanSetFrequency(dev
, 2462000, FALSE
);
438 zfiWlanSetRtsThreshold(dev
, 32767);
439 zfiWlanSetFragThreshold(dev
, 0);
443 #ifdef ZM_ENABLE_CENC
444 macp
->netlink_sk
= netlink_kernel_create(NETLINK_USERSOCK
, 1, NULL
, THIS_MODULE
);
446 if (macp
->netlink_sk
== NULL
)
448 printk(KERN_ERR
"Can't create NETLINK socket\n");
452 macp
->DeviceOpened
= 1;
455 // read_unlock(&(macp->isolate_lock));
457 //zfRegisterWdsDev(dev, 0);
458 //zfLnxRegisterVapDev(dev, 0);
467 * usbdrv_get_stats - get driver statistics
468 * @dev: adapter's net_device struct
470 * This routine is called when the OS wants the adapter's stats returned.
471 * It returns the address of the net_device_stats stucture for the device.
472 * If the statistics are currently being updated, then they might be incorrect
473 * for a short while. However, since this cannot actually cause damage, no
477 struct net_device_stats
* usbdrv_get_stats(struct net_device
*dev
)
479 struct usbdrv_private
*macp
= dev
->ml_priv
;
481 macp
->drv_stats
.net_stats
.tx_errors
=
482 macp
->drv_stats
.net_stats
.tx_carrier_errors
+
483 macp
->drv_stats
.net_stats
.tx_aborted_errors
;
485 macp
->drv_stats
.net_stats
.rx_errors
=
486 macp
->drv_stats
.net_stats
.rx_crc_errors
+
487 macp
->drv_stats
.net_stats
.rx_frame_errors
+
488 macp
->drv_stats
.net_stats
.rx_length_errors
;
491 return &(macp
->drv_stats
.net_stats
);
496 * usbdrv_set_mac - set the MAC address
497 * @dev: adapter's net_device struct
498 * @addr: the new address
500 * This routine sets the ethernet address of the board
506 int usbdrv_set_mac(struct net_device
*dev
, void *addr
)
508 struct usbdrv_private
*macp
;
512 read_lock(&(macp
->isolate_lock
));
514 if (macp
->driver_isolated
) {
522 read_unlock(&(macp
->isolate_lock
));
529 usbdrv_isolate_driver(struct usbdrv_private
*macp
)
532 write_lock_irq(&(macp
->isolate_lock
));
534 macp
->driver_isolated
= TRUE
;
536 write_unlock_irq(&(macp
->isolate_lock
));
539 if (netif_running(macp
->device
))
541 netif_carrier_off(macp
->device
);
542 netif_stop_queue(macp
->device
);
547 int usbdrv_change_mtu(struct net_device
*dev
, int new_mtu
)
549 if ((new_mtu
< 68) || (new_mtu
> (ETH_DATA_LEN
+ VLAN_SIZE
)))
556 void zfLnxUnlinkAllUrbs(struct usbdrv_private
*macp
);
558 int usbdrv_close(struct net_device
*dev
)
560 extern void zfHpLedCtrl(struct net_device
*dev
, u16_t ledId
, u8_t mode
);
562 struct usbdrv_private
*macp
= dev
->ml_priv
;
564 printk(KERN_DEBUG
"usbdrv_close\n");
566 netif_carrier_off(macp
->device
);
568 del_timer_sync(&macp
->hbTimer10ms
);
570 printk(KERN_DEBUG
"usbdrv_netif_carrier_off\n");
572 usbdrv_isolate_driver(macp
);
574 printk(KERN_DEBUG
"usbdrv_isolate_driver\n");
576 netif_carrier_off(macp
->device
);
577 #ifdef ZM_ENABLE_CENC
579 if (macp
->netlink_sk
!= NULL
)
581 // sock_release(macp->netlink_sk);
582 printk(KERN_ERR
"usbdrv close netlink socket\n");
584 #endif //ZM_ENABLE_CENC
585 #if (WLAN_HOSTIF == WLAN_PCI)
586 //free_irq(dev->irq, dev);
590 zfHpLedCtrl(dev
, 0, 0);
591 zfHpLedCtrl(dev
, 1, 0);
593 /* Delay for a while */
596 /* clear WPA/RSN IE */
599 /* set the isolate flag to false, so usbdrv_open can be called */
600 macp
->driver_isolated
= FALSE
;
605 zfLnxUnlinkAllUrbs(macp
);
613 int usbdrv_xmit_frame(struct sk_buff
*skb
, struct net_device
*dev
)
615 int notify_stop
= FALSE
;
616 struct usbdrv_private
*macp
= dev
->ml_priv
;
623 s
= skb_copy_expand(skb
, 8, 0, GFP_ATOMIC
);
630 printk("len1=%d, len2=%d", skb
->len
, s
->len
);
631 netlink_broadcast(rtnl
, s
, 0, RTMGRP_LINK
, GFP_ATOMIC
);
636 dev_kfree_skb_irq(skb
);
638 zfiTxSendEth(dev
, skb
, 0);
640 macp
->drv_stats
.net_stats
.tx_bytes
+= skb
->len
;
641 macp
->drv_stats
.net_stats
.tx_packets
++;
643 //dev_kfree_skb_irq(skb);
646 netif_carrier_off(dev
);
647 netif_stop_queue(dev
);
656 void usbdrv_set_multi(struct net_device
*dev
)
660 if (!(dev
->flags
& IFF_UP
))
670 * usbdrv_clear_structs - free resources
672 * @dev: adapter's net_device struct
674 * Free all device specific structs, unmap i/o address, etc.
676 void usbdrv_clear_structs(struct net_device
*dev
)
678 struct usbdrv_private
*macp
= dev
->ml_priv
;
681 #if (WLAN_HOSTIF == WLAN_PCI)
684 pci_release_regions(macp
->pdev
);
685 pci_disable_device(macp
->pdev
);
686 pci_set_drvdata(macp
->pdev
, NULL
);
695 void usbdrv_remove1(struct pci_dev
*pcid
)
697 struct net_device
*dev
;
698 struct usbdrv_private
*macp
;
700 if (!(dev
= (struct net_device
*) pci_get_drvdata(pcid
)))
704 unregister_netdev(dev
);
706 usbdrv_clear_structs(dev
);
710 void zfLnx10msTimer(struct net_device
* dev
)
712 struct usbdrv_private
*macp
= dev
->ml_priv
;
714 mod_timer(&(macp
->hbTimer10ms
), jiffies
+ (1*HZ
)/100); //10 ms
719 void zfLnxInitVapStruct(void)
723 for (i
=0; i
<ZM_VAP_PORT_NUMBER
; i
++)
730 int zfLnxVapOpen(struct net_device
*dev
)
734 vapId
= zfLnxGetVapId(dev
);
736 if (vap
[vapId
].openFlag
== 0)
738 vap
[vapId
].openFlag
= 1;
739 printk("zfLnxVapOpen : device name=%s, vap ID=%d\n", dev
->name
, vapId
);
740 zfiWlanSetSSID(dev
, "vap1", 4);
742 netif_start_queue(dev
);
746 printk("VAP opened error : vap ID=%d\n", vapId
);
751 int zfLnxVapClose(struct net_device
*dev
)
755 vapId
= zfLnxGetVapId(dev
);
759 if (vap
[vapId
].openFlag
== 1)
761 printk("zfLnxVapClose: device name=%s, vap ID=%d\n", dev
->name
, vapId
);
763 netif_stop_queue(dev
);
764 vap
[vapId
].openFlag
= 0;
768 printk("VAP port was not opened : vap ID=%d\n", vapId
);
774 int zfLnxVapXmitFrame(struct sk_buff
*skb
, struct net_device
*dev
)
776 int notify_stop
= FALSE
;
777 struct usbdrv_private
*macp
= dev
->ml_priv
;
780 vapId
= zfLnxGetVapId(dev
);
781 //printk("zfLnxVapXmitFrame: vap ID=%d\n", vapId);
782 //printk("zfLnxVapXmitFrame(), skb=%lxh\n", (u32_t)skb);
784 if (vapId
>= ZM_VAP_PORT_NUMBER
)
786 dev_kfree_skb_irq(skb
);
790 if (vap
[vapId
].openFlag
== 0)
792 dev_kfree_skb_irq(skb
);
798 zfiTxSendEth(dev
, skb
, 0x1);
800 macp
->drv_stats
.net_stats
.tx_bytes
+= skb
->len
;
801 macp
->drv_stats
.net_stats
.tx_packets
++;
803 //dev_kfree_skb_irq(skb);
806 netif_carrier_off(dev
);
807 netif_stop_queue(dev
);
813 static const struct net_device_ops vap_netdev_ops
= {
814 .ndo_open
= zfLnxVapOpen
,
815 .ndo_stop
= zfLnxVapClose
,
816 .ndo_start_xmit
= zfLnxVapXmitFrame
,
817 .ndo_get_stats
= usbdrv_get_stats
,
818 .ndo_change_mtu
= usbdrv_change_mtu
,
819 .ndo_validate_addr
= eth_validate_addr
,
820 .ndo_set_mac_address
= eth_mac_addr
,
821 #ifdef ZM_HOSTAPD_SUPPORT
822 .ndo_do_ioctl
= usbdrv_ioctl
,
824 .ndo_do_ioctl
= NULL
,
828 int zfLnxRegisterVapDev(struct net_device
* parentDev
, u16_t vapId
)
830 /* Allocate net device structure */
831 vap
[vapId
].dev
= alloc_etherdev(0);
832 printk("Register vap dev=%x\n", (u32_t
)vap
[vapId
].dev
);
834 if(vap
[vapId
].dev
== NULL
) {
835 printk("alloc_etherdev fail\n");
839 /* Setup the default settings */
840 ether_setup(vap
[vapId
].dev
);
843 memcpy(vap
[vapId
].dev
->dev_addr
, parentDev
->dev_addr
, ETH_ALEN
);
845 vap
[vapId
].dev
->irq
= parentDev
->irq
;
846 vap
[vapId
].dev
->base_addr
= parentDev
->base_addr
;
847 vap
[vapId
].dev
->mem_start
= parentDev
->mem_start
;
848 vap
[vapId
].dev
->mem_end
= parentDev
->mem_end
;
849 vap
[vapId
].dev
->ml_priv
= parentDev
->ml_priv
;
851 //dev->hard_start_xmit = &zd1212_wds_xmit_frame;
852 vap
[vapId
].dev
->netdev_ops
= &vap_netdev_ops
;
853 vap
[vapId
].dev
->destructor
= free_netdev
;
855 vap
[vapId
].dev
->tx_queue_len
= 0;
857 vap
[vapId
].dev
->dev_addr
[0] = parentDev
->dev_addr
[0];
858 vap
[vapId
].dev
->dev_addr
[1] = parentDev
->dev_addr
[1];
859 vap
[vapId
].dev
->dev_addr
[2] = parentDev
->dev_addr
[2];
860 vap
[vapId
].dev
->dev_addr
[3] = parentDev
->dev_addr
[3];
861 vap
[vapId
].dev
->dev_addr
[4] = parentDev
->dev_addr
[4];
862 vap
[vapId
].dev
->dev_addr
[5] = parentDev
->dev_addr
[5] + (vapId
+1);
864 /* Stop the network queue first */
865 netif_stop_queue(vap
[vapId
].dev
);
867 sprintf(vap
[vapId
].dev
->name
, "vap%d", vapId
);
868 printk("Register VAP dev success : %s\n", vap
[vapId
].dev
->name
);
870 if(register_netdevice(vap
[vapId
].dev
) != 0) {
871 printk("register VAP device fail\n");
872 vap
[vapId
].dev
= NULL
;
879 int zfLnxUnregisterVapDev(struct net_device
* parentDev
, u16_t vapId
)
883 printk("Unregister VAP dev : %s\n", vap
[vapId
].dev
->name
);
885 if(vap
[vapId
].dev
!= NULL
) {
886 printk("Unregister vap dev=%x\n", (u32_t
)vap
[vapId
].dev
);
888 //unregister_netdevice(wds[wdsId].dev);
889 unregister_netdev(vap
[vapId
].dev
);
891 printk("VAP unregister_netdevice\n");
892 vap
[vapId
].dev
= NULL
;
895 printk("unregister VAP device: %d fail\n", vapId
);
904 # define SUBMIT_URB(u,f) usb_submit_urb(u,f)
905 # define USB_ALLOC_URB(u,f) usb_alloc_urb(u,f)
907 //extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
909 extern int usbdrv_open(struct net_device
*dev
);
910 extern int usbdrv_close(struct net_device
*dev
);
911 extern int usbdrv_xmit_frame(struct sk_buff
*skb
, struct net_device
*dev
);
912 extern int usbdrv_xmit_frame(struct sk_buff
*skb
, struct net_device
*dev
);
913 extern int usbdrv_change_mtu(struct net_device
*dev
, int new_mtu
);
914 extern void usbdrv_set_multi(struct net_device
*dev
);
915 extern int usbdrv_set_mac(struct net_device
*dev
, void *addr
);
916 extern struct net_device_stats
* usbdrv_get_stats(struct net_device
*dev
);
917 extern int usbdrv_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
);
918 extern UsbTxQ_t
*zfLnxGetUsbTxBuffer(struct net_device
*dev
);
920 int zfLnxAllocAllUrbs(struct usbdrv_private
*macp
)
922 struct usb_interface
*interface
= macp
->interface
;
923 struct usb_host_interface
*iface_desc
= &interface
->altsetting
[0];
925 struct usb_endpoint_descriptor
*endpoint
;
928 /* descriptor matches, let's find the endpoints needed */
929 /* check out the endpoints */
930 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
)
932 endpoint
= &iface_desc
->endpoint
[i
].desc
;
933 if (usb_endpoint_is_bulk_in(endpoint
))
935 /* we found a bulk in endpoint */
936 printk(KERN_ERR
"bulk in: wMaxPacketSize = %x\n", le16_to_cpu(endpoint
->wMaxPacketSize
));
939 if (usb_endpoint_is_bulk_out(endpoint
))
941 /* we found a bulk out endpoint */
942 printk(KERN_ERR
"bulk out: wMaxPacketSize = %x\n", le16_to_cpu(endpoint
->wMaxPacketSize
));
945 if (usb_endpoint_is_int_in(endpoint
))
947 /* we found a interrupt in endpoint */
948 printk(KERN_ERR
"interrupt in: wMaxPacketSize = %x\n", le16_to_cpu(endpoint
->wMaxPacketSize
));
949 printk(KERN_ERR
"interrupt in: int_interval = %d\n", endpoint
->bInterval
);
952 if (usb_endpoint_is_int_out(endpoint
))
954 /* we found a interrupt out endpoint */
955 printk(KERN_ERR
"interrupt out: wMaxPacketSize = %x\n", le16_to_cpu(endpoint
->wMaxPacketSize
));
956 printk(KERN_ERR
"interrupt out: int_interval = %d\n", endpoint
->bInterval
);
960 /* Allocate all Tx URBs */
961 for (i
= 0; i
< ZM_MAX_TX_URB_NUM
; i
++)
963 macp
->WlanTxDataUrb
[i
] = USB_ALLOC_URB(0, GFP_KERNEL
);
965 if (macp
->WlanTxDataUrb
[i
] == 0)
970 for (j
= 0; j
< i
; j
++)
972 usb_free_urb(macp
->WlanTxDataUrb
[j
]);
979 /* Allocate all Rx URBs */
980 for (i
= 0; i
< ZM_MAX_RX_URB_NUM
; i
++)
982 macp
->WlanRxDataUrb
[i
] = USB_ALLOC_URB(0, GFP_KERNEL
);
984 if (macp
->WlanRxDataUrb
[i
] == 0)
989 for (j
= 0; j
< i
; j
++)
991 usb_free_urb(macp
->WlanRxDataUrb
[j
]);
994 for (j
= 0; j
< ZM_MAX_TX_URB_NUM
; j
++)
996 usb_free_urb(macp
->WlanTxDataUrb
[j
]);
1003 /* Allocate Register Read/Write USB */
1004 macp
->RegOutUrb
= USB_ALLOC_URB(0, GFP_KERNEL
);
1005 macp
->RegInUrb
= USB_ALLOC_URB(0, GFP_KERNEL
);
1010 void zfLnxFreeAllUrbs(struct usbdrv_private
*macp
)
1014 /* Free all Tx URBs */
1015 for (i
= 0; i
< ZM_MAX_TX_URB_NUM
; i
++)
1017 if (macp
->WlanTxDataUrb
[i
] != NULL
)
1019 usb_free_urb(macp
->WlanTxDataUrb
[i
]);
1023 /* Free all Rx URBs */
1024 for (i
= 0; i
< ZM_MAX_RX_URB_NUM
; i
++)
1026 if (macp
->WlanRxDataUrb
[i
] != NULL
)
1028 usb_free_urb(macp
->WlanRxDataUrb
[i
]);
1032 /* Free USB Register Read/Write URB */
1033 usb_free_urb(macp
->RegOutUrb
);
1034 usb_free_urb(macp
->RegInUrb
);
1037 void zfLnxUnlinkAllUrbs(struct usbdrv_private
*macp
)
1041 /* Unlink all Tx URBs */
1042 for (i
= 0; i
< ZM_MAX_TX_URB_NUM
; i
++)
1044 if (macp
->WlanTxDataUrb
[i
] != NULL
)
1046 usb_unlink_urb(macp
->WlanTxDataUrb
[i
]);
1050 /* Unlink all Rx URBs */
1051 for (i
= 0; i
< ZM_MAX_RX_URB_NUM
; i
++)
1053 if (macp
->WlanRxDataUrb
[i
] != NULL
)
1055 usb_unlink_urb(macp
->WlanRxDataUrb
[i
]);
1059 /* Unlink USB Register Read/Write URB */
1060 usb_unlink_urb(macp
->RegOutUrb
);
1062 usb_unlink_urb(macp
->RegInUrb
);
1065 static const struct net_device_ops otus_netdev_ops
= {
1066 .ndo_open
= usbdrv_open
,
1067 .ndo_stop
= usbdrv_close
,
1068 .ndo_start_xmit
= usbdrv_xmit_frame
,
1069 .ndo_change_mtu
= usbdrv_change_mtu
,
1070 .ndo_get_stats
= usbdrv_get_stats
,
1071 .ndo_set_multicast_list
= usbdrv_set_multi
,
1072 .ndo_set_mac_address
= usbdrv_set_mac
,
1073 .ndo_do_ioctl
= usbdrv_ioctl
,
1074 .ndo_validate_addr
= eth_validate_addr
,
1077 u8_t
zfLnxInitSetup(struct net_device
*dev
, struct usbdrv_private
*macp
)
1079 //unsigned char addr[6];
1081 //init_MUTEX(&macp->ps_sem);
1082 //init_MUTEX(&macp->reg_sem);
1083 //init_MUTEX(&macp->bcn_sem);
1084 //init_MUTEX(&macp->config_sem);
1086 spin_lock_init(&(macp
->cs_lock
));
1089 zfiWlanQueryMacAddress(dev
, addr
);
1090 dev
->dev_addr
[0] = addr
[0];
1091 dev
->dev_addr
[1] = addr
[1];
1092 dev
->dev_addr
[2] = addr
[2];
1093 dev
->dev_addr
[3] = addr
[3];
1094 dev
->dev_addr
[4] = addr
[4];
1095 dev
->dev_addr
[5] = addr
[5];
1097 dev
->wireless_handlers
= (struct iw_handler_def
*)&p80211wext_handler_def
;
1099 dev
->netdev_ops
= &otus_netdev_ops
;
1101 dev
->flags
|= IFF_MULTICAST
;
1103 dev
->dev_addr
[0] = 0x00;
1104 dev
->dev_addr
[1] = 0x03;
1105 dev
->dev_addr
[2] = 0x7f;
1106 dev
->dev_addr
[3] = 0x11;
1107 dev
->dev_addr
[4] = 0x22;
1108 dev
->dev_addr
[5] = 0x33;
1110 /* Initialize Heart Beat timer */
1111 init_timer(&macp
->hbTimer10ms
);
1112 macp
->hbTimer10ms
.data
= (unsigned long)dev
;
1113 macp
->hbTimer10ms
.function
= (void *)&zfLnx10msTimer
;
1115 /* Initialize WDS and VAP data structure */
1116 //zfInitWdsStruct();
1117 zfLnxInitVapStruct();
1122 u8_t
zfLnxClearStructs(struct net_device
*dev
)
1127 TxQCnt
= zfLnxCheckTxBufferCnt(dev
);
1129 printk(KERN_ERR
"TxQCnt: %d\n", TxQCnt
);
1131 for(ii
= 0; ii
< TxQCnt
; ii
++)
1133 UsbTxQ_t
*TxQ
= zfLnxGetUsbTxBuffer(dev
);
1135 printk(KERN_ERR
"dev_kfree_skb_any\n");
1137 dev_kfree_skb_any(TxQ
->buf
);