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 #include <linux/vmalloc.h>
28 #include <linux/slab.h>
29 #include <linux/notifier.h>
35 #undef RX_DONT_PASS_UL
37 #undef DEBUG_RX_VERBOSE
43 #undef DEBUG_TX_FILLDESC
48 #undef DEBUG_REGISTERS
50 #undef DEBUG_IRQ_TASKLET
54 #define CONFIG_RTL8192_IO_MAP
56 #include <asm/uaccess.h>
58 #include "r8180_93cx6.h" /* Card EEPROM */
59 #include "r8192U_wx.h"
61 #include "r8192S_rtl8225.h"
62 #include "r8192S_hw.h"
63 #include "r8192S_phy.h"
64 #include "r8192S_phyreg.h"
65 #include "r8192S_Efuse.h"
67 #include "r819xU_cmdpkt.h"
68 #include "r8192U_dm.h"
69 //#include "r8192xU_phyreg.h"
70 #include <linux/usb.h>
72 #include "r8192U_pm.h"
74 #include "ieee80211/dot11d.h"
78 u32 rt_global_debug_component = \
110 COMP_ERR; //always open err flags on
112 #define TOTAL_CAM_ENTRY 32
113 #define CAM_CONTENT_COUNT 8
115 static const struct usb_device_id rtl8192_usb_id_tbl[] = {
117 {USB_DEVICE(0x0bda, 0x8171)},
118 {USB_DEVICE(0x0bda, 0x8192)},
119 {USB_DEVICE(0x0bda, 0x8709)},
121 {USB_DEVICE(0x07aa, 0x0043)},
123 {USB_DEVICE(0x050d, 0x805E)},
124 {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */
126 {USB_DEVICE(0x0df6, 0x0031)},
127 {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */
129 {USB_DEVICE(0x1740, 0x9201)},
131 {USB_DEVICE(0x2001, 0x3301)},
133 {USB_DEVICE(0x5a57, 0x0290)},
135 {USB_DEVICE(0x06f8, 0xe031)},
137 {USB_DEVICE(0x0bda, 0x8172)},
141 MODULE_LICENSE("GPL");
142 MODULE_VERSION("V 1.1");
143 MODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
144 MODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
146 static char* ifname = "wlan%d";
147 static int hwwep = 1; //default use hw. set 0 to use software security
148 static int channels = 0x3fff;
152 module_param(ifname, charp, S_IRUGO|S_IWUSR );
153 //module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
154 module_param(hwwep,int, S_IRUGO|S_IWUSR);
155 module_param(channels,int, S_IRUGO|S_IWUSR);
157 MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
158 //MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
159 MODULE_PARM_DESC(hwwep," Try to use hardware security support. ");
160 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
162 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
163 const struct usb_device_id *id);
164 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf);
165 static const struct net_device_ops rtl8192_netdev_ops;
166 static struct notifier_block proc_netdev_notifier;
168 static struct usb_driver rtl8192_usb_driver = {
169 .name = RTL819xU_MODULE_NAME, /* Driver name */
170 .id_table = rtl8192_usb_id_tbl, /* PCI_ID table */
171 .probe = rtl8192_usb_probe, /* probe fn */
172 .disconnect = rtl8192_usb_disconnect, /* remove fn */
173 .suspend = rtl8192U_suspend, /* PM suspend fn */
174 .resume = rtl8192U_resume, /* PM resume fn */
175 .reset_resume = rtl8192U_resume, /* PM reset resume fn */
179 static void rtl8192SU_read_eeprom_info(struct net_device *dev);
180 short rtl8192SU_tx(struct net_device *dev, struct sk_buff* skb);
181 void rtl8192SU_rx_nomal(struct sk_buff* skb);
182 void rtl8192SU_rx_cmd(struct sk_buff *skb);
183 bool rtl8192SU_adapter_start(struct net_device *dev);
184 short rtl8192SU_tx_cmd(struct net_device *dev, struct sk_buff *skb);
185 void rtl8192SU_link_change(struct net_device *dev);
186 void InitialGain8192S(struct net_device *dev,u8 Operation);
187 void rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe);
189 struct rtl819x_ops rtl8192su_ops = {
190 .nic_type = NIC_8192SU,
191 .rtl819x_read_eeprom_info = rtl8192SU_read_eeprom_info,
192 .rtl819x_tx = rtl8192SU_tx,
193 .rtl819x_tx_cmd = rtl8192SU_tx_cmd,
194 .rtl819x_rx_nomal = rtl8192SU_rx_nomal,
195 .rtl819x_rx_cmd = rtl8192SU_rx_cmd,
196 .rtl819x_adapter_start = rtl8192SU_adapter_start,
197 .rtl819x_link_change = rtl8192SU_link_change,
198 .rtl819x_initial_gain = InitialGain8192S,
199 .rtl819x_query_rxdesc_status = rtl8192SU_query_rxdesc_status,
203 typedef struct _CHANNEL_LIST
207 }CHANNEL_LIST, *PCHANNEL_LIST;
209 static CHANNEL_LIST ChannelPlan[] = {
210 {{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
211 {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
212 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
213 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Spain. Change to ETSI.
214 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //France. Change to ETSI.
215 {{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
216 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
217 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Israel.
218 {{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
219 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22}, //MIC
220 {{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
223 static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
225 int i, max_chan=-1, min_chan=-1;
226 struct ieee80211_device* ieee = priv->ieee80211;
227 switch (channel_plan)
229 case COUNTRY_CODE_FCC:
230 case COUNTRY_CODE_IC:
231 case COUNTRY_CODE_ETSI:
232 case COUNTRY_CODE_SPAIN:
233 case COUNTRY_CODE_FRANCE:
234 case COUNTRY_CODE_MKK:
235 case COUNTRY_CODE_MKK1:
236 case COUNTRY_CODE_ISRAEL:
237 case COUNTRY_CODE_TELEC:
238 case COUNTRY_CODE_MIC:
241 ieee->bGlobalDomain = false;
242 //acturally 8225 & 8256 rf chip only support B,G,24N mode
243 if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256) || (priv->rf_chip == RF_6052))
250 RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
252 if (ChannelPlan[channel_plan].Len != 0){
253 // Clear old channel map
254 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
255 // Set new channel map
256 for (i=0;i<ChannelPlan[channel_plan].Len;i++)
258 if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
260 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
265 case COUNTRY_CODE_GLOBAL_DOMAIN:
267 GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
269 ieee->bGlobalDomain = true;
278 #define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
280 #define rx_hal_is_cck_rate(_pDesc)\
281 ((_pDesc->RxMCS == DESC92S_RATE1M ||\
282 _pDesc->RxMCS == DESC92S_RATE2M ||\
283 _pDesc->RxMCS == DESC92S_RATE5_5M ||\
284 _pDesc->RxMCS == DESC92S_RATE11M) &&\
287 #define tx_hal_is_cck_rate(_DataRate)\
288 ( _DataRate == MGN_1M ||\
289 _DataRate == MGN_2M ||\
290 _DataRate == MGN_5_5M ||\
291 _DataRate == MGN_11M )
296 void CamResetAllEntry(struct net_device *dev)
300 //2004/02/11 In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
301 // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
302 // In this condition, Cam can not be reset because upper layer will not set this static key again.
303 //if(Adapter->EncAlgorithm == WEP_Encryption)
306 //DbgPrint("========================================\n");
307 //DbgPrint(" Call ResetAllEntry \n");
308 //DbgPrint("========================================\n\n");
309 ulcommand |= BIT31|BIT30;
310 write_nic_dword(dev, RWCAM, ulcommand);
312 for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
313 CAM_mark_invalid(dev, ucIndex);
314 for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
315 CAM_empty_entry(dev, ucIndex);
321 void write_cam(struct net_device *dev, u8 addr, u32 data)
323 write_nic_dword(dev, WCAMI, data);
324 write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
327 u32 read_cam(struct net_device *dev, u8 addr)
329 write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
330 return read_nic_dword(dev, 0xa8);
333 void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
336 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
337 struct usb_device *udev = priv->udev;
339 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
340 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
341 indx|0xfe00, 0, &data, 1, HZ / 2);
345 printk("write_nic_byte_E TimeOut! status:%d\n", status);
349 u8 read_nic_byte_E(struct net_device *dev, int indx)
353 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
354 struct usb_device *udev = priv->udev;
356 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
357 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
358 indx|0xfe00, 0, &data, 1, HZ / 2);
362 printk("read_nic_byte_E TimeOut! status:%d\n", status);
367 //as 92U has extend page from 4 to 16, so modify functions below.
368 void write_nic_byte(struct net_device *dev, int indx, u8 data)
372 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
373 struct usb_device *udev = priv->udev;
375 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
376 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
377 indx, 0, &data, 1, HZ / 2);
381 printk("write_nic_byte TimeOut! status:%d\n", status);
388 void write_nic_word(struct net_device *dev, int indx, u16 data)
393 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
394 struct usb_device *udev = priv->udev;
396 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
397 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
398 indx, 0, &data, 2, HZ / 2);
402 printk("write_nic_word TimeOut! status:%d\n", status);
408 void write_nic_dword(struct net_device *dev, int indx, u32 data)
413 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
414 struct usb_device *udev = priv->udev;
416 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
417 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
418 indx, 0, &data, 4, HZ / 2);
423 printk("write_nic_dword TimeOut! status:%d\n", status);
430 u8 read_nic_byte(struct net_device *dev, int indx)
434 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
435 struct usb_device *udev = priv->udev;
437 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
438 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
439 indx, 0, &data, 1, HZ / 2);
443 printk("read_nic_byte TimeOut! status:%d\n", status);
451 u16 read_nic_word(struct net_device *dev, int indx)
455 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
456 struct usb_device *udev = priv->udev;
458 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
459 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
460 indx, 0, &data, 2, HZ / 2);
464 printk("read_nic_word TimeOut! status:%d\n", status);
471 u16 read_nic_word_E(struct net_device *dev, int indx)
475 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
476 struct usb_device *udev = priv->udev;
478 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
479 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
480 indx|0xfe00, 0, &data, 2, HZ / 2);
484 printk("read_nic_word TimeOut! status:%d\n", status);
491 u32 read_nic_dword(struct net_device *dev, int indx)
497 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
498 struct usb_device *udev = priv->udev;
500 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
501 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
502 indx, 0, &data, 4, HZ / 2);
504 // printk(KERN_WARNING "read size of data = %d\, date = %d\n", result, data);
509 printk("read_nic_dword TimeOut! status:%d\n", status);
510 if(status == -ENODEV) {
511 priv->usb_error = true;
521 //u8 read_phy_cck(struct net_device *dev, u8 adr);
522 //u8 read_phy_ofdm(struct net_device *dev, u8 adr);
523 /* this might still called in what was the PHY rtl8185/rtl8192 common code
524 * plans are to possibilty turn it again in one common code...
526 inline void force_pci_posting(struct net_device *dev)
531 static struct net_device_stats *rtl8192_stats(struct net_device *dev);
532 void rtl8192_commit(struct net_device *dev);
533 //void rtl8192_restart(struct net_device *dev);
534 void rtl8192_restart(struct work_struct *work);
535 //void rtl8192_rq_tx_ack(struct work_struct *work);
537 void watch_dog_timer_callback(unsigned long data);
539 /****************************************************************************
540 -----------------------------PROCFS STUFF-------------------------
541 *****************************************************************************/
543 static struct proc_dir_entry *rtl8192_proc = NULL;
547 static int proc_get_stats_ap(char *page, char **start,
548 off_t offset, int count,
549 int *eof, void *data)
551 struct net_device *dev = data;
552 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
553 struct ieee80211_device *ieee = priv->ieee80211;
554 struct ieee80211_network *target;
558 list_for_each_entry(target, &ieee->network_list, list) {
560 len += snprintf(page + len, count - len,
561 "%s ", target->ssid);
563 if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
564 len += snprintf(page + len, count - len,
568 len += snprintf(page + len, count - len,
578 static int proc_get_registers(char *page, char **start,
579 off_t offset, int count,
580 int *eof, void *data)
582 struct net_device *dev = data;
583 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
586 int i,n,page0,page1,page2;
593 /* This dump the current register page */
594 if(!IS_BB_REG_OFFSET_92S(page0)){
595 len += snprintf(page + len, count - len,
596 "\n####################page %x##################\n ", (page0>>8));
599 len += snprintf(page + len, count - len,
601 for(i=0;i<16 && n<=max;i++,n++)
602 len += snprintf(page + len, count - len,
603 "%2.2x ",read_nic_byte(dev,(page0|n)));
606 len += snprintf(page + len, count - len,
607 "\n####################page %x##################\n ", (page0>>8));
610 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
611 for(i=0;i<4 && n<=max;n+=4,i++)
612 len += snprintf(page + len, count - len,
613 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
616 len += snprintf(page + len, count - len,"\n");
621 static int proc_get_registers_1(char *page, char **start,
622 off_t offset, int count,
623 int *eof, void *data)
625 struct net_device *dev = data;
626 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
634 /* This dump the current register page */
635 len += snprintf(page + len, count - len,
636 "\n####################page %x##################\n ", (page0>>8));
639 len += snprintf(page + len, count - len,
641 for(i=0;i<16 && n<=max;i++,n++)
642 len += snprintf(page + len, count - len,
643 "%2.2x ",read_nic_byte(dev,(page0|n)));
645 len += snprintf(page + len, count - len,"\n");
650 static int proc_get_registers_2(char *page, char **start,
651 off_t offset, int count,
652 int *eof, void *data)
654 struct net_device *dev = data;
655 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
663 /* This dump the current register page */
664 len += snprintf(page + len, count - len,
665 "\n####################page %x##################\n ", (page0>>8));
668 len += snprintf(page + len, count - len,
670 for(i=0;i<16 && n<=max;i++,n++)
671 len += snprintf(page + len, count - len,
672 "%2.2x ",read_nic_byte(dev,(page0|n)));
674 len += snprintf(page + len, count - len,"\n");
679 static int proc_get_registers_8(char *page, char **start,
680 off_t offset, int count,
681 int *eof, void *data)
683 struct net_device *dev = data;
691 /* This dump the current register page */
692 len += snprintf(page + len, count - len,
693 "\n####################page %x##################\n ", (page0>>8));
696 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
697 for(i=0;i<4 && n<=max;n+=4,i++)
698 len += snprintf(page + len, count - len,
699 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
701 len += snprintf(page + len, count - len,"\n");
706 static int proc_get_registers_9(char *page, char **start,
707 off_t offset, int count,
708 int *eof, void *data)
710 struct net_device *dev = data;
711 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
719 /* This dump the current register page */
720 len += snprintf(page + len, count - len,
721 "\n####################page %x##################\n ", (page0>>8));
724 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
725 for(i=0;i<4 && n<=max;n+=4,i++)
726 len += snprintf(page + len, count - len,
727 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
729 len += snprintf(page + len, count - len,"\n");
733 static int proc_get_registers_a(char *page, char **start,
734 off_t offset, int count,
735 int *eof, void *data)
737 struct net_device *dev = data;
738 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
746 /* This dump the current register page */
747 len += snprintf(page + len, count - len,
748 "\n####################page %x##################\n ", (page0>>8));
751 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
752 for(i=0;i<4 && n<=max;n+=4,i++)
753 len += snprintf(page + len, count - len,
754 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
756 len += snprintf(page + len, count - len,"\n");
760 static int proc_get_registers_b(char *page, char **start,
761 off_t offset, int count,
762 int *eof, void *data)
764 struct net_device *dev = data;
765 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
773 /* This dump the current register page */
774 len += snprintf(page + len, count - len,
775 "\n####################page %x##################\n ", (page0>>8));
778 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
779 for(i=0;i<4 && n<=max;n+=4,i++)
780 len += snprintf(page + len, count - len,
781 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
783 len += snprintf(page + len, count - len,"\n");
787 static int proc_get_registers_c(char *page, char **start,
788 off_t offset, int count,
789 int *eof, void *data)
791 struct net_device *dev = data;
792 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
800 /* This dump the current register page */
801 len += snprintf(page + len, count - len,
802 "\n####################page %x##################\n ", (page0>>8));
805 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
806 for(i=0;i<4 && n<=max;n+=4,i++)
807 len += snprintf(page + len, count - len,
808 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
810 len += snprintf(page + len, count - len,"\n");
814 static int proc_get_registers_d(char *page, char **start,
815 off_t offset, int count,
816 int *eof, void *data)
818 struct net_device *dev = data;
819 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
827 /* This dump the current register page */
828 len += snprintf(page + len, count - len,
829 "\n####################page %x##################\n ", (page0>>8));
832 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
833 for(i=0;i<4 && n<=max;n+=4,i++)
834 len += snprintf(page + len, count - len,
835 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
837 len += snprintf(page + len, count - len,"\n");
841 static int proc_get_registers_e(char *page, char **start,
842 off_t offset, int count,
843 int *eof, void *data)
845 struct net_device *dev = data;
846 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
854 /* This dump the current register page */
855 len += snprintf(page + len, count - len,
856 "\n####################page %x##################\n ", (page0>>8));
859 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
860 for(i=0;i<4 && n<=max;n+=4,i++)
861 len += snprintf(page + len, count - len,
862 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
864 len += snprintf(page + len, count - len,"\n");
869 static int proc_get_stats_tx(char *page, char **start,
870 off_t offset, int count,
871 int *eof, void *data)
873 struct net_device *dev = data;
874 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
878 len += snprintf(page + len, count - len,
879 "TX VI priority ok int: %lu\n"
880 "TX VI priority error int: %lu\n"
881 "TX VO priority ok int: %lu\n"
882 "TX VO priority error int: %lu\n"
883 "TX BE priority ok int: %lu\n"
884 "TX BE priority error int: %lu\n"
885 "TX BK priority ok int: %lu\n"
886 "TX BK priority error int: %lu\n"
887 "TX MANAGE priority ok int: %lu\n"
888 "TX MANAGE priority error int: %lu\n"
889 "TX BEACON priority ok int: %lu\n"
890 "TX BEACON priority error int: %lu\n"
891 // "TX high priority ok int: %lu\n"
892 // "TX high priority failed error int: %lu\n"
893 "TX queue resume: %lu\n"
894 "TX queue stopped?: %d\n"
895 "TX fifo overflow: %lu\n"
896 // "TX beacon: %lu\n"
901 // "TX HW queue: %d\n"
902 "TX VI dropped: %lu\n"
903 "TX VO dropped: %lu\n"
904 "TX BE dropped: %lu\n"
905 "TX BK dropped: %lu\n"
906 "TX total data packets %lu\n",
907 // "TX beacon aborted: %lu\n",
908 priv->stats.txviokint,
910 priv->stats.txvookint,
912 priv->stats.txbeokint,
914 priv->stats.txbkokint,
916 priv->stats.txmanageokint,
917 priv->stats.txmanageerr,
918 priv->stats.txbeaconokint,
919 priv->stats.txbeaconerr,
920 // priv->stats.txhpokint,
921 // priv->stats.txhperr,
922 priv->stats.txresumed,
923 netif_queue_stopped(dev),
924 priv->stats.txoverflow,
925 // priv->stats.txbeacon,
926 atomic_read(&(priv->tx_pending[VI_PRIORITY])),
927 atomic_read(&(priv->tx_pending[VO_PRIORITY])),
928 atomic_read(&(priv->tx_pending[BE_PRIORITY])),
929 atomic_read(&(priv->tx_pending[BK_PRIORITY])),
930 // read_nic_byte(dev, TXFIFOCOUNT),
931 priv->stats.txvidrop,
932 priv->stats.txvodrop,
933 priv->stats.txbedrop,
934 priv->stats.txbkdrop,
935 priv->stats.txdatapkt
936 // priv->stats.txbeaconerr
945 static int proc_get_stats_rx(char *page, char **start,
946 off_t offset, int count,
947 int *eof, void *data)
949 struct net_device *dev = data;
950 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
954 len += snprintf(page + len, count - len,
956 "RX urb status error: %lu\n"
957 "RX invalid urb error: %lu\n",
958 priv->stats.rxoktotal,
959 priv->stats.rxstaterr,
960 priv->stats.rxurberr);
966 int rtl8192_proc_module_init(void)
970 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
971 rtl8192_proc=create_proc_entry(RTL819xU_MODULE_NAME, S_IFDIR, init_net.proc_net);
974 ret = register_netdevice_notifier(&proc_netdev_notifier);
976 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
981 void rtl8192_proc_module_remove(void)
983 unregister_netdevice_notifier(&proc_netdev_notifier);
984 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
988 void rtl8192_proc_remove_one(struct net_device *dev)
990 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
994 // remove_proc_entry("stats-hw", priv->dir_dev);
995 remove_proc_entry("stats-tx", priv->dir_dev);
996 remove_proc_entry("stats-rx", priv->dir_dev);
997 // remove_proc_entry("stats-ieee", priv->dir_dev);
998 remove_proc_entry("stats-ap", priv->dir_dev);
999 remove_proc_entry("registers", priv->dir_dev);
1000 remove_proc_entry("registers-1", priv->dir_dev);
1001 remove_proc_entry("registers-2", priv->dir_dev);
1002 remove_proc_entry("registers-8", priv->dir_dev);
1003 remove_proc_entry("registers-9", priv->dir_dev);
1004 remove_proc_entry("registers-a", priv->dir_dev);
1005 remove_proc_entry("registers-b", priv->dir_dev);
1006 remove_proc_entry("registers-c", priv->dir_dev);
1007 remove_proc_entry("registers-d", priv->dir_dev);
1008 remove_proc_entry("registers-e", priv->dir_dev);
1009 // remove_proc_entry("cck-registers",priv->dir_dev);
1010 // remove_proc_entry("ofdm-registers",priv->dir_dev);
1011 remove_proc_entry(priv->dir_dev->name, rtl8192_proc);
1012 priv->dir_dev = NULL;
1017 void rtl8192_proc_init_one(struct net_device *dev)
1019 struct proc_dir_entry *e;
1020 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1021 priv->dir_dev = create_proc_entry(dev->name,
1022 S_IFDIR | S_IRUGO | S_IXUGO,
1024 if (!priv->dir_dev) {
1025 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
1029 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
1030 priv->dir_dev, proc_get_stats_rx, dev);
1033 RT_TRACE(COMP_ERR,"Unable to initialize "
1034 "/proc/net/rtl8192/%s/stats-rx\n",
1039 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
1040 priv->dir_dev, proc_get_stats_tx, dev);
1043 RT_TRACE(COMP_ERR, "Unable to initialize "
1044 "/proc/net/rtl8192/%s/stats-tx\n",
1048 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
1049 priv->dir_dev, proc_get_stats_ap, dev);
1052 RT_TRACE(COMP_ERR, "Unable to initialize "
1053 "/proc/net/rtl8192/%s/stats-ap\n",
1057 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
1058 priv->dir_dev, proc_get_registers, dev);
1060 RT_TRACE(COMP_ERR, "Unable to initialize "
1061 "/proc/net/rtl8192/%s/registers\n",
1064 e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
1065 priv->dir_dev, proc_get_registers_1, dev);
1067 RT_TRACE(COMP_ERR, "Unable to initialize "
1068 "/proc/net/rtl8192/%s/registers-1\n",
1071 e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
1072 priv->dir_dev, proc_get_registers_2, dev);
1074 RT_TRACE(COMP_ERR, "Unable to initialize "
1075 "/proc/net/rtl8192/%s/registers-2\n",
1078 e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
1079 priv->dir_dev, proc_get_registers_8, dev);
1081 RT_TRACE(COMP_ERR, "Unable to initialize "
1082 "/proc/net/rtl8192/%s/registers-8\n",
1085 e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
1086 priv->dir_dev, proc_get_registers_9, dev);
1088 RT_TRACE(COMP_ERR, "Unable to initialize "
1089 "/proc/net/rtl8192/%s/registers-9\n",
1092 e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
1093 priv->dir_dev, proc_get_registers_a, dev);
1095 RT_TRACE(COMP_ERR, "Unable to initialize "
1096 "/proc/net/rtl8192/%s/registers-a\n",
1099 e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
1100 priv->dir_dev, proc_get_registers_b, dev);
1102 RT_TRACE(COMP_ERR, "Unable to initialize "
1103 "/proc/net/rtl8192/%s/registers-b\n",
1106 e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
1107 priv->dir_dev, proc_get_registers_c, dev);
1109 RT_TRACE(COMP_ERR, "Unable to initialize "
1110 "/proc/net/rtl8192/%s/registers-c\n",
1113 e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
1114 priv->dir_dev, proc_get_registers_d, dev);
1116 RT_TRACE(COMP_ERR, "Unable to initialize "
1117 "/proc/net/rtl8192/%s/registers-d\n",
1120 e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
1121 priv->dir_dev, proc_get_registers_e, dev);
1123 RT_TRACE(COMP_ERR, "Unable to initialize "
1124 "/proc/net/rtl8192/%s/registers-e\n",
1129 static int proc_netdev_event(struct notifier_block *this,
1130 unsigned long event, void *ptr)
1132 struct net_device *net_dev = ptr;
1134 if (net_dev->netdev_ops == &rtl8192_netdev_ops &&
1135 event == NETDEV_CHANGENAME) {
1136 rtl8192_proc_remove_one(net_dev);
1137 rtl8192_proc_init_one(net_dev);
1143 static struct notifier_block proc_netdev_notifier = {
1144 .notifier_call = proc_netdev_event,
1147 /****************************************************************************
1148 -----------------------------MISC STUFF-------------------------
1149 *****************************************************************************/
1151 /* this is only for debugging */
1152 void print_buffer(u32 *buffer, int len)
1155 u8 *buf =(u8*)buffer;
1157 printk("ASCII BUFFER DUMP (len: %x):\n",len);
1160 printk("%c",buf[i]);
1162 printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
1165 printk("%x",buf[i]);
1170 //short check_nic_enough_desc(struct net_device *dev, priority_t priority)
1171 short check_nic_enough_desc(struct net_device *dev,int queue_index)
1173 struct r8192_priv *priv = ieee80211_priv(dev);
1174 int used = atomic_read(&priv->tx_pending[queue_index]);
1176 return (used < MAX_TX_URB);
1179 void tx_timeout(struct net_device *dev)
1181 struct r8192_priv *priv = ieee80211_priv(dev);
1182 //rtl8192_commit(dev);
1184 schedule_work(&priv->reset_wq);
1185 //DMESG("TXTIMEOUT");
1189 /* this is only for debug */
1190 void dump_eprom(struct net_device *dev)
1194 RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev,i));
1197 /* this is only for debug */
1198 void rtl8192_dump_reg(struct net_device *dev)
1204 RT_TRACE(COMP_PHY, "Dumping NIC register map");
1208 printk( "\nD: %2x> ", n);
1209 for(i=0;i<16 && n<=max;i++,n++)
1210 printk("%2x ",read_nic_byte(dev,n));
1215 /****************************************************************************
1216 ------------------------------HW STUFF---------------------------
1217 *****************************************************************************/
1219 void rtl8192_set_mode(struct net_device *dev,int mode)
1222 ecmd=read_nic_byte(dev, EPROM_CMD);
1223 ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
1224 ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
1225 ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
1226 ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
1227 write_nic_byte(dev, EPROM_CMD, ecmd);
1231 void rtl8192_update_msr(struct net_device *dev)
1233 struct r8192_priv *priv = ieee80211_priv(dev);
1236 msr = read_nic_byte(dev, MSR);
1237 msr &= ~ MSR_LINK_MASK;
1239 /* do not change in link_state != WLAN_LINK_ASSOCIATED.
1240 * msr must be updated if the state is ASSOCIATING.
1241 * this is intentional and make sense for ad-hoc and
1242 * master (see the create BSS/IBSS func)
1244 if (priv->ieee80211->state == IEEE80211_LINKED){
1246 if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
1247 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
1248 else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1249 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
1250 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
1251 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
1254 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
1256 write_nic_byte(dev, MSR, msr);
1259 void rtl8192_set_chan(struct net_device *dev,short ch)
1261 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1263 RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
1264 //printk("=====>%s()====ch:%d\n", __FUNCTION__, ch);
1267 /* this hack should avoid frame TX during channel setting*/
1270 // tx = read_nic_dword(dev,TX_CONF);
1271 // tx &= ~TX_LOOPBACK_MASK;
1274 // write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
1276 //need to implement rf set channel here WB
1278 if (priv->rf_set_chan)
1279 priv->rf_set_chan(dev,priv->chan);
1281 // write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
1285 static void rtl8192_rx_isr(struct urb *urb);
1287 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
1290 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
1291 + pstats->RxBufShift);
1294 static int rtl8192_rx_initiate(struct net_device*dev)
1296 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1298 struct sk_buff *skb;
1299 struct rtl8192_rx_info *info;
1301 /* nomal packet rx procedure */
1302 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
1303 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
1306 entry = usb_alloc_urb(0, GFP_KERNEL);
1311 usb_fill_bulk_urb(entry, priv->udev,
1312 usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
1313 RX_URB_SIZE, rtl8192_rx_isr, skb);
1314 info = (struct rtl8192_rx_info *) skb->cb;
1317 info->out_pipe = 3; //denote rx normal packet queue
1318 skb_queue_tail(&priv->rx_queue, skb);
1319 usb_submit_urb(entry, GFP_KERNEL);
1322 /* command packet rx procedure */
1323 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
1324 skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
1327 entry = usb_alloc_urb(0, GFP_KERNEL);
1332 usb_fill_bulk_urb(entry, priv->udev,
1333 usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
1334 RX_URB_SIZE, rtl8192_rx_isr, skb);
1335 info = (struct rtl8192_rx_info *) skb->cb;
1338 info->out_pipe = 9; //denote rx cmd packet queue
1339 skb_queue_tail(&priv->rx_queue, skb);
1340 usb_submit_urb(entry, GFP_KERNEL);
1346 void rtl8192_set_rxconf(struct net_device *dev)
1348 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1351 rxconf=read_nic_dword(dev,RCR);
1352 rxconf = rxconf &~ MAC_FILTER_MASK;
1353 rxconf = rxconf | RCR_AMF;
1354 rxconf = rxconf | RCR_ADF;
1355 rxconf = rxconf | RCR_AB;
1356 rxconf = rxconf | RCR_AM;
1357 //rxconf = rxconf | RCR_ACF;
1359 if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
1361 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
1362 dev->flags & IFF_PROMISC){
1363 rxconf = rxconf | RCR_AAP;
1364 } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
1365 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
1366 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
1368 rxconf = rxconf | RCR_APM;
1369 rxconf = rxconf | RCR_CBSSID;
1373 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
1374 rxconf = rxconf | RCR_AICV;
1375 rxconf = rxconf | RCR_APWRMGT;
1378 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
1379 rxconf = rxconf | RCR_ACRC32;
1382 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
1383 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
1384 rxconf = rxconf &~ MAX_RX_DMA_MASK;
1385 rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
1387 // rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
1388 rxconf = rxconf | RCR_ONLYERLPKT;
1390 // rxconf = rxconf &~ RCR_CS_MASK;
1391 // rxconf = rxconf | (1<<RCR_CS_SHIFT);
1393 write_nic_dword(dev, RCR, rxconf);
1396 DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
1399 //wait to be removed
1400 void rtl8192_rx_enable(struct net_device *dev)
1404 //struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1406 rtl8192_rx_initiate(dev);
1408 // rtl8192_set_rxconf(dev);
1412 void rtl8192_tx_enable(struct net_device *dev)
1416 void rtl8192_rtx_disable(struct net_device *dev)
1419 struct r8192_priv *priv = ieee80211_priv(dev);
1420 struct sk_buff *skb;
1421 struct rtl8192_rx_info *info;
1423 cmd=read_nic_byte(dev,CMDR);
1424 write_nic_byte(dev, CMDR, cmd &~ \
1426 force_pci_posting(dev);
1429 while ((skb = __skb_dequeue(&priv->rx_queue))) {
1430 info = (struct rtl8192_rx_info *) skb->cb;
1434 usb_kill_urb(info->urb);
1438 if (skb_queue_len(&priv->skb_queue)) {
1439 printk(KERN_WARNING "skb_queue not empty\n");
1442 skb_queue_purge(&priv->skb_queue);
1447 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
1452 inline u16 ieeerate2rtlrate(int rate)
1484 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
1485 inline u16 rtl8192_rate2rate(short rate)
1487 if (rate >11) return 0;
1488 return rtl_rate[rate];
1491 static void rtl8192_rx_isr(struct urb *urb)
1493 struct sk_buff *skb = (struct sk_buff *) urb->context;
1494 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1495 struct net_device *dev = info->dev;
1496 struct r8192_priv *priv = ieee80211_priv(dev);
1497 int out_pipe = info->out_pipe;
1501 if (unlikely(urb->status)) {
1503 priv->stats.rxstaterr++;
1504 priv->ieee80211->stats.rx_errors++;
1506 // printk("%s():rx status err\n",__FUNCTION__);
1510 skb_unlink(skb, &priv->rx_queue);
1511 skb_put(skb, urb->actual_length);
1513 skb_queue_tail(&priv->skb_queue, skb);
1514 tasklet_schedule(&priv->irq_rx_tasklet);
1516 skb = dev_alloc_skb(RX_URB_SIZE);
1517 if (unlikely(!skb)) {
1519 printk("%s():can,t alloc skb\n",__FUNCTION__);
1520 /* TODO check rx queue length and refill *somewhere* */
1524 usb_fill_bulk_urb(urb, priv->udev,
1525 usb_rcvbulkpipe(priv->udev, out_pipe),
1526 skb_tail_pointer(skb),
1527 RX_URB_SIZE, rtl8192_rx_isr, skb);
1529 info = (struct rtl8192_rx_info *) skb->cb;
1532 info->out_pipe = out_pipe;
1534 urb->transfer_buffer = skb_tail_pointer(skb);
1536 skb_queue_tail(&priv->rx_queue, skb);
1537 err = usb_submit_urb(urb, GFP_ATOMIC);
1538 if(err && err != -EPERM)
1539 printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
1543 rtl819xusb_rx_command_packet(
1544 struct net_device *dev,
1545 struct ieee80211_rx_stats *pstats
1550 //RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
1552 status = cmpk_message_handle_rx(dev, pstats);
1555 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1559 //RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
1562 //RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
1566 void rtl8192_data_hard_stop(struct net_device *dev)
1572 void rtl8192_data_hard_resume(struct net_device *dev)
1577 /* this function TX data frames when the ieee80211 stack requires this.
1578 * It checks also if we need to stop the ieee tx queue, eventually do it
1580 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1582 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1584 unsigned long flags;
1585 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1586 u8 queue_index = tcb_desc->queue_index;
1588 /* shall not be referred by command packet */
1589 assert(queue_index != TXCMD_QUEUE);
1591 spin_lock_irqsave(&priv->tx_lock,flags);
1593 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1594 // tcb_desc->RATRIndex = 7;
1595 // tcb_desc->bTxDisableRateFallBack = 1;
1596 // tcb_desc->bTxUseDriverAssingedRate = 1;
1597 tcb_desc->bTxEnableFwCalcDur = 1;
1598 skb_push(skb, priv->ieee80211->tx_headroom);
1599 ret = priv->ops->rtl819x_tx(dev, skb);
1601 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1602 //priv->ieee80211->stats.tx_packets++;
1604 spin_unlock_irqrestore(&priv->tx_lock,flags);
1610 /* This is a rough attempt to TX a frame
1611 * This is called by the ieee 80211 stack to TX management frames.
1612 * If the ring is full packet are dropped (for data frame the queue
1613 * is stopped before this can happen).
1615 int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
1617 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1619 unsigned long flags;
1620 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1621 u8 queue_index = tcb_desc->queue_index;
1624 spin_lock_irqsave(&priv->tx_lock,flags);
1626 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1627 if(queue_index == TXCMD_QUEUE) {
1628 skb_push(skb, USB_HWDESC_HEADER_LEN);
1629 priv->ops->rtl819x_tx_cmd(dev, skb);
1631 spin_unlock_irqrestore(&priv->tx_lock,flags);
1634 skb_push(skb, priv->ieee80211->tx_headroom);
1635 ret = priv->ops->rtl819x_tx(dev, skb);
1638 spin_unlock_irqrestore(&priv->tx_lock,flags);
1644 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1647 static void rtl8192_tx_isr(struct urb *tx_urb)
1649 struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
1650 struct net_device *dev = NULL;
1651 struct r8192_priv *priv = NULL;
1652 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1653 u8 queue_index = tcb_desc->queue_index;
1654 // bool bToSend0Byte;
1655 // u16 BufLen = skb->len;
1657 memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
1658 priv = ieee80211_priv(dev);
1660 if(tcb_desc->queue_index != TXCMD_QUEUE) {
1661 if(tx_urb->status == 0) {
1662 // dev->trans_start = jiffies;
1663 // As act as station mode, destion shall be unicast address.
1664 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1665 //priv->ieee80211->stats.tx_packets++;
1666 priv->stats.txoktotal++;
1667 priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1668 priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1670 priv->ieee80211->stats.tx_errors++;
1671 //priv->stats.txmanageerr++;
1676 /* free skb and tx_urb */
1678 dev_kfree_skb_any(skb);
1679 usb_free_urb(tx_urb);
1680 atomic_dec(&priv->tx_pending[queue_index]);
1685 // Handle HW Beacon:
1686 // We had transfer our beacon frame to host controler at this moment.
1690 // Handling the wait queue of command packets.
1691 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1692 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1694 if (queue_index == MGNT_QUEUE){
1695 if (priv->ieee80211->ack_tx_to_ieee){
1696 if (rtl8192_is_tx_queue_empty(dev)){
1697 priv->ieee80211->ack_tx_to_ieee = 0;
1698 ieee80211_ps_tx_ack(priv->ieee80211, 1);
1702 /* Handle MPDU in wait queue. */
1703 if(queue_index != BEACON_QUEUE) {
1704 /* Don't send data frame during scanning.*/
1705 if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1706 (!(priv->ieee80211->queue_stop))) {
1707 if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1708 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1710 return; //modified by david to avoid further processing AMSDU
1716 void rtl8192_beacon_stop(struct net_device *dev)
1719 struct r8192_priv *priv = ieee80211_priv(dev);
1721 msr = read_nic_byte(dev, MSR);
1722 msrm = msr & MSR_LINK_MASK;
1723 msr2 = msr & ~MSR_LINK_MASK;
1725 if(NIC_8192U == priv->card_8192) {
1726 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1728 if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1729 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
1730 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1731 write_nic_byte(dev, MSR, msr);
1735 void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
1737 struct r8192_priv *priv = ieee80211_priv(dev);
1738 struct ieee80211_network *net;
1739 u8 i=0, basic_rate = 0;
1740 net = & priv->ieee80211->current_network;
1742 for (i=0; i<net->rates_len; i++)
1744 basic_rate = net->rates[i]&0x7f;
1747 case MGN_1M: *rate_config |= RRSR_1M; break;
1748 case MGN_2M: *rate_config |= RRSR_2M; break;
1749 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1750 case MGN_11M: *rate_config |= RRSR_11M; break;
1751 case MGN_6M: *rate_config |= RRSR_6M; break;
1752 case MGN_9M: *rate_config |= RRSR_9M; break;
1753 case MGN_12M: *rate_config |= RRSR_12M; break;
1754 case MGN_18M: *rate_config |= RRSR_18M; break;
1755 case MGN_24M: *rate_config |= RRSR_24M; break;
1756 case MGN_36M: *rate_config |= RRSR_36M; break;
1757 case MGN_48M: *rate_config |= RRSR_48M; break;
1758 case MGN_54M: *rate_config |= RRSR_54M; break;
1761 for (i=0; i<net->rates_ex_len; i++)
1763 basic_rate = net->rates_ex[i]&0x7f;
1766 case MGN_1M: *rate_config |= RRSR_1M; break;
1767 case MGN_2M: *rate_config |= RRSR_2M; break;
1768 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1769 case MGN_11M: *rate_config |= RRSR_11M; break;
1770 case MGN_6M: *rate_config |= RRSR_6M; break;
1771 case MGN_9M: *rate_config |= RRSR_9M; break;
1772 case MGN_12M: *rate_config |= RRSR_12M; break;
1773 case MGN_18M: *rate_config |= RRSR_18M; break;
1774 case MGN_24M: *rate_config |= RRSR_24M; break;
1775 case MGN_36M: *rate_config |= RRSR_36M; break;
1776 case MGN_48M: *rate_config |= RRSR_48M; break;
1777 case MGN_54M: *rate_config |= RRSR_54M; break;
1783 #define SHORT_SLOT_TIME 9
1784 #define NON_SHORT_SLOT_TIME 20
1786 void rtl8192_update_cap(struct net_device* dev, u16 cap)
1789 struct r8192_priv *priv = ieee80211_priv(dev);
1790 struct ieee80211_network *net = &priv->ieee80211->current_network;
1791 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1793 //LZM MOD 090303 HW_VAR_ACK_PREAMBLE
1797 tmp = ((priv->nCur40MhzPrimeSC) << 5);
1798 if (priv->short_preamble)
1800 write_nic_byte(dev, RRSR+2, tmp);
1803 if (net->mode & (IEEE_G|IEEE_N_24G))
1806 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
1808 slot_time = SHORT_SLOT_TIME;
1810 else //long slot time
1811 slot_time = NON_SHORT_SLOT_TIME;
1812 priv->slot_time = slot_time;
1813 write_nic_byte(dev, SLOT_TIME, slot_time);
1817 void rtl8192_net_update(struct net_device *dev)
1820 struct r8192_priv *priv = ieee80211_priv(dev);
1821 struct ieee80211_network *net;
1822 u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1823 u16 rate_config = 0;
1824 net = & priv->ieee80211->current_network;
1826 rtl8192_config_rate(dev, &rate_config);
1827 priv->basic_rate = rate_config &= 0x15f;
1829 write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
1830 write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
1831 //for(i=0;i<ETH_ALEN;i++)
1832 // write_nic_byte(dev,BSSID+i,net->bssid[i]);
1834 rtl8192_update_msr(dev);
1835 // rtl8192_update_cap(dev, net->capability);
1836 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1838 write_nic_word(dev, ATIMWND, 2);
1839 write_nic_word(dev, BCN_DMATIME, 1023);
1840 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1841 // write_nic_word(dev, BcnIntTime, 100);
1842 write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1843 write_nic_byte(dev, BCN_ERR_THRESH, 100);
1844 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1845 // TODO: BcnIFS may required to be changed on ASIC
1846 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1848 write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1855 //temporary hw beacon is not used any more.
1856 //open it when necessary
1858 void rtl819xusb_beacon_tx(struct net_device *dev,u16 tx_rate)
1862 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1864 if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1869 u16 N_DBPSOfRate(u16 DataRate);
1874 u8 bManagementFrame,
1882 if( rtl8192_IsWirelessBMode(DataRate) )
1884 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1886 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1890 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1892 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1894 } else { //802.11g DSSS-OFDM PLCP length field calculation.
1895 N_DBPS = N_DBPSOfRate(DataRate);
1896 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1897 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1898 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1903 u16 N_DBPSOfRate(u16 DataRate)
1948 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1950 usb_free_urb(tx_cmd_urb);
1953 unsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
1957 RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
1960 return priv->txqueue_to_outpipemap[tx_queue];
1963 short rtl8192SU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1965 struct r8192_priv *priv = ieee80211_priv(dev);
1968 unsigned int idx_pipe;
1969 tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1970 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1971 u8 queue_index = tcb_desc->queue_index;
1974 //printk("\n %s::::::::::::::::::::::queue_index = %d\n",__FUNCTION__, queue_index);
1975 atomic_inc(&priv->tx_pending[queue_index]);
1977 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
1983 memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1985 /* Tx descriptor ought to be set according to the skb->cb */
1986 pdesc->LINIP = tcb_desc->bLastIniPkt;
1987 PktSize = (u16)(skb->len - USB_HWDESC_HEADER_LEN);
1988 pdesc->PktSize = PktSize;
1989 //printk("PKTSize = %d %x\n",pdesc->PktSize,pdesc->PktSize);
1990 //----------------------------------------------------------------------------
1991 // Fill up USB_OUT_CONTEXT.
1992 //----------------------------------------------------------------------------
1993 // Get index to out pipe from specified QueueID.
1994 idx_pipe = txqueue2outpipe(priv,queue_index);
1995 //printk("=============>%s queue_index:%d, outpipe:%d\n", __func__,queue_index,priv->RtOutPipes[idx_pipe]);
1997 usb_fill_bulk_urb(tx_urb,
1999 usb_sndbulkpipe(priv->udev,priv->RtOutPipes[idx_pipe]),
2005 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2009 printk("Error TX CMD URB, error %d",
2016 * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
2017 * in TxFwInfo data structure
2018 * 2006.10.30 by Emily
2020 * \param QUEUEID Software Queue
2022 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
2024 u8 QueueSelect = 0x0; //defualt set to
2028 QueueSelect = QSLT_BE; //or QSelect = pTcb->priority;
2032 QueueSelect = QSLT_BK; //or QSelect = pTcb->priority;
2036 QueueSelect = QSLT_VO; //or QSelect = pTcb->priority;
2040 QueueSelect = QSLT_VI; //or QSelect = pTcb->priority;
2043 QueueSelect = QSLT_MGNT;
2047 QueueSelect = QSLT_BEACON;
2050 // TODO: 2006.10.30 mark other queue selection until we verify it is OK
2051 // TODO: Remove Assertions
2052 //#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
2054 QueueSelect = QSLT_CMD;
2058 QueueSelect = QSLT_HIGH;
2062 RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
2068 u8 MRateToHwRate8190Pci(u8 rate)
2070 u8 ret = DESC92S_RATE1M;
2074 // CCK and OFDM non-HT rates
2075 case MGN_1M: ret = DESC92S_RATE1M; break;
2076 case MGN_2M: ret = DESC92S_RATE2M; break;
2077 case MGN_5_5M: ret = DESC92S_RATE5_5M; break;
2078 case MGN_11M: ret = DESC92S_RATE11M; break;
2079 case MGN_6M: ret = DESC92S_RATE6M; break;
2080 case MGN_9M: ret = DESC92S_RATE9M; break;
2081 case MGN_12M: ret = DESC92S_RATE12M; break;
2082 case MGN_18M: ret = DESC92S_RATE18M; break;
2083 case MGN_24M: ret = DESC92S_RATE24M; break;
2084 case MGN_36M: ret = DESC92S_RATE36M; break;
2085 case MGN_48M: ret = DESC92S_RATE48M; break;
2086 case MGN_54M: ret = DESC92S_RATE54M; break;
2088 // HT rates since here
2089 case MGN_MCS0: ret = DESC92S_RATEMCS0; break;
2090 case MGN_MCS1: ret = DESC92S_RATEMCS1; break;
2091 case MGN_MCS2: ret = DESC92S_RATEMCS2; break;
2092 case MGN_MCS3: ret = DESC92S_RATEMCS3; break;
2093 case MGN_MCS4: ret = DESC92S_RATEMCS4; break;
2094 case MGN_MCS5: ret = DESC92S_RATEMCS5; break;
2095 case MGN_MCS6: ret = DESC92S_RATEMCS6; break;
2096 case MGN_MCS7: ret = DESC92S_RATEMCS7; break;
2097 case MGN_MCS8: ret = DESC92S_RATEMCS8; break;
2098 case MGN_MCS9: ret = DESC92S_RATEMCS9; break;
2099 case MGN_MCS10: ret = DESC92S_RATEMCS10; break;
2100 case MGN_MCS11: ret = DESC92S_RATEMCS11; break;
2101 case MGN_MCS12: ret = DESC92S_RATEMCS12; break;
2102 case MGN_MCS13: ret = DESC92S_RATEMCS13; break;
2103 case MGN_MCS14: ret = DESC92S_RATEMCS14; break;
2104 case MGN_MCS15: ret = DESC92S_RATEMCS15; break;
2106 // Set the highest SG rate
2124 ret = DESC92S_RATEMCS15_SG;
2133 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
2137 tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
2139 if(TxHT==1 && TxRate != DESC90_RATEMCS15)
2145 static void tx_zero_isr(struct urb *tx_urb)
2152 * The tx procedure is just as following, skb->cb will contain all the following
2153 *information: * priority, morefrag, rate, &dev.
2155 // <Note> Buffer format for 8192S Usb bulk out:
2157 // --------------------------------------------------
2158 // | 8192S Usb Tx Desc | 802_11_MAC_header | data |
2159 // --------------------------------------------------
2160 // | 32 bytes | 24 bytes |0-2318 bytes|
2161 // --------------------------------------------------
2162 // |<------------ BufferLen ------------------------->|
2164 short rtl8192SU_tx(struct net_device *dev, struct sk_buff* skb)
2166 struct r8192_priv *priv = ieee80211_priv(dev);
2167 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
2168 tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
2169 //tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);//92su del
2170 struct usb_device *udev = priv->udev;
2173 struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
2175 unsigned int idx_pipe;
2176 u16 MPDUOverhead = 0;
2177 //RT_DEBUG_DATA(COMP_SEND, tcb_desc, sizeof(cb_desc));
2179 pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
2180 /* we are locked here so the two atomic_read and inc are executed
2181 * without interleaves * !!! For debug purpose */
2182 if( pend > MAX_TX_URB){
2183 switch (tcb_desc->queue_index) {
2185 priv->stats.txvodrop++;
2188 priv->stats.txvidrop++;
2191 priv->stats.txbedrop++;
2193 default://BK_PRIORITY
2194 priv->stats.txbkdrop++;
2197 printk("To discard skb packet!\n");
2198 dev_kfree_skb_any(skb);
2202 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
2204 dev_kfree_skb_any(skb);
2208 memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2211 tx_desc->NonQos = (IsQoSDataFrame(skb->data)==TRUE)? 0:1;
2213 /* Fill Tx descriptor */
2214 //memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
2216 // This part can just fill to the first descriptor of the frame.
2218 tx_desc->TxHT = (tcb_desc->data_rate&0x80)?1:0;
2221 tx_desc->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
2222 //tx_desc->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
2223 tx_desc->TxShort = QueryIsShort(tx_desc->TxHT, tx_desc->TxRate, tcb_desc);
2226 // Aggregation related
2227 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
2228 tx_desc->AllowAggregation = 1;
2230 //tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
2231 //tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
2233 tx_desc->AllowAggregation = 0;
2235 //tx_fwinfo->RxMF = 0;
2236 //tx_fwinfo->RxAMD = 0;
2240 // <Roger_Notes> For AMPDU case, we must insert SSN into TX_DESC,
2241 // FW according as this SSN to do necessary packet retry.
2247 //pSeq = (u8 *)(VirtualAddress+USB_HWDESC_HEADER_LEN + FRAME_OFFSET_SEQUENCE);
2248 pSeq = (u8 *)(skb->data+USB_HWDESC_HEADER_LEN + 22);
2251 Temp |= (*(u16 *)pSeq)>>4;
2252 tx_desc->Seq = Temp;
2255 /* Protection mode related */
2256 tx_desc->RTSEn = (tcb_desc->bRTSEnable)?1:0;
2257 tx_desc->CTS2Self = (tcb_desc->bCTSEnable)?1:0;
2258 tx_desc->RTSSTBC = (tcb_desc->bRTSSTBC)?1:0;
2259 tx_desc->RTSHT = (tcb_desc->rts_rate&0x80)?1:0;
2260 tx_desc->RTSRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
2261 tx_desc->RTSSubcarrier = (tx_desc->RTSHT==0)?(tcb_desc->RTSSC):0;
2262 tx_desc->RTSBW = (tx_desc->RTSHT==1)?((tcb_desc->bRTSBW)?1:0):0;
2263 tx_desc->RTSShort = (tx_desc->RTSHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
2264 (tcb_desc->bRTSUseShortGI?1:0);
2266 tx_desc->DisRTSFB = 0;
2267 tx_desc->RTSRateFBLmt = 0xf;
2269 // <Roger_EXP> 2008.09.22. We disable RTS rate fallback temporarily.
2270 //tx_desc->DisRTSFB = 0x01;
2272 /* Set Bandwidth and sub-channel settings. */
2273 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2275 if(tcb_desc->bPacketBW) {
2276 tx_desc->TxBandwidth = 1;
2277 tx_desc->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
2279 tx_desc->TxBandwidth = 0;
2280 tx_desc->TxSubCarrier = priv->nCur40MhzPrimeSC;
2283 tx_desc->TxBandwidth = 0;
2284 tx_desc->TxSubCarrier = 0;
2288 //memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2291 //tx_desc->CmdInit = 1; //92su del
2292 tx_desc->Offset = USB_HWDESC_HEADER_LEN;
2295 tx_desc->PktSize = (skb->len - USB_HWDESC_HEADER_LEN) & 0xffff;
2299 //tx_desc->SecCAMID= 0;//92su del
2300 tx_desc->RaBRSRID= tcb_desc->RATRIndex;
2301 //#ifdef RTL8192S_PREPARE_FOR_NORMAL_RELEASE
2305 //tx_desc->NoEnc = 1;//92su del
2308 tx_desc->SecType = 0x0;
2310 if (tcb_desc->bHwSec)
2312 switch (priv->ieee80211->pairwise_key_type)
2314 case KEY_TYPE_WEP40:
2315 case KEY_TYPE_WEP104:
2316 tx_desc->SecType = 0x1;
2317 //tx_desc->NoEnc = 0;//92su del
2320 tx_desc->SecType = 0x2;
2321 //tx_desc->NoEnc = 0;//92su del
2324 tx_desc->SecType = 0x3;
2325 //tx_desc->NoEnc = 0;//92su del
2328 tx_desc->SecType = 0x0;
2329 //tx_desc->NoEnc = 1;//92su del
2332 tx_desc->SecType = 0x0;
2333 //tx_desc->NoEnc = 1;//92su del
2338 //tx_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);//92su del
2341 tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
2342 tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
2343 tx_desc->DataRateFBLmt = 0x1F;// Alwasy enable all rate fallback range
2345 tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
2348 /* Fill fields that are required to be initialized in all of the descriptors */
2350 tx_desc->FirstSeg = 1;
2351 tx_desc->LastSeg = 1;
2356 //tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
2357 tx_desc->TxBufferSize = (u32)(skb->len);//92su mod FIXLZM
2360 /* Get index to out pipe from specified QueueID */
2361 idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
2362 //printk("=============>%s queue_index:%d, outpipe:%d\n", __func__,tcb_desc->queue_index,priv->RtOutPipes[idx_pipe]);
2364 //RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
2365 //RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
2367 /* To submit bulk urb */
2368 usb_fill_bulk_urb(tx_urb,
2370 usb_sndbulkpipe(udev,priv->RtOutPipes[idx_pipe]),
2372 skb->len, rtl8192_tx_isr, skb);
2374 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2377 * we need to send 0 byte packet whenever 512N bytes/64N(HIGN SPEED/NORMAL SPEED) bytes packet has been transmitted.
2378 * Otherwise, it will be halt to wait for another packet. WB. 2008.08.27
2380 bool bSend0Byte = false;
2382 if(udev->speed == USB_SPEED_HIGH) {
2383 if (skb->len > 0 && skb->len % 512 == 0)
2387 if (skb->len > 0 && skb->len % 64 == 0)
2391 tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
2393 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
2396 usb_fill_bulk_urb(tx_urb_zero,udev,
2397 usb_sndbulkpipe(udev,idx_pipe), &zero,
2398 0, tx_zero_isr, dev);
2399 status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
2408 RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d",
2409 atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
2413 dev->trans_start = jiffies;
2414 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
2417 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
2423 void rtl8192SU_net_update(struct net_device *dev)
2426 struct r8192_priv *priv = ieee80211_priv(dev);
2427 struct ieee80211_device* ieee = priv->ieee80211;
2428 struct ieee80211_network *net = &priv->ieee80211->current_network;
2429 //u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
2430 u16 rate_config = 0;
2433 u8 retrylimit = 0x30;
2434 u16 cap = net->capability;
2436 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
2439 //update Basic rate: RR, BRSR
2440 rtl8192_config_rate(dev, &rate_config); //HalSetBrateCfg
2442 priv->basic_rate = rate_config = rate_config & 0x15f;
2444 // Set RRSR rate table.
2445 write_nic_byte(dev, RRSR, rate_config&0xff);
2446 write_nic_byte(dev, RRSR+1, (rate_config>>8)&0xff);
2448 // Set RTS initial rate
2449 while(rate_config > 0x1)
2451 rate_config = (rate_config>> 1);
2454 write_nic_byte(dev, INIRTSMCS_SEL, rateIndex);
2458 regTmp = (priv->nCur40MhzPrimeSC) << 5;
2459 if (priv->short_preamble)
2461 write_nic_byte(dev, RRSR+2, regTmp);
2463 write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
2464 write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
2466 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
2467 //2008.10.24 added by tynli for beacon changed.
2468 PHY_SetBeaconHwReg( dev, net->beacon_interval);
2470 rtl8192_update_cap(dev, cap);
2472 if (ieee->iw_mode == IW_MODE_ADHOC){
2474 //we should enable ibss interrupt here, but disable it temporarily
2476 priv->irq_mask |= (IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2477 //rtl8192_irq_disable(dev);
2478 //rtl8192_irq_enable(dev);
2483 priv->irq_mask &= ~(IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2484 //rtl8192_irq_disable(dev);
2485 //rtl8192_irq_enable(dev);
2489 priv->ShortRetryLimit = priv->LongRetryLimit = retrylimit;
2491 write_nic_word(dev, RETRY_LIMIT,
2492 retrylimit << RETRY_LIMIT_SHORT_SHIFT | \
2493 retrylimit << RETRY_LIMIT_LONG_SHIFT);
2496 void rtl8192SU_update_ratr_table(struct net_device* dev)
2498 struct r8192_priv* priv = ieee80211_priv(dev);
2499 struct ieee80211_device* ieee = priv->ieee80211;
2500 u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2501 //struct ieee80211_network *net = &ieee->current_network;
2505 int WirelessMode = ieee->mode;
2506 u8 MimoPs = ieee->pHTInfo->PeerMimoPs;
2510 rtl8192_config_rate(dev, (u16*)(&ratr_value));
2511 ratr_value |= (*(u16*)(pMcsRate)) << 12;
2513 //switch (ieee->mode)
2514 switch (WirelessMode)
2517 ratr_value &= 0x00000FF0;
2520 ratr_value &= 0x0000000D;
2523 ratr_value &= 0x00000FF5;
2530 if (MimoPs == 0) //MIMO_PS_STATIC
2532 ratr_value &= 0x0007F005;
2535 { // MCS rate only => for 11N mode.
2538 // 1T2R or 1T1R, Spatial Stream 2 should be disabled
2539 if ( priv->rf_type == RF_1T2R ||
2540 priv->rf_type == RF_1T1R ||
2541 (ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_TX_2SS) )
2542 ratr_mask = 0x000ff005;
2544 ratr_mask = 0x0f0ff005;
2546 if((ieee->pHTInfo->bCurTxBW40MHz) &&
2547 !(ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_TX_40_MHZ))
2548 ratr_mask |= 0x00000010; // Set 6MBps
2550 // Select rates for rate adaptive mechanism.
2551 ratr_value &= ratr_mask;
2558 if(priv->rf_type == RF_1T2R) // 1T2R, Spatial Stream 2 should be disabled
2560 ratr_value &= 0x000ff0f5;
2564 ratr_value &= 0x0f0ff0f5;
2567 //printk("====>%s(), mode is not correct:%x\n", __FUNCTION__, ieee->mode);
2571 ratr_value &= 0x0FFFFFFF;
2573 // Get MAX MCS available.
2574 if ( (bNMode && ((ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_SHORT_GI)==0)) &&
2575 ((ieee->pHTInfo->bCurBW40MHz && ieee->pHTInfo->bCurShortGI40MHz) ||
2576 (!ieee->pHTInfo->bCurBW40MHz && ieee->pHTInfo->bCurShortGI20MHz)))
2578 u8 shortGI_rate = 0;
2579 u32 tmp_ratr_value = 0;
2580 ratr_value |= 0x10000000;//???
2581 tmp_ratr_value = (ratr_value>>12);
2582 for(shortGI_rate=15; shortGI_rate>0; shortGI_rate--)
2584 if((1<<shortGI_rate) & tmp_ratr_value)
2587 shortGI_rate = (shortGI_rate<<12)|(shortGI_rate<<8)|(shortGI_rate<<4)|(shortGI_rate);
2588 write_nic_byte(dev, SG_RATE, shortGI_rate);
2589 //printk("==>SG_RATE:%x\n", read_nic_byte(dev, SG_RATE));
2591 write_nic_dword(dev, ARFR0+rate_index*4, ratr_value);
2592 printk("=============>ARFR0+rate_index*4:%#x\n", ratr_value);
2595 if (ratr_value & 0xfffff000){
2596 //printk("===>set to N mode\n");
2597 HalSetFwCmd8192S(dev, FW_CMD_RA_REFRESH_N);
2600 //printk("===>set to B/G mode\n");
2601 HalSetFwCmd8192S(dev, FW_CMD_RA_REFRESH_BG);
2605 void rtl8192SU_link_change(struct net_device *dev)
2607 struct r8192_priv *priv = ieee80211_priv(dev);
2608 struct ieee80211_device* ieee = priv->ieee80211;
2609 //unsigned long flags;
2612 printk("=====>%s 1\n", __func__);
2613 reg = read_nic_dword(dev, RCR);
2615 if (ieee->state == IEEE80211_LINKED)
2618 rtl8192SU_net_update(dev);
2619 rtl8192SU_update_ratr_table(dev);
2620 ieee->SetFwCmdHandler(dev, FW_CMD_HIGH_PWR_ENABLE);
2621 priv->ReceiveConfig = reg |= RCR_CBSSID;
2624 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2628 write_nic_dword(dev, RCR, reg);
2629 rtl8192_update_msr(dev);
2631 printk("<=====%s 2\n", __func__);
2634 static struct ieee80211_qos_parameters def_qos_parameters = {
2635 {3,3,3,3},/* cw_min */
2636 {7,7,7,7},/* cw_max */
2637 {2,2,2,2},/* aifs */
2638 {0,0,0,0},/* flags */
2639 {0,0,0,0} /* tx_op_limit */
2643 void rtl8192_update_beacon(struct work_struct * work)
2645 struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2646 struct net_device *dev = priv->ieee80211->dev;
2647 struct ieee80211_device* ieee = priv->ieee80211;
2648 struct ieee80211_network* net = &ieee->current_network;
2650 if (ieee->pHTInfo->bCurrentHTSupport)
2651 HTUpdateSelfAndPeerSetting(ieee, net);
2652 ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2653 // Joseph test for turbo mode with AP
2654 ieee->pHTInfo->RT2RT_HT_Mode = net->bssht.RT2RT_HT_Mode;
2655 rtl8192_update_cap(dev, net->capability);
2658 * background support to run QoS activate functionality
2660 int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
2662 void rtl8192_qos_activate(struct work_struct * work)
2664 struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2665 struct net_device *dev = priv->ieee80211->dev;
2666 struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2667 u8 mode = priv->ieee80211->current_network.mode;
2668 //u32 size = sizeof(struct ieee80211_qos_parameters);
2676 mutex_lock(&priv->mutex);
2678 if(priv->ieee80211->state != IEEE80211_LINKED)
2680 RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
2681 /* It better set slot time at first */
2682 /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2683 /* update the ac parameter to related registers */
2684 for(i = 0; i < QOS_QUEUE_NUM; i++) {
2685 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2686 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2687 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2688 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2689 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2690 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2692 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2693 //write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4322);
2697 mutex_unlock(&priv->mutex);
2700 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2702 struct ieee80211_network *network)
2705 u32 size = sizeof(struct ieee80211_qos_parameters);
2707 if(priv->ieee80211->state !=IEEE80211_LINKED)
2710 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2713 if (network->flags & NETWORK_HAS_QOS_MASK) {
2714 if (active_network &&
2715 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2716 network->qos_data.active = network->qos_data.supported;
2718 if ((network->qos_data.active == 1) && (active_network == 1) &&
2719 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2720 (network->qos_data.old_param_count !=
2721 network->qos_data.param_count)) {
2722 network->qos_data.old_param_count =
2723 network->qos_data.param_count;
2724 queue_work(priv->priv_wq, &priv->qos_activate);
2725 RT_TRACE (COMP_QOS, "QoS parameters change call "
2729 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2730 &def_qos_parameters, size);
2732 if ((network->qos_data.active == 1) && (active_network == 1)) {
2733 queue_work(priv->priv_wq, &priv->qos_activate);
2734 RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2736 network->qos_data.active = 0;
2737 network->qos_data.supported = 0;
2743 /* handle manage frame frame beacon and probe response */
2744 static int rtl8192_handle_beacon(struct net_device * dev,
2745 struct ieee80211_probe_response *beacon,
2746 struct ieee80211_network *network)
2748 struct r8192_priv *priv = ieee80211_priv(dev);
2750 rtl8192_qos_handle_probe_response(priv,1,network);
2751 queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2758 * handling the beaconing responses. if we get different QoS setting
2759 * off the network from the associated setting, adjust the QoS
2762 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2763 struct ieee80211_network *network)
2766 unsigned long flags;
2767 u32 size = sizeof(struct ieee80211_qos_parameters);
2768 int set_qos_param = 0;
2770 if ((priv == NULL) || (network == NULL))
2773 if(priv->ieee80211->state !=IEEE80211_LINKED)
2776 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2779 spin_lock_irqsave(&priv->ieee80211->lock, flags);
2780 if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2781 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2782 &network->qos_data.parameters,\
2783 sizeof(struct ieee80211_qos_parameters));
2784 priv->ieee80211->current_network.qos_data.active = 1;
2787 /* update qos parameter for current network */
2788 priv->ieee80211->current_network.qos_data.old_param_count = \
2789 priv->ieee80211->current_network.qos_data.param_count;
2790 priv->ieee80211->current_network.qos_data.param_count = \
2791 network->qos_data.param_count;
2794 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2795 &def_qos_parameters, size);
2796 priv->ieee80211->current_network.qos_data.active = 0;
2797 priv->ieee80211->current_network.qos_data.supported = 0;
2801 spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2803 RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
2804 if (set_qos_param == 1)
2805 queue_work(priv->priv_wq, &priv->qos_activate);
2811 static int rtl8192_handle_assoc_response(struct net_device *dev,
2812 struct ieee80211_assoc_response_frame *resp,
2813 struct ieee80211_network *network)
2815 struct r8192_priv *priv = ieee80211_priv(dev);
2816 rtl8192_qos_association_resp(priv, network);
2821 void rtl8192_update_ratr_table(struct net_device* dev)
2822 // POCTET_STRING posLegacyRate,
2824 // PRT_WLAN_STA pEntry)
2826 struct r8192_priv* priv = ieee80211_priv(dev);
2827 struct ieee80211_device* ieee = priv->ieee80211;
2828 u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2829 //struct ieee80211_network *net = &ieee->current_network;
2832 rtl8192_config_rate(dev, (u16*)(&ratr_value));
2833 ratr_value |= (*(u16*)(pMcsRate)) << 12;
2834 // switch (net->mode)
2838 ratr_value &= 0x00000FF0;
2841 ratr_value &= 0x0000000F;
2844 ratr_value &= 0x00000FF7;
2848 if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
2849 ratr_value &= 0x0007F007;
2851 if (priv->rf_type == RF_1T2R)
2852 ratr_value &= 0x000FF007;
2854 ratr_value &= 0x0F81F007;
2860 ratr_value &= 0x0FFFFFFF;
2861 if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
2862 ratr_value |= 0x80000000;
2863 }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
2864 ratr_value |= 0x80000000;
2866 write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2867 write_nic_byte(dev, UFWP, 1);
2870 static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
2871 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2872 bool GetNmodeSupportBySecCfg8192(struct net_device*dev)
2875 struct r8192_priv* priv = ieee80211_priv(dev);
2876 struct ieee80211_device* ieee = priv->ieee80211;
2877 struct ieee80211_network * network = &ieee->current_network;
2878 int wpa_ie_len= ieee->wpa_ie_len;
2879 struct ieee80211_crypt_data* crypt;
2883 crypt = ieee->crypt[ieee->tx_keyidx];
2884 //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
2885 encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
2888 if(encrypt && (wpa_ie_len == 0)) {
2889 /* wep encryption, no N mode setting */
2891 // } else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
2892 } else if((wpa_ie_len != 0)) {
2893 /* parse pairwise key type */
2894 //if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
2895 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))))
2907 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
2910 struct r8192_priv* priv = ieee80211_priv(dev);
2911 struct ieee80211_device* ieee = priv->ieee80211;
2913 // Added by Roger, 2008.08.29.
2916 if(ieee->bHalfWirelessN24GMode == true)
2924 void rtl8192_refresh_supportrate(struct r8192_priv* priv)
2926 struct ieee80211_device* ieee = priv->ieee80211;
2927 //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
2928 if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2930 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2931 //RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
2932 //RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
2935 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2939 u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
2941 struct r8192_priv *priv = ieee80211_priv(dev);
2943 switch(priv->rf_chip)
2949 ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2952 ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2955 ret = WIRELESS_MODE_B;
2960 void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
2962 struct r8192_priv *priv = ieee80211_priv(dev);
2963 u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2966 if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
2968 if(bSupportMode & WIRELESS_MODE_N_24G)
2970 wireless_mode = WIRELESS_MODE_N_24G;
2972 else if(bSupportMode & WIRELESS_MODE_N_5G)
2974 wireless_mode = WIRELESS_MODE_N_5G;
2976 else if((bSupportMode & WIRELESS_MODE_A))
2978 wireless_mode = WIRELESS_MODE_A;
2980 else if((bSupportMode & WIRELESS_MODE_G))
2982 wireless_mode = WIRELESS_MODE_G;
2984 else if((bSupportMode & WIRELESS_MODE_B))
2986 wireless_mode = WIRELESS_MODE_B;
2989 RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
2990 wireless_mode = WIRELESS_MODE_B;
2993 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
2994 ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
2996 //LZM 090306 usb crash here, mark it temp
2997 //write_nic_word(dev, SIFS_OFDM, 0x0e0e);
2998 priv->ieee80211->mode = wireless_mode;
3000 if ((wireless_mode == WIRELESS_MODE_N_24G) || (wireless_mode == WIRELESS_MODE_N_5G))
3001 priv->ieee80211->pHTInfo->bEnableHT = 1;
3003 priv->ieee80211->pHTInfo->bEnableHT = 0;
3004 RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
3005 rtl8192_refresh_supportrate(priv);
3011 short rtl8192_is_tx_queue_empty(struct net_device *dev)
3014 struct r8192_priv *priv = ieee80211_priv(dev);
3015 //struct ieee80211_device* ieee = priv->ieee80211;
3016 for (i=0; i<=MGNT_QUEUE; i++)
3018 if ((i== TXCMD_QUEUE) || (i == HCCA_QUEUE) )
3020 if (atomic_read(&priv->tx_pending[i]))
3022 printk("===>tx queue is not empty:%d, %d\n", i, atomic_read(&priv->tx_pending[i]));
3029 void rtl8192_hw_sleep_down(struct net_device *dev)
3031 RT_TRACE(COMP_POWER, "%s()============>come to sleep down\n", __FUNCTION__);
3033 // MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
3037 void rtl8192_hw_sleep_wq (struct work_struct *work)
3039 // struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
3040 // struct ieee80211_device * ieee = (struct ieee80211_device*)
3041 // container_of(work, struct ieee80211_device, watch_dog_wq);
3042 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
3043 struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_sleep_wq);
3044 struct net_device *dev = ieee->dev;
3046 //printk("=========>%s()\n", __FUNCTION__);
3047 rtl8192_hw_sleep_down(dev);
3049 // printk("dev is %d\n",dev);
3050 // printk("&*&(^*(&(&=========>%s()\n", __FUNCTION__);
3051 void rtl8192_hw_wakeup(struct net_device* dev)
3055 // spin_lock_irqsave(&priv->ps_lock,flags);
3056 RT_TRACE(COMP_POWER, "%s()============>come to wake up\n", __FUNCTION__);
3058 // MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
3060 //FIXME: will we send package stored while nic is sleep?
3061 // spin_unlock_irqrestore(&priv->ps_lock,flags);
3064 void rtl8192_hw_wakeup_wq (struct work_struct *work)
3066 // struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
3067 // struct ieee80211_device * ieee = (struct ieee80211_device*)
3068 // container_of(work, struct ieee80211_device, watch_dog_wq);
3069 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
3070 struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_wakeup_wq);
3071 struct net_device *dev = ieee->dev;
3073 rtl8192_hw_wakeup(dev);
3076 #define MIN_SLEEP_TIME 50
3077 #define MAX_SLEEP_TIME 10000
3078 void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
3081 struct r8192_priv *priv = ieee80211_priv(dev);
3084 unsigned long flags;
3086 spin_lock_irqsave(&priv->ps_lock,flags);
3088 /* Writing HW register with 0 equals to disable
3089 * the timer, that is not really what we want
3091 tl -= MSECS(4+16+7);
3093 //if(tl == 0) tl = 1;
3095 /* FIXME HACK FIXME HACK */
3096 // force_pci_posting(dev);
3099 // rb = read_nic_dword(dev, TSFTR);
3101 /* If the interval in witch we are requested to sleep is too
3102 * short then give up and remain awake
3104 if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
3105 ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
3106 spin_unlock_irqrestore(&priv->ps_lock,flags);
3107 printk("too short to sleep\n");
3111 // write_nic_dword(dev, TimerInt, tl);
3112 // rb = read_nic_dword(dev, TSFTR);
3114 u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
3117 queue_delayed_work(priv->ieee80211->wq, &priv->ieee80211->hw_wakeup_wq, tmp); //as tl may be less than rb
3119 /* if we suspect the TimerInt is gone beyond tl
3120 * while setting it, then give up
3123 if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
3124 ((tl < rb) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))) {
3125 printk("========>too long to sleep:%x, %x, %lx\n", tl, rb, MSECS(MAX_SLEEP_TIME));
3126 spin_unlock_irqrestore(&priv->ps_lock,flags);
3130 // if(priv->rf_sleep)
3131 // priv->rf_sleep(dev);
3133 //printk("<=========%s()\n", __FUNCTION__);
3134 queue_delayed_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_sleep_wq,0);
3136 spin_unlock_irqrestore(&priv->ps_lock,flags);
3138 //init priv variables here. only non_zero value should be initialized here.
3139 static void rtl8192_init_priv_variable(struct net_device* dev)
3141 struct r8192_priv *priv = ieee80211_priv(dev);
3143 priv->card_8192 = NIC_8192U;
3144 priv->chan = 1; //set to channel 1
3145 priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
3146 priv->ieee80211->iw_mode = IW_MODE_INFRA;
3147 priv->ieee80211->ieee_up=0;
3148 priv->retry_rts = DEFAULT_RETRY_RTS;
3149 priv->retry_data = DEFAULT_RETRY_DATA;
3150 priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
3151 priv->ieee80211->rate = 110; //11 mbps
3152 priv->ieee80211->short_slot = 1;
3153 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
3156 priv->IrpPendingCount = 1;
3157 priv->ResetProgress = RESET_TYPE_NORESET;
3158 priv->bForcedSilentReset = 0;
3159 priv->bDisableNormalResetCheck = false;
3160 priv->force_reset = false;
3162 priv->ieee80211->FwRWRF = 0; //we don't use FW read/write RF until stable firmware is available.
3163 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3164 priv->ieee80211->iw_mode = IW_MODE_INFRA;
3165 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
3166 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
3167 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
3168 IEEE_SOFTMAC_BEACONS;//added by amy 080604 //| //IEEE_SOFTMAC_SINGLE_QUEUE;
3170 priv->ieee80211->active_scan = 1;
3171 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
3172 priv->ieee80211->host_encrypt = 1;
3173 priv->ieee80211->host_decrypt = 1;
3174 priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
3175 priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
3176 priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
3177 priv->ieee80211->set_chan = rtl8192_set_chan;
3178 priv->ieee80211->link_change = priv->ops->rtl819x_link_change;
3179 priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
3180 priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
3181 priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
3182 priv->ieee80211->init_wmmparam_flag = 0;
3183 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
3184 priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
3185 priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
3186 priv->ieee80211->qos_support = 1;
3189 // priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
3190 priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
3191 priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
3192 priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
3194 priv->ieee80211->sta_wake_up = rtl8192_hw_wakeup;
3195 // priv->ieee80211->ps_request_tx_ack = rtl8192_rq_tx_ack;
3196 priv->ieee80211->enter_sleep_state = rtl8192_hw_to_sleep;
3197 priv->ieee80211->ps_is_queue_empty = rtl8192_is_tx_queue_empty;
3199 priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
3200 priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
3201 priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
3203 priv->ieee80211->InitialGainHandler = priv->ops->rtl819x_initial_gain;
3204 priv->card_type = USB;
3207 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3208 priv->ieee80211->SetFwCmdHandler = HalSetFwCmd8192S;
3209 priv->bRFSiOrPi = 0;//o=si,1=pi;
3211 priv->bInHctTest = false;
3213 priv->MidHighPwrTHR_L1 = 0x3B;
3214 priv->MidHighPwrTHR_L2 = 0x40;
3216 if(priv->bInHctTest)
3218 priv->ShortRetryLimit = HAL_RETRY_LIMIT_AP_ADHOC;
3219 priv->LongRetryLimit = HAL_RETRY_LIMIT_AP_ADHOC;
3223 priv->ShortRetryLimit = HAL_RETRY_LIMIT_INFRA;
3224 priv->LongRetryLimit = HAL_RETRY_LIMIT_INFRA;
3227 priv->SetFwCmdInProgress = false; //is set FW CMD in Progress? 92S only
3228 priv->CurrentFwCmdIO = 0;
3230 priv->MinSpaceCfg = 0;
3232 priv->EarlyRxThreshold = 7;
3233 priv->enable_gpio0 = 0;
3234 priv->TransmitConfig =
3235 ((u32)TCR_MXDMA_2048<<TCR_MXDMA_OFFSET) | // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
3236 (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | // Short retry limit
3237 (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit
3238 (false ? TCR_SAT : 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
3239 if(priv->bInHctTest)
3240 priv->ReceiveConfig = //priv->CSMethod |
3241 RCR_AMF | RCR_ADF | //RCR_AAP | //accept management/data
3242 RCR_ACF |RCR_APPFCS| //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
3243 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
3244 RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
3245 RCR_APP_PHYST_STAFF | RCR_APP_PHYST_RXFF | // Accept PHY status
3246 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
3247 (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
3248 (priv->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
3250 priv->ReceiveConfig = //priv->CSMethod |
3251 RCR_AMF | RCR_ADF | RCR_AB |
3252 RCR_AM | RCR_APM |RCR_AAP |RCR_ADD3|RCR_APP_ICV|
3253 RCR_APP_PHYST_STAFF | RCR_APP_PHYST_RXFF | // Accept PHY status
3254 RCR_APP_MIC | RCR_APPFCS;
3256 // <Roger_EXP> 2008.06.16.
3257 priv->IntrMask = (u16)(IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK | \
3258 IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK | \
3259 IMR_BDOK | IMR_RXCMDOK | /*IMR_TIMEOUT0 |*/ IMR_RDU | IMR_RXFOVW | \
3260 IMR_TXFOVW | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
3265 priv->AcmControl = 0;
3266 priv->pFirmware = (rt_firmware*)vmalloc(sizeof(rt_firmware));
3267 if (priv->pFirmware)
3268 memset(priv->pFirmware, 0, sizeof(rt_firmware));
3270 /* rx related queue */
3271 skb_queue_head_init(&priv->rx_queue);
3272 skb_queue_head_init(&priv->skb_queue);
3274 /* Tx related queue */
3275 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3276 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
3278 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3279 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
3281 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3282 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
3284 priv->rf_set_chan = rtl8192_phy_SwChnl;
3288 static void rtl8192_init_priv_lock(struct r8192_priv* priv)
3290 spin_lock_init(&priv->tx_lock);
3291 spin_lock_init(&priv->irq_lock);//added by thomas
3292 //spin_lock_init(&priv->rf_lock);//use rf_sem, or will crash in some OS.
3293 sema_init(&priv->wx_sem,1);
3294 sema_init(&priv->rf_sem,1);
3295 spin_lock_init(&priv->ps_lock);
3296 mutex_init(&priv->mutex);
3299 extern void rtl819x_watchdog_wqcallback(struct work_struct *work);
3301 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
3302 //init tasklet and wait_queue here. only 2.6 above kernel is considered
3303 #define DRV_NAME "wlan0"
3304 static void rtl8192_init_priv_task(struct net_device* dev)
3306 struct r8192_priv *priv = ieee80211_priv(dev);
3308 #ifdef PF_SYNCTHREAD
3309 priv->priv_wq = create_workqueue(DRV_NAME,0);
3311 priv->priv_wq = create_workqueue(DRV_NAME);
3314 INIT_WORK(&priv->reset_wq, rtl8192_restart);
3316 //INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
3317 INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
3318 INIT_DELAYED_WORK(&priv->txpower_tracking_wq, dm_txpower_trackingcallback);
3319 // INIT_DELAYED_WORK(&priv->gpio_change_rf_wq, dm_gpio_change_rf_callback);
3320 INIT_DELAYED_WORK(&priv->rfpath_check_wq, dm_rf_pathcheck_workitemcallback);
3321 INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
3322 INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
3323 //INIT_WORK(&priv->SwChnlWorkItem, rtl8192_SwChnl_WorkItem);
3324 //INIT_WORK(&priv->SetBWModeWorkItem, rtl8192_SetBWModeWorkItem);
3325 INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
3326 INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8192_hw_wakeup_wq);
3327 INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8192_hw_sleep_wq);
3329 tasklet_init(&priv->irq_rx_tasklet,
3330 (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
3331 (unsigned long)priv);
3334 static void rtl8192_get_eeprom_size(struct net_device* dev)
3337 struct r8192_priv *priv = ieee80211_priv(dev);
3338 RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
3339 curCR = read_nic_word_E(dev,EPROM_CMD);
3340 RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
3341 //whether need I consider BIT5?
3342 priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
3343 RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
3346 //used to swap endian. as ntohl & htonl are not neccessary to swap endian, so use this instead.
3347 static inline u16 endian_swap(u16* data)
3350 *data = (tmp >> 8) | (tmp << 8);
3354 u8 rtl8192SU_UsbOptionToEndPointNumber(u8 UsbOption)
3369 RT_TRACE(COMP_INIT, "UsbOptionToEndPointNumber(): Invalid UsbOption(%#x)\n", UsbOption);
3375 u8 rtl8192SU_BoardTypeToRFtype(struct net_device* dev, u8 Boardtype)
3377 u8 RFtype = RF_1T2R;
3391 RFtype = RF_2T2R_GREEN;
3400 void update_hal_variables(struct r8192_priv *priv)
3406 for (rf_path = 0; rf_path < 2; rf_path++) {
3407 for (i = 0; i < 3; i++) {
3408 RT_TRACE((COMP_INIT), "CCK RF-%d CHan_Area-%d = 0x%x\n", rf_path, i, priv->RfCckChnlAreaTxPwr[rf_path][i]);
3409 RT_TRACE((COMP_INIT), "OFDM-1T RF-%d CHan_Area-%d = 0x%x\n", rf_path, i, priv->RfOfdmChnlAreaTxPwr1T[rf_path][i]);
3410 RT_TRACE((COMP_INIT), "OFDM-2T RF-%d CHan_Area-%d = 0x%x\n", rf_path, i, priv->RfOfdmChnlAreaTxPwr2T[rf_path][i]);
3412 /* Assign dedicated channel tx power */
3413 for(i = 0; i < 14; i++) {
3414 /* channel 1-3 use the same Tx Power Level. */
3415 if (i < 3) /* Channel 1-3 */
3417 else if (i < 9) /* Channel 4-9 */
3419 else /* Channel 10-14 */
3421 /* Record A & B CCK /OFDM - 1T/2T Channel area tx power */
3422 priv->RfTxPwrLevelCck[rf_path][i] = priv->RfCckChnlAreaTxPwr[rf_path][index];
3423 priv->RfTxPwrLevelOfdm1T[rf_path][i] = priv->RfOfdmChnlAreaTxPwr1T[rf_path][index];
3424 priv->RfTxPwrLevelOfdm2T[rf_path][i] = priv->RfOfdmChnlAreaTxPwr2T[rf_path][index];
3426 priv->TxPowerLevelOFDM24G[i] = priv->RfTxPwrLevelOfdm1T[rf_path][i] ;
3427 priv->TxPowerLevelCCK[i] = priv->RfTxPwrLevelCck[rf_path][i];
3430 for(i = 0; i < 14; i++) {
3431 RT_TRACE((COMP_INIT),
3432 "Rf-%d TxPwr CH-%d CCK OFDM_1T OFDM_2T= 0x%x/0x%x/0x%x\n",
3433 rf_path, i, priv->RfTxPwrLevelCck[rf_path][i],
3434 priv->RfTxPwrLevelOfdm1T[rf_path][i] ,
3435 priv->RfTxPwrLevelOfdm2T[rf_path][i] );
3442 // Config HW adapter information into initial value.
3445 // 1. After Auto load fail(i.e, check CR9346 fail)
3447 // Created by Roger, 2008.10.21.
3450 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(struct net_device* dev)
3452 struct r8192_priv *priv = ieee80211_priv(dev);
3454 //u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
3455 u8 rf_path; // For EEPROM/EFUSE After V0.6_1117
3458 RT_TRACE(COMP_INIT, "====> ConfigAdapterInfo8192SForAutoLoadFail\n");
3460 write_nic_byte(dev, SYS_ISO_CTRL+1, 0xE8); // Isolation signals from Loader
3461 //PlatformStallExecution(10000);
3463 write_nic_byte(dev, PMC_FSM, 0x02); // Enable Loader Data Keep
3465 //RT_ASSERT(priv->AutoloadFailFlag==TRUE, ("ReadAdapterInfo8192SEEPROM(): AutoloadFailFlag !=TRUE\n"));
3467 // Initialize IC Version && Channel Plan
3468 priv->eeprom_vid = 0;
3469 priv->eeprom_pid = 0;
3470 priv->card_8192_version = 0;
3471 priv->eeprom_ChannelPlan = 0;
3472 priv->eeprom_CustomerID = 0;
3473 priv->eeprom_SubCustomerID = 0;
3474 priv->bIgnoreDiffRateTxPowerOffset = false;
3476 RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
3477 RT_TRACE(COMP_INIT, "EEPROM PID = 0x%4x\n", priv->eeprom_pid);
3478 RT_TRACE(COMP_INIT, "EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
3479 RT_TRACE(COMP_INIT, "EEPROM SubCustomer ID: 0x%2x\n", priv->eeprom_SubCustomerID);
3480 RT_TRACE(COMP_INIT, "EEPROM ChannelPlan = 0x%4x\n", priv->eeprom_ChannelPlan);
3481 RT_TRACE(COMP_INIT, "IgnoreDiffRateTxPowerOffset = %d\n", priv->bIgnoreDiffRateTxPowerOffset);
3485 priv->EEPROMUsbOption = EEPROM_USB_Default_OPTIONAL_FUNC;
3486 RT_TRACE(COMP_INIT, "USB Option = %#x\n", priv->EEPROMUsbOption);
3489 priv->EEPROMUsbPhyParam[i] = EEPROM_USB_Default_PHY_PARAM;
3491 //RT_PRINT_DATA(COMP_INIT|COMP_EFUSE, DBG_LOUD, ("EFUSE USB PHY Param: \n"), priv->EEPROMUsbPhyParam, 5);
3494 //<Roger_Notes> In this case, we random assigh MAC address here. 2008.10.15.
3495 static u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
3498 //sMacAddr[5] = (u8)GetRandomNumber(1, 254);
3500 for(i = 0; i < 6; i++)
3501 dev->dev_addr[i] = sMacAddr[i];
3503 //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
3504 write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
3505 write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
3508 "ReadAdapterInfo8192SEFuse(), Permanent Address = %pM\n",
3511 priv->EEPROMBoardType = EEPROM_Default_BoardType;
3512 priv->rf_type = RF_1T2R; //RF_2T2R
3513 priv->EEPROMTxPowerDiff = EEPROM_Default_PwDiff;
3514 priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
3515 priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
3516 priv->EEPROMTxPwrBase = EEPROM_Default_TxPowerBase;
3517 priv->EEPROMTSSI_A = EEPROM_Default_TSSI;
3518 priv->EEPROMTSSI_B = EEPROM_Default_TSSI;
3519 priv->EEPROMTxPwrTkMode = EEPROM_Default_TxPwrTkMode;
3523 for (rf_path = 0; rf_path < 2; rf_path++)
3525 for (i = 0; i < 3; i++)
3527 // Read CCK RF A & B Tx power
3528 priv->RfCckChnlAreaTxPwr[rf_path][i] =
3529 priv->RfOfdmChnlAreaTxPwr1T[rf_path][i] =
3530 priv->RfOfdmChnlAreaTxPwr2T[rf_path][i] =
3531 (u8)(EEPROM_Default_TxPower & 0xff);
3535 update_hal_variables(priv);
3538 // Update remained HAL variables.
3540 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
3541 priv->LegacyHTTxPowerDiff = priv->EEPROMTxPowerDiff;//new
3542 priv->TxPowerDiff = priv->EEPROMTxPowerDiff;
3543 //priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);// Antenna B gain offset to antenna A, bit0~3
3544 //priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);// Antenna C gain offset to antenna A, bit4~7
3545 priv->CrystalCap = priv->EEPROMCrystalCap; // CrystalCap, bit12~15
3546 priv->ThermalMeter[0] = priv->EEPROMThermalMeter;// ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
3547 priv->LedStrategy = SW_LED_MODE0;
3549 init_rate_adaptive(dev);
3551 RT_TRACE(COMP_INIT, "<==== ConfigAdapterInfo8192SForAutoLoadFail\n");
3557 // Read HW adapter information by E-Fuse or EEPROM according CR9346 reported.
3560 // 1. CR9346 regiser has verified.
3561 // 2. PASSIVE_LEVEL (USB interface)
3563 // Created by Roger, 2008.10.21.
3566 rtl8192SU_ReadAdapterInfo8192SUsb(struct net_device* dev)
3568 struct r8192_priv *priv = ieee80211_priv(dev);
3572 u8 hwinfo[HWSET_MAX_SIZE_92S];
3573 u8 rf_path, index; // For EEPROM/EFUSE After V0.6_1117
3576 RT_TRACE(COMP_INIT, "====> ReadAdapterInfo8192SUsb\n");
3579 // <Roger_Note> The following operation are prevent Efuse leakage by turn on 2.5V.
3582 tmpU1b = read_nic_byte(dev, EFUSE_TEST+3);
3583 write_nic_byte(dev, EFUSE_TEST+3, tmpU1b|0x80);
3584 //PlatformStallExecution(1000);
3586 write_nic_byte(dev, EFUSE_TEST+3, (tmpU1b&(~BIT7)));
3588 // Retrieve Chip version.
3589 priv->card_8192_version = (VERSION_8192S)((read_nic_dword(dev, PMC_FSM)>>16)&0xF);
3590 RT_TRACE(COMP_INIT, "Chip Version ID: 0x%2x\n", priv->card_8192_version);
3592 switch(priv->card_8192_version)
3595 RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_ACUT.\n");
3598 RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_BCUT.\n");
3601 RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_CCUT.\n");
3604 RT_TRACE(COMP_INIT, "Unknown Chip Version!!\n");
3605 priv->card_8192_version = VERSION_8192S_BCUT;
3609 //if (IS_BOOT_FROM_EEPROM(Adapter))
3610 if(priv->EepromOrEfuse)
3611 { // Read frin EEPROM
3612 write_nic_byte(dev, SYS_ISO_CTRL+1, 0xE8); // Isolation signals from Loader
3613 //PlatformStallExecution(10000);
3615 write_nic_byte(dev, PMC_FSM, 0x02); // Enable Loader Data Keep
3616 // Read all Content from EEPROM or EFUSE.
3617 for(i = 0; i < HWSET_MAX_SIZE_92S; i += 2)
3619 usValue = eprom_read(dev, (u16) (i>>1));
3620 *((u16*)(&hwinfo[i])) = usValue;
3623 else if (!(priv->EepromOrEfuse))
3624 { // Read from EFUSE
3627 // <Roger_Notes> We set Isolation signals from Loader and reset EEPROM after system resuming
3628 // from suspend mode.
3631 //PlatformEFIOWrite1Byte(Adapter, SYS_ISO_CTRL+1, 0xE8); // Isolation signals from Loader
3632 //PlatformStallExecution(10000);
3633 //PlatformEFIOWrite1Byte(Adapter, SYS_FUNC_EN+1, 0x40);
3634 //PlatformEFIOWrite1Byte(Adapter, SYS_FUNC_EN+1, 0x50);
3636 //tmpU1b = PlatformEFIORead1Byte(Adapter, EFUSE_TEST+3);
3637 //PlatformEFIOWrite1Byte(Adapter, EFUSE_TEST+3, (tmpU1b | 0x80));
3638 //PlatformEFIOWrite1Byte(Adapter, EFUSE_TEST+3, 0x72);
3639 //PlatformEFIOWrite1Byte(Adapter, EFUSE_CLK, 0x03);
3641 // Read EFUSE real map to shadow.
3642 EFUSE_ShadowMapUpdate(dev);
3643 memcpy(hwinfo, &priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
3647 RT_TRACE(COMP_INIT, "ReadAdapterInfo8192SUsb(): Invalid boot type!!\n");
3651 //dump_buf(hwinfo,HWSET_MAX_SIZE_92S);
3653 // <Roger_Notes> The following are EFUSE/EEPROM independent operations!!
3655 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("MAP: \n"), hwinfo, HWSET_MAX_SIZE_92S);
3658 // <Roger_Notes> Event though CR9346 regiser can verify whether Autoload is success or not, but we still
3659 // double check ID codes for 92S here(e.g., due to HW GPIO polling fail issue).
3662 EEPROMId = *((u16 *)&hwinfo[0]);
3664 if( EEPROMId != RTL8190_EEPROM_ID )
3666 RT_TRACE(COMP_INIT, "ID(%#x) is invalid!!\n", EEPROMId);
3667 priv->bTXPowerDataReadFromEEPORM = FALSE;
3668 priv->AutoloadFailFlag=TRUE;
3672 priv->AutoloadFailFlag=FALSE;
3673 priv->bTXPowerDataReadFromEEPORM = TRUE;
3675 // Read IC Version && Channel Plan
3676 if(!priv->AutoloadFailFlag)
3679 priv->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
3680 priv->eeprom_pid = *(u16 *)&hwinfo[EEPROM_PID];
3681 priv->bIgnoreDiffRateTxPowerOffset = false; //cosa for test
3684 // EEPROM Version ID, Channel plan
3685 priv->EEPROMVersion = *(u8 *)&hwinfo[EEPROM_Version];
3686 priv->eeprom_ChannelPlan = *(u8 *)&hwinfo[EEPROM_ChannelPlan];
3688 // Customer ID, 0x00 and 0xff are reserved for Realtek.
3689 priv->eeprom_CustomerID = *(u8 *)&hwinfo[EEPROM_CustomID];
3690 priv->eeprom_SubCustomerID = *(u8 *)&hwinfo[EEPROM_SubCustomID];
3694 //priv->eeprom_vid = 0;
3695 //priv->eeprom_pid = 0;
3696 //priv->EEPROMVersion = 0;
3697 //priv->eeprom_ChannelPlan = 0;
3698 //priv->eeprom_CustomerID = 0;
3699 //priv->eeprom_SubCustomerID = 0;
3701 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(dev);
3706 RT_TRACE(COMP_INIT, "EEPROM Id = 0x%4x\n", EEPROMId);
3707 RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
3708 RT_TRACE(COMP_INIT, "EEPROM PID = 0x%4x\n", priv->eeprom_pid);
3709 RT_TRACE(COMP_INIT, "EEPROM Version ID: 0x%2x\n", priv->EEPROMVersion);
3710 RT_TRACE(COMP_INIT, "EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
3711 RT_TRACE(COMP_INIT, "EEPROM SubCustomer ID: 0x%2x\n", priv->eeprom_SubCustomerID);
3712 RT_TRACE(COMP_INIT, "EEPROM ChannelPlan = 0x%4x\n", priv->eeprom_ChannelPlan);
3713 RT_TRACE(COMP_INIT, "bIgnoreDiffRateTxPowerOffset = %d\n", priv->bIgnoreDiffRateTxPowerOffset);
3716 // Read USB optional function.
3717 if(!priv->AutoloadFailFlag)
3719 priv->EEPROMUsbOption = *(u8 *)&hwinfo[EEPROM_USB_OPTIONAL];
3723 priv->EEPROMUsbOption = EEPROM_USB_Default_OPTIONAL_FUNC;
3727 priv->EEPROMUsbEndPointNumber = rtl8192SU_UsbOptionToEndPointNumber((priv->EEPROMUsbOption&EEPROM_EP_NUMBER)>>3);
3729 RT_TRACE(COMP_INIT, "USB Option = %#x\n", priv->EEPROMUsbOption);
3730 RT_TRACE(COMP_INIT, "EndPoint Number = %#x\n", priv->EEPROMUsbEndPointNumber);
3734 // Decide CustomerID according to VID/DID or EEPROM
3736 switch(pHalData->EEPROMCustomerID)
3738 case EEPROM_CID_ALPHA:
3739 pMgntInfo->CustomerID = RT_CID_819x_ALPHA;
3742 case EEPROM_CID_CAMEO:
3743 pMgntInfo->CustomerID = RT_CID_819x_CAMEO;
3746 case EEPROM_CID_SITECOM:
3747 pMgntInfo->CustomerID = RT_CID_819x_Sitecom;
3748 RT_TRACE(COMP_INIT, DBG_LOUD, ("CustomerID = 0x%4x\n", pMgntInfo->CustomerID));
3752 case EEPROM_CID_WHQL:
3753 Adapter->bInHctTest = TRUE;
3755 pMgntInfo->bSupportTurboMode = FALSE;
3756 pMgntInfo->bAutoTurboBy8186 = FALSE;
3758 pMgntInfo->PowerSaveControl.bInactivePs = FALSE;
3759 pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE;
3760 pMgntInfo->PowerSaveControl.bLeisurePs = FALSE;
3761 pMgntInfo->keepAliveLevel = 0;
3765 pMgntInfo->CustomerID = RT_CID_DEFAULT;
3773 switch(pMgntInfo->CustomerID)
3775 case RT_CID_DEFAULT:
3776 case RT_CID_819x_ALPHA:
3777 pHalData->LedStrategy = SW_LED_MODE1;
3778 pHalData->bRegUseLed = TRUE;
3779 pHalData->SwLed1.bLedOn = TRUE;
3781 case RT_CID_819x_CAMEO:
3782 pHalData->LedStrategy = SW_LED_MODE1;
3783 pHalData->bRegUseLed = TRUE;
3786 case RT_CID_819x_Sitecom:
3787 pHalData->LedStrategy = SW_LED_MODE2;
3788 pHalData->bRegUseLed = TRUE;
3792 pHalData->LedStrategy = SW_LED_MODE0;
3797 // Read USB PHY parameters.
3799 priv->EEPROMUsbPhyParam[i] = *(u8 *)&hwinfo[EEPROM_USB_PHY_PARA1+i];
3801 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("USB PHY Param: \n"), pHalData->EEPROMUsbPhyParam, 5);
3804 //Read Permanent MAC address
3806 dev->dev_addr[i] = *(u8 *)&hwinfo[EEPROM_NODE_ADDRESS_BYTE_0+i];
3808 //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
3809 write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
3810 write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
3813 "ReadAdapterInfo8192SEFuse(), Permanent Address = %pM\n",
3817 // Get CustomerID(Boad Type)
3818 // i.e., 0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU.
3819 // Others: Reserved. Default is 0x2: RTL8192SU.
3821 //if(!priv->AutoloadFailFlag)
3823 priv->EEPROMBoardType = *(u8 *)&hwinfo[EEPROM_BoardType];
3824 priv->rf_type = rtl8192SU_BoardTypeToRFtype(dev, priv->EEPROMBoardType);
3828 // priv->EEPROMBoardType = EEPROM_Default_BoardType;
3829 // priv->rf_type = RF_1T2R;
3832 priv->rf_chip = RF_6052;
3834 priv->rf_chip = RF_6052;//lzm test
3835 RT_TRACE(COMP_INIT, "BoardType = 0x%2x\n", priv->EEPROMBoardType);
3836 RT_TRACE(COMP_INIT, "RF_Type = 0x%2x\n", priv->rf_type);
3839 // Read antenna tx power offset of B/C/D to A from EEPROM
3840 // and read ThermalMeter from EEPROM
3842 //if(!priv->AutoloadFailFlag)
3844 priv->EEPROMTxPowerDiff = *(u8 *)&hwinfo[EEPROM_PwDiff];
3845 priv->EEPROMThermalMeter = *(u8 *)&hwinfo[EEPROM_ThermalMeter];
3849 // priv->EEPROMTxPowerDiff = EEPROM_Default_PwDiff;
3850 // priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
3853 RT_TRACE(COMP_INIT, "PwDiff = %#x\n", priv->EEPROMTxPowerDiff);
3854 RT_TRACE(COMP_INIT, "ThermalMeter = %#x\n", priv->EEPROMThermalMeter);
3857 // Read Tx Power gain offset of legacy OFDM to HT rate.
3858 // Read CrystalCap from EEPROM
3860 //if(!priv->AutoloadFailFlag)
3862 priv->EEPROMCrystalCap = *(u8 *)&hwinfo[EEPROM_CrystalCap];
3866 // priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
3869 RT_TRACE(COMP_INIT, "CrystalCap = %#x\n", priv->EEPROMCrystalCap);
3872 // Get Tx Power Base.
3874 //if(!priv->AutoloadFailFlag)
3876 priv->EEPROMTxPwrBase = *(u8 *)&hwinfo[EEPROM_TxPowerBase];
3880 // priv->EEPROMTxPwrBase = EEPROM_Default_TxPowerBase;
3883 RT_TRACE(COMP_INIT, "TxPwrBase = %#x\n", priv->EEPROMTxPwrBase);
3887 // Get TSSI value for each path.
3889 //if(!priv->AutoloadFailFlag)
3891 priv->EEPROMTSSI_A = *(u8 *)&hwinfo[EEPROM_TSSI_A];
3892 priv->EEPROMTSSI_B = *(u8 *)&hwinfo[EEPROM_TSSI_B];
3895 //{ // Default setting for Empty EEPROM
3896 // priv->EEPROMTSSI_A = EEPROM_Default_TSSI;
3897 // priv->EEPROMTSSI_B = EEPROM_Default_TSSI;
3900 RT_TRACE(COMP_INIT, "TSSI_A = %#x, TSSI_B = %#x\n", priv->EEPROMTSSI_A, priv->EEPROMTSSI_B);
3903 // Get Tx Power tracking mode.
3905 //if(!priv->AutoloadFailFlag)
3907 priv->EEPROMTxPwrTkMode = *(u8 *)&hwinfo[EEPROM_TxPwTkMode];
3910 RT_TRACE(COMP_INIT, "TxPwrTkMod = %#x\n", priv->EEPROMTxPwrTkMode);
3915 // Buffer TxPwIdx(i.e., from offset 0x55~0x66, total 18Bytes)
3916 // Update CCK, OFDM (1T/2T)Tx Power Index from above buffer.
3920 // Get Tx Power Level by Channel
3922 //if(!priv->AutoloadFailFlag)
3924 // Read Tx power of Channel 1 ~ 14 from EFUSE.
3925 // 92S suupport RF A & B
3926 for (rf_path = 0; rf_path < 2; rf_path++)
3928 for (i = 0; i < 3; i++)
3930 // Read CCK RF A & B Tx power
3931 priv->RfCckChnlAreaTxPwr[rf_path][i] =
3932 hwinfo[EEPROM_TxPwIndex+rf_path*3+i];
3934 // Read OFDM RF A & B Tx power for 1T
3935 priv->RfOfdmChnlAreaTxPwr1T[rf_path][i] =
3936 hwinfo[EEPROM_TxPwIndex+6+rf_path*3+i];
3938 // Read OFDM RF A & B Tx power for 2T
3939 priv->RfOfdmChnlAreaTxPwr2T[rf_path][i] =
3940 hwinfo[EEPROM_TxPwIndex+12+rf_path*3+i];
3945 update_hal_variables(priv);
3949 // 2009/02/09 Cosa add for new EEPROM format
3951 for(i=0; i<14; i++) // channel 1~3 use the same Tx Power Level.
3953 // Read tx power difference between HT OFDM 20/40 MHZ
3954 if (i < 3) // Cjanel 1-3
3956 else if (i < 9) // Channel 4-9
3958 else // Channel 10-14
3961 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_HT20_DIFF+index])&0xff;
3962 priv->TxPwrHt20Diff[RF90_PATH_A][i] = (tempval&0xF);
3963 priv->TxPwrHt20Diff[RF90_PATH_B][i] = ((tempval>>4)&0xF);
3965 // Read OFDM<->HT tx power diff
3966 if (i < 3) // Cjanel 1-3
3967 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF])&0xff;
3968 else if (i < 9) // Channel 4-9
3969 tempval = (*(u8 *)&hwinfo[EEPROM_PwDiff])&0xff;
3970 else // Channel 10-14
3971 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF+1])&0xff;
3973 //cosa tempval = (*(u1Byte *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF+index])&0xff;
3974 priv->TxPwrLegacyHtDiff[RF90_PATH_A][i] = (tempval&0xF);
3975 priv->TxPwrLegacyHtDiff[RF90_PATH_B][i] = ((tempval>>4)&0xF);
3978 // Read Band Edge tx power offset and check if user enable the ability
3980 // HT 40 band edge channel
3981 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE])&0xff;
3982 priv->TxPwrbandEdgeHt40[RF90_PATH_A][0] = (tempval&0xF); // Band edge low channel
3983 priv->TxPwrbandEdgeHt40[RF90_PATH_A][1] = ((tempval>>4)&0xF); // Band edge high channel
3984 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+1])&0xff;
3985 priv->TxPwrbandEdgeHt40[RF90_PATH_B][0] = (tempval&0xF); // Band edge low channel
3986 priv->TxPwrbandEdgeHt40[RF90_PATH_B][1] = ((tempval>>4)&0xF); // Band edge high channel
3987 // HT 20 band edge channel
3988 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+2])&0xff;
3989 priv->TxPwrbandEdgeHt20[RF90_PATH_A][0] = (tempval&0xF); // Band edge low channel
3990 priv->TxPwrbandEdgeHt20[RF90_PATH_A][1] = ((tempval>>4)&0xF); // Band edge high channel
3991 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+3])&0xff;
3992 priv->TxPwrbandEdgeHt20[RF90_PATH_B][0] = (tempval&0xF); // Band edge low channel
3993 priv->TxPwrbandEdgeHt20[RF90_PATH_B][1] = ((tempval>>4)&0xF); // Band edge high channel
3994 // OFDM band edge channel
3995 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+4])&0xff;
3996 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0] = (tempval&0xF); // Band edge low channel
3997 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1] = ((tempval>>4)&0xF); // Band edge high channel
3998 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+5])&0xff;
3999 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][0] = (tempval&0xF); // Band edge low channel
4000 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][1] = ((tempval>>4)&0xF); // Band edge high channel
4002 priv->TxPwrbandEdgeFlag = (*(u8 *)&hwinfo[TX_PWR_BAND_EDGE_CHK]);
4006 RT_TRACE(COMP_INIT, "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrHt20Diff[RF90_PATH_A][i]);
4008 RT_TRACE(COMP_INIT, "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i, priv->TxPwrLegacyHtDiff[RF90_PATH_A][i]);
4010 RT_TRACE(COMP_INIT, "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrHt20Diff[RF90_PATH_B][i]);
4012 RT_TRACE(COMP_INIT, "RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrLegacyHtDiff[RF90_PATH_B][i]);
4013 RT_TRACE(COMP_INIT, "RF-A HT40 band-edge low/high power diff = 0x%x/0x%x\n",
4014 priv->TxPwrbandEdgeHt40[RF90_PATH_A][0],
4015 priv->TxPwrbandEdgeHt40[RF90_PATH_A][1]);
4016 RT_TRACE((COMP_INIT&COMP_DBG), "RF-B HT40 band-edge low/high power diff = 0x%x/0x%x\n",
4017 priv->TxPwrbandEdgeHt40[RF90_PATH_B][0],
4018 priv->TxPwrbandEdgeHt40[RF90_PATH_B][1]);
4020 RT_TRACE((COMP_INIT&COMP_DBG), "RF-A HT20 band-edge low/high power diff = 0x%x/0x%x\n",
4021 priv->TxPwrbandEdgeHt20[RF90_PATH_A][0],
4022 priv->TxPwrbandEdgeHt20[RF90_PATH_A][1]);
4023 RT_TRACE((COMP_INIT&COMP_DBG), "RF-B HT20 band-edge low/high power diff = 0x%x/0x%x\n",
4024 priv->TxPwrbandEdgeHt20[RF90_PATH_B][0],
4025 priv->TxPwrbandEdgeHt20[RF90_PATH_B][1]);
4027 RT_TRACE((COMP_INIT&COMP_DBG), "RF-A OFDM band-edge low/high power diff = 0x%x/0x%x\n",
4028 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0],
4029 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1]);
4030 RT_TRACE((COMP_INIT&COMP_DBG), "RF-B OFDM band-edge low/high power diff = 0x%x/0x%x\n",
4031 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][0],
4032 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][1]);
4033 RT_TRACE((COMP_INIT&COMP_DBG), "Band-edge enable flag = %d\n", priv->TxPwrbandEdgeFlag);
4036 // Update remained HAL variables.
4038 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
4039 priv->LegacyHTTxPowerDiff = priv->EEPROMTxPowerDiff;
4040 priv->TxPowerDiff = priv->EEPROMTxPowerDiff;
4041 //priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);// Antenna B gain offset to antenna A, bit[3:0]
4042 //priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);// Antenna C gain offset to antenna A, bit[7:4]
4043 priv->CrystalCap = priv->EEPROMCrystalCap; // CrystalCap, bit[15:12]
4044 priv->ThermalMeter[0] = (priv->EEPROMThermalMeter&0x1f);// ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
4045 priv->LedStrategy = SW_LED_MODE0;
4047 init_rate_adaptive(dev);
4049 RT_TRACE(COMP_INIT, "<==== ReadAdapterInfo8192SUsb\n");
4051 //return RT_STATUS_SUCCESS;
4057 // Read HW adapter information by E-Fuse or EEPROM according CR9346 reported.
4060 // 1. CR9346 regiser has verified.
4061 // 2. PASSIVE_LEVEL (USB interface)
4063 // Created by Roger, 2008.10.21.
4065 static void rtl8192SU_read_eeprom_info(struct net_device *dev)
4067 struct r8192_priv *priv = ieee80211_priv(dev);
4070 RT_TRACE(COMP_INIT, "====> ReadAdapterInfo8192SUsb\n");
4072 // Retrieve Chip version.
4073 priv->card_8192_version = (VERSION_8192S)((read_nic_dword(dev, PMC_FSM)>>16)&0xF);
4074 RT_TRACE(COMP_INIT, "Chip Version ID: 0x%2x\n", priv->card_8192_version);
4076 tmpU1b = read_nic_byte(dev, EPROM_CMD);//CR9346
4078 // To check system boot selection.
4079 if (tmpU1b & CmdEERPOMSEL)
4081 RT_TRACE(COMP_INIT, "Boot from EEPROM\n");
4082 priv->EepromOrEfuse = TRUE;
4086 RT_TRACE(COMP_INIT, "Boot from EFUSE\n");
4087 priv->EepromOrEfuse = FALSE;
4090 // To check autoload success or not.
4091 if (tmpU1b & CmdEEPROM_En)
4093 RT_TRACE(COMP_INIT, "Autoload OK!!\n");
4094 priv->AutoloadFailFlag=FALSE;
4095 rtl8192SU_ReadAdapterInfo8192SUsb(dev);//eeprom or e-fuse
4098 { // Auto load fail.
4099 RT_TRACE(COMP_INIT, "AutoLoad Fail reported from CR9346!!\n");
4100 priv->AutoloadFailFlag=TRUE;
4101 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(dev);
4103 //if (IS_BOOT_FROM_EFUSE(Adapter))
4104 if(!priv->EepromOrEfuse)
4106 RT_TRACE(COMP_INIT, "Update shadow map for EFuse future use!!\n");
4107 EFUSE_ShadowMapUpdate(dev);
4111 if((priv->RegChannelPlan >= RT_CHANNEL_DOMAIN_MAX) || (pHalData->EEPROMChannelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK))
4113 pMgntInfo->ChannelPlan = HalMapChannelPlan8192S(Adapter, (pHalData->EEPROMChannelPlan & (~(EEPROM_CHANNEL_PLAN_BY_HW_MASK))));
4114 pMgntInfo->bChnlPlanFromHW = (pHalData->EEPROMChannelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) ? TRUE : FALSE; // User cannot change channel plan.
4118 pMgntInfo->ChannelPlan = (RT_CHANNEL_DOMAIN)pMgntInfo->RegChannelPlan;
4121 switch(pMgntInfo->ChannelPlan)
4123 case RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN:
4125 PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
4127 pDot11dInfo->bEnabled = TRUE;
4129 RT_TRACE(COMP_INIT, DBG_LOUD, ("ReadAdapterInfo8187(): Enable dot11d when RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN!\n"));
4133 RT_TRACE(COMP_INIT, DBG_LOUD, ("RegChannelPlan(%d) EEPROMChannelPlan(%d)", pMgntInfo->RegChannelPlan, pHalData->EEPROMChannelPlan));
4134 RT_TRACE(COMP_INIT, DBG_LOUD, ("ChannelPlan = %d\n" , pMgntInfo->ChannelPlan));
4136 RT_TRACE(COMP_INIT, DBG_LOUD, ("<==== ReadAdapterInfo8192S\n"));
4139 RT_TRACE(COMP_INIT, "<==== ReadAdapterInfo8192SUsb\n");
4141 //return RT_STATUS_SUCCESS;
4144 short rtl8192_get_channel_map(struct net_device * dev)
4146 struct r8192_priv *priv = ieee80211_priv(dev);
4147 if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
4148 printk("rtl8180_init:Error channel plan! Set to default.\n");
4149 priv->ChannelPlan= 0;
4151 RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
4153 rtl819x_set_channel_map(priv->ChannelPlan, priv);
4157 short rtl8192_init(struct net_device *dev)
4160 struct r8192_priv *priv = ieee80211_priv(dev);
4162 rtl8192_init_priv_variable(dev);
4163 rtl8192_init_priv_lock(priv);
4164 rtl8192_init_priv_task(dev);
4165 rtl8192_get_eeprom_size(dev);
4166 priv->ops->rtl819x_read_eeprom_info(dev);
4167 rtl8192_get_channel_map(dev);
4169 init_timer(&priv->watch_dog_timer);
4170 priv->watch_dog_timer.data = (unsigned long)dev;
4171 priv->watch_dog_timer.function = watch_dog_timer_callback;
4173 //rtl8192_adapter_start(dev);
4180 /******************************************************************************
4181 *function: This function actually only set RRSR, RATR and BW_OPMODE registers
4182 * not to do all the hw config as its name says
4183 * input: net_device dev
4186 * notice: This part need to modified according to the rate set we filtered
4187 * ****************************************************************************/
4188 void rtl8192_hwconfig(struct net_device* dev)
4190 u32 regRATR = 0, regRRSR = 0;
4191 u8 regBwOpMode = 0, regTmp = 0;
4192 struct r8192_priv *priv = ieee80211_priv(dev);
4194 // Set RRSR, RATR, and BW_OPMODE registers
4196 switch(priv->ieee80211->mode)
4198 case WIRELESS_MODE_B:
4199 regBwOpMode = BW_OPMODE_20MHZ;
4200 regRATR = RATE_ALL_CCK;
4201 regRRSR = RATE_ALL_CCK;
4203 case WIRELESS_MODE_A:
4204 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
4205 regRATR = RATE_ALL_OFDM_AG;
4206 regRRSR = RATE_ALL_OFDM_AG;
4208 case WIRELESS_MODE_G:
4209 regBwOpMode = BW_OPMODE_20MHZ;
4210 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4211 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4213 case WIRELESS_MODE_AUTO:
4215 if (Adapter->bInHctTest)
4217 regBwOpMode = BW_OPMODE_20MHZ;
4218 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4219 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4224 regBwOpMode = BW_OPMODE_20MHZ;
4225 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4226 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4229 case WIRELESS_MODE_N_24G:
4230 // It support CCK rate by default.
4231 // CCK rate will be filtered out only when associated AP does not support it.
4232 regBwOpMode = BW_OPMODE_20MHZ;
4233 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4234 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4236 case WIRELESS_MODE_N_5G:
4237 regBwOpMode = BW_OPMODE_5G;
4238 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4239 regRRSR = RATE_ALL_OFDM_AG;
4243 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4246 ratr_value = regRATR;
4247 if (priv->rf_type == RF_1T2R)
4249 ratr_value &= ~(RATE_ALL_OFDM_2SS);
4251 write_nic_dword(dev, RATR0, ratr_value);
4252 write_nic_byte(dev, UFWP, 1);
4254 regTmp = read_nic_byte(dev, 0x313);
4255 regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
4256 write_nic_dword(dev, RRSR, regRRSR);
4259 // Set Retry Limit here
4261 write_nic_word(dev, RETRY_LIMIT,
4262 priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
4263 priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
4264 // Set Contention Window here
4268 // Set Tx Antenna including Feedback control
4270 // Set Auto Rate fallback control
4278 // Initial HW relted registers.
4281 // Config RTL8192S USB MAC, we should config MAC before download FW.
4283 // 2008.09.03, Added by Roger.
4285 static void rtl8192SU_MacConfigBeforeFwDownloadASIC(struct net_device *dev)
4292 RT_TRACE(COMP_INIT, "--->MacConfigBeforeFwDownloadASIC()\n");
4294 //2MAC Initialization for power on sequence, Revised by Roger. 2008.09.03.
4297 //<Roger_Notes> Set control path switch to HW control and reset Digital Core, CPU Core and
4298 // MAC I/O to solve FW download fail when system from resume sate.
4301 tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4305 write_nic_byte(dev, SYS_CLKR+1, tmpU1b);
4307 // Clear FW RPWM for FW control LPS. by tynli. 2009.02.23
4308 write_nic_byte(dev, RPWM, 0x0);
4310 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4312 write_nic_byte(dev, SYS_FUNC_EN+1, tmpU1b);
4315 //Revised POS, suggested by SD1 Alex, 2008.09.27.
4316 write_nic_byte(dev, SPS0_CTRL+1, 0x53);
4317 write_nic_byte(dev, SPS0_CTRL, 0x57);
4319 //Enable AFE Macro Block's Bandgap adn Enable AFE Macro Block's Mbias
4320 tmpU1b = read_nic_byte(dev, AFE_MISC);
4321 write_nic_byte(dev, AFE_MISC, (tmpU1b|AFE_BGEN|AFE_MBEN));
4323 //Enable PLL Power (LDOA15V)
4324 tmpU1b = read_nic_byte(dev, LDOA15_CTRL);
4325 write_nic_byte(dev, LDOA15_CTRL, (tmpU1b|LDA15_EN));
4327 //Enable LDOV12D block
4328 tmpU1b = read_nic_byte(dev, LDOV12D_CTRL);
4329 write_nic_byte(dev, LDOV12D_CTRL, (tmpU1b|LDV12_EN));
4331 //mpU1b = read_nic_byte(Adapter, SPS1_CTRL);
4332 //write_nic_byte(dev, SPS1_CTRL, (tmpU1b|SPS1_LDEN));
4334 //PlatformSleepUs(2000);
4336 //Enable Switch Regulator Block
4337 //tmpU1b = read_nic_byte(Adapter, SPS1_CTRL);
4338 //write_nic_byte(dev, SPS1_CTRL, (tmpU1b|SPS1_SWEN));
4340 //write_nic_dword(Adapter, SPS1_CTRL, 0x00a7b267);
4342 tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL+1);
4343 write_nic_byte(dev, SYS_ISO_CTRL+1, (tmpU1b|0x08));
4345 //Engineer Packet CP test Enable
4346 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4347 write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x20));
4349 //Support 64k IMEM, suggested by SD1 Alex.
4350 tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL+1);
4351 write_nic_byte(dev, SYS_ISO_CTRL+1, (tmpU1b& 0x68));
4354 tmpU1b = read_nic_byte(dev, AFE_XTAL_CTRL+1);
4355 write_nic_byte(dev, AFE_XTAL_CTRL+1, (tmpU1b& 0xfb));
4357 //Enable AFE PLL Macro Block
4358 tmpU1b = read_nic_byte(dev, AFE_PLL_CTRL);
4359 write_nic_byte(dev, AFE_PLL_CTRL, (tmpU1b|0x11));
4361 //Attatch AFE PLL to MACTOP/BB/PCIe Digital
4362 tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL);
4363 write_nic_byte(dev, SYS_ISO_CTRL, (tmpU1b&0xEE));
4365 // Switch to 40M clock
4366 write_nic_byte(dev, SYS_CLKR, 0x00);
4369 tmpU1b = read_nic_byte(dev, SYS_CLKR);
4370 //write_nic_byte(dev, SYS_CLKR, (tmpU1b&0x5f));
4371 write_nic_byte(dev, SYS_CLKR, (tmpU1b|0xa0));
4374 tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4375 write_nic_byte(dev, SYS_CLKR+1, (tmpU1b|0x18));
4377 //Revised POS, suggested by SD1 Alex, 2008.09.27.
4378 write_nic_byte(dev, PMC_FSM, 0x02);
4380 //Enable Core digital and enable IOREG R/W
4381 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4382 write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x08));
4385 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4386 write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x80));
4388 //Switch the control path to FW
4389 tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4390 write_nic_byte(dev, SYS_CLKR+1, (tmpU1b|0x80)& 0xBF);
4392 write_nic_byte(dev, CMDR, 0xFC);
4393 write_nic_byte(dev, CMDR+1, 0x37);
4395 //Fix the RX FIFO issue(usb error), 970410
4396 tmpU1b = read_nic_byte_E(dev, 0x5c);
4397 write_nic_byte_E(dev, 0x5c, (tmpU1b|BIT7));
4399 //For power save, used this in the bit file after 970621
4400 tmpU1b = read_nic_byte(dev, SYS_CLKR);
4401 write_nic_byte(dev, SYS_CLKR, tmpU1b&(~SYS_CPU_CLKSEL));
4403 // Revised for 8051 ROM code wrong operation. Added by Roger. 2008.10.16.
4404 write_nic_byte_E(dev, 0x1c, 0x80);
4407 // <Roger_EXP> To make sure that TxDMA can ready to download FW.
4408 // We should reset TxDMA if IMEM RPT was not ready.
4409 // Suggested by SD1 Alex. 2008.10.23.
4413 tmpU1b = read_nic_byte(dev, TCR);
4414 if((tmpU1b & TXDMA_INIT_VALUE) == TXDMA_INIT_VALUE)
4416 //PlatformStallExecution(5);
4418 }while(PollingCnt--); // Delay 1ms
4420 if(PollingCnt <= 0 )
4422 RT_TRACE(COMP_INIT, "MacConfigBeforeFwDownloadASIC(): Polling TXDMA_INIT_VALUE timeout!! Current TCR(%#x)\n", tmpU1b);
4423 tmpU1b = read_nic_byte(dev, CMDR);
4424 write_nic_byte(dev, CMDR, tmpU1b&(~TXDMA_EN));
4426 write_nic_byte(dev, CMDR, tmpU1b|TXDMA_EN);// Reset TxDMA
4430 RT_TRACE(COMP_INIT, "<---MacConfigBeforeFwDownloadASIC()\n");
4435 // Initial HW relted registers.
4438 // 1. This function is only invoked at driver intialization once.
4439 // 2. PASSIVE LEVEL.
4441 // 2008.06.10, Added by Roger.
4443 static void rtl8192SU_MacConfigAfterFwDownload(struct net_device *dev)
4445 struct r8192_priv *priv = ieee80211_priv((struct net_device *)dev);
4446 //PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
4447 //u8 tmpU1b, RxPageCfg, i;
4452 RT_TRACE(COMP_INIT, "--->MacConfigAfterFwDownload()\n");
4455 tmpU2b = (BBRSTn|BB_GLB_RSTn|SCHEDULE_EN|MACRXEN|MACTXEN|DDMA_EN|
4456 FW2HW_EN|RXDMA_EN|TXDMA_EN|HCI_RXDMA_EN|HCI_TXDMA_EN); //3
4457 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_COMMAND, &tmpU1b );
4458 write_nic_word(dev, CMDR, tmpU2b); //LZM REGISTER COM 090305
4460 // Loopback mode or not
4461 priv->LoopbackMode = RTL8192SU_NO_LOOPBACK; // Set no loopback as default.
4462 if(priv->LoopbackMode == RTL8192SU_NO_LOOPBACK)
4463 tmpU1b = LBK_NORMAL;
4464 else if (priv->LoopbackMode == RTL8192SU_MAC_LOOPBACK )
4465 tmpU1b = LBK_MAC_DLB;
4467 RT_TRACE(COMP_INIT, "Serious error: wrong loopback mode setting\n");
4469 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_LBK_MODE, &tmpU1b);
4470 write_nic_byte(dev, LBKMD_SEL, tmpU1b);
4473 write_nic_dword(dev, RCR, priv->ReceiveConfig);
4474 RT_TRACE(COMP_INIT, "MacConfigAfterFwDownload(): Current RCR settings(%#x)\n", priv->ReceiveConfig);
4479 // <Roger_Notes> 2008.08.18.
4481 // (1) Page number on CMDQ is 0x03.
4482 // (2) Page number on BCNQ, HQ and MGTQ is 0.
4483 // (3) Page number on BKQ, BEQ, VIQ and VOQ are 0x07.
4484 // (4) Page number on PUBQ is 0xdd
4487 // (1) Page number on CMDQ is 0x00.
4488 // (2) Page number on BCNQ is 0x02, HQ and MGTQ are 0x03.
4489 // (3) Page number on BKQ, BEQ, VIQ and VOQ are 0x07.
4490 // (4) Page number on PUBQ is 0xd8
4492 //write_nic_dword(Adapter, 0xa0, 0x07070707); //BKQ, BEQ, VIQ and VOQ
4493 //write_nic_byte(dev, 0xa4, 0x00); // HCCAQ
4495 // Fix the RX FIFO issue(USB error), Rivesed by Roger, 2008-06-14
4496 tmpU1b = read_nic_byte_E(dev, 0x5C);
4497 write_nic_byte_E(dev, 0x5C, tmpU1b|BIT7);
4499 // For EFUSE init configuration.
4500 //if (IS_BOOT_FROM_EFUSE(Adapter)) // We may R/W EFUSE in EFUSE mode
4501 if (priv->bBootFromEfuse)
4505 tempval = read_nic_byte(dev, SYS_ISO_CTRL+1);
4507 write_nic_byte(dev, SYS_ISO_CTRL+1, tempval);
4509 // Enable LDO 2.5V for write action
4510 //tempval = read_nic_byte(Adapter, EFUSE_TEST+3);
4511 //write_nic_byte(Adapter, EFUSE_TEST+3, (tempval | 0x80));
4513 // Change Efuse Clock for write action
4514 //write_nic_byte(Adapter, EFUSE_CLK, 0x03);
4516 // Change Program timing
4517 write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
4518 //printk("!!!!!!!!!!!!!!!!!!!!!%s: write 0x33 with 0x72\n",__FUNCTION__);
4519 RT_TRACE(COMP_INIT, "EFUSE CONFIG OK\n");
4523 RT_TRACE(COMP_INIT, "<---MacConfigAfterFwDownload()\n");
4526 void rtl8192SU_HwConfigureRTL8192SUsb(struct net_device *dev)
4529 struct r8192_priv *priv = ieee80211_priv(dev);
4531 u32 regRATR = 0, regRRSR = 0;
4535 //1 This part need to modified according to the rate set we filtered!!
4537 // Set RRSR, RATR, and BW_OPMODE registers
4539 switch(priv->ieee80211->mode)
4541 case WIRELESS_MODE_B:
4542 regBwOpMode = BW_OPMODE_20MHZ;
4543 regRATR = RATE_ALL_CCK;
4544 regRRSR = RATE_ALL_CCK;
4546 case WIRELESS_MODE_A:
4547 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
4548 regRATR = RATE_ALL_OFDM_AG;
4549 regRRSR = RATE_ALL_OFDM_AG;
4551 case WIRELESS_MODE_G:
4552 regBwOpMode = BW_OPMODE_20MHZ;
4553 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4554 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4556 case WIRELESS_MODE_AUTO:
4557 if (priv->bInHctTest)
4559 regBwOpMode = BW_OPMODE_20MHZ;
4560 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4561 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4565 regBwOpMode = BW_OPMODE_20MHZ;
4566 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4567 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4570 case WIRELESS_MODE_N_24G:
4571 // It support CCK rate by default.
4572 // CCK rate will be filtered out only when associated AP does not support it.
4573 regBwOpMode = BW_OPMODE_20MHZ;
4574 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4575 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4577 case WIRELESS_MODE_N_5G:
4578 regBwOpMode = BW_OPMODE_5G;
4579 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4580 regRRSR = RATE_ALL_OFDM_AG;
4585 // <Roger_Notes> We disable CCK response rate until FIB CCK rate IC's back.
4588 regTmp = read_nic_byte(dev, INIRTSMCS_SEL);
4589 regRRSR = ((regRRSR & 0x000fffff)<<8) | regTmp;
4592 // Update SIFS timing.
4594 //priv->SifsTime = 0x0e0e0a0a;
4595 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SIFS, (pu1Byte)&pHalData->SifsTime);
4596 { u8 val[4] = {0x0e, 0x0e, 0x0a, 0x0a};
4597 // SIFS for CCK Data ACK
4598 write_nic_byte(dev, SIFS_CCK, val[0]);
4599 // SIFS for CCK consecutive tx like CTS data!
4600 write_nic_byte(dev, SIFS_CCK+1, val[1]);
4602 // SIFS for OFDM Data ACK
4603 write_nic_byte(dev, SIFS_OFDM, val[2]);
4604 // SIFS for OFDM consecutive tx like CTS data!
4605 write_nic_byte(dev, SIFS_OFDM+1, val[3]);
4608 write_nic_dword(dev, INIRTSMCS_SEL, regRRSR);
4609 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4612 // Suggested by SD1 Alex, 2008-06-14.
4614 //PlatformEFIOWrite1Byte(Adapter, TXOP_STALL_CTRL, 0x80);//NAV to protect all TXOP.
4617 // Set Data Auto Rate Fallback Retry Count register.
4619 write_nic_dword(dev, DARFRC, 0x02010000);
4620 write_nic_dword(dev, DARFRC+4, 0x06050403);
4621 write_nic_dword(dev, RARFRC, 0x02010000);
4622 write_nic_dword(dev, RARFRC+4, 0x06050403);
4624 // Set Data Auto Rate Fallback Reg. Added by Roger, 2008.09.22.
4625 for (i = 0; i < 8; i++)
4626 write_nic_dword(dev, ARFR0+i*4, 0x1f0ffff0);
4629 // Aggregation length limit. Revised by Roger. 2008.09.22.
4631 write_nic_byte(dev, AGGLEN_LMT_H, 0x0f); // Set AMPDU length to 12Kbytes for ShortGI case.
4632 write_nic_dword(dev, AGGLEN_LMT_L, 0xddd77442); // Long GI
4633 write_nic_dword(dev, AGGLEN_LMT_L+4, 0xfffdd772);
4635 // Set NAV protection length
4636 write_nic_word(dev, NAV_PROT_LEN, 0x0080);
4638 // Set TXOP stall control for several queue/HI/BCN/MGT/
4639 write_nic_byte(dev, TXOP_STALL_CTRL, 0x00); // NAV Protect next packet.
4641 // Set MSDU lifetime.
4642 write_nic_byte(dev, MLT, 0x8f);
4644 // Set CCK/OFDM SIFS
4645 write_nic_word(dev, SIFS_CCK, 0x0a0a); // CCK SIFS shall always be 10us.
4646 write_nic_word(dev, SIFS_OFDM, 0x0e0e);
4648 write_nic_byte(dev, ACK_TIMEOUT, 0x40);
4651 write_nic_byte(dev, CFEND_TH, 0xFF);
4654 // For Min Spacing configuration.
4656 switch(priv->rf_type)
4660 RT_TRACE(COMP_INIT, "Initializeadapter: RF_Type%s\n", (priv->rf_type==RF_1T1R? "(1T1R)":"(1T2R)"));
4661 priv->MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
4665 RT_TRACE(COMP_INIT, "Initializeadapter:RF_Type(2T2R)\n");
4666 priv->MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
4669 write_nic_byte(dev, AMPDU_MIN_SPACE, priv->MinSpaceCfg);
4673 // For Min Spacing configuration.
4675 //priv->MinSpaceCfg = 0x00;
4676 //rtl8192SU_SetHwRegAmpduMinSpace(dev, priv->MinSpaceCfg);
4680 // Description: Initial HW relted registers.
4682 // Assumption: This function is only invoked at driver intialization once.
4684 // 2008.06.10, Added by Roger.
4685 bool rtl8192SU_adapter_start(struct net_device *dev)
4687 struct r8192_priv *priv = ieee80211_priv(dev);
4688 //u32 dwRegRead = 0;
4689 //bool init_status = true;
4691 bool rtStatus = true;
4693 //u8 eRFPath, tmpU1b;
4694 u8 fw_download_times = 1;
4697 RT_TRACE(COMP_INIT, "--->InitializeAdapter8192SUsb()\n");
4699 //pHalData->bGPIOChangeRF = FALSE;
4703 // <Roger_Notes> 2008.06.15.
4705 // Initialization Steps on RTL8192SU:
4706 // a. MAC initialization prior to sending down firmware code.
4707 // b. Download firmware code step by step(i.e., IMEM, EMEM, DMEM).
4708 // c. MAC configuration after firmware has been download successfully.
4709 // d. Initialize BB related configurations.
4710 // e. Initialize RF related configurations.
4711 // f. Start to BulkIn transfer.
4715 //a. MAC initialization prior to send down firmware code.
4718 rtl8192SU_MacConfigBeforeFwDownloadASIC(dev);
4721 //b. Download firmware code step by step(i.e., IMEM, EMEM, DMEM).
4723 rtStatus = FirmwareDownload92S(dev);
4724 if(rtStatus != true)
4726 if(fw_download_times == 1){
4727 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Download Firmware failed once, Download again!!\n");
4728 fw_download_times = fw_download_times + 1;
4731 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Download Firmware failed twice, end!!\n");
4736 //c. MAC configuration after firmware has been download successfully.
4738 rtl8192SU_MacConfigAfterFwDownload(dev);
4740 //priv->bLbusEnable = TRUE;
4741 //if(priv->RegRfOff == TRUE)
4742 // priv->eRFPowerState = eRfOff;
4744 // Save target channel
4745 // <Roger_Notes> Current Channel will be updated again later.
4746 //priv->CurrentChannel = Channel;
4747 rtStatus = PHY_MACConfig8192S(dev);//===>ok
4748 if(rtStatus != true)
4750 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure MAC!!\n");
4756 write_nic_dword(dev,WDCAPARA_ADD[i], 0x5e4322);
4757 write_nic_byte(dev,AcmHwCtrl, 0x01);
4762 //d. Initialize BB related configurations.
4765 rtStatus = PHY_BBConfig8192S(dev);//===>ok
4766 if(rtStatus != true)
4768 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure BB!!\n");
4772 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x58);//===>ok
4775 // e. Initialize RF related configurations.
4777 // 2007/11/02 MH Before initalizing RF. We can not use FW to do RF-R/W.
4778 priv->Rf_Mode = RF_OP_By_SW_3wire;
4780 // For RF test only from Scott's suggestion
4781 //write_nic_byte(dev, 0x27, 0xDB);
4782 //write_nic_byte(dev, 0x1B, 0x07);
4785 write_nic_byte(dev, AFE_XTAL_CTRL+1, 0xDB);
4787 // <Roger_Notes> The following IOs are configured for each RF modules.
4788 // Enable RF module and reset RF and SDM module. 2008.11.17.
4789 if(priv->card_8192_version == VERSION_8192S_ACUT)
4790 write_nic_byte(dev, SPS1_CTRL+3, (u8)(RF_EN|RF_RSTB|RF_SDMRSTB)); // Fix A-Cut bug.
4792 write_nic_byte(dev, RF_CTRL, (u8)(RF_EN|RF_RSTB|RF_SDMRSTB));
4794 rtStatus = PHY_RFConfig8192S(dev);//===>ok
4795 if(rtStatus != true)
4797 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure RF!!\n");
4802 // Set CCK and OFDM Block "ON"
4803 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
4804 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
4807 // Turn off Radio B while RF type is 1T1R by SD3 Wilsion's request.
4808 // Revised by Roger, 2008.12.18.
4810 if(priv->rf_type == RF_1T1R)
4812 // This is needed for PHY_REG after 20081219
4813 rtl8192_setBBreg(dev, rFPGA0_RFMOD, 0xff000000, 0x03);
4814 // This is needed for PHY_REG before 20081219
4815 //PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x11);
4820 // Set CCK and OFDM Block "ON"
4821 //rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
4822 //rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
4825 //3//Get hardware version, do it in read eeprom?
4826 //GetHardwareVersion819xUsb(Adapter);
4831 rtl8192SU_HwConfigureRTL8192SUsb(dev);//==>ok
4834 // <Roger_Notes> We set MAC address here if autoload was failed before,
4835 // otherwise IDR0 will NOT contain any value.
4837 write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
4838 write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
4839 if(!priv->bInHctTest)
4841 if(priv->ResetProgress == RESET_TYPE_NORESET)
4843 //RT_TRACE(COMP_MLME, DBG_LOUD, ("Initializeadapter8192SUsb():RegWirelessMode(%#x) \n", Adapter->RegWirelessMode));
4844 //Adapter->HalFunc.SetWirelessModeHandler(Adapter, Adapter->RegWirelessMode);
4845 rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);//===>ok
4850 priv->ieee80211->mode = WIRELESS_MODE_G;
4851 rtl8192_SetWirelessMode(dev, WIRELESS_MODE_G);
4855 //-----------------------------------------------------------------------------
4856 // Set up security related. 070106, by rcnjko:
4857 // 1. Clear all H/W keys.
4858 // 2. Enable H/W encryption/decryption.
4859 //-----------------------------------------------------------------------------
4860 //CamResetAllEntry(Adapter);
4861 //Adapter->HalFunc.EnableHWSecCfgHandler(Adapter);
4863 //SecClearAllKeys(Adapter);
4864 CamResetAllEntry(dev);
4867 u8 SECR_value = 0x0;
4868 SECR_value |= SCR_TxEncEnable;
4869 SECR_value |= SCR_RxDecEnable;
4870 SECR_value |= SCR_NoSKMC;
4871 write_nic_byte(dev, SECR, SECR_value);
4876 //PHY_UpdateInitialGain(dev);
4878 if(priv->RegRfOff == true)
4879 { // User disable RF via registry.
4882 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): Turn off RF for RegRfOff ----------\n");
4883 MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_SW);
4884 // Those action will be discard in MgntActSet_RF_State because off the same state
4885 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
4886 rtl8192_setBBreg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
4888 else if(priv->RfOffReason > RF_CHANGE_BY_PS)
4889 { // H/W or S/W RF OFF before sleep.
4890 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): Turn off RF for RfOffReason(%d) ----------\n", priv->RfOffReason);
4891 MgntActSet_RF_State(dev, eRfOff, priv->RfOffReason);
4895 priv->eRFPowerState = eRfOn;
4896 priv->RfOffReason = 0;
4897 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): RF is on ----------\n");
4904 // f. Start to BulkIn transfer.
4911 PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
4913 for(PipeIndex=0; PipeIndex < MAX_RX_QUEUE; PipeIndex++)
4918 HalUsbInMpdu(Adapter, PipeIndex);
4922 //HalUsbInMpdu(Adapter, PipeIndex);
4923 //HalUsbInMpdu(Adapter, PipeIndex);
4924 //HalUsbInMpdu(Adapter, PipeIndex);
4927 PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
4930 // Joseph add to 819X code base for Vista USB platform.
4931 // This part may need to be add to Hal819xU code base. too.
4932 PlatformUsbEnableInPipes(Adapter);
4935 RT_TRACE(COMP_INIT, "HighestOperaRate = %x\n", Adapter->MgntInfo.HighestOperaRate);
4937 PlatformStartWorkItem( &(pHalData->RtUsbCheckForHangWorkItem) );
4940 // <Roger_EXP> The following configurations are for ASIC verification temporally.
4947 // Read EEPROM TX power index and PHY_REG_PG.txt to capture correct
4948 // TX power index for different rate set.
4950 //if(priv->card_8192_version >= VERSION_8192S_ACUT)
4952 // Get original hw reg values
4953 PHY_GetHWRegOriginalValue(dev);
4955 // Write correct tx power index//FIXLZM
4956 PHY_SetTxPowerLevel8192S(dev, priv->chan);
4961 // EEPROM R/W workaround
4962 tmpU1b = read_nic_byte(dev, MAC_PINMUX_CFG);
4963 write_nic_byte(dev, MAC_PINMUX_CFG, tmpU1b&(~GPIOMUX_EN));
4967 //<Roger_Notes> 2008.08.19.
4968 // We return status here for temporal FPGA verification, 2008.08.19.
4970 #ifdef RTL8192SU_FW_IQK
4971 write_nic_dword(dev, WFM5, FW_IQK_ENABLE);
4972 ChkFwCmdIoDone(dev);
4976 // <Roger_Notes> We enable high power mechanism after NIC initialized.
4979 write_nic_dword(dev, WFM5, FW_RA_RESET);
4980 ChkFwCmdIoDone(dev);
4981 write_nic_dword(dev, WFM5, FW_RA_ACTIVE);
4982 ChkFwCmdIoDone(dev);
4983 write_nic_dword(dev, WFM5, FW_RA_REFRESH);
4984 ChkFwCmdIoDone(dev);
4985 write_nic_dword(dev, WFM5, FW_BB_RESET_ENABLE);
4987 // <Roger_Notes> We return status here for temporal FPGA verification. 2008.05.12.
4994 /***************************************************************************
4995 -------------------------------NET STUFF---------------------------
4996 ***************************************************************************/
4998 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
5000 struct r8192_priv *priv = ieee80211_priv(dev);
5002 return &priv->ieee80211->stats;
5006 HalTxCheckStuck819xUsb(
5007 struct net_device *dev
5010 struct r8192_priv *priv = ieee80211_priv(dev);
5011 u16 RegTxCounter = read_nic_word(dev, 0x128);
5012 bool bStuck = FALSE;
5013 RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
5014 if(priv->TxCounter==RegTxCounter)
5017 priv->TxCounter = RegTxCounter;
5023 * <Assumption: RT_TX_SPINLOCK is acquired.>
5024 * First added: 2006.11.19 by emily
5027 TxCheckStuck(struct net_device *dev)
5029 struct r8192_priv *priv = ieee80211_priv(dev);
5032 // u8 ResetThreshold;
5033 bool bCheckFwTxCnt = false;
5034 //unsigned long flags;
5037 // Decide Stuch threshold according to current power save mode
5040 // RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
5041 // PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
5042 // spin_lock_irqsave(&priv->ieee80211->lock,flags);
5043 for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
5045 if(QueueID == TXCMD_QUEUE)
5048 if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
5052 bCheckFwTxCnt = true;
5054 // PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
5055 // spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
5056 // RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
5060 if(HalTxCheckStuck819xUsb(dev))
5062 RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
5063 return RESET_TYPE_SILENT;
5067 return RESET_TYPE_NORESET;
5071 HalRxCheckStuck819xUsb(struct net_device *dev)
5073 u16 RegRxCounter = read_nic_word(dev, 0x130);
5074 struct r8192_priv *priv = ieee80211_priv(dev);
5075 bool bStuck = FALSE;
5079 static u8 rx_chk_cnt = 0;
5080 RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
5081 // If rssi is small, we should check rx for long time because of bad rx.
5082 // or maybe it will continuous silent reset every 2 seconds.
5084 if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
5086 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
5088 else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
5089 ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
5090 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
5101 else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
5102 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
5103 priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
5107 //DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
5113 //DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
5120 //DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
5126 //DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
5131 if(priv->RxCounter==RegRxCounter)
5134 priv->RxCounter = RegRxCounter;
5140 RxCheckStuck(struct net_device *dev)
5142 struct r8192_priv *priv = ieee80211_priv(dev);
5144 bool bRxCheck = FALSE;
5146 // RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
5147 //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
5149 if(priv->IrpPendingCount > 1)
5151 //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
5153 // RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
5156 if(HalRxCheckStuck819xUsb(dev))
5158 RT_TRACE(COMP_RESET, "RxStuck Condition\n");
5159 return RESET_TYPE_SILENT;
5162 return RESET_TYPE_NORESET;
5167 * This function is called by Checkforhang to check whether we should ask OS to reset driver
5169 * \param pAdapter The adapter context for this miniport
5171 * Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
5172 * to judge whether there is tx stuck.
5173 * Note: This function may be required to be rewrite for Vista OS.
5174 * <<<Assumption: Tx spinlock has been acquired >>>
5176 * 8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
5179 rtl819x_ifcheck_resetornot(struct net_device *dev)
5181 struct r8192_priv *priv = ieee80211_priv(dev);
5182 RESET_TYPE TxResetType = RESET_TYPE_NORESET;
5183 RESET_TYPE RxResetType = RESET_TYPE_NORESET;
5184 RT_RF_POWER_STATE rfState;
5186 return RESET_TYPE_NORESET;
5188 rfState = priv->ieee80211->eRFPowerState;
5190 TxResetType = TxCheckStuck(dev);
5192 if( rfState != eRfOff ||
5193 /*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
5194 (priv->ieee80211->iw_mode != IW_MODE_ADHOC))
5196 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
5197 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
5198 // if driver is in firmware download failure status, driver should initialize RF in the following
5199 // silent reset procedure Emily, 2008.01.21
5201 // Driver should not check RX stuck in IBSS mode because it is required to
5202 // set Check BSSID in order to send beacon, however, if check BSSID is
5203 // set, STA cannot hear any packet a all. Emily, 2008.04.12
5204 RxResetType = RxCheckStuck(dev);
5207 if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
5208 return RESET_TYPE_NORMAL;
5209 else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
5210 RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
5211 return RESET_TYPE_SILENT;
5214 return RESET_TYPE_NORESET;
5218 void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
5219 int _rtl8192_up(struct net_device *dev);
5220 int rtl8192_close(struct net_device *dev);
5225 CamRestoreAllEntry( struct net_device *dev)
5228 struct r8192_priv *priv = ieee80211_priv(dev);
5229 u8* MacAddr = priv->ieee80211->current_network.bssid;
5231 static u8 CAM_CONST_ADDR[4][6] = {
5232 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
5233 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
5234 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
5235 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
5236 static u8 CAM_CONST_BROAD[] =
5237 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
5239 RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
5242 if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
5243 (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
5246 for(EntryId=0; EntryId<4; EntryId++)
5249 MacAddr = CAM_CONST_ADDR[EntryId];
5253 priv->ieee80211->pairwise_key_type,
5261 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
5265 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5269 priv->ieee80211->pairwise_key_type,
5277 priv->ieee80211->pairwise_key_type,
5283 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
5287 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5291 priv->ieee80211->pairwise_key_type,
5299 priv->ieee80211->pairwise_key_type,
5308 if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
5310 MacAddr = CAM_CONST_BROAD;
5311 for(EntryId=1 ; EntryId<4 ; EntryId++)
5317 priv->ieee80211->group_key_type,
5323 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5327 priv->ieee80211->group_key_type,
5332 else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
5334 MacAddr = CAM_CONST_BROAD;
5335 for(EntryId=1; EntryId<4 ; EntryId++)
5341 priv->ieee80211->group_key_type,
5348 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5352 priv->ieee80211->group_key_type,
5358 //////////////////////////////////////////////////////////////
5359 // This function is used to fix Tx/Rx stop bug temporarily.
5360 // This function will do "system reset" to NIC when Tx or Rx is stuck.
5361 // The method checking Tx/Rx stuck of this function is supported by FW,
5362 // which reports Tx and Rx counter to register 0x128 and 0x130.
5363 //////////////////////////////////////////////////////////////
5365 rtl819x_ifsilentreset(struct net_device *dev)
5367 //OCTET_STRING asocpdu;
5368 struct r8192_priv *priv = ieee80211_priv(dev);
5370 int reset_status = 0;
5371 struct ieee80211_device *ieee = priv->ieee80211;
5374 // 2007.07.20. If we need to check CCK stop, please uncomment this line.
5375 //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
5377 if(priv->ResetProgress==RESET_TYPE_NORESET)
5381 RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
5383 // Set the variable for reset.
5384 priv->ResetProgress = RESET_TYPE_SILENT;
5385 // rtl8192_close(dev);
5387 down(&priv->wx_sem);
5390 RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
5395 RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
5396 // if(!netif_queue_stopped(dev))
5397 // netif_stop_queue(dev);
5399 rtl8192_rtx_disable(dev);
5400 rtl8192_cancel_deferred_work(priv);
5402 del_timer_sync(&priv->watch_dog_timer);
5404 ieee->sync_scan_hurryup = 1;
5405 if(ieee->state == IEEE80211_LINKED)
5407 down(&ieee->wx_sem);
5408 printk("ieee->state is IEEE80211_LINKED\n");
5409 ieee80211_stop_send_beacons(priv->ieee80211);
5410 del_timer_sync(&ieee->associate_timer);
5411 cancel_delayed_work(&ieee->associate_retry_wq);
5412 ieee80211_stop_scan(ieee);
5413 netif_carrier_off(dev);
5417 printk("ieee->state is NOT LINKED\n");
5418 ieee80211_softmac_stop_protocol(priv->ieee80211); }
5420 RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
5421 //rtl8192_irq_disable(dev);
5422 RT_TRACE(COMP_RESET,"%s():===========>start to up the driver\n",__FUNCTION__);
5423 reset_status = _rtl8192_up(dev);
5425 RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
5426 if(reset_status == -EAGAIN)
5435 RT_TRACE(COMP_ERR," ERR!!! %s(): Reset Failed!!\n", __FUNCTION__);
5439 ieee->is_silent_reset = 1;
5441 EnableHWSecurityConfig8192(dev);
5443 if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
5445 ieee->set_chan(ieee->dev, ieee->current_network.channel);
5448 queue_work(ieee->wq, &ieee->associate_complete_wq);
5452 else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
5454 ieee->set_chan(ieee->dev, ieee->current_network.channel);
5455 ieee->link_change(ieee->dev);
5457 // notify_wx_assoc_event(ieee);
5459 ieee80211_start_send_beacons(ieee);
5461 if (ieee->data_hard_resume)
5462 ieee->data_hard_resume(ieee->dev);
5463 netif_carrier_on(ieee->dev);
5467 CamRestoreAllEntry(dev);
5469 priv->ResetProgress = RESET_TYPE_NORESET;
5470 priv->reset_count++;
5472 priv->bForcedSilentReset =false;
5473 priv->bResetInProgress = false;
5475 // For test --> force write UFWP.
5476 write_nic_byte(dev, UFWP, 1);
5477 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
5482 void CAM_read_entry(
5483 struct net_device *dev,
5487 u32 target_command=0;
5488 u32 target_content=0;
5492 // printk("=======>start read CAM\n");
5493 for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
5495 // polling bit, and No Write enable, and address
5496 target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
5497 target_command= target_command | BIT31;
5499 //Check polling bit is clear
5504 ulStatus = read_nic_dword(dev, RWCAM);
5505 if(ulStatus & BIT31){
5513 write_nic_dword(dev, RWCAM, target_command);
5514 RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
5515 // printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
5516 target_content = read_nic_dword(dev, RCAMO);
5517 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
5518 // printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
5523 void rtl819x_update_rxcounts(
5524 struct r8192_priv *priv,
5533 *TotalRxDataNum = 0;
5535 SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
5536 priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
5537 priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
5538 for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
5539 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
5540 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
5544 extern void rtl819x_watchdog_wqcallback(struct work_struct *work)
5546 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
5547 struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
5548 struct net_device *dev = priv->ieee80211->dev;
5549 struct ieee80211_device* ieee = priv->ieee80211;
5550 RESET_TYPE ResetType = RESET_TYPE_NORESET;
5551 static u8 check_reset_cnt=0;
5552 bool bBusyTraffic = false;
5556 hal_dm_watchdog(dev);
5558 {//to get busy traffic condition
5559 if(ieee->state == IEEE80211_LINKED)
5561 //windows mod 666 to 100.
5562 //if( ieee->LinkDetectInfo.NumRxOkInPeriod> 666 ||
5563 // ieee->LinkDetectInfo.NumTxOkInPeriod> 666 ) {
5564 if( ieee->LinkDetectInfo.NumRxOkInPeriod> 100 ||
5565 ieee->LinkDetectInfo.NumTxOkInPeriod> 100 ) {
5566 bBusyTraffic = true;
5568 ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
5569 ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
5570 ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
5573 //added by amy for AP roaming
5575 if(priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA)
5577 u32 TotalRxBcnNum = 0;
5578 u32 TotalRxDataNum = 0;
5580 rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
5581 if((TotalRxBcnNum+TotalRxDataNum) == 0)
5584 if(rfState == eRfOff)
5585 RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
5587 printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
5588 // Dot11d_Reset(dev);
5589 priv->ieee80211->state = IEEE80211_ASSOCIATING;
5590 notify_wx_assoc_event(priv->ieee80211);
5591 RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
5592 ieee->is_roaming = true;
5593 priv->ieee80211->link_change(dev);
5594 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
5597 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod=0;
5598 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod=0;
5600 // CAM_read_entry(dev,4);
5601 //check if reset the driver
5602 if(check_reset_cnt++ >= 3 && !ieee->is_roaming)
5604 ResetType = rtl819x_ifcheck_resetornot(dev);
5605 check_reset_cnt = 3;
5606 //DbgPrint("Start to check silent reset\n");
5608 // 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);
5610 if( (priv->force_reset) || (priv->ResetProgress==RESET_TYPE_NORESET &&
5611 (priv->bForcedSilentReset ||
5612 (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))) // This is control by OID set in Pomelo
5614 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);
5615 rtl819x_ifsilentreset(dev);
5618 priv->force_reset = false;
5619 priv->bForcedSilentReset = false;
5620 priv->bResetInProgress = false;
5621 RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
5625 void watch_dog_timer_callback(unsigned long data)
5627 struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
5628 //printk("===============>watch_dog timer\n");
5629 queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
5630 mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
5632 int _rtl8192_up(struct net_device *dev)
5634 struct r8192_priv *priv = ieee80211_priv(dev);
5636 int init_status = 0;
5638 priv->ieee80211->ieee_up=1;
5639 RT_TRACE(COMP_INIT, "Bringing up iface");
5640 init_status = priv->ops->rtl819x_adapter_start(dev);
5643 RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n", __FUNCTION__);
5644 priv->up=priv->ieee80211->ieee_up = 0;
5647 RT_TRACE(COMP_INIT, "start adapter finished\n");
5648 rtl8192_rx_enable(dev);
5649 // rtl8192_tx_enable(dev);
5650 if(priv->ieee80211->state != IEEE80211_LINKED)
5651 ieee80211_softmac_start_protocol(priv->ieee80211);
5652 ieee80211_reset_queue(priv->ieee80211);
5653 watch_dog_timer_callback((unsigned long) dev);
5654 if(!netif_queue_stopped(dev))
5655 netif_start_queue(dev);
5657 netif_wake_queue(dev);
5660 * Make sure that drop_unencrypted is initialized as "0"
5661 * No packets will be sent in non-security mode if we had set drop_unencrypted.
5662 * ex, After kill wpa_supplicant process, make the driver up again.
5663 * drop_unencrypted remains as "1", which is set by wpa_supplicant. 2008/12/04.john
5665 priv->ieee80211->drop_unencrypted = 0;
5671 int rtl8192_open(struct net_device *dev)
5673 struct r8192_priv *priv = ieee80211_priv(dev);
5675 down(&priv->wx_sem);
5676 ret = rtl8192_up(dev);
5683 int rtl8192_up(struct net_device *dev)
5685 struct r8192_priv *priv = ieee80211_priv(dev);
5687 if (priv->up == 1) return -1;
5689 return _rtl8192_up(dev);
5693 int rtl8192_close(struct net_device *dev)
5695 struct r8192_priv *priv = ieee80211_priv(dev);
5698 down(&priv->wx_sem);
5700 ret = rtl8192_down(dev);
5708 int rtl8192_down(struct net_device *dev)
5710 struct r8192_priv *priv = ieee80211_priv(dev);
5713 if (priv->up == 0) return -1;
5716 priv->ieee80211->ieee_up = 0;
5717 RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
5719 if (!netif_queue_stopped(dev))
5720 netif_stop_queue(dev);
5722 rtl8192_rtx_disable(dev);
5723 //rtl8192_irq_disable(dev);
5725 /* Tx related queue release */
5726 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5727 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
5729 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5730 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
5733 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5734 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
5737 //as cancel_delayed_work will del work->timer, so if work is not definedas struct delayed_work, it will corrupt
5738 // flush_scheduled_work();
5739 rtl8192_cancel_deferred_work(priv);
5741 del_timer_sync(&priv->watch_dog_timer);
5744 ieee80211_softmac_stop_protocol(priv->ieee80211);
5745 memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
5746 RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
5752 void rtl8192_commit(struct net_device *dev)
5754 struct r8192_priv *priv = ieee80211_priv(dev);
5755 int reset_status = 0;
5756 //u8 reset_times = 0;
5757 if (priv->up == 0) return ;
5760 rtl8192_cancel_deferred_work(priv);
5761 del_timer_sync(&priv->watch_dog_timer);
5762 //cancel_delayed_work(&priv->SwChnlWorkItem);
5764 ieee80211_softmac_stop_protocol(priv->ieee80211);
5766 //rtl8192_irq_disable(dev);
5767 rtl8192_rtx_disable(dev);
5768 reset_status = _rtl8192_up(dev);
5773 void rtl8192_restart(struct net_device *dev)
5775 struct r8192_priv *priv = ieee80211_priv(dev);
5777 void rtl8192_restart(struct work_struct *work)
5779 struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
5780 struct net_device *dev = priv->ieee80211->dev;
5782 down(&priv->wx_sem);
5784 rtl8192_commit(dev);
5789 static void r8192_set_multicast(struct net_device *dev)
5791 struct r8192_priv *priv = ieee80211_priv(dev);
5794 //down(&priv->wx_sem);
5798 promisc = (dev->flags & IFF_PROMISC) ? 1:0;
5800 if (promisc != priv->promisc)
5801 // rtl8192_commit(dev);
5803 priv->promisc = promisc;
5805 //schedule_work(&priv->reset_wq);
5806 //up(&priv->wx_sem);
5810 int r8192_set_mac_adr(struct net_device *dev, void *mac)
5812 struct r8192_priv *priv = ieee80211_priv(dev);
5813 struct sockaddr *addr = mac;
5815 down(&priv->wx_sem);
5817 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
5819 schedule_work(&priv->reset_wq);
5826 /* based on ipw2200 driver */
5827 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5829 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5830 struct iwreq *wrq = (struct iwreq *)rq;
5832 struct ieee80211_device *ieee = priv->ieee80211;
5834 u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
5835 u8 zero_addr[6] = {0};
5836 struct iw_point *p = &wrq->u.data;
5837 struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
5839 down(&priv->wx_sem);
5842 if (p->length < sizeof(struct ieee_param) || !p->pointer){
5847 ipw = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL);
5852 if (copy_from_user(ipw, p->pointer, p->length)) {
5859 case RTL_IOCTL_WPA_SUPPLICANT:
5860 //parse here for HW security
5861 if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
5863 if (ipw->u.crypt.set_tx)
5865 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
5866 ieee->pairwise_key_type = KEY_TYPE_CCMP;
5867 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
5868 ieee->pairwise_key_type = KEY_TYPE_TKIP;
5869 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
5871 if (ipw->u.crypt.key_len == 13)
5872 ieee->pairwise_key_type = KEY_TYPE_WEP104;
5873 else if (ipw->u.crypt.key_len == 5)
5874 ieee->pairwise_key_type = KEY_TYPE_WEP40;
5877 ieee->pairwise_key_type = KEY_TYPE_NA;
5879 if (ieee->pairwise_key_type)
5881 // FIXME:these two lines below just to fix ipw interface bug, that is, it will never set mode down to driver. So treat it as ADHOC mode, if no association procedure. WB. 2009.02.04
5882 if (memcmp(ieee->ap_mac_addr, zero_addr, 6) == 0)
5883 ieee->iw_mode = IW_MODE_ADHOC;
5884 memcpy((u8*)key, ipw->u.crypt.key, 16);
5885 EnableHWSecurityConfig8192(dev);
5886 //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!
5888 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
5889 if (ieee->iw_mode == IW_MODE_ADHOC)
5890 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
5893 else //if (ipw->u.crypt.idx) //group key use idx > 0
5895 memcpy((u8*)key, ipw->u.crypt.key, 16);
5896 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
5897 ieee->group_key_type= KEY_TYPE_CCMP;
5898 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
5899 ieee->group_key_type = KEY_TYPE_TKIP;
5900 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
5902 if (ipw->u.crypt.key_len == 13)
5903 ieee->group_key_type = KEY_TYPE_WEP104;
5904 else if (ipw->u.crypt.key_len == 5)
5905 ieee->group_key_type = KEY_TYPE_WEP40;
5908 ieee->group_key_type = KEY_TYPE_NA;
5910 if (ieee->group_key_type)
5914 ipw->u.crypt.idx, //KeyIndex
5915 ieee->group_key_type, //KeyType
5916 broadcast_addr, //MacAddr
5922 #ifdef JOHN_HWSEC_DEBUG
5924 printk("@@ wrq->u pointer = ");
5925 for(i=0;i<wrq->u.data.length;i++){
5926 if(i%10==0) printk("\n");
5927 printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
5930 #endif /*JOHN_HWSEC_DEBUG*/
5931 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
5945 u8 rtl8192SU_HwRateToMRate(bool bIsHT, u8 rate,bool bFirstAMPDU)
5957 case DESC92S_RATE1M: ret_rate = MGN_1M; break;
5958 case DESC92S_RATE2M: ret_rate = MGN_2M; break;
5959 case DESC92S_RATE5_5M: ret_rate = MGN_5_5M; break;
5960 case DESC92S_RATE11M: ret_rate = MGN_11M; break;
5961 case DESC92S_RATE6M: ret_rate = MGN_6M; break;
5962 case DESC92S_RATE9M: ret_rate = MGN_9M; break;
5963 case DESC92S_RATE12M: ret_rate = MGN_12M; break;
5964 case DESC92S_RATE18M: ret_rate = MGN_18M; break;
5965 case DESC92S_RATE24M: ret_rate = MGN_24M; break;
5966 case DESC92S_RATE36M: ret_rate = MGN_36M; break;
5967 case DESC92S_RATE48M: ret_rate = MGN_48M; break;
5968 case DESC92S_RATE54M: ret_rate = MGN_54M; break;
5971 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
5980 case DESC92S_RATEMCS0: ret_rate = MGN_MCS0; break;
5981 case DESC92S_RATEMCS1: ret_rate = MGN_MCS1; break;
5982 case DESC92S_RATEMCS2: ret_rate = MGN_MCS2; break;
5983 case DESC92S_RATEMCS3: ret_rate = MGN_MCS3; break;
5984 case DESC92S_RATEMCS4: ret_rate = MGN_MCS4; break;
5985 case DESC92S_RATEMCS5: ret_rate = MGN_MCS5; break;
5986 case DESC92S_RATEMCS6: ret_rate = MGN_MCS6; break;
5987 case DESC92S_RATEMCS7: ret_rate = MGN_MCS7; break;
5988 case DESC92S_RATEMCS8: ret_rate = MGN_MCS8; break;
5989 case DESC92S_RATEMCS9: ret_rate = MGN_MCS9; break;
5990 case DESC92S_RATEMCS10: ret_rate = MGN_MCS10; break;
5991 case DESC92S_RATEMCS11: ret_rate = MGN_MCS11; break;
5992 case DESC92S_RATEMCS12: ret_rate = MGN_MCS12; break;
5993 case DESC92S_RATEMCS13: ret_rate = MGN_MCS13; break;
5994 case DESC92S_RATEMCS14: ret_rate = MGN_MCS14; break;
5995 case DESC92S_RATEMCS15: ret_rate = MGN_MCS15; break;
5996 case DESC92S_RATEMCS32: ret_rate = (0x80|0x20); break;
5999 RT_TRACE(COMP_RECV, "HwRateToMRate92S(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT );
6010 case DESC92S_RATE1M: ret_rate = MGN_1M; break;
6011 case DESC92S_RATE2M: ret_rate = MGN_2M; break;
6012 case DESC92S_RATE5_5M: ret_rate = MGN_5_5M; break;
6013 case DESC92S_RATE11M: ret_rate = MGN_11M; break;
6014 case DESC92S_RATE6M: ret_rate = MGN_6M; break;
6015 case DESC92S_RATE9M: ret_rate = MGN_9M; break;
6016 case DESC92S_RATE12M: ret_rate = MGN_12M; break;
6017 case DESC92S_RATE18M: ret_rate = MGN_18M; break;
6018 case DESC92S_RATE24M: ret_rate = MGN_24M; break;
6019 case DESC92S_RATE36M: ret_rate = MGN_36M; break;
6020 case DESC92S_RATE48M: ret_rate = MGN_48M; break;
6021 case DESC92S_RATE54M: ret_rate = MGN_54M; break;
6022 case DESC92S_RATEMCS0: ret_rate = MGN_MCS0; break;
6023 case DESC92S_RATEMCS1: ret_rate = MGN_MCS1; break;
6024 case DESC92S_RATEMCS2: ret_rate = MGN_MCS2; break;
6025 case DESC92S_RATEMCS3: ret_rate = MGN_MCS3; break;
6026 case DESC92S_RATEMCS4: ret_rate = MGN_MCS4; break;
6027 case DESC92S_RATEMCS5: ret_rate = MGN_MCS5; break;
6028 case DESC92S_RATEMCS6: ret_rate = MGN_MCS6; break;
6029 case DESC92S_RATEMCS7: ret_rate = MGN_MCS7; break;
6030 case DESC92S_RATEMCS8: ret_rate = MGN_MCS8; break;
6031 case DESC92S_RATEMCS9: ret_rate = MGN_MCS9; break;
6032 case DESC92S_RATEMCS10: ret_rate = MGN_MCS10; break;
6033 case DESC92S_RATEMCS11: ret_rate = MGN_MCS11; break;
6034 case DESC92S_RATEMCS12: ret_rate = MGN_MCS12; break;
6035 case DESC92S_RATEMCS13: ret_rate = MGN_MCS13; break;
6036 case DESC92S_RATEMCS14: ret_rate = MGN_MCS14; break;
6037 case DESC92S_RATEMCS15: ret_rate = MGN_MCS15; break;
6038 case DESC92S_RATEMCS32: ret_rate = (0x80|0x20); break;
6041 RT_TRACE(COMP_RECV, "HwRateToMRate92S(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT );
6048 u8 HwRateToMRate90(bool bIsHT, u8 rate)
6054 case DESC90_RATE1M: ret_rate = MGN_1M; break;
6055 case DESC90_RATE2M: ret_rate = MGN_2M; break;
6056 case DESC90_RATE5_5M: ret_rate = MGN_5_5M; break;
6057 case DESC90_RATE11M: ret_rate = MGN_11M; break;
6058 case DESC90_RATE6M: ret_rate = MGN_6M; break;
6059 case DESC90_RATE9M: ret_rate = MGN_9M; break;
6060 case DESC90_RATE12M: ret_rate = MGN_12M; break;
6061 case DESC90_RATE18M: ret_rate = MGN_18M; break;
6062 case DESC90_RATE24M: ret_rate = MGN_24M; break;
6063 case DESC90_RATE36M: ret_rate = MGN_36M; break;
6064 case DESC90_RATE48M: ret_rate = MGN_48M; break;
6065 case DESC90_RATE54M: ret_rate = MGN_54M; break;
6069 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
6075 case DESC90_RATEMCS0: ret_rate = MGN_MCS0; break;
6076 case DESC90_RATEMCS1: ret_rate = MGN_MCS1; break;
6077 case DESC90_RATEMCS2: ret_rate = MGN_MCS2; break;
6078 case DESC90_RATEMCS3: ret_rate = MGN_MCS3; break;
6079 case DESC90_RATEMCS4: ret_rate = MGN_MCS4; break;
6080 case DESC90_RATEMCS5: ret_rate = MGN_MCS5; break;
6081 case DESC90_RATEMCS6: ret_rate = MGN_MCS6; break;
6082 case DESC90_RATEMCS7: ret_rate = MGN_MCS7; break;
6083 case DESC90_RATEMCS8: ret_rate = MGN_MCS8; break;
6084 case DESC90_RATEMCS9: ret_rate = MGN_MCS9; break;
6085 case DESC90_RATEMCS10: ret_rate = MGN_MCS10; break;
6086 case DESC90_RATEMCS11: ret_rate = MGN_MCS11; break;
6087 case DESC90_RATEMCS12: ret_rate = MGN_MCS12; break;
6088 case DESC90_RATEMCS13: ret_rate = MGN_MCS13; break;
6089 case DESC90_RATEMCS14: ret_rate = MGN_MCS14; break;
6090 case DESC90_RATEMCS15: ret_rate = MGN_MCS15; break;
6091 case DESC90_RATEMCS32: ret_rate = (0x80|0x20); break;
6095 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
6104 * Function: UpdateRxPktTimeStamp
6105 * Overview: Recored down the TSF time stamp when receiving a packet
6113 * (pRfd->Status.TimeStampHigh is updated)
6114 * (pRfd->Status.TimeStampLow is updated)
6118 void UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
6120 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6122 if(stats->bIsAMPDU && !stats->bFirstMPDU) {
6123 stats->mac_time[0] = priv->LastRxDescTSFLow;
6124 stats->mac_time[1] = priv->LastRxDescTSFHigh;
6126 priv->LastRxDescTSFLow = stats->mac_time[0];
6127 priv->LastRxDescTSFHigh = stats->mac_time[1];
6133 long rtl819x_translate_todbm(u8 signal_strength_index )// 0-100 index.
6135 long signal_power; // in dBm.
6137 // Translate to dBm (x=0.5y-95).
6138 signal_power = (long)((signal_strength_index + 1) >> 1);
6141 return signal_power;
6145 /* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
6146 be a local static. Otherwise, it may increase when we return from S3/S4. The
6147 value will be kept in memory or disk. We must delcare the value in adapter
6148 and it will be reinitialized when return from S3/S4. */
6149 void rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
6151 bool bcheck = false;
6153 u32 nspatial_stream, tmp_val;
6155 static u32 slide_rssi_index=0, slide_rssi_statistics=0;
6156 static u32 slide_evm_index=0, slide_evm_statistics=0;
6157 static u32 last_rssi=0, last_evm=0;
6159 static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
6160 static u32 last_beacon_adc_pwdb=0;
6162 struct ieee80211_hdr_3addr *hdr;
6164 unsigned int frag,seq;
6165 hdr = (struct ieee80211_hdr_3addr *)buffer;
6166 sc = le16_to_cpu(hdr->seq_ctrl);
6167 frag = WLAN_GET_SEQ_FRAG(sc);
6168 seq = WLAN_GET_SEQ_SEQ(sc);
6169 //cosa add 04292008 to record the sequence number
6170 pcurrent_stats->Seq_Num = seq;
6172 // Check whether we should take the previous packet into accounting
6174 if(!pprevious_stats->bIsAMPDU)
6176 // if previous packet is not aggregated packet
6183 if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
6185 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
6186 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
6187 priv->stats.slide_rssi_total -= last_rssi;
6189 priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
6191 priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
6192 if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
6193 slide_rssi_index = 0;
6195 // <1> Showed on UI for user, in dbm
6196 tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
6197 priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
6198 pcurrent_stats->rssi = priv->stats.signal_strength;
6200 // If the previous packet does not match the criteria, neglect it
6202 if(!pprevious_stats->bPacketMatchBSSID)
6204 if(!pprevious_stats->bToSelfBA)
6212 //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
6217 priv->stats.num_process_phyinfo++;
6219 /* record the general signal strength to the sliding window. */
6222 // <2> Showed on UI for engineering
6223 // hardware does not provide rssi information for each rf path in CCK
6224 if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
6226 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
6228 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
6231 //Fixed by Jacken 2008-03-20
6232 if(priv->stats.rx_rssi_percentage[rfpath] == 0)
6234 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
6235 //DbgPrint("MIMO RSSI initialize \n");
6237 if(pprevious_stats->RxMIMOSignalStrength[rfpath] > priv->stats.rx_rssi_percentage[rfpath])
6239 priv->stats.rx_rssi_percentage[rfpath] =
6240 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
6241 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
6242 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath] + 1;
6246 priv->stats.rx_rssi_percentage[rfpath] =
6247 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
6248 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
6250 RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath] = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
6258 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
6259 pprevious_stats->bIsCCK? "CCK": "OFDM",
6260 pprevious_stats->RxPWDBAll);
6262 if(pprevious_stats->bPacketBeacon)
6264 /* record the beacon pwdb to the sliding window. */
6265 if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
6267 slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
6268 last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
6269 priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
6270 //DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
6271 // slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
6273 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
6274 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
6275 //DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
6276 slide_beacon_adc_pwdb_index++;
6277 if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
6278 slide_beacon_adc_pwdb_index = 0;
6279 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
6280 if(pprevious_stats->RxPWDBAll >= 3)
6281 pprevious_stats->RxPWDBAll -= 3;
6284 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
6285 pprevious_stats->bIsCCK? "CCK": "OFDM",
6286 pprevious_stats->RxPWDBAll);
6289 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
6291 if(priv->undecorated_smoothed_pwdb < 0) // initialize
6293 priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
6294 //DbgPrint("First pwdb initialize \n");
6297 if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
6299 priv->undecorated_smoothed_pwdb =
6300 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
6301 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
6302 priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
6306 priv->undecorated_smoothed_pwdb =
6307 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
6308 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
6311 //Fixed by Jacken 2008-03-20
6312 if(pPreviousRfd->Status.RxPWDBAll > (u32)pHalData->UndecoratedSmoothedPWDB)
6314 pHalData->UndecoratedSmoothedPWDB =
6315 ( ((pHalData->UndecoratedSmoothedPWDB)* 5) + (pPreviousRfd->Status.RxPWDBAll)) / 6;
6316 pHalData->UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB + 1;
6320 pHalData->UndecoratedSmoothedPWDB =
6321 ( ((pHalData->UndecoratedSmoothedPWDB)* 5) + (pPreviousRfd->Status.RxPWDBAll)) / 6;
6330 /* record the general EVM to the sliding window. */
6331 if(pprevious_stats->SignalQuality == 0)
6336 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
6337 if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
6338 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
6339 last_evm = priv->stats.slide_evm[slide_evm_index];
6340 priv->stats.slide_evm_total -= last_evm;
6343 priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
6345 priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
6346 if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
6347 slide_evm_index = 0;
6349 // <1> Showed on UI for user, in percentage.
6350 tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
6351 priv->stats.signal_quality = tmp_val;
6352 //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
6353 priv->stats.last_signal_strength_inpercent = tmp_val;
6356 // <2> Showed on UI for engineering
6357 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
6359 for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
6361 if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
6363 if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
6365 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
6367 priv->stats.rx_evm_percentage[nspatial_stream] =
6368 ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
6369 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
6378 /*-----------------------------------------------------------------------------
6379 * Function: rtl819x_query_rxpwrpercentage()
6383 * Input: char antpower
6387 * Return: 0-100 percentage
6391 * 05/26/2008 amy Create Version 0 porting from windows code.
6393 *---------------------------------------------------------------------------*/
6394 static u8 rtl819x_query_rxpwrpercentage(
6398 if ((antpower <= -100) || (antpower >= 20))
6402 else if (antpower >= 0)
6408 return (100+antpower);
6411 } /* QueryRxPwrPercentage */
6414 rtl819x_evm_dbtopercentage(
6426 ret_val = 0 - ret_val;
6434 // We want good-looking for signal strength/quality
6435 // 2007/7/19 01:09, by cosa.
6438 rtl819x_signal_scale_mapping(
6444 // Step 1. Scale mapping.
6445 if(currsig >= 61 && currsig <= 100)
6447 retsig = 90 + ((currsig - 60) / 4);
6449 else if(currsig >= 41 && currsig <= 60)
6451 retsig = 78 + ((currsig - 40) / 2);
6453 else if(currsig >= 31 && currsig <= 40)
6455 retsig = 66 + (currsig - 30);
6457 else if(currsig >= 21 && currsig <= 30)
6459 retsig = 54 + (currsig - 20);
6461 else if(currsig >= 5 && currsig <= 20)
6463 retsig = 42 + (((currsig - 5) * 2) / 3);
6465 else if(currsig == 4)
6469 else if(currsig == 3)
6473 else if(currsig == 2)
6477 else if(currsig == 1)
6489 /*-----------------------------------------------------------------------------
6490 * Function: QueryRxPhyStatus8192S()
6502 * 06/01/2007 MHC Create Version 0.
6503 * 06/05/2007 MHC Accordign to HW's new data sheet, we add CCK and OFDM
6504 * descriptor definition.
6505 * 07/04/2007 MHC According to Jerry and Bryant's document. We read
6506 * ir_isolation and ext_lna for RF's init value and use
6507 * to compensate RSSI after receiving packets.
6508 * 09/10/2008 MHC Modify name and PHY status field for 92SE.
6509 * 09/19/2008 MHC Add CCK/OFDM SS/SQ for 92S series.
6511 *---------------------------------------------------------------------------*/
6512 static void rtl8192SU_query_rxphystatus(
6513 struct r8192_priv * priv,
6514 struct ieee80211_rx_stats * pstats,
6515 rx_desc_819x_usb *pDesc,
6516 rx_drvinfo_819x_usb * pdrvinfo,
6517 struct ieee80211_rx_stats * precord_stats,
6518 bool bpacket_match_bssid,
6519 bool bpacket_toself,
6524 //PRT_RFD_STATUS pRtRfdStatus = &(pRfd->Status);
6525 //PHY_STS_CCK_8192S_T *pCck_buf;
6526 phy_sts_cck_819xusb_t * pcck_buf;
6527 phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
6529 //u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
6530 u8 i, max_spatial_stream, rxsc_sgien_exflg;
6531 char rx_pwr[4], rx_pwr_all=0;
6532 //long rx_avg_pwr = 0;
6533 //char rx_snrX, rx_evmX;
6535 u32 RSSI, total_rssi=0;//, total_evm=0;
6536 // long signal_strength_index = 0;
6542 priv->stats.numqry_phystatus++;
6544 is_cck_rate = rx_hal_is_cck_rate(pDesc);
6546 // Record it for next packet processing
6547 memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
6548 pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
6549 pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
6550 pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
6551 pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
6552 pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
6555 pstats->RxMIMOSignalQuality[0] = -1;
6556 pstats->RxMIMOSignalQuality[1] = -1;
6557 precord_stats->RxMIMOSignalQuality[0] = -1;
6558 precord_stats->RxMIMOSignalQuality[1] = -1;
6562 u8 report;//, tmp_pwdb;
6563 //char cck_adc_pwdb[4];
6565 // CCK Driver info Structure is not the same as OFDM packet.
6566 pcck_buf = (phy_sts_cck_819xusb_t *)pdrvinfo;
6569 // (1)Hardware does not provide RSSI for CCK
6573 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
6576 priv->stats.numqry_phystatusCCK++;
6578 if(!priv->bCckHighPower)
6580 report = pcck_buf->cck_agc_rpt & 0xc0;
6584 //Fixed by Jacken from Bryant 2008-03-20
6585 //Original value is -38 , -26 , -14 , -2
6586 //Fixed value is -35 , -23 , -11 , 6
6588 rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
6591 rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
6594 rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
6597 rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);//6->8
6603 report = pdrvinfo->cfosho[0] & 0x60;
6608 rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
6611 rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
6614 rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
6617 rx_pwr_all = -8 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;//6->-8
6622 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);//check it
6623 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
6624 //pstats->RecvSignalPower = pwdb_all;
6625 pstats->RecvSignalPower = rx_pwr_all;
6628 // (3) Get Signal Quality (EVM)
6630 //if(bpacket_match_bssid)
6634 if(pstats->RxPWDBAll > 40)
6639 sq = pcck_buf->sq_rpt;
6641 if(pcck_buf->sq_rpt > 64)
6643 else if (pcck_buf->sq_rpt < 20)
6646 sq = ((64-sq) * 100) / 44;
6648 pstats->SignalQuality = precord_stats->SignalQuality = sq;
6649 pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
6650 pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
6655 priv->stats.numqry_phystatusHT++;
6657 // 2008/09/19 MH For 92S debug, RX RF path always enable!!
6658 priv->brfpath_rxenable[0] = priv->brfpath_rxenable[1] = TRUE;
6661 // (1)Get RSSI for HT rate
6663 //for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
6664 for(i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
6666 // 2008/01/30 MH we will judge RF RX path now.
6667 if (priv->brfpath_rxenable[i])
6672 //if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
6675 //Fixed by Jacken from Bryant 2008-03-20
6676 //Original value is 106
6677 //rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
6678 rx_pwr[i] = ((pdrvinfo->gain_trsw[i]&0x3F)*2) - 110;
6680 /* Translate DBM to percentage. */
6681 RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]); //check ok
6683 RT_TRACE(COMP_RF, "RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI);
6685 //Get Rx snr value in DB
6686 //tmp_rxsnr = pofdm_buf->rxsnr_X[i];
6687 //rx_snrX = (char)(tmp_rxsnr);
6689 //priv->stats.rxSNRdB[i] = (long)rx_snrX;
6690 priv->stats.rxSNRdB[i] = (long)(pdrvinfo->rxsnr[i]/2);
6692 /* Translate DBM to percentage. */
6693 //RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
6694 //total_rssi += RSSI;
6696 /* Record Signal Strength for next packet */
6697 //if(bpacket_match_bssid)
6699 pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
6700 precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
6706 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
6708 //Fixed by Jacken from Bryant 2008-03-20
6709 //Original value is 106
6710 //rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
6711 rx_pwr_all = (((pdrvinfo->pwdb_all ) >> 1 )& 0x7f) -106;
6712 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
6714 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
6715 pstats->RxPower = precord_stats->RxPower = rx_pwr_all;
6716 pstats->RecvSignalPower = rx_pwr_all;
6719 // (3)EVM of HT rate
6721 //if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
6722 // pdrvinfo->RxRate<=DESC90_RATEMCS15)
6723 if(pDesc->RxHT && pDesc->RxMCS>=DESC92S_RATEMCS8 &&
6724 pDesc->RxMCS<=DESC92S_RATEMCS15)
6725 max_spatial_stream = 2; //both spatial stream make sense
6727 max_spatial_stream = 1; //only spatial stream 1 makes sense
6729 for(i=0; i<max_spatial_stream; i++)
6731 //tmp_rxevm = pofdm_buf->rxevm_X[i];
6732 //rx_evmX = (char)(tmp_rxevm);
6734 // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
6735 // fill most significant bit to "zero" when doing shifting operation which may change a negative
6736 // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.
6737 //rx_evmX /= 2; //dbm
6739 //evm = rtl819x_evm_dbtopercentage(rx_evmX);
6740 evm = rtl819x_evm_dbtopercentage( (pdrvinfo->rxevm[i] /*/ 2*/)); //dbm
6741 RT_TRACE(COMP_RF, "RXRATE=%x RXEVM=%x EVM=%s%d\n", pDesc->RxMCS, pdrvinfo->rxevm[i], "%", evm);
6743 //if(bpacket_match_bssid)
6745 if(i==0) // Fill value in RFD, Get the first spatial stream only
6746 pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
6747 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
6752 /* record rx statistics for debug */
6753 //rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
6754 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
6755 //if(pdrvinfo->BW) //40M channel
6756 if(pDesc->BW) //40M channel
6757 priv->stats.received_bwtype[1+pdrvinfo->rxsc]++;
6759 priv->stats.received_bwtype[0]++;
6762 //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
6763 //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
6766 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;//check ok
6771 //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
6772 // We can judge RX path number now.
6774 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
6776 }/* QueryRxPhyStatus8192S */
6779 rtl8192_record_rxdesc_forlateruse(
6780 struct ieee80211_rx_stats * psrc_stats,
6781 struct ieee80211_rx_stats * ptarget_stats
6784 ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
6785 ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
6786 ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
6789 static void rtl8192SU_query_rxphystatus(
6790 struct r8192_priv * priv,
6791 struct ieee80211_rx_stats * pstats,
6792 rx_desc_819x_usb *pDesc,
6793 rx_drvinfo_819x_usb * pdrvinfo,
6794 struct ieee80211_rx_stats * precord_stats,
6795 bool bpacket_match_bssid,
6796 bool bpacket_toself,
6800 void rtl8192SU_TranslateRxSignalStuff(struct sk_buff *skb,
6801 struct ieee80211_rx_stats * pstats,
6802 rx_desc_819x_usb *pDesc,
6803 rx_drvinfo_819x_usb *pdrvinfo)
6805 // TODO: We must only check packet for current MAC address. Not finish
6806 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
6807 struct net_device *dev=info->dev;
6808 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6809 bool bpacket_match_bssid, bpacket_toself;
6810 bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
6811 static struct ieee80211_rx_stats previous_stats;
6812 struct ieee80211_hdr_3addr *hdr;//by amy
6815 // Get Signal Quality for only RX data queue (but not command queue)
6818 //u16 tmp_buf_len = 0;
6821 /* Get MAC frame start address. */
6822 tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
6824 hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
6825 fc = le16_to_cpu(hdr->frame_control);
6826 type = WLAN_FC_GET_TYPE(fc);
6827 praddr = hdr->addr1;
6829 /* Check if the received packet is acceptabe. */
6830 bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
6831 (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
6832 && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
6833 bpacket_toself = bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
6836 if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
6838 bPacketBeacon = true;
6839 //DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
6841 if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
6843 if((eqMacAddr(praddr,dev->dev_addr)))
6845 //DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
6851 if(bpacket_match_bssid)
6853 priv->stats.numpacket_matchbssid++;
6856 priv->stats.numpacket_toself++;
6859 // Process PHY information for previous packet (RSSI/PWDB/EVM)
6861 // Because phy information is contained in the last packet of AMPDU only, so driver
6862 // should process phy information of previous packet
6863 rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
6864 rtl8192SU_query_rxphystatus(priv, pstats, pDesc, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
6865 rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
6870 * Function: UpdateReceivedRateHistogramStatistics
6871 * Overview: Recored down the received data rate
6874 * struct net_device *dev
6875 * struct ieee80211_rx_stats *stats
6879 * (priv->stats.ReceivedRateHistogram[] is updated)
6884 UpdateReceivedRateHistogramStatistics8190(
6885 struct net_device *dev,
6886 struct ieee80211_rx_stats *stats
6889 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6890 u32 rcvType=1; //0: Total, 1:OK, 2:CRC, 3:ICV
6892 u32 preamble_guardinterval; //1: short preamble/GI, 0: long preamble/GI
6897 else if(stats->bICV)
6900 if(stats->bShortPreamble)
6901 preamble_guardinterval = 1;// short
6903 preamble_guardinterval = 0;// long
6910 case MGN_1M: rateIndex = 0; break;
6911 case MGN_2M: rateIndex = 1; break;
6912 case MGN_5_5M: rateIndex = 2; break;
6913 case MGN_11M: rateIndex = 3; break;
6917 case MGN_6M: rateIndex = 4; break;
6918 case MGN_9M: rateIndex = 5; break;
6919 case MGN_12M: rateIndex = 6; break;
6920 case MGN_18M: rateIndex = 7; break;
6921 case MGN_24M: rateIndex = 8; break;
6922 case MGN_36M: rateIndex = 9; break;
6923 case MGN_48M: rateIndex = 10; break;
6924 case MGN_54M: rateIndex = 11; break;
6926 // 11n High throughput rate
6928 case MGN_MCS0: rateIndex = 12; break;
6929 case MGN_MCS1: rateIndex = 13; break;
6930 case MGN_MCS2: rateIndex = 14; break;
6931 case MGN_MCS3: rateIndex = 15; break;
6932 case MGN_MCS4: rateIndex = 16; break;
6933 case MGN_MCS5: rateIndex = 17; break;
6934 case MGN_MCS6: rateIndex = 18; break;
6935 case MGN_MCS7: rateIndex = 19; break;
6936 case MGN_MCS8: rateIndex = 20; break;
6937 case MGN_MCS9: rateIndex = 21; break;
6938 case MGN_MCS10: rateIndex = 22; break;
6939 case MGN_MCS11: rateIndex = 23; break;
6940 case MGN_MCS12: rateIndex = 24; break;
6941 case MGN_MCS13: rateIndex = 25; break;
6942 case MGN_MCS14: rateIndex = 26; break;
6943 case MGN_MCS15: rateIndex = 27; break;
6944 default: rateIndex = 28; break;
6946 priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
6947 priv->stats.received_rate_histogram[0][rateIndex]++; //total
6948 priv->stats.received_rate_histogram[rcvType][rateIndex]++;
6951 void rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
6953 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
6954 struct net_device *dev=info->dev;
6955 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6956 //rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
6957 rx_drvinfo_819x_usb *driver_info = NULL;
6959 //PRT_RFD_STATUS pRtRfdStatus = &pRfd->Status;
6960 //PHAL_DATA_8192SUSB pHalData = GET_HAL_DATA(Adapter);
6961 //pu1Byte pDesc = (pu1Byte)pDescIn;
6962 //PRX_DRIVER_INFO_8192S pDrvInfo;
6964 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
6969 printk("========================");
6970 for(m=0; m<skb->len; m++){
6973 printk("%2x ",((u8*)skb->data)[m]);
6975 printk("\n========================\n");
6981 //Get Rx Descriptor Raw Information
6983 stats->Length = desc->Length ;
6984 stats->RxDrvInfoSize = desc->RxDrvInfoSize*RX_DRV_INFO_SIZE_UNIT;
6985 stats->RxBufShift = (desc->Shift)&0x03;
6986 stats->bICV = desc->ICV;
6987 stats->bCRC = desc->CRC32;
6988 stats->bHwError = stats->bCRC|stats->bICV;
6989 stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
6990 stats->bIsAMPDU = (desc->AMSDU==1);
6991 stats->bFirstMPDU = (desc->PAGGR==1) && (desc->FAGGR==1);
6992 stats->bShortPreamble = desc->SPLCP;
6993 stats->RxIs40MHzPacket = (desc->BW==1);
6994 stats->TimeStampLow = desc->TSFL;
6996 if((desc->FAGGR==1) || (desc->PAGGR==1))
6998 RT_TRACE(COMP_RXDESC, "FirstAGGR = %d, PartAggr = %d\n", desc->FAGGR, desc->PAGGR);
7004 printk("%s: Receive ICV error!!!!!!!!!!!!!!!!!!!!!!\n", __FUNCTION__);
7006 printk("%s: Receive CRC error!!!!!!!!!!!!!!!!!!!!!!\n", __FUNCTION__);
7009 if(IS_UNDER_11N_AES_MODE(priv->ieee80211))
7011 // Always received ICV error packets in AES mode.
7012 // This fixed HW later MIC write bug.
7013 if(stats->bICV && !stats->bCRC)
7015 stats->bICV = FALSE;
7016 stats->bHwError = FALSE;
7020 // Transform HwRate to MRate
7021 if(!stats->bHwError)
7022 //stats->DataRate = HwRateToMRate(
7023 // (BOOLEAN)GET_RX_DESC_RXHT(pDesc),
7024 // (u1Byte)GET_RX_DESC_RXMCS(pDesc),
7025 // (BOOLEAN)GET_RX_DESC_PAGGR(pDesc));
7026 stats->rate = rtl8192SU_HwRateToMRate(desc->RxHT, desc->RxMCS, desc->PAGGR);
7028 stats->rate = MGN_1M;
7031 // Collect Rx rate/AMPDU/TSFL
7033 //UpdateRxdRateHistogramStatistics8192S(Adapter, pRfd);
7034 //UpdateRxAMPDUHistogramStatistics8192S(Adapter, pRfd);
7035 //UpdateRxPktTimeStamp8192S(Adapter, pRfd);
7036 UpdateReceivedRateHistogramStatistics8190(dev, stats);
7037 //UpdateRxAMPDUHistogramStatistics8192S(dev, stats); //FIXLZM
7038 UpdateRxPktTimeStamp8190(dev, stats);
7041 // Get PHY Status and RSVD parts.
7042 // <Roger_Notes> It only appears on last aggregated packet.
7044 if (desc->PHYStatus)
7046 //driver_info = (rx_drvinfo_819x_usb *)(skb->data + RX_DESC_SIZE + stats->RxBufShift);
7047 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
7052 printk("========================\n");
7053 printk("RX_DESC_SIZE:%d, RxBufShift:%d, RxDrvInfoSize:%d\n",
7054 RX_DESC_SIZE, stats->RxBufShift, stats->RxDrvInfoSize);
7055 for(m=0; m<32; m++){
7056 printk("%2x ",((u8*)driver_info)[m]);
7058 printk("\n========================\n");
7065 skb_pull(skb, sizeof(rx_desc_819x_usb));
7069 // Get Total offset of MPDU Frame Body
7071 if((stats->RxBufShift + stats->RxDrvInfoSize) > 0)
7075 skb_pull(skb, stats->RxBufShift + stats->RxDrvInfoSize);
7080 // Get PHY Status and RSVD parts.
7081 // <Roger_Notes> It only appears on last aggregated packet.
7083 if (desc->PHYStatus)
7085 rtl8192SU_TranslateRxSignalStuff(skb, stats, desc, driver_info);
7091 // The strarting address of wireless lan header will shift 1 or 2 or 3 or "more" bytes for the following reason :
7092 // (1) QoS control : shift 2 bytes
7093 // (2) Mesh Network : shift 1 or 3 bytes
7094 // (3) RxDriverInfo occupies the front parts of Rx Packets buffer(shift units is in 8Bytes)
7096 // It is because Lextra CPU used by 8186 or 865x series assert exception if the statrting address
7097 // of IP header is not double word alignment.
7098 // This features is supported in 818xb and 8190 only, but not 818x.
7100 // parameter: PRT_RFD, Pointer of Reeceive frame descriptor which is initialized according to
7102 // return value: unsigned int, number of total shifted bytes
7104 // Notes: 2008/06/28, created by Roger
7106 u32 GetRxPacketShiftBytes8192SU(struct ieee80211_rx_stats *Status, bool bIsRxAggrSubframe)
7108 //PRT_RFD_STATUS pRtRfdStatus = &pRfd->Status;
7110 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize + Status->RxBufShift);
7113 void rtl8192SU_rx_nomal(struct sk_buff* skb)
7115 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7116 struct net_device *dev=info->dev;
7117 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7118 struct ieee80211_rx_stats stats = {
7122 // .mac_time = jiffies,
7123 .freq = IEEE80211_24GHZ_BAND,
7126 struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
7127 bool unicast_packet = false;
7129 //printk("**********skb->len = %d\n", skb->len);
7130 /* 20 is for ps-poll */
7131 if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
7133 /* first packet should not contain Rx aggregation header */
7134 rtl8192SU_query_rxdesc_status(skb, &stats, false);
7137 /* hardware related info */
7138 priv->stats.rxoktotal++; //YJ,test,090108
7140 /* Process the MPDU recevied */
7141 skb_trim(skb, skb->len - 4/*sCrcLng*/);//FIXLZM
7143 rx_pkt_len = skb->len;
7144 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
7145 unicast_packet = false;
7146 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
7148 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
7151 /* unicast packet */
7152 unicast_packet = true;
7155 if(!ieee80211_rtl_rx(priv->ieee80211,skb, &stats)) {
7156 dev_kfree_skb_any(skb);
7158 // priv->stats.rxoktotal++; //YJ,test,090108
7159 if(unicast_packet) {
7160 priv->stats.rxbytesunicast += rx_pkt_len;
7164 //up is firs pkt, follow is next and next
7168 priv->stats.rxurberr++;
7169 printk("actual_length:%d\n", skb->len);
7170 dev_kfree_skb_any(skb);
7176 rtl819xusb_process_received_packet(
7177 struct net_device *dev,
7178 struct ieee80211_rx_stats *pstats
7181 // bool bfreerfd=false, bqueued=false;
7184 struct r8192_priv *priv = ieee80211_priv(dev);
7188 //PRX_TS_RECORD pts = NULL;
7190 // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
7191 //porting by amy 080508
7192 pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
7193 frame = pstats->virtual_address;
7194 frame_len = pstats->packetlength;
7195 #ifdef TODO // by amy about HCT
7196 if(!Adapter->bInHctTest)
7197 CountRxErrStatistics(Adapter, pRfd);
7200 #ifdef ENABLE_PS //by amy for adding ps function in future
7201 RT_RF_POWER_STATE rtState;
7202 // When RF is off, we should not count the packet for hw/sw synchronize
7203 // reason, ie. there may be a duration while sw switch is changed and hw
7204 // switch is being changed. 2006.12.04, by shien chang.
7205 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
7206 if (rtState == eRfOff)
7211 priv->stats.rxframgment++;
7215 RmMonitorSignalStrength(Adapter, pRfd);
7217 /* 2007/01/16 MH Add RX command packet handle here. */
7218 /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
7219 if (rtl819xusb_rx_command_packet(dev, pstats))
7231 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
7233 // rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7234 // struct net_device *dev=info->dev;
7235 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7236 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
7237 // rx_drvinfo_819x_usb *driver_info;
7240 //Get Rx Descriptor Information
7242 stats->virtual_address = (u8*)skb->data;
7243 stats->Length = desc->Length;
7244 stats->RxDrvInfoSize = 0;
7245 stats->RxBufShift = 0;
7246 stats->packetlength = stats->Length-scrclng;
7247 stats->fraglength = stats->packetlength;
7248 stats->fragoffset = 0;
7249 stats->ntotalfrag = 1;
7252 void rtl8192SU_rx_cmd(struct sk_buff *skb)
7254 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7255 struct net_device *dev = info->dev;
7258 struct ieee80211_rx_stats stats = {
7262 // .mac_time = jiffies,
7263 .freq = IEEE80211_24GHZ_BAND,
7267 // Check buffer length to determine if this is a valid MPDU.
7269 if( (skb->len >= sizeof(rx_desc_819x_usb)) && (skb->len <= RX_URB_SIZE) )//&&
7270 //(pHalData->SwChnlInProgress == FALSE))
7273 // Collection information in Rx descriptor.
7275 query_rx_cmdpkt_desc_status(skb,&stats);
7276 // this is to be done by amy 080508 prfd->queue_id = 1;
7279 // Process the MPDU recevied.
7281 rtl819xusb_process_received_packet(dev,&stats);
7283 dev_kfree_skb_any(skb);
7287 //RTInsertTailListWithCnt(&pAdapter->RfdIdleQueue, &pRfd->List, &pAdapter->NumIdleRfd);
7288 //RT_ASSERT(pAdapter->NumIdleRfd <= pAdapter->NumRfd, ("HalUsbInCommandComplete8192SUsb(): Adapter->NumIdleRfd(%d)\n", pAdapter->NumIdleRfd));
7289 //RT_TRACE(COMP_RECV, DBG_LOUD, ("HalUsbInCommandComplete8192SUsb(): NOT enough Resources!! BufLenUsed(%d), NumIdleRfd(%d)\n",
7290 //pContext->BufLenUsed, pAdapter->NumIdleRfd));
7294 // Reuse USB_IN_CONTEXT since we had finished processing the
7295 // buffer in USB_IN_CONTEXT.
7297 //HalUsbReturnInContext(pAdapter, pContext);
7300 // Issue another bulk IN transfer.
7302 //HalUsbInMpdu(pAdapter, PipeIndex);
7304 RT_TRACE(COMP_RECV, "<--- HalUsbInCommandComplete8192SUsb()\n");
7308 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
7310 struct sk_buff *skb;
7311 struct rtl8192_rx_info *info;
7313 while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
7314 info = (struct rtl8192_rx_info *)skb->cb;
7315 switch (info->out_pipe) {
7316 /* Nomal packet pipe */
7318 //RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
7319 priv->IrpPendingCount--;
7320 priv->ops->rtl819x_rx_nomal(skb);
7323 /* Command packet pipe */
7325 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
7327 priv->ops->rtl819x_rx_cmd(skb);
7330 default: /* should never get here! */
7331 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
7342 /****************************************************************************
7343 ---------------------------- USB_STUFF---------------------------
7344 *****************************************************************************/
7345 //LZM Merge from windows HalUsbSetQueuePipeMapping8192SUsb 090319
7346 static void HalUsbSetQueuePipeMapping8192SUsb(struct usb_interface *intf, struct net_device *dev)
7348 struct r8192_priv *priv = ieee80211_priv(dev);
7349 struct usb_host_interface *iface_desc;
7350 struct usb_endpoint_descriptor *endpoint;
7353 priv->ep_in_num = 0;
7354 priv->ep_out_num = 0;
7355 memset(priv->RtOutPipes,0,16);
7356 memset(priv->RtInPipes,0,16);
7358 iface_desc = intf->cur_altsetting;
7359 priv->ep_num = iface_desc->desc.bNumEndpoints;
7361 for (i = 0; i < priv->ep_num; ++i) {
7362 endpoint = &iface_desc->endpoint[i].desc;
7363 if (usb_endpoint_is_bulk_in(endpoint)) {
7364 priv->RtInPipes[priv->ep_in_num] = usb_endpoint_num(endpoint);
7366 //printk("in_endpoint_idx = %d\n", usb_endpoint_num(endpoint));
7367 } else if (usb_endpoint_is_bulk_out(endpoint)) {
7368 priv->RtOutPipes[priv->ep_out_num] = usb_endpoint_num(endpoint);
7369 priv->ep_out_num ++;
7370 //printk("out_endpoint_idx = %d\n", usb_endpoint_num(endpoint));
7374 memset(priv->txqueue_to_outpipemap,0,9);
7375 if (priv->ep_num == 6) {
7376 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7377 u8 queuetopipe[] = {3, 2, 1, 0, 4, 4, 4, 4, 4};
7379 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7380 } else if (priv->ep_num == 4) {
7381 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7382 u8 queuetopipe[] = {1, 1, 0, 0, 2, 2, 2, 2, 2};
7384 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7385 } else if (priv->ep_num > 9) {
7386 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7387 u8 queuetopipe[] = {3, 2, 1, 0, 4, 8, 7, 6, 5};
7389 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7390 } else {//use sigle pipe
7391 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7392 u8 queuetopipe[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
7393 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7396 printk("==>ep_num:%d, in_ep_num:%d, out_ep_num:%d\n", priv->ep_num, priv->ep_in_num, priv->ep_out_num);
7398 printk("==>RtInPipes:");
7399 for(i=0; i < priv->ep_in_num; i++)
7400 printk("%d ", priv->RtInPipes[i]);
7403 printk("==>RtOutPipes:");
7404 for(i=0; i < priv->ep_out_num; i++)
7405 printk("%d ", priv->RtOutPipes[i]);
7408 printk("==>txqueue_to_outpipemap for BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON:\n");
7409 for(i=0; i < 9; i++)
7410 printk("%d ", priv->txqueue_to_outpipemap[i]);
7416 static const struct net_device_ops rtl8192_netdev_ops = {
7417 .ndo_open = rtl8192_open,
7418 .ndo_stop = rtl8192_close,
7419 .ndo_get_stats = rtl8192_stats,
7420 .ndo_tx_timeout = tx_timeout,
7421 .ndo_do_ioctl = rtl8192_ioctl,
7422 .ndo_set_multicast_list = r8192_set_multicast,
7423 .ndo_set_mac_address = r8192_set_mac_adr,
7424 .ndo_validate_addr = eth_validate_addr,
7425 .ndo_change_mtu = eth_change_mtu,
7426 .ndo_start_xmit = rtl8192_ieee80211_rtl_xmit,
7429 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
7430 const struct usb_device_id *id)
7432 // unsigned long ioaddr = 0;
7433 struct net_device *dev = NULL;
7434 struct r8192_priv *priv= NULL;
7435 struct usb_device *udev = interface_to_usbdev(intf);
7437 RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
7439 dev = alloc_ieee80211(sizeof(struct r8192_priv));
7441 usb_set_intfdata(intf, dev);
7442 SET_NETDEV_DEV(dev, &intf->dev);
7443 priv = ieee80211_priv(dev);
7444 priv->ieee80211 = netdev_priv(dev);
7447 HalUsbSetQueuePipeMapping8192SUsb(intf, dev);
7449 //printk("===============>NIC 8192SU\n");
7450 priv->ops = &rtl8192su_ops;
7452 dev->netdev_ops = &rtl8192_netdev_ops;
7454 //DMESG("Oops: i'm coming\n");
7455 dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
7457 dev->type=ARPHRD_ETHER;
7459 dev->watchdog_timeo = HZ*3; //modified by john, 0805
7461 if (dev_alloc_name(dev, ifname) < 0){
7462 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
7464 dev_alloc_name(dev, ifname);
7467 RT_TRACE(COMP_INIT, "Driver probe completed1\n");
7469 if(rtl8192_init(dev)!=0){
7470 RT_TRACE(COMP_ERR, "Initialization failed");
7474 netif_carrier_off(dev);
7475 netif_stop_queue(dev);
7477 register_netdev(dev);
7478 RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
7479 rtl8192_proc_init_one(dev);
7482 RT_TRACE(COMP_INIT, "Driver probe completed\n");
7485 free_ieee80211(dev);
7487 RT_TRACE(COMP_ERR, "wlan driver load failed\n");
7491 //detach all the work and timer structure declared or inititialize in r8192U_init function.
7492 void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
7494 cancel_work_sync(&priv->reset_wq);
7495 cancel_work_sync(&priv->qos_activate);
7496 cancel_delayed_work(&priv->watch_dog_wq);
7497 cancel_delayed_work(&priv->update_beacon_wq);
7498 cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
7499 cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
7500 //cancel_work_sync(&priv->SetBWModeWorkItem);
7501 //cancel_work_sync(&priv->SwChnlWorkItem);
7504 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf)
7506 struct net_device *dev = usb_get_intfdata(intf);
7507 struct r8192_priv *priv = ieee80211_priv(dev);
7510 unregister_netdev(dev);
7512 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
7513 rtl8192_proc_remove_one(dev);
7516 if (priv->pFirmware)
7518 vfree(priv->pFirmware);
7519 priv->pFirmware = NULL;
7521 // priv->rf_close(dev);
7522 // rtl8192_SetRFPowerState(dev, eRfOff);
7523 destroy_workqueue(priv->priv_wq);
7524 //rtl8192_irq_disable(dev);
7525 //rtl8192_reset(dev);
7529 free_ieee80211(dev);
7530 RT_TRACE(COMP_DOWN, "wlan driver removed\n");
7533 /* fun with the built-in ieee80211 stack... */
7534 extern int ieee80211_debug_init(void);
7535 extern void ieee80211_debug_exit(void);
7536 extern int ieee80211_crypto_init(void);
7537 extern void ieee80211_crypto_deinit(void);
7538 extern int ieee80211_crypto_tkip_init(void);
7539 extern void ieee80211_crypto_tkip_exit(void);
7540 extern int ieee80211_crypto_ccmp_init(void);
7541 extern void ieee80211_crypto_ccmp_exit(void);
7542 extern int ieee80211_crypto_wep_init(void);
7543 extern void ieee80211_crypto_wep_exit(void);
7545 static int __init rtl8192_usb_module_init(void)
7549 #ifdef CONFIG_IEEE80211_DEBUG
7550 ret = ieee80211_debug_init();
7552 printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
7556 ret = ieee80211_crypto_init();
7558 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
7562 ret = ieee80211_crypto_tkip_init();
7564 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
7566 goto fail_crypto_tkip;
7569 ret = ieee80211_crypto_ccmp_init();
7571 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
7573 goto fail_crypto_ccmp;
7576 ret = ieee80211_crypto_wep_init();
7578 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
7579 goto fail_crypto_wep;
7582 printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
7583 printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
7584 RT_TRACE(COMP_INIT, "Initializing module");
7585 RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
7587 ret = rtl8192_proc_module_init();
7589 pr_err("rtl8192_proc_module_init() failed %d\n", ret);
7593 ret = usb_register(&rtl8192_usb_driver);
7595 pr_err("usb_register() failed %d\n", ret);
7602 rtl8192_proc_module_remove();
7604 ieee80211_crypto_wep_exit();
7606 ieee80211_crypto_ccmp_exit();
7608 ieee80211_crypto_tkip_exit();
7610 ieee80211_crypto_deinit();
7612 #ifdef CONFIG_IEEE80211_DEBUG
7613 ieee80211_debug_exit();
7619 static void __exit rtl8192_usb_module_exit(void)
7621 usb_deregister(&rtl8192_usb_driver);
7623 RT_TRACE(COMP_DOWN, "Exiting");
7624 rtl8192_proc_module_remove();
7626 ieee80211_crypto_tkip_exit();
7627 ieee80211_crypto_ccmp_exit();
7628 ieee80211_crypto_wep_exit();
7629 ieee80211_crypto_deinit();
7630 #ifdef CONFIG_IEEE80211_DEBUG
7631 ieee80211_debug_exit();
7636 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
7638 unsigned long flags;
7640 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7642 spin_lock_irqsave(&priv->tx_lock,flags);
7643 enough_desc = check_nic_enough_desc(dev,pri);
7644 spin_unlock_irqrestore(&priv->tx_lock,flags);
7647 ieee80211_rtl_wake_queue(priv->ieee80211);
7650 void EnableHWSecurityConfig8192(struct net_device *dev)
7652 u8 SECR_value = 0x0;
7653 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7654 struct ieee80211_device* ieee = priv->ieee80211;
7656 SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
7658 if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
7660 SECR_value |= SCR_RxUseDK;
7661 SECR_value |= SCR_TxUseDK;
7663 else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
7665 SECR_value |= SCR_RxUseDK;
7666 SECR_value |= SCR_TxUseDK;
7669 //add HWSec active enable here.
7670 //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
7672 ieee->hwsec_active = 1;
7674 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
7676 ieee->hwsec_active = 0;
7677 SECR_value &= ~SCR_RxDecEnable;
7680 RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__, \
7681 ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
7683 write_nic_byte(dev, SECR, SECR_value);//SECR_value | SCR_UseDK );
7688 void setKey( struct net_device *dev,
7696 u32 TargetCommand = 0;
7697 u32 TargetContent = 0;
7700 if (EntryNo >= TOTAL_CAM_ENTRY)
7701 RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
7703 RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", dev,EntryNo, KeyIndex, KeyType, MacAddr);
7706 usConfig |= BIT15 | (KeyType<<2);
7708 usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
7709 // usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
7712 for(i=0 ; i<CAM_CONTENT_COUNT; i++){
7713 TargetCommand = i+CAM_CONTENT_COUNT*EntryNo;
7714 TargetCommand |= BIT31|BIT16;
7716 if(i==0){//MAC|Config
7717 TargetContent = (u32)(*(MacAddr+0)) << 16|
7718 (u32)(*(MacAddr+1)) << 24|
7721 write_nic_dword(dev, WCAMI, TargetContent);
7722 write_nic_dword(dev, RWCAM, TargetCommand);
7723 // printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
7726 TargetContent = (u32)(*(MacAddr+2)) |
7727 (u32)(*(MacAddr+3)) << 8|
7728 (u32)(*(MacAddr+4)) << 16|
7729 (u32)(*(MacAddr+5)) << 24;
7730 write_nic_dword(dev, WCAMI, TargetContent);
7731 write_nic_dword(dev, RWCAM, TargetCommand);
7735 if(KeyContent !=NULL){
7736 write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
7737 write_nic_dword(dev, RWCAM, TargetCommand);
7744 /***************************************************************************
7745 ------------------- module init / exit stubs ----------------
7746 ****************************************************************************/
7747 module_init(rtl8192_usb_module_init);
7748 module_exit(rtl8192_usb_module_exit);