1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
3 * Linux device driver for RTL8192U
5 * Based on the r8187 driver, which is:
6 * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
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 * The full GNU General Public License is included in this distribution in the
21 * file called LICENSE.
23 * Contact Information:
24 * Jerry chuang <wlanfae@realtek.com>
27 #ifndef CONFIG_FORCE_HARD_FLOAT
28 double __floatsidf(int i)
33 unsigned int __fixunsdfsi(double d)
38 double __adddf3(double a, double b)
43 double __addsf3(float a, float b)
48 double __subdf3(double a, double b)
53 double __extendsfdf2(float a)
63 #undef RX_DONT_PASS_UL
65 #undef DEBUG_RX_VERBOSE
71 #undef DEBUG_TX_FILLDESC
76 #undef DEBUG_REGISTERS
78 #undef DEBUG_IRQ_TASKLET
82 #define CONFIG_RTL8192_IO_MAP
84 #include <asm/uaccess.h>
85 #include "r8192U_hw.h"
87 #include "r8190_rtl8256.h" /* RTL8225 Radio frontend */
88 #include "r8180_93cx6.h" /* Card EEPROM */
89 #include "r8192U_wx.h"
90 #include "r819xU_phy.h" //added by WB 4.30.2008
91 #include "r819xU_phyreg.h"
92 #include "r819xU_cmdpkt.h"
93 #include "r8192U_dm.h"
94 #include <linux/usb.h>
95 #include <linux/slab.h>
96 #include <linux/proc_fs.h>
97 #include <linux/seq_file.h>
98 // FIXME: check if 2.6.7 is ok
100 #ifdef CONFIG_RTL8192_PM
101 #include "r8192_pm.h"
105 //set here to open your trace code. //WB
106 u32 rt_global_debug_component = \
109 COMP_ERR; //always open err flags on
111 #define TOTAL_CAM_ENTRY 32
112 #define CAM_CONTENT_COUNT 8
114 static const struct usb_device_id rtl8192_usb_id_tbl[] = {
116 {USB_DEVICE(0x0bda, 0x8709)},
118 {USB_DEVICE(0x07aa, 0x0043)},
120 {USB_DEVICE(0x050d, 0x805E)},
122 {USB_DEVICE(0x0df6, 0x0031)},
124 {USB_DEVICE(0x1740, 0x9201)},
126 {USB_DEVICE(0x2001, 0x3301)},
128 {USB_DEVICE(0x5a57, 0x0290)},
130 {USB_DEVICE(0x043e, 0x7a01)},
134 MODULE_LICENSE("GPL");
135 MODULE_VERSION("V 1.1");
136 MODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
137 MODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
139 static char *ifname = "wlan%d";
140 static int hwwep = 1; //default use hw. set 0 to use software security
141 static int channels = 0x3fff;
145 module_param(ifname, charp, S_IRUGO|S_IWUSR);
146 module_param(hwwep, int, S_IRUGO|S_IWUSR);
147 module_param(channels, int, S_IRUGO|S_IWUSR);
149 MODULE_PARM_DESC(ifname, " Net interface name, wlan%d=default");
150 MODULE_PARM_DESC(hwwep, " Try to use hardware security support. ");
151 MODULE_PARM_DESC(channels, " Channel bitmask for specific locales. NYI");
153 static int rtl8192_usb_probe(struct usb_interface *intf,
154 const struct usb_device_id *id);
155 static void rtl8192_usb_disconnect(struct usb_interface *intf);
158 static struct usb_driver rtl8192_usb_driver = {
159 .name = RTL819xU_MODULE_NAME, /* Driver name */
160 .id_table = rtl8192_usb_id_tbl, /* PCI_ID table */
161 .probe = rtl8192_usb_probe, /* probe fn */
162 .disconnect = rtl8192_usb_disconnect, /* remove fn */
163 #ifdef CONFIG_RTL8192_PM
164 .suspend = rtl8192_suspend, /* PM suspend fn */
165 .resume = rtl8192_resume, /* PM resume fn */
167 .suspend = NULL, /* PM suspend fn */
168 .resume = NULL, /* PM resume fn */
173 typedef struct _CHANNEL_LIST {
176 } CHANNEL_LIST, *PCHANNEL_LIST;
178 static CHANNEL_LIST ChannelPlan[] = {
179 {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, //FCC
180 {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
181 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
182 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Spain. Change to ETSI.
183 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //France. Change to ETSI.
184 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, //MKK //MKK
185 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
186 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Israel.
187 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // For 11a , TELEC
188 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22}, //MIC
189 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14} //For Global Domain. 1-11:active scan, 12-14 passive scan. //+YJ, 080626
192 static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv *priv)
194 int i, max_chan = -1, min_chan = -1;
195 struct ieee80211_device *ieee = priv->ieee80211;
196 switch (channel_plan) {
197 case COUNTRY_CODE_FCC:
198 case COUNTRY_CODE_IC:
199 case COUNTRY_CODE_ETSI:
200 case COUNTRY_CODE_SPAIN:
201 case COUNTRY_CODE_FRANCE:
202 case COUNTRY_CODE_MKK:
203 case COUNTRY_CODE_MKK1:
204 case COUNTRY_CODE_ISRAEL:
205 case COUNTRY_CODE_TELEC:
206 case COUNTRY_CODE_MIC:
208 ieee->bGlobalDomain = false;
209 //actually 8225 & 8256 rf chips only support B,G,24N mode
210 if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256)) {
214 RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __func__);
216 if (ChannelPlan[channel_plan].Len != 0) {
217 // Clear old channel map
218 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
219 // Set new channel map
220 for (i = 0; i < ChannelPlan[channel_plan].Len; i++) {
221 if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
223 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
228 case COUNTRY_CODE_GLOBAL_DOMAIN:
229 GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
231 ieee->bGlobalDomain = true;
240 #define rx_hal_is_cck_rate(_pdrvinfo)\
241 (_pdrvinfo->RxRate == DESC90_RATE1M ||\
242 _pdrvinfo->RxRate == DESC90_RATE2M ||\
243 _pdrvinfo->RxRate == DESC90_RATE5_5M ||\
244 _pdrvinfo->RxRate == DESC90_RATE11M) &&\
248 void CamResetAllEntry(struct net_device *dev)
251 //2004/02/11 In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
252 // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
253 // In this condition, Cam can not be reset because upper layer will not set this static key again.
254 ulcommand |= BIT31|BIT30;
255 write_nic_dword(dev, RWCAM, ulcommand);
260 void write_cam(struct net_device *dev, u8 addr, u32 data)
262 write_nic_dword(dev, WCAMI, data);
263 write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff));
266 u32 read_cam(struct net_device *dev, u8 addr)
268 write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff));
269 return read_nic_dword(dev, 0xa8);
272 void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
275 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
276 struct usb_device *udev = priv->udev;
278 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
279 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
280 indx|0xfe00, 0, &data, 1, HZ / 2);
283 netdev_err(dev, "write_nic_byte_E TimeOut! status: %d\n", status);
286 u8 read_nic_byte_E(struct net_device *dev, int indx)
290 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
291 struct usb_device *udev = priv->udev;
293 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
294 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
295 indx|0xfe00, 0, &data, 1, HZ / 2);
298 netdev_err(dev, "read_nic_byte_E TimeOut! status: %d\n", status);
302 //as 92U has extend page from 4 to 16, so modify functions below.
303 void write_nic_byte(struct net_device *dev, int indx, u8 data)
307 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
308 struct usb_device *udev = priv->udev;
310 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
311 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
312 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
315 netdev_err(dev, "write_nic_byte TimeOut! status: %d\n", status);
321 void write_nic_word(struct net_device *dev, int indx, u16 data)
326 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
327 struct usb_device *udev = priv->udev;
329 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
330 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
331 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 2, HZ / 2);
334 netdev_err(dev, "write_nic_word TimeOut! status: %d\n", status);
339 void write_nic_dword(struct net_device *dev, int indx, u32 data)
344 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
345 struct usb_device *udev = priv->udev;
347 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
348 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
349 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 4, HZ / 2);
353 netdev_err(dev, "write_nic_dword TimeOut! status: %d\n", status);
359 u8 read_nic_byte(struct net_device *dev, int indx)
363 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
364 struct usb_device *udev = priv->udev;
366 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
367 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
368 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
371 netdev_err(dev, "read_nic_byte TimeOut! status: %d\n", status);
378 u16 read_nic_word(struct net_device *dev, int indx)
382 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
383 struct usb_device *udev = priv->udev;
385 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
386 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
387 (indx&0xff)|0xff00, (indx>>8)&0x0f,
391 netdev_err(dev, "read_nic_word TimeOut! status: %d\n", status);
396 u16 read_nic_word_E(struct net_device *dev, int indx)
400 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
401 struct usb_device *udev = priv->udev;
403 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
404 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
405 indx|0xfe00, 0, &data, 2, HZ / 2);
408 netdev_err(dev, "read_nic_word TimeOut! status: %d\n", status);
413 u32 read_nic_dword(struct net_device *dev, int indx)
418 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
419 struct usb_device *udev = priv->udev;
421 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
422 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
423 (indx&0xff)|0xff00, (indx>>8)&0x0f,
427 netdev_err(dev, "read_nic_dword TimeOut! status:%d\n", status);
432 /* u8 read_phy_cck(struct net_device *dev, u8 adr); */
433 /* u8 read_phy_ofdm(struct net_device *dev, u8 adr); */
434 /* this might still called in what was the PHY rtl8185/rtl8192 common code
435 * plans are to possibility turn it again in one common code...
437 inline void force_pci_posting(struct net_device *dev)
441 static struct net_device_stats *rtl8192_stats(struct net_device *dev);
442 void rtl8192_commit(struct net_device *dev);
443 void rtl8192_restart(struct work_struct *work);
444 void watch_dog_timer_callback(unsigned long data);
446 /****************************************************************************
447 * -----------------------------PROCFS STUFF-------------------------
448 *****************************************************************************
451 static struct proc_dir_entry *rtl8192_proc;
453 static int proc_get_stats_ap(struct seq_file *m, void *v)
455 struct net_device *dev = m->private;
456 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
457 struct ieee80211_device *ieee = priv->ieee80211;
458 struct ieee80211_network *target;
460 list_for_each_entry(target, &ieee->network_list, list) {
461 const char *wpa = "non_WPA";
462 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
465 seq_printf(m, "%s %s\n", target->ssid, wpa);
471 static int proc_get_registers(struct seq_file *m, void *v)
473 struct net_device *dev = m->private;
474 int i, n, max = 0xff;
476 seq_puts(m, "\n####################page 0##################\n ");
478 for (n = 0; n <= max;) {
479 seq_printf(m, "\nD: %2x > ", n);
481 for (i = 0; i < 16 && n <= max; i++, n++)
482 seq_printf(m, "%2x ", read_nic_byte(dev, 0x000|n));
485 seq_puts(m, "\n####################page 1##################\n ");
486 for (n = 0; n <= max;) {
487 seq_printf(m, "\nD: %2x > ", n);
489 for (i = 0; i < 16 && n <= max; i++, n++)
490 seq_printf(m, "%2x ", read_nic_byte(dev, 0x100|n));
493 seq_puts(m, "\n####################page 3##################\n ");
494 for (n = 0; n <= max;) {
495 seq_printf(m, "\nD: %2x > ", n);
497 for (i = 0; i < 16 && n <= max; i++, n++)
498 seq_printf(m, "%2x ", read_nic_byte(dev, 0x300|n));
505 static int proc_get_stats_tx(struct seq_file *m, void *v)
507 struct net_device *dev = m->private;
508 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
511 "TX VI priority ok int: %lu\n"
512 "TX VI priority error int: %lu\n"
513 "TX VO priority ok int: %lu\n"
514 "TX VO priority error int: %lu\n"
515 "TX BE priority ok int: %lu\n"
516 "TX BE priority error int: %lu\n"
517 "TX BK priority ok int: %lu\n"
518 "TX BK priority error int: %lu\n"
519 "TX MANAGE priority ok int: %lu\n"
520 "TX MANAGE priority error int: %lu\n"
521 "TX BEACON priority ok int: %lu\n"
522 "TX BEACON priority error int: %lu\n"
523 "TX queue resume: %lu\n"
524 "TX queue stopped?: %d\n"
525 "TX fifo overflow: %lu\n"
530 "TX VI dropped: %lu\n"
531 "TX VO dropped: %lu\n"
532 "TX BE dropped: %lu\n"
533 "TX BK dropped: %lu\n"
534 "TX total data packets %lu\n",
535 priv->stats.txviokint,
537 priv->stats.txvookint,
539 priv->stats.txbeokint,
541 priv->stats.txbkokint,
543 priv->stats.txmanageokint,
544 priv->stats.txmanageerr,
545 priv->stats.txbeaconokint,
546 priv->stats.txbeaconerr,
547 priv->stats.txresumed,
548 netif_queue_stopped(dev),
549 priv->stats.txoverflow,
550 atomic_read(&(priv->tx_pending[VI_PRIORITY])),
551 atomic_read(&(priv->tx_pending[VO_PRIORITY])),
552 atomic_read(&(priv->tx_pending[BE_PRIORITY])),
553 atomic_read(&(priv->tx_pending[BK_PRIORITY])),
554 priv->stats.txvidrop,
555 priv->stats.txvodrop,
556 priv->stats.txbedrop,
557 priv->stats.txbkdrop,
558 priv->stats.txdatapkt
564 static int proc_get_stats_rx(struct seq_file *m, void *v)
566 struct net_device *dev = m->private;
567 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
571 "RX urb status error: %lu\n"
572 "RX invalid urb error: %lu\n",
573 priv->stats.rxoktotal,
574 priv->stats.rxstaterr,
575 priv->stats.rxurberr);
580 void rtl8192_proc_module_init(void)
582 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
583 rtl8192_proc = proc_mkdir(RTL819xU_MODULE_NAME, init_net.proc_net);
587 void rtl8192_proc_module_remove(void)
589 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
593 * seq_file wrappers for procfile show routines.
595 static int rtl8192_proc_open(struct inode *inode, struct file *file)
597 struct net_device *dev = proc_get_parent_data(inode);
598 int (*show)(struct seq_file *, void *) = PDE_DATA(inode);
600 return single_open(file, show, dev);
603 static const struct file_operations rtl8192_proc_fops = {
604 .open = rtl8192_proc_open,
607 .release = single_release,
611 * Table of proc files we need to create.
613 struct rtl8192_proc_file {
615 int (*show)(struct seq_file *, void *);
618 static const struct rtl8192_proc_file rtl8192_proc_files[] = {
619 { "stats-rx", &proc_get_stats_rx },
620 { "stats-tx", &proc_get_stats_tx },
621 { "stats-ap", &proc_get_stats_ap },
622 { "registers", &proc_get_registers },
626 void rtl8192_proc_init_one(struct net_device *dev)
628 const struct rtl8192_proc_file *f;
629 struct proc_dir_entry *dir;
632 dir = proc_mkdir_data(dev->name, 0, rtl8192_proc, dev);
634 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
639 for (f = rtl8192_proc_files; f->name[0]; f++) {
640 if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir,
641 &rtl8192_proc_fops, f->show)) {
642 RT_TRACE(COMP_ERR, "Unable to initialize "
643 "/proc/net/rtl8192/%s/%s\n",
651 void rtl8192_proc_remove_one(struct net_device *dev)
653 remove_proc_subtree(dev->name, rtl8192_proc);
656 /****************************************************************************
657 -----------------------------MISC STUFF-------------------------
658 *****************************************************************************/
660 short check_nic_enough_desc(struct net_device *dev, int queue_index)
662 struct r8192_priv *priv = ieee80211_priv(dev);
663 int used = atomic_read(&priv->tx_pending[queue_index]);
665 return (used < MAX_TX_URB);
668 void tx_timeout(struct net_device *dev)
670 struct r8192_priv *priv = ieee80211_priv(dev);
672 schedule_work(&priv->reset_wq);
676 /* this is only for debug */
677 void dump_eprom(struct net_device *dev)
680 for (i = 0; i < 63; i++)
681 RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev, i));
685 /****************************************************************************
686 ------------------------------HW STUFF---------------------------
687 *****************************************************************************/
690 void rtl8192_set_mode(struct net_device *dev, int mode)
693 ecmd = read_nic_byte(dev, EPROM_CMD);
694 ecmd = ecmd & ~EPROM_CMD_OPERATING_MODE_MASK;
695 ecmd = ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
696 ecmd = ecmd & ~(1<<EPROM_CS_SHIFT);
697 ecmd = ecmd & ~(1<<EPROM_CK_SHIFT);
698 write_nic_byte(dev, EPROM_CMD, ecmd);
702 void rtl8192_update_msr(struct net_device *dev)
704 struct r8192_priv *priv = ieee80211_priv(dev);
707 msr = read_nic_byte(dev, MSR);
708 msr &= ~MSR_LINK_MASK;
710 /* do not change in link_state != WLAN_LINK_ASSOCIATED.
711 * msr must be updated if the state is ASSOCIATING.
712 * this is intentional and make sense for ad-hoc and
713 * master (see the create BSS/IBSS func)
715 if (priv->ieee80211->state == IEEE80211_LINKED) {
717 if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
718 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
719 else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
720 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
721 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
722 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
725 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
728 write_nic_byte(dev, MSR, msr);
731 void rtl8192_set_chan(struct net_device *dev, short ch)
733 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
734 RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __func__, ch);
737 /* this hack should avoid frame TX during channel setting*/
740 //need to implement rf set channel here WB
742 if (priv->rf_set_chan)
743 priv->rf_set_chan(dev, priv->chan);
748 static void rtl8192_rx_isr(struct urb *urb);
750 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
753 #ifdef USB_RX_AGGREGATION_SUPPORT
754 if (pstats->bisrxaggrsubframe)
755 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
756 + pstats->RxBufShift + 8);
759 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
760 + pstats->RxBufShift);
763 static int rtl8192_rx_initiate(struct net_device *dev)
765 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
768 struct rtl8192_rx_info *info;
770 /* nomal packet rx procedure */
771 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
772 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
775 entry = usb_alloc_urb(0, GFP_KERNEL);
780 usb_fill_bulk_urb(entry, priv->udev,
781 usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
782 RX_URB_SIZE, rtl8192_rx_isr, skb);
783 info = (struct rtl8192_rx_info *) skb->cb;
786 info->out_pipe = 3; //denote rx normal packet queue
787 skb_queue_tail(&priv->rx_queue, skb);
788 usb_submit_urb(entry, GFP_KERNEL);
791 /* command packet rx procedure */
792 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
793 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
796 entry = usb_alloc_urb(0, GFP_KERNEL);
801 usb_fill_bulk_urb(entry, priv->udev,
802 usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
803 RX_URB_SIZE, rtl8192_rx_isr, skb);
804 info = (struct rtl8192_rx_info *) skb->cb;
807 info->out_pipe = 9; //denote rx cmd packet queue
808 skb_queue_tail(&priv->rx_queue, skb);
809 usb_submit_urb(entry, GFP_KERNEL);
815 void rtl8192_set_rxconf(struct net_device *dev)
817 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
820 rxconf = read_nic_dword(dev, RCR);
821 rxconf = rxconf & ~MAC_FILTER_MASK;
822 rxconf = rxconf | RCR_AMF;
823 rxconf = rxconf | RCR_ADF;
824 rxconf = rxconf | RCR_AB;
825 rxconf = rxconf | RCR_AM;
827 if (dev->flags & IFF_PROMISC)
828 DMESG("NIC in promisc mode");
830 if (priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
831 dev->flags & IFF_PROMISC) {
832 rxconf = rxconf | RCR_AAP;
834 rxconf = rxconf | RCR_APM;
835 rxconf = rxconf | RCR_CBSSID;
839 if (priv->ieee80211->iw_mode == IW_MODE_MONITOR) {
840 rxconf = rxconf | RCR_AICV;
841 rxconf = rxconf | RCR_APWRMGT;
844 if (priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
845 rxconf = rxconf | RCR_ACRC32;
848 rxconf = rxconf & ~RX_FIFO_THRESHOLD_MASK;
849 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
850 rxconf = rxconf & ~MAX_RX_DMA_MASK;
851 rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
853 rxconf = rxconf | RCR_ONLYERLPKT;
855 write_nic_dword(dev, RCR, rxconf);
858 DMESG("rxconf: %x %x", rxconf, read_nic_dword(dev, RCR));
862 void rtl8192_rx_enable(struct net_device *dev)
864 rtl8192_rx_initiate(dev);
868 void rtl8192_tx_enable(struct net_device *dev)
874 void rtl8192_rtx_disable(struct net_device *dev)
877 struct r8192_priv *priv = ieee80211_priv(dev);
879 struct rtl8192_rx_info *info;
881 cmd = read_nic_byte(dev, CMDR);
882 write_nic_byte(dev, CMDR, cmd & \
884 force_pci_posting(dev);
887 while ((skb = __skb_dequeue(&priv->rx_queue))) {
888 info = (struct rtl8192_rx_info *) skb->cb;
892 usb_kill_urb(info->urb);
896 if (skb_queue_len(&priv->skb_queue))
897 netdev_warn(dev, "skb_queue not empty\n");
899 skb_queue_purge(&priv->skb_queue);
904 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
909 inline u16 ieeerate2rtlrate(int rate)
941 static u16 rtl_rate[] = {10, 20, 55, 110, 60, 90, 120, 180, 240, 360, 480, 540};
942 inline u16 rtl8192_rate2rate(short rate)
944 if (rate > 11) return 0;
945 return rtl_rate[rate];
949 /* The prototype of rx_isr has changed since one version of Linux Kernel */
950 static void rtl8192_rx_isr(struct urb *urb)
952 struct sk_buff *skb = (struct sk_buff *) urb->context;
953 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
954 struct net_device *dev = info->dev;
955 struct r8192_priv *priv = ieee80211_priv(dev);
956 int out_pipe = info->out_pipe;
960 if (unlikely(urb->status)) {
962 priv->stats.rxstaterr++;
963 priv->ieee80211->stats.rx_errors++;
967 skb_unlink(skb, &priv->rx_queue);
968 skb_put(skb, urb->actual_length);
970 skb_queue_tail(&priv->skb_queue, skb);
971 tasklet_schedule(&priv->irq_rx_tasklet);
973 skb = dev_alloc_skb(RX_URB_SIZE);
974 if (unlikely(!skb)) {
976 netdev_err(dev, "%s(): can't alloc skb\n", __func__);
977 /* TODO check rx queue length and refill *somewhere* */
981 usb_fill_bulk_urb(urb, priv->udev,
982 usb_rcvbulkpipe(priv->udev, out_pipe), skb_tail_pointer(skb),
983 RX_URB_SIZE, rtl8192_rx_isr, skb);
985 info = (struct rtl8192_rx_info *) skb->cb;
988 info->out_pipe = out_pipe;
990 urb->transfer_buffer = skb_tail_pointer(skb);
992 skb_queue_tail(&priv->rx_queue, skb);
993 err = usb_submit_urb(urb, GFP_ATOMIC);
994 if (err && err != EPERM)
995 netdev_err(dev, "can not submit rxurb, err is %x, URB status is %x\n", err, urb->status);
998 u32 rtl819xusb_rx_command_packet(struct net_device *dev,
999 struct ieee80211_rx_stats *pstats)
1003 status = cmpk_message_handle_rx(dev, pstats);
1005 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1011 void rtl8192_data_hard_stop(struct net_device *dev)
1017 void rtl8192_data_hard_resume(struct net_device *dev)
1022 /* this function TX data frames when the ieee80211 stack requires this.
1023 * It checks also if we need to stop the ieee tx queue, eventually do it
1025 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1027 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1029 unsigned long flags;
1030 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1031 u8 queue_index = tcb_desc->queue_index;
1033 /* shall not be referred by command packet */
1034 assert(queue_index != TXCMD_QUEUE);
1036 spin_lock_irqsave(&priv->tx_lock, flags);
1038 memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
1039 tcb_desc->bTxEnableFwCalcDur = 1;
1040 skb_push(skb, priv->ieee80211->tx_headroom);
1041 ret = rtl8192_tx(dev, skb);
1043 spin_unlock_irqrestore(&priv->tx_lock, flags);
1048 /* This is a rough attempt to TX a frame
1049 * This is called by the ieee 80211 stack to TX management frames.
1050 * If the ring is full packet are dropped (for data frame the queue
1051 * is stopped before this can happen).
1053 int rtl8192_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
1055 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1057 unsigned long flags;
1058 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1059 u8 queue_index = tcb_desc->queue_index;
1062 spin_lock_irqsave(&priv->tx_lock, flags);
1064 memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
1065 if (queue_index == TXCMD_QUEUE) {
1066 skb_push(skb, USB_HWDESC_HEADER_LEN);
1067 rtl819xU_tx_cmd(dev, skb);
1069 spin_unlock_irqrestore(&priv->tx_lock, flags);
1072 skb_push(skb, priv->ieee80211->tx_headroom);
1073 ret = rtl8192_tx(dev, skb);
1076 spin_unlock_irqrestore(&priv->tx_lock, flags);
1082 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1084 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1085 u16 DrvAggr_PaddingAdd(struct net_device *dev, struct sk_buff *skb)
1087 u16 PaddingNum = 256 - ((skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES) % 256);
1088 return (PaddingNum&0xff);
1091 u8 MRateToHwRate8190Pci(u8 rate);
1092 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc);
1093 u8 MapHwQueueToFirmwareQueue(u8 QueueID);
1094 struct sk_buff *DrvAggr_Aggregation(struct net_device *dev, struct ieee80211_drv_agg_txb *pSendList)
1096 struct ieee80211_device *ieee = netdev_priv(dev);
1097 struct r8192_priv *priv = ieee80211_priv(dev);
1098 cb_desc *tcb_desc = NULL;
1101 struct sk_buff *skb;
1102 struct sk_buff *agg_skb;
1103 tx_desc_819x_usb_aggr_subframe *tx_agg_desc = NULL;
1104 tx_fwinfo_819x_usb *tx_fwinfo = NULL;
1107 // Local variable initialization.
1109 /* first skb initialization */
1110 skb = pSendList->tx_agg_frames[0];
1111 TotalLength = skb->len;
1113 /* Get the total aggregation length including the padding space and
1116 for (i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1117 TotalLength += DrvAggr_PaddingAdd(dev, skb);
1118 skb = pSendList->tx_agg_frames[i];
1119 TotalLength += (skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1122 /* allocate skb to contain the aggregated packets */
1123 agg_skb = dev_alloc_skb(TotalLength + ieee->tx_headroom);
1124 memset(agg_skb->data, 0, agg_skb->len);
1125 skb_reserve(agg_skb, ieee->tx_headroom);
1127 /* reserve info for first subframe Tx descriptor to be set in the tx function */
1128 skb = pSendList->tx_agg_frames[0];
1129 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1130 tcb_desc->drv_agg_enable = 1;
1131 tcb_desc->pkt_size = skb->len;
1132 tcb_desc->DrvAggrNum = pSendList->nr_drv_agg_frames;
1133 netdev_dbg(dev, "DrvAggNum = %d\n", tcb_desc->DrvAggrNum);
1134 memcpy(agg_skb->cb, skb->cb, sizeof(skb->cb));
1135 memcpy(skb_put(agg_skb, skb->len), skb->data, skb->len);
1137 for (i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1138 /* push the next sub frame to be 256 byte aline */
1139 skb_put(agg_skb, DrvAggr_PaddingAdd(dev, skb));
1141 /* Subframe drv Tx descriptor and firmware info setting */
1142 skb = pSendList->tx_agg_frames[i];
1143 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1144 tx_agg_desc = (tx_desc_819x_usb_aggr_subframe *)agg_skb->tail;
1145 tx_fwinfo = (tx_fwinfo_819x_usb *)(agg_skb->tail + sizeof(tx_desc_819x_usb_aggr_subframe));
1147 memset(tx_fwinfo, 0, sizeof(tx_fwinfo_819x_usb));
1149 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
1150 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
1151 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
1152 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
1153 if (tcb_desc->bAMPDUEnable) {//AMPDU enabled
1154 tx_fwinfo->AllowAggregation = 1;
1156 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
1157 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
1159 tx_fwinfo->AllowAggregation = 0;
1161 tx_fwinfo->RxMF = 0;
1162 tx_fwinfo->RxAMD = 0;
1165 /* Protection mode related */
1166 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
1167 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
1168 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
1169 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
1170 tx_fwinfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
1171 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT == 0)?(tcb_desc->RTSSC):0;
1172 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT == 1)?((tcb_desc->bRTSBW)?1:0):0;
1173 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT == 0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
1174 (tcb_desc->bRTSUseShortGI?1:0);
1176 /* Set Bandwidth and sub-channel settings. */
1177 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
1178 if (tcb_desc->bPacketBW) {
1179 tx_fwinfo->TxBandwidth = 1;
1180 tx_fwinfo->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
1182 tx_fwinfo->TxBandwidth = 0;
1183 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
1186 tx_fwinfo->TxBandwidth = 0;
1187 tx_fwinfo->TxSubCarrier = 0;
1190 /* Fill Tx descriptor */
1191 memset(tx_agg_desc, 0, sizeof(tx_desc_819x_usb_aggr_subframe));
1193 tx_agg_desc->Offset = sizeof(tx_fwinfo_819x_usb) + 8;
1194 /* already raw data, need not to subtract header length */
1195 tx_agg_desc->PktSize = skb->len & 0xffff;
1198 tx_agg_desc->SecCAMID = 0;
1199 tx_agg_desc->RATid = tcb_desc->RATRIndex;
1200 tx_agg_desc->NoEnc = 1;
1201 tx_agg_desc->SecType = 0x0;
1203 if (tcb_desc->bHwSec) {
1204 switch (priv->ieee80211->pairwise_key_type) {
1205 case KEY_TYPE_WEP40:
1206 case KEY_TYPE_WEP104:
1207 tx_agg_desc->SecType = 0x1;
1208 tx_agg_desc->NoEnc = 0;
1211 tx_agg_desc->SecType = 0x2;
1212 tx_agg_desc->NoEnc = 0;
1215 tx_agg_desc->SecType = 0x3;
1216 tx_agg_desc->NoEnc = 0;
1219 tx_agg_desc->SecType = 0x0;
1220 tx_agg_desc->NoEnc = 1;
1225 tx_agg_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
1226 tx_agg_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);
1228 tx_agg_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
1229 tx_agg_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
1231 tx_agg_desc->OWN = 1;
1234 /* According windows driver, it seems that there no need to fill this field */
1236 /* to fill next packet */
1237 skb_put(agg_skb, TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1238 memcpy(skb_put(agg_skb, skb->len), skb->data, skb->len);
1241 for (i = 0; i < pSendList->nr_drv_agg_frames; i++)
1242 dev_kfree_skb_any(pSendList->tx_agg_frames[i]);
1248 This function return a list of PTCB which is proper to be aggregate with the input TCB.
1249 If no proper TCB is found to do aggregation, SendList will only contain the input TCB.
1251 u8 DrvAggr_GetAggregatibleList(struct net_device *dev, struct sk_buff *skb,
1252 struct ieee80211_drv_agg_txb *pSendList)
1254 struct ieee80211_device *ieee = netdev_priv(dev);
1255 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1256 u16 nMaxAggrNum = pHTInfo->UsbTxAggrNum;
1257 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1258 u8 QueueID = tcb_desc->queue_index;
1261 pSendList->tx_agg_frames[pSendList->nr_drv_agg_frames++] = skb;
1262 if (pSendList->nr_drv_agg_frames >= nMaxAggrNum)
1265 } while ((skb = skb_dequeue(&ieee->skb_drv_aggQ[QueueID])));
1267 RT_TRACE(COMP_AMSDU, "DrvAggr_GetAggregatibleList, nAggrTcbNum = %d \n", pSendList->nr_drv_agg_frames);
1268 return pSendList->nr_drv_agg_frames;
1272 static void rtl8192_tx_isr(struct urb *tx_urb)
1274 struct sk_buff *skb = (struct sk_buff *)tx_urb->context;
1275 struct net_device *dev = NULL;
1276 struct r8192_priv *priv = NULL;
1277 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1278 u8 queue_index = tcb_desc->queue_index;
1280 memcpy(&dev, (struct net_device *)(skb->cb), sizeof(struct net_device *));
1281 priv = ieee80211_priv(dev);
1283 if (tcb_desc->queue_index != TXCMD_QUEUE) {
1284 if (tx_urb->status == 0) {
1285 dev->trans_start = jiffies;
1286 priv->stats.txoktotal++;
1287 priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1288 priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1290 priv->ieee80211->stats.tx_errors++;
1295 /* free skb and tx_urb */
1297 dev_kfree_skb_any(skb);
1298 usb_free_urb(tx_urb);
1299 atomic_dec(&priv->tx_pending[queue_index]);
1303 // Handle HW Beacon:
1304 // We had transfer our beacon frame to host controller at this moment.
1308 // Handling the wait queue of command packets.
1309 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1310 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1313 /* Handle MPDU in wait queue. */
1314 if (queue_index != BEACON_QUEUE) {
1315 /* Don't send data frame during scanning.*/
1316 if ((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1317 (!(priv->ieee80211->queue_stop))) {
1318 if (NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1319 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1321 return; //modified by david to avoid further processing AMSDU
1323 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1324 else if ((skb_queue_len(&priv->ieee80211->skb_drv_aggQ[queue_index]) != 0)&&\
1325 (!(priv->ieee80211->queue_stop))) {
1326 // Tx Driver Aggregation process
1327 /* The driver will aggregation the packets according to the following stats
1328 * 1. check whether there's tx irq available, for it's a completion return
1329 * function, it should contain enough tx irq;
1330 * 2. check packet type;
1331 * 3. initialize sendlist, check whether the to-be send packet no greater than 1
1332 * 4. aggregates the packets, and fill firmware info and tx desc into it, etc.
1333 * 5. check whether the packet could be sent, otherwise just insert into wait head
1335 skb = skb_dequeue(&priv->ieee80211->skb_drv_aggQ[queue_index]);
1336 if (!check_nic_enough_desc(dev, queue_index)) {
1337 skb_queue_head(&(priv->ieee80211->skb_drv_aggQ[queue_index]), skb);
1343 struct ieee80211_drv_agg_txb SendList;
1345 memset(&SendList, 0, sizeof(struct ieee80211_drv_agg_txb));
1346 if (DrvAggr_GetAggregatibleList(dev, skb, &SendList) > 1) {
1347 skb = DrvAggr_Aggregation(dev, &SendList);
1351 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1358 void rtl8192_beacon_stop(struct net_device *dev)
1361 struct r8192_priv *priv = ieee80211_priv(dev);
1363 msr = read_nic_byte(dev, MSR);
1364 msrm = msr & MSR_LINK_MASK;
1365 msr2 = msr & ~MSR_LINK_MASK;
1367 if (NIC_8192U == priv->card_8192)
1368 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1369 if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1370 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))) {
1371 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1372 write_nic_byte(dev, MSR, msr);
1376 void rtl8192_config_rate(struct net_device *dev, u16 *rate_config)
1378 struct r8192_priv *priv = ieee80211_priv(dev);
1379 struct ieee80211_network *net;
1380 u8 i = 0, basic_rate = 0;
1381 net = & priv->ieee80211->current_network;
1383 for (i = 0; i < net->rates_len; i++) {
1384 basic_rate = net->rates[i]&0x7f;
1385 switch (basic_rate) {
1386 case MGN_1M: *rate_config |= RRSR_1M; break;
1387 case MGN_2M: *rate_config |= RRSR_2M; break;
1388 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1389 case MGN_11M: *rate_config |= RRSR_11M; break;
1390 case MGN_6M: *rate_config |= RRSR_6M; break;
1391 case MGN_9M: *rate_config |= RRSR_9M; break;
1392 case MGN_12M: *rate_config |= RRSR_12M; break;
1393 case MGN_18M: *rate_config |= RRSR_18M; break;
1394 case MGN_24M: *rate_config |= RRSR_24M; break;
1395 case MGN_36M: *rate_config |= RRSR_36M; break;
1396 case MGN_48M: *rate_config |= RRSR_48M; break;
1397 case MGN_54M: *rate_config |= RRSR_54M; break;
1400 for (i = 0; i < net->rates_ex_len; i++) {
1401 basic_rate = net->rates_ex[i]&0x7f;
1402 switch (basic_rate) {
1403 case MGN_1M: *rate_config |= RRSR_1M; break;
1404 case MGN_2M: *rate_config |= RRSR_2M; break;
1405 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1406 case MGN_11M: *rate_config |= RRSR_11M; break;
1407 case MGN_6M: *rate_config |= RRSR_6M; break;
1408 case MGN_9M: *rate_config |= RRSR_9M; break;
1409 case MGN_12M: *rate_config |= RRSR_12M; break;
1410 case MGN_18M: *rate_config |= RRSR_18M; break;
1411 case MGN_24M: *rate_config |= RRSR_24M; break;
1412 case MGN_36M: *rate_config |= RRSR_36M; break;
1413 case MGN_48M: *rate_config |= RRSR_48M; break;
1414 case MGN_54M: *rate_config |= RRSR_54M; break;
1420 #define SHORT_SLOT_TIME 9
1421 #define NON_SHORT_SLOT_TIME 20
1423 void rtl8192_update_cap(struct net_device *dev, u16 cap)
1426 struct r8192_priv *priv = ieee80211_priv(dev);
1427 struct ieee80211_network *net = &priv->ieee80211->current_network;
1428 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1429 tmp = priv->basic_rate;
1430 if (priv->short_preamble)
1431 tmp |= BRSR_AckShortPmb;
1432 write_nic_dword(dev, RRSR, tmp);
1434 if (net->mode & (IEEE_G|IEEE_N_24G)) {
1436 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime)) //short slot time
1437 slot_time = SHORT_SLOT_TIME;
1438 else //long slot time
1439 slot_time = NON_SHORT_SLOT_TIME;
1440 priv->slot_time = slot_time;
1441 write_nic_byte(dev, SLOT_TIME, slot_time);
1445 void rtl8192_net_update(struct net_device *dev)
1448 struct r8192_priv *priv = ieee80211_priv(dev);
1449 struct ieee80211_network *net;
1450 u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1451 u16 rate_config = 0;
1452 net = & priv->ieee80211->current_network;
1454 rtl8192_config_rate(dev, &rate_config);
1455 priv->basic_rate = rate_config &= 0x15f;
1457 write_nic_dword(dev, BSSIDR, ((u32 *)net->bssid)[0]);
1458 write_nic_word(dev, BSSIDR+4, ((u16 *)net->bssid)[2]);
1460 rtl8192_update_msr(dev);
1461 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC) {
1462 write_nic_word(dev, ATIMWND, 2);
1463 write_nic_word(dev, BCN_DMATIME, 1023);
1464 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1465 write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1466 write_nic_byte(dev, BCN_ERR_THRESH, 100);
1467 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1468 // TODO: BcnIFS may required to be changed on ASIC
1469 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1471 write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1478 //temporary hw beacon is not used any more.
1479 //open it when necessary
1480 void rtl819xusb_beacon_tx(struct net_device *dev, u16 tx_rate)
1484 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1486 if (((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220))
1491 u16 N_DBPSOfRate(u16 DataRate);
1493 u16 ComputeTxTime(u16 FrameLength, u16 DataRate, u8 bManagementFrame,
1500 if (rtl8192_IsWirelessBMode(DataRate)) {
1501 if (bManagementFrame || !bShortPreamble || DataRate == 10) // long preamble
1502 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1503 else // Short preamble
1504 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1505 if ((FrameLength*8 % (DataRate/10)) != 0) //Get the Ceilling
1507 } else { //802.11g DSSS-OFDM PLCP length field calculation.
1508 N_DBPS = N_DBPSOfRate(DataRate);
1509 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1510 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1511 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1516 u16 N_DBPSOfRate(u16 DataRate)
1560 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1562 usb_free_urb(tx_cmd_urb);
1565 unsigned int txqueue2outpipe(struct r8192_priv *priv, unsigned int tx_queue)
1567 if (tx_queue >= 9) {
1568 RT_TRACE(COMP_ERR, "%s():Unknown queue ID!!!\n", __func__);
1571 return priv->txqueue_to_outpipemap[tx_queue];
1574 short rtl819xU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1576 struct r8192_priv *priv = ieee80211_priv(dev);
1579 unsigned int idx_pipe;
1580 tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1581 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1582 u8 queue_index = tcb_desc->queue_index;
1584 atomic_inc(&priv->tx_pending[queue_index]);
1585 tx_urb = usb_alloc_urb(0, GFP_ATOMIC);
1591 memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1592 /* Tx descriptor ought to be set according to the skb->cb */
1593 pdesc->FirstSeg = 1;//bFirstSeg;
1594 pdesc->LastSeg = 1;//bLastSeg;
1595 pdesc->CmdInit = tcb_desc->bCmdOrInit;
1596 pdesc->TxBufferSize = tcb_desc->txbuf_size;
1598 pdesc->LINIP = tcb_desc->bLastIniPkt;
1600 //----------------------------------------------------------------------------
1601 // Fill up USB_OUT_CONTEXT.
1602 //----------------------------------------------------------------------------
1603 // Get index to out pipe from specified QueueID.
1604 #ifndef USE_ONE_PIPE
1605 idx_pipe = txqueue2outpipe(priv, queue_index);
1609 #ifdef JOHN_DUMP_TXDESC
1611 printk("<Tx descriptor>--rate %x---", rate);
1612 for (i = 0; i < 8; i++)
1613 printk("%8x ", tx[i]);
1616 usb_fill_bulk_urb(tx_urb, priv->udev, usb_sndbulkpipe(priv->udev, idx_pipe), \
1617 skb->data, skb->len, rtl8192_tx_isr, skb);
1619 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
1624 DMESGE("Error TX CMD URB, error %d",
1631 * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
1632 * in TxFwInfo data structure
1633 * 2006.10.30 by Emily
1635 * \param QUEUEID Software Queue
1637 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
1639 u8 QueueSelect = 0x0; //defualt set to
1643 QueueSelect = QSLT_BE;
1647 QueueSelect = QSLT_BK;
1651 QueueSelect = QSLT_VO;
1655 QueueSelect = QSLT_VI;
1658 QueueSelect = QSLT_MGNT;
1662 QueueSelect = QSLT_BEACON;
1665 // TODO: 2006.10.30 mark other queue selection until we verify it is OK
1666 // TODO: Remove Assertions
1668 QueueSelect = QSLT_CMD;
1671 QueueSelect = QSLT_HIGH;
1675 RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
1681 u8 MRateToHwRate8190Pci(u8 rate)
1683 u8 ret = DESC90_RATE1M;
1686 case MGN_1M: ret = DESC90_RATE1M; break;
1687 case MGN_2M: ret = DESC90_RATE2M; break;
1688 case MGN_5_5M: ret = DESC90_RATE5_5M; break;
1689 case MGN_11M: ret = DESC90_RATE11M; break;
1690 case MGN_6M: ret = DESC90_RATE6M; break;
1691 case MGN_9M: ret = DESC90_RATE9M; break;
1692 case MGN_12M: ret = DESC90_RATE12M; break;
1693 case MGN_18M: ret = DESC90_RATE18M; break;
1694 case MGN_24M: ret = DESC90_RATE24M; break;
1695 case MGN_36M: ret = DESC90_RATE36M; break;
1696 case MGN_48M: ret = DESC90_RATE48M; break;
1697 case MGN_54M: ret = DESC90_RATE54M; break;
1699 // HT rate since here
1700 case MGN_MCS0: ret = DESC90_RATEMCS0; break;
1701 case MGN_MCS1: ret = DESC90_RATEMCS1; break;
1702 case MGN_MCS2: ret = DESC90_RATEMCS2; break;
1703 case MGN_MCS3: ret = DESC90_RATEMCS3; break;
1704 case MGN_MCS4: ret = DESC90_RATEMCS4; break;
1705 case MGN_MCS5: ret = DESC90_RATEMCS5; break;
1706 case MGN_MCS6: ret = DESC90_RATEMCS6; break;
1707 case MGN_MCS7: ret = DESC90_RATEMCS7; break;
1708 case MGN_MCS8: ret = DESC90_RATEMCS8; break;
1709 case MGN_MCS9: ret = DESC90_RATEMCS9; break;
1710 case MGN_MCS10: ret = DESC90_RATEMCS10; break;
1711 case MGN_MCS11: ret = DESC90_RATEMCS11; break;
1712 case MGN_MCS12: ret = DESC90_RATEMCS12; break;
1713 case MGN_MCS13: ret = DESC90_RATEMCS13; break;
1714 case MGN_MCS14: ret = DESC90_RATEMCS14; break;
1715 case MGN_MCS15: ret = DESC90_RATEMCS15; break;
1716 case (0x80|0x20): ret = DESC90_RATEMCS32; break;
1724 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
1728 tmp_Short = (TxHT == 1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
1730 if (TxHT == 1 && TxRate != DESC90_RATEMCS15)
1736 static void tx_zero_isr(struct urb *tx_urb)
1742 * The tx procedure is just as following,
1743 * skb->cb will contain all the following information,
1744 * priority, morefrag, rate, &dev.
1746 short rtl8192_tx(struct net_device *dev, struct sk_buff *skb)
1748 struct r8192_priv *priv = ieee80211_priv(dev);
1749 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1750 tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
1751 tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);
1752 struct usb_device *udev = priv->udev;
1755 struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
1756 unsigned int idx_pipe;
1757 pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
1758 /* we are locked here so the two atomic_read and inc are executed
1759 * without interleaves
1760 * !!! For debug purpose
1762 if (pend > MAX_TX_URB) {
1763 netdev_dbg(dev, "To discard skb packet!\n");
1764 dev_kfree_skb_any(skb);
1768 tx_urb = usb_alloc_urb(0, GFP_ATOMIC);
1770 dev_kfree_skb_any(skb);
1774 /* Fill Tx firmware info */
1775 memset(tx_fwinfo, 0, sizeof(tx_fwinfo_819x_usb));
1777 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
1778 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
1779 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
1780 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
1781 if (tcb_desc->bAMPDUEnable) {//AMPDU enabled
1782 tx_fwinfo->AllowAggregation = 1;
1784 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
1785 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
1787 tx_fwinfo->AllowAggregation = 0;
1789 tx_fwinfo->RxMF = 0;
1790 tx_fwinfo->RxAMD = 0;
1793 /* Protection mode related */
1794 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
1795 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
1796 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
1797 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
1798 tx_fwinfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
1799 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT == 0)?(tcb_desc->RTSSC):0;
1800 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT == 1)?((tcb_desc->bRTSBW)?1:0):0;
1801 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT == 0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
1802 (tcb_desc->bRTSUseShortGI?1:0);
1804 /* Set Bandwidth and sub-channel settings. */
1805 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
1806 if (tcb_desc->bPacketBW) {
1807 tx_fwinfo->TxBandwidth = 1;
1808 tx_fwinfo->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
1810 tx_fwinfo->TxBandwidth = 0;
1811 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
1814 tx_fwinfo->TxBandwidth = 0;
1815 tx_fwinfo->TxSubCarrier = 0;
1818 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1819 if (tcb_desc->drv_agg_enable)
1820 tx_fwinfo->Tx_INFO_RSVD = (tcb_desc->DrvAggrNum & 0x1f) << 1;
1822 /* Fill Tx descriptor */
1823 memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
1826 tx_desc->CmdInit = 1;
1827 tx_desc->Offset = sizeof(tx_fwinfo_819x_usb) + 8;
1829 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1830 if (tcb_desc->drv_agg_enable)
1831 tx_desc->PktSize = tcb_desc->pkt_size;
1835 tx_desc->PktSize = (skb->len - TX_PACKET_SHIFT_BYTES) & 0xffff;
1839 tx_desc->SecCAMID = 0;
1840 tx_desc->RATid = tcb_desc->RATRIndex;
1842 tx_desc->SecType = 0x0;
1843 if (tcb_desc->bHwSec) {
1844 switch (priv->ieee80211->pairwise_key_type) {
1845 case KEY_TYPE_WEP40:
1846 case KEY_TYPE_WEP104:
1847 tx_desc->SecType = 0x1;
1851 tx_desc->SecType = 0x2;
1855 tx_desc->SecType = 0x3;
1859 tx_desc->SecType = 0x0;
1865 tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
1866 tx_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);
1868 tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
1869 tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
1871 /* Fill fields that are required to be initialized in all of the descriptors */
1873 tx_desc->FirstSeg = 1;
1874 tx_desc->LastSeg = 1;
1877 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1878 if (tcb_desc->drv_agg_enable) {
1879 tx_desc->TxBufferSize = tcb_desc->pkt_size + sizeof(tx_fwinfo_819x_usb);
1884 tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
1886 /* Get index to out pipe from specified QueueID */
1887 #ifndef USE_ONE_PIPE
1888 idx_pipe = txqueue2outpipe(priv, tcb_desc->queue_index);
1893 /* To submit bulk urb */
1894 usb_fill_bulk_urb(tx_urb, udev,
1895 usb_sndbulkpipe(udev, idx_pipe), skb->data,
1896 skb->len, rtl8192_tx_isr, skb);
1898 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
1900 //we need to send 0 byte packet whenever 512N bytes/64N(HIGN SPEED/NORMAL SPEED) bytes packet has been transmitted. Otherwise, it will be halt to wait for another packet. WB. 2008.08.27
1901 bool bSend0Byte = false;
1903 if (udev->speed == USB_SPEED_HIGH) {
1904 if (skb->len > 0 && skb->len % 512 == 0)
1907 if (skb->len > 0 && skb->len % 64 == 0)
1911 tx_urb_zero = usb_alloc_urb(0, GFP_ATOMIC);
1913 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
1916 usb_fill_bulk_urb(tx_urb_zero, udev,
1917 usb_sndbulkpipe(udev, idx_pipe), &zero,
1918 0, tx_zero_isr, dev);
1919 status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
1921 RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
1925 dev->trans_start = jiffies;
1926 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
1929 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
1935 short rtl8192_usb_initendpoints(struct net_device *dev)
1937 struct r8192_priv *priv = ieee80211_priv(dev);
1939 priv->rx_urb = kmalloc(sizeof(struct urb *) * (MAX_RX_URB+1),
1941 if (priv->rx_urb == NULL)
1944 #ifndef JACKSON_NEW_RX
1945 for (i = 0; i < (MAX_RX_URB+1); i++) {
1947 priv->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
1949 priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL);
1951 priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE;
1955 #ifdef THOMAS_BEACON
1958 void *oldaddr, *newaddr;
1960 priv->rx_urb[16] = usb_alloc_urb(0, GFP_KERNEL);
1961 priv->oldaddr = kmalloc(16, GFP_KERNEL);
1962 oldaddr = priv->oldaddr;
1963 align = ((long)oldaddr) & 3;
1965 newaddr = oldaddr + 4 - align;
1966 priv->rx_urb[16]->transfer_buffer_length = 16 - 4 + align;
1969 priv->rx_urb[16]->transfer_buffer_length = 16;
1971 priv->rx_urb[16]->transfer_buffer = newaddr;
1975 memset(priv->rx_urb, 0, sizeof(struct urb *) * MAX_RX_URB);
1976 priv->pp_rxskb = kcalloc(MAX_RX_URB, sizeof(struct sk_buff *),
1978 if (!priv->pp_rxskb) {
1979 kfree(priv->rx_urb);
1981 priv->pp_rxskb = NULL;
1982 priv->rx_urb = NULL;
1984 DMESGE("Endpoint Alloc Failure");
1988 netdev_dbg(dev, "End of initendpoints\n");
1992 #ifdef THOMAS_BEACON
1993 void rtl8192_usb_deleteendpoints(struct net_device *dev)
1996 struct r8192_priv *priv = ieee80211_priv(dev);
1999 for (i = 0; i < (MAX_RX_URB+1); i++) {
2000 usb_kill_urb(priv->rx_urb[i]);
2001 usb_free_urb(priv->rx_urb[i]);
2003 kfree(priv->rx_urb);
2004 priv->rx_urb = NULL;
2006 kfree(priv->oldaddr);
2007 priv->oldaddr = NULL;
2008 if (priv->pp_rxskb) {
2009 kfree(priv->pp_rxskb);
2014 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2017 struct r8192_priv *priv = ieee80211_priv(dev);
2019 #ifndef JACKSON_NEW_RX
2022 for (i = 0; i < (MAX_RX_URB+1); i++) {
2023 usb_kill_urb(priv->rx_urb[i]);
2024 kfree(priv->rx_urb[i]->transfer_buffer);
2025 usb_free_urb(priv->rx_urb[i]);
2027 kfree(priv->rx_urb);
2028 priv->rx_urb = NULL;
2032 kfree(priv->rx_urb);
2033 priv->rx_urb = NULL;
2034 kfree(priv->oldaddr);
2035 priv->oldaddr = NULL;
2036 if (priv->pp_rxskb) {
2037 kfree(priv->pp_rxskb);
2046 extern void rtl8192_update_ratr_table(struct net_device *dev);
2047 void rtl8192_link_change(struct net_device *dev)
2049 struct r8192_priv *priv = ieee80211_priv(dev);
2050 struct ieee80211_device *ieee = priv->ieee80211;
2051 if (ieee->state == IEEE80211_LINKED) {
2052 rtl8192_net_update(dev);
2053 rtl8192_update_ratr_table(dev);
2054 //add this as in pure N mode, wep encryption will use software way, but there is no chance to set this as wep will not set group key in wext. WB.2008.07.08
2055 if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
2056 EnableHWSecurityConfig8192(dev);
2058 /*update timing params*/
2059 if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC) {
2061 reg = read_nic_dword(dev, RCR);
2062 if (priv->ieee80211->state == IEEE80211_LINKED)
2063 priv->ReceiveConfig = reg |= RCR_CBSSID;
2065 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2066 write_nic_dword(dev, RCR, reg);
2070 static struct ieee80211_qos_parameters def_qos_parameters = {
2071 {3, 3, 3, 3},/* cw_min */
2072 {7, 7, 7, 7},/* cw_max */
2073 {2, 2, 2, 2},/* aifs */
2074 {0, 0, 0, 0},/* flags */
2075 {0, 0, 0, 0} /* tx_op_limit */
2079 void rtl8192_update_beacon(struct work_struct *work)
2081 struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2082 struct net_device *dev = priv->ieee80211->dev;
2083 struct ieee80211_device *ieee = priv->ieee80211;
2084 struct ieee80211_network *net = &ieee->current_network;
2086 if (ieee->pHTInfo->bCurrentHTSupport)
2087 HTUpdateSelfAndPeerSetting(ieee, net);
2088 ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2089 rtl8192_update_cap(dev, net->capability);
2092 * background support to run QoS activate functionality
2094 int WDCAPARA_ADD[] = {EDCAPARA_BE, EDCAPARA_BK, EDCAPARA_VI, EDCAPARA_VO};
2095 void rtl8192_qos_activate(struct work_struct *work)
2097 struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2098 struct net_device *dev = priv->ieee80211->dev;
2099 struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2100 u8 mode = priv->ieee80211->current_network.mode;
2108 mutex_lock(&priv->mutex);
2109 if (priv->ieee80211->state != IEEE80211_LINKED)
2111 RT_TRACE(COMP_QOS, "qos active process with associate response received\n");
2112 /* It better set slot time at first */
2113 /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2114 /* update the ac parameter to related registers */
2115 for (i = 0; i < QOS_QUEUE_NUM; i++) {
2116 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2117 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2118 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2119 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2120 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2121 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2123 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2127 mutex_unlock(&priv->mutex);
2130 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2132 struct ieee80211_network *network)
2135 u32 size = sizeof(struct ieee80211_qos_parameters);
2137 if (priv->ieee80211->state != IEEE80211_LINKED)
2140 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2143 if (network->flags & NETWORK_HAS_QOS_MASK) {
2144 if (active_network &&
2145 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2146 network->qos_data.active = network->qos_data.supported;
2148 if ((network->qos_data.active == 1) && (active_network == 1) &&
2149 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2150 (network->qos_data.old_param_count !=
2151 network->qos_data.param_count)) {
2152 network->qos_data.old_param_count =
2153 network->qos_data.param_count;
2154 queue_work(priv->priv_wq, &priv->qos_activate);
2155 RT_TRACE(COMP_QOS, "QoS parameters change call "
2159 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2160 &def_qos_parameters, size);
2162 if ((network->qos_data.active == 1) && (active_network == 1)) {
2163 queue_work(priv->priv_wq, &priv->qos_activate);
2164 RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2166 network->qos_data.active = 0;
2167 network->qos_data.supported = 0;
2173 /* handle and manage frame from beacon and probe response */
2174 static int rtl8192_handle_beacon(struct net_device *dev,
2175 struct ieee80211_beacon *beacon,
2176 struct ieee80211_network *network)
2178 struct r8192_priv *priv = ieee80211_priv(dev);
2180 rtl8192_qos_handle_probe_response(priv, 1, network);
2181 queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2187 * handling the beaconing responses. if we get different QoS setting
2188 * off the network from the associated setting, adjust the QoS
2191 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2192 struct ieee80211_network *network)
2195 unsigned long flags;
2196 u32 size = sizeof(struct ieee80211_qos_parameters);
2197 int set_qos_param = 0;
2199 if ((priv == NULL) || (network == NULL))
2202 if (priv->ieee80211->state != IEEE80211_LINKED)
2205 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2208 spin_lock_irqsave(&priv->ieee80211->lock, flags);
2209 if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2210 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2211 &network->qos_data.parameters,\
2212 sizeof(struct ieee80211_qos_parameters));
2213 priv->ieee80211->current_network.qos_data.active = 1;
2215 /* update qos parameter for current network */
2216 priv->ieee80211->current_network.qos_data.old_param_count = \
2217 priv->ieee80211->current_network.qos_data.param_count;
2218 priv->ieee80211->current_network.qos_data.param_count = \
2219 network->qos_data.param_count;
2221 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2222 &def_qos_parameters, size);
2223 priv->ieee80211->current_network.qos_data.active = 0;
2224 priv->ieee80211->current_network.qos_data.supported = 0;
2228 spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2230 RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n", __func__, network->flags, priv->ieee80211->current_network.qos_data.active);
2231 if (set_qos_param == 1)
2232 queue_work(priv->priv_wq, &priv->qos_activate);
2239 static int rtl8192_handle_assoc_response(struct net_device *dev,
2240 struct ieee80211_assoc_response_frame *resp,
2241 struct ieee80211_network *network)
2243 struct r8192_priv *priv = ieee80211_priv(dev);
2244 rtl8192_qos_association_resp(priv, network);
2249 void rtl8192_update_ratr_table(struct net_device *dev)
2251 struct r8192_priv *priv = ieee80211_priv(dev);
2252 struct ieee80211_device *ieee = priv->ieee80211;
2253 u8 *pMcsRate = ieee->dot11HTOperationalRateSet;
2256 rtl8192_config_rate(dev, (u16 *)(&ratr_value));
2257 ratr_value |= (*(u16 *)(pMcsRate)) << 12;
2258 switch (ieee->mode) {
2260 ratr_value &= 0x00000FF0;
2263 ratr_value &= 0x0000000F;
2266 ratr_value &= 0x00000FF7;
2270 if (ieee->pHTInfo->PeerMimoPs == 0) {//MIMO_PS_STATIC
2271 ratr_value &= 0x0007F007;
2273 if (priv->rf_type == RF_1T2R)
2274 ratr_value &= 0x000FF007;
2276 ratr_value &= 0x0F81F007;
2282 ratr_value &= 0x0FFFFFFF;
2283 if (ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz)
2284 ratr_value |= 0x80000000;
2285 else if (!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz)
2286 ratr_value |= 0x80000000;
2287 write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2288 write_nic_byte(dev, UFWP, 1);
2291 static u8 ccmp_ie[4] = {0x00, 0x50, 0xf2, 0x04};
2292 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2293 bool GetNmodeSupportBySecCfg8192(struct net_device *dev)
2295 struct r8192_priv *priv = ieee80211_priv(dev);
2296 struct ieee80211_device *ieee = priv->ieee80211;
2297 struct ieee80211_network *network = &ieee->current_network;
2298 int wpa_ie_len = ieee->wpa_ie_len;
2299 struct ieee80211_crypt_data *crypt;
2302 crypt = ieee->crypt[ieee->tx_keyidx];
2303 //we use connecting AP's capability instead of only security config on our driver to distinguish whether it should use N mode or G mode
2304 encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")));
2307 if (encrypt && (wpa_ie_len == 0)) {
2308 /* wep encryption, no N mode setting */
2310 } else if ((wpa_ie_len != 0)) {
2311 /* parse pairwise key type */
2312 if (((ieee->wpa_ie[0] == 0xdd) && (!memcmp(&(ieee->wpa_ie[14]), ccmp_ie, 4))) || ((ieee->wpa_ie[0] == 0x30) && (!memcmp(&ieee->wpa_ie[10], ccmp_rsn_ie, 4))))
2323 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device *dev)
2326 struct r8192_priv *priv = ieee80211_priv(dev);
2327 struct ieee80211_device *ieee = priv->ieee80211;
2329 if (ieee->bHalfWirelessN24GMode == true)
2337 void rtl8192_refresh_supportrate(struct r8192_priv *priv)
2339 struct ieee80211_device *ieee = priv->ieee80211;
2340 //we do not consider set support rate for ABG mode, only HT MCS rate is set here.
2341 if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2342 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2344 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2348 u8 rtl8192_getSupportedWireleeMode(struct net_device *dev)
2350 struct r8192_priv *priv = ieee80211_priv(dev);
2352 switch (priv->rf_chip) {
2356 ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2359 ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2362 ret = WIRELESS_MODE_B;
2367 void rtl8192_SetWirelessMode(struct net_device *dev, u8 wireless_mode)
2369 struct r8192_priv *priv = ieee80211_priv(dev);
2370 u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2372 if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode) == 0)) {
2373 if (bSupportMode & WIRELESS_MODE_N_24G) {
2374 wireless_mode = WIRELESS_MODE_N_24G;
2375 } else if (bSupportMode & WIRELESS_MODE_N_5G) {
2376 wireless_mode = WIRELESS_MODE_N_5G;
2377 } else if ((bSupportMode & WIRELESS_MODE_A)) {
2378 wireless_mode = WIRELESS_MODE_A;
2379 } else if ((bSupportMode & WIRELESS_MODE_G)) {
2380 wireless_mode = WIRELESS_MODE_G;
2381 } else if ((bSupportMode & WIRELESS_MODE_B)) {
2382 wireless_mode = WIRELESS_MODE_B;
2384 RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __func__, bSupportMode);
2385 wireless_mode = WIRELESS_MODE_B;
2388 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
2389 ActUpdateChannelAccessSetting(pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting);
2391 priv->ieee80211->mode = wireless_mode;
2393 if ((wireless_mode == WIRELESS_MODE_N_24G) || (wireless_mode == WIRELESS_MODE_N_5G))
2394 priv->ieee80211->pHTInfo->bEnableHT = 1;
2396 priv->ieee80211->pHTInfo->bEnableHT = 0;
2397 RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
2398 rtl8192_refresh_supportrate(priv);
2401 //init priv variables here. only non_zero value should be initialized here.
2402 static void rtl8192_init_priv_variable(struct net_device *dev)
2404 struct r8192_priv *priv = ieee80211_priv(dev);
2406 priv->card_8192 = NIC_8192U;
2407 priv->chan = 1; //set to channel 1
2408 priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
2409 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2410 priv->ieee80211->ieee_up = 0;
2411 priv->retry_rts = DEFAULT_RETRY_RTS;
2412 priv->retry_data = DEFAULT_RETRY_DATA;
2413 priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
2414 priv->ieee80211->rate = 110; //11 mbps
2415 priv->ieee80211->short_slot = 1;
2416 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
2419 priv->IrpPendingCount = 1;
2420 priv->ResetProgress = RESET_TYPE_NORESET;
2421 priv->bForcedSilentReset = 0;
2422 priv->bDisableNormalResetCheck = false;
2423 priv->force_reset = false;
2425 priv->ieee80211->FwRWRF = 0; //we don't use FW read/write RF until stable firmware is available.
2426 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
2427 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2428 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
2429 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2430 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
2431 IEEE_SOFTMAC_BEACONS;//added by amy 080604
2433 priv->ieee80211->active_scan = 1;
2434 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
2435 priv->ieee80211->host_encrypt = 1;
2436 priv->ieee80211->host_decrypt = 1;
2437 priv->ieee80211->start_send_beacons = NULL; //-by amy 080604
2438 priv->ieee80211->stop_send_beacons = NULL; //-by amy 080604
2439 priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
2440 priv->ieee80211->set_chan = rtl8192_set_chan;
2441 priv->ieee80211->link_change = rtl8192_link_change;
2442 priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
2443 priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
2444 priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
2445 priv->ieee80211->init_wmmparam_flag = 0;
2446 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
2447 priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
2448 priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
2449 priv->ieee80211->qos_support = 1;
2452 priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
2453 priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
2454 priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
2456 priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
2457 priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
2458 priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
2460 priv->ieee80211->InitialGainHandler = InitialGain819xUsb;
2461 priv->card_type = USB;
2463 if (Adapter->bInHctTest) {
2464 pHalData->ShortRetryLimit = 7;
2465 pHalData->LongRetryLimit = 7;
2468 priv->ShortRetryLimit = 0x30;
2469 priv->LongRetryLimit = 0x30;
2470 priv->EarlyRxThreshold = 7;
2471 priv->enable_gpio0 = 0;
2472 priv->TransmitConfig =
2473 (TCR_MXDMA_2048<<TCR_MXDMA_OFFSET)| // Max DMA Burst Size per Tx DMA Burst, 7: reserved.
2474 (priv->ShortRetryLimit<<TCR_SRL_OFFSET)| // Short retry limit
2475 (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit
2476 (false ? TCR_SAT: 0); // FALSE: HW provides PLCP length and LENGEXT, TRUE: SW provides them
2478 if (Adapter->bInHctTest)
2479 pHalData->ReceiveConfig = pHalData->CSMethod |
2480 RCR_AMF | RCR_ADF | //accept management/data
2482 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2483 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
2484 RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
2485 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2486 (pHalData->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
2487 (pHalData->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
2491 priv->ReceiveConfig =
2492 RCR_AMF | RCR_ADF | //accept management/data
2493 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2494 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
2495 ((u32)7<<RCR_MXDMA_OFFSET)| // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2496 (priv->EarlyRxThreshold<<RX_FIFO_THRESHOLD_SHIFT) | // Rx FIFO Threshold, 7: No Rx threshold.
2497 (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
2499 priv->AcmControl = 0;
2500 priv->pFirmware = kzalloc(sizeof(rt_firmware), GFP_KERNEL);
2502 /* rx related queue */
2503 skb_queue_head_init(&priv->rx_queue);
2504 skb_queue_head_init(&priv->skb_queue);
2506 /* Tx related queue */
2507 for (i = 0; i < MAX_QUEUE_SIZE; i++)
2508 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
2509 for (i = 0; i < MAX_QUEUE_SIZE; i++)
2510 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
2511 for (i = 0; i < MAX_QUEUE_SIZE; i++)
2512 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
2513 priv->rf_set_chan = rtl8192_phy_SwChnl;
2517 static void rtl8192_init_priv_lock(struct r8192_priv *priv)
2519 spin_lock_init(&priv->tx_lock);
2520 spin_lock_init(&priv->irq_lock);//added by thomas
2521 sema_init(&priv->wx_sem, 1);
2522 sema_init(&priv->rf_sem, 1);
2523 mutex_init(&priv->mutex);
2526 extern void rtl819x_watchdog_wqcallback(struct work_struct *work);
2528 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
2529 //init tasklet and wait_queue here. only 2.6 above kernel is considered
2530 #define DRV_NAME "wlan0"
2531 static void rtl8192_init_priv_task(struct net_device *dev)
2533 struct r8192_priv *priv = ieee80211_priv(dev);
2535 priv->priv_wq = create_workqueue(DRV_NAME);
2537 INIT_WORK(&priv->reset_wq, rtl8192_restart);
2539 INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
2540 INIT_DELAYED_WORK(&priv->txpower_tracking_wq, dm_txpower_trackingcallback);
2541 INIT_DELAYED_WORK(&priv->rfpath_check_wq, dm_rf_pathcheck_workitemcallback);
2542 INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
2543 INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
2544 INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
2546 tasklet_init(&priv->irq_rx_tasklet,
2547 (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
2548 (unsigned long)priv);
2551 static void rtl8192_get_eeprom_size(struct net_device *dev)
2554 struct r8192_priv *priv = ieee80211_priv(dev);
2555 RT_TRACE(COMP_EPROM, "===========>%s()\n", __func__);
2556 curCR = read_nic_word_E(dev, EPROM_CMD);
2557 RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
2558 //whether need I consider BIT5?
2559 priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
2560 RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __func__, priv->epromtype);
2563 //used to swap endian. as ntohl & htonl are not necessary to swap endian, so use this instead.
2564 static inline u16 endian_swap(u16 *data)
2567 *data = (tmp >> 8) | (tmp << 8);
2570 static void rtl8192_read_eeprom_info(struct net_device *dev)
2573 u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x02};
2574 u8 bLoad_From_EEPOM = false;
2575 struct r8192_priv *priv = ieee80211_priv(dev);
2578 RT_TRACE(COMP_EPROM, "===========>%s()\n", __func__);
2579 wEPROM_ID = eprom_read(dev, 0); //first read EEPROM ID out;
2580 RT_TRACE(COMP_EPROM, "EEPROM ID is 0x%x\n", wEPROM_ID);
2582 if (wEPROM_ID != RTL8190_EEPROM_ID) {
2583 RT_TRACE(COMP_ERR, "EEPROM ID is invalid(is 0x%x(should be 0x%x)\n", wEPROM_ID, RTL8190_EEPROM_ID);
2585 bLoad_From_EEPOM = true;
2588 if (bLoad_From_EEPOM) {
2589 tmpValue = eprom_read(dev, (EEPROM_VID>>1));
2590 priv->eeprom_vid = endian_swap(&tmpValue);
2591 priv->eeprom_pid = eprom_read(dev, (EEPROM_PID>>1));
2592 tmpValue = eprom_read(dev, (EEPROM_ChannelPlan>>1));
2593 priv->eeprom_ChannelPlan = ((tmpValue&0xff00)>>8);
2594 priv->btxpowerdata_readfromEEPORM = true;
2595 priv->eeprom_CustomerID = eprom_read(dev, (EEPROM_Customer_ID>>1)) >>8;
2597 priv->eeprom_vid = 0;
2598 priv->eeprom_pid = 0;
2599 priv->card_8192_version = VERSION_819xU_B;
2600 priv->eeprom_ChannelPlan = 0;
2601 priv->eeprom_CustomerID = 0;
2603 RT_TRACE(COMP_EPROM, "vid:0x%4x, pid:0x%4x, CustomID:0x%2x, ChanPlan:0x%x\n", priv->eeprom_vid, priv->eeprom_pid, priv->eeprom_CustomerID, priv->eeprom_ChannelPlan);
2604 //set channelplan from eeprom
2605 priv->ChannelPlan = priv->eeprom_ChannelPlan;
2606 if (bLoad_From_EEPOM) {
2608 for (i = 0; i < 6; i += 2) {
2610 tmp = eprom_read(dev, (u16)((EEPROM_NODE_ADDRESS_BYTE_0 + i)>>1));
2611 *(u16 *)(&dev->dev_addr[i]) = tmp;
2614 memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
2615 //should I set IDR0 here?
2617 RT_TRACE(COMP_EPROM, "MAC addr:%pM\n", dev->dev_addr);
2618 priv->rf_type = RTL819X_DEFAULT_RF_TYPE; //default 1T2R
2619 priv->rf_chip = RF_8256;
2621 if (priv->card_8192_version == (u8)VERSION_819xU_A) {
2622 //read Tx power gain offset of legacy OFDM to HT rate
2623 if (bLoad_From_EEPOM)
2624 priv->EEPROMTxPowerDiff = (eprom_read(dev, (EEPROM_TxPowerDiff>>1))&0xff00) >> 8;
2626 priv->EEPROMTxPowerDiff = EEPROM_Default_TxPower;
2627 RT_TRACE(COMP_EPROM, "TxPowerDiff:%d\n", priv->EEPROMTxPowerDiff);
2628 //read ThermalMeter from EEPROM
2629 if (bLoad_From_EEPOM)
2630 priv->EEPROMThermalMeter = (u8)(eprom_read(dev, (EEPROM_ThermalMeter>>1))&0x00ff);
2632 priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
2633 RT_TRACE(COMP_EPROM, "ThermalMeter:%d\n", priv->EEPROMThermalMeter);
2634 //vivi, for tx power track
2635 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
2636 //read antenna tx power offset of B/C/D to A from EEPROM
2637 if (bLoad_From_EEPOM)
2638 priv->EEPROMPwDiff = (eprom_read(dev, (EEPROM_PwDiff>>1))&0x0f00)>>8;
2640 priv->EEPROMPwDiff = EEPROM_Default_PwDiff;
2641 RT_TRACE(COMP_EPROM, "TxPwDiff:%d\n", priv->EEPROMPwDiff);
2642 // Read CrystalCap from EEPROM
2643 if (bLoad_From_EEPOM)
2644 priv->EEPROMCrystalCap = (eprom_read(dev, (EEPROM_CrystalCap>>1))&0x0f);
2646 priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
2647 RT_TRACE(COMP_EPROM, "CrystalCap = %d\n", priv->EEPROMCrystalCap);
2648 //get per-channel Tx power level
2649 if (bLoad_From_EEPOM)
2650 priv->EEPROM_Def_Ver = (eprom_read(dev, (EEPROM_TxPwIndex_Ver>>1))&0xff00)>>8;
2652 priv->EEPROM_Def_Ver = 1;
2653 RT_TRACE(COMP_EPROM, "EEPROM_DEF_VER:%d\n", priv->EEPROM_Def_Ver);
2654 if (priv->EEPROM_Def_Ver == 0) { //old eeprom definition
2656 if (bLoad_From_EEPOM)
2657 priv->EEPROMTxPowerLevelCCK = (eprom_read(dev, (EEPROM_TxPwIndex_CCK>>1))&0xff) >> 8;
2659 priv->EEPROMTxPowerLevelCCK = 0x10;
2660 RT_TRACE(COMP_EPROM, "CCK Tx Power Levl: 0x%02x\n", priv->EEPROMTxPowerLevelCCK);
2661 for (i = 0; i < 3; i++) {
2662 if (bLoad_From_EEPOM) {
2663 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G+i)>>1);
2664 if (((EEPROM_TxPwIndex_OFDM_24G+i) % 2) == 0)
2665 tmpValue = tmpValue & 0x00ff;
2667 tmpValue = (tmpValue & 0xff00) >> 8;
2671 priv->EEPROMTxPowerLevelOFDM24G[i] = (u8) tmpValue;
2672 RT_TRACE(COMP_EPROM, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK);
2674 } else if (priv->EEPROM_Def_Ver == 1) {
2675 if (bLoad_From_EEPOM) {
2676 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1>>1));
2677 tmpValue = (tmpValue & 0xff00) >> 8;
2681 priv->EEPROMTxPowerLevelCCK_V1[0] = (u8)tmpValue;
2683 if (bLoad_From_EEPOM)
2684 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1 + 2)>>1);
2687 *((u16 *)(&priv->EEPROMTxPowerLevelCCK_V1[1])) = tmpValue;
2688 if (bLoad_From_EEPOM)
2689 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1>>1));
2692 *((u16 *)(&priv->EEPROMTxPowerLevelOFDM24G[0])) = tmpValue;
2693 if (bLoad_From_EEPOM)
2694 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1+2)>>1);
2697 priv->EEPROMTxPowerLevelOFDM24G[2] = (u8)tmpValue;
2698 }//endif EEPROM_Def_Ver == 1
2700 //update HAL variables
2702 for (i = 0; i < 14; i++) {
2704 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[0];
2705 else if (i >= 4 && i <= 9)
2706 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[1];
2708 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[2];
2711 for (i = 0; i < 14; i++) {
2712 if (priv->EEPROM_Def_Ver == 0) {
2714 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[0] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
2715 else if (i >= 4 && i <= 9)
2716 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK;
2718 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[2] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
2719 } else if (priv->EEPROM_Def_Ver == 1) {
2721 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[0];
2722 else if (i >= 4 && i <= 9)
2723 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[1];
2725 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[2];
2728 priv->TxPowerDiff = priv->EEPROMPwDiff;
2729 // Antenna B gain offset to antenna A, bit0~3
2730 priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);
2731 // Antenna C gain offset to antenna A, bit4~7
2732 priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);
2733 // CrystalCap, bit12~15
2734 priv->CrystalCap = priv->EEPROMCrystalCap;
2735 // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
2736 // 92U does not enable TX power tracking.
2737 priv->ThermalMeter[0] = priv->EEPROMThermalMeter;
2738 }//end if VersionID == VERSION_819xU_A
2740 //added by vivi, for dlink led, 20080416
2741 switch (priv->eeprom_CustomerID) {
2742 case EEPROM_CID_RUNTOP:
2743 priv->CustomerID = RT_CID_819x_RUNTOP;
2746 case EEPROM_CID_DLINK:
2747 priv->CustomerID = RT_CID_DLINK;
2751 priv->CustomerID = RT_CID_DEFAULT;
2756 switch (priv->CustomerID) {
2757 case RT_CID_819x_RUNTOP:
2758 priv->LedStrategy = SW_LED_MODE2;
2762 priv->LedStrategy = SW_LED_MODE4;
2766 priv->LedStrategy = SW_LED_MODE0;
2772 if (priv->rf_type == RF_1T2R) {
2773 RT_TRACE(COMP_EPROM, "\n1T2R config\n");
2775 RT_TRACE(COMP_EPROM, "\n2T4R config\n");
2778 // 2008/01/16 MH We can only know RF type in the function. So we have to init
2779 // DIG RATR table again.
2780 init_rate_adaptive(dev);
2781 //we need init DIG RATR table here again.
2783 RT_TRACE(COMP_EPROM, "<===========%s()\n", __func__);
2787 short rtl8192_get_channel_map(struct net_device *dev)
2789 struct r8192_priv *priv = ieee80211_priv(dev);
2790 if (priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN) {
2791 netdev_err(dev, "rtl8180_init: Error channel plan! Set to default.\n");
2792 priv->ChannelPlan = 0;
2794 RT_TRACE(COMP_INIT, "Channel plan is %d\n", priv->ChannelPlan);
2796 rtl819x_set_channel_map(priv->ChannelPlan, priv);
2800 short rtl8192_init(struct net_device *dev)
2803 struct r8192_priv *priv = ieee80211_priv(dev);
2805 memset(&(priv->stats), 0, sizeof(struct Stats));
2806 memset(priv->txqueue_to_outpipemap, 0, 9);
2810 u8 queuetopipe[] = {3, 2, 1, 0, 4, 8, 7, 6, 5};
2811 memcpy(priv->txqueue_to_outpipemap, queuetopipe, 9);
2815 u8 queuetopipe[] = {3, 2, 1, 0, 4, 4, 0, 4, 4};
2816 memcpy(priv->txqueue_to_outpipemap, queuetopipe, 9);
2819 rtl8192_init_priv_variable(dev);
2820 rtl8192_init_priv_lock(priv);
2821 rtl8192_init_priv_task(dev);
2822 rtl8192_get_eeprom_size(dev);
2823 rtl8192_read_eeprom_info(dev);
2824 rtl8192_get_channel_map(dev);
2826 init_timer(&priv->watch_dog_timer);
2827 priv->watch_dog_timer.data = (unsigned long)dev;
2828 priv->watch_dog_timer.function = watch_dog_timer_callback;
2829 if (rtl8192_usb_initendpoints(dev) != 0) {
2830 DMESG("Endopoints initialization failed");
2840 /******************************************************************************
2841 *function: This function actually only set RRSR, RATR and BW_OPMODE registers
2842 * not to do all the hw config as its name says
2843 * input: net_device dev
2846 * notice: This part need to modified according to the rate set we filtered
2847 * ****************************************************************************/
2848 void rtl8192_hwconfig(struct net_device *dev)
2850 u32 regRATR = 0, regRRSR = 0;
2851 u8 regBwOpMode = 0, regTmp = 0;
2852 struct r8192_priv *priv = ieee80211_priv(dev);
2855 // Set RRSR, RATR, and BW_OPMODE registers
2857 switch (priv->ieee80211->mode) {
2858 case WIRELESS_MODE_B:
2859 regBwOpMode = BW_OPMODE_20MHZ;
2860 regRATR = RATE_ALL_CCK;
2861 regRRSR = RATE_ALL_CCK;
2863 case WIRELESS_MODE_A:
2864 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
2865 regRATR = RATE_ALL_OFDM_AG;
2866 regRRSR = RATE_ALL_OFDM_AG;
2868 case WIRELESS_MODE_G:
2869 regBwOpMode = BW_OPMODE_20MHZ;
2870 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
2871 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
2873 case WIRELESS_MODE_AUTO:
2875 if (Adapter->bInHctTest) {
2876 regBwOpMode = BW_OPMODE_20MHZ;
2877 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
2878 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
2883 regBwOpMode = BW_OPMODE_20MHZ;
2884 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
2885 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
2888 case WIRELESS_MODE_N_24G:
2889 // It support CCK rate by default.
2890 // CCK rate will be filtered out only when associated AP does not support it.
2891 regBwOpMode = BW_OPMODE_20MHZ;
2892 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
2893 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
2895 case WIRELESS_MODE_N_5G:
2896 regBwOpMode = BW_OPMODE_5G;
2897 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
2898 regRRSR = RATE_ALL_OFDM_AG;
2902 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
2903 ratr_value = regRATR;
2904 if (priv->rf_type == RF_1T2R)
2905 ratr_value &= ~(RATE_ALL_OFDM_2SS);
2906 write_nic_dword(dev, RATR0, ratr_value);
2907 write_nic_byte(dev, UFWP, 1);
2908 regTmp = read_nic_byte(dev, 0x313);
2909 regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
2910 write_nic_dword(dev, RRSR, regRRSR);
2913 // Set Retry Limit here
2915 write_nic_word(dev, RETRY_LIMIT,
2916 priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
2917 priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
2918 // Set Contention Window here
2922 // Set Tx Antenna including Feedback control
2924 // Set Auto Rate fallback control
2930 //InitializeAdapter and PhyCfg
2931 bool rtl8192_adapter_start(struct net_device *dev)
2933 struct r8192_priv *priv = ieee80211_priv(dev);
2935 bool init_status = true;
2936 u8 SECR_value = 0x0;
2937 RT_TRACE(COMP_INIT, "====>%s()\n", __func__);
2938 priv->Rf_Mode = RF_OP_By_SW_3wire;
2939 //for ASIC power on sequence
2940 write_nic_byte_E(dev, 0x5f, 0x80);
2942 write_nic_byte_E(dev, 0x5f, 0xf0);
2943 write_nic_byte_E(dev, 0x5d, 0x00);
2944 write_nic_byte_E(dev, 0x5e, 0x80);
2945 write_nic_byte(dev, 0x17, 0x37);
2947 priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
2948 //config CPUReset Register
2949 //Firmware Reset or not?
2950 dwRegRead = read_nic_dword(dev, CPU_GEN);
2951 if (priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
2952 dwRegRead |= CPU_GEN_SYSTEM_RESET; //do nothing here?
2953 else if (priv->pFirmware->firmware_status == FW_STATUS_5_READY)
2954 dwRegRead |= CPU_GEN_FIRMWARE_RESET;
2956 RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __func__, priv->pFirmware->firmware_status);
2958 write_nic_dword(dev, CPU_GEN, dwRegRead);
2960 rtl8192_BBConfig(dev);
2962 //Loopback mode or not
2963 priv->LoopbackMode = RTL819xU_NO_LOOPBACK;
2965 dwRegRead = read_nic_dword(dev, CPU_GEN);
2966 if (priv->LoopbackMode == RTL819xU_NO_LOOPBACK)
2967 dwRegRead = ((dwRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
2968 else if (priv->LoopbackMode == RTL819xU_MAC_LOOPBACK)
2969 dwRegRead |= CPU_CCK_LOOPBACK;
2971 RT_TRACE(COMP_ERR, "Serious error in %s(): wrong loopback mode setting(%d)\n", __func__, priv->LoopbackMode);
2973 write_nic_dword(dev, CPU_GEN, dwRegRead);
2975 //after reset cpu, we need wait for a seconds to write in register.
2978 //xiong add for new bitfile:usb suspend reset pin set to 1. //do we need?
2979 write_nic_byte_E(dev, 0x5f, (read_nic_byte_E(dev, 0x5f)|0x20));
2982 rtl8192_hwconfig(dev);
2985 write_nic_byte(dev, CMDR, CR_RE|CR_TE);
2988 write_nic_dword(dev, MAC0, ((u32 *)dev->dev_addr)[0]);
2989 write_nic_word(dev, MAC4, ((u16 *)(dev->dev_addr + 4))[0]);
2992 write_nic_dword(dev, RCR, priv->ReceiveConfig);
2994 //Initialize Number of Reserved Pages in Firmware Queue
2995 write_nic_dword(dev, RQPN1, NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
2996 NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
2997 NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
2998 NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
2999 write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT |\
3000 NUM_OF_PAGE_IN_FW_QUEUE_CMD << RSVD_FW_QUEUE_PAGE_CMD_SHIFT);
3001 write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
3002 NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT
3004 write_nic_dword(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
3007 // TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
3008 write_nic_byte(dev, ACK_TIMEOUT, 0x30);
3010 if (priv->ResetProgress == RESET_TYPE_NORESET)
3011 rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);
3012 if (priv->ResetProgress == RESET_TYPE_NORESET) {
3013 CamResetAllEntry(dev);
3014 SECR_value |= SCR_TxEncEnable;
3015 SECR_value |= SCR_RxDecEnable;
3016 SECR_value |= SCR_NoSKMC;
3017 write_nic_byte(dev, SECR, SECR_value);
3021 write_nic_word(dev, ATIMWND, 2);
3022 write_nic_word(dev, BCN_INTERVAL, 100);
3024 #define DEFAULT_EDCA 0x005e4332
3027 for (i = 0; i < QOS_QUEUE_NUM; i++)
3028 write_nic_dword(dev, WDCAPARA_ADD[i], DEFAULT_EDCA);
3030 #ifdef USB_RX_AGGREGATION_SUPPORT
3031 //3 For usb rx firmware aggregation control
3032 if (priv->ResetProgress == RESET_TYPE_NORESET) {
3034 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
3035 ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
3036 (pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
3038 * If usb rx firmware aggregation is enabled,
3039 * when anyone of three threshold conditions above is reached,
3040 * firmware will send aggregated packet to driver.
3042 write_nic_dword(dev, 0x1a8, ulValue);
3043 priv->bCurrentRxAggrEnable = true;
3047 rtl8192_phy_configmac(dev);
3049 if (priv->card_8192_version == (u8) VERSION_819xU_A) {
3050 rtl8192_phy_getTxPower(dev);
3051 rtl8192_phy_setTxPower(dev, priv->chan);
3055 init_status = init_firmware(dev);
3057 RT_TRACE(COMP_ERR, "ERR!!! %s(): Firmware download is failed\n", __func__);
3060 RT_TRACE(COMP_INIT, "%s():after firmware download\n", __func__);
3063 if (Adapter->ResetProgress == RESET_TYPE_NORESET) {
3064 if (pMgntInfo->RegRfOff == TRUE) { // User disable RF via registry.
3065 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RegRfOff ----------\n"));
3066 MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);
3067 // Those actions will be discard in MgntActSet_RF_State because of the same state
3068 for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)
3069 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3070 } else if (pMgntInfo->RfOffReason > RF_CHANGE_BY_PS) { // H/W or S/W RF OFF before sleep.
3071 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RfOffReason(%d) ----------\n", pMgntInfo->RfOffReason));
3072 MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3074 pHalData->eRFPowerState = eRfOn;
3075 pMgntInfo->RfOffReason = 0;
3076 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): RF is on ----------\n"));
3079 if (pHalData->eRFPowerState == eRfOff) {
3080 MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3081 // Those actions will be discard in MgntActSet_RF_State because of the same state
3082 for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)
3083 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3088 if (priv->ResetProgress == RESET_TYPE_NORESET) {
3089 rtl8192_phy_RFConfig(dev);
3090 RT_TRACE(COMP_INIT, "%s():after phy RF config\n", __func__);
3094 if (priv->ieee80211->FwRWRF)
3095 // We can force firmware to do RF-R/W
3096 priv->Rf_Mode = RF_OP_By_FW;
3098 priv->Rf_Mode = RF_OP_By_SW_3wire;
3101 rtl8192_phy_updateInitGain(dev);
3102 /*--set CCK and OFDM Block "ON"--*/
3103 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
3104 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
3106 if (priv->ResetProgress == RESET_TYPE_NORESET) {
3108 u8 tmpvalue = read_nic_byte(dev, 0x301);
3109 if (tmpvalue == 0x03) {
3111 RT_TRACE(COMP_POWER_TRACKING, "D-cut\n");
3113 priv->bDcut = FALSE;
3114 RT_TRACE(COMP_POWER_TRACKING, "C-cut\n");
3116 dm_initialize_txpower_tracking(dev);
3118 if (priv->bDcut == TRUE) {
3120 u32 tmpRegA = rtl8192_QueryBBReg(dev, rOFDM0_XATxIQImbalance, bMaskDWord);
3121 for (i = 0; i < TxBBGainTableLength; i++) {
3122 if (tmpRegA == priv->txbbgain_table[i].txbbgain_value) {
3123 priv->rfa_txpowertrackingindex = (u8)i;
3124 priv->rfa_txpowertrackingindex_real = (u8)i;
3125 priv->rfa_txpowertracking_default = priv->rfa_txpowertrackingindex;
3130 TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
3132 for (i = 0; i < CCKTxBBGainTableLength; i++) {
3134 if (TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0]) {
3135 priv->cck_present_attentuation_20Mdefault = (u8) i;
3139 priv->cck_present_attentuation_40Mdefault = 0;
3140 priv->cck_present_attentuation_difference = 0;
3141 priv->cck_present_attentuation = priv->cck_present_attentuation_20Mdefault;
3145 write_nic_byte(dev, 0x87, 0x0);
3151 /* this configures registers for beacon tx and enables it via
3152 * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
3153 * be used to stop beacon transmission
3155 /***************************************************************************
3156 -------------------------------NET STUFF---------------------------
3157 ***************************************************************************/
3159 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
3161 struct r8192_priv *priv = ieee80211_priv(dev);
3163 return &priv->ieee80211->stats;
3166 bool HalTxCheckStuck819xUsb(struct net_device *dev)
3168 struct r8192_priv *priv = ieee80211_priv(dev);
3169 u16 RegTxCounter = read_nic_word(dev, 0x128);
3170 bool bStuck = FALSE;
3171 RT_TRACE(COMP_RESET, "%s():RegTxCounter is %d,TxCounter is %d\n", __func__, RegTxCounter, priv->TxCounter);
3172 if (priv->TxCounter == RegTxCounter)
3175 priv->TxCounter = RegTxCounter;
3181 * <Assumption: RT_TX_SPINLOCK is acquired.>
3182 * First added: 2006.11.19 by emily
3184 RESET_TYPE TxCheckStuck(struct net_device *dev)
3186 struct r8192_priv *priv = ieee80211_priv(dev);
3188 bool bCheckFwTxCnt = false;
3191 // Decide such threshold according to current power save mode
3194 for (QueueID = 0; QueueID <= BEACON_QUEUE; QueueID ++) {
3195 if (QueueID == TXCMD_QUEUE)
3197 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
3198 if ((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_drv_aggQ[QueueID]) == 0))
3200 if ((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
3204 bCheckFwTxCnt = true;
3206 if (bCheckFwTxCnt) {
3207 if (HalTxCheckStuck819xUsb(dev)) {
3208 RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
3209 return RESET_TYPE_SILENT;
3212 return RESET_TYPE_NORESET;
3215 bool HalRxCheckStuck819xUsb(struct net_device *dev)
3217 u16 RegRxCounter = read_nic_word(dev, 0x130);
3218 struct r8192_priv *priv = ieee80211_priv(dev);
3219 bool bStuck = FALSE;
3220 static u8 rx_chk_cnt;
3221 RT_TRACE(COMP_RESET, "%s(): RegRxCounter is %d,RxCounter is %d\n", __func__, RegRxCounter, priv->RxCounter);
3222 // If rssi is small, we should check rx for long time because of bad rx.
3223 // or maybe it will continuous silent reset every 2 seconds.
3225 if (priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5)) {
3226 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
3227 } else if (priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
3228 ((priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb >= RateAdaptiveTH_Low_40M) ||
3229 (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb >= RateAdaptiveTH_Low_20M))) {
3234 } else if (((priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb < RateAdaptiveTH_Low_40M) ||
3235 (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb < RateAdaptiveTH_Low_20M)) &&
3236 priv->undecorated_smoothed_pwdb >= VeryLowRSSI) {
3248 if (priv->RxCounter == RegRxCounter)
3251 priv->RxCounter = RegRxCounter;
3256 RESET_TYPE RxCheckStuck(struct net_device *dev)
3258 struct r8192_priv *priv = ieee80211_priv(dev);
3259 bool bRxCheck = FALSE;
3261 if (priv->IrpPendingCount > 1)
3265 if (HalRxCheckStuck819xUsb(dev)) {
3266 RT_TRACE(COMP_RESET, "RxStuck Condition\n");
3267 return RESET_TYPE_SILENT;
3270 return RESET_TYPE_NORESET;
3275 * This function is called by Checkforhang to check whether we should ask OS to reset driver
3277 * \param pAdapter The adapter context for this miniport
3279 * Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
3280 * to judge whether there is tx stuck.
3281 * Note: This function may be required to be rewrite for Vista OS.
3282 * <<<Assumption: Tx spinlock has been acquired >>>
3284 * 8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
3286 RESET_TYPE rtl819x_ifcheck_resetornot(struct net_device *dev)
3288 struct r8192_priv *priv = ieee80211_priv(dev);
3289 RESET_TYPE TxResetType = RESET_TYPE_NORESET;
3290 RESET_TYPE RxResetType = RESET_TYPE_NORESET;
3291 RT_RF_POWER_STATE rfState;
3293 rfState = priv->ieee80211->eRFPowerState;
3295 TxResetType = TxCheckStuck(dev);
3296 if (rfState != eRfOff ||
3297 (priv->ieee80211->iw_mode != IW_MODE_ADHOC)) {
3298 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
3299 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
3300 // if driver is in firmware download failure status, driver should initialize RF in the following
3301 // silent reset procedure Emily, 2008.01.21
3303 // Driver should not check RX stuck in IBSS mode because it is required to
3304 // set Check BSSID in order to send beacon, however, if check BSSID is
3305 // set, STA cannot hear any packet at all. Emily, 2008.04.12
3306 RxResetType = RxCheckStuck(dev);
3308 if (TxResetType == RESET_TYPE_NORMAL || RxResetType == RESET_TYPE_NORMAL) {
3309 return RESET_TYPE_NORMAL;
3310 } else if (TxResetType == RESET_TYPE_SILENT || RxResetType == RESET_TYPE_SILENT) {
3311 RT_TRACE(COMP_RESET, "%s():silent reset\n", __func__);
3312 return RESET_TYPE_SILENT;
3314 return RESET_TYPE_NORESET;
3319 void rtl8192_cancel_deferred_work(struct r8192_priv *priv);
3320 int _rtl8192_up(struct net_device *dev);
3321 int rtl8192_close(struct net_device *dev);
3325 void CamRestoreAllEntry(struct net_device *dev)
3328 struct r8192_priv *priv = ieee80211_priv(dev);
3329 u8 *MacAddr = priv->ieee80211->current_network.bssid;
3331 static u8 CAM_CONST_ADDR[4][6] = {
3332 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3333 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3334 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3335 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} };
3336 static u8 CAM_CONST_BROAD[] = {
3337 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3339 RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
3342 if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
3343 (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104)) {
3345 for (EntryId = 0; EntryId < 4; EntryId++) {
3346 MacAddr = CAM_CONST_ADDR[EntryId];
3350 priv->ieee80211->pairwise_key_type,
3356 } else if (priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP) {
3358 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3362 priv->ieee80211->pairwise_key_type,
3363 (u8 *)dev->dev_addr,
3370 priv->ieee80211->pairwise_key_type,
3374 } else if (priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP) {
3376 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3380 priv->ieee80211->pairwise_key_type,
3381 (u8 *)dev->dev_addr,
3388 priv->ieee80211->pairwise_key_type,
3396 if (priv->ieee80211->group_key_type == KEY_TYPE_TKIP) {
3397 MacAddr = CAM_CONST_BROAD;
3398 for (EntryId = 1; EntryId < 4; EntryId++) {
3402 priv->ieee80211->group_key_type,
3407 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3411 priv->ieee80211->group_key_type,
3415 } else if (priv->ieee80211->group_key_type == KEY_TYPE_CCMP) {
3416 MacAddr = CAM_CONST_BROAD;
3417 for (EntryId = 1; EntryId < 4; EntryId++) {
3421 priv->ieee80211->group_key_type,
3427 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3431 priv->ieee80211->group_key_type,
3437 //////////////////////////////////////////////////////////////
3438 // This function is used to fix Tx/Rx stop bug temporarily.
3439 // This function will do "system reset" to NIC when Tx or Rx is stuck.
3440 // The method checking Tx/Rx stuck of this function is supported by FW,
3441 // which reports Tx and Rx counter to register 0x128 and 0x130.
3442 //////////////////////////////////////////////////////////////
3443 void rtl819x_ifsilentreset(struct net_device *dev)
3445 struct r8192_priv *priv = ieee80211_priv(dev);
3447 int reset_status = 0;
3448 struct ieee80211_device *ieee = priv->ieee80211;
3451 // 2007.07.20. If we need to check CCK stop, please uncomment this line.
3452 //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
3454 if (priv->ResetProgress == RESET_TYPE_NORESET) {
3457 RT_TRACE(COMP_RESET, "=========>Reset progress!! \n");
3459 // Set the variable for reset.
3460 priv->ResetProgress = RESET_TYPE_SILENT;
3461 down(&priv->wx_sem);
3462 if (priv->up == 0) {
3463 RT_TRACE(COMP_ERR, "%s():the driver is not up! return\n", __func__);
3468 RT_TRACE(COMP_RESET, "%s():======>start to down the driver\n", __func__);
3470 rtl8192_rtx_disable(dev);
3471 rtl8192_cancel_deferred_work(priv);
3473 del_timer_sync(&priv->watch_dog_timer);
3475 ieee->sync_scan_hurryup = 1;
3476 if (ieee->state == IEEE80211_LINKED) {
3477 down(&ieee->wx_sem);
3478 netdev_dbg(dev, "ieee->state is IEEE80211_LINKED\n");
3479 ieee80211_stop_send_beacons(priv->ieee80211);
3480 del_timer_sync(&ieee->associate_timer);
3481 cancel_delayed_work(&ieee->associate_retry_wq);
3482 ieee80211_stop_scan(ieee);
3483 netif_carrier_off(dev);
3486 netdev_dbg(dev, "ieee->state is NOT LINKED\n");
3487 ieee80211_softmac_stop_protocol(priv->ieee80211);
3490 RT_TRACE(COMP_RESET, "%s():<==========down process is finished\n", __func__);
3491 RT_TRACE(COMP_RESET, "%s():===========>start up the driver\n", __func__);
3492 reset_status = _rtl8192_up(dev);
3494 RT_TRACE(COMP_RESET, "%s():<===========up process is finished\n", __func__);
3495 if (reset_status == -EAGAIN) {
3496 if (reset_times < 3) {
3500 RT_TRACE(COMP_ERR, " ERR!!! %s(): Reset Failed!!\n", __func__);
3503 ieee->is_silent_reset = 1;
3504 EnableHWSecurityConfig8192(dev);
3505 if (ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA) {
3506 ieee->set_chan(ieee->dev, ieee->current_network.channel);
3508 queue_work(ieee->wq, &ieee->associate_complete_wq);
3510 } else if (ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC) {
3511 ieee->set_chan(ieee->dev, ieee->current_network.channel);
3512 ieee->link_change(ieee->dev);
3514 ieee80211_start_send_beacons(ieee);
3516 if (ieee->data_hard_resume)
3517 ieee->data_hard_resume(ieee->dev);
3518 netif_carrier_on(ieee->dev);
3521 CamRestoreAllEntry(dev);
3523 priv->ResetProgress = RESET_TYPE_NORESET;
3524 priv->reset_count++;
3526 priv->bForcedSilentReset = false;
3527 priv->bResetInProgress = false;
3529 // For test --> force write UFWP.
3530 write_nic_byte(dev, UFWP, 1);
3531 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
3535 void CAM_read_entry(struct net_device *dev, u32 iIndex)
3537 u32 target_command = 0;
3538 u32 target_content = 0;
3542 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
3543 // polling bit, and No Write enable, and address
3544 target_command = entry_i+CAM_CONTENT_COUNT*iIndex;
3545 target_command = target_command | BIT31;
3547 //Check polling bit is clear
3548 while ((i--) >= 0) {
3549 ulStatus = read_nic_dword(dev, RWCAM);
3550 if (ulStatus & BIT31)
3555 write_nic_dword(dev, RWCAM, target_command);
3556 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A0: %x \n", target_command);
3557 target_content = read_nic_dword(dev, RCAMO);
3558 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n", target_content);
3563 void rtl819x_update_rxcounts(struct r8192_priv *priv, u32 *TotalRxBcnNum,
3564 u32 *TotalRxDataNum)
3570 *TotalRxDataNum = 0;
3572 SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
3573 priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
3574 priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
3575 for (i = 0; i < priv->ieee80211->LinkDetectInfo.SlotNum; i++) {
3576 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
3577 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
3582 extern void rtl819x_watchdog_wqcallback(struct work_struct *work)
3584 struct delayed_work *dwork = container_of(work, struct delayed_work, work);
3585 struct r8192_priv *priv = container_of(dwork, struct r8192_priv, watch_dog_wq);
3586 struct net_device *dev = priv->ieee80211->dev;
3587 struct ieee80211_device *ieee = priv->ieee80211;
3588 RESET_TYPE ResetType = RESET_TYPE_NORESET;
3589 static u8 check_reset_cnt;
3590 bool bBusyTraffic = false;
3591 u32 TotalRxBcnNum = 0;
3592 u32 TotalRxDataNum = 0;
3596 hal_dm_watchdog(dev);
3598 //to get busy traffic condition
3599 if (ieee->state == IEEE80211_LINKED) {
3600 if (ieee->LinkDetectInfo.NumRxOkInPeriod > 666 ||
3601 ieee->LinkDetectInfo.NumTxOkInPeriod > 666 ) {
3602 bBusyTraffic = true;
3604 ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
3605 ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
3606 ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
3608 //added by amy for AP roaming
3609 if (priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA) {
3611 rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
3612 if ((TotalRxBcnNum+TotalRxDataNum) == 0) {
3614 if (rfState == eRfOff)
3615 RT_TRACE(COMP_ERR, "========>%s()\n", __func__);
3617 netdev_dbg(dev, "===>%s(): AP is power off, connect another one\n", __func__);
3618 priv->ieee80211->state = IEEE80211_ASSOCIATING;
3619 notify_wx_assoc_event(priv->ieee80211);
3620 RemovePeerTS(priv->ieee80211, priv->ieee80211->current_network.bssid);
3621 priv->ieee80211->link_change(dev);
3622 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
3626 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod = 0;
3627 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod = 0;
3628 //check if reset the driver
3629 if (check_reset_cnt++ >= 3) {
3630 ResetType = rtl819x_ifcheck_resetornot(dev);
3631 check_reset_cnt = 3;
3633 if ((priv->force_reset) || (priv->ResetProgress == RESET_TYPE_NORESET &&
3634 (priv->bForcedSilentReset ||
3635 (!priv->bDisableNormalResetCheck && ResetType == RESET_TYPE_SILENT)))) { // This is control by OID set in Pomelo
3636 RT_TRACE(COMP_RESET, "%s():priv->force_reset is %d,priv->ResetProgress is %d, priv->bForcedSilentReset is %d,priv->bDisableNormalResetCheck is %d,ResetType is %d\n", __func__, priv->force_reset, priv->ResetProgress, priv->bForcedSilentReset, priv->bDisableNormalResetCheck, ResetType);
3637 rtl819x_ifsilentreset(dev);
3639 priv->force_reset = false;
3640 priv->bForcedSilentReset = false;
3641 priv->bResetInProgress = false;
3642 RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
3646 void watch_dog_timer_callback(unsigned long data)
3648 struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
3649 queue_delayed_work(priv->priv_wq, &priv->watch_dog_wq, 0);
3650 mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
3652 int _rtl8192_up(struct net_device *dev)
3654 struct r8192_priv *priv = ieee80211_priv(dev);
3655 int init_status = 0;
3657 priv->ieee80211->ieee_up = 1;
3658 RT_TRACE(COMP_INIT, "Bringing up iface");
3659 init_status = rtl8192_adapter_start(dev);
3661 RT_TRACE(COMP_ERR, "ERR!!! %s(): initialization failed!\n", __func__);
3662 priv->up = priv->ieee80211->ieee_up = 0;
3665 RT_TRACE(COMP_INIT, "start adapter finished\n");
3666 rtl8192_rx_enable(dev);
3667 if (priv->ieee80211->state != IEEE80211_LINKED)
3668 ieee80211_softmac_start_protocol(priv->ieee80211);
3669 ieee80211_reset_queue(priv->ieee80211);
3670 watch_dog_timer_callback((unsigned long) dev);
3671 if (!netif_queue_stopped(dev))
3672 netif_start_queue(dev);
3674 netif_wake_queue(dev);
3680 int rtl8192_open(struct net_device *dev)
3682 struct r8192_priv *priv = ieee80211_priv(dev);
3684 down(&priv->wx_sem);
3685 ret = rtl8192_up(dev);
3692 int rtl8192_up(struct net_device *dev)
3694 struct r8192_priv *priv = ieee80211_priv(dev);
3696 if (priv->up == 1) return -1;
3698 return _rtl8192_up(dev);
3702 int rtl8192_close(struct net_device *dev)
3704 struct r8192_priv *priv = ieee80211_priv(dev);
3707 down(&priv->wx_sem);
3709 ret = rtl8192_down(dev);
3717 int rtl8192_down(struct net_device *dev)
3719 struct r8192_priv *priv = ieee80211_priv(dev);
3722 if (priv->up == 0) return -1;
3725 priv->ieee80211->ieee_up = 0;
3726 RT_TRACE(COMP_DOWN, "==========>%s()\n", __func__);
3728 if (!netif_queue_stopped(dev))
3729 netif_stop_queue(dev);
3731 rtl8192_rtx_disable(dev);
3733 /* Tx related queue release */
3734 for (i = 0; i < MAX_QUEUE_SIZE; i++)
3735 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
3736 for (i = 0; i < MAX_QUEUE_SIZE; i++)
3737 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
3739 for (i = 0; i < MAX_QUEUE_SIZE; i++)
3740 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
3742 //as cancel_delayed_work will del work->timer, so if work is not defined as struct delayed_work, it will corrupt
3743 rtl8192_cancel_deferred_work(priv);
3745 del_timer_sync(&priv->watch_dog_timer);
3748 ieee80211_softmac_stop_protocol(priv->ieee80211);
3749 memset(&priv->ieee80211->current_network, 0, offsetof(struct ieee80211_network, list));
3750 RT_TRACE(COMP_DOWN, "<==========%s()\n", __func__);
3756 void rtl8192_commit(struct net_device *dev)
3758 struct r8192_priv *priv = ieee80211_priv(dev);
3759 int reset_status = 0;
3760 if (priv->up == 0) return;
3763 rtl8192_cancel_deferred_work(priv);
3764 del_timer_sync(&priv->watch_dog_timer);
3766 ieee80211_softmac_stop_protocol(priv->ieee80211);
3768 rtl8192_rtx_disable(dev);
3769 reset_status = _rtl8192_up(dev);
3773 void rtl8192_restart(struct work_struct *work)
3775 struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
3776 struct net_device *dev = priv->ieee80211->dev;
3778 down(&priv->wx_sem);
3780 rtl8192_commit(dev);
3785 static void r8192_set_multicast(struct net_device *dev)
3787 struct r8192_priv *priv = ieee80211_priv(dev);
3792 promisc = (dev->flags & IFF_PROMISC) ? 1:0;
3794 if (promisc != priv->promisc)
3796 priv->promisc = promisc;
3800 int r8192_set_mac_adr(struct net_device *dev, void *mac)
3802 struct r8192_priv *priv = ieee80211_priv(dev);
3803 struct sockaddr *addr = mac;
3805 down(&priv->wx_sem);
3807 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
3809 schedule_work(&priv->reset_wq);
3815 /* based on ipw2200 driver */
3816 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
3818 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3819 struct iwreq *wrq = (struct iwreq *)rq;
3821 struct ieee80211_device *ieee = priv->ieee80211;
3823 u8 broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3824 struct iw_point *p = &wrq->u.data;
3825 struct ieee_param *ipw = NULL;
3827 down(&priv->wx_sem);
3830 if (p->length < sizeof(struct ieee_param) || !p->pointer) {
3835 ipw = kmalloc(p->length, GFP_KERNEL);
3840 if (copy_from_user(ipw, p->pointer, p->length)) {
3847 case RTL_IOCTL_WPA_SUPPLICANT:
3848 //parse here for HW security
3849 if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION) {
3850 if (ipw->u.crypt.set_tx) {
3851 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0) {
3852 ieee->pairwise_key_type = KEY_TYPE_CCMP;
3853 } else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0) {
3854 ieee->pairwise_key_type = KEY_TYPE_TKIP;
3855 } else if (strcmp(ipw->u.crypt.alg, "WEP") == 0) {
3856 if (ipw->u.crypt.key_len == 13)
3857 ieee->pairwise_key_type = KEY_TYPE_WEP104;
3858 else if (ipw->u.crypt.key_len == 5)
3859 ieee->pairwise_key_type = KEY_TYPE_WEP40;
3861 ieee->pairwise_key_type = KEY_TYPE_NA;
3864 if (ieee->pairwise_key_type) {
3865 memcpy((u8 *)key, ipw->u.crypt.key, 16);
3866 EnableHWSecurityConfig8192(dev);
3867 //we fill both index entry and 4th entry for pairwise key as in IPW interface, adhoc will only get here, so we need index entry for its default key serching!
3869 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8 *)ieee->ap_mac_addr, 0, key);
3870 if (ieee->auth_mode != 2)
3871 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8 *)ieee->ap_mac_addr, 0, key);
3874 memcpy((u8 *)key, ipw->u.crypt.key, 16);
3875 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0) {
3876 ieee->group_key_type = KEY_TYPE_CCMP;
3877 } else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0) {
3878 ieee->group_key_type = KEY_TYPE_TKIP;
3879 } else if (strcmp(ipw->u.crypt.alg, "WEP") == 0) {
3880 if (ipw->u.crypt.key_len == 13)
3881 ieee->group_key_type = KEY_TYPE_WEP104;
3882 else if (ipw->u.crypt.key_len == 5)
3883 ieee->group_key_type = KEY_TYPE_WEP40;
3885 ieee->group_key_type = KEY_TYPE_NA;
3888 if (ieee->group_key_type) {
3891 ipw->u.crypt.idx, //KeyIndex
3892 ieee->group_key_type, //KeyType
3893 broadcast_addr, //MacAddr
3899 #ifdef JOHN_HWSEC_DEBUG
3901 printk("@@ wrq->u pointer = ");
3902 for (i = 0; i < wrq->u.data.length; i++) {
3903 if (i%10 == 0) printk("\n");
3904 printk("%8x|", ((u32 *)wrq->u.data.pointer)[i]);
3907 #endif /*JOHN_HWSEC_DEBUG*/
3908 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
3922 u8 HwRateToMRate90(bool bIsHT, u8 rate)
3928 case DESC90_RATE1M: ret_rate = MGN_1M; break;
3929 case DESC90_RATE2M: ret_rate = MGN_2M; break;
3930 case DESC90_RATE5_5M: ret_rate = MGN_5_5M; break;
3931 case DESC90_RATE11M: ret_rate = MGN_11M; break;
3932 case DESC90_RATE6M: ret_rate = MGN_6M; break;
3933 case DESC90_RATE9M: ret_rate = MGN_9M; break;
3934 case DESC90_RATE12M: ret_rate = MGN_12M; break;
3935 case DESC90_RATE18M: ret_rate = MGN_18M; break;
3936 case DESC90_RATE24M: ret_rate = MGN_24M; break;
3937 case DESC90_RATE36M: ret_rate = MGN_36M; break;
3938 case DESC90_RATE48M: ret_rate = MGN_48M; break;
3939 case DESC90_RATE54M: ret_rate = MGN_54M; break;
3943 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
3949 case DESC90_RATEMCS0: ret_rate = MGN_MCS0; break;
3950 case DESC90_RATEMCS1: ret_rate = MGN_MCS1; break;
3951 case DESC90_RATEMCS2: ret_rate = MGN_MCS2; break;
3952 case DESC90_RATEMCS3: ret_rate = MGN_MCS3; break;
3953 case DESC90_RATEMCS4: ret_rate = MGN_MCS4; break;
3954 case DESC90_RATEMCS5: ret_rate = MGN_MCS5; break;
3955 case DESC90_RATEMCS6: ret_rate = MGN_MCS6; break;
3956 case DESC90_RATEMCS7: ret_rate = MGN_MCS7; break;
3957 case DESC90_RATEMCS8: ret_rate = MGN_MCS8; break;
3958 case DESC90_RATEMCS9: ret_rate = MGN_MCS9; break;
3959 case DESC90_RATEMCS10: ret_rate = MGN_MCS10; break;
3960 case DESC90_RATEMCS11: ret_rate = MGN_MCS11; break;
3961 case DESC90_RATEMCS12: ret_rate = MGN_MCS12; break;
3962 case DESC90_RATEMCS13: ret_rate = MGN_MCS13; break;
3963 case DESC90_RATEMCS14: ret_rate = MGN_MCS14; break;
3964 case DESC90_RATEMCS15: ret_rate = MGN_MCS15; break;
3965 case DESC90_RATEMCS32: ret_rate = (0x80|0x20); break;
3969 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
3978 * Function: UpdateRxPktTimeStamp
3979 * Overview: Record the TSF time stamp when receiving a packet
3987 * (pRfd->Status.TimeStampHigh is updated)
3988 * (pRfd->Status.TimeStampLow is updated)
3992 void UpdateRxPktTimeStamp8190(struct net_device *dev, struct ieee80211_rx_stats *stats)
3994 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3996 if (stats->bIsAMPDU && !stats->bFirstMPDU) {
3997 stats->mac_time[0] = priv->LastRxDescTSFLow;
3998 stats->mac_time[1] = priv->LastRxDescTSFHigh;
4000 priv->LastRxDescTSFLow = stats->mac_time[0];
4001 priv->LastRxDescTSFHigh = stats->mac_time[1];
4007 long rtl819x_translate_todbm(u8 signal_strength_index)// 0-100 index.
4009 long signal_power; // in dBm.
4011 // Translate to dBm (x=0.5y-95).
4012 signal_power = (long)((signal_strength_index + 1) >> 1);
4015 return signal_power;
4019 /* 2008/01/22 MH We can not declare RSSI/EVM total value of sliding window to
4020 be a local static. Otherwise, it may increase when we return from S3/S4. The
4021 value will be kept in memory or disk. Declare the value in the adaptor
4022 and it will be reinitialized when returned from S3/S4. */
4023 void rtl8192_process_phyinfo(struct r8192_priv *priv, u8 *buffer, struct ieee80211_rx_stats *pprevious_stats, struct ieee80211_rx_stats *pcurrent_stats)
4025 bool bcheck = false;
4027 u32 nspatial_stream, tmp_val;
4028 static u32 slide_rssi_index, slide_rssi_statistics;
4029 static u32 slide_evm_index, slide_evm_statistics;
4030 static u32 last_rssi, last_evm;
4032 static u32 slide_beacon_adc_pwdb_index, slide_beacon_adc_pwdb_statistics;
4033 static u32 last_beacon_adc_pwdb;
4035 struct ieee80211_hdr_3addr *hdr;
4037 unsigned int frag, seq;
4038 hdr = (struct ieee80211_hdr_3addr *)buffer;
4039 sc = le16_to_cpu(hdr->seq_ctl);
4040 frag = WLAN_GET_SEQ_FRAG(sc);
4041 seq = WLAN_GET_SEQ_SEQ(sc);
4042 //cosa add 04292008 to record the sequence number
4043 pcurrent_stats->Seq_Num = seq;
4045 // Check whether we should take the previous packet into accounting
4047 if (!pprevious_stats->bIsAMPDU) {
4048 // if previous packet is not aggregated packet
4052 if (slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX) {
4053 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
4054 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
4055 priv->stats.slide_rssi_total -= last_rssi;
4057 priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
4059 priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
4060 if (slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
4061 slide_rssi_index = 0;
4063 // <1> Showed on UI for user, in dbm
4064 tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
4065 priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
4066 pcurrent_stats->rssi = priv->stats.signal_strength;
4068 // If the previous packet does not match the criteria, neglect it
4070 if (!pprevious_stats->bPacketMatchBSSID) {
4071 if (!pprevious_stats->bToSelfBA)
4079 //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
4084 priv->stats.num_process_phyinfo++;
4086 /* record the general signal strength to the sliding window. */
4089 // <2> Showed on UI for engineering
4090 // hardware does not provide rssi information for each rf path in CCK
4091 if (!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA)) {
4092 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++) {
4093 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
4096 //Fixed by Jacken 2008-03-20
4097 if (priv->stats.rx_rssi_percentage[rfpath] == 0)
4098 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
4099 if (pprevious_stats->RxMIMOSignalStrength[rfpath] > priv->stats.rx_rssi_percentage[rfpath]) {
4100 priv->stats.rx_rssi_percentage[rfpath] =
4101 ((priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4102 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4103 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath] + 1;
4105 priv->stats.rx_rssi_percentage[rfpath] =
4106 ((priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4107 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4109 RT_TRACE(COMP_DBG, "priv->stats.rx_rssi_percentage[rfPath] = %d \n", priv->stats.rx_rssi_percentage[rfpath]);
4117 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4118 pprevious_stats->bIsCCK? "CCK": "OFDM",
4119 pprevious_stats->RxPWDBAll);
4121 if (pprevious_stats->bPacketBeacon) {
4122 /* record the beacon pwdb to the sliding window. */
4123 if (slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX) {
4124 slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
4125 last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
4126 priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
4128 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
4129 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
4130 slide_beacon_adc_pwdb_index++;
4131 if (slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4132 slide_beacon_adc_pwdb_index = 0;
4133 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
4134 if (pprevious_stats->RxPWDBAll >= 3)
4135 pprevious_stats->RxPWDBAll -= 3;
4138 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4139 pprevious_stats->bIsCCK? "CCK": "OFDM",
4140 pprevious_stats->RxPWDBAll);
4143 if (pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA) {
4144 if (priv->undecorated_smoothed_pwdb < 0) // initialize
4145 priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
4146 if (pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb) {
4147 priv->undecorated_smoothed_pwdb =
4148 (((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4149 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4150 priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
4152 priv->undecorated_smoothed_pwdb =
4153 (((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4154 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4162 /* record the general EVM to the sliding window. */
4163 if (pprevious_stats->SignalQuality) {
4164 if (pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA) {
4165 if (slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX) {
4166 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
4167 last_evm = priv->stats.slide_evm[slide_evm_index];
4168 priv->stats.slide_evm_total -= last_evm;
4171 priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
4173 priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
4174 if (slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
4175 slide_evm_index = 0;
4177 // <1> Showed on UI for user, in percentage.
4178 tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
4179 priv->stats.signal_quality = tmp_val;
4180 //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
4181 priv->stats.last_signal_strength_inpercent = tmp_val;
4184 // <2> Showed on UI for engineering
4185 if (pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA) {
4186 for (nspatial_stream = 0; nspatial_stream < 2; nspatial_stream++) { // 2 spatial stream
4187 if (pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1) {
4188 if (priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
4189 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
4190 priv->stats.rx_evm_percentage[nspatial_stream] =
4191 ((priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
4192 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
4201 /*-----------------------------------------------------------------------------
4202 * Function: rtl819x_query_rxpwrpercentage()
4206 * Input: char antpower
4210 * Return: 0-100 percentage
4214 * 05/26/2008 amy Create Version 0 porting from windows code.
4216 *---------------------------------------------------------------------------*/
4217 static u8 rtl819x_query_rxpwrpercentage(char antpower)
4219 if ((antpower <= -100) || (antpower >= 20))
4221 else if (antpower >= 0)
4224 return (100+antpower);
4226 } /* QueryRxPwrPercentage */
4228 static u8 rtl819x_evm_dbtopercentage(char value)
4238 ret_val = 0 - ret_val;
4246 // We want good-looking for signal strength/quality
4247 // 2007/7/19 01:09, by cosa.
4249 long rtl819x_signal_scale_mapping(long currsig)
4253 // Step 1. Scale mapping.
4254 if (currsig >= 61 && currsig <= 100)
4255 retsig = 90 + ((currsig - 60) / 4);
4256 else if (currsig >= 41 && currsig <= 60)
4257 retsig = 78 + ((currsig - 40) / 2);
4258 else if (currsig >= 31 && currsig <= 40)
4259 retsig = 66 + (currsig - 30);
4260 else if (currsig >= 21 && currsig <= 30)
4261 retsig = 54 + (currsig - 20);
4262 else if (currsig >= 5 && currsig <= 20)
4263 retsig = 42 + (((currsig - 5) * 2) / 3);
4264 else if (currsig == 4)
4266 else if (currsig == 3)
4268 else if (currsig == 2)
4270 else if (currsig == 1)
4278 static void rtl8192_query_rxphystatus(struct r8192_priv *priv,
4279 struct ieee80211_rx_stats *pstats,
4280 rx_drvinfo_819x_usb *pdrvinfo,
4281 struct ieee80211_rx_stats *precord_stats,
4282 bool bpacket_match_bssid,
4283 bool bpacket_toself,
4287 phy_sts_ofdm_819xusb_t *pofdm_buf;
4288 phy_sts_cck_819xusb_t *pcck_buf;
4289 phy_ofdm_rx_status_rxsc_sgien_exintfflag *prxsc;
4291 u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
4292 char rx_pwr[4], rx_pwr_all = 0;
4293 char rx_snrX, rx_evmX;
4295 u32 RSSI, total_rssi = 0;
4301 priv->stats.numqry_phystatus++;
4303 is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
4305 // Record it for next packet processing
4306 memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
4307 pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
4308 pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
4309 pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;
4310 pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
4311 pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
4313 prxpkt = (u8 *)pdrvinfo;
4315 /* Move pointer to the 16th bytes. Phy status start address. */
4316 prxpkt += sizeof(rx_drvinfo_819x_usb);
4318 /* Initial the cck and ofdm buffer pointer */
4319 pcck_buf = (phy_sts_cck_819xusb_t *)prxpkt;
4320 pofdm_buf = (phy_sts_ofdm_819xusb_t *)prxpkt;
4322 pstats->RxMIMOSignalQuality[0] = -1;
4323 pstats->RxMIMOSignalQuality[1] = -1;
4324 precord_stats->RxMIMOSignalQuality[0] = -1;
4325 precord_stats->RxMIMOSignalQuality[1] = -1;
4329 // (1)Hardware does not provide RSSI for CCK
4333 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
4337 priv->stats.numqry_phystatusCCK++;
4339 if (!priv->bCckHighPower) {
4340 report = pcck_buf->cck_agc_rpt & 0xc0;
4343 //Fixed by Jacken from Bryant 2008-03-20
4344 //Original value is -38 , -26 , -14 , -2
4345 //Fixed value is -35 , -23 , -11 , 6
4347 rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
4350 rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
4353 rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
4356 rx_pwr_all = 6 - (pcck_buf->cck_agc_rpt & 0x3e);
4360 report = pcck_buf->cck_agc_rpt & 0x60;
4364 rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
4367 rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
4370 rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
4373 rx_pwr_all = 6 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
4378 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
4379 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
4380 pstats->RecvSignalPower = pwdb_all;
4383 // (3) Get Signal Quality (EVM)
4386 if (pstats->RxPWDBAll > 40) {
4389 sq = pcck_buf->sq_rpt;
4391 if (pcck_buf->sq_rpt > 64)
4393 else if (pcck_buf->sq_rpt < 20)
4396 sq = ((64-sq) * 100) / 44;
4398 pstats->SignalQuality = precord_stats->SignalQuality = sq;
4399 pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
4400 pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
4403 priv->stats.numqry_phystatusHT++;
4405 // (1)Get RSSI for HT rate
4407 for (i = RF90_PATH_A; i < priv->NumTotalRFPath; i++) {
4408 // 2008/01/30 MH we will judge RF RX path now.
4409 if (priv->brfpath_rxenable[i])
4414 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
4417 //Fixed by Jacken from Bryant 2008-03-20
4418 //Original value is 106
4419 rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
4421 //Get Rx snr value in DB
4422 tmp_rxsnr = pofdm_buf->rxsnr_X[i];
4423 rx_snrX = (char)(tmp_rxsnr);
4425 priv->stats.rxSNRdB[i] = (long)rx_snrX;
4427 /* Translate DBM to percentage. */
4428 RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
4431 /* Record Signal Strength for next packet */
4432 pstats->RxMIMOSignalStrength[i] = (u8) RSSI;
4433 precord_stats->RxMIMOSignalStrength[i] = (u8) RSSI;
4438 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
4440 //Fixed by Jacken from Bryant 2008-03-20
4441 //Original value is 106
4442 rx_pwr_all = (((pofdm_buf->pwdb_all) >> 1)& 0x7f) -106;
4443 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
4445 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
4446 pstats->RxPower = precord_stats->RxPower = rx_pwr_all;
4449 // (3)EVM of HT rate
4451 if (pdrvinfo->RxHT && pdrvinfo->RxRate >= DESC90_RATEMCS8 &&
4452 pdrvinfo->RxRate <= DESC90_RATEMCS15)
4453 max_spatial_stream = 2; //both spatial stream make sense
4455 max_spatial_stream = 1; //only spatial stream 1 makes sense
4457 for (i = 0; i < max_spatial_stream; i++) {
4458 tmp_rxevm = pofdm_buf->rxevm_X[i];
4459 rx_evmX = (char)(tmp_rxevm);
4461 // Do not use shift operation like "rx_evmX >>= 1" because the compiler of free build environment
4462 // will set the most significant bit to "zero" when doing shifting operation which may change a negative
4463 // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.
4466 evm = rtl819x_evm_dbtopercentage(rx_evmX);
4467 if (i == 0) // Fill value in RFD, Get the first spatial stream only
4468 pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
4469 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
4473 /* record rx statistics for debug */
4474 rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
4475 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
4476 if (pdrvinfo->BW) //40M channel
4477 priv->stats.received_bwtype[1+prxsc->rxsc]++;
4479 priv->stats.received_bwtype[0]++;
4482 //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
4483 //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
4485 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));
4487 // We can judge RX path number now.
4489 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi /= rf_rx_num)));
4491 } /* QueryRxPhyStatus8190Pci */
4493 void rtl8192_record_rxdesc_forlateruse(struct ieee80211_rx_stats *psrc_stats,
4494 struct ieee80211_rx_stats *ptarget_stats)
4496 ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
4497 ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
4498 ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
4502 void TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
4503 struct ieee80211_rx_stats *pstats,
4504 rx_drvinfo_819x_usb *pdrvinfo)
4506 // TODO: We must only check packet for current MAC address. Not finish
4507 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
4508 struct net_device *dev = info->dev;
4509 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4510 bool bpacket_match_bssid, bpacket_toself;
4511 bool bPacketBeacon = FALSE, bToSelfBA = FALSE;
4512 static struct ieee80211_rx_stats previous_stats;
4513 struct ieee80211_hdr_3addr *hdr;//by amy
4516 // Get Signal Quality for only RX data queue (but not command queue)
4521 /* Get MAC frame start address. */
4522 tmp_buf = (u8 *)skb->data;
4524 hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
4525 fc = le16_to_cpu(hdr->frame_ctl);
4526 type = WLAN_FC_GET_TYPE(fc);
4527 praddr = hdr->addr1;
4529 /* Check if the received packet is acceptable. */
4530 bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
4531 (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS)? hdr->addr2 : hdr->addr3))
4532 && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
4533 bpacket_toself = bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
4535 if (WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BEACON)
4536 bPacketBeacon = true;
4537 if (WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK) {
4538 if ((eqMacAddr(praddr, dev->dev_addr)))
4544 if (bpacket_match_bssid)
4545 priv->stats.numpacket_matchbssid++;
4547 priv->stats.numpacket_toself++;
4549 // Process PHY information for previous packet (RSSI/PWDB/EVM)
4551 // Because phy information is contained in the last packet of AMPDU only, so driver
4552 // should process phy information of previous packet
4553 rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
4554 rtl8192_query_rxphystatus(priv, pstats, pdrvinfo, &previous_stats, bpacket_match_bssid, bpacket_toself, bPacketBeacon, bToSelfBA);
4555 rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
4560 * Function: UpdateReceivedRateHistogramStatistics
4561 * Overview: Record the received data rate
4564 * struct net_device *dev
4565 * struct ieee80211_rx_stats *stats
4569 * (priv->stats.ReceivedRateHistogram[] is updated)
4573 void UpdateReceivedRateHistogramStatistics8190(struct net_device *dev,
4574 struct ieee80211_rx_stats *stats)
4576 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4577 u32 rcvType = 1; //0: Total, 1:OK, 2:CRC, 3:ICV
4579 u32 preamble_guardinterval; //1: short preamble/GI, 0: long preamble/GI
4584 else if (stats->bICV)
4587 if (stats->bShortPreamble)
4588 preamble_guardinterval = 1;// short
4590 preamble_guardinterval = 0;// long
4592 switch (stats->rate) {
4596 case MGN_1M: rateIndex = 0; break;
4597 case MGN_2M: rateIndex = 1; break;
4598 case MGN_5_5M: rateIndex = 2; break;
4599 case MGN_11M: rateIndex = 3; break;
4603 case MGN_6M: rateIndex = 4; break;
4604 case MGN_9M: rateIndex = 5; break;
4605 case MGN_12M: rateIndex = 6; break;
4606 case MGN_18M: rateIndex = 7; break;
4607 case MGN_24M: rateIndex = 8; break;
4608 case MGN_36M: rateIndex = 9; break;
4609 case MGN_48M: rateIndex = 10; break;
4610 case MGN_54M: rateIndex = 11; break;
4612 // 11n High throughput rate
4614 case MGN_MCS0: rateIndex = 12; break;
4615 case MGN_MCS1: rateIndex = 13; break;
4616 case MGN_MCS2: rateIndex = 14; break;
4617 case MGN_MCS3: rateIndex = 15; break;
4618 case MGN_MCS4: rateIndex = 16; break;
4619 case MGN_MCS5: rateIndex = 17; break;
4620 case MGN_MCS6: rateIndex = 18; break;
4621 case MGN_MCS7: rateIndex = 19; break;
4622 case MGN_MCS8: rateIndex = 20; break;
4623 case MGN_MCS9: rateIndex = 21; break;
4624 case MGN_MCS10: rateIndex = 22; break;
4625 case MGN_MCS11: rateIndex = 23; break;
4626 case MGN_MCS12: rateIndex = 24; break;
4627 case MGN_MCS13: rateIndex = 25; break;
4628 case MGN_MCS14: rateIndex = 26; break;
4629 case MGN_MCS15: rateIndex = 27; break;
4630 default: rateIndex = 28; break;
4632 priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
4633 priv->stats.received_rate_histogram[0][rateIndex]++; //total
4634 priv->stats.received_rate_histogram[rcvType][rateIndex]++;
4638 void query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
4640 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
4641 struct net_device *dev = info->dev;
4642 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4643 rx_drvinfo_819x_usb *driver_info = NULL;
4646 //Get Rx Descriptor Information
4648 #ifdef USB_RX_AGGREGATION_SUPPORT
4649 if (bIsRxAggrSubframe) {
4650 rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
4651 stats->Length = desc->Length;
4652 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
4653 stats->RxBufShift = 0; //RxBufShift = 2 in RxDesc, but usb didn't shift bytes in fact.
4654 stats->bICV = desc->ICV;
4655 stats->bCRC = desc->CRC32;
4656 stats->bHwError = stats->bCRC|stats->bICV;
4657 stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
4661 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
4663 stats->Length = desc->Length;
4664 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
4665 stats->RxBufShift = 0;
4666 stats->bICV = desc->ICV;
4667 stats->bCRC = desc->CRC32;
4668 stats->bHwError = stats->bCRC|stats->bICV;
4669 //RTL8190 set this bit to indicate that Hw does not decrypt packet
4670 stats->Decrypted = !desc->SWDec;
4673 if ((priv->ieee80211->pHTInfo->bCurrentHTSupport == true) && (priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP))
4674 stats->bHwError = false;
4676 stats->bHwError = stats->bCRC|stats->bICV;
4678 if (stats->Length < 24 || stats->Length > MAX_8192U_RX_SIZE)
4679 stats->bHwError |= 1;
4683 // TODO: Need to verify it on FGPA platform
4684 //Driver info are written to the RxBuffer following rx desc
4685 if (stats->RxDrvInfoSize != 0) {
4686 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
4690 if (!stats->bHwError) {
4692 ret_rate = HwRateToMRate90(driver_info->RxHT, driver_info->RxRate);
4693 if (ret_rate == 0xff) {
4694 // Abnormal Case: Receive CRC OK packet with Rx descriptor indicating non supported rate.
4695 // Special Error Handling here, 2008.05.16, by Emily
4697 stats->bHwError = 1;
4698 stats->rate = MGN_1M; //Set 1M rate by default
4700 stats->rate = ret_rate;
4706 stats->bShortPreamble = driver_info->SPLCP;
4709 UpdateReceivedRateHistogramStatistics8190(dev, stats);
4711 stats->bIsAMPDU = (driver_info->PartAggr == 1);
4712 stats->bFirstMPDU = (driver_info->PartAggr == 1) && (driver_info->FirstAGGR == 1);
4713 stats->TimeStampLow = driver_info->TSFL;
4714 // xiong mask it, 070514
4716 UpdateRxPktTimeStamp8190(dev, stats);
4721 if (driver_info->FirstAGGR == 1 || driver_info->PartAggr == 1)
4722 RT_TRACE(COMP_RXDESC, "driver_info->FirstAGGR = %d, driver_info->PartAggr = %d\n",
4723 driver_info->FirstAGGR, driver_info->PartAggr);
4727 skb_pull(skb, sizeof(rx_desc_819x_usb));
4729 // Get Total offset of MPDU Frame Body
4731 if ((stats->RxBufShift + stats->RxDrvInfoSize) > 0) {
4733 skb_pull(skb, stats->RxBufShift + stats->RxDrvInfoSize);
4736 #ifdef USB_RX_AGGREGATION_SUPPORT
4737 /* for the rx aggregated sub frame, the redundant space truly contained in the packet */
4738 if (bIsRxAggrSubframe)
4741 /* for debug 2008.5.29 */
4743 //added by vivi, for MP, 20080108
4744 stats->RxIs40MHzPacket = driver_info->BW;
4745 if (stats->RxDrvInfoSize != 0)
4746 TranslateRxSignalStuff819xUsb(skb, stats, driver_info);
4750 u32 GetRxPacketShiftBytes819xUsb(struct ieee80211_rx_stats *Status, bool bIsRxAggrSubframe)
4752 #ifdef USB_RX_AGGREGATION_SUPPORT
4753 if (bIsRxAggrSubframe)
4754 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
4755 + Status->RxBufShift + 8);
4758 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
4759 + Status->RxBufShift);
4762 void rtl8192_rx_nomal(struct sk_buff *skb)
4764 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
4765 struct net_device *dev = info->dev;
4766 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4767 struct ieee80211_rx_stats stats = {
4771 .freq = IEEE80211_24GHZ_BAND,
4774 struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
4775 bool unicast_packet = false;
4776 #ifdef USB_RX_AGGREGATION_SUPPORT
4777 struct sk_buff *agg_skb = NULL;
4778 u32 TotalLength = 0;
4780 u32 PacketLength = 0;
4781 u32 PacketOccupiedLendth = 0;
4783 u32 PacketShiftBytes = 0;
4784 rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
4785 u8 PaddingBytes = 0;
4786 //add just for testing
4791 /* 20 is for ps-poll */
4792 if ((skb->len >= (20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
4793 #ifdef USB_RX_AGGREGATION_SUPPORT
4794 TempByte = *(skb->data + sizeof(rx_desc_819x_usb));
4796 /* first packet should not contain Rx aggregation header */
4797 query_rxdesc_status(skb, &stats, false);
4799 /* hardware related info */
4800 #ifdef USB_RX_AGGREGATION_SUPPORT
4801 if (TempByte & BIT0) {
4803 TotalLength = stats.Length - 4; /*sCrcLng*/
4804 /* though the head pointer has passed this position */
4805 TempDWord = *(u32 *)(agg_skb->data - 4);
4806 PacketLength = (u16)(TempDWord & 0x3FFF); /*sCrcLng*/
4807 skb = dev_alloc_skb(PacketLength);
4808 memcpy(skb_put(skb, PacketLength), agg_skb->data, PacketLength);
4809 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, false);
4812 /* Process the MPDU received */
4813 skb_trim(skb, skb->len - 4/*sCrcLng*/);
4815 rx_pkt_len = skb->len;
4816 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
4817 unicast_packet = false;
4818 if (is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
4820 } else if (is_multicast_ether_addr(ieee80211_hdr->addr1)) {
4823 /* unicast packet */
4824 unicast_packet = true;
4827 if (!ieee80211_rx(priv->ieee80211, skb, &stats)) {
4828 dev_kfree_skb_any(skb);
4830 priv->stats.rxoktotal++;
4832 priv->stats.rxbytesunicast += rx_pkt_len;
4834 #ifdef USB_RX_AGGREGATION_SUPPORT
4836 if (TotalLength > 0) {
4837 PacketOccupiedLendth = PacketLength + (PacketShiftBytes + 8);
4838 if ((PacketOccupiedLendth & 0xFF) != 0)
4839 PacketOccupiedLendth = (PacketOccupiedLendth & 0xFFFFFF00) + 256;
4840 PacketOccupiedLendth -= 8;
4841 TempDWord = PacketOccupiedLendth - PacketShiftBytes; /*- PacketLength */
4842 if (agg_skb->len > TempDWord)
4843 skb_pull(agg_skb, TempDWord);
4847 while (agg_skb->len >= GetRxPacketShiftBytes819xUsb(&stats, true)) {
4848 u8 tmpCRC = 0, tmpICV = 0;
4849 RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);
4850 tmpCRC = RxDescr->CRC32;
4851 tmpICV = RxDescr->ICV;
4852 memcpy(agg_skb->data, &agg_skb->data[44], 2);
4853 RxDescr->CRC32 = tmpCRC;
4854 RxDescr->ICV = tmpICV;
4856 memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
4860 stats.freq = IEEE80211_24GHZ_BAND;
4861 query_rxdesc_status(agg_skb, &stats, true);
4862 PacketLength = stats.Length;
4864 if (PacketLength > agg_skb->len)
4866 /* Process the MPDU received */
4867 skb = dev_alloc_skb(PacketLength);
4868 memcpy(skb_put(skb, PacketLength), agg_skb->data, PacketLength);
4869 skb_trim(skb, skb->len - 4/*sCrcLng*/);
4871 rx_pkt_len = skb->len;
4872 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
4873 unicast_packet = false;
4874 if (is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
4876 } else if (is_multicast_ether_addr(ieee80211_hdr->addr1)) {
4879 /* unicast packet */
4880 unicast_packet = true;
4882 if (!ieee80211_rx(priv->ieee80211, skb, &stats)) {
4883 dev_kfree_skb_any(skb);
4885 priv->stats.rxoktotal++;
4887 priv->stats.rxbytesunicast += rx_pkt_len;
4889 /* should trim the packet which has been copied to target skb */
4890 skb_pull(agg_skb, PacketLength);
4891 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, true);
4892 PacketOccupiedLendth = PacketLength + PacketShiftBytes;
4893 if ((PacketOccupiedLendth & 0xFF) != 0) {
4894 PaddingBytes = 256 - (PacketOccupiedLendth & 0xFF);
4895 if (agg_skb->len > PaddingBytes)
4896 skb_pull(agg_skb, PaddingBytes);
4901 dev_kfree_skb(agg_skb);
4905 priv->stats.rxurberr++;
4906 netdev_dbg(dev, "actual_length: %d\n", skb->len);
4907 dev_kfree_skb_any(skb);
4912 void rtl819xusb_process_received_packet(struct net_device *dev,
4913 struct ieee80211_rx_stats *pstats)
4917 struct r8192_priv *priv = ieee80211_priv(dev);
4919 // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
4920 //porting by amy 080508
4921 pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
4922 frame = pstats->virtual_address;
4923 frame_len = pstats->packetlength;
4924 #ifdef TODO // by amy about HCT
4925 if (!Adapter->bInHctTest)
4926 CountRxErrStatistics(Adapter, pRfd);
4928 #ifdef ENABLE_PS //by amy for adding ps function in future
4929 RT_RF_POWER_STATE rtState;
4930 // When RF is off, we should not count the packet for hw/sw synchronize
4931 // reason, ie. there may be a duration while sw switch is changed and hw
4932 // switch is being changed. 2006.12.04, by shien chang.
4933 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8 *)(&rtState));
4934 if (rtState == eRfOff)
4937 priv->stats.rxframgment++;
4940 RmMonitorSignalStrength(Adapter, pRfd);
4942 /* 2007/01/16 MH Add RX command packet handle here. */
4943 /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
4944 if (rtl819xusb_rx_command_packet(dev, pstats))
4954 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
4956 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
4959 //Get Rx Descriptor Information
4961 stats->virtual_address = (u8 *)skb->data;
4962 stats->Length = desc->Length;
4963 stats->RxDrvInfoSize = 0;
4964 stats->RxBufShift = 0;
4965 stats->packetlength = stats->Length-scrclng;
4966 stats->fraglength = stats->packetlength;
4967 stats->fragoffset = 0;
4968 stats->ntotalfrag = 1;
4972 void rtl8192_rx_cmd(struct sk_buff *skb)
4974 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
4975 struct net_device *dev = info->dev;
4977 struct ieee80211_rx_stats stats = {
4981 .freq = IEEE80211_24GHZ_BAND,
4984 if ((skb->len >= (20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
4986 query_rx_cmdpkt_desc_status(skb, &stats);
4987 // this is to be done by amy 080508 prfd->queue_id = 1;
4991 // Process the command packet received.
4994 rtl819xusb_process_received_packet(dev, &stats);
4996 dev_kfree_skb_any(skb);
5000 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
5002 struct sk_buff *skb;
5003 struct rtl8192_rx_info *info;
5005 while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
5006 info = (struct rtl8192_rx_info *)skb->cb;
5007 switch (info->out_pipe) {
5008 /* Nomal packet pipe */
5010 priv->IrpPendingCount--;
5011 rtl8192_rx_nomal(skb);
5014 /* Command packet pipe */
5016 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
5019 rtl8192_rx_cmd(skb);
5022 default: /* should never get here! */
5023 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
5032 static const struct net_device_ops rtl8192_netdev_ops = {
5033 .ndo_open = rtl8192_open,
5034 .ndo_stop = rtl8192_close,
5035 .ndo_get_stats = rtl8192_stats,
5036 .ndo_tx_timeout = tx_timeout,
5037 .ndo_do_ioctl = rtl8192_ioctl,
5038 .ndo_set_rx_mode = r8192_set_multicast,
5039 .ndo_set_mac_address = r8192_set_mac_adr,
5040 .ndo_validate_addr = eth_validate_addr,
5041 .ndo_change_mtu = eth_change_mtu,
5042 .ndo_start_xmit = ieee80211_xmit,
5046 /****************************************************************************
5047 ---------------------------- USB_STUFF---------------------------
5048 *****************************************************************************/
5050 static int rtl8192_usb_probe(struct usb_interface *intf,
5051 const struct usb_device_id *id)
5053 struct net_device *dev = NULL;
5054 struct r8192_priv *priv = NULL;
5055 struct usb_device *udev = interface_to_usbdev(intf);
5057 RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
5059 dev = alloc_ieee80211(sizeof(struct r8192_priv));
5063 usb_set_intfdata(intf, dev);
5064 SET_NETDEV_DEV(dev, &intf->dev);
5065 priv = ieee80211_priv(dev);
5066 priv->ieee80211 = netdev_priv(dev);
5069 dev->netdev_ops = &rtl8192_netdev_ops;
5071 #if WIRELESS_EXT >= 12
5072 #if WIRELESS_EXT < 17
5073 dev->get_wireless_stats = r8192_get_wireless_stats;
5075 dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
5077 dev->type = ARPHRD_ETHER;
5079 dev->watchdog_timeo = HZ*3; //modified by john, 0805
5081 if (dev_alloc_name(dev, ifname) < 0) {
5082 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
5084 dev_alloc_name(dev, ifname);
5087 RT_TRACE(COMP_INIT, "Driver probe completed1\n");
5088 if (rtl8192_init(dev) != 0) {
5089 RT_TRACE(COMP_ERR, "Initialization failed");
5093 netif_carrier_off(dev);
5094 netif_stop_queue(dev);
5096 ret = register_netdev(dev);
5100 RT_TRACE(COMP_INIT, "dev name=======> %s\n", dev->name);
5101 rtl8192_proc_init_one(dev);
5104 RT_TRACE(COMP_INIT, "Driver probe completed\n");
5109 kfree(priv->pFirmware);
5110 priv->pFirmware = NULL;
5111 rtl8192_usb_deleteendpoints(dev);
5112 destroy_workqueue(priv->priv_wq);
5115 free_ieee80211(dev);
5117 RT_TRACE(COMP_ERR, "wlan driver load failed\n");
5121 //detach all the work and timer structure declared or inititialize in r8192U_init function.
5122 void rtl8192_cancel_deferred_work(struct r8192_priv *priv)
5125 cancel_work_sync(&priv->reset_wq);
5126 cancel_delayed_work(&priv->watch_dog_wq);
5127 cancel_delayed_work(&priv->update_beacon_wq);
5128 cancel_work_sync(&priv->qos_activate);
5132 static void rtl8192_usb_disconnect(struct usb_interface *intf)
5134 struct net_device *dev = usb_get_intfdata(intf);
5136 struct r8192_priv *priv = ieee80211_priv(dev);
5139 unregister_netdev(dev);
5141 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
5142 rtl8192_proc_remove_one(dev);
5145 kfree(priv->pFirmware);
5146 priv->pFirmware = NULL;
5147 rtl8192_usb_deleteendpoints(dev);
5148 destroy_workqueue(priv->priv_wq);
5152 free_ieee80211(dev);
5153 RT_TRACE(COMP_DOWN, "wlan driver removed\n");
5156 /* fun with the built-in ieee80211 stack... */
5157 extern int ieee80211_debug_init(void);
5158 extern void ieee80211_debug_exit(void);
5159 extern int ieee80211_crypto_init(void);
5160 extern void ieee80211_crypto_deinit(void);
5161 extern int ieee80211_crypto_tkip_init(void);
5162 extern void ieee80211_crypto_tkip_exit(void);
5163 extern int ieee80211_crypto_ccmp_init(void);
5164 extern void ieee80211_crypto_ccmp_exit(void);
5165 extern int ieee80211_crypto_wep_init(void);
5166 extern void ieee80211_crypto_wep_exit(void);
5168 static int __init rtl8192_usb_module_init(void)
5172 #ifdef CONFIG_IEEE80211_DEBUG
5173 ret = ieee80211_debug_init();
5175 pr_err("ieee80211_debug_init() failed %d\n", ret);
5179 ret = ieee80211_crypto_init();
5181 pr_err("ieee80211_crypto_init() failed %d\n", ret);
5185 ret = ieee80211_crypto_tkip_init();
5187 pr_err("ieee80211_crypto_tkip_init() failed %d\n", ret);
5191 ret = ieee80211_crypto_ccmp_init();
5193 pr_err("ieee80211_crypto_ccmp_init() failed %d\n", ret);
5197 ret = ieee80211_crypto_wep_init();
5199 pr_err("ieee80211_crypto_wep_init() failed %d\n", ret);
5203 pr_info("\nLinux kernel driver for RTL8192 based WLAN cards\n");
5204 pr_info("Copyright (c) 2007-2008, Realsil Wlan\n");
5205 RT_TRACE(COMP_INIT, "Initializing module");
5206 RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
5207 rtl8192_proc_module_init();
5208 return usb_register(&rtl8192_usb_driver);
5212 static void __exit rtl8192_usb_module_exit(void)
5214 usb_deregister(&rtl8192_usb_driver);
5216 RT_TRACE(COMP_DOWN, "Exiting");
5220 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
5222 unsigned long flags;
5224 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5226 spin_lock_irqsave(&priv->tx_lock, flags);
5227 enough_desc = check_nic_enough_desc(dev, pri);
5228 spin_unlock_irqrestore(&priv->tx_lock, flags);
5231 ieee80211_wake_queue(priv->ieee80211);
5234 void EnableHWSecurityConfig8192(struct net_device *dev)
5236 u8 SECR_value = 0x0;
5237 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5238 struct ieee80211_device *ieee = priv->ieee80211;
5239 SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
5240 if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2)) {
5241 SECR_value |= SCR_RxUseDK;
5242 SECR_value |= SCR_TxUseDK;
5243 } else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP))) {
5244 SECR_value |= SCR_RxUseDK;
5245 SECR_value |= SCR_TxUseDK;
5247 //add HWSec active enable here.
5248 //default using hwsec. when peer AP is in N mode only and pairwise_key_type is none_aes(which HT_IOT_ACT_PURE_N_MODE indicates it), use software security. when peer AP is in b,g,n mode mixed and pairwise_key_type is none_aes, use g mode hw security. WB on 2008.7.4
5250 ieee->hwsec_active = 1;
5252 if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep) { //add hwsec_support flag to totol control hw_sec on/off
5253 ieee->hwsec_active = 0;
5254 SECR_value &= ~SCR_RxDecEnable;
5256 RT_TRACE(COMP_SEC, "%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __func__, \
5257 ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
5258 write_nic_byte(dev, SECR, SECR_value);
5262 void setKey(struct net_device *dev, u8 EntryNo, u8 KeyIndex, u16 KeyType,
5263 u8 *MacAddr, u8 DefaultKey, u32 *KeyContent)
5265 u32 TargetCommand = 0;
5266 u32 TargetContent = 0;
5269 if (EntryNo >= TOTAL_CAM_ENTRY)
5270 RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
5272 RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", dev, EntryNo, KeyIndex, KeyType, MacAddr);
5275 usConfig |= BIT15 | (KeyType<<2);
5277 usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
5280 for (i = 0; i < CAM_CONTENT_COUNT; i++) {
5281 TargetCommand = i+CAM_CONTENT_COUNT*EntryNo;
5282 TargetCommand |= BIT31|BIT16;
5284 if (i == 0) { //MAC|Config
5285 TargetContent = (u32)(*(MacAddr+0)) << 16|
5286 (u32)(*(MacAddr+1)) << 24|
5289 write_nic_dword(dev, WCAMI, TargetContent);
5290 write_nic_dword(dev, RWCAM, TargetCommand);
5291 } else if (i == 1) { //MAC
5292 TargetContent = (u32)(*(MacAddr+2)) |
5293 (u32)(*(MacAddr+3)) << 8|
5294 (u32)(*(MacAddr+4)) << 16|
5295 (u32)(*(MacAddr+5)) << 24;
5296 write_nic_dword(dev, WCAMI, TargetContent);
5297 write_nic_dword(dev, RWCAM, TargetCommand);
5300 if (KeyContent != NULL) {
5301 write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)));
5302 write_nic_dword(dev, RWCAM, TargetCommand);
5309 /***************************************************************************
5310 ------------------- module init / exit stubs ----------------
5311 ****************************************************************************/
5312 module_init(rtl8192_usb_module_init);
5313 module_exit(rtl8192_usb_module_exit);