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) { return i; }
29 unsigned int __fixunsdfsi (double d) { return d; }
30 double __adddf3(double a, double b) { return a+b; }
31 double __addsf3(float a, float b) { return a+b; }
32 double __subdf3(double a, double b) { return a-b; }
33 double __extendsfdf2(float a) {return a;}
40 #undef RX_DONT_PASS_UL
42 #undef DEBUG_RX_VERBOSE
48 #undef DEBUG_TX_FILLDESC
53 #undef DEBUG_REGISTERS
55 #undef DEBUG_IRQ_TASKLET
59 #define CONFIG_RTL8192_IO_MAP
61 #include <asm/uaccess.h>
62 #include "r8192U_hw.h"
64 #include "r8190_rtl8256.h" /* RTL8225 Radio frontend */
65 #include "r8180_93cx6.h" /* Card EEPROM */
66 #include "r8192U_wx.h"
67 #include "r819xU_phy.h" //added by WB 4.30.2008
68 #include "r819xU_phyreg.h"
69 #include "r819xU_cmdpkt.h"
70 #include "r8192U_dm.h"
71 //#include "r8192xU_phyreg.h"
72 #include <linux/usb.h>
73 #include <linux/slab.h>
74 // FIXME: check if 2.6.7 is ok
76 #ifdef CONFIG_RTL8192_PM
81 //set here to open your trace code. //WB
82 u32 rt_global_debug_component = \
90 // COMP_POWER_TRACKING |
101 COMP_ERR ; //always open err flags on
103 #define TOTAL_CAM_ENTRY 32
104 #define CAM_CONTENT_COUNT 8
106 static const struct usb_device_id rtl8192_usb_id_tbl[] = {
108 {USB_DEVICE(0x0bda, 0x8192)},
109 {USB_DEVICE(0x0bda, 0x8709)},
111 {USB_DEVICE(0x07aa, 0x0043)},
113 {USB_DEVICE(0x050d, 0x805E)},
115 {USB_DEVICE(0x0df6, 0x0031)},
117 {USB_DEVICE(0x1740, 0x9201)},
119 {USB_DEVICE(0x2001, 0x3301)},
121 {USB_DEVICE(0x5a57, 0x0290)},
123 {USB_DEVICE(0x043e, 0x7a01)},
127 MODULE_LICENSE("GPL");
128 MODULE_VERSION("V 1.1");
129 MODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
130 MODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
132 static char* ifname = "wlan%d";
133 static int hwwep = 1; //default use hw. set 0 to use software security
134 static int channels = 0x3fff;
138 module_param(ifname, charp, S_IRUGO|S_IWUSR );
139 //module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
140 module_param(hwwep,int, S_IRUGO|S_IWUSR);
141 module_param(channels,int, S_IRUGO|S_IWUSR);
143 MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
144 //MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
145 MODULE_PARM_DESC(hwwep," Try to use hardware security support. ");
146 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
148 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
149 const struct usb_device_id *id);
150 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf);
153 static struct usb_driver rtl8192_usb_driver = {
154 .name = RTL819xU_MODULE_NAME, /* Driver name */
155 .id_table = rtl8192_usb_id_tbl, /* PCI_ID table */
156 .probe = rtl8192_usb_probe, /* probe fn */
157 .disconnect = rtl8192_usb_disconnect, /* remove fn */
158 #ifdef CONFIG_RTL8192_PM
159 .suspend = rtl8192_suspend, /* PM suspend fn */
160 .resume = rtl8192_resume, /* PM resume fn */
162 .suspend = NULL, /* PM suspend fn */
163 .resume = NULL, /* PM resume fn */
168 typedef struct _CHANNEL_LIST
172 }CHANNEL_LIST, *PCHANNEL_LIST;
174 static CHANNEL_LIST ChannelPlan[] = {
175 {{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
176 {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
177 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
178 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Spain. Change to ETSI.
179 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //France. Change to ETSI.
180 {{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
181 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
182 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Israel.
183 {{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
184 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22}, //MIC
185 {{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
188 static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
190 int i, max_chan=-1, min_chan=-1;
191 struct ieee80211_device* ieee = priv->ieee80211;
192 switch (channel_plan)
194 case COUNTRY_CODE_FCC:
195 case COUNTRY_CODE_IC:
196 case COUNTRY_CODE_ETSI:
197 case COUNTRY_CODE_SPAIN:
198 case COUNTRY_CODE_FRANCE:
199 case COUNTRY_CODE_MKK:
200 case COUNTRY_CODE_MKK1:
201 case COUNTRY_CODE_ISRAEL:
202 case COUNTRY_CODE_TELEC:
203 case COUNTRY_CODE_MIC:
206 ieee->bGlobalDomain = false;
207 //acturally 8225 & 8256 rf chip only support B,G,24N mode
208 if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256))
215 RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
217 if (ChannelPlan[channel_plan].Len != 0){
218 // Clear old channel map
219 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
220 // Set new channel map
221 for (i=0;i<ChannelPlan[channel_plan].Len;i++)
223 if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
225 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
230 case COUNTRY_CODE_GLOBAL_DOMAIN:
232 GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
234 ieee->bGlobalDomain = true;
244 #define rx_hal_is_cck_rate(_pdrvinfo)\
245 (_pdrvinfo->RxRate == DESC90_RATE1M ||\
246 _pdrvinfo->RxRate == DESC90_RATE2M ||\
247 _pdrvinfo->RxRate == DESC90_RATE5_5M ||\
248 _pdrvinfo->RxRate == DESC90_RATE11M) &&\
252 void CamResetAllEntry(struct net_device *dev)
255 //2004/02/11 In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
256 // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
257 // In this condition, Cam can not be reset because upper layer will not set this static key again.
258 //if(Adapter->EncAlgorithm == WEP_Encryption)
261 //DbgPrint("========================================\n");
262 //DbgPrint(" Call ResetAllEntry \n");
263 //DbgPrint("========================================\n\n");
264 ulcommand |= BIT31|BIT30;
265 write_nic_dword(dev, RWCAM, ulcommand);
270 void write_cam(struct net_device *dev, u8 addr, u32 data)
272 write_nic_dword(dev, WCAMI, data);
273 write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
276 u32 read_cam(struct net_device *dev, u8 addr)
278 write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
279 return read_nic_dword(dev, 0xa8);
282 void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
285 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
286 struct usb_device *udev = priv->udev;
288 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
289 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
290 indx|0xfe00, 0, &data, 1, HZ / 2);
294 printk("write_nic_byte_E TimeOut! status:%d\n", status);
298 u8 read_nic_byte_E(struct net_device *dev, int indx)
302 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
303 struct usb_device *udev = priv->udev;
305 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
306 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
307 indx|0xfe00, 0, &data, 1, HZ / 2);
311 printk("read_nic_byte_E TimeOut! status:%d\n", status);
316 //as 92U has extend page from 4 to 16, so modify functions below.
317 void write_nic_byte(struct net_device *dev, int indx, u8 data)
321 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
322 struct usb_device *udev = priv->udev;
324 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
325 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
326 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
330 printk("write_nic_byte TimeOut! status:%d\n", status);
337 void write_nic_word(struct net_device *dev, int indx, u16 data)
342 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
343 struct usb_device *udev = priv->udev;
345 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
346 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
347 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 2, HZ / 2);
351 printk("write_nic_word TimeOut! status:%d\n", status);
357 void write_nic_dword(struct net_device *dev, int indx, u32 data)
362 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
363 struct usb_device *udev = priv->udev;
365 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
366 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
367 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 4, HZ / 2);
372 printk("write_nic_dword TimeOut! status:%d\n", status);
379 u8 read_nic_byte(struct net_device *dev, int indx)
383 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
384 struct usb_device *udev = priv->udev;
386 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
387 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
388 (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
392 printk("read_nic_byte TimeOut! status:%d\n", status);
400 u16 read_nic_word(struct net_device *dev, int indx)
404 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
405 struct usb_device *udev = priv->udev;
407 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
408 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
409 (indx&0xff)|0xff00, (indx>>8)&0x0f,
413 printk("read_nic_word TimeOut! status:%d\n", status);
418 u16 read_nic_word_E(struct net_device *dev, int indx)
422 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
423 struct usb_device *udev = priv->udev;
425 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
426 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
427 indx|0xfe00, 0, &data, 2, HZ / 2);
430 printk("read_nic_word TimeOut! status:%d\n", status);
435 u32 read_nic_dword(struct net_device *dev, int indx)
441 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
442 struct usb_device *udev = priv->udev;
444 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
445 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
446 (indx&0xff)|0xff00, (indx>>8)&0x0f,
449 * printk(KERN_WARNING "read size of data = %d\, date = %d\n",
455 printk("read_nic_dword TimeOut! status:%d\n", status);
460 /* u8 read_phy_cck(struct net_device *dev, u8 adr); */
461 /* u8 read_phy_ofdm(struct net_device *dev, u8 adr); */
462 /* this might still called in what was the PHY rtl8185/rtl8192 common code
463 * plans are to possibility turn it again in one common code...
465 inline void force_pci_posting(struct net_device *dev)
469 static struct net_device_stats *rtl8192_stats(struct net_device *dev);
470 void rtl8192_commit(struct net_device *dev);
471 /* void rtl8192_restart(struct net_device *dev); */
472 void rtl8192_restart(struct work_struct *work);
473 /* void rtl8192_rq_tx_ack(struct work_struct *work); */
474 void watch_dog_timer_callback(unsigned long data);
476 /****************************************************************************
477 * -----------------------------PROCFS STUFF-------------------------
478 *****************************************************************************
481 static struct proc_dir_entry *rtl8192_proc;
483 static int proc_get_stats_ap(char *page, char **start, off_t offset, int count,
484 int *eof, void *data)
486 struct net_device *dev = data;
487 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
488 struct ieee80211_device *ieee = priv->ieee80211;
489 struct ieee80211_network *target;
493 list_for_each_entry(target, &ieee->network_list, list) {
495 len += snprintf(page + len, count - len, "%s ", target->ssid);
497 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
498 len += snprintf(page + len, count - len, "WPA\n");
500 len += snprintf(page + len, count - len, "non_WPA\n");
507 static int proc_get_registers(char *page, char **start,
508 off_t offset, int count,
509 int *eof, void *data)
511 struct net_device *dev = data;
512 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
519 /* This dump the current register page */
520 len += snprintf(page + len, count - len,
521 "\n####################page 0##################\n ");
525 //printk( "\nD: %2x> ", n);
526 len += snprintf(page + len, count - len,
529 for(i=0;i<16 && n<=max;i++,n++)
530 len += snprintf(page + len, count - len,
531 "%2x ",read_nic_byte(dev,0x000|n));
533 // printk("%2x ",read_nic_byte(dev,n));
535 len += snprintf(page + len, count - len,
536 "\n####################page 1##################\n ");
539 //printk( "\nD: %2x> ", n);
540 len += snprintf(page + len, count - len,
543 for(i=0;i<16 && n<=max;i++,n++)
544 len += snprintf(page + len, count - len,
545 "%2x ",read_nic_byte(dev,0x100|n));
547 // printk("%2x ",read_nic_byte(dev,n));
549 len += snprintf(page + len, count - len,
550 "\n####################page 3##################\n ");
553 //printk( "\nD: %2x> ", n);
554 len += snprintf(page + len, count - len,
557 for(i=0;i<16 && n<=max;i++,n++)
558 len += snprintf(page + len, count - len,
559 "%2x ",read_nic_byte(dev,0x300|n));
561 // printk("%2x ",read_nic_byte(dev,n));
565 len += snprintf(page + len, count - len,"\n");
575 static int proc_get_stats_tx(char *page, char **start,
576 off_t offset, int count,
577 int *eof, void *data)
579 struct net_device *dev = data;
580 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
584 len += snprintf(page + len, count - len,
585 "TX VI priority ok int: %lu\n"
586 "TX VI priority error int: %lu\n"
587 "TX VO priority ok int: %lu\n"
588 "TX VO priority error int: %lu\n"
589 "TX BE priority ok int: %lu\n"
590 "TX BE priority error int: %lu\n"
591 "TX BK priority ok int: %lu\n"
592 "TX BK priority error int: %lu\n"
593 "TX MANAGE priority ok int: %lu\n"
594 "TX MANAGE priority error int: %lu\n"
595 "TX BEACON priority ok int: %lu\n"
596 "TX BEACON priority error int: %lu\n"
597 // "TX high priority ok int: %lu\n"
598 // "TX high priority failed error int: %lu\n"
599 "TX queue resume: %lu\n"
600 "TX queue stopped?: %d\n"
601 "TX fifo overflow: %lu\n"
602 // "TX beacon: %lu\n"
607 // "TX HW queue: %d\n"
608 "TX VI dropped: %lu\n"
609 "TX VO dropped: %lu\n"
610 "TX BE dropped: %lu\n"
611 "TX BK dropped: %lu\n"
612 "TX total data packets %lu\n",
613 // "TX beacon aborted: %lu\n",
614 priv->stats.txviokint,
616 priv->stats.txvookint,
618 priv->stats.txbeokint,
620 priv->stats.txbkokint,
622 priv->stats.txmanageokint,
623 priv->stats.txmanageerr,
624 priv->stats.txbeaconokint,
625 priv->stats.txbeaconerr,
626 // priv->stats.txhpokint,
627 // priv->stats.txhperr,
628 priv->stats.txresumed,
629 netif_queue_stopped(dev),
630 priv->stats.txoverflow,
631 // priv->stats.txbeacon,
632 atomic_read(&(priv->tx_pending[VI_PRIORITY])),
633 atomic_read(&(priv->tx_pending[VO_PRIORITY])),
634 atomic_read(&(priv->tx_pending[BE_PRIORITY])),
635 atomic_read(&(priv->tx_pending[BK_PRIORITY])),
636 // read_nic_byte(dev, TXFIFOCOUNT),
637 priv->stats.txvidrop,
638 priv->stats.txvodrop,
639 priv->stats.txbedrop,
640 priv->stats.txbkdrop,
641 priv->stats.txdatapkt
642 // priv->stats.txbeaconerr
651 static int proc_get_stats_rx(char *page, char **start,
652 off_t offset, int count,
653 int *eof, void *data)
655 struct net_device *dev = data;
656 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
660 len += snprintf(page + len, count - len,
662 "RX urb status error: %lu\n"
663 "RX invalid urb error: %lu\n",
664 priv->stats.rxoktotal,
665 priv->stats.rxstaterr,
666 priv->stats.rxurberr);
671 void rtl8192_proc_module_init(void)
673 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
674 rtl8192_proc = proc_mkdir(RTL819xU_MODULE_NAME, init_net.proc_net);
678 void rtl8192_proc_module_remove(void)
680 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
684 void rtl8192_proc_remove_one(struct net_device *dev)
686 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
690 // remove_proc_entry("stats-hw", priv->dir_dev);
691 remove_proc_entry("stats-tx", priv->dir_dev);
692 remove_proc_entry("stats-rx", priv->dir_dev);
693 // remove_proc_entry("stats-ieee", priv->dir_dev);
694 remove_proc_entry("stats-ap", priv->dir_dev);
695 remove_proc_entry("registers", priv->dir_dev);
696 // remove_proc_entry("cck-registers",priv->dir_dev);
697 // remove_proc_entry("ofdm-registers",priv->dir_dev);
698 //remove_proc_entry(dev->name, rtl8192_proc);
699 remove_proc_entry("wlan0", rtl8192_proc);
700 priv->dir_dev = NULL;
705 void rtl8192_proc_init_one(struct net_device *dev)
707 struct proc_dir_entry *e;
708 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
709 priv->dir_dev = proc_mkdir(dev->name, rtl8192_proc);
710 if (!priv->dir_dev) {
711 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
715 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
716 priv->dir_dev, proc_get_stats_rx, dev);
719 RT_TRACE(COMP_ERR,"Unable to initialize "
720 "/proc/net/rtl8192/%s/stats-rx\n",
725 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
726 priv->dir_dev, proc_get_stats_tx, dev);
729 RT_TRACE(COMP_ERR, "Unable to initialize "
730 "/proc/net/rtl8192/%s/stats-tx\n",
734 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
735 priv->dir_dev, proc_get_stats_ap, dev);
738 RT_TRACE(COMP_ERR, "Unable to initialize "
739 "/proc/net/rtl8192/%s/stats-ap\n",
743 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
744 priv->dir_dev, proc_get_registers, dev);
746 RT_TRACE(COMP_ERR, "Unable to initialize "
747 "/proc/net/rtl8192/%s/registers\n",
751 /****************************************************************************
752 -----------------------------MISC STUFF-------------------------
753 *****************************************************************************/
755 /* this is only for debugging */
756 void print_buffer(u32 *buffer, int len)
759 u8 *buf =(u8*)buffer;
761 printk("ASCII BUFFER DUMP (len: %x):\n",len);
766 printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
774 //short check_nic_enough_desc(struct net_device *dev, priority_t priority)
775 short check_nic_enough_desc(struct net_device *dev,int queue_index)
777 struct r8192_priv *priv = ieee80211_priv(dev);
778 int used = atomic_read(&priv->tx_pending[queue_index]);
780 return (used < MAX_TX_URB);
783 void tx_timeout(struct net_device *dev)
785 struct r8192_priv *priv = ieee80211_priv(dev);
786 //rtl8192_commit(dev);
788 schedule_work(&priv->reset_wq);
789 //DMESG("TXTIMEOUT");
793 /* this is only for debug */
794 void dump_eprom(struct net_device *dev)
798 RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev,i));
801 /* this is only for debug */
802 void rtl8192_dump_reg(struct net_device *dev)
808 RT_TRACE(COMP_PHY, "Dumping NIC register map");
812 printk( "\nD: %2x> ", n);
813 for(i=0;i<16 && n<=max;i++,n++)
814 printk("%2x ",read_nic_byte(dev,n));
819 /****************************************************************************
820 ------------------------------HW STUFF---------------------------
821 *****************************************************************************/
824 void rtl8192_set_mode(struct net_device *dev,int mode)
827 ecmd=read_nic_byte(dev, EPROM_CMD);
828 ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
829 ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
830 ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
831 ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
832 write_nic_byte(dev, EPROM_CMD, ecmd);
836 void rtl8192_update_msr(struct net_device *dev)
838 struct r8192_priv *priv = ieee80211_priv(dev);
841 msr = read_nic_byte(dev, MSR);
842 msr &= ~ MSR_LINK_MASK;
844 /* do not change in link_state != WLAN_LINK_ASSOCIATED.
845 * msr must be updated if the state is ASSOCIATING.
846 * this is intentional and make sense for ad-hoc and
847 * master (see the create BSS/IBSS func)
849 if (priv->ieee80211->state == IEEE80211_LINKED){
851 if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
852 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
853 else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
854 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
855 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
856 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
859 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
861 write_nic_byte(dev, MSR, msr);
864 void rtl8192_set_chan(struct net_device *dev,short ch)
866 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
868 RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
871 /* this hack should avoid frame TX during channel setting*/
874 // tx = read_nic_dword(dev,TX_CONF);
875 // tx &= ~TX_LOOPBACK_MASK;
878 // write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
880 //need to implement rf set channel here WB
882 if (priv->rf_set_chan)
883 priv->rf_set_chan(dev,priv->chan);
885 // write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
889 static void rtl8192_rx_isr(struct urb *urb);
890 //static void rtl8192_rx_isr(struct urb *rx_urb);
892 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
895 #ifdef USB_RX_AGGREGATION_SUPPORT
896 if (pstats->bisrxaggrsubframe)
897 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
898 + pstats->RxBufShift + 8);
901 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
902 + pstats->RxBufShift);
905 static int rtl8192_rx_initiate(struct net_device*dev)
907 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
910 struct rtl8192_rx_info *info;
912 /* nomal packet rx procedure */
913 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
914 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
917 entry = usb_alloc_urb(0, GFP_KERNEL);
922 // printk("nomal packet IN request!\n");
923 usb_fill_bulk_urb(entry, priv->udev,
924 usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
925 RX_URB_SIZE, rtl8192_rx_isr, skb);
926 info = (struct rtl8192_rx_info *) skb->cb;
929 info->out_pipe = 3; //denote rx normal packet queue
930 skb_queue_tail(&priv->rx_queue, skb);
931 usb_submit_urb(entry, GFP_KERNEL);
934 /* command packet rx procedure */
935 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
936 // printk("command packet IN request!\n");
937 skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
940 entry = usb_alloc_urb(0, GFP_KERNEL);
945 usb_fill_bulk_urb(entry, priv->udev,
946 usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
947 RX_URB_SIZE, rtl8192_rx_isr, skb);
948 info = (struct rtl8192_rx_info *) skb->cb;
951 info->out_pipe = 9; //denote rx cmd packet queue
952 skb_queue_tail(&priv->rx_queue, skb);
953 usb_submit_urb(entry, GFP_KERNEL);
959 void rtl8192_set_rxconf(struct net_device *dev)
961 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
964 rxconf=read_nic_dword(dev,RCR);
965 rxconf = rxconf &~ MAC_FILTER_MASK;
966 rxconf = rxconf | RCR_AMF;
967 rxconf = rxconf | RCR_ADF;
968 rxconf = rxconf | RCR_AB;
969 rxconf = rxconf | RCR_AM;
970 //rxconf = rxconf | RCR_ACF;
972 if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
974 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
975 dev->flags & IFF_PROMISC){
976 rxconf = rxconf | RCR_AAP;
977 } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
978 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
979 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
981 rxconf = rxconf | RCR_APM;
982 rxconf = rxconf | RCR_CBSSID;
986 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
987 rxconf = rxconf | RCR_AICV;
988 rxconf = rxconf | RCR_APWRMGT;
991 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
992 rxconf = rxconf | RCR_ACRC32;
995 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
996 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
997 rxconf = rxconf &~ MAX_RX_DMA_MASK;
998 rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
1000 // rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
1001 rxconf = rxconf | RCR_ONLYERLPKT;
1003 // rxconf = rxconf &~ RCR_CS_MASK;
1004 // rxconf = rxconf | (1<<RCR_CS_SHIFT);
1006 write_nic_dword(dev, RCR, rxconf);
1009 DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
1012 //wait to be removed
1013 void rtl8192_rx_enable(struct net_device *dev)
1017 //struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1019 rtl8192_rx_initiate(dev);
1021 // rtl8192_set_rxconf(dev);
1025 void rtl8192_tx_enable(struct net_device *dev)
1031 void rtl8192_rtx_disable(struct net_device *dev)
1034 struct r8192_priv *priv = ieee80211_priv(dev);
1035 struct sk_buff *skb;
1036 struct rtl8192_rx_info *info;
1038 cmd=read_nic_byte(dev,CMDR);
1039 write_nic_byte(dev, CMDR, cmd &~ \
1041 force_pci_posting(dev);
1044 while ((skb = __skb_dequeue(&priv->rx_queue))) {
1045 info = (struct rtl8192_rx_info *) skb->cb;
1049 usb_kill_urb(info->urb);
1053 if (skb_queue_len(&priv->skb_queue)) {
1054 printk(KERN_WARNING "skb_queue not empty\n");
1057 skb_queue_purge(&priv->skb_queue);
1062 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
1067 inline u16 ieeerate2rtlrate(int rate)
1099 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
1100 inline u16 rtl8192_rate2rate(short rate)
1102 if (rate >11) return 0;
1103 return rtl_rate[rate];
1107 /* The protype of rx_isr has changed since one verion of Linux Kernel */
1108 static void rtl8192_rx_isr(struct urb *urb)
1110 struct sk_buff *skb = (struct sk_buff *) urb->context;
1111 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1112 struct net_device *dev = info->dev;
1113 struct r8192_priv *priv = ieee80211_priv(dev);
1114 int out_pipe = info->out_pipe;
1118 if (unlikely(urb->status)) {
1120 priv->stats.rxstaterr++;
1121 priv->ieee80211->stats.rx_errors++;
1123 // printk("%s():rx status err\n",__FUNCTION__);
1126 skb_unlink(skb, &priv->rx_queue);
1127 skb_put(skb, urb->actual_length);
1129 skb_queue_tail(&priv->skb_queue, skb);
1130 tasklet_schedule(&priv->irq_rx_tasklet);
1132 skb = dev_alloc_skb(RX_URB_SIZE);
1133 if (unlikely(!skb)) {
1135 printk("%s():can,t alloc skb\n",__FUNCTION__);
1136 /* TODO check rx queue length and refill *somewhere* */
1140 usb_fill_bulk_urb(urb, priv->udev,
1141 usb_rcvbulkpipe(priv->udev, out_pipe), skb_tail_pointer(skb),
1142 RX_URB_SIZE, rtl8192_rx_isr, skb);
1144 info = (struct rtl8192_rx_info *) skb->cb;
1147 info->out_pipe = out_pipe;
1149 urb->transfer_buffer = skb_tail_pointer(skb);
1151 skb_queue_tail(&priv->rx_queue, skb);
1152 err = usb_submit_urb(urb, GFP_ATOMIC);
1153 if(err && err != EPERM)
1154 printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
1158 rtl819xusb_rx_command_packet(
1159 struct net_device *dev,
1160 struct ieee80211_rx_stats *pstats
1165 //RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
1167 status = cmpk_message_handle_rx(dev, pstats);
1170 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1174 //RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
1177 //RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
1182 void rtl8192_data_hard_stop(struct net_device *dev)
1188 void rtl8192_data_hard_resume(struct net_device *dev)
1193 /* this function TX data frames when the ieee80211 stack requires this.
1194 * It checks also if we need to stop the ieee tx queue, eventually do it
1196 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1198 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1200 unsigned long flags;
1201 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1202 u8 queue_index = tcb_desc->queue_index;
1204 /* shall not be referred by command packet */
1205 assert(queue_index != TXCMD_QUEUE);
1207 spin_lock_irqsave(&priv->tx_lock,flags);
1209 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1210 // tcb_desc->RATRIndex = 7;
1211 // tcb_desc->bTxDisableRateFallBack = 1;
1212 // tcb_desc->bTxUseDriverAssingedRate = 1;
1213 tcb_desc->bTxEnableFwCalcDur = 1;
1214 skb_push(skb, priv->ieee80211->tx_headroom);
1215 ret = rtl8192_tx(dev, skb);
1217 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1218 //priv->ieee80211->stats.tx_packets++;
1220 spin_unlock_irqrestore(&priv->tx_lock,flags);
1226 /* This is a rough attempt to TX a frame
1227 * This is called by the ieee 80211 stack to TX management frames.
1228 * If the ring is full packet are dropped (for data frame the queue
1229 * is stopped before this can happen).
1231 int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
1233 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1235 unsigned long flags;
1236 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1237 u8 queue_index = tcb_desc->queue_index;
1240 spin_lock_irqsave(&priv->tx_lock,flags);
1242 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1243 if(queue_index == TXCMD_QUEUE) {
1244 skb_push(skb, USB_HWDESC_HEADER_LEN);
1245 rtl819xU_tx_cmd(dev, skb);
1247 spin_unlock_irqrestore(&priv->tx_lock,flags);
1250 skb_push(skb, priv->ieee80211->tx_headroom);
1251 ret = rtl8192_tx(dev, skb);
1254 spin_unlock_irqrestore(&priv->tx_lock,flags);
1260 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1262 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1263 u16 DrvAggr_PaddingAdd(struct net_device *dev, struct sk_buff *skb)
1265 u16 PaddingNum = 256 - ((skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES) % 256);
1266 return (PaddingNum&0xff);
1269 u8 MRateToHwRate8190Pci(u8 rate);
1270 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc);
1271 u8 MapHwQueueToFirmwareQueue(u8 QueueID);
1272 struct sk_buff *DrvAggr_Aggregation(struct net_device *dev, struct ieee80211_drv_agg_txb *pSendList)
1274 struct ieee80211_device *ieee = netdev_priv(dev);
1275 struct r8192_priv *priv = ieee80211_priv(dev);
1276 cb_desc *tcb_desc = NULL;
1279 struct sk_buff *skb;
1280 struct sk_buff *agg_skb;
1281 tx_desc_819x_usb_aggr_subframe *tx_agg_desc = NULL;
1282 tx_fwinfo_819x_usb *tx_fwinfo = NULL;
1285 // Local variable initialization.
1287 /* first skb initialization */
1288 skb = pSendList->tx_agg_frames[0];
1289 TotalLength = skb->len;
1291 /* Get the total aggregation length including the padding space and
1294 for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1295 TotalLength += DrvAggr_PaddingAdd(dev, skb);
1296 skb = pSendList->tx_agg_frames[i];
1297 TotalLength += (skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1300 /* allocate skb to contain the aggregated packets */
1301 agg_skb = dev_alloc_skb(TotalLength + ieee->tx_headroom);
1302 memset(agg_skb->data, 0, agg_skb->len);
1303 skb_reserve(agg_skb, ieee->tx_headroom);
1305 // RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
1306 /* reserve info for first subframe Tx descriptor to be set in the tx function */
1307 skb = pSendList->tx_agg_frames[0];
1308 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1309 tcb_desc->drv_agg_enable = 1;
1310 tcb_desc->pkt_size = skb->len;
1311 tcb_desc->DrvAggrNum = pSendList->nr_drv_agg_frames;
1312 printk("DrvAggNum = %d\n", tcb_desc->DrvAggrNum);
1313 // RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
1314 // printk("========>skb->data ======> \n");
1315 // RT_DEBUG_DATA(COMP_SEND, skb->data, skb->len);
1316 memcpy(agg_skb->cb, skb->cb, sizeof(skb->cb));
1317 memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
1319 for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1320 /* push the next sub frame to be 256 byte aline */
1321 skb_put(agg_skb,DrvAggr_PaddingAdd(dev,skb));
1323 /* Subframe drv Tx descriptor and firmware info setting */
1324 skb = pSendList->tx_agg_frames[i];
1325 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1326 tx_agg_desc = (tx_desc_819x_usb_aggr_subframe *)agg_skb->tail;
1327 tx_fwinfo = (tx_fwinfo_819x_usb *)(agg_skb->tail + sizeof(tx_desc_819x_usb_aggr_subframe));
1329 memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
1331 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
1332 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
1333 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
1334 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
1335 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
1336 tx_fwinfo->AllowAggregation = 1;
1338 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
1339 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
1341 tx_fwinfo->AllowAggregation = 0;
1343 tx_fwinfo->RxMF = 0;
1344 tx_fwinfo->RxAMD = 0;
1347 /* Protection mode related */
1348 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
1349 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
1350 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
1351 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
1352 tx_fwinfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
1353 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
1354 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
1355 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
1356 (tcb_desc->bRTSUseShortGI?1:0);
1358 /* Set Bandwidth and sub-channel settings. */
1359 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
1361 if(tcb_desc->bPacketBW) {
1362 tx_fwinfo->TxBandwidth = 1;
1363 tx_fwinfo->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
1365 tx_fwinfo->TxBandwidth = 0;
1366 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
1369 tx_fwinfo->TxBandwidth = 0;
1370 tx_fwinfo->TxSubCarrier = 0;
1373 /* Fill Tx descriptor */
1374 memset(tx_agg_desc, 0, sizeof(tx_desc_819x_usb_aggr_subframe));
1376 //tx_agg_desc->LINIP = 0;
1377 //tx_agg_desc->CmdInit = 1;
1378 tx_agg_desc->Offset = sizeof(tx_fwinfo_819x_usb) + 8;
1379 /* already raw data, need not to subtract header length */
1380 tx_agg_desc->PktSize = skb->len & 0xffff;
1383 tx_agg_desc->SecCAMID= 0;
1384 tx_agg_desc->RATid = tcb_desc->RATRIndex;
1387 tx_agg_desc->NoEnc = 1;
1389 tx_agg_desc->SecType = 0x0;
1391 if (tcb_desc->bHwSec) {
1392 switch (priv->ieee80211->pairwise_key_type)
1394 case KEY_TYPE_WEP40:
1395 case KEY_TYPE_WEP104:
1396 tx_agg_desc->SecType = 0x1;
1397 tx_agg_desc->NoEnc = 0;
1400 tx_agg_desc->SecType = 0x2;
1401 tx_agg_desc->NoEnc = 0;
1404 tx_agg_desc->SecType = 0x3;
1405 tx_agg_desc->NoEnc = 0;
1408 tx_agg_desc->SecType = 0x0;
1409 tx_agg_desc->NoEnc = 1;
1414 tx_agg_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
1415 tx_agg_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);
1417 tx_agg_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
1418 tx_agg_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
1420 tx_agg_desc->OWN = 1;
1423 /* According windows driver, it seems that there no need to fill this field */
1424 //tx_agg_desc->TxBufferSize= (u32)(skb->len - USB_HWDESC_HEADER_LEN);
1426 /* to fill next packet */
1427 skb_put(agg_skb,TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1428 memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
1431 for(i = 0; i < pSendList->nr_drv_agg_frames; i++) {
1432 dev_kfree_skb_any(pSendList->tx_agg_frames[i]);
1439 This function return a list of PTCB which is proper to be aggregate with the input TCB.
1440 If no proper TCB is found to do aggregation, SendList will only contain the input TCB.
1442 u8 DrvAggr_GetAggregatibleList(struct net_device *dev, struct sk_buff *skb,
1443 struct ieee80211_drv_agg_txb *pSendList)
1445 struct ieee80211_device *ieee = netdev_priv(dev);
1446 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1447 u16 nMaxAggrNum = pHTInfo->UsbTxAggrNum;
1448 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1449 u8 QueueID = tcb_desc->queue_index;
1452 pSendList->tx_agg_frames[pSendList->nr_drv_agg_frames++] = skb;
1453 if(pSendList->nr_drv_agg_frames >= nMaxAggrNum) {
1457 } while((skb = skb_dequeue(&ieee->skb_drv_aggQ[QueueID])));
1459 RT_TRACE(COMP_AMSDU, "DrvAggr_GetAggregatibleList, nAggrTcbNum = %d \n", pSendList->nr_drv_agg_frames);
1460 return pSendList->nr_drv_agg_frames;
1464 static void rtl8192_tx_isr(struct urb *tx_urb)
1466 struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
1467 struct net_device *dev = NULL;
1468 struct r8192_priv *priv = NULL;
1469 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1470 u8 queue_index = tcb_desc->queue_index;
1471 // bool bToSend0Byte;
1472 // u16 BufLen = skb->len;
1474 memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
1475 priv = ieee80211_priv(dev);
1477 if(tcb_desc->queue_index != TXCMD_QUEUE) {
1478 if(tx_urb->status == 0) {
1479 dev->trans_start = jiffies;
1480 // As act as station mode, destion shall be unicast address.
1481 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1482 //priv->ieee80211->stats.tx_packets++;
1483 priv->stats.txoktotal++;
1484 priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1485 priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1487 priv->ieee80211->stats.tx_errors++;
1488 //priv->stats.txmanageerr++;
1493 /* free skb and tx_urb */
1495 dev_kfree_skb_any(skb);
1496 usb_free_urb(tx_urb);
1497 atomic_dec(&priv->tx_pending[queue_index]);
1502 // Handle HW Beacon:
1503 // We had transfer our beacon frame to host controller at this moment.
1507 // Handling the wait queue of command packets.
1508 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1509 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1512 /* Handle MPDU in wait queue. */
1513 if(queue_index != BEACON_QUEUE) {
1514 /* Don't send data frame during scanning.*/
1515 if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1516 (!(priv->ieee80211->queue_stop))) {
1517 if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1518 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1520 return; //modified by david to avoid further processing AMSDU
1522 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1523 else if ((skb_queue_len(&priv->ieee80211->skb_drv_aggQ[queue_index])!= 0)&&\
1524 (!(priv->ieee80211->queue_stop))) {
1525 // Tx Driver Aggregation process
1526 /* The driver will aggregation the packets according to the following stets
1527 * 1. check whether there's tx irq available, for it's a completion return
1528 * function, it should contain enough tx irq;
1529 * 2. check pakcet type;
1530 * 3. initialize sendlist, check whether the to-be send packet no greater than 1
1531 * 4. aggregation the packets, and fill firmware info and tx desc to it, etc.
1532 * 5. check whehter the packet could be sent, otherwise just insert to wait head
1534 skb = skb_dequeue(&priv->ieee80211->skb_drv_aggQ[queue_index]);
1535 if(!check_nic_enough_desc(dev, queue_index)) {
1536 skb_queue_head(&(priv->ieee80211->skb_drv_aggQ[queue_index]), skb);
1543 u8* pHeader = skb->data;
1545 if(IsMgntQosData(pHeader) ||
1546 IsMgntQData_Ack(pHeader) ||
1547 IsMgntQData_Poll(pHeader) ||
1548 IsMgntQData_Poll_Ack(pHeader)
1552 struct ieee80211_drv_agg_txb SendList;
1554 memset(&SendList, 0, sizeof(struct ieee80211_drv_agg_txb));
1555 if(DrvAggr_GetAggregatibleList(dev, skb, &SendList) > 1) {
1556 skb = DrvAggr_Aggregation(dev, &SendList);
1560 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1569 void rtl8192_beacon_stop(struct net_device *dev)
1572 struct r8192_priv *priv = ieee80211_priv(dev);
1574 msr = read_nic_byte(dev, MSR);
1575 msrm = msr & MSR_LINK_MASK;
1576 msr2 = msr & ~MSR_LINK_MASK;
1578 if(NIC_8192U == priv->card_8192) {
1579 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1581 if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1582 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
1583 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1584 write_nic_byte(dev, MSR, msr);
1588 void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
1590 struct r8192_priv *priv = ieee80211_priv(dev);
1591 struct ieee80211_network *net;
1592 u8 i=0, basic_rate = 0;
1593 net = & priv->ieee80211->current_network;
1595 for (i=0; i<net->rates_len; i++)
1597 basic_rate = net->rates[i]&0x7f;
1600 case MGN_1M: *rate_config |= RRSR_1M; break;
1601 case MGN_2M: *rate_config |= RRSR_2M; break;
1602 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1603 case MGN_11M: *rate_config |= RRSR_11M; break;
1604 case MGN_6M: *rate_config |= RRSR_6M; break;
1605 case MGN_9M: *rate_config |= RRSR_9M; break;
1606 case MGN_12M: *rate_config |= RRSR_12M; break;
1607 case MGN_18M: *rate_config |= RRSR_18M; break;
1608 case MGN_24M: *rate_config |= RRSR_24M; break;
1609 case MGN_36M: *rate_config |= RRSR_36M; break;
1610 case MGN_48M: *rate_config |= RRSR_48M; break;
1611 case MGN_54M: *rate_config |= RRSR_54M; break;
1614 for (i=0; i<net->rates_ex_len; i++)
1616 basic_rate = net->rates_ex[i]&0x7f;
1619 case MGN_1M: *rate_config |= RRSR_1M; break;
1620 case MGN_2M: *rate_config |= RRSR_2M; break;
1621 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1622 case MGN_11M: *rate_config |= RRSR_11M; break;
1623 case MGN_6M: *rate_config |= RRSR_6M; break;
1624 case MGN_9M: *rate_config |= RRSR_9M; break;
1625 case MGN_12M: *rate_config |= RRSR_12M; break;
1626 case MGN_18M: *rate_config |= RRSR_18M; break;
1627 case MGN_24M: *rate_config |= RRSR_24M; break;
1628 case MGN_36M: *rate_config |= RRSR_36M; break;
1629 case MGN_48M: *rate_config |= RRSR_48M; break;
1630 case MGN_54M: *rate_config |= RRSR_54M; break;
1636 #define SHORT_SLOT_TIME 9
1637 #define NON_SHORT_SLOT_TIME 20
1639 void rtl8192_update_cap(struct net_device* dev, u16 cap)
1642 struct r8192_priv *priv = ieee80211_priv(dev);
1643 struct ieee80211_network *net = &priv->ieee80211->current_network;
1644 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1645 tmp = priv->basic_rate;
1646 if (priv->short_preamble)
1647 tmp |= BRSR_AckShortPmb;
1648 write_nic_dword(dev, RRSR, tmp);
1650 if (net->mode & (IEEE_G|IEEE_N_24G))
1653 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
1655 slot_time = SHORT_SLOT_TIME;
1657 else //long slot time
1658 slot_time = NON_SHORT_SLOT_TIME;
1659 priv->slot_time = slot_time;
1660 write_nic_byte(dev, SLOT_TIME, slot_time);
1664 void rtl8192_net_update(struct net_device *dev)
1667 struct r8192_priv *priv = ieee80211_priv(dev);
1668 struct ieee80211_network *net;
1669 u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1670 u16 rate_config = 0;
1671 net = & priv->ieee80211->current_network;
1673 rtl8192_config_rate(dev, &rate_config);
1674 priv->basic_rate = rate_config &= 0x15f;
1676 write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
1677 write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
1678 //for(i=0;i<ETH_ALEN;i++)
1679 // write_nic_byte(dev,BSSID+i,net->bssid[i]);
1681 rtl8192_update_msr(dev);
1682 // rtl8192_update_cap(dev, net->capability);
1683 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1685 write_nic_word(dev, ATIMWND, 2);
1686 write_nic_word(dev, BCN_DMATIME, 1023);
1687 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1688 // write_nic_word(dev, BcnIntTime, 100);
1689 write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1690 write_nic_byte(dev, BCN_ERR_THRESH, 100);
1691 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1692 // TODO: BcnIFS may required to be changed on ASIC
1693 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1695 write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1702 //temporary hw beacon is not used any more.
1703 //open it when necessary
1704 void rtl819xusb_beacon_tx(struct net_device *dev,u16 tx_rate)
1708 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1710 if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1715 u16 N_DBPSOfRate(u16 DataRate);
1720 u8 bManagementFrame,
1728 if( rtl8192_IsWirelessBMode(DataRate) )
1730 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1732 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1736 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1738 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1740 } else { //802.11g DSSS-OFDM PLCP length field calculation.
1741 N_DBPS = N_DBPSOfRate(DataRate);
1742 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1743 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1744 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1749 u16 N_DBPSOfRate(u16 DataRate)
1794 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1796 usb_free_urb(tx_cmd_urb);
1799 unsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
1803 RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
1806 return priv->txqueue_to_outpipemap[tx_queue];
1809 short rtl819xU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1811 struct r8192_priv *priv = ieee80211_priv(dev);
1816 unsigned int idx_pipe;
1817 tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1818 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1819 u8 queue_index = tcb_desc->queue_index;
1821 //printk("\n %s::queue_index = %d\n",__FUNCTION__, queue_index);
1822 atomic_inc(&priv->tx_pending[queue_index]);
1823 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
1829 memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1830 /* Tx descriptor ought to be set according to the skb->cb */
1831 pdesc->FirstSeg = 1;//bFirstSeg;
1832 pdesc->LastSeg = 1;//bLastSeg;
1833 pdesc->CmdInit = tcb_desc->bCmdOrInit;
1834 pdesc->TxBufferSize = tcb_desc->txbuf_size;
1836 pdesc->LINIP = tcb_desc->bLastIniPkt;
1838 //----------------------------------------------------------------------------
1839 // Fill up USB_OUT_CONTEXT.
1840 //----------------------------------------------------------------------------
1841 // Get index to out pipe from specified QueueID.
1842 #ifndef USE_ONE_PIPE
1843 idx_pipe = txqueue2outpipe(priv,queue_index);
1847 #ifdef JOHN_DUMP_TXDESC
1849 printk("<Tx descriptor>--rate %x---",rate);
1850 for (i = 0; i < 8; i++)
1851 printk("%8x ", tx[i]);
1854 usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,idx_pipe), \
1855 skb->data, skb->len, rtl8192_tx_isr, skb);
1857 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
1862 DMESGE("Error TX CMD URB, error %d",
1869 * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
1870 * in TxFwInfo data structure
1871 * 2006.10.30 by Emily
1873 * \param QUEUEID Software Queue
1875 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
1877 u8 QueueSelect = 0x0; //defualt set to
1881 QueueSelect = QSLT_BE; //or QSelect = pTcb->priority;
1885 QueueSelect = QSLT_BK; //or QSelect = pTcb->priority;
1889 QueueSelect = QSLT_VO; //or QSelect = pTcb->priority;
1893 QueueSelect = QSLT_VI; //or QSelect = pTcb->priority;
1896 QueueSelect = QSLT_MGNT;
1900 QueueSelect = QSLT_BEACON;
1903 // TODO: 2006.10.30 mark other queue selection until we verify it is OK
1904 // TODO: Remove Assertions
1905 //#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
1907 QueueSelect = QSLT_CMD;
1911 QueueSelect = QSLT_HIGH;
1915 RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
1921 u8 MRateToHwRate8190Pci(u8 rate)
1923 u8 ret = DESC90_RATE1M;
1926 case MGN_1M: ret = DESC90_RATE1M; break;
1927 case MGN_2M: ret = DESC90_RATE2M; break;
1928 case MGN_5_5M: ret = DESC90_RATE5_5M; break;
1929 case MGN_11M: ret = DESC90_RATE11M; break;
1930 case MGN_6M: ret = DESC90_RATE6M; break;
1931 case MGN_9M: ret = DESC90_RATE9M; break;
1932 case MGN_12M: ret = DESC90_RATE12M; break;
1933 case MGN_18M: ret = DESC90_RATE18M; break;
1934 case MGN_24M: ret = DESC90_RATE24M; break;
1935 case MGN_36M: ret = DESC90_RATE36M; break;
1936 case MGN_48M: ret = DESC90_RATE48M; break;
1937 case MGN_54M: ret = DESC90_RATE54M; break;
1939 // HT rate since here
1940 case MGN_MCS0: ret = DESC90_RATEMCS0; break;
1941 case MGN_MCS1: ret = DESC90_RATEMCS1; break;
1942 case MGN_MCS2: ret = DESC90_RATEMCS2; break;
1943 case MGN_MCS3: ret = DESC90_RATEMCS3; break;
1944 case MGN_MCS4: ret = DESC90_RATEMCS4; break;
1945 case MGN_MCS5: ret = DESC90_RATEMCS5; break;
1946 case MGN_MCS6: ret = DESC90_RATEMCS6; break;
1947 case MGN_MCS7: ret = DESC90_RATEMCS7; break;
1948 case MGN_MCS8: ret = DESC90_RATEMCS8; break;
1949 case MGN_MCS9: ret = DESC90_RATEMCS9; break;
1950 case MGN_MCS10: ret = DESC90_RATEMCS10; break;
1951 case MGN_MCS11: ret = DESC90_RATEMCS11; break;
1952 case MGN_MCS12: ret = DESC90_RATEMCS12; break;
1953 case MGN_MCS13: ret = DESC90_RATEMCS13; break;
1954 case MGN_MCS14: ret = DESC90_RATEMCS14; break;
1955 case MGN_MCS15: ret = DESC90_RATEMCS15; break;
1956 case (0x80|0x20): ret = DESC90_RATEMCS32; break;
1964 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
1968 tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
1970 if(TxHT==1 && TxRate != DESC90_RATEMCS15)
1976 static void tx_zero_isr(struct urb *tx_urb)
1982 * The tx procedure is just as following,
1983 * skb->cb will contain all the following information,
1984 * priority, morefrag, rate, &dev.
1986 short rtl8192_tx(struct net_device *dev, struct sk_buff* skb)
1988 struct r8192_priv *priv = ieee80211_priv(dev);
1989 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1990 tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
1991 tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);
1992 struct usb_device *udev = priv->udev;
1995 struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
1997 unsigned int idx_pipe;
1998 // RT_DEBUG_DATA(COMP_SEND, tcb_desc, sizeof(cb_desc));
1999 // printk("=============> %s\n", __FUNCTION__);
2000 pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
2001 /* we are locked here so the two atomic_read and inc are executed
2002 * without interleaves
2003 * !!! For debug purpose
2005 if( pend > MAX_TX_URB){
2006 printk("To discard skb packet!\n");
2007 dev_kfree_skb_any(skb);
2011 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
2013 dev_kfree_skb_any(skb);
2017 /* Fill Tx firmware info */
2018 memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
2020 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
2021 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
2022 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
2023 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
2024 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
2025 tx_fwinfo->AllowAggregation = 1;
2027 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
2028 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
2030 tx_fwinfo->AllowAggregation = 0;
2032 tx_fwinfo->RxMF = 0;
2033 tx_fwinfo->RxAMD = 0;
2036 /* Protection mode related */
2037 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
2038 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
2039 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
2040 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
2041 tx_fwinfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
2042 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
2043 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
2044 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
2045 (tcb_desc->bRTSUseShortGI?1:0);
2047 /* Set Bandwidth and sub-channel settings. */
2048 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2050 if(tcb_desc->bPacketBW) {
2051 tx_fwinfo->TxBandwidth = 1;
2052 tx_fwinfo->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
2054 tx_fwinfo->TxBandwidth = 0;
2055 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
2058 tx_fwinfo->TxBandwidth = 0;
2059 tx_fwinfo->TxSubCarrier = 0;
2062 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2063 if (tcb_desc->drv_agg_enable)
2065 tx_fwinfo->Tx_INFO_RSVD = (tcb_desc->DrvAggrNum & 0x1f) << 1;
2068 /* Fill Tx descriptor */
2069 memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2072 tx_desc->CmdInit = 1;
2073 tx_desc->Offset = sizeof(tx_fwinfo_819x_usb) + 8;
2075 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2076 if (tcb_desc->drv_agg_enable) {
2077 tx_desc->PktSize = tcb_desc->pkt_size;
2081 tx_desc->PktSize = (skb->len - TX_PACKET_SHIFT_BYTES) & 0xffff;
2085 tx_desc->SecCAMID= 0;
2086 tx_desc->RATid = tcb_desc->RATRIndex;
2091 tx_desc->SecType = 0x0;
2092 if (tcb_desc->bHwSec)
2094 switch (priv->ieee80211->pairwise_key_type)
2096 case KEY_TYPE_WEP40:
2097 case KEY_TYPE_WEP104:
2098 tx_desc->SecType = 0x1;
2102 tx_desc->SecType = 0x2;
2106 tx_desc->SecType = 0x3;
2110 tx_desc->SecType = 0x0;
2116 tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
2117 tx_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);
2119 tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
2120 tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
2122 /* Fill fields that are required to be initialized in all of the descriptors */
2124 tx_desc->FirstSeg = 1;
2125 tx_desc->LastSeg = 1;
2128 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2129 if (tcb_desc->drv_agg_enable) {
2130 tx_desc->TxBufferSize = tcb_desc->pkt_size + sizeof(tx_fwinfo_819x_usb);
2135 tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
2137 /* Get index to out pipe from specified QueueID */
2138 #ifndef USE_ONE_PIPE
2139 idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
2144 //RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
2145 //RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
2147 /* To submit bulk urb */
2148 usb_fill_bulk_urb(tx_urb,udev,
2149 usb_sndbulkpipe(udev,idx_pipe), skb->data,
2150 skb->len, rtl8192_tx_isr, skb);
2152 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2154 //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
2155 bool bSend0Byte = false;
2157 if(udev->speed == USB_SPEED_HIGH)
2159 if (skb->len > 0 && skb->len % 512 == 0)
2164 if (skb->len > 0 && skb->len % 64 == 0)
2169 tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
2171 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
2174 usb_fill_bulk_urb(tx_urb_zero,udev,
2175 usb_sndbulkpipe(udev,idx_pipe), &zero,
2176 0, tx_zero_isr, dev);
2177 status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
2179 RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
2183 dev->trans_start = jiffies;
2184 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
2187 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
2193 short rtl8192_usb_initendpoints(struct net_device *dev)
2195 struct r8192_priv *priv = ieee80211_priv(dev);
2197 priv->rx_urb = kmalloc(sizeof(struct urb *) * (MAX_RX_URB+1),
2199 if (priv->rx_urb == NULL)
2202 #ifndef JACKSON_NEW_RX
2203 for(i=0;i<(MAX_RX_URB+1);i++){
2205 priv->rx_urb[i] = usb_alloc_urb(0,GFP_KERNEL);
2207 priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL);
2209 priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE;
2213 #ifdef THOMAS_BEACON
2216 void *oldaddr, *newaddr;
2218 priv->rx_urb[16] = usb_alloc_urb(0, GFP_KERNEL);
2219 priv->oldaddr = kmalloc(16, GFP_KERNEL);
2220 oldaddr = priv->oldaddr;
2221 align = ((long)oldaddr) & 3;
2223 newaddr = oldaddr + 4 - align;
2224 priv->rx_urb[16]->transfer_buffer_length = 16 - 4 + align;
2227 priv->rx_urb[16]->transfer_buffer_length = 16;
2229 priv->rx_urb[16]->transfer_buffer = newaddr;
2233 memset(priv->rx_urb, 0, sizeof(struct urb*) * MAX_RX_URB);
2234 priv->pp_rxskb = kcalloc(MAX_RX_URB, sizeof(struct sk_buff *),
2236 if (priv->pp_rxskb == NULL)
2243 kfree(priv->pp_rxskb);
2244 kfree(priv->rx_urb);
2246 priv->pp_rxskb = NULL;
2247 priv->rx_urb = NULL;
2249 DMESGE("Endpoint Alloc Failure");
2255 printk("End of initendpoints\n");
2259 #ifdef THOMAS_BEACON
2260 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2263 struct r8192_priv *priv = ieee80211_priv(dev);
2266 for(i=0;i<(MAX_RX_URB+1);i++){
2267 usb_kill_urb(priv->rx_urb[i]);
2268 usb_free_urb(priv->rx_urb[i]);
2270 kfree(priv->rx_urb);
2271 priv->rx_urb = NULL;
2273 kfree(priv->oldaddr);
2274 priv->oldaddr = NULL;
2275 if (priv->pp_rxskb) {
2276 kfree(priv->pp_rxskb);
2281 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2284 struct r8192_priv *priv = ieee80211_priv(dev);
2286 #ifndef JACKSON_NEW_RX
2289 for(i=0;i<(MAX_RX_URB+1);i++){
2290 usb_kill_urb(priv->rx_urb[i]);
2291 kfree(priv->rx_urb[i]->transfer_buffer);
2292 usb_free_urb(priv->rx_urb[i]);
2294 kfree(priv->rx_urb);
2295 priv->rx_urb = NULL;
2299 kfree(priv->rx_urb);
2300 priv->rx_urb = NULL;
2301 kfree(priv->oldaddr);
2302 priv->oldaddr = NULL;
2303 if (priv->pp_rxskb) {
2304 kfree(priv->pp_rxskb);
2313 extern void rtl8192_update_ratr_table(struct net_device* dev);
2314 void rtl8192_link_change(struct net_device *dev)
2318 struct r8192_priv *priv = ieee80211_priv(dev);
2319 struct ieee80211_device* ieee = priv->ieee80211;
2320 //write_nic_word(dev, BCN_INTR_ITV, net->beacon_interval);
2321 if (ieee->state == IEEE80211_LINKED)
2323 rtl8192_net_update(dev);
2324 rtl8192_update_ratr_table(dev);
2325 //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
2326 if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
2327 EnableHWSecurityConfig8192(dev);
2329 /*update timing params*/
2330 // RT_TRACE(COMP_CH, "========>%s(), chan:%d\n", __FUNCTION__, priv->chan);
2331 // rtl8192_set_chan(dev, priv->chan);
2332 if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
2335 reg = read_nic_dword(dev, RCR);
2336 if (priv->ieee80211->state == IEEE80211_LINKED)
2337 priv->ReceiveConfig = reg |= RCR_CBSSID;
2339 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2340 write_nic_dword(dev, RCR, reg);
2343 // rtl8192_set_rxconf(dev);
2346 static struct ieee80211_qos_parameters def_qos_parameters = {
2347 {3,3,3,3},/* cw_min */
2348 {7,7,7,7},/* cw_max */
2349 {2,2,2,2},/* aifs */
2350 {0,0,0,0},/* flags */
2351 {0,0,0,0} /* tx_op_limit */
2355 void rtl8192_update_beacon(struct work_struct * work)
2357 struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2358 struct net_device *dev = priv->ieee80211->dev;
2359 struct ieee80211_device* ieee = priv->ieee80211;
2360 struct ieee80211_network* net = &ieee->current_network;
2362 if (ieee->pHTInfo->bCurrentHTSupport)
2363 HTUpdateSelfAndPeerSetting(ieee, net);
2364 ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2365 rtl8192_update_cap(dev, net->capability);
2368 * background support to run QoS activate functionality
2370 int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
2371 void rtl8192_qos_activate(struct work_struct * work)
2373 struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2374 struct net_device *dev = priv->ieee80211->dev;
2375 struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2376 u8 mode = priv->ieee80211->current_network.mode;
2377 //u32 size = sizeof(struct ieee80211_qos_parameters);
2385 mutex_lock(&priv->mutex);
2386 if(priv->ieee80211->state != IEEE80211_LINKED)
2388 RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
2389 /* It better set slot time at first */
2390 /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2391 /* update the ac parameter to related registers */
2392 for(i = 0; i < QOS_QUEUE_NUM; i++) {
2393 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2394 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2395 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2396 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2397 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2398 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2400 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2401 //write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4332);
2405 mutex_unlock(&priv->mutex);
2408 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2410 struct ieee80211_network *network)
2413 u32 size = sizeof(struct ieee80211_qos_parameters);
2415 if(priv->ieee80211->state !=IEEE80211_LINKED)
2418 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2421 if (network->flags & NETWORK_HAS_QOS_MASK) {
2422 if (active_network &&
2423 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2424 network->qos_data.active = network->qos_data.supported;
2426 if ((network->qos_data.active == 1) && (active_network == 1) &&
2427 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2428 (network->qos_data.old_param_count !=
2429 network->qos_data.param_count)) {
2430 network->qos_data.old_param_count =
2431 network->qos_data.param_count;
2432 queue_work(priv->priv_wq, &priv->qos_activate);
2433 RT_TRACE (COMP_QOS, "QoS parameters change call "
2437 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2438 &def_qos_parameters, size);
2440 if ((network->qos_data.active == 1) && (active_network == 1)) {
2441 queue_work(priv->priv_wq, &priv->qos_activate);
2442 RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2444 network->qos_data.active = 0;
2445 network->qos_data.supported = 0;
2451 /* handle manage frame frame beacon and probe response */
2452 static int rtl8192_handle_beacon(struct net_device * dev,
2453 struct ieee80211_beacon * beacon,
2454 struct ieee80211_network * network)
2456 struct r8192_priv *priv = ieee80211_priv(dev);
2458 rtl8192_qos_handle_probe_response(priv,1,network);
2459 queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2465 * handling the beaconing responses. if we get different QoS setting
2466 * off the network from the associated setting, adjust the QoS
2469 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2470 struct ieee80211_network *network)
2473 unsigned long flags;
2474 u32 size = sizeof(struct ieee80211_qos_parameters);
2475 int set_qos_param = 0;
2477 if ((priv == NULL) || (network == NULL))
2480 if(priv->ieee80211->state !=IEEE80211_LINKED)
2483 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2486 spin_lock_irqsave(&priv->ieee80211->lock, flags);
2487 if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2488 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2489 &network->qos_data.parameters,\
2490 sizeof(struct ieee80211_qos_parameters));
2491 priv->ieee80211->current_network.qos_data.active = 1;
2494 /* update qos parameter for current network */
2495 priv->ieee80211->current_network.qos_data.old_param_count = \
2496 priv->ieee80211->current_network.qos_data.param_count;
2497 priv->ieee80211->current_network.qos_data.param_count = \
2498 network->qos_data.param_count;
2501 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2502 &def_qos_parameters, size);
2503 priv->ieee80211->current_network.qos_data.active = 0;
2504 priv->ieee80211->current_network.qos_data.supported = 0;
2508 spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2510 RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
2511 if (set_qos_param == 1)
2512 queue_work(priv->priv_wq, &priv->qos_activate);
2519 static int rtl8192_handle_assoc_response(struct net_device *dev,
2520 struct ieee80211_assoc_response_frame *resp,
2521 struct ieee80211_network *network)
2523 struct r8192_priv *priv = ieee80211_priv(dev);
2524 rtl8192_qos_association_resp(priv, network);
2529 void rtl8192_update_ratr_table(struct net_device* dev)
2530 // POCTET_STRING posLegacyRate,
2532 // PRT_WLAN_STA pEntry)
2534 struct r8192_priv* priv = ieee80211_priv(dev);
2535 struct ieee80211_device* ieee = priv->ieee80211;
2536 u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2537 //struct ieee80211_network *net = &ieee->current_network;
2540 rtl8192_config_rate(dev, (u16*)(&ratr_value));
2541 ratr_value |= (*(u16*)(pMcsRate)) << 12;
2542 // switch (net->mode)
2546 ratr_value &= 0x00000FF0;
2549 ratr_value &= 0x0000000F;
2552 ratr_value &= 0x00000FF7;
2556 if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
2557 ratr_value &= 0x0007F007;
2559 if (priv->rf_type == RF_1T2R)
2560 ratr_value &= 0x000FF007;
2562 ratr_value &= 0x0F81F007;
2568 ratr_value &= 0x0FFFFFFF;
2569 if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
2570 ratr_value |= 0x80000000;
2571 }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
2572 ratr_value |= 0x80000000;
2574 write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2575 write_nic_byte(dev, UFWP, 1);
2578 static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
2579 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2580 bool GetNmodeSupportBySecCfg8192(struct net_device*dev)
2582 struct r8192_priv* priv = ieee80211_priv(dev);
2583 struct ieee80211_device* ieee = priv->ieee80211;
2584 struct ieee80211_network * network = &ieee->current_network;
2585 int wpa_ie_len= ieee->wpa_ie_len;
2586 struct ieee80211_crypt_data* crypt;
2589 crypt = ieee->crypt[ieee->tx_keyidx];
2590 //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
2591 encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
2594 if(encrypt && (wpa_ie_len == 0)) {
2595 /* wep encryption, no N mode setting */
2597 // } else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
2598 } else if((wpa_ie_len != 0)) {
2599 /* parse pairwise key type */
2600 //if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
2601 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))))
2612 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
2615 struct r8192_priv* priv = ieee80211_priv(dev);
2616 struct ieee80211_device* ieee = priv->ieee80211;
2618 if(ieee->bHalfWirelessN24GMode == true)
2626 void rtl8192_refresh_supportrate(struct r8192_priv* priv)
2628 struct ieee80211_device* ieee = priv->ieee80211;
2629 //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
2630 if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2632 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2633 //RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
2634 //RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
2637 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2641 u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
2643 struct r8192_priv *priv = ieee80211_priv(dev);
2645 switch(priv->rf_chip)
2650 ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2653 ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2656 ret = WIRELESS_MODE_B;
2661 void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
2663 struct r8192_priv *priv = ieee80211_priv(dev);
2664 u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2666 if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
2668 if(bSupportMode & WIRELESS_MODE_N_24G)
2670 wireless_mode = WIRELESS_MODE_N_24G;
2672 else if(bSupportMode & WIRELESS_MODE_N_5G)
2674 wireless_mode = WIRELESS_MODE_N_5G;
2676 else if((bSupportMode & WIRELESS_MODE_A))
2678 wireless_mode = WIRELESS_MODE_A;
2680 else if((bSupportMode & WIRELESS_MODE_G))
2682 wireless_mode = WIRELESS_MODE_G;
2684 else if((bSupportMode & WIRELESS_MODE_B))
2686 wireless_mode = WIRELESS_MODE_B;
2689 RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
2690 wireless_mode = WIRELESS_MODE_B;
2693 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
2694 ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
2696 priv->ieee80211->mode = wireless_mode;
2698 if ((wireless_mode == WIRELESS_MODE_N_24G) || (wireless_mode == WIRELESS_MODE_N_5G))
2699 priv->ieee80211->pHTInfo->bEnableHT = 1;
2701 priv->ieee80211->pHTInfo->bEnableHT = 0;
2702 RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
2703 rtl8192_refresh_supportrate(priv);
2706 //init priv variables here. only non_zero value should be initialized here.
2707 static void rtl8192_init_priv_variable(struct net_device* dev)
2709 struct r8192_priv *priv = ieee80211_priv(dev);
2711 priv->card_8192 = NIC_8192U;
2712 priv->chan = 1; //set to channel 1
2713 priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
2714 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2715 priv->ieee80211->ieee_up=0;
2716 priv->retry_rts = DEFAULT_RETRY_RTS;
2717 priv->retry_data = DEFAULT_RETRY_DATA;
2718 priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
2719 priv->ieee80211->rate = 110; //11 mbps
2720 priv->ieee80211->short_slot = 1;
2721 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
2724 priv->IrpPendingCount = 1;
2725 priv->ResetProgress = RESET_TYPE_NORESET;
2726 priv->bForcedSilentReset = 0;
2727 priv->bDisableNormalResetCheck = false;
2728 priv->force_reset = false;
2730 priv->ieee80211->FwRWRF = 0; //we don't use FW read/write RF until stable firmware is available.
2731 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
2732 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2733 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
2734 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2735 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
2736 IEEE_SOFTMAC_BEACONS;//added by amy 080604 //| //IEEE_SOFTMAC_SINGLE_QUEUE;
2738 priv->ieee80211->active_scan = 1;
2739 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
2740 priv->ieee80211->host_encrypt = 1;
2741 priv->ieee80211->host_decrypt = 1;
2742 priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
2743 priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
2744 priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
2745 priv->ieee80211->set_chan = rtl8192_set_chan;
2746 priv->ieee80211->link_change = rtl8192_link_change;
2747 priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
2748 priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
2749 priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
2750 priv->ieee80211->init_wmmparam_flag = 0;
2751 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
2752 priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
2753 priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
2754 priv->ieee80211->qos_support = 1;
2757 // priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
2758 priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
2759 priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
2760 priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
2762 priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
2763 priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
2764 priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
2766 priv->ieee80211->InitialGainHandler = InitialGain819xUsb;
2767 priv->card_type = USB;
2769 if(Adapter->bInHctTest)
2771 pHalData->ShortRetryLimit = 7;
2772 pHalData->LongRetryLimit = 7;
2776 priv->ShortRetryLimit = 0x30;
2777 priv->LongRetryLimit = 0x30;
2779 priv->EarlyRxThreshold = 7;
2780 priv->enable_gpio0 = 0;
2781 priv->TransmitConfig =
2782 // TCR_DurProcMode | //for RTL8185B, duration setting by HW
2783 //? TCR_DISReqQsize |
2784 (TCR_MXDMA_2048<<TCR_MXDMA_OFFSET)| // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
2785 (priv->ShortRetryLimit<<TCR_SRL_OFFSET)| // Short retry limit
2786 (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit
2787 (false ? TCR_SAT: 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
2789 if(Adapter->bInHctTest)
2790 pHalData->ReceiveConfig = pHalData->CSMethod |
2791 RCR_AMF | RCR_ADF | //RCR_AAP | //accept management/data
2793 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2794 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
2795 RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
2796 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2797 (pHalData->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
2798 (pHalData->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
2802 priv->ReceiveConfig =
2803 RCR_AMF | RCR_ADF | //accept management/data
2804 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2805 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
2806 //RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
2807 ((u32)7<<RCR_MXDMA_OFFSET)| // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2808 (priv->EarlyRxThreshold<<RX_FIFO_THRESHOLD_SHIFT) | // Rx FIFO Threshold, 7: No Rx threshold.
2809 (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
2811 priv->AcmControl = 0;
2812 priv->pFirmware = kmalloc(sizeof(rt_firmware), GFP_KERNEL);
2813 if (priv->pFirmware)
2814 memset(priv->pFirmware, 0, sizeof(rt_firmware));
2816 /* rx related queue */
2817 skb_queue_head_init(&priv->rx_queue);
2818 skb_queue_head_init(&priv->skb_queue);
2820 /* Tx related queue */
2821 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2822 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
2824 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2825 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
2827 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2828 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
2830 priv->rf_set_chan = rtl8192_phy_SwChnl;
2834 static void rtl8192_init_priv_lock(struct r8192_priv* priv)
2836 spin_lock_init(&priv->tx_lock);
2837 spin_lock_init(&priv->irq_lock);//added by thomas
2838 //spin_lock_init(&priv->rf_lock);
2839 sema_init(&priv->wx_sem,1);
2840 sema_init(&priv->rf_sem,1);
2841 mutex_init(&priv->mutex);
2844 extern void rtl819x_watchdog_wqcallback(struct work_struct *work);
2846 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
2847 //init tasklet and wait_queue here. only 2.6 above kernel is considered
2848 #define DRV_NAME "wlan0"
2849 static void rtl8192_init_priv_task(struct net_device* dev)
2851 struct r8192_priv *priv = ieee80211_priv(dev);
2853 priv->priv_wq = create_workqueue(DRV_NAME);
2855 INIT_WORK(&priv->reset_wq, rtl8192_restart);
2857 //INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
2858 INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
2859 INIT_DELAYED_WORK(&priv->txpower_tracking_wq, dm_txpower_trackingcallback);
2860 // INIT_DELAYED_WORK(&priv->gpio_change_rf_wq, dm_gpio_change_rf_callback);
2861 INIT_DELAYED_WORK(&priv->rfpath_check_wq, dm_rf_pathcheck_workitemcallback);
2862 INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
2863 INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
2864 //INIT_WORK(&priv->SwChnlWorkItem, rtl8192_SwChnl_WorkItem);
2865 //INIT_WORK(&priv->SetBWModeWorkItem, rtl8192_SetBWModeWorkItem);
2866 INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
2868 tasklet_init(&priv->irq_rx_tasklet,
2869 (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
2870 (unsigned long)priv);
2873 static void rtl8192_get_eeprom_size(struct net_device* dev)
2876 struct r8192_priv *priv = ieee80211_priv(dev);
2877 RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
2878 curCR = read_nic_word_E(dev,EPROM_CMD);
2879 RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
2880 //whether need I consider BIT5?
2881 priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
2882 RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
2885 //used to swap endian. as ntohl & htonl are not necessary to swap endian, so use this instead.
2886 static inline u16 endian_swap(u16* data)
2889 *data = (tmp >> 8) | (tmp << 8);
2892 static void rtl8192_read_eeprom_info(struct net_device* dev)
2895 u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x02};
2896 u8 bLoad_From_EEPOM = false;
2897 struct r8192_priv *priv = ieee80211_priv(dev);
2899 RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
2900 wEPROM_ID = eprom_read(dev, 0); //first read EEPROM ID out;
2901 RT_TRACE(COMP_EPROM, "EEPROM ID is 0x%x\n", wEPROM_ID);
2903 if (wEPROM_ID != RTL8190_EEPROM_ID)
2905 RT_TRACE(COMP_ERR, "EEPROM ID is invalid(is 0x%x(should be 0x%x)\n", wEPROM_ID, RTL8190_EEPROM_ID);
2908 bLoad_From_EEPOM = true;
2910 if (bLoad_From_EEPOM)
2912 tmpValue = eprom_read(dev, (EEPROM_VID>>1));
2913 priv->eeprom_vid = endian_swap(&tmpValue);
2914 priv->eeprom_pid = eprom_read(dev, (EEPROM_PID>>1));
2915 tmpValue = eprom_read(dev, (EEPROM_ChannelPlan>>1));
2916 priv->eeprom_ChannelPlan =((tmpValue&0xff00)>>8);
2917 priv->btxpowerdata_readfromEEPORM = true;
2918 priv->eeprom_CustomerID = eprom_read(dev, (EEPROM_Customer_ID>>1)) >>8;
2922 priv->eeprom_vid = 0;
2923 priv->eeprom_pid = 0;
2924 priv->card_8192_version = VERSION_819xU_B;
2925 priv->eeprom_ChannelPlan = 0;
2926 priv->eeprom_CustomerID = 0;
2928 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);
2929 //set channelplan from eeprom
2930 priv->ChannelPlan = priv->eeprom_ChannelPlan;
2931 if (bLoad_From_EEPOM)
2934 for (i=0; i<6; i+=2)
2937 tmp = eprom_read(dev, (u16)((EEPROM_NODE_ADDRESS_BYTE_0 + i)>>1));
2938 *(u16*)(&dev->dev_addr[i]) = tmp;
2943 memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
2944 //should I set IDR0 here?
2946 RT_TRACE(COMP_EPROM, "MAC addr:%pM\n", dev->dev_addr);
2947 priv->rf_type = RTL819X_DEFAULT_RF_TYPE; //default 1T2R
2948 priv->rf_chip = RF_8256;
2950 if (priv->card_8192_version == (u8)VERSION_819xU_A)
2952 //read Tx power gain offset of legacy OFDM to HT rate
2953 if (bLoad_From_EEPOM)
2954 priv->EEPROMTxPowerDiff = (eprom_read(dev, (EEPROM_TxPowerDiff>>1))&0xff00) >> 8;
2956 priv->EEPROMTxPowerDiff = EEPROM_Default_TxPower;
2957 RT_TRACE(COMP_EPROM, "TxPowerDiff:%d\n", priv->EEPROMTxPowerDiff);
2958 //read ThermalMeter from EEPROM
2959 if (bLoad_From_EEPOM)
2960 priv->EEPROMThermalMeter = (u8)(eprom_read(dev, (EEPROM_ThermalMeter>>1))&0x00ff);
2962 priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
2963 RT_TRACE(COMP_EPROM, "ThermalMeter:%d\n", priv->EEPROMThermalMeter);
2964 //vivi, for tx power track
2965 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
2966 //read antenna tx power offset of B/C/D to A from EEPROM
2967 if (bLoad_From_EEPOM)
2968 priv->EEPROMPwDiff = (eprom_read(dev, (EEPROM_PwDiff>>1))&0x0f00)>>8;
2970 priv->EEPROMPwDiff = EEPROM_Default_PwDiff;
2971 RT_TRACE(COMP_EPROM, "TxPwDiff:%d\n", priv->EEPROMPwDiff);
2972 // Read CrystalCap from EEPROM
2973 if (bLoad_From_EEPOM)
2974 priv->EEPROMCrystalCap = (eprom_read(dev, (EEPROM_CrystalCap>>1))&0x0f);
2976 priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
2977 RT_TRACE(COMP_EPROM, "CrystalCap = %d\n", priv->EEPROMCrystalCap);
2978 //get per-channel Tx power level
2979 if (bLoad_From_EEPOM)
2980 priv->EEPROM_Def_Ver = (eprom_read(dev, (EEPROM_TxPwIndex_Ver>>1))&0xff00)>>8;
2982 priv->EEPROM_Def_Ver = 1;
2983 RT_TRACE(COMP_EPROM, "EEPROM_DEF_VER:%d\n", priv->EEPROM_Def_Ver);
2984 if (priv->EEPROM_Def_Ver == 0) //old eeprom definition
2987 if (bLoad_From_EEPOM)
2988 priv->EEPROMTxPowerLevelCCK = (eprom_read(dev, (EEPROM_TxPwIndex_CCK>>1))&0xff) >> 8;
2990 priv->EEPROMTxPowerLevelCCK = 0x10;
2991 RT_TRACE(COMP_EPROM, "CCK Tx Power Levl: 0x%02x\n", priv->EEPROMTxPowerLevelCCK);
2994 if (bLoad_From_EEPOM)
2996 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G+i)>>1);
2997 if (((EEPROM_TxPwIndex_OFDM_24G+i) % 2) == 0)
2998 tmpValue = tmpValue & 0x00ff;
3000 tmpValue = (tmpValue & 0xff00) >> 8;
3004 priv->EEPROMTxPowerLevelOFDM24G[i] = (u8) tmpValue;
3005 RT_TRACE(COMP_EPROM, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK);
3007 }//end if EEPROM_DEF_VER == 0
3008 else if (priv->EEPROM_Def_Ver == 1)
3010 if (bLoad_From_EEPOM)
3012 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1>>1));
3013 tmpValue = (tmpValue & 0xff00) >> 8;
3017 priv->EEPROMTxPowerLevelCCK_V1[0] = (u8)tmpValue;
3019 if (bLoad_From_EEPOM)
3020 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1 + 2)>>1);
3023 *((u16*)(&priv->EEPROMTxPowerLevelCCK_V1[1])) = tmpValue;
3024 if (bLoad_From_EEPOM)
3025 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1>>1));
3028 *((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[0])) = tmpValue;
3029 if (bLoad_From_EEPOM)
3030 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1+2)>>1);
3033 priv->EEPROMTxPowerLevelOFDM24G[2] = (u8)tmpValue;
3034 }//endif EEPROM_Def_Ver == 1
3036 //update HAL variables
3040 for (i=0; i<14; i++)
3043 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[0];
3044 else if (i>=4 && i<=9)
3045 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[1];
3047 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[2];
3050 for (i=0; i<14; i++)
3052 if (priv->EEPROM_Def_Ver == 0)
3055 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[0] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
3056 else if (i>=4 && i<=9)
3057 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK;
3059 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[2] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
3061 else if (priv->EEPROM_Def_Ver == 1)
3064 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[0];
3065 else if (i>=4 && i<=9)
3066 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[1];
3068 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[2];
3071 }//end update HAL variables
3072 priv->TxPowerDiff = priv->EEPROMPwDiff;
3073 // Antenna B gain offset to antenna A, bit0~3
3074 priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);
3075 // Antenna C gain offset to antenna A, bit4~7
3076 priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);
3077 // CrystalCap, bit12~15
3078 priv->CrystalCap = priv->EEPROMCrystalCap;
3079 // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
3080 // 92U does not enable TX power tracking.
3081 priv->ThermalMeter[0] = priv->EEPROMThermalMeter;
3082 }//end if VersionID == VERSION_819xU_A
3084 //added by vivi, for dlink led, 20080416
3085 switch(priv->eeprom_CustomerID)
3087 case EEPROM_CID_RUNTOP:
3088 priv->CustomerID = RT_CID_819x_RUNTOP;
3091 case EEPROM_CID_DLINK:
3092 priv->CustomerID = RT_CID_DLINK;
3096 priv->CustomerID = RT_CID_DEFAULT;
3101 switch(priv->CustomerID)
3103 case RT_CID_819x_RUNTOP:
3104 priv->LedStrategy = SW_LED_MODE2;
3108 priv->LedStrategy = SW_LED_MODE4;
3112 priv->LedStrategy = SW_LED_MODE0;
3118 if(priv->rf_type == RF_1T2R)
3120 RT_TRACE(COMP_EPROM, "\n1T2R config\n");
3124 RT_TRACE(COMP_EPROM, "\n2T4R config\n");
3127 // 2008/01/16 MH We can only know RF type in the function. So we have to init
3128 // DIG RATR table again.
3129 init_rate_adaptive(dev);
3130 //we need init DIG RATR table here again.
3132 RT_TRACE(COMP_EPROM, "<===========%s()\n", __FUNCTION__);
3136 short rtl8192_get_channel_map(struct net_device * dev)
3138 struct r8192_priv *priv = ieee80211_priv(dev);
3139 if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
3140 printk("rtl8180_init:Error channel plan! Set to default.\n");
3141 priv->ChannelPlan= 0;
3143 RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
3145 rtl819x_set_channel_map(priv->ChannelPlan, priv);
3149 short rtl8192_init(struct net_device *dev)
3152 struct r8192_priv *priv = ieee80211_priv(dev);
3154 memset(&(priv->stats),0,sizeof(struct Stats));
3155 memset(priv->txqueue_to_outpipemap,0,9);
3159 u8 queuetopipe[]={3,2,1,0,4,8,7,6,5};
3160 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
3162 printk("%d ",priv->txqueue_to_outpipemap[i]);
3167 u8 queuetopipe[]={3,2,1,0,4,4,0,4,4};
3168 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
3170 printk("%d ",priv->txqueue_to_outpipemap[i]);
3174 rtl8192_init_priv_variable(dev);
3175 rtl8192_init_priv_lock(priv);
3176 rtl8192_init_priv_task(dev);
3177 rtl8192_get_eeprom_size(dev);
3178 rtl8192_read_eeprom_info(dev);
3179 rtl8192_get_channel_map(dev);
3181 init_timer(&priv->watch_dog_timer);
3182 priv->watch_dog_timer.data = (unsigned long)dev;
3183 priv->watch_dog_timer.function = watch_dog_timer_callback;
3184 if(rtl8192_usb_initendpoints(dev)!=0){
3185 DMESG("Endopoints initialization failed");
3189 //rtl8192_adapter_start(dev);
3196 /******************************************************************************
3197 *function: This function actually only set RRSR, RATR and BW_OPMODE registers
3198 * not to do all the hw config as its name says
3199 * input: net_device dev
3202 * notice: This part need to modified according to the rate set we filtered
3203 * ****************************************************************************/
3204 void rtl8192_hwconfig(struct net_device* dev)
3206 u32 regRATR = 0, regRRSR = 0;
3207 u8 regBwOpMode = 0, regTmp = 0;
3208 struct r8192_priv *priv = ieee80211_priv(dev);
3210 // Set RRSR, RATR, and BW_OPMODE registers
3212 switch(priv->ieee80211->mode)
3214 case WIRELESS_MODE_B:
3215 regBwOpMode = BW_OPMODE_20MHZ;
3216 regRATR = RATE_ALL_CCK;
3217 regRRSR = RATE_ALL_CCK;
3219 case WIRELESS_MODE_A:
3220 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
3221 regRATR = RATE_ALL_OFDM_AG;
3222 regRRSR = RATE_ALL_OFDM_AG;
3224 case WIRELESS_MODE_G:
3225 regBwOpMode = BW_OPMODE_20MHZ;
3226 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3227 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3229 case WIRELESS_MODE_AUTO:
3231 if (Adapter->bInHctTest)
3233 regBwOpMode = BW_OPMODE_20MHZ;
3234 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3235 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3240 regBwOpMode = BW_OPMODE_20MHZ;
3241 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3242 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3245 case WIRELESS_MODE_N_24G:
3246 // It support CCK rate by default.
3247 // CCK rate will be filtered out only when associated AP does not support it.
3248 regBwOpMode = BW_OPMODE_20MHZ;
3249 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3250 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3252 case WIRELESS_MODE_N_5G:
3253 regBwOpMode = BW_OPMODE_5G;
3254 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3255 regRRSR = RATE_ALL_OFDM_AG;
3259 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
3262 ratr_value = regRATR;
3263 if (priv->rf_type == RF_1T2R)
3265 ratr_value &= ~(RATE_ALL_OFDM_2SS);
3267 write_nic_dword(dev, RATR0, ratr_value);
3268 write_nic_byte(dev, UFWP, 1);
3270 regTmp = read_nic_byte(dev, 0x313);
3271 regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
3272 write_nic_dword(dev, RRSR, regRRSR);
3275 // Set Retry Limit here
3277 write_nic_word(dev, RETRY_LIMIT,
3278 priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
3279 priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
3280 // Set Contention Window here
3284 // Set Tx Antenna including Feedback control
3286 // Set Auto Rate fallback control
3292 //InitializeAdapter and PhyCfg
3293 bool rtl8192_adapter_start(struct net_device *dev)
3295 struct r8192_priv *priv = ieee80211_priv(dev);
3297 bool init_status = true;
3298 RT_TRACE(COMP_INIT, "====>%s()\n", __FUNCTION__);
3299 priv->Rf_Mode = RF_OP_By_SW_3wire;
3300 //for ASIC power on sequence
3301 write_nic_byte_E(dev, 0x5f, 0x80);
3303 write_nic_byte_E(dev, 0x5f, 0xf0);
3304 write_nic_byte_E(dev, 0x5d, 0x00);
3305 write_nic_byte_E(dev, 0x5e, 0x80);
3306 write_nic_byte(dev, 0x17, 0x37);
3309 priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
3310 //config CPUReset Register
3311 //Firmware Reset or not?
3312 dwRegRead = read_nic_dword(dev, CPU_GEN);
3313 if (priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
3314 dwRegRead |= CPU_GEN_SYSTEM_RESET; //do nothing here?
3315 else if (priv->pFirmware->firmware_status == FW_STATUS_5_READY)
3316 dwRegRead |= CPU_GEN_FIRMWARE_RESET;
3318 RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __FUNCTION__, priv->pFirmware->firmware_status);
3320 write_nic_dword(dev, CPU_GEN, dwRegRead);
3323 rtl8192_BBConfig(dev);
3325 //Loopback mode or not
3326 priv->LoopbackMode = RTL819xU_NO_LOOPBACK;
3327 // priv->LoopbackMode = RTL819xU_MAC_LOOPBACK;
3329 dwRegRead = read_nic_dword(dev, CPU_GEN);
3330 if (priv->LoopbackMode == RTL819xU_NO_LOOPBACK)
3331 dwRegRead = ((dwRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
3332 else if (priv->LoopbackMode == RTL819xU_MAC_LOOPBACK)
3333 dwRegRead |= CPU_CCK_LOOPBACK;
3335 RT_TRACE(COMP_ERR, "Serious error in %s(): wrong loopback mode setting(%d)\n", __FUNCTION__, priv->LoopbackMode);
3337 write_nic_dword(dev, CPU_GEN, dwRegRead);
3339 //after reset cpu, we need wait for a seconds to write in register.
3342 //xiong add for new bitfile:usb suspend reset pin set to 1. //do we need?
3343 write_nic_byte_E(dev, 0x5f, (read_nic_byte_E(dev, 0x5f)|0x20));
3346 rtl8192_hwconfig(dev);
3349 write_nic_byte(dev, CMDR, CR_RE|CR_TE);
3352 write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
3353 write_nic_word(dev, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
3356 write_nic_dword(dev, RCR, priv->ReceiveConfig);
3358 //Initialize Number of Reserved Pages in Firmware Queue
3359 write_nic_dword(dev, RQPN1, NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
3360 NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
3361 NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
3362 NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
3363 write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT |\
3364 NUM_OF_PAGE_IN_FW_QUEUE_CMD << RSVD_FW_QUEUE_PAGE_CMD_SHIFT);
3365 write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
3366 NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT
3367 // | NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT
3369 write_nic_dword(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
3372 // TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
3373 write_nic_byte(dev, ACK_TIMEOUT, 0x30);
3375 // RT_TRACE(COMP_INIT, "%s():priv->ResetProgress is %d\n", __FUNCTION__,priv->ResetProgress);
3376 if(priv->ResetProgress == RESET_TYPE_NORESET)
3377 rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);
3378 if(priv->ResetProgress == RESET_TYPE_NORESET){
3379 CamResetAllEntry(dev);
3381 u8 SECR_value = 0x0;
3382 SECR_value |= SCR_TxEncEnable;
3383 SECR_value |= SCR_RxDecEnable;
3384 SECR_value |= SCR_NoSKMC;
3385 write_nic_byte(dev, SECR, SECR_value);
3390 write_nic_word(dev, ATIMWND, 2);
3391 write_nic_word(dev, BCN_INTERVAL, 100);
3394 #define DEFAULT_EDCA 0x005e4332
3396 for (i=0; i<QOS_QUEUE_NUM; i++)
3397 write_nic_dword(dev, WDCAPARA_ADD[i], DEFAULT_EDCA);
3399 #ifdef USB_RX_AGGREGATION_SUPPORT
3400 //3 For usb rx firmware aggregation control
3401 if(priv->ResetProgress == RESET_TYPE_NORESET)
3404 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
3405 ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
3406 (pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
3408 * If usb rx firmware aggregation is enabled,
3409 * when anyone of three threshold conditions above is reached,
3410 * firmware will send aggregated packet to driver.
3412 write_nic_dword(dev, 0x1a8, ulValue);
3413 priv->bCurrentRxAggrEnable = true;
3417 rtl8192_phy_configmac(dev);
3419 if (priv->card_8192_version == (u8) VERSION_819xU_A)
3421 rtl8192_phy_getTxPower(dev);
3422 rtl8192_phy_setTxPower(dev, priv->chan);
3426 init_status = init_firmware(dev);
3429 RT_TRACE(COMP_ERR,"ERR!!! %s(): Firmware download is failed\n", __FUNCTION__);
3432 RT_TRACE(COMP_INIT, "%s():after firmware download\n", __FUNCTION__);
3435 if(Adapter->ResetProgress == RESET_TYPE_NORESET)
3437 if(pMgntInfo->RegRfOff == TRUE)
3438 { // User disable RF via registry.
3439 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RegRfOff ----------\n"));
3440 MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);
3441 // Those action will be discard in MgntActSet_RF_State because off the same state
3442 for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
3443 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3445 else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS)
3446 { // H/W or S/W RF OFF before sleep.
3447 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RfOffReason(%d) ----------\n", pMgntInfo->RfOffReason));
3448 MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3452 pHalData->eRFPowerState = eRfOn;
3453 pMgntInfo->RfOffReason = 0;
3454 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): RF is on ----------\n"));
3459 if(pHalData->eRFPowerState == eRfOff)
3461 MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3462 // Those action will be discard in MgntActSet_RF_State because off the same state
3463 for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
3464 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3469 if(priv->ResetProgress == RESET_TYPE_NORESET){
3470 rtl8192_phy_RFConfig(dev);
3471 RT_TRACE(COMP_INIT, "%s():after phy RF config\n", __FUNCTION__);
3475 if(priv->ieee80211->FwRWRF)
3476 // We can force firmware to do RF-R/W
3477 priv->Rf_Mode = RF_OP_By_FW;
3479 priv->Rf_Mode = RF_OP_By_SW_3wire;
3482 rtl8192_phy_updateInitGain(dev);
3483 /*--set CCK and OFDM Block "ON"--*/
3484 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
3485 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
3487 if(priv->ResetProgress == RESET_TYPE_NORESET)
3490 u8 tmpvalue = read_nic_byte(dev, 0x301);
3494 RT_TRACE(COMP_POWER_TRACKING, "D-cut\n");
3498 priv->bDcut = FALSE;
3499 RT_TRACE(COMP_POWER_TRACKING, "C-cut\n");
3501 dm_initialize_txpower_tracking(dev);
3503 if(priv->bDcut == TRUE)
3506 u32 tmpRegA= rtl8192_QueryBBReg(dev,rOFDM0_XATxIQImbalance,bMaskDWord);
3507 // u32 tmpRegC= rtl8192_QueryBBReg(dev,rOFDM0_XCTxIQImbalance,bMaskDWord);
3508 for(i = 0; i<TxBBGainTableLength; i++)
3510 if(tmpRegA == priv->txbbgain_table[i].txbbgain_value)
3512 priv->rfa_txpowertrackingindex= (u8)i;
3513 priv->rfa_txpowertrackingindex_real= (u8)i;
3514 priv->rfa_txpowertracking_default= priv->rfa_txpowertrackingindex;
3519 TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
3521 for(i=0 ; i<CCKTxBBGainTableLength ; i++)
3524 if(TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0])
3526 priv->cck_present_attentuation_20Mdefault=(u8) i;
3530 priv->cck_present_attentuation_40Mdefault= 0;
3531 priv->cck_present_attentuation_difference= 0;
3532 priv->cck_present_attentuation = priv->cck_present_attentuation_20Mdefault;
3534 // pMgntInfo->bTXPowerTracking = FALSE;//TEMPLY DISABLE
3537 write_nic_byte(dev, 0x87, 0x0);
3543 /* this configures registers for beacon tx and enables it via
3544 * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
3545 * be used to stop beacon transmission
3547 /***************************************************************************
3548 -------------------------------NET STUFF---------------------------
3549 ***************************************************************************/
3551 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
3553 struct r8192_priv *priv = ieee80211_priv(dev);
3555 return &priv->ieee80211->stats;
3559 HalTxCheckStuck819xUsb(
3560 struct net_device *dev
3563 struct r8192_priv *priv = ieee80211_priv(dev);
3564 u16 RegTxCounter = read_nic_word(dev, 0x128);
3565 bool bStuck = FALSE;
3566 RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
3567 if(priv->TxCounter==RegTxCounter)
3570 priv->TxCounter = RegTxCounter;
3576 * <Assumption: RT_TX_SPINLOCK is acquired.>
3577 * First added: 2006.11.19 by emily
3580 TxCheckStuck(struct net_device *dev)
3582 struct r8192_priv *priv = ieee80211_priv(dev);
3585 // u8 ResetThreshold;
3586 bool bCheckFwTxCnt = false;
3587 //unsigned long flags;
3590 // Decide Stuch threshold according to current power save mode
3593 // RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
3594 // PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
3595 // spin_lock_irqsave(&priv->ieee80211->lock,flags);
3596 for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
3598 if(QueueID == TXCMD_QUEUE)
3600 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
3601 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))
3603 if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
3607 bCheckFwTxCnt = true;
3609 // PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
3610 // spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
3611 // RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
3614 if(HalTxCheckStuck819xUsb(dev))
3616 RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
3617 return RESET_TYPE_SILENT;
3620 return RESET_TYPE_NORESET;
3624 HalRxCheckStuck819xUsb(struct net_device *dev)
3626 u16 RegRxCounter = read_nic_word(dev, 0x130);
3627 struct r8192_priv *priv = ieee80211_priv(dev);
3628 bool bStuck = FALSE;
3629 static u8 rx_chk_cnt = 0;
3630 RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
3631 // If rssi is small, we should check rx for long time because of bad rx.
3632 // or maybe it will continuous silent reset every 2 seconds.
3634 if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
3636 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
3638 else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
3639 ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
3640 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
3651 else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
3652 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
3653 priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
3657 //DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
3663 //DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
3670 //DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
3676 //DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
3680 if(priv->RxCounter==RegRxCounter)
3683 priv->RxCounter = RegRxCounter;
3689 RxCheckStuck(struct net_device *dev)
3691 struct r8192_priv *priv = ieee80211_priv(dev);
3693 bool bRxCheck = FALSE;
3695 // RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
3696 //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
3698 if(priv->IrpPendingCount > 1)
3700 //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
3702 // RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
3705 if(HalRxCheckStuck819xUsb(dev))
3707 RT_TRACE(COMP_RESET, "RxStuck Condition\n");
3708 return RESET_TYPE_SILENT;
3711 return RESET_TYPE_NORESET;
3716 * This function is called by Checkforhang to check whether we should ask OS to reset driver
3718 * \param pAdapter The adapter context for this miniport
3720 * Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
3721 * to judge whether there is tx stuck.
3722 * Note: This function may be required to be rewrite for Vista OS.
3723 * <<<Assumption: Tx spinlock has been acquired >>>
3725 * 8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
3728 rtl819x_ifcheck_resetornot(struct net_device *dev)
3730 struct r8192_priv *priv = ieee80211_priv(dev);
3731 RESET_TYPE TxResetType = RESET_TYPE_NORESET;
3732 RESET_TYPE RxResetType = RESET_TYPE_NORESET;
3733 RT_RF_POWER_STATE rfState;
3735 rfState = priv->ieee80211->eRFPowerState;
3737 TxResetType = TxCheckStuck(dev);
3738 if( rfState != eRfOff ||
3739 /*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
3740 (priv->ieee80211->iw_mode != IW_MODE_ADHOC))
3742 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
3743 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
3744 // if driver is in firmware download failure status, driver should initialize RF in the following
3745 // silent reset procedure Emily, 2008.01.21
3747 // Driver should not check RX stuck in IBSS mode because it is required to
3748 // set Check BSSID in order to send beacon, however, if check BSSID is
3749 // set, STA cannot hear any packet a all. Emily, 2008.04.12
3750 RxResetType = RxCheckStuck(dev);
3752 if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
3753 return RESET_TYPE_NORMAL;
3754 else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
3755 RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
3756 return RESET_TYPE_SILENT;
3759 return RESET_TYPE_NORESET;
3763 void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
3764 int _rtl8192_up(struct net_device *dev);
3765 int rtl8192_close(struct net_device *dev);
3770 CamRestoreAllEntry( struct net_device *dev)
3773 struct r8192_priv *priv = ieee80211_priv(dev);
3774 u8* MacAddr = priv->ieee80211->current_network.bssid;
3776 static u8 CAM_CONST_ADDR[4][6] = {
3777 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3778 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3779 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3780 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
3781 static u8 CAM_CONST_BROAD[] =
3782 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3784 RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
3787 if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
3788 (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
3791 for(EntryId=0; EntryId<4; EntryId++)
3794 MacAddr = CAM_CONST_ADDR[EntryId];
3798 priv->ieee80211->pairwise_key_type,
3806 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
3810 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3814 priv->ieee80211->pairwise_key_type,
3822 priv->ieee80211->pairwise_key_type,
3828 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
3832 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3836 priv->ieee80211->pairwise_key_type,
3844 priv->ieee80211->pairwise_key_type,
3853 if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
3855 MacAddr = CAM_CONST_BROAD;
3856 for(EntryId=1 ; EntryId<4 ; EntryId++)
3862 priv->ieee80211->group_key_type,
3868 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3872 priv->ieee80211->group_key_type,
3877 else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
3879 MacAddr = CAM_CONST_BROAD;
3880 for(EntryId=1; EntryId<4 ; EntryId++)
3886 priv->ieee80211->group_key_type,
3893 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3897 priv->ieee80211->group_key_type,
3903 //////////////////////////////////////////////////////////////
3904 // This function is used to fix Tx/Rx stop bug temporarily.
3905 // This function will do "system reset" to NIC when Tx or Rx is stuck.
3906 // The method checking Tx/Rx stuck of this function is supported by FW,
3907 // which reports Tx and Rx counter to register 0x128 and 0x130.
3908 //////////////////////////////////////////////////////////////
3910 rtl819x_ifsilentreset(struct net_device *dev)
3912 //OCTET_STRING asocpdu;
3913 struct r8192_priv *priv = ieee80211_priv(dev);
3915 int reset_status = 0;
3916 struct ieee80211_device *ieee = priv->ieee80211;
3919 // 2007.07.20. If we need to check CCK stop, please uncomment this line.
3920 //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
3922 if(priv->ResetProgress==RESET_TYPE_NORESET)
3926 RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
3928 // Set the variable for reset.
3929 priv->ResetProgress = RESET_TYPE_SILENT;
3930 // rtl8192_close(dev);
3931 down(&priv->wx_sem);
3934 RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
3939 RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
3940 // if(!netif_queue_stopped(dev))
3941 // netif_stop_queue(dev);
3943 rtl8192_rtx_disable(dev);
3944 rtl8192_cancel_deferred_work(priv);
3946 del_timer_sync(&priv->watch_dog_timer);
3948 ieee->sync_scan_hurryup = 1;
3949 if(ieee->state == IEEE80211_LINKED)
3951 down(&ieee->wx_sem);
3952 printk("ieee->state is IEEE80211_LINKED\n");
3953 ieee80211_stop_send_beacons(priv->ieee80211);
3954 del_timer_sync(&ieee->associate_timer);
3955 cancel_delayed_work(&ieee->associate_retry_wq);
3956 ieee80211_stop_scan(ieee);
3957 netif_carrier_off(dev);
3961 printk("ieee->state is NOT LINKED\n");
3962 ieee80211_softmac_stop_protocol(priv->ieee80211); }
3964 RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
3965 //rtl8192_irq_disable(dev);
3966 RT_TRACE(COMP_RESET,"%s():===========>start to up the driver\n",__FUNCTION__);
3967 reset_status = _rtl8192_up(dev);
3969 RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
3970 if(reset_status == -EAGAIN)
3979 RT_TRACE(COMP_ERR," ERR!!! %s(): Reset Failed!!\n", __FUNCTION__);
3982 ieee->is_silent_reset = 1;
3983 EnableHWSecurityConfig8192(dev);
3984 if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
3986 ieee->set_chan(ieee->dev, ieee->current_network.channel);
3988 queue_work(ieee->wq, &ieee->associate_complete_wq);
3991 else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
3993 ieee->set_chan(ieee->dev, ieee->current_network.channel);
3994 ieee->link_change(ieee->dev);
3996 // notify_wx_assoc_event(ieee);
3998 ieee80211_start_send_beacons(ieee);
4000 if (ieee->data_hard_resume)
4001 ieee->data_hard_resume(ieee->dev);
4002 netif_carrier_on(ieee->dev);
4005 CamRestoreAllEntry(dev);
4007 priv->ResetProgress = RESET_TYPE_NORESET;
4008 priv->reset_count++;
4010 priv->bForcedSilentReset =false;
4011 priv->bResetInProgress = false;
4013 // For test --> force write UFWP.
4014 write_nic_byte(dev, UFWP, 1);
4015 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
4019 void CAM_read_entry(
4020 struct net_device *dev,
4024 u32 target_command=0;
4025 u32 target_content=0;
4029 // printk("=======>start read CAM\n");
4030 for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
4032 // polling bit, and No Write enable, and address
4033 target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
4034 target_command= target_command | BIT31;
4036 //Check polling bit is clear
4040 ulStatus = read_nic_dword(dev, RWCAM);
4041 if(ulStatus & BIT31){
4048 write_nic_dword(dev, RWCAM, target_command);
4049 RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
4050 // printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
4051 target_content = read_nic_dword(dev, RCAMO);
4052 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
4053 // printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
4058 void rtl819x_update_rxcounts(
4059 struct r8192_priv *priv,
4068 *TotalRxDataNum = 0;
4070 SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
4071 priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
4072 priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
4073 for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
4074 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
4075 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
4080 extern void rtl819x_watchdog_wqcallback(struct work_struct *work)
4082 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
4083 struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
4084 struct net_device *dev = priv->ieee80211->dev;
4085 struct ieee80211_device* ieee = priv->ieee80211;
4086 RESET_TYPE ResetType = RESET_TYPE_NORESET;
4087 static u8 check_reset_cnt=0;
4088 bool bBusyTraffic = false;
4092 hal_dm_watchdog(dev);
4094 {//to get busy traffic condition
4095 if(ieee->state == IEEE80211_LINKED)
4097 if( ieee->LinkDetectInfo.NumRxOkInPeriod> 666 ||
4098 ieee->LinkDetectInfo.NumTxOkInPeriod> 666 ) {
4099 bBusyTraffic = true;
4101 ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
4102 ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
4103 ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
4106 //added by amy for AP roaming
4108 if(priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA)
4110 u32 TotalRxBcnNum = 0;
4111 u32 TotalRxDataNum = 0;
4113 rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
4114 if((TotalRxBcnNum+TotalRxDataNum) == 0)
4117 if(rfState == eRfOff)
4118 RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
4120 printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
4121 // Dot11d_Reset(dev);
4122 priv->ieee80211->state = IEEE80211_ASSOCIATING;
4123 notify_wx_assoc_event(priv->ieee80211);
4124 RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
4125 priv->ieee80211->link_change(dev);
4126 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
4130 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod=0;
4131 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod=0;
4133 // CAM_read_entry(dev,4);
4134 //check if reset the driver
4135 if(check_reset_cnt++ >= 3)
4137 ResetType = rtl819x_ifcheck_resetornot(dev);
4138 check_reset_cnt = 3;
4139 //DbgPrint("Start to check silent reset\n");
4141 // 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",__FUNCTION__,priv->force_reset,priv->ResetProgress,priv->bForcedSilentReset,priv->bDisableNormalResetCheck,ResetType);
4142 if( (priv->force_reset) || (priv->ResetProgress==RESET_TYPE_NORESET &&
4143 (priv->bForcedSilentReset ||
4144 (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))) // This is control by OID set in Pomelo
4146 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",__FUNCTION__,priv->force_reset,priv->ResetProgress,priv->bForcedSilentReset,priv->bDisableNormalResetCheck,ResetType);
4147 rtl819x_ifsilentreset(dev);
4149 priv->force_reset = false;
4150 priv->bForcedSilentReset = false;
4151 priv->bResetInProgress = false;
4152 RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
4156 void watch_dog_timer_callback(unsigned long data)
4158 struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
4159 //printk("===============>watch_dog timer\n");
4160 queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
4161 mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
4163 int _rtl8192_up(struct net_device *dev)
4165 struct r8192_priv *priv = ieee80211_priv(dev);
4167 int init_status = 0;
4169 priv->ieee80211->ieee_up=1;
4170 RT_TRACE(COMP_INIT, "Bringing up iface");
4171 init_status = rtl8192_adapter_start(dev);
4174 RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n", __FUNCTION__);
4175 priv->up=priv->ieee80211->ieee_up = 0;
4178 RT_TRACE(COMP_INIT, "start adapter finished\n");
4179 rtl8192_rx_enable(dev);
4180 // rtl8192_tx_enable(dev);
4181 if(priv->ieee80211->state != IEEE80211_LINKED)
4182 ieee80211_softmac_start_protocol(priv->ieee80211);
4183 ieee80211_reset_queue(priv->ieee80211);
4184 watch_dog_timer_callback((unsigned long) dev);
4185 if(!netif_queue_stopped(dev))
4186 netif_start_queue(dev);
4188 netif_wake_queue(dev);
4194 int rtl8192_open(struct net_device *dev)
4196 struct r8192_priv *priv = ieee80211_priv(dev);
4198 down(&priv->wx_sem);
4199 ret = rtl8192_up(dev);
4206 int rtl8192_up(struct net_device *dev)
4208 struct r8192_priv *priv = ieee80211_priv(dev);
4210 if (priv->up == 1) return -1;
4212 return _rtl8192_up(dev);
4216 int rtl8192_close(struct net_device *dev)
4218 struct r8192_priv *priv = ieee80211_priv(dev);
4221 down(&priv->wx_sem);
4223 ret = rtl8192_down(dev);
4231 int rtl8192_down(struct net_device *dev)
4233 struct r8192_priv *priv = ieee80211_priv(dev);
4236 if (priv->up == 0) return -1;
4239 priv->ieee80211->ieee_up = 0;
4240 RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
4242 if (!netif_queue_stopped(dev))
4243 netif_stop_queue(dev);
4245 rtl8192_rtx_disable(dev);
4246 //rtl8192_irq_disable(dev);
4248 /* Tx related queue release */
4249 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4250 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
4252 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4253 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
4256 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4257 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
4260 //as cancel_delayed_work will del work->timer, so if work is not definedas struct delayed_work, it will corrupt
4261 // flush_scheduled_work();
4262 rtl8192_cancel_deferred_work(priv);
4264 del_timer_sync(&priv->watch_dog_timer);
4267 ieee80211_softmac_stop_protocol(priv->ieee80211);
4268 memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
4269 RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
4275 void rtl8192_commit(struct net_device *dev)
4277 struct r8192_priv *priv = ieee80211_priv(dev);
4278 int reset_status = 0;
4279 //u8 reset_times = 0;
4280 if (priv->up == 0) return ;
4283 rtl8192_cancel_deferred_work(priv);
4284 del_timer_sync(&priv->watch_dog_timer);
4285 //cancel_delayed_work(&priv->SwChnlWorkItem);
4287 ieee80211_softmac_stop_protocol(priv->ieee80211);
4289 //rtl8192_irq_disable(dev);
4290 rtl8192_rtx_disable(dev);
4291 reset_status = _rtl8192_up(dev);
4296 void rtl8192_restart(struct net_device *dev)
4298 struct r8192_priv *priv = ieee80211_priv(dev);
4300 void rtl8192_restart(struct work_struct *work)
4302 struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
4303 struct net_device *dev = priv->ieee80211->dev;
4305 down(&priv->wx_sem);
4307 rtl8192_commit(dev);
4312 static void r8192_set_multicast(struct net_device *dev)
4314 struct r8192_priv *priv = ieee80211_priv(dev);
4317 //down(&priv->wx_sem);
4321 promisc = (dev->flags & IFF_PROMISC) ? 1:0;
4323 if (promisc != priv->promisc)
4324 // rtl8192_commit(dev);
4326 priv->promisc = promisc;
4328 //schedule_work(&priv->reset_wq);
4329 //up(&priv->wx_sem);
4333 int r8192_set_mac_adr(struct net_device *dev, void *mac)
4335 struct r8192_priv *priv = ieee80211_priv(dev);
4336 struct sockaddr *addr = mac;
4338 down(&priv->wx_sem);
4340 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
4342 schedule_work(&priv->reset_wq);
4348 /* based on ipw2200 driver */
4349 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
4351 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4352 struct iwreq *wrq = (struct iwreq *)rq;
4354 struct ieee80211_device *ieee = priv->ieee80211;
4356 u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
4357 struct iw_point *p = &wrq->u.data;
4358 struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
4360 down(&priv->wx_sem);
4363 if (p->length < sizeof(struct ieee_param) || !p->pointer){
4368 ipw = kmalloc(p->length, GFP_KERNEL);
4373 if (copy_from_user(ipw, p->pointer, p->length)) {
4380 case RTL_IOCTL_WPA_SUPPLICANT:
4381 //parse here for HW security
4382 if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
4384 if (ipw->u.crypt.set_tx)
4386 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
4387 ieee->pairwise_key_type = KEY_TYPE_CCMP;
4388 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
4389 ieee->pairwise_key_type = KEY_TYPE_TKIP;
4390 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
4392 if (ipw->u.crypt.key_len == 13)
4393 ieee->pairwise_key_type = KEY_TYPE_WEP104;
4394 else if (ipw->u.crypt.key_len == 5)
4395 ieee->pairwise_key_type = KEY_TYPE_WEP40;
4398 ieee->pairwise_key_type = KEY_TYPE_NA;
4400 if (ieee->pairwise_key_type)
4402 memcpy((u8*)key, ipw->u.crypt.key, 16);
4403 EnableHWSecurityConfig8192(dev);
4404 //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!
4406 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
4407 if (ieee->auth_mode != 2)
4408 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
4411 else //if (ipw->u.crypt.idx) //group key use idx > 0
4413 memcpy((u8*)key, ipw->u.crypt.key, 16);
4414 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
4415 ieee->group_key_type= KEY_TYPE_CCMP;
4416 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
4417 ieee->group_key_type = KEY_TYPE_TKIP;
4418 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
4420 if (ipw->u.crypt.key_len == 13)
4421 ieee->group_key_type = KEY_TYPE_WEP104;
4422 else if (ipw->u.crypt.key_len == 5)
4423 ieee->group_key_type = KEY_TYPE_WEP40;
4426 ieee->group_key_type = KEY_TYPE_NA;
4428 if (ieee->group_key_type)
4432 ipw->u.crypt.idx, //KeyIndex
4433 ieee->group_key_type, //KeyType
4434 broadcast_addr, //MacAddr
4440 #ifdef JOHN_HWSEC_DEBUG
4442 printk("@@ wrq->u pointer = ");
4443 for(i=0;i<wrq->u.data.length;i++){
4444 if(i%10==0) printk("\n");
4445 printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
4448 #endif /*JOHN_HWSEC_DEBUG*/
4449 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
4463 u8 HwRateToMRate90(bool bIsHT, u8 rate)
4469 case DESC90_RATE1M: ret_rate = MGN_1M; break;
4470 case DESC90_RATE2M: ret_rate = MGN_2M; break;
4471 case DESC90_RATE5_5M: ret_rate = MGN_5_5M; break;
4472 case DESC90_RATE11M: ret_rate = MGN_11M; break;
4473 case DESC90_RATE6M: ret_rate = MGN_6M; break;
4474 case DESC90_RATE9M: ret_rate = MGN_9M; break;
4475 case DESC90_RATE12M: ret_rate = MGN_12M; break;
4476 case DESC90_RATE18M: ret_rate = MGN_18M; break;
4477 case DESC90_RATE24M: ret_rate = MGN_24M; break;
4478 case DESC90_RATE36M: ret_rate = MGN_36M; break;
4479 case DESC90_RATE48M: ret_rate = MGN_48M; break;
4480 case DESC90_RATE54M: ret_rate = MGN_54M; break;
4484 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
4490 case DESC90_RATEMCS0: ret_rate = MGN_MCS0; break;
4491 case DESC90_RATEMCS1: ret_rate = MGN_MCS1; break;
4492 case DESC90_RATEMCS2: ret_rate = MGN_MCS2; break;
4493 case DESC90_RATEMCS3: ret_rate = MGN_MCS3; break;
4494 case DESC90_RATEMCS4: ret_rate = MGN_MCS4; break;
4495 case DESC90_RATEMCS5: ret_rate = MGN_MCS5; break;
4496 case DESC90_RATEMCS6: ret_rate = MGN_MCS6; break;
4497 case DESC90_RATEMCS7: ret_rate = MGN_MCS7; break;
4498 case DESC90_RATEMCS8: ret_rate = MGN_MCS8; break;
4499 case DESC90_RATEMCS9: ret_rate = MGN_MCS9; break;
4500 case DESC90_RATEMCS10: ret_rate = MGN_MCS10; break;
4501 case DESC90_RATEMCS11: ret_rate = MGN_MCS11; break;
4502 case DESC90_RATEMCS12: ret_rate = MGN_MCS12; break;
4503 case DESC90_RATEMCS13: ret_rate = MGN_MCS13; break;
4504 case DESC90_RATEMCS14: ret_rate = MGN_MCS14; break;
4505 case DESC90_RATEMCS15: ret_rate = MGN_MCS15; break;
4506 case DESC90_RATEMCS32: ret_rate = (0x80|0x20); break;
4510 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
4519 * Function: UpdateRxPktTimeStamp
4520 * Overview: Recored down the TSF time stamp when receiving a packet
4528 * (pRfd->Status.TimeStampHigh is updated)
4529 * (pRfd->Status.TimeStampLow is updated)
4533 void UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
4535 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4537 if(stats->bIsAMPDU && !stats->bFirstMPDU) {
4538 stats->mac_time[0] = priv->LastRxDescTSFLow;
4539 stats->mac_time[1] = priv->LastRxDescTSFHigh;
4541 priv->LastRxDescTSFLow = stats->mac_time[0];
4542 priv->LastRxDescTSFHigh = stats->mac_time[1];
4548 long rtl819x_translate_todbm(u8 signal_strength_index )// 0-100 index.
4550 long signal_power; // in dBm.
4552 // Translate to dBm (x=0.5y-95).
4553 signal_power = (long)((signal_strength_index + 1) >> 1);
4556 return signal_power;
4560 /* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
4561 be a local static. Otherwise, it may increase when we return from S3/S4. The
4562 value will be kept in memory or disk. We must delcare the value in adapter
4563 and it will be reinitialized when return from S3/S4. */
4564 void rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
4566 bool bcheck = false;
4568 u32 nspatial_stream, tmp_val;
4570 static u32 slide_rssi_index=0, slide_rssi_statistics=0;
4571 static u32 slide_evm_index=0, slide_evm_statistics=0;
4572 static u32 last_rssi=0, last_evm=0;
4574 static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
4575 static u32 last_beacon_adc_pwdb=0;
4577 struct ieee80211_hdr_3addr *hdr;
4579 unsigned int frag,seq;
4580 hdr = (struct ieee80211_hdr_3addr *)buffer;
4581 sc = le16_to_cpu(hdr->seq_ctl);
4582 frag = WLAN_GET_SEQ_FRAG(sc);
4583 seq = WLAN_GET_SEQ_SEQ(sc);
4584 //cosa add 04292008 to record the sequence number
4585 pcurrent_stats->Seq_Num = seq;
4587 // Check whether we should take the previous packet into accounting
4589 if(!pprevious_stats->bIsAMPDU)
4591 // if previous packet is not aggregated packet
4598 if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
4600 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
4601 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
4602 priv->stats.slide_rssi_total -= last_rssi;
4604 priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
4606 priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
4607 if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
4608 slide_rssi_index = 0;
4610 // <1> Showed on UI for user, in dbm
4611 tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
4612 priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
4613 pcurrent_stats->rssi = priv->stats.signal_strength;
4615 // If the previous packet does not match the criteria, neglect it
4617 if(!pprevious_stats->bPacketMatchBSSID)
4619 if(!pprevious_stats->bToSelfBA)
4627 //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
4632 priv->stats.num_process_phyinfo++;
4634 /* record the general signal strength to the sliding window. */
4637 // <2> Showed on UI for engineering
4638 // hardware does not provide rssi information for each rf path in CCK
4639 if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
4641 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
4643 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
4646 //Fixed by Jacken 2008-03-20
4647 if(priv->stats.rx_rssi_percentage[rfpath] == 0)
4649 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
4650 //DbgPrint("MIMO RSSI initialize \n");
4652 if(pprevious_stats->RxMIMOSignalStrength[rfpath] > priv->stats.rx_rssi_percentage[rfpath])
4654 priv->stats.rx_rssi_percentage[rfpath] =
4655 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4656 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4657 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath] + 1;
4661 priv->stats.rx_rssi_percentage[rfpath] =
4662 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4663 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4665 RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath] = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
4673 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4674 pprevious_stats->bIsCCK? "CCK": "OFDM",
4675 pprevious_stats->RxPWDBAll);
4677 if(pprevious_stats->bPacketBeacon)
4679 /* record the beacon pwdb to the sliding window. */
4680 if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4682 slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
4683 last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
4684 priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
4685 //DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
4686 // slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
4688 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
4689 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
4690 //DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
4691 slide_beacon_adc_pwdb_index++;
4692 if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4693 slide_beacon_adc_pwdb_index = 0;
4694 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
4695 if(pprevious_stats->RxPWDBAll >= 3)
4696 pprevious_stats->RxPWDBAll -= 3;
4699 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4700 pprevious_stats->bIsCCK? "CCK": "OFDM",
4701 pprevious_stats->RxPWDBAll);
4704 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
4706 if(priv->undecorated_smoothed_pwdb < 0) // initialize
4708 priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
4709 //DbgPrint("First pwdb initialize \n");
4711 if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
4713 priv->undecorated_smoothed_pwdb =
4714 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4715 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4716 priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
4720 priv->undecorated_smoothed_pwdb =
4721 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4722 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4730 /* record the general EVM to the sliding window. */
4731 if(pprevious_stats->SignalQuality == 0)
4736 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
4737 if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
4738 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
4739 last_evm = priv->stats.slide_evm[slide_evm_index];
4740 priv->stats.slide_evm_total -= last_evm;
4743 priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
4745 priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
4746 if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
4747 slide_evm_index = 0;
4749 // <1> Showed on UI for user, in percentage.
4750 tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
4751 priv->stats.signal_quality = tmp_val;
4752 //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
4753 priv->stats.last_signal_strength_inpercent = tmp_val;
4756 // <2> Showed on UI for engineering
4757 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
4759 for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
4761 if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
4763 if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
4765 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
4767 priv->stats.rx_evm_percentage[nspatial_stream] =
4768 ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
4769 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
4778 /*-----------------------------------------------------------------------------
4779 * Function: rtl819x_query_rxpwrpercentage()
4783 * Input: char antpower
4787 * Return: 0-100 percentage
4791 * 05/26/2008 amy Create Version 0 porting from windows code.
4793 *---------------------------------------------------------------------------*/
4794 static u8 rtl819x_query_rxpwrpercentage(
4798 if ((antpower <= -100) || (antpower >= 20))
4802 else if (antpower >= 0)
4808 return (100+antpower);
4811 } /* QueryRxPwrPercentage */
4814 rtl819x_evm_dbtopercentage(
4826 ret_val = 0 - ret_val;
4834 // We want good-looking for signal strength/quality
4835 // 2007/7/19 01:09, by cosa.
4838 rtl819x_signal_scale_mapping(
4844 // Step 1. Scale mapping.
4845 if(currsig >= 61 && currsig <= 100)
4847 retsig = 90 + ((currsig - 60) / 4);
4849 else if(currsig >= 41 && currsig <= 60)
4851 retsig = 78 + ((currsig - 40) / 2);
4853 else if(currsig >= 31 && currsig <= 40)
4855 retsig = 66 + (currsig - 30);
4857 else if(currsig >= 21 && currsig <= 30)
4859 retsig = 54 + (currsig - 20);
4861 else if(currsig >= 5 && currsig <= 20)
4863 retsig = 42 + (((currsig - 5) * 2) / 3);
4865 else if(currsig == 4)
4869 else if(currsig == 3)
4873 else if(currsig == 2)
4877 else if(currsig == 1)
4889 static void rtl8192_query_rxphystatus(
4890 struct r8192_priv * priv,
4891 struct ieee80211_rx_stats * pstats,
4892 rx_drvinfo_819x_usb * pdrvinfo,
4893 struct ieee80211_rx_stats * precord_stats,
4894 bool bpacket_match_bssid,
4895 bool bpacket_toself,
4900 //PRT_RFD_STATUS pRtRfdStatus = &(pRfd->Status);
4901 phy_sts_ofdm_819xusb_t* pofdm_buf;
4902 phy_sts_cck_819xusb_t * pcck_buf;
4903 phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
4905 u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
4906 char rx_pwr[4], rx_pwr_all=0;
4907 //long rx_avg_pwr = 0;
4908 char rx_snrX, rx_evmX;
4910 u32 RSSI, total_rssi=0;//, total_evm=0;
4911 // long signal_strength_index = 0;
4916 priv->stats.numqry_phystatus++;
4918 is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
4920 // Record it for next packet processing
4921 memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
4922 pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
4923 pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
4924 pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
4925 pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
4926 pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
4928 prxpkt = (u8*)pdrvinfo;
4930 /* Move pointer to the 16th bytes. Phy status start address. */
4931 prxpkt += sizeof(rx_drvinfo_819x_usb);
4933 /* Initial the cck and ofdm buffer pointer */
4934 pcck_buf = (phy_sts_cck_819xusb_t *)prxpkt;
4935 pofdm_buf = (phy_sts_ofdm_819xusb_t *)prxpkt;
4937 pstats->RxMIMOSignalQuality[0] = -1;
4938 pstats->RxMIMOSignalQuality[1] = -1;
4939 precord_stats->RxMIMOSignalQuality[0] = -1;
4940 precord_stats->RxMIMOSignalQuality[1] = -1;
4945 // (1)Hardware does not provide RSSI for CCK
4949 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
4951 u8 report;//, cck_agc_rpt;
4953 priv->stats.numqry_phystatusCCK++;
4955 if(!priv->bCckHighPower)
4957 report = pcck_buf->cck_agc_rpt & 0xc0;
4961 //Fixed by Jacken from Bryant 2008-03-20
4962 //Original value is -38 , -26 , -14 , -2
4963 //Fixed value is -35 , -23 , -11 , 6
4965 rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
4968 rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
4971 rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
4974 rx_pwr_all = 6 - (pcck_buf->cck_agc_rpt & 0x3e);
4980 report = pcck_buf->cck_agc_rpt & 0x60;
4985 rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
4988 rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
4991 rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
4994 rx_pwr_all = 6 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
4999 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
5000 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
5001 pstats->RecvSignalPower = pwdb_all;
5004 // (3) Get Signal Quality (EVM)
5006 //if(bpacket_match_bssid)
5010 if(pstats->RxPWDBAll > 40)
5015 sq = pcck_buf->sq_rpt;
5017 if(pcck_buf->sq_rpt > 64)
5019 else if (pcck_buf->sq_rpt < 20)
5022 sq = ((64-sq) * 100) / 44;
5024 pstats->SignalQuality = precord_stats->SignalQuality = sq;
5025 pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
5026 pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
5031 priv->stats.numqry_phystatusHT++;
5033 // (1)Get RSSI for HT rate
5035 for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
5037 // 2008/01/30 MH we will judge RF RX path now.
5038 if (priv->brfpath_rxenable[i])
5043 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
5046 //Fixed by Jacken from Bryant 2008-03-20
5047 //Original value is 106
5048 rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
5050 //Get Rx snr value in DB
5051 tmp_rxsnr = pofdm_buf->rxsnr_X[i];
5052 rx_snrX = (char)(tmp_rxsnr);
5055 priv->stats.rxSNRdB[i] = (long)rx_snrX;
5057 /* Translate DBM to percentage. */
5058 RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
5061 /* Record Signal Strength for next packet */
5062 //if(bpacket_match_bssid)
5064 pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
5065 precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
5071 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
5073 //Fixed by Jacken from Bryant 2008-03-20
5074 //Original value is 106
5075 rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
5076 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
5078 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
5079 pstats->RxPower = precord_stats->RxPower = rx_pwr_all;
5082 // (3)EVM of HT rate
5084 if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
5085 pdrvinfo->RxRate<=DESC90_RATEMCS15)
5086 max_spatial_stream = 2; //both spatial stream make sense
5088 max_spatial_stream = 1; //only spatial stream 1 makes sense
5090 for(i=0; i<max_spatial_stream; i++)
5092 tmp_rxevm = pofdm_buf->rxevm_X[i];
5093 rx_evmX = (char)(tmp_rxevm);
5095 // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
5096 // fill most significant bit to "zero" when doing shifting operation which may change a negative
5097 // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.
5100 evm = rtl819x_evm_dbtopercentage(rx_evmX);
5101 //if(bpacket_match_bssid)
5103 if(i==0) // Fill value in RFD, Get the first spatial stream only
5104 pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
5105 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
5110 /* record rx statistics for debug */
5111 rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
5112 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
5113 if(pdrvinfo->BW) //40M channel
5114 priv->stats.received_bwtype[1+prxsc->rxsc]++;
5116 priv->stats.received_bwtype[0]++;
5119 //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
5120 //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
5123 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;
5128 //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
5129 // We can judge RX path number now.
5131 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
5133 } /* QueryRxPhyStatus8190Pci */
5136 rtl8192_record_rxdesc_forlateruse(
5137 struct ieee80211_rx_stats * psrc_stats,
5138 struct ieee80211_rx_stats * ptarget_stats
5141 ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
5142 ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
5143 ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
5147 void TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
5148 struct ieee80211_rx_stats * pstats,
5149 rx_drvinfo_819x_usb *pdrvinfo)
5151 // TODO: We must only check packet for current MAC address. Not finish
5152 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5153 struct net_device *dev=info->dev;
5154 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5155 bool bpacket_match_bssid, bpacket_toself;
5156 bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
5157 static struct ieee80211_rx_stats previous_stats;
5158 struct ieee80211_hdr_3addr *hdr;//by amy
5161 // Get Signal Quality for only RX data queue (but not command queue)
5164 //u16 tmp_buf_len = 0;
5167 /* Get MAC frame start address. */
5168 tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
5170 hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
5171 fc = le16_to_cpu(hdr->frame_ctl);
5172 type = WLAN_FC_GET_TYPE(fc);
5173 praddr = hdr->addr1;
5175 /* Check if the received packet is acceptabe. */
5176 bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
5177 (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
5178 && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
5179 bpacket_toself = bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
5181 if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
5183 bPacketBeacon = true;
5184 //DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
5186 if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
5188 if((eqMacAddr(praddr,dev->dev_addr)))
5190 //DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
5195 if(bpacket_match_bssid)
5197 priv->stats.numpacket_matchbssid++;
5200 priv->stats.numpacket_toself++;
5203 // Process PHY information for previous packet (RSSI/PWDB/EVM)
5205 // Because phy information is contained in the last packet of AMPDU only, so driver
5206 // should process phy information of previous packet
5207 rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
5208 rtl8192_query_rxphystatus(priv, pstats, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
5209 rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
5214 * Function: UpdateReceivedRateHistogramStatistics
5215 * Overview: Recored down the received data rate
5218 * struct net_device *dev
5219 * struct ieee80211_rx_stats *stats
5223 * (priv->stats.ReceivedRateHistogram[] is updated)
5228 UpdateReceivedRateHistogramStatistics8190(
5229 struct net_device *dev,
5230 struct ieee80211_rx_stats *stats
5233 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5234 u32 rcvType=1; //0: Total, 1:OK, 2:CRC, 3:ICV
5236 u32 preamble_guardinterval; //1: short preamble/GI, 0: long preamble/GI
5241 else if(stats->bICV)
5244 if(stats->bShortPreamble)
5245 preamble_guardinterval = 1;// short
5247 preamble_guardinterval = 0;// long
5254 case MGN_1M: rateIndex = 0; break;
5255 case MGN_2M: rateIndex = 1; break;
5256 case MGN_5_5M: rateIndex = 2; break;
5257 case MGN_11M: rateIndex = 3; break;
5261 case MGN_6M: rateIndex = 4; break;
5262 case MGN_9M: rateIndex = 5; break;
5263 case MGN_12M: rateIndex = 6; break;
5264 case MGN_18M: rateIndex = 7; break;
5265 case MGN_24M: rateIndex = 8; break;
5266 case MGN_36M: rateIndex = 9; break;
5267 case MGN_48M: rateIndex = 10; break;
5268 case MGN_54M: rateIndex = 11; break;
5270 // 11n High throughput rate
5272 case MGN_MCS0: rateIndex = 12; break;
5273 case MGN_MCS1: rateIndex = 13; break;
5274 case MGN_MCS2: rateIndex = 14; break;
5275 case MGN_MCS3: rateIndex = 15; break;
5276 case MGN_MCS4: rateIndex = 16; break;
5277 case MGN_MCS5: rateIndex = 17; break;
5278 case MGN_MCS6: rateIndex = 18; break;
5279 case MGN_MCS7: rateIndex = 19; break;
5280 case MGN_MCS8: rateIndex = 20; break;
5281 case MGN_MCS9: rateIndex = 21; break;
5282 case MGN_MCS10: rateIndex = 22; break;
5283 case MGN_MCS11: rateIndex = 23; break;
5284 case MGN_MCS12: rateIndex = 24; break;
5285 case MGN_MCS13: rateIndex = 25; break;
5286 case MGN_MCS14: rateIndex = 26; break;
5287 case MGN_MCS15: rateIndex = 27; break;
5288 default: rateIndex = 28; break;
5290 priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
5291 priv->stats.received_rate_histogram[0][rateIndex]++; //total
5292 priv->stats.received_rate_histogram[rcvType][rateIndex]++;
5296 void query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
5298 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5299 struct net_device *dev=info->dev;
5300 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5301 //rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5302 rx_drvinfo_819x_usb *driver_info = NULL;
5305 //Get Rx Descriptor Information
5307 #ifdef USB_RX_AGGREGATION_SUPPORT
5308 if (bIsRxAggrSubframe)
5310 rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
5311 stats->Length = desc->Length ;
5312 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
5313 stats->RxBufShift = 0; //RxBufShift = 2 in RxDesc, but usb didn't shift bytes in fact.
5314 stats->bICV = desc->ICV;
5315 stats->bCRC = desc->CRC32;
5316 stats->bHwError = stats->bCRC|stats->bICV;
5317 stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
5321 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5323 stats->Length = desc->Length;
5324 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
5325 stats->RxBufShift = 0;//desc->Shift&0x03;
5326 stats->bICV = desc->ICV;
5327 stats->bCRC = desc->CRC32;
5328 stats->bHwError = stats->bCRC|stats->bICV;
5329 //RTL8190 set this bit to indicate that Hw does not decrypt packet
5330 stats->Decrypted = !desc->SWDec;
5333 if((priv->ieee80211->pHTInfo->bCurrentHTSupport == true) && (priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP))
5335 stats->bHwError = false;
5339 stats->bHwError = stats->bCRC|stats->bICV;
5342 if(stats->Length < 24 || stats->Length > MAX_8192U_RX_SIZE)
5343 stats->bHwError |= 1;
5347 // TODO: Need to verify it on FGPA platform
5348 //Driver info are written to the RxBuffer following rx desc
5349 if (stats->RxDrvInfoSize != 0) {
5350 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
5354 if(!stats->bHwError){
5356 ret_rate = HwRateToMRate90(driver_info->RxHT, driver_info->RxRate);
5357 if(ret_rate == 0xff)
5359 // Abnormal Case: Receive CRC OK packet with Rx descriptor indicating non supported rate.
5360 // Special Error Handling here, 2008.05.16, by Emily
5362 stats->bHwError = 1;
5363 stats->rate = MGN_1M; //Set 1M rate by default
5366 stats->rate = ret_rate;
5372 stats->bShortPreamble = driver_info->SPLCP;
5375 UpdateReceivedRateHistogramStatistics8190(dev, stats);
5377 stats->bIsAMPDU = (driver_info->PartAggr==1);
5378 stats->bFirstMPDU = (driver_info->PartAggr==1) && (driver_info->FirstAGGR==1);
5379 stats->TimeStampLow = driver_info->TSFL;
5380 // xiong mask it, 070514
5381 //pRfd->Status.TimeStampHigh = PlatformEFIORead4Byte(Adapter, TSFR+4);
5382 // stats->TimeStampHigh = read_nic_dword(dev, TSFR+4);
5384 UpdateRxPktTimeStamp8190(dev, stats);
5389 if(driver_info->FirstAGGR==1 || driver_info->PartAggr == 1)
5390 RT_TRACE(COMP_RXDESC, "driver_info->FirstAGGR = %d, driver_info->PartAggr = %d\n",
5391 driver_info->FirstAGGR, driver_info->PartAggr);
5395 skb_pull(skb,sizeof(rx_desc_819x_usb));
5397 // Get Total offset of MPDU Frame Body
5399 if((stats->RxBufShift + stats->RxDrvInfoSize) > 0) {
5401 skb_pull(skb,stats->RxBufShift + stats->RxDrvInfoSize);
5404 #ifdef USB_RX_AGGREGATION_SUPPORT
5405 /* for the rx aggregated sub frame, the redundant space truelly contained in the packet */
5406 if(bIsRxAggrSubframe) {
5410 /* for debug 2008.5.29 */
5412 //added by vivi, for MP, 20080108
5413 stats->RxIs40MHzPacket = driver_info->BW;
5414 if(stats->RxDrvInfoSize != 0)
5415 TranslateRxSignalStuff819xUsb(skb, stats, driver_info);
5419 u32 GetRxPacketShiftBytes819xUsb(struct ieee80211_rx_stats *Status, bool bIsRxAggrSubframe)
5421 #ifdef USB_RX_AGGREGATION_SUPPORT
5422 if (bIsRxAggrSubframe)
5423 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
5424 + Status->RxBufShift + 8);
5427 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
5428 + Status->RxBufShift);
5431 void rtl8192_rx_nomal(struct sk_buff* skb)
5433 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5434 struct net_device *dev=info->dev;
5435 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5436 struct ieee80211_rx_stats stats = {
5440 // .mac_time = jiffies,
5441 .freq = IEEE80211_24GHZ_BAND,
5444 struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
5445 bool unicast_packet = false;
5446 #ifdef USB_RX_AGGREGATION_SUPPORT
5447 struct sk_buff *agg_skb = NULL;
5448 u32 TotalLength = 0;
5450 u32 PacketLength = 0;
5451 u32 PacketOccupiedLendth = 0;
5453 u32 PacketShiftBytes = 0;
5454 rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
5455 u8 PaddingBytes = 0;
5456 //add just for testing
5461 /* 20 is for ps-poll */
5462 if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
5463 #ifdef USB_RX_AGGREGATION_SUPPORT
5464 TempByte = *(skb->data + sizeof(rx_desc_819x_usb));
5466 /* first packet should not contain Rx aggregation header */
5467 query_rxdesc_status(skb, &stats, false);
5469 /* hardware related info */
5470 #ifdef USB_RX_AGGREGATION_SUPPORT
5471 if (TempByte & BIT0) {
5473 //TotalLength = agg_skb->len - 4; /*sCrcLng*/
5474 TotalLength = stats.Length - 4; /*sCrcLng*/
5475 //RT_TRACE(COMP_RECV, "%s:first aggregated packet!Length=%d\n",__FUNCTION__,TotalLength);
5476 /* though the head pointer has passed this position */
5477 TempDWord = *(u32 *)(agg_skb->data - 4);
5478 PacketLength = (u16)(TempDWord & 0x3FFF); /*sCrcLng*/
5479 skb = dev_alloc_skb(PacketLength);
5480 memcpy(skb_put(skb,PacketLength),agg_skb->data,PacketLength);
5481 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, false);
5484 /* Process the MPDU recevied */
5485 skb_trim(skb, skb->len - 4/*sCrcLng*/);
5487 rx_pkt_len = skb->len;
5488 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
5489 unicast_packet = false;
5490 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
5492 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
5495 /* unicast packet */
5496 unicast_packet = true;
5499 if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
5500 dev_kfree_skb_any(skb);
5502 priv->stats.rxoktotal++;
5503 if(unicast_packet) {
5504 priv->stats.rxbytesunicast += rx_pkt_len;
5507 #ifdef USB_RX_AGGREGATION_SUPPORT
5509 // (PipeIndex == 0) && (TempByte & BIT0) => TotalLength > 0.
5510 if (TotalLength > 0) {
5511 PacketOccupiedLendth = PacketLength + (PacketShiftBytes + 8);
5512 if ((PacketOccupiedLendth & 0xFF) != 0)
5513 PacketOccupiedLendth = (PacketOccupiedLendth & 0xFFFFFF00) + 256;
5514 PacketOccupiedLendth -= 8;
5515 TempDWord = PacketOccupiedLendth - PacketShiftBytes; /*- PacketLength */
5516 if (agg_skb->len > TempDWord)
5517 skb_pull(agg_skb, TempDWord);
5521 while (agg_skb->len>=GetRxPacketShiftBytes819xUsb(&stats, true)) {
5522 u8 tmpCRC = 0, tmpICV = 0;
5523 //RT_TRACE(COMP_RECV,"%s:aggred pkt,total_len = %d\n",__FUNCTION__,agg_skb->len);
5524 RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);
5525 tmpCRC = RxDescr->CRC32;
5526 tmpICV = RxDescr->ICV;
5527 memcpy(agg_skb->data, &agg_skb->data[44], 2);
5528 RxDescr->CRC32 = tmpCRC;
5529 RxDescr->ICV = tmpICV;
5531 memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
5535 stats.freq = IEEE80211_24GHZ_BAND;
5536 query_rxdesc_status(agg_skb, &stats, true);
5537 PacketLength = stats.Length;
5539 if(PacketLength > agg_skb->len) {
5542 /* Process the MPDU recevied */
5543 skb = dev_alloc_skb(PacketLength);
5544 memcpy(skb_put(skb,PacketLength),agg_skb->data, PacketLength);
5545 skb_trim(skb, skb->len - 4/*sCrcLng*/);
5547 rx_pkt_len = skb->len;
5548 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
5549 unicast_packet = false;
5550 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
5552 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
5555 /* unicast packet */
5556 unicast_packet = true;
5558 if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
5559 dev_kfree_skb_any(skb);
5561 priv->stats.rxoktotal++;
5562 if(unicast_packet) {
5563 priv->stats.rxbytesunicast += rx_pkt_len;
5566 /* should trim the packet which has been copied to target skb */
5567 skb_pull(agg_skb, PacketLength);
5568 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, true);
5569 PacketOccupiedLendth = PacketLength + PacketShiftBytes;
5570 if ((PacketOccupiedLendth & 0xFF) != 0) {
5571 PaddingBytes = 256 - (PacketOccupiedLendth & 0xFF);
5572 if (agg_skb->len > PaddingBytes)
5573 skb_pull(agg_skb, PaddingBytes);
5578 dev_kfree_skb(agg_skb);
5582 priv->stats.rxurberr++;
5583 printk("actual_length:%d\n", skb->len);
5584 dev_kfree_skb_any(skb);
5590 rtl819xusb_process_received_packet(
5591 struct net_device *dev,
5592 struct ieee80211_rx_stats *pstats
5595 // bool bfreerfd=false, bqueued=false;
5598 struct r8192_priv *priv = ieee80211_priv(dev);
5602 //PRX_TS_RECORD pts = NULL;
5604 // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
5605 //porting by amy 080508
5606 pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
5607 frame = pstats->virtual_address;
5608 frame_len = pstats->packetlength;
5609 #ifdef TODO // by amy about HCT
5610 if(!Adapter->bInHctTest)
5611 CountRxErrStatistics(Adapter, pRfd);
5614 #ifdef ENABLE_PS //by amy for adding ps function in future
5615 RT_RF_POWER_STATE rtState;
5616 // When RF is off, we should not count the packet for hw/sw synchronize
5617 // reason, ie. there may be a duration while sw switch is changed and hw
5618 // switch is being changed. 2006.12.04, by shien chang.
5619 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
5620 if (rtState == eRfOff)
5625 priv->stats.rxframgment++;
5629 RmMonitorSignalStrength(Adapter, pRfd);
5631 /* 2007/01/16 MH Add RX command packet handle here. */
5632 /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
5633 if (rtl819xusb_rx_command_packet(dev, pstats))
5645 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
5647 // rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5648 // struct net_device *dev=info->dev;
5649 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5650 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5651 // rx_drvinfo_819x_usb *driver_info;
5654 //Get Rx Descriptor Information
5656 stats->virtual_address = (u8*)skb->data;
5657 stats->Length = desc->Length;
5658 stats->RxDrvInfoSize = 0;
5659 stats->RxBufShift = 0;
5660 stats->packetlength = stats->Length-scrclng;
5661 stats->fraglength = stats->packetlength;
5662 stats->fragoffset = 0;
5663 stats->ntotalfrag = 1;
5667 void rtl8192_rx_cmd(struct sk_buff *skb)
5669 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5670 struct net_device *dev = info->dev;
5672 // struct urb *rx_urb = info->urb;
5674 struct ieee80211_rx_stats stats = {
5678 // .mac_time = jiffies,
5679 .freq = IEEE80211_24GHZ_BAND,
5682 if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE))
5685 query_rx_cmdpkt_desc_status(skb,&stats);
5686 // this is to be done by amy 080508 prfd->queue_id = 1;
5690 // Process the command packet received.
5693 rtl819xusb_process_received_packet(dev,&stats);
5695 dev_kfree_skb_any(skb);
5703 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
5705 struct sk_buff *skb;
5706 struct rtl8192_rx_info *info;
5708 while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
5709 info = (struct rtl8192_rx_info *)skb->cb;
5710 switch (info->out_pipe) {
5711 /* Nomal packet pipe */
5713 //RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
5714 priv->IrpPendingCount--;
5715 rtl8192_rx_nomal(skb);
5718 /* Command packet pipe */
5720 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
5723 rtl8192_rx_cmd(skb);
5726 default: /* should never get here! */
5727 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
5736 static const struct net_device_ops rtl8192_netdev_ops = {
5737 .ndo_open = rtl8192_open,
5738 .ndo_stop = rtl8192_close,
5739 .ndo_get_stats = rtl8192_stats,
5740 .ndo_tx_timeout = tx_timeout,
5741 .ndo_do_ioctl = rtl8192_ioctl,
5742 .ndo_set_multicast_list = r8192_set_multicast,
5743 .ndo_set_mac_address = r8192_set_mac_adr,
5744 .ndo_validate_addr = eth_validate_addr,
5745 .ndo_change_mtu = eth_change_mtu,
5746 .ndo_start_xmit = ieee80211_xmit,
5750 /****************************************************************************
5751 ---------------------------- USB_STUFF---------------------------
5752 *****************************************************************************/
5754 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
5755 const struct usb_device_id *id)
5757 // unsigned long ioaddr = 0;
5758 struct net_device *dev = NULL;
5759 struct r8192_priv *priv= NULL;
5760 struct usb_device *udev = interface_to_usbdev(intf);
5762 RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
5764 dev = alloc_ieee80211(sizeof(struct r8192_priv));
5768 usb_set_intfdata(intf, dev);
5769 SET_NETDEV_DEV(dev, &intf->dev);
5770 priv = ieee80211_priv(dev);
5771 priv->ieee80211 = netdev_priv(dev);
5774 dev->netdev_ops = &rtl8192_netdev_ops;
5776 //DMESG("Oops: i'm coming\n");
5777 #if WIRELESS_EXT >= 12
5778 #if WIRELESS_EXT < 17
5779 dev->get_wireless_stats = r8192_get_wireless_stats;
5781 dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
5783 dev->type=ARPHRD_ETHER;
5785 dev->watchdog_timeo = HZ*3; //modified by john, 0805
5787 if (dev_alloc_name(dev, ifname) < 0){
5788 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
5790 dev_alloc_name(dev, ifname);
5793 RT_TRACE(COMP_INIT, "Driver probe completed1\n");
5794 if(rtl8192_init(dev)!=0){
5795 RT_TRACE(COMP_ERR, "Initialization failed");
5799 netif_carrier_off(dev);
5800 netif_stop_queue(dev);
5802 ret = register_netdev(dev);
5806 RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
5807 rtl8192_proc_init_one(dev);
5810 RT_TRACE(COMP_INIT, "Driver probe completed\n");
5815 kfree(priv->pFirmware);
5816 priv->pFirmware = NULL;
5817 rtl8192_usb_deleteendpoints(dev);
5818 destroy_workqueue(priv->priv_wq);
5821 free_ieee80211(dev);
5823 RT_TRACE(COMP_ERR, "wlan driver load failed\n");
5827 //detach all the work and timer structure declared or inititialize in r8192U_init function.
5828 void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
5831 cancel_work_sync(&priv->reset_wq);
5832 cancel_delayed_work(&priv->watch_dog_wq);
5833 cancel_delayed_work(&priv->update_beacon_wq);
5834 cancel_work_sync(&priv->qos_activate);
5835 //cancel_work_sync(&priv->SetBWModeWorkItem);
5836 //cancel_work_sync(&priv->SwChnlWorkItem);
5841 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf)
5843 struct net_device *dev = usb_get_intfdata(intf);
5845 struct r8192_priv *priv = ieee80211_priv(dev);
5848 unregister_netdev(dev);
5850 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
5851 rtl8192_proc_remove_one(dev);
5854 kfree(priv->pFirmware);
5855 priv->pFirmware = NULL;
5856 // priv->rf_close(dev);
5857 // rtl8192_SetRFPowerState(dev, eRfOff);
5858 rtl8192_usb_deleteendpoints(dev);
5859 destroy_workqueue(priv->priv_wq);
5860 //rtl8192_irq_disable(dev);
5861 //rtl8192_reset(dev);
5865 free_ieee80211(dev);
5866 RT_TRACE(COMP_DOWN, "wlan driver removed\n");
5869 /* fun with the built-in ieee80211 stack... */
5870 extern int ieee80211_debug_init(void);
5871 extern void ieee80211_debug_exit(void);
5872 extern int ieee80211_crypto_init(void);
5873 extern void ieee80211_crypto_deinit(void);
5874 extern int ieee80211_crypto_tkip_init(void);
5875 extern void ieee80211_crypto_tkip_exit(void);
5876 extern int ieee80211_crypto_ccmp_init(void);
5877 extern void ieee80211_crypto_ccmp_exit(void);
5878 extern int ieee80211_crypto_wep_init(void);
5879 extern void ieee80211_crypto_wep_exit(void);
5881 static int __init rtl8192_usb_module_init(void)
5885 #ifdef CONFIG_IEEE80211_DEBUG
5886 ret = ieee80211_debug_init();
5888 printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
5892 ret = ieee80211_crypto_init();
5894 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
5898 ret = ieee80211_crypto_tkip_init();
5900 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
5905 ret = ieee80211_crypto_ccmp_init();
5907 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
5912 ret = ieee80211_crypto_wep_init();
5914 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
5918 printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
5919 printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
5920 RT_TRACE(COMP_INIT, "Initializing module");
5921 RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
5922 rtl8192_proc_module_init();
5923 return usb_register(&rtl8192_usb_driver);
5927 static void __exit rtl8192_usb_module_exit(void)
5929 usb_deregister(&rtl8192_usb_driver);
5931 RT_TRACE(COMP_DOWN, "Exiting");
5932 // rtl8192_proc_module_remove();
5936 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
5938 unsigned long flags;
5940 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5942 spin_lock_irqsave(&priv->tx_lock,flags);
5943 enough_desc = check_nic_enough_desc(dev,pri);
5944 spin_unlock_irqrestore(&priv->tx_lock,flags);
5947 ieee80211_wake_queue(priv->ieee80211);
5950 void EnableHWSecurityConfig8192(struct net_device *dev)
5952 u8 SECR_value = 0x0;
5953 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5954 struct ieee80211_device* ieee = priv->ieee80211;
5955 SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
5956 if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
5958 SECR_value |= SCR_RxUseDK;
5959 SECR_value |= SCR_TxUseDK;
5961 else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
5963 SECR_value |= SCR_RxUseDK;
5964 SECR_value |= SCR_TxUseDK;
5966 //add HWSec active enable here.
5967 //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
5969 ieee->hwsec_active = 1;
5971 if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep)//!ieee->hwsec_support) //add hwsec_support flag to totol control hw_sec on/off
5973 ieee->hwsec_active = 0;
5974 SECR_value &= ~SCR_RxDecEnable;
5976 RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__, \
5977 ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
5979 write_nic_byte(dev, SECR, SECR_value);//SECR_value | SCR_UseDK );
5984 void setKey( struct net_device *dev,
5992 u32 TargetCommand = 0;
5993 u32 TargetContent = 0;
5996 if (EntryNo >= TOTAL_CAM_ENTRY)
5997 RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
5999 RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", dev,EntryNo, KeyIndex, KeyType, MacAddr);
6002 usConfig |= BIT15 | (KeyType<<2);
6004 usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
6005 // usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
6008 for(i=0 ; i<CAM_CONTENT_COUNT; i++){
6009 TargetCommand = i+CAM_CONTENT_COUNT*EntryNo;
6010 TargetCommand |= BIT31|BIT16;
6012 if(i==0){//MAC|Config
6013 TargetContent = (u32)(*(MacAddr+0)) << 16|
6014 (u32)(*(MacAddr+1)) << 24|
6017 write_nic_dword(dev, WCAMI, TargetContent);
6018 write_nic_dword(dev, RWCAM, TargetCommand);
6019 // printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
6022 TargetContent = (u32)(*(MacAddr+2)) |
6023 (u32)(*(MacAddr+3)) << 8|
6024 (u32)(*(MacAddr+4)) << 16|
6025 (u32)(*(MacAddr+5)) << 24;
6026 write_nic_dword(dev, WCAMI, TargetContent);
6027 write_nic_dword(dev, RWCAM, TargetCommand);
6031 if(KeyContent !=NULL){
6032 write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
6033 write_nic_dword(dev, RWCAM, TargetCommand);
6040 /***************************************************************************
6041 ------------------- module init / exit stubs ----------------
6042 ****************************************************************************/
6043 module_init(rtl8192_usb_module_init);
6044 module_exit(rtl8192_usb_module_exit);