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/eeprom_93cx6.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 "r8192U_wx.h"
60 #include "r8192S_rtl8225.h"
61 #include "r8192S_hw.h"
62 #include "r8192S_phy.h"
63 #include "r8192S_phyreg.h"
64 #include "r8192S_Efuse.h"
66 #include "r819xU_cmdpkt.h"
67 #include "r8192U_dm.h"
68 //#include "r8192xU_phyreg.h"
69 #include <linux/usb.h>
71 #include "r8192U_pm.h"
73 #include "ieee80211/dot11d.h"
77 u32 rt_global_debug_component = \
109 COMP_ERR; //always open err flags on
111 #define TOTAL_CAM_ENTRY 32
112 #define CAM_CONTENT_COUNT 8
114 static const struct usb_device_id rtl8192_usb_id_tbl[] = {
116 {USB_DEVICE(0x0bda, 0x8171)},
117 {USB_DEVICE(0x0bda, 0x8192)},
118 {USB_DEVICE(0x0bda, 0x8709)},
120 {USB_DEVICE(0x07aa, 0x0043)},
122 {USB_DEVICE(0x050d, 0x805E)},
123 {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */
125 {USB_DEVICE(0x0df6, 0x0031)},
126 {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */
128 {USB_DEVICE(0x1740, 0x9201)},
130 {USB_DEVICE(0x2001, 0x3301)},
132 {USB_DEVICE(0x5a57, 0x0290)},
134 {USB_DEVICE(0x06f8, 0xe031)},
136 {USB_DEVICE(0x0bda, 0x8172)},
140 MODULE_LICENSE("GPL");
141 MODULE_VERSION("V 1.1");
142 MODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
143 MODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
145 static char* ifname = "wlan%d";
146 static int hwwep = 1; //default use hw. set 0 to use software security
147 static int channels = 0x3fff;
151 module_param(ifname, charp, S_IRUGO|S_IWUSR );
152 //module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
153 module_param(hwwep,int, S_IRUGO|S_IWUSR);
154 module_param(channels,int, S_IRUGO|S_IWUSR);
156 MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
157 //MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
158 MODULE_PARM_DESC(hwwep," Try to use hardware security support. ");
159 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
161 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
162 const struct usb_device_id *id);
163 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf);
165 static struct usb_driver rtl8192_usb_driver = {
166 .name = RTL819xU_MODULE_NAME, /* Driver name */
167 .id_table = rtl8192_usb_id_tbl, /* PCI_ID table */
168 .probe = rtl8192_usb_probe, /* probe fn */
169 .disconnect = rtl8192_usb_disconnect, /* remove fn */
170 .suspend = rtl8192U_suspend, /* PM suspend fn */
171 .resume = rtl8192U_resume, /* PM resume fn */
172 .reset_resume = rtl8192U_resume, /* PM reset resume fn */
176 static void rtl8192SU_read_eeprom_info(struct net_device *dev);
177 short rtl8192SU_tx(struct net_device *dev, struct sk_buff* skb);
178 void rtl8192SU_rx_nomal(struct sk_buff* skb);
179 void rtl8192SU_rx_cmd(struct sk_buff *skb);
180 bool rtl8192SU_adapter_start(struct net_device *dev);
181 short rtl8192SU_tx_cmd(struct net_device *dev, struct sk_buff *skb);
182 void rtl8192SU_link_change(struct net_device *dev);
183 void InitialGain8192S(struct net_device *dev,u8 Operation);
184 void rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe);
186 struct rtl819x_ops rtl8192su_ops = {
187 .nic_type = NIC_8192SU,
188 .rtl819x_read_eeprom_info = rtl8192SU_read_eeprom_info,
189 .rtl819x_tx = rtl8192SU_tx,
190 .rtl819x_tx_cmd = rtl8192SU_tx_cmd,
191 .rtl819x_rx_nomal = rtl8192SU_rx_nomal,
192 .rtl819x_rx_cmd = rtl8192SU_rx_cmd,
193 .rtl819x_adapter_start = rtl8192SU_adapter_start,
194 .rtl819x_link_change = rtl8192SU_link_change,
195 .rtl819x_initial_gain = InitialGain8192S,
196 .rtl819x_query_rxdesc_status = rtl8192SU_query_rxdesc_status,
200 typedef struct _CHANNEL_LIST
204 }CHANNEL_LIST, *PCHANNEL_LIST;
206 static CHANNEL_LIST ChannelPlan[] = {
207 {{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
208 {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
209 {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
210 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Spain. Change to ETSI.
211 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //France. Change to ETSI.
212 {{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
213 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
214 {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, //Israel.
215 {{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
216 {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22}, //MIC
217 {{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
220 static void rtl819x_eeprom_register_read(struct eeprom_93cx6 *eeprom)
222 struct net_device *dev = eeprom->data;
223 u8 reg = read_nic_byte(dev, EPROM_CMD);
225 eeprom->reg_data_in = reg & RTL819X_EEPROM_CMD_WRITE;
226 eeprom->reg_data_out = reg & RTL819X_EEPROM_CMD_READ;
227 eeprom->reg_data_clock = reg & RTL819X_EEPROM_CMD_CK;
228 eeprom->reg_chip_select = reg & RTL819X_EEPROM_CMD_CS;
231 static void rtl819x_eeprom_register_write(struct eeprom_93cx6 *eeprom)
233 struct net_device *dev = eeprom->data;
236 if (eeprom->reg_data_in)
237 reg |= RTL819X_EEPROM_CMD_WRITE;
238 if (eeprom->reg_data_out)
239 reg |= RTL819X_EEPROM_CMD_READ;
240 if (eeprom->reg_data_clock)
241 reg |= RTL819X_EEPROM_CMD_CK;
242 if (eeprom->reg_chip_select)
243 reg |= RTL819X_EEPROM_CMD_CS;
245 write_nic_byte(dev, EPROM_CMD, reg);
246 read_nic_byte(dev, EPROM_CMD);
250 static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
252 int i, max_chan=-1, min_chan=-1;
253 struct ieee80211_device* ieee = priv->ieee80211;
254 switch (channel_plan)
256 case COUNTRY_CODE_FCC:
257 case COUNTRY_CODE_IC:
258 case COUNTRY_CODE_ETSI:
259 case COUNTRY_CODE_SPAIN:
260 case COUNTRY_CODE_FRANCE:
261 case COUNTRY_CODE_MKK:
262 case COUNTRY_CODE_MKK1:
263 case COUNTRY_CODE_ISRAEL:
264 case COUNTRY_CODE_TELEC:
265 case COUNTRY_CODE_MIC:
268 ieee->bGlobalDomain = false;
269 //acturally 8225 & 8256 rf chip only support B,G,24N mode
270 if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256) || (priv->rf_chip == RF_6052))
277 RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
279 if (ChannelPlan[channel_plan].Len != 0){
280 // Clear old channel map
281 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
282 // Set new channel map
283 for (i=0;i<ChannelPlan[channel_plan].Len;i++)
285 if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
287 GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
292 case COUNTRY_CODE_GLOBAL_DOMAIN:
294 GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
296 ieee->bGlobalDomain = true;
305 #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 )
307 #define rx_hal_is_cck_rate(_pDesc)\
308 ((_pDesc->RxMCS == DESC92S_RATE1M ||\
309 _pDesc->RxMCS == DESC92S_RATE2M ||\
310 _pDesc->RxMCS == DESC92S_RATE5_5M ||\
311 _pDesc->RxMCS == DESC92S_RATE11M) &&\
314 #define tx_hal_is_cck_rate(_DataRate)\
315 ( _DataRate == MGN_1M ||\
316 _DataRate == MGN_2M ||\
317 _DataRate == MGN_5_5M ||\
318 _DataRate == MGN_11M )
323 void CamResetAllEntry(struct net_device *dev)
327 //2004/02/11 In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
328 // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
329 // In this condition, Cam can not be reset because upper layer will not set this static key again.
330 //if(Adapter->EncAlgorithm == WEP_Encryption)
333 //DbgPrint("========================================\n");
334 //DbgPrint(" Call ResetAllEntry \n");
335 //DbgPrint("========================================\n\n");
336 ulcommand |= BIT31|BIT30;
337 write_nic_dword(dev, RWCAM, ulcommand);
339 for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
340 CAM_mark_invalid(dev, ucIndex);
341 for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
342 CAM_empty_entry(dev, ucIndex);
348 void write_cam(struct net_device *dev, u8 addr, u32 data)
350 write_nic_dword(dev, WCAMI, data);
351 write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
354 u32 read_cam(struct net_device *dev, u8 addr)
356 write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
357 return read_nic_dword(dev, 0xa8);
360 void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
363 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
364 struct usb_device *udev = priv->udev;
366 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
367 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
368 indx|0xfe00, 0, &data, 1, HZ / 2);
372 printk("write_nic_byte_E TimeOut! status:%d\n", status);
376 u8 read_nic_byte_E(struct net_device *dev, int indx)
380 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
381 struct usb_device *udev = priv->udev;
383 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
384 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
385 indx|0xfe00, 0, &data, 1, HZ / 2);
389 printk("read_nic_byte_E TimeOut! status:%d\n", status);
394 //as 92U has extend page from 4 to 16, so modify functions below.
395 void write_nic_byte(struct net_device *dev, int indx, u8 data)
399 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
400 struct usb_device *udev = priv->udev;
402 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
403 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
404 indx, 0, &data, 1, HZ / 2);
408 printk("write_nic_byte TimeOut! status:%d\n", status);
415 void write_nic_word(struct net_device *dev, int indx, u16 data)
420 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
421 struct usb_device *udev = priv->udev;
423 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
424 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
425 indx, 0, &data, 2, HZ / 2);
429 printk("write_nic_word TimeOut! status:%d\n", status);
435 void write_nic_dword(struct net_device *dev, int indx, u32 data)
440 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
441 struct usb_device *udev = priv->udev;
443 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
444 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
445 indx, 0, &data, 4, HZ / 2);
450 printk("write_nic_dword TimeOut! status:%d\n", status);
457 u8 read_nic_byte(struct net_device *dev, int indx)
461 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
462 struct usb_device *udev = priv->udev;
464 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
465 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
466 indx, 0, &data, 1, HZ / 2);
470 printk("read_nic_byte TimeOut! status:%d\n", status);
478 u16 read_nic_word(struct net_device *dev, int indx)
482 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
483 struct usb_device *udev = priv->udev;
485 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
486 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
487 indx, 0, &data, 2, HZ / 2);
491 printk("read_nic_word TimeOut! status:%d\n", status);
498 u16 read_nic_word_E(struct net_device *dev, int indx)
502 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
503 struct usb_device *udev = priv->udev;
505 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
506 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
507 indx|0xfe00, 0, &data, 2, HZ / 2);
511 printk("read_nic_word TimeOut! status:%d\n", status);
518 u32 read_nic_dword(struct net_device *dev, int indx)
524 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
525 struct usb_device *udev = priv->udev;
527 status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
528 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
529 indx, 0, &data, 4, HZ / 2);
531 // printk(KERN_WARNING "read size of data = %d\, date = %d\n", result, data);
536 printk("read_nic_dword TimeOut! status:%d\n", status);
537 if(status == -ENODEV) {
538 priv->usb_error = true;
548 //u8 read_phy_cck(struct net_device *dev, u8 adr);
549 //u8 read_phy_ofdm(struct net_device *dev, u8 adr);
550 /* this might still called in what was the PHY rtl8185/rtl8192 common code
551 * plans are to possibilty turn it again in one common code...
553 inline void force_pci_posting(struct net_device *dev)
558 static struct net_device_stats *rtl8192_stats(struct net_device *dev);
559 void rtl8192_commit(struct net_device *dev);
560 //void rtl8192_restart(struct net_device *dev);
561 void rtl8192_restart(struct work_struct *work);
562 //void rtl8192_rq_tx_ack(struct work_struct *work);
564 void watch_dog_timer_callback(unsigned long data);
566 /****************************************************************************
567 -----------------------------PROCFS STUFF-------------------------
568 *****************************************************************************/
570 static struct proc_dir_entry *rtl8192_proc = NULL;
574 static int proc_get_stats_ap(char *page, char **start,
575 off_t offset, int count,
576 int *eof, void *data)
578 struct net_device *dev = data;
579 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
580 struct ieee80211_device *ieee = priv->ieee80211;
581 struct ieee80211_network *target;
585 list_for_each_entry(target, &ieee->network_list, list) {
587 len += snprintf(page + len, count - len,
588 "%s ", target->ssid);
590 if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
591 len += snprintf(page + len, count - len,
595 len += snprintf(page + len, count - len,
605 static int proc_get_registers(char *page, char **start,
606 off_t offset, int count,
607 int *eof, void *data)
609 struct net_device *dev = data;
610 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
613 int i,n,page0,page1,page2;
620 /* This dump the current register page */
621 if(!IS_BB_REG_OFFSET_92S(page0)){
622 len += snprintf(page + len, count - len,
623 "\n####################page %x##################\n ", (page0>>8));
626 len += snprintf(page + len, count - len,
628 for(i=0;i<16 && n<=max;i++,n++)
629 len += snprintf(page + len, count - len,
630 "%2.2x ",read_nic_byte(dev,(page0|n)));
633 len += snprintf(page + len, count - len,
634 "\n####################page %x##################\n ", (page0>>8));
637 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
638 for(i=0;i<4 && n<=max;n+=4,i++)
639 len += snprintf(page + len, count - len,
640 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
643 len += snprintf(page + len, count - len,"\n");
648 static int proc_get_registers_1(char *page, char **start,
649 off_t offset, int count,
650 int *eof, void *data)
652 struct net_device *dev = data;
653 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
661 /* This dump the current register page */
662 len += snprintf(page + len, count - len,
663 "\n####################page %x##################\n ", (page0>>8));
666 len += snprintf(page + len, count - len,
668 for(i=0;i<16 && n<=max;i++,n++)
669 len += snprintf(page + len, count - len,
670 "%2.2x ",read_nic_byte(dev,(page0|n)));
672 len += snprintf(page + len, count - len,"\n");
677 static int proc_get_registers_2(char *page, char **start,
678 off_t offset, int count,
679 int *eof, void *data)
681 struct net_device *dev = data;
682 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
690 /* This dump the current register page */
691 len += snprintf(page + len, count - len,
692 "\n####################page %x##################\n ", (page0>>8));
695 len += snprintf(page + len, count - len,
697 for(i=0;i<16 && n<=max;i++,n++)
698 len += snprintf(page + len, count - len,
699 "%2.2x ",read_nic_byte(dev,(page0|n)));
701 len += snprintf(page + len, count - len,"\n");
706 static int proc_get_registers_8(char *page, char **start,
707 off_t offset, int count,
708 int *eof, void *data)
710 struct net_device *dev = data;
718 /* This dump the current register page */
719 len += snprintf(page + len, count - len,
720 "\n####################page %x##################\n ", (page0>>8));
723 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
724 for(i=0;i<4 && n<=max;n+=4,i++)
725 len += snprintf(page + len, count - len,
726 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
728 len += snprintf(page + len, count - len,"\n");
733 static int proc_get_registers_9(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_a(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_b(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_c(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_d(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");
868 static int proc_get_registers_e(char *page, char **start,
869 off_t offset, int count,
870 int *eof, void *data)
872 struct net_device *dev = data;
873 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
881 /* This dump the current register page */
882 len += snprintf(page + len, count - len,
883 "\n####################page %x##################\n ", (page0>>8));
886 len += snprintf(page + len, count - len, "\nD: %2x > ",n);
887 for(i=0;i<4 && n<=max;n+=4,i++)
888 len += snprintf(page + len, count - len,
889 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
891 len += snprintf(page + len, count - len,"\n");
896 static int proc_get_stats_tx(char *page, char **start,
897 off_t offset, int count,
898 int *eof, void *data)
900 struct net_device *dev = data;
901 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
905 len += snprintf(page + len, count - len,
906 "TX VI priority ok int: %lu\n"
907 "TX VI priority error int: %lu\n"
908 "TX VO priority ok int: %lu\n"
909 "TX VO priority error int: %lu\n"
910 "TX BE priority ok int: %lu\n"
911 "TX BE priority error int: %lu\n"
912 "TX BK priority ok int: %lu\n"
913 "TX BK priority error int: %lu\n"
914 "TX MANAGE priority ok int: %lu\n"
915 "TX MANAGE priority error int: %lu\n"
916 "TX BEACON priority ok int: %lu\n"
917 "TX BEACON priority error int: %lu\n"
918 // "TX high priority ok int: %lu\n"
919 // "TX high priority failed error int: %lu\n"
920 "TX queue resume: %lu\n"
921 "TX queue stopped?: %d\n"
922 "TX fifo overflow: %lu\n"
923 // "TX beacon: %lu\n"
928 // "TX HW queue: %d\n"
929 "TX VI dropped: %lu\n"
930 "TX VO dropped: %lu\n"
931 "TX BE dropped: %lu\n"
932 "TX BK dropped: %lu\n"
933 "TX total data packets %lu\n",
934 // "TX beacon aborted: %lu\n",
935 priv->stats.txviokint,
937 priv->stats.txvookint,
939 priv->stats.txbeokint,
941 priv->stats.txbkokint,
943 priv->stats.txmanageokint,
944 priv->stats.txmanageerr,
945 priv->stats.txbeaconokint,
946 priv->stats.txbeaconerr,
947 // priv->stats.txhpokint,
948 // priv->stats.txhperr,
949 priv->stats.txresumed,
950 netif_queue_stopped(dev),
951 priv->stats.txoverflow,
952 // priv->stats.txbeacon,
953 atomic_read(&(priv->tx_pending[VI_PRIORITY])),
954 atomic_read(&(priv->tx_pending[VO_PRIORITY])),
955 atomic_read(&(priv->tx_pending[BE_PRIORITY])),
956 atomic_read(&(priv->tx_pending[BK_PRIORITY])),
957 // read_nic_byte(dev, TXFIFOCOUNT),
958 priv->stats.txvidrop,
959 priv->stats.txvodrop,
960 priv->stats.txbedrop,
961 priv->stats.txbkdrop,
962 priv->stats.txdatapkt
963 // priv->stats.txbeaconerr
972 static int proc_get_stats_rx(char *page, char **start,
973 off_t offset, int count,
974 int *eof, void *data)
976 struct net_device *dev = data;
977 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
981 len += snprintf(page + len, count - len,
983 "RX urb status error: %lu\n"
984 "RX invalid urb error: %lu\n",
985 priv->stats.rxoktotal,
986 priv->stats.rxstaterr,
987 priv->stats.rxurberr);
993 void rtl8192_proc_module_init(void)
995 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
996 rtl8192_proc=create_proc_entry(RTL819xU_MODULE_NAME, S_IFDIR, init_net.proc_net);
1000 void rtl8192_proc_module_remove(void)
1002 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
1006 void rtl8192_proc_remove_one(struct net_device *dev)
1008 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1011 if (priv->dir_dev) {
1012 // remove_proc_entry("stats-hw", priv->dir_dev);
1013 remove_proc_entry("stats-tx", priv->dir_dev);
1014 remove_proc_entry("stats-rx", priv->dir_dev);
1015 // remove_proc_entry("stats-ieee", priv->dir_dev);
1016 remove_proc_entry("stats-ap", priv->dir_dev);
1017 remove_proc_entry("registers", priv->dir_dev);
1018 remove_proc_entry("registers-1", priv->dir_dev);
1019 remove_proc_entry("registers-2", priv->dir_dev);
1020 remove_proc_entry("registers-8", priv->dir_dev);
1021 remove_proc_entry("registers-9", priv->dir_dev);
1022 remove_proc_entry("registers-a", priv->dir_dev);
1023 remove_proc_entry("registers-b", priv->dir_dev);
1024 remove_proc_entry("registers-c", priv->dir_dev);
1025 remove_proc_entry("registers-d", priv->dir_dev);
1026 remove_proc_entry("registers-e", priv->dir_dev);
1027 // remove_proc_entry("cck-registers",priv->dir_dev);
1028 // remove_proc_entry("ofdm-registers",priv->dir_dev);
1029 //remove_proc_entry(dev->name, rtl8192_proc);
1030 remove_proc_entry("wlan0", rtl8192_proc);
1031 priv->dir_dev = NULL;
1036 void rtl8192_proc_init_one(struct net_device *dev)
1038 struct proc_dir_entry *e;
1039 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1040 priv->dir_dev = create_proc_entry(dev->name,
1041 S_IFDIR | S_IRUGO | S_IXUGO,
1043 if (!priv->dir_dev) {
1044 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
1048 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
1049 priv->dir_dev, proc_get_stats_rx, dev);
1052 RT_TRACE(COMP_ERR,"Unable to initialize "
1053 "/proc/net/rtl8192/%s/stats-rx\n",
1058 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
1059 priv->dir_dev, proc_get_stats_tx, dev);
1062 RT_TRACE(COMP_ERR, "Unable to initialize "
1063 "/proc/net/rtl8192/%s/stats-tx\n",
1067 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
1068 priv->dir_dev, proc_get_stats_ap, dev);
1071 RT_TRACE(COMP_ERR, "Unable to initialize "
1072 "/proc/net/rtl8192/%s/stats-ap\n",
1076 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
1077 priv->dir_dev, proc_get_registers, dev);
1079 RT_TRACE(COMP_ERR, "Unable to initialize "
1080 "/proc/net/rtl8192/%s/registers\n",
1083 e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
1084 priv->dir_dev, proc_get_registers_1, dev);
1086 RT_TRACE(COMP_ERR, "Unable to initialize "
1087 "/proc/net/rtl8192/%s/registers-1\n",
1090 e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
1091 priv->dir_dev, proc_get_registers_2, dev);
1093 RT_TRACE(COMP_ERR, "Unable to initialize "
1094 "/proc/net/rtl8192/%s/registers-2\n",
1097 e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
1098 priv->dir_dev, proc_get_registers_8, dev);
1100 RT_TRACE(COMP_ERR, "Unable to initialize "
1101 "/proc/net/rtl8192/%s/registers-8\n",
1104 e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
1105 priv->dir_dev, proc_get_registers_9, dev);
1107 RT_TRACE(COMP_ERR, "Unable to initialize "
1108 "/proc/net/rtl8192/%s/registers-9\n",
1111 e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
1112 priv->dir_dev, proc_get_registers_a, dev);
1114 RT_TRACE(COMP_ERR, "Unable to initialize "
1115 "/proc/net/rtl8192/%s/registers-a\n",
1118 e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
1119 priv->dir_dev, proc_get_registers_b, dev);
1121 RT_TRACE(COMP_ERR, "Unable to initialize "
1122 "/proc/net/rtl8192/%s/registers-b\n",
1125 e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
1126 priv->dir_dev, proc_get_registers_c, dev);
1128 RT_TRACE(COMP_ERR, "Unable to initialize "
1129 "/proc/net/rtl8192/%s/registers-c\n",
1132 e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
1133 priv->dir_dev, proc_get_registers_d, dev);
1135 RT_TRACE(COMP_ERR, "Unable to initialize "
1136 "/proc/net/rtl8192/%s/registers-d\n",
1139 e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
1140 priv->dir_dev, proc_get_registers_e, dev);
1142 RT_TRACE(COMP_ERR, "Unable to initialize "
1143 "/proc/net/rtl8192/%s/registers-e\n",
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");
1188 /* this is only for debug */
1189 void rtl8192_dump_reg(struct net_device *dev)
1195 RT_TRACE(COMP_PHY, "Dumping NIC register map");
1199 printk( "\nD: %2x> ", n);
1200 for(i=0;i<16 && n<=max;i++,n++)
1201 printk("%2x ",read_nic_byte(dev,n));
1206 /****************************************************************************
1207 ------------------------------HW STUFF---------------------------
1208 *****************************************************************************/
1210 void rtl8192_set_mode(struct net_device *dev,int mode)
1213 ecmd=read_nic_byte(dev, EPROM_CMD);
1214 ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
1215 ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
1216 ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
1217 ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
1218 write_nic_byte(dev, EPROM_CMD, ecmd);
1222 void rtl8192_update_msr(struct net_device *dev)
1224 struct r8192_priv *priv = ieee80211_priv(dev);
1225 LED_CTL_MODE LedAction = LED_CTL_NO_LINK;
1228 msr = read_nic_byte(dev, MSR);
1229 msr &= ~ MSR_LINK_MASK;
1231 /* do not change in link_state != WLAN_LINK_ASSOCIATED.
1232 * msr must be updated if the state is ASSOCIATING.
1233 * this is intentional and make sense for ad-hoc and
1234 * master (see the create BSS/IBSS func)
1236 if (priv->ieee80211->state == IEEE80211_LINKED) {
1238 if (priv->ieee80211->iw_mode == IW_MODE_INFRA) {
1239 msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
1240 LedAction = LED_CTL_LINK;
1241 } else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1242 msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
1243 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
1244 msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
1247 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
1249 write_nic_byte(dev, MSR, msr);
1251 if(priv->ieee80211->LedControlHandler != NULL)
1252 priv->ieee80211->LedControlHandler(dev, LedAction);
1255 void rtl8192_set_chan(struct net_device *dev,short ch)
1257 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1259 RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
1260 //printk("=====>%s()====ch:%d\n", __FUNCTION__, ch);
1263 /* this hack should avoid frame TX during channel setting*/
1266 // tx = read_nic_dword(dev,TX_CONF);
1267 // tx &= ~TX_LOOPBACK_MASK;
1270 // write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
1272 //need to implement rf set channel here WB
1274 if (priv->rf_set_chan)
1275 priv->rf_set_chan(dev,priv->chan);
1277 // write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
1281 static void rtl8192_rx_isr(struct urb *urb);
1283 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
1286 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
1287 + pstats->RxBufShift);
1290 static int rtl8192_rx_initiate(struct net_device*dev)
1292 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1294 struct sk_buff *skb;
1295 struct rtl8192_rx_info *info;
1297 /* nomal packet rx procedure */
1298 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
1299 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
1302 entry = usb_alloc_urb(0, GFP_KERNEL);
1307 usb_fill_bulk_urb(entry, priv->udev,
1308 usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
1309 RX_URB_SIZE, rtl8192_rx_isr, skb);
1310 info = (struct rtl8192_rx_info *) skb->cb;
1313 info->out_pipe = 3; //denote rx normal packet queue
1314 skb_queue_tail(&priv->rx_queue, skb);
1315 usb_submit_urb(entry, GFP_KERNEL);
1318 /* command packet rx procedure */
1319 while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
1320 skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
1323 entry = usb_alloc_urb(0, GFP_KERNEL);
1328 usb_fill_bulk_urb(entry, priv->udev,
1329 usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
1330 RX_URB_SIZE, rtl8192_rx_isr, skb);
1331 info = (struct rtl8192_rx_info *) skb->cb;
1334 info->out_pipe = 9; //denote rx cmd packet queue
1335 skb_queue_tail(&priv->rx_queue, skb);
1336 usb_submit_urb(entry, GFP_KERNEL);
1342 void rtl8192_set_rxconf(struct net_device *dev)
1344 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1347 rxconf=read_nic_dword(dev,RCR);
1348 rxconf = rxconf &~ MAC_FILTER_MASK;
1349 rxconf = rxconf | RCR_AMF;
1350 rxconf = rxconf | RCR_ADF;
1351 rxconf = rxconf | RCR_AB;
1352 rxconf = rxconf | RCR_AM;
1353 //rxconf = rxconf | RCR_ACF;
1355 if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
1357 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
1358 dev->flags & IFF_PROMISC){
1359 rxconf = rxconf | RCR_AAP;
1360 } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
1361 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
1362 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
1364 rxconf = rxconf | RCR_APM;
1365 rxconf = rxconf | RCR_CBSSID;
1369 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
1370 rxconf = rxconf | RCR_AICV;
1371 rxconf = rxconf | RCR_APWRMGT;
1374 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
1375 rxconf = rxconf | RCR_ACRC32;
1378 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
1379 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
1380 rxconf = rxconf &~ MAX_RX_DMA_MASK;
1381 rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
1383 // rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
1384 rxconf = rxconf | RCR_ONLYERLPKT;
1386 // rxconf = rxconf &~ RCR_CS_MASK;
1387 // rxconf = rxconf | (1<<RCR_CS_SHIFT);
1389 write_nic_dword(dev, RCR, rxconf);
1392 DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
1395 //wait to be removed
1396 void rtl8192_rx_enable(struct net_device *dev)
1400 //struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1402 rtl8192_rx_initiate(dev);
1404 // rtl8192_set_rxconf(dev);
1408 void rtl8192_tx_enable(struct net_device *dev)
1412 void rtl8192_rtx_disable(struct net_device *dev)
1415 struct r8192_priv *priv = ieee80211_priv(dev);
1416 struct sk_buff *skb;
1417 struct rtl8192_rx_info *info;
1419 cmd=read_nic_byte(dev,CMDR);
1420 write_nic_byte(dev, CMDR, cmd &~ \
1422 force_pci_posting(dev);
1425 while ((skb = __skb_dequeue(&priv->rx_queue))) {
1426 info = (struct rtl8192_rx_info *) skb->cb;
1430 usb_kill_urb(info->urb);
1434 if (skb_queue_len(&priv->skb_queue)) {
1435 printk(KERN_WARNING "skb_queue not empty\n");
1438 skb_queue_purge(&priv->skb_queue);
1443 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
1448 inline u16 ieeerate2rtlrate(int rate)
1480 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
1481 inline u16 rtl8192_rate2rate(short rate)
1483 if (rate >11) return 0;
1484 return rtl_rate[rate];
1487 static void rtl8192_rx_isr(struct urb *urb)
1489 struct sk_buff *skb = (struct sk_buff *) urb->context;
1490 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1491 struct net_device *dev = info->dev;
1492 struct r8192_priv *priv = ieee80211_priv(dev);
1493 int out_pipe = info->out_pipe;
1497 if (unlikely(urb->status)) {
1499 priv->stats.rxstaterr++;
1500 priv->ieee80211->stats.rx_errors++;
1502 // printk("%s():rx status err\n",__FUNCTION__);
1506 skb_unlink(skb, &priv->rx_queue);
1507 skb_put(skb, urb->actual_length);
1509 skb_queue_tail(&priv->skb_queue, skb);
1510 tasklet_schedule(&priv->irq_rx_tasklet);
1512 skb = dev_alloc_skb(RX_URB_SIZE);
1513 if (unlikely(!skb)) {
1515 printk("%s():can,t alloc skb\n",__FUNCTION__);
1516 /* TODO check rx queue length and refill *somewhere* */
1520 usb_fill_bulk_urb(urb, priv->udev,
1521 usb_rcvbulkpipe(priv->udev, out_pipe),
1522 skb_tail_pointer(skb),
1523 RX_URB_SIZE, rtl8192_rx_isr, skb);
1525 info = (struct rtl8192_rx_info *) skb->cb;
1528 info->out_pipe = out_pipe;
1530 urb->transfer_buffer = skb_tail_pointer(skb);
1532 skb_queue_tail(&priv->rx_queue, skb);
1533 err = usb_submit_urb(urb, GFP_ATOMIC);
1534 if(err && err != -EPERM)
1535 printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
1539 rtl819xusb_rx_command_packet(
1540 struct net_device *dev,
1541 struct ieee80211_rx_stats *pstats
1546 //RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
1548 status = cmpk_message_handle_rx(dev, pstats);
1551 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1555 //RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
1558 //RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
1562 void rtl8192_data_hard_stop(struct net_device *dev)
1568 void rtl8192_data_hard_resume(struct net_device *dev)
1573 /* this function TX data frames when the ieee80211 stack requires this.
1574 * It checks also if we need to stop the ieee tx queue, eventually do it
1576 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1578 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1580 unsigned long flags;
1581 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1582 u8 queue_index = tcb_desc->queue_index;
1584 /* shall not be referred by command packet */
1585 assert(queue_index != TXCMD_QUEUE);
1587 spin_lock_irqsave(&priv->tx_lock,flags);
1589 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1590 // tcb_desc->RATRIndex = 7;
1591 // tcb_desc->bTxDisableRateFallBack = 1;
1592 // tcb_desc->bTxUseDriverAssingedRate = 1;
1593 tcb_desc->bTxEnableFwCalcDur = 1;
1594 skb_push(skb, priv->ieee80211->tx_headroom);
1595 ret = priv->ops->rtl819x_tx(dev, skb);
1597 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1598 //priv->ieee80211->stats.tx_packets++;
1600 spin_unlock_irqrestore(&priv->tx_lock,flags);
1606 /* This is a rough attempt to TX a frame
1607 * This is called by the ieee 80211 stack to TX management frames.
1608 * If the ring is full packet are dropped (for data frame the queue
1609 * is stopped before this can happen).
1611 int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
1613 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1615 unsigned long flags;
1616 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1617 u8 queue_index = tcb_desc->queue_index;
1620 spin_lock_irqsave(&priv->tx_lock,flags);
1622 memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1623 if(queue_index == TXCMD_QUEUE) {
1624 skb_push(skb, USB_HWDESC_HEADER_LEN);
1625 priv->ops->rtl819x_tx_cmd(dev, skb);
1627 spin_unlock_irqrestore(&priv->tx_lock,flags);
1630 skb_push(skb, priv->ieee80211->tx_headroom);
1631 ret = priv->ops->rtl819x_tx(dev, skb);
1634 spin_unlock_irqrestore(&priv->tx_lock,flags);
1640 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1643 static void rtl8192_tx_isr(struct urb *tx_urb)
1645 struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
1646 struct net_device *dev = NULL;
1647 struct r8192_priv *priv = NULL;
1648 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1649 u8 queue_index = tcb_desc->queue_index;
1650 // bool bToSend0Byte;
1651 // u16 BufLen = skb->len;
1653 memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
1654 priv = ieee80211_priv(dev);
1656 if(tcb_desc->queue_index != TXCMD_QUEUE) {
1657 if(tx_urb->status == 0) {
1658 // dev->trans_start = jiffies;
1659 // As act as station mode, destion shall be unicast address.
1660 //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1661 //priv->ieee80211->stats.tx_packets++;
1662 priv->stats.txoktotal++;
1663 priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1664 priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1666 priv->ieee80211->stats.tx_errors++;
1667 //priv->stats.txmanageerr++;
1672 /* free skb and tx_urb */
1674 dev_kfree_skb_any(skb);
1675 usb_free_urb(tx_urb);
1676 atomic_dec(&priv->tx_pending[queue_index]);
1681 // Handle HW Beacon:
1682 // We had transfer our beacon frame to host controler at this moment.
1686 // Handling the wait queue of command packets.
1687 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1688 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1690 if (queue_index == MGNT_QUEUE){
1691 if (priv->ieee80211->ack_tx_to_ieee){
1692 if (rtl8192_is_tx_queue_empty(dev)){
1693 priv->ieee80211->ack_tx_to_ieee = 0;
1694 ieee80211_ps_tx_ack(priv->ieee80211, 1);
1698 /* Handle MPDU in wait queue. */
1699 if(queue_index != BEACON_QUEUE) {
1700 /* Don't send data frame during scanning.*/
1701 if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1702 (!(priv->ieee80211->queue_stop))) {
1703 if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1704 priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1706 return; //modified by david to avoid further processing AMSDU
1712 void rtl8192_beacon_stop(struct net_device *dev)
1715 struct r8192_priv *priv = ieee80211_priv(dev);
1717 msr = read_nic_byte(dev, MSR);
1718 msrm = msr & MSR_LINK_MASK;
1719 msr2 = msr & ~MSR_LINK_MASK;
1721 if(NIC_8192U == priv->card_8192) {
1722 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1724 if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1725 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
1726 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1727 write_nic_byte(dev, MSR, msr);
1731 void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
1733 struct r8192_priv *priv = ieee80211_priv(dev);
1734 struct ieee80211_network *net;
1735 u8 i=0, basic_rate = 0;
1736 net = & priv->ieee80211->current_network;
1738 for (i=0; i<net->rates_len; i++)
1740 basic_rate = net->rates[i]&0x7f;
1743 case MGN_1M: *rate_config |= RRSR_1M; break;
1744 case MGN_2M: *rate_config |= RRSR_2M; break;
1745 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1746 case MGN_11M: *rate_config |= RRSR_11M; break;
1747 case MGN_6M: *rate_config |= RRSR_6M; break;
1748 case MGN_9M: *rate_config |= RRSR_9M; break;
1749 case MGN_12M: *rate_config |= RRSR_12M; break;
1750 case MGN_18M: *rate_config |= RRSR_18M; break;
1751 case MGN_24M: *rate_config |= RRSR_24M; break;
1752 case MGN_36M: *rate_config |= RRSR_36M; break;
1753 case MGN_48M: *rate_config |= RRSR_48M; break;
1754 case MGN_54M: *rate_config |= RRSR_54M; break;
1757 for (i=0; i<net->rates_ex_len; i++)
1759 basic_rate = net->rates_ex[i]&0x7f;
1762 case MGN_1M: *rate_config |= RRSR_1M; break;
1763 case MGN_2M: *rate_config |= RRSR_2M; break;
1764 case MGN_5_5M: *rate_config |= RRSR_5_5M; break;
1765 case MGN_11M: *rate_config |= RRSR_11M; break;
1766 case MGN_6M: *rate_config |= RRSR_6M; break;
1767 case MGN_9M: *rate_config |= RRSR_9M; break;
1768 case MGN_12M: *rate_config |= RRSR_12M; break;
1769 case MGN_18M: *rate_config |= RRSR_18M; break;
1770 case MGN_24M: *rate_config |= RRSR_24M; break;
1771 case MGN_36M: *rate_config |= RRSR_36M; break;
1772 case MGN_48M: *rate_config |= RRSR_48M; break;
1773 case MGN_54M: *rate_config |= RRSR_54M; break;
1779 #define SHORT_SLOT_TIME 9
1780 #define NON_SHORT_SLOT_TIME 20
1782 void rtl8192_update_cap(struct net_device* dev, u16 cap)
1785 struct r8192_priv *priv = ieee80211_priv(dev);
1786 struct ieee80211_network *net = &priv->ieee80211->current_network;
1787 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1789 //LZM MOD 090303 HW_VAR_ACK_PREAMBLE
1793 tmp = ((priv->nCur40MhzPrimeSC) << 5);
1794 if (priv->short_preamble)
1796 write_nic_byte(dev, RRSR+2, tmp);
1799 if (net->mode & (IEEE_G|IEEE_N_24G))
1802 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
1804 slot_time = SHORT_SLOT_TIME;
1806 else //long slot time
1807 slot_time = NON_SHORT_SLOT_TIME;
1808 priv->slot_time = slot_time;
1809 write_nic_byte(dev, SLOT_TIME, slot_time);
1813 void rtl8192_net_update(struct net_device *dev)
1816 struct r8192_priv *priv = ieee80211_priv(dev);
1817 struct ieee80211_network *net;
1818 u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1819 u16 rate_config = 0;
1820 net = & priv->ieee80211->current_network;
1822 rtl8192_config_rate(dev, &rate_config);
1823 priv->basic_rate = rate_config &= 0x15f;
1825 write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
1826 write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
1827 //for(i=0;i<ETH_ALEN;i++)
1828 // write_nic_byte(dev,BSSID+i,net->bssid[i]);
1830 rtl8192_update_msr(dev);
1831 // rtl8192_update_cap(dev, net->capability);
1832 if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1834 write_nic_word(dev, ATIMWND, 2);
1835 write_nic_word(dev, BCN_DMATIME, 1023);
1836 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1837 // write_nic_word(dev, BcnIntTime, 100);
1838 write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1839 write_nic_byte(dev, BCN_ERR_THRESH, 100);
1840 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1841 // TODO: BcnIFS may required to be changed on ASIC
1842 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1844 write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1851 //temporary hw beacon is not used any more.
1852 //open it when necessary
1854 void rtl819xusb_beacon_tx(struct net_device *dev,u16 tx_rate)
1858 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1860 if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1865 u16 N_DBPSOfRate(u16 DataRate);
1870 u8 bManagementFrame,
1878 if( rtl8192_IsWirelessBMode(DataRate) )
1880 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1882 FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1886 FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1888 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1890 } else { //802.11g DSSS-OFDM PLCP length field calculation.
1891 N_DBPS = N_DBPSOfRate(DataRate);
1892 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1893 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1894 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1899 u16 N_DBPSOfRate(u16 DataRate)
1944 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1946 usb_free_urb(tx_cmd_urb);
1949 unsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
1953 RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
1956 return priv->txqueue_to_outpipemap[tx_queue];
1959 short rtl8192SU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1961 struct r8192_priv *priv = ieee80211_priv(dev);
1964 unsigned int idx_pipe;
1965 tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1966 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1967 u8 queue_index = tcb_desc->queue_index;
1970 //printk("\n %s::::::::::::::::::::::queue_index = %d\n",__FUNCTION__, queue_index);
1971 atomic_inc(&priv->tx_pending[queue_index]);
1973 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
1979 memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1981 /* Tx descriptor ought to be set according to the skb->cb */
1982 pdesc->LINIP = tcb_desc->bLastIniPkt;
1983 PktSize = (u16)(skb->len - USB_HWDESC_HEADER_LEN);
1984 pdesc->PktSize = PktSize;
1985 //printk("PKTSize = %d %x\n",pdesc->PktSize,pdesc->PktSize);
1986 //----------------------------------------------------------------------------
1987 // Fill up USB_OUT_CONTEXT.
1988 //----------------------------------------------------------------------------
1989 // Get index to out pipe from specified QueueID.
1990 idx_pipe = txqueue2outpipe(priv,queue_index);
1991 //printk("=============>%s queue_index:%d, outpipe:%d\n", __func__,queue_index,priv->RtOutPipes[idx_pipe]);
1993 usb_fill_bulk_urb(tx_urb,
1995 usb_sndbulkpipe(priv->udev,priv->RtOutPipes[idx_pipe]),
2001 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2005 printk("Error TX CMD URB, error %d",
2012 * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
2013 * in TxFwInfo data structure
2014 * 2006.10.30 by Emily
2016 * \param QUEUEID Software Queue
2018 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
2020 u8 QueueSelect = 0x0; //defualt set to
2024 QueueSelect = QSLT_BE; //or QSelect = pTcb->priority;
2028 QueueSelect = QSLT_BK; //or QSelect = pTcb->priority;
2032 QueueSelect = QSLT_VO; //or QSelect = pTcb->priority;
2036 QueueSelect = QSLT_VI; //or QSelect = pTcb->priority;
2039 QueueSelect = QSLT_MGNT;
2043 QueueSelect = QSLT_BEACON;
2046 // TODO: 2006.10.30 mark other queue selection until we verify it is OK
2047 // TODO: Remove Assertions
2048 //#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
2050 QueueSelect = QSLT_CMD;
2054 QueueSelect = QSLT_HIGH;
2058 RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
2064 u8 MRateToHwRate8190Pci(u8 rate)
2066 u8 ret = DESC92S_RATE1M;
2070 // CCK and OFDM non-HT rates
2071 case MGN_1M: ret = DESC92S_RATE1M; break;
2072 case MGN_2M: ret = DESC92S_RATE2M; break;
2073 case MGN_5_5M: ret = DESC92S_RATE5_5M; break;
2074 case MGN_11M: ret = DESC92S_RATE11M; break;
2075 case MGN_6M: ret = DESC92S_RATE6M; break;
2076 case MGN_9M: ret = DESC92S_RATE9M; break;
2077 case MGN_12M: ret = DESC92S_RATE12M; break;
2078 case MGN_18M: ret = DESC92S_RATE18M; break;
2079 case MGN_24M: ret = DESC92S_RATE24M; break;
2080 case MGN_36M: ret = DESC92S_RATE36M; break;
2081 case MGN_48M: ret = DESC92S_RATE48M; break;
2082 case MGN_54M: ret = DESC92S_RATE54M; break;
2084 // HT rates since here
2085 case MGN_MCS0: ret = DESC92S_RATEMCS0; break;
2086 case MGN_MCS1: ret = DESC92S_RATEMCS1; break;
2087 case MGN_MCS2: ret = DESC92S_RATEMCS2; break;
2088 case MGN_MCS3: ret = DESC92S_RATEMCS3; break;
2089 case MGN_MCS4: ret = DESC92S_RATEMCS4; break;
2090 case MGN_MCS5: ret = DESC92S_RATEMCS5; break;
2091 case MGN_MCS6: ret = DESC92S_RATEMCS6; break;
2092 case MGN_MCS7: ret = DESC92S_RATEMCS7; break;
2093 case MGN_MCS8: ret = DESC92S_RATEMCS8; break;
2094 case MGN_MCS9: ret = DESC92S_RATEMCS9; break;
2095 case MGN_MCS10: ret = DESC92S_RATEMCS10; break;
2096 case MGN_MCS11: ret = DESC92S_RATEMCS11; break;
2097 case MGN_MCS12: ret = DESC92S_RATEMCS12; break;
2098 case MGN_MCS13: ret = DESC92S_RATEMCS13; break;
2099 case MGN_MCS14: ret = DESC92S_RATEMCS14; break;
2100 case MGN_MCS15: ret = DESC92S_RATEMCS15; break;
2102 // Set the highest SG rate
2120 ret = DESC92S_RATEMCS15_SG;
2129 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
2133 tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
2135 if(TxHT==1 && TxRate != DESC90_RATEMCS15)
2141 static void tx_zero_isr(struct urb *tx_urb)
2148 * The tx procedure is just as following, skb->cb will contain all the following
2149 *information: * priority, morefrag, rate, &dev.
2151 // <Note> Buffer format for 8192S Usb bulk out:
2153 // --------------------------------------------------
2154 // | 8192S Usb Tx Desc | 802_11_MAC_header | data |
2155 // --------------------------------------------------
2156 // | 32 bytes | 24 bytes |0-2318 bytes|
2157 // --------------------------------------------------
2158 // |<------------ BufferLen ------------------------->|
2160 short rtl8192SU_tx(struct net_device *dev, struct sk_buff* skb)
2162 struct r8192_priv *priv = ieee80211_priv(dev);
2163 cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
2164 tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
2165 struct usb_device *udev = priv->udev;
2168 struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
2169 unsigned int idx_pipe;
2170 u16 MPDUOverhead = 0;
2173 pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
2174 /* we are locked here so the two atomic_read and inc are executed
2175 * without interleaves * !!! For debug purpose */
2176 if( pend > MAX_TX_URB){
2177 switch (tcb_desc->queue_index) {
2179 priv->stats.txvodrop++;
2182 priv->stats.txvidrop++;
2185 priv->stats.txbedrop++;
2187 default://BK_PRIORITY
2188 priv->stats.txbkdrop++;
2191 printk("To discard skb packet!\n");
2192 dev_kfree_skb_any(skb);
2196 tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
2198 dev_kfree_skb_any(skb);
2202 memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2205 tx_desc->NonQos = (IsQoSDataFrame(skb->data)==TRUE)? 0:1;
2207 /* Fill Tx descriptor */
2208 //memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
2210 // This part can just fill to the first descriptor of the frame.
2212 tx_desc->TxHT = (tcb_desc->data_rate&0x80)?1:0;
2215 tx_desc->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
2216 //tx_desc->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
2217 tx_desc->TxShort = QueryIsShort(tx_desc->TxHT, tx_desc->TxRate, tcb_desc);
2220 // Aggregation related
2221 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
2222 tx_desc->AllowAggregation = 1;
2224 //tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
2225 //tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
2227 tx_desc->AllowAggregation = 0;
2229 //tx_fwinfo->RxMF = 0;
2230 //tx_fwinfo->RxAMD = 0;
2234 // <Roger_Notes> For AMPDU case, we must insert SSN into TX_DESC,
2235 // FW according as this SSN to do necessary packet retry.
2241 //pSeq = (u8 *)(VirtualAddress+USB_HWDESC_HEADER_LEN + FRAME_OFFSET_SEQUENCE);
2242 pSeq = (u8 *)(skb->data+USB_HWDESC_HEADER_LEN + 22);
2245 Temp |= (*(u16 *)pSeq)>>4;
2246 tx_desc->Seq = Temp;
2249 /* Protection mode related */
2250 tx_desc->RTSEn = (tcb_desc->bRTSEnable)?1:0;
2251 tx_desc->CTS2Self = (tcb_desc->bCTSEnable)?1:0;
2252 tx_desc->RTSSTBC = (tcb_desc->bRTSSTBC)?1:0;
2253 tx_desc->RTSHT = (tcb_desc->rts_rate&0x80)?1:0;
2254 tx_desc->RTSRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
2255 tx_desc->RTSSubcarrier = (tx_desc->RTSHT==0)?(tcb_desc->RTSSC):0;
2256 tx_desc->RTSBW = (tx_desc->RTSHT==1)?((tcb_desc->bRTSBW)?1:0):0;
2257 tx_desc->RTSShort = (tx_desc->RTSHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
2258 (tcb_desc->bRTSUseShortGI?1:0);
2260 tx_desc->DisRTSFB = 0;
2261 tx_desc->RTSRateFBLmt = 0xf;
2263 // <Roger_EXP> 2008.09.22. We disable RTS rate fallback temporarily.
2264 //tx_desc->DisRTSFB = 0x01;
2266 /* Set Bandwidth and sub-channel settings. */
2267 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2269 if(tcb_desc->bPacketBW) {
2270 tx_desc->TxBandwidth = 1;
2271 tx_desc->TxSubCarrier = 0; //By SD3's Jerry suggestion, use duplicated mode
2273 tx_desc->TxBandwidth = 0;
2274 tx_desc->TxSubCarrier = priv->nCur40MhzPrimeSC;
2277 tx_desc->TxBandwidth = 0;
2278 tx_desc->TxSubCarrier = 0;
2282 //memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2285 //tx_desc->CmdInit = 1; //92su del
2286 tx_desc->Offset = USB_HWDESC_HEADER_LEN;
2289 tx_desc->PktSize = (skb->len - USB_HWDESC_HEADER_LEN) & 0xffff;
2293 //tx_desc->SecCAMID= 0;//92su del
2294 tx_desc->RaBRSRID= tcb_desc->RATRIndex;
2295 //#ifdef RTL8192S_PREPARE_FOR_NORMAL_RELEASE
2299 //tx_desc->NoEnc = 1;//92su del
2302 tx_desc->SecType = 0x0;
2304 if (tcb_desc->bHwSec)
2306 switch (priv->ieee80211->pairwise_key_type)
2308 case KEY_TYPE_WEP40:
2309 case KEY_TYPE_WEP104:
2310 tx_desc->SecType = 0x1;
2311 //tx_desc->NoEnc = 0;//92su del
2314 tx_desc->SecType = 0x2;
2315 //tx_desc->NoEnc = 0;//92su del
2318 tx_desc->SecType = 0x3;
2319 //tx_desc->NoEnc = 0;//92su del
2322 tx_desc->SecType = 0x0;
2323 //tx_desc->NoEnc = 1;//92su del
2326 tx_desc->SecType = 0x0;
2327 //tx_desc->NoEnc = 1;//92su del
2332 //tx_desc->TxFWInfoSize = sizeof(tx_fwinfo_819x_usb);//92su del
2335 tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
2336 tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
2337 tx_desc->DataRateFBLmt = 0x1F;// Alwasy enable all rate fallback range
2339 tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
2342 /* Fill fields that are required to be initialized in all of the descriptors */
2344 tx_desc->FirstSeg = 1;
2345 tx_desc->LastSeg = 1;
2350 //tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
2351 tx_desc->TxBufferSize = (u32)(skb->len);//92su mod FIXLZM
2354 /* Get index to out pipe from specified QueueID */
2355 idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
2356 //printk("=============>%s queue_index:%d, outpipe:%d\n", __func__,tcb_desc->queue_index,priv->RtOutPipes[idx_pipe]);
2358 //RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
2359 //RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
2361 /* To submit bulk urb */
2362 usb_fill_bulk_urb(tx_urb,
2364 usb_sndbulkpipe(udev,priv->RtOutPipes[idx_pipe]),
2366 skb->len, rtl8192_tx_isr, skb);
2368 if (type == IEEE80211_FTYPE_DATA) {
2369 if (priv->ieee80211->LedControlHandler != NULL)
2370 priv->ieee80211->LedControlHandler(dev, LED_CTL_TX);
2373 status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2376 * we need to send 0 byte packet whenever 512N bytes/64N(HIGN SPEED/NORMAL SPEED) bytes packet has been transmitted.
2377 * Otherwise, it will be halt to wait for another packet. WB. 2008.08.27
2379 bool bSend0Byte = false;
2381 if(udev->speed == USB_SPEED_HIGH) {
2382 if (skb->len > 0 && skb->len % 512 == 0)
2386 if (skb->len > 0 && skb->len % 64 == 0)
2390 tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
2392 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
2395 usb_fill_bulk_urb(tx_urb_zero,udev,
2396 usb_sndbulkpipe(udev,idx_pipe), &zero,
2397 0, tx_zero_isr, dev);
2398 status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
2407 RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d",
2408 atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
2412 dev->trans_start = jiffies;
2413 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
2416 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
2422 void rtl8192SU_net_update(struct net_device *dev)
2425 struct r8192_priv *priv = ieee80211_priv(dev);
2426 struct ieee80211_device* ieee = priv->ieee80211;
2427 struct ieee80211_network *net = &priv->ieee80211->current_network;
2428 //u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
2429 u16 rate_config = 0;
2432 u8 retrylimit = 0x30;
2433 u16 cap = net->capability;
2435 priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
2438 //update Basic rate: RR, BRSR
2439 rtl8192_config_rate(dev, &rate_config); //HalSetBrateCfg
2441 priv->basic_rate = rate_config = rate_config & 0x15f;
2443 // Set RRSR rate table.
2444 write_nic_byte(dev, RRSR, rate_config&0xff);
2445 write_nic_byte(dev, RRSR+1, (rate_config>>8)&0xff);
2447 // Set RTS initial rate
2448 while(rate_config > 0x1)
2450 rate_config = (rate_config>> 1);
2453 write_nic_byte(dev, INIRTSMCS_SEL, rateIndex);
2457 regTmp = (priv->nCur40MhzPrimeSC) << 5;
2458 if (priv->short_preamble)
2460 write_nic_byte(dev, RRSR+2, regTmp);
2462 write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
2463 write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
2465 write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
2466 //2008.10.24 added by tynli for beacon changed.
2467 PHY_SetBeaconHwReg( dev, net->beacon_interval);
2469 rtl8192_update_cap(dev, cap);
2471 if (ieee->iw_mode == IW_MODE_ADHOC){
2473 //we should enable ibss interrupt here, but disable it temporarily
2475 priv->irq_mask |= (IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2476 //rtl8192_irq_disable(dev);
2477 //rtl8192_irq_enable(dev);
2482 priv->irq_mask &= ~(IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2483 //rtl8192_irq_disable(dev);
2484 //rtl8192_irq_enable(dev);
2488 priv->ShortRetryLimit = priv->LongRetryLimit = retrylimit;
2490 write_nic_word(dev, RETRY_LIMIT,
2491 retrylimit << RETRY_LIMIT_SHORT_SHIFT | \
2492 retrylimit << RETRY_LIMIT_LONG_SHIFT);
2495 void rtl8192SU_update_ratr_table(struct net_device* dev)
2497 struct r8192_priv* priv = ieee80211_priv(dev);
2498 struct ieee80211_device* ieee = priv->ieee80211;
2499 u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2500 //struct ieee80211_network *net = &ieee->current_network;
2504 int WirelessMode = ieee->mode;
2505 u8 MimoPs = ieee->pHTInfo->PeerMimoPs;
2509 rtl8192_config_rate(dev, (u16*)(&ratr_value));
2510 ratr_value |= (*(u16*)(pMcsRate)) << 12;
2512 //switch (ieee->mode)
2513 switch (WirelessMode)
2516 ratr_value &= 0x00000FF0;
2519 ratr_value &= 0x0000000D;
2522 ratr_value &= 0x00000FF5;
2529 if (MimoPs == 0) //MIMO_PS_STATIC
2531 ratr_value &= 0x0007F005;
2534 { // MCS rate only => for 11N mode.
2537 // 1T2R or 1T1R, Spatial Stream 2 should be disabled
2538 if ( priv->rf_type == RF_1T2R ||
2539 priv->rf_type == RF_1T1R ||
2540 (ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_TX_2SS) )
2541 ratr_mask = 0x000ff005;
2543 ratr_mask = 0x0f0ff005;
2545 if((ieee->pHTInfo->bCurTxBW40MHz) &&
2546 !(ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_TX_40_MHZ))
2547 ratr_mask |= 0x00000010; // Set 6MBps
2549 // Select rates for rate adaptive mechanism.
2550 ratr_value &= ratr_mask;
2557 if(priv->rf_type == RF_1T2R) // 1T2R, Spatial Stream 2 should be disabled
2559 ratr_value &= 0x000ff0f5;
2563 ratr_value &= 0x0f0ff0f5;
2566 //printk("====>%s(), mode is not correct:%x\n", __FUNCTION__, ieee->mode);
2570 ratr_value &= 0x0FFFFFFF;
2572 // Get MAX MCS available.
2573 if ( (bNMode && ((ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_SHORT_GI)==0)) &&
2574 ((ieee->pHTInfo->bCurBW40MHz && ieee->pHTInfo->bCurShortGI40MHz) ||
2575 (!ieee->pHTInfo->bCurBW40MHz && ieee->pHTInfo->bCurShortGI20MHz)))
2577 u8 shortGI_rate = 0;
2578 u32 tmp_ratr_value = 0;
2579 ratr_value |= 0x10000000;//???
2580 tmp_ratr_value = (ratr_value>>12);
2581 for(shortGI_rate=15; shortGI_rate>0; shortGI_rate--)
2583 if((1<<shortGI_rate) & tmp_ratr_value)
2586 shortGI_rate = (shortGI_rate<<12)|(shortGI_rate<<8)|(shortGI_rate<<4)|(shortGI_rate);
2587 write_nic_byte(dev, SG_RATE, shortGI_rate);
2588 //printk("==>SG_RATE:%x\n", read_nic_byte(dev, SG_RATE));
2590 write_nic_dword(dev, ARFR0+rate_index*4, ratr_value);
2591 printk("=============>ARFR0+rate_index*4:%#x\n", ratr_value);
2594 if (ratr_value & 0xfffff000){
2595 //printk("===>set to N mode\n");
2596 HalSetFwCmd8192S(dev, FW_CMD_RA_REFRESH_N);
2599 //printk("===>set to B/G mode\n");
2600 HalSetFwCmd8192S(dev, FW_CMD_RA_REFRESH_BG);
2604 void rtl8192SU_link_change(struct net_device *dev)
2606 struct r8192_priv *priv = ieee80211_priv(dev);
2607 struct ieee80211_device *ieee = priv->ieee80211;
2610 reg = read_nic_dword(dev, RCR);
2611 if (ieee->state == IEEE80211_LINKED) {
2612 rtl8192SU_net_update(dev);
2613 rtl8192SU_update_ratr_table(dev);
2614 ieee->SetFwCmdHandler(dev, FW_CMD_HIGH_PWR_ENABLE);
2615 priv->ReceiveConfig = reg |= RCR_CBSSID;
2618 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2619 write_nic_dword(dev, RCR, reg);
2620 rtl8192_update_msr(dev);
2623 static struct ieee80211_qos_parameters def_qos_parameters = {
2624 {3,3,3,3},/* cw_min */
2625 {7,7,7,7},/* cw_max */
2626 {2,2,2,2},/* aifs */
2627 {0,0,0,0},/* flags */
2628 {0,0,0,0} /* tx_op_limit */
2632 void rtl8192_update_beacon(struct work_struct * work)
2634 struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2635 struct net_device *dev = priv->ieee80211->dev;
2636 struct ieee80211_device* ieee = priv->ieee80211;
2637 struct ieee80211_network* net = &ieee->current_network;
2639 if (ieee->pHTInfo->bCurrentHTSupport)
2640 HTUpdateSelfAndPeerSetting(ieee, net);
2641 ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2642 // Joseph test for turbo mode with AP
2643 ieee->pHTInfo->RT2RT_HT_Mode = net->bssht.RT2RT_HT_Mode;
2644 rtl8192_update_cap(dev, net->capability);
2647 * background support to run QoS activate functionality
2649 int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
2651 void rtl8192_qos_activate(struct work_struct * work)
2653 struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2654 struct net_device *dev = priv->ieee80211->dev;
2655 struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2656 u8 mode = priv->ieee80211->current_network.mode;
2657 //u32 size = sizeof(struct ieee80211_qos_parameters);
2665 mutex_lock(&priv->mutex);
2667 if(priv->ieee80211->state != IEEE80211_LINKED)
2669 RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
2670 /* It better set slot time at first */
2671 /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2672 /* update the ac parameter to related registers */
2673 for(i = 0; i < QOS_QUEUE_NUM; i++) {
2674 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2675 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2676 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2677 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2678 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2679 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2681 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2682 //write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4322);
2686 mutex_unlock(&priv->mutex);
2689 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2691 struct ieee80211_network *network)
2694 u32 size = sizeof(struct ieee80211_qos_parameters);
2696 if(priv->ieee80211->state !=IEEE80211_LINKED)
2699 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2702 if (network->flags & NETWORK_HAS_QOS_MASK) {
2703 if (active_network &&
2704 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2705 network->qos_data.active = network->qos_data.supported;
2707 if ((network->qos_data.active == 1) && (active_network == 1) &&
2708 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2709 (network->qos_data.old_param_count !=
2710 network->qos_data.param_count)) {
2711 network->qos_data.old_param_count =
2712 network->qos_data.param_count;
2713 queue_work(priv->priv_wq, &priv->qos_activate);
2714 RT_TRACE (COMP_QOS, "QoS parameters change call "
2718 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2719 &def_qos_parameters, size);
2721 if ((network->qos_data.active == 1) && (active_network == 1)) {
2722 queue_work(priv->priv_wq, &priv->qos_activate);
2723 RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2725 network->qos_data.active = 0;
2726 network->qos_data.supported = 0;
2732 /* handle manage frame frame beacon and probe response */
2733 static int rtl8192_handle_beacon(struct net_device * dev,
2734 struct ieee80211_probe_response *beacon,
2735 struct ieee80211_network *network)
2737 struct r8192_priv *priv = ieee80211_priv(dev);
2739 rtl8192_qos_handle_probe_response(priv,1,network);
2740 queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2747 * handling the beaconing responses. if we get different QoS setting
2748 * off the network from the associated setting, adjust the QoS
2751 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2752 struct ieee80211_network *network)
2755 unsigned long flags;
2756 u32 size = sizeof(struct ieee80211_qos_parameters);
2757 int set_qos_param = 0;
2759 if ((priv == NULL) || (network == NULL))
2762 if(priv->ieee80211->state !=IEEE80211_LINKED)
2765 if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2768 spin_lock_irqsave(&priv->ieee80211->lock, flags);
2769 if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2770 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2771 &network->qos_data.parameters,\
2772 sizeof(struct ieee80211_qos_parameters));
2773 priv->ieee80211->current_network.qos_data.active = 1;
2776 /* update qos parameter for current network */
2777 priv->ieee80211->current_network.qos_data.old_param_count = \
2778 priv->ieee80211->current_network.qos_data.param_count;
2779 priv->ieee80211->current_network.qos_data.param_count = \
2780 network->qos_data.param_count;
2783 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2784 &def_qos_parameters, size);
2785 priv->ieee80211->current_network.qos_data.active = 0;
2786 priv->ieee80211->current_network.qos_data.supported = 0;
2790 spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2792 RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
2793 if (set_qos_param == 1)
2794 queue_work(priv->priv_wq, &priv->qos_activate);
2800 static int rtl8192_handle_assoc_response(struct net_device *dev,
2801 struct ieee80211_assoc_response_frame *resp,
2802 struct ieee80211_network *network)
2804 struct r8192_priv *priv = ieee80211_priv(dev);
2805 rtl8192_qos_association_resp(priv, network);
2810 void rtl8192_update_ratr_table(struct net_device* dev)
2811 // POCTET_STRING posLegacyRate,
2813 // PRT_WLAN_STA pEntry)
2815 struct r8192_priv* priv = ieee80211_priv(dev);
2816 struct ieee80211_device* ieee = priv->ieee80211;
2817 u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2818 //struct ieee80211_network *net = &ieee->current_network;
2821 rtl8192_config_rate(dev, (u16*)(&ratr_value));
2822 ratr_value |= (*(u16*)(pMcsRate)) << 12;
2823 // switch (net->mode)
2827 ratr_value &= 0x00000FF0;
2830 ratr_value &= 0x0000000F;
2833 ratr_value &= 0x00000FF7;
2837 if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
2838 ratr_value &= 0x0007F007;
2840 if (priv->rf_type == RF_1T2R)
2841 ratr_value &= 0x000FF007;
2843 ratr_value &= 0x0F81F007;
2849 ratr_value &= 0x0FFFFFFF;
2850 if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
2851 ratr_value |= 0x80000000;
2852 }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
2853 ratr_value |= 0x80000000;
2855 write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2856 write_nic_byte(dev, UFWP, 1);
2859 static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
2860 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2861 bool GetNmodeSupportBySecCfg8192(struct net_device*dev)
2864 struct r8192_priv* priv = ieee80211_priv(dev);
2865 struct ieee80211_device* ieee = priv->ieee80211;
2866 struct ieee80211_network * network = &ieee->current_network;
2867 int wpa_ie_len= ieee->wpa_ie_len;
2868 struct ieee80211_crypt_data* crypt;
2872 crypt = ieee->crypt[ieee->tx_keyidx];
2873 //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
2874 encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
2877 if(encrypt && (wpa_ie_len == 0)) {
2878 /* wep encryption, no N mode setting */
2880 // } else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
2881 } else if((wpa_ie_len != 0)) {
2882 /* parse pairwise key type */
2883 //if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
2884 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))))
2896 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
2899 struct r8192_priv* priv = ieee80211_priv(dev);
2900 struct ieee80211_device* ieee = priv->ieee80211;
2902 // Added by Roger, 2008.08.29.
2905 if(ieee->bHalfWirelessN24GMode == true)
2913 void rtl8192_refresh_supportrate(struct r8192_priv* priv)
2915 struct ieee80211_device* ieee = priv->ieee80211;
2916 //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
2917 if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2919 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2920 //RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
2921 //RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
2924 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2928 u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
2930 struct r8192_priv *priv = ieee80211_priv(dev);
2932 switch(priv->rf_chip)
2938 ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2941 ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2944 ret = WIRELESS_MODE_B;
2949 void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
2951 struct r8192_priv *priv = ieee80211_priv(dev);
2952 u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2955 if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
2957 if(bSupportMode & WIRELESS_MODE_N_24G)
2959 wireless_mode = WIRELESS_MODE_N_24G;
2961 else if(bSupportMode & WIRELESS_MODE_N_5G)
2963 wireless_mode = WIRELESS_MODE_N_5G;
2965 else if((bSupportMode & WIRELESS_MODE_A))
2967 wireless_mode = WIRELESS_MODE_A;
2969 else if((bSupportMode & WIRELESS_MODE_G))
2971 wireless_mode = WIRELESS_MODE_G;
2973 else if((bSupportMode & WIRELESS_MODE_B))
2975 wireless_mode = WIRELESS_MODE_B;
2978 RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
2979 wireless_mode = WIRELESS_MODE_B;
2982 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
2983 ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
2985 //LZM 090306 usb crash here, mark it temp
2986 //write_nic_word(dev, SIFS_OFDM, 0x0e0e);
2987 priv->ieee80211->mode = wireless_mode;
2989 if ((wireless_mode == WIRELESS_MODE_N_24G) || (wireless_mode == WIRELESS_MODE_N_5G))
2990 priv->ieee80211->pHTInfo->bEnableHT = 1;
2992 priv->ieee80211->pHTInfo->bEnableHT = 0;
2993 RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
2994 rtl8192_refresh_supportrate(priv);
3000 short rtl8192_is_tx_queue_empty(struct net_device *dev)
3003 struct r8192_priv *priv = ieee80211_priv(dev);
3004 //struct ieee80211_device* ieee = priv->ieee80211;
3005 for (i=0; i<=MGNT_QUEUE; i++)
3007 if ((i== TXCMD_QUEUE) || (i == HCCA_QUEUE) )
3009 if (atomic_read(&priv->tx_pending[i]))
3011 printk("===>tx queue is not empty:%d, %d\n", i, atomic_read(&priv->tx_pending[i]));
3018 void rtl8192_hw_sleep_down(struct net_device *dev)
3020 RT_TRACE(COMP_POWER, "%s()============>come to sleep down\n", __FUNCTION__);
3022 // MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
3026 void rtl8192_hw_sleep_wq (struct work_struct *work)
3028 // struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
3029 // struct ieee80211_device * ieee = (struct ieee80211_device*)
3030 // container_of(work, struct ieee80211_device, watch_dog_wq);
3031 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
3032 struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_sleep_wq);
3033 struct net_device *dev = ieee->dev;
3035 //printk("=========>%s()\n", __FUNCTION__);
3036 rtl8192_hw_sleep_down(dev);
3038 // printk("dev is %d\n",dev);
3039 // printk("&*&(^*(&(&=========>%s()\n", __FUNCTION__);
3040 void rtl8192_hw_wakeup(struct net_device* dev)
3044 // spin_lock_irqsave(&priv->ps_lock,flags);
3045 RT_TRACE(COMP_POWER, "%s()============>come to wake up\n", __FUNCTION__);
3047 // MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
3049 //FIXME: will we send package stored while nic is sleep?
3050 // spin_unlock_irqrestore(&priv->ps_lock,flags);
3053 void rtl8192_hw_wakeup_wq (struct work_struct *work)
3055 // struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
3056 // struct ieee80211_device * ieee = (struct ieee80211_device*)
3057 // container_of(work, struct ieee80211_device, watch_dog_wq);
3058 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
3059 struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_wakeup_wq);
3060 struct net_device *dev = ieee->dev;
3062 rtl8192_hw_wakeup(dev);
3065 #define MIN_SLEEP_TIME 50
3066 #define MAX_SLEEP_TIME 10000
3067 void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
3070 struct r8192_priv *priv = ieee80211_priv(dev);
3073 unsigned long flags;
3075 spin_lock_irqsave(&priv->ps_lock,flags);
3077 /* Writing HW register with 0 equals to disable
3078 * the timer, that is not really what we want
3080 tl -= MSECS(4+16+7);
3082 //if(tl == 0) tl = 1;
3084 /* FIXME HACK FIXME HACK */
3085 // force_pci_posting(dev);
3088 // rb = read_nic_dword(dev, TSFTR);
3090 /* If the interval in witch we are requested to sleep is too
3091 * short then give up and remain awake
3093 if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
3094 ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
3095 spin_unlock_irqrestore(&priv->ps_lock,flags);
3096 printk("too short to sleep\n");
3100 // write_nic_dword(dev, TimerInt, tl);
3101 // rb = read_nic_dword(dev, TSFTR);
3103 u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
3106 queue_delayed_work(priv->ieee80211->wq, &priv->ieee80211->hw_wakeup_wq, tmp); //as tl may be less than rb
3108 /* if we suspect the TimerInt is gone beyond tl
3109 * while setting it, then give up
3112 if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
3113 ((tl < rb) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))) {
3114 printk("========>too long to sleep:%x, %x, %lx\n", tl, rb, MSECS(MAX_SLEEP_TIME));
3115 spin_unlock_irqrestore(&priv->ps_lock,flags);
3119 // if(priv->rf_sleep)
3120 // priv->rf_sleep(dev);
3122 //printk("<=========%s()\n", __FUNCTION__);
3123 queue_delayed_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_sleep_wq,0);
3125 spin_unlock_irqrestore(&priv->ps_lock,flags);
3127 //init priv variables here. only non_zero value should be initialized here.
3128 static void rtl8192_init_priv_variable(struct net_device* dev)
3130 struct r8192_priv *priv = ieee80211_priv(dev);
3132 priv->card_8192 = NIC_8192U;
3133 priv->chan = 1; //set to channel 1
3134 priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
3135 priv->ieee80211->iw_mode = IW_MODE_INFRA;
3136 priv->ieee80211->ieee_up=0;
3137 priv->retry_rts = DEFAULT_RETRY_RTS;
3138 priv->retry_data = DEFAULT_RETRY_DATA;
3139 priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
3140 priv->ieee80211->rate = 110; //11 mbps
3141 priv->ieee80211->short_slot = 1;
3142 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
3145 priv->IrpPendingCount = 1;
3146 priv->ResetProgress = RESET_TYPE_NORESET;
3147 priv->bForcedSilentReset = 0;
3148 priv->bDisableNormalResetCheck = false;
3149 priv->force_reset = false;
3151 priv->ieee80211->FwRWRF = 0; //we don't use FW read/write RF until stable firmware is available.
3152 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3153 priv->ieee80211->iw_mode = IW_MODE_INFRA;
3154 priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
3155 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
3156 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
3157 IEEE_SOFTMAC_BEACONS;//added by amy 080604 //| //IEEE_SOFTMAC_SINGLE_QUEUE;
3159 priv->ieee80211->active_scan = 1;
3160 priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
3161 priv->ieee80211->host_encrypt = 1;
3162 priv->ieee80211->host_decrypt = 1;
3163 priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
3164 priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
3165 priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
3166 priv->ieee80211->set_chan = rtl8192_set_chan;
3167 priv->ieee80211->link_change = priv->ops->rtl819x_link_change;
3168 priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
3169 priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
3170 priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
3171 priv->ieee80211->init_wmmparam_flag = 0;
3172 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
3173 priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
3174 priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
3175 priv->ieee80211->qos_support = 1;
3178 // priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
3179 priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
3180 priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
3181 priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
3183 priv->ieee80211->sta_wake_up = rtl8192_hw_wakeup;
3184 // priv->ieee80211->ps_request_tx_ack = rtl8192_rq_tx_ack;
3185 priv->ieee80211->enter_sleep_state = rtl8192_hw_to_sleep;
3186 priv->ieee80211->ps_is_queue_empty = rtl8192_is_tx_queue_empty;
3188 priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
3189 priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
3190 priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
3192 priv->ieee80211->InitialGainHandler = priv->ops->rtl819x_initial_gain;
3193 priv->card_type = USB;
3196 priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3197 priv->ieee80211->SetFwCmdHandler = HalSetFwCmd8192S;
3198 priv->bRFSiOrPi = 0;//o=si,1=pi;
3200 priv->bInHctTest = false;
3202 priv->MidHighPwrTHR_L1 = 0x3B;
3203 priv->MidHighPwrTHR_L2 = 0x40;
3205 if(priv->bInHctTest)
3207 priv->ShortRetryLimit = HAL_RETRY_LIMIT_AP_ADHOC;
3208 priv->LongRetryLimit = HAL_RETRY_LIMIT_AP_ADHOC;
3212 priv->ShortRetryLimit = HAL_RETRY_LIMIT_INFRA;
3213 priv->LongRetryLimit = HAL_RETRY_LIMIT_INFRA;
3216 priv->SetFwCmdInProgress = false; //is set FW CMD in Progress? 92S only
3217 priv->CurrentFwCmdIO = 0;
3219 priv->MinSpaceCfg = 0;
3221 priv->EarlyRxThreshold = 7;
3222 priv->enable_gpio0 = 0;
3223 priv->TransmitConfig =
3224 ((u32)TCR_MXDMA_2048<<TCR_MXDMA_OFFSET) | // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
3225 (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | // Short retry limit
3226 (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit
3227 (false ? TCR_SAT : 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
3228 if(priv->bInHctTest)
3229 priv->ReceiveConfig = //priv->CSMethod |
3230 RCR_AMF | RCR_ADF | //RCR_AAP | //accept management/data
3231 RCR_ACF |RCR_APPFCS| //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
3232 RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
3233 RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
3234 RCR_APP_PHYST_STAFF | RCR_APP_PHYST_RXFF | // Accept PHY status
3235 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
3236 (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
3237 (priv->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
3239 priv->ReceiveConfig = //priv->CSMethod |
3240 RCR_AMF | RCR_ADF | RCR_AB |
3241 RCR_AM | RCR_APM |RCR_AAP |RCR_ADD3|RCR_APP_ICV|
3242 RCR_APP_PHYST_STAFF | RCR_APP_PHYST_RXFF | // Accept PHY status
3243 RCR_APP_MIC | RCR_APPFCS;
3245 // <Roger_EXP> 2008.06.16.
3246 priv->IntrMask = (u16)(IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK | \
3247 IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK | \
3248 IMR_BDOK | IMR_RXCMDOK | /*IMR_TIMEOUT0 |*/ IMR_RDU | IMR_RXFOVW | \
3249 IMR_TXFOVW | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
3254 priv->AcmControl = 0;
3255 priv->pFirmware = (rt_firmware*)vmalloc(sizeof(rt_firmware));
3256 if (priv->pFirmware)
3257 memset(priv->pFirmware, 0, sizeof(rt_firmware));
3259 /* rx related queue */
3260 skb_queue_head_init(&priv->rx_queue);
3261 skb_queue_head_init(&priv->skb_queue);
3263 /* Tx related queue */
3264 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3265 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
3267 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3268 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
3270 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3271 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
3273 priv->rf_set_chan = rtl8192_phy_SwChnl;
3277 static void rtl8192_init_priv_lock(struct r8192_priv* priv)
3279 spin_lock_init(&priv->tx_lock);
3280 spin_lock_init(&priv->irq_lock);//added by thomas
3281 //spin_lock_init(&priv->rf_lock);//use rf_sem, or will crash in some OS.
3282 sema_init(&priv->wx_sem,1);
3283 sema_init(&priv->rf_sem,1);
3284 spin_lock_init(&priv->ps_lock);
3285 mutex_init(&priv->mutex);
3288 extern void rtl819x_watchdog_wqcallback(struct work_struct *work);
3290 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
3291 //init tasklet and wait_queue here. only 2.6 above kernel is considered
3292 #define DRV_NAME "wlan0"
3293 static void rtl8192_init_priv_task(struct net_device* dev)
3295 struct r8192_priv *priv = ieee80211_priv(dev);
3297 #ifdef PF_SYNCTHREAD
3298 priv->priv_wq = create_workqueue(DRV_NAME,0);
3300 priv->priv_wq = create_workqueue(DRV_NAME);
3303 INIT_WORK(&priv->reset_wq, rtl8192_restart);
3305 //INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
3306 INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
3307 INIT_DELAYED_WORK(&priv->txpower_tracking_wq, dm_txpower_trackingcallback);
3308 // INIT_DELAYED_WORK(&priv->gpio_change_rf_wq, dm_gpio_change_rf_callback);
3309 INIT_DELAYED_WORK(&priv->rfpath_check_wq, dm_rf_pathcheck_workitemcallback);
3310 INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
3311 INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
3312 //INIT_WORK(&priv->SwChnlWorkItem, rtl8192_SwChnl_WorkItem);
3313 //INIT_WORK(&priv->SetBWModeWorkItem, rtl8192_SetBWModeWorkItem);
3314 INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
3315 INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8192_hw_wakeup_wq);
3316 INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8192_hw_sleep_wq);
3318 tasklet_init(&priv->irq_rx_tasklet,
3319 (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
3320 (unsigned long)priv);
3323 //used to swap endian. as ntohl & htonl are not neccessary to swap endian, so use this instead.
3324 static inline u16 endian_swap(u16* data)
3327 *data = (tmp >> 8) | (tmp << 8);
3331 u8 rtl8192SU_UsbOptionToEndPointNumber(u8 UsbOption)
3346 RT_TRACE(COMP_INIT, "UsbOptionToEndPointNumber(): Invalid UsbOption(%#x)\n", UsbOption);
3352 u8 rtl8192SU_BoardTypeToRFtype(struct net_device* dev, u8 Boardtype)
3354 u8 RFtype = RF_1T2R;
3368 RFtype = RF_2T2R_GREEN;
3377 void update_hal_variables(struct r8192_priv *priv)
3383 for (rf_path = 0; rf_path < 2; rf_path++) {
3384 for (i = 0; i < 3; i++) {
3385 RT_TRACE((COMP_INIT), "CCK RF-%d CHan_Area-%d = 0x%x\n", rf_path, i, priv->RfCckChnlAreaTxPwr[rf_path][i]);
3386 RT_TRACE((COMP_INIT), "OFDM-1T RF-%d CHan_Area-%d = 0x%x\n", rf_path, i, priv->RfOfdmChnlAreaTxPwr1T[rf_path][i]);
3387 RT_TRACE((COMP_INIT), "OFDM-2T RF-%d CHan_Area-%d = 0x%x\n", rf_path, i, priv->RfOfdmChnlAreaTxPwr2T[rf_path][i]);
3389 /* Assign dedicated channel tx power */
3390 for(i = 0; i < 14; i++) {
3391 /* channel 1-3 use the same Tx Power Level. */
3392 if (i < 3) /* Channel 1-3 */
3394 else if (i < 9) /* Channel 4-9 */
3396 else /* Channel 10-14 */
3398 /* Record A & B CCK /OFDM - 1T/2T Channel area tx power */
3399 priv->RfTxPwrLevelCck[rf_path][i] = priv->RfCckChnlAreaTxPwr[rf_path][index];
3400 priv->RfTxPwrLevelOfdm1T[rf_path][i] = priv->RfOfdmChnlAreaTxPwr1T[rf_path][index];
3401 priv->RfTxPwrLevelOfdm2T[rf_path][i] = priv->RfOfdmChnlAreaTxPwr2T[rf_path][index];
3403 priv->TxPowerLevelOFDM24G[i] = priv->RfTxPwrLevelOfdm1T[rf_path][i] ;
3404 priv->TxPowerLevelCCK[i] = priv->RfTxPwrLevelCck[rf_path][i];
3407 for(i = 0; i < 14; i++) {
3408 RT_TRACE((COMP_INIT),
3409 "Rf-%d TxPwr CH-%d CCK OFDM_1T OFDM_2T= 0x%x/0x%x/0x%x\n",
3410 rf_path, i, priv->RfTxPwrLevelCck[rf_path][i],
3411 priv->RfTxPwrLevelOfdm1T[rf_path][i] ,
3412 priv->RfTxPwrLevelOfdm2T[rf_path][i] );
3419 * Config HW adapter information into initial value.
3422 * 1. After Auto load fail(i.e, check CR9346 fail)
3425 void rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(struct net_device *dev)
3427 struct r8192_priv *priv = ieee80211_priv(dev);
3428 u8 rf_path; /* For EEPROM/EFUSE After V0.6_1117 */
3431 RT_TRACE(COMP_INIT, "====> ConfigAdapterInfo8192SForAutoLoadFail\n");
3433 /* Isolation signals from Loader */
3434 write_nic_byte(dev, SYS_ISO_CTRL+1, 0xE8);
3436 write_nic_byte(dev, PMC_FSM, 0x02); /* Enable Loader Data Keep */
3438 /* Initialize IC Version && Channel Plan */
3439 priv->eeprom_vid = 0;
3440 priv->eeprom_pid = 0;
3441 priv->card_8192_version = 0;
3442 priv->eeprom_ChannelPlan = 0;
3443 priv->eeprom_CustomerID = 0;
3444 priv->eeprom_SubCustomerID = 0;
3445 priv->bIgnoreDiffRateTxPowerOffset = false;
3447 RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
3448 RT_TRACE(COMP_INIT, "EEPROM PID = 0x%4x\n", priv->eeprom_pid);
3449 RT_TRACE(COMP_INIT, "EEPROM Customer ID: 0x%2x\n",
3450 priv->eeprom_CustomerID);
3451 RT_TRACE(COMP_INIT, "EEPROM SubCustomer ID: 0x%2x\n",
3452 priv->eeprom_SubCustomerID);
3453 RT_TRACE(COMP_INIT, "EEPROM ChannelPlan = 0x%4x\n",
3454 priv->eeprom_ChannelPlan);
3455 RT_TRACE(COMP_INIT, "IgnoreDiffRateTxPowerOffset = %d\n",
3456 priv->bIgnoreDiffRateTxPowerOffset);
3458 priv->EEPROMUsbOption = EEPROM_USB_Default_OPTIONAL_FUNC;
3459 RT_TRACE(COMP_INIT, "USB Option = %#x\n", priv->EEPROMUsbOption);
3462 priv->EEPROMUsbPhyParam[i] = EEPROM_USB_Default_PHY_PARAM;
3466 * In this case, we randomly assign a MAC address here.
3468 static u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
3469 for(i = 0; i < 6; i++)
3470 dev->dev_addr[i] = sMacAddr[i];
3472 /* NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); */
3473 write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
3474 write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
3477 "ReadAdapterInfo8192SEFuse(), Permanent Address = %pM\n",
3480 priv->EEPROMBoardType = EEPROM_Default_BoardType;
3481 priv->rf_type = RF_1T2R; /* RF_2T2R */
3482 priv->EEPROMTxPowerDiff = EEPROM_Default_PwDiff;
3483 priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
3484 priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
3485 priv->EEPROMTxPwrBase = EEPROM_Default_TxPowerBase;
3486 priv->EEPROMTSSI_A = EEPROM_Default_TSSI;
3487 priv->EEPROMTSSI_B = EEPROM_Default_TSSI;
3488 priv->EEPROMTxPwrTkMode = EEPROM_Default_TxPwrTkMode;
3490 for (rf_path = 0; rf_path < 2; rf_path++)
3492 for (i = 0; i < 3; i++)
3494 /* Read CCK RF A & B Tx power */
3495 priv->RfCckChnlAreaTxPwr[rf_path][i] =
3496 priv->RfOfdmChnlAreaTxPwr1T[rf_path][i] =
3497 priv->RfOfdmChnlAreaTxPwr2T[rf_path][i] =
3498 (u8)(EEPROM_Default_TxPower & 0xff);
3502 update_hal_variables(priv);
3505 * Update remaining HAL variables.
3507 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
3508 priv->LegacyHTTxPowerDiff = priv->EEPROMTxPowerDiff; /* new */
3509 priv->TxPowerDiff = priv->EEPROMTxPowerDiff;
3510 /* Antenna B gain offset to antenna A, bit0~3 */
3511 /* priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf); */
3512 /* Antenna C gain offset to antenna A, bit4~7 */
3513 /* priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4); */
3514 /* CrystalCap, bit12~15 */
3515 priv->CrystalCap = priv->EEPROMCrystalCap;
3516 /* ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2 */
3517 priv->ThermalMeter[0] = priv->EEPROMThermalMeter;
3518 priv->LedStrategy = SW_LED_MODE0;
3520 init_rate_adaptive(dev);
3522 RT_TRACE(COMP_INIT, "<==== ConfigAdapterInfo8192SForAutoLoadFail\n");
3527 * Read HW adapter information by E-Fuse
3528 * or EEPROM according CR9346 reported.
3531 * 1. CR9346 regiser has verified.
3532 * 2. PASSIVE_LEVEL (USB interface)
3534 void rtl8192SU_ReadAdapterInfo8192SUsb(struct net_device *dev)
3536 struct r8192_priv *priv = ieee80211_priv(dev);
3540 u8 hwinfo[HWSET_MAX_SIZE_92S];
3541 u8 rf_path, index; /* For EEPROM/EFUSE After V0.6_1117 */
3542 struct eeprom_93cx6 eeprom;
3546 eeprom.register_read = rtl819x_eeprom_register_read;
3547 eeprom.register_write = rtl819x_eeprom_register_write;
3548 eeprom.width = PCI_EEPROM_WIDTH_93C46;
3551 * The following operation are prevent Efuse leakage by turn on 2.5V.
3553 tmpU1b = read_nic_byte(dev, EFUSE_TEST+3);
3554 write_nic_byte(dev, EFUSE_TEST+3, tmpU1b|0x80);
3556 write_nic_byte(dev, EFUSE_TEST+3, (tmpU1b&(~BIT7)));
3558 /* Retrieve Chip version. */
3559 priv->card_8192_version = (VERSION_8192S)((read_nic_dword(dev, PMC_FSM)>>16)&0xF);
3560 RT_TRACE(COMP_INIT, "Chip Version ID: 0x%2x\n", priv->card_8192_version);
3562 switch (priv->card_8192_version) {
3564 RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_ACUT.\n");
3567 RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_BCUT.\n");
3570 RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_CCUT.\n");
3573 RT_TRACE(COMP_INIT, "Unknown Chip Version!!\n");
3574 priv->card_8192_version = VERSION_8192S_BCUT;
3578 if (priv->EepromOrEfuse) { /* Read from EEPROM */
3579 /* Isolation signals from Loader */
3580 write_nic_byte(dev, SYS_ISO_CTRL+1, 0xE8);
3582 /* Enable Loader Data Keep */
3583 write_nic_byte(dev, PMC_FSM, 0x02);
3584 /* Read all Content from EEPROM or EFUSE. */
3585 for (i = 0; i < HWSET_MAX_SIZE_92S; i += 2) {
3586 eeprom_93cx6_read(&eeprom, (u16) (i>>1), &eeprom_val);
3587 *((u16 *)(&hwinfo[i])) = eeprom_val;
3589 } else if (!(priv->EepromOrEfuse)) { /* Read from EFUSE */
3590 /* Read EFUSE real map to shadow. */
3591 EFUSE_ShadowMapUpdate(dev);
3592 memcpy(hwinfo, &priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
3594 RT_TRACE(COMP_INIT, "%s(): Invalid boot type", __func__);
3598 * Even though CR9346 regiser can verify whether Autoload
3599 * is success or not, but we still double check ID codes for 92S here
3600 * (e.g., due to HW GPIO polling fail issue)
3602 EEPROMId = *((u16 *)&hwinfo[0]);
3603 if (EEPROMId != RTL8190_EEPROM_ID) {
3604 RT_TRACE(COMP_INIT, "ID(%#x) is invalid!!\n", EEPROMId);
3605 priv->bTXPowerDataReadFromEEPORM = FALSE;
3606 priv->AutoloadFailFlag=TRUE;
3608 priv->AutoloadFailFlag=FALSE;
3609 priv->bTXPowerDataReadFromEEPORM = TRUE;
3611 /* Read IC Version && Channel Plan */
3612 if (!priv->AutoloadFailFlag) {
3614 priv->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
3615 priv->eeprom_pid = *(u16 *)&hwinfo[EEPROM_PID];
3616 priv->bIgnoreDiffRateTxPowerOffset = false; //cosa for test
3619 /* EEPROM Version ID, Channel plan */
3620 priv->EEPROMVersion = *(u8 *)&hwinfo[EEPROM_Version];
3621 priv->eeprom_ChannelPlan = *(u8 *)&hwinfo[EEPROM_ChannelPlan];
3623 /* Customer ID, 0x00 and 0xff are reserved for Realtek. */
3624 priv->eeprom_CustomerID = *(u8 *)&hwinfo[EEPROM_CustomID];
3625 priv->eeprom_SubCustomerID = *(u8 *)&hwinfo[EEPROM_SubCustomID];
3627 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(dev);
3631 RT_TRACE(COMP_INIT, "EEPROM Id = 0x%4x\n", EEPROMId);
3632 RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
3633 RT_TRACE(COMP_INIT, "EEPROM PID = 0x%4x\n", priv->eeprom_pid);
3634 RT_TRACE(COMP_INIT, "EEPROM Version ID: 0x%2x\n", priv->EEPROMVersion);
3635 RT_TRACE(COMP_INIT, "EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
3636 RT_TRACE(COMP_INIT, "EEPROM SubCustomer ID: 0x%2x\n", priv->eeprom_SubCustomerID);
3637 RT_TRACE(COMP_INIT, "EEPROM ChannelPlan = 0x%4x\n", priv->eeprom_ChannelPlan);
3638 RT_TRACE(COMP_INIT, "bIgnoreDiffRateTxPowerOffset = %d\n", priv->bIgnoreDiffRateTxPowerOffset);
3640 /* Read USB optional function. */
3641 if (!priv->AutoloadFailFlag) {
3642 priv->EEPROMUsbOption = *(u8 *)&hwinfo[EEPROM_USB_OPTIONAL];
3644 priv->EEPROMUsbOption = EEPROM_USB_Default_OPTIONAL_FUNC;
3647 priv->EEPROMUsbEndPointNumber = rtl8192SU_UsbOptionToEndPointNumber((priv->EEPROMUsbOption&EEPROM_EP_NUMBER)>>3);
3649 RT_TRACE(COMP_INIT, "USB Option = %#x\n", priv->EEPROMUsbOption);
3650 RT_TRACE(COMP_INIT, "EndPoint Number = %#x\n", priv->EEPROMUsbEndPointNumber);
3654 // Decide CustomerID according to VID/DID or EEPROM
3656 switch(pHalData->EEPROMCustomerID)
3658 case EEPROM_CID_ALPHA:
3659 pMgntInfo->CustomerID = RT_CID_819x_ALPHA;
3662 case EEPROM_CID_CAMEO:
3663 pMgntInfo->CustomerID = RT_CID_819x_CAMEO;
3666 case EEPROM_CID_SITECOM:
3667 pMgntInfo->CustomerID = RT_CID_819x_Sitecom;
3668 RT_TRACE(COMP_INIT, DBG_LOUD, ("CustomerID = 0x%4x\n", pMgntInfo->CustomerID));
3672 case EEPROM_CID_WHQL:
3673 Adapter->bInHctTest = TRUE;
3675 pMgntInfo->bSupportTurboMode = FALSE;
3676 pMgntInfo->bAutoTurboBy8186 = FALSE;
3678 pMgntInfo->PowerSaveControl.bInactivePs = FALSE;
3679 pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE;
3680 pMgntInfo->PowerSaveControl.bLeisurePs = FALSE;
3681 pMgntInfo->keepAliveLevel = 0;
3685 pMgntInfo->CustomerID = RT_CID_DEFAULT;
3693 switch(pMgntInfo->CustomerID)
3695 case RT_CID_DEFAULT:
3696 case RT_CID_819x_ALPHA:
3697 pHalData->LedStrategy = SW_LED_MODE1;
3698 pHalData->bRegUseLed = TRUE;
3699 pHalData->SwLed1.bLedOn = TRUE;
3701 case RT_CID_819x_CAMEO:
3702 pHalData->LedStrategy = SW_LED_MODE1;
3703 pHalData->bRegUseLed = TRUE;
3706 case RT_CID_819x_Sitecom:
3707 pHalData->LedStrategy = SW_LED_MODE2;
3708 pHalData->bRegUseLed = TRUE;
3712 pHalData->LedStrategy = SW_LED_MODE0;
3717 // Read USB PHY parameters.
3719 priv->EEPROMUsbPhyParam[i] = *(u8 *)&hwinfo[EEPROM_USB_PHY_PARA1+i];
3721 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("USB PHY Param: \n"), pHalData->EEPROMUsbPhyParam, 5);
3724 //Read Permanent MAC address
3726 dev->dev_addr[i] = *(u8 *)&hwinfo[EEPROM_NODE_ADDRESS_BYTE_0+i];
3728 //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
3729 write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
3730 write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
3733 "ReadAdapterInfo8192SEFuse(), Permanent Address = %pM\n",
3737 // Get CustomerID(Boad Type)
3738 // i.e., 0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU.
3739 // Others: Reserved. Default is 0x2: RTL8192SU.
3741 //if(!priv->AutoloadFailFlag)
3743 priv->EEPROMBoardType = *(u8 *)&hwinfo[EEPROM_BoardType];
3744 priv->rf_type = rtl8192SU_BoardTypeToRFtype(dev, priv->EEPROMBoardType);
3748 // priv->EEPROMBoardType = EEPROM_Default_BoardType;
3749 // priv->rf_type = RF_1T2R;
3752 priv->rf_chip = RF_6052;
3754 priv->rf_chip = RF_6052;//lzm test
3755 RT_TRACE(COMP_INIT, "BoardType = 0x%2x\n", priv->EEPROMBoardType);
3756 RT_TRACE(COMP_INIT, "RF_Type = 0x%2x\n", priv->rf_type);
3759 // Read antenna tx power offset of B/C/D to A from EEPROM
3760 // and read ThermalMeter from EEPROM
3762 //if(!priv->AutoloadFailFlag)
3764 priv->EEPROMTxPowerDiff = *(u8 *)&hwinfo[EEPROM_PwDiff];
3765 priv->EEPROMThermalMeter = *(u8 *)&hwinfo[EEPROM_ThermalMeter];
3769 // priv->EEPROMTxPowerDiff = EEPROM_Default_PwDiff;
3770 // priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
3773 RT_TRACE(COMP_INIT, "PwDiff = %#x\n", priv->EEPROMTxPowerDiff);
3774 RT_TRACE(COMP_INIT, "ThermalMeter = %#x\n", priv->EEPROMThermalMeter);
3777 // Read Tx Power gain offset of legacy OFDM to HT rate.
3778 // Read CrystalCap from EEPROM
3780 //if(!priv->AutoloadFailFlag)
3782 priv->EEPROMCrystalCap = *(u8 *)&hwinfo[EEPROM_CrystalCap];
3786 // priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
3789 RT_TRACE(COMP_INIT, "CrystalCap = %#x\n", priv->EEPROMCrystalCap);
3792 // Get Tx Power Base.
3794 //if(!priv->AutoloadFailFlag)
3796 priv->EEPROMTxPwrBase = *(u8 *)&hwinfo[EEPROM_TxPowerBase];
3800 // priv->EEPROMTxPwrBase = EEPROM_Default_TxPowerBase;
3803 RT_TRACE(COMP_INIT, "TxPwrBase = %#x\n", priv->EEPROMTxPwrBase);
3807 // Get TSSI value for each path.
3809 //if(!priv->AutoloadFailFlag)
3811 priv->EEPROMTSSI_A = *(u8 *)&hwinfo[EEPROM_TSSI_A];
3812 priv->EEPROMTSSI_B = *(u8 *)&hwinfo[EEPROM_TSSI_B];
3815 //{ // Default setting for Empty EEPROM
3816 // priv->EEPROMTSSI_A = EEPROM_Default_TSSI;
3817 // priv->EEPROMTSSI_B = EEPROM_Default_TSSI;
3820 RT_TRACE(COMP_INIT, "TSSI_A = %#x, TSSI_B = %#x\n", priv->EEPROMTSSI_A, priv->EEPROMTSSI_B);
3823 // Get Tx Power tracking mode.
3825 //if(!priv->AutoloadFailFlag)
3827 priv->EEPROMTxPwrTkMode = *(u8 *)&hwinfo[EEPROM_TxPwTkMode];
3830 RT_TRACE(COMP_INIT, "TxPwrTkMod = %#x\n", priv->EEPROMTxPwrTkMode);
3835 // Buffer TxPwIdx(i.e., from offset 0x55~0x66, total 18Bytes)
3836 // Update CCK, OFDM (1T/2T)Tx Power Index from above buffer.
3840 // Get Tx Power Level by Channel
3842 //if(!priv->AutoloadFailFlag)
3844 // Read Tx power of Channel 1 ~ 14 from EFUSE.
3845 // 92S suupport RF A & B
3846 for (rf_path = 0; rf_path < 2; rf_path++)
3848 for (i = 0; i < 3; i++)
3850 // Read CCK RF A & B Tx power
3851 priv->RfCckChnlAreaTxPwr[rf_path][i] =
3852 hwinfo[EEPROM_TxPwIndex+rf_path*3+i];
3854 // Read OFDM RF A & B Tx power for 1T
3855 priv->RfOfdmChnlAreaTxPwr1T[rf_path][i] =
3856 hwinfo[EEPROM_TxPwIndex+6+rf_path*3+i];
3858 // Read OFDM RF A & B Tx power for 2T
3859 priv->RfOfdmChnlAreaTxPwr2T[rf_path][i] =
3860 hwinfo[EEPROM_TxPwIndex+12+rf_path*3+i];
3865 update_hal_variables(priv);
3869 // 2009/02/09 Cosa add for new EEPROM format
3871 for(i=0; i<14; i++) // channel 1~3 use the same Tx Power Level.
3873 // Read tx power difference between HT OFDM 20/40 MHZ
3874 if (i < 3) // Cjanel 1-3
3876 else if (i < 9) // Channel 4-9
3878 else // Channel 10-14
3881 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_HT20_DIFF+index])&0xff;
3882 priv->TxPwrHt20Diff[RF90_PATH_A][i] = (tempval&0xF);
3883 priv->TxPwrHt20Diff[RF90_PATH_B][i] = ((tempval>>4)&0xF);
3885 // Read OFDM<->HT tx power diff
3886 if (i < 3) // Cjanel 1-3
3887 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF])&0xff;
3888 else if (i < 9) // Channel 4-9
3889 tempval = (*(u8 *)&hwinfo[EEPROM_PwDiff])&0xff;
3890 else // Channel 10-14
3891 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF+1])&0xff;
3893 //cosa tempval = (*(u1Byte *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF+index])&0xff;
3894 priv->TxPwrLegacyHtDiff[RF90_PATH_A][i] = (tempval&0xF);
3895 priv->TxPwrLegacyHtDiff[RF90_PATH_B][i] = ((tempval>>4)&0xF);
3898 // Read Band Edge tx power offset and check if user enable the ability
3900 // HT 40 band edge channel
3901 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE])&0xff;
3902 priv->TxPwrbandEdgeHt40[RF90_PATH_A][0] = (tempval&0xF); // Band edge low channel
3903 priv->TxPwrbandEdgeHt40[RF90_PATH_A][1] = ((tempval>>4)&0xF); // Band edge high channel
3904 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+1])&0xff;
3905 priv->TxPwrbandEdgeHt40[RF90_PATH_B][0] = (tempval&0xF); // Band edge low channel
3906 priv->TxPwrbandEdgeHt40[RF90_PATH_B][1] = ((tempval>>4)&0xF); // Band edge high channel
3907 // HT 20 band edge channel
3908 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+2])&0xff;
3909 priv->TxPwrbandEdgeHt20[RF90_PATH_A][0] = (tempval&0xF); // Band edge low channel
3910 priv->TxPwrbandEdgeHt20[RF90_PATH_A][1] = ((tempval>>4)&0xF); // Band edge high channel
3911 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+3])&0xff;
3912 priv->TxPwrbandEdgeHt20[RF90_PATH_B][0] = (tempval&0xF); // Band edge low channel
3913 priv->TxPwrbandEdgeHt20[RF90_PATH_B][1] = ((tempval>>4)&0xF); // Band edge high channel
3914 // OFDM band edge channel
3915 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+4])&0xff;
3916 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0] = (tempval&0xF); // Band edge low channel
3917 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1] = ((tempval>>4)&0xF); // Band edge high channel
3918 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+5])&0xff;
3919 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][0] = (tempval&0xF); // Band edge low channel
3920 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][1] = ((tempval>>4)&0xF); // Band edge high channel
3922 priv->TxPwrbandEdgeFlag = (*(u8 *)&hwinfo[TX_PWR_BAND_EDGE_CHK]);
3926 RT_TRACE(COMP_INIT, "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrHt20Diff[RF90_PATH_A][i]);
3928 RT_TRACE(COMP_INIT, "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i, priv->TxPwrLegacyHtDiff[RF90_PATH_A][i]);
3930 RT_TRACE(COMP_INIT, "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrHt20Diff[RF90_PATH_B][i]);
3932 RT_TRACE(COMP_INIT, "RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrLegacyHtDiff[RF90_PATH_B][i]);
3933 RT_TRACE(COMP_INIT, "RF-A HT40 band-edge low/high power diff = 0x%x/0x%x\n",
3934 priv->TxPwrbandEdgeHt40[RF90_PATH_A][0],
3935 priv->TxPwrbandEdgeHt40[RF90_PATH_A][1]);
3936 RT_TRACE((COMP_INIT&COMP_DBG), "RF-B HT40 band-edge low/high power diff = 0x%x/0x%x\n",
3937 priv->TxPwrbandEdgeHt40[RF90_PATH_B][0],
3938 priv->TxPwrbandEdgeHt40[RF90_PATH_B][1]);
3940 RT_TRACE((COMP_INIT&COMP_DBG), "RF-A HT20 band-edge low/high power diff = 0x%x/0x%x\n",
3941 priv->TxPwrbandEdgeHt20[RF90_PATH_A][0],
3942 priv->TxPwrbandEdgeHt20[RF90_PATH_A][1]);
3943 RT_TRACE((COMP_INIT&COMP_DBG), "RF-B HT20 band-edge low/high power diff = 0x%x/0x%x\n",
3944 priv->TxPwrbandEdgeHt20[RF90_PATH_B][0],
3945 priv->TxPwrbandEdgeHt20[RF90_PATH_B][1]);
3947 RT_TRACE((COMP_INIT&COMP_DBG), "RF-A OFDM band-edge low/high power diff = 0x%x/0x%x\n",
3948 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0],
3949 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1]);
3950 RT_TRACE((COMP_INIT&COMP_DBG), "RF-B OFDM band-edge low/high power diff = 0x%x/0x%x\n",
3951 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][0],
3952 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][1]);
3953 RT_TRACE((COMP_INIT&COMP_DBG), "Band-edge enable flag = %d\n", priv->TxPwrbandEdgeFlag);
3956 // Update remained HAL variables.
3958 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
3959 priv->LegacyHTTxPowerDiff = priv->EEPROMTxPowerDiff;
3960 priv->TxPowerDiff = priv->EEPROMTxPowerDiff;
3961 //priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);// Antenna B gain offset to antenna A, bit[3:0]
3962 //priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);// Antenna C gain offset to antenna A, bit[7:4]
3963 priv->CrystalCap = priv->EEPROMCrystalCap; // CrystalCap, bit[15:12]
3964 priv->ThermalMeter[0] = (priv->EEPROMThermalMeter&0x1f);// ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
3965 priv->LedStrategy = SW_LED_MODE0;
3967 init_rate_adaptive(dev);
3969 RT_TRACE(COMP_INIT, "<==== ReadAdapterInfo8192SUsb\n");
3971 //return RT_STATUS_SUCCESS;
3977 // Read HW adapter information by E-Fuse or EEPROM according CR9346 reported.
3980 // 1. CR9346 regiser has verified.
3981 // 2. PASSIVE_LEVEL (USB interface)
3983 // Created by Roger, 2008.10.21.
3985 static void rtl8192SU_read_eeprom_info(struct net_device *dev)
3987 struct r8192_priv *priv = ieee80211_priv(dev);
3990 RT_TRACE(COMP_INIT, "====> ReadAdapterInfo8192SUsb\n");
3992 // Retrieve Chip version.
3993 priv->card_8192_version = (VERSION_8192S)((read_nic_dword(dev, PMC_FSM)>>16)&0xF);
3994 RT_TRACE(COMP_INIT, "Chip Version ID: 0x%2x\n", priv->card_8192_version);
3996 tmpU1b = read_nic_byte(dev, EPROM_CMD);//CR9346
3998 // To check system boot selection.
3999 if (tmpU1b & CmdEERPOMSEL)
4001 RT_TRACE(COMP_INIT, "Boot from EEPROM\n");
4002 priv->EepromOrEfuse = TRUE;
4006 RT_TRACE(COMP_INIT, "Boot from EFUSE\n");
4007 priv->EepromOrEfuse = FALSE;
4010 // To check autoload success or not.
4011 if (tmpU1b & CmdEEPROM_En)
4013 RT_TRACE(COMP_INIT, "Autoload OK!!\n");
4014 priv->AutoloadFailFlag=FALSE;
4015 rtl8192SU_ReadAdapterInfo8192SUsb(dev);//eeprom or e-fuse
4018 { // Auto load fail.
4019 RT_TRACE(COMP_INIT, "AutoLoad Fail reported from CR9346!!\n");
4020 priv->AutoloadFailFlag=TRUE;
4021 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(dev);
4023 //if (IS_BOOT_FROM_EFUSE(Adapter))
4024 if(!priv->EepromOrEfuse)
4026 RT_TRACE(COMP_INIT, "Update shadow map for EFuse future use!!\n");
4027 EFUSE_ShadowMapUpdate(dev);
4031 if((priv->RegChannelPlan >= RT_CHANNEL_DOMAIN_MAX) || (pHalData->EEPROMChannelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK))
4033 pMgntInfo->ChannelPlan = HalMapChannelPlan8192S(Adapter, (pHalData->EEPROMChannelPlan & (~(EEPROM_CHANNEL_PLAN_BY_HW_MASK))));
4034 pMgntInfo->bChnlPlanFromHW = (pHalData->EEPROMChannelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) ? TRUE : FALSE; // User cannot change channel plan.
4038 pMgntInfo->ChannelPlan = (RT_CHANNEL_DOMAIN)pMgntInfo->RegChannelPlan;
4041 switch(pMgntInfo->ChannelPlan)
4043 case RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN:
4045 PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
4047 pDot11dInfo->bEnabled = TRUE;
4049 RT_TRACE(COMP_INIT, DBG_LOUD, ("ReadAdapterInfo8187(): Enable dot11d when RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN!\n"));
4053 RT_TRACE(COMP_INIT, DBG_LOUD, ("RegChannelPlan(%d) EEPROMChannelPlan(%d)", pMgntInfo->RegChannelPlan, pHalData->EEPROMChannelPlan));
4054 RT_TRACE(COMP_INIT, DBG_LOUD, ("ChannelPlan = %d\n" , pMgntInfo->ChannelPlan));
4056 RT_TRACE(COMP_INIT, DBG_LOUD, ("<==== ReadAdapterInfo8192S\n"));
4059 RT_TRACE(COMP_INIT, "<==== ReadAdapterInfo8192SUsb\n");
4061 //return RT_STATUS_SUCCESS;
4064 short rtl8192_get_channel_map(struct net_device * dev)
4066 struct r8192_priv *priv = ieee80211_priv(dev);
4067 if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
4068 printk("rtl8180_init:Error channel plan! Set to default.\n");
4069 priv->ChannelPlan= 0;
4071 RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
4073 rtl819x_set_channel_map(priv->ChannelPlan, priv);
4077 short rtl8192_init(struct net_device *dev)
4080 struct r8192_priv *priv = ieee80211_priv(dev);
4082 rtl8192_init_priv_variable(dev);
4083 rtl8192_init_priv_lock(priv);
4084 rtl8192_init_priv_task(dev);
4085 priv->ops->rtl819x_read_eeprom_info(dev);
4086 rtl8192_get_channel_map(dev);
4088 init_timer(&priv->watch_dog_timer);
4089 priv->watch_dog_timer.data = (unsigned long)dev;
4090 priv->watch_dog_timer.function = watch_dog_timer_callback;
4094 /******************************************************************************
4095 *function: This function actually only set RRSR, RATR and BW_OPMODE registers
4096 * not to do all the hw config as its name says
4097 * input: net_device dev
4100 * notice: This part need to modified according to the rate set we filtered
4101 * ****************************************************************************/
4102 void rtl8192_hwconfig(struct net_device* dev)
4104 u32 regRATR = 0, regRRSR = 0;
4105 u8 regBwOpMode = 0, regTmp = 0;
4106 struct r8192_priv *priv = ieee80211_priv(dev);
4108 // Set RRSR, RATR, and BW_OPMODE registers
4110 switch(priv->ieee80211->mode)
4112 case WIRELESS_MODE_B:
4113 regBwOpMode = BW_OPMODE_20MHZ;
4114 regRATR = RATE_ALL_CCK;
4115 regRRSR = RATE_ALL_CCK;
4117 case WIRELESS_MODE_A:
4118 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
4119 regRATR = RATE_ALL_OFDM_AG;
4120 regRRSR = RATE_ALL_OFDM_AG;
4122 case WIRELESS_MODE_G:
4123 regBwOpMode = BW_OPMODE_20MHZ;
4124 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4125 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4127 case WIRELESS_MODE_AUTO:
4129 if (Adapter->bInHctTest)
4131 regBwOpMode = BW_OPMODE_20MHZ;
4132 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4133 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4138 regBwOpMode = BW_OPMODE_20MHZ;
4139 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4140 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4143 case WIRELESS_MODE_N_24G:
4144 // It support CCK rate by default.
4145 // CCK rate will be filtered out only when associated AP does not support it.
4146 regBwOpMode = BW_OPMODE_20MHZ;
4147 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4148 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4150 case WIRELESS_MODE_N_5G:
4151 regBwOpMode = BW_OPMODE_5G;
4152 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4153 regRRSR = RATE_ALL_OFDM_AG;
4157 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4160 ratr_value = regRATR;
4161 if (priv->rf_type == RF_1T2R)
4163 ratr_value &= ~(RATE_ALL_OFDM_2SS);
4165 write_nic_dword(dev, RATR0, ratr_value);
4166 write_nic_byte(dev, UFWP, 1);
4168 regTmp = read_nic_byte(dev, 0x313);
4169 regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
4170 write_nic_dword(dev, RRSR, regRRSR);
4173 // Set Retry Limit here
4175 write_nic_word(dev, RETRY_LIMIT,
4176 priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
4177 priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
4178 // Set Contention Window here
4182 // Set Tx Antenna including Feedback control
4184 // Set Auto Rate fallback control
4192 // Initial HW relted registers.
4195 // Config RTL8192S USB MAC, we should config MAC before download FW.
4197 // 2008.09.03, Added by Roger.
4199 static void rtl8192SU_MacConfigBeforeFwDownloadASIC(struct net_device *dev)
4206 RT_TRACE(COMP_INIT, "--->MacConfigBeforeFwDownloadASIC()\n");
4208 //2MAC Initialization for power on sequence, Revised by Roger. 2008.09.03.
4211 //<Roger_Notes> Set control path switch to HW control and reset Digital Core, CPU Core and
4212 // MAC I/O to solve FW download fail when system from resume sate.
4215 tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4219 write_nic_byte(dev, SYS_CLKR+1, tmpU1b);
4221 // Clear FW RPWM for FW control LPS. by tynli. 2009.02.23
4222 write_nic_byte(dev, RPWM, 0x0);
4224 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4226 write_nic_byte(dev, SYS_FUNC_EN+1, tmpU1b);
4229 //Revised POS, suggested by SD1 Alex, 2008.09.27.
4230 write_nic_byte(dev, SPS0_CTRL+1, 0x53);
4231 write_nic_byte(dev, SPS0_CTRL, 0x57);
4233 //Enable AFE Macro Block's Bandgap adn Enable AFE Macro Block's Mbias
4234 tmpU1b = read_nic_byte(dev, AFE_MISC);
4235 write_nic_byte(dev, AFE_MISC, (tmpU1b|AFE_BGEN|AFE_MBEN));
4237 //Enable PLL Power (LDOA15V)
4238 tmpU1b = read_nic_byte(dev, LDOA15_CTRL);
4239 write_nic_byte(dev, LDOA15_CTRL, (tmpU1b|LDA15_EN));
4241 //Enable LDOV12D block
4242 tmpU1b = read_nic_byte(dev, LDOV12D_CTRL);
4243 write_nic_byte(dev, LDOV12D_CTRL, (tmpU1b|LDV12_EN));
4245 //mpU1b = read_nic_byte(Adapter, SPS1_CTRL);
4246 //write_nic_byte(dev, SPS1_CTRL, (tmpU1b|SPS1_LDEN));
4248 //PlatformSleepUs(2000);
4250 //Enable Switch Regulator Block
4251 //tmpU1b = read_nic_byte(Adapter, SPS1_CTRL);
4252 //write_nic_byte(dev, SPS1_CTRL, (tmpU1b|SPS1_SWEN));
4254 //write_nic_dword(Adapter, SPS1_CTRL, 0x00a7b267);
4256 tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL+1);
4257 write_nic_byte(dev, SYS_ISO_CTRL+1, (tmpU1b|0x08));
4259 //Engineer Packet CP test Enable
4260 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4261 write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x20));
4263 //Support 64k IMEM, suggested by SD1 Alex.
4264 tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL+1);
4265 write_nic_byte(dev, SYS_ISO_CTRL+1, (tmpU1b& 0x68));
4268 tmpU1b = read_nic_byte(dev, AFE_XTAL_CTRL+1);
4269 write_nic_byte(dev, AFE_XTAL_CTRL+1, (tmpU1b& 0xfb));
4271 //Enable AFE PLL Macro Block
4272 tmpU1b = read_nic_byte(dev, AFE_PLL_CTRL);
4273 write_nic_byte(dev, AFE_PLL_CTRL, (tmpU1b|0x11));
4275 //Attatch AFE PLL to MACTOP/BB/PCIe Digital
4276 tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL);
4277 write_nic_byte(dev, SYS_ISO_CTRL, (tmpU1b&0xEE));
4279 // Switch to 40M clock
4280 write_nic_byte(dev, SYS_CLKR, 0x00);
4283 tmpU1b = read_nic_byte(dev, SYS_CLKR);
4284 //write_nic_byte(dev, SYS_CLKR, (tmpU1b&0x5f));
4285 write_nic_byte(dev, SYS_CLKR, (tmpU1b|0xa0));
4288 tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4289 write_nic_byte(dev, SYS_CLKR+1, (tmpU1b|0x18));
4291 //Revised POS, suggested by SD1 Alex, 2008.09.27.
4292 write_nic_byte(dev, PMC_FSM, 0x02);
4294 //Enable Core digital and enable IOREG R/W
4295 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4296 write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x08));
4299 tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4300 write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x80));
4302 //Switch the control path to FW
4303 tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4304 write_nic_byte(dev, SYS_CLKR+1, (tmpU1b|0x80)& 0xBF);
4306 write_nic_byte(dev, CMDR, 0xFC);
4307 write_nic_byte(dev, CMDR+1, 0x37);
4309 //Fix the RX FIFO issue(usb error), 970410
4310 tmpU1b = read_nic_byte_E(dev, 0x5c);
4311 write_nic_byte_E(dev, 0x5c, (tmpU1b|BIT7));
4313 //For power save, used this in the bit file after 970621
4314 tmpU1b = read_nic_byte(dev, SYS_CLKR);
4315 write_nic_byte(dev, SYS_CLKR, tmpU1b&(~SYS_CPU_CLKSEL));
4317 // Revised for 8051 ROM code wrong operation. Added by Roger. 2008.10.16.
4318 write_nic_byte_E(dev, 0x1c, 0x80);
4321 // <Roger_EXP> To make sure that TxDMA can ready to download FW.
4322 // We should reset TxDMA if IMEM RPT was not ready.
4323 // Suggested by SD1 Alex. 2008.10.23.
4327 tmpU1b = read_nic_byte(dev, TCR);
4328 if((tmpU1b & TXDMA_INIT_VALUE) == TXDMA_INIT_VALUE)
4330 //PlatformStallExecution(5);
4332 }while(PollingCnt--); // Delay 1ms
4334 if(PollingCnt <= 0 )
4336 RT_TRACE(COMP_INIT, "MacConfigBeforeFwDownloadASIC(): Polling TXDMA_INIT_VALUE timeout!! Current TCR(%#x)\n", tmpU1b);
4337 tmpU1b = read_nic_byte(dev, CMDR);
4338 write_nic_byte(dev, CMDR, tmpU1b&(~TXDMA_EN));
4340 write_nic_byte(dev, CMDR, tmpU1b|TXDMA_EN);// Reset TxDMA
4344 RT_TRACE(COMP_INIT, "<---MacConfigBeforeFwDownloadASIC()\n");
4349 // Initial HW relted registers.
4352 // 1. This function is only invoked at driver intialization once.
4353 // 2. PASSIVE LEVEL.
4355 // 2008.06.10, Added by Roger.
4357 static void rtl8192SU_MacConfigAfterFwDownload(struct net_device *dev)
4359 struct r8192_priv *priv = ieee80211_priv((struct net_device *)dev);
4360 //PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
4361 //u8 tmpU1b, RxPageCfg, i;
4366 RT_TRACE(COMP_INIT, "--->MacConfigAfterFwDownload()\n");
4369 tmpU2b = (BBRSTn|BB_GLB_RSTn|SCHEDULE_EN|MACRXEN|MACTXEN|DDMA_EN|
4370 FW2HW_EN|RXDMA_EN|TXDMA_EN|HCI_RXDMA_EN|HCI_TXDMA_EN); //3
4371 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_COMMAND, &tmpU1b );
4372 write_nic_word(dev, CMDR, tmpU2b); //LZM REGISTER COM 090305
4374 // Loopback mode or not
4375 priv->LoopbackMode = RTL8192SU_NO_LOOPBACK; // Set no loopback as default.
4376 if(priv->LoopbackMode == RTL8192SU_NO_LOOPBACK)
4377 tmpU1b = LBK_NORMAL;
4378 else if (priv->LoopbackMode == RTL8192SU_MAC_LOOPBACK )
4379 tmpU1b = LBK_MAC_DLB;
4381 RT_TRACE(COMP_INIT, "Serious error: wrong loopback mode setting\n");
4383 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_LBK_MODE, &tmpU1b);
4384 write_nic_byte(dev, LBKMD_SEL, tmpU1b);
4387 write_nic_dword(dev, RCR, priv->ReceiveConfig);
4388 RT_TRACE(COMP_INIT, "MacConfigAfterFwDownload(): Current RCR settings(%#x)\n", priv->ReceiveConfig);
4393 // <Roger_Notes> 2008.08.18.
4395 // (1) Page number on CMDQ is 0x03.
4396 // (2) Page number on BCNQ, HQ and MGTQ is 0.
4397 // (3) Page number on BKQ, BEQ, VIQ and VOQ are 0x07.
4398 // (4) Page number on PUBQ is 0xdd
4401 // (1) Page number on CMDQ is 0x00.
4402 // (2) Page number on BCNQ is 0x02, HQ and MGTQ are 0x03.
4403 // (3) Page number on BKQ, BEQ, VIQ and VOQ are 0x07.
4404 // (4) Page number on PUBQ is 0xd8
4406 //write_nic_dword(Adapter, 0xa0, 0x07070707); //BKQ, BEQ, VIQ and VOQ
4407 //write_nic_byte(dev, 0xa4, 0x00); // HCCAQ
4409 // Fix the RX FIFO issue(USB error), Rivesed by Roger, 2008-06-14
4410 tmpU1b = read_nic_byte_E(dev, 0x5C);
4411 write_nic_byte_E(dev, 0x5C, tmpU1b|BIT7);
4413 // For EFUSE init configuration.
4414 //if (IS_BOOT_FROM_EFUSE(Adapter)) // We may R/W EFUSE in EFUSE mode
4415 if (priv->bBootFromEfuse)
4419 tempval = read_nic_byte(dev, SYS_ISO_CTRL+1);
4421 write_nic_byte(dev, SYS_ISO_CTRL+1, tempval);
4423 // Enable LDO 2.5V for write action
4424 //tempval = read_nic_byte(Adapter, EFUSE_TEST+3);
4425 //write_nic_byte(Adapter, EFUSE_TEST+3, (tempval | 0x80));
4427 // Change Efuse Clock for write action
4428 //write_nic_byte(Adapter, EFUSE_CLK, 0x03);
4430 // Change Program timing
4431 write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
4432 //printk("!!!!!!!!!!!!!!!!!!!!!%s: write 0x33 with 0x72\n",__FUNCTION__);
4433 RT_TRACE(COMP_INIT, "EFUSE CONFIG OK\n");
4437 RT_TRACE(COMP_INIT, "<---MacConfigAfterFwDownload()\n");
4440 void rtl8192SU_HwConfigureRTL8192SUsb(struct net_device *dev)
4443 struct r8192_priv *priv = ieee80211_priv(dev);
4445 u32 regRATR = 0, regRRSR = 0;
4449 //1 This part need to modified according to the rate set we filtered!!
4451 // Set RRSR, RATR, and BW_OPMODE registers
4453 switch(priv->ieee80211->mode)
4455 case WIRELESS_MODE_B:
4456 regBwOpMode = BW_OPMODE_20MHZ;
4457 regRATR = RATE_ALL_CCK;
4458 regRRSR = RATE_ALL_CCK;
4460 case WIRELESS_MODE_A:
4461 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
4462 regRATR = RATE_ALL_OFDM_AG;
4463 regRRSR = RATE_ALL_OFDM_AG;
4465 case WIRELESS_MODE_G:
4466 regBwOpMode = BW_OPMODE_20MHZ;
4467 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4468 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4470 case WIRELESS_MODE_AUTO:
4471 if (priv->bInHctTest)
4473 regBwOpMode = BW_OPMODE_20MHZ;
4474 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4475 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4479 regBwOpMode = BW_OPMODE_20MHZ;
4480 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4481 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4484 case WIRELESS_MODE_N_24G:
4485 // It support CCK rate by default.
4486 // CCK rate will be filtered out only when associated AP does not support it.
4487 regBwOpMode = BW_OPMODE_20MHZ;
4488 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4489 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4491 case WIRELESS_MODE_N_5G:
4492 regBwOpMode = BW_OPMODE_5G;
4493 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4494 regRRSR = RATE_ALL_OFDM_AG;
4499 // <Roger_Notes> We disable CCK response rate until FIB CCK rate IC's back.
4502 regTmp = read_nic_byte(dev, INIRTSMCS_SEL);
4503 regRRSR = ((regRRSR & 0x000fffff)<<8) | regTmp;
4506 // Update SIFS timing.
4508 //priv->SifsTime = 0x0e0e0a0a;
4509 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SIFS, (pu1Byte)&pHalData->SifsTime);
4510 { u8 val[4] = {0x0e, 0x0e, 0x0a, 0x0a};
4511 // SIFS for CCK Data ACK
4512 write_nic_byte(dev, SIFS_CCK, val[0]);
4513 // SIFS for CCK consecutive tx like CTS data!
4514 write_nic_byte(dev, SIFS_CCK+1, val[1]);
4516 // SIFS for OFDM Data ACK
4517 write_nic_byte(dev, SIFS_OFDM, val[2]);
4518 // SIFS for OFDM consecutive tx like CTS data!
4519 write_nic_byte(dev, SIFS_OFDM+1, val[3]);
4522 write_nic_dword(dev, INIRTSMCS_SEL, regRRSR);
4523 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4526 // Suggested by SD1 Alex, 2008-06-14.
4528 //PlatformEFIOWrite1Byte(Adapter, TXOP_STALL_CTRL, 0x80);//NAV to protect all TXOP.
4531 // Set Data Auto Rate Fallback Retry Count register.
4533 write_nic_dword(dev, DARFRC, 0x02010000);
4534 write_nic_dword(dev, DARFRC+4, 0x06050403);
4535 write_nic_dword(dev, RARFRC, 0x02010000);
4536 write_nic_dword(dev, RARFRC+4, 0x06050403);
4538 // Set Data Auto Rate Fallback Reg. Added by Roger, 2008.09.22.
4539 for (i = 0; i < 8; i++)
4540 write_nic_dword(dev, ARFR0+i*4, 0x1f0ffff0);
4543 // Aggregation length limit. Revised by Roger. 2008.09.22.
4545 write_nic_byte(dev, AGGLEN_LMT_H, 0x0f); // Set AMPDU length to 12Kbytes for ShortGI case.
4546 write_nic_dword(dev, AGGLEN_LMT_L, 0xddd77442); // Long GI
4547 write_nic_dword(dev, AGGLEN_LMT_L+4, 0xfffdd772);
4549 // Set NAV protection length
4550 write_nic_word(dev, NAV_PROT_LEN, 0x0080);
4552 // Set TXOP stall control for several queue/HI/BCN/MGT/
4553 write_nic_byte(dev, TXOP_STALL_CTRL, 0x00); // NAV Protect next packet.
4555 // Set MSDU lifetime.
4556 write_nic_byte(dev, MLT, 0x8f);
4558 // Set CCK/OFDM SIFS
4559 write_nic_word(dev, SIFS_CCK, 0x0a0a); // CCK SIFS shall always be 10us.
4560 write_nic_word(dev, SIFS_OFDM, 0x0e0e);
4562 write_nic_byte(dev, ACK_TIMEOUT, 0x40);
4565 write_nic_byte(dev, CFEND_TH, 0xFF);
4568 // For Min Spacing configuration.
4570 switch(priv->rf_type)
4574 RT_TRACE(COMP_INIT, "Initializeadapter: RF_Type%s\n", (priv->rf_type==RF_1T1R? "(1T1R)":"(1T2R)"));
4575 priv->MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
4579 RT_TRACE(COMP_INIT, "Initializeadapter:RF_Type(2T2R)\n");
4580 priv->MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
4583 write_nic_byte(dev, AMPDU_MIN_SPACE, priv->MinSpaceCfg);
4587 // For Min Spacing configuration.
4589 //priv->MinSpaceCfg = 0x00;
4590 //rtl8192SU_SetHwRegAmpduMinSpace(dev, priv->MinSpaceCfg);
4594 // Description: Initial HW relted registers.
4596 // Assumption: This function is only invoked at driver intialization once.
4598 // 2008.06.10, Added by Roger.
4599 bool rtl8192SU_adapter_start(struct net_device *dev)
4601 struct r8192_priv *priv = ieee80211_priv(dev);
4602 //u32 dwRegRead = 0;
4603 //bool init_status = true;
4605 bool rtStatus = true;
4607 //u8 eRFPath, tmpU1b;
4608 u8 fw_download_times = 1;
4611 RT_TRACE(COMP_INIT, "--->InitializeAdapter8192SUsb()\n");
4613 //pHalData->bGPIOChangeRF = FALSE;
4617 // <Roger_Notes> 2008.06.15.
4619 // Initialization Steps on RTL8192SU:
4620 // a. MAC initialization prior to sending down firmware code.
4621 // b. Download firmware code step by step(i.e., IMEM, EMEM, DMEM).
4622 // c. MAC configuration after firmware has been download successfully.
4623 // d. Initialize BB related configurations.
4624 // e. Initialize RF related configurations.
4625 // f. Start to BulkIn transfer.
4629 //a. MAC initialization prior to send down firmware code.
4632 rtl8192SU_MacConfigBeforeFwDownloadASIC(dev);
4635 //b. Download firmware code step by step(i.e., IMEM, EMEM, DMEM).
4637 rtStatus = FirmwareDownload92S(dev);
4638 if(rtStatus != true)
4640 if(fw_download_times == 1){
4641 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Download Firmware failed once, Download again!!\n");
4642 fw_download_times = fw_download_times + 1;
4645 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Download Firmware failed twice, end!!\n");
4650 //c. MAC configuration after firmware has been download successfully.
4652 rtl8192SU_MacConfigAfterFwDownload(dev);
4654 //priv->bLbusEnable = TRUE;
4655 //if(priv->RegRfOff == TRUE)
4656 // priv->eRFPowerState = eRfOff;
4658 // Save target channel
4659 // <Roger_Notes> Current Channel will be updated again later.
4660 //priv->CurrentChannel = Channel;
4661 rtStatus = PHY_MACConfig8192S(dev);//===>ok
4662 if(rtStatus != true)
4664 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure MAC!!\n");
4670 write_nic_dword(dev,WDCAPARA_ADD[i], 0x5e4322);
4671 write_nic_byte(dev,AcmHwCtrl, 0x01);
4676 //d. Initialize BB related configurations.
4679 rtStatus = PHY_BBConfig8192S(dev);//===>ok
4680 if(rtStatus != true)
4682 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure BB!!\n");
4686 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x58);//===>ok
4689 // e. Initialize RF related configurations.
4691 // 2007/11/02 MH Before initalizing RF. We can not use FW to do RF-R/W.
4692 priv->Rf_Mode = RF_OP_By_SW_3wire;
4694 // For RF test only from Scott's suggestion
4695 //write_nic_byte(dev, 0x27, 0xDB);
4696 //write_nic_byte(dev, 0x1B, 0x07);
4699 write_nic_byte(dev, AFE_XTAL_CTRL+1, 0xDB);
4701 // <Roger_Notes> The following IOs are configured for each RF modules.
4702 // Enable RF module and reset RF and SDM module. 2008.11.17.
4703 if(priv->card_8192_version == VERSION_8192S_ACUT)
4704 write_nic_byte(dev, SPS1_CTRL+3, (u8)(RF_EN|RF_RSTB|RF_SDMRSTB)); // Fix A-Cut bug.
4706 write_nic_byte(dev, RF_CTRL, (u8)(RF_EN|RF_RSTB|RF_SDMRSTB));
4708 rtStatus = PHY_RFConfig8192S(dev);//===>ok
4709 if(rtStatus != true)
4711 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure RF!!\n");
4716 // Set CCK and OFDM Block "ON"
4717 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
4718 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
4721 // Turn off Radio B while RF type is 1T1R by SD3 Wilsion's request.
4722 // Revised by Roger, 2008.12.18.
4724 if(priv->rf_type == RF_1T1R)
4726 // This is needed for PHY_REG after 20081219
4727 rtl8192_setBBreg(dev, rFPGA0_RFMOD, 0xff000000, 0x03);
4728 // This is needed for PHY_REG before 20081219
4729 //PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x11);
4734 // Set CCK and OFDM Block "ON"
4735 //rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
4736 //rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
4739 //3//Get hardware version, do it in read eeprom?
4740 //GetHardwareVersion819xUsb(Adapter);
4745 rtl8192SU_HwConfigureRTL8192SUsb(dev);//==>ok
4748 // <Roger_Notes> We set MAC address here if autoload was failed before,
4749 // otherwise IDR0 will NOT contain any value.
4751 write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
4752 write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
4753 if(!priv->bInHctTest)
4755 if(priv->ResetProgress == RESET_TYPE_NORESET)
4757 //RT_TRACE(COMP_MLME, DBG_LOUD, ("Initializeadapter8192SUsb():RegWirelessMode(%#x) \n", Adapter->RegWirelessMode));
4758 //Adapter->HalFunc.SetWirelessModeHandler(Adapter, Adapter->RegWirelessMode);
4759 rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);//===>ok
4764 priv->ieee80211->mode = WIRELESS_MODE_G;
4765 rtl8192_SetWirelessMode(dev, WIRELESS_MODE_G);
4769 //-----------------------------------------------------------------------------
4770 // Set up security related. 070106, by rcnjko:
4771 // 1. Clear all H/W keys.
4772 // 2. Enable H/W encryption/decryption.
4773 //-----------------------------------------------------------------------------
4774 //CamResetAllEntry(Adapter);
4775 //Adapter->HalFunc.EnableHWSecCfgHandler(Adapter);
4777 //SecClearAllKeys(Adapter);
4778 CamResetAllEntry(dev);
4781 u8 SECR_value = 0x0;
4782 SECR_value |= SCR_TxEncEnable;
4783 SECR_value |= SCR_RxDecEnable;
4784 SECR_value |= SCR_NoSKMC;
4785 write_nic_byte(dev, SECR, SECR_value);
4790 //PHY_UpdateInitialGain(dev);
4792 if(priv->RegRfOff == true)
4793 { // User disable RF via registry.
4796 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): Turn off RF for RegRfOff ----------\n");
4797 MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_SW);
4798 // Those action will be discard in MgntActSet_RF_State because off the same state
4799 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
4800 rtl8192_setBBreg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
4802 else if(priv->RfOffReason > RF_CHANGE_BY_PS)
4803 { // H/W or S/W RF OFF before sleep.
4804 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): Turn off RF for RfOffReason(%d) ----------\n", priv->RfOffReason);
4805 MgntActSet_RF_State(dev, eRfOff, priv->RfOffReason);
4809 priv->eRFPowerState = eRfOn;
4810 priv->RfOffReason = 0;
4811 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): RF is on ----------\n");
4818 // f. Start to BulkIn transfer.
4825 PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
4827 for(PipeIndex=0; PipeIndex < MAX_RX_QUEUE; PipeIndex++)
4832 HalUsbInMpdu(Adapter, PipeIndex);
4836 //HalUsbInMpdu(Adapter, PipeIndex);
4837 //HalUsbInMpdu(Adapter, PipeIndex);
4838 //HalUsbInMpdu(Adapter, PipeIndex);
4841 PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
4844 // Joseph add to 819X code base for Vista USB platform.
4845 // This part may need to be add to Hal819xU code base. too.
4846 PlatformUsbEnableInPipes(Adapter);
4849 RT_TRACE(COMP_INIT, "HighestOperaRate = %x\n", Adapter->MgntInfo.HighestOperaRate);
4851 PlatformStartWorkItem( &(pHalData->RtUsbCheckForHangWorkItem) );
4854 // <Roger_EXP> The following configurations are for ASIC verification temporally.
4861 // Read EEPROM TX power index and PHY_REG_PG.txt to capture correct
4862 // TX power index for different rate set.
4864 //if(priv->card_8192_version >= VERSION_8192S_ACUT)
4866 // Get original hw reg values
4867 PHY_GetHWRegOriginalValue(dev);
4869 // Write correct tx power index//FIXLZM
4870 PHY_SetTxPowerLevel8192S(dev, priv->chan);
4875 // EEPROM R/W workaround
4876 tmpU1b = read_nic_byte(dev, MAC_PINMUX_CFG);
4877 write_nic_byte(dev, MAC_PINMUX_CFG, tmpU1b&(~GPIOMUX_EN));
4881 //<Roger_Notes> 2008.08.19.
4882 // We return status here for temporal FPGA verification, 2008.08.19.
4884 #ifdef RTL8192SU_FW_IQK
4885 write_nic_dword(dev, WFM5, FW_IQK_ENABLE);
4886 ChkFwCmdIoDone(dev);
4890 // <Roger_Notes> We enable high power mechanism after NIC initialized.
4893 write_nic_dword(dev, WFM5, FW_RA_RESET);
4894 ChkFwCmdIoDone(dev);
4895 write_nic_dword(dev, WFM5, FW_RA_ACTIVE);
4896 ChkFwCmdIoDone(dev);
4897 write_nic_dword(dev, WFM5, FW_RA_REFRESH);
4898 ChkFwCmdIoDone(dev);
4899 write_nic_dword(dev, WFM5, FW_BB_RESET_ENABLE);
4901 // <Roger_Notes> We return status here for temporal FPGA verification. 2008.05.12.
4908 /***************************************************************************
4909 -------------------------------NET STUFF---------------------------
4910 ***************************************************************************/
4912 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
4914 struct r8192_priv *priv = ieee80211_priv(dev);
4916 return &priv->ieee80211->stats;
4920 HalTxCheckStuck819xUsb(
4921 struct net_device *dev
4924 struct r8192_priv *priv = ieee80211_priv(dev);
4925 u16 RegTxCounter = read_nic_word(dev, 0x128);
4926 bool bStuck = FALSE;
4927 RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
4928 if(priv->TxCounter==RegTxCounter)
4931 priv->TxCounter = RegTxCounter;
4937 * <Assumption: RT_TX_SPINLOCK is acquired.>
4938 * First added: 2006.11.19 by emily
4941 TxCheckStuck(struct net_device *dev)
4943 struct r8192_priv *priv = ieee80211_priv(dev);
4946 // u8 ResetThreshold;
4947 bool bCheckFwTxCnt = false;
4948 //unsigned long flags;
4951 // Decide Stuch threshold according to current power save mode
4954 // RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
4955 // PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
4956 // spin_lock_irqsave(&priv->ieee80211->lock,flags);
4957 for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
4959 if(QueueID == TXCMD_QUEUE)
4962 if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
4966 bCheckFwTxCnt = true;
4968 // PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
4969 // spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
4970 // RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
4974 if(HalTxCheckStuck819xUsb(dev))
4976 RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
4977 return RESET_TYPE_SILENT;
4981 return RESET_TYPE_NORESET;
4985 HalRxCheckStuck819xUsb(struct net_device *dev)
4987 u16 RegRxCounter = read_nic_word(dev, 0x130);
4988 struct r8192_priv *priv = ieee80211_priv(dev);
4989 bool bStuck = FALSE;
4993 static u8 rx_chk_cnt = 0;
4994 RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
4995 // If rssi is small, we should check rx for long time because of bad rx.
4996 // or maybe it will continuous silent reset every 2 seconds.
4998 if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
5000 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
5002 else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
5003 ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
5004 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
5015 else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
5016 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
5017 priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
5021 //DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
5027 //DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
5034 //DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
5040 //DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
5045 if(priv->RxCounter==RegRxCounter)
5048 priv->RxCounter = RegRxCounter;
5054 RxCheckStuck(struct net_device *dev)
5056 struct r8192_priv *priv = ieee80211_priv(dev);
5058 bool bRxCheck = FALSE;
5060 // RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
5061 //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
5063 if(priv->IrpPendingCount > 1)
5065 //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
5067 // RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
5070 if(HalRxCheckStuck819xUsb(dev))
5072 RT_TRACE(COMP_RESET, "RxStuck Condition\n");
5073 return RESET_TYPE_SILENT;
5076 return RESET_TYPE_NORESET;
5081 * This function is called by Checkforhang to check whether we should ask OS to reset driver
5083 * \param pAdapter The adapter context for this miniport
5085 * Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
5086 * to judge whether there is tx stuck.
5087 * Note: This function may be required to be rewrite for Vista OS.
5088 * <<<Assumption: Tx spinlock has been acquired >>>
5090 * 8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
5093 rtl819x_ifcheck_resetornot(struct net_device *dev)
5095 struct r8192_priv *priv = ieee80211_priv(dev);
5096 RESET_TYPE TxResetType = RESET_TYPE_NORESET;
5097 RESET_TYPE RxResetType = RESET_TYPE_NORESET;
5098 RT_RF_POWER_STATE rfState;
5100 return RESET_TYPE_NORESET;
5102 rfState = priv->ieee80211->eRFPowerState;
5104 TxResetType = TxCheckStuck(dev);
5106 if( rfState != eRfOff ||
5107 /*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
5108 (priv->ieee80211->iw_mode != IW_MODE_ADHOC))
5110 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
5111 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
5112 // if driver is in firmware download failure status, driver should initialize RF in the following
5113 // silent reset procedure Emily, 2008.01.21
5115 // Driver should not check RX stuck in IBSS mode because it is required to
5116 // set Check BSSID in order to send beacon, however, if check BSSID is
5117 // set, STA cannot hear any packet a all. Emily, 2008.04.12
5118 RxResetType = RxCheckStuck(dev);
5121 if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
5122 return RESET_TYPE_NORMAL;
5123 else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
5124 RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
5125 return RESET_TYPE_SILENT;
5128 return RESET_TYPE_NORESET;
5132 void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
5133 int _rtl8192_up(struct net_device *dev);
5134 int rtl8192_close(struct net_device *dev);
5139 CamRestoreAllEntry( struct net_device *dev)
5142 struct r8192_priv *priv = ieee80211_priv(dev);
5143 u8* MacAddr = priv->ieee80211->current_network.bssid;
5145 static u8 CAM_CONST_ADDR[4][6] = {
5146 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
5147 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
5148 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
5149 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
5150 static u8 CAM_CONST_BROAD[] =
5151 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
5153 RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
5156 if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
5157 (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
5160 for(EntryId=0; EntryId<4; EntryId++)
5163 MacAddr = CAM_CONST_ADDR[EntryId];
5167 priv->ieee80211->pairwise_key_type,
5175 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
5179 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5183 priv->ieee80211->pairwise_key_type,
5191 priv->ieee80211->pairwise_key_type,
5197 else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
5201 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5205 priv->ieee80211->pairwise_key_type,
5213 priv->ieee80211->pairwise_key_type,
5222 if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
5224 MacAddr = CAM_CONST_BROAD;
5225 for(EntryId=1 ; EntryId<4 ; EntryId++)
5231 priv->ieee80211->group_key_type,
5237 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5241 priv->ieee80211->group_key_type,
5246 else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
5248 MacAddr = CAM_CONST_BROAD;
5249 for(EntryId=1; EntryId<4 ; EntryId++)
5255 priv->ieee80211->group_key_type,
5262 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5266 priv->ieee80211->group_key_type,
5272 //////////////////////////////////////////////////////////////
5273 // This function is used to fix Tx/Rx stop bug temporarily.
5274 // This function will do "system reset" to NIC when Tx or Rx is stuck.
5275 // The method checking Tx/Rx stuck of this function is supported by FW,
5276 // which reports Tx and Rx counter to register 0x128 and 0x130.
5277 //////////////////////////////////////////////////////////////
5279 rtl819x_ifsilentreset(struct net_device *dev)
5281 //OCTET_STRING asocpdu;
5282 struct r8192_priv *priv = ieee80211_priv(dev);
5284 int reset_status = 0;
5285 struct ieee80211_device *ieee = priv->ieee80211;
5288 // 2007.07.20. If we need to check CCK stop, please uncomment this line.
5289 //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
5291 if(priv->ResetProgress==RESET_TYPE_NORESET)
5295 RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
5297 // Set the variable for reset.
5298 priv->ResetProgress = RESET_TYPE_SILENT;
5299 // rtl8192_close(dev);
5301 down(&priv->wx_sem);
5304 RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
5309 RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
5310 // if(!netif_queue_stopped(dev))
5311 // netif_stop_queue(dev);
5313 rtl8192_rtx_disable(dev);
5314 rtl8192_cancel_deferred_work(priv);
5316 del_timer_sync(&priv->watch_dog_timer);
5318 ieee->sync_scan_hurryup = 1;
5319 if(ieee->state == IEEE80211_LINKED)
5321 down(&ieee->wx_sem);
5322 printk("ieee->state is IEEE80211_LINKED\n");
5323 ieee80211_stop_send_beacons(priv->ieee80211);
5324 del_timer_sync(&ieee->associate_timer);
5325 cancel_delayed_work(&ieee->associate_retry_wq);
5326 ieee80211_stop_scan(ieee);
5327 netif_carrier_off(dev);
5331 printk("ieee->state is NOT LINKED\n");
5332 ieee80211_softmac_stop_protocol(priv->ieee80211); }
5334 RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
5335 //rtl8192_irq_disable(dev);
5336 RT_TRACE(COMP_RESET,"%s():===========>start to up the driver\n",__FUNCTION__);
5337 reset_status = _rtl8192_up(dev);
5339 RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
5340 if(reset_status == -EAGAIN)
5349 RT_TRACE(COMP_ERR," ERR!!! %s(): Reset Failed!!\n", __FUNCTION__);
5353 ieee->is_silent_reset = 1;
5355 EnableHWSecurityConfig8192(dev);
5357 if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
5359 ieee->set_chan(ieee->dev, ieee->current_network.channel);
5362 queue_work(ieee->wq, &ieee->associate_complete_wq);
5366 else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
5368 ieee->set_chan(ieee->dev, ieee->current_network.channel);
5369 ieee->link_change(ieee->dev);
5371 // notify_wx_assoc_event(ieee);
5373 ieee80211_start_send_beacons(ieee);
5375 if (ieee->data_hard_resume)
5376 ieee->data_hard_resume(ieee->dev);
5377 netif_carrier_on(ieee->dev);
5381 CamRestoreAllEntry(dev);
5383 priv->ResetProgress = RESET_TYPE_NORESET;
5384 priv->reset_count++;
5386 priv->bForcedSilentReset =false;
5387 priv->bResetInProgress = false;
5389 // For test --> force write UFWP.
5390 write_nic_byte(dev, UFWP, 1);
5391 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
5396 void CAM_read_entry(
5397 struct net_device *dev,
5401 u32 target_command=0;
5402 u32 target_content=0;
5406 // printk("=======>start read CAM\n");
5407 for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
5409 // polling bit, and No Write enable, and address
5410 target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
5411 target_command= target_command | BIT31;
5413 //Check polling bit is clear
5418 ulStatus = read_nic_dword(dev, RWCAM);
5419 if(ulStatus & BIT31){
5427 write_nic_dword(dev, RWCAM, target_command);
5428 RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
5429 // printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
5430 target_content = read_nic_dword(dev, RCAMO);
5431 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
5432 // printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
5437 void rtl819x_update_rxcounts(
5438 struct r8192_priv *priv,
5447 *TotalRxDataNum = 0;
5449 SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
5450 priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
5451 priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
5452 for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
5453 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
5454 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
5458 void rtl819x_watchdog_wqcallback(struct work_struct *work)
5460 struct delayed_work *dwork = container_of(work,
5461 struct delayed_work,
5463 struct r8192_priv *priv = container_of(dwork,
5466 struct net_device *dev = priv->ieee80211->dev;
5467 struct ieee80211_device* ieee = priv->ieee80211;
5468 RESET_TYPE ResetType = RESET_TYPE_NORESET;
5469 static u8 check_reset_cnt;
5470 u32 TotalRxBcnNum = 0;
5471 u32 TotalRxDataNum = 0;
5472 bool bBusyTraffic = false;
5476 hal_dm_watchdog(dev);
5477 /* to get busy traffic condition */
5478 if (ieee->state == IEEE80211_LINKED) {
5479 if (ieee->LinkDetectInfo.NumRxOkInPeriod > 666 ||
5480 ieee->LinkDetectInfo.NumTxOkInPeriod > 666)
5481 bBusyTraffic = true;
5483 ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
5484 ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
5485 ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
5488 if (priv->ieee80211->state == IEEE80211_LINKED &&
5489 priv->ieee80211->iw_mode == IW_MODE_INFRA) {
5490 rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
5491 if ((TotalRxBcnNum + TotalRxDataNum) == 0) {
5492 RT_TRACE(COMP_ERR, "%s(): AP is powered off,"
5493 "connect another one\n", __func__);
5494 /* Dot11d_Reset(dev); */
5495 priv->ieee80211->state = IEEE80211_ASSOCIATING;
5496 notify_wx_assoc_event(priv->ieee80211);
5497 RemovePeerTS(priv->ieee80211,
5498 priv->ieee80211->current_network.bssid);
5499 ieee->is_roaming = true;
5500 priv->ieee80211->link_change(dev);
5501 if(ieee->LedControlHandler != NULL)
5502 ieee->LedControlHandler(ieee->dev,
5503 LED_CTL_START_TO_LINK);
5504 queue_work(priv->ieee80211->wq,
5505 &priv->ieee80211->associate_procedure_wq);
5508 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod = 0;
5509 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod = 0;
5512 * CAM_read_entry(dev,4);
5513 * check if reset the driver
5515 if (check_reset_cnt++ >= 3 && !ieee->is_roaming) {
5516 ResetType = rtl819x_ifcheck_resetornot(dev);
5517 check_reset_cnt = 3;
5519 if ((priv->force_reset) || (priv->ResetProgress == RESET_TYPE_NORESET &&
5520 (priv->bForcedSilentReset ||
5521 (!priv->bDisableNormalResetCheck &&
5522 /* This is control by OID set in Pomelo */
5523 ResetType == RESET_TYPE_SILENT)))) {
5524 RT_TRACE(COMP_RESET, "%s(): priv->force_reset is %d,"
5525 "priv->ResetProgress is %d, "
5526 "priv->bForcedSilentReset is %d, "
5527 "priv->bDisableNormalResetCheck is %d, "
5531 priv->ResetProgress,
5532 priv->bForcedSilentReset,
5533 priv->bDisableNormalResetCheck,
5535 rtl819x_ifsilentreset(dev);
5537 priv->force_reset = false;
5538 priv->bForcedSilentReset = false;
5539 priv->bResetInProgress = false;
5542 void watch_dog_timer_callback(unsigned long data)
5544 struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
5545 //printk("===============>watch_dog timer\n");
5546 queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
5547 mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
5549 int _rtl8192_up(struct net_device *dev)
5551 struct r8192_priv *priv = ieee80211_priv(dev);
5553 int init_status = 0;
5555 priv->ieee80211->ieee_up=1;
5556 RT_TRACE(COMP_INIT, "Bringing up iface");
5557 init_status = priv->ops->rtl819x_adapter_start(dev);
5560 RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n", __FUNCTION__);
5561 priv->up=priv->ieee80211->ieee_up = 0;
5564 RT_TRACE(COMP_INIT, "start adapter finished\n");
5565 rtl8192_rx_enable(dev);
5566 // rtl8192_tx_enable(dev);
5567 if(priv->ieee80211->state != IEEE80211_LINKED)
5568 ieee80211_softmac_start_protocol(priv->ieee80211);
5569 ieee80211_reset_queue(priv->ieee80211);
5570 watch_dog_timer_callback((unsigned long) dev);
5571 if(!netif_queue_stopped(dev))
5572 netif_start_queue(dev);
5574 netif_wake_queue(dev);
5577 * Make sure that drop_unencrypted is initialized as "0"
5578 * No packets will be sent in non-security mode if we had set drop_unencrypted.
5579 * ex, After kill wpa_supplicant process, make the driver up again.
5580 * drop_unencrypted remains as "1", which is set by wpa_supplicant. 2008/12/04.john
5582 priv->ieee80211->drop_unencrypted = 0;
5588 int rtl8192_open(struct net_device *dev)
5590 struct r8192_priv *priv = ieee80211_priv(dev);
5592 down(&priv->wx_sem);
5593 ret = rtl8192_up(dev);
5600 int rtl8192_up(struct net_device *dev)
5602 struct r8192_priv *priv = ieee80211_priv(dev);
5604 if (priv->up == 1) return -1;
5606 return _rtl8192_up(dev);
5610 int rtl8192_close(struct net_device *dev)
5612 struct r8192_priv *priv = ieee80211_priv(dev);
5615 down(&priv->wx_sem);
5617 ret = rtl8192_down(dev);
5625 int rtl8192_down(struct net_device *dev)
5627 struct r8192_priv *priv = ieee80211_priv(dev);
5630 if (priv->up == 0) return -1;
5633 priv->ieee80211->ieee_up = 0;
5634 RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
5636 if (!netif_queue_stopped(dev))
5637 netif_stop_queue(dev);
5639 rtl8192_rtx_disable(dev);
5640 //rtl8192_irq_disable(dev);
5642 /* Tx related queue release */
5643 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5644 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
5646 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5647 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
5650 for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5651 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
5654 //as cancel_delayed_work will del work->timer, so if work is not definedas struct delayed_work, it will corrupt
5655 // flush_scheduled_work();
5656 rtl8192_cancel_deferred_work(priv);
5658 del_timer_sync(&priv->watch_dog_timer);
5661 ieee80211_softmac_stop_protocol(priv->ieee80211);
5662 memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
5663 RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
5669 void rtl8192_commit(struct net_device *dev)
5671 struct r8192_priv *priv = ieee80211_priv(dev);
5672 int reset_status = 0;
5673 //u8 reset_times = 0;
5674 if (priv->up == 0) return ;
5677 rtl8192_cancel_deferred_work(priv);
5678 del_timer_sync(&priv->watch_dog_timer);
5679 //cancel_delayed_work(&priv->SwChnlWorkItem);
5681 ieee80211_softmac_stop_protocol(priv->ieee80211);
5683 //rtl8192_irq_disable(dev);
5684 rtl8192_rtx_disable(dev);
5685 reset_status = _rtl8192_up(dev);
5690 void rtl8192_restart(struct net_device *dev)
5692 struct r8192_priv *priv = ieee80211_priv(dev);
5694 void rtl8192_restart(struct work_struct *work)
5696 struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
5697 struct net_device *dev = priv->ieee80211->dev;
5699 down(&priv->wx_sem);
5701 rtl8192_commit(dev);
5706 static void r8192_set_multicast(struct net_device *dev)
5708 struct r8192_priv *priv = ieee80211_priv(dev);
5711 //down(&priv->wx_sem);
5715 promisc = (dev->flags & IFF_PROMISC) ? 1:0;
5717 if (promisc != priv->promisc)
5718 // rtl8192_commit(dev);
5720 priv->promisc = promisc;
5722 //schedule_work(&priv->reset_wq);
5723 //up(&priv->wx_sem);
5727 int r8192_set_mac_adr(struct net_device *dev, void *mac)
5729 struct r8192_priv *priv = ieee80211_priv(dev);
5730 struct sockaddr *addr = mac;
5732 down(&priv->wx_sem);
5734 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
5736 schedule_work(&priv->reset_wq);
5743 /* based on ipw2200 driver */
5744 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5746 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5747 struct iwreq *wrq = (struct iwreq *)rq;
5749 struct ieee80211_device *ieee = priv->ieee80211;
5751 u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
5752 u8 zero_addr[6] = {0};
5753 struct iw_point *p = &wrq->u.data;
5754 struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
5756 down(&priv->wx_sem);
5759 if (p->length < sizeof(struct ieee_param) || !p->pointer){
5764 ipw = kmalloc(p->length, GFP_KERNEL);
5769 if (copy_from_user(ipw, p->pointer, p->length)) {
5776 case RTL_IOCTL_WPA_SUPPLICANT:
5777 //parse here for HW security
5778 if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
5780 if (ipw->u.crypt.set_tx)
5782 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
5783 ieee->pairwise_key_type = KEY_TYPE_CCMP;
5784 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
5785 ieee->pairwise_key_type = KEY_TYPE_TKIP;
5786 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
5788 if (ipw->u.crypt.key_len == 13)
5789 ieee->pairwise_key_type = KEY_TYPE_WEP104;
5790 else if (ipw->u.crypt.key_len == 5)
5791 ieee->pairwise_key_type = KEY_TYPE_WEP40;
5794 ieee->pairwise_key_type = KEY_TYPE_NA;
5796 if (ieee->pairwise_key_type)
5798 // 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
5799 if (memcmp(ieee->ap_mac_addr, zero_addr, 6) == 0)
5800 ieee->iw_mode = IW_MODE_ADHOC;
5801 memcpy((u8*)key, ipw->u.crypt.key, 16);
5802 EnableHWSecurityConfig8192(dev);
5803 //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!
5805 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
5806 if (ieee->iw_mode == IW_MODE_ADHOC)
5807 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
5810 else //if (ipw->u.crypt.idx) //group key use idx > 0
5812 memcpy((u8*)key, ipw->u.crypt.key, 16);
5813 if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
5814 ieee->group_key_type= KEY_TYPE_CCMP;
5815 else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
5816 ieee->group_key_type = KEY_TYPE_TKIP;
5817 else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
5819 if (ipw->u.crypt.key_len == 13)
5820 ieee->group_key_type = KEY_TYPE_WEP104;
5821 else if (ipw->u.crypt.key_len == 5)
5822 ieee->group_key_type = KEY_TYPE_WEP40;
5825 ieee->group_key_type = KEY_TYPE_NA;
5827 if (ieee->group_key_type)
5831 ipw->u.crypt.idx, //KeyIndex
5832 ieee->group_key_type, //KeyType
5833 broadcast_addr, //MacAddr
5839 #ifdef JOHN_HWSEC_DEBUG
5841 printk("@@ wrq->u pointer = ");
5842 for(i=0;i<wrq->u.data.length;i++){
5843 if(i%10==0) printk("\n");
5844 printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
5847 #endif /*JOHN_HWSEC_DEBUG*/
5848 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
5862 u8 rtl8192SU_HwRateToMRate(bool bIsHT, u8 rate,bool bFirstAMPDU)
5874 case DESC92S_RATE1M: ret_rate = MGN_1M; break;
5875 case DESC92S_RATE2M: ret_rate = MGN_2M; break;
5876 case DESC92S_RATE5_5M: ret_rate = MGN_5_5M; break;
5877 case DESC92S_RATE11M: ret_rate = MGN_11M; break;
5878 case DESC92S_RATE6M: ret_rate = MGN_6M; break;
5879 case DESC92S_RATE9M: ret_rate = MGN_9M; break;
5880 case DESC92S_RATE12M: ret_rate = MGN_12M; break;
5881 case DESC92S_RATE18M: ret_rate = MGN_18M; break;
5882 case DESC92S_RATE24M: ret_rate = MGN_24M; break;
5883 case DESC92S_RATE36M: ret_rate = MGN_36M; break;
5884 case DESC92S_RATE48M: ret_rate = MGN_48M; break;
5885 case DESC92S_RATE54M: ret_rate = MGN_54M; break;
5888 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
5897 case DESC92S_RATEMCS0: ret_rate = MGN_MCS0; break;
5898 case DESC92S_RATEMCS1: ret_rate = MGN_MCS1; break;
5899 case DESC92S_RATEMCS2: ret_rate = MGN_MCS2; break;
5900 case DESC92S_RATEMCS3: ret_rate = MGN_MCS3; break;
5901 case DESC92S_RATEMCS4: ret_rate = MGN_MCS4; break;
5902 case DESC92S_RATEMCS5: ret_rate = MGN_MCS5; break;
5903 case DESC92S_RATEMCS6: ret_rate = MGN_MCS6; break;
5904 case DESC92S_RATEMCS7: ret_rate = MGN_MCS7; break;
5905 case DESC92S_RATEMCS8: ret_rate = MGN_MCS8; break;
5906 case DESC92S_RATEMCS9: ret_rate = MGN_MCS9; break;
5907 case DESC92S_RATEMCS10: ret_rate = MGN_MCS10; break;
5908 case DESC92S_RATEMCS11: ret_rate = MGN_MCS11; break;
5909 case DESC92S_RATEMCS12: ret_rate = MGN_MCS12; break;
5910 case DESC92S_RATEMCS13: ret_rate = MGN_MCS13; break;
5911 case DESC92S_RATEMCS14: ret_rate = MGN_MCS14; break;
5912 case DESC92S_RATEMCS15: ret_rate = MGN_MCS15; break;
5913 case DESC92S_RATEMCS32: ret_rate = (0x80|0x20); break;
5916 RT_TRACE(COMP_RECV, "HwRateToMRate92S(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT );
5927 case DESC92S_RATE1M: ret_rate = MGN_1M; break;
5928 case DESC92S_RATE2M: ret_rate = MGN_2M; break;
5929 case DESC92S_RATE5_5M: ret_rate = MGN_5_5M; break;
5930 case DESC92S_RATE11M: ret_rate = MGN_11M; break;
5931 case DESC92S_RATE6M: ret_rate = MGN_6M; break;
5932 case DESC92S_RATE9M: ret_rate = MGN_9M; break;
5933 case DESC92S_RATE12M: ret_rate = MGN_12M; break;
5934 case DESC92S_RATE18M: ret_rate = MGN_18M; break;
5935 case DESC92S_RATE24M: ret_rate = MGN_24M; break;
5936 case DESC92S_RATE36M: ret_rate = MGN_36M; break;
5937 case DESC92S_RATE48M: ret_rate = MGN_48M; break;
5938 case DESC92S_RATE54M: ret_rate = MGN_54M; break;
5939 case DESC92S_RATEMCS0: ret_rate = MGN_MCS0; break;
5940 case DESC92S_RATEMCS1: ret_rate = MGN_MCS1; break;
5941 case DESC92S_RATEMCS2: ret_rate = MGN_MCS2; break;
5942 case DESC92S_RATEMCS3: ret_rate = MGN_MCS3; break;
5943 case DESC92S_RATEMCS4: ret_rate = MGN_MCS4; break;
5944 case DESC92S_RATEMCS5: ret_rate = MGN_MCS5; break;
5945 case DESC92S_RATEMCS6: ret_rate = MGN_MCS6; break;
5946 case DESC92S_RATEMCS7: ret_rate = MGN_MCS7; break;
5947 case DESC92S_RATEMCS8: ret_rate = MGN_MCS8; break;
5948 case DESC92S_RATEMCS9: ret_rate = MGN_MCS9; break;
5949 case DESC92S_RATEMCS10: ret_rate = MGN_MCS10; break;
5950 case DESC92S_RATEMCS11: ret_rate = MGN_MCS11; break;
5951 case DESC92S_RATEMCS12: ret_rate = MGN_MCS12; break;
5952 case DESC92S_RATEMCS13: ret_rate = MGN_MCS13; break;
5953 case DESC92S_RATEMCS14: ret_rate = MGN_MCS14; break;
5954 case DESC92S_RATEMCS15: ret_rate = MGN_MCS15; break;
5955 case DESC92S_RATEMCS32: ret_rate = (0x80|0x20); break;
5958 RT_TRACE(COMP_RECV, "HwRateToMRate92S(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT );
5965 u8 HwRateToMRate90(bool bIsHT, u8 rate)
5971 case DESC90_RATE1M: ret_rate = MGN_1M; break;
5972 case DESC90_RATE2M: ret_rate = MGN_2M; break;
5973 case DESC90_RATE5_5M: ret_rate = MGN_5_5M; break;
5974 case DESC90_RATE11M: ret_rate = MGN_11M; break;
5975 case DESC90_RATE6M: ret_rate = MGN_6M; break;
5976 case DESC90_RATE9M: ret_rate = MGN_9M; break;
5977 case DESC90_RATE12M: ret_rate = MGN_12M; break;
5978 case DESC90_RATE18M: ret_rate = MGN_18M; break;
5979 case DESC90_RATE24M: ret_rate = MGN_24M; break;
5980 case DESC90_RATE36M: ret_rate = MGN_36M; break;
5981 case DESC90_RATE48M: ret_rate = MGN_48M; break;
5982 case DESC90_RATE54M: ret_rate = MGN_54M; break;
5986 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
5992 case DESC90_RATEMCS0: ret_rate = MGN_MCS0; break;
5993 case DESC90_RATEMCS1: ret_rate = MGN_MCS1; break;
5994 case DESC90_RATEMCS2: ret_rate = MGN_MCS2; break;
5995 case DESC90_RATEMCS3: ret_rate = MGN_MCS3; break;
5996 case DESC90_RATEMCS4: ret_rate = MGN_MCS4; break;
5997 case DESC90_RATEMCS5: ret_rate = MGN_MCS5; break;
5998 case DESC90_RATEMCS6: ret_rate = MGN_MCS6; break;
5999 case DESC90_RATEMCS7: ret_rate = MGN_MCS7; break;
6000 case DESC90_RATEMCS8: ret_rate = MGN_MCS8; break;
6001 case DESC90_RATEMCS9: ret_rate = MGN_MCS9; break;
6002 case DESC90_RATEMCS10: ret_rate = MGN_MCS10; break;
6003 case DESC90_RATEMCS11: ret_rate = MGN_MCS11; break;
6004 case DESC90_RATEMCS12: ret_rate = MGN_MCS12; break;
6005 case DESC90_RATEMCS13: ret_rate = MGN_MCS13; break;
6006 case DESC90_RATEMCS14: ret_rate = MGN_MCS14; break;
6007 case DESC90_RATEMCS15: ret_rate = MGN_MCS15; break;
6008 case DESC90_RATEMCS32: ret_rate = (0x80|0x20); break;
6012 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
6021 * Function: UpdateRxPktTimeStamp
6022 * Overview: Recored down the TSF time stamp when receiving a packet
6030 * (pRfd->Status.TimeStampHigh is updated)
6031 * (pRfd->Status.TimeStampLow is updated)
6035 void UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
6037 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6039 if(stats->bIsAMPDU && !stats->bFirstMPDU) {
6040 stats->mac_time[0] = priv->LastRxDescTSFLow;
6041 stats->mac_time[1] = priv->LastRxDescTSFHigh;
6043 priv->LastRxDescTSFLow = stats->mac_time[0];
6044 priv->LastRxDescTSFHigh = stats->mac_time[1];
6050 long rtl819x_translate_todbm(u8 signal_strength_index )// 0-100 index.
6052 long signal_power; // in dBm.
6054 // Translate to dBm (x=0.5y-95).
6055 signal_power = (long)((signal_strength_index + 1) >> 1);
6058 return signal_power;
6062 /* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
6063 be a local static. Otherwise, it may increase when we return from S3/S4. The
6064 value will be kept in memory or disk. We must delcare the value in adapter
6065 and it will be reinitialized when return from S3/S4. */
6066 void rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
6068 bool bcheck = false;
6070 u32 nspatial_stream, tmp_val;
6072 static u32 slide_rssi_index=0, slide_rssi_statistics=0;
6073 static u32 slide_evm_index=0, slide_evm_statistics=0;
6074 static u32 last_rssi=0, last_evm=0;
6076 static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
6077 static u32 last_beacon_adc_pwdb=0;
6079 struct ieee80211_hdr_3addr *hdr;
6081 unsigned int frag,seq;
6082 hdr = (struct ieee80211_hdr_3addr *)buffer;
6083 sc = le16_to_cpu(hdr->seq_ctrl);
6084 frag = WLAN_GET_SEQ_FRAG(sc);
6085 seq = WLAN_GET_SEQ_SEQ(sc);
6086 //cosa add 04292008 to record the sequence number
6087 pcurrent_stats->Seq_Num = seq;
6089 // Check whether we should take the previous packet into accounting
6091 if(!pprevious_stats->bIsAMPDU)
6093 // if previous packet is not aggregated packet
6100 if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
6102 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
6103 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
6104 priv->stats.slide_rssi_total -= last_rssi;
6106 priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
6108 priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
6109 if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
6110 slide_rssi_index = 0;
6112 // <1> Showed on UI for user, in dbm
6113 tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
6114 priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
6115 pcurrent_stats->rssi = priv->stats.signal_strength;
6117 // If the previous packet does not match the criteria, neglect it
6119 if(!pprevious_stats->bPacketMatchBSSID)
6121 if(!pprevious_stats->bToSelfBA)
6129 //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
6134 priv->stats.num_process_phyinfo++;
6136 /* record the general signal strength to the sliding window. */
6139 // <2> Showed on UI for engineering
6140 // hardware does not provide rssi information for each rf path in CCK
6141 if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
6143 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
6145 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
6148 //Fixed by Jacken 2008-03-20
6149 if(priv->stats.rx_rssi_percentage[rfpath] == 0)
6151 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
6152 //DbgPrint("MIMO RSSI initialize \n");
6154 if(pprevious_stats->RxMIMOSignalStrength[rfpath] > priv->stats.rx_rssi_percentage[rfpath])
6156 priv->stats.rx_rssi_percentage[rfpath] =
6157 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
6158 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
6159 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath] + 1;
6163 priv->stats.rx_rssi_percentage[rfpath] =
6164 ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
6165 (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
6167 RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath] = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
6175 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
6176 pprevious_stats->bIsCCK? "CCK": "OFDM",
6177 pprevious_stats->RxPWDBAll);
6179 if(pprevious_stats->bPacketBeacon)
6181 /* record the beacon pwdb to the sliding window. */
6182 if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
6184 slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
6185 last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
6186 priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
6187 //DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
6188 // slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
6190 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
6191 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
6192 //DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
6193 slide_beacon_adc_pwdb_index++;
6194 if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
6195 slide_beacon_adc_pwdb_index = 0;
6196 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
6197 if(pprevious_stats->RxPWDBAll >= 3)
6198 pprevious_stats->RxPWDBAll -= 3;
6201 RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
6202 pprevious_stats->bIsCCK? "CCK": "OFDM",
6203 pprevious_stats->RxPWDBAll);
6206 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
6208 if(priv->undecorated_smoothed_pwdb < 0) // initialize
6210 priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
6211 //DbgPrint("First pwdb initialize \n");
6214 if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
6216 priv->undecorated_smoothed_pwdb =
6217 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
6218 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
6219 priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
6223 priv->undecorated_smoothed_pwdb =
6224 ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
6225 (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
6228 //Fixed by Jacken 2008-03-20
6229 if(pPreviousRfd->Status.RxPWDBAll > (u32)pHalData->UndecoratedSmoothedPWDB)
6231 pHalData->UndecoratedSmoothedPWDB =
6232 ( ((pHalData->UndecoratedSmoothedPWDB)* 5) + (pPreviousRfd->Status.RxPWDBAll)) / 6;
6233 pHalData->UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB + 1;
6237 pHalData->UndecoratedSmoothedPWDB =
6238 ( ((pHalData->UndecoratedSmoothedPWDB)* 5) + (pPreviousRfd->Status.RxPWDBAll)) / 6;
6247 /* record the general EVM to the sliding window. */
6248 if(pprevious_stats->SignalQuality == 0)
6253 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
6254 if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
6255 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
6256 last_evm = priv->stats.slide_evm[slide_evm_index];
6257 priv->stats.slide_evm_total -= last_evm;
6260 priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
6262 priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
6263 if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
6264 slide_evm_index = 0;
6266 // <1> Showed on UI for user, in percentage.
6267 tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
6268 priv->stats.signal_quality = tmp_val;
6269 //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
6270 priv->stats.last_signal_strength_inpercent = tmp_val;
6273 // <2> Showed on UI for engineering
6274 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
6276 for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
6278 if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
6280 if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
6282 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
6284 priv->stats.rx_evm_percentage[nspatial_stream] =
6285 ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
6286 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
6295 /*-----------------------------------------------------------------------------
6296 * Function: rtl819x_query_rxpwrpercentage()
6300 * Input: char antpower
6304 * Return: 0-100 percentage
6308 * 05/26/2008 amy Create Version 0 porting from windows code.
6310 *---------------------------------------------------------------------------*/
6311 static u8 rtl819x_query_rxpwrpercentage(
6315 if ((antpower <= -100) || (antpower >= 20))
6319 else if (antpower >= 0)
6325 return (100+antpower);
6328 } /* QueryRxPwrPercentage */
6331 rtl819x_evm_dbtopercentage(
6343 ret_val = 0 - ret_val;
6351 // We want good-looking for signal strength/quality
6352 // 2007/7/19 01:09, by cosa.
6355 rtl819x_signal_scale_mapping(
6361 // Step 1. Scale mapping.
6362 if(currsig >= 61 && currsig <= 100)
6364 retsig = 90 + ((currsig - 60) / 4);
6366 else if(currsig >= 41 && currsig <= 60)
6368 retsig = 78 + ((currsig - 40) / 2);
6370 else if(currsig >= 31 && currsig <= 40)
6372 retsig = 66 + (currsig - 30);
6374 else if(currsig >= 21 && currsig <= 30)
6376 retsig = 54 + (currsig - 20);
6378 else if(currsig >= 5 && currsig <= 20)
6380 retsig = 42 + (((currsig - 5) * 2) / 3);
6382 else if(currsig == 4)
6386 else if(currsig == 3)
6390 else if(currsig == 2)
6394 else if(currsig == 1)
6406 /*-----------------------------------------------------------------------------
6407 * Function: QueryRxPhyStatus8192S()
6419 * 06/01/2007 MHC Create Version 0.
6420 * 06/05/2007 MHC Accordign to HW's new data sheet, we add CCK and OFDM
6421 * descriptor definition.
6422 * 07/04/2007 MHC According to Jerry and Bryant's document. We read
6423 * ir_isolation and ext_lna for RF's init value and use
6424 * to compensate RSSI after receiving packets.
6425 * 09/10/2008 MHC Modify name and PHY status field for 92SE.
6426 * 09/19/2008 MHC Add CCK/OFDM SS/SQ for 92S series.
6428 *---------------------------------------------------------------------------*/
6429 static void rtl8192SU_query_rxphystatus(
6430 struct r8192_priv * priv,
6431 struct ieee80211_rx_stats * pstats,
6432 rx_desc_819x_usb *pDesc,
6433 rx_drvinfo_819x_usb * pdrvinfo,
6434 struct ieee80211_rx_stats * precord_stats,
6435 bool bpacket_match_bssid,
6436 bool bpacket_toself,
6441 //PRT_RFD_STATUS pRtRfdStatus = &(pRfd->Status);
6442 //PHY_STS_CCK_8192S_T *pCck_buf;
6443 phy_sts_cck_819xusb_t * pcck_buf;
6444 phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
6446 //u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
6447 u8 i, max_spatial_stream, rxsc_sgien_exflg;
6448 char rx_pwr[4], rx_pwr_all=0;
6449 //long rx_avg_pwr = 0;
6450 //char rx_snrX, rx_evmX;
6452 u32 RSSI, total_rssi=0;//, total_evm=0;
6453 // long signal_strength_index = 0;
6459 priv->stats.numqry_phystatus++;
6461 is_cck_rate = rx_hal_is_cck_rate(pDesc);
6463 // Record it for next packet processing
6464 memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
6465 pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
6466 pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
6467 pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
6468 pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
6469 pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
6472 pstats->RxMIMOSignalQuality[0] = -1;
6473 pstats->RxMIMOSignalQuality[1] = -1;
6474 precord_stats->RxMIMOSignalQuality[0] = -1;
6475 precord_stats->RxMIMOSignalQuality[1] = -1;
6479 u8 report;//, tmp_pwdb;
6480 //char cck_adc_pwdb[4];
6482 // CCK Driver info Structure is not the same as OFDM packet.
6483 pcck_buf = (phy_sts_cck_819xusb_t *)pdrvinfo;
6486 // (1)Hardware does not provide RSSI for CCK
6490 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
6493 priv->stats.numqry_phystatusCCK++;
6495 if(!priv->bCckHighPower)
6497 report = pcck_buf->cck_agc_rpt & 0xc0;
6501 //Fixed by Jacken from Bryant 2008-03-20
6502 //Original value is -38 , -26 , -14 , -2
6503 //Fixed value is -35 , -23 , -11 , 6
6505 rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
6508 rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
6511 rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
6514 rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);//6->8
6520 report = pdrvinfo->cfosho[0] & 0x60;
6525 rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
6528 rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
6531 rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
6534 rx_pwr_all = -8 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;//6->-8
6539 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);//check it
6540 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
6541 //pstats->RecvSignalPower = pwdb_all;
6542 pstats->RecvSignalPower = rx_pwr_all;
6545 // (3) Get Signal Quality (EVM)
6547 //if(bpacket_match_bssid)
6551 if(pstats->RxPWDBAll > 40)
6556 sq = pcck_buf->sq_rpt;
6558 if(pcck_buf->sq_rpt > 64)
6560 else if (pcck_buf->sq_rpt < 20)
6563 sq = ((64-sq) * 100) / 44;
6565 pstats->SignalQuality = precord_stats->SignalQuality = sq;
6566 pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
6567 pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
6572 priv->stats.numqry_phystatusHT++;
6574 // 2008/09/19 MH For 92S debug, RX RF path always enable!!
6575 priv->brfpath_rxenable[0] = priv->brfpath_rxenable[1] = TRUE;
6578 // (1)Get RSSI for HT rate
6580 //for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
6581 for(i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
6583 // 2008/01/30 MH we will judge RF RX path now.
6584 if (priv->brfpath_rxenable[i])
6589 //if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
6592 //Fixed by Jacken from Bryant 2008-03-20
6593 //Original value is 106
6594 //rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
6595 rx_pwr[i] = ((pdrvinfo->gain_trsw[i]&0x3F)*2) - 110;
6597 /* Translate DBM to percentage. */
6598 RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]); //check ok
6600 RT_TRACE(COMP_RF, "RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI);
6602 //Get Rx snr value in DB
6603 //tmp_rxsnr = pofdm_buf->rxsnr_X[i];
6604 //rx_snrX = (char)(tmp_rxsnr);
6606 //priv->stats.rxSNRdB[i] = (long)rx_snrX;
6607 priv->stats.rxSNRdB[i] = (long)(pdrvinfo->rxsnr[i]/2);
6609 /* Translate DBM to percentage. */
6610 //RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
6611 //total_rssi += RSSI;
6613 /* Record Signal Strength for next packet */
6614 //if(bpacket_match_bssid)
6616 pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
6617 precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
6623 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
6625 //Fixed by Jacken from Bryant 2008-03-20
6626 //Original value is 106
6627 //rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
6628 rx_pwr_all = (((pdrvinfo->pwdb_all ) >> 1 )& 0x7f) -106;
6629 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
6631 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
6632 pstats->RxPower = precord_stats->RxPower = rx_pwr_all;
6633 pstats->RecvSignalPower = rx_pwr_all;
6636 // (3)EVM of HT rate
6638 //if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
6639 // pdrvinfo->RxRate<=DESC90_RATEMCS15)
6640 if(pDesc->RxHT && pDesc->RxMCS>=DESC92S_RATEMCS8 &&
6641 pDesc->RxMCS<=DESC92S_RATEMCS15)
6642 max_spatial_stream = 2; //both spatial stream make sense
6644 max_spatial_stream = 1; //only spatial stream 1 makes sense
6646 for(i=0; i<max_spatial_stream; i++)
6648 //tmp_rxevm = pofdm_buf->rxevm_X[i];
6649 //rx_evmX = (char)(tmp_rxevm);
6651 // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
6652 // fill most significant bit to "zero" when doing shifting operation which may change a negative
6653 // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.
6654 //rx_evmX /= 2; //dbm
6656 //evm = rtl819x_evm_dbtopercentage(rx_evmX);
6657 evm = rtl819x_evm_dbtopercentage( (pdrvinfo->rxevm[i] /*/ 2*/)); //dbm
6658 RT_TRACE(COMP_RF, "RXRATE=%x RXEVM=%x EVM=%s%d\n", pDesc->RxMCS, pdrvinfo->rxevm[i], "%", evm);
6660 //if(bpacket_match_bssid)
6662 if(i==0) // Fill value in RFD, Get the first spatial stream only
6663 pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
6664 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
6669 /* record rx statistics for debug */
6670 //rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
6671 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
6672 //if(pdrvinfo->BW) //40M channel
6673 if(pDesc->BW) //40M channel
6674 priv->stats.received_bwtype[1+pdrvinfo->rxsc]++;
6676 priv->stats.received_bwtype[0]++;
6679 //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
6680 //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
6683 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;//check ok
6688 //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
6689 // We can judge RX path number now.
6691 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
6693 }/* QueryRxPhyStatus8192S */
6696 rtl8192_record_rxdesc_forlateruse(
6697 struct ieee80211_rx_stats * psrc_stats,
6698 struct ieee80211_rx_stats * ptarget_stats
6701 ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
6702 ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
6703 ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
6706 static void rtl8192SU_query_rxphystatus(
6707 struct r8192_priv * priv,
6708 struct ieee80211_rx_stats * pstats,
6709 rx_desc_819x_usb *pDesc,
6710 rx_drvinfo_819x_usb * pdrvinfo,
6711 struct ieee80211_rx_stats * precord_stats,
6712 bool bpacket_match_bssid,
6713 bool bpacket_toself,
6717 void rtl8192SU_TranslateRxSignalStuff(struct sk_buff *skb,
6718 struct ieee80211_rx_stats * pstats,
6719 rx_desc_819x_usb *pDesc,
6720 rx_drvinfo_819x_usb *pdrvinfo)
6722 // TODO: We must only check packet for current MAC address. Not finish
6723 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
6724 struct net_device *dev=info->dev;
6725 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6726 bool bpacket_match_bssid, bpacket_toself;
6727 bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
6728 static struct ieee80211_rx_stats previous_stats;
6729 struct ieee80211_hdr_3addr *hdr;//by amy
6732 // Get Signal Quality for only RX data queue (but not command queue)
6735 //u16 tmp_buf_len = 0;
6738 /* Get MAC frame start address. */
6739 tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
6741 hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
6742 fc = le16_to_cpu(hdr->frame_control);
6743 type = WLAN_FC_GET_TYPE(fc);
6744 praddr = hdr->addr1;
6746 /* Check if the received packet is acceptabe. */
6747 bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
6748 (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
6749 && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
6750 bpacket_toself = bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
6753 if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
6755 bPacketBeacon = true;
6756 //DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
6758 if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
6760 if((eqMacAddr(praddr,dev->dev_addr)))
6762 //DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
6768 if(bpacket_match_bssid)
6770 priv->stats.numpacket_matchbssid++;
6773 priv->stats.numpacket_toself++;
6776 // Process PHY information for previous packet (RSSI/PWDB/EVM)
6778 // Because phy information is contained in the last packet of AMPDU only, so driver
6779 // should process phy information of previous packet
6780 rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
6781 rtl8192SU_query_rxphystatus(priv, pstats, pDesc, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
6782 rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
6787 * Function: UpdateReceivedRateHistogramStatistics
6788 * Overview: Recored down the received data rate
6791 * struct net_device *dev
6792 * struct ieee80211_rx_stats *stats
6796 * (priv->stats.ReceivedRateHistogram[] is updated)
6801 UpdateReceivedRateHistogramStatistics8190(
6802 struct net_device *dev,
6803 struct ieee80211_rx_stats *stats
6806 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6807 u32 rcvType=1; //0: Total, 1:OK, 2:CRC, 3:ICV
6809 u32 preamble_guardinterval; //1: short preamble/GI, 0: long preamble/GI
6814 else if(stats->bICV)
6817 if(stats->bShortPreamble)
6818 preamble_guardinterval = 1;// short
6820 preamble_guardinterval = 0;// long
6827 case MGN_1M: rateIndex = 0; break;
6828 case MGN_2M: rateIndex = 1; break;
6829 case MGN_5_5M: rateIndex = 2; break;
6830 case MGN_11M: rateIndex = 3; break;
6834 case MGN_6M: rateIndex = 4; break;
6835 case MGN_9M: rateIndex = 5; break;
6836 case MGN_12M: rateIndex = 6; break;
6837 case MGN_18M: rateIndex = 7; break;
6838 case MGN_24M: rateIndex = 8; break;
6839 case MGN_36M: rateIndex = 9; break;
6840 case MGN_48M: rateIndex = 10; break;
6841 case MGN_54M: rateIndex = 11; break;
6843 // 11n High throughput rate
6845 case MGN_MCS0: rateIndex = 12; break;
6846 case MGN_MCS1: rateIndex = 13; break;
6847 case MGN_MCS2: rateIndex = 14; break;
6848 case MGN_MCS3: rateIndex = 15; break;
6849 case MGN_MCS4: rateIndex = 16; break;
6850 case MGN_MCS5: rateIndex = 17; break;
6851 case MGN_MCS6: rateIndex = 18; break;
6852 case MGN_MCS7: rateIndex = 19; break;
6853 case MGN_MCS8: rateIndex = 20; break;
6854 case MGN_MCS9: rateIndex = 21; break;
6855 case MGN_MCS10: rateIndex = 22; break;
6856 case MGN_MCS11: rateIndex = 23; break;
6857 case MGN_MCS12: rateIndex = 24; break;
6858 case MGN_MCS13: rateIndex = 25; break;
6859 case MGN_MCS14: rateIndex = 26; break;
6860 case MGN_MCS15: rateIndex = 27; break;
6861 default: rateIndex = 28; break;
6863 priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
6864 priv->stats.received_rate_histogram[0][rateIndex]++; //total
6865 priv->stats.received_rate_histogram[rcvType][rateIndex]++;
6868 void rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
6870 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
6871 struct net_device *dev=info->dev;
6872 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6873 //rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
6874 rx_drvinfo_819x_usb *driver_info = NULL;
6876 //PRT_RFD_STATUS pRtRfdStatus = &pRfd->Status;
6877 //PHAL_DATA_8192SUSB pHalData = GET_HAL_DATA(Adapter);
6878 //pu1Byte pDesc = (pu1Byte)pDescIn;
6879 //PRX_DRIVER_INFO_8192S pDrvInfo;
6881 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
6886 printk("========================");
6887 for(m=0; m<skb->len; m++){
6890 printk("%2x ",((u8*)skb->data)[m]);
6892 printk("\n========================\n");
6898 //Get Rx Descriptor Raw Information
6900 stats->Length = desc->Length ;
6901 stats->RxDrvInfoSize = desc->RxDrvInfoSize*RX_DRV_INFO_SIZE_UNIT;
6902 stats->RxBufShift = (desc->Shift)&0x03;
6903 stats->bICV = desc->ICV;
6904 stats->bCRC = desc->CRC32;
6905 stats->bHwError = stats->bCRC|stats->bICV;
6906 stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
6907 stats->bIsAMPDU = (desc->AMSDU==1);
6908 stats->bFirstMPDU = (desc->PAGGR==1) && (desc->FAGGR==1);
6909 stats->bShortPreamble = desc->SPLCP;
6910 stats->RxIs40MHzPacket = (desc->BW==1);
6911 stats->TimeStampLow = desc->TSFL;
6913 if((desc->FAGGR==1) || (desc->PAGGR==1))
6915 RT_TRACE(COMP_RXDESC, "FirstAGGR = %d, PartAggr = %d\n", desc->FAGGR, desc->PAGGR);
6921 printk("%s: Receive ICV error!!!!!!!!!!!!!!!!!!!!!!\n", __FUNCTION__);
6923 printk("%s: Receive CRC error!!!!!!!!!!!!!!!!!!!!!!\n", __FUNCTION__);
6926 if(IS_UNDER_11N_AES_MODE(priv->ieee80211))
6928 // Always received ICV error packets in AES mode.
6929 // This fixed HW later MIC write bug.
6930 if(stats->bICV && !stats->bCRC)
6932 stats->bICV = FALSE;
6933 stats->bHwError = FALSE;
6937 // Transform HwRate to MRate
6938 if(!stats->bHwError)
6939 //stats->DataRate = HwRateToMRate(
6940 // (BOOLEAN)GET_RX_DESC_RXHT(pDesc),
6941 // (u1Byte)GET_RX_DESC_RXMCS(pDesc),
6942 // (BOOLEAN)GET_RX_DESC_PAGGR(pDesc));
6943 stats->rate = rtl8192SU_HwRateToMRate(desc->RxHT, desc->RxMCS, desc->PAGGR);
6945 stats->rate = MGN_1M;
6948 // Collect Rx rate/AMPDU/TSFL
6950 //UpdateRxdRateHistogramStatistics8192S(Adapter, pRfd);
6951 //UpdateRxAMPDUHistogramStatistics8192S(Adapter, pRfd);
6952 //UpdateRxPktTimeStamp8192S(Adapter, pRfd);
6953 UpdateReceivedRateHistogramStatistics8190(dev, stats);
6954 //UpdateRxAMPDUHistogramStatistics8192S(dev, stats); //FIXLZM
6955 UpdateRxPktTimeStamp8190(dev, stats);
6958 // Get PHY Status and RSVD parts.
6959 // <Roger_Notes> It only appears on last aggregated packet.
6961 if (desc->PHYStatus)
6963 //driver_info = (rx_drvinfo_819x_usb *)(skb->data + RX_DESC_SIZE + stats->RxBufShift);
6964 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
6969 printk("========================\n");
6970 printk("RX_DESC_SIZE:%d, RxBufShift:%d, RxDrvInfoSize:%d\n",
6971 RX_DESC_SIZE, stats->RxBufShift, stats->RxDrvInfoSize);
6972 for(m=0; m<32; m++){
6973 printk("%2x ",((u8*)driver_info)[m]);
6975 printk("\n========================\n");
6982 skb_pull(skb, sizeof(rx_desc_819x_usb));
6986 // Get Total offset of MPDU Frame Body
6988 if((stats->RxBufShift + stats->RxDrvInfoSize) > 0)
6992 skb_pull(skb, stats->RxBufShift + stats->RxDrvInfoSize);
6997 // Get PHY Status and RSVD parts.
6998 // <Roger_Notes> It only appears on last aggregated packet.
7000 if (desc->PHYStatus)
7002 rtl8192SU_TranslateRxSignalStuff(skb, stats, desc, driver_info);
7008 // The strarting address of wireless lan header will shift 1 or 2 or 3 or "more" bytes for the following reason :
7009 // (1) QoS control : shift 2 bytes
7010 // (2) Mesh Network : shift 1 or 3 bytes
7011 // (3) RxDriverInfo occupies the front parts of Rx Packets buffer(shift units is in 8Bytes)
7013 // It is because Lextra CPU used by 8186 or 865x series assert exception if the statrting address
7014 // of IP header is not double word alignment.
7015 // This features is supported in 818xb and 8190 only, but not 818x.
7017 // parameter: PRT_RFD, Pointer of Reeceive frame descriptor which is initialized according to
7019 // return value: unsigned int, number of total shifted bytes
7021 // Notes: 2008/06/28, created by Roger
7023 u32 GetRxPacketShiftBytes8192SU(struct ieee80211_rx_stats *Status, bool bIsRxAggrSubframe)
7025 //PRT_RFD_STATUS pRtRfdStatus = &pRfd->Status;
7027 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize + Status->RxBufShift);
7030 void rtl8192SU_rx_nomal(struct sk_buff* skb)
7032 rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7033 struct net_device *dev=info->dev;
7034 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7035 struct ieee80211_rx_stats stats = {
7039 // .mac_time = jiffies,
7040 .freq = IEEE80211_24GHZ_BAND,
7043 struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
7044 bool unicast_packet = false;
7046 //printk("**********skb->len = %d\n", skb->len);
7047 /* 20 is for ps-poll */
7048 if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
7050 /* first packet should not contain Rx aggregation header */
7051 rtl8192SU_query_rxdesc_status(skb, &stats, false);
7054 /* hardware related info */
7055 priv->stats.rxoktotal++; //YJ,test,090108
7057 /* Process the MPDU recevied */
7058 skb_trim(skb, skb->len - 4/*sCrcLng*/);//FIXLZM
7060 rx_pkt_len = skb->len;
7061 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
7062 unicast_packet = false;
7063 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
7065 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
7068 /* unicast packet */
7069 unicast_packet = true;
7072 if(!ieee80211_rtl_rx(priv->ieee80211,skb, &stats)) {
7073 dev_kfree_skb_any(skb);
7075 // priv->stats.rxoktotal++; //YJ,test,090108
7076 if(unicast_packet) {
7077 priv->stats.rxbytesunicast += rx_pkt_len;
7081 //up is firs pkt, follow is next and next
7085 priv->stats.rxurberr++;
7086 printk("actual_length:%d\n", skb->len);
7087 dev_kfree_skb_any(skb);
7093 rtl819xusb_process_received_packet(
7094 struct net_device *dev,
7095 struct ieee80211_rx_stats *pstats
7098 // bool bfreerfd=false, bqueued=false;
7101 struct r8192_priv *priv = ieee80211_priv(dev);
7105 //PRX_TS_RECORD pts = NULL;
7107 // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
7108 //porting by amy 080508
7109 pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
7110 frame = pstats->virtual_address;
7111 frame_len = pstats->packetlength;
7112 #ifdef TODO // by amy about HCT
7113 if(!Adapter->bInHctTest)
7114 CountRxErrStatistics(Adapter, pRfd);
7117 #ifdef ENABLE_PS //by amy for adding ps function in future
7118 RT_RF_POWER_STATE rtState;
7119 // When RF is off, we should not count the packet for hw/sw synchronize
7120 // reason, ie. there may be a duration while sw switch is changed and hw
7121 // switch is being changed. 2006.12.04, by shien chang.
7122 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
7123 if (rtState == eRfOff)
7128 priv->stats.rxframgment++;
7132 RmMonitorSignalStrength(Adapter, pRfd);
7134 /* 2007/01/16 MH Add RX command packet handle here. */
7135 /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
7136 if (rtl819xusb_rx_command_packet(dev, pstats))
7148 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
7150 // rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7151 // struct net_device *dev=info->dev;
7152 // struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7153 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
7154 // rx_drvinfo_819x_usb *driver_info;
7157 //Get Rx Descriptor Information
7159 stats->virtual_address = (u8*)skb->data;
7160 stats->Length = desc->Length;
7161 stats->RxDrvInfoSize = 0;
7162 stats->RxBufShift = 0;
7163 stats->packetlength = stats->Length-scrclng;
7164 stats->fraglength = stats->packetlength;
7165 stats->fragoffset = 0;
7166 stats->ntotalfrag = 1;
7169 void rtl8192SU_rx_cmd(struct sk_buff *skb)
7171 struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7172 struct net_device *dev = info->dev;
7175 struct ieee80211_rx_stats stats = {
7179 // .mac_time = jiffies,
7180 .freq = IEEE80211_24GHZ_BAND,
7184 // Check buffer length to determine if this is a valid MPDU.
7186 if( (skb->len >= sizeof(rx_desc_819x_usb)) && (skb->len <= RX_URB_SIZE) )//&&
7187 //(pHalData->SwChnlInProgress == FALSE))
7190 // Collection information in Rx descriptor.
7192 query_rx_cmdpkt_desc_status(skb,&stats);
7193 // this is to be done by amy 080508 prfd->queue_id = 1;
7196 // Process the MPDU recevied.
7198 rtl819xusb_process_received_packet(dev,&stats);
7200 dev_kfree_skb_any(skb);
7204 //RTInsertTailListWithCnt(&pAdapter->RfdIdleQueue, &pRfd->List, &pAdapter->NumIdleRfd);
7205 //RT_ASSERT(pAdapter->NumIdleRfd <= pAdapter->NumRfd, ("HalUsbInCommandComplete8192SUsb(): Adapter->NumIdleRfd(%d)\n", pAdapter->NumIdleRfd));
7206 //RT_TRACE(COMP_RECV, DBG_LOUD, ("HalUsbInCommandComplete8192SUsb(): NOT enough Resources!! BufLenUsed(%d), NumIdleRfd(%d)\n",
7207 //pContext->BufLenUsed, pAdapter->NumIdleRfd));
7211 // Reuse USB_IN_CONTEXT since we had finished processing the
7212 // buffer in USB_IN_CONTEXT.
7214 //HalUsbReturnInContext(pAdapter, pContext);
7217 // Issue another bulk IN transfer.
7219 //HalUsbInMpdu(pAdapter, PipeIndex);
7221 RT_TRACE(COMP_RECV, "<--- HalUsbInCommandComplete8192SUsb()\n");
7225 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
7227 struct sk_buff *skb;
7228 struct rtl8192_rx_info *info;
7230 while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
7231 info = (struct rtl8192_rx_info *)skb->cb;
7232 switch (info->out_pipe) {
7233 /* Nomal packet pipe */
7235 //RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
7236 priv->IrpPendingCount--;
7237 priv->ops->rtl819x_rx_nomal(skb);
7240 /* Command packet pipe */
7242 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
7244 priv->ops->rtl819x_rx_cmd(skb);
7247 default: /* should never get here! */
7248 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
7259 /****************************************************************************
7260 ---------------------------- USB_STUFF---------------------------
7261 *****************************************************************************/
7262 //LZM Merge from windows HalUsbSetQueuePipeMapping8192SUsb 090319
7263 static void HalUsbSetQueuePipeMapping8192SUsb(struct usb_interface *intf, struct net_device *dev)
7265 struct r8192_priv *priv = ieee80211_priv(dev);
7266 struct usb_host_interface *iface_desc;
7267 struct usb_endpoint_descriptor *endpoint;
7270 priv->ep_in_num = 0;
7271 priv->ep_out_num = 0;
7272 memset(priv->RtOutPipes,0,16);
7273 memset(priv->RtInPipes,0,16);
7275 iface_desc = intf->cur_altsetting;
7276 priv->ep_num = iface_desc->desc.bNumEndpoints;
7278 for (i = 0; i < priv->ep_num; ++i) {
7279 endpoint = &iface_desc->endpoint[i].desc;
7280 if (usb_endpoint_is_bulk_in(endpoint)) {
7281 priv->RtInPipes[priv->ep_in_num] = usb_endpoint_num(endpoint);
7283 //printk("in_endpoint_idx = %d\n", usb_endpoint_num(endpoint));
7284 } else if (usb_endpoint_is_bulk_out(endpoint)) {
7285 priv->RtOutPipes[priv->ep_out_num] = usb_endpoint_num(endpoint);
7286 priv->ep_out_num ++;
7287 //printk("out_endpoint_idx = %d\n", usb_endpoint_num(endpoint));
7291 memset(priv->txqueue_to_outpipemap,0,9);
7292 if (priv->ep_num == 6) {
7293 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7294 u8 queuetopipe[] = {3, 2, 1, 0, 4, 4, 4, 4, 4};
7296 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7297 } else if (priv->ep_num == 4) {
7298 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7299 u8 queuetopipe[] = {1, 1, 0, 0, 2, 2, 2, 2, 2};
7301 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7302 } else if (priv->ep_num > 9) {
7303 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7304 u8 queuetopipe[] = {3, 2, 1, 0, 4, 8, 7, 6, 5};
7306 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7307 } else {//use sigle pipe
7308 // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7309 u8 queuetopipe[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
7310 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7313 printk("==>ep_num:%d, in_ep_num:%d, out_ep_num:%d\n", priv->ep_num, priv->ep_in_num, priv->ep_out_num);
7315 printk("==>RtInPipes:");
7316 for(i=0; i < priv->ep_in_num; i++)
7317 printk("%d ", priv->RtInPipes[i]);
7320 printk("==>RtOutPipes:");
7321 for(i=0; i < priv->ep_out_num; i++)
7322 printk("%d ", priv->RtOutPipes[i]);
7325 printk("==>txqueue_to_outpipemap for BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON:\n");
7326 for(i=0; i < 9; i++)
7327 printk("%d ", priv->txqueue_to_outpipemap[i]);
7333 static const struct net_device_ops rtl8192_netdev_ops = {
7334 .ndo_open = rtl8192_open,
7335 .ndo_stop = rtl8192_close,
7336 .ndo_get_stats = rtl8192_stats,
7337 .ndo_tx_timeout = tx_timeout,
7338 .ndo_do_ioctl = rtl8192_ioctl,
7339 .ndo_set_multicast_list = r8192_set_multicast,
7340 .ndo_set_mac_address = r8192_set_mac_adr,
7341 .ndo_validate_addr = eth_validate_addr,
7342 .ndo_change_mtu = eth_change_mtu,
7343 .ndo_start_xmit = rtl8192_ieee80211_rtl_xmit,
7346 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
7347 const struct usb_device_id *id)
7349 // unsigned long ioaddr = 0;
7350 struct net_device *dev = NULL;
7351 struct r8192_priv *priv= NULL;
7352 struct usb_device *udev = interface_to_usbdev(intf);
7354 RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
7356 dev = alloc_ieee80211(sizeof(struct r8192_priv));
7358 usb_set_intfdata(intf, dev);
7359 SET_NETDEV_DEV(dev, &intf->dev);
7360 priv = ieee80211_priv(dev);
7361 priv->ieee80211 = netdev_priv(dev);
7364 HalUsbSetQueuePipeMapping8192SUsb(intf, dev);
7366 //printk("===============>NIC 8192SU\n");
7367 priv->ops = &rtl8192su_ops;
7369 dev->netdev_ops = &rtl8192_netdev_ops;
7371 //DMESG("Oops: i'm coming\n");
7372 dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
7374 dev->type=ARPHRD_ETHER;
7376 dev->watchdog_timeo = HZ*3; //modified by john, 0805
7378 if (dev_alloc_name(dev, ifname) < 0){
7379 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
7381 dev_alloc_name(dev, ifname);
7384 RT_TRACE(COMP_INIT, "Driver probe completed1\n");
7386 if(rtl8192_init(dev)!=0){
7387 RT_TRACE(COMP_ERR, "Initialization failed");
7391 netif_carrier_off(dev);
7392 netif_stop_queue(dev);
7394 register_netdev(dev);
7395 RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
7396 rtl8192_proc_init_one(dev);
7399 RT_TRACE(COMP_INIT, "Driver probe completed\n");
7402 free_ieee80211(dev);
7404 RT_TRACE(COMP_ERR, "wlan driver load failed\n");
7408 //detach all the work and timer structure declared or inititialize in r8192U_init function.
7409 void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
7411 cancel_work_sync(&priv->reset_wq);
7412 cancel_work_sync(&priv->qos_activate);
7413 cancel_delayed_work(&priv->watch_dog_wq);
7414 cancel_delayed_work(&priv->update_beacon_wq);
7415 cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
7416 cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
7417 //cancel_work_sync(&priv->SetBWModeWorkItem);
7418 //cancel_work_sync(&priv->SwChnlWorkItem);
7421 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf)
7423 struct net_device *dev = usb_get_intfdata(intf);
7424 struct r8192_priv *priv = ieee80211_priv(dev);
7427 unregister_netdev(dev);
7429 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
7430 rtl8192_proc_remove_one(dev);
7433 if (priv->pFirmware)
7435 vfree(priv->pFirmware);
7436 priv->pFirmware = NULL;
7438 // priv->rf_close(dev);
7439 // rtl8192_SetRFPowerState(dev, eRfOff);
7440 destroy_workqueue(priv->priv_wq);
7441 //rtl8192_irq_disable(dev);
7442 //rtl8192_reset(dev);
7446 free_ieee80211(dev);
7447 RT_TRACE(COMP_DOWN, "wlan driver removed\n");
7450 /* fun with the built-in ieee80211 stack... */
7451 extern int ieee80211_debug_init(void);
7452 extern void ieee80211_debug_exit(void);
7453 extern int ieee80211_crypto_init(void);
7454 extern void ieee80211_crypto_deinit(void);
7455 extern int ieee80211_crypto_tkip_init(void);
7456 extern void ieee80211_crypto_tkip_exit(void);
7457 extern int ieee80211_crypto_ccmp_init(void);
7458 extern void ieee80211_crypto_ccmp_exit(void);
7459 extern int ieee80211_crypto_wep_init(void);
7460 extern void ieee80211_crypto_wep_exit(void);
7462 static int __init rtl8192_usb_module_init(void)
7466 #ifdef CONFIG_IEEE80211_DEBUG
7467 ret = ieee80211_debug_init();
7469 printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
7473 ret = ieee80211_crypto_init();
7475 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
7479 ret = ieee80211_crypto_tkip_init();
7481 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
7486 ret = ieee80211_crypto_ccmp_init();
7488 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
7493 ret = ieee80211_crypto_wep_init();
7495 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
7499 printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
7500 printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
7501 RT_TRACE(COMP_INIT, "Initializing module");
7502 RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
7503 rtl8192_proc_module_init();
7504 return usb_register(&rtl8192_usb_driver);
7508 static void __exit rtl8192_usb_module_exit(void)
7510 usb_deregister(&rtl8192_usb_driver);
7512 RT_TRACE(COMP_DOWN, "Exiting");
7513 rtl8192_proc_module_remove();
7515 ieee80211_crypto_tkip_exit();
7516 ieee80211_crypto_ccmp_exit();
7517 ieee80211_crypto_wep_exit();
7518 ieee80211_crypto_deinit();
7519 #ifdef CONFIG_IEEE80211_DEBUG
7520 ieee80211_debug_exit();
7525 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
7527 unsigned long flags;
7529 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7531 spin_lock_irqsave(&priv->tx_lock,flags);
7532 enough_desc = check_nic_enough_desc(dev,pri);
7533 spin_unlock_irqrestore(&priv->tx_lock,flags);
7536 ieee80211_rtl_wake_queue(priv->ieee80211);
7539 void EnableHWSecurityConfig8192(struct net_device *dev)
7541 u8 SECR_value = 0x0;
7542 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7543 struct ieee80211_device *ieee = priv->ieee80211;
7545 SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
7546 switch (ieee->pairwise_key_type) {
7547 case KEY_TYPE_WEP40:
7548 case KEY_TYPE_WEP104:
7549 if (priv->ieee80211->auth_mode != 2) {
7550 SECR_value |= SCR_RxUseDK;
7551 SECR_value |= SCR_TxUseDK;
7556 if (ieee->iw_mode == IW_MODE_ADHOC) {
7557 SECR_value |= SCR_RxUseDK;
7558 SECR_value |= SCR_TxUseDK;
7566 * add HWSec active enable here.
7567 * default using hwsec.
7568 * when peer AP is in N mode only and pairwise_key_type is none_aes
7569 * (which HT_IOT_ACT_PURE_N_MODE indicates it),
7570 * use software security.
7571 * when peer AP is in b,g,n mode mixed and pairwise_key_type is none_aes
7572 * use g mode hw security.
7574 ieee->hwsec_active = 1;
7576 /* add hwsec_support flag to totol control hw_sec on/off */
7577 if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep) {
7578 ieee->hwsec_active = 0;
7579 SECR_value &= ~SCR_RxDecEnable;
7582 RT_TRACE(COMP_SEC, "%s(): hwsec: %d, pairwise_key: %d, "
7584 __func__, ieee->hwsec_active,
7585 ieee->pairwise_key_type, SECR_value);
7587 write_nic_byte(dev, SECR, SECR_value); /* SECR_value | SCR_UseDK ); */
7591 void setKey(struct net_device *dev,
7599 u32 TargetCommand = 0;
7600 u32 TargetContent = 0;
7604 if (EntryNo >= TOTAL_CAM_ENTRY)
7605 RT_TRACE(COMP_ERR, "%s(): cam entry exceeds TOTAL_CAM_ENTRY",
7608 RT_TRACE(COMP_SEC, "%s(): dev: %p, EntryNo: %d, "
7609 "KeyIndex: %d, KeyType: %d, MacAddr: %pM",
7610 __func__, dev, EntryNo,
7611 KeyIndex, KeyType, MacAddr);
7614 usConfig |= BIT15 | (KeyType << 2);
7616 usConfig |= BIT15 | (KeyType << 2) | KeyIndex;
7618 for (i = 0 ; i < CAM_CONTENT_COUNT; i++) {
7619 TargetCommand = i + CAM_CONTENT_COUNT * EntryNo;
7620 TargetCommand |= BIT31|BIT16;
7622 case 0: /* MAC|Config */
7623 TargetContent = (u32)(*(MacAddr + 0)) << 16|
7624 (u32)(*(MacAddr + 1)) << 24|
7627 write_nic_dword(dev, WCAMI, TargetContent);
7628 write_nic_dword(dev, RWCAM, TargetCommand);
7631 TargetContent = (u32)(*(MacAddr + 2))|
7632 (u32)(*(MacAddr + 3)) << 8|
7633 (u32)(*(MacAddr + 4)) << 16|
7634 (u32)(*(MacAddr + 5)) << 24;
7635 write_nic_dword(dev, WCAMI, TargetContent);
7636 write_nic_dword(dev, RWCAM, TargetCommand);
7638 default: /* Key Material */
7639 if (KeyContent != NULL) {
7640 write_nic_dword(dev, WCAMI,
7641 (u32)(*(KeyContent+i-2)));
7642 write_nic_dword(dev, RWCAM,
7650 /***************************************************************************
7651 ------------------- module init / exit stubs ----------------
7652 ****************************************************************************/
7653 module_init(rtl8192_usb_module_init);
7654 module_exit(rtl8192_usb_module_exit);