1 /******************************************************************************
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
27 ******************************************************************************/
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/kthread.h>
34 #include <linux/firmware.h>
35 #include "osdep_service.h"
36 #include "drv_types.h"
37 #include "xmit_osdep.h"
38 #include "recv_osdep.h"
39 #include "rtl871x_ioctl.h"
40 #include "usb_osintf.h"
42 MODULE_LICENSE("GPL");
43 MODULE_DESCRIPTION("rtl871x wireless lan driver");
44 MODULE_AUTHOR("Larry Finger");
46 static char ifname
[IFNAMSIZ
] = "wlan%d";
48 /* module param defaults */
49 static int chip_version
= RTL8712_2ndCUT
;
50 static int rfintfs
= HWPI
;
51 static int lbkmode
= RTL8712_AIR_TRX
;
52 static int hci
= RTL8712_USB
;
53 static int ampdu_enable
= 1;/*for enable tx_ampdu*/
55 /* The video_mode variable is for vedio mode.*/
56 /* It may be specify when inserting module with video_mode=1 parameter.*/
57 static int video_mode
= 1; /* enable video mode*/
59 /*Ndis802_11Infrastructure; infra, ad-hoc, auto*/
60 static int network_mode
= Ndis802_11IBSS
;
61 static int channel
= 1;/*ad-hoc support requirement*/
62 static int wireless_mode
= WIRELESS_11BG
;
63 static int vrtl_carrier_sense
= AUTO_VCS
;
64 static int vcs_type
= RTS_CTS
;
65 static int frag_thresh
= 2346;
66 static int preamble
= PREAMBLE_LONG
;/*long, short, auto*/
67 static int scan_mode
= 1;/*active, passive*/
68 static int adhoc_tx_pwr
= 1;
70 static int smart_ps
= 1;
71 static int power_mgnt
= PS_MODE_ACTIVE
;
72 static int radio_enable
= 1;
73 static int long_retry_lmt
= 7;
74 static int short_retry_lmt
= 7;
75 static int busy_thresh
= 40;
76 static int ack_policy
= NORMAL_ACK
;
78 static int software_encrypt
;
79 static int software_decrypt
;
81 static int wmm_enable
;/* default is set to disable the wmm.*/
82 static int uapsd_enable
;
83 static int uapsd_max_sp
= NO_LIMIT
;
84 static int uapsd_acbk_en
;
85 static int uapsd_acbe_en
;
86 static int uapsd_acvi_en
;
87 static int uapsd_acvo_en
;
89 static int ht_enable
= 1;
90 static int cbw40_enable
= 1;
91 static int rf_config
= RTL8712_RF_1T2R
; /* 1T2R*/
93 /* mac address to use instead of the one stored in Efuse */
96 /* if wifi_test = 1, driver will disable the turbo mode and pass it to
99 static int wifi_test
= 0;
101 module_param_string(ifname
, ifname
, sizeof(ifname
), S_IRUGO
|S_IWUSR
);
102 module_param(wifi_test
, int, 0644);
103 module_param(initmac
, charp
, 0644);
104 module_param(video_mode
, int, 0644);
105 module_param(chip_version
, int, 0644);
106 module_param(rfintfs
, int, 0644);
107 module_param(lbkmode
, int, 0644);
108 module_param(hci
, int, 0644);
109 module_param(network_mode
, int, 0644);
110 module_param(channel
, int, 0644);
111 module_param(mp_mode
, int, 0644);
112 module_param(wmm_enable
, int, 0644);
113 module_param(vrtl_carrier_sense
, int, 0644);
114 module_param(vcs_type
, int, 0644);
115 module_param(busy_thresh
, int, 0644);
116 module_param(ht_enable
, int, 0644);
117 module_param(cbw40_enable
, int, 0644);
118 module_param(ampdu_enable
, int, 0644);
119 module_param(rf_config
, int, 0644);
120 module_param(power_mgnt
, int, 0644);
121 module_param(low_power
, int, 0644);
123 MODULE_PARM_DESC(ifname
, " Net interface name, wlan%d=default");
124 MODULE_PARM_DESC(initmac
, "MAC-Address, default: use FUSE");
126 static uint
loadparam(struct _adapter
*padapter
, struct net_device
*pnetdev
);
127 static int netdev_open(struct net_device
*pnetdev
);
128 static int netdev_close(struct net_device
*pnetdev
);
130 static uint
loadparam(struct _adapter
*padapter
, struct net_device
*pnetdev
)
132 uint status
= _SUCCESS
;
133 struct registry_priv
*registry_par
= &padapter
->registrypriv
;
135 registry_par
->chip_version
= (u8
)chip_version
;
136 registry_par
->rfintfs
= (u8
)rfintfs
;
137 registry_par
->lbkmode
= (u8
)lbkmode
;
138 registry_par
->hci
= (u8
)hci
;
139 registry_par
->network_mode
= (u8
)network_mode
;
140 memcpy(registry_par
->ssid
.Ssid
, "ANY", 3);
141 registry_par
->ssid
.SsidLength
= 3;
142 registry_par
->channel
= (u8
)channel
;
143 registry_par
->wireless_mode
= (u8
)wireless_mode
;
144 registry_par
->vrtl_carrier_sense
= (u8
)vrtl_carrier_sense
;
145 registry_par
->vcs_type
= (u8
)vcs_type
;
146 registry_par
->frag_thresh
= (u16
)frag_thresh
;
147 registry_par
->preamble
= (u8
)preamble
;
148 registry_par
->scan_mode
= (u8
)scan_mode
;
149 registry_par
->adhoc_tx_pwr
= (u8
)adhoc_tx_pwr
;
150 registry_par
->soft_ap
= (u8
)soft_ap
;
151 registry_par
->smart_ps
= (u8
)smart_ps
;
152 registry_par
->power_mgnt
= (u8
)power_mgnt
;
153 registry_par
->radio_enable
= (u8
)radio_enable
;
154 registry_par
->long_retry_lmt
= (u8
)long_retry_lmt
;
155 registry_par
->short_retry_lmt
= (u8
)short_retry_lmt
;
156 registry_par
->busy_thresh
= (u16
)busy_thresh
;
157 registry_par
->ack_policy
= (u8
)ack_policy
;
158 registry_par
->mp_mode
= (u8
)mp_mode
;
159 registry_par
->software_encrypt
= (u8
)software_encrypt
;
160 registry_par
->software_decrypt
= (u8
)software_decrypt
;
162 registry_par
->wmm_enable
= (u8
)wmm_enable
;
163 registry_par
->uapsd_enable
= (u8
)uapsd_enable
;
164 registry_par
->uapsd_max_sp
= (u8
)uapsd_max_sp
;
165 registry_par
->uapsd_acbk_en
= (u8
)uapsd_acbk_en
;
166 registry_par
->uapsd_acbe_en
= (u8
)uapsd_acbe_en
;
167 registry_par
->uapsd_acvi_en
= (u8
)uapsd_acvi_en
;
168 registry_par
->uapsd_acvo_en
= (u8
)uapsd_acvo_en
;
169 registry_par
->ht_enable
= (u8
)ht_enable
;
170 registry_par
->cbw40_enable
= (u8
)cbw40_enable
;
171 registry_par
->ampdu_enable
= (u8
)ampdu_enable
;
172 registry_par
->rf_config
= (u8
)rf_config
;
173 registry_par
->low_power
= (u8
)low_power
;
174 registry_par
->wifi_test
= (u8
) wifi_test
;
175 r8712_initmac
= initmac
;
179 static int r871x_net_set_mac_address(struct net_device
*pnetdev
, void *p
)
181 struct _adapter
*padapter
= (struct _adapter
*)netdev_priv(pnetdev
);
182 struct sockaddr
*addr
= p
;
184 if (padapter
->bup
== false)
185 memcpy(pnetdev
->dev_addr
, addr
->sa_data
, ETH_ALEN
);
189 static struct net_device_stats
*r871x_net_get_stats(struct net_device
*pnetdev
)
191 struct _adapter
*padapter
= (struct _adapter
*) netdev_priv(pnetdev
);
192 struct xmit_priv
*pxmitpriv
= &(padapter
->xmitpriv
);
193 struct recv_priv
*precvpriv
= &(padapter
->recvpriv
);
195 padapter
->stats
.tx_packets
= pxmitpriv
->tx_pkts
;
196 padapter
->stats
.rx_packets
= precvpriv
->rx_pkts
;
197 padapter
->stats
.tx_dropped
= pxmitpriv
->tx_drop
;
198 padapter
->stats
.rx_dropped
= precvpriv
->rx_drop
;
199 padapter
->stats
.tx_bytes
= pxmitpriv
->tx_bytes
;
200 padapter
->stats
.rx_bytes
= precvpriv
->rx_bytes
;
201 return &padapter
->stats
;
204 static const struct net_device_ops rtl8712_netdev_ops
= {
205 .ndo_open
= netdev_open
,
206 .ndo_stop
= netdev_close
,
207 .ndo_start_xmit
= r8712_xmit_entry
,
208 .ndo_set_mac_address
= r871x_net_set_mac_address
,
209 .ndo_get_stats
= r871x_net_get_stats
,
210 .ndo_do_ioctl
= r871x_ioctl
,
213 struct net_device
*r8712_init_netdev(void)
215 struct _adapter
*padapter
;
216 struct net_device
*pnetdev
;
218 pnetdev
= alloc_etherdev(sizeof(struct _adapter
));
221 if (dev_alloc_name(pnetdev
, ifname
) < 0) {
222 strcpy(ifname
, "wlan%d");
223 dev_alloc_name(pnetdev
, ifname
);
225 padapter
= (struct _adapter
*) netdev_priv(pnetdev
);
226 padapter
->pnetdev
= pnetdev
;
227 printk(KERN_INFO
"r8712u: register rtl8712_netdev_ops to"
229 pnetdev
->netdev_ops
= &rtl8712_netdev_ops
;
230 pnetdev
->watchdog_timeo
= HZ
; /* 1 second timeout */
231 pnetdev
->wireless_handlers
= (struct iw_handler_def
*)
234 loadparam(padapter
, pnetdev
);
235 netif_carrier_off(pnetdev
);
236 padapter
->pid
= 0; /* Initial the PID value used for HW PBC.*/
240 static u32
start_drv_threads(struct _adapter
*padapter
)
242 padapter
->cmdThread
= kthread_run(r8712_cmd_thread
, padapter
,
243 padapter
->pnetdev
->name
);
244 if (IS_ERR(padapter
->cmdThread
) < 0)
249 void r8712_stop_drv_threads(struct _adapter
*padapter
)
251 /*Below is to termindate r8712_cmd_thread & event_thread...*/
252 up(&padapter
->cmdpriv
.cmd_queue_sema
);
253 if (padapter
->cmdThread
)
254 _down_sema(&padapter
->cmdpriv
.terminate_cmdthread_sema
);
255 padapter
->cmdpriv
.cmd_seq
= 1;
258 static void start_drv_timers(struct _adapter
*padapter
)
260 _set_timer(&padapter
->mlmepriv
.sitesurveyctrl
.sitesurvey_ctrl_timer
,
262 _set_timer(&padapter
->mlmepriv
.wdg_timer
, 2000);
265 void r8712_stop_drv_timers(struct _adapter
*padapter
)
267 _cancel_timer_ex(&padapter
->mlmepriv
.assoc_timer
);
268 _cancel_timer_ex(&padapter
->securitypriv
.tkip_timer
);
269 _cancel_timer_ex(&padapter
->mlmepriv
.scan_to_timer
);
270 _cancel_timer_ex(&padapter
->mlmepriv
.dhcp_timer
);
271 _cancel_timer_ex(&padapter
->mlmepriv
.wdg_timer
);
272 _cancel_timer_ex(&padapter
->mlmepriv
.sitesurveyctrl
.
273 sitesurvey_ctrl_timer
);
276 static u8
init_default_value(struct _adapter
*padapter
)
279 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
280 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
281 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
282 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
285 pxmitpriv
->vcs_setting
= pregistrypriv
->vrtl_carrier_sense
;
286 pxmitpriv
->vcs
= pregistrypriv
->vcs_type
;
287 pxmitpriv
->vcs_type
= pregistrypriv
->vcs_type
;
288 pxmitpriv
->rts_thresh
= pregistrypriv
->rts_thresh
;
289 pxmitpriv
->frag_len
= pregistrypriv
->frag_thresh
;
291 /* Maybe someday we should rename this variable to "active_mode"(Jeff)*/
292 pmlmepriv
->passive_mode
= 1; /* 1: active, 0: passive. */
296 struct ht_priv
*phtpriv
= &pmlmepriv
->htpriv
;
298 phtpriv
->ampdu_enable
= false;/*set to disabled*/
299 for (i
= 0; i
< 16; i
++)
300 phtpriv
->baddbareq_issued
[i
] = false;
303 psecuritypriv
->sw_encrypt
= pregistrypriv
->software_encrypt
;
304 psecuritypriv
->sw_decrypt
= pregistrypriv
->software_decrypt
;
305 psecuritypriv
->binstallGrpkey
= _FAIL
;
308 r8712_init_registrypriv_dev_network(padapter
);
309 r8712_update_registrypriv_dev_network(padapter
);
314 u8
r8712_init_drv_sw(struct _adapter
*padapter
)
316 if ((r8712_init_cmd_priv(&padapter
->cmdpriv
)) == _FAIL
)
318 padapter
->cmdpriv
.padapter
= padapter
;
319 if ((r8712_init_evt_priv(&padapter
->evtpriv
)) == _FAIL
)
321 if (r8712_init_mlme_priv(padapter
) == _FAIL
)
323 _r8712_init_xmit_priv(&padapter
->xmitpriv
, padapter
);
324 _r8712_init_recv_priv(&padapter
->recvpriv
, padapter
);
325 memset((unsigned char *)&padapter
->securitypriv
, 0,
326 sizeof(struct security_priv
));
327 _init_timer(&(padapter
->securitypriv
.tkip_timer
), padapter
->pnetdev
,
328 r8712_use_tkipkey_handler
, padapter
);
329 _r8712_init_sta_priv(&padapter
->stapriv
);
330 padapter
->stapriv
.padapter
= padapter
;
331 r8712_init_bcmc_stainfo(padapter
);
332 r8712_init_pwrctrl_priv(padapter
);
333 sema_init(&(padapter
->pwrctrlpriv
.pnp_pwr_mgnt_sema
), 0);
334 mp871xinit(padapter
);
335 if (init_default_value(padapter
) != _SUCCESS
)
337 r8712_InitSwLeds(padapter
);
341 u8
r8712_free_drv_sw(struct _adapter
*padapter
)
343 struct net_device
*pnetdev
= (struct net_device
*)padapter
->pnetdev
;
345 r8712_free_cmd_priv(&padapter
->cmdpriv
);
346 r8712_free_evt_priv(&padapter
->evtpriv
);
347 r8712_DeInitSwLeds(padapter
);
348 r8712_free_mlme_priv(&padapter
->mlmepriv
);
349 r8712_free_io_queue(padapter
);
350 _free_xmit_priv(&padapter
->xmitpriv
);
351 if (padapter
->fw_found
)
352 _r8712_free_sta_priv(&padapter
->stapriv
);
353 _r8712_free_recv_priv(&padapter
->recvpriv
);
354 mp871xdeinit(padapter
);
356 free_netdev(pnetdev
);
361 static void enable_video_mode(struct _adapter
*padapter
, int cbw40_value
)
364 * 1 -> enable video mode to 96B AP
365 * 0 -> disable video mode to 96B AP
367 * 1 -> enable 40MHz mode
368 * 0 -> disable 40MHz mode
373 u32 intcmd
= 0xf4000500; /* enable bit8, bit10*/
376 /* if the driver supports the 40M bandwidth,
377 * we can enable the bit 9.*/
380 r8712_fw_cmd(padapter
, intcmd
);
385 * This function intends to handle the activation of an interface
386 * i.e. when it is brought Up/Active from a Down state.
389 static int netdev_open(struct net_device
*pnetdev
)
391 struct _adapter
*padapter
= (struct _adapter
*)netdev_priv(pnetdev
);
393 mutex_lock(&padapter
->mutex_start
);
394 if (padapter
->bup
== false) {
395 padapter
->bDriverStopped
= false;
396 padapter
->bSurpriseRemoved
= false;
397 padapter
->bup
= true;
398 if (rtl871x_hal_init(padapter
) != _SUCCESS
)
399 goto netdev_open_error
;
400 if (r8712_initmac
== NULL
)
401 /* Use the mac address stored in the Efuse */
402 memcpy(pnetdev
->dev_addr
,
403 padapter
->eeprompriv
.mac_addr
, ETH_ALEN
);
405 /* We have to inform f/w to use user-supplied MAC
409 r8712_setMacAddr_cmd(padapter
, (u8
*)pnetdev
->dev_addr
);
411 * The "myid" function will get the wifi mac address
412 * from eeprompriv structure instead of netdev
413 * structure. So, we have to overwrite the mac_addr
414 * stored in the eeprompriv structure. In this case,
415 * the real mac address won't be used anymore. So that,
416 * the eeprompriv.mac_addr should store the mac which
419 memcpy(padapter
->eeprompriv
.mac_addr
,
420 pnetdev
->dev_addr
, ETH_ALEN
);
422 if (start_drv_threads(padapter
) != _SUCCESS
)
423 goto netdev_open_error
;
424 if (padapter
->dvobjpriv
.inirp_init
== NULL
)
425 goto netdev_open_error
;
427 padapter
->dvobjpriv
.inirp_init(padapter
);
428 r8712_set_ps_mode(padapter
, padapter
->registrypriv
.power_mgnt
,
429 padapter
->registrypriv
.smart_ps
);
431 if (!netif_queue_stopped(pnetdev
))
432 netif_start_queue(pnetdev
);
434 netif_wake_queue(pnetdev
);
437 enable_video_mode(padapter
, cbw40_enable
);
438 /* start driver mlme relation timer */
439 start_drv_timers(padapter
);
440 padapter
->ledpriv
.LedControlHandler(padapter
, LED_CTL_NO_LINK
);
441 mutex_unlock(&padapter
->mutex_start
);
444 padapter
->bup
= false;
445 netif_carrier_off(pnetdev
);
446 netif_stop_queue(pnetdev
);
447 mutex_unlock(&padapter
->mutex_start
);
453 * This function intends to handle the shutdown of an interface
454 * i.e. when it is brought Down from an Up/Active state.
457 static int netdev_close(struct net_device
*pnetdev
)
459 struct _adapter
*padapter
= (struct _adapter
*) netdev_priv(pnetdev
);
462 padapter
->ledpriv
.LedControlHandler(padapter
, LED_CTL_POWER_OFF
);
467 if (!netif_queue_stopped(pnetdev
))
468 netif_stop_queue(pnetdev
);
471 /*s2-1. issue disassoc_cmd to fw*/
472 r8712_disassoc_cmd(padapter
);
473 /*s2-2. indicate disconnect to os*/
474 r8712_ind_disconnect(padapter
);
476 r8712_free_assoc_resources(padapter
);
478 r8712_free_network_queue(padapter
);
482 #include "mlme_osdep.h"