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/kthread.h>
33 #include <linux/firmware.h>
34 #include "osdep_service.h"
35 #include "drv_types.h"
36 #include "xmit_osdep.h"
37 #include "recv_osdep.h"
38 #include "rtl871x_ioctl.h"
39 #include "usb_osintf.h"
41 MODULE_LICENSE("GPL");
42 MODULE_DESCRIPTION("rtl871x wireless lan driver");
43 MODULE_AUTHOR("Larry Finger");
45 static char ifname
[IFNAMSIZ
] = "wlan%d";
47 /* module param defaults */
48 static int chip_version
= RTL8712_2ndCUT
;
49 static int rfintfs
= HWPI
;
50 static int lbkmode
= RTL8712_AIR_TRX
;
51 static int hci
= RTL8712_USB
;
52 static int ampdu_enable
= 1;/*for enable tx_ampdu*/
54 /* The video_mode variable is for video mode.*/
55 /* It may be specify when inserting module with video_mode=1 parameter.*/
56 static int video_mode
= 1; /* enable video mode*/
58 /*Ndis802_11Infrastructure; infra, ad-hoc, auto*/
59 static int network_mode
= Ndis802_11IBSS
;
60 static int channel
= 1;/*ad-hoc support requirement*/
61 static int wireless_mode
= WIRELESS_11BG
;
62 static int vrtl_carrier_sense
= AUTO_VCS
;
63 static int vcs_type
= RTS_CTS
;
64 static int frag_thresh
= 2346;
65 static int preamble
= PREAMBLE_LONG
;/*long, short, auto*/
66 static int scan_mode
= 1;/*active, passive*/
67 static int adhoc_tx_pwr
= 1;
69 static int smart_ps
= 1;
70 static int power_mgnt
= PS_MODE_ACTIVE
;
71 static int radio_enable
= 1;
72 static int long_retry_lmt
= 7;
73 static int short_retry_lmt
= 7;
74 static int busy_thresh
= 40;
75 static int ack_policy
= NORMAL_ACK
;
77 static int software_encrypt
;
78 static int software_decrypt
;
80 static int wmm_enable
;/* default is set to disable the wmm.*/
81 static int uapsd_enable
;
82 static int uapsd_max_sp
= NO_LIMIT
;
83 static int uapsd_acbk_en
;
84 static int uapsd_acbe_en
;
85 static int uapsd_acvi_en
;
86 static int uapsd_acvo_en
;
88 static int ht_enable
= 1;
89 static int cbw40_enable
= 1;
90 static int rf_config
= RTL8712_RF_1T2R
; /* 1T2R*/
92 /* mac address to use instead of the one stored in Efuse */
95 /* if wifi_test = 1, driver will disable the turbo mode and pass it to
100 module_param_string(ifname
, ifname
, sizeof(ifname
), S_IRUGO
| S_IWUSR
);
101 module_param(wifi_test
, int, 0644);
102 module_param(initmac
, charp
, 0644);
103 module_param(video_mode
, int, 0644);
104 module_param(chip_version
, int, 0644);
105 module_param(rfintfs
, int, 0644);
106 module_param(lbkmode
, int, 0644);
107 module_param(hci
, int, 0644);
108 module_param(network_mode
, int, 0644);
109 module_param(channel
, int, 0644);
110 module_param(mp_mode
, int, 0644);
111 module_param(wmm_enable
, int, 0644);
112 module_param(vrtl_carrier_sense
, int, 0644);
113 module_param(vcs_type
, int, 0644);
114 module_param(busy_thresh
, int, 0644);
115 module_param(ht_enable
, int, 0644);
116 module_param(cbw40_enable
, int, 0644);
117 module_param(ampdu_enable
, int, 0644);
118 module_param(rf_config
, int, 0644);
119 module_param(power_mgnt
, int, 0644);
120 module_param(low_power
, int, 0644);
122 MODULE_PARM_DESC(ifname
, " Net interface name, wlan%d=default");
123 MODULE_PARM_DESC(initmac
, "MAC-Address, default: use FUSE");
125 static int netdev_open(struct net_device
*pnetdev
);
126 static int netdev_close(struct net_device
*pnetdev
);
128 static void loadparam(struct _adapter
*padapter
, struct net_device
*pnetdev
)
130 struct registry_priv
*registry_par
= &padapter
->registrypriv
;
132 registry_par
->chip_version
= (u8
)chip_version
;
133 registry_par
->rfintfs
= (u8
)rfintfs
;
134 registry_par
->lbkmode
= (u8
)lbkmode
;
135 registry_par
->hci
= (u8
)hci
;
136 registry_par
->network_mode
= (u8
)network_mode
;
137 memcpy(registry_par
->ssid
.Ssid
, "ANY", 3);
138 registry_par
->ssid
.SsidLength
= 3;
139 registry_par
->channel
= (u8
)channel
;
140 registry_par
->wireless_mode
= (u8
)wireless_mode
;
141 registry_par
->vrtl_carrier_sense
= (u8
)vrtl_carrier_sense
;
142 registry_par
->vcs_type
= (u8
)vcs_type
;
143 registry_par
->frag_thresh
= (u16
)frag_thresh
;
144 registry_par
->preamble
= (u8
)preamble
;
145 registry_par
->scan_mode
= (u8
)scan_mode
;
146 registry_par
->adhoc_tx_pwr
= (u8
)adhoc_tx_pwr
;
147 registry_par
->soft_ap
= (u8
)soft_ap
;
148 registry_par
->smart_ps
= (u8
)smart_ps
;
149 registry_par
->power_mgnt
= (u8
)power_mgnt
;
150 registry_par
->radio_enable
= (u8
)radio_enable
;
151 registry_par
->long_retry_lmt
= (u8
)long_retry_lmt
;
152 registry_par
->short_retry_lmt
= (u8
)short_retry_lmt
;
153 registry_par
->busy_thresh
= (u16
)busy_thresh
;
154 registry_par
->ack_policy
= (u8
)ack_policy
;
155 registry_par
->mp_mode
= (u8
)mp_mode
;
156 registry_par
->software_encrypt
= (u8
)software_encrypt
;
157 registry_par
->software_decrypt
= (u8
)software_decrypt
;
159 registry_par
->wmm_enable
= (u8
)wmm_enable
;
160 registry_par
->uapsd_enable
= (u8
)uapsd_enable
;
161 registry_par
->uapsd_max_sp
= (u8
)uapsd_max_sp
;
162 registry_par
->uapsd_acbk_en
= (u8
)uapsd_acbk_en
;
163 registry_par
->uapsd_acbe_en
= (u8
)uapsd_acbe_en
;
164 registry_par
->uapsd_acvi_en
= (u8
)uapsd_acvi_en
;
165 registry_par
->uapsd_acvo_en
= (u8
)uapsd_acvo_en
;
166 registry_par
->ht_enable
= (u8
)ht_enable
;
167 registry_par
->cbw40_enable
= (u8
)cbw40_enable
;
168 registry_par
->ampdu_enable
= (u8
)ampdu_enable
;
169 registry_par
->rf_config
= (u8
)rf_config
;
170 registry_par
->low_power
= (u8
)low_power
;
171 registry_par
->wifi_test
= (u8
) wifi_test
;
172 r8712_initmac
= initmac
;
175 static int r871x_net_set_mac_address(struct net_device
*pnetdev
, void *p
)
177 struct _adapter
*padapter
= netdev_priv(pnetdev
);
178 struct sockaddr
*addr
= p
;
181 ether_addr_copy(pnetdev
->dev_addr
, addr
->sa_data
);
185 static struct net_device_stats
*r871x_net_get_stats(struct net_device
*pnetdev
)
187 struct _adapter
*padapter
= netdev_priv(pnetdev
);
188 struct xmit_priv
*pxmitpriv
= &(padapter
->xmitpriv
);
189 struct recv_priv
*precvpriv
= &(padapter
->recvpriv
);
191 padapter
->stats
.tx_packets
= pxmitpriv
->tx_pkts
;
192 padapter
->stats
.rx_packets
= precvpriv
->rx_pkts
;
193 padapter
->stats
.tx_dropped
= pxmitpriv
->tx_drop
;
194 padapter
->stats
.rx_dropped
= precvpriv
->rx_drop
;
195 padapter
->stats
.tx_bytes
= pxmitpriv
->tx_bytes
;
196 padapter
->stats
.rx_bytes
= precvpriv
->rx_bytes
;
197 return &padapter
->stats
;
200 static const struct net_device_ops rtl8712_netdev_ops
= {
201 .ndo_open
= netdev_open
,
202 .ndo_stop
= netdev_close
,
203 .ndo_start_xmit
= r8712_xmit_entry
,
204 .ndo_set_mac_address
= r871x_net_set_mac_address
,
205 .ndo_get_stats
= r871x_net_get_stats
,
206 .ndo_do_ioctl
= r871x_ioctl
,
209 struct net_device
*r8712_init_netdev(void)
211 struct _adapter
*padapter
;
212 struct net_device
*pnetdev
;
214 pnetdev
= alloc_etherdev(sizeof(struct _adapter
));
217 if (dev_alloc_name(pnetdev
, ifname
) < 0) {
218 strcpy(ifname
, "wlan%d");
219 dev_alloc_name(pnetdev
, ifname
);
221 padapter
= netdev_priv(pnetdev
);
222 padapter
->pnetdev
= pnetdev
;
223 pr_info("r8712u: register rtl8712_netdev_ops to netdev_ops\n");
224 pnetdev
->netdev_ops
= &rtl8712_netdev_ops
;
225 pnetdev
->watchdog_timeo
= HZ
; /* 1 second timeout */
226 pnetdev
->wireless_handlers
= (struct iw_handler_def
*)
228 loadparam(padapter
, pnetdev
);
229 netif_carrier_off(pnetdev
);
230 padapter
->pid
= 0; /* Initial the PID value used for HW PBC.*/
234 static u32
start_drv_threads(struct _adapter
*padapter
)
236 padapter
->cmdThread
= kthread_run(r8712_cmd_thread
, padapter
, "%s",
237 padapter
->pnetdev
->name
);
238 if (IS_ERR(padapter
->cmdThread
))
243 void r8712_stop_drv_threads(struct _adapter
*padapter
)
245 /*Below is to terminate r8712_cmd_thread & event_thread...*/
246 up(&padapter
->cmdpriv
.cmd_queue_sema
);
247 if (padapter
->cmdThread
)
248 _down_sema(&padapter
->cmdpriv
.terminate_cmdthread_sema
);
249 padapter
->cmdpriv
.cmd_seq
= 1;
252 static void start_drv_timers(struct _adapter
*padapter
)
254 mod_timer(&padapter
->mlmepriv
.sitesurveyctrl
.sitesurvey_ctrl_timer
,
255 jiffies
+ msecs_to_jiffies(5000));
256 mod_timer(&padapter
->mlmepriv
.wdg_timer
,
257 jiffies
+ msecs_to_jiffies(2000));
260 void r8712_stop_drv_timers(struct _adapter
*padapter
)
262 del_timer_sync(&padapter
->mlmepriv
.assoc_timer
);
263 del_timer_sync(&padapter
->securitypriv
.tkip_timer
);
264 del_timer_sync(&padapter
->mlmepriv
.scan_to_timer
);
265 del_timer_sync(&padapter
->mlmepriv
.dhcp_timer
);
266 del_timer_sync(&padapter
->mlmepriv
.wdg_timer
);
267 del_timer_sync(&padapter
->mlmepriv
.sitesurveyctrl
.sitesurvey_ctrl_timer
);
270 static u8
init_default_value(struct _adapter
*padapter
)
273 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
274 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
275 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
276 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
279 pxmitpriv
->vcs_setting
= pregistrypriv
->vrtl_carrier_sense
;
280 pxmitpriv
->vcs
= pregistrypriv
->vcs_type
;
281 pxmitpriv
->vcs_type
= pregistrypriv
->vcs_type
;
282 pxmitpriv
->rts_thresh
= pregistrypriv
->rts_thresh
;
283 pxmitpriv
->frag_len
= pregistrypriv
->frag_thresh
;
285 /* Maybe someday we should rename this variable to "active_mode"(Jeff)*/
286 pmlmepriv
->passive_mode
= 1; /* 1: active, 0: passive. */
290 struct ht_priv
*phtpriv
= &pmlmepriv
->htpriv
;
292 phtpriv
->ampdu_enable
= false;/*set to disabled*/
293 for (i
= 0; i
< 16; i
++)
294 phtpriv
->baddbareq_issued
[i
] = false;
297 psecuritypriv
->sw_encrypt
= pregistrypriv
->software_encrypt
;
298 psecuritypriv
->sw_decrypt
= pregistrypriv
->software_decrypt
;
299 psecuritypriv
->binstallGrpkey
= _FAIL
;
302 r8712_init_registrypriv_dev_network(padapter
);
303 r8712_update_registrypriv_dev_network(padapter
);
308 u8
r8712_init_drv_sw(struct _adapter
*padapter
)
310 if ((r8712_init_cmd_priv(&padapter
->cmdpriv
)) == _FAIL
)
312 padapter
->cmdpriv
.padapter
= padapter
;
313 if ((r8712_init_evt_priv(&padapter
->evtpriv
)) == _FAIL
)
315 if (r8712_init_mlme_priv(padapter
) == _FAIL
)
317 _r8712_init_xmit_priv(&padapter
->xmitpriv
, padapter
);
318 _r8712_init_recv_priv(&padapter
->recvpriv
, padapter
);
319 memset((unsigned char *)&padapter
->securitypriv
, 0,
320 sizeof(struct security_priv
));
321 setup_timer(&padapter
->securitypriv
.tkip_timer
,
322 r8712_use_tkipkey_handler
, (unsigned long)padapter
);
323 _r8712_init_sta_priv(&padapter
->stapriv
);
324 padapter
->stapriv
.padapter
= padapter
;
325 r8712_init_bcmc_stainfo(padapter
);
326 r8712_init_pwrctrl_priv(padapter
);
327 mp871xinit(padapter
);
328 if (init_default_value(padapter
) != _SUCCESS
)
330 r8712_InitSwLeds(padapter
);
334 u8
r8712_free_drv_sw(struct _adapter
*padapter
)
336 struct net_device
*pnetdev
= padapter
->pnetdev
;
338 r8712_free_cmd_priv(&padapter
->cmdpriv
);
339 r8712_free_evt_priv(&padapter
->evtpriv
);
340 r8712_DeInitSwLeds(padapter
);
341 r8712_free_mlme_priv(&padapter
->mlmepriv
);
342 r8712_free_io_queue(padapter
);
343 _free_xmit_priv(&padapter
->xmitpriv
);
344 _r8712_free_sta_priv(&padapter
->stapriv
);
345 _r8712_free_recv_priv(&padapter
->recvpriv
);
346 mp871xdeinit(padapter
);
348 free_netdev(pnetdev
);
353 static void enable_video_mode(struct _adapter
*padapter
, int cbw40_value
)
356 * 1 -> enable video mode to 96B AP
357 * 0 -> disable video mode to 96B AP
359 * 1 -> enable 40MHz mode
360 * 0 -> disable 40MHz mode
365 u32 intcmd
= 0xf4000500; /* enable bit8, bit10*/
368 /* if the driver supports the 40M bandwidth,
369 * we can enable the bit 9.
373 r8712_fw_cmd(padapter
, intcmd
);
378 * This function intends to handle the activation of an interface
379 * i.e. when it is brought Up/Active from a Down state.
382 static int netdev_open(struct net_device
*pnetdev
)
384 struct _adapter
*padapter
= netdev_priv(pnetdev
);
386 mutex_lock(&padapter
->mutex_start
);
387 if (!padapter
->bup
) {
388 padapter
->bDriverStopped
= false;
389 padapter
->bSurpriseRemoved
= false;
390 padapter
->bup
= true;
391 if (rtl871x_hal_init(padapter
) != _SUCCESS
)
392 goto netdev_open_error
;
393 if (r8712_initmac
== NULL
)
394 /* Use the mac address stored in the Efuse */
395 memcpy(pnetdev
->dev_addr
,
396 padapter
->eeprompriv
.mac_addr
, ETH_ALEN
);
398 /* We have to inform f/w to use user-supplied MAC
402 r8712_setMacAddr_cmd(padapter
, (u8
*)pnetdev
->dev_addr
);
404 * The "myid" function will get the wifi mac address
405 * from eeprompriv structure instead of netdev
406 * structure. So, we have to overwrite the mac_addr
407 * stored in the eeprompriv structure. In this case,
408 * the real mac address won't be used anymore. So that,
409 * the eeprompriv.mac_addr should store the mac which
412 memcpy(padapter
->eeprompriv
.mac_addr
,
413 pnetdev
->dev_addr
, ETH_ALEN
);
415 if (start_drv_threads(padapter
) != _SUCCESS
)
416 goto netdev_open_error
;
417 if (padapter
->dvobjpriv
.inirp_init
== NULL
)
418 goto netdev_open_error
;
420 padapter
->dvobjpriv
.inirp_init(padapter
);
421 r8712_set_ps_mode(padapter
, padapter
->registrypriv
.power_mgnt
,
422 padapter
->registrypriv
.smart_ps
);
424 if (!netif_queue_stopped(pnetdev
))
425 netif_start_queue(pnetdev
);
427 netif_wake_queue(pnetdev
);
430 enable_video_mode(padapter
, cbw40_enable
);
431 /* start driver mlme relation timer */
432 start_drv_timers(padapter
);
433 padapter
->ledpriv
.LedControlHandler(padapter
, LED_CTL_NO_LINK
);
434 mutex_unlock(&padapter
->mutex_start
);
437 padapter
->bup
= false;
438 netif_carrier_off(pnetdev
);
439 netif_stop_queue(pnetdev
);
440 mutex_unlock(&padapter
->mutex_start
);
446 * This function intends to handle the shutdown of an interface
447 * i.e. when it is brought Down from an Up/Active state.
450 static int netdev_close(struct net_device
*pnetdev
)
452 struct _adapter
*padapter
= netdev_priv(pnetdev
);
455 padapter
->ledpriv
.LedControlHandler(padapter
, LED_CTL_POWER_OFF
);
460 if (!netif_queue_stopped(pnetdev
))
461 netif_stop_queue(pnetdev
);
464 /*s2-1. issue disassoc_cmd to fw*/
465 r8712_disassoc_cmd(padapter
);
466 /*s2-2. indicate disconnect to os*/
467 r8712_ind_disconnect(padapter
);
469 r8712_free_assoc_resources(padapter
);
471 r8712_free_network_queue(padapter
);
475 #include "mlme_osdep.h"