Merge remote branch 'nouveau/for-airlied' into drm-linus
[pandora-kernel.git] / drivers / staging / rtl8192su / r8192U_core.c
1 /******************************************************************************
2  * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
3  * Linux device driver for RTL8192U
4  *
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.
10  *
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
14  * more details.
15  *
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
19  *
20  * The full GNU General Public License is included in this distribution in the
21  * file called LICENSE.
22  *
23  * Contact Information:
24  * Jerry chuang <wlanfae@realtek.com>
25  */
26
27 #include <linux/vmalloc.h>
28
29 #undef LOOP_TEST
30 #undef DUMP_RX
31 #undef DUMP_TX
32 #undef DEBUG_TX_DESC2
33 #undef RX_DONT_PASS_UL
34 #undef DEBUG_EPROM
35 #undef DEBUG_RX_VERBOSE
36 #undef DUMMY_RX
37 #undef DEBUG_ZERO_RX
38 #undef DEBUG_RX_SKB
39 #undef DEBUG_TX_FRAG
40 #undef DEBUG_RX_FRAG
41 #undef DEBUG_TX_FILLDESC
42 #undef DEBUG_TX
43 #undef DEBUG_IRQ
44 #undef DEBUG_RX
45 #undef DEBUG_RXALLOC
46 #undef DEBUG_REGISTERS
47 #undef DEBUG_RING
48 #undef DEBUG_IRQ_TASKLET
49 #undef DEBUG_TX_ALLOC
50 #undef DEBUG_TX_DESC
51
52 #define CONFIG_RTL8192_IO_MAP
53
54 #include <asm/uaccess.h>
55 #include "r8192U.h"
56 #include "r8180_93cx6.h"   /* Card EEPROM */
57 #include "r8192U_wx.h"
58
59 #include "r8192S_rtl8225.h"
60 #include "r8192S_hw.h"
61 #include "r8192S_phy.h"
62 #include "r8192S_phyreg.h"
63 #include "r8192S_Efuse.h"
64
65 #include "r819xU_cmdpkt.h"
66 #include "r8192U_dm.h"
67 //#include "r8192xU_phyreg.h"
68 #include <linux/usb.h>
69
70 #include "r8192U_pm.h"
71
72 #include "ieee80211/dot11d.h"
73
74
75
76 u32 rt_global_debug_component = \
77 //                              COMP_TRACE      |
78 //                              COMP_DBG        |
79 //                              COMP_INIT       |
80 //                              COMP_RECV       |
81 //                              COMP_SEND       |
82 //                              COMP_IO         |
83                                 COMP_POWER      |
84 //                              COMP_EPROM      |
85                                 COMP_SWBW       |
86                                 COMP_POWER_TRACKING |
87                                 COMP_TURBO      |
88                                 COMP_QOS        |
89 //                              COMP_RATE       |
90 //                              COMP_RM         |
91                                 COMP_DIG        |
92 //                              COMP_EFUSE      |
93 //                              COMP_CH         |
94 //                              COMP_TXAGC      |
95                                 COMP_HIPWR      |
96 //                              COMP_HALDM      |
97                                 COMP_SEC        |
98                                 COMP_LED        |
99 //                              COMP_RF         |
100 //                              COMP_RXDESC     |
101                                 COMP_FIRMWARE   |
102                                 COMP_HT         |
103                                 COMP_AMSDU      |
104                                 COMP_SCAN       |
105 //                              COMP_CMD        |
106                                 COMP_DOWN       |
107                                 COMP_RESET      |
108                                 COMP_ERR; //always open err flags on
109
110 #define TOTAL_CAM_ENTRY 32
111 #define CAM_CONTENT_COUNT 8
112
113 static struct usb_device_id rtl8192_usb_id_tbl[] = {
114         /* Realtek */
115         {USB_DEVICE(0x0bda, 0x8192)},
116         {USB_DEVICE(0x0bda, 0x8709)},
117         /* Corega */
118         {USB_DEVICE(0x07aa, 0x0043)},
119         /* Belkin */
120         {USB_DEVICE(0x050d, 0x805E)},
121         /* Sitecom */
122         {USB_DEVICE(0x0df6, 0x0031)},
123         /* EnGenius */
124         {USB_DEVICE(0x1740, 0x9201)},
125         /* Dlink */
126         {USB_DEVICE(0x2001, 0x3301)},
127         /* Zinwell */
128         {USB_DEVICE(0x5a57, 0x0290)},
129         /* Guillemot */
130         {USB_DEVICE(0x06f8, 0xe031)},
131         //92SU
132         {USB_DEVICE(0x0bda, 0x8172)},
133         {}
134 };
135
136 MODULE_LICENSE("GPL");
137 MODULE_VERSION("V 1.1");
138 MODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
139 MODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
140
141 static char* ifname = "wlan%d";
142 static int hwwep = 1;  //default use hw. set 0 to use software security
143 static int channels = 0x3fff;
144
145
146
147 module_param(ifname, charp, S_IRUGO|S_IWUSR );
148 //module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
149 module_param(hwwep,int, S_IRUGO|S_IWUSR);
150 module_param(channels,int, S_IRUGO|S_IWUSR);
151
152 MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
153 //MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
154 MODULE_PARM_DESC(hwwep," Try to use hardware security support. ");
155 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
156
157 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
158                          const struct usb_device_id *id);
159 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf);
160
161 static struct usb_driver rtl8192_usb_driver = {
162         .name           = RTL819xU_MODULE_NAME,           /* Driver name   */
163         .id_table       = rtl8192_usb_id_tbl,             /* PCI_ID table  */
164         .probe          = rtl8192_usb_probe,              /* probe fn      */
165         .disconnect     = rtl8192_usb_disconnect,         /* remove fn     */
166         .suspend        = rtl8192U_suspend,               /* PM suspend fn */
167         .resume         = rtl8192U_resume,                 /* PM resume fn  */
168         .reset_resume   = rtl8192U_resume,                 /* PM reset resume fn  */
169 };
170
171
172 static void     rtl8192SU_read_eeprom_info(struct net_device *dev);
173 short   rtl8192SU_tx(struct net_device *dev, struct sk_buff* skb);
174 void    rtl8192SU_rx_nomal(struct sk_buff* skb);
175 void    rtl8192SU_rx_cmd(struct sk_buff *skb);
176 bool    rtl8192SU_adapter_start(struct net_device *dev);
177 short   rtl8192SU_tx_cmd(struct net_device *dev, struct sk_buff *skb);
178 void    rtl8192SU_link_change(struct net_device *dev);
179 void    InitialGain8192S(struct net_device *dev,u8 Operation);
180 void    rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe);
181
182 struct rtl819x_ops rtl8192su_ops = {
183         .nic_type = NIC_8192SU,
184         .rtl819x_read_eeprom_info = rtl8192SU_read_eeprom_info,
185         .rtl819x_tx = rtl8192SU_tx,
186         .rtl819x_tx_cmd = rtl8192SU_tx_cmd,
187         .rtl819x_rx_nomal = rtl8192SU_rx_nomal,
188         .rtl819x_rx_cmd = rtl8192SU_rx_cmd,
189         .rtl819x_adapter_start = rtl8192SU_adapter_start,
190         .rtl819x_link_change = rtl8192SU_link_change,
191         .rtl819x_initial_gain = InitialGain8192S,
192         .rtl819x_query_rxdesc_status = rtl8192SU_query_rxdesc_status,
193 };
194
195
196 typedef struct _CHANNEL_LIST
197 {
198         u8      Channel[32];
199         u8      Len;
200 }CHANNEL_LIST, *PCHANNEL_LIST;
201
202 static CHANNEL_LIST ChannelPlan[] = {
203         {{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
204         {{1,2,3,4,5,6,7,8,9,10,11},11},                                                 //IC
205         {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},   //ETSI
206         {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},    //Spain. Change to ETSI.
207         {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //France. Change to ETSI.
208         {{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
209         {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
210         {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //Israel.
211         {{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
212         {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22},    //MIC
213         {{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
214 };
215
216 static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
217 {
218         int i, max_chan=-1, min_chan=-1;
219         struct ieee80211_device* ieee = priv->ieee80211;
220         switch (channel_plan)
221         {
222                 case COUNTRY_CODE_FCC:
223                 case COUNTRY_CODE_IC:
224                 case COUNTRY_CODE_ETSI:
225                 case COUNTRY_CODE_SPAIN:
226                 case COUNTRY_CODE_FRANCE:
227                 case COUNTRY_CODE_MKK:
228                 case COUNTRY_CODE_MKK1:
229                 case COUNTRY_CODE_ISRAEL:
230                 case COUNTRY_CODE_TELEC:
231                 case COUNTRY_CODE_MIC:
232                 {
233                         Dot11d_Init(ieee);
234                         ieee->bGlobalDomain = false;
235                         //acturally 8225 & 8256 rf chip only support B,G,24N mode
236                         if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256) || (priv->rf_chip == RF_6052))
237                         {
238                                 min_chan = 1;
239                                 max_chan = 14;
240                         }
241                         else
242                         {
243                                 RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
244                         }
245                         if (ChannelPlan[channel_plan].Len != 0){
246                                 // Clear old channel map
247                                 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
248                                 // Set new channel map
249                                 for (i=0;i<ChannelPlan[channel_plan].Len;i++)
250                                 {
251                                         if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
252                                         break;
253                                         GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
254                                 }
255                         }
256                         break;
257                 }
258                 case COUNTRY_CODE_GLOBAL_DOMAIN:
259                 {
260                         GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
261                         Dot11d_Reset(ieee);
262                         ieee->bGlobalDomain = true;
263                         break;
264                 }
265                 default:
266                         break;
267         }
268         return;
269 }
270
271 #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 )
272
273 #define         rx_hal_is_cck_rate(_pDesc)\
274                         ((_pDesc->RxMCS  == DESC92S_RATE1M ||\
275                         _pDesc->RxMCS == DESC92S_RATE2M ||\
276                         _pDesc->RxMCS == DESC92S_RATE5_5M ||\
277                         _pDesc->RxMCS == DESC92S_RATE11M) &&\
278                         !_pDesc->RxHT)
279
280 #define         tx_hal_is_cck_rate(_DataRate)\
281                         ( _DataRate == MGN_1M ||\
282                          _DataRate == MGN_2M ||\
283                          _DataRate == MGN_5_5M ||\
284                          _DataRate == MGN_11M )
285
286
287
288
289 void CamResetAllEntry(struct net_device *dev)
290 {
291 #if 1
292         u32 ulcommand = 0;
293         //2004/02/11  In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
294         // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
295         // In this condition, Cam can not be reset because upper layer will not set this static key again.
296         //if(Adapter->EncAlgorithm == WEP_Encryption)
297         //      return;
298 //debug
299         //DbgPrint("========================================\n");
300         //DbgPrint("                            Call ResetAllEntry                                              \n");
301         //DbgPrint("========================================\n\n");
302         ulcommand |= BIT31|BIT30;
303         write_nic_dword(dev, RWCAM, ulcommand);
304 #else
305         for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
306                 CAM_mark_invalid(dev, ucIndex);
307         for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
308                 CAM_empty_entry(dev, ucIndex);
309 #endif
310
311 }
312
313
314 void write_cam(struct net_device *dev, u8 addr, u32 data)
315 {
316         write_nic_dword(dev, WCAMI, data);
317         write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
318 }
319
320 u32 read_cam(struct net_device *dev, u8 addr)
321 {
322         write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
323         return read_nic_dword(dev, 0xa8);
324 }
325
326 void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
327 {
328         int status;
329         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
330         struct usb_device *udev = priv->udev;
331
332         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
333                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
334                                indx|0xfe00, 0, &data, 1, HZ / 2);
335
336         if (status < 0)
337         {
338                 printk("write_nic_byte_E TimeOut! status:%d\n", status);
339         }
340 }
341
342 u8 read_nic_byte_E(struct net_device *dev, int indx)
343 {
344         int status;
345         u8 data;
346         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
347         struct usb_device *udev = priv->udev;
348
349         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
350                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
351                                indx|0xfe00, 0, &data, 1, HZ / 2);
352
353         if (status < 0)
354         {
355                 printk("read_nic_byte_E TimeOut! status:%d\n", status);
356         }
357
358         return data;
359 }
360 //as 92U has extend page from 4 to 16, so modify functions below.
361 void write_nic_byte(struct net_device *dev, int indx, u8 data)
362 {
363         int status;
364
365         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
366         struct usb_device *udev = priv->udev;
367
368         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
369                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
370                                indx, 0, &data, 1, HZ / 2);
371
372         if (status < 0)
373         {
374                 printk("write_nic_byte TimeOut! status:%d\n", status);
375         }
376
377
378 }
379
380
381 void write_nic_word(struct net_device *dev, int indx, u16 data)
382 {
383
384         int status;
385
386         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
387         struct usb_device *udev = priv->udev;
388
389         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
390                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
391                                indx, 0, &data, 2, HZ / 2);
392
393         if (status < 0)
394         {
395                 printk("write_nic_word TimeOut! status:%d\n", status);
396         }
397
398 }
399
400
401 void write_nic_dword(struct net_device *dev, int indx, u32 data)
402 {
403
404         int status;
405
406         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
407         struct usb_device *udev = priv->udev;
408
409         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
410                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
411                                indx, 0, &data, 4, HZ / 2);
412
413
414         if (status < 0)
415         {
416                 printk("write_nic_dword TimeOut! status:%d\n", status);
417         }
418
419 }
420
421
422
423 u8 read_nic_byte(struct net_device *dev, int indx)
424 {
425         u8 data;
426         int status;
427         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
428         struct usb_device *udev = priv->udev;
429
430         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
431                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
432                                indx, 0, &data, 1, HZ / 2);
433
434         if (status < 0)
435         {
436                 printk("read_nic_byte TimeOut! status:%d\n", status);
437         }
438
439         return data;
440 }
441
442
443
444 u16 read_nic_word(struct net_device *dev, int indx)
445 {
446         u16 data;
447         int status;
448         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
449         struct usb_device *udev = priv->udev;
450
451         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
452                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
453                                indx, 0, &data, 2, HZ / 2);
454
455         if (status < 0)
456         {
457                 printk("read_nic_word TimeOut! status:%d\n", status);
458         }
459
460
461         return data;
462 }
463
464 u16 read_nic_word_E(struct net_device *dev, int indx)
465 {
466         u16 data;
467         int status;
468         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
469         struct usb_device *udev = priv->udev;
470
471         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
472                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
473                                indx|0xfe00, 0, &data, 2, HZ / 2);
474
475         if (status < 0)
476         {
477                 printk("read_nic_word TimeOut! status:%d\n", status);
478         }
479
480
481         return data;
482 }
483
484 u32 read_nic_dword(struct net_device *dev, int indx)
485 {
486         u32 data;
487         int status;
488 //      int result;
489
490         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
491         struct usb_device *udev = priv->udev;
492
493         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
494                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
495                                indx, 0, &data, 4, HZ / 2);
496 //      if(0 != result) {
497 //        printk(KERN_WARNING "read size of data = %d\, date = %d\n", result, data);
498 //      }
499
500         if (status < 0)
501         {
502                 printk("read_nic_dword TimeOut! status:%d\n", status);
503                 if(status == -ENODEV) {
504                         priv->usb_error = true;
505                 }
506         }
507
508
509
510         return data;
511 }
512
513
514 //u8 read_phy_cck(struct net_device *dev, u8 adr);
515 //u8 read_phy_ofdm(struct net_device *dev, u8 adr);
516 /* this might still called in what was the PHY rtl8185/rtl8192 common code
517  * plans are to possibilty turn it again in one common code...
518  */
519 inline void force_pci_posting(struct net_device *dev)
520 {
521 }
522
523
524 static struct net_device_stats *rtl8192_stats(struct net_device *dev);
525 void rtl8192_commit(struct net_device *dev);
526 //void rtl8192_restart(struct net_device *dev);
527 void rtl8192_restart(struct work_struct *work);
528 //void rtl8192_rq_tx_ack(struct work_struct *work);
529
530 void watch_dog_timer_callback(unsigned long data);
531
532 /****************************************************************************
533    -----------------------------PROCFS STUFF-------------------------
534 *****************************************************************************/
535
536 static struct proc_dir_entry *rtl8192_proc = NULL;
537
538
539
540 static int proc_get_stats_ap(char *page, char **start,
541                           off_t offset, int count,
542                           int *eof, void *data)
543 {
544         struct net_device *dev = data;
545         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
546         struct ieee80211_device *ieee = priv->ieee80211;
547         struct ieee80211_network *target;
548
549         int len = 0;
550
551         list_for_each_entry(target, &ieee->network_list, list) {
552
553                 len += snprintf(page + len, count - len,
554                 "%s ", target->ssid);
555
556                 if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
557                         len += snprintf(page + len, count - len,
558                         "WPA\n");
559                 }
560                 else{
561                         len += snprintf(page + len, count - len,
562                         "non_WPA\n");
563                 }
564
565         }
566
567         *eof = 1;
568         return len;
569 }
570
571 static int proc_get_registers(char *page, char **start,
572                           off_t offset, int count,
573                           int *eof, void *data)
574 {
575         struct net_device *dev = data;
576 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
577
578         int len = 0;
579         int i,n,page0,page1,page2;
580
581         int max=0xff;
582         page0 = 0x000;
583         page1 = 0x100;
584         page2 = 0x800;
585
586         /* This dump the current register page */
587         if(!IS_BB_REG_OFFSET_92S(page0)){
588                 len += snprintf(page + len, count - len,
589                                 "\n####################page %x##################\n ", (page0>>8));
590                 for(n=0;n<=max;)
591                 {
592                         len += snprintf(page + len, count - len,
593                                         "\nD:  %2x > ",n);
594                         for(i=0;i<16 && n<=max;i++,n++)
595                                 len += snprintf(page + len, count - len,
596                                                 "%2.2x ",read_nic_byte(dev,(page0|n)));
597                 }
598         }else{
599                 len += snprintf(page + len, count - len,
600                                 "\n####################page %x##################\n ", (page0>>8));
601                 for(n=0;n<=max;)
602                 {
603                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
604                         for(i=0;i<4 && n<=max;n+=4,i++)
605                                 len += snprintf(page + len, count - len,
606                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
607                 }
608         }
609         len += snprintf(page + len, count - len,"\n");
610         *eof = 1;
611         return len;
612
613 }
614 static int proc_get_registers_1(char *page, char **start,
615                           off_t offset, int count,
616                           int *eof, void *data)
617 {
618         struct net_device *dev = data;
619 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
620
621         int len = 0;
622         int i,n,page0;
623
624         int max=0xff;
625         page0 = 0x100;
626
627         /* This dump the current register page */
628                 len += snprintf(page + len, count - len,
629                                 "\n####################page %x##################\n ", (page0>>8));
630                 for(n=0;n<=max;)
631                 {
632                         len += snprintf(page + len, count - len,
633                                         "\nD:  %2x > ",n);
634                         for(i=0;i<16 && n<=max;i++,n++)
635                                 len += snprintf(page + len, count - len,
636                                                 "%2.2x ",read_nic_byte(dev,(page0|n)));
637                 }
638         len += snprintf(page + len, count - len,"\n");
639         *eof = 1;
640         return len;
641
642 }
643 static int proc_get_registers_2(char *page, char **start,
644                           off_t offset, int count,
645                           int *eof, void *data)
646 {
647         struct net_device *dev = data;
648 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
649
650         int len = 0;
651         int i,n,page0;
652
653         int max=0xff;
654         page0 = 0x200;
655
656         /* This dump the current register page */
657                 len += snprintf(page + len, count - len,
658                                 "\n####################page %x##################\n ", (page0>>8));
659                 for(n=0;n<=max;)
660                 {
661                         len += snprintf(page + len, count - len,
662                                         "\nD:  %2x > ",n);
663                         for(i=0;i<16 && n<=max;i++,n++)
664                                 len += snprintf(page + len, count - len,
665                                                 "%2.2x ",read_nic_byte(dev,(page0|n)));
666                 }
667         len += snprintf(page + len, count - len,"\n");
668         *eof = 1;
669         return len;
670
671 }
672 static int proc_get_registers_8(char *page, char **start,
673                           off_t offset, int count,
674                           int *eof, void *data)
675 {
676         struct net_device *dev = data;
677
678         int len = 0;
679         int i,n,page0;
680
681         int max=0xff;
682         page0 = 0x800;
683
684         /* This dump the current register page */
685                 len += snprintf(page + len, count - len,
686                                 "\n####################page %x##################\n ", (page0>>8));
687                 for(n=0;n<=max;)
688                 {
689                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
690                         for(i=0;i<4 && n<=max;n+=4,i++)
691                                 len += snprintf(page + len, count - len,
692                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
693                 }
694         len += snprintf(page + len, count - len,"\n");
695         *eof = 1;
696         return len;
697
698         }
699 static int proc_get_registers_9(char *page, char **start,
700                           off_t offset, int count,
701                           int *eof, void *data)
702 {
703         struct net_device *dev = data;
704 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
705
706         int len = 0;
707         int i,n,page0;
708
709         int max=0xff;
710         page0 = 0x900;
711
712         /* This dump the current register page */
713                 len += snprintf(page + len, count - len,
714                                 "\n####################page %x##################\n ", (page0>>8));
715                 for(n=0;n<=max;)
716                 {
717                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
718                         for(i=0;i<4 && n<=max;n+=4,i++)
719                         len += snprintf(page + len, count - len,
720                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
721                 }
722         len += snprintf(page + len, count - len,"\n");
723         *eof = 1;
724         return len;
725 }
726 static int proc_get_registers_a(char *page, char **start,
727                           off_t offset, int count,
728                           int *eof, void *data)
729 {
730         struct net_device *dev = data;
731 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
732
733         int len = 0;
734         int i,n,page0;
735
736         int max=0xff;
737         page0 = 0xa00;
738
739         /* This dump the current register page */
740                                 len += snprintf(page + len, count - len,
741                                 "\n####################page %x##################\n ", (page0>>8));
742                 for(n=0;n<=max;)
743                 {
744                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
745                         for(i=0;i<4 && n<=max;n+=4,i++)
746                                 len += snprintf(page + len, count - len,
747                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
748                 }
749         len += snprintf(page + len, count - len,"\n");
750         *eof = 1;
751         return len;
752 }
753 static int proc_get_registers_b(char *page, char **start,
754                           off_t offset, int count,
755                           int *eof, void *data)
756 {
757         struct net_device *dev = data;
758 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
759
760         int len = 0;
761         int i,n,page0;
762
763         int max=0xff;
764         page0 = 0xb00;
765
766         /* This dump the current register page */
767                 len += snprintf(page + len, count - len,
768                                 "\n####################page %x##################\n ", (page0>>8));
769                 for(n=0;n<=max;)
770                 {
771                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
772                         for(i=0;i<4 && n<=max;n+=4,i++)
773                                 len += snprintf(page + len, count - len,
774                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
775                 }
776         len += snprintf(page + len, count - len,"\n");
777         *eof = 1;
778         return len;
779         }
780 static int proc_get_registers_c(char *page, char **start,
781                           off_t offset, int count,
782                           int *eof, void *data)
783 {
784         struct net_device *dev = data;
785 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
786
787         int len = 0;
788         int i,n,page0;
789
790         int max=0xff;
791         page0 = 0xc00;
792
793         /* This dump the current register page */
794                 len += snprintf(page + len, count - len,
795                                 "\n####################page %x##################\n ", (page0>>8));
796                 for(n=0;n<=max;)
797                 {
798                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
799                         for(i=0;i<4 && n<=max;n+=4,i++)
800                                 len += snprintf(page + len, count - len,
801                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
802                 }
803         len += snprintf(page + len, count - len,"\n");
804         *eof = 1;
805         return len;
806 }
807 static int proc_get_registers_d(char *page, char **start,
808                           off_t offset, int count,
809                           int *eof, void *data)
810 {
811         struct net_device *dev = data;
812 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
813
814         int len = 0;
815         int i,n,page0;
816
817         int max=0xff;
818         page0 = 0xd00;
819
820         /* This dump the current register page */
821                 len += snprintf(page + len, count - len,
822                                 "\n####################page %x##################\n ", (page0>>8));
823                 for(n=0;n<=max;)
824                 {
825                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
826                         for(i=0;i<4 && n<=max;n+=4,i++)
827                                 len += snprintf(page + len, count - len,
828                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
829                 }
830         len += snprintf(page + len, count - len,"\n");
831         *eof = 1;
832         return len;
833 }
834 static int proc_get_registers_e(char *page, char **start,
835                           off_t offset, int count,
836                           int *eof, void *data)
837 {
838         struct net_device *dev = data;
839 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
840
841         int len = 0;
842         int i,n,page0;
843
844         int max=0xff;
845         page0 = 0xe00;
846
847         /* This dump the current register page */
848                 len += snprintf(page + len, count - len,
849                                 "\n####################page %x##################\n ", (page0>>8));
850                 for(n=0;n<=max;)
851                 {
852                         len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
853                         for(i=0;i<4 && n<=max;n+=4,i++)
854                                 len += snprintf(page + len, count - len,
855                                                 "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
856                 }
857         len += snprintf(page + len, count - len,"\n");
858         *eof = 1;
859         return len;
860 }
861
862 static int proc_get_stats_tx(char *page, char **start,
863                           off_t offset, int count,
864                           int *eof, void *data)
865 {
866         struct net_device *dev = data;
867         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
868
869         int len = 0;
870
871         len += snprintf(page + len, count - len,
872                 "TX VI priority ok int: %lu\n"
873                 "TX VI priority error int: %lu\n"
874                 "TX VO priority ok int: %lu\n"
875                 "TX VO priority error int: %lu\n"
876                 "TX BE priority ok int: %lu\n"
877                 "TX BE priority error int: %lu\n"
878                 "TX BK priority ok int: %lu\n"
879                 "TX BK priority error int: %lu\n"
880                 "TX MANAGE priority ok int: %lu\n"
881                 "TX MANAGE priority error int: %lu\n"
882                 "TX BEACON priority ok int: %lu\n"
883                 "TX BEACON priority error int: %lu\n"
884 //              "TX high priority ok int: %lu\n"
885 //              "TX high priority failed error int: %lu\n"
886                 "TX queue resume: %lu\n"
887                 "TX queue stopped?: %d\n"
888                 "TX fifo overflow: %lu\n"
889 //              "TX beacon: %lu\n"
890                 "TX VI queue: %d\n"
891                 "TX VO queue: %d\n"
892                 "TX BE queue: %d\n"
893                 "TX BK queue: %d\n"
894 //              "TX HW queue: %d\n"
895                 "TX VI dropped: %lu\n"
896                 "TX VO dropped: %lu\n"
897                 "TX BE dropped: %lu\n"
898                 "TX BK dropped: %lu\n"
899                 "TX total data packets %lu\n",
900 //              "TX beacon aborted: %lu\n",
901                 priv->stats.txviokint,
902                 priv->stats.txvierr,
903                 priv->stats.txvookint,
904                 priv->stats.txvoerr,
905                 priv->stats.txbeokint,
906                 priv->stats.txbeerr,
907                 priv->stats.txbkokint,
908                 priv->stats.txbkerr,
909                 priv->stats.txmanageokint,
910                 priv->stats.txmanageerr,
911                 priv->stats.txbeaconokint,
912                 priv->stats.txbeaconerr,
913 //              priv->stats.txhpokint,
914 //              priv->stats.txhperr,
915                 priv->stats.txresumed,
916                 netif_queue_stopped(dev),
917                 priv->stats.txoverflow,
918 //              priv->stats.txbeacon,
919                 atomic_read(&(priv->tx_pending[VI_PRIORITY])),
920                 atomic_read(&(priv->tx_pending[VO_PRIORITY])),
921                 atomic_read(&(priv->tx_pending[BE_PRIORITY])),
922                 atomic_read(&(priv->tx_pending[BK_PRIORITY])),
923 //              read_nic_byte(dev, TXFIFOCOUNT),
924                 priv->stats.txvidrop,
925                 priv->stats.txvodrop,
926                 priv->stats.txbedrop,
927                 priv->stats.txbkdrop,
928                 priv->stats.txdatapkt
929 //              priv->stats.txbeaconerr
930                 );
931
932         *eof = 1;
933         return len;
934 }
935
936
937
938 static int proc_get_stats_rx(char *page, char **start,
939                           off_t offset, int count,
940                           int *eof, void *data)
941 {
942         struct net_device *dev = data;
943         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
944
945         int len = 0;
946
947         len += snprintf(page + len, count - len,
948                 "RX packets: %lu\n"
949                 "RX urb status error: %lu\n"
950                 "RX invalid urb error: %lu\n",
951                 priv->stats.rxoktotal,
952                 priv->stats.rxstaterr,
953                 priv->stats.rxurberr);
954
955         *eof = 1;
956         return len;
957 }
958
959 void rtl8192_proc_module_init(void)
960 {
961         RT_TRACE(COMP_INIT, "Initializing proc filesystem");
962         rtl8192_proc=create_proc_entry(RTL819xU_MODULE_NAME, S_IFDIR, init_net.proc_net);
963 }
964
965
966 void rtl8192_proc_module_remove(void)
967 {
968         remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
969 }
970
971
972 void rtl8192_proc_remove_one(struct net_device *dev)
973 {
974         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
975
976
977         if (priv->dir_dev) {
978         //      remove_proc_entry("stats-hw", priv->dir_dev);
979                 remove_proc_entry("stats-tx", priv->dir_dev);
980                 remove_proc_entry("stats-rx", priv->dir_dev);
981         //      remove_proc_entry("stats-ieee", priv->dir_dev);
982                 remove_proc_entry("stats-ap", priv->dir_dev);
983                 remove_proc_entry("registers", priv->dir_dev);
984                 remove_proc_entry("registers-1", priv->dir_dev);
985                 remove_proc_entry("registers-2", priv->dir_dev);
986                 remove_proc_entry("registers-8", priv->dir_dev);
987                 remove_proc_entry("registers-9", priv->dir_dev);
988                 remove_proc_entry("registers-a", priv->dir_dev);
989                 remove_proc_entry("registers-b", priv->dir_dev);
990                 remove_proc_entry("registers-c", priv->dir_dev);
991                 remove_proc_entry("registers-d", priv->dir_dev);
992                 remove_proc_entry("registers-e", priv->dir_dev);
993         //      remove_proc_entry("cck-registers",priv->dir_dev);
994         //      remove_proc_entry("ofdm-registers",priv->dir_dev);
995                 //remove_proc_entry(dev->name, rtl8192_proc);
996                 remove_proc_entry("wlan0", rtl8192_proc);
997                 priv->dir_dev = NULL;
998         }
999 }
1000
1001
1002 void rtl8192_proc_init_one(struct net_device *dev)
1003 {
1004         struct proc_dir_entry *e;
1005         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1006         priv->dir_dev = create_proc_entry(dev->name,
1007                                           S_IFDIR | S_IRUGO | S_IXUGO,
1008                                           rtl8192_proc);
1009         if (!priv->dir_dev) {
1010                 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
1011                       dev->name);
1012                 return;
1013         }
1014         e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
1015                                    priv->dir_dev, proc_get_stats_rx, dev);
1016
1017         if (!e) {
1018                 RT_TRACE(COMP_ERR,"Unable to initialize "
1019                       "/proc/net/rtl8192/%s/stats-rx\n",
1020                       dev->name);
1021         }
1022
1023
1024         e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
1025                                    priv->dir_dev, proc_get_stats_tx, dev);
1026
1027         if (!e) {
1028                 RT_TRACE(COMP_ERR, "Unable to initialize "
1029                       "/proc/net/rtl8192/%s/stats-tx\n",
1030                       dev->name);
1031         }
1032
1033         e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
1034                                    priv->dir_dev, proc_get_stats_ap, dev);
1035
1036         if (!e) {
1037                 RT_TRACE(COMP_ERR, "Unable to initialize "
1038                       "/proc/net/rtl8192/%s/stats-ap\n",
1039                       dev->name);
1040         }
1041
1042         e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
1043                                    priv->dir_dev, proc_get_registers, dev);
1044         if (!e) {
1045                 RT_TRACE(COMP_ERR, "Unable to initialize "
1046                       "/proc/net/rtl8192/%s/registers\n",
1047                       dev->name);
1048         }
1049         e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
1050                                    priv->dir_dev, proc_get_registers_1, dev);
1051         if (!e) {
1052                 RT_TRACE(COMP_ERR, "Unable to initialize "
1053                       "/proc/net/rtl8192/%s/registers-1\n",
1054                       dev->name);
1055         }
1056         e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
1057                                    priv->dir_dev, proc_get_registers_2, dev);
1058         if (!e) {
1059                 RT_TRACE(COMP_ERR, "Unable to initialize "
1060                       "/proc/net/rtl8192/%s/registers-2\n",
1061                       dev->name);
1062         }
1063         e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
1064                                    priv->dir_dev, proc_get_registers_8, dev);
1065         if (!e) {
1066                 RT_TRACE(COMP_ERR, "Unable to initialize "
1067                       "/proc/net/rtl8192/%s/registers-8\n",
1068                       dev->name);
1069         }
1070         e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
1071                                    priv->dir_dev, proc_get_registers_9, dev);
1072         if (!e) {
1073                 RT_TRACE(COMP_ERR, "Unable to initialize "
1074                       "/proc/net/rtl8192/%s/registers-9\n",
1075                       dev->name);
1076         }
1077         e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
1078                                    priv->dir_dev, proc_get_registers_a, dev);
1079         if (!e) {
1080                 RT_TRACE(COMP_ERR, "Unable to initialize "
1081                       "/proc/net/rtl8192/%s/registers-a\n",
1082                       dev->name);
1083         }
1084         e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
1085                                    priv->dir_dev, proc_get_registers_b, dev);
1086         if (!e) {
1087                 RT_TRACE(COMP_ERR, "Unable to initialize "
1088                       "/proc/net/rtl8192/%s/registers-b\n",
1089                       dev->name);
1090         }
1091         e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
1092                                    priv->dir_dev, proc_get_registers_c, dev);
1093         if (!e) {
1094                 RT_TRACE(COMP_ERR, "Unable to initialize "
1095                       "/proc/net/rtl8192/%s/registers-c\n",
1096                       dev->name);
1097         }
1098         e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
1099                                    priv->dir_dev, proc_get_registers_d, dev);
1100         if (!e) {
1101                 RT_TRACE(COMP_ERR, "Unable to initialize "
1102                       "/proc/net/rtl8192/%s/registers-d\n",
1103                       dev->name);
1104         }
1105         e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
1106                                    priv->dir_dev, proc_get_registers_e, dev);
1107         if (!e) {
1108                 RT_TRACE(COMP_ERR, "Unable to initialize "
1109                       "/proc/net/rtl8192/%s/registers-e\n",
1110                       dev->name);
1111         }
1112 }
1113 /****************************************************************************
1114    -----------------------------MISC STUFF-------------------------
1115 *****************************************************************************/
1116
1117 /* this is only for debugging */
1118 void print_buffer(u32 *buffer, int len)
1119 {
1120         int i;
1121         u8 *buf =(u8*)buffer;
1122
1123         printk("ASCII BUFFER DUMP (len: %x):\n",len);
1124
1125         for(i=0;i<len;i++)
1126                 printk("%c",buf[i]);
1127
1128         printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
1129
1130         for(i=0;i<len;i++)
1131                 printk("%x",buf[i]);
1132
1133         printk("\n");
1134 }
1135
1136 //short check_nic_enough_desc(struct net_device *dev, priority_t priority)
1137 short check_nic_enough_desc(struct net_device *dev,int queue_index)
1138 {
1139         struct r8192_priv *priv = ieee80211_priv(dev);
1140         int used = atomic_read(&priv->tx_pending[queue_index]);
1141
1142         return (used < MAX_TX_URB);
1143 }
1144
1145 void tx_timeout(struct net_device *dev)
1146 {
1147         struct r8192_priv *priv = ieee80211_priv(dev);
1148         //rtl8192_commit(dev);
1149
1150         schedule_work(&priv->reset_wq);
1151         //DMESG("TXTIMEOUT");
1152 }
1153
1154
1155 /* this is only for debug */
1156 void dump_eprom(struct net_device *dev)
1157 {
1158         int i;
1159         for(i=0; i<63; i++)
1160                 RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev,i));
1161 }
1162
1163 /* this is only for debug */
1164 void rtl8192_dump_reg(struct net_device *dev)
1165 {
1166         int i;
1167         int n;
1168         int max=0x1ff;
1169
1170         RT_TRACE(COMP_PHY, "Dumping NIC register map");
1171
1172         for(n=0;n<=max;)
1173         {
1174                 printk( "\nD: %2x> ", n);
1175                 for(i=0;i<16 && n<=max;i++,n++)
1176                         printk("%2x ",read_nic_byte(dev,n));
1177         }
1178         printk("\n");
1179 }
1180
1181 /****************************************************************************
1182       ------------------------------HW STUFF---------------------------
1183 *****************************************************************************/
1184
1185 void rtl8192_set_mode(struct net_device *dev,int mode)
1186 {
1187         u8 ecmd;
1188         ecmd=read_nic_byte(dev, EPROM_CMD);
1189         ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
1190         ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
1191         ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
1192         ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
1193         write_nic_byte(dev, EPROM_CMD, ecmd);
1194 }
1195
1196
1197 void rtl8192_update_msr(struct net_device *dev)
1198 {
1199         struct r8192_priv *priv = ieee80211_priv(dev);
1200         u8 msr;
1201
1202         msr  = read_nic_byte(dev, MSR);
1203         msr &= ~ MSR_LINK_MASK;
1204
1205         /* do not change in link_state != WLAN_LINK_ASSOCIATED.
1206          * msr must be updated if the state is ASSOCIATING.
1207          * this is intentional and make sense for ad-hoc and
1208          * master (see the create BSS/IBSS func)
1209          */
1210         if (priv->ieee80211->state == IEEE80211_LINKED){
1211
1212                 if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
1213                         msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
1214                 else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1215                         msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
1216                 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
1217                         msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
1218
1219         }else
1220                 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
1221
1222         write_nic_byte(dev, MSR, msr);
1223 }
1224
1225 void rtl8192_set_chan(struct net_device *dev,short ch)
1226 {
1227         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1228 //      u32 tx;
1229         RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
1230         //printk("=====>%s()====ch:%d\n", __FUNCTION__, ch);
1231         priv->chan=ch;
1232
1233         /* this hack should avoid frame TX during channel setting*/
1234
1235
1236 //      tx = read_nic_dword(dev,TX_CONF);
1237 //      tx &= ~TX_LOOPBACK_MASK;
1238
1239 #ifndef LOOP_TEST
1240 //      write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
1241
1242         //need to implement rf set channel here WB
1243
1244         if (priv->rf_set_chan)
1245         priv->rf_set_chan(dev,priv->chan);
1246         mdelay(10);
1247 //      write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
1248 #endif
1249 }
1250
1251 static void rtl8192_rx_isr(struct urb *urb);
1252
1253 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
1254 {
1255
1256                 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
1257                                 + pstats->RxBufShift);
1258
1259 }
1260 static int rtl8192_rx_initiate(struct net_device*dev)
1261 {
1262         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1263         struct urb *entry;
1264         struct sk_buff *skb;
1265         struct rtl8192_rx_info *info;
1266
1267         /* nomal packet rx procedure */
1268         while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
1269                 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
1270                 if (!skb)
1271                         break;
1272                 entry = usb_alloc_urb(0, GFP_KERNEL);
1273                 if (!entry) {
1274                         kfree_skb(skb);
1275                         break;
1276                 }
1277 //              printk("nomal packet IN request!\n");
1278                 usb_fill_bulk_urb(entry, priv->udev,
1279                                   usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
1280                                   RX_URB_SIZE, rtl8192_rx_isr, skb);
1281                 info = (struct rtl8192_rx_info *) skb->cb;
1282                 info->urb = entry;
1283                 info->dev = dev;
1284                 info->out_pipe = 3; //denote rx normal packet queue
1285                 skb_queue_tail(&priv->rx_queue, skb);
1286                 usb_submit_urb(entry, GFP_KERNEL);
1287         }
1288
1289         /* command packet rx procedure */
1290         while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
1291 //              printk("command packet IN request!\n");
1292                 skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
1293                 if (!skb)
1294                         break;
1295                 entry = usb_alloc_urb(0, GFP_KERNEL);
1296                 if (!entry) {
1297                         kfree_skb(skb);
1298                         break;
1299                 }
1300                 usb_fill_bulk_urb(entry, priv->udev,
1301                                   usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
1302                                   RX_URB_SIZE, rtl8192_rx_isr, skb);
1303                 info = (struct rtl8192_rx_info *) skb->cb;
1304                 info->urb = entry;
1305                 info->dev = dev;
1306                    info->out_pipe = 9; //denote rx cmd packet queue
1307                 skb_queue_tail(&priv->rx_queue, skb);
1308                 usb_submit_urb(entry, GFP_KERNEL);
1309         }
1310
1311         return 0;
1312 }
1313
1314 void rtl8192_set_rxconf(struct net_device *dev)
1315 {
1316         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1317         u32 rxconf;
1318
1319         rxconf=read_nic_dword(dev,RCR);
1320         rxconf = rxconf &~ MAC_FILTER_MASK;
1321         rxconf = rxconf | RCR_AMF;
1322         rxconf = rxconf | RCR_ADF;
1323         rxconf = rxconf | RCR_AB;
1324         rxconf = rxconf | RCR_AM;
1325         //rxconf = rxconf | RCR_ACF;
1326
1327         if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
1328
1329         if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
1330            dev->flags & IFF_PROMISC){
1331                 rxconf = rxconf | RCR_AAP;
1332         } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
1333                 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
1334                 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
1335         }*/else{
1336                 rxconf = rxconf | RCR_APM;
1337                 rxconf = rxconf | RCR_CBSSID;
1338         }
1339
1340
1341         if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
1342                 rxconf = rxconf | RCR_AICV;
1343                 rxconf = rxconf | RCR_APWRMGT;
1344         }
1345
1346         if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
1347                 rxconf = rxconf | RCR_ACRC32;
1348
1349
1350         rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
1351         rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
1352         rxconf = rxconf &~ MAX_RX_DMA_MASK;
1353         rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
1354
1355 //      rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
1356         rxconf = rxconf | RCR_ONLYERLPKT;
1357
1358 //      rxconf = rxconf &~ RCR_CS_MASK;
1359 //      rxconf = rxconf | (1<<RCR_CS_SHIFT);
1360
1361         write_nic_dword(dev, RCR, rxconf);
1362
1363         #ifdef DEBUG_RX
1364         DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
1365         #endif
1366 }
1367 //wait to be removed
1368 void rtl8192_rx_enable(struct net_device *dev)
1369 {
1370         //u8 cmd;
1371
1372         //struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1373
1374         rtl8192_rx_initiate(dev);
1375
1376 //      rtl8192_set_rxconf(dev);
1377 }
1378
1379
1380 void rtl8192_tx_enable(struct net_device *dev)
1381 {
1382 }
1383
1384 void rtl8192_rtx_disable(struct net_device *dev)
1385 {
1386         u8 cmd;
1387         struct r8192_priv *priv = ieee80211_priv(dev);
1388         struct sk_buff *skb;
1389         struct rtl8192_rx_info *info;
1390
1391         cmd=read_nic_byte(dev,CMDR);
1392         write_nic_byte(dev, CMDR, cmd &~ \
1393                 (CR_TE|CR_RE));
1394         force_pci_posting(dev);
1395         mdelay(10);
1396
1397         while ((skb = __skb_dequeue(&priv->rx_queue))) {
1398                 info = (struct rtl8192_rx_info *) skb->cb;
1399                 if (!info->urb)
1400                         continue;
1401
1402                 usb_kill_urb(info->urb);
1403                 kfree_skb(skb);
1404         }
1405
1406         if (skb_queue_len(&priv->skb_queue)) {
1407                 printk(KERN_WARNING "skb_queue not empty\n");
1408         }
1409
1410         skb_queue_purge(&priv->skb_queue);
1411         return;
1412 }
1413
1414
1415 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
1416 {
1417         return 0;
1418 }
1419
1420 inline u16 ieeerate2rtlrate(int rate)
1421 {
1422         switch(rate){
1423         case 10:
1424         return 0;
1425         case 20:
1426         return 1;
1427         case 55:
1428         return 2;
1429         case 110:
1430         return 3;
1431         case 60:
1432         return 4;
1433         case 90:
1434         return 5;
1435         case 120:
1436         return 6;
1437         case 180:
1438         return 7;
1439         case 240:
1440         return 8;
1441         case 360:
1442         return 9;
1443         case 480:
1444         return 10;
1445         case 540:
1446         return 11;
1447         default:
1448         return 3;
1449
1450         }
1451 }
1452 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
1453 inline u16 rtl8192_rate2rate(short rate)
1454 {
1455         if (rate >11) return 0;
1456         return rtl_rate[rate];
1457 }
1458
1459 static void rtl8192_rx_isr(struct urb *urb)
1460 {
1461         struct sk_buff *skb = (struct sk_buff *) urb->context;
1462         struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1463         struct net_device *dev = info->dev;
1464         struct r8192_priv *priv = ieee80211_priv(dev);
1465         int out_pipe = info->out_pipe;
1466         int err;
1467         if(!priv->up)
1468                 return;
1469         if (unlikely(urb->status)) {
1470                 info->urb = NULL;
1471                 priv->stats.rxstaterr++;
1472                 priv->ieee80211->stats.rx_errors++;
1473                 usb_free_urb(urb);
1474         //      printk("%s():rx status err\n",__FUNCTION__);
1475                 return;
1476         }
1477
1478         skb_unlink(skb, &priv->rx_queue);
1479         skb_put(skb, urb->actual_length);
1480
1481         skb_queue_tail(&priv->skb_queue, skb);
1482         tasklet_schedule(&priv->irq_rx_tasklet);
1483
1484         skb = dev_alloc_skb(RX_URB_SIZE);
1485         if (unlikely(!skb)) {
1486                 usb_free_urb(urb);
1487                 printk("%s():can,t alloc skb\n",__FUNCTION__);
1488                 /* TODO check rx queue length and refill *somewhere* */
1489                 return;
1490         }
1491
1492         usb_fill_bulk_urb(urb, priv->udev,
1493                         usb_rcvbulkpipe(priv->udev, out_pipe),
1494                         skb_tail_pointer(skb),
1495                         RX_URB_SIZE, rtl8192_rx_isr, skb);
1496
1497         info = (struct rtl8192_rx_info *) skb->cb;
1498         info->urb = urb;
1499         info->dev = dev;
1500         info->out_pipe = out_pipe;
1501
1502         urb->transfer_buffer = skb_tail_pointer(skb);
1503         urb->context = skb;
1504         skb_queue_tail(&priv->rx_queue, skb);
1505         err = usb_submit_urb(urb, GFP_ATOMIC);
1506         if(err && err != -EPERM)
1507                 printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
1508 }
1509
1510 u32
1511 rtl819xusb_rx_command_packet(
1512         struct net_device *dev,
1513         struct ieee80211_rx_stats *pstats
1514         )
1515 {
1516         u32     status;
1517
1518         //RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
1519
1520         status = cmpk_message_handle_rx(dev, pstats);
1521         if (status)
1522         {
1523                 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1524         }
1525         else
1526         {
1527                 //RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
1528         }
1529
1530         //RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
1531         return status;
1532 }
1533
1534 void rtl8192_data_hard_stop(struct net_device *dev)
1535 {
1536         //FIXME !!
1537 }
1538
1539
1540 void rtl8192_data_hard_resume(struct net_device *dev)
1541 {
1542         // FIXME !!
1543 }
1544
1545 /* this function TX data frames when the ieee80211 stack requires this.
1546  * It checks also if we need to stop the ieee tx queue, eventually do it
1547  */
1548 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1549 {
1550         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1551         int ret;
1552         unsigned long flags;
1553         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1554         u8 queue_index = tcb_desc->queue_index;
1555
1556         /* shall not be referred by command packet */
1557         assert(queue_index != TXCMD_QUEUE);
1558
1559         spin_lock_irqsave(&priv->tx_lock,flags);
1560
1561         memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1562 //      tcb_desc->RATRIndex = 7;
1563 //      tcb_desc->bTxDisableRateFallBack = 1;
1564 //      tcb_desc->bTxUseDriverAssingedRate = 1;
1565         tcb_desc->bTxEnableFwCalcDur = 1;
1566         skb_push(skb, priv->ieee80211->tx_headroom);
1567         ret = priv->ops->rtl819x_tx(dev, skb);
1568
1569         //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1570         //priv->ieee80211->stats.tx_packets++;
1571
1572         spin_unlock_irqrestore(&priv->tx_lock,flags);
1573
1574 //      return ret;
1575         return;
1576 }
1577
1578 /* This is a rough attempt to TX a frame
1579  * This is called by the ieee 80211 stack to TX management frames.
1580  * If the ring is full packet are dropped (for data frame the queue
1581  * is stopped before this can happen).
1582  */
1583 int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
1584 {
1585         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1586         int ret;
1587         unsigned long flags;
1588         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1589         u8 queue_index = tcb_desc->queue_index;
1590
1591
1592         spin_lock_irqsave(&priv->tx_lock,flags);
1593
1594         memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1595         if(queue_index == TXCMD_QUEUE) {
1596                 skb_push(skb, USB_HWDESC_HEADER_LEN);
1597                 priv->ops->rtl819x_tx_cmd(dev, skb);
1598                 ret = 1;
1599                 spin_unlock_irqrestore(&priv->tx_lock,flags);
1600                 return ret;
1601         } else {
1602                 skb_push(skb, priv->ieee80211->tx_headroom);
1603                 ret = priv->ops->rtl819x_tx(dev, skb);
1604         }
1605
1606         spin_unlock_irqrestore(&priv->tx_lock,flags);
1607
1608         return ret;
1609 }
1610
1611
1612 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1613
1614
1615 static void rtl8192_tx_isr(struct urb *tx_urb)
1616 {
1617         struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
1618         struct net_device *dev = NULL;
1619         struct r8192_priv *priv = NULL;
1620         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1621         u8  queue_index = tcb_desc->queue_index;
1622 //      bool bToSend0Byte;
1623 //      u16 BufLen = skb->len;
1624
1625         memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
1626         priv = ieee80211_priv(dev);
1627
1628         if(tcb_desc->queue_index != TXCMD_QUEUE) {
1629                 if(tx_urb->status == 0) {
1630                 //      dev->trans_start = jiffies;
1631                         // As act as station mode, destion shall be  unicast address.
1632                         //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1633                         //priv->ieee80211->stats.tx_packets++;
1634                         priv->stats.txoktotal++;
1635                         priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1636                         priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1637                 } else {
1638                         priv->ieee80211->stats.tx_errors++;
1639                         //priv->stats.txmanageerr++;
1640                         /* TODO */
1641                 }
1642         }
1643
1644         /* free skb and tx_urb */
1645         if(skb != NULL) {
1646                 dev_kfree_skb_any(skb);
1647                 usb_free_urb(tx_urb);
1648                 atomic_dec(&priv->tx_pending[queue_index]);
1649         }
1650
1651         {
1652                 //
1653                 // Handle HW Beacon:
1654                 // We had transfer our beacon frame to host controler at this moment.
1655                 //
1656                 //
1657                 // Caution:
1658                 // Handling the wait queue of command packets.
1659                 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1660                 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1661                 //
1662         if (queue_index == MGNT_QUEUE){
1663         if (priv->ieee80211->ack_tx_to_ieee){
1664             if (rtl8192_is_tx_queue_empty(dev)){
1665                 priv->ieee80211->ack_tx_to_ieee = 0;
1666                 ieee80211_ps_tx_ack(priv->ieee80211, 1);
1667             }
1668         }
1669     }
1670                 /* Handle MPDU in wait queue. */
1671                 if(queue_index != BEACON_QUEUE) {
1672                         /* Don't send data frame during scanning.*/
1673                         if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1674                                         (!(priv->ieee80211->queue_stop))) {
1675                                 if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1676                                         priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1677
1678                                 return; //modified by david to avoid further processing AMSDU
1679                         }
1680                 }
1681         }
1682 }
1683
1684 void rtl8192_beacon_stop(struct net_device *dev)
1685 {
1686         u8 msr, msrm, msr2;
1687         struct r8192_priv *priv = ieee80211_priv(dev);
1688
1689         msr  = read_nic_byte(dev, MSR);
1690         msrm = msr & MSR_LINK_MASK;
1691         msr2 = msr & ~MSR_LINK_MASK;
1692
1693         if(NIC_8192U == priv->card_8192) {
1694                 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1695         }
1696         if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1697                 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
1698                 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1699                 write_nic_byte(dev, MSR, msr);
1700         }
1701 }
1702
1703 void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
1704 {
1705          struct r8192_priv *priv = ieee80211_priv(dev);
1706          struct ieee80211_network *net;
1707          u8 i=0, basic_rate = 0;
1708          net = & priv->ieee80211->current_network;
1709
1710          for (i=0; i<net->rates_len; i++)
1711          {
1712                  basic_rate = net->rates[i]&0x7f;
1713                  switch(basic_rate)
1714                  {
1715                          case MGN_1M:   *rate_config |= RRSR_1M;        break;
1716                          case MGN_2M:   *rate_config |= RRSR_2M;        break;
1717                          case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
1718                          case MGN_11M:  *rate_config |= RRSR_11M;       break;
1719                          case MGN_6M:   *rate_config |= RRSR_6M;        break;
1720                          case MGN_9M:   *rate_config |= RRSR_9M;        break;
1721                          case MGN_12M:  *rate_config |= RRSR_12M;       break;
1722                          case MGN_18M:  *rate_config |= RRSR_18M;       break;
1723                          case MGN_24M:  *rate_config |= RRSR_24M;       break;
1724                          case MGN_36M:  *rate_config |= RRSR_36M;       break;
1725                          case MGN_48M:  *rate_config |= RRSR_48M;       break;
1726                          case MGN_54M:  *rate_config |= RRSR_54M;       break;
1727                  }
1728          }
1729          for (i=0; i<net->rates_ex_len; i++)
1730          {
1731                  basic_rate = net->rates_ex[i]&0x7f;
1732                  switch(basic_rate)
1733                  {
1734                          case MGN_1M:   *rate_config |= RRSR_1M;        break;
1735                          case MGN_2M:   *rate_config |= RRSR_2M;        break;
1736                          case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
1737                          case MGN_11M:  *rate_config |= RRSR_11M;       break;
1738                          case MGN_6M:   *rate_config |= RRSR_6M;        break;
1739                          case MGN_9M:   *rate_config |= RRSR_9M;        break;
1740                          case MGN_12M:  *rate_config |= RRSR_12M;       break;
1741                          case MGN_18M:  *rate_config |= RRSR_18M;       break;
1742                          case MGN_24M:  *rate_config |= RRSR_24M;       break;
1743                          case MGN_36M:  *rate_config |= RRSR_36M;       break;
1744                          case MGN_48M:  *rate_config |= RRSR_48M;       break;
1745                          case MGN_54M:  *rate_config |= RRSR_54M;       break;
1746                  }
1747          }
1748 }
1749
1750
1751 #define SHORT_SLOT_TIME 9
1752 #define NON_SHORT_SLOT_TIME 20
1753
1754 void rtl8192_update_cap(struct net_device* dev, u16 cap)
1755 {
1756         //u32 tmp = 0;
1757         struct r8192_priv *priv = ieee80211_priv(dev);
1758         struct ieee80211_network *net = &priv->ieee80211->current_network;
1759         priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1760
1761         //LZM MOD 090303 HW_VAR_ACK_PREAMBLE
1762         if(0)
1763         {
1764                 u8 tmp = 0;
1765                 tmp = ((priv->nCur40MhzPrimeSC) << 5);
1766                 if (priv->short_preamble)
1767                         tmp |= 0x80;
1768                 write_nic_byte(dev, RRSR+2, tmp);
1769         }
1770
1771         if (net->mode & (IEEE_G|IEEE_N_24G))
1772         {
1773                 u8 slot_time = 0;
1774                 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
1775                 {//short slot time
1776                         slot_time = SHORT_SLOT_TIME;
1777                 }
1778                 else //long slot time
1779                         slot_time = NON_SHORT_SLOT_TIME;
1780                 priv->slot_time = slot_time;
1781                 write_nic_byte(dev, SLOT_TIME, slot_time);
1782         }
1783
1784 }
1785 void rtl8192_net_update(struct net_device *dev)
1786 {
1787
1788         struct r8192_priv *priv = ieee80211_priv(dev);
1789         struct ieee80211_network *net;
1790         u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1791         u16 rate_config = 0;
1792         net = & priv->ieee80211->current_network;
1793
1794         rtl8192_config_rate(dev, &rate_config);
1795         priv->basic_rate = rate_config &= 0x15f;
1796
1797         write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
1798         write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
1799         //for(i=0;i<ETH_ALEN;i++)
1800         //      write_nic_byte(dev,BSSID+i,net->bssid[i]);
1801
1802         rtl8192_update_msr(dev);
1803 //      rtl8192_update_cap(dev, net->capability);
1804         if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1805         {
1806         write_nic_word(dev, ATIMWND, 2);
1807         write_nic_word(dev, BCN_DMATIME, 1023);
1808         write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1809 //      write_nic_word(dev, BcnIntTime, 100);
1810         write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1811         write_nic_byte(dev, BCN_ERR_THRESH, 100);
1812                 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1813         // TODO: BcnIFS may required to be changed on ASIC
1814                 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1815
1816         write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1817         }
1818
1819
1820
1821 }
1822
1823 //temporary hw beacon is not used any more.
1824 //open it when necessary
1825 #if 1
1826 void rtl819xusb_beacon_tx(struct net_device *dev,u16  tx_rate)
1827 {
1828 }
1829 #endif
1830 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1831 {
1832         if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1833                 return 1;
1834         else return 0;
1835 }
1836
1837 u16 N_DBPSOfRate(u16 DataRate);
1838
1839 u16 ComputeTxTime(
1840         u16             FrameLength,
1841         u16             DataRate,
1842         u8              bManagementFrame,
1843         u8              bShortPreamble
1844 )
1845 {
1846         u16     FrameTime;
1847         u16     N_DBPS;
1848         u16     Ceiling;
1849
1850         if( rtl8192_IsWirelessBMode(DataRate) )
1851         {
1852                 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1853                 {       // long preamble
1854                         FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1855                 }
1856                 else
1857                 {       // Short preamble
1858                         FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1859                 }
1860                 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1861                                 FrameTime ++;
1862         } else {        //802.11g DSSS-OFDM PLCP length field calculation.
1863                 N_DBPS = N_DBPSOfRate(DataRate);
1864                 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1865                                 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1866                 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1867         }
1868         return FrameTime;
1869 }
1870
1871 u16 N_DBPSOfRate(u16 DataRate)
1872 {
1873          u16 N_DBPS = 24;
1874
1875          switch(DataRate)
1876          {
1877          case 60:
1878           N_DBPS = 24;
1879           break;
1880
1881          case 90:
1882           N_DBPS = 36;
1883           break;
1884
1885          case 120:
1886           N_DBPS = 48;
1887           break;
1888
1889          case 180:
1890           N_DBPS = 72;
1891           break;
1892
1893          case 240:
1894           N_DBPS = 96;
1895           break;
1896
1897          case 360:
1898           N_DBPS = 144;
1899           break;
1900
1901          case 480:
1902           N_DBPS = 192;
1903           break;
1904
1905          case 540:
1906           N_DBPS = 216;
1907           break;
1908
1909          default:
1910           break;
1911          }
1912
1913          return N_DBPS;
1914 }
1915
1916 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1917 {
1918         usb_free_urb(tx_cmd_urb);
1919 }
1920
1921 unsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
1922
1923         if(tx_queue >= 9)
1924         {
1925                 RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
1926                 return 0x04;
1927         }
1928         return priv->txqueue_to_outpipemap[tx_queue];
1929 }
1930
1931 short rtl8192SU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1932 {
1933         struct r8192_priv *priv = ieee80211_priv(dev);
1934         int                     status;
1935         struct urb              *tx_urb;
1936         unsigned int            idx_pipe;
1937         tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1938         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1939         u8 queue_index = tcb_desc->queue_index;
1940         u32                     PktSize = 0;
1941
1942         //printk("\n %s::::::::::::::::::::::queue_index = %d\n",__FUNCTION__, queue_index);
1943         atomic_inc(&priv->tx_pending[queue_index]);
1944
1945         tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
1946         if(!tx_urb){
1947                 dev_kfree_skb(skb);
1948                 return -ENOMEM;
1949         }
1950
1951         memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1952
1953         /* Tx descriptor ought to be set according to the skb->cb */
1954         pdesc->LINIP = tcb_desc->bLastIniPkt;
1955         PktSize = (u16)(skb->len - USB_HWDESC_HEADER_LEN);
1956         pdesc->PktSize = PktSize;
1957         //printk("PKTSize = %d %x\n",pdesc->PktSize,pdesc->PktSize);
1958         //----------------------------------------------------------------------------
1959         // Fill up USB_OUT_CONTEXT.
1960         //----------------------------------------------------------------------------
1961         // Get index to out pipe from specified QueueID.
1962         idx_pipe = txqueue2outpipe(priv,queue_index);
1963         //printk("=============>%s queue_index:%d, outpipe:%d\n", __func__,queue_index,priv->RtOutPipes[idx_pipe]);
1964
1965         usb_fill_bulk_urb(tx_urb,
1966                                     priv->udev,
1967                                     usb_sndbulkpipe(priv->udev,priv->RtOutPipes[idx_pipe]),
1968                                     skb->data,
1969                                     skb->len,
1970                                     rtl8192_tx_isr,
1971                                     skb);
1972
1973         status = usb_submit_urb(tx_urb, GFP_ATOMIC);
1974         if (!status){
1975                 return 0;
1976         }else{
1977                 printk("Error TX CMD URB, error %d",
1978                                 status);
1979                 return -1;
1980         }
1981 }
1982
1983 /*
1984  * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
1985  * in TxFwInfo data structure
1986  * 2006.10.30 by Emily
1987  *
1988  * \param QUEUEID       Software Queue
1989 */
1990 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
1991 {
1992         u8 QueueSelect = 0x0;       //defualt set to
1993
1994         switch(QueueID) {
1995                 case BE_QUEUE:
1996                         QueueSelect = QSLT_BE;  //or QSelect = pTcb->priority;
1997                         break;
1998
1999                 case BK_QUEUE:
2000                         QueueSelect = QSLT_BK;  //or QSelect = pTcb->priority;
2001                         break;
2002
2003                 case VO_QUEUE:
2004                         QueueSelect = QSLT_VO;  //or QSelect = pTcb->priority;
2005                         break;
2006
2007                 case VI_QUEUE:
2008                         QueueSelect = QSLT_VI;  //or QSelect = pTcb->priority;
2009                         break;
2010                 case MGNT_QUEUE:
2011                         QueueSelect = QSLT_MGNT;
2012                         break;
2013
2014                 case BEACON_QUEUE:
2015                         QueueSelect = QSLT_BEACON;
2016                         break;
2017
2018                         // TODO: 2006.10.30 mark other queue selection until we verify it is OK
2019                         // TODO: Remove Assertions
2020 //#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
2021                 case TXCMD_QUEUE:
2022                         QueueSelect = QSLT_CMD;
2023                         break;
2024 //#endif
2025                 case HIGH_QUEUE:
2026                         QueueSelect = QSLT_HIGH;
2027                         break;
2028
2029                 default:
2030                         RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
2031                         break;
2032         }
2033         return QueueSelect;
2034 }
2035
2036 u8 MRateToHwRate8190Pci(u8 rate)
2037 {
2038         u8      ret = DESC92S_RATE1M;
2039
2040         switch(rate)
2041         {
2042                 // CCK and OFDM non-HT rates
2043         case MGN_1M:            ret = DESC92S_RATE1M;   break;
2044         case MGN_2M:            ret = DESC92S_RATE2M;   break;
2045         case MGN_5_5M:          ret = DESC92S_RATE5_5M; break;
2046         case MGN_11M:           ret = DESC92S_RATE11M;  break;
2047         case MGN_6M:            ret = DESC92S_RATE6M;   break;
2048         case MGN_9M:            ret = DESC92S_RATE9M;   break;
2049         case MGN_12M:           ret = DESC92S_RATE12M;  break;
2050         case MGN_18M:           ret = DESC92S_RATE18M;  break;
2051         case MGN_24M:           ret = DESC92S_RATE24M;  break;
2052         case MGN_36M:           ret = DESC92S_RATE36M;  break;
2053         case MGN_48M:           ret = DESC92S_RATE48M;  break;
2054         case MGN_54M:           ret = DESC92S_RATE54M;  break;
2055
2056                 // HT rates since here
2057         case MGN_MCS0:          ret = DESC92S_RATEMCS0; break;
2058         case MGN_MCS1:          ret = DESC92S_RATEMCS1; break;
2059         case MGN_MCS2:          ret = DESC92S_RATEMCS2; break;
2060         case MGN_MCS3:          ret = DESC92S_RATEMCS3; break;
2061         case MGN_MCS4:          ret = DESC92S_RATEMCS4; break;
2062         case MGN_MCS5:          ret = DESC92S_RATEMCS5; break;
2063         case MGN_MCS6:          ret = DESC92S_RATEMCS6; break;
2064         case MGN_MCS7:          ret = DESC92S_RATEMCS7; break;
2065         case MGN_MCS8:          ret = DESC92S_RATEMCS8; break;
2066         case MGN_MCS9:          ret = DESC92S_RATEMCS9; break;
2067         case MGN_MCS10: ret = DESC92S_RATEMCS10;        break;
2068         case MGN_MCS11: ret = DESC92S_RATEMCS11;        break;
2069         case MGN_MCS12: ret = DESC92S_RATEMCS12;        break;
2070         case MGN_MCS13: ret = DESC92S_RATEMCS13;        break;
2071         case MGN_MCS14: ret = DESC92S_RATEMCS14;        break;
2072         case MGN_MCS15: ret = DESC92S_RATEMCS15;        break;
2073
2074         // Set the highest SG rate
2075         case MGN_MCS0_SG:
2076         case MGN_MCS1_SG:
2077         case MGN_MCS2_SG:
2078         case MGN_MCS3_SG:
2079         case MGN_MCS4_SG:
2080         case MGN_MCS5_SG:
2081         case MGN_MCS6_SG:
2082         case MGN_MCS7_SG:
2083         case MGN_MCS8_SG:
2084         case MGN_MCS9_SG:
2085         case MGN_MCS10_SG:
2086         case MGN_MCS11_SG:
2087         case MGN_MCS12_SG:
2088         case MGN_MCS13_SG:
2089         case MGN_MCS14_SG:
2090         case MGN_MCS15_SG:
2091         {
2092                 ret = DESC92S_RATEMCS15_SG;
2093                 break;
2094         }
2095
2096         default:                break;
2097         }
2098         return ret;
2099 }
2100
2101 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
2102 {
2103         u8   tmp_Short;
2104
2105         tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
2106
2107         if(TxHT==1 && TxRate != DESC90_RATEMCS15)
2108                 tmp_Short = 0;
2109
2110         return tmp_Short;
2111 }
2112
2113 static void tx_zero_isr(struct urb *tx_urb)
2114 {
2115         return;
2116 }
2117
2118
2119 /*
2120  * The tx procedure is just as following,  skb->cb will contain all the following
2121  *information: * priority, morefrag, rate, &dev.
2122  * */
2123  //     <Note> Buffer format for 8192S Usb bulk out:
2124 //
2125 //  --------------------------------------------------
2126 //  | 8192S Usb Tx Desc | 802_11_MAC_header |    data          |
2127 //  --------------------------------------------------
2128 //  |  32 bytes                   |       24 bytes             |0-2318 bytes|
2129 //  --------------------------------------------------
2130 //  |<------------ BufferLen ------------------------->|
2131
2132 short rtl8192SU_tx(struct net_device *dev, struct sk_buff* skb)
2133 {
2134         struct r8192_priv *priv = ieee80211_priv(dev);
2135         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
2136         tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
2137         //tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);//92su del
2138         struct usb_device *udev = priv->udev;
2139         int pend;
2140         int status;
2141         struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
2142         //int urb_len;
2143         unsigned int idx_pipe;
2144         u16             MPDUOverhead = 0;
2145         //RT_DEBUG_DATA(COMP_SEND, tcb_desc, sizeof(cb_desc));
2146
2147         pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
2148         /* we are locked here so the two atomic_read and inc are executed
2149          * without interleaves  * !!! For debug purpose           */
2150         if( pend > MAX_TX_URB){
2151                 switch (tcb_desc->queue_index) {
2152                         case VO_PRIORITY:
2153                                 priv->stats.txvodrop++;
2154                                 break;
2155                         case VI_PRIORITY:
2156                                 priv->stats.txvidrop++;
2157                                 break;
2158                         case BE_PRIORITY:
2159                                 priv->stats.txbedrop++;
2160                                 break;
2161                         default://BK_PRIORITY
2162                                 priv->stats.txbkdrop++;
2163                                 break;
2164                 }
2165                 printk("To discard skb packet!\n");
2166                 dev_kfree_skb_any(skb);
2167                 return -1;
2168         }
2169
2170         tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
2171         if(!tx_urb){
2172                 dev_kfree_skb_any(skb);
2173                 return -ENOMEM;
2174         }
2175
2176         memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2177
2178
2179                 tx_desc->NonQos = (IsQoSDataFrame(skb->data)==TRUE)? 0:1;
2180
2181         /* Fill Tx descriptor */
2182         //memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
2183
2184         // This part can just fill to the first descriptor of the frame.
2185         /* DWORD 0 */
2186         tx_desc->TxHT = (tcb_desc->data_rate&0x80)?1:0;
2187
2188
2189         tx_desc->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
2190         //tx_desc->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
2191         tx_desc->TxShort = QueryIsShort(tx_desc->TxHT, tx_desc->TxRate, tcb_desc);
2192
2193
2194         // Aggregation related
2195         if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
2196                 tx_desc->AllowAggregation = 1;
2197                 /* DWORD 1 */
2198                 //tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
2199                 //tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
2200         } else {
2201                 tx_desc->AllowAggregation = 0;
2202                 /* DWORD 1 */
2203                 //tx_fwinfo->RxMF = 0;
2204                 //tx_fwinfo->RxAMD = 0;
2205         }
2206
2207         //
2208         // <Roger_Notes> For AMPDU case, we must insert SSN into TX_DESC,
2209         // FW according as this SSN to do necessary packet retry.
2210         // 2008.06.06.
2211         //
2212         {
2213                 u8      *pSeq;
2214                 u16     Temp;
2215                 //pSeq = (u8 *)(VirtualAddress+USB_HWDESC_HEADER_LEN + FRAME_OFFSET_SEQUENCE);
2216                 pSeq = (u8 *)(skb->data+USB_HWDESC_HEADER_LEN + 22);
2217                 Temp = pSeq[0];
2218                 Temp <<= 12;
2219                 Temp |= (*(u16 *)pSeq)>>4;
2220                 tx_desc->Seq = Temp;
2221         }
2222
2223         /* Protection mode related */
2224         tx_desc->RTSEn = (tcb_desc->bRTSEnable)?1:0;
2225         tx_desc->CTS2Self = (tcb_desc->bCTSEnable)?1:0;
2226         tx_desc->RTSSTBC = (tcb_desc->bRTSSTBC)?1:0;
2227         tx_desc->RTSHT = (tcb_desc->rts_rate&0x80)?1:0;
2228         tx_desc->RTSRate =  MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
2229         tx_desc->RTSSubcarrier = (tx_desc->RTSHT==0)?(tcb_desc->RTSSC):0;
2230         tx_desc->RTSBW = (tx_desc->RTSHT==1)?((tcb_desc->bRTSBW)?1:0):0;
2231         tx_desc->RTSShort = (tx_desc->RTSHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
2232                                 (tcb_desc->bRTSUseShortGI?1:0);
2233         //LZM 090219
2234         tx_desc->DisRTSFB = 0;
2235         tx_desc->RTSRateFBLmt = 0xf;
2236
2237         // <Roger_EXP> 2008.09.22. We disable RTS rate fallback temporarily.
2238         //tx_desc->DisRTSFB = 0x01;
2239
2240         /* Set Bandwidth and sub-channel settings. */
2241         if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2242         {
2243                 if(tcb_desc->bPacketBW) {
2244                         tx_desc->TxBandwidth = 1;
2245                         tx_desc->TxSubCarrier = 0;    //By SD3's Jerry suggestion, use duplicated mode
2246                 } else {
2247                         tx_desc->TxBandwidth = 0;
2248                         tx_desc->TxSubCarrier = priv->nCur40MhzPrimeSC;
2249                 }
2250         } else {
2251                 tx_desc->TxBandwidth = 0;
2252                 tx_desc->TxSubCarrier = 0;
2253         }
2254
2255
2256         //memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2257         /* DWORD 0 */
2258         tx_desc->LINIP = 0;
2259         //tx_desc->CmdInit = 1; //92su del
2260         tx_desc->Offset =  USB_HWDESC_HEADER_LEN;
2261
2262         {
2263                 tx_desc->PktSize = (skb->len - USB_HWDESC_HEADER_LEN) & 0xffff;
2264         }
2265
2266         /*DWORD 1*/
2267         //tx_desc->SecCAMID= 0;//92su del
2268         tx_desc->RaBRSRID= tcb_desc->RATRIndex;
2269 //#ifdef RTL8192S_PREPARE_FOR_NORMAL_RELEASE
2270
2271         {
2272                 MPDUOverhead = 0;
2273                 //tx_desc->NoEnc = 1;//92su del
2274         }
2275
2276         tx_desc->SecType = 0x0;
2277
2278                 if (tcb_desc->bHwSec)
2279                         {
2280                                 switch (priv->ieee80211->pairwise_key_type)
2281                                 {
2282                                         case KEY_TYPE_WEP40:
2283                                         case KEY_TYPE_WEP104:
2284                                                  tx_desc->SecType = 0x1;
2285                                                  //tx_desc->NoEnc = 0;//92su del
2286                                                  break;
2287                                         case KEY_TYPE_TKIP:
2288                                                  tx_desc->SecType = 0x2;
2289                                                  //tx_desc->NoEnc = 0;//92su del
2290                                                  break;
2291                                         case KEY_TYPE_CCMP:
2292                                                  tx_desc->SecType = 0x3;
2293                                                  //tx_desc->NoEnc = 0;//92su del
2294                                                  break;
2295                                         case KEY_TYPE_NA:
2296                                                  tx_desc->SecType = 0x0;
2297                                                  //tx_desc->NoEnc = 1;//92su del
2298                                                  break;
2299                                         default:
2300                                                  tx_desc->SecType = 0x0;
2301                                                  //tx_desc->NoEnc = 1;//92su del
2302                                                  break;
2303                                 }
2304                         }
2305
2306         //tx_desc->TxFWInfoSize =  sizeof(tx_fwinfo_819x_usb);//92su del
2307
2308
2309         tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
2310         tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
2311         tx_desc->DataRateFBLmt = 0x1F;// Alwasy enable all rate fallback range
2312
2313         tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
2314
2315
2316         /* Fill fields that are required to be initialized in all of the descriptors */
2317         //DWORD 0
2318         tx_desc->FirstSeg = 1;
2319         tx_desc->LastSeg = 1;
2320         tx_desc->OWN = 1;
2321
2322         {
2323                 //DWORD 2
2324                 //tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
2325                 tx_desc->TxBufferSize = (u32)(skb->len);//92su mod FIXLZM
2326         }
2327
2328         /* Get index to out pipe from specified QueueID */
2329         idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
2330         //printk("=============>%s queue_index:%d, outpipe:%d\n", __func__,tcb_desc->queue_index,priv->RtOutPipes[idx_pipe]);
2331
2332         //RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
2333         //RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
2334
2335         /* To submit bulk urb */
2336         usb_fill_bulk_urb(tx_urb,
2337                                     udev,
2338                                     usb_sndbulkpipe(udev,priv->RtOutPipes[idx_pipe]),
2339                                     skb->data,
2340                                     skb->len, rtl8192_tx_isr, skb);
2341
2342         status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2343         if (!status){
2344 //we need to send 0 byte packet whenever 512N bytes/64N(HIGN SPEED/NORMAL SPEED) bytes packet has been transmitted. Otherwise, it will be halt to wait for another packet. WB. 2008.08.27
2345                 bool bSend0Byte = false;
2346                 u8 zero = 0;
2347                 if(udev->speed == USB_SPEED_HIGH)
2348                 {
2349                         if (skb->len > 0 && skb->len % 512 == 0)
2350                                 bSend0Byte = true;
2351                 }
2352                 else
2353                 {
2354                         if (skb->len > 0 && skb->len % 64 == 0)
2355                                 bSend0Byte = true;
2356                 }
2357                 if (bSend0Byte)
2358                 {
2359 #if 1
2360                         tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
2361                         if(!tx_urb_zero){
2362                                 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
2363                                 return -ENOMEM;
2364                         }
2365                         usb_fill_bulk_urb(tx_urb_zero,udev,
2366                                         usb_sndbulkpipe(udev,idx_pipe), &zero,
2367                                         0, tx_zero_isr, dev);
2368                         status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
2369                         if (status){
2370                         RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
2371                         return -1;
2372                         }
2373 #endif
2374                 }
2375                 dev->trans_start = jiffies;
2376                 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
2377                 return 0;
2378         }else{
2379                 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
2380                                 status);
2381                 return -1;
2382         }
2383 }
2384
2385 void rtl8192SU_net_update(struct net_device *dev)
2386 {
2387
2388         struct r8192_priv *priv = ieee80211_priv(dev);
2389         struct ieee80211_device* ieee = priv->ieee80211;
2390         struct ieee80211_network *net = &priv->ieee80211->current_network;
2391         //u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
2392         u16 rate_config = 0;
2393         u32 regTmp = 0;
2394         u8 rateIndex = 0;
2395         u8      retrylimit = 0x30;
2396         u16 cap = net->capability;
2397
2398         priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
2399
2400 //HW_VAR_BASIC_RATE
2401         //update Basic rate: RR, BRSR
2402         rtl8192_config_rate(dev, &rate_config); //HalSetBrateCfg
2403
2404         priv->basic_rate = rate_config  = rate_config & 0x15f;
2405
2406         // Set RRSR rate table.
2407         write_nic_byte(dev, RRSR, rate_config&0xff);
2408         write_nic_byte(dev, RRSR+1, (rate_config>>8)&0xff);
2409
2410         // Set RTS initial rate
2411         while(rate_config > 0x1)
2412         {
2413                 rate_config = (rate_config>> 1);
2414                 rateIndex++;
2415         }
2416         write_nic_byte(dev, INIRTSMCS_SEL, rateIndex);
2417 //HW_VAR_BASIC_RATE
2418
2419         //set ack preample
2420         regTmp = (priv->nCur40MhzPrimeSC) << 5;
2421         if (priv->short_preamble)
2422                 regTmp |= 0x80;
2423         write_nic_byte(dev, RRSR+2, regTmp);
2424
2425         write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
2426         write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
2427
2428         write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
2429         //2008.10.24 added by tynli for beacon changed.
2430         PHY_SetBeaconHwReg( dev, net->beacon_interval);
2431
2432         rtl8192_update_cap(dev, cap);
2433
2434         if (ieee->iw_mode == IW_MODE_ADHOC){
2435                 retrylimit = 7;
2436                 //we should enable ibss interrupt here, but disable it temporarily
2437                 if (0){
2438                         priv->irq_mask |= (IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2439                         //rtl8192_irq_disable(dev);
2440                         //rtl8192_irq_enable(dev);
2441                 }
2442         }
2443         else{
2444                 if (0){
2445                         priv->irq_mask &= ~(IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2446                         //rtl8192_irq_disable(dev);
2447                         //rtl8192_irq_enable(dev);
2448                 }
2449         }
2450
2451         priv->ShortRetryLimit = priv->LongRetryLimit = retrylimit;
2452
2453         write_nic_word(dev,     RETRY_LIMIT,
2454                                 retrylimit << RETRY_LIMIT_SHORT_SHIFT | \
2455                                 retrylimit << RETRY_LIMIT_LONG_SHIFT);
2456 }
2457
2458 void rtl8192SU_update_ratr_table(struct net_device* dev)
2459 {
2460                 struct r8192_priv* priv = ieee80211_priv(dev);
2461         struct ieee80211_device* ieee = priv->ieee80211;
2462         u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2463         //struct ieee80211_network *net = &ieee->current_network;
2464         u32 ratr_value = 0;
2465
2466         u8 rate_index = 0;
2467         int WirelessMode = ieee->mode;
2468         u8 MimoPs = ieee->pHTInfo->PeerMimoPs;
2469
2470         u8 bNMode = 0;
2471
2472         rtl8192_config_rate(dev, (u16*)(&ratr_value));
2473         ratr_value |= (*(u16*)(pMcsRate)) << 12;
2474
2475         //switch (ieee->mode)
2476         switch (WirelessMode)
2477         {
2478                 case IEEE_A:
2479                         ratr_value &= 0x00000FF0;
2480                         break;
2481                 case IEEE_B:
2482                         ratr_value &= 0x0000000D;
2483                         break;
2484                 case IEEE_G:
2485                         ratr_value &= 0x00000FF5;
2486                         break;
2487                 case IEEE_N_24G:
2488                 case IEEE_N_5G:
2489                 {
2490                         bNMode = 1;
2491
2492                         if (MimoPs == 0) //MIMO_PS_STATIC
2493                                         {
2494                                 ratr_value &= 0x0007F005;
2495                         }
2496                         else
2497                         {       // MCS rate only => for 11N mode.
2498                                 u32     ratr_mask;
2499
2500                                 // 1T2R or 1T1R, Spatial Stream 2 should be disabled
2501                                 if (    priv->rf_type == RF_1T2R ||
2502                                         priv->rf_type == RF_1T1R ||
2503                                         (ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_TX_2SS) )
2504                                                 ratr_mask = 0x000ff005;
2505                                         else
2506                                                 ratr_mask = 0x0f0ff005;
2507
2508                                 if((ieee->pHTInfo->bCurTxBW40MHz) &&
2509                                     !(ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_TX_40_MHZ))
2510                                         ratr_mask |= 0x00000010; // Set 6MBps
2511
2512                                 // Select rates for rate adaptive mechanism.
2513                                         ratr_value &= ratr_mask;
2514                                         }
2515                         }
2516                         break;
2517                 default:
2518                         if(0)
2519                         {
2520                                 if(priv->rf_type == RF_1T2R)    // 1T2R, Spatial Stream 2 should be disabled
2521                                 {
2522                                 ratr_value &= 0x000ff0f5;
2523                                 }
2524                                 else
2525                                 {
2526                                 ratr_value &= 0x0f0ff0f5;
2527                                 }
2528                         }
2529                         //printk("====>%s(), mode is not correct:%x\n", __FUNCTION__, ieee->mode);
2530                         break;
2531         }
2532
2533         ratr_value &= 0x0FFFFFFF;
2534
2535         // Get MAX MCS available.
2536         if (   (bNMode && ((ieee->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_SHORT_GI)==0)) &&
2537                 ((ieee->pHTInfo->bCurBW40MHz && ieee->pHTInfo->bCurShortGI40MHz) ||
2538                 (!ieee->pHTInfo->bCurBW40MHz && ieee->pHTInfo->bCurShortGI20MHz)))
2539         {
2540                 u8 shortGI_rate = 0;
2541                 u32 tmp_ratr_value = 0;
2542                 ratr_value |= 0x10000000;//???
2543                 tmp_ratr_value = (ratr_value>>12);
2544                 for(shortGI_rate=15; shortGI_rate>0; shortGI_rate--)
2545                 {
2546                         if((1<<shortGI_rate) & tmp_ratr_value)
2547                                 break;
2548                 }
2549                 shortGI_rate = (shortGI_rate<<12)|(shortGI_rate<<8)|(shortGI_rate<<4)|(shortGI_rate);
2550                 write_nic_byte(dev, SG_RATE, shortGI_rate);
2551                 //printk("==>SG_RATE:%x\n", read_nic_byte(dev, SG_RATE));
2552         }
2553         write_nic_dword(dev, ARFR0+rate_index*4, ratr_value);
2554         printk("=============>ARFR0+rate_index*4:%#x\n", ratr_value);
2555
2556         //2 UFWP
2557         if (ratr_value & 0xfffff000){
2558                 //printk("===>set to N mode\n");
2559                 HalSetFwCmd8192S(dev, FW_CMD_RA_REFRESH_N);
2560         }
2561         else    {
2562                 //printk("===>set to B/G mode\n");
2563                 HalSetFwCmd8192S(dev, FW_CMD_RA_REFRESH_BG);
2564         }
2565 }
2566
2567 void rtl8192SU_link_change(struct net_device *dev)
2568 {
2569         struct r8192_priv *priv = ieee80211_priv(dev);
2570         struct ieee80211_device* ieee = priv->ieee80211;
2571         //unsigned long flags;
2572         u32 reg = 0;
2573
2574         printk("=====>%s 1\n", __func__);
2575         reg = read_nic_dword(dev, RCR);
2576
2577         if (ieee->state == IEEE80211_LINKED)
2578         {
2579
2580                 rtl8192SU_net_update(dev);
2581                 rtl8192SU_update_ratr_table(dev);
2582                 ieee->SetFwCmdHandler(dev, FW_CMD_HIGH_PWR_ENABLE);
2583                 priv->ReceiveConfig = reg |= RCR_CBSSID;
2584
2585         }else{
2586                 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2587
2588         }
2589
2590         write_nic_dword(dev, RCR, reg);
2591         rtl8192_update_msr(dev);
2592
2593         printk("<=====%s 2\n", __func__);
2594 }
2595
2596 static struct ieee80211_qos_parameters def_qos_parameters = {
2597         {3,3,3,3},/* cw_min */
2598         {7,7,7,7},/* cw_max */
2599         {2,2,2,2},/* aifs */
2600         {0,0,0,0},/* flags */
2601         {0,0,0,0} /* tx_op_limit */
2602 };
2603
2604
2605 void rtl8192_update_beacon(struct work_struct * work)
2606 {
2607         struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2608         struct net_device *dev = priv->ieee80211->dev;
2609         struct ieee80211_device* ieee = priv->ieee80211;
2610         struct ieee80211_network* net = &ieee->current_network;
2611
2612         if (ieee->pHTInfo->bCurrentHTSupport)
2613                 HTUpdateSelfAndPeerSetting(ieee, net);
2614         ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2615         // Joseph test for turbo mode with AP
2616         ieee->pHTInfo->RT2RT_HT_Mode = net->bssht.RT2RT_HT_Mode;
2617         rtl8192_update_cap(dev, net->capability);
2618 }
2619 /*
2620 * background support to run QoS activate functionality
2621 */
2622 int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
2623
2624 void rtl8192_qos_activate(struct work_struct * work)
2625 {
2626         struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2627         struct net_device *dev = priv->ieee80211->dev;
2628         struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2629         u8 mode = priv->ieee80211->current_network.mode;
2630         //u32 size = sizeof(struct ieee80211_qos_parameters);
2631         u8  u1bAIFS;
2632         u32 u4bAcParam;
2633         int i;
2634
2635         if (priv == NULL)
2636                 return;
2637
2638        mutex_lock(&priv->mutex);
2639
2640         if(priv->ieee80211->state != IEEE80211_LINKED)
2641                 goto success;
2642         RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
2643         /* It better set slot time at first */
2644         /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2645         /* update the ac parameter to related registers */
2646         for(i = 0; i <  QOS_QUEUE_NUM; i++) {
2647                 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2648                 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2649                 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2650                                 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2651                                 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2652                                 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2653
2654                 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2655                 //write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4322);
2656         }
2657
2658 success:
2659        mutex_unlock(&priv->mutex);
2660 }
2661
2662 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2663                 int active_network,
2664                 struct ieee80211_network *network)
2665 {
2666         int ret = 0;
2667         u32 size = sizeof(struct ieee80211_qos_parameters);
2668
2669         if(priv->ieee80211->state !=IEEE80211_LINKED)
2670                 return ret;
2671
2672         if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2673                 return ret;
2674
2675         if (network->flags & NETWORK_HAS_QOS_MASK) {
2676                 if (active_network &&
2677                                 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2678                         network->qos_data.active = network->qos_data.supported;
2679
2680                 if ((network->qos_data.active == 1) && (active_network == 1) &&
2681                                 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2682                                 (network->qos_data.old_param_count !=
2683                                  network->qos_data.param_count)) {
2684                         network->qos_data.old_param_count =
2685                                 network->qos_data.param_count;
2686                         queue_work(priv->priv_wq, &priv->qos_activate);
2687                         RT_TRACE (COMP_QOS, "QoS parameters change call "
2688                                         "qos_activate\n");
2689                 }
2690         } else {
2691                 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2692                        &def_qos_parameters, size);
2693
2694                 if ((network->qos_data.active == 1) && (active_network == 1)) {
2695                         queue_work(priv->priv_wq, &priv->qos_activate);
2696                         RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2697                 }
2698                 network->qos_data.active = 0;
2699                 network->qos_data.supported = 0;
2700         }
2701
2702         return 0;
2703 }
2704
2705 /* handle manage frame frame beacon and probe response */
2706 static int rtl8192_handle_beacon(struct net_device * dev,
2707                                  struct ieee80211_probe_response *beacon,
2708                                  struct ieee80211_network *network)
2709 {
2710         struct r8192_priv *priv = ieee80211_priv(dev);
2711
2712         rtl8192_qos_handle_probe_response(priv,1,network);
2713         queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2714
2715         return 0;
2716
2717 }
2718
2719 /*
2720 * handling the beaconing responses. if we get different QoS setting
2721 * off the network from the associated setting, adjust the QoS
2722 * setting
2723 */
2724 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2725                                     struct ieee80211_network *network)
2726 {
2727         int ret = 0;
2728         unsigned long flags;
2729         u32 size = sizeof(struct ieee80211_qos_parameters);
2730         int set_qos_param = 0;
2731
2732         if ((priv == NULL) || (network == NULL))
2733                 return ret;
2734
2735         if(priv->ieee80211->state !=IEEE80211_LINKED)
2736                 return ret;
2737
2738         if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2739                 return ret;
2740
2741         spin_lock_irqsave(&priv->ieee80211->lock, flags);
2742         if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2743                 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2744                          &network->qos_data.parameters,\
2745                         sizeof(struct ieee80211_qos_parameters));
2746                 priv->ieee80211->current_network.qos_data.active = 1;
2747                  {
2748                         set_qos_param = 1;
2749                         /* update qos parameter for current network */
2750                         priv->ieee80211->current_network.qos_data.old_param_count = \
2751                                  priv->ieee80211->current_network.qos_data.param_count;
2752                         priv->ieee80211->current_network.qos_data.param_count = \
2753                                  network->qos_data.param_count;
2754                 }
2755         } else {
2756                 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2757                        &def_qos_parameters, size);
2758                 priv->ieee80211->current_network.qos_data.active = 0;
2759                 priv->ieee80211->current_network.qos_data.supported = 0;
2760                 set_qos_param = 1;
2761         }
2762
2763         spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2764
2765         RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
2766         if (set_qos_param == 1)
2767                 queue_work(priv->priv_wq, &priv->qos_activate);
2768
2769         return ret;
2770 }
2771
2772
2773 static int rtl8192_handle_assoc_response(struct net_device *dev,
2774                                      struct ieee80211_assoc_response_frame *resp,
2775                                      struct ieee80211_network *network)
2776 {
2777         struct r8192_priv *priv = ieee80211_priv(dev);
2778         rtl8192_qos_association_resp(priv, network);
2779         return 0;
2780 }
2781
2782
2783 void rtl8192_update_ratr_table(struct net_device* dev)
2784         //      POCTET_STRING   posLegacyRate,
2785         //      u8*                     pMcsRate)
2786         //      PRT_WLAN_STA    pEntry)
2787 {
2788         struct r8192_priv* priv = ieee80211_priv(dev);
2789         struct ieee80211_device* ieee = priv->ieee80211;
2790         u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2791         //struct ieee80211_network *net = &ieee->current_network;
2792         u32 ratr_value = 0;
2793         u8 rate_index = 0;
2794         rtl8192_config_rate(dev, (u16*)(&ratr_value));
2795         ratr_value |= (*(u16*)(pMcsRate)) << 12;
2796 //      switch (net->mode)
2797         switch (ieee->mode)
2798         {
2799                 case IEEE_A:
2800                         ratr_value &= 0x00000FF0;
2801                         break;
2802                 case IEEE_B:
2803                         ratr_value &= 0x0000000F;
2804                         break;
2805                 case IEEE_G:
2806                         ratr_value &= 0x00000FF7;
2807                         break;
2808                 case IEEE_N_24G:
2809                 case IEEE_N_5G:
2810                         if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
2811                                 ratr_value &= 0x0007F007;
2812                         else{
2813                                 if (priv->rf_type == RF_1T2R)
2814                                         ratr_value &= 0x000FF007;
2815                                 else
2816                                         ratr_value &= 0x0F81F007;
2817                         }
2818                         break;
2819                 default:
2820                         break;
2821         }
2822         ratr_value &= 0x0FFFFFFF;
2823         if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
2824                 ratr_value |= 0x80000000;
2825         }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
2826                 ratr_value |= 0x80000000;
2827         }
2828         write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2829         write_nic_byte(dev, UFWP, 1);
2830 }
2831
2832 static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
2833 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2834 bool GetNmodeSupportBySecCfg8192(struct net_device*dev)
2835 {
2836 #if 1
2837         struct r8192_priv* priv = ieee80211_priv(dev);
2838         struct ieee80211_device* ieee = priv->ieee80211;
2839         struct ieee80211_network * network = &ieee->current_network;
2840         int wpa_ie_len= ieee->wpa_ie_len;
2841         struct ieee80211_crypt_data* crypt;
2842         int encrypt;
2843         return TRUE;
2844
2845         crypt = ieee->crypt[ieee->tx_keyidx];
2846         //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
2847         encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
2848
2849         /* simply judge  */
2850         if(encrypt && (wpa_ie_len == 0)) {
2851                 /* wep encryption, no N mode setting */
2852                 return false;
2853 //      } else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
2854         } else if((wpa_ie_len != 0)) {
2855                 /* parse pairwise key type */
2856                 //if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
2857                 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))))
2858                         return true;
2859                 else
2860                         return false;
2861         } else {
2862                 return true;
2863         }
2864
2865         return true;
2866 #endif
2867 }
2868
2869 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
2870 {
2871         bool                    Reval;
2872         struct r8192_priv* priv = ieee80211_priv(dev);
2873         struct ieee80211_device* ieee = priv->ieee80211;
2874
2875 //      Added by Roger, 2008.08.29.
2876         return false;
2877
2878         if(ieee->bHalfWirelessN24GMode == true)
2879                 Reval = true;
2880         else
2881                 Reval =  false;
2882
2883         return Reval;
2884 }
2885
2886 void rtl8192_refresh_supportrate(struct r8192_priv* priv)
2887 {
2888         struct ieee80211_device* ieee = priv->ieee80211;
2889         //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
2890         if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2891         {
2892                 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2893                 //RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
2894                 //RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
2895         }
2896         else
2897                 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2898         return;
2899 }
2900
2901 u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
2902 {
2903         struct r8192_priv *priv = ieee80211_priv(dev);
2904         u8 ret = 0;
2905         switch(priv->rf_chip)
2906         {
2907                 case RF_8225:
2908                 case RF_8256:
2909                 case RF_PSEUDO_11N:
2910                 case RF_6052:
2911                         ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2912                         break;
2913                 case RF_8258:
2914                         ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2915                         break;
2916                 default:
2917                         ret = WIRELESS_MODE_B;
2918                         break;
2919         }
2920         return ret;
2921 }
2922 void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
2923 {
2924         struct r8192_priv *priv = ieee80211_priv(dev);
2925         u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2926
2927 #if 1
2928         if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
2929         {
2930                 if(bSupportMode & WIRELESS_MODE_N_24G)
2931                 {
2932                         wireless_mode = WIRELESS_MODE_N_24G;
2933                 }
2934                 else if(bSupportMode & WIRELESS_MODE_N_5G)
2935                 {
2936                         wireless_mode = WIRELESS_MODE_N_5G;
2937                 }
2938                 else if((bSupportMode & WIRELESS_MODE_A))
2939                 {
2940                         wireless_mode = WIRELESS_MODE_A;
2941                 }
2942                 else if((bSupportMode & WIRELESS_MODE_G))
2943                 {
2944                         wireless_mode = WIRELESS_MODE_G;
2945                 }
2946                 else if((bSupportMode & WIRELESS_MODE_B))
2947                 {
2948                         wireless_mode = WIRELESS_MODE_B;
2949                 }
2950                 else{
2951                         RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
2952                         wireless_mode = WIRELESS_MODE_B;
2953                 }
2954         }
2955 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we shoud wait for FPGA
2956         ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
2957 #endif
2958         //LZM 090306 usb crash here, mark it temp
2959         //write_nic_word(dev, SIFS_OFDM, 0x0e0e);
2960         priv->ieee80211->mode = wireless_mode;
2961
2962         if ((wireless_mode == WIRELESS_MODE_N_24G) ||  (wireless_mode == WIRELESS_MODE_N_5G))
2963                 priv->ieee80211->pHTInfo->bEnableHT = 1;
2964         else
2965                 priv->ieee80211->pHTInfo->bEnableHT = 0;
2966         RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
2967         rtl8192_refresh_supportrate(priv);
2968 #endif
2969
2970 }
2971
2972
2973 short rtl8192_is_tx_queue_empty(struct net_device *dev)
2974 {
2975         int i=0;
2976         struct r8192_priv *priv = ieee80211_priv(dev);
2977         //struct ieee80211_device* ieee = priv->ieee80211;
2978         for (i=0; i<=MGNT_QUEUE; i++)
2979         {
2980                 if ((i== TXCMD_QUEUE) || (i == HCCA_QUEUE) )
2981                         continue;
2982                 if (atomic_read(&priv->tx_pending[i]))
2983                 {
2984                         printk("===>tx queue is not empty:%d, %d\n", i, atomic_read(&priv->tx_pending[i]));
2985                         return 0;
2986                 }
2987         }
2988         return 1;
2989 }
2990
2991 void rtl8192_hw_sleep_down(struct net_device *dev)
2992 {
2993         RT_TRACE(COMP_POWER, "%s()============>come to sleep down\n", __FUNCTION__);
2994 #ifdef TODO
2995 //      MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
2996 #endif
2997 }
2998
2999 void rtl8192_hw_sleep_wq (struct work_struct *work)
3000 {
3001 //      struct r8180_priv *priv = container_of(work, struct r8180_priv, watch_dog_wq);
3002 //      struct ieee80211_device * ieee = (struct ieee80211_device*)
3003 //                                             container_of(work, struct ieee80211_device, watch_dog_wq);
3004         struct delayed_work *dwork = container_of(work,struct delayed_work,work);
3005         struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_sleep_wq);
3006         struct net_device *dev = ieee->dev;
3007
3008         //printk("=========>%s()\n", __FUNCTION__);
3009         rtl8192_hw_sleep_down(dev);
3010 }
3011 //      printk("dev is %d\n",dev);
3012 //      printk("&*&(^*(&(&=========>%s()\n", __FUNCTION__);
3013 void rtl8192_hw_wakeup(struct net_device* dev)
3014 {
3015 //      u32 flags = 0;
3016
3017 //      spin_lock_irqsave(&priv->ps_lock,flags);
3018         RT_TRACE(COMP_POWER, "%s()============>come to wake up\n", __FUNCTION__);
3019 #ifdef TODO
3020 //      MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS);
3021 #endif
3022         //FIXME: will we send package stored while nic is sleep?
3023 //      spin_unlock_irqrestore(&priv->ps_lock,flags);
3024 }
3025
3026 void rtl8192_hw_wakeup_wq (struct work_struct *work)
3027 {
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_wakeup_wq);
3033         struct net_device *dev = ieee->dev;
3034
3035         rtl8192_hw_wakeup(dev);
3036 }
3037
3038 #define MIN_SLEEP_TIME 50
3039 #define MAX_SLEEP_TIME 10000
3040 void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
3041 {
3042
3043         struct r8192_priv *priv = ieee80211_priv(dev);
3044
3045         u32 rb = jiffies;
3046         unsigned long flags;
3047
3048         spin_lock_irqsave(&priv->ps_lock,flags);
3049
3050         /* Writing HW register with 0 equals to disable
3051          * the timer, that is not really what we want
3052          */
3053         tl -= MSECS(4+16+7);
3054
3055         //if(tl == 0) tl = 1;
3056
3057         /* FIXME HACK FIXME HACK */
3058 //      force_pci_posting(dev);
3059         //mdelay(1);
3060
3061 //      rb = read_nic_dword(dev, TSFTR);
3062
3063         /* If the interval in witch we are requested to sleep is too
3064          * short then give up and remain awake
3065          */
3066         if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
3067                 ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
3068                 spin_unlock_irqrestore(&priv->ps_lock,flags);
3069                 printk("too short to sleep\n");
3070                 return;
3071         }
3072
3073 //      write_nic_dword(dev, TimerInt, tl);
3074 //      rb = read_nic_dword(dev, TSFTR);
3075         {
3076                 u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
3077         //      if (tl<rb)
3078
3079                 queue_delayed_work(priv->ieee80211->wq, &priv->ieee80211->hw_wakeup_wq, tmp); //as tl may be less than rb
3080         }
3081         /* if we suspect the TimerInt is gone beyond tl
3082          * while setting it, then give up
3083          */
3084 #if 1
3085         if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
3086                 ((tl < rb) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))) {
3087                 printk("========>too long to sleep:%x, %x, %lx\n", tl, rb,  MSECS(MAX_SLEEP_TIME));
3088                 spin_unlock_irqrestore(&priv->ps_lock,flags);
3089                 return;
3090         }
3091 #endif
3092 //      if(priv->rf_sleep)
3093 //              priv->rf_sleep(dev);
3094
3095         //printk("<=========%s()\n", __FUNCTION__);
3096         queue_delayed_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_sleep_wq,0);
3097
3098         spin_unlock_irqrestore(&priv->ps_lock,flags);
3099 }
3100 //init priv variables here. only non_zero value should be initialized here.
3101 static void rtl8192_init_priv_variable(struct net_device* dev)
3102 {
3103         struct r8192_priv *priv = ieee80211_priv(dev);
3104         u8 i;
3105         priv->card_8192 = NIC_8192U;
3106         priv->chan = 1; //set to channel 1
3107         priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
3108         priv->ieee80211->iw_mode = IW_MODE_INFRA;
3109         priv->ieee80211->ieee_up=0;
3110         priv->retry_rts = DEFAULT_RETRY_RTS;
3111         priv->retry_data = DEFAULT_RETRY_DATA;
3112         priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
3113         priv->ieee80211->rate = 110; //11 mbps
3114         priv->ieee80211->short_slot = 1;
3115         priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
3116         priv->CckPwEnl = 6;
3117         //for silent reset
3118         priv->IrpPendingCount = 1;
3119         priv->ResetProgress = RESET_TYPE_NORESET;
3120         priv->bForcedSilentReset = 0;
3121         priv->bDisableNormalResetCheck = false;
3122         priv->force_reset = false;
3123
3124         priv->ieee80211->FwRWRF = 0;    //we don't use FW read/write RF until stable firmware is available.
3125         priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3126         priv->ieee80211->iw_mode = IW_MODE_INFRA;
3127         priv->ieee80211->softmac_features  = IEEE_SOFTMAC_SCAN |
3128                 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
3129                 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
3130                 IEEE_SOFTMAC_BEACONS;//added by amy 080604 //|  //IEEE_SOFTMAC_SINGLE_QUEUE;
3131
3132         priv->ieee80211->active_scan = 1;
3133         priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
3134         priv->ieee80211->host_encrypt = 1;
3135         priv->ieee80211->host_decrypt = 1;
3136         priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
3137         priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
3138         priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
3139         priv->ieee80211->set_chan = rtl8192_set_chan;
3140         priv->ieee80211->link_change = priv->ops->rtl819x_link_change;
3141         priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
3142         priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
3143         priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
3144         priv->ieee80211->init_wmmparam_flag = 0;
3145         priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
3146         priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
3147         priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
3148         priv->ieee80211->qos_support = 1;
3149
3150         //added by WB
3151 //      priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
3152         priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
3153         priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
3154         priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
3155         //for LPS
3156         priv->ieee80211->sta_wake_up = rtl8192_hw_wakeup;
3157 //      priv->ieee80211->ps_request_tx_ack = rtl8192_rq_tx_ack;
3158         priv->ieee80211->enter_sleep_state = rtl8192_hw_to_sleep;
3159         priv->ieee80211->ps_is_queue_empty = rtl8192_is_tx_queue_empty;
3160         //added by david
3161         priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
3162         priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
3163         priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
3164         //added by amy
3165         priv->ieee80211->InitialGainHandler = priv->ops->rtl819x_initial_gain;
3166         priv->card_type = USB;
3167
3168 //1 RTL8192SU/
3169         priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
3170         priv->ieee80211->SetFwCmdHandler = HalSetFwCmd8192S;
3171         priv->bRFSiOrPi = 0;//o=si,1=pi;
3172         //lzm add
3173         priv->bInHctTest = false;
3174
3175         priv->MidHighPwrTHR_L1 = 0x3B;
3176         priv->MidHighPwrTHR_L2 = 0x40;
3177
3178         if(priv->bInHctTest)
3179         {
3180                 priv->ShortRetryLimit = HAL_RETRY_LIMIT_AP_ADHOC;
3181                 priv->LongRetryLimit = HAL_RETRY_LIMIT_AP_ADHOC;
3182         }
3183         else
3184         {
3185                 priv->ShortRetryLimit = HAL_RETRY_LIMIT_INFRA;
3186                 priv->LongRetryLimit = HAL_RETRY_LIMIT_INFRA;
3187         }
3188
3189         priv->SetFwCmdInProgress = false; //is set FW CMD in Progress? 92S only
3190         priv->CurrentFwCmdIO = 0;
3191
3192         priv->MinSpaceCfg = 0;
3193
3194         priv->EarlyRxThreshold = 7;
3195         priv->enable_gpio0 = 0;
3196         priv->TransmitConfig    =
3197                                 ((u32)TCR_MXDMA_2048<<TCR_MXDMA_OFFSET) |       // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
3198                                 (priv->ShortRetryLimit<<TCR_SRL_OFFSET) |       // Short retry limit
3199                                 (priv->LongRetryLimit<<TCR_LRL_OFFSET) |        // Long retry limit
3200                                 (false ? TCR_SAT : 0);  // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
3201         if(priv->bInHctTest)
3202                 priv->ReceiveConfig     =       //priv->CSMethod |
3203                                                                 RCR_AMF | RCR_ADF |     //RCR_AAP |     //accept management/data
3204                                                                         RCR_ACF |RCR_APPFCS|                                            //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
3205                                                                 RCR_AB | RCR_AM | RCR_APM |             //accept BC/MC/UC
3206                                                                 RCR_AICV | RCR_ACRC32 |                 //accept ICV/CRC error packet
3207                                                                 RCR_APP_PHYST_STAFF | RCR_APP_PHYST_RXFF |      // Accept PHY status
3208                                                                 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
3209                                                                 (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
3210                                                                 (priv->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
3211         else
3212                 priv->ReceiveConfig     =       //priv->CSMethod |
3213                                                                         RCR_AMF | RCR_ADF | RCR_AB |
3214                                                                         RCR_AM | RCR_APM |RCR_AAP |RCR_ADD3|RCR_APP_ICV|
3215                                                                 RCR_APP_PHYST_STAFF | RCR_APP_PHYST_RXFF |      // Accept PHY status
3216                                                                         RCR_APP_MIC | RCR_APPFCS;
3217
3218         // <Roger_EXP> 2008.06.16.
3219         priv->IntrMask          =       (u16)(IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK |         \
3220                                                                 IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK |                                  \
3221                                                                 IMR_BDOK | IMR_RXCMDOK | /*IMR_TIMEOUT0 |*/ IMR_RDU | IMR_RXFOVW        |                       \
3222                                                                 IMR_TXFOVW | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
3223
3224 //1 End
3225
3226
3227         priv->AcmControl = 0;
3228         priv->pFirmware = (rt_firmware*)vmalloc(sizeof(rt_firmware));
3229         if (priv->pFirmware)
3230         memset(priv->pFirmware, 0, sizeof(rt_firmware));
3231
3232         /* rx related queue */
3233         skb_queue_head_init(&priv->rx_queue);
3234         skb_queue_head_init(&priv->skb_queue);
3235
3236         /* Tx related queue */
3237         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3238                 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
3239         }
3240         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3241                 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
3242         }
3243         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
3244                 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
3245         }
3246         priv->rf_set_chan = rtl8192_phy_SwChnl;
3247 }
3248
3249 //init lock here
3250 static void rtl8192_init_priv_lock(struct r8192_priv* priv)
3251 {
3252         spin_lock_init(&priv->tx_lock);
3253         spin_lock_init(&priv->irq_lock);//added by thomas
3254         //spin_lock_init(&priv->rf_lock);//use rf_sem, or will crash in some OS.
3255         sema_init(&priv->wx_sem,1);
3256         sema_init(&priv->rf_sem,1);
3257         spin_lock_init(&priv->ps_lock);
3258         mutex_init(&priv->mutex);
3259 }
3260
3261 extern  void    rtl819x_watchdog_wqcallback(struct work_struct *work);
3262
3263 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
3264 //init tasklet and wait_queue here. only 2.6 above kernel is considered
3265 #define DRV_NAME "wlan0"
3266 static void rtl8192_init_priv_task(struct net_device* dev)
3267 {
3268         struct r8192_priv *priv = ieee80211_priv(dev);
3269
3270 #ifdef PF_SYNCTHREAD
3271         priv->priv_wq = create_workqueue(DRV_NAME,0);
3272 #else
3273         priv->priv_wq = create_workqueue(DRV_NAME);
3274 #endif
3275
3276         INIT_WORK(&priv->reset_wq, rtl8192_restart);
3277
3278         //INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
3279         INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
3280         INIT_DELAYED_WORK(&priv->txpower_tracking_wq,  dm_txpower_trackingcallback);
3281 //      INIT_DELAYED_WORK(&priv->gpio_change_rf_wq,  dm_gpio_change_rf_callback);
3282         INIT_DELAYED_WORK(&priv->rfpath_check_wq,  dm_rf_pathcheck_workitemcallback);
3283         INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
3284         INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
3285         //INIT_WORK(&priv->SwChnlWorkItem,  rtl8192_SwChnl_WorkItem);
3286         //INIT_WORK(&priv->SetBWModeWorkItem,  rtl8192_SetBWModeWorkItem);
3287         INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
3288         INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8192_hw_wakeup_wq);
3289         INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8192_hw_sleep_wq);
3290
3291         tasklet_init(&priv->irq_rx_tasklet,
3292              (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
3293              (unsigned long)priv);
3294 }
3295
3296 static void rtl8192_get_eeprom_size(struct net_device* dev)
3297 {
3298         u16 curCR = 0;
3299         struct r8192_priv *priv = ieee80211_priv(dev);
3300         RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
3301         curCR = read_nic_word_E(dev,EPROM_CMD);
3302         RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
3303         //whether need I consider BIT5?
3304         priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
3305         RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
3306 }
3307
3308 //used to swap endian. as ntohl & htonl are not neccessary to swap endian, so use this instead.
3309 static inline u16 endian_swap(u16* data)
3310 {
3311         u16 tmp = *data;
3312         *data = (tmp >> 8) | (tmp << 8);
3313         return *data;
3314 }
3315
3316 u8 rtl8192SU_UsbOptionToEndPointNumber(u8 UsbOption)
3317 {
3318         u8      nEndPoint = 0;
3319         switch(UsbOption)
3320         {
3321                 case 0:
3322                         nEndPoint = 6;
3323                         break;
3324                 case 1:
3325                         nEndPoint = 11;
3326                         break;
3327                 case 2:
3328                         nEndPoint = 4;
3329                         break;
3330                 default:
3331                         RT_TRACE(COMP_INIT, "UsbOptionToEndPointNumber(): Invalid UsbOption(%#x)\n", UsbOption);
3332                         break;
3333         }
3334         return nEndPoint;
3335 }
3336
3337 u8 rtl8192SU_BoardTypeToRFtype(struct net_device* dev,  u8 Boardtype)
3338 {
3339         u8      RFtype = RF_1T2R;
3340
3341         switch(Boardtype)
3342         {
3343                 case 0:
3344                         RFtype = RF_1T1R;
3345                         break;
3346                 case 1:
3347                         RFtype = RF_1T2R;
3348                         break;
3349                 case 2:
3350                         RFtype = RF_2T2R;
3351                         break;
3352                 case 3:
3353                         RFtype = RF_2T2R_GREEN;
3354                         break;
3355                 default:
3356                         break;
3357         }
3358
3359         return RFtype;
3360 }
3361
3362 //
3363 //      Description:
3364 //              Config HW adapter information into initial value.
3365 //
3366 //      Assumption:
3367 //              1. After Auto load fail(i.e, check CR9346 fail)
3368 //
3369 //      Created by Roger, 2008.10.21.
3370 //
3371 void
3372 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(struct net_device* dev)
3373 {
3374         struct r8192_priv       *priv = ieee80211_priv(dev);
3375         //u16                   i,usValue;
3376         //u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
3377         u8              rf_path, index; // For EEPROM/EFUSE After V0.6_1117
3378         int     i;
3379
3380         RT_TRACE(COMP_INIT, "====> ConfigAdapterInfo8192SForAutoLoadFail\n");
3381
3382         write_nic_byte(dev, SYS_ISO_CTRL+1, 0xE8); // Isolation signals from Loader
3383         //PlatformStallExecution(10000);
3384         mdelay(10);
3385         write_nic_byte(dev, PMC_FSM, 0x02); // Enable Loader Data Keep
3386
3387         //RT_ASSERT(priv->AutoloadFailFlag==TRUE, ("ReadAdapterInfo8192SEEPROM(): AutoloadFailFlag !=TRUE\n"));
3388
3389         // Initialize IC Version && Channel Plan
3390         priv->eeprom_vid = 0;
3391         priv->eeprom_pid = 0;
3392         priv->card_8192_version = 0;
3393         priv->eeprom_ChannelPlan = 0;
3394         priv->eeprom_CustomerID = 0;
3395         priv->eeprom_SubCustomerID = 0;
3396         priv->bIgnoreDiffRateTxPowerOffset = false;
3397
3398         RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
3399         RT_TRACE(COMP_INIT, "EEPROM PID = 0x%4x\n", priv->eeprom_pid);
3400         RT_TRACE(COMP_INIT, "EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
3401         RT_TRACE(COMP_INIT, "EEPROM SubCustomer ID: 0x%2x\n", priv->eeprom_SubCustomerID);
3402         RT_TRACE(COMP_INIT, "EEPROM ChannelPlan = 0x%4x\n", priv->eeprom_ChannelPlan);
3403         RT_TRACE(COMP_INIT, "IgnoreDiffRateTxPowerOffset = %d\n", priv->bIgnoreDiffRateTxPowerOffset);
3404
3405
3406
3407         priv->EEPROMUsbOption = EEPROM_USB_Default_OPTIONAL_FUNC;
3408         RT_TRACE(COMP_INIT, "USB Option = %#x\n", priv->EEPROMUsbOption);
3409
3410         for(i=0; i<5; i++)
3411                 priv->EEPROMUsbPhyParam[i] = EEPROM_USB_Default_PHY_PARAM;
3412
3413         //RT_PRINT_DATA(COMP_INIT|COMP_EFUSE, DBG_LOUD, ("EFUSE USB PHY Param: \n"), priv->EEPROMUsbPhyParam, 5);
3414
3415         {
3416         //<Roger_Notes> In this case, we random assigh MAC address here. 2008.10.15.
3417                 static u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
3418                 u8      i;
3419
3420                 //sMacAddr[5] = (u8)GetRandomNumber(1, 254);
3421
3422                 for(i = 0; i < 6; i++)
3423                         dev->dev_addr[i] = sMacAddr[i];
3424         }
3425         //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
3426         write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
3427         write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
3428
3429         RT_TRACE(COMP_INIT, "ReadAdapterInfo8192SEFuse(), Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
3430                         dev->dev_addr[0], dev->dev_addr[1],
3431                         dev->dev_addr[2], dev->dev_addr[3],
3432                         dev->dev_addr[4], dev->dev_addr[5]);
3433
3434         priv->EEPROMBoardType = EEPROM_Default_BoardType;
3435         priv->rf_type = RF_1T2R; //RF_2T2R
3436         priv->EEPROMTxPowerDiff = EEPROM_Default_PwDiff;
3437         priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
3438         priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
3439         priv->EEPROMTxPwrBase = EEPROM_Default_TxPowerBase;
3440         priv->EEPROMTSSI_A = EEPROM_Default_TSSI;
3441         priv->EEPROMTSSI_B = EEPROM_Default_TSSI;
3442         priv->EEPROMTxPwrTkMode = EEPROM_Default_TxPwrTkMode;
3443
3444
3445
3446         for (rf_path = 0; rf_path < 2; rf_path++)
3447         {
3448                 for (i = 0; i < 3; i++)
3449                 {
3450                         // Read CCK RF A & B Tx power
3451                         priv->RfCckChnlAreaTxPwr[rf_path][i] =
3452                         priv->RfOfdmChnlAreaTxPwr1T[rf_path][i] =
3453                         priv->RfOfdmChnlAreaTxPwr2T[rf_path][i] =
3454                         (u8)(EEPROM_Default_TxPower & 0xff);
3455                 }
3456         }
3457
3458         for (i = 0; i < 3; i++)
3459         {
3460                 //RT_TRACE((COMP_EFUSE), "CCK RF-%d CHan_Area-%d = 0x%x\n",  rf_path, i,
3461                 //priv->RfCckChnlAreaTxPwr[rf_path][i]);
3462                 //RT_TRACE((COMP_EFUSE), "OFDM-1T RF-%d CHan_Area-%d = 0x%x\n",  rf_path, i,
3463                 //priv->RfOfdmChnlAreaTxPwr1T[rf_path][i]);
3464                 //RT_TRACE((COMP_EFUSE), "OFDM-2T RF-%d CHan_Area-%d = 0x%x\n",  rf_path, i,
3465                 //priv->RfOfdmChnlAreaTxPwr2T[rf_path][i]);
3466         }
3467
3468         // Assign dedicated channel tx power
3469         for(i=0; i<14; i++)     // channel 1~3 use the same Tx Power Level.
3470                 {
3471                 if (i < 3)                      // Cjanel 1-3
3472                         index = 0;
3473                 else if (i < 9)         // Channel 4-9
3474                         index = 1;
3475                 else                            // Channel 10-14
3476                         index = 2;
3477
3478                 // Record A & B CCK /OFDM - 1T/2T Channel area tx power
3479                 priv->RfTxPwrLevelCck[rf_path][i]  =
3480                 priv->RfCckChnlAreaTxPwr[rf_path][index];
3481                 priv->RfTxPwrLevelOfdm1T[rf_path][i]  =
3482                 priv->RfOfdmChnlAreaTxPwr1T[rf_path][index];
3483                 priv->RfTxPwrLevelOfdm2T[rf_path][i]  =
3484                 priv->RfOfdmChnlAreaTxPwr2T[rf_path][index];
3485                 }
3486
3487                 for(i=0; i<14; i++)
3488                 {
3489                 //RT_TRACE((COMP_EFUSE), "Rf-%d TxPwr CH-%d CCK OFDM_1T OFDM_2T= 0x%x/0x%x/0x%x\n",
3490                 //rf_path, i, priv->RfTxPwrLevelCck[0][i],
3491                 //priv->RfTxPwrLevelOfdm1T[0][i] ,
3492                 //priv->RfTxPwrLevelOfdm2T[0][i] );
3493                 }
3494
3495         //
3496         // Update remained HAL variables.
3497         //
3498         priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
3499         priv->LegacyHTTxPowerDiff = priv->EEPROMTxPowerDiff;//new
3500         priv->TxPowerDiff = priv->EEPROMTxPowerDiff;
3501         //priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);// Antenna B gain offset to antenna A, bit0~3
3502         //priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);// Antenna C gain offset to antenna A, bit4~7
3503         priv->CrystalCap = priv->EEPROMCrystalCap;      // CrystalCap, bit12~15
3504         priv->ThermalMeter[0] = priv->EEPROMThermalMeter;// ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
3505         priv->LedStrategy = SW_LED_MODE0;
3506
3507         init_rate_adaptive(dev);
3508
3509         RT_TRACE(COMP_INIT, "<==== ConfigAdapterInfo8192SForAutoLoadFail\n");
3510
3511 }
3512
3513 //
3514 //      Description:
3515 //              Read HW adapter information by E-Fuse or EEPROM according CR9346 reported.
3516 //
3517 //      Assumption:
3518 //              1. CR9346 regiser has verified.
3519 //              2. PASSIVE_LEVEL (USB interface)
3520 //
3521 //      Created by Roger, 2008.10.21.
3522 //
3523 void
3524 rtl8192SU_ReadAdapterInfo8192SUsb(struct net_device* dev)
3525 {
3526         struct r8192_priv       *priv = ieee80211_priv(dev);
3527         u16                     i,usValue;
3528         u8                      tmpU1b, tempval;
3529         u16                     EEPROMId;
3530         u8                      hwinfo[HWSET_MAX_SIZE_92S];
3531         u8                      rf_path, index; // For EEPROM/EFUSE After V0.6_1117
3532
3533
3534         RT_TRACE(COMP_INIT, "====> ReadAdapterInfo8192SUsb\n");
3535
3536         //
3537         // <Roger_Note> The following operation are prevent Efuse leakage by turn on 2.5V.
3538         // 2008.11.25.
3539         //
3540         tmpU1b = read_nic_byte(dev, EFUSE_TEST+3);
3541         write_nic_byte(dev, EFUSE_TEST+3, tmpU1b|0x80);
3542         //PlatformStallExecution(1000);
3543         mdelay(10);
3544         write_nic_byte(dev, EFUSE_TEST+3, (tmpU1b&(~BIT7)));
3545
3546         // Retrieve Chip version.
3547         priv->card_8192_version = (VERSION_8192S)((read_nic_dword(dev, PMC_FSM)>>16)&0xF);
3548         RT_TRACE(COMP_INIT, "Chip Version ID: 0x%2x\n", priv->card_8192_version);
3549
3550         switch(priv->card_8192_version)
3551         {
3552                 case 0:
3553                         RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_ACUT.\n");
3554                         break;
3555                 case 1:
3556                         RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_BCUT.\n");
3557                         break;
3558                 case 2:
3559                         RT_TRACE(COMP_INIT, "Chip Version ID: VERSION_8192S_CCUT.\n");
3560                         break;
3561                 default:
3562                         RT_TRACE(COMP_INIT, "Unknown Chip Version!!\n");
3563                         priv->card_8192_version = VERSION_8192S_BCUT;
3564                         break;
3565         }
3566
3567         //if (IS_BOOT_FROM_EEPROM(Adapter))
3568         if(priv->EepromOrEfuse)
3569         {       // Read frin EEPROM
3570                 write_nic_byte(dev, SYS_ISO_CTRL+1, 0xE8); // Isolation signals from Loader
3571                 //PlatformStallExecution(10000);
3572                 mdelay(10);
3573                 write_nic_byte(dev, PMC_FSM, 0x02); // Enable Loader Data Keep
3574                 // Read all Content from EEPROM or EFUSE.
3575                 for(i = 0; i < HWSET_MAX_SIZE_92S; i += 2)
3576                 {
3577                         usValue = eprom_read(dev, (u16) (i>>1));
3578                         *((u16*)(&hwinfo[i])) = usValue;
3579                 }
3580         }
3581         else if (!(priv->EepromOrEfuse))
3582         {       // Read from EFUSE
3583
3584                 //
3585                 // <Roger_Notes> We set Isolation signals from Loader and reset EEPROM after system resuming
3586                 // from suspend mode.
3587                 // 2008.10.21.
3588                 //
3589                 //PlatformEFIOWrite1Byte(Adapter, SYS_ISO_CTRL+1, 0xE8); // Isolation signals from Loader
3590                 //PlatformStallExecution(10000);
3591                 //PlatformEFIOWrite1Byte(Adapter, SYS_FUNC_EN+1, 0x40);
3592                 //PlatformEFIOWrite1Byte(Adapter, SYS_FUNC_EN+1, 0x50);
3593
3594                 //tmpU1b = PlatformEFIORead1Byte(Adapter, EFUSE_TEST+3);
3595                 //PlatformEFIOWrite1Byte(Adapter, EFUSE_TEST+3, (tmpU1b | 0x80));
3596                 //PlatformEFIOWrite1Byte(Adapter, EFUSE_TEST+3, 0x72);
3597                 //PlatformEFIOWrite1Byte(Adapter, EFUSE_CLK, 0x03);
3598
3599                 // Read EFUSE real map to shadow.
3600                 EFUSE_ShadowMapUpdate(dev);
3601                 memcpy(hwinfo, &priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
3602         }
3603         else
3604         {
3605                 RT_TRACE(COMP_INIT, "ReadAdapterInfo8192SUsb(): Invalid boot type!!\n");
3606         }
3607
3608         //YJ,test,090106
3609         //dump_buf(hwinfo,HWSET_MAX_SIZE_92S);
3610         //
3611         // <Roger_Notes> The following are EFUSE/EEPROM independent operations!!
3612         //
3613         //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("MAP: \n"), hwinfo, HWSET_MAX_SIZE_92S);
3614
3615         //
3616         // <Roger_Notes> Event though CR9346 regiser can verify whether Autoload is success or not, but we still
3617         // double check ID codes for 92S here(e.g., due to HW GPIO polling fail issue).
3618         // 2008.10.21.
3619         //
3620         EEPROMId = *((u16 *)&hwinfo[0]);
3621
3622         if( EEPROMId != RTL8190_EEPROM_ID )
3623         {
3624                 RT_TRACE(COMP_INIT, "ID(%#x) is invalid!!\n", EEPROMId);
3625                 priv->bTXPowerDataReadFromEEPORM = FALSE;
3626                 priv->AutoloadFailFlag=TRUE;
3627         }
3628         else
3629         {
3630                 priv->AutoloadFailFlag=FALSE;
3631                 priv->bTXPowerDataReadFromEEPORM = TRUE;
3632         }
3633        // Read IC Version && Channel Plan
3634         if(!priv->AutoloadFailFlag)
3635         {
3636                 // VID, PID
3637                 priv->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
3638                 priv->eeprom_pid = *(u16 *)&hwinfo[EEPROM_PID];
3639                 priv->bIgnoreDiffRateTxPowerOffset = false;     //cosa for test
3640
3641
3642                 // EEPROM Version ID, Channel plan
3643                 priv->EEPROMVersion = *(u8 *)&hwinfo[EEPROM_Version];
3644                 priv->eeprom_ChannelPlan = *(u8 *)&hwinfo[EEPROM_ChannelPlan];
3645
3646                 // Customer ID, 0x00 and 0xff are reserved for Realtek.
3647                 priv->eeprom_CustomerID = *(u8 *)&hwinfo[EEPROM_CustomID];
3648                 priv->eeprom_SubCustomerID = *(u8 *)&hwinfo[EEPROM_SubCustomID];
3649         }
3650         else
3651         {
3652                 //priv->eeprom_vid = 0;
3653                 //priv->eeprom_pid = 0;
3654                 //priv->EEPROMVersion = 0;
3655                 //priv->eeprom_ChannelPlan = 0;
3656                 //priv->eeprom_CustomerID = 0;
3657                 //priv->eeprom_SubCustomerID = 0;
3658
3659                 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(dev);
3660                 return;
3661         }
3662
3663
3664         RT_TRACE(COMP_INIT, "EEPROM Id = 0x%4x\n", EEPROMId);
3665         RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
3666         RT_TRACE(COMP_INIT, "EEPROM PID = 0x%4x\n", priv->eeprom_pid);
3667         RT_TRACE(COMP_INIT, "EEPROM Version ID: 0x%2x\n", priv->EEPROMVersion);
3668         RT_TRACE(COMP_INIT, "EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
3669         RT_TRACE(COMP_INIT, "EEPROM SubCustomer ID: 0x%2x\n", priv->eeprom_SubCustomerID);
3670         RT_TRACE(COMP_INIT, "EEPROM ChannelPlan = 0x%4x\n", priv->eeprom_ChannelPlan);
3671         RT_TRACE(COMP_INIT, "bIgnoreDiffRateTxPowerOffset = %d\n", priv->bIgnoreDiffRateTxPowerOffset);
3672
3673
3674         // Read USB optional function.
3675         if(!priv->AutoloadFailFlag)
3676         {
3677                 priv->EEPROMUsbOption = *(u8 *)&hwinfo[EEPROM_USB_OPTIONAL];
3678         }
3679         else
3680         {
3681                 priv->EEPROMUsbOption = EEPROM_USB_Default_OPTIONAL_FUNC;
3682         }
3683
3684
3685         priv->EEPROMUsbEndPointNumber = rtl8192SU_UsbOptionToEndPointNumber((priv->EEPROMUsbOption&EEPROM_EP_NUMBER)>>3);
3686
3687         RT_TRACE(COMP_INIT, "USB Option = %#x\n", priv->EEPROMUsbOption);
3688         RT_TRACE(COMP_INIT, "EndPoint Number = %#x\n", priv->EEPROMUsbEndPointNumber);
3689
3690 #ifdef TO_DO_LIST
3691         //
3692         //  Decide CustomerID according to VID/DID or EEPROM
3693         //
3694         switch(pHalData->EEPROMCustomerID)
3695         {
3696                 case EEPROM_CID_ALPHA:
3697                         pMgntInfo->CustomerID = RT_CID_819x_ALPHA;
3698                         break;
3699
3700                 case EEPROM_CID_CAMEO:
3701                         pMgntInfo->CustomerID = RT_CID_819x_CAMEO;
3702                         break;
3703
3704                 case EEPROM_CID_SITECOM:
3705                         pMgntInfo->CustomerID = RT_CID_819x_Sitecom;
3706                         RT_TRACE(COMP_INIT, DBG_LOUD, ("CustomerID = 0x%4x\n", pMgntInfo->CustomerID));
3707
3708                         break;
3709
3710                 case EEPROM_CID_WHQL:
3711                         Adapter->bInHctTest = TRUE;
3712
3713                         pMgntInfo->bSupportTurboMode = FALSE;
3714                         pMgntInfo->bAutoTurboBy8186 = FALSE;
3715
3716                         pMgntInfo->PowerSaveControl.bInactivePs = FALSE;
3717                         pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE;
3718                         pMgntInfo->PowerSaveControl.bLeisurePs = FALSE;
3719                         pMgntInfo->keepAliveLevel = 0;
3720                         break;
3721
3722                 default:
3723                         pMgntInfo->CustomerID = RT_CID_DEFAULT;
3724                         break;
3725
3726         }
3727
3728         //
3729         // Led mode
3730         //
3731         switch(pMgntInfo->CustomerID)
3732         {
3733                 case RT_CID_DEFAULT:
3734                 case RT_CID_819x_ALPHA:
3735                         pHalData->LedStrategy = SW_LED_MODE1;
3736                         pHalData->bRegUseLed = TRUE;
3737                         pHalData->SwLed1.bLedOn = TRUE;
3738                         break;
3739                 case RT_CID_819x_CAMEO:
3740                         pHalData->LedStrategy = SW_LED_MODE1;
3741                         pHalData->bRegUseLed = TRUE;
3742                         break;
3743
3744                 case RT_CID_819x_Sitecom:
3745                         pHalData->LedStrategy = SW_LED_MODE2;
3746                         pHalData->bRegUseLed = TRUE;
3747                         break;
3748
3749                 default:
3750                         pHalData->LedStrategy = SW_LED_MODE0;
3751                         break;
3752         }
3753 #endif
3754
3755         // Read USB PHY parameters.
3756         for(i=0; i<5; i++)
3757                 priv->EEPROMUsbPhyParam[i] = *(u8 *)&hwinfo[EEPROM_USB_PHY_PARA1+i];
3758
3759         //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("USB PHY Param: \n"), pHalData->EEPROMUsbPhyParam, 5);
3760
3761
3762        //Read Permanent MAC address
3763         for(i=0; i<6; i++)
3764                 dev->dev_addr[i] =  *(u8 *)&hwinfo[EEPROM_NODE_ADDRESS_BYTE_0+i];
3765
3766         //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
3767         write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
3768         write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
3769
3770         RT_TRACE(COMP_INIT, "ReadAdapterInfo8192SEFuse(), Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
3771                         dev->dev_addr[0], dev->dev_addr[1],
3772                         dev->dev_addr[2], dev->dev_addr[3],
3773                         dev->dev_addr[4], dev->dev_addr[5]);
3774
3775         //
3776         // Get CustomerID(Boad Type)
3777         // i.e., 0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU.
3778         // Others: Reserved. Default is 0x2: RTL8192SU.
3779         //
3780         //if(!priv->AutoloadFailFlag)
3781         //{
3782                 priv->EEPROMBoardType = *(u8 *)&hwinfo[EEPROM_BoardType];
3783                 priv->rf_type = rtl8192SU_BoardTypeToRFtype(dev, priv->EEPROMBoardType);
3784         //}
3785         //else
3786         //{
3787         //      priv->EEPROMBoardType = EEPROM_Default_BoardType;
3788         //      priv->rf_type = RF_1T2R;
3789         //}
3790
3791         priv->rf_chip = RF_6052;
3792
3793         priv->rf_chip = RF_6052;//lzm test
3794         RT_TRACE(COMP_INIT, "BoardType = 0x%2x\n", priv->EEPROMBoardType);
3795         RT_TRACE(COMP_INIT, "RF_Type = 0x%2x\n", priv->rf_type);
3796
3797         //
3798         // Read antenna tx power offset of B/C/D to A  from EEPROM
3799         // and read ThermalMeter from EEPROM
3800         //
3801         //if(!priv->AutoloadFailFlag)
3802         {
3803                 priv->EEPROMTxPowerDiff = *(u8 *)&hwinfo[EEPROM_PwDiff];
3804                 priv->EEPROMThermalMeter = *(u8 *)&hwinfo[EEPROM_ThermalMeter];
3805         }
3806         //else
3807         //{
3808         //      priv->EEPROMTxPowerDiff = EEPROM_Default_PwDiff;
3809         //      priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
3810         //}
3811
3812         RT_TRACE(COMP_INIT, "PwDiff = %#x\n", priv->EEPROMTxPowerDiff);
3813         RT_TRACE(COMP_INIT, "ThermalMeter = %#x\n", priv->EEPROMThermalMeter);
3814
3815         //
3816         // Read Tx Power gain offset of legacy OFDM to HT rate.
3817         // Read CrystalCap from EEPROM
3818         //
3819         //if(!priv->AutoloadFailFlag)
3820         {
3821                 priv->EEPROMCrystalCap = *(u8 *)&hwinfo[EEPROM_CrystalCap];
3822         }
3823         //else
3824         //{
3825         //      priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
3826         //}
3827
3828         RT_TRACE(COMP_INIT, "CrystalCap = %#x\n", priv->EEPROMCrystalCap);
3829
3830         //
3831         // Get Tx Power Base.
3832         //
3833         //if(!priv->AutoloadFailFlag)
3834         {
3835                 priv->EEPROMTxPwrBase = *(u8 *)&hwinfo[EEPROM_TxPowerBase];
3836         }
3837         //else
3838         //{
3839         //      priv->EEPROMTxPwrBase = EEPROM_Default_TxPowerBase;
3840         //}
3841
3842         RT_TRACE(COMP_INIT, "TxPwrBase = %#x\n", priv->EEPROMTxPwrBase);
3843
3844
3845         //
3846         // Get TSSI value for each path.
3847         //
3848         //if(!priv->AutoloadFailFlag)
3849         {
3850                 priv->EEPROMTSSI_A = *(u8 *)&hwinfo[EEPROM_TSSI_A];
3851                 priv->EEPROMTSSI_B = *(u8 *)&hwinfo[EEPROM_TSSI_B];
3852         }
3853         //else
3854         //{ // Default setting for Empty EEPROM
3855         //      priv->EEPROMTSSI_A = EEPROM_Default_TSSI;
3856         //      priv->EEPROMTSSI_B = EEPROM_Default_TSSI;
3857         //}
3858
3859         RT_TRACE(COMP_INIT, "TSSI_A = %#x, TSSI_B = %#x\n", priv->EEPROMTSSI_A, priv->EEPROMTSSI_B);
3860
3861         //
3862         // Get Tx Power tracking mode.
3863         //
3864         //if(!priv->AutoloadFailFlag)
3865         {
3866                 priv->EEPROMTxPwrTkMode = *(u8 *)&hwinfo[EEPROM_TxPwTkMode];
3867         }
3868
3869         RT_TRACE(COMP_INIT, "TxPwrTkMod = %#x\n", priv->EEPROMTxPwrTkMode);
3870
3871
3872         {
3873                 //
3874                 // Buffer TxPwIdx(i.e., from offset 0x55~0x66, total 18Bytes)
3875                 // Update CCK, OFDM (1T/2T)Tx Power Index from above buffer.
3876                 //
3877
3878                 //
3879                 // Get Tx Power Level by Channel
3880                 //
3881                 //if(!priv->AutoloadFailFlag)
3882                 {
3883                         // Read Tx power of Channel 1 ~ 14 from EFUSE.
3884                         // 92S suupport RF A & B
3885                         for (rf_path = 0; rf_path < 2; rf_path++)
3886                         {
3887                                 for (i = 0; i < 3; i++)
3888                                 {
3889                                         // Read CCK RF A & B Tx power
3890                                         priv->RfCckChnlAreaTxPwr[rf_path][i] =
3891                                         hwinfo[EEPROM_TxPwIndex+rf_path*3+i];
3892
3893                                         // Read OFDM RF A & B Tx power for 1T
3894                                         priv->RfOfdmChnlAreaTxPwr1T[rf_path][i] =
3895                                         hwinfo[EEPROM_TxPwIndex+6+rf_path*3+i];
3896
3897                                         // Read OFDM RF A & B Tx power for 2T
3898                                         priv->RfOfdmChnlAreaTxPwr2T[rf_path][i] =
3899                                         hwinfo[EEPROM_TxPwIndex+12+rf_path*3+i];
3900                                 }
3901                         }
3902
3903                 }
3904 //
3905                 // Update Tx Power HAL variables.
3906 //
3907                 for (rf_path = 0; rf_path < 2; rf_path++)
3908                 {
3909                         for (i = 0; i < 3; i++)
3910                         {
3911                                 RT_TRACE((COMP_INIT),  "CCK RF-%d CHan_Area-%d = 0x%x\n",  rf_path, i,
3912                                 priv->RfCckChnlAreaTxPwr[rf_path][i]);
3913                                 RT_TRACE((COMP_INIT), "OFDM-1T RF-%d CHan_Area-%d = 0x%x\n",  rf_path, i,
3914                                 priv->RfOfdmChnlAreaTxPwr1T[rf_path][i]);
3915                                 RT_TRACE((COMP_INIT), "OFDM-2T RF-%d CHan_Area-%d = 0x%x\n",  rf_path, i, priv->RfOfdmChnlAreaTxPwr2T[rf_path][i]);
3916                         }
3917
3918                         // Assign dedicated channel tx power
3919                         for(i=0; i<14; i++)     // channel 1~3 use the same Tx Power Level.
3920                         {
3921                                 if (i < 3)                      // Cjanel 1-3
3922                                         index = 0;
3923                                 else if (i < 9)         // Channel 4-9
3924                                         index = 1;
3925                                 else                            // Channel 10-14
3926                                         index = 2;
3927
3928                                 // Record A & B CCK /OFDM - 1T/2T Channel area tx power
3929                                 priv->RfTxPwrLevelCck[rf_path][i]  =
3930                                 priv->RfCckChnlAreaTxPwr[rf_path][index];
3931                                 priv->RfTxPwrLevelOfdm1T[rf_path][i]  =
3932                                 priv->RfOfdmChnlAreaTxPwr1T[rf_path][index];
3933                                 priv->RfTxPwrLevelOfdm2T[rf_path][i]  =
3934                                 priv->RfOfdmChnlAreaTxPwr2T[rf_path][index];
3935                                 if (rf_path == 0)
3936                                 {
3937                                         priv->TxPowerLevelOFDM24G[i] = priv->RfTxPwrLevelOfdm1T[rf_path][i] ;
3938                                         priv->TxPowerLevelCCK[i] = priv->RfTxPwrLevelCck[rf_path][i];
3939                                 }
3940                         }
3941
3942                         for(i=0; i<14; i++)
3943                         {
3944                                 RT_TRACE((COMP_INIT),
3945                                 "Rf-%d TxPwr CH-%d CCK OFDM_1T OFDM_2T= 0x%x/0x%x/0x%x\n",
3946                                 rf_path, i, priv->RfTxPwrLevelCck[rf_path][i],
3947                                 priv->RfTxPwrLevelOfdm1T[rf_path][i] ,
3948                                 priv->RfTxPwrLevelOfdm2T[rf_path][i] );
3949                         }
3950                 }
3951         }
3952
3953         //
3954         // 2009/02/09 Cosa add for new EEPROM format
3955         //
3956         for(i=0; i<14; i++)     // channel 1~3 use the same Tx Power Level.
3957         {
3958                 // Read tx power difference between HT OFDM 20/40 MHZ
3959                 if (i < 3)                      // Cjanel 1-3
3960                         index = 0;
3961                 else if (i < 9)         // Channel 4-9
3962                         index = 1;
3963                 else                            // Channel 10-14
3964                         index = 2;
3965
3966                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_HT20_DIFF+index])&0xff;
3967                 priv->TxPwrHt20Diff[RF90_PATH_A][i] = (tempval&0xF);
3968                 priv->TxPwrHt20Diff[RF90_PATH_B][i] = ((tempval>>4)&0xF);
3969
3970                 // Read OFDM<->HT tx power diff
3971                 if (i < 3)                      // Cjanel 1-3
3972                         tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF])&0xff;
3973                 else if (i < 9)         // Channel 4-9
3974                         tempval = (*(u8 *)&hwinfo[EEPROM_PwDiff])&0xff;
3975                 else                            // Channel 10-14
3976                         tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF+1])&0xff;
3977
3978                 //cosa tempval = (*(u1Byte *)&hwinfo[EEPROM_TX_PWR_OFDM_DIFF+index])&0xff;
3979                 priv->TxPwrLegacyHtDiff[RF90_PATH_A][i] = (tempval&0xF);
3980                 priv->TxPwrLegacyHtDiff[RF90_PATH_B][i] = ((tempval>>4)&0xF);
3981
3982                 //
3983                 // Read Band Edge tx power offset and check if user enable the ability
3984                 //
3985                 // HT 40 band edge channel
3986                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE])&0xff;
3987                 priv->TxPwrbandEdgeHt40[RF90_PATH_A][0] = (tempval&0xF);                // Band edge low channel
3988                 priv->TxPwrbandEdgeHt40[RF90_PATH_A][1] =  ((tempval>>4)&0xF);  // Band edge high channel
3989                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+1])&0xff;
3990                 priv->TxPwrbandEdgeHt40[RF90_PATH_B][0] = (tempval&0xF);                // Band edge low channel
3991                 priv->TxPwrbandEdgeHt40[RF90_PATH_B][1] =  ((tempval>>4)&0xF);  // Band edge high channel
3992                 // HT 20 band edge channel
3993                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+2])&0xff;
3994                 priv->TxPwrbandEdgeHt20[RF90_PATH_A][0] = (tempval&0xF);                // Band edge low channel
3995                 priv->TxPwrbandEdgeHt20[RF90_PATH_A][1] =  ((tempval>>4)&0xF);  // Band edge high channel
3996                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+3])&0xff;
3997                 priv->TxPwrbandEdgeHt20[RF90_PATH_B][0] = (tempval&0xF);                // Band edge low channel
3998                 priv->TxPwrbandEdgeHt20[RF90_PATH_B][1] =  ((tempval>>4)&0xF);  // Band edge high channel
3999                 // OFDM band edge channel
4000                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+4])&0xff;
4001                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0] = (tempval&0xF);          // Band edge low channel
4002                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1] =  ((tempval>>4)&0xF);    // Band edge high channel
4003                 tempval = (*(u8 *)&hwinfo[EEPROM_TX_PWR_BAND_EDGE+5])&0xff;
4004                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][0] = (tempval&0xF);          // Band edge low channel
4005                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][1] =  ((tempval>>4)&0xF);    // Band edge high channel
4006
4007                 priv->TxPwrbandEdgeFlag = (*(u8 *)&hwinfo[TX_PWR_BAND_EDGE_CHK]);
4008         }
4009
4010         for(i=0; i<14; i++)
4011                 RT_TRACE(COMP_INIT, "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrHt20Diff[RF90_PATH_A][i]);
4012         for(i=0; i<14; i++)
4013                 RT_TRACE(COMP_INIT,  "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i, priv->TxPwrLegacyHtDiff[RF90_PATH_A][i]);
4014         for(i=0; i<14; i++)
4015                 RT_TRACE(COMP_INIT,  "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrHt20Diff[RF90_PATH_B][i]);
4016         for(i=0; i<14; i++)
4017                 RT_TRACE(COMP_INIT,  "RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i, priv->TxPwrLegacyHtDiff[RF90_PATH_B][i]);
4018         RT_TRACE(COMP_INIT, "RF-A HT40 band-edge low/high power diff = 0x%x/0x%x\n",
4019                 priv->TxPwrbandEdgeHt40[RF90_PATH_A][0],
4020                 priv->TxPwrbandEdgeHt40[RF90_PATH_A][1]);
4021         RT_TRACE((COMP_INIT&COMP_DBG), "RF-B HT40 band-edge low/high power diff = 0x%x/0x%x\n",
4022                 priv->TxPwrbandEdgeHt40[RF90_PATH_B][0],
4023                 priv->TxPwrbandEdgeHt40[RF90_PATH_B][1]);
4024
4025         RT_TRACE((COMP_INIT&COMP_DBG), "RF-A HT20 band-edge low/high power diff = 0x%x/0x%x\n",
4026                 priv->TxPwrbandEdgeHt20[RF90_PATH_A][0],
4027                 priv->TxPwrbandEdgeHt20[RF90_PATH_A][1]);
4028         RT_TRACE((COMP_INIT&COMP_DBG), "RF-B HT20 band-edge low/high power diff = 0x%x/0x%x\n",
4029                 priv->TxPwrbandEdgeHt20[RF90_PATH_B][0],
4030                 priv->TxPwrbandEdgeHt20[RF90_PATH_B][1]);
4031
4032         RT_TRACE((COMP_INIT&COMP_DBG), "RF-A OFDM band-edge low/high power diff = 0x%x/0x%x\n",
4033                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0],
4034                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1]);
4035         RT_TRACE((COMP_INIT&COMP_DBG), "RF-B OFDM band-edge low/high power diff = 0x%x/0x%x\n",
4036                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][0],
4037                 priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_B][1]);
4038         RT_TRACE((COMP_INIT&COMP_DBG), "Band-edge enable flag = %d\n", priv->TxPwrbandEdgeFlag);
4039
4040         //
4041         // Update remained HAL variables.
4042         //
4043         priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
4044         priv->LegacyHTTxPowerDiff = priv->EEPROMTxPowerDiff;
4045         priv->TxPowerDiff = priv->EEPROMTxPowerDiff;
4046         //priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);// Antenna B gain offset to antenna A, bit[3:0]
4047         //priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);// Antenna C gain offset to antenna A, bit[7:4]
4048         priv->CrystalCap = priv->EEPROMCrystalCap;      // CrystalCap, bit[15:12]
4049         priv->ThermalMeter[0] = (priv->EEPROMThermalMeter&0x1f);// ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
4050         priv->LedStrategy = SW_LED_MODE0;
4051
4052         init_rate_adaptive(dev);
4053
4054         RT_TRACE(COMP_INIT, "<==== ReadAdapterInfo8192SUsb\n");
4055
4056         //return RT_STATUS_SUCCESS;
4057 }
4058
4059
4060 //
4061 //      Description:
4062 //              Read HW adapter information by E-Fuse or EEPROM according CR9346 reported.
4063 //
4064 //      Assumption:
4065 //              1. CR9346 regiser has verified.
4066 //              2. PASSIVE_LEVEL (USB interface)
4067 //
4068 //      Created by Roger, 2008.10.21.
4069 //
4070 static void rtl8192SU_read_eeprom_info(struct net_device *dev)
4071 {
4072         struct r8192_priv       *priv = ieee80211_priv(dev);
4073         u8                      tmpU1b;
4074
4075         RT_TRACE(COMP_INIT, "====> ReadAdapterInfo8192SUsb\n");
4076
4077         // Retrieve Chip version.
4078         priv->card_8192_version = (VERSION_8192S)((read_nic_dword(dev, PMC_FSM)>>16)&0xF);
4079         RT_TRACE(COMP_INIT, "Chip Version ID: 0x%2x\n", priv->card_8192_version);
4080
4081         tmpU1b = read_nic_byte(dev, EPROM_CMD);//CR9346
4082
4083         // To check system boot selection.
4084         if (tmpU1b & CmdEERPOMSEL)
4085         {
4086                 RT_TRACE(COMP_INIT, "Boot from EEPROM\n");
4087                 priv->EepromOrEfuse = TRUE;
4088         }
4089         else
4090         {
4091                 RT_TRACE(COMP_INIT, "Boot from EFUSE\n");
4092                 priv->EepromOrEfuse = FALSE;
4093         }
4094
4095         // To check autoload success or not.
4096         if (tmpU1b & CmdEEPROM_En)
4097         {
4098                 RT_TRACE(COMP_INIT, "Autoload OK!!\n");
4099                 priv->AutoloadFailFlag=FALSE;
4100                 rtl8192SU_ReadAdapterInfo8192SUsb(dev);//eeprom or e-fuse
4101         }
4102         else
4103         { // Auto load fail.
4104                 RT_TRACE(COMP_INIT, "AutoLoad Fail reported from CR9346!!\n");
4105                 priv->AutoloadFailFlag=TRUE;
4106                 rtl8192SU_ConfigAdapterInfo8192SForAutoLoadFail(dev);
4107
4108                 //if (IS_BOOT_FROM_EFUSE(Adapter))
4109                 if(!priv->EepromOrEfuse)
4110                 {
4111                         RT_TRACE(COMP_INIT, "Update shadow map for EFuse future use!!\n");
4112                         EFUSE_ShadowMapUpdate(dev);
4113                 }
4114         }
4115 #ifdef TO_DO_LIST
4116         if((priv->RegChannelPlan >= RT_CHANNEL_DOMAIN_MAX) || (pHalData->EEPROMChannelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK))
4117         {
4118                 pMgntInfo->ChannelPlan = HalMapChannelPlan8192S(Adapter, (pHalData->EEPROMChannelPlan & (~(EEPROM_CHANNEL_PLAN_BY_HW_MASK))));
4119                 pMgntInfo->bChnlPlanFromHW = (pHalData->EEPROMChannelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) ? TRUE : FALSE; // User cannot change  channel plan.
4120         }
4121         else
4122         {
4123                 pMgntInfo->ChannelPlan = (RT_CHANNEL_DOMAIN)pMgntInfo->RegChannelPlan;
4124         }
4125
4126         switch(pMgntInfo->ChannelPlan)
4127         {
4128                 case RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN:
4129                 {
4130                         PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
4131
4132                         pDot11dInfo->bEnabled = TRUE;
4133                 }
4134                 RT_TRACE(COMP_INIT, DBG_LOUD, ("ReadAdapterInfo8187(): Enable dot11d when RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN!\n"));
4135                 break;
4136         }
4137
4138         RT_TRACE(COMP_INIT, DBG_LOUD, ("RegChannelPlan(%d) EEPROMChannelPlan(%d)", pMgntInfo->RegChannelPlan, pHalData->EEPROMChannelPlan));
4139         RT_TRACE(COMP_INIT, DBG_LOUD, ("ChannelPlan = %d\n" , pMgntInfo->ChannelPlan));
4140
4141         RT_TRACE(COMP_INIT, DBG_LOUD, ("<==== ReadAdapterInfo8192S\n"));
4142 #endif
4143
4144         RT_TRACE(COMP_INIT, "<==== ReadAdapterInfo8192SUsb\n");
4145
4146         //return RT_STATUS_SUCCESS;
4147 }
4148
4149 short rtl8192_get_channel_map(struct net_device * dev)
4150 {
4151         struct r8192_priv *priv = ieee80211_priv(dev);
4152         if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
4153                 printk("rtl8180_init:Error channel plan! Set to default.\n");
4154                 priv->ChannelPlan= 0;
4155         }
4156         RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
4157
4158         rtl819x_set_channel_map(priv->ChannelPlan, priv);
4159         return 0;
4160 }
4161
4162 short rtl8192_init(struct net_device *dev)
4163 {
4164
4165         struct r8192_priv *priv = ieee80211_priv(dev);
4166
4167         rtl8192_init_priv_variable(dev);
4168         rtl8192_init_priv_lock(priv);
4169         rtl8192_init_priv_task(dev);
4170         rtl8192_get_eeprom_size(dev);
4171         priv->ops->rtl819x_read_eeprom_info(dev);
4172         rtl8192_get_channel_map(dev);
4173         init_hal_dm(dev);
4174         init_timer(&priv->watch_dog_timer);
4175         priv->watch_dog_timer.data = (unsigned long)dev;
4176         priv->watch_dog_timer.function = watch_dog_timer_callback;
4177
4178         //rtl8192_adapter_start(dev);
4179 #ifdef DEBUG_EPROM
4180         dump_eprom(dev);
4181 #endif
4182         return 0;
4183 }
4184
4185 /******************************************************************************
4186  *function:  This function actually only set RRSR, RATR and BW_OPMODE registers
4187  *           not to do all the hw config as its name says
4188  *   input:  net_device dev
4189  *  output:  none
4190  *  return:  none
4191  *  notice:  This part need to modified according to the rate set we filtered
4192  * ****************************************************************************/
4193 void rtl8192_hwconfig(struct net_device* dev)
4194 {
4195         u32 regRATR = 0, regRRSR = 0;
4196         u8 regBwOpMode = 0, regTmp = 0;
4197         struct r8192_priv *priv = ieee80211_priv(dev);
4198
4199 // Set RRSR, RATR, and BW_OPMODE registers
4200         //
4201         switch(priv->ieee80211->mode)
4202         {
4203         case WIRELESS_MODE_B:
4204                 regBwOpMode = BW_OPMODE_20MHZ;
4205                 regRATR = RATE_ALL_CCK;
4206                 regRRSR = RATE_ALL_CCK;
4207                 break;
4208         case WIRELESS_MODE_A:
4209                 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
4210                 regRATR = RATE_ALL_OFDM_AG;
4211                 regRRSR = RATE_ALL_OFDM_AG;
4212                 break;
4213         case WIRELESS_MODE_G:
4214                 regBwOpMode = BW_OPMODE_20MHZ;
4215                 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4216                 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4217                 break;
4218         case WIRELESS_MODE_AUTO:
4219 #ifdef TO_DO_LIST
4220                 if (Adapter->bInHctTest)
4221                 {
4222                     regBwOpMode = BW_OPMODE_20MHZ;
4223                     regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4224                     regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4225                 }
4226                 else
4227 #endif
4228                 {
4229                     regBwOpMode = BW_OPMODE_20MHZ;
4230                     regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4231                     regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4232                 }
4233                 break;
4234         case WIRELESS_MODE_N_24G:
4235                 // It support CCK rate by default.
4236                 // CCK rate will be filtered out only when associated AP does not support it.
4237                 regBwOpMode = BW_OPMODE_20MHZ;
4238                         regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4239                         regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4240                 break;
4241         case WIRELESS_MODE_N_5G:
4242                 regBwOpMode = BW_OPMODE_5G;
4243                 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4244                 regRRSR = RATE_ALL_OFDM_AG;
4245                 break;
4246         }
4247
4248         write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4249         {
4250                 u32 ratr_value = 0;
4251                 ratr_value = regRATR;
4252                 if (priv->rf_type == RF_1T2R)
4253                 {
4254                         ratr_value &= ~(RATE_ALL_OFDM_2SS);
4255                 }
4256                 write_nic_dword(dev, RATR0, ratr_value);
4257                 write_nic_byte(dev, UFWP, 1);
4258         }
4259         regTmp = read_nic_byte(dev, 0x313);
4260         regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
4261         write_nic_dword(dev, RRSR, regRRSR);
4262
4263         //
4264         // Set Retry Limit here
4265         //
4266         write_nic_word(dev, RETRY_LIMIT,
4267                         priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
4268                         priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
4269         // Set Contention Window here
4270
4271         // Set Tx AGC
4272
4273         // Set Tx Antenna including Feedback control
4274
4275         // Set Auto Rate fallback control
4276
4277
4278 }
4279
4280
4281 //
4282 //      Description:
4283 //              Initial HW relted registers.
4284 //
4285 //      Assumption:
4286 //              Config RTL8192S USB MAC, we should config MAC before download FW.
4287 //
4288 //      2008.09.03, Added by Roger.
4289 //
4290 static void rtl8192SU_MacConfigBeforeFwDownloadASIC(struct net_device *dev)
4291 {
4292         u8                              tmpU1b;// i;
4293 //      u16                             tmpU2b;
4294 //      u32                             tmpU4b;
4295         u8                              PollingCnt = 20;
4296
4297         RT_TRACE(COMP_INIT, "--->MacConfigBeforeFwDownloadASIC()\n");
4298
4299         //2MAC Initialization for power on sequence, Revised by Roger. 2008.09.03.
4300
4301         //
4302         //<Roger_Notes> Set control path switch to HW control and reset Digital Core,  CPU Core and
4303         // MAC I/O to solve FW download fail when system from resume sate.
4304         // 2008.11.04.
4305         //
4306        tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4307        if(tmpU1b & 0x80)
4308         {
4309         tmpU1b &= 0x3f;
4310               write_nic_byte(dev, SYS_CLKR+1, tmpU1b);
4311        }
4312         // Clear FW RPWM for FW control LPS. by tynli. 2009.02.23
4313         write_nic_byte(dev, RPWM, 0x0);
4314
4315        tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4316        tmpU1b &= 0x73;
4317        write_nic_byte(dev, SYS_FUNC_EN+1, tmpU1b);
4318        udelay(1000);
4319
4320         //Revised POS, suggested by SD1 Alex, 2008.09.27.
4321         write_nic_byte(dev, SPS0_CTRL+1, 0x53);
4322         write_nic_byte(dev, SPS0_CTRL, 0x57);
4323
4324         //Enable AFE Macro Block's Bandgap adn Enable AFE Macro Block's Mbias
4325         tmpU1b = read_nic_byte(dev, AFE_MISC);
4326         write_nic_byte(dev, AFE_MISC, (tmpU1b|AFE_BGEN|AFE_MBEN));
4327
4328         //Enable PLL Power (LDOA15V)
4329         tmpU1b = read_nic_byte(dev, LDOA15_CTRL);
4330         write_nic_byte(dev, LDOA15_CTRL, (tmpU1b|LDA15_EN));
4331
4332         //Enable LDOV12D block
4333         tmpU1b = read_nic_byte(dev, LDOV12D_CTRL);
4334         write_nic_byte(dev, LDOV12D_CTRL, (tmpU1b|LDV12_EN));
4335
4336         //mpU1b = read_nic_byte(Adapter, SPS1_CTRL);
4337         //write_nic_byte(dev, SPS1_CTRL, (tmpU1b|SPS1_LDEN));
4338
4339         //PlatformSleepUs(2000);
4340
4341         //Enable Switch Regulator Block
4342         //tmpU1b = read_nic_byte(Adapter, SPS1_CTRL);
4343         //write_nic_byte(dev, SPS1_CTRL, (tmpU1b|SPS1_SWEN));
4344
4345         //write_nic_dword(Adapter, SPS1_CTRL, 0x00a7b267);
4346
4347         tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL+1);
4348         write_nic_byte(dev, SYS_ISO_CTRL+1, (tmpU1b|0x08));
4349
4350         //Engineer Packet CP test Enable
4351         tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4352         write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x20));
4353
4354         //Support 64k IMEM, suggested by SD1 Alex.
4355         tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL+1);
4356         write_nic_byte(dev, SYS_ISO_CTRL+1, (tmpU1b& 0x68));
4357
4358         //Enable AFE clock
4359         tmpU1b = read_nic_byte(dev, AFE_XTAL_CTRL+1);
4360         write_nic_byte(dev, AFE_XTAL_CTRL+1, (tmpU1b& 0xfb));
4361
4362         //Enable AFE PLL Macro Block
4363         tmpU1b = read_nic_byte(dev, AFE_PLL_CTRL);
4364         write_nic_byte(dev, AFE_PLL_CTRL, (tmpU1b|0x11));
4365
4366         //Attatch AFE PLL to MACTOP/BB/PCIe Digital
4367         tmpU1b = read_nic_byte(dev, SYS_ISO_CTRL);
4368         write_nic_byte(dev, SYS_ISO_CTRL, (tmpU1b&0xEE));
4369
4370         // Switch to 40M clock
4371         write_nic_byte(dev, SYS_CLKR, 0x00);
4372
4373         //SSC Disable
4374         tmpU1b = read_nic_byte(dev, SYS_CLKR);
4375         //write_nic_byte(dev, SYS_CLKR, (tmpU1b&0x5f));
4376         write_nic_byte(dev, SYS_CLKR, (tmpU1b|0xa0));
4377
4378         //Enable MAC clock
4379         tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4380         write_nic_byte(dev, SYS_CLKR+1, (tmpU1b|0x18));
4381
4382         //Revised POS, suggested by SD1 Alex, 2008.09.27.
4383         write_nic_byte(dev, PMC_FSM, 0x02);
4384
4385         //Enable Core digital and enable IOREG R/W
4386         tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4387         write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x08));
4388
4389         //Enable REG_EN
4390         tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
4391         write_nic_byte(dev, SYS_FUNC_EN+1, (tmpU1b|0x80));
4392
4393         //Switch the control path to FW
4394         tmpU1b = read_nic_byte(dev, SYS_CLKR+1);
4395         write_nic_byte(dev, SYS_CLKR+1, (tmpU1b|0x80)& 0xBF);
4396
4397         write_nic_byte(dev, CMDR, 0xFC);
4398         write_nic_byte(dev, CMDR+1, 0x37);
4399
4400         //Fix the RX FIFO issue(usb error), 970410
4401         tmpU1b = read_nic_byte_E(dev, 0x5c);
4402         write_nic_byte_E(dev, 0x5c, (tmpU1b|BIT7));
4403
4404          //For power save, used this in the bit file after 970621
4405         tmpU1b = read_nic_byte(dev, SYS_CLKR);
4406         write_nic_byte(dev, SYS_CLKR, tmpU1b&(~SYS_CPU_CLKSEL));
4407
4408         // Revised for 8051 ROM code wrong operation. Added by Roger. 2008.10.16.
4409         write_nic_byte_E(dev, 0x1c, 0x80);
4410
4411         //
4412         // <Roger_EXP> To make sure that TxDMA can ready to download FW.
4413         // We should reset TxDMA if IMEM RPT was not ready.
4414         // Suggested by SD1 Alex. 2008.10.23.
4415         //
4416         do
4417         {
4418                 tmpU1b = read_nic_byte(dev, TCR);
4419                 if((tmpU1b & TXDMA_INIT_VALUE) == TXDMA_INIT_VALUE)
4420                         break;
4421                 //PlatformStallExecution(5);
4422                 udelay(5);
4423         }while(PollingCnt--);   // Delay 1ms
4424
4425         if(PollingCnt <= 0 )
4426         {
4427                 RT_TRACE(COMP_INIT, "MacConfigBeforeFwDownloadASIC(): Polling TXDMA_INIT_VALUE timeout!! Current TCR(%#x)\n", tmpU1b);
4428                 tmpU1b = read_nic_byte(dev, CMDR);
4429                 write_nic_byte(dev, CMDR, tmpU1b&(~TXDMA_EN));
4430                 udelay(2);
4431                 write_nic_byte(dev, CMDR, tmpU1b|TXDMA_EN);// Reset TxDMA
4432         }
4433
4434
4435         RT_TRACE(COMP_INIT, "<---MacConfigBeforeFwDownloadASIC()\n");
4436 }
4437
4438 //
4439 //      Description:
4440 //              Initial HW relted registers.
4441 //
4442 //      Assumption:
4443 //              1. This function is only invoked at driver intialization once.
4444 //              2. PASSIVE LEVEL.
4445 //
4446 //      2008.06.10, Added by Roger.
4447 //
4448 static void rtl8192SU_MacConfigAfterFwDownload(struct net_device *dev)
4449 {
4450         struct r8192_priv *priv = ieee80211_priv((struct net_device *)dev);
4451         //PRT_HIGH_THROUGHPUT   pHTInfo = priv->ieee80211->pHTInfo;
4452         //u8    tmpU1b, RxPageCfg, i;
4453         u16     tmpU2b;
4454         u8      tmpU1b;//, i;
4455
4456
4457         RT_TRACE(COMP_INIT, "--->MacConfigAfterFwDownload()\n");
4458
4459         // Enable Tx/Rx
4460         tmpU2b = (BBRSTn|BB_GLB_RSTn|SCHEDULE_EN|MACRXEN|MACTXEN|DDMA_EN|
4461                          FW2HW_EN|RXDMA_EN|TXDMA_EN|HCI_RXDMA_EN|HCI_TXDMA_EN);         //3
4462         //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_COMMAND, &tmpU1b );
4463         write_nic_word(dev, CMDR, tmpU2b); //LZM REGISTER COM 090305
4464
4465         // Loopback mode or not
4466         priv->LoopbackMode = RTL8192SU_NO_LOOPBACK; // Set no loopback as default.
4467         if(priv->LoopbackMode == RTL8192SU_NO_LOOPBACK)
4468                 tmpU1b = LBK_NORMAL;
4469         else if (priv->LoopbackMode == RTL8192SU_MAC_LOOPBACK )
4470                 tmpU1b = LBK_MAC_DLB;
4471         else
4472                 RT_TRACE(COMP_INIT, "Serious error: wrong loopback mode setting\n");
4473
4474         //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_LBK_MODE, &tmpU1b);
4475         write_nic_byte(dev, LBKMD_SEL, tmpU1b);
4476
4477         // Set RCR
4478         write_nic_dword(dev, RCR, priv->ReceiveConfig);
4479         RT_TRACE(COMP_INIT, "MacConfigAfterFwDownload(): Current RCR settings(%#x)\n", priv->ReceiveConfig);
4480
4481
4482         // Set RQPN
4483         //
4484         // <Roger_Notes> 2008.08.18.
4485         // 6 endpoints:
4486         // (1) Page number on CMDQ is 0x03.
4487         // (2) Page number on BCNQ, HQ and MGTQ is 0.
4488         // (3) Page number on BKQ, BEQ, VIQ and VOQ are 0x07.
4489         // (4) Page number on PUBQ is 0xdd
4490         //
4491         // 11 endpoints:
4492         // (1) Page number on CMDQ is 0x00.
4493         // (2) Page number on BCNQ is 0x02, HQ and MGTQ are 0x03.
4494         // (3) Page number on BKQ, BEQ, VIQ and VOQ are 0x07.
4495         // (4) Page number on PUBQ is 0xd8
4496         //
4497         //write_nic_dword(Adapter, 0xa0, 0x07070707); //BKQ, BEQ, VIQ and VOQ
4498         //write_nic_byte(dev, 0xa4, 0x00); // HCCAQ
4499
4500         // Fix the RX FIFO issue(USB error), Rivesed by Roger, 2008-06-14
4501         tmpU1b = read_nic_byte_E(dev, 0x5C);
4502         write_nic_byte_E(dev, 0x5C, tmpU1b|BIT7);
4503
4504         // For EFUSE init configuration.
4505         //if (IS_BOOT_FROM_EFUSE(Adapter))      // We may R/W EFUSE in EFUSE mode
4506         if (priv->bBootFromEfuse)
4507         {
4508                 u8      tempval;
4509
4510                 tempval = read_nic_byte(dev, SYS_ISO_CTRL+1);
4511                 tempval &= 0xFE;
4512                 write_nic_byte(dev, SYS_ISO_CTRL+1, tempval);
4513
4514                 // Enable LDO 2.5V for write action
4515                 //tempval = read_nic_byte(Adapter, EFUSE_TEST+3);
4516                 //write_nic_byte(Adapter, EFUSE_TEST+3, (tempval | 0x80));
4517
4518                 // Change Efuse Clock for write action
4519                 //write_nic_byte(Adapter, EFUSE_CLK, 0x03);
4520
4521                 // Change Program timing
4522                 write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
4523                 //printk("!!!!!!!!!!!!!!!!!!!!!%s: write 0x33 with 0x72\n",__FUNCTION__);
4524                 RT_TRACE(COMP_INIT, "EFUSE CONFIG OK\n");
4525         }
4526
4527
4528         RT_TRACE(COMP_INIT, "<---MacConfigAfterFwDownload()\n");
4529 }
4530
4531 void rtl8192SU_HwConfigureRTL8192SUsb(struct net_device *dev)
4532 {
4533
4534         struct r8192_priv *priv = ieee80211_priv(dev);
4535         u8                      regBwOpMode = 0;
4536         u32                     regRATR = 0, regRRSR = 0;
4537         u8                      regTmp = 0;
4538         u32                     i = 0;
4539
4540         //1 This part need to modified according to the rate set we filtered!!
4541         //
4542         // Set RRSR, RATR, and BW_OPMODE registers
4543         //
4544         switch(priv->ieee80211->mode)
4545         {
4546         case WIRELESS_MODE_B:
4547                 regBwOpMode = BW_OPMODE_20MHZ;
4548                 regRATR = RATE_ALL_CCK;
4549                 regRRSR = RATE_ALL_CCK;
4550                 break;
4551         case WIRELESS_MODE_A:
4552                 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
4553                 regRATR = RATE_ALL_OFDM_AG;
4554                 regRRSR = RATE_ALL_OFDM_AG;
4555                 break;
4556         case WIRELESS_MODE_G:
4557                 regBwOpMode = BW_OPMODE_20MHZ;
4558                 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4559                 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4560                 break;
4561         case WIRELESS_MODE_AUTO:
4562                 if (priv->bInHctTest)
4563                 {
4564                     regBwOpMode = BW_OPMODE_20MHZ;
4565                     regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4566                     regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4567                 }
4568                 else
4569                 {
4570                     regBwOpMode = BW_OPMODE_20MHZ;
4571                     regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4572                     regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4573                 }
4574                 break;
4575         case WIRELESS_MODE_N_24G:
4576                 // It support CCK rate by default.
4577                 // CCK rate will be filtered out only when associated AP does not support it.
4578                 regBwOpMode = BW_OPMODE_20MHZ;
4579                         regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4580                         regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
4581                 break;
4582         case WIRELESS_MODE_N_5G:
4583                 regBwOpMode = BW_OPMODE_5G;
4584                 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
4585                 regRRSR = RATE_ALL_OFDM_AG;
4586                 break;
4587         }
4588
4589         //
4590         // <Roger_Notes> We disable CCK response rate until FIB CCK rate IC's back.
4591         // 2008.09.23.
4592         //
4593         regTmp = read_nic_byte(dev, INIRTSMCS_SEL);
4594         regRRSR = ((regRRSR & 0x000fffff)<<8) | regTmp;
4595
4596         //
4597         // Update SIFS timing.
4598         //
4599         //priv->SifsTime = 0x0e0e0a0a;
4600         //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SIFS,  (pu1Byte)&pHalData->SifsTime);
4601         {       u8 val[4] = {0x0e, 0x0e, 0x0a, 0x0a};
4602                 // SIFS for CCK Data ACK
4603                 write_nic_byte(dev, SIFS_CCK, val[0]);
4604                 // SIFS for CCK consecutive tx like CTS data!
4605                 write_nic_byte(dev, SIFS_CCK+1, val[1]);
4606
4607                 // SIFS for OFDM Data ACK
4608                 write_nic_byte(dev, SIFS_OFDM, val[2]);
4609                 // SIFS for OFDM consecutive tx like CTS data!
4610                 write_nic_byte(dev, SIFS_OFDM+1, val[3]);
4611         }
4612
4613         write_nic_dword(dev, INIRTSMCS_SEL, regRRSR);
4614         write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4615
4616         //
4617         // Suggested by SD1 Alex, 2008-06-14.
4618         //
4619         //PlatformEFIOWrite1Byte(Adapter, TXOP_STALL_CTRL, 0x80);//NAV to protect all TXOP.
4620
4621         //
4622         // Set Data Auto Rate Fallback Retry Count register.
4623         //
4624         write_nic_dword(dev, DARFRC, 0x02010000);
4625         write_nic_dword(dev, DARFRC+4, 0x06050403);
4626         write_nic_dword(dev, RARFRC, 0x02010000);
4627         write_nic_dword(dev, RARFRC+4, 0x06050403);
4628
4629         // Set Data Auto Rate Fallback Reg. Added by Roger, 2008.09.22.
4630         for (i = 0; i < 8; i++)
4631                 write_nic_dword(dev, ARFR0+i*4, 0x1f0ffff0);
4632
4633         //
4634         // Aggregation length limit. Revised by Roger. 2008.09.22.
4635         //
4636         write_nic_byte(dev, AGGLEN_LMT_H, 0x0f);        // Set AMPDU length to 12Kbytes for ShortGI case.
4637         write_nic_dword(dev, AGGLEN_LMT_L, 0xddd77442); // Long GI
4638         write_nic_dword(dev, AGGLEN_LMT_L+4, 0xfffdd772);
4639
4640         // Set NAV protection length
4641         write_nic_word(dev, NAV_PROT_LEN, 0x0080);
4642
4643         // Set TXOP stall control for several queue/HI/BCN/MGT/
4644         write_nic_byte(dev, TXOP_STALL_CTRL, 0x00); // NAV Protect next packet.
4645
4646         // Set MSDU lifetime.
4647         write_nic_byte(dev, MLT, 0x8f);
4648
4649         // Set CCK/OFDM SIFS
4650         write_nic_word(dev, SIFS_CCK, 0x0a0a); // CCK SIFS shall always be 10us.
4651         write_nic_word(dev, SIFS_OFDM, 0x0e0e);
4652
4653         write_nic_byte(dev, ACK_TIMEOUT, 0x40);
4654
4655         // CF-END Threshold
4656         write_nic_byte(dev, CFEND_TH, 0xFF);
4657
4658         //
4659         // For Min Spacing configuration.
4660         //
4661         switch(priv->rf_type)
4662         {
4663                 case RF_1T2R:
4664                 case RF_1T1R:
4665                         RT_TRACE(COMP_INIT, "Initializeadapter: RF_Type%s\n", (priv->rf_type==RF_1T1R? "(1T1R)":"(1T2R)"));
4666                         priv->MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
4667                         break;
4668                 case RF_2T2R:
4669                 case RF_2T2R_GREEN:
4670                         RT_TRACE(COMP_INIT, "Initializeadapter:RF_Type(2T2R)\n");
4671                         priv->MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
4672                         break;
4673         }
4674         write_nic_byte(dev, AMPDU_MIN_SPACE, priv->MinSpaceCfg);
4675
4676         //LZM 090219
4677         //
4678         // For Min Spacing configuration.
4679         //
4680         //priv->MinSpaceCfg = 0x00;
4681         //rtl8192SU_SetHwRegAmpduMinSpace(dev, priv->MinSpaceCfg);
4682 }
4683
4684
4685 //      Description:    Initial HW relted registers.
4686 //
4687 //      Assumption:     This function is only invoked at driver intialization once.
4688 //
4689 //      2008.06.10, Added by Roger.
4690 bool rtl8192SU_adapter_start(struct net_device *dev)
4691 {
4692         struct r8192_priv *priv = ieee80211_priv(dev);
4693         //u32                                   dwRegRead = 0;
4694         //bool                                  init_status = true;
4695         //u32                                   ulRegRead;
4696         bool                                            rtStatus = true;
4697         //u8                                    PipeIndex;
4698         //u8                                    eRFPath, tmpU1b;
4699         u8 fw_download_times = 1;
4700
4701
4702         RT_TRACE(COMP_INIT, "--->InitializeAdapter8192SUsb()\n");
4703
4704         //pHalData->bGPIOChangeRF = FALSE;
4705
4706
4707         //
4708         // <Roger_Notes> 2008.06.15.
4709         //
4710         // Initialization Steps on RTL8192SU:
4711         // a. MAC initialization prior to sending down firmware code.
4712         // b. Download firmware code step by step(i.e., IMEM, EMEM, DMEM).
4713         // c. MAC configuration after firmware has been download successfully.
4714         // d. Initialize BB related configurations.
4715         // e. Initialize RF related configurations.
4716         // f.  Start to BulkIn transfer.
4717         //
4718
4719         //
4720         //a. MAC initialization prior to send down firmware code.
4721         //
4722 start:
4723         rtl8192SU_MacConfigBeforeFwDownloadASIC(dev);
4724
4725         //
4726         //b. Download firmware code step by step(i.e., IMEM, EMEM, DMEM).
4727         //
4728         rtStatus = FirmwareDownload92S(dev);
4729         if(rtStatus != true)
4730         {
4731                 if(fw_download_times == 1){
4732                         RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Download Firmware failed once, Download again!!\n");
4733                         fw_download_times = fw_download_times + 1;
4734                         goto start;
4735                 }else{
4736                         RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Download Firmware failed twice, end!!\n");
4737                 goto end;
4738         }
4739         }
4740         //
4741         //c. MAC configuration after firmware has been download successfully.
4742         //
4743         rtl8192SU_MacConfigAfterFwDownload(dev);
4744
4745         //priv->bLbusEnable = TRUE;
4746         //if(priv->RegRfOff == TRUE)
4747         //      priv->eRFPowerState = eRfOff;
4748
4749         // Save target channel
4750         // <Roger_Notes> Current Channel will be updated again later.
4751         //priv->CurrentChannel = Channel;
4752         rtStatus = PHY_MACConfig8192S(dev);//===>ok
4753         if(rtStatus != true)
4754         {
4755                 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure MAC!!\n");
4756                 goto end;
4757         }
4758         if (1){
4759                 int i;
4760                 for (i=0; i<4; i++)
4761                         write_nic_dword(dev,WDCAPARA_ADD[i], 0x5e4322);
4762                 write_nic_byte(dev,AcmHwCtrl, 0x01);
4763         }
4764
4765
4766         //
4767         //d. Initialize BB related configurations.
4768         //
4769
4770         rtStatus = PHY_BBConfig8192S(dev);//===>ok
4771         if(rtStatus != true)
4772         {
4773                 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure BB!!\n");
4774                 goto end;
4775         }
4776
4777         rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x58);//===>ok
4778
4779         //
4780         // e. Initialize RF related configurations.
4781         //
4782         // 2007/11/02 MH Before initalizing RF. We can not use FW to do RF-R/W.
4783         priv->Rf_Mode = RF_OP_By_SW_3wire;
4784
4785         // For RF test only from Scott's suggestion
4786         //write_nic_byte(dev, 0x27, 0xDB);
4787         //write_nic_byte(dev, 0x1B, 0x07);
4788
4789
4790         write_nic_byte(dev, AFE_XTAL_CTRL+1, 0xDB);
4791
4792         // <Roger_Notes> The following IOs are configured for each RF modules.
4793         // Enable RF module and reset RF and SDM module. 2008.11.17.
4794         if(priv->card_8192_version == VERSION_8192S_ACUT)
4795                 write_nic_byte(dev, SPS1_CTRL+3, (u8)(RF_EN|RF_RSTB|RF_SDMRSTB)); // Fix A-Cut bug.
4796         else
4797                 write_nic_byte(dev, RF_CTRL, (u8)(RF_EN|RF_RSTB|RF_SDMRSTB));
4798
4799         rtStatus = PHY_RFConfig8192S(dev);//===>ok
4800         if(rtStatus != true)
4801         {
4802                 RT_TRACE(COMP_INIT, "InitializeAdapter8192SUsb(): Fail to configure RF!!\n");
4803                 goto end;
4804         }
4805
4806
4807         // Set CCK and OFDM Block "ON"
4808         rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
4809         rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
4810
4811         //
4812         // Turn off Radio B while RF type is 1T1R by SD3 Wilsion's request.
4813         // Revised by Roger, 2008.12.18.
4814         //
4815         if(priv->rf_type == RF_1T1R)
4816         {
4817                 // This is needed for PHY_REG after 20081219
4818                 rtl8192_setBBreg(dev, rFPGA0_RFMOD, 0xff000000, 0x03);
4819                 // This is needed for PHY_REG before 20081219
4820                 //PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x11);
4821         }
4822
4823
4824         //LZM 090219
4825         // Set CCK and OFDM Block "ON"
4826         //rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
4827         //rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
4828
4829
4830         //3//Get hardware version, do it in read eeprom?
4831         //GetHardwareVersion819xUsb(Adapter);
4832
4833         //3//
4834         //3 //Set Hardware
4835         //3//
4836         rtl8192SU_HwConfigureRTL8192SUsb(dev);//==>ok
4837
4838         //
4839         // <Roger_Notes> We set MAC address here if autoload was failed before,
4840         // otherwise IDR0 will NOT contain any value.
4841         //
4842         write_nic_dword(dev, IDR0, ((u32*)dev->dev_addr)[0]);
4843         write_nic_word(dev, IDR4, ((u16*)(dev->dev_addr + 4))[0]);
4844         if(!priv->bInHctTest)
4845         {
4846                 if(priv->ResetProgress == RESET_TYPE_NORESET)
4847                 {
4848                         //RT_TRACE(COMP_MLME, DBG_LOUD, ("Initializeadapter8192SUsb():RegWirelessMode(%#x) \n", Adapter->RegWirelessMode));
4849                         //Adapter->HalFunc.SetWirelessModeHandler(Adapter, Adapter->RegWirelessMode);
4850                         rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);//===>ok
4851                 }
4852         }
4853         else
4854         {
4855                 priv->ieee80211->mode = WIRELESS_MODE_G;
4856                 rtl8192_SetWirelessMode(dev, WIRELESS_MODE_G);
4857         }
4858
4859         //Security related.
4860         //-----------------------------------------------------------------------------
4861         // Set up security related. 070106, by rcnjko:
4862         // 1. Clear all H/W keys.
4863         // 2. Enable H/W encryption/decryption.
4864         //-----------------------------------------------------------------------------
4865         //CamResetAllEntry(Adapter);
4866         //Adapter->HalFunc.EnableHWSecCfgHandler(Adapter);
4867
4868         //SecClearAllKeys(Adapter);
4869         CamResetAllEntry(dev);
4870         //SecInit(Adapter);
4871         {
4872                 u8 SECR_value = 0x0;
4873                 SECR_value |= SCR_TxEncEnable;
4874                 SECR_value |= SCR_RxDecEnable;
4875                 SECR_value |= SCR_NoSKMC;
4876                 write_nic_byte(dev, SECR, SECR_value);
4877         }
4878
4879 #ifdef TO_DO_LIST
4880
4881         //PHY_UpdateInitialGain(dev);
4882
4883         if(priv->RegRfOff == true)
4884         { // User disable RF via registry.
4885                 u8 eRFPath = 0;
4886
4887                 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): Turn off RF for RegRfOff ----------\n");
4888                 MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_SW);
4889                 // Those action will be discard in MgntActSet_RF_State because off the same state
4890                 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
4891                         rtl8192_setBBreg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
4892         }
4893         else if(priv->RfOffReason > RF_CHANGE_BY_PS)
4894         { // H/W or S/W RF OFF before sleep.
4895                 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): Turn off RF for RfOffReason(%d) ----------\n", priv->RfOffReason);
4896                 MgntActSet_RF_State(dev, eRfOff, priv->RfOffReason);
4897         }
4898         else
4899         {
4900                 priv->eRFPowerState = eRfOn;
4901                 priv->RfOffReason = 0;
4902                 RT_TRACE((COMP_INIT|COMP_RF), "InitializeAdapter8192SUsb(): RF is on ----------\n");
4903         }
4904
4905 #endif
4906
4907
4908 //
4909 // f. Start to BulkIn transfer.
4910 //
4911 #ifdef TO_DO_LIST
4912
4913 #ifndef UNDER_VISTA
4914         {
4915                 u8      i;
4916                 PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
4917
4918                 for(PipeIndex=0; PipeIndex < MAX_RX_QUEUE; PipeIndex++)
4919                 {
4920                         if (PipeIndex == 0)
4921                         {
4922                                 for(i=0; i<32; i++)
4923                                 HalUsbInMpdu(Adapter, PipeIndex);
4924                         }
4925                         else
4926                         {
4927                                 //HalUsbInMpdu(Adapter, PipeIndex);
4928                                 //HalUsbInMpdu(Adapter, PipeIndex);
4929                                 //HalUsbInMpdu(Adapter, PipeIndex);
4930                         }
4931                 }
4932                 PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
4933         }
4934 #else
4935                 // Joseph add to 819X code base for Vista USB platform.
4936                 // This part may need to be add to Hal819xU code base. too.
4937                 PlatformUsbEnableInPipes(Adapter);
4938 #endif
4939
4940         RT_TRACE(COMP_INIT, "HighestOperaRate = %x\n", Adapter->MgntInfo.HighestOperaRate);
4941
4942         PlatformStartWorkItem( &(pHalData->RtUsbCheckForHangWorkItem) );
4943
4944         //
4945         // <Roger_EXP> The following  configurations are for ASIC verification temporally.
4946         // 2008.07.10.
4947         //
4948
4949 #endif
4950
4951         //
4952         // Read EEPROM TX power index and PHY_REG_PG.txt to capture correct
4953         // TX power index for different rate set.
4954         //
4955         //if(priv->card_8192_version >= VERSION_8192S_ACUT)
4956         {
4957                 // Get original hw reg values
4958                 PHY_GetHWRegOriginalValue(dev);
4959
4960                 // Write correct tx power index//FIXLZM
4961                 PHY_SetTxPowerLevel8192S(dev, priv->chan);
4962         }
4963
4964         {
4965         u8  tmpU1b = 0;
4966         // EEPROM R/W workaround
4967         tmpU1b = read_nic_byte(dev, MAC_PINMUX_CFG);
4968         write_nic_byte(dev, MAC_PINMUX_CFG, tmpU1b&(~GPIOMUX_EN));
4969         }
4970
4971 //
4972 //<Roger_Notes> 2008.08.19.
4973 // We return status here for temporal FPGA verification, 2008.08.19.
4974
4975 #ifdef RTL8192SU_FW_IQK
4976         write_nic_dword(dev, WFM5, FW_IQK_ENABLE);
4977         ChkFwCmdIoDone(dev);
4978 #endif
4979
4980         //
4981         // <Roger_Notes> We enable high power mechanism after NIC initialized.
4982         // 2008.11.27.
4983         //
4984         write_nic_dword(dev, WFM5, FW_RA_RESET);
4985         ChkFwCmdIoDone(dev);
4986         write_nic_dword(dev, WFM5, FW_RA_ACTIVE);
4987         ChkFwCmdIoDone(dev);
4988         write_nic_dword(dev, WFM5, FW_RA_REFRESH);
4989         ChkFwCmdIoDone(dev);
4990         write_nic_dword(dev, WFM5, FW_BB_RESET_ENABLE);
4991
4992 // <Roger_Notes> We return status here for temporal FPGA verification. 2008.05.12.
4993 //
4994
4995 end:
4996 return rtStatus;
4997 }
4998
4999 /***************************************************************************
5000     -------------------------------NET STUFF---------------------------
5001 ***************************************************************************/
5002
5003 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
5004 {
5005         struct r8192_priv *priv = ieee80211_priv(dev);
5006
5007         return &priv->ieee80211->stats;
5008 }
5009
5010 bool
5011 HalTxCheckStuck819xUsb(
5012         struct net_device *dev
5013         )
5014 {
5015         struct r8192_priv *priv = ieee80211_priv(dev);
5016         u16             RegTxCounter = read_nic_word(dev, 0x128);
5017         bool            bStuck = FALSE;
5018         RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
5019         if(priv->TxCounter==RegTxCounter)
5020                 bStuck = TRUE;
5021
5022         priv->TxCounter = RegTxCounter;
5023
5024         return bStuck;
5025 }
5026
5027 /*
5028 *       <Assumption: RT_TX_SPINLOCK is acquired.>
5029 *       First added: 2006.11.19 by emily
5030 */
5031 RESET_TYPE
5032 TxCheckStuck(struct net_device *dev)
5033 {
5034         struct r8192_priv *priv = ieee80211_priv(dev);
5035         u8                      QueueID;
5036 //      PRT_TCB                 pTcb;
5037 //      u8                      ResetThreshold;
5038         bool                    bCheckFwTxCnt = false;
5039         //unsigned long flags;
5040
5041         //
5042         // Decide Stuch threshold according to current power save mode
5043         //
5044
5045 //     RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
5046 //           PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
5047 //           spin_lock_irqsave(&priv->ieee80211->lock,flags);
5048              for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
5049              {
5050                         if(QueueID == TXCMD_QUEUE)
5051                          continue;
5052 #if 1
5053                         if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0)  && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
5054                                 continue;
5055 #endif
5056
5057                      bCheckFwTxCnt = true;
5058              }
5059 //           PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
5060 //      spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
5061 //      RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
5062 #if 1
5063         if(bCheckFwTxCnt)
5064         {
5065                 if(HalTxCheckStuck819xUsb(dev))
5066                 {
5067                         RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
5068                         return RESET_TYPE_SILENT;
5069                 }
5070         }
5071 #endif
5072         return RESET_TYPE_NORESET;
5073 }
5074
5075 bool
5076 HalRxCheckStuck819xUsb(struct net_device *dev)
5077 {
5078         u16     RegRxCounter = read_nic_word(dev, 0x130);
5079         struct r8192_priv *priv = ieee80211_priv(dev);
5080         bool bStuck = FALSE;
5081 //#ifdef RTL8192SU
5082
5083 //#else
5084         static u8       rx_chk_cnt = 0;
5085         RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
5086         // If rssi is small, we should check rx for long time because of bad rx.
5087         // or maybe it will continuous silent reset every 2 seconds.
5088         rx_chk_cnt++;
5089         if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
5090         {
5091                 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
5092         }
5093         else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
5094                 ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
5095                 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
5096         {
5097                 if(rx_chk_cnt < 2)
5098                 {
5099                         return bStuck;
5100                 }
5101                 else
5102                 {
5103                         rx_chk_cnt = 0;
5104                 }
5105         }
5106         else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
5107                 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
5108                 priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
5109         {
5110                 if(rx_chk_cnt < 4)
5111                 {
5112                         //DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
5113                         return bStuck;
5114                 }
5115                 else
5116                 {
5117                         rx_chk_cnt = 0;
5118                         //DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
5119                 }
5120         }
5121         else
5122         {
5123                 if(rx_chk_cnt < 8)
5124                 {
5125                         //DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
5126                         return bStuck;
5127                 }
5128                 else
5129                 {
5130                         rx_chk_cnt = 0;
5131                         //DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
5132                 }
5133         }
5134 //#endif
5135
5136         if(priv->RxCounter==RegRxCounter)
5137                 bStuck = TRUE;
5138
5139         priv->RxCounter = RegRxCounter;
5140
5141         return bStuck;
5142 }
5143
5144 RESET_TYPE
5145 RxCheckStuck(struct net_device *dev)
5146 {
5147         struct r8192_priv *priv = ieee80211_priv(dev);
5148         //int                     i;
5149         bool        bRxCheck = FALSE;
5150
5151 //       RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
5152         //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
5153
5154          if(priv->IrpPendingCount > 1)
5155                 bRxCheck = TRUE;
5156        //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
5157
5158 //       RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
5159         if(bRxCheck)
5160         {
5161                 if(HalRxCheckStuck819xUsb(dev))
5162                 {
5163                         RT_TRACE(COMP_RESET, "RxStuck Condition\n");
5164                         return RESET_TYPE_SILENT;
5165                 }
5166         }
5167         return RESET_TYPE_NORESET;
5168 }
5169
5170
5171 /**
5172 *       This function is called by Checkforhang to check whether we should ask OS to reset driver
5173 *
5174 *       \param pAdapter The adapter context for this miniport
5175 *
5176 *       Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
5177 *       to judge whether there is tx stuck.
5178 *       Note: This function may be required to be rewrite for Vista OS.
5179 *       <<<Assumption: Tx spinlock has been acquired >>>
5180 *
5181 *       8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
5182 */
5183 RESET_TYPE
5184 rtl819x_ifcheck_resetornot(struct net_device *dev)
5185 {
5186         struct r8192_priv *priv = ieee80211_priv(dev);
5187         RESET_TYPE      TxResetType = RESET_TYPE_NORESET;
5188         RESET_TYPE      RxResetType = RESET_TYPE_NORESET;
5189         RT_RF_POWER_STATE       rfState;
5190
5191         return RESET_TYPE_NORESET;
5192
5193         rfState = priv->ieee80211->eRFPowerState;
5194
5195         TxResetType = TxCheckStuck(dev);
5196 #if 1
5197         if( rfState != eRfOff ||
5198                 /*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
5199                 (priv->ieee80211->iw_mode != IW_MODE_ADHOC))
5200         {
5201                 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
5202                 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
5203                 // if driver is in firmware download failure status, driver should initialize RF in the following
5204                 // silent reset procedure Emily, 2008.01.21
5205
5206                 // Driver should not check RX stuck in IBSS mode because it is required to
5207                 // set Check BSSID in order to send beacon, however, if check BSSID is
5208                 // set, STA cannot hear any packet a all. Emily, 2008.04.12
5209                 RxResetType = RxCheckStuck(dev);
5210         }
5211 #endif
5212         if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
5213                 return RESET_TYPE_NORMAL;
5214         else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
5215                 RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
5216                 return RESET_TYPE_SILENT;
5217         }
5218         else
5219                 return RESET_TYPE_NORESET;
5220
5221 }
5222
5223 void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
5224 int _rtl8192_up(struct net_device *dev);
5225 int rtl8192_close(struct net_device *dev);
5226
5227
5228
5229 void
5230 CamRestoreAllEntry(     struct net_device *dev)
5231 {
5232         u8 EntryId = 0;
5233         struct r8192_priv *priv = ieee80211_priv(dev);
5234         u8*     MacAddr = priv->ieee80211->current_network.bssid;
5235
5236         static u8       CAM_CONST_ADDR[4][6] = {
5237                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
5238                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
5239                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
5240                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
5241         static u8       CAM_CONST_BROAD[] =
5242                 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
5243
5244         RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
5245
5246
5247         if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
5248             (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
5249         {
5250
5251                 for(EntryId=0; EntryId<4; EntryId++)
5252                 {
5253                         {
5254                                 MacAddr = CAM_CONST_ADDR[EntryId];
5255                                 setKey(dev,
5256                                                 EntryId ,
5257                                                 EntryId,
5258                                                 priv->ieee80211->pairwise_key_type,
5259                                                 MacAddr,
5260                                                 0,
5261                                                 NULL);
5262                         }
5263                 }
5264
5265         }
5266         else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
5267         {
5268
5269                 {
5270                         if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5271                                 setKey(dev,
5272                                                 4,
5273                                                 0,
5274                                                 priv->ieee80211->pairwise_key_type,
5275                                                 (u8*)dev->dev_addr,
5276                                                 0,
5277                                                 NULL);
5278                         else
5279                                 setKey(dev,
5280                                                 4,
5281                                                 0,
5282                                                 priv->ieee80211->pairwise_key_type,
5283                                                 MacAddr,
5284                                                 0,
5285                                                 NULL);
5286                 }
5287         }
5288         else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
5289         {
5290
5291                 {
5292                         if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5293                                 setKey(dev,
5294                                                 4,
5295                                                 0,
5296                                                 priv->ieee80211->pairwise_key_type,
5297                                                 (u8*)dev->dev_addr,
5298                                                 0,
5299                                                 NULL);
5300                         else
5301                                 setKey(dev,
5302                                                 4,
5303                                                 0,
5304                                                 priv->ieee80211->pairwise_key_type,
5305                                                 MacAddr,
5306                                                 0,
5307                                                 NULL);
5308                 }
5309         }
5310
5311
5312
5313         if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
5314         {
5315                 MacAddr = CAM_CONST_BROAD;
5316                 for(EntryId=1 ; EntryId<4 ; EntryId++)
5317                 {
5318                         {
5319                                 setKey(dev,
5320                                                 EntryId,
5321                                                 EntryId,
5322                                                 priv->ieee80211->group_key_type,
5323                                                 MacAddr,
5324                                                 0,
5325                                                 NULL);
5326                         }
5327                 }
5328                 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5329                                 setKey(dev,
5330                                                 0,
5331                                                 0,
5332                                                 priv->ieee80211->group_key_type,
5333                                                 CAM_CONST_ADDR[0],
5334                                                 0,
5335                                                 NULL);
5336         }
5337         else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
5338         {
5339                 MacAddr = CAM_CONST_BROAD;
5340                 for(EntryId=1; EntryId<4 ; EntryId++)
5341                 {
5342                         {
5343                                 setKey(dev,
5344                                                 EntryId ,
5345                                                 EntryId,
5346                                                 priv->ieee80211->group_key_type,
5347                                                 MacAddr,
5348                                                 0,
5349                                                 NULL);
5350                         }
5351                 }
5352
5353                 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
5354                                 setKey(dev,
5355                                                 0 ,
5356                                                 0,
5357                                                 priv->ieee80211->group_key_type,
5358                                                 CAM_CONST_ADDR[0],
5359                                                 0,
5360                                                 NULL);
5361         }
5362 }
5363 //////////////////////////////////////////////////////////////
5364 // This function is used to fix Tx/Rx stop bug temporarily.
5365 // This function will do "system reset" to NIC when Tx or Rx is stuck.
5366 // The method checking Tx/Rx stuck of this function is supported by FW,
5367 // which reports Tx and Rx counter to register 0x128 and 0x130.
5368 //////////////////////////////////////////////////////////////
5369 void
5370 rtl819x_ifsilentreset(struct net_device *dev)
5371 {
5372         //OCTET_STRING asocpdu;
5373         struct r8192_priv *priv = ieee80211_priv(dev);
5374         u8      reset_times = 0;
5375         int reset_status = 0;
5376         struct ieee80211_device *ieee = priv->ieee80211;
5377
5378
5379         // 2007.07.20. If we need to check CCK stop, please uncomment this line.
5380         //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
5381
5382         if(priv->ResetProgress==RESET_TYPE_NORESET)
5383         {
5384 RESET_START:
5385
5386                 RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
5387
5388                 // Set the variable for reset.
5389                 priv->ResetProgress = RESET_TYPE_SILENT;
5390 //              rtl8192_close(dev);
5391 #if 1
5392                 down(&priv->wx_sem);
5393                 if(priv->up == 0)
5394                 {
5395                         RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
5396                         up(&priv->wx_sem);
5397                         return ;
5398                 }
5399                 priv->up = 0;
5400                 RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
5401 //              if(!netif_queue_stopped(dev))
5402 //                      netif_stop_queue(dev);
5403
5404                 rtl8192_rtx_disable(dev);
5405                 rtl8192_cancel_deferred_work(priv);
5406                 deinit_hal_dm(dev);
5407                 del_timer_sync(&priv->watch_dog_timer);
5408
5409                 ieee->sync_scan_hurryup = 1;
5410                 if(ieee->state == IEEE80211_LINKED)
5411                 {
5412                         down(&ieee->wx_sem);
5413                         printk("ieee->state is IEEE80211_LINKED\n");
5414                         ieee80211_stop_send_beacons(priv->ieee80211);
5415                         del_timer_sync(&ieee->associate_timer);
5416                         cancel_delayed_work(&ieee->associate_retry_wq);
5417                         ieee80211_stop_scan(ieee);
5418                         netif_carrier_off(dev);
5419                         up(&ieee->wx_sem);
5420                 }
5421                 else{
5422                         printk("ieee->state is NOT LINKED\n");
5423                         ieee80211_softmac_stop_protocol(priv->ieee80211);                       }
5424                 up(&priv->wx_sem);
5425                 RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
5426         //rtl8192_irq_disable(dev);
5427                 RT_TRACE(COMP_RESET,"%s():===========>start to up the driver\n",__FUNCTION__);
5428                 reset_status = _rtl8192_up(dev);
5429
5430                 RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
5431                 if(reset_status == -EAGAIN)
5432                 {
5433                         if(reset_times < 3)
5434                         {
5435                                 reset_times++;
5436                                 goto RESET_START;
5437                         }
5438                         else
5439                         {
5440                                 RT_TRACE(COMP_ERR," ERR!!! %s():  Reset Failed!!\n", __FUNCTION__);
5441                         }
5442                 }
5443 #endif
5444                 ieee->is_silent_reset = 1;
5445 #if 1
5446                 EnableHWSecurityConfig8192(dev);
5447 #if 1
5448                 if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
5449                 {
5450                         ieee->set_chan(ieee->dev, ieee->current_network.channel);
5451
5452 #if 1
5453                         queue_work(ieee->wq, &ieee->associate_complete_wq);
5454 #endif
5455
5456                 }
5457                 else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
5458                 {
5459                         ieee->set_chan(ieee->dev, ieee->current_network.channel);
5460                         ieee->link_change(ieee->dev);
5461
5462                 //      notify_wx_assoc_event(ieee);
5463
5464                         ieee80211_start_send_beacons(ieee);
5465
5466                         if (ieee->data_hard_resume)
5467                                 ieee->data_hard_resume(ieee->dev);
5468                         netif_carrier_on(ieee->dev);
5469                 }
5470 #endif
5471
5472                 CamRestoreAllEntry(dev);
5473
5474                 priv->ResetProgress = RESET_TYPE_NORESET;
5475                 priv->reset_count++;
5476
5477                 priv->bForcedSilentReset =false;
5478                 priv->bResetInProgress = false;
5479
5480                 // For test --> force write UFWP.
5481                 write_nic_byte(dev, UFWP, 1);
5482                 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
5483 #endif
5484         }
5485 }
5486
5487 void CAM_read_entry(
5488         struct net_device *dev,
5489         u32                     iIndex
5490 )
5491 {
5492         u32 target_command=0;
5493          u32 target_content=0;
5494          u8 entry_i=0;
5495          u32 ulStatus;
5496         s32 i=100;
5497 //      printk("=======>start read CAM\n");
5498         for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
5499         {
5500         // polling bit, and No Write enable, and address
5501                 target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
5502                 target_command= target_command | BIT31;
5503
5504         //Check polling bit is clear
5505 //      mdelay(1);
5506 #if 1
5507                 while((i--)>=0)
5508                 {
5509                         ulStatus = read_nic_dword(dev, RWCAM);
5510                         if(ulStatus & BIT31){
5511                                 continue;
5512                         }
5513                         else{
5514                                 break;
5515                         }
5516                 }
5517 #endif
5518                 write_nic_dword(dev, RWCAM, target_command);
5519                 RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
5520          //     printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
5521                 target_content = read_nic_dword(dev, RCAMO);
5522                 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
5523          //     printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
5524         }
5525         printk("\n");
5526 }
5527
5528 void rtl819x_update_rxcounts(
5529         struct r8192_priv *priv,
5530         u32* TotalRxBcnNum,
5531         u32* TotalRxDataNum
5532 )
5533 {
5534         u16                     SlotIndex;
5535         u8                      i;
5536
5537         *TotalRxBcnNum = 0;
5538         *TotalRxDataNum = 0;
5539
5540         SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
5541         priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
5542         priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
5543         for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
5544                 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
5545                 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
5546         }
5547 }
5548
5549 extern  void    rtl819x_watchdog_wqcallback(struct work_struct *work)
5550 {
5551         struct delayed_work *dwork = container_of(work,struct delayed_work,work);
5552        struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
5553        struct net_device *dev = priv->ieee80211->dev;
5554         struct ieee80211_device* ieee = priv->ieee80211;
5555         RESET_TYPE      ResetType = RESET_TYPE_NORESET;
5556         static u8       check_reset_cnt=0;
5557         bool bBusyTraffic = false;
5558
5559         if(!priv->up)
5560                 return;
5561         hal_dm_watchdog(dev);
5562
5563         {//to get busy traffic condition
5564                 if(ieee->state == IEEE80211_LINKED)
5565                 {
5566                         //windows mod 666 to 100.
5567                         //if(   ieee->LinkDetectInfo.NumRxOkInPeriod> 666 ||
5568                         //      ieee->LinkDetectInfo.NumTxOkInPeriod> 666 ) {
5569                         if(     ieee->LinkDetectInfo.NumRxOkInPeriod> 100 ||
5570                                 ieee->LinkDetectInfo.NumTxOkInPeriod> 100 ) {
5571                                 bBusyTraffic = true;
5572                         }
5573                         ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
5574                         ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
5575                         ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
5576                 }
5577         }
5578         //added by amy for AP roaming
5579         {
5580                 if(priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA)
5581                 {
5582                         u32     TotalRxBcnNum = 0;
5583                         u32     TotalRxDataNum = 0;
5584
5585                         rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
5586                         if((TotalRxBcnNum+TotalRxDataNum) == 0)
5587                         {
5588                                 #ifdef TODO
5589                                 if(rfState == eRfOff)
5590                                         RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
5591                                 #endif
5592                                 printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
5593                         //      Dot11d_Reset(dev);
5594                                 priv->ieee80211->state = IEEE80211_ASSOCIATING;
5595                                 notify_wx_assoc_event(priv->ieee80211);
5596                                 RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
5597                                 ieee->is_roaming = true;
5598                                 priv->ieee80211->link_change(dev);
5599                                 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
5600                         }
5601                 }
5602                 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod=0;
5603                 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod=0;
5604         }
5605 //      CAM_read_entry(dev,4);
5606         //check if reset the driver
5607         if(check_reset_cnt++ >= 3 && !ieee->is_roaming)
5608         {
5609                 ResetType = rtl819x_ifcheck_resetornot(dev);
5610                 check_reset_cnt = 3;
5611                 //DbgPrint("Start to check silent reset\n");
5612         }
5613         //      RT_TRACE(COMP_RESET,"%s():priv->force_reset is %d,priv->ResetProgress is %d, priv->bForcedSilentReset is %d,priv->bDisableNormalResetCheck is %d,ResetType is %d\n",__FUNCTION__,priv->force_reset,priv->ResetProgress,priv->bForcedSilentReset,priv->bDisableNormalResetCheck,ResetType);
5614 #if 1
5615         if( (priv->force_reset) || (priv->ResetProgress==RESET_TYPE_NORESET &&
5616                 (priv->bForcedSilentReset ||
5617                 (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))) // This is control by OID set in Pomelo
5618         {
5619                 RT_TRACE(COMP_RESET,"%s():priv->force_reset is %d,priv->ResetProgress is %d, priv->bForcedSilentReset is %d,priv->bDisableNormalResetCheck is %d,ResetType is %d\n",__FUNCTION__,priv->force_reset,priv->ResetProgress,priv->bForcedSilentReset,priv->bDisableNormalResetCheck,ResetType);
5620                 rtl819x_ifsilentreset(dev);
5621         }
5622 #endif
5623         priv->force_reset = false;
5624         priv->bForcedSilentReset = false;
5625         priv->bResetInProgress = false;
5626         RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
5627
5628 }
5629
5630 void watch_dog_timer_callback(unsigned long data)
5631 {
5632         struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
5633         //printk("===============>watch_dog  timer\n");
5634         queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
5635         mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
5636 }
5637 int _rtl8192_up(struct net_device *dev)
5638 {
5639         struct r8192_priv *priv = ieee80211_priv(dev);
5640         //int i;
5641         int init_status = 0;
5642         priv->up=1;
5643         priv->ieee80211->ieee_up=1;
5644         RT_TRACE(COMP_INIT, "Bringing up iface");
5645         init_status = priv->ops->rtl819x_adapter_start(dev);
5646         if(!init_status)
5647         {
5648                 RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n", __FUNCTION__);
5649                 priv->up=priv->ieee80211->ieee_up = 0;
5650                 return -EAGAIN;
5651         }
5652         RT_TRACE(COMP_INIT, "start adapter finished\n");
5653         rtl8192_rx_enable(dev);
5654 //      rtl8192_tx_enable(dev);
5655         if(priv->ieee80211->state != IEEE80211_LINKED)
5656         ieee80211_softmac_start_protocol(priv->ieee80211);
5657         ieee80211_reset_queue(priv->ieee80211);
5658         watch_dog_timer_callback((unsigned long) dev);
5659         if(!netif_queue_stopped(dev))
5660                 netif_start_queue(dev);
5661         else
5662                 netif_wake_queue(dev);
5663
5664         /*
5665          * Make sure that drop_unencrypted is initialized as "0"
5666          * No packets will be sent in non-security mode if we had set drop_unencrypted.
5667          * ex, After kill wpa_supplicant process, make the driver up again.
5668          * drop_unencrypted remains as "1", which is set by wpa_supplicant. 2008/12/04.john
5669          */
5670         priv->ieee80211->drop_unencrypted = 0;
5671
5672         return 0;
5673 }
5674
5675
5676 int rtl8192_open(struct net_device *dev)
5677 {
5678         struct r8192_priv *priv = ieee80211_priv(dev);
5679         int ret;
5680         down(&priv->wx_sem);
5681         ret = rtl8192_up(dev);
5682         up(&priv->wx_sem);
5683         return ret;
5684
5685 }
5686
5687
5688 int rtl8192_up(struct net_device *dev)
5689 {
5690         struct r8192_priv *priv = ieee80211_priv(dev);
5691
5692         if (priv->up == 1) return -1;
5693
5694         return _rtl8192_up(dev);
5695 }
5696
5697
5698 int rtl8192_close(struct net_device *dev)
5699 {
5700         struct r8192_priv *priv = ieee80211_priv(dev);
5701         int ret;
5702
5703         down(&priv->wx_sem);
5704
5705         ret = rtl8192_down(dev);
5706
5707         up(&priv->wx_sem);
5708
5709         return ret;
5710
5711 }
5712
5713 int rtl8192_down(struct net_device *dev)
5714 {
5715         struct r8192_priv *priv = ieee80211_priv(dev);
5716         int i;
5717
5718         if (priv->up == 0) return -1;
5719
5720         priv->up=0;
5721         priv->ieee80211->ieee_up = 0;
5722         RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
5723 /* FIXME */
5724         if (!netif_queue_stopped(dev))
5725                 netif_stop_queue(dev);
5726
5727         rtl8192_rtx_disable(dev);
5728         //rtl8192_irq_disable(dev);
5729
5730  /* Tx related queue release */
5731         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5732                 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
5733         }
5734         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5735                 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
5736         }
5737
5738         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
5739                 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
5740         }
5741
5742         //as cancel_delayed_work will del work->timer, so if work is not definedas struct delayed_work, it will corrupt
5743 //      flush_scheduled_work();
5744         rtl8192_cancel_deferred_work(priv);
5745         deinit_hal_dm(dev);
5746         del_timer_sync(&priv->watch_dog_timer);
5747
5748
5749         ieee80211_softmac_stop_protocol(priv->ieee80211);
5750         memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
5751         RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
5752
5753                 return 0;
5754 }
5755
5756
5757 void rtl8192_commit(struct net_device *dev)
5758 {
5759         struct r8192_priv *priv = ieee80211_priv(dev);
5760         int reset_status = 0;
5761         //u8 reset_times = 0;
5762         if (priv->up == 0) return ;
5763         priv->up = 0;
5764
5765         rtl8192_cancel_deferred_work(priv);
5766         del_timer_sync(&priv->watch_dog_timer);
5767         //cancel_delayed_work(&priv->SwChnlWorkItem);
5768
5769         ieee80211_softmac_stop_protocol(priv->ieee80211);
5770
5771         //rtl8192_irq_disable(dev);
5772         rtl8192_rtx_disable(dev);
5773         reset_status = _rtl8192_up(dev);
5774
5775 }
5776
5777 /*
5778 void rtl8192_restart(struct net_device *dev)
5779 {
5780         struct r8192_priv *priv = ieee80211_priv(dev);
5781 */
5782 void rtl8192_restart(struct work_struct *work)
5783 {
5784         struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
5785         struct net_device *dev = priv->ieee80211->dev;
5786
5787         down(&priv->wx_sem);
5788
5789         rtl8192_commit(dev);
5790
5791         up(&priv->wx_sem);
5792 }
5793
5794 static void r8192_set_multicast(struct net_device *dev)
5795 {
5796         struct r8192_priv *priv = ieee80211_priv(dev);
5797         short promisc;
5798
5799         //down(&priv->wx_sem);
5800
5801         /* FIXME FIXME */
5802
5803         promisc = (dev->flags & IFF_PROMISC) ? 1:0;
5804
5805         if (promisc != priv->promisc)
5806         //      rtl8192_commit(dev);
5807
5808         priv->promisc = promisc;
5809
5810         //schedule_work(&priv->reset_wq);
5811         //up(&priv->wx_sem);
5812 }
5813
5814
5815 int r8192_set_mac_adr(struct net_device *dev, void *mac)
5816 {
5817         struct r8192_priv *priv = ieee80211_priv(dev);
5818         struct sockaddr *addr = mac;
5819
5820         down(&priv->wx_sem);
5821
5822         memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
5823
5824         schedule_work(&priv->reset_wq);
5825
5826         up(&priv->wx_sem);
5827
5828         return 0;
5829 }
5830
5831 /* based on ipw2200 driver */
5832 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5833 {
5834         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5835         struct iwreq *wrq = (struct iwreq *)rq;
5836         int ret=-1;
5837         struct ieee80211_device *ieee = priv->ieee80211;
5838         u32 key[4];
5839         u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
5840         u8 zero_addr[6] = {0};
5841         struct iw_point *p = &wrq->u.data;
5842         struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
5843
5844         down(&priv->wx_sem);
5845
5846
5847      if (p->length < sizeof(struct ieee_param) || !p->pointer){
5848              ret = -EINVAL;
5849              goto out;
5850         }
5851
5852      ipw = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL);
5853      if (ipw == NULL){
5854              ret = -ENOMEM;
5855              goto out;
5856      }
5857      if (copy_from_user(ipw, p->pointer, p->length)) {
5858                 kfree(ipw);
5859             ret = -EFAULT;
5860             goto out;
5861         }
5862
5863         switch (cmd) {
5864             case RTL_IOCTL_WPA_SUPPLICANT:
5865         //parse here for HW security
5866                         if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
5867                         {
5868                                 if (ipw->u.crypt.set_tx)
5869                                 {
5870                                         if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
5871                                                 ieee->pairwise_key_type = KEY_TYPE_CCMP;
5872                                         else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
5873                                                 ieee->pairwise_key_type = KEY_TYPE_TKIP;
5874                                         else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
5875                                         {
5876                                                 if (ipw->u.crypt.key_len == 13)
5877                                                         ieee->pairwise_key_type = KEY_TYPE_WEP104;
5878                                                 else if (ipw->u.crypt.key_len == 5)
5879                                                         ieee->pairwise_key_type = KEY_TYPE_WEP40;
5880                                         }
5881                                         else
5882                                                 ieee->pairwise_key_type = KEY_TYPE_NA;
5883
5884                                         if (ieee->pairwise_key_type)
5885                                         {
5886                                 //      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
5887                                                 if (memcmp(ieee->ap_mac_addr, zero_addr, 6) == 0)
5888                                                         ieee->iw_mode = IW_MODE_ADHOC;
5889                                                 memcpy((u8*)key, ipw->u.crypt.key, 16);
5890                                                 EnableHWSecurityConfig8192(dev);
5891                                         //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!
5892                                         //added by WB.
5893                                                 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
5894                                                 if (ieee->iw_mode == IW_MODE_ADHOC)
5895                                                 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
5896                                         }
5897                                 }
5898                                 else //if (ipw->u.crypt.idx) //group key use idx > 0
5899                                 {
5900                                         memcpy((u8*)key, ipw->u.crypt.key, 16);
5901                                         if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
5902                                                 ieee->group_key_type= KEY_TYPE_CCMP;
5903                                         else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
5904                                                 ieee->group_key_type = KEY_TYPE_TKIP;
5905                                         else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
5906                                         {
5907                                                 if (ipw->u.crypt.key_len == 13)
5908                                                         ieee->group_key_type = KEY_TYPE_WEP104;
5909                                                 else if (ipw->u.crypt.key_len == 5)
5910                                                         ieee->group_key_type = KEY_TYPE_WEP40;
5911                                         }
5912                                         else
5913                                                 ieee->group_key_type = KEY_TYPE_NA;
5914
5915                                         if (ieee->group_key_type)
5916                                         {
5917                                                         setKey( dev,
5918                                                                 ipw->u.crypt.idx,
5919                                                                 ipw->u.crypt.idx,               //KeyIndex
5920                                                                 ieee->group_key_type,   //KeyType
5921                                                                 broadcast_addr, //MacAddr
5922                                                                 0,              //DefaultKey
5923                                                                 key);           //KeyContent
5924                                         }
5925                                 }
5926                         }
5927 #ifdef JOHN_HWSEC_DEBUG
5928                 //john's test 0711
5929                 printk("@@ wrq->u pointer = ");
5930                 for(i=0;i<wrq->u.data.length;i++){
5931                         if(i%10==0) printk("\n");
5932                         printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
5933                 }
5934                 printk("\n");
5935 #endif /*JOHN_HWSEC_DEBUG*/
5936                 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
5937                 break;
5938
5939             default:
5940                 ret = -EOPNOTSUPP;
5941                 break;
5942         }
5943         kfree(ipw);
5944         ipw = NULL;
5945 out:
5946         up(&priv->wx_sem);
5947         return ret;
5948 }
5949
5950 u8 rtl8192SU_HwRateToMRate(bool bIsHT, u8 rate,bool bFirstAMPDU)
5951 {
5952
5953         u8      ret_rate = 0x02;
5954
5955         if( bFirstAMPDU )
5956         {
5957         if(!bIsHT)
5958         {
5959                 switch(rate)
5960                 {
5961
5962                         case DESC92S_RATE1M:            ret_rate = MGN_1M;              break;
5963                         case DESC92S_RATE2M:            ret_rate = MGN_2M;              break;
5964                         case DESC92S_RATE5_5M:          ret_rate = MGN_5_5M;            break;
5965                         case DESC92S_RATE11M:           ret_rate = MGN_11M;             break;
5966                         case DESC92S_RATE6M:            ret_rate = MGN_6M;              break;
5967                         case DESC92S_RATE9M:            ret_rate = MGN_9M;              break;
5968                         case DESC92S_RATE12M:           ret_rate = MGN_12M;             break;
5969                         case DESC92S_RATE18M:           ret_rate = MGN_18M;             break;
5970                         case DESC92S_RATE24M:           ret_rate = MGN_24M;             break;
5971                         case DESC92S_RATE36M:           ret_rate = MGN_36M;             break;
5972                         case DESC92S_RATE48M:           ret_rate = MGN_48M;             break;
5973                         case DESC92S_RATE54M:           ret_rate = MGN_54M;             break;
5974
5975                         default:
5976                                 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
5977                                         break;
5978         }
5979                 }
5980                 else
5981         {
5982                 switch(rate)
5983                 {
5984
5985                         case DESC92S_RATEMCS0:  ret_rate = MGN_MCS0;            break;
5986                         case DESC92S_RATEMCS1:  ret_rate = MGN_MCS1;            break;
5987                         case DESC92S_RATEMCS2:  ret_rate = MGN_MCS2;            break;
5988                         case DESC92S_RATEMCS3:  ret_rate = MGN_MCS3;            break;
5989                         case DESC92S_RATEMCS4:  ret_rate = MGN_MCS4;            break;
5990                         case DESC92S_RATEMCS5:  ret_rate = MGN_MCS5;            break;
5991                         case DESC92S_RATEMCS6:  ret_rate = MGN_MCS6;            break;
5992                         case DESC92S_RATEMCS7:  ret_rate = MGN_MCS7;            break;
5993                         case DESC92S_RATEMCS8:  ret_rate = MGN_MCS8;            break;
5994                         case DESC92S_RATEMCS9:  ret_rate = MGN_MCS9;            break;
5995                         case DESC92S_RATEMCS10: ret_rate = MGN_MCS10;   break;
5996                         case DESC92S_RATEMCS11: ret_rate = MGN_MCS11;   break;
5997                         case DESC92S_RATEMCS12: ret_rate = MGN_MCS12;   break;
5998                         case DESC92S_RATEMCS13: ret_rate = MGN_MCS13;   break;
5999                         case DESC92S_RATEMCS14: ret_rate = MGN_MCS14;   break;
6000                         case DESC92S_RATEMCS15: ret_rate = MGN_MCS15;   break;
6001                         case DESC92S_RATEMCS32: ret_rate = (0x80|0x20); break;
6002
6003                         default:
6004                                         RT_TRACE(COMP_RECV, "HwRateToMRate92S(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT );
6005                                 break;
6006                 }
6007
6008         }
6009         }
6010         else
6011         {
6012                 switch(rate)
6013                 {
6014
6015                         case DESC92S_RATE1M:    ret_rate = MGN_1M;              break;
6016                         case DESC92S_RATE2M:    ret_rate = MGN_2M;              break;
6017                         case DESC92S_RATE5_5M:  ret_rate = MGN_5_5M;            break;
6018                         case DESC92S_RATE11M:   ret_rate = MGN_11M;             break;
6019                         case DESC92S_RATE6M:    ret_rate = MGN_6M;              break;
6020                         case DESC92S_RATE9M:    ret_rate = MGN_9M;              break;
6021                         case DESC92S_RATE12M:   ret_rate = MGN_12M;             break;
6022                         case DESC92S_RATE18M:   ret_rate = MGN_18M;             break;
6023                         case DESC92S_RATE24M:   ret_rate = MGN_24M;             break;
6024                         case DESC92S_RATE36M:   ret_rate = MGN_36M;             break;
6025                         case DESC92S_RATE48M:   ret_rate = MGN_48M;             break;
6026                         case DESC92S_RATE54M:   ret_rate = MGN_54M;             break;
6027                         case DESC92S_RATEMCS0:  ret_rate = MGN_MCS0;            break;
6028                         case DESC92S_RATEMCS1:  ret_rate = MGN_MCS1;            break;
6029                         case DESC92S_RATEMCS2:  ret_rate = MGN_MCS2;            break;
6030                         case DESC92S_RATEMCS3:  ret_rate = MGN_MCS3;            break;
6031                         case DESC92S_RATEMCS4:  ret_rate = MGN_MCS4;            break;
6032                         case DESC92S_RATEMCS5:  ret_rate = MGN_MCS5;            break;
6033                         case DESC92S_RATEMCS6:  ret_rate = MGN_MCS6;            break;
6034                         case DESC92S_RATEMCS7:  ret_rate = MGN_MCS7;            break;
6035                         case DESC92S_RATEMCS8:  ret_rate = MGN_MCS8;            break;
6036                         case DESC92S_RATEMCS9:  ret_rate = MGN_MCS9;            break;
6037                         case DESC92S_RATEMCS10: ret_rate = MGN_MCS10;   break;
6038                         case DESC92S_RATEMCS11: ret_rate = MGN_MCS11;   break;
6039                         case DESC92S_RATEMCS12: ret_rate = MGN_MCS12;   break;
6040                         case DESC92S_RATEMCS13: ret_rate = MGN_MCS13;   break;
6041                         case DESC92S_RATEMCS14: ret_rate = MGN_MCS14;   break;
6042                         case DESC92S_RATEMCS15: ret_rate = MGN_MCS15;   break;
6043                         case DESC92S_RATEMCS32: ret_rate = (0x80|0x20); break;
6044
6045                         default:
6046                                 RT_TRACE(COMP_RECV, "HwRateToMRate92S(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT );
6047                                 break;
6048                         }
6049         }
6050         return ret_rate;
6051 }
6052
6053 u8 HwRateToMRate90(bool bIsHT, u8 rate)
6054 {
6055         u8  ret_rate = 0xff;
6056
6057         if(!bIsHT) {
6058                 switch(rate) {
6059                         case DESC90_RATE1M:   ret_rate = MGN_1M;         break;
6060                         case DESC90_RATE2M:   ret_rate = MGN_2M;         break;
6061                         case DESC90_RATE5_5M: ret_rate = MGN_5_5M;       break;
6062                         case DESC90_RATE11M:  ret_rate = MGN_11M;        break;
6063                         case DESC90_RATE6M:   ret_rate = MGN_6M;         break;
6064                         case DESC90_RATE9M:   ret_rate = MGN_9M;         break;
6065                         case DESC90_RATE12M:  ret_rate = MGN_12M;        break;
6066                         case DESC90_RATE18M:  ret_rate = MGN_18M;        break;
6067                         case DESC90_RATE24M:  ret_rate = MGN_24M;        break;
6068                         case DESC90_RATE36M:  ret_rate = MGN_36M;        break;
6069                         case DESC90_RATE48M:  ret_rate = MGN_48M;        break;
6070                         case DESC90_RATE54M:  ret_rate = MGN_54M;        break;
6071
6072                         default:
6073                                 ret_rate = 0xff;
6074                                 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
6075                                 break;
6076                 }
6077
6078         } else {
6079                 switch(rate) {
6080                         case DESC90_RATEMCS0:   ret_rate = MGN_MCS0;    break;
6081                         case DESC90_RATEMCS1:   ret_rate = MGN_MCS1;    break;
6082                         case DESC90_RATEMCS2:   ret_rate = MGN_MCS2;    break;
6083                         case DESC90_RATEMCS3:   ret_rate = MGN_MCS3;    break;
6084                         case DESC90_RATEMCS4:   ret_rate = MGN_MCS4;    break;
6085                         case DESC90_RATEMCS5:   ret_rate = MGN_MCS5;    break;
6086                         case DESC90_RATEMCS6:   ret_rate = MGN_MCS6;    break;
6087                         case DESC90_RATEMCS7:   ret_rate = MGN_MCS7;    break;
6088                         case DESC90_RATEMCS8:   ret_rate = MGN_MCS8;    break;
6089                         case DESC90_RATEMCS9:   ret_rate = MGN_MCS9;    break;
6090                         case DESC90_RATEMCS10:  ret_rate = MGN_MCS10;   break;
6091                         case DESC90_RATEMCS11:  ret_rate = MGN_MCS11;   break;
6092                         case DESC90_RATEMCS12:  ret_rate = MGN_MCS12;   break;
6093                         case DESC90_RATEMCS13:  ret_rate = MGN_MCS13;   break;
6094                         case DESC90_RATEMCS14:  ret_rate = MGN_MCS14;   break;
6095                         case DESC90_RATEMCS15:  ret_rate = MGN_MCS15;   break;
6096                         case DESC90_RATEMCS32:  ret_rate = (0x80|0x20); break;
6097
6098                         default:
6099                                 ret_rate = 0xff;
6100                                 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
6101                                 break;
6102                 }
6103         }
6104
6105         return ret_rate;
6106 }
6107
6108 /**
6109  * Function:     UpdateRxPktTimeStamp
6110  * Overview:     Recored down the TSF time stamp when receiving a packet
6111  *
6112  * Input:
6113  *       PADAPTER        Adapter
6114  *       PRT_RFD         pRfd,
6115  *
6116  * Output:
6117  *       PRT_RFD         pRfd
6118  *                               (pRfd->Status.TimeStampHigh is updated)
6119  *                               (pRfd->Status.TimeStampLow is updated)
6120  * Return:
6121  *               None
6122  */
6123 void UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
6124 {
6125         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6126
6127         if(stats->bIsAMPDU && !stats->bFirstMPDU) {
6128                 stats->mac_time[0] = priv->LastRxDescTSFLow;
6129                 stats->mac_time[1] = priv->LastRxDescTSFHigh;
6130         } else {
6131                 priv->LastRxDescTSFLow = stats->mac_time[0];
6132                 priv->LastRxDescTSFHigh = stats->mac_time[1];
6133         }
6134 }
6135
6136 //by amy 080606
6137
6138 long rtl819x_translate_todbm(u8 signal_strength_index   )// 0-100 index.
6139 {
6140         long    signal_power; // in dBm.
6141
6142         // Translate to dBm (x=0.5y-95).
6143         signal_power = (long)((signal_strength_index + 1) >> 1);
6144         signal_power -= 95;
6145
6146         return signal_power;
6147 }
6148
6149
6150 /* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
6151     be a local static. Otherwise, it may increase when we return from S3/S4. The
6152     value will be kept in memory or disk. We must delcare the value in adapter
6153     and it will be reinitialized when return from S3/S4. */
6154 void rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
6155 {
6156         bool bcheck = false;
6157         u8      rfpath;
6158         u32     nspatial_stream, tmp_val;
6159         //u8    i;
6160         static u32 slide_rssi_index=0, slide_rssi_statistics=0;
6161         static u32 slide_evm_index=0, slide_evm_statistics=0;
6162         static u32 last_rssi=0, last_evm=0;
6163
6164         static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
6165         static u32 last_beacon_adc_pwdb=0;
6166
6167         struct ieee80211_hdr_3addr *hdr;
6168         u16 sc ;
6169         unsigned int frag,seq;
6170         hdr = (struct ieee80211_hdr_3addr *)buffer;
6171         sc = le16_to_cpu(hdr->seq_ctl);
6172         frag = WLAN_GET_SEQ_FRAG(sc);
6173         seq = WLAN_GET_SEQ_SEQ(sc);
6174         //cosa add 04292008 to record the sequence number
6175         pcurrent_stats->Seq_Num = seq;
6176         //
6177         // Check whether we should take the previous packet into accounting
6178         //
6179         if(!pprevious_stats->bIsAMPDU)
6180         {
6181                 // if previous packet is not aggregated packet
6182                 bcheck = true;
6183         }else
6184         {
6185         }
6186
6187
6188         if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
6189         {
6190                 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
6191                 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
6192                 priv->stats.slide_rssi_total -= last_rssi;
6193         }
6194         priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
6195
6196         priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
6197         if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
6198                 slide_rssi_index = 0;
6199
6200         // <1> Showed on UI for user, in dbm
6201         tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
6202         priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
6203         pcurrent_stats->rssi = priv->stats.signal_strength;
6204         //
6205         // If the previous packet does not match the criteria, neglect it
6206         //
6207         if(!pprevious_stats->bPacketMatchBSSID)
6208         {
6209                 if(!pprevious_stats->bToSelfBA)
6210                         return;
6211         }
6212
6213         if(!bcheck)
6214                 return;
6215
6216
6217         //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
6218
6219         //
6220         // Check RSSI
6221         //
6222         priv->stats.num_process_phyinfo++;
6223
6224         /* record the general signal strength to the sliding window. */
6225
6226
6227         // <2> Showed on UI for engineering
6228         // hardware does not provide rssi information for each rf path in CCK
6229         if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
6230         {
6231                 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
6232                 {
6233                      if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
6234                                  continue;
6235
6236                         //Fixed by Jacken 2008-03-20
6237                         if(priv->stats.rx_rssi_percentage[rfpath] == 0)
6238                         {
6239                                 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
6240                                 //DbgPrint("MIMO RSSI initialize \n");
6241                         }
6242                         if(pprevious_stats->RxMIMOSignalStrength[rfpath]  > priv->stats.rx_rssi_percentage[rfpath])
6243                         {
6244                                 priv->stats.rx_rssi_percentage[rfpath] =
6245                                         ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
6246                                         (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
6247                                 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath]  + 1;
6248                         }
6249                         else
6250                         {
6251                                 priv->stats.rx_rssi_percentage[rfpath] =
6252                                         ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
6253                                         (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
6254                         }
6255                         RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath]  = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
6256                 }
6257         }
6258
6259
6260         //
6261         // Check PWDB.
6262         //
6263         RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
6264                                 pprevious_stats->bIsCCK? "CCK": "OFDM",
6265                                 pprevious_stats->RxPWDBAll);
6266
6267         if(pprevious_stats->bPacketBeacon)
6268         {
6269 /* record the beacon pwdb to the sliding window. */
6270                 if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
6271                 {
6272                         slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
6273                         last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
6274                         priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
6275                         //DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
6276                         //      slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
6277                 }
6278                 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
6279                 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
6280                 //DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
6281                 slide_beacon_adc_pwdb_index++;
6282                 if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
6283                         slide_beacon_adc_pwdb_index = 0;
6284                 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
6285                 if(pprevious_stats->RxPWDBAll >= 3)
6286                         pprevious_stats->RxPWDBAll -= 3;
6287         }
6288
6289         RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
6290                                 pprevious_stats->bIsCCK? "CCK": "OFDM",
6291                                 pprevious_stats->RxPWDBAll);
6292
6293
6294         if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
6295         {
6296                 if(priv->undecorated_smoothed_pwdb < 0) // initialize
6297                 {
6298                         priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
6299                         //DbgPrint("First pwdb initialize \n");
6300                 }
6301 #if 1
6302                 if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
6303                 {
6304                         priv->undecorated_smoothed_pwdb =
6305                                         ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
6306                                         (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
6307                         priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
6308                 }
6309                 else
6310                 {
6311                         priv->undecorated_smoothed_pwdb =
6312                                         ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
6313                                         (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
6314                 }
6315 #else
6316                 //Fixed by Jacken 2008-03-20
6317                 if(pPreviousRfd->Status.RxPWDBAll > (u32)pHalData->UndecoratedSmoothedPWDB)
6318                 {
6319                         pHalData->UndecoratedSmoothedPWDB =
6320                                         ( ((pHalData->UndecoratedSmoothedPWDB)* 5) + (pPreviousRfd->Status.RxPWDBAll)) / 6;
6321                         pHalData->UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB + 1;
6322                 }
6323                 else
6324                 {
6325                         pHalData->UndecoratedSmoothedPWDB =
6326                                         ( ((pHalData->UndecoratedSmoothedPWDB)* 5) + (pPreviousRfd->Status.RxPWDBAll)) / 6;
6327                 }
6328 #endif
6329
6330         }
6331
6332         //
6333         // Check EVM
6334         //
6335         /* record the general EVM to the sliding window. */
6336         if(pprevious_stats->SignalQuality == 0)
6337         {
6338         }
6339         else
6340         {
6341                 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
6342                         if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
6343                                 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
6344                                 last_evm = priv->stats.slide_evm[slide_evm_index];
6345                                 priv->stats.slide_evm_total -= last_evm;
6346                         }
6347
6348                         priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
6349
6350                         priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
6351                         if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
6352                                 slide_evm_index = 0;
6353
6354                         // <1> Showed on UI for user, in percentage.
6355                         tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
6356                         priv->stats.signal_quality = tmp_val;
6357                         //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
6358                         priv->stats.last_signal_strength_inpercent = tmp_val;
6359                 }
6360
6361                 // <2> Showed on UI for engineering
6362                 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
6363                 {
6364                         for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
6365                         {
6366                                 if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
6367                                 {
6368                                         if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
6369                                         {
6370                                                 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
6371                                         }
6372                                         priv->stats.rx_evm_percentage[nspatial_stream] =
6373                                                 ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
6374                                                 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
6375                                 }
6376                         }
6377                 }
6378         }
6379
6380
6381 }
6382
6383 /*-----------------------------------------------------------------------------
6384  * Function:    rtl819x_query_rxpwrpercentage()
6385  *
6386  * Overview:
6387  *
6388  * Input:               char            antpower
6389  *
6390  * Output:              NONE
6391  *
6392  * Return:              0-100 percentage
6393  *
6394  * Revised History:
6395  *      When            Who             Remark
6396  *      05/26/2008      amy             Create Version 0 porting from windows code.
6397  *
6398  *---------------------------------------------------------------------------*/
6399 static u8 rtl819x_query_rxpwrpercentage(
6400         char            antpower
6401         )
6402 {
6403         if ((antpower <= -100) || (antpower >= 20))
6404         {
6405                 return  0;
6406         }
6407         else if (antpower >= 0)
6408         {
6409                 return  100;
6410         }
6411         else
6412         {
6413                 return  (100+antpower);
6414         }
6415
6416 }       /* QueryRxPwrPercentage */
6417
6418 static u8
6419 rtl819x_evm_dbtopercentage(
6420     char value
6421     )
6422 {
6423     char ret_val;
6424
6425     ret_val = value;
6426
6427     if(ret_val >= 0)
6428         ret_val = 0;
6429     if(ret_val <= -33)
6430         ret_val = -33;
6431     ret_val = 0 - ret_val;
6432     ret_val*=3;
6433         if(ret_val == 99)
6434                 ret_val = 100;
6435     return(ret_val);
6436 }
6437 //
6438 //      Description:
6439 //      We want good-looking for signal strength/quality
6440 //      2007/7/19 01:09, by cosa.
6441 //
6442 long
6443 rtl819x_signal_scale_mapping(
6444         long currsig
6445         )
6446 {
6447         long retsig;
6448
6449         // Step 1. Scale mapping.
6450         if(currsig >= 61 && currsig <= 100)
6451         {
6452                 retsig = 90 + ((currsig - 60) / 4);
6453         }
6454         else if(currsig >= 41 && currsig <= 60)
6455         {
6456                 retsig = 78 + ((currsig - 40) / 2);
6457         }
6458         else if(currsig >= 31 && currsig <= 40)
6459         {
6460                 retsig = 66 + (currsig - 30);
6461         }
6462         else if(currsig >= 21 && currsig <= 30)
6463         {
6464                 retsig = 54 + (currsig - 20);
6465         }
6466         else if(currsig >= 5 && currsig <= 20)
6467         {
6468                 retsig = 42 + (((currsig - 5) * 2) / 3);
6469         }
6470         else if(currsig == 4)
6471         {
6472                 retsig = 36;
6473         }
6474         else if(currsig == 3)
6475         {
6476                 retsig = 27;
6477         }
6478         else if(currsig == 2)
6479         {
6480                 retsig = 18;
6481         }
6482         else if(currsig == 1)
6483         {
6484                 retsig = 9;
6485         }
6486         else
6487         {
6488                 retsig = currsig;
6489         }
6490
6491         return retsig;
6492 }
6493
6494 /*-----------------------------------------------------------------------------
6495  * Function:    QueryRxPhyStatus8192S()
6496  *
6497  * Overview:
6498  *
6499  * Input:               NONE
6500  *
6501  * Output:              NONE
6502  *
6503  * Return:              NONE
6504  *
6505  * Revised History:
6506  *      When            Who             Remark
6507  *      06/01/2007      MHC             Create Version 0.
6508  *      06/05/2007      MHC             Accordign to HW's new data sheet, we add CCK and OFDM
6509  *                                              descriptor definition.
6510  *      07/04/2007      MHC             According to Jerry and Bryant's document. We read
6511  *                                              ir_isolation and ext_lna for RF's init value and use
6512  *                                              to compensate RSSI after receiving packets.
6513  *      09/10/2008      MHC             Modify name and PHY status field for 92SE.
6514  *      09/19/2008      MHC             Add CCK/OFDM SS/SQ for 92S series.
6515  *
6516  *---------------------------------------------------------------------------*/
6517 static void rtl8192SU_query_rxphystatus(
6518         struct r8192_priv * priv,
6519         struct ieee80211_rx_stats * pstats,
6520         rx_desc_819x_usb        *pDesc,
6521         rx_drvinfo_819x_usb  * pdrvinfo,
6522         struct ieee80211_rx_stats * precord_stats,
6523         bool bpacket_match_bssid,
6524         bool bpacket_toself,
6525         bool bPacketBeacon,
6526         bool bToSelfBA
6527         )
6528 {
6529         //PRT_RFD_STATUS                pRtRfdStatus = &(pRfd->Status);
6530         //PHY_STS_CCK_8192S_T   *pCck_buf;
6531         phy_sts_cck_819xusb_t   *       pcck_buf;
6532         phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
6533         //u8                            *prxpkt;
6534         //u8                            i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
6535         u8                              i, max_spatial_stream, rxsc_sgien_exflg;
6536         char                            rx_pwr[4], rx_pwr_all=0;
6537         //long                          rx_avg_pwr = 0;
6538         //char                          rx_snrX, rx_evmX;
6539         u8                              evm, pwdb_all;
6540         u32                             RSSI, total_rssi=0;//, total_evm=0;
6541 //      long                            signal_strength_index = 0;
6542         u8                              is_cck_rate=0;
6543         u8                              rf_rx_num = 0;
6544
6545
6546
6547         priv->stats.numqry_phystatus++;
6548
6549         is_cck_rate = rx_hal_is_cck_rate(pDesc);
6550
6551         // Record it for next packet processing
6552         memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
6553         pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
6554         pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
6555         pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
6556         pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
6557         pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
6558
6559
6560         pstats->RxMIMOSignalQuality[0] = -1;
6561         pstats->RxMIMOSignalQuality[1] = -1;
6562         precord_stats->RxMIMOSignalQuality[0] = -1;
6563         precord_stats->RxMIMOSignalQuality[1] = -1;
6564
6565         if(is_cck_rate)
6566         {
6567                 u8 report;//, tmp_pwdb;
6568                 //char cck_adc_pwdb[4];
6569
6570                 // CCK Driver info Structure is not the same as OFDM packet.
6571                 pcck_buf = (phy_sts_cck_819xusb_t *)pdrvinfo;
6572
6573                 //
6574                 // (1)Hardware does not provide RSSI for CCK
6575                 //
6576
6577                 //
6578                 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
6579                 //
6580
6581                 priv->stats.numqry_phystatusCCK++;
6582
6583                 if(!priv->bCckHighPower)
6584                 {
6585                         report = pcck_buf->cck_agc_rpt & 0xc0;
6586                         report = report>>6;
6587                         switch(report)
6588                         {
6589                                 //Fixed by Jacken from Bryant 2008-03-20
6590                                 //Original value is -38 , -26 , -14 , -2
6591                                 //Fixed value is -35 , -23 , -11 , 6
6592                                 case 0x3:
6593                                         rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
6594                                         break;
6595                                 case 0x2:
6596                                         rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
6597                                         break;
6598                                 case 0x1:
6599                                         rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
6600                                         break;
6601                                 case 0x0:
6602                                         rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);//6->8
6603                                         break;
6604                         }
6605                 }
6606                 else
6607                 {
6608                         report = pdrvinfo->cfosho[0] & 0x60;
6609                         report = report>>5;
6610                         switch(report)
6611                         {
6612                                 case 0x3:
6613                                         rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
6614                                         break;
6615                                 case 0x2:
6616                                         rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
6617                                         break;
6618                                 case 0x1:
6619                                         rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
6620                                         break;
6621                                 case 0x0:
6622                                         rx_pwr_all = -8 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;//6->-8
6623                                         break;
6624                         }
6625                 }
6626
6627                 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);//check it
6628                 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
6629                 //pstats->RecvSignalPower = pwdb_all;
6630                 pstats->RecvSignalPower = rx_pwr_all;
6631
6632                 //
6633                 // (3) Get Signal Quality (EVM)
6634                 //
6635         //if(bpacket_match_bssid)
6636         {
6637                         u8      sq;
6638
6639                         if(pstats->RxPWDBAll > 40)
6640                         {
6641                                 sq = 100;
6642                         }else
6643                         {
6644                                 sq = pcck_buf->sq_rpt;
6645
6646                                 if(pcck_buf->sq_rpt > 64)
6647                                         sq = 0;
6648                                 else if (pcck_buf->sq_rpt < 20)
6649                                         sq = 100;
6650                                 else
6651                                         sq = ((64-sq) * 100) / 44;
6652                         }
6653                         pstats->SignalQuality = precord_stats->SignalQuality = sq;
6654                         pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
6655                         pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
6656                 }
6657         }
6658         else
6659         {
6660                 priv->stats.numqry_phystatusHT++;
6661
6662                 // 2008/09/19 MH For 92S debug, RX RF path always enable!!
6663                 priv->brfpath_rxenable[0] = priv->brfpath_rxenable[1] = TRUE;
6664
6665                 //
6666                 // (1)Get RSSI for HT rate
6667                 //
6668                 //for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
6669                 for(i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
6670                 {
6671                         // 2008/01/30 MH we will judge RF RX path now.
6672                         if (priv->brfpath_rxenable[i])
6673                                 rf_rx_num++;
6674                         //else
6675                         //      continue;
6676
6677                 //if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
6678                 //              continue;
6679
6680                         //Fixed by Jacken from Bryant 2008-03-20
6681                         //Original value is 106
6682                         //rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
6683                         rx_pwr[i] = ((pdrvinfo->gain_trsw[i]&0x3F)*2) - 110;
6684
6685                         /* Translate DBM to percentage. */
6686                         RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);        //check ok
6687                         total_rssi += RSSI;
6688                         RT_TRACE(COMP_RF, "RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI);
6689
6690                         //Get Rx snr value in DB
6691                         //tmp_rxsnr =   pofdm_buf->rxsnr_X[i];
6692                         //rx_snrX = (char)(tmp_rxsnr);
6693                         //rx_snrX /= 2;
6694                         //priv->stats.rxSNRdB[i] = (long)rx_snrX;
6695                         priv->stats.rxSNRdB[i] = (long)(pdrvinfo->rxsnr[i]/2);
6696
6697                         /* Translate DBM to percentage. */
6698                         //RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
6699                         //total_rssi += RSSI;
6700
6701                         /* Record Signal Strength for next packet */
6702                         //if(bpacket_match_bssid)
6703                         {
6704                                 pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
6705                                 precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
6706                         }
6707                 }
6708
6709
6710                 //
6711                 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
6712                 //
6713                 //Fixed by Jacken from Bryant 2008-03-20
6714                 //Original value is 106
6715                 //rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
6716                 rx_pwr_all = (((pdrvinfo->pwdb_all ) >> 1 )& 0x7f) -106;
6717                 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
6718
6719                 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
6720                 pstats->RxPower = precord_stats->RxPower =  rx_pwr_all;
6721                 pstats->RecvSignalPower = rx_pwr_all;
6722
6723                 //
6724                 // (3)EVM of HT rate
6725                 //
6726                 //if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
6727                  //     pdrvinfo->RxRate<=DESC90_RATEMCS15)
6728                  if(pDesc->RxHT && pDesc->RxMCS>=DESC92S_RATEMCS8 &&
6729                         pDesc->RxMCS<=DESC92S_RATEMCS15)
6730                         max_spatial_stream = 2; //both spatial stream make sense
6731                 else
6732                         max_spatial_stream = 1; //only spatial stream 1 makes sense
6733
6734                 for(i=0; i<max_spatial_stream; i++)
6735                 {
6736                         //tmp_rxevm =   pofdm_buf->rxevm_X[i];
6737                         //rx_evmX = (char)(tmp_rxevm);
6738
6739                         // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
6740                         // fill most significant bit to "zero" when doing shifting operation which may change a negative
6741                         // value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.
6742                         //rx_evmX /= 2; //dbm
6743
6744                         //evm = rtl819x_evm_dbtopercentage(rx_evmX);
6745                         evm = rtl819x_evm_dbtopercentage( (pdrvinfo->rxevm[i] /*/ 2*/));        //dbm
6746                         RT_TRACE(COMP_RF, "RXRATE=%x RXEVM=%x EVM=%s%d\n", pDesc->RxMCS, pdrvinfo->rxevm[i], "%", evm);
6747
6748                         //if(bpacket_match_bssid)
6749                         {
6750                                 if(i==0) // Fill value in RFD, Get the first spatial stream only
6751                                         pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
6752                                 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
6753                         }
6754                 }
6755
6756
6757                 /* record rx statistics for debug */
6758                 //rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
6759                 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
6760                 //if(pdrvinfo->BW)      //40M channel
6761                 if(pDesc->BW)   //40M channel
6762                         priv->stats.received_bwtype[1+pdrvinfo->rxsc]++;
6763                 else                            //20M channel
6764                         priv->stats.received_bwtype[0]++;
6765         }
6766
6767         //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
6768         //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
6769         if(is_cck_rate)
6770         {
6771                 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;//check ok
6772
6773         }
6774         else
6775         {
6776                 //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
6777                 // We can judge RX path number now.
6778                 if (rf_rx_num != 0)
6779                         pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
6780         }
6781 }/* QueryRxPhyStatus8192S */
6782
6783 void
6784 rtl8192_record_rxdesc_forlateruse(
6785         struct ieee80211_rx_stats *     psrc_stats,
6786         struct ieee80211_rx_stats *     ptarget_stats
6787 )
6788 {
6789         ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
6790         ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
6791         ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
6792 }
6793
6794 static void rtl8192SU_query_rxphystatus(
6795         struct r8192_priv * priv,
6796         struct ieee80211_rx_stats * pstats,
6797         rx_desc_819x_usb        *pDesc,
6798         rx_drvinfo_819x_usb  * pdrvinfo,
6799         struct ieee80211_rx_stats * precord_stats,
6800         bool bpacket_match_bssid,
6801         bool bpacket_toself,
6802         bool bPacketBeacon,
6803         bool bToSelfBA
6804         );
6805 void rtl8192SU_TranslateRxSignalStuff(struct sk_buff *skb,
6806                                    struct ieee80211_rx_stats * pstats,
6807                                    rx_desc_819x_usb     *pDesc,
6808                                    rx_drvinfo_819x_usb  *pdrvinfo)
6809 {
6810         // TODO: We must only check packet for current MAC address. Not finish
6811         rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
6812         struct net_device *dev=info->dev;
6813         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6814         bool bpacket_match_bssid, bpacket_toself;
6815         bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
6816         static struct ieee80211_rx_stats  previous_stats;
6817         struct ieee80211_hdr_3addr *hdr;//by amy
6818        u16 fc,type;
6819
6820         // Get Signal Quality for only RX data queue (but not command queue)
6821
6822         u8* tmp_buf;
6823         //u16 tmp_buf_len = 0;
6824         u8  *praddr;
6825
6826         /* Get MAC frame start address. */
6827         tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
6828
6829         hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
6830         fc = le16_to_cpu(hdr->frame_ctl);
6831         type = WLAN_FC_GET_TYPE(fc);
6832         praddr = hdr->addr1;
6833
6834         /* Check if the received packet is acceptabe. */
6835         bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
6836                                                         (eqMacAddr(priv->ieee80211->current_network.bssid,  (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
6837                                                                  && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
6838         bpacket_toself =  bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
6839
6840 #if 1//cosa
6841                 if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
6842                 {
6843                         bPacketBeacon = true;
6844                         //DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
6845                 }
6846                 if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
6847                 {
6848                         if((eqMacAddr(praddr,dev->dev_addr)))
6849                                 bToSelfBA = true;
6850                                 //DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
6851                 }
6852
6853 #endif
6854
6855
6856         if(bpacket_match_bssid)
6857         {
6858                 priv->stats.numpacket_matchbssid++;
6859         }
6860         if(bpacket_toself){
6861                 priv->stats.numpacket_toself++;
6862         }
6863         //
6864         // Process PHY information for previous packet (RSSI/PWDB/EVM)
6865         //
6866         // Because phy information is contained in the last packet of AMPDU only, so driver
6867         // should process phy information of previous packet
6868         rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
6869         rtl8192SU_query_rxphystatus(priv, pstats, pDesc, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
6870         rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
6871
6872 }
6873
6874 /**
6875 * Function:     UpdateReceivedRateHistogramStatistics
6876 * Overview:     Recored down the received data rate
6877 *
6878 * Input:
6879 *       struct net_device *dev
6880 *       struct ieee80211_rx_stats *stats
6881 *
6882 * Output:
6883 *
6884 *                       (priv->stats.ReceivedRateHistogram[] is updated)
6885 * Return:
6886 *               None
6887 */
6888 void
6889 UpdateReceivedRateHistogramStatistics8190(
6890         struct net_device *dev,
6891         struct ieee80211_rx_stats *stats
6892         )
6893 {
6894         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6895         u32 rcvType=1;   //0: Total, 1:OK, 2:CRC, 3:ICV
6896         u32 rateIndex;
6897         u32 preamble_guardinterval;  //1: short preamble/GI, 0: long preamble/GI
6898
6899
6900         if(stats->bCRC)
6901         rcvType = 2;
6902         else if(stats->bICV)
6903         rcvType = 3;
6904
6905         if(stats->bShortPreamble)
6906         preamble_guardinterval = 1;// short
6907         else
6908         preamble_guardinterval = 0;// long
6909
6910         switch(stats->rate)
6911         {
6912                 //
6913                 // CCK rate
6914                 //
6915                 case MGN_1M:    rateIndex = 0;  break;
6916                 case MGN_2M:    rateIndex = 1;  break;
6917                 case MGN_5_5M:  rateIndex = 2;  break;
6918                 case MGN_11M:   rateIndex = 3;  break;
6919                 //
6920                 // Legacy OFDM rate
6921                 //
6922                 case MGN_6M:    rateIndex = 4;  break;
6923                 case MGN_9M:    rateIndex = 5;  break;
6924                 case MGN_12M:   rateIndex = 6;  break;
6925                 case MGN_18M:   rateIndex = 7;  break;
6926                 case MGN_24M:   rateIndex = 8;  break;
6927                 case MGN_36M:   rateIndex = 9;  break;
6928                 case MGN_48M:   rateIndex = 10; break;
6929                 case MGN_54M:   rateIndex = 11; break;
6930                 //
6931                 // 11n High throughput rate
6932                 //
6933                 case MGN_MCS0:  rateIndex = 12; break;
6934                 case MGN_MCS1:  rateIndex = 13; break;
6935                 case MGN_MCS2:  rateIndex = 14; break;
6936                 case MGN_MCS3:  rateIndex = 15; break;
6937                 case MGN_MCS4:  rateIndex = 16; break;
6938                 case MGN_MCS5:  rateIndex = 17; break;
6939                 case MGN_MCS6:  rateIndex = 18; break;
6940                 case MGN_MCS7:  rateIndex = 19; break;
6941                 case MGN_MCS8:  rateIndex = 20; break;
6942                 case MGN_MCS9:  rateIndex = 21; break;
6943                 case MGN_MCS10: rateIndex = 22; break;
6944                 case MGN_MCS11: rateIndex = 23; break;
6945                 case MGN_MCS12: rateIndex = 24; break;
6946                 case MGN_MCS13: rateIndex = 25; break;
6947                 case MGN_MCS14: rateIndex = 26; break;
6948                 case MGN_MCS15: rateIndex = 27; break;
6949                 default:        rateIndex = 28; break;
6950         }
6951     priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
6952     priv->stats.received_rate_histogram[0][rateIndex]++; //total
6953     priv->stats.received_rate_histogram[rcvType][rateIndex]++;
6954 }
6955
6956 void rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
6957 {
6958         rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
6959         struct net_device *dev=info->dev;
6960         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6961         //rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
6962         rx_drvinfo_819x_usb  *driver_info = NULL;
6963
6964         //PRT_RFD_STATUS                                pRtRfdStatus = &pRfd->Status;
6965         //PHAL_DATA_8192SUSB                    pHalData = GET_HAL_DATA(Adapter);
6966         //pu1Byte               pDesc = (pu1Byte)pDescIn;
6967         //PRX_DRIVER_INFO_8192S         pDrvInfo;
6968
6969         rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
6970
6971         if(0)
6972         {
6973                 int m = 0;
6974                 printk("========================");
6975                 for(m=0; m<skb->len; m++){
6976                         if((m%32) == 0)
6977                                 printk("\n");
6978                         printk("%2x ",((u8*)skb->data)[m]);
6979                 }
6980                 printk("\n========================\n");
6981
6982         }
6983
6984
6985         //
6986         //Get Rx Descriptor Raw Information
6987         //
6988         stats->Length = desc->Length ;
6989         stats->RxDrvInfoSize = desc->RxDrvInfoSize*RX_DRV_INFO_SIZE_UNIT;
6990         stats->RxBufShift = (desc->Shift)&0x03;
6991         stats->bICV = desc->ICV;
6992         stats->bCRC = desc->CRC32;
6993         stats->bHwError = stats->bCRC|stats->bICV;
6994         stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
6995         stats->bIsAMPDU = (desc->AMSDU==1);
6996         stats->bFirstMPDU = (desc->PAGGR==1) && (desc->FAGGR==1);
6997         stats->bShortPreamble = desc->SPLCP;
6998         stats->RxIs40MHzPacket = (desc->BW==1);
6999         stats->TimeStampLow = desc->TSFL;
7000
7001         if((desc->FAGGR==1) || (desc->PAGGR==1))
7002         {// Rx A-MPDU
7003                 RT_TRACE(COMP_RXDESC, "FirstAGGR = %d, PartAggr = %d\n", desc->FAGGR, desc->PAGGR);
7004         }
7005 //YJ,test,090310
7006 if(stats->bHwError)
7007 {
7008         if(stats->bICV)
7009                 printk("%s: Receive ICV error!!!!!!!!!!!!!!!!!!!!!!\n", __FUNCTION__);
7010         if(stats->bCRC)
7011                 printk("%s: Receive CRC error!!!!!!!!!!!!!!!!!!!!!!\n", __FUNCTION__);
7012 }
7013
7014         if(IS_UNDER_11N_AES_MODE(priv->ieee80211))
7015         {
7016                 // Always received ICV error packets in AES mode.
7017                 // This fixed HW later MIC write bug.
7018                 if(stats->bICV && !stats->bCRC)
7019                 {
7020                         stats->bICV = FALSE;
7021                         stats->bHwError = FALSE;
7022                 }
7023         }
7024
7025         // Transform HwRate to MRate
7026         if(!stats->bHwError)
7027                 //stats->DataRate = HwRateToMRate(
7028                 //      (BOOLEAN)GET_RX_DESC_RXHT(pDesc),
7029                 //      (u1Byte)GET_RX_DESC_RXMCS(pDesc),
7030                 //      (BOOLEAN)GET_RX_DESC_PAGGR(pDesc));
7031                 stats->rate = rtl8192SU_HwRateToMRate(desc->RxHT, desc->RxMCS, desc->PAGGR);
7032         else
7033                 stats->rate = MGN_1M;
7034
7035         //
7036         // Collect Rx rate/AMPDU/TSFL
7037         //
7038         //UpdateRxdRateHistogramStatistics8192S(Adapter, pRfd);
7039         //UpdateRxAMPDUHistogramStatistics8192S(Adapter, pRfd);
7040         //UpdateRxPktTimeStamp8192S(Adapter, pRfd);
7041         UpdateReceivedRateHistogramStatistics8190(dev, stats);
7042         //UpdateRxAMPDUHistogramStatistics8192S(dev, stats);    //FIXLZM
7043         UpdateRxPktTimeStamp8190(dev, stats);
7044
7045         //
7046         // Get PHY Status and RSVD parts.
7047         // <Roger_Notes> It only appears on last aggregated packet.
7048         //
7049         if (desc->PHYStatus)
7050         {
7051                 //driver_info = (rx_drvinfo_819x_usb *)(skb->data + RX_DESC_SIZE + stats->RxBufShift);
7052                 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
7053                                 stats->RxBufShift);
7054                 if(0)
7055                 {
7056                         int m = 0;
7057                         printk("========================\n");
7058                         printk("RX_DESC_SIZE:%d, RxBufShift:%d, RxDrvInfoSize:%d\n",
7059                                         RX_DESC_SIZE, stats->RxBufShift, stats->RxDrvInfoSize);
7060                         for(m=0; m<32; m++){
7061                                printk("%2x ",((u8*)driver_info)[m]);
7062                         }
7063                         printk("\n========================\n");
7064
7065                 }
7066
7067         }
7068
7069         //YJ,add,090107
7070         skb_pull(skb, sizeof(rx_desc_819x_usb));
7071         //YJ,add,090107,end
7072
7073         //
7074         // Get Total offset of MPDU Frame Body
7075         //
7076         if((stats->RxBufShift + stats->RxDrvInfoSize) > 0)
7077         {
7078                 stats->bShift = 1;
7079                 //YJ,add,090107
7080                 skb_pull(skb, stats->RxBufShift + stats->RxDrvInfoSize);
7081                 //YJ,add,090107,end
7082         }
7083
7084         //
7085         // Get PHY Status and RSVD parts.
7086         // <Roger_Notes> It only appears on last aggregated packet.
7087         //
7088         if (desc->PHYStatus)
7089         {
7090                 rtl8192SU_TranslateRxSignalStuff(skb, stats, desc, driver_info);
7091         }
7092 }
7093
7094 //
7095 // Description:
7096 //      The strarting address of wireless lan header will shift 1 or 2 or 3 or "more" bytes for the following reason :
7097 //      (1) QoS control : shift 2 bytes
7098 //      (2) Mesh Network : shift 1 or 3 bytes
7099 //      (3) RxDriverInfo occupies  the front parts of Rx Packets buffer(shift units is in 8Bytes)
7100 //
7101 //      It is because Lextra CPU used by 8186 or 865x series assert exception if the statrting address
7102 //      of IP header is not double word alignment.
7103 //      This features is supported in 818xb and 8190 only, but not 818x.
7104 //
7105 //      parameter: PRT_RFD, Pointer of Reeceive frame descriptor which is initialized according to
7106 //                                           Rx Descriptor
7107 //      return value: unsigned int,  number of total shifted bytes
7108 //
7109 //      Notes: 2008/06/28, created by Roger
7110 //
7111 u32 GetRxPacketShiftBytes8192SU(struct ieee80211_rx_stats  *Status, bool bIsRxAggrSubframe)
7112 {
7113         //PRT_RFD_STATUS        pRtRfdStatus = &pRfd->Status;
7114
7115         return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize + Status->RxBufShift);
7116 }
7117
7118 void rtl8192SU_rx_nomal(struct sk_buff* skb)
7119 {
7120         rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7121         struct net_device *dev=info->dev;
7122         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7123         struct ieee80211_rx_stats stats = {
7124                 .signal = 0,
7125                 .noise = -98,
7126                 .rate = 0,
7127                 //      .mac_time = jiffies,
7128                 .freq = IEEE80211_24GHZ_BAND,
7129         };
7130         u32 rx_pkt_len = 0;
7131         struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
7132         bool unicast_packet = false;
7133
7134         //printk("**********skb->len = %d\n", skb->len);
7135         /* 20 is for ps-poll */
7136         if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
7137
7138                 /* first packet should not contain Rx aggregation header */
7139                 rtl8192SU_query_rxdesc_status(skb, &stats, false);
7140                 /* TODO */
7141
7142                 /* hardware related info */
7143                 priv->stats.rxoktotal++;  //YJ,test,090108
7144
7145                 /* Process the MPDU recevied */
7146                 skb_trim(skb, skb->len - 4/*sCrcLng*/);//FIXLZM
7147
7148                 rx_pkt_len = skb->len;
7149                 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
7150                 unicast_packet = false;
7151                 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
7152                         //TODO
7153                 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
7154                         //TODO
7155                 }else {
7156                         /* unicast packet */
7157                         unicast_packet = true;
7158                 }
7159
7160                 if(!ieee80211_rtl_rx(priv->ieee80211,skb, &stats)) {
7161                         dev_kfree_skb_any(skb);
7162                 } else {
7163                 //      priv->stats.rxoktotal++;  //YJ,test,090108
7164                         if(unicast_packet) {
7165                                 priv->stats.rxbytesunicast += rx_pkt_len;
7166                         }
7167                 }
7168
7169                 //up is firs pkt, follow is next and next
7170         }
7171         else
7172         {
7173                 priv->stats.rxurberr++;
7174                 printk("actual_length:%d\n", skb->len);
7175                 dev_kfree_skb_any(skb);
7176         }
7177
7178 }
7179
7180 void
7181 rtl819xusb_process_received_packet(
7182         struct net_device *dev,
7183         struct ieee80211_rx_stats *pstats
7184         )
7185 {
7186 //      bool bfreerfd=false, bqueued=false;
7187         u8*     frame;
7188         u16     frame_len=0;
7189         struct r8192_priv *priv = ieee80211_priv(dev);
7190 //      u8                      index = 0;
7191 //      u8                      TID = 0;
7192         //u16                   seqnum = 0;
7193         //PRX_TS_RECORD pts = NULL;
7194
7195         // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
7196         //porting by amy 080508
7197         pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
7198         frame = pstats->virtual_address;
7199         frame_len = pstats->packetlength;
7200 #ifdef TODO     // by amy about HCT
7201         if(!Adapter->bInHctTest)
7202                 CountRxErrStatistics(Adapter, pRfd);
7203 #endif
7204         {
7205         #ifdef ENABLE_PS  //by amy for adding ps function in future
7206                 RT_RF_POWER_STATE rtState;
7207                 // When RF is off, we should not count the packet for hw/sw synchronize
7208                 // reason, ie. there may be a duration while sw switch is changed and hw
7209                 // switch is being changed. 2006.12.04, by shien chang.
7210                 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
7211                 if (rtState == eRfOff)
7212                 {
7213                         return;
7214                 }
7215         #endif
7216         priv->stats.rxframgment++;
7217
7218         }
7219 #ifdef TODO
7220         RmMonitorSignalStrength(Adapter, pRfd);
7221 #endif
7222         /* 2007/01/16 MH Add RX command packet handle here. */
7223         /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
7224         if (rtl819xusb_rx_command_packet(dev, pstats))
7225         {
7226                 return;
7227         }
7228
7229 #ifdef SW_CRC_CHECK
7230         SwCrcCheck();
7231 #endif
7232
7233
7234 }
7235
7236 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
7237 {
7238 //      rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7239 //      struct net_device *dev=info->dev;
7240 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7241         rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
7242 //      rx_drvinfo_819x_usb  *driver_info;
7243
7244         //
7245         //Get Rx Descriptor Information
7246         //
7247         stats->virtual_address = (u8*)skb->data;
7248         stats->Length = desc->Length;
7249         stats->RxDrvInfoSize = 0;
7250         stats->RxBufShift = 0;
7251         stats->packetlength = stats->Length-scrclng;
7252         stats->fraglength = stats->packetlength;
7253         stats->fragoffset = 0;
7254         stats->ntotalfrag = 1;
7255 }
7256
7257 void rtl8192SU_rx_cmd(struct sk_buff *skb)
7258 {
7259         struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
7260         struct net_device *dev = info->dev;
7261
7262         /* TODO */
7263         struct ieee80211_rx_stats stats = {
7264                 .signal = 0,
7265                 .noise = -98,
7266                 .rate = 0,
7267                 //      .mac_time = jiffies,
7268                 .freq = IEEE80211_24GHZ_BAND,
7269         };
7270
7271         //
7272         // Check buffer length to determine if this is a valid MPDU.
7273         //
7274         if( (skb->len >= sizeof(rx_desc_819x_usb)) && (skb->len <= RX_URB_SIZE) )//&&
7275                 //(pHalData->SwChnlInProgress == FALSE))
7276         {
7277                 //
7278                 // Collection information in Rx descriptor.
7279                 //
7280                 query_rx_cmdpkt_desc_status(skb,&stats);
7281                 // this is to be done by amy 080508     prfd->queue_id = 1;
7282
7283                 //
7284                 // Process the MPDU recevied.
7285                 //
7286                 rtl819xusb_process_received_packet(dev,&stats);
7287
7288                 dev_kfree_skb_any(skb);
7289         }
7290         else
7291         {
7292                 //RTInsertTailListWithCnt(&pAdapter->RfdIdleQueue, &pRfd->List, &pAdapter->NumIdleRfd);
7293                 //RT_ASSERT(pAdapter->NumIdleRfd <= pAdapter->NumRfd, ("HalUsbInCommandComplete8192SUsb(): Adapter->NumIdleRfd(%d)\n", pAdapter->NumIdleRfd));
7294                 //RT_TRACE(COMP_RECV, DBG_LOUD, ("HalUsbInCommandComplete8192SUsb(): NOT enough Resources!! BufLenUsed(%d), NumIdleRfd(%d)\n",
7295                         //pContext->BufLenUsed, pAdapter->NumIdleRfd));
7296         }
7297
7298         //
7299         // Reuse USB_IN_CONTEXT since we had finished processing the
7300         // buffer in USB_IN_CONTEXT.
7301         //
7302         //HalUsbReturnInContext(pAdapter, pContext);
7303
7304         //
7305         // Issue another bulk IN transfer.
7306         //
7307         //HalUsbInMpdu(pAdapter, PipeIndex);
7308
7309         RT_TRACE(COMP_RECV, "<--- HalUsbInCommandComplete8192SUsb()\n");
7310
7311 }
7312
7313 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
7314 {
7315         struct sk_buff *skb;
7316         struct rtl8192_rx_info *info;
7317
7318         while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
7319                 info = (struct rtl8192_rx_info *)skb->cb;
7320                 switch (info->out_pipe) {
7321                 /* Nomal packet pipe */
7322                         case 3:
7323                                 //RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
7324                                 priv->IrpPendingCount--;
7325                                 priv->ops->rtl819x_rx_nomal(skb);
7326                                 break;
7327
7328                                 /* Command packet pipe */
7329                         case 9:
7330                                 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
7331                                                 info->out_pipe);
7332                                 priv->ops->rtl819x_rx_cmd(skb);
7333                                 break;
7334
7335                         default: /* should never get here! */
7336                                 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
7337                                                 info->out_pipe);
7338                                 dev_kfree_skb(skb);
7339                                 break;
7340
7341                 }
7342         }
7343 }
7344
7345
7346
7347 /****************************************************************************
7348      ---------------------------- USB_STUFF---------------------------
7349 *****************************************************************************/
7350 //LZM Merge from windows HalUsbSetQueuePipeMapping8192SUsb 090319
7351 static void HalUsbSetQueuePipeMapping8192SUsb(struct usb_interface *intf, struct net_device *dev)
7352 {
7353         struct r8192_priv *priv = ieee80211_priv(dev);
7354         struct usb_host_interface *iface_desc;
7355         struct usb_endpoint_descriptor *endpoint;
7356         u8 i = 0;
7357
7358         priv->ep_in_num = 0;
7359         priv->ep_out_num = 0;
7360         memset(priv->RtOutPipes,0,16);
7361         memset(priv->RtInPipes,0,16);
7362
7363         iface_desc = intf->cur_altsetting;
7364         priv->ep_num = iface_desc->desc.bNumEndpoints;
7365
7366         for (i = 0; i < priv->ep_num; ++i) {
7367                 endpoint = &iface_desc->endpoint[i].desc;
7368                 if (usb_endpoint_is_bulk_in(endpoint)) {
7369                         priv->RtInPipes[priv->ep_in_num] = usb_endpoint_num(endpoint);
7370                         priv->ep_in_num ++;
7371                         //printk("in_endpoint_idx = %d\n", usb_endpoint_num(endpoint));
7372                 } else if (usb_endpoint_is_bulk_out(endpoint)) {
7373                         priv->RtOutPipes[priv->ep_out_num] = usb_endpoint_num(endpoint);
7374                         priv->ep_out_num ++;
7375                         //printk("out_endpoint_idx = %d\n", usb_endpoint_num(endpoint));
7376                 }
7377         }
7378         {
7379                 memset(priv->txqueue_to_outpipemap,0,9);
7380                 if (priv->ep_num == 6) {
7381                         // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7382                         u8 queuetopipe[] = {3, 2, 1, 0, 4, 4, 4, 4, 4};
7383
7384                         memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7385                 } else if (priv->ep_num == 4) {
7386                         // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7387                         u8 queuetopipe[] = {1, 1, 0, 0, 2, 2, 2, 2, 2};
7388
7389                         memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7390                 } else if (priv->ep_num > 9) {
7391                         // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7392                         u8 queuetopipe[] = {3, 2, 1, 0, 4, 8, 7, 6, 5};
7393
7394                         memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7395                 } else {//use sigle pipe
7396                         // BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON
7397                         u8 queuetopipe[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
7398                         memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
7399                 }
7400         }
7401         printk("==>ep_num:%d, in_ep_num:%d, out_ep_num:%d\n", priv->ep_num, priv->ep_in_num, priv->ep_out_num);
7402
7403         printk("==>RtInPipes:");
7404         for(i=0; i < priv->ep_in_num; i++)
7405                 printk("%d  ", priv->RtInPipes[i]);
7406         printk("\n");
7407
7408         printk("==>RtOutPipes:");
7409         for(i=0; i < priv->ep_out_num; i++)
7410                 printk("%d  ", priv->RtOutPipes[i]);
7411         printk("\n");
7412
7413         printk("==>txqueue_to_outpipemap for BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON:\n");
7414         for(i=0; i < 9; i++)
7415                 printk("%d  ", priv->txqueue_to_outpipemap[i]);
7416         printk("\n");
7417
7418         return;
7419 }
7420
7421 static const struct net_device_ops rtl8192_netdev_ops = {
7422         .ndo_open               = rtl8192_open,
7423         .ndo_stop               = rtl8192_close,
7424         .ndo_get_stats          = rtl8192_stats,
7425         .ndo_tx_timeout         = tx_timeout,
7426         .ndo_do_ioctl           = rtl8192_ioctl,
7427         .ndo_set_multicast_list = r8192_set_multicast,
7428         .ndo_set_mac_address    = r8192_set_mac_adr,
7429         .ndo_validate_addr      = eth_validate_addr,
7430         .ndo_change_mtu         = eth_change_mtu,
7431         .ndo_start_xmit         = rtl8192_ieee80211_rtl_xmit,
7432 };
7433
7434 static int __devinit rtl8192_usb_probe(struct usb_interface *intf,
7435                          const struct usb_device_id *id)
7436 {
7437 //      unsigned long ioaddr = 0;
7438         struct net_device *dev = NULL;
7439         struct r8192_priv *priv= NULL;
7440         struct usb_device *udev = interface_to_usbdev(intf);
7441
7442         RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
7443
7444         dev = alloc_ieee80211(sizeof(struct r8192_priv));
7445
7446         usb_set_intfdata(intf, dev);
7447         SET_NETDEV_DEV(dev, &intf->dev);
7448         priv = ieee80211_priv(dev);
7449         priv->ieee80211 = netdev_priv(dev);
7450         priv->udev=udev;
7451
7452         HalUsbSetQueuePipeMapping8192SUsb(intf, dev);
7453
7454         //printk("===============>NIC 8192SU\n");
7455         priv->ops = &rtl8192su_ops;
7456
7457         dev->netdev_ops = &rtl8192_netdev_ops;
7458
7459          //DMESG("Oops: i'm coming\n");
7460         dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
7461
7462         dev->type=ARPHRD_ETHER;
7463
7464         dev->watchdog_timeo = HZ*3;     //modified by john, 0805
7465
7466         if (dev_alloc_name(dev, ifname) < 0){
7467                 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
7468                 ifname = "wlan%d";
7469                 dev_alloc_name(dev, ifname);
7470         }
7471
7472         RT_TRACE(COMP_INIT, "Driver probe completed1\n");
7473 #if 1
7474         if(rtl8192_init(dev)!=0){
7475                 RT_TRACE(COMP_ERR, "Initialization failed");
7476                 goto fail;
7477         }
7478 #endif
7479         netif_carrier_off(dev);
7480         netif_stop_queue(dev);
7481
7482         register_netdev(dev);
7483         RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
7484         rtl8192_proc_init_one(dev);
7485
7486
7487         RT_TRACE(COMP_INIT, "Driver probe completed\n");
7488         return 0;
7489 fail:
7490         free_ieee80211(dev);
7491
7492         RT_TRACE(COMP_ERR, "wlan driver load failed\n");
7493         return -ENODEV;
7494 }
7495
7496 //detach all the work and timer structure declared or inititialize in r8192U_init function.
7497 void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
7498 {
7499         cancel_work_sync(&priv->reset_wq);
7500         cancel_work_sync(&priv->qos_activate);
7501         cancel_delayed_work(&priv->watch_dog_wq);
7502         cancel_delayed_work(&priv->update_beacon_wq);
7503         cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
7504         cancel_delayed_work(&priv->ieee80211->hw_sleep_wq);
7505         //cancel_work_sync(&priv->SetBWModeWorkItem);
7506         //cancel_work_sync(&priv->SwChnlWorkItem);
7507 }
7508
7509 static void __devexit rtl8192_usb_disconnect(struct usb_interface *intf)
7510 {
7511         struct net_device *dev = usb_get_intfdata(intf);
7512         struct r8192_priv *priv = ieee80211_priv(dev);
7513         if(dev){
7514
7515                 unregister_netdev(dev);
7516
7517                 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
7518                 rtl8192_proc_remove_one(dev);
7519
7520                         rtl8192_down(dev);
7521                 if (priv->pFirmware)
7522                 {
7523                         vfree(priv->pFirmware);
7524                         priv->pFirmware = NULL;
7525                 }
7526         //      priv->rf_close(dev);
7527 //              rtl8192_SetRFPowerState(dev, eRfOff);
7528                 destroy_workqueue(priv->priv_wq);
7529                 //rtl8192_irq_disable(dev);
7530                 //rtl8192_reset(dev);
7531                 mdelay(10);
7532
7533         }
7534         free_ieee80211(dev);
7535         RT_TRACE(COMP_DOWN, "wlan driver removed\n");
7536 }
7537
7538 /* fun with the built-in ieee80211 stack... */
7539 extern int ieee80211_debug_init(void);
7540 extern void ieee80211_debug_exit(void);
7541 extern int ieee80211_crypto_init(void);
7542 extern void ieee80211_crypto_deinit(void);
7543 extern int ieee80211_crypto_tkip_init(void);
7544 extern void ieee80211_crypto_tkip_exit(void);
7545 extern int ieee80211_crypto_ccmp_init(void);
7546 extern void ieee80211_crypto_ccmp_exit(void);
7547 extern int ieee80211_crypto_wep_init(void);
7548 extern void ieee80211_crypto_wep_exit(void);
7549
7550 static int __init rtl8192_usb_module_init(void)
7551 {
7552         int ret;
7553
7554 #ifdef CONFIG_IEEE80211_DEBUG
7555         ret = ieee80211_debug_init();
7556         if (ret) {
7557                 printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
7558                 return ret;
7559         }
7560 #endif
7561         ret = ieee80211_crypto_init();
7562         if (ret) {
7563                 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
7564                 return ret;
7565         }
7566
7567         ret = ieee80211_crypto_tkip_init();
7568         if (ret) {
7569                 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
7570                         ret);
7571                 return ret;
7572         }
7573
7574         ret = ieee80211_crypto_ccmp_init();
7575         if (ret) {
7576                 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
7577                         ret);
7578                 return ret;
7579         }
7580
7581         ret = ieee80211_crypto_wep_init();
7582         if (ret) {
7583                 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
7584                 return ret;
7585         }
7586
7587         printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
7588         printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
7589         RT_TRACE(COMP_INIT, "Initializing module");
7590         RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
7591         rtl8192_proc_module_init();
7592         return usb_register(&rtl8192_usb_driver);
7593 }
7594
7595
7596 static void __exit rtl8192_usb_module_exit(void)
7597 {
7598         usb_deregister(&rtl8192_usb_driver);
7599
7600         RT_TRACE(COMP_DOWN, "Exiting");
7601         rtl8192_proc_module_remove();
7602
7603         ieee80211_crypto_tkip_exit();
7604         ieee80211_crypto_ccmp_exit();
7605         ieee80211_crypto_wep_exit();
7606         ieee80211_crypto_deinit();
7607 #ifdef CONFIG_IEEE80211_DEBUG
7608         ieee80211_debug_exit();
7609 #endif
7610 }
7611
7612
7613 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
7614 {
7615         unsigned long flags;
7616         short enough_desc;
7617         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7618
7619         spin_lock_irqsave(&priv->tx_lock,flags);
7620         enough_desc = check_nic_enough_desc(dev,pri);
7621         spin_unlock_irqrestore(&priv->tx_lock,flags);
7622
7623         if(enough_desc)
7624                 ieee80211_rtl_wake_queue(priv->ieee80211);
7625 }
7626
7627 void EnableHWSecurityConfig8192(struct net_device *dev)
7628 {
7629         u8 SECR_value = 0x0;
7630         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
7631          struct ieee80211_device* ieee = priv->ieee80211;
7632
7633         SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
7634 #if 1
7635         if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
7636         {
7637                 SECR_value |= SCR_RxUseDK;
7638                 SECR_value |= SCR_TxUseDK;
7639         }
7640         else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
7641         {
7642                 SECR_value |= SCR_RxUseDK;
7643                 SECR_value |= SCR_TxUseDK;
7644         }
7645 #endif
7646         //add HWSec active enable here.
7647 //default using hwsec. when peer AP is in N mode only and pairwise_key_type is none_aes(which HT_IOT_ACT_PURE_N_MODE indicates it), use software security. when peer AP is in b,g,n mode mixed and pairwise_key_type is none_aes, use g mode hw security. WB on 2008.7.4
7648
7649         ieee->hwsec_active = 1;
7650
7651         if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep)//!ieee->hwsec_support) //add hwsec_support flag to totol control hw_sec on/off
7652         {
7653                 ieee->hwsec_active = 0;
7654                 SECR_value &= ~SCR_RxDecEnable;
7655         }
7656
7657         RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__, \
7658                         ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
7659         {
7660                 write_nic_byte(dev, SECR,  SECR_value);//SECR_value |  SCR_UseDK );
7661         }
7662 }
7663
7664
7665 void setKey(    struct net_device *dev,
7666                 u8 EntryNo,
7667                 u8 KeyIndex,
7668                 u16 KeyType,
7669                 u8 *MacAddr,
7670                 u8 DefaultKey,
7671                 u32 *KeyContent )
7672 {
7673         u32 TargetCommand = 0;
7674         u32 TargetContent = 0;
7675         u16 usConfig = 0;
7676         u8 i;
7677         if (EntryNo >= TOTAL_CAM_ENTRY)
7678                 RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
7679
7680         RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr"MAC_FMT"\n", dev,EntryNo, KeyIndex, KeyType, MAC_ARG(MacAddr));
7681
7682         if (DefaultKey)
7683                 usConfig |= BIT15 | (KeyType<<2);
7684         else
7685                 usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
7686 //      usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
7687
7688
7689         for(i=0 ; i<CAM_CONTENT_COUNT; i++){
7690                 TargetCommand  = i+CAM_CONTENT_COUNT*EntryNo;
7691                 TargetCommand |= BIT31|BIT16;
7692
7693                 if(i==0){//MAC|Config
7694                         TargetContent = (u32)(*(MacAddr+0)) << 16|
7695                                         (u32)(*(MacAddr+1)) << 24|
7696                                         (u32)usConfig;
7697
7698                         write_nic_dword(dev, WCAMI, TargetContent);
7699                         write_nic_dword(dev, RWCAM, TargetCommand);
7700         //              printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
7701                 }
7702                 else if(i==1){//MAC
7703                         TargetContent = (u32)(*(MacAddr+2))      |
7704                                         (u32)(*(MacAddr+3)) <<  8|
7705                                         (u32)(*(MacAddr+4)) << 16|
7706                                         (u32)(*(MacAddr+5)) << 24;
7707                         write_nic_dword(dev, WCAMI, TargetContent);
7708                         write_nic_dword(dev, RWCAM, TargetCommand);
7709                 }
7710                 else {
7711                         //Key Material
7712                         if(KeyContent !=NULL){
7713                         write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
7714                         write_nic_dword(dev, RWCAM, TargetCommand);
7715                 }
7716         }
7717         }
7718
7719 }
7720
7721 /***************************************************************************
7722      ------------------- module init / exit stubs ----------------
7723 ****************************************************************************/
7724 module_init(rtl8192_usb_module_init);
7725 module_exit(rtl8192_usb_module_exit);