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 possibilty 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=create_proc_entry(RTL819xU_MODULE_NAME, S_IFDIR, 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 = create_proc_entry(dev->name,
710 S_IFDIR | S_IRUGO | S_IXUGO,
712 if (!priv->dir_dev) {
713 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
717 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
718 priv->dir_dev, proc_get_stats_rx, dev);
721 RT_TRACE(COMP_ERR,"Unable to initialize "
722 "/proc/net/rtl8192/%s/stats-rx\n",
727 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
728 priv->dir_dev, proc_get_stats_tx, dev);
731 RT_TRACE(COMP_ERR, "Unable to initialize "
732 "/proc/net/rtl8192/%s/stats-tx\n",
736 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
737 priv->dir_dev, proc_get_stats_ap, dev);
740 RT_TRACE(COMP_ERR, "Unable to initialize "
741 "/proc/net/rtl8192/%s/stats-ap\n",
745 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
746 priv->dir_dev, proc_get_registers, dev);
748 RT_TRACE(COMP_ERR, "Unable to initialize "
749 "/proc/net/rtl8192/%s/registers\n",
753 /****************************************************************************
754 -----------------------------MISC STUFF-------------------------
755 *****************************************************************************/
757 /* this is only for debugging */
758 void print_buffer(u32 *buffer, int len)
761 u8 *buf =(u8*)buffer;
763 printk("ASCII BUFFER DUMP (len: %x):\n",len);
768 printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
776 //short check_nic_enough_desc(struct net_device *dev, priority_t priority)
777 short check_nic_enough_desc(struct net_device *dev,int queue_index)
779 struct r8192_priv *priv = ieee80211_priv(dev);
780 int used = atomic_read(&priv->tx_pending[queue_index]);
782 return (used < MAX_TX_URB);
785 void tx_timeout(struct net_device *dev)
787 struct r8192_priv *priv = ieee80211_priv(dev);
788 //rtl8192_commit(dev);
790 schedule_work(&priv->reset_wq);
791 //DMESG("TXTIMEOUT");
795 /* this is only for debug */
796 void dump_eprom(struct net_device *dev)
800 RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev,i));
803 /* this is only for debug */
804 void rtl8192_dump_reg(struct net_device *dev)
810 RT_TRACE(COMP_PHY, "Dumping NIC register map");
814 printk( "\nD: %2x> ", n);
815 for(i=0;i<16 && n<=max;i++,n++)
816 printk("%2x ",read_nic_byte(dev,n));
821 /****************************************************************************
822 ------------------------------HW STUFF---------------------------
823 *****************************************************************************/
826 void rtl8192_set_mode(struct net_device *dev,int mode)
829 ecmd=read_nic_byte(dev, EPROM_CMD);
830 ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
831 ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
832 ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
833 ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
834 write_nic_byte(dev, EPROM_CMD, ecmd);
838 void rtl8192_update_msr(struct net_device *dev)
840 struct r8192_priv *priv = ieee80211_priv(dev);
843 msr = read_nic_byte(dev, MSR);
844 msr &= ~ MSR_LINK_MASK;
846 /* do not change in link_state != WLAN_LINK_ASSOCIATED.
847 * msr must be updated if the state is ASSOCIATING.
848 * this is intentional and make sense for ad-hoc and
849 * master (see the create BSS/IBSS func)
851 if (priv->ieee80211->state == IEEE80211_LINKED){
853 if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
854 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
855 else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
856 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
857 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
858 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
861 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
863 write_nic_byte(dev, MSR, msr);
866 void rtl8192_set_chan(struct net_device *dev,short ch)
868 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
870 RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
873 /* this hack should avoid frame TX during channel setting*/
876 // tx = read_nic_dword(dev,TX_CONF);
877 // tx &= ~TX_LOOPBACK_MASK;
880 // write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
882 //need to implement rf set channel here WB
884 if (priv->rf_set_chan)
885 priv->rf_set_chan(dev,priv->chan);
887 // write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
891 static void rtl8192_rx_isr(struct urb *urb);
892 //static void rtl8192_rx_isr(struct urb *rx_urb);
894 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
897 #ifdef USB_RX_AGGREGATION_SUPPORT
898 if (pstats->bisrxaggrsubframe)
899 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
900 + pstats->RxBufShift + 8);
903 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
904 + pstats->RxBufShift);
907 static int rtl8192_rx_initiate(struct net_device*dev)
909 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
912 struct rtl8192_rx_info *info;
914 /* nomal packet rx procedure */
915 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
916 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
919 entry = usb_alloc_urb(0, GFP_KERNEL);
924 // printk("nomal packet IN request!\n");
925 usb_fill_bulk_urb(entry, priv->udev,
926 usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
927 RX_URB_SIZE, rtl8192_rx_isr, skb);
928 info = (struct rtl8192_rx_info *) skb->cb;
931 info->out_pipe = 3; //denote rx normal packet queue
932 skb_queue_tail(&priv->rx_queue, skb);
933 usb_submit_urb(entry, GFP_KERNEL);
936 /* command packet rx procedure */
937 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
938 // printk("command packet IN request!\n");
939 skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
942 entry = usb_alloc_urb(0, GFP_KERNEL);
947 usb_fill_bulk_urb(entry, priv->udev,
948 usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
949 RX_URB_SIZE, rtl8192_rx_isr, skb);
950 info = (struct rtl8192_rx_info *) skb->cb;
953 info->out_pipe = 9; //denote rx cmd packet queue
954 skb_queue_tail(&priv->rx_queue, skb);
955 usb_submit_urb(entry, GFP_KERNEL);
961 void rtl8192_set_rxconf(struct net_device *dev)
963 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
966 rxconf=read_nic_dword(dev,RCR);
967 rxconf = rxconf &~ MAC_FILTER_MASK;
968 rxconf = rxconf | RCR_AMF;
969 rxconf = rxconf | RCR_ADF;
970 rxconf = rxconf | RCR_AB;
971 rxconf = rxconf | RCR_AM;
972 //rxconf = rxconf | RCR_ACF;
974 if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
976 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
977 dev->flags & IFF_PROMISC){
978 rxconf = rxconf | RCR_AAP;
979 } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
980 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
981 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
983 rxconf = rxconf | RCR_APM;
984 rxconf = rxconf | RCR_CBSSID;
988 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
989 rxconf = rxconf | RCR_AICV;
990 rxconf = rxconf | RCR_APWRMGT;
993 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
994 rxconf = rxconf | RCR_ACRC32;
997 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
998 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
999 rxconf = rxconf &~ MAX_RX_DMA_MASK;
1000 rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
1002 // rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
1003 rxconf = rxconf | RCR_ONLYERLPKT;
1005 // rxconf = rxconf &~ RCR_CS_MASK;
1006 // rxconf = rxconf | (1<<RCR_CS_SHIFT);
1008 write_nic_dword(dev, RCR, rxconf);
1011 DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
1014 //wait to be removed
1015 void rtl8192_rx_enable(struct net_device *dev)
1019 //struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1021 rtl8192_rx_initiate(dev);
1023 // rtl8192_set_rxconf(dev);
1027 void rtl8192_tx_enable(struct net_device *dev)
1033 void rtl8192_rtx_disable(struct net_device *dev)
1036 struct r8192_priv *priv = ieee80211_priv(dev);
1037 struct sk_buff *skb;
1038 struct rtl8192_rx_info *info;
1040 cmd=read_nic_byte(dev,CMDR);
1041 write_nic_byte(dev, CMDR, cmd &~ \
1043 force_pci_posting(dev);
1046 while ((skb = __skb_dequeue(&priv->rx_queue))) {
1047 info = (struct rtl8192_rx_info *) skb->cb;
1051 usb_kill_urb(info->urb);
1055 if (skb_queue_len(&priv->skb_queue)) {
1056 printk(KERN_WARNING "skb_queue not empty\n");
1059 skb_queue_purge(&priv->skb_queue);
1064 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
1069 inline u16 ieeerate2rtlrate(int rate)
1101 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
1102 inline u16 rtl8192_rate2rate(short rate)
1104 if (rate >11) return 0;
1105 return rtl_rate[rate];
1109 /* The protype of rx_isr has changed since one verion of Linux Kernel */
1110 static void rtl8192_rx_isr(struct urb *urb)
1112 struct sk_buff *skb = (struct sk_buff *) urb->context;
1113 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1114 struct net_device *dev = info->dev;
1115 struct r8192_priv *priv = ieee80211_priv(dev);
1116 int out_pipe = info->out_pipe;
1120 if (unlikely(urb->status)) {
1122 priv->stats.rxstaterr++;
1123 priv->ieee80211->stats.rx_errors++;
1125 // printk("%s():rx status err\n",__FUNCTION__);
1128 skb_unlink(skb, &priv->rx_queue);
1129 skb_put(skb, urb->actual_length);
1131 skb_queue_tail(&priv->skb_queue, skb);
1132 tasklet_schedule(&priv->irq_rx_tasklet);
1134 skb = dev_alloc_skb(RX_URB_SIZE);
1135 if (unlikely(!skb)) {
1137 printk("%s():can,t alloc skb\n",__FUNCTION__);
1138 /* TODO check rx queue length and refill *somewhere* */
1142 usb_fill_bulk_urb(urb, priv->udev,
1143 usb_rcvbulkpipe(priv->udev, out_pipe), skb_tail_pointer(skb),
1144 RX_URB_SIZE, rtl8192_rx_isr, skb);
1146 info = (struct rtl8192_rx_info *) skb->cb;
1149 info->out_pipe = out_pipe;
1151 urb->transfer_buffer = skb_tail_pointer(skb);
1153 skb_queue_tail(&priv->rx_queue, skb);
1154 err = usb_submit_urb(urb, GFP_ATOMIC);
1155 if(err && err != EPERM)
1156 printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
1160 rtl819xusb_rx_command_packet(
1161 struct net_device *dev,
1162 struct ieee80211_rx_stats *pstats
1167 //RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
1169 status = cmpk_message_handle_rx(dev, pstats);
1172 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1176 //RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
1179 //RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
1184 void rtl8192_data_hard_stop(struct net_device *dev)
1190 void rtl8192_data_hard_resume(struct net_device *dev)
1195 /* this function TX data frames when the ieee80211 stack requires this.
1196 * It checks also if we need to stop the ieee tx queue, eventually do it
1198 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1200 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1202 unsigned long flags;
1203 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1204 u8 queue_index = tcb_desc->queue_index;
1206 /* shall not be referred by command packet */
1207 assert(queue_index != TXCMD_QUEUE);
1209 spin_lock_irqsave(&priv->tx_lock,flags);
1211 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1212 // tcb_desc->RATRIndex = 7;
1213 // tcb_desc->bTxDisableRateFallBack = 1;
1214 // tcb_desc->bTxUseDriverAssingedRate = 1;
1215 tcb_desc->bTxEnableFwCalcDur = 1;
1216 skb_push(skb, priv->ieee80211->tx_headroom);
1217 ret = rtl8192_tx(dev, skb);
1219 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1220 //priv->ieee80211->stats.tx_packets++;
1222 spin_unlock_irqrestore(&priv->tx_lock,flags);
1228 /* This is a rough attempt to TX a frame
1229 * This is called by the ieee 80211 stack to TX management frames.
1230 * If the ring is full packet are dropped (for data frame the queue
1231 * is stopped before this can happen).
1233 int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
1235 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1237 unsigned long flags;
1238 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1239 u8 queue_index = tcb_desc->queue_index;
1242 spin_lock_irqsave(&priv->tx_lock,flags);
1244 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1245 if(queue_index == TXCMD_QUEUE) {
1246 skb_push(skb, USB_HWDESC_HEADER_LEN);
1247 rtl819xU_tx_cmd(dev, skb);
1249 spin_unlock_irqrestore(&priv->tx_lock,flags);
1252 skb_push(skb, priv->ieee80211->tx_headroom);
1253 ret = rtl8192_tx(dev, skb);
1256 spin_unlock_irqrestore(&priv->tx_lock,flags);
1262 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1264 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1265 u16 DrvAggr_PaddingAdd(struct net_device *dev, struct sk_buff *skb)
1267 u16 PaddingNum = 256 - ((skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES) % 256);
1268 return (PaddingNum&0xff);
1271 u8 MRateToHwRate8190Pci(u8 rate);
1272 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc);
1273 u8 MapHwQueueToFirmwareQueue(u8 QueueID);
1274 struct sk_buff *DrvAggr_Aggregation(struct net_device *dev, struct ieee80211_drv_agg_txb *pSendList)
1276 struct ieee80211_device *ieee = netdev_priv(dev);
1277 struct r8192_priv *priv = ieee80211_priv(dev);
1278 cb_desc *tcb_desc = NULL;
1281 struct sk_buff *skb;
1282 struct sk_buff *agg_skb;
1283 tx_desc_819x_usb_aggr_subframe *tx_agg_desc = NULL;
1284 tx_fwinfo_819x_usb *tx_fwinfo = NULL;
1287 // Local variable initialization.
1289 /* first skb initialization */
1290 skb = pSendList->tx_agg_frames[0];
1291 TotalLength = skb->len;
1293 /* Get the total aggregation length including the padding space and
1296 for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1297 TotalLength += DrvAggr_PaddingAdd(dev, skb);
1298 skb = pSendList->tx_agg_frames[i];
1299 TotalLength += (skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1302 /* allocate skb to contain the aggregated packets */
1303 agg_skb = dev_alloc_skb(TotalLength + ieee->tx_headroom);
1304 memset(agg_skb->data, 0, agg_skb->len);
1305 skb_reserve(agg_skb, ieee->tx_headroom);
1307 // RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
1308 /* reserve info for first subframe Tx descriptor to be set in the tx function */
1309 skb = pSendList->tx_agg_frames[0];
1310 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1311 tcb_desc->drv_agg_enable = 1;
1312 tcb_desc->pkt_size = skb->len;
1313 tcb_desc->DrvAggrNum = pSendList->nr_drv_agg_frames;
1314 printk("DrvAggNum = %d\n", tcb_desc->DrvAggrNum);
1315 // RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
1316 // printk("========>skb->data ======> \n");
1317 // RT_DEBUG_DATA(COMP_SEND, skb->data, skb->len);
1318 memcpy(agg_skb->cb, skb->cb, sizeof(skb->cb));
1319 memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
1321 for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1322 /* push the next sub frame to be 256 byte aline */
1323 skb_put(agg_skb,DrvAggr_PaddingAdd(dev,skb));
1325 /* Subframe drv Tx descriptor and firmware info setting */
1326 skb = pSendList->tx_agg_frames[i];
1327 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1328 tx_agg_desc = (tx_desc_819x_usb_aggr_subframe *)agg_skb->tail;
1329 tx_fwinfo = (tx_fwinfo_819x_usb *)(agg_skb->tail + sizeof(tx_desc_819x_usb_aggr_subframe));
1331 memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
1333 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
1334 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
1335 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
1336 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
1337 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
1338 tx_fwinfo->AllowAggregation = 1;
1340 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
1341 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
1343 tx_fwinfo->AllowAggregation = 0;
1345 tx_fwinfo->RxMF = 0;
1346 tx_fwinfo->RxAMD = 0;
1349 /* Protection mode related */
1350 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
1351 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
1352 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
1353 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
1354 tx_fwinfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
1355 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
1356 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
1357 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
1358 (tcb_desc->bRTSUseShortGI?1:0);
1360 /* Set Bandwidth and sub-channel settings. */
1361 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
1363 if(tcb_desc->bPacketBW) {
1364 tx_fwinfo->TxBandwidth = 1;
1365 tx_fwinfo->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
1367 tx_fwinfo->TxBandwidth = 0;
1368 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
1371 tx_fwinfo->TxBandwidth = 0;
1372 tx_fwinfo->TxSubCarrier = 0;
1375 /* Fill Tx descriptor */
1376 memset(tx_agg_desc, 0, sizeof(tx_desc_819x_usb_aggr_subframe));
1378 //tx_agg_desc->LINIP = 0;
1379 //tx_agg_desc->CmdInit = 1;
1380 tx_agg_desc->Offset = sizeof(tx_fwinfo_819x_usb) + 8;
1381 /* already raw data, need not to substract header length */
1382 tx_agg_desc->PktSize = skb->len & 0xffff;
1385 tx_agg_desc->SecCAMID= 0;
1386 tx_agg_desc->RATid = tcb_desc->RATRIndex;
1389 tx_agg_desc->NoEnc = 1;
1391 tx_agg_desc->SecType = 0x0;
1393 if (tcb_desc->bHwSec) {
1394 switch (priv->ieee80211->pairwise_key_type)
1396 case KEY_TYPE_WEP40:
1397 case KEY_TYPE_WEP104:
1398 tx_agg_desc->SecType = 0x1;
1399 tx_agg_desc->NoEnc = 0;
1402 tx_agg_desc->SecType = 0x2;
1403 tx_agg_desc->NoEnc = 0;
1406 tx_agg_desc->SecType = 0x3;
1407 tx_agg_desc->NoEnc = 0;
1410 tx_agg_desc->SecType = 0x0;
1411 tx_agg_desc->NoEnc = 1;
1416 tx_agg_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
1417 tx_agg_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);
1419 tx_agg_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
1420 tx_agg_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
1422 tx_agg_desc->OWN = 1;
1425 /* According windows driver, it seems that there no need to fill this field */
1426 //tx_agg_desc->TxBufferSize= (u32)(skb->len - USB_HWDESC_HEADER_LEN);
1428 /* to fill next packet */
1429 skb_put(agg_skb,TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1430 memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
1433 for(i = 0; i < pSendList->nr_drv_agg_frames; i++) {
1434 dev_kfree_skb_any(pSendList->tx_agg_frames[i]);
1441 This function return a list of PTCB which is proper to be aggregate with the input TCB.
1442 If no proper TCB is found to do aggregation, SendList will only contain the input TCB.
1444 u8 DrvAggr_GetAggregatibleList(struct net_device *dev, struct sk_buff *skb,
1445 struct ieee80211_drv_agg_txb *pSendList)
1447 struct ieee80211_device *ieee = netdev_priv(dev);
1448 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1449 u16 nMaxAggrNum = pHTInfo->UsbTxAggrNum;
1450 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1451 u8 QueueID = tcb_desc->queue_index;
1454 pSendList->tx_agg_frames[pSendList->nr_drv_agg_frames++] = skb;
1455 if(pSendList->nr_drv_agg_frames >= nMaxAggrNum) {
1459 } while((skb = skb_dequeue(&ieee->skb_drv_aggQ[QueueID])));
1461 RT_TRACE(COMP_AMSDU, "DrvAggr_GetAggregatibleList, nAggrTcbNum = %d \n", pSendList->nr_drv_agg_frames);
1462 return pSendList->nr_drv_agg_frames;
1466 static void rtl8192_tx_isr(struct urb *tx_urb)
1468 struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
1469 struct net_device *dev = NULL;
1470 struct r8192_priv *priv = NULL;
1471 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1472 u8 queue_index = tcb_desc->queue_index;
1473 // bool bToSend0Byte;
1474 // u16 BufLen = skb->len;
1476 memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
1477 priv = ieee80211_priv(dev);
1479 if(tcb_desc->queue_index != TXCMD_QUEUE) {
1480 if(tx_urb->status == 0) {
1481 dev->trans_start = jiffies;
1482 // As act as station mode, destion shall be unicast address.
1483 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1484 //priv->ieee80211->stats.tx_packets++;
1485 priv->stats.txoktotal++;
1486 priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1487 priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1489 priv->ieee80211->stats.tx_errors++;
1490 //priv->stats.txmanageerr++;
1495 /* free skb and tx_urb */
1497 dev_kfree_skb_any(skb);
1498 usb_free_urb(tx_urb);
1499 atomic_dec(&priv->tx_pending[queue_index]);
1504 // Handle HW Beacon:
1505 // We had transfer our beacon frame to host controller at this moment.
1509 // Handling the wait queue of command packets.
1510 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1511 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1514 /* Handle MPDU in wait queue. */
1515 if(queue_index != BEACON_QUEUE) {
1516 /* Don't send data frame during scanning.*/
1517 if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1518 (!(priv->ieee80211->queue_stop))) {
1519 if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1520 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1522 return; //modified by david to avoid further processing AMSDU
1524 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1525 else if ((skb_queue_len(&priv->ieee80211->skb_drv_aggQ[queue_index])!= 0)&&\
1526 (!(priv->ieee80211->queue_stop))) {
1527 // Tx Driver Aggregation process
1528 /* The driver will aggregation the packets according to the following stets
1529 * 1. check whether there's tx irq available, for it's a completion return
1530 * function, it should contain enough tx irq;
1531 * 2. check pakcet type;
1532 * 3. initialize sendlist, check whether the to-be send packet no greater than 1
1533 * 4. aggregation the packets, and fill firmware info and tx desc to it, etc.
1534 * 5. check whehter the packet could be sent, otherwise just insert to wait head
1536 skb = skb_dequeue(&priv->ieee80211->skb_drv_aggQ[queue_index]);
1537 if(!check_nic_enough_desc(dev, queue_index)) {
1538 skb_queue_head(&(priv->ieee80211->skb_drv_aggQ[queue_index]), skb);
1545 u8* pHeader = skb->data;
1547 if(IsMgntQosData(pHeader) ||
1548 IsMgntQData_Ack(pHeader) ||
1549 IsMgntQData_Poll(pHeader) ||
1550 IsMgntQData_Poll_Ack(pHeader)
1554 struct ieee80211_drv_agg_txb SendList;
1556 memset(&SendList, 0, sizeof(struct ieee80211_drv_agg_txb));
1557 if(DrvAggr_GetAggregatibleList(dev, skb, &SendList) > 1) {
1558 skb = DrvAggr_Aggregation(dev, &SendList);
1562 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1571 void rtl8192_beacon_stop(struct net_device *dev)
1574 struct r8192_priv *priv = ieee80211_priv(dev);
1576 msr = read_nic_byte(dev, MSR);
1577 msrm = msr & MSR_LINK_MASK;
1578 msr2 = msr & ~MSR_LINK_MASK;
1580 if(NIC_8192U == priv->card_8192) {
1581 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1583 if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1584 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
1585 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1586 write_nic_byte(dev, MSR, msr);
1590 void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
1592 struct r8192_priv *priv = ieee80211_priv(dev);
1593 struct ieee80211_network *net;
1594 u8 i=0, basic_rate = 0;
1595 net = & priv->ieee80211->current_network;
1597 for (i=0; i<net->rates_len; i++)
1599 basic_rate = net->rates[i]&0x7f;
1602 case MGN_1M: *rate_config |= RRSR_1M; break;
1603 case MGN_2M: *rate_config |= RRSR_2M; break;
1604 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1605 case MGN_11M: *rate_config |= RRSR_11M; break;
1606 case MGN_6M: *rate_config |= RRSR_6M; break;
1607 case MGN_9M: *rate_config |= RRSR_9M; break;
1608 case MGN_12M: *rate_config |= RRSR_12M; break;
1609 case MGN_18M: *rate_config |= RRSR_18M; break;
1610 case MGN_24M: *rate_config |= RRSR_24M; break;
1611 case MGN_36M: *rate_config |= RRSR_36M; break;
1612 case MGN_48M: *rate_config |= RRSR_48M; break;
1613 case MGN_54M: *rate_config |= RRSR_54M; break;
1616 for (i=0; i<net->rates_ex_len; i++)
1618 basic_rate = net->rates_ex[i]&0x7f;
1621 case MGN_1M: *rate_config |= RRSR_1M; break;
1622 case MGN_2M: *rate_config |= RRSR_2M; break;
1623 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1624 case MGN_11M: *rate_config |= RRSR_11M; break;
1625 case MGN_6M: *rate_config |= RRSR_6M; break;
1626 case MGN_9M: *rate_config |= RRSR_9M; break;
1627 case MGN_12M: *rate_config |= RRSR_12M; break;
1628 case MGN_18M: *rate_config |= RRSR_18M; break;
1629 case MGN_24M: *rate_config |= RRSR_24M; break;
1630 case MGN_36M: *rate_config |= RRSR_36M; break;
1631 case MGN_48M: *rate_config |= RRSR_48M; break;
1632 case MGN_54M: *rate_config |= RRSR_54M; break;
1638 #define SHORT_SLOT_TIME 9
1639 #define NON_SHORT_SLOT_TIME 20
1641 void rtl8192_update_cap(struct net_device* dev, u16 cap)
1644 struct r8192_priv *priv = ieee80211_priv(dev);
1645 struct ieee80211_network *net = &priv->ieee80211->current_network;
1646 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1647 tmp = priv->basic_rate;
1648 if (priv->short_preamble)
1649 tmp |= BRSR_AckShortPmb;
1650 write_nic_dword(dev, RRSR, tmp);
1652 if (net->mode & (IEEE_G|IEEE_N_24G))
1655 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
1657 slot_time = SHORT_SLOT_TIME;
1659 else //long slot time
1660 slot_time = NON_SHORT_SLOT_TIME;
1661 priv->slot_time = slot_time;
1662 write_nic_byte(dev, SLOT_TIME, slot_time);
1666 void rtl8192_net_update(struct net_device *dev)
1669 struct r8192_priv *priv = ieee80211_priv(dev);
1670 struct ieee80211_network *net;
1671 u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1672 u16 rate_config = 0;
1673 net = & priv->ieee80211->current_network;
1675 rtl8192_config_rate(dev, &rate_config);
1676 priv->basic_rate = rate_config &= 0x15f;
1678 write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
1679 write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
1680 //for(i=0;i<ETH_ALEN;i++)
1681 // write_nic_byte(dev,BSSID+i,net->bssid[i]);
1683 rtl8192_update_msr(dev);
1684 // rtl8192_update_cap(dev, net->capability);
1685 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1687 write_nic_word(dev, ATIMWND, 2);
1688 write_nic_word(dev, BCN_DMATIME, 1023);
1689 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1690 // write_nic_word(dev, BcnIntTime, 100);
1691 write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1692 write_nic_byte(dev, BCN_ERR_THRESH, 100);
1693 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1694 // TODO: BcnIFS may required to be changed on ASIC
1695 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1697 write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1704 //temporary hw beacon is not used any more.
1705 //open it when necessary
1706 void rtl819xusb_beacon_tx(struct net_device *dev,u16 tx_rate)
1710 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1712 if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1717 u16 N_DBPSOfRate(u16 DataRate);
1722 u8 bManagementFrame,
1730 if( rtl8192_IsWirelessBMode(DataRate) )
1732 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1734 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1738 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1740 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1742 } else { //802.11g DSSS-OFDM PLCP length field calculation.
1743 N_DBPS = N_DBPSOfRate(DataRate);
1744 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1745 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1746 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1751 u16 N_DBPSOfRate(u16 DataRate)
1796 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1798 usb_free_urb(tx_cmd_urb);
1801 unsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
1805 RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
1808 return priv->txqueue_to_outpipemap[tx_queue];
1811 short rtl819xU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1813 struct r8192_priv *priv = ieee80211_priv(dev);
1818 unsigned int idx_pipe;
1819 tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1820 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1821 u8 queue_index = tcb_desc->queue_index;
1823 //printk("\n %s::queue_index = %d\n",__FUNCTION__, queue_index);
1824 atomic_inc(&priv->tx_pending[queue_index]);
1825 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
1831 memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1832 /* Tx descriptor ought to be set according to the skb->cb */
1833 pdesc->FirstSeg = 1;//bFirstSeg;
1834 pdesc->LastSeg = 1;//bLastSeg;
1835 pdesc->CmdInit = tcb_desc->bCmdOrInit;
1836 pdesc->TxBufferSize = tcb_desc->txbuf_size;
1838 pdesc->LINIP = tcb_desc->bLastIniPkt;
1840 //----------------------------------------------------------------------------
1841 // Fill up USB_OUT_CONTEXT.
1842 //----------------------------------------------------------------------------
1843 // Get index to out pipe from specified QueueID.
1844 #ifndef USE_ONE_PIPE
1845 idx_pipe = txqueue2outpipe(priv,queue_index);
1849 #ifdef JOHN_DUMP_TXDESC
1851 printk("<Tx descriptor>--rate %x---",rate);
1852 for (i = 0; i < 8; i++)
1853 printk("%8x ", tx[i]);
1856 usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,idx_pipe), \
1857 skb->data, skb->len, rtl8192_tx_isr, skb);
1859 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
1864 DMESGE("Error TX CMD URB, error %d",
1871 * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
1872 * in TxFwInfo data structure
1873 * 2006.10.30 by Emily
1875 * \param QUEUEID Software Queue
1877 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
1879 u8 QueueSelect = 0x0; //defualt set to
1883 QueueSelect = QSLT_BE; //or QSelect = pTcb->priority;
1887 QueueSelect = QSLT_BK; //or QSelect = pTcb->priority;
1891 QueueSelect = QSLT_VO; //or QSelect = pTcb->priority;
1895 QueueSelect = QSLT_VI; //or QSelect = pTcb->priority;
1898 QueueSelect = QSLT_MGNT;
1902 QueueSelect = QSLT_BEACON;
1905 // TODO: 2006.10.30 mark other queue selection until we verify it is OK
1906 // TODO: Remove Assertions
1907 //#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
1909 QueueSelect = QSLT_CMD;
1913 QueueSelect = QSLT_HIGH;
1917 RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
1923 u8 MRateToHwRate8190Pci(u8 rate)
1925 u8 ret = DESC90_RATE1M;
1928 case MGN_1M: ret = DESC90_RATE1M; break;
1929 case MGN_2M: ret = DESC90_RATE2M; break;
1930 case MGN_5_5M: ret = DESC90_RATE5_5M; break;
1931 case MGN_11M: ret = DESC90_RATE11M; break;
1932 case MGN_6M: ret = DESC90_RATE6M; break;
1933 case MGN_9M: ret = DESC90_RATE9M; break;
1934 case MGN_12M: ret = DESC90_RATE12M; break;
1935 case MGN_18M: ret = DESC90_RATE18M; break;
1936 case MGN_24M: ret = DESC90_RATE24M; break;
1937 case MGN_36M: ret = DESC90_RATE36M; break;
1938 case MGN_48M: ret = DESC90_RATE48M; break;
1939 case MGN_54M: ret = DESC90_RATE54M; break;
1941 // HT rate since here
1942 case MGN_MCS0: ret = DESC90_RATEMCS0; break;
1943 case MGN_MCS1: ret = DESC90_RATEMCS1; break;
1944 case MGN_MCS2: ret = DESC90_RATEMCS2; break;
1945 case MGN_MCS3: ret = DESC90_RATEMCS3; break;
1946 case MGN_MCS4: ret = DESC90_RATEMCS4; break;
1947 case MGN_MCS5: ret = DESC90_RATEMCS5; break;
1948 case MGN_MCS6: ret = DESC90_RATEMCS6; break;
1949 case MGN_MCS7: ret = DESC90_RATEMCS7; break;
1950 case MGN_MCS8: ret = DESC90_RATEMCS8; break;
1951 case MGN_MCS9: ret = DESC90_RATEMCS9; break;
1952 case MGN_MCS10: ret = DESC90_RATEMCS10; break;
1953 case MGN_MCS11: ret = DESC90_RATEMCS11; break;
1954 case MGN_MCS12: ret = DESC90_RATEMCS12; break;
1955 case MGN_MCS13: ret = DESC90_RATEMCS13; break;
1956 case MGN_MCS14: ret = DESC90_RATEMCS14; break;
1957 case MGN_MCS15: ret = DESC90_RATEMCS15; break;
1958 case (0x80|0x20): ret = DESC90_RATEMCS32; break;
1966 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
1970 tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
1972 if(TxHT==1 && TxRate != DESC90_RATEMCS15)
1978 static void tx_zero_isr(struct urb *tx_urb)
1984 * The tx procedure is just as following,
1985 * skb->cb will contain all the following information,
1986 * priority, morefrag, rate, &dev.
1988 short rtl8192_tx(struct net_device *dev, struct sk_buff* skb)
1990 struct r8192_priv *priv = ieee80211_priv(dev);
1991 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1992 tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
1993 tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);
1994 struct usb_device *udev = priv->udev;
1997 struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
1999 unsigned int idx_pipe;
2000 // RT_DEBUG_DATA(COMP_SEND, tcb_desc, sizeof(cb_desc));
2001 // printk("=============> %s\n", __FUNCTION__);
2002 pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
2003 /* we are locked here so the two atomic_read and inc are executed
2004 * without interleaves
2005 * !!! For debug purpose
2007 if( pend > MAX_TX_URB){
2008 printk("To discard skb packet!\n");
2009 dev_kfree_skb_any(skb);
2013 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
2015 dev_kfree_skb_any(skb);
2019 /* Fill Tx firmware info */
2020 memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
2022 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
2023 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
2024 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
2025 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
2026 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
2027 tx_fwinfo->AllowAggregation = 1;
2029 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
2030 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
2032 tx_fwinfo->AllowAggregation = 0;
2034 tx_fwinfo->RxMF = 0;
2035 tx_fwinfo->RxAMD = 0;
2038 /* Protection mode related */
2039 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
2040 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
2041 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
2042 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
2043 tx_fwinfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
2044 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
2045 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
2046 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
2047 (tcb_desc->bRTSUseShortGI?1:0);
2049 /* Set Bandwidth and sub-channel settings. */
2050 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2052 if(tcb_desc->bPacketBW) {
2053 tx_fwinfo->TxBandwidth = 1;
2054 tx_fwinfo->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
2056 tx_fwinfo->TxBandwidth = 0;
2057 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
2060 tx_fwinfo->TxBandwidth = 0;
2061 tx_fwinfo->TxSubCarrier = 0;
2064 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2065 if (tcb_desc->drv_agg_enable)
2067 tx_fwinfo->Tx_INFO_RSVD = (tcb_desc->DrvAggrNum & 0x1f) << 1;
2070 /* Fill Tx descriptor */
2071 memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2074 tx_desc->CmdInit = 1;
2075 tx_desc->Offset = sizeof(tx_fwinfo_819x_usb) + 8;
2077 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2078 if (tcb_desc->drv_agg_enable) {
2079 tx_desc->PktSize = tcb_desc->pkt_size;
2083 tx_desc->PktSize = (skb->len - TX_PACKET_SHIFT_BYTES) & 0xffff;
2087 tx_desc->SecCAMID= 0;
2088 tx_desc->RATid = tcb_desc->RATRIndex;
2093 tx_desc->SecType = 0x0;
2094 if (tcb_desc->bHwSec)
2096 switch (priv->ieee80211->pairwise_key_type)
2098 case KEY_TYPE_WEP40:
2099 case KEY_TYPE_WEP104:
2100 tx_desc->SecType = 0x1;
2104 tx_desc->SecType = 0x2;
2108 tx_desc->SecType = 0x3;
2112 tx_desc->SecType = 0x0;
2118 tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
2119 tx_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);
2121 tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
2122 tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
2124 /* Fill fields that are required to be initialized in all of the descriptors */
2126 tx_desc->FirstSeg = 1;
2127 tx_desc->LastSeg = 1;
2130 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2131 if (tcb_desc->drv_agg_enable) {
2132 tx_desc->TxBufferSize = tcb_desc->pkt_size + sizeof(tx_fwinfo_819x_usb);
2137 tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
2139 /* Get index to out pipe from specified QueueID */
2140 #ifndef USE_ONE_PIPE
2141 idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
2146 //RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
2147 //RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
2149 /* To submit bulk urb */
2150 usb_fill_bulk_urb(tx_urb,udev,
2151 usb_sndbulkpipe(udev,idx_pipe), skb->data,
2152 skb->len, rtl8192_tx_isr, skb);
2154 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2156 //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
2157 bool bSend0Byte = false;
2159 if(udev->speed == USB_SPEED_HIGH)
2161 if (skb->len > 0 && skb->len % 512 == 0)
2166 if (skb->len > 0 && skb->len % 64 == 0)
2171 tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
2173 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
2176 usb_fill_bulk_urb(tx_urb_zero,udev,
2177 usb_sndbulkpipe(udev,idx_pipe), &zero,
2178 0, tx_zero_isr, dev);
2179 status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
2181 RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
2185 dev->trans_start = jiffies;
2186 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
2189 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
2195 short rtl8192_usb_initendpoints(struct net_device *dev)
2197 struct r8192_priv *priv = ieee80211_priv(dev);
2199 priv->rx_urb = kmalloc(sizeof(struct urb *) * (MAX_RX_URB+1),
2201 if (priv->rx_urb == NULL)
2204 #ifndef JACKSON_NEW_RX
2205 for(i=0;i<(MAX_RX_URB+1);i++){
2207 priv->rx_urb[i] = usb_alloc_urb(0,GFP_KERNEL);
2209 priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL);
2211 priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE;
2215 #ifdef THOMAS_BEACON
2218 void *oldaddr, *newaddr;
2220 priv->rx_urb[16] = usb_alloc_urb(0, GFP_KERNEL);
2221 priv->oldaddr = kmalloc(16, GFP_KERNEL);
2222 oldaddr = priv->oldaddr;
2223 align = ((long)oldaddr) & 3;
2225 newaddr = oldaddr + 4 - align;
2226 priv->rx_urb[16]->transfer_buffer_length = 16 - 4 + align;
2229 priv->rx_urb[16]->transfer_buffer_length = 16;
2231 priv->rx_urb[16]->transfer_buffer = newaddr;
2235 memset(priv->rx_urb, 0, sizeof(struct urb*) * MAX_RX_URB);
2236 priv->pp_rxskb = kcalloc(MAX_RX_URB, sizeof(struct sk_buff *),
2238 if (priv->pp_rxskb == NULL)
2245 if (priv->pp_rxskb) {
2246 kfree(priv->pp_rxskb);
2249 kfree(priv->rx_urb);
2252 priv->pp_rxskb = NULL;
2253 priv->rx_urb = NULL;
2255 DMESGE("Endpoint Alloc Failure");
2261 printk("End of initendpoints\n");
2265 #ifdef THOMAS_BEACON
2266 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2269 struct r8192_priv *priv = ieee80211_priv(dev);
2272 for(i=0;i<(MAX_RX_URB+1);i++){
2273 usb_kill_urb(priv->rx_urb[i]);
2274 usb_free_urb(priv->rx_urb[i]);
2276 kfree(priv->rx_urb);
2277 priv->rx_urb = NULL;
2280 kfree(priv->oldaddr);
2281 priv->oldaddr = NULL;
2283 if (priv->pp_rxskb) {
2284 kfree(priv->pp_rxskb);
2289 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2292 struct r8192_priv *priv = ieee80211_priv(dev);
2294 #ifndef JACKSON_NEW_RX
2297 for(i=0;i<(MAX_RX_URB+1);i++){
2298 usb_kill_urb(priv->rx_urb[i]);
2299 kfree(priv->rx_urb[i]->transfer_buffer);
2300 usb_free_urb(priv->rx_urb[i]);
2302 kfree(priv->rx_urb);
2303 priv->rx_urb = NULL;
2308 kfree(priv->rx_urb);
2309 priv->rx_urb = NULL;
2312 kfree(priv->oldaddr);
2313 priv->oldaddr = NULL;
2315 if (priv->pp_rxskb) {
2316 kfree(priv->pp_rxskb);
2325 extern void rtl8192_update_ratr_table(struct net_device* dev);
2326 void rtl8192_link_change(struct net_device *dev)
2330 struct r8192_priv *priv = ieee80211_priv(dev);
2331 struct ieee80211_device* ieee = priv->ieee80211;
2332 //write_nic_word(dev, BCN_INTR_ITV, net->beacon_interval);
2333 if (ieee->state == IEEE80211_LINKED)
2335 rtl8192_net_update(dev);
2336 rtl8192_update_ratr_table(dev);
2337 //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
2338 if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
2339 EnableHWSecurityConfig8192(dev);
2341 /*update timing params*/
2342 // RT_TRACE(COMP_CH, "========>%s(), chan:%d\n", __FUNCTION__, priv->chan);
2343 // rtl8192_set_chan(dev, priv->chan);
2344 if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
2347 reg = read_nic_dword(dev, RCR);
2348 if (priv->ieee80211->state == IEEE80211_LINKED)
2349 priv->ReceiveConfig = reg |= RCR_CBSSID;
2351 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2352 write_nic_dword(dev, RCR, reg);
2355 // rtl8192_set_rxconf(dev);
2358 static struct ieee80211_qos_parameters def_qos_parameters = {
2359 {3,3,3,3},/* cw_min */
2360 {7,7,7,7},/* cw_max */
2361 {2,2,2,2},/* aifs */
2362 {0,0,0,0},/* flags */
2363 {0,0,0,0} /* tx_op_limit */
2367 void rtl8192_update_beacon(struct work_struct * work)
2369 struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2370 struct net_device *dev = priv->ieee80211->dev;
2371 struct ieee80211_device* ieee = priv->ieee80211;
2372 struct ieee80211_network* net = &ieee->current_network;
2374 if (ieee->pHTInfo->bCurrentHTSupport)
2375 HTUpdateSelfAndPeerSetting(ieee, net);
2376 ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2377 rtl8192_update_cap(dev, net->capability);
2380 * background support to run QoS activate functionality
2382 int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
2383 void rtl8192_qos_activate(struct work_struct * work)
2385 struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2386 struct net_device *dev = priv->ieee80211->dev;
2387 struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2388 u8 mode = priv->ieee80211->current_network.mode;
2389 //u32 size = sizeof(struct ieee80211_qos_parameters);
2397 mutex_lock(&priv->mutex);
2398 if(priv->ieee80211->state != IEEE80211_LINKED)
2400 RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
2401 /* It better set slot time at first */
2402 /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2403 /* update the ac parameter to related registers */
2404 for(i = 0; i < QOS_QUEUE_NUM; i++) {
2405 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2406 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2407 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2408 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2409 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2410 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2412 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2413 //write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4332);
2417 mutex_unlock(&priv->mutex);
2420 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2422 struct ieee80211_network *network)
2425 u32 size = sizeof(struct ieee80211_qos_parameters);
2427 if(priv->ieee80211->state !=IEEE80211_LINKED)
2430 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2433 if (network->flags & NETWORK_HAS_QOS_MASK) {
2434 if (active_network &&
2435 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2436 network->qos_data.active = network->qos_data.supported;
2438 if ((network->qos_data.active == 1) && (active_network == 1) &&
2439 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2440 (network->qos_data.old_param_count !=
2441 network->qos_data.param_count)) {
2442 network->qos_data.old_param_count =
2443 network->qos_data.param_count;
2444 queue_work(priv->priv_wq, &priv->qos_activate);
2445 RT_TRACE (COMP_QOS, "QoS parameters change call "
2449 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2450 &def_qos_parameters, size);
2452 if ((network->qos_data.active == 1) && (active_network == 1)) {
2453 queue_work(priv->priv_wq, &priv->qos_activate);
2454 RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2456 network->qos_data.active = 0;
2457 network->qos_data.supported = 0;
2463 /* handle manage frame frame beacon and probe response */
2464 static int rtl8192_handle_beacon(struct net_device * dev,
2465 struct ieee80211_beacon * beacon,
2466 struct ieee80211_network * network)
2468 struct r8192_priv *priv = ieee80211_priv(dev);
2470 rtl8192_qos_handle_probe_response(priv,1,network);
2471 queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2477 * handling the beaconing responses. if we get different QoS setting
2478 * off the network from the associated setting, adjust the QoS
2481 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2482 struct ieee80211_network *network)
2485 unsigned long flags;
2486 u32 size = sizeof(struct ieee80211_qos_parameters);
2487 int set_qos_param = 0;
2489 if ((priv == NULL) || (network == NULL))
2492 if(priv->ieee80211->state !=IEEE80211_LINKED)
2495 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2498 spin_lock_irqsave(&priv->ieee80211->lock, flags);
2499 if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2500 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2501 &network->qos_data.parameters,\
2502 sizeof(struct ieee80211_qos_parameters));
2503 priv->ieee80211->current_network.qos_data.active = 1;
2506 /* update qos parameter for current network */
2507 priv->ieee80211->current_network.qos_data.old_param_count = \
2508 priv->ieee80211->current_network.qos_data.param_count;
2509 priv->ieee80211->current_network.qos_data.param_count = \
2510 network->qos_data.param_count;
2513 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2514 &def_qos_parameters, size);
2515 priv->ieee80211->current_network.qos_data.active = 0;
2516 priv->ieee80211->current_network.qos_data.supported = 0;
2520 spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2522 RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
2523 if (set_qos_param == 1)
2524 queue_work(priv->priv_wq, &priv->qos_activate);
2531 static int rtl8192_handle_assoc_response(struct net_device *dev,
2532 struct ieee80211_assoc_response_frame *resp,
2533 struct ieee80211_network *network)
2535 struct r8192_priv *priv = ieee80211_priv(dev);
2536 rtl8192_qos_association_resp(priv, network);
2541 void rtl8192_update_ratr_table(struct net_device* dev)
2542 // POCTET_STRING posLegacyRate,
2544 // PRT_WLAN_STA pEntry)
2546 struct r8192_priv* priv = ieee80211_priv(dev);
2547 struct ieee80211_device* ieee = priv->ieee80211;
2548 u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2549 //struct ieee80211_network *net = &ieee->current_network;
2552 rtl8192_config_rate(dev, (u16*)(&ratr_value));
2553 ratr_value |= (*(u16*)(pMcsRate)) << 12;
2554 // switch (net->mode)
2558 ratr_value &= 0x00000FF0;
2561 ratr_value &= 0x0000000F;
2564 ratr_value &= 0x00000FF7;
2568 if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
2569 ratr_value &= 0x0007F007;
2571 if (priv->rf_type == RF_1T2R)
2572 ratr_value &= 0x000FF007;
2574 ratr_value &= 0x0F81F007;
2580 ratr_value &= 0x0FFFFFFF;
2581 if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
2582 ratr_value |= 0x80000000;
2583 }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
2584 ratr_value |= 0x80000000;
2586 write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2587 write_nic_byte(dev, UFWP, 1);
2590 static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
2591 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2592 bool GetNmodeSupportBySecCfg8192(struct net_device*dev)
2594 struct r8192_priv* priv = ieee80211_priv(dev);
2595 struct ieee80211_device* ieee = priv->ieee80211;
2596 struct ieee80211_network * network = &ieee->current_network;
2597 int wpa_ie_len= ieee->wpa_ie_len;
2598 struct ieee80211_crypt_data* crypt;
2601 crypt = ieee->crypt[ieee->tx_keyidx];
2602 //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
2603 encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
2606 if(encrypt && (wpa_ie_len == 0)) {
2607 /* wep encryption, no N mode setting */
2609 // } else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
2610 } else if((wpa_ie_len != 0)) {
2611 /* parse pairwise key type */
2612 //if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
2613 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))))
2624 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
2627 struct r8192_priv* priv = ieee80211_priv(dev);
2628 struct ieee80211_device* ieee = priv->ieee80211;
2630 if(ieee->bHalfWirelessN24GMode == true)
2638 void rtl8192_refresh_supportrate(struct r8192_priv* priv)
2640 struct ieee80211_device* ieee = priv->ieee80211;
2641 //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
2642 if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2644 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2645 //RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
2646 //RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
2649 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2653 u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
2655 struct r8192_priv *priv = ieee80211_priv(dev);
2657 switch(priv->rf_chip)
2662 ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2665 ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2668 ret = WIRELESS_MODE_B;
2673 void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
2675 struct r8192_priv *priv = ieee80211_priv(dev);
2676 u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2678 if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
2680 if(bSupportMode & WIRELESS_MODE_N_24G)
2682 wireless_mode = WIRELESS_MODE_N_24G;
2684 else if(bSupportMode & WIRELESS_MODE_N_5G)
2686 wireless_mode = WIRELESS_MODE_N_5G;
2688 else if((bSupportMode & WIRELESS_MODE_A))
2690 wireless_mode = WIRELESS_MODE_A;
2692 else if((bSupportMode & WIRELESS_MODE_G))
2694 wireless_mode = WIRELESS_MODE_G;
2696 else if((bSupportMode & WIRELESS_MODE_B))
2698 wireless_mode = WIRELESS_MODE_B;
2701 RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
2702 wireless_mode = WIRELESS_MODE_B;
2705 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
2706 ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
2708 priv->ieee80211->mode = wireless_mode;
2710 if ((wireless_mode == WIRELESS_MODE_N_24G) || (wireless_mode == WIRELESS_MODE_N_5G))
2711 priv->ieee80211->pHTInfo->bEnableHT = 1;
2713 priv->ieee80211->pHTInfo->bEnableHT = 0;
2714 RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
2715 rtl8192_refresh_supportrate(priv);
2718 //init priv variables here. only non_zero value should be initialized here.
2719 static void rtl8192_init_priv_variable(struct net_device* dev)
2721 struct r8192_priv *priv = ieee80211_priv(dev);
2723 priv->card_8192 = NIC_8192U;
2724 priv->chan = 1; //set to channel 1
2725 priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
2726 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2727 priv->ieee80211->ieee_up=0;
2728 priv->retry_rts = DEFAULT_RETRY_RTS;
2729 priv->retry_data = DEFAULT_RETRY_DATA;
2730 priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
2731 priv->ieee80211->rate = 110; //11 mbps
2732 priv->ieee80211->short_slot = 1;
2733 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
2736 priv->IrpPendingCount = 1;
2737 priv->ResetProgress = RESET_TYPE_NORESET;
2738 priv->bForcedSilentReset = 0;
2739 priv->bDisableNormalResetCheck = false;
2740 priv->force_reset = false;
2742 priv->ieee80211->FwRWRF = 0; //we don't use FW read/write RF until stable firmware is available.
2743 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
2744 priv->ieee80211->iw_mode = IW_MODE_INFRA;
2745 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
2746 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2747 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
2748 IEEE_SOFTMAC_BEACONS;//added by amy 080604 //| //IEEE_SOFTMAC_SINGLE_QUEUE;
2750 priv->ieee80211->active_scan = 1;
2751 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
2752 priv->ieee80211->host_encrypt = 1;
2753 priv->ieee80211->host_decrypt = 1;
2754 priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
2755 priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
2756 priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
2757 priv->ieee80211->set_chan = rtl8192_set_chan;
2758 priv->ieee80211->link_change = rtl8192_link_change;
2759 priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
2760 priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
2761 priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
2762 priv->ieee80211->init_wmmparam_flag = 0;
2763 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
2764 priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
2765 priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
2766 priv->ieee80211->qos_support = 1;
2769 // priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
2770 priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
2771 priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
2772 priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
2774 priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
2775 priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
2776 priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
2778 priv->ieee80211->InitialGainHandler = InitialGain819xUsb;
2779 priv->card_type = USB;
2781 if(Adapter->bInHctTest)
2783 pHalData->ShortRetryLimit = 7;
2784 pHalData->LongRetryLimit = 7;
2788 priv->ShortRetryLimit = 0x30;
2789 priv->LongRetryLimit = 0x30;
2791 priv->EarlyRxThreshold = 7;
2792 priv->enable_gpio0 = 0;
2793 priv->TransmitConfig =
2794 // TCR_DurProcMode | //for RTL8185B, duration setting by HW
2795 //? TCR_DISReqQsize |
2796 (TCR_MXDMA_2048<<TCR_MXDMA_OFFSET)| // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
2797 (priv->ShortRetryLimit<<TCR_SRL_OFFSET)| // Short retry limit
2798 (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit
2799 (false ? TCR_SAT: 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
2801 if(Adapter->bInHctTest)
2802 pHalData->ReceiveConfig = pHalData->CSMethod |
2803 RCR_AMF | RCR_ADF | //RCR_AAP | //accept management/data
2805 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2806 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
2807 RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
2808 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2809 (pHalData->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
2810 (pHalData->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
2814 priv->ReceiveConfig =
2815 RCR_AMF | RCR_ADF | //accept management/data
2816 RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2817 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
2818 //RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
2819 ((u32)7<<RCR_MXDMA_OFFSET)| // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2820 (priv->EarlyRxThreshold<<RX_FIFO_THRESHOLD_SHIFT) | // Rx FIFO Threshold, 7: No Rx threshold.
2821 (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
2823 priv->AcmControl = 0;
2824 priv->pFirmware = kmalloc(sizeof(rt_firmware), GFP_KERNEL);
2825 if (priv->pFirmware)
2826 memset(priv->pFirmware, 0, sizeof(rt_firmware));
2828 /* rx related queue */
2829 skb_queue_head_init(&priv->rx_queue);
2830 skb_queue_head_init(&priv->skb_queue);
2832 /* Tx related queue */
2833 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2834 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
2836 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2837 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
2839 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2840 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
2842 priv->rf_set_chan = rtl8192_phy_SwChnl;
2846 static void rtl8192_init_priv_lock(struct r8192_priv* priv)
2848 spin_lock_init(&priv->tx_lock);
2849 spin_lock_init(&priv->irq_lock);//added by thomas
2850 //spin_lock_init(&priv->rf_lock);
2851 sema_init(&priv->wx_sem,1);
2852 sema_init(&priv->rf_sem,1);
2853 mutex_init(&priv->mutex);
2856 extern void rtl819x_watchdog_wqcallback(struct work_struct *work);
2858 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
2859 //init tasklet and wait_queue here. only 2.6 above kernel is considered
2860 #define DRV_NAME "wlan0"
2861 static void rtl8192_init_priv_task(struct net_device* dev)
2863 struct r8192_priv *priv = ieee80211_priv(dev);
2865 #ifdef PF_SYNCTHREAD
2866 priv->priv_wq = create_workqueue(DRV_NAME,0);
2868 priv->priv_wq = create_workqueue(DRV_NAME);
2871 INIT_WORK(&priv->reset_wq, rtl8192_restart);
2873 //INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
2874 INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
2875 INIT_DELAYED_WORK(&priv->txpower_tracking_wq, dm_txpower_trackingcallback);
2876 // INIT_DELAYED_WORK(&priv->gpio_change_rf_wq, dm_gpio_change_rf_callback);
2877 INIT_DELAYED_WORK(&priv->rfpath_check_wq, dm_rf_pathcheck_workitemcallback);
2878 INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
2879 INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
2880 //INIT_WORK(&priv->SwChnlWorkItem, rtl8192_SwChnl_WorkItem);
2881 //INIT_WORK(&priv->SetBWModeWorkItem, rtl8192_SetBWModeWorkItem);
2882 INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
2884 tasklet_init(&priv->irq_rx_tasklet,
2885 (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
2886 (unsigned long)priv);
2889 static void rtl8192_get_eeprom_size(struct net_device* dev)
2892 struct r8192_priv *priv = ieee80211_priv(dev);
2893 RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
2894 curCR = read_nic_word_E(dev,EPROM_CMD);
2895 RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
2896 //whether need I consider BIT5?
2897 priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
2898 RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
2901 //used to swap endian. as ntohl & htonl are not neccessary to swap endian, so use this instead.
2902 static inline u16 endian_swap(u16* data)
2905 *data = (tmp >> 8) | (tmp << 8);
2908 static void rtl8192_read_eeprom_info(struct net_device* dev)
2911 u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x02};
2912 u8 bLoad_From_EEPOM = false;
2913 struct r8192_priv *priv = ieee80211_priv(dev);
2915 RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
2916 wEPROM_ID = eprom_read(dev, 0); //first read EEPROM ID out;
2917 RT_TRACE(COMP_EPROM, "EEPROM ID is 0x%x\n", wEPROM_ID);
2919 if (wEPROM_ID != RTL8190_EEPROM_ID)
2921 RT_TRACE(COMP_ERR, "EEPROM ID is invalid(is 0x%x(should be 0x%x)\n", wEPROM_ID, RTL8190_EEPROM_ID);
2924 bLoad_From_EEPOM = true;
2926 if (bLoad_From_EEPOM)
2928 tmpValue = eprom_read(dev, (EEPROM_VID>>1));
2929 priv->eeprom_vid = endian_swap(&tmpValue);
2930 priv->eeprom_pid = eprom_read(dev, (EEPROM_PID>>1));
2931 tmpValue = eprom_read(dev, (EEPROM_ChannelPlan>>1));
2932 priv->eeprom_ChannelPlan =((tmpValue&0xff00)>>8);
2933 priv->btxpowerdata_readfromEEPORM = true;
2934 priv->eeprom_CustomerID = eprom_read(dev, (EEPROM_Customer_ID>>1)) >>8;
2938 priv->eeprom_vid = 0;
2939 priv->eeprom_pid = 0;
2940 priv->card_8192_version = VERSION_819xU_B;
2941 priv->eeprom_ChannelPlan = 0;
2942 priv->eeprom_CustomerID = 0;
2944 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);
2945 //set channelplan from eeprom
2946 priv->ChannelPlan = priv->eeprom_ChannelPlan;
2947 if (bLoad_From_EEPOM)
2950 for (i=0; i<6; i+=2)
2953 tmp = eprom_read(dev, (u16)((EEPROM_NODE_ADDRESS_BYTE_0 + i)>>1));
2954 *(u16*)(&dev->dev_addr[i]) = tmp;
2959 memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
2960 //should I set IDR0 here?
2962 RT_TRACE(COMP_EPROM, "MAC addr:%pM\n", dev->dev_addr);
2963 priv->rf_type = RTL819X_DEFAULT_RF_TYPE; //default 1T2R
2964 priv->rf_chip = RF_8256;
2966 if (priv->card_8192_version == (u8)VERSION_819xU_A)
2968 //read Tx power gain offset of legacy OFDM to HT rate
2969 if (bLoad_From_EEPOM)
2970 priv->EEPROMTxPowerDiff = (eprom_read(dev, (EEPROM_TxPowerDiff>>1))&0xff00) >> 8;
2972 priv->EEPROMTxPowerDiff = EEPROM_Default_TxPower;
2973 RT_TRACE(COMP_EPROM, "TxPowerDiff:%d\n", priv->EEPROMTxPowerDiff);
2974 //read ThermalMeter from EEPROM
2975 if (bLoad_From_EEPOM)
2976 priv->EEPROMThermalMeter = (u8)(eprom_read(dev, (EEPROM_ThermalMeter>>1))&0x00ff);
2978 priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
2979 RT_TRACE(COMP_EPROM, "ThermalMeter:%d\n", priv->EEPROMThermalMeter);
2980 //vivi, for tx power track
2981 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
2982 //read antenna tx power offset of B/C/D to A from EEPROM
2983 if (bLoad_From_EEPOM)
2984 priv->EEPROMPwDiff = (eprom_read(dev, (EEPROM_PwDiff>>1))&0x0f00)>>8;
2986 priv->EEPROMPwDiff = EEPROM_Default_PwDiff;
2987 RT_TRACE(COMP_EPROM, "TxPwDiff:%d\n", priv->EEPROMPwDiff);
2988 // Read CrystalCap from EEPROM
2989 if (bLoad_From_EEPOM)
2990 priv->EEPROMCrystalCap = (eprom_read(dev, (EEPROM_CrystalCap>>1))&0x0f);
2992 priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
2993 RT_TRACE(COMP_EPROM, "CrystalCap = %d\n", priv->EEPROMCrystalCap);
2994 //get per-channel Tx power level
2995 if (bLoad_From_EEPOM)
2996 priv->EEPROM_Def_Ver = (eprom_read(dev, (EEPROM_TxPwIndex_Ver>>1))&0xff00)>>8;
2998 priv->EEPROM_Def_Ver = 1;
2999 RT_TRACE(COMP_EPROM, "EEPROM_DEF_VER:%d\n", priv->EEPROM_Def_Ver);
3000 if (priv->EEPROM_Def_Ver == 0) //old eeprom definition
3003 if (bLoad_From_EEPOM)
3004 priv->EEPROMTxPowerLevelCCK = (eprom_read(dev, (EEPROM_TxPwIndex_CCK>>1))&0xff) >> 8;
3006 priv->EEPROMTxPowerLevelCCK = 0x10;
3007 RT_TRACE(COMP_EPROM, "CCK Tx Power Levl: 0x%02x\n", priv->EEPROMTxPowerLevelCCK);
3010 if (bLoad_From_EEPOM)
3012 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G+i)>>1);
3013 if (((EEPROM_TxPwIndex_OFDM_24G+i) % 2) == 0)
3014 tmpValue = tmpValue & 0x00ff;
3016 tmpValue = (tmpValue & 0xff00) >> 8;
3020 priv->EEPROMTxPowerLevelOFDM24G[i] = (u8) tmpValue;
3021 RT_TRACE(COMP_EPROM, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK);
3023 }//end if EEPROM_DEF_VER == 0
3024 else if (priv->EEPROM_Def_Ver == 1)
3026 if (bLoad_From_EEPOM)
3028 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1>>1));
3029 tmpValue = (tmpValue & 0xff00) >> 8;
3033 priv->EEPROMTxPowerLevelCCK_V1[0] = (u8)tmpValue;
3035 if (bLoad_From_EEPOM)
3036 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1 + 2)>>1);
3039 *((u16*)(&priv->EEPROMTxPowerLevelCCK_V1[1])) = tmpValue;
3040 if (bLoad_From_EEPOM)
3041 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1>>1));
3044 *((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[0])) = tmpValue;
3045 if (bLoad_From_EEPOM)
3046 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1+2)>>1);
3049 priv->EEPROMTxPowerLevelOFDM24G[2] = (u8)tmpValue;
3050 }//endif EEPROM_Def_Ver == 1
3052 //update HAL variables
3056 for (i=0; i<14; i++)
3059 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[0];
3060 else if (i>=4 && i<=9)
3061 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[1];
3063 priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[2];
3066 for (i=0; i<14; i++)
3068 if (priv->EEPROM_Def_Ver == 0)
3071 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[0] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
3072 else if (i>=4 && i<=9)
3073 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK;
3075 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[2] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
3077 else if (priv->EEPROM_Def_Ver == 1)
3080 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[0];
3081 else if (i>=4 && i<=9)
3082 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[1];
3084 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[2];
3087 }//end update HAL variables
3088 priv->TxPowerDiff = priv->EEPROMPwDiff;
3089 // Antenna B gain offset to antenna A, bit0~3
3090 priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);
3091 // Antenna C gain offset to antenna A, bit4~7
3092 priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);
3093 // CrystalCap, bit12~15
3094 priv->CrystalCap = priv->EEPROMCrystalCap;
3095 // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
3096 // 92U does not enable TX power tracking.
3097 priv->ThermalMeter[0] = priv->EEPROMThermalMeter;
3098 }//end if VersionID == VERSION_819xU_A
3100 //added by vivi, for dlink led, 20080416
3101 switch(priv->eeprom_CustomerID)
3103 case EEPROM_CID_RUNTOP:
3104 priv->CustomerID = RT_CID_819x_RUNTOP;
3107 case EEPROM_CID_DLINK:
3108 priv->CustomerID = RT_CID_DLINK;
3112 priv->CustomerID = RT_CID_DEFAULT;
3117 switch(priv->CustomerID)
3119 case RT_CID_819x_RUNTOP:
3120 priv->LedStrategy = SW_LED_MODE2;
3124 priv->LedStrategy = SW_LED_MODE4;
3128 priv->LedStrategy = SW_LED_MODE0;
3134 if(priv->rf_type == RF_1T2R)
3136 RT_TRACE(COMP_EPROM, "\n1T2R config\n");
3140 RT_TRACE(COMP_EPROM, "\n2T4R config\n");
3143 // 2008/01/16 MH We can only know RF type in the function. So we have to init
3144 // DIG RATR table again.
3145 init_rate_adaptive(dev);
3146 //we need init DIG RATR table here again.
3148 RT_TRACE(COMP_EPROM, "<===========%s()\n", __FUNCTION__);
3152 short rtl8192_get_channel_map(struct net_device * dev)
3154 struct r8192_priv *priv = ieee80211_priv(dev);
3155 if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
3156 printk("rtl8180_init:Error channel plan! Set to default.\n");
3157 priv->ChannelPlan= 0;
3159 RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
3161 rtl819x_set_channel_map(priv->ChannelPlan, priv);
3165 short rtl8192_init(struct net_device *dev)
3168 struct r8192_priv *priv = ieee80211_priv(dev);
3170 memset(&(priv->stats),0,sizeof(struct Stats));
3171 memset(priv->txqueue_to_outpipemap,0,9);
3175 u8 queuetopipe[]={3,2,1,0,4,8,7,6,5};
3176 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
3178 printk("%d ",priv->txqueue_to_outpipemap[i]);
3183 u8 queuetopipe[]={3,2,1,0,4,4,0,4,4};
3184 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
3186 printk("%d ",priv->txqueue_to_outpipemap[i]);
3190 rtl8192_init_priv_variable(dev);
3191 rtl8192_init_priv_lock(priv);
3192 rtl8192_init_priv_task(dev);
3193 rtl8192_get_eeprom_size(dev);
3194 rtl8192_read_eeprom_info(dev);
3195 rtl8192_get_channel_map(dev);
3197 init_timer(&priv->watch_dog_timer);
3198 priv->watch_dog_timer.data = (unsigned long)dev;
3199 priv->watch_dog_timer.function = watch_dog_timer_callback;
3200 if(rtl8192_usb_initendpoints(dev)!=0){
3201 DMESG("Endopoints initialization failed");
3205 //rtl8192_adapter_start(dev);
3212 /******************************************************************************
3213 *function: This function actually only set RRSR, RATR and BW_OPMODE registers
3214 * not to do all the hw config as its name says
3215 * input: net_device dev
3218 * notice: This part need to modified according to the rate set we filtered
3219 * ****************************************************************************/
3220 void rtl8192_hwconfig(struct net_device* dev)
3222 u32 regRATR = 0, regRRSR = 0;
3223 u8 regBwOpMode = 0, regTmp = 0;
3224 struct r8192_priv *priv = ieee80211_priv(dev);
3226 // Set RRSR, RATR, and BW_OPMODE registers
3228 switch(priv->ieee80211->mode)
3230 case WIRELESS_MODE_B:
3231 regBwOpMode = BW_OPMODE_20MHZ;
3232 regRATR = RATE_ALL_CCK;
3233 regRRSR = RATE_ALL_CCK;
3235 case WIRELESS_MODE_A:
3236 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
3237 regRATR = RATE_ALL_OFDM_AG;
3238 regRRSR = RATE_ALL_OFDM_AG;
3240 case WIRELESS_MODE_G:
3241 regBwOpMode = BW_OPMODE_20MHZ;
3242 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3243 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3245 case WIRELESS_MODE_AUTO:
3247 if (Adapter->bInHctTest)
3249 regBwOpMode = BW_OPMODE_20MHZ;
3250 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3251 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3256 regBwOpMode = BW_OPMODE_20MHZ;
3257 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3258 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3261 case WIRELESS_MODE_N_24G:
3262 // It support CCK rate by default.
3263 // CCK rate will be filtered out only when associated AP does not support it.
3264 regBwOpMode = BW_OPMODE_20MHZ;
3265 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3266 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3268 case WIRELESS_MODE_N_5G:
3269 regBwOpMode = BW_OPMODE_5G;
3270 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3271 regRRSR = RATE_ALL_OFDM_AG;
3275 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
3278 ratr_value = regRATR;
3279 if (priv->rf_type == RF_1T2R)
3281 ratr_value &= ~(RATE_ALL_OFDM_2SS);
3283 write_nic_dword(dev, RATR0, ratr_value);
3284 write_nic_byte(dev, UFWP, 1);
3286 regTmp = read_nic_byte(dev, 0x313);
3287 regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
3288 write_nic_dword(dev, RRSR, regRRSR);
3291 // Set Retry Limit here
3293 write_nic_word(dev, RETRY_LIMIT,
3294 priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
3295 priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
3296 // Set Contention Window here
3300 // Set Tx Antenna including Feedback control
3302 // Set Auto Rate fallback control
3308 //InitializeAdapter and PhyCfg
3309 bool rtl8192_adapter_start(struct net_device *dev)
3311 struct r8192_priv *priv = ieee80211_priv(dev);
3313 bool init_status = true;
3314 RT_TRACE(COMP_INIT, "====>%s()\n", __FUNCTION__);
3315 priv->Rf_Mode = RF_OP_By_SW_3wire;
3316 //for ASIC power on sequence
3317 write_nic_byte_E(dev, 0x5f, 0x80);
3319 write_nic_byte_E(dev, 0x5f, 0xf0);
3320 write_nic_byte_E(dev, 0x5d, 0x00);
3321 write_nic_byte_E(dev, 0x5e, 0x80);
3322 write_nic_byte(dev, 0x17, 0x37);
3325 priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
3326 //config CPUReset Register
3327 //Firmware Reset or not?
3328 dwRegRead = read_nic_dword(dev, CPU_GEN);
3329 if (priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
3330 dwRegRead |= CPU_GEN_SYSTEM_RESET; //do nothing here?
3331 else if (priv->pFirmware->firmware_status == FW_STATUS_5_READY)
3332 dwRegRead |= CPU_GEN_FIRMWARE_RESET;
3334 RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __FUNCTION__, priv->pFirmware->firmware_status);
3336 write_nic_dword(dev, CPU_GEN, dwRegRead);
3339 rtl8192_BBConfig(dev);
3341 //Loopback mode or not
3342 priv->LoopbackMode = RTL819xU_NO_LOOPBACK;
3343 // priv->LoopbackMode = RTL819xU_MAC_LOOPBACK;
3345 dwRegRead = read_nic_dword(dev, CPU_GEN);
3346 if (priv->LoopbackMode == RTL819xU_NO_LOOPBACK)
3347 dwRegRead = ((dwRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
3348 else if (priv->LoopbackMode == RTL819xU_MAC_LOOPBACK)
3349 dwRegRead |= CPU_CCK_LOOPBACK;
3351 RT_TRACE(COMP_ERR, "Serious error in %s(): wrong loopback mode setting(%d)\n", __FUNCTION__, priv->LoopbackMode);
3353 write_nic_dword(dev, CPU_GEN, dwRegRead);
3355 //after reset cpu, we need wait for a seconds to write in register.
3358 //xiong add for new bitfile:usb suspend reset pin set to 1. //do we need?
3359 write_nic_byte_E(dev, 0x5f, (read_nic_byte_E(dev, 0x5f)|0x20));
3362 rtl8192_hwconfig(dev);
3365 write_nic_byte(dev, CMDR, CR_RE|CR_TE);
3368 write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
3369 write_nic_word(dev, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
3372 write_nic_dword(dev, RCR, priv->ReceiveConfig);
3374 //Initialize Number of Reserved Pages in Firmware Queue
3375 write_nic_dword(dev, RQPN1, NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
3376 NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
3377 NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
3378 NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
3379 write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT |\
3380 NUM_OF_PAGE_IN_FW_QUEUE_CMD << RSVD_FW_QUEUE_PAGE_CMD_SHIFT);
3381 write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
3382 NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT
3383 // | NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT
3385 write_nic_dword(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
3388 // TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
3389 write_nic_byte(dev, ACK_TIMEOUT, 0x30);
3391 // RT_TRACE(COMP_INIT, "%s():priv->ResetProgress is %d\n", __FUNCTION__,priv->ResetProgress);
3392 if(priv->ResetProgress == RESET_TYPE_NORESET)
3393 rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);
3394 if(priv->ResetProgress == RESET_TYPE_NORESET){
3395 CamResetAllEntry(dev);
3397 u8 SECR_value = 0x0;
3398 SECR_value |= SCR_TxEncEnable;
3399 SECR_value |= SCR_RxDecEnable;
3400 SECR_value |= SCR_NoSKMC;
3401 write_nic_byte(dev, SECR, SECR_value);
3406 write_nic_word(dev, ATIMWND, 2);
3407 write_nic_word(dev, BCN_INTERVAL, 100);
3410 #define DEFAULT_EDCA 0x005e4332
3412 for (i=0; i<QOS_QUEUE_NUM; i++)
3413 write_nic_dword(dev, WDCAPARA_ADD[i], DEFAULT_EDCA);
3415 #ifdef USB_RX_AGGREGATION_SUPPORT
3416 //3 For usb rx firmware aggregation control
3417 if(priv->ResetProgress == RESET_TYPE_NORESET)
3420 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
3421 ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
3422 (pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
3424 * If usb rx firmware aggregation is enabled,
3425 * when anyone of three threshold conditions above is reached,
3426 * firmware will send aggregated packet to driver.
3428 write_nic_dword(dev, 0x1a8, ulValue);
3429 priv->bCurrentRxAggrEnable = true;
3433 rtl8192_phy_configmac(dev);
3435 if (priv->card_8192_version == (u8) VERSION_819xU_A)
3437 rtl8192_phy_getTxPower(dev);
3438 rtl8192_phy_setTxPower(dev, priv->chan);
3442 init_status = init_firmware(dev);
3445 RT_TRACE(COMP_ERR,"ERR!!! %s(): Firmware download is failed\n", __FUNCTION__);
3448 RT_TRACE(COMP_INIT, "%s():after firmware download\n", __FUNCTION__);
3451 if(Adapter->ResetProgress == RESET_TYPE_NORESET)
3453 if(pMgntInfo->RegRfOff == TRUE)
3454 { // User disable RF via registry.
3455 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RegRfOff ----------\n"));
3456 MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);
3457 // Those action will be discard in MgntActSet_RF_State because off the same state
3458 for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
3459 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3461 else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS)
3462 { // H/W or S/W RF OFF before sleep.
3463 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RfOffReason(%d) ----------\n", pMgntInfo->RfOffReason));
3464 MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3468 pHalData->eRFPowerState = eRfOn;
3469 pMgntInfo->RfOffReason = 0;
3470 RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): RF is on ----------\n"));
3475 if(pHalData->eRFPowerState == eRfOff)
3477 MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3478 // Those action will be discard in MgntActSet_RF_State because off the same state
3479 for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
3480 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3485 if(priv->ResetProgress == RESET_TYPE_NORESET){
3486 rtl8192_phy_RFConfig(dev);
3487 RT_TRACE(COMP_INIT, "%s():after phy RF config\n", __FUNCTION__);
3491 if(priv->ieee80211->FwRWRF)
3492 // We can force firmware to do RF-R/W
3493 priv->Rf_Mode = RF_OP_By_FW;
3495 priv->Rf_Mode = RF_OP_By_SW_3wire;
3498 rtl8192_phy_updateInitGain(dev);
3499 /*--set CCK and OFDM Block "ON"--*/
3500 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
3501 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
3503 if(priv->ResetProgress == RESET_TYPE_NORESET)
3506 u8 tmpvalue = read_nic_byte(dev, 0x301);
3510 RT_TRACE(COMP_POWER_TRACKING, "D-cut\n");
3514 priv->bDcut = FALSE;
3515 RT_TRACE(COMP_POWER_TRACKING, "C-cut\n");
3517 dm_initialize_txpower_tracking(dev);
3519 if(priv->bDcut == TRUE)
3522 u32 tmpRegA= rtl8192_QueryBBReg(dev,rOFDM0_XATxIQImbalance,bMaskDWord);
3523 // u32 tmpRegC= rtl8192_QueryBBReg(dev,rOFDM0_XCTxIQImbalance,bMaskDWord);
3524 for(i = 0; i<TxBBGainTableLength; i++)
3526 if(tmpRegA == priv->txbbgain_table[i].txbbgain_value)
3528 priv->rfa_txpowertrackingindex= (u8)i;
3529 priv->rfa_txpowertrackingindex_real= (u8)i;
3530 priv->rfa_txpowertracking_default= priv->rfa_txpowertrackingindex;
3535 TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
3537 for(i=0 ; i<CCKTxBBGainTableLength ; i++)
3540 if(TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0])
3542 priv->cck_present_attentuation_20Mdefault=(u8) i;
3546 priv->cck_present_attentuation_40Mdefault= 0;
3547 priv->cck_present_attentuation_difference= 0;
3548 priv->cck_present_attentuation = priv->cck_present_attentuation_20Mdefault;
3550 // pMgntInfo->bTXPowerTracking = FALSE;//TEMPLY DISABLE
3553 write_nic_byte(dev, 0x87, 0x0);
3559 /* this configures registers for beacon tx and enables it via
3560 * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
3561 * be used to stop beacon transmission
3563 /***************************************************************************
3564 -------------------------------NET STUFF---------------------------
3565 ***************************************************************************/
3567 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
3569 struct r8192_priv *priv = ieee80211_priv(dev);
3571 return &priv->ieee80211->stats;
3575 HalTxCheckStuck819xUsb(
3576 struct net_device *dev
3579 struct r8192_priv *priv = ieee80211_priv(dev);
3580 u16 RegTxCounter = read_nic_word(dev, 0x128);
3581 bool bStuck = FALSE;
3582 RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
3583 if(priv->TxCounter==RegTxCounter)
3586 priv->TxCounter = RegTxCounter;
3592 * <Assumption: RT_TX_SPINLOCK is acquired.>
3593 * First added: 2006.11.19 by emily
3596 TxCheckStuck(struct net_device *dev)
3598 struct r8192_priv *priv = ieee80211_priv(dev);
3601 // u8 ResetThreshold;
3602 bool bCheckFwTxCnt = false;
3603 //unsigned long flags;
3606 // Decide Stuch threshold according to current power save mode
3609 // RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
3610 // PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
3611 // spin_lock_irqsave(&priv->ieee80211->lock,flags);
3612 for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
3614 if(QueueID == TXCMD_QUEUE)
3616 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
3617 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))
3619 if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
3623 bCheckFwTxCnt = true;
3625 // PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
3626 // spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
3627 // RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
3630 if(HalTxCheckStuck819xUsb(dev))
3632 RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
3633 return RESET_TYPE_SILENT;
3636 return RESET_TYPE_NORESET;
3640 HalRxCheckStuck819xUsb(struct net_device *dev)
3642 u16 RegRxCounter = read_nic_word(dev, 0x130);
3643 struct r8192_priv *priv = ieee80211_priv(dev);
3644 bool bStuck = FALSE;
3645 static u8 rx_chk_cnt = 0;
3646 RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
3647 // If rssi is small, we should check rx for long time because of bad rx.
3648 // or maybe it will continuous silent reset every 2 seconds.
3650 if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
3652 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
3654 else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
3655 ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
3656 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
3667 else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
3668 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
3669 priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
3673 //DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
3679 //DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
3686 //DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
3692 //DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
3696 if(priv->RxCounter==RegRxCounter)
3699 priv->RxCounter = RegRxCounter;
3705 RxCheckStuck(struct net_device *dev)
3707 struct r8192_priv *priv = ieee80211_priv(dev);
3709 bool bRxCheck = FALSE;
3711 // RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
3712 //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
3714 if(priv->IrpPendingCount > 1)
3716 //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
3718 // RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
3721 if(HalRxCheckStuck819xUsb(dev))
3723 RT_TRACE(COMP_RESET, "RxStuck Condition\n");
3724 return RESET_TYPE_SILENT;
3727 return RESET_TYPE_NORESET;
3732 * This function is called by Checkforhang to check whether we should ask OS to reset driver
3734 * \param pAdapter The adapter context for this miniport
3736 * Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
3737 * to judge whether there is tx stuck.
3738 * Note: This function may be required to be rewrite for Vista OS.
3739 * <<<Assumption: Tx spinlock has been acquired >>>
3741 * 8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
3744 rtl819x_ifcheck_resetornot(struct net_device *dev)
3746 struct r8192_priv *priv = ieee80211_priv(dev);
3747 RESET_TYPE TxResetType = RESET_TYPE_NORESET;
3748 RESET_TYPE RxResetType = RESET_TYPE_NORESET;
3749 RT_RF_POWER_STATE rfState;
3751 rfState = priv->ieee80211->eRFPowerState;
3753 TxResetType = TxCheckStuck(dev);
3754 if( rfState != eRfOff ||
3755 /*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
3756 (priv->ieee80211->iw_mode != IW_MODE_ADHOC))
3758 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
3759 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
3760 // if driver is in firmware download failure status, driver should initialize RF in the following
3761 // silent reset procedure Emily, 2008.01.21
3763 // Driver should not check RX stuck in IBSS mode because it is required to
3764 // set Check BSSID in order to send beacon, however, if check BSSID is
3765 // set, STA cannot hear any packet a all. Emily, 2008.04.12
3766 RxResetType = RxCheckStuck(dev);
3768 if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
3769 return RESET_TYPE_NORMAL;
3770 else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
3771 RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
3772 return RESET_TYPE_SILENT;
3775 return RESET_TYPE_NORESET;
3779 void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
3780 int _rtl8192_up(struct net_device *dev);
3781 int rtl8192_close(struct net_device *dev);
3786 CamRestoreAllEntry( struct net_device *dev)
3789 struct r8192_priv *priv = ieee80211_priv(dev);
3790 u8* MacAddr = priv->ieee80211->current_network.bssid;
3792 static u8 CAM_CONST_ADDR[4][6] = {
3793 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3794 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3795 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3796 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
3797 static u8 CAM_CONST_BROAD[] =
3798 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3800 RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
3803 if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
3804 (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
3807 for(EntryId=0; EntryId<4; EntryId++)
3810 MacAddr = CAM_CONST_ADDR[EntryId];
3814 priv->ieee80211->pairwise_key_type,
3822 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
3826 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3830 priv->ieee80211->pairwise_key_type,
3838 priv->ieee80211->pairwise_key_type,
3844 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
3848 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3852 priv->ieee80211->pairwise_key_type,
3860 priv->ieee80211->pairwise_key_type,
3869 if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
3871 MacAddr = CAM_CONST_BROAD;
3872 for(EntryId=1 ; EntryId<4 ; EntryId++)
3878 priv->ieee80211->group_key_type,
3884 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3888 priv->ieee80211->group_key_type,
3893 else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
3895 MacAddr = CAM_CONST_BROAD;
3896 for(EntryId=1; EntryId<4 ; EntryId++)
3902 priv->ieee80211->group_key_type,
3909 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3913 priv->ieee80211->group_key_type,
3919 //////////////////////////////////////////////////////////////
3920 // This function is used to fix Tx/Rx stop bug temporarily.
3921 // This function will do "system reset" to NIC when Tx or Rx is stuck.
3922 // The method checking Tx/Rx stuck of this function is supported by FW,
3923 // which reports Tx and Rx counter to register 0x128 and 0x130.
3924 //////////////////////////////////////////////////////////////
3926 rtl819x_ifsilentreset(struct net_device *dev)
3928 //OCTET_STRING asocpdu;
3929 struct r8192_priv *priv = ieee80211_priv(dev);
3931 int reset_status = 0;
3932 struct ieee80211_device *ieee = priv->ieee80211;
3935 // 2007.07.20. If we need to check CCK stop, please uncomment this line.
3936 //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
3938 if(priv->ResetProgress==RESET_TYPE_NORESET)
3942 RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
3944 // Set the variable for reset.
3945 priv->ResetProgress = RESET_TYPE_SILENT;
3946 // rtl8192_close(dev);
3947 down(&priv->wx_sem);
3950 RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
3955 RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
3956 // if(!netif_queue_stopped(dev))
3957 // netif_stop_queue(dev);
3959 rtl8192_rtx_disable(dev);
3960 rtl8192_cancel_deferred_work(priv);
3962 del_timer_sync(&priv->watch_dog_timer);
3964 ieee->sync_scan_hurryup = 1;
3965 if(ieee->state == IEEE80211_LINKED)
3967 down(&ieee->wx_sem);
3968 printk("ieee->state is IEEE80211_LINKED\n");
3969 ieee80211_stop_send_beacons(priv->ieee80211);
3970 del_timer_sync(&ieee->associate_timer);
3971 cancel_delayed_work(&ieee->associate_retry_wq);
3972 ieee80211_stop_scan(ieee);
3973 netif_carrier_off(dev);
3977 printk("ieee->state is NOT LINKED\n");
3978 ieee80211_softmac_stop_protocol(priv->ieee80211); }
3980 RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
3981 //rtl8192_irq_disable(dev);
3982 RT_TRACE(COMP_RESET,"%s():===========>start to up the driver\n",__FUNCTION__);
3983 reset_status = _rtl8192_up(dev);
3985 RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
3986 if(reset_status == -EAGAIN)
3995 RT_TRACE(COMP_ERR," ERR!!! %s(): Reset Failed!!\n", __FUNCTION__);
3998 ieee->is_silent_reset = 1;
3999 EnableHWSecurityConfig8192(dev);
4000 if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
4002 ieee->set_chan(ieee->dev, ieee->current_network.channel);
4004 queue_work(ieee->wq, &ieee->associate_complete_wq);
4007 else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
4009 ieee->set_chan(ieee->dev, ieee->current_network.channel);
4010 ieee->link_change(ieee->dev);
4012 // notify_wx_assoc_event(ieee);
4014 ieee80211_start_send_beacons(ieee);
4016 if (ieee->data_hard_resume)
4017 ieee->data_hard_resume(ieee->dev);
4018 netif_carrier_on(ieee->dev);
4021 CamRestoreAllEntry(dev);
4023 priv->ResetProgress = RESET_TYPE_NORESET;
4024 priv->reset_count++;
4026 priv->bForcedSilentReset =false;
4027 priv->bResetInProgress = false;
4029 // For test --> force write UFWP.
4030 write_nic_byte(dev, UFWP, 1);
4031 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
4035 void CAM_read_entry(
4036 struct net_device *dev,
4040 u32 target_command=0;
4041 u32 target_content=0;
4045 // printk("=======>start read CAM\n");
4046 for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
4048 // polling bit, and No Write enable, and address
4049 target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
4050 target_command= target_command | BIT31;
4052 //Check polling bit is clear
4056 ulStatus = read_nic_dword(dev, RWCAM);
4057 if(ulStatus & BIT31){
4064 write_nic_dword(dev, RWCAM, target_command);
4065 RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
4066 // printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
4067 target_content = read_nic_dword(dev, RCAMO);
4068 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
4069 // printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
4074 void rtl819x_update_rxcounts(
4075 struct r8192_priv *priv,
4084 *TotalRxDataNum = 0;
4086 SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
4087 priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
4088 priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
4089 for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
4090 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
4091 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
4096 extern void rtl819x_watchdog_wqcallback(struct work_struct *work)
4098 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
4099 struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
4100 struct net_device *dev = priv->ieee80211->dev;
4101 struct ieee80211_device* ieee = priv->ieee80211;
4102 RESET_TYPE ResetType = RESET_TYPE_NORESET;
4103 static u8 check_reset_cnt=0;
4104 bool bBusyTraffic = false;
4108 hal_dm_watchdog(dev);
4110 {//to get busy traffic condition
4111 if(ieee->state == IEEE80211_LINKED)
4113 if( ieee->LinkDetectInfo.NumRxOkInPeriod> 666 ||
4114 ieee->LinkDetectInfo.NumTxOkInPeriod> 666 ) {
4115 bBusyTraffic = true;
4117 ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
4118 ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
4119 ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
4122 //added by amy for AP roaming
4124 if(priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA)
4126 u32 TotalRxBcnNum = 0;
4127 u32 TotalRxDataNum = 0;
4129 rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
4130 if((TotalRxBcnNum+TotalRxDataNum) == 0)
4133 if(rfState == eRfOff)
4134 RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
4136 printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
4137 // Dot11d_Reset(dev);
4138 priv->ieee80211->state = IEEE80211_ASSOCIATING;
4139 notify_wx_assoc_event(priv->ieee80211);
4140 RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
4141 priv->ieee80211->link_change(dev);
4142 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
4146 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod=0;
4147 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod=0;
4149 // CAM_read_entry(dev,4);
4150 //check if reset the driver
4151 if(check_reset_cnt++ >= 3)
4153 ResetType = rtl819x_ifcheck_resetornot(dev);
4154 check_reset_cnt = 3;
4155 //DbgPrint("Start to check silent reset\n");
4157 // 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);
4158 if( (priv->force_reset) || (priv->ResetProgress==RESET_TYPE_NORESET &&
4159 (priv->bForcedSilentReset ||
4160 (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))) // This is control by OID set in Pomelo
4162 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);
4163 rtl819x_ifsilentreset(dev);
4165 priv->force_reset = false;
4166 priv->bForcedSilentReset = false;
4167 priv->bResetInProgress = false;
4168 RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
4172 void watch_dog_timer_callback(unsigned long data)
4174 struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
4175 //printk("===============>watch_dog timer\n");
4176 queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
4177 mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
4179 int _rtl8192_up(struct net_device *dev)
4181 struct r8192_priv *priv = ieee80211_priv(dev);
4183 int init_status = 0;
4185 priv->ieee80211->ieee_up=1;
4186 RT_TRACE(COMP_INIT, "Bringing up iface");
4187 init_status = rtl8192_adapter_start(dev);
4190 RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n", __FUNCTION__);
4191 priv->up=priv->ieee80211->ieee_up = 0;
4194 RT_TRACE(COMP_INIT, "start adapter finished\n");
4195 rtl8192_rx_enable(dev);
4196 // rtl8192_tx_enable(dev);
4197 if(priv->ieee80211->state != IEEE80211_LINKED)
4198 ieee80211_softmac_start_protocol(priv->ieee80211);
4199 ieee80211_reset_queue(priv->ieee80211);
4200 watch_dog_timer_callback((unsigned long) dev);
4201 if(!netif_queue_stopped(dev))
4202 netif_start_queue(dev);
4204 netif_wake_queue(dev);
4210 int rtl8192_open(struct net_device *dev)
4212 struct r8192_priv *priv = ieee80211_priv(dev);
4214 down(&priv->wx_sem);
4215 ret = rtl8192_up(dev);
4222 int rtl8192_up(struct net_device *dev)
4224 struct r8192_priv *priv = ieee80211_priv(dev);
4226 if (priv->up == 1) return -1;
4228 return _rtl8192_up(dev);
4232 int rtl8192_close(struct net_device *dev)
4234 struct r8192_priv *priv = ieee80211_priv(dev);
4237 down(&priv->wx_sem);
4239 ret = rtl8192_down(dev);
4247 int rtl8192_down(struct net_device *dev)
4249 struct r8192_priv *priv = ieee80211_priv(dev);
4252 if (priv->up == 0) return -1;
4255 priv->ieee80211->ieee_up = 0;
4256 RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
4258 if (!netif_queue_stopped(dev))
4259 netif_stop_queue(dev);
4261 rtl8192_rtx_disable(dev);
4262 //rtl8192_irq_disable(dev);
4264 /* Tx related queue release */
4265 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4266 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
4268 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4269 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
4272 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4273 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
4276 //as cancel_delayed_work will del work->timer, so if work is not definedas struct delayed_work, it will corrupt
4277 // flush_scheduled_work();
4278 rtl8192_cancel_deferred_work(priv);
4280 del_timer_sync(&priv->watch_dog_timer);
4283 ieee80211_softmac_stop_protocol(priv->ieee80211);
4284 memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
4285 RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
4291 void rtl8192_commit(struct net_device *dev)
4293 struct r8192_priv *priv = ieee80211_priv(dev);
4294 int reset_status = 0;
4295 //u8 reset_times = 0;
4296 if (priv->up == 0) return ;
4299 rtl8192_cancel_deferred_work(priv);
4300 del_timer_sync(&priv->watch_dog_timer);
4301 //cancel_delayed_work(&priv->SwChnlWorkItem);
4303 ieee80211_softmac_stop_protocol(priv->ieee80211);
4305 //rtl8192_irq_disable(dev);
4306 rtl8192_rtx_disable(dev);
4307 reset_status = _rtl8192_up(dev);
4312 void rtl8192_restart(struct net_device *dev)
4314 struct r8192_priv *priv = ieee80211_priv(dev);
4316 void rtl8192_restart(struct work_struct *work)
4318 struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
4319 struct net_device *dev = priv->ieee80211->dev;
4321 down(&priv->wx_sem);
4323 rtl8192_commit(dev);
4328 static void r8192_set_multicast(struct net_device *dev)
4330 struct r8192_priv *priv = ieee80211_priv(dev);
4333 //down(&priv->wx_sem);
4337 promisc = (dev->flags & IFF_PROMISC) ? 1:0;
4339 if (promisc != priv->promisc)
4340 // rtl8192_commit(dev);
4342 priv->promisc = promisc;
4344 //schedule_work(&priv->reset_wq);
4345 //up(&priv->wx_sem);
4349 int r8192_set_mac_adr(struct net_device *dev, void *mac)
4351 struct r8192_priv *priv = ieee80211_priv(dev);
4352 struct sockaddr *addr = mac;
4354 down(&priv->wx_sem);
4356 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
4358 schedule_work(&priv->reset_wq);
4364 /* based on ipw2200 driver */
4365 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
4367 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4368 struct iwreq *wrq = (struct iwreq *)rq;
4370 struct ieee80211_device *ieee = priv->ieee80211;
4372 u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
4373 struct iw_point *p = &wrq->u.data;
4374 struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
4376 down(&priv->wx_sem);
4379 if (p->length < sizeof(struct ieee_param) || !p->pointer){
4384 ipw = kmalloc(p->length, GFP_KERNEL);
4389 if (copy_from_user(ipw, p->pointer, p->length)) {
4396 case RTL_IOCTL_WPA_SUPPLICANT:
4397 //parse here for HW security
4398 if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
4400 if (ipw->u.crypt.set_tx)
4402 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
4403 ieee->pairwise_key_type = KEY_TYPE_CCMP;
4404 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
4405 ieee->pairwise_key_type = KEY_TYPE_TKIP;
4406 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
4408 if (ipw->u.crypt.key_len == 13)
4409 ieee->pairwise_key_type = KEY_TYPE_WEP104;
4410 else if (ipw->u.crypt.key_len == 5)
4411 ieee->pairwise_key_type = KEY_TYPE_WEP40;
4414 ieee->pairwise_key_type = KEY_TYPE_NA;
4416 if (ieee->pairwise_key_type)
4418 memcpy((u8*)key, ipw->u.crypt.key, 16);
4419 EnableHWSecurityConfig8192(dev);
4420 //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!
4422 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
4423 if (ieee->auth_mode != 2)
4424 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
4427 else //if (ipw->u.crypt.idx) //group key use idx > 0
4429 memcpy((u8*)key, ipw->u.crypt.key, 16);
4430 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
4431 ieee->group_key_type= KEY_TYPE_CCMP;
4432 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
4433 ieee->group_key_type = KEY_TYPE_TKIP;
4434 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
4436 if (ipw->u.crypt.key_len == 13)
4437 ieee->group_key_type = KEY_TYPE_WEP104;
4438 else if (ipw->u.crypt.key_len == 5)
4439 ieee->group_key_type = KEY_TYPE_WEP40;
4442 ieee->group_key_type = KEY_TYPE_NA;
4444 if (ieee->group_key_type)
4448 ipw->u.crypt.idx, //KeyIndex
4449 ieee->group_key_type, //KeyType
4450 broadcast_addr, //MacAddr
4456 #ifdef JOHN_HWSEC_DEBUG
4458 printk("@@ wrq->u pointer = ");
4459 for(i=0;i<wrq->u.data.length;i++){
4460 if(i%10==0) printk("\n");
4461 printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
4464 #endif /*JOHN_HWSEC_DEBUG*/
4465 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
4479 u8 HwRateToMRate90(bool bIsHT, u8 rate)
4485 case DESC90_RATE1M: ret_rate = MGN_1M; break;
4486 case DESC90_RATE2M: ret_rate = MGN_2M; break;
4487 case DESC90_RATE5_5M: ret_rate = MGN_5_5M; break;
4488 case DESC90_RATE11M: ret_rate = MGN_11M; break;
4489 case DESC90_RATE6M: ret_rate = MGN_6M; break;
4490 case DESC90_RATE9M: ret_rate = MGN_9M; break;
4491 case DESC90_RATE12M: ret_rate = MGN_12M; break;
4492 case DESC90_RATE18M: ret_rate = MGN_18M; break;
4493 case DESC90_RATE24M: ret_rate = MGN_24M; break;
4494 case DESC90_RATE36M: ret_rate = MGN_36M; break;
4495 case DESC90_RATE48M: ret_rate = MGN_48M; break;
4496 case DESC90_RATE54M: ret_rate = MGN_54M; break;
4500 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
4506 case DESC90_RATEMCS0: ret_rate = MGN_MCS0; break;
4507 case DESC90_RATEMCS1: ret_rate = MGN_MCS1; break;
4508 case DESC90_RATEMCS2: ret_rate = MGN_MCS2; break;
4509 case DESC90_RATEMCS3: ret_rate = MGN_MCS3; break;
4510 case DESC90_RATEMCS4: ret_rate = MGN_MCS4; break;
4511 case DESC90_RATEMCS5: ret_rate = MGN_MCS5; break;
4512 case DESC90_RATEMCS6: ret_rate = MGN_MCS6; break;
4513 case DESC90_RATEMCS7: ret_rate = MGN_MCS7; break;
4514 case DESC90_RATEMCS8: ret_rate = MGN_MCS8; break;
4515 case DESC90_RATEMCS9: ret_rate = MGN_MCS9; break;
4516 case DESC90_RATEMCS10: ret_rate = MGN_MCS10; break;
4517 case DESC90_RATEMCS11: ret_rate = MGN_MCS11; break;
4518 case DESC90_RATEMCS12: ret_rate = MGN_MCS12; break;
4519 case DESC90_RATEMCS13: ret_rate = MGN_MCS13; break;
4520 case DESC90_RATEMCS14: ret_rate = MGN_MCS14; break;
4521 case DESC90_RATEMCS15: ret_rate = MGN_MCS15; break;
4522 case DESC90_RATEMCS32: ret_rate = (0x80|0x20); break;
4526 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
4535 * Function: UpdateRxPktTimeStamp
4536 * Overview: Recored down the TSF time stamp when receiving a packet
4544 * (pRfd->Status.TimeStampHigh is updated)
4545 * (pRfd->Status.TimeStampLow is updated)
4549 void UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
4551 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4553 if(stats->bIsAMPDU && !stats->bFirstMPDU) {
4554 stats->mac_time[0] = priv->LastRxDescTSFLow;
4555 stats->mac_time[1] = priv->LastRxDescTSFHigh;
4557 priv->LastRxDescTSFLow = stats->mac_time[0];
4558 priv->LastRxDescTSFHigh = stats->mac_time[1];
4564 long rtl819x_translate_todbm(u8 signal_strength_index )// 0-100 index.
4566 long signal_power; // in dBm.
4568 // Translate to dBm (x=0.5y-95).
4569 signal_power = (long)((signal_strength_index + 1) >> 1);
4572 return signal_power;
4576 /* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
4577 be a local static. Otherwise, it may increase when we return from S3/S4. The
4578 value will be kept in memory or disk. We must delcare the value in adapter
4579 and it will be reinitialized when return from S3/S4. */
4580 void rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
4582 bool bcheck = false;
4584 u32 nspatial_stream, tmp_val;
4586 static u32 slide_rssi_index=0, slide_rssi_statistics=0;
4587 static u32 slide_evm_index=0, slide_evm_statistics=0;
4588 static u32 last_rssi=0, last_evm=0;
4590 static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
4591 static u32 last_beacon_adc_pwdb=0;
4593 struct ieee80211_hdr_3addr *hdr;
4595 unsigned int frag,seq;
4596 hdr = (struct ieee80211_hdr_3addr *)buffer;
4597 sc = le16_to_cpu(hdr->seq_ctl);
4598 frag = WLAN_GET_SEQ_FRAG(sc);
4599 seq = WLAN_GET_SEQ_SEQ(sc);
4600 //cosa add 04292008 to record the sequence number
4601 pcurrent_stats->Seq_Num = seq;
4603 // Check whether we should take the previous packet into accounting
4605 if(!pprevious_stats->bIsAMPDU)
4607 // if previous packet is not aggregated packet
4614 if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
4616 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
4617 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
4618 priv->stats.slide_rssi_total -= last_rssi;
4620 priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
4622 priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
4623 if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
4624 slide_rssi_index = 0;
4626 // <1> Showed on UI for user, in dbm
4627 tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
4628 priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
4629 pcurrent_stats->rssi = priv->stats.signal_strength;
4631 // If the previous packet does not match the criteria, neglect it
4633 if(!pprevious_stats->bPacketMatchBSSID)
4635 if(!pprevious_stats->bToSelfBA)
4643 //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
4648 priv->stats.num_process_phyinfo++;
4650 /* record the general signal strength to the sliding window. */
4653 // <2> Showed on UI for engineering
4654 // hardware does not provide rssi information for each rf path in CCK
4655 if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
4657 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
4659 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
4662 //Fixed by Jacken 2008-03-20
4663 if(priv->stats.rx_rssi_percentage[rfpath] == 0)
4665 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
4666 //DbgPrint("MIMO RSSI initialize \n");
4668 if(pprevious_stats->RxMIMOSignalStrength[rfpath] > priv->stats.rx_rssi_percentage[rfpath])
4670 priv->stats.rx_rssi_percentage[rfpath] =
4671 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4672 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4673 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath] + 1;
4677 priv->stats.rx_rssi_percentage[rfpath] =
4678 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4679 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4681 RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath] = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
4689 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4690 pprevious_stats->bIsCCK? "CCK": "OFDM",
4691 pprevious_stats->RxPWDBAll);
4693 if(pprevious_stats->bPacketBeacon)
4695 /* record the beacon pwdb to the sliding window. */
4696 if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4698 slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
4699 last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
4700 priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
4701 //DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
4702 // slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
4704 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
4705 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
4706 //DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
4707 slide_beacon_adc_pwdb_index++;
4708 if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4709 slide_beacon_adc_pwdb_index = 0;
4710 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
4711 if(pprevious_stats->RxPWDBAll >= 3)
4712 pprevious_stats->RxPWDBAll -= 3;
4715 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4716 pprevious_stats->bIsCCK? "CCK": "OFDM",
4717 pprevious_stats->RxPWDBAll);
4720 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
4722 if(priv->undecorated_smoothed_pwdb < 0) // initialize
4724 priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
4725 //DbgPrint("First pwdb initialize \n");
4727 if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
4729 priv->undecorated_smoothed_pwdb =
4730 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4731 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4732 priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
4736 priv->undecorated_smoothed_pwdb =
4737 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4738 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4746 /* record the general EVM to the sliding window. */
4747 if(pprevious_stats->SignalQuality == 0)
4752 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
4753 if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
4754 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
4755 last_evm = priv->stats.slide_evm[slide_evm_index];
4756 priv->stats.slide_evm_total -= last_evm;
4759 priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
4761 priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
4762 if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
4763 slide_evm_index = 0;
4765 // <1> Showed on UI for user, in percentage.
4766 tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
4767 priv->stats.signal_quality = tmp_val;
4768 //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
4769 priv->stats.last_signal_strength_inpercent = tmp_val;
4772 // <2> Showed on UI for engineering
4773 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
4775 for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
4777 if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
4779 if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
4781 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
4783 priv->stats.rx_evm_percentage[nspatial_stream] =
4784 ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
4785 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
4794 /*-----------------------------------------------------------------------------
4795 * Function: rtl819x_query_rxpwrpercentage()
4799 * Input: char antpower
4803 * Return: 0-100 percentage
4807 * 05/26/2008 amy Create Version 0 porting from windows code.
4809 *---------------------------------------------------------------------------*/
4810 static u8 rtl819x_query_rxpwrpercentage(
4814 if ((antpower <= -100) || (antpower >= 20))
4818 else if (antpower >= 0)
4824 return (100+antpower);
4827 } /* QueryRxPwrPercentage */
4830 rtl819x_evm_dbtopercentage(
4842 ret_val = 0 - ret_val;
4850 // We want good-looking for signal strength/quality
4851 // 2007/7/19 01:09, by cosa.
4854 rtl819x_signal_scale_mapping(
4860 // Step 1. Scale mapping.
4861 if(currsig >= 61 && currsig <= 100)
4863 retsig = 90 + ((currsig - 60) / 4);
4865 else if(currsig >= 41 && currsig <= 60)
4867 retsig = 78 + ((currsig - 40) / 2);
4869 else if(currsig >= 31 && currsig <= 40)
4871 retsig = 66 + (currsig - 30);
4873 else if(currsig >= 21 && currsig <= 30)
4875 retsig = 54 + (currsig - 20);
4877 else if(currsig >= 5 && currsig <= 20)
4879 retsig = 42 + (((currsig - 5) * 2) / 3);
4881 else if(currsig == 4)
4885 else if(currsig == 3)
4889 else if(currsig == 2)
4893 else if(currsig == 1)
4905 static void rtl8192_query_rxphystatus(
4906 struct r8192_priv * priv,
4907 struct ieee80211_rx_stats * pstats,
4908 rx_drvinfo_819x_usb * pdrvinfo,
4909 struct ieee80211_rx_stats * precord_stats,
4910 bool bpacket_match_bssid,
4911 bool bpacket_toself,
4916 //PRT_RFD_STATUS pRtRfdStatus = &(pRfd->Status);
4917 phy_sts_ofdm_819xusb_t* pofdm_buf;
4918 phy_sts_cck_819xusb_t * pcck_buf;
4919 phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
4921 u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
4922 char rx_pwr[4], rx_pwr_all=0;
4923 //long rx_avg_pwr = 0;
4924 char rx_snrX, rx_evmX;
4926 u32 RSSI, total_rssi=0;//, total_evm=0;
4927 // long signal_strength_index = 0;
4932 priv->stats.numqry_phystatus++;
4934 is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
4936 // Record it for next packet processing
4937 memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
4938 pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
4939 pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
4940 pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
4941 pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
4942 pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
4944 prxpkt = (u8*)pdrvinfo;
4946 /* Move pointer to the 16th bytes. Phy status start address. */
4947 prxpkt += sizeof(rx_drvinfo_819x_usb);
4949 /* Initial the cck and ofdm buffer pointer */
4950 pcck_buf = (phy_sts_cck_819xusb_t *)prxpkt;
4951 pofdm_buf = (phy_sts_ofdm_819xusb_t *)prxpkt;
4953 pstats->RxMIMOSignalQuality[0] = -1;
4954 pstats->RxMIMOSignalQuality[1] = -1;
4955 precord_stats->RxMIMOSignalQuality[0] = -1;
4956 precord_stats->RxMIMOSignalQuality[1] = -1;
4961 // (1)Hardware does not provide RSSI for CCK
4965 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
4967 u8 report;//, cck_agc_rpt;
4969 priv->stats.numqry_phystatusCCK++;
4971 if(!priv->bCckHighPower)
4973 report = pcck_buf->cck_agc_rpt & 0xc0;
4977 //Fixed by Jacken from Bryant 2008-03-20
4978 //Original value is -38 , -26 , -14 , -2
4979 //Fixed value is -35 , -23 , -11 , 6
4981 rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
4984 rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
4987 rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
4990 rx_pwr_all = 6 - (pcck_buf->cck_agc_rpt & 0x3e);
4996 report = pcck_buf->cck_agc_rpt & 0x60;
5001 rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
5004 rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
5007 rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
5010 rx_pwr_all = 6 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
5015 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
5016 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
5017 pstats->RecvSignalPower = pwdb_all;
5020 // (3) Get Signal Quality (EVM)
5022 //if(bpacket_match_bssid)
5026 if(pstats->RxPWDBAll > 40)
5031 sq = pcck_buf->sq_rpt;
5033 if(pcck_buf->sq_rpt > 64)
5035 else if (pcck_buf->sq_rpt < 20)
5038 sq = ((64-sq) * 100) / 44;
5040 pstats->SignalQuality = precord_stats->SignalQuality = sq;
5041 pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
5042 pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
5047 priv->stats.numqry_phystatusHT++;
5049 // (1)Get RSSI for HT rate
5051 for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
5053 // 2008/01/30 MH we will judge RF RX path now.
5054 if (priv->brfpath_rxenable[i])
5059 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
5062 //Fixed by Jacken from Bryant 2008-03-20
5063 //Original value is 106
5064 rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
5066 //Get Rx snr value in DB
5067 tmp_rxsnr = pofdm_buf->rxsnr_X[i];
5068 rx_snrX = (char)(tmp_rxsnr);
5071 priv->stats.rxSNRdB[i] = (long)rx_snrX;
5073 /* Translate DBM to percentage. */
5074 RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
5077 /* Record Signal Strength for next packet */
5078 //if(bpacket_match_bssid)
5080 pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
5081 precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
5087 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
5089 //Fixed by Jacken from Bryant 2008-03-20
5090 //Original value is 106
5091 rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
5092 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
5094 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
5095 pstats->RxPower = precord_stats->RxPower = rx_pwr_all;
5098 // (3)EVM of HT rate
5100 if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
5101 pdrvinfo->RxRate<=DESC90_RATEMCS15)
5102 max_spatial_stream = 2; //both spatial stream make sense
5104 max_spatial_stream = 1; //only spatial stream 1 makes sense
5106 for(i=0; i<max_spatial_stream; i++)
5108 tmp_rxevm = pofdm_buf->rxevm_X[i];
5109 rx_evmX = (char)(tmp_rxevm);
5111 // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
5112 // fill most significant bit to "zero" when doing shifting operation which may change a negative
5113 // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.
5116 evm = rtl819x_evm_dbtopercentage(rx_evmX);
5117 //if(bpacket_match_bssid)
5119 if(i==0) // Fill value in RFD, Get the first spatial stream only
5120 pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
5121 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
5126 /* record rx statistics for debug */
5127 rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
5128 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
5129 if(pdrvinfo->BW) //40M channel
5130 priv->stats.received_bwtype[1+prxsc->rxsc]++;
5132 priv->stats.received_bwtype[0]++;
5135 //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
5136 //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
5139 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;
5144 //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
5145 // We can judge RX path number now.
5147 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
5149 } /* QueryRxPhyStatus8190Pci */
5152 rtl8192_record_rxdesc_forlateruse(
5153 struct ieee80211_rx_stats * psrc_stats,
5154 struct ieee80211_rx_stats * ptarget_stats
5157 ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
5158 ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
5159 ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
5163 void TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
5164 struct ieee80211_rx_stats * pstats,
5165 rx_drvinfo_819x_usb *pdrvinfo)
5167 // TODO: We must only check packet for current MAC address. Not finish
5168 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5169 struct net_device *dev=info->dev;
5170 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5171 bool bpacket_match_bssid, bpacket_toself;
5172 bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
5173 static struct ieee80211_rx_stats previous_stats;
5174 struct ieee80211_hdr_3addr *hdr;//by amy
5177 // Get Signal Quality for only RX data queue (but not command queue)
5180 //u16 tmp_buf_len = 0;
5183 /* Get MAC frame start address. */
5184 tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
5186 hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
5187 fc = le16_to_cpu(hdr->frame_ctl);
5188 type = WLAN_FC_GET_TYPE(fc);
5189 praddr = hdr->addr1;
5191 /* Check if the received packet is acceptabe. */
5192 bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
5193 (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
5194 && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
5195 bpacket_toself = bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
5197 if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
5199 bPacketBeacon = true;
5200 //DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
5202 if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
5204 if((eqMacAddr(praddr,dev->dev_addr)))
5206 //DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
5211 if(bpacket_match_bssid)
5213 priv->stats.numpacket_matchbssid++;
5216 priv->stats.numpacket_toself++;
5219 // Process PHY information for previous packet (RSSI/PWDB/EVM)
5221 // Because phy information is contained in the last packet of AMPDU only, so driver
5222 // should process phy information of previous packet
5223 rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
5224 rtl8192_query_rxphystatus(priv, pstats, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
5225 rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
5230 * Function: UpdateReceivedRateHistogramStatistics
5231 * Overview: Recored down the received data rate
5234 * struct net_device *dev
5235 * struct ieee80211_rx_stats *stats
5239 * (priv->stats.ReceivedRateHistogram[] is updated)
5244 UpdateReceivedRateHistogramStatistics8190(
5245 struct net_device *dev,
5246 struct ieee80211_rx_stats *stats
5249 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5250 u32 rcvType=1; //0: Total, 1:OK, 2:CRC, 3:ICV
5252 u32 preamble_guardinterval; //1: short preamble/GI, 0: long preamble/GI
5257 else if(stats->bICV)
5260 if(stats->bShortPreamble)
5261 preamble_guardinterval = 1;// short
5263 preamble_guardinterval = 0;// long
5270 case MGN_1M: rateIndex = 0; break;
5271 case MGN_2M: rateIndex = 1; break;
5272 case MGN_5_5M: rateIndex = 2; break;
5273 case MGN_11M: rateIndex = 3; break;
5277 case MGN_6M: rateIndex = 4; break;
5278 case MGN_9M: rateIndex = 5; break;
5279 case MGN_12M: rateIndex = 6; break;
5280 case MGN_18M: rateIndex = 7; break;
5281 case MGN_24M: rateIndex = 8; break;
5282 case MGN_36M: rateIndex = 9; break;
5283 case MGN_48M: rateIndex = 10; break;
5284 case MGN_54M: rateIndex = 11; break;
5286 // 11n High throughput rate
5288 case MGN_MCS0: rateIndex = 12; break;
5289 case MGN_MCS1: rateIndex = 13; break;
5290 case MGN_MCS2: rateIndex = 14; break;
5291 case MGN_MCS3: rateIndex = 15; break;
5292 case MGN_MCS4: rateIndex = 16; break;
5293 case MGN_MCS5: rateIndex = 17; break;
5294 case MGN_MCS6: rateIndex = 18; break;
5295 case MGN_MCS7: rateIndex = 19; break;
5296 case MGN_MCS8: rateIndex = 20; break;
5297 case MGN_MCS9: rateIndex = 21; break;
5298 case MGN_MCS10: rateIndex = 22; break;
5299 case MGN_MCS11: rateIndex = 23; break;
5300 case MGN_MCS12: rateIndex = 24; break;
5301 case MGN_MCS13: rateIndex = 25; break;
5302 case MGN_MCS14: rateIndex = 26; break;
5303 case MGN_MCS15: rateIndex = 27; break;
5304 default: rateIndex = 28; break;
5306 priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
5307 priv->stats.received_rate_histogram[0][rateIndex]++; //total
5308 priv->stats.received_rate_histogram[rcvType][rateIndex]++;
5312 void query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
5314 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5315 struct net_device *dev=info->dev;
5316 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5317 //rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5318 rx_drvinfo_819x_usb *driver_info = NULL;
5321 //Get Rx Descriptor Information
5323 #ifdef USB_RX_AGGREGATION_SUPPORT
5324 if (bIsRxAggrSubframe)
5326 rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
5327 stats->Length = desc->Length ;
5328 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
5329 stats->RxBufShift = 0; //RxBufShift = 2 in RxDesc, but usb didn't shift bytes in fact.
5330 stats->bICV = desc->ICV;
5331 stats->bCRC = desc->CRC32;
5332 stats->bHwError = stats->bCRC|stats->bICV;
5333 stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
5337 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5339 stats->Length = desc->Length;
5340 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
5341 stats->RxBufShift = 0;//desc->Shift&0x03;
5342 stats->bICV = desc->ICV;
5343 stats->bCRC = desc->CRC32;
5344 stats->bHwError = stats->bCRC|stats->bICV;
5345 //RTL8190 set this bit to indicate that Hw does not decrypt packet
5346 stats->Decrypted = !desc->SWDec;
5349 if((priv->ieee80211->pHTInfo->bCurrentHTSupport == true) && (priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP))
5351 stats->bHwError = false;
5355 stats->bHwError = stats->bCRC|stats->bICV;
5358 if(stats->Length < 24 || stats->Length > MAX_8192U_RX_SIZE)
5359 stats->bHwError |= 1;
5363 // TODO: Need to verify it on FGPA platform
5364 //Driver info are written to the RxBuffer following rx desc
5365 if (stats->RxDrvInfoSize != 0) {
5366 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
5370 if(!stats->bHwError){
5372 ret_rate = HwRateToMRate90(driver_info->RxHT, driver_info->RxRate);
5373 if(ret_rate == 0xff)
5375 // Abnormal Case: Receive CRC OK packet with Rx descriptor indicating non supported rate.
5376 // Special Error Handling here, 2008.05.16, by Emily
5378 stats->bHwError = 1;
5379 stats->rate = MGN_1M; //Set 1M rate by default
5382 stats->rate = ret_rate;
5388 stats->bShortPreamble = driver_info->SPLCP;
5391 UpdateReceivedRateHistogramStatistics8190(dev, stats);
5393 stats->bIsAMPDU = (driver_info->PartAggr==1);
5394 stats->bFirstMPDU = (driver_info->PartAggr==1) && (driver_info->FirstAGGR==1);
5395 stats->TimeStampLow = driver_info->TSFL;
5396 // xiong mask it, 070514
5397 //pRfd->Status.TimeStampHigh = PlatformEFIORead4Byte(Adapter, TSFR+4);
5398 // stats->TimeStampHigh = read_nic_dword(dev, TSFR+4);
5400 UpdateRxPktTimeStamp8190(dev, stats);
5405 if(driver_info->FirstAGGR==1 || driver_info->PartAggr == 1)
5406 RT_TRACE(COMP_RXDESC, "driver_info->FirstAGGR = %d, driver_info->PartAggr = %d\n",
5407 driver_info->FirstAGGR, driver_info->PartAggr);
5411 skb_pull(skb,sizeof(rx_desc_819x_usb));
5413 // Get Total offset of MPDU Frame Body
5415 if((stats->RxBufShift + stats->RxDrvInfoSize) > 0) {
5417 skb_pull(skb,stats->RxBufShift + stats->RxDrvInfoSize);
5420 #ifdef USB_RX_AGGREGATION_SUPPORT
5421 /* for the rx aggregated sub frame, the redundant space truelly contained in the packet */
5422 if(bIsRxAggrSubframe) {
5426 /* for debug 2008.5.29 */
5428 //added by vivi, for MP, 20080108
5429 stats->RxIs40MHzPacket = driver_info->BW;
5430 if(stats->RxDrvInfoSize != 0)
5431 TranslateRxSignalStuff819xUsb(skb, stats, driver_info);
5435 u32 GetRxPacketShiftBytes819xUsb(struct ieee80211_rx_stats *Status, bool bIsRxAggrSubframe)
5437 #ifdef USB_RX_AGGREGATION_SUPPORT
5438 if (bIsRxAggrSubframe)
5439 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
5440 + Status->RxBufShift + 8);
5443 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
5444 + Status->RxBufShift);
5447 void rtl8192_rx_nomal(struct sk_buff* skb)
5449 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5450 struct net_device *dev=info->dev;
5451 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5452 struct ieee80211_rx_stats stats = {
5456 // .mac_time = jiffies,
5457 .freq = IEEE80211_24GHZ_BAND,
5460 struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
5461 bool unicast_packet = false;
5462 #ifdef USB_RX_AGGREGATION_SUPPORT
5463 struct sk_buff *agg_skb = NULL;
5464 u32 TotalLength = 0;
5466 u32 PacketLength = 0;
5467 u32 PacketOccupiedLendth = 0;
5469 u32 PacketShiftBytes = 0;
5470 rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
5471 u8 PaddingBytes = 0;
5472 //add just for testing
5477 /* 20 is for ps-poll */
5478 if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
5479 #ifdef USB_RX_AGGREGATION_SUPPORT
5480 TempByte = *(skb->data + sizeof(rx_desc_819x_usb));
5482 /* first packet should not contain Rx aggregation header */
5483 query_rxdesc_status(skb, &stats, false);
5485 /* hardware related info */
5486 #ifdef USB_RX_AGGREGATION_SUPPORT
5487 if (TempByte & BIT0) {
5489 //TotalLength = agg_skb->len - 4; /*sCrcLng*/
5490 TotalLength = stats.Length - 4; /*sCrcLng*/
5491 //RT_TRACE(COMP_RECV, "%s:first aggregated packet!Length=%d\n",__FUNCTION__,TotalLength);
5492 /* though the head pointer has passed this position */
5493 TempDWord = *(u32 *)(agg_skb->data - 4);
5494 PacketLength = (u16)(TempDWord & 0x3FFF); /*sCrcLng*/
5495 skb = dev_alloc_skb(PacketLength);
5496 memcpy(skb_put(skb,PacketLength),agg_skb->data,PacketLength);
5497 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, false);
5500 /* Process the MPDU recevied */
5501 skb_trim(skb, skb->len - 4/*sCrcLng*/);
5503 rx_pkt_len = skb->len;
5504 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
5505 unicast_packet = false;
5506 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
5508 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
5511 /* unicast packet */
5512 unicast_packet = true;
5515 if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
5516 dev_kfree_skb_any(skb);
5518 priv->stats.rxoktotal++;
5519 if(unicast_packet) {
5520 priv->stats.rxbytesunicast += rx_pkt_len;
5523 #ifdef USB_RX_AGGREGATION_SUPPORT
5525 // (PipeIndex == 0) && (TempByte & BIT0) => TotalLength > 0.
5526 if (TotalLength > 0) {
5527 PacketOccupiedLendth = PacketLength + (PacketShiftBytes + 8);
5528 if ((PacketOccupiedLendth & 0xFF) != 0)
5529 PacketOccupiedLendth = (PacketOccupiedLendth & 0xFFFFFF00) + 256;
5530 PacketOccupiedLendth -= 8;
5531 TempDWord = PacketOccupiedLendth - PacketShiftBytes; /*- PacketLength */
5532 if (agg_skb->len > TempDWord)
5533 skb_pull(agg_skb, TempDWord);
5537 while (agg_skb->len>=GetRxPacketShiftBytes819xUsb(&stats, true)) {
5538 u8 tmpCRC = 0, tmpICV = 0;
5539 //RT_TRACE(COMP_RECV,"%s:aggred pkt,total_len = %d\n",__FUNCTION__,agg_skb->len);
5540 RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);
5541 tmpCRC = RxDescr->CRC32;
5542 tmpICV = RxDescr->ICV;
5543 memcpy(agg_skb->data, &agg_skb->data[44], 2);
5544 RxDescr->CRC32 = tmpCRC;
5545 RxDescr->ICV = tmpICV;
5547 memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
5551 stats.freq = IEEE80211_24GHZ_BAND;
5552 query_rxdesc_status(agg_skb, &stats, true);
5553 PacketLength = stats.Length;
5555 if(PacketLength > agg_skb->len) {
5558 /* Process the MPDU recevied */
5559 skb = dev_alloc_skb(PacketLength);
5560 memcpy(skb_put(skb,PacketLength),agg_skb->data, PacketLength);
5561 skb_trim(skb, skb->len - 4/*sCrcLng*/);
5563 rx_pkt_len = skb->len;
5564 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
5565 unicast_packet = false;
5566 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
5568 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
5571 /* unicast packet */
5572 unicast_packet = true;
5574 if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
5575 dev_kfree_skb_any(skb);
5577 priv->stats.rxoktotal++;
5578 if(unicast_packet) {
5579 priv->stats.rxbytesunicast += rx_pkt_len;
5582 /* should trim the packet which has been copied to target skb */
5583 skb_pull(agg_skb, PacketLength);
5584 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, true);
5585 PacketOccupiedLendth = PacketLength + PacketShiftBytes;
5586 if ((PacketOccupiedLendth & 0xFF) != 0) {
5587 PaddingBytes = 256 - (PacketOccupiedLendth & 0xFF);
5588 if (agg_skb->len > PaddingBytes)
5589 skb_pull(agg_skb, PaddingBytes);
5594 dev_kfree_skb(agg_skb);
5598 priv->stats.rxurberr++;
5599 printk("actual_length:%d\n", skb->len);
5600 dev_kfree_skb_any(skb);
5606 rtl819xusb_process_received_packet(
5607 struct net_device *dev,
5608 struct ieee80211_rx_stats *pstats
5611 // bool bfreerfd=false, bqueued=false;
5614 struct r8192_priv *priv = ieee80211_priv(dev);
5618 //PRX_TS_RECORD pts = NULL;
5620 // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
5621 //porting by amy 080508
5622 pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
5623 frame = pstats->virtual_address;
5624 frame_len = pstats->packetlength;
5625 #ifdef TODO // by amy about HCT
5626 if(!Adapter->bInHctTest)
5627 CountRxErrStatistics(Adapter, pRfd);
5630 #ifdef ENABLE_PS //by amy for adding ps function in future
5631 RT_RF_POWER_STATE rtState;
5632 // When RF is off, we should not count the packet for hw/sw synchronize
5633 // reason, ie. there may be a duration while sw switch is changed and hw
5634 // switch is being changed. 2006.12.04, by shien chang.
5635 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
5636 if (rtState == eRfOff)
5641 priv->stats.rxframgment++;
5645 RmMonitorSignalStrength(Adapter, pRfd);
5647 /* 2007/01/16 MH Add RX command packet handle here. */
5648 /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
5649 if (rtl819xusb_rx_command_packet(dev, pstats))
5661 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
5663 // rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5664 // struct net_device *dev=info->dev;
5665 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5666 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5667 // rx_drvinfo_819x_usb *driver_info;
5670 //Get Rx Descriptor Information
5672 stats->virtual_address = (u8*)skb->data;
5673 stats->Length = desc->Length;
5674 stats->RxDrvInfoSize = 0;
5675 stats->RxBufShift = 0;
5676 stats->packetlength = stats->Length-scrclng;
5677 stats->fraglength = stats->packetlength;
5678 stats->fragoffset = 0;
5679 stats->ntotalfrag = 1;
5683 void rtl8192_rx_cmd(struct sk_buff *skb)
5685 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5686 struct net_device *dev = info->dev;
5688 // struct urb *rx_urb = info->urb;
5690 struct ieee80211_rx_stats stats = {
5694 // .mac_time = jiffies,
5695 .freq = IEEE80211_24GHZ_BAND,
5698 if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE))
5701 query_rx_cmdpkt_desc_status(skb,&stats);
5702 // this is to be done by amy 080508 prfd->queue_id = 1;
5706 // Process the command packet received.
5709 rtl819xusb_process_received_packet(dev,&stats);
5711 dev_kfree_skb_any(skb);
5719 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
5721 struct sk_buff *skb;
5722 struct rtl8192_rx_info *info;
5724 while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
5725 info = (struct rtl8192_rx_info *)skb->cb;
5726 switch (info->out_pipe) {
5727 /* Nomal packet pipe */
5729 //RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
5730 priv->IrpPendingCount--;
5731 rtl8192_rx_nomal(skb);
5734 /* Command packet pipe */
5736 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
5739 rtl8192_rx_cmd(skb);
5742 default: /* should never get here! */
5743 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
5752 static const struct net_device_ops rtl8192_netdev_ops = {
5753 .ndo_open = rtl8192_open,
5754 .ndo_stop = rtl8192_close,
5755 .ndo_get_stats = rtl8192_stats,
5756 .ndo_tx_timeout = tx_timeout,
5757 .ndo_do_ioctl = rtl8192_ioctl,
5758 .ndo_set_multicast_list = r8192_set_multicast,
5759 .ndo_set_mac_address = r8192_set_mac_adr,
5760 .ndo_validate_addr = eth_validate_addr,
5761 .ndo_change_mtu = eth_change_mtu,
5762 .ndo_start_xmit = ieee80211_xmit,
5766 /****************************************************************************
5767 ---------------------------- USB_STUFF---------------------------
5768 *****************************************************************************/
5770 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
5771 const struct usb_device_id *id)
5773 // unsigned long ioaddr = 0;
5774 struct net_device *dev = NULL;
5775 struct r8192_priv *priv= NULL;
5776 struct usb_device *udev = interface_to_usbdev(intf);
5778 RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
5780 dev = alloc_ieee80211(sizeof(struct r8192_priv));
5784 usb_set_intfdata(intf, dev);
5785 SET_NETDEV_DEV(dev, &intf->dev);
5786 priv = ieee80211_priv(dev);
5787 priv->ieee80211 = netdev_priv(dev);
5790 dev->netdev_ops = &rtl8192_netdev_ops;
5792 //DMESG("Oops: i'm coming\n");
5793 #if WIRELESS_EXT >= 12
5794 #if WIRELESS_EXT < 17
5795 dev->get_wireless_stats = r8192_get_wireless_stats;
5797 dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
5799 dev->type=ARPHRD_ETHER;
5801 dev->watchdog_timeo = HZ*3; //modified by john, 0805
5803 if (dev_alloc_name(dev, ifname) < 0){
5804 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
5806 dev_alloc_name(dev, ifname);
5809 RT_TRACE(COMP_INIT, "Driver probe completed1\n");
5810 if(rtl8192_init(dev)!=0){
5811 RT_TRACE(COMP_ERR, "Initialization failed");
5815 netif_carrier_off(dev);
5816 netif_stop_queue(dev);
5818 ret = register_netdev(dev);
5822 RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
5823 rtl8192_proc_init_one(dev);
5826 RT_TRACE(COMP_INIT, "Driver probe completed\n");
5831 if (priv->pFirmware) {
5832 kfree(priv->pFirmware);
5833 priv->pFirmware = NULL;
5835 rtl8192_usb_deleteendpoints(dev);
5836 destroy_workqueue(priv->priv_wq);
5839 free_ieee80211(dev);
5841 RT_TRACE(COMP_ERR, "wlan driver load failed\n");
5845 //detach all the work and timer structure declared or inititialize in r8192U_init function.
5846 void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
5849 cancel_work_sync(&priv->reset_wq);
5850 cancel_delayed_work(&priv->watch_dog_wq);
5851 cancel_delayed_work(&priv->update_beacon_wq);
5852 cancel_work_sync(&priv->qos_activate);
5853 //cancel_work_sync(&priv->SetBWModeWorkItem);
5854 //cancel_work_sync(&priv->SwChnlWorkItem);
5859 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf)
5861 struct net_device *dev = usb_get_intfdata(intf);
5863 struct r8192_priv *priv = ieee80211_priv(dev);
5866 unregister_netdev(dev);
5868 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
5869 rtl8192_proc_remove_one(dev);
5872 if (priv->pFirmware)
5874 kfree(priv->pFirmware);
5875 priv->pFirmware = NULL;
5877 // priv->rf_close(dev);
5878 // rtl8192_SetRFPowerState(dev, eRfOff);
5879 rtl8192_usb_deleteendpoints(dev);
5880 destroy_workqueue(priv->priv_wq);
5881 //rtl8192_irq_disable(dev);
5882 //rtl8192_reset(dev);
5886 free_ieee80211(dev);
5887 RT_TRACE(COMP_DOWN, "wlan driver removed\n");
5890 /* fun with the built-in ieee80211 stack... */
5891 extern int ieee80211_debug_init(void);
5892 extern void ieee80211_debug_exit(void);
5893 extern int ieee80211_crypto_init(void);
5894 extern void ieee80211_crypto_deinit(void);
5895 extern int ieee80211_crypto_tkip_init(void);
5896 extern void ieee80211_crypto_tkip_exit(void);
5897 extern int ieee80211_crypto_ccmp_init(void);
5898 extern void ieee80211_crypto_ccmp_exit(void);
5899 extern int ieee80211_crypto_wep_init(void);
5900 extern void ieee80211_crypto_wep_exit(void);
5902 static int __init rtl8192_usb_module_init(void)
5906 #ifdef CONFIG_IEEE80211_DEBUG
5907 ret = ieee80211_debug_init();
5909 printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
5913 ret = ieee80211_crypto_init();
5915 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
5919 ret = ieee80211_crypto_tkip_init();
5921 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
5926 ret = ieee80211_crypto_ccmp_init();
5928 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
5933 ret = ieee80211_crypto_wep_init();
5935 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
5939 printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
5940 printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
5941 RT_TRACE(COMP_INIT, "Initializing module");
5942 RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
5943 rtl8192_proc_module_init();
5944 return usb_register(&rtl8192_usb_driver);
5948 static void __exit rtl8192_usb_module_exit(void)
5950 usb_deregister(&rtl8192_usb_driver);
5952 RT_TRACE(COMP_DOWN, "Exiting");
5953 // rtl8192_proc_module_remove();
5957 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
5959 unsigned long flags;
5961 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5963 spin_lock_irqsave(&priv->tx_lock,flags);
5964 enough_desc = check_nic_enough_desc(dev,pri);
5965 spin_unlock_irqrestore(&priv->tx_lock,flags);
5968 ieee80211_wake_queue(priv->ieee80211);
5971 void EnableHWSecurityConfig8192(struct net_device *dev)
5973 u8 SECR_value = 0x0;
5974 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5975 struct ieee80211_device* ieee = priv->ieee80211;
5976 SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
5977 if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
5979 SECR_value |= SCR_RxUseDK;
5980 SECR_value |= SCR_TxUseDK;
5982 else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
5984 SECR_value |= SCR_RxUseDK;
5985 SECR_value |= SCR_TxUseDK;
5987 //add HWSec active enable here.
5988 //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
5990 ieee->hwsec_active = 1;
5992 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
5994 ieee->hwsec_active = 0;
5995 SECR_value &= ~SCR_RxDecEnable;
5997 RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__, \
5998 ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
6000 write_nic_byte(dev, SECR, SECR_value);//SECR_value | SCR_UseDK );
6005 void setKey( struct net_device *dev,
6013 u32 TargetCommand = 0;
6014 u32 TargetContent = 0;
6017 if (EntryNo >= TOTAL_CAM_ENTRY)
6018 RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
6020 RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", dev,EntryNo, KeyIndex, KeyType, MacAddr);
6023 usConfig |= BIT15 | (KeyType<<2);
6025 usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
6026 // usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
6029 for(i=0 ; i<CAM_CONTENT_COUNT; i++){
6030 TargetCommand = i+CAM_CONTENT_COUNT*EntryNo;
6031 TargetCommand |= BIT31|BIT16;
6033 if(i==0){//MAC|Config
6034 TargetContent = (u32)(*(MacAddr+0)) << 16|
6035 (u32)(*(MacAddr+1)) << 24|
6038 write_nic_dword(dev, WCAMI, TargetContent);
6039 write_nic_dword(dev, RWCAM, TargetCommand);
6040 // printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
6043 TargetContent = (u32)(*(MacAddr+2)) |
6044 (u32)(*(MacAddr+3)) << 8|
6045 (u32)(*(MacAddr+4)) << 16|
6046 (u32)(*(MacAddr+5)) << 24;
6047 write_nic_dword(dev, WCAMI, TargetContent);
6048 write_nic_dword(dev, RWCAM, TargetCommand);
6052 if(KeyContent !=NULL){
6053 write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
6054 write_nic_dword(dev, RWCAM, TargetCommand);
6061 /***************************************************************************
6062 ------------------- module init / exit stubs ----------------
6063 ****************************************************************************/
6064 module_init(rtl8192_usb_module_init);
6065 module_exit(rtl8192_usb_module_exit);