]> Pileus Git - ~andy/linux/blob - drivers/staging/rtl8192u/r8192U_core.c
Merge tag 'mvebu' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[~andy/linux] / drivers / staging / rtl8192u / 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 #ifndef CONFIG_FORCE_HARD_FLOAT
28 double __floatsidf (int i) { return i; }
29 unsigned int __fixunsdfsi (double d) { return d; }
30 double __adddf3(double a, double b) { return a+b; }
31 double __addsf3(float a, float b) { return a+b; }
32 double __subdf3(double a, double b) { return a-b; }
33 double __extendsfdf2(float a) {return a;}
34 #endif
35
36 #undef LOOP_TEST
37 #undef DUMP_RX
38 #undef DUMP_TX
39 #undef DEBUG_TX_DESC2
40 #undef RX_DONT_PASS_UL
41 #undef DEBUG_EPROM
42 #undef DEBUG_RX_VERBOSE
43 #undef DUMMY_RX
44 #undef DEBUG_ZERO_RX
45 #undef DEBUG_RX_SKB
46 #undef DEBUG_TX_FRAG
47 #undef DEBUG_RX_FRAG
48 #undef DEBUG_TX_FILLDESC
49 #undef DEBUG_TX
50 #undef DEBUG_IRQ
51 #undef DEBUG_RX
52 #undef DEBUG_RXALLOC
53 #undef DEBUG_REGISTERS
54 #undef DEBUG_RING
55 #undef DEBUG_IRQ_TASKLET
56 #undef DEBUG_TX_ALLOC
57 #undef DEBUG_TX_DESC
58
59 #define CONFIG_RTL8192_IO_MAP
60
61 #include <asm/uaccess.h>
62 #include "r8192U_hw.h"
63 #include "r8192U.h"
64 #include "r8190_rtl8256.h" /* RTL8225 Radio frontend */
65 #include "r8180_93cx6.h"   /* Card EEPROM */
66 #include "r8192U_wx.h"
67 #include "r819xU_phy.h" //added by WB 4.30.2008
68 #include "r819xU_phyreg.h"
69 #include "r819xU_cmdpkt.h"
70 #include "r8192U_dm.h"
71 //#include "r8192xU_phyreg.h"
72 #include <linux/usb.h>
73 #include <linux/slab.h>
74 // FIXME: check if 2.6.7 is ok
75
76 #ifdef CONFIG_RTL8192_PM
77 #include "r8192_pm.h"
78 #endif
79
80 #include "dot11d.h"
81 //set here to open your trace code. //WB
82 u32 rt_global_debug_component = \
83                         //      COMP_INIT       |
84 //                              COMP_DBG        |
85                         //      COMP_EPROM      |
86 //                              COMP_PHY        |
87                         //      COMP_RF         |
88 //                              COMP_FIRMWARE   |
89 //                              COMP_CH         |
90                         //      COMP_POWER_TRACKING |
91 //                              COMP_RATE       |
92                         //      COMP_TXAGC      |
93                 //              COMP_TRACE      |
94                                 COMP_DOWN       |
95                 //              COMP_RECV       |
96                 //              COMP_SWBW       |
97                                 COMP_SEC        |
98         //                      COMP_RESET      |
99                 //              COMP_SEND       |
100                         //      COMP_EVENTS     |
101                                 COMP_ERR ; //always open err flags on
102
103 #define TOTAL_CAM_ENTRY 32
104 #define CAM_CONTENT_COUNT 8
105
106 static const struct usb_device_id rtl8192_usb_id_tbl[] = {
107         /* Realtek */
108         {USB_DEVICE(0x0bda, 0x8709)},
109         /* Corega */
110         {USB_DEVICE(0x07aa, 0x0043)},
111         /* Belkin */
112         {USB_DEVICE(0x050d, 0x805E)},
113         /* Sitecom */
114         {USB_DEVICE(0x0df6, 0x0031)},
115         /* EnGenius */
116         {USB_DEVICE(0x1740, 0x9201)},
117         /* Dlink */
118         {USB_DEVICE(0x2001, 0x3301)},
119         /* Zinwell */
120         {USB_DEVICE(0x5a57, 0x0290)},
121         /* LG */
122         {USB_DEVICE(0x043e, 0x7a01)},
123         {}
124 };
125
126 MODULE_LICENSE("GPL");
127 MODULE_VERSION("V 1.1");
128 MODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
129 MODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
130
131 static char* ifname = "wlan%d";
132 static int hwwep = 1;  //default use hw. set 0 to use software security
133 static int channels = 0x3fff;
134
135
136
137 module_param(ifname, charp, S_IRUGO|S_IWUSR );
138 //module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
139 module_param(hwwep,int, S_IRUGO|S_IWUSR);
140 module_param(channels,int, S_IRUGO|S_IWUSR);
141
142 MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
143 //MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
144 MODULE_PARM_DESC(hwwep," Try to use hardware security support. ");
145 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
146
147 static int rtl8192_usb_probe(struct usb_interface *intf,
148                          const struct usb_device_id *id);
149 static void rtl8192_usb_disconnect(struct usb_interface *intf);
150
151
152 static struct usb_driver rtl8192_usb_driver = {
153         .name           = RTL819xU_MODULE_NAME,           /* Driver name   */
154         .id_table       = rtl8192_usb_id_tbl,             /* PCI_ID table  */
155         .probe          = rtl8192_usb_probe,              /* probe fn      */
156         .disconnect     = rtl8192_usb_disconnect,         /* remove fn     */
157 #ifdef CONFIG_RTL8192_PM
158         .suspend        = rtl8192_suspend,                /* PM suspend fn */
159         .resume         = rtl8192_resume,                 /* PM resume fn  */
160 #else
161         .suspend        = NULL,                           /* PM suspend fn */
162         .resume         = NULL,                           /* PM resume fn  */
163 #endif
164 };
165
166
167 typedef struct _CHANNEL_LIST
168 {
169         u8      Channel[32];
170         u8      Len;
171 }CHANNEL_LIST, *PCHANNEL_LIST;
172
173 static CHANNEL_LIST ChannelPlan[] = {
174         {{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
175         {{1,2,3,4,5,6,7,8,9,10,11},11},                                                 //IC
176         {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},   //ETSI
177         {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},    //Spain. Change to ETSI.
178         {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //France. Change to ETSI.
179         {{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
180         {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
181         {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //Israel.
182         {{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
183         {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22},    //MIC
184         {{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
185 };
186
187 static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
188 {
189         int i, max_chan=-1, min_chan=-1;
190         struct ieee80211_device* ieee = priv->ieee80211;
191         switch (channel_plan)
192         {
193                 case COUNTRY_CODE_FCC:
194                 case COUNTRY_CODE_IC:
195                 case COUNTRY_CODE_ETSI:
196                 case COUNTRY_CODE_SPAIN:
197                 case COUNTRY_CODE_FRANCE:
198                 case COUNTRY_CODE_MKK:
199                 case COUNTRY_CODE_MKK1:
200                 case COUNTRY_CODE_ISRAEL:
201                 case COUNTRY_CODE_TELEC:
202                 case COUNTRY_CODE_MIC:
203                 {
204                         Dot11d_Init(ieee);
205                         ieee->bGlobalDomain = false;
206                         //actually 8225 & 8256 rf chips only support B,G,24N mode
207                         if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256))
208                         {
209                                 min_chan = 1;
210                                 max_chan = 14;
211                         }
212                         else
213                         {
214                                 RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
215                         }
216                         if (ChannelPlan[channel_plan].Len != 0){
217                                 // Clear old channel map
218                                 memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
219                                 // Set new channel map
220                                 for (i=0;i<ChannelPlan[channel_plan].Len;i++)
221                                 {
222                                         if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
223                                         break;
224                                         GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
225                                 }
226                         }
227                         break;
228                 }
229                 case COUNTRY_CODE_GLOBAL_DOMAIN:
230                 {
231                         GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
232                         Dot11d_Reset(ieee);
233                         ieee->bGlobalDomain = true;
234                         break;
235                 }
236                 default:
237                         break;
238         }
239         return;
240 }
241
242
243 #define         rx_hal_is_cck_rate(_pdrvinfo)\
244                         (_pdrvinfo->RxRate == DESC90_RATE1M ||\
245                         _pdrvinfo->RxRate == DESC90_RATE2M ||\
246                         _pdrvinfo->RxRate == DESC90_RATE5_5M ||\
247                         _pdrvinfo->RxRate == DESC90_RATE11M) &&\
248                         !_pdrvinfo->RxHT\
249
250
251 void CamResetAllEntry(struct net_device *dev)
252 {
253         u32 ulcommand = 0;
254         //2004/02/11  In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
255         // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
256         // In this condition, Cam can not be reset because upper layer will not set this static key again.
257         //if(Adapter->EncAlgorithm == WEP_Encryption)
258         //      return;
259 //debug
260         //DbgPrint("========================================\n");
261         //DbgPrint("                            Call ResetAllEntry                                              \n");
262         //DbgPrint("========================================\n\n");
263         ulcommand |= BIT31|BIT30;
264         write_nic_dword(dev, RWCAM, ulcommand);
265
266 }
267
268
269 void write_cam(struct net_device *dev, u8 addr, u32 data)
270 {
271         write_nic_dword(dev, WCAMI, data);
272         write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
273 }
274
275 u32 read_cam(struct net_device *dev, u8 addr)
276 {
277         write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
278         return read_nic_dword(dev, 0xa8);
279 }
280
281 void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
282 {
283         int status;
284         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
285         struct usb_device *udev = priv->udev;
286
287         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
288                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
289                                indx|0xfe00, 0, &data, 1, HZ / 2);
290
291         if (status < 0)
292         {
293                 printk("write_nic_byte_E TimeOut! status:%d\n", status);
294         }
295 }
296
297 u8 read_nic_byte_E(struct net_device *dev, int indx)
298 {
299         int status;
300         u8 data;
301         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
302         struct usb_device *udev = priv->udev;
303
304         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
305                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
306                                indx|0xfe00, 0, &data, 1, HZ / 2);
307
308         if (status < 0)
309         {
310                 printk("read_nic_byte_E TimeOut! status:%d\n", status);
311         }
312
313         return data;
314 }
315 //as 92U has extend page from 4 to 16, so modify functions below.
316 void write_nic_byte(struct net_device *dev, int indx, u8 data)
317 {
318         int status;
319
320         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
321         struct usb_device *udev = priv->udev;
322
323         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
324                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
325                                (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
326
327         if (status < 0)
328         {
329                 printk("write_nic_byte TimeOut! status:%d\n", status);
330         }
331
332
333 }
334
335
336 void write_nic_word(struct net_device *dev, int indx, u16 data)
337 {
338
339         int status;
340
341         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
342         struct usb_device *udev = priv->udev;
343
344         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
345                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
346                                (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 2, HZ / 2);
347
348         if (status < 0)
349         {
350                 printk("write_nic_word TimeOut! status:%d\n", status);
351         }
352
353 }
354
355
356 void write_nic_dword(struct net_device *dev, int indx, u32 data)
357 {
358
359         int status;
360
361         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
362         struct usb_device *udev = priv->udev;
363
364         status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
365                                RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
366                                (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 4, HZ / 2);
367
368
369         if (status < 0)
370         {
371                 printk("write_nic_dword TimeOut! status:%d\n", status);
372         }
373
374 }
375
376
377
378 u8 read_nic_byte(struct net_device *dev, int indx)
379 {
380         u8 data;
381         int status;
382         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
383         struct usb_device *udev = priv->udev;
384
385         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
386                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
387                                (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
388
389         if (status < 0)
390         {
391                 printk("read_nic_byte TimeOut! status:%d\n", status);
392         }
393
394         return data;
395 }
396
397
398
399 u16 read_nic_word(struct net_device *dev, int indx)
400 {
401         u16 data;
402         int status;
403         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
404         struct usb_device *udev = priv->udev;
405
406         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
407                                        RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
408                                        (indx&0xff)|0xff00, (indx>>8)&0x0f,
409                                                         &data, 2, HZ / 2);
410
411         if (status < 0)
412                 printk("read_nic_word TimeOut! status:%d\n", status);
413
414         return data;
415 }
416
417 u16 read_nic_word_E(struct net_device *dev, int indx)
418 {
419         u16 data;
420         int status;
421         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
422         struct usb_device *udev = priv->udev;
423
424         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
425                                RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
426                                        indx|0xfe00, 0, &data, 2, HZ / 2);
427
428         if (status < 0)
429                 printk("read_nic_word TimeOut! status:%d\n", status);
430
431         return data;
432 }
433
434 u32 read_nic_dword(struct net_device *dev, int indx)
435 {
436         u32 data;
437         int status;
438         /* int result; */
439
440         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
441         struct usb_device *udev = priv->udev;
442
443         status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
444                                        RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
445                                         (indx&0xff)|0xff00, (indx>>8)&0x0f,
446                                                         &data, 4, HZ / 2);
447         /* if(0 != result) {
448          *      printk(KERN_WARNING "read size of data = %d\, date = %d\n",
449          *                                                       result, data);
450          * }
451          */
452
453         if (status < 0)
454                 printk("read_nic_dword TimeOut! status:%d\n", status);
455
456         return data;
457 }
458
459 /* u8 read_phy_cck(struct net_device *dev, u8 adr); */
460 /* u8 read_phy_ofdm(struct net_device *dev, u8 adr); */
461 /* this might still called in what was the PHY rtl8185/rtl8192 common code
462  * plans are to possibility turn it again in one common code...
463  */
464 inline void force_pci_posting(struct net_device *dev)
465 {
466 }
467
468 static struct net_device_stats *rtl8192_stats(struct net_device *dev);
469 void rtl8192_commit(struct net_device *dev);
470 /* void rtl8192_restart(struct net_device *dev); */
471 void rtl8192_restart(struct work_struct *work);
472 /* void rtl8192_rq_tx_ack(struct work_struct *work); */
473 void watch_dog_timer_callback(unsigned long data);
474
475 /****************************************************************************
476  *   -----------------------------PROCFS STUFF-------------------------
477 *****************************************************************************
478  */
479
480 static struct proc_dir_entry *rtl8192_proc;
481
482 static int proc_get_stats_ap(char *page, char **start, off_t offset, int count,
483                                                         int *eof, void *data)
484 {
485         struct net_device *dev = data;
486         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
487         struct ieee80211_device *ieee = priv->ieee80211;
488         struct ieee80211_network *target;
489
490         int len = 0;
491
492         list_for_each_entry(target, &ieee->network_list, list) {
493
494                 len += snprintf(page + len, count - len, "%s ", target->ssid);
495
496                 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
497                         len += snprintf(page + len, count - len, "WPA\n");
498                 else
499                         len += snprintf(page + len, count - len, "non_WPA\n");
500         }
501
502         *eof = 1;
503         return len;
504 }
505
506 static int proc_get_registers(char *page, char **start,
507                           off_t offset, int count,
508                           int *eof, void *data)
509 {
510         struct net_device *dev = data;
511 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
512
513         int len = 0;
514         int i,n;
515
516         int max=0xff;
517
518         /* This dump the current register page */
519 len += snprintf(page + len, count - len,
520                         "\n####################page 0##################\n ");
521
522         for(n=0;n<=max;)
523         {
524                 //printk( "\nD: %2x> ", n);
525                 len += snprintf(page + len, count - len,
526                         "\nD:  %2x > ",n);
527
528                 for(i=0;i<16 && n<=max;i++,n++)
529                 len += snprintf(page + len, count - len,
530                         "%2x ",read_nic_byte(dev,0x000|n));
531
532                 //      printk("%2x ",read_nic_byte(dev,n));
533         }
534 len += snprintf(page + len, count - len,
535                         "\n####################page 1##################\n ");
536         for(n=0;n<=max;)
537         {
538                 //printk( "\nD: %2x> ", n);
539                 len += snprintf(page + len, count - len,
540                         "\nD:  %2x > ",n);
541
542                 for(i=0;i<16 && n<=max;i++,n++)
543                 len += snprintf(page + len, count - len,
544                         "%2x ",read_nic_byte(dev,0x100|n));
545
546                 //      printk("%2x ",read_nic_byte(dev,n));
547         }
548 len += snprintf(page + len, count - len,
549                         "\n####################page 3##################\n ");
550         for(n=0;n<=max;)
551         {
552                 //printk( "\nD: %2x> ", n);
553                 len += snprintf(page + len, count - len,
554                         "\nD:  %2x > ",n);
555
556                 for(i=0;i<16 && n<=max;i++,n++)
557                 len += snprintf(page + len, count - len,
558                         "%2x ",read_nic_byte(dev,0x300|n));
559
560                 //      printk("%2x ",read_nic_byte(dev,n));
561         }
562
563
564         len += snprintf(page + len, count - len,"\n");
565         *eof = 1;
566         return len;
567
568 }
569
570
571
572
573
574 static int proc_get_stats_tx(char *page, char **start,
575                           off_t offset, int count,
576                           int *eof, void *data)
577 {
578         struct net_device *dev = data;
579         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
580
581         int len = 0;
582
583         len += snprintf(page + len, count - len,
584                 "TX VI priority ok int: %lu\n"
585                 "TX VI priority error int: %lu\n"
586                 "TX VO priority ok int: %lu\n"
587                 "TX VO priority error int: %lu\n"
588                 "TX BE priority ok int: %lu\n"
589                 "TX BE priority error int: %lu\n"
590                 "TX BK priority ok int: %lu\n"
591                 "TX BK priority error int: %lu\n"
592                 "TX MANAGE priority ok int: %lu\n"
593                 "TX MANAGE priority error int: %lu\n"
594                 "TX BEACON priority ok int: %lu\n"
595                 "TX BEACON priority error int: %lu\n"
596 //              "TX high priority ok int: %lu\n"
597 //              "TX high priority failed error int: %lu\n"
598                 "TX queue resume: %lu\n"
599                 "TX queue stopped?: %d\n"
600                 "TX fifo overflow: %lu\n"
601 //              "TX beacon: %lu\n"
602                 "TX VI queue: %d\n"
603                 "TX VO queue: %d\n"
604                 "TX BE queue: %d\n"
605                 "TX BK queue: %d\n"
606 //              "TX HW queue: %d\n"
607                 "TX VI dropped: %lu\n"
608                 "TX VO dropped: %lu\n"
609                 "TX BE dropped: %lu\n"
610                 "TX BK dropped: %lu\n"
611                 "TX total data packets %lu\n",
612 //              "TX beacon aborted: %lu\n",
613                 priv->stats.txviokint,
614                 priv->stats.txvierr,
615                 priv->stats.txvookint,
616                 priv->stats.txvoerr,
617                 priv->stats.txbeokint,
618                 priv->stats.txbeerr,
619                 priv->stats.txbkokint,
620                 priv->stats.txbkerr,
621                 priv->stats.txmanageokint,
622                 priv->stats.txmanageerr,
623                 priv->stats.txbeaconokint,
624                 priv->stats.txbeaconerr,
625 //              priv->stats.txhpokint,
626 //              priv->stats.txhperr,
627                 priv->stats.txresumed,
628                 netif_queue_stopped(dev),
629                 priv->stats.txoverflow,
630 //              priv->stats.txbeacon,
631                 atomic_read(&(priv->tx_pending[VI_PRIORITY])),
632                 atomic_read(&(priv->tx_pending[VO_PRIORITY])),
633                 atomic_read(&(priv->tx_pending[BE_PRIORITY])),
634                 atomic_read(&(priv->tx_pending[BK_PRIORITY])),
635 //              read_nic_byte(dev, TXFIFOCOUNT),
636                 priv->stats.txvidrop,
637                 priv->stats.txvodrop,
638                 priv->stats.txbedrop,
639                 priv->stats.txbkdrop,
640                 priv->stats.txdatapkt
641 //              priv->stats.txbeaconerr
642                 );
643
644         *eof = 1;
645         return len;
646 }
647
648
649
650 static int proc_get_stats_rx(char *page, char **start,
651                           off_t offset, int count,
652                           int *eof, void *data)
653 {
654         struct net_device *dev = data;
655         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
656
657         int len = 0;
658
659         len += snprintf(page + len, count - len,
660                 "RX packets: %lu\n"
661                 "RX urb status error: %lu\n"
662                 "RX invalid urb error: %lu\n",
663                 priv->stats.rxoktotal,
664                 priv->stats.rxstaterr,
665                 priv->stats.rxurberr);
666
667         *eof = 1;
668         return len;
669 }
670 void rtl8192_proc_module_init(void)
671 {
672         RT_TRACE(COMP_INIT, "Initializing proc filesystem");
673         rtl8192_proc = proc_mkdir(RTL819xU_MODULE_NAME, init_net.proc_net);
674 }
675
676
677 void rtl8192_proc_module_remove(void)
678 {
679         remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
680 }
681
682
683 void rtl8192_proc_remove_one(struct net_device *dev)
684 {
685         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
686
687
688         if (priv->dir_dev) {
689         //      remove_proc_entry("stats-hw", priv->dir_dev);
690                 remove_proc_entry("stats-tx", priv->dir_dev);
691                 remove_proc_entry("stats-rx", priv->dir_dev);
692         //      remove_proc_entry("stats-ieee", priv->dir_dev);
693                 remove_proc_entry("stats-ap", priv->dir_dev);
694                 remove_proc_entry("registers", priv->dir_dev);
695         //      remove_proc_entry("cck-registers",priv->dir_dev);
696         //      remove_proc_entry("ofdm-registers",priv->dir_dev);
697                 //remove_proc_entry(dev->name, rtl8192_proc);
698                 remove_proc_entry("wlan0", rtl8192_proc);
699                 priv->dir_dev = NULL;
700         }
701 }
702
703
704 void rtl8192_proc_init_one(struct net_device *dev)
705 {
706         struct proc_dir_entry *e;
707         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
708         priv->dir_dev = proc_mkdir(dev->name, rtl8192_proc);
709         if (!priv->dir_dev) {
710                 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
711                       dev->name);
712                 return;
713         }
714         e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
715                                    priv->dir_dev, proc_get_stats_rx, dev);
716
717         if (!e) {
718                 RT_TRACE(COMP_ERR,"Unable to initialize "
719                       "/proc/net/rtl8192/%s/stats-rx\n",
720                       dev->name);
721         }
722
723
724         e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
725                                    priv->dir_dev, proc_get_stats_tx, dev);
726
727         if (!e) {
728                 RT_TRACE(COMP_ERR, "Unable to initialize "
729                       "/proc/net/rtl8192/%s/stats-tx\n",
730                       dev->name);
731         }
732
733         e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
734                                    priv->dir_dev, proc_get_stats_ap, dev);
735
736         if (!e) {
737                 RT_TRACE(COMP_ERR, "Unable to initialize "
738                       "/proc/net/rtl8192/%s/stats-ap\n",
739                       dev->name);
740         }
741
742         e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
743                                    priv->dir_dev, proc_get_registers, dev);
744         if (!e) {
745                 RT_TRACE(COMP_ERR, "Unable to initialize "
746                       "/proc/net/rtl8192/%s/registers\n",
747                       dev->name);
748         }
749 }
750 /****************************************************************************
751    -----------------------------MISC STUFF-------------------------
752 *****************************************************************************/
753
754 /* this is only for debugging */
755 void print_buffer(u32 *buffer, int len)
756 {
757         int i;
758         u8 *buf =(u8*)buffer;
759
760         printk("ASCII BUFFER DUMP (len: %x):\n",len);
761
762         for(i=0;i<len;i++)
763                 printk("%c",buf[i]);
764
765         printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
766
767         for(i=0;i<len;i++)
768                 printk("%x",buf[i]);
769
770         printk("\n");
771 }
772
773 //short check_nic_enough_desc(struct net_device *dev, priority_t priority)
774 short check_nic_enough_desc(struct net_device *dev,int queue_index)
775 {
776         struct r8192_priv *priv = ieee80211_priv(dev);
777         int used = atomic_read(&priv->tx_pending[queue_index]);
778
779         return (used < MAX_TX_URB);
780 }
781
782 void tx_timeout(struct net_device *dev)
783 {
784         struct r8192_priv *priv = ieee80211_priv(dev);
785         //rtl8192_commit(dev);
786
787         schedule_work(&priv->reset_wq);
788         //DMESG("TXTIMEOUT");
789 }
790
791
792 /* this is only for debug */
793 void dump_eprom(struct net_device *dev)
794 {
795         int i;
796         for(i=0; i<63; i++)
797                 RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev,i));
798 }
799
800 /* this is only for debug */
801 void rtl8192_dump_reg(struct net_device *dev)
802 {
803         int i;
804         int n;
805         int max=0x1ff;
806
807         RT_TRACE(COMP_PHY, "Dumping NIC register map");
808
809         for(n=0;n<=max;)
810         {
811                 printk( "\nD: %2x> ", n);
812                 for(i=0;i<16 && n<=max;i++,n++)
813                         printk("%2x ",read_nic_byte(dev,n));
814         }
815         printk("\n");
816 }
817
818 /****************************************************************************
819       ------------------------------HW STUFF---------------------------
820 *****************************************************************************/
821
822
823 void rtl8192_set_mode(struct net_device *dev,int mode)
824 {
825         u8 ecmd;
826         ecmd=read_nic_byte(dev, EPROM_CMD);
827         ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
828         ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
829         ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
830         ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
831         write_nic_byte(dev, EPROM_CMD, ecmd);
832 }
833
834
835 void rtl8192_update_msr(struct net_device *dev)
836 {
837         struct r8192_priv *priv = ieee80211_priv(dev);
838         u8 msr;
839
840         msr  = read_nic_byte(dev, MSR);
841         msr &= ~ MSR_LINK_MASK;
842
843         /* do not change in link_state != WLAN_LINK_ASSOCIATED.
844          * msr must be updated if the state is ASSOCIATING.
845          * this is intentional and make sense for ad-hoc and
846          * master (see the create BSS/IBSS func)
847          */
848         if (priv->ieee80211->state == IEEE80211_LINKED){
849
850                 if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
851                         msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
852                 else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
853                         msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
854                 else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
855                         msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
856
857         }else
858                 msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
859
860         write_nic_byte(dev, MSR, msr);
861 }
862
863 void rtl8192_set_chan(struct net_device *dev,short ch)
864 {
865         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
866 //      u32 tx;
867         RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
868         priv->chan=ch;
869
870         /* this hack should avoid frame TX during channel setting*/
871
872
873 //      tx = read_nic_dword(dev,TX_CONF);
874 //      tx &= ~TX_LOOPBACK_MASK;
875
876 #ifndef LOOP_TEST
877 //      write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
878
879         //need to implement rf set channel here WB
880
881         if (priv->rf_set_chan)
882         priv->rf_set_chan(dev,priv->chan);
883         mdelay(10);
884 //      write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
885 #endif
886 }
887
888 static void rtl8192_rx_isr(struct urb *urb);
889 //static void rtl8192_rx_isr(struct urb *rx_urb);
890
891 u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
892 {
893
894 #ifdef USB_RX_AGGREGATION_SUPPORT
895         if (pstats->bisrxaggrsubframe)
896                 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
897                         + pstats->RxBufShift + 8);
898         else
899 #endif
900                 return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
901                                 + pstats->RxBufShift);
902
903 }
904 static int rtl8192_rx_initiate(struct net_device*dev)
905 {
906         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
907         struct urb *entry;
908         struct sk_buff *skb;
909         struct rtl8192_rx_info *info;
910
911         /* nomal packet rx procedure */
912         while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
913                 skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
914                 if (!skb)
915                         break;
916                 entry = usb_alloc_urb(0, GFP_KERNEL);
917                 if (!entry) {
918                         kfree_skb(skb);
919                         break;
920                 }
921 //              printk("nomal packet IN request!\n");
922                 usb_fill_bulk_urb(entry, priv->udev,
923                                   usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
924                                   RX_URB_SIZE, rtl8192_rx_isr, skb);
925                 info = (struct rtl8192_rx_info *) skb->cb;
926                 info->urb = entry;
927                 info->dev = dev;
928                 info->out_pipe = 3; //denote rx normal packet queue
929                 skb_queue_tail(&priv->rx_queue, skb);
930                 usb_submit_urb(entry, GFP_KERNEL);
931         }
932
933         /* command packet rx procedure */
934         while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
935 //              printk("command packet IN request!\n");
936                 skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
937                 if (!skb)
938                         break;
939                 entry = usb_alloc_urb(0, GFP_KERNEL);
940                 if (!entry) {
941                         kfree_skb(skb);
942                         break;
943                 }
944                 usb_fill_bulk_urb(entry, priv->udev,
945                                   usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
946                                   RX_URB_SIZE, rtl8192_rx_isr, skb);
947                 info = (struct rtl8192_rx_info *) skb->cb;
948                 info->urb = entry;
949                 info->dev = dev;
950                    info->out_pipe = 9; //denote rx cmd packet queue
951                 skb_queue_tail(&priv->rx_queue, skb);
952                 usb_submit_urb(entry, GFP_KERNEL);
953         }
954
955         return 0;
956 }
957
958 void rtl8192_set_rxconf(struct net_device *dev)
959 {
960         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
961         u32 rxconf;
962
963         rxconf=read_nic_dword(dev,RCR);
964         rxconf = rxconf &~ MAC_FILTER_MASK;
965         rxconf = rxconf | RCR_AMF;
966         rxconf = rxconf | RCR_ADF;
967         rxconf = rxconf | RCR_AB;
968         rxconf = rxconf | RCR_AM;
969         //rxconf = rxconf | RCR_ACF;
970
971         if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
972
973         if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
974            dev->flags & IFF_PROMISC){
975                 rxconf = rxconf | RCR_AAP;
976         } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
977                 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
978                 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
979         }*/else{
980                 rxconf = rxconf | RCR_APM;
981                 rxconf = rxconf | RCR_CBSSID;
982         }
983
984
985         if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
986                 rxconf = rxconf | RCR_AICV;
987                 rxconf = rxconf | RCR_APWRMGT;
988         }
989
990         if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
991                 rxconf = rxconf | RCR_ACRC32;
992
993
994         rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
995         rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
996         rxconf = rxconf &~ MAX_RX_DMA_MASK;
997         rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
998
999 //      rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
1000         rxconf = rxconf | RCR_ONLYERLPKT;
1001
1002 //      rxconf = rxconf &~ RCR_CS_MASK;
1003 //      rxconf = rxconf | (1<<RCR_CS_SHIFT);
1004
1005         write_nic_dword(dev, RCR, rxconf);
1006
1007         #ifdef DEBUG_RX
1008         DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
1009         #endif
1010 }
1011 //wait to be removed
1012 void rtl8192_rx_enable(struct net_device *dev)
1013 {
1014         //u8 cmd;
1015
1016         //struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1017
1018         rtl8192_rx_initiate(dev);
1019
1020 //      rtl8192_set_rxconf(dev);
1021 }
1022
1023
1024 void rtl8192_tx_enable(struct net_device *dev)
1025 {
1026 }
1027
1028
1029
1030 void rtl8192_rtx_disable(struct net_device *dev)
1031 {
1032         u8 cmd;
1033         struct r8192_priv *priv = ieee80211_priv(dev);
1034         struct sk_buff *skb;
1035         struct rtl8192_rx_info *info;
1036
1037         cmd=read_nic_byte(dev,CMDR);
1038         write_nic_byte(dev, CMDR, cmd &~ \
1039                 (CR_TE|CR_RE));
1040         force_pci_posting(dev);
1041         mdelay(10);
1042
1043         while ((skb = __skb_dequeue(&priv->rx_queue))) {
1044                 info = (struct rtl8192_rx_info *) skb->cb;
1045                 if (!info->urb)
1046                         continue;
1047
1048                 usb_kill_urb(info->urb);
1049                 kfree_skb(skb);
1050         }
1051
1052         if (skb_queue_len(&priv->skb_queue)) {
1053                 printk(KERN_WARNING "skb_queue not empty\n");
1054         }
1055
1056         skb_queue_purge(&priv->skb_queue);
1057         return;
1058 }
1059
1060
1061 int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
1062 {
1063         return 0;
1064 }
1065
1066 inline u16 ieeerate2rtlrate(int rate)
1067 {
1068         switch(rate){
1069         case 10:
1070         return 0;
1071         case 20:
1072         return 1;
1073         case 55:
1074         return 2;
1075         case 110:
1076         return 3;
1077         case 60:
1078         return 4;
1079         case 90:
1080         return 5;
1081         case 120:
1082         return 6;
1083         case 180:
1084         return 7;
1085         case 240:
1086         return 8;
1087         case 360:
1088         return 9;
1089         case 480:
1090         return 10;
1091         case 540:
1092         return 11;
1093         default:
1094         return 3;
1095
1096         }
1097 }
1098 static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
1099 inline u16 rtl8192_rate2rate(short rate)
1100 {
1101         if (rate >11) return 0;
1102         return rtl_rate[rate];
1103 }
1104
1105
1106 /* The prototype of rx_isr has changed since one version of Linux Kernel */
1107 static void rtl8192_rx_isr(struct urb *urb)
1108 {
1109         struct sk_buff *skb = (struct sk_buff *) urb->context;
1110         struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1111         struct net_device *dev = info->dev;
1112         struct r8192_priv *priv = ieee80211_priv(dev);
1113         int out_pipe = info->out_pipe;
1114         int err;
1115         if(!priv->up)
1116                 return;
1117         if (unlikely(urb->status)) {
1118                 info->urb = NULL;
1119                 priv->stats.rxstaterr++;
1120                 priv->ieee80211->stats.rx_errors++;
1121                 usb_free_urb(urb);
1122         //      printk("%s():rx status err\n",__FUNCTION__);
1123                 return;
1124         }
1125         skb_unlink(skb, &priv->rx_queue);
1126         skb_put(skb, urb->actual_length);
1127
1128         skb_queue_tail(&priv->skb_queue, skb);
1129         tasklet_schedule(&priv->irq_rx_tasklet);
1130
1131         skb = dev_alloc_skb(RX_URB_SIZE);
1132         if (unlikely(!skb)) {
1133                 usb_free_urb(urb);
1134                 printk("%s():can,t alloc skb\n",__FUNCTION__);
1135                 /* TODO check rx queue length and refill *somewhere* */
1136                 return;
1137         }
1138
1139         usb_fill_bulk_urb(urb, priv->udev,
1140                         usb_rcvbulkpipe(priv->udev, out_pipe), skb_tail_pointer(skb),
1141                         RX_URB_SIZE, rtl8192_rx_isr, skb);
1142
1143         info = (struct rtl8192_rx_info *) skb->cb;
1144         info->urb = urb;
1145         info->dev = dev;
1146         info->out_pipe = out_pipe;
1147
1148         urb->transfer_buffer = skb_tail_pointer(skb);
1149         urb->context = skb;
1150         skb_queue_tail(&priv->rx_queue, skb);
1151         err = usb_submit_urb(urb, GFP_ATOMIC);
1152         if(err && err != EPERM)
1153                 printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
1154 }
1155
1156 u32
1157 rtl819xusb_rx_command_packet(
1158         struct net_device *dev,
1159         struct ieee80211_rx_stats *pstats
1160         )
1161 {
1162         u32     status;
1163
1164         //RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
1165
1166         status = cmpk_message_handle_rx(dev, pstats);
1167         if (status)
1168         {
1169                 DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
1170         }
1171         else
1172         {
1173                 //RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
1174         }
1175
1176         //RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
1177         return status;
1178 }
1179
1180
1181 void rtl8192_data_hard_stop(struct net_device *dev)
1182 {
1183         //FIXME !!
1184 }
1185
1186
1187 void rtl8192_data_hard_resume(struct net_device *dev)
1188 {
1189         // FIXME !!
1190 }
1191
1192 /* this function TX data frames when the ieee80211 stack requires this.
1193  * It checks also if we need to stop the ieee tx queue, eventually do it
1194  */
1195 void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
1196 {
1197         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1198         int ret;
1199         unsigned long flags;
1200         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1201         u8 queue_index = tcb_desc->queue_index;
1202
1203         /* shall not be referred by command packet */
1204         assert(queue_index != TXCMD_QUEUE);
1205
1206         spin_lock_irqsave(&priv->tx_lock,flags);
1207
1208         memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1209 //      tcb_desc->RATRIndex = 7;
1210 //      tcb_desc->bTxDisableRateFallBack = 1;
1211 //      tcb_desc->bTxUseDriverAssingedRate = 1;
1212         tcb_desc->bTxEnableFwCalcDur = 1;
1213         skb_push(skb, priv->ieee80211->tx_headroom);
1214         ret = rtl8192_tx(dev, skb);
1215
1216         //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1217         //priv->ieee80211->stats.tx_packets++;
1218
1219         spin_unlock_irqrestore(&priv->tx_lock,flags);
1220
1221 //      return ret;
1222         return;
1223 }
1224
1225 /* This is a rough attempt to TX a frame
1226  * This is called by the ieee 80211 stack to TX management frames.
1227  * If the ring is full packet are dropped (for data frame the queue
1228  * is stopped before this can happen).
1229  */
1230 int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
1231 {
1232         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
1233         int ret;
1234         unsigned long flags;
1235         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1236         u8 queue_index = tcb_desc->queue_index;
1237
1238
1239         spin_lock_irqsave(&priv->tx_lock,flags);
1240
1241         memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
1242         if(queue_index == TXCMD_QUEUE) {
1243                 skb_push(skb, USB_HWDESC_HEADER_LEN);
1244                 rtl819xU_tx_cmd(dev, skb);
1245                 ret = 1;
1246                 spin_unlock_irqrestore(&priv->tx_lock,flags);
1247                 return ret;
1248         } else {
1249                 skb_push(skb, priv->ieee80211->tx_headroom);
1250                 ret = rtl8192_tx(dev, skb);
1251         }
1252
1253         spin_unlock_irqrestore(&priv->tx_lock,flags);
1254
1255         return ret;
1256 }
1257
1258
1259 void rtl8192_try_wake_queue(struct net_device *dev, int pri);
1260
1261 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1262 u16 DrvAggr_PaddingAdd(struct net_device *dev, struct sk_buff *skb)
1263 {
1264         u16     PaddingNum =  256 - ((skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES) % 256);
1265         return  (PaddingNum&0xff);
1266 }
1267
1268 u8 MRateToHwRate8190Pci(u8 rate);
1269 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc);
1270 u8 MapHwQueueToFirmwareQueue(u8 QueueID);
1271 struct sk_buff *DrvAggr_Aggregation(struct net_device *dev, struct ieee80211_drv_agg_txb *pSendList)
1272 {
1273         struct ieee80211_device *ieee = netdev_priv(dev);
1274         struct r8192_priv *priv = ieee80211_priv(dev);
1275         cb_desc         *tcb_desc = NULL;
1276         u8              i;
1277         u32             TotalLength;
1278         struct sk_buff  *skb;
1279         struct sk_buff  *agg_skb;
1280         tx_desc_819x_usb_aggr_subframe *tx_agg_desc = NULL;
1281         tx_fwinfo_819x_usb             *tx_fwinfo = NULL;
1282
1283         //
1284         // Local variable initialization.
1285         //
1286         /* first skb initialization */
1287         skb = pSendList->tx_agg_frames[0];
1288         TotalLength = skb->len;
1289
1290         /* Get the total aggregation length including the padding space and
1291          * sub frame header.
1292          */
1293         for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1294                 TotalLength += DrvAggr_PaddingAdd(dev, skb);
1295                 skb = pSendList->tx_agg_frames[i];
1296                 TotalLength += (skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1297         }
1298
1299         /* allocate skb to contain the aggregated packets */
1300         agg_skb = dev_alloc_skb(TotalLength + ieee->tx_headroom);
1301         memset(agg_skb->data, 0, agg_skb->len);
1302         skb_reserve(agg_skb, ieee->tx_headroom);
1303
1304 //      RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
1305         /* reserve info for first subframe Tx descriptor to be set in the tx function */
1306         skb = pSendList->tx_agg_frames[0];
1307         tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1308         tcb_desc->drv_agg_enable = 1;
1309         tcb_desc->pkt_size = skb->len;
1310         tcb_desc->DrvAggrNum = pSendList->nr_drv_agg_frames;
1311         printk("DrvAggNum = %d\n", tcb_desc->DrvAggrNum);
1312 //      RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
1313 //      printk("========>skb->data ======> \n");
1314 //      RT_DEBUG_DATA(COMP_SEND, skb->data, skb->len);
1315         memcpy(agg_skb->cb, skb->cb, sizeof(skb->cb));
1316         memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
1317
1318         for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
1319                 /* push the next sub frame to be 256 byte aline */
1320                 skb_put(agg_skb,DrvAggr_PaddingAdd(dev,skb));
1321
1322                 /* Subframe drv Tx descriptor and firmware info setting */
1323                 skb = pSendList->tx_agg_frames[i];
1324                 tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1325                 tx_agg_desc = (tx_desc_819x_usb_aggr_subframe *)agg_skb->tail;
1326                 tx_fwinfo = (tx_fwinfo_819x_usb *)(agg_skb->tail + sizeof(tx_desc_819x_usb_aggr_subframe));
1327
1328                 memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
1329                 /* DWORD 0 */
1330                 tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
1331                 tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
1332                 tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
1333                 tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
1334                 if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
1335                         tx_fwinfo->AllowAggregation = 1;
1336                         /* DWORD 1 */
1337                         tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
1338                         tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
1339                 } else {
1340                         tx_fwinfo->AllowAggregation = 0;
1341                         /* DWORD 1 */
1342                         tx_fwinfo->RxMF = 0;
1343                         tx_fwinfo->RxAMD = 0;
1344                 }
1345
1346                 /* Protection mode related */
1347                 tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
1348                 tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
1349                 tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
1350                 tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
1351                 tx_fwinfo->RtsRate =  MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
1352                 tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
1353                 tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
1354                 tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
1355                                       (tcb_desc->bRTSUseShortGI?1:0);
1356
1357                 /* Set Bandwidth and sub-channel settings. */
1358                 if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
1359                 {
1360                         if(tcb_desc->bPacketBW) {
1361                                 tx_fwinfo->TxBandwidth = 1;
1362                                 tx_fwinfo->TxSubCarrier = 0;    //By SD3's Jerry suggestion, use duplicated mode
1363                         } else {
1364                                 tx_fwinfo->TxBandwidth = 0;
1365                                 tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
1366                         }
1367                 } else {
1368                         tx_fwinfo->TxBandwidth = 0;
1369                         tx_fwinfo->TxSubCarrier = 0;
1370                 }
1371
1372                 /* Fill Tx descriptor */
1373                 memset(tx_agg_desc, 0, sizeof(tx_desc_819x_usb_aggr_subframe));
1374                 /* DWORD 0 */
1375                 //tx_agg_desc->LINIP = 0;
1376                 //tx_agg_desc->CmdInit = 1;
1377                 tx_agg_desc->Offset =  sizeof(tx_fwinfo_819x_usb) + 8;
1378                 /* already raw data, need not to subtract header length */
1379                 tx_agg_desc->PktSize = skb->len & 0xffff;
1380
1381                 /*DWORD 1*/
1382                 tx_agg_desc->SecCAMID= 0;
1383                 tx_agg_desc->RATid = tcb_desc->RATRIndex;
1384                 {
1385                         //MPDUOverhead = 0;
1386                         tx_agg_desc->NoEnc = 1;
1387                 }
1388                 tx_agg_desc->SecType = 0x0;
1389
1390                 if (tcb_desc->bHwSec) {
1391                         switch (priv->ieee80211->pairwise_key_type)
1392                         {
1393                                 case KEY_TYPE_WEP40:
1394                                 case KEY_TYPE_WEP104:
1395                                         tx_agg_desc->SecType = 0x1;
1396                                         tx_agg_desc->NoEnc = 0;
1397                                         break;
1398                                 case KEY_TYPE_TKIP:
1399                                         tx_agg_desc->SecType = 0x2;
1400                                         tx_agg_desc->NoEnc = 0;
1401                                         break;
1402                                 case KEY_TYPE_CCMP:
1403                                         tx_agg_desc->SecType = 0x3;
1404                                         tx_agg_desc->NoEnc = 0;
1405                                         break;
1406                                 case KEY_TYPE_NA:
1407                                         tx_agg_desc->SecType = 0x0;
1408                                         tx_agg_desc->NoEnc = 1;
1409                                         break;
1410                         }
1411                 }
1412
1413                 tx_agg_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
1414                 tx_agg_desc->TxFWInfoSize =  sizeof(tx_fwinfo_819x_usb);
1415
1416                 tx_agg_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
1417                 tx_agg_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
1418
1419                 tx_agg_desc->OWN = 1;
1420
1421                 //DWORD 2
1422                 /* According windows driver, it seems that there no need to fill this field */
1423                 //tx_agg_desc->TxBufferSize= (u32)(skb->len - USB_HWDESC_HEADER_LEN);
1424
1425                 /* to fill next packet */
1426                 skb_put(agg_skb,TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
1427                 memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
1428         }
1429
1430         for(i = 0; i < pSendList->nr_drv_agg_frames; i++) {
1431                 dev_kfree_skb_any(pSendList->tx_agg_frames[i]);
1432         }
1433
1434         return agg_skb;
1435 }
1436
1437 /* NOTE:
1438         This function return a list of PTCB which is proper to be aggregate with the input TCB.
1439         If no proper TCB is found to do aggregation, SendList will only contain the input TCB.
1440 */
1441 u8 DrvAggr_GetAggregatibleList(struct net_device *dev, struct sk_buff *skb,
1442                 struct ieee80211_drv_agg_txb *pSendList)
1443 {
1444         struct ieee80211_device *ieee = netdev_priv(dev);
1445         PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
1446         u16             nMaxAggrNum = pHTInfo->UsbTxAggrNum;
1447         cb_desc         *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1448         u8              QueueID = tcb_desc->queue_index;
1449
1450         do {
1451                 pSendList->tx_agg_frames[pSendList->nr_drv_agg_frames++] = skb;
1452                 if(pSendList->nr_drv_agg_frames >= nMaxAggrNum) {
1453                         break;
1454                 }
1455
1456         } while((skb = skb_dequeue(&ieee->skb_drv_aggQ[QueueID])));
1457
1458         RT_TRACE(COMP_AMSDU, "DrvAggr_GetAggregatibleList, nAggrTcbNum = %d \n", pSendList->nr_drv_agg_frames);
1459         return pSendList->nr_drv_agg_frames;
1460 }
1461 #endif
1462
1463 static void rtl8192_tx_isr(struct urb *tx_urb)
1464 {
1465         struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
1466         struct net_device *dev = NULL;
1467         struct r8192_priv *priv = NULL;
1468         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1469         u8  queue_index = tcb_desc->queue_index;
1470 //      bool bToSend0Byte;
1471 //      u16 BufLen = skb->len;
1472
1473         memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
1474         priv = ieee80211_priv(dev);
1475
1476         if(tcb_desc->queue_index != TXCMD_QUEUE) {
1477                 if(tx_urb->status == 0) {
1478                         dev->trans_start = jiffies;
1479                         // Act as station mode, destination shall be unicast address.
1480                         //priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
1481                         //priv->ieee80211->stats.tx_packets++;
1482                         priv->stats.txoktotal++;
1483                         priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
1484                         priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
1485                 } else {
1486                         priv->ieee80211->stats.tx_errors++;
1487                         //priv->stats.txmanageerr++;
1488                         /* TODO */
1489                 }
1490         }
1491
1492         /* free skb and tx_urb */
1493         if(skb != NULL) {
1494                 dev_kfree_skb_any(skb);
1495                 usb_free_urb(tx_urb);
1496                 atomic_dec(&priv->tx_pending[queue_index]);
1497         }
1498
1499         {
1500                 //
1501                 // Handle HW Beacon:
1502                 // We had transfer our beacon frame to host controller at this moment.
1503                 //
1504                 //
1505                 // Caution:
1506                 // Handling the wait queue of command packets.
1507                 // For Tx command packets, we must not do TCB fragment because it is not handled right now.
1508                 // We must cut the packets to match the size of TX_CMD_PKT before we send it.
1509                 //
1510
1511                 /* Handle MPDU in wait queue. */
1512                 if(queue_index != BEACON_QUEUE) {
1513                         /* Don't send data frame during scanning.*/
1514                         if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
1515                                         (!(priv->ieee80211->queue_stop))) {
1516                                 if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
1517                                         priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1518
1519                                 return; //modified by david to avoid further processing AMSDU
1520                         }
1521 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
1522                         else if ((skb_queue_len(&priv->ieee80211->skb_drv_aggQ[queue_index])!= 0)&&\
1523                                 (!(priv->ieee80211->queue_stop))) {
1524                                 // Tx Driver Aggregation process
1525                                 /* The driver will aggregation the packets according to the following stats
1526                                  * 1. check whether there's tx irq available, for it's a completion return
1527                                  *    function, it should contain enough tx irq;
1528                                  * 2. check packet type;
1529                                  * 3. initialize sendlist, check whether the to-be send packet no greater than 1
1530                                  * 4. aggregates the packets, and fill firmware info and tx desc into it, etc.
1531                                  * 5. check whether the packet could be sent, otherwise just insert into wait head
1532                                  * */
1533                                 skb = skb_dequeue(&priv->ieee80211->skb_drv_aggQ[queue_index]);
1534                                 if(!check_nic_enough_desc(dev, queue_index)) {
1535                                         skb_queue_head(&(priv->ieee80211->skb_drv_aggQ[queue_index]), skb);
1536                                         return;
1537                                 }
1538
1539                                 {
1540                                         /*TODO*/
1541                                         /*
1542                                         u8* pHeader = skb->data;
1543
1544                                         if(IsMgntQosData(pHeader) ||
1545                                             IsMgntQData_Ack(pHeader) ||
1546                                             IsMgntQData_Poll(pHeader) ||
1547                                             IsMgntQData_Poll_Ack(pHeader)
1548                                           )
1549                                         */
1550                                         {
1551                                                 struct ieee80211_drv_agg_txb SendList;
1552
1553                                                 memset(&SendList, 0, sizeof(struct ieee80211_drv_agg_txb));
1554                                                 if(DrvAggr_GetAggregatibleList(dev, skb, &SendList) > 1) {
1555                                                         skb = DrvAggr_Aggregation(dev, &SendList);
1556
1557                                                 }
1558                                         }
1559                                         priv->ieee80211->softmac_hard_start_xmit(skb, dev);
1560                                 }
1561                         }
1562 #endif
1563                 }
1564         }
1565
1566 }
1567
1568 void rtl8192_beacon_stop(struct net_device *dev)
1569 {
1570         u8 msr, msrm, msr2;
1571         struct r8192_priv *priv = ieee80211_priv(dev);
1572
1573         msr  = read_nic_byte(dev, MSR);
1574         msrm = msr & MSR_LINK_MASK;
1575         msr2 = msr & ~MSR_LINK_MASK;
1576
1577         if(NIC_8192U == priv->card_8192) {
1578                 usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
1579         }
1580         if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
1581                 (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
1582                 write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
1583                 write_nic_byte(dev, MSR, msr);
1584         }
1585 }
1586
1587 void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
1588 {
1589          struct r8192_priv *priv = ieee80211_priv(dev);
1590          struct ieee80211_network *net;
1591          u8 i=0, basic_rate = 0;
1592          net = & priv->ieee80211->current_network;
1593
1594          for (i=0; i<net->rates_len; i++)
1595          {
1596                  basic_rate = net->rates[i]&0x7f;
1597                  switch(basic_rate)
1598                  {
1599                          case MGN_1M:   *rate_config |= RRSR_1M;        break;
1600                          case MGN_2M:   *rate_config |= RRSR_2M;        break;
1601                          case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
1602                          case MGN_11M:  *rate_config |= RRSR_11M;       break;
1603                          case MGN_6M:   *rate_config |= RRSR_6M;        break;
1604                          case MGN_9M:   *rate_config |= RRSR_9M;        break;
1605                          case MGN_12M:  *rate_config |= RRSR_12M;       break;
1606                          case MGN_18M:  *rate_config |= RRSR_18M;       break;
1607                          case MGN_24M:  *rate_config |= RRSR_24M;       break;
1608                          case MGN_36M:  *rate_config |= RRSR_36M;       break;
1609                          case MGN_48M:  *rate_config |= RRSR_48M;       break;
1610                          case MGN_54M:  *rate_config |= RRSR_54M;       break;
1611                  }
1612          }
1613          for (i=0; i<net->rates_ex_len; i++)
1614          {
1615                  basic_rate = net->rates_ex[i]&0x7f;
1616                  switch(basic_rate)
1617                  {
1618                          case MGN_1M:   *rate_config |= RRSR_1M;        break;
1619                          case MGN_2M:   *rate_config |= RRSR_2M;        break;
1620                          case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
1621                          case MGN_11M:  *rate_config |= RRSR_11M;       break;
1622                          case MGN_6M:   *rate_config |= RRSR_6M;        break;
1623                          case MGN_9M:   *rate_config |= RRSR_9M;        break;
1624                          case MGN_12M:  *rate_config |= RRSR_12M;       break;
1625                          case MGN_18M:  *rate_config |= RRSR_18M;       break;
1626                          case MGN_24M:  *rate_config |= RRSR_24M;       break;
1627                          case MGN_36M:  *rate_config |= RRSR_36M;       break;
1628                          case MGN_48M:  *rate_config |= RRSR_48M;       break;
1629                          case MGN_54M:  *rate_config |= RRSR_54M;       break;
1630                  }
1631          }
1632 }
1633
1634
1635 #define SHORT_SLOT_TIME 9
1636 #define NON_SHORT_SLOT_TIME 20
1637
1638 void rtl8192_update_cap(struct net_device* dev, u16 cap)
1639 {
1640         u32 tmp = 0;
1641         struct r8192_priv *priv = ieee80211_priv(dev);
1642         struct ieee80211_network *net = &priv->ieee80211->current_network;
1643         priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
1644         tmp = priv->basic_rate;
1645         if (priv->short_preamble)
1646                 tmp |= BRSR_AckShortPmb;
1647         write_nic_dword(dev, RRSR, tmp);
1648
1649         if (net->mode & (IEEE_G|IEEE_N_24G))
1650         {
1651                 u8 slot_time = 0;
1652                 if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
1653                 {//short slot time
1654                         slot_time = SHORT_SLOT_TIME;
1655                 }
1656                 else //long slot time
1657                         slot_time = NON_SHORT_SLOT_TIME;
1658                 priv->slot_time = slot_time;
1659                 write_nic_byte(dev, SLOT_TIME, slot_time);
1660         }
1661
1662 }
1663 void rtl8192_net_update(struct net_device *dev)
1664 {
1665
1666         struct r8192_priv *priv = ieee80211_priv(dev);
1667         struct ieee80211_network *net;
1668         u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
1669         u16 rate_config = 0;
1670         net = & priv->ieee80211->current_network;
1671
1672         rtl8192_config_rate(dev, &rate_config);
1673         priv->basic_rate = rate_config &= 0x15f;
1674
1675         write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
1676         write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
1677         //for(i=0;i<ETH_ALEN;i++)
1678         //      write_nic_byte(dev,BSSID+i,net->bssid[i]);
1679
1680         rtl8192_update_msr(dev);
1681 //      rtl8192_update_cap(dev, net->capability);
1682         if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
1683         {
1684         write_nic_word(dev, ATIMWND, 2);
1685         write_nic_word(dev, BCN_DMATIME, 1023);
1686         write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
1687 //      write_nic_word(dev, BcnIntTime, 100);
1688         write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
1689         write_nic_byte(dev, BCN_ERR_THRESH, 100);
1690                 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
1691         // TODO: BcnIFS may required to be changed on ASIC
1692                 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
1693
1694         write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
1695         }
1696
1697
1698
1699 }
1700
1701 //temporary hw beacon is not used any more.
1702 //open it when necessary
1703 void rtl819xusb_beacon_tx(struct net_device *dev,u16  tx_rate)
1704 {
1705
1706 }
1707 inline u8 rtl8192_IsWirelessBMode(u16 rate)
1708 {
1709         if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
1710                 return 1;
1711         else return 0;
1712 }
1713
1714 u16 N_DBPSOfRate(u16 DataRate);
1715
1716 u16 ComputeTxTime(
1717         u16             FrameLength,
1718         u16             DataRate,
1719         u8              bManagementFrame,
1720         u8              bShortPreamble
1721 )
1722 {
1723         u16     FrameTime;
1724         u16     N_DBPS;
1725         u16     Ceiling;
1726
1727         if( rtl8192_IsWirelessBMode(DataRate) )
1728         {
1729                 if( bManagementFrame || !bShortPreamble || DataRate == 10 )
1730                 {       // long preamble
1731                         FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
1732                 }
1733                 else
1734                 {       // Short preamble
1735                         FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
1736                 }
1737                 if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
1738                                 FrameTime ++;
1739         } else {        //802.11g DSSS-OFDM PLCP length field calculation.
1740                 N_DBPS = N_DBPSOfRate(DataRate);
1741                 Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
1742                                 + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
1743                 FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
1744         }
1745         return FrameTime;
1746 }
1747
1748 u16 N_DBPSOfRate(u16 DataRate)
1749 {
1750          u16 N_DBPS = 24;
1751
1752          switch(DataRate)
1753          {
1754          case 60:
1755           N_DBPS = 24;
1756           break;
1757
1758          case 90:
1759           N_DBPS = 36;
1760           break;
1761
1762          case 120:
1763           N_DBPS = 48;
1764           break;
1765
1766          case 180:
1767           N_DBPS = 72;
1768           break;
1769
1770          case 240:
1771           N_DBPS = 96;
1772           break;
1773
1774          case 360:
1775           N_DBPS = 144;
1776           break;
1777
1778          case 480:
1779           N_DBPS = 192;
1780           break;
1781
1782          case 540:
1783           N_DBPS = 216;
1784           break;
1785
1786          default:
1787           break;
1788          }
1789
1790          return N_DBPS;
1791 }
1792
1793 void rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
1794 {
1795         usb_free_urb(tx_cmd_urb);
1796 }
1797
1798 unsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
1799
1800         if(tx_queue >= 9)
1801         {
1802                 RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
1803                 return 0x04;
1804         }
1805         return priv->txqueue_to_outpipemap[tx_queue];
1806 }
1807
1808 short rtl819xU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1809 {
1810         struct r8192_priv *priv = ieee80211_priv(dev);
1811         //u8                    *tx;
1812         int                     status;
1813         struct urb              *tx_urb;
1814         //int                   urb_buf_len;
1815         unsigned int            idx_pipe;
1816         tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
1817         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1818         u8 queue_index = tcb_desc->queue_index;
1819
1820         //printk("\n %s::queue_index = %d\n",__FUNCTION__, queue_index);
1821         atomic_inc(&priv->tx_pending[queue_index]);
1822         tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
1823         if(!tx_urb){
1824                 dev_kfree_skb(skb);
1825                 return -ENOMEM;
1826         }
1827
1828         memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
1829         /* Tx descriptor ought to be set according to the skb->cb */
1830         pdesc->FirstSeg = 1;//bFirstSeg;
1831         pdesc->LastSeg = 1;//bLastSeg;
1832         pdesc->CmdInit = tcb_desc->bCmdOrInit;
1833         pdesc->TxBufferSize = tcb_desc->txbuf_size;
1834         pdesc->OWN = 1;
1835         pdesc->LINIP = tcb_desc->bLastIniPkt;
1836
1837         //----------------------------------------------------------------------------
1838         // Fill up USB_OUT_CONTEXT.
1839         //----------------------------------------------------------------------------
1840         // Get index to out pipe from specified QueueID.
1841 #ifndef USE_ONE_PIPE
1842         idx_pipe = txqueue2outpipe(priv,queue_index);
1843 #else
1844         idx_pipe = 0x04;
1845 #endif
1846 #ifdef JOHN_DUMP_TXDESC
1847         int i;
1848         printk("<Tx descriptor>--rate %x---",rate);
1849         for (i = 0; i < 8; i++)
1850                 printk("%8x ", tx[i]);
1851         printk("\n");
1852 #endif
1853         usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,idx_pipe), \
1854                         skb->data, skb->len, rtl8192_tx_isr, skb);
1855
1856         status = usb_submit_urb(tx_urb, GFP_ATOMIC);
1857
1858         if (!status){
1859                 return 0;
1860         }else{
1861                 DMESGE("Error TX CMD URB, error %d",
1862                                 status);
1863                 return -1;
1864         }
1865 }
1866
1867 /*
1868  * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
1869  * in TxFwInfo data structure
1870  * 2006.10.30 by Emily
1871  *
1872  * \param QUEUEID       Software Queue
1873 */
1874 u8 MapHwQueueToFirmwareQueue(u8 QueueID)
1875 {
1876         u8 QueueSelect = 0x0;       //defualt set to
1877
1878         switch(QueueID) {
1879                 case BE_QUEUE:
1880                         QueueSelect = QSLT_BE;  //or QSelect = pTcb->priority;
1881                         break;
1882
1883                 case BK_QUEUE:
1884                         QueueSelect = QSLT_BK;  //or QSelect = pTcb->priority;
1885                         break;
1886
1887                 case VO_QUEUE:
1888                         QueueSelect = QSLT_VO;  //or QSelect = pTcb->priority;
1889                         break;
1890
1891                 case VI_QUEUE:
1892                         QueueSelect = QSLT_VI;  //or QSelect = pTcb->priority;
1893                         break;
1894                 case MGNT_QUEUE:
1895                         QueueSelect = QSLT_MGNT;
1896                         break;
1897
1898                 case BEACON_QUEUE:
1899                         QueueSelect = QSLT_BEACON;
1900                         break;
1901
1902                         // TODO: 2006.10.30 mark other queue selection until we verify it is OK
1903                         // TODO: Remove Assertions
1904 //#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
1905                 case TXCMD_QUEUE:
1906                         QueueSelect = QSLT_CMD;
1907                         break;
1908 //#endif
1909                 case HIGH_QUEUE:
1910                         QueueSelect = QSLT_HIGH;
1911                         break;
1912
1913                 default:
1914                         RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
1915                         break;
1916         }
1917         return QueueSelect;
1918 }
1919
1920 u8 MRateToHwRate8190Pci(u8 rate)
1921 {
1922         u8  ret = DESC90_RATE1M;
1923
1924         switch(rate) {
1925                 case MGN_1M:    ret = DESC90_RATE1M;    break;
1926                 case MGN_2M:    ret = DESC90_RATE2M;    break;
1927                 case MGN_5_5M:  ret = DESC90_RATE5_5M;  break;
1928                 case MGN_11M:   ret = DESC90_RATE11M;   break;
1929                 case MGN_6M:    ret = DESC90_RATE6M;    break;
1930                 case MGN_9M:    ret = DESC90_RATE9M;    break;
1931                 case MGN_12M:   ret = DESC90_RATE12M;   break;
1932                 case MGN_18M:   ret = DESC90_RATE18M;   break;
1933                 case MGN_24M:   ret = DESC90_RATE24M;   break;
1934                 case MGN_36M:   ret = DESC90_RATE36M;   break;
1935                 case MGN_48M:   ret = DESC90_RATE48M;   break;
1936                 case MGN_54M:   ret = DESC90_RATE54M;   break;
1937
1938                 // HT rate since here
1939                 case MGN_MCS0:  ret = DESC90_RATEMCS0;  break;
1940                 case MGN_MCS1:  ret = DESC90_RATEMCS1;  break;
1941                 case MGN_MCS2:  ret = DESC90_RATEMCS2;  break;
1942                 case MGN_MCS3:  ret = DESC90_RATEMCS3;  break;
1943                 case MGN_MCS4:  ret = DESC90_RATEMCS4;  break;
1944                 case MGN_MCS5:  ret = DESC90_RATEMCS5;  break;
1945                 case MGN_MCS6:  ret = DESC90_RATEMCS6;  break;
1946                 case MGN_MCS7:  ret = DESC90_RATEMCS7;  break;
1947                 case MGN_MCS8:  ret = DESC90_RATEMCS8;  break;
1948                 case MGN_MCS9:  ret = DESC90_RATEMCS9;  break;
1949                 case MGN_MCS10: ret = DESC90_RATEMCS10; break;
1950                 case MGN_MCS11: ret = DESC90_RATEMCS11; break;
1951                 case MGN_MCS12: ret = DESC90_RATEMCS12; break;
1952                 case MGN_MCS13: ret = DESC90_RATEMCS13; break;
1953                 case MGN_MCS14: ret = DESC90_RATEMCS14; break;
1954                 case MGN_MCS15: ret = DESC90_RATEMCS15; break;
1955                 case (0x80|0x20): ret = DESC90_RATEMCS32; break;
1956
1957                 default:       break;
1958         }
1959         return ret;
1960 }
1961
1962
1963 u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
1964 {
1965         u8   tmp_Short;
1966
1967         tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
1968
1969         if(TxHT==1 && TxRate != DESC90_RATEMCS15)
1970                 tmp_Short = 0;
1971
1972         return tmp_Short;
1973 }
1974
1975 static void tx_zero_isr(struct urb *tx_urb)
1976 {
1977         return;
1978 }
1979
1980 /*
1981  * The tx procedure is just as following,
1982  * skb->cb will contain all the following information,
1983  * priority, morefrag, rate, &dev.
1984  * */
1985 short rtl8192_tx(struct net_device *dev, struct sk_buff* skb)
1986 {
1987         struct r8192_priv *priv = ieee80211_priv(dev);
1988         cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1989         tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
1990         tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);
1991         struct usb_device *udev = priv->udev;
1992         int pend;
1993         int status;
1994         struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
1995         //int urb_len;
1996         unsigned int idx_pipe;
1997 //      RT_DEBUG_DATA(COMP_SEND, tcb_desc, sizeof(cb_desc));
1998 //      printk("=============> %s\n", __FUNCTION__);
1999         pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
2000         /* we are locked here so the two atomic_read and inc are executed
2001          * without interleaves
2002          * !!! For debug purpose
2003          */
2004         if( pend > MAX_TX_URB){
2005                 printk("To discard skb packet!\n");
2006                 dev_kfree_skb_any(skb);
2007                 return -1;
2008         }
2009
2010         tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
2011         if(!tx_urb){
2012                 dev_kfree_skb_any(skb);
2013                 return -ENOMEM;
2014         }
2015
2016         /* Fill Tx firmware info */
2017         memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
2018         /* DWORD 0 */
2019         tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
2020         tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
2021         tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
2022         tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
2023         if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
2024                 tx_fwinfo->AllowAggregation = 1;
2025                 /* DWORD 1 */
2026                 tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
2027                 tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
2028         } else {
2029                 tx_fwinfo->AllowAggregation = 0;
2030                 /* DWORD 1 */
2031                 tx_fwinfo->RxMF = 0;
2032                 tx_fwinfo->RxAMD = 0;
2033         }
2034
2035         /* Protection mode related */
2036         tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
2037         tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
2038         tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
2039         tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
2040         tx_fwinfo->RtsRate =  MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
2041         tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
2042         tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
2043         tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
2044                                 (tcb_desc->bRTSUseShortGI?1:0);
2045
2046         /* Set Bandwidth and sub-channel settings. */
2047         if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2048         {
2049                 if(tcb_desc->bPacketBW) {
2050                         tx_fwinfo->TxBandwidth = 1;
2051                         tx_fwinfo->TxSubCarrier = 0;    //By SD3's Jerry suggestion, use duplicated mode
2052                 } else {
2053                         tx_fwinfo->TxBandwidth = 0;
2054                         tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
2055                 }
2056         } else {
2057                 tx_fwinfo->TxBandwidth = 0;
2058                 tx_fwinfo->TxSubCarrier = 0;
2059         }
2060
2061 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2062         if (tcb_desc->drv_agg_enable)
2063         {
2064                 tx_fwinfo->Tx_INFO_RSVD = (tcb_desc->DrvAggrNum & 0x1f) << 1;
2065         }
2066 #endif
2067         /* Fill Tx descriptor */
2068         memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
2069         /* DWORD 0 */
2070         tx_desc->LINIP = 0;
2071         tx_desc->CmdInit = 1;
2072         tx_desc->Offset =  sizeof(tx_fwinfo_819x_usb) + 8;
2073
2074 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2075         if (tcb_desc->drv_agg_enable) {
2076                 tx_desc->PktSize = tcb_desc->pkt_size;
2077         } else
2078 #endif
2079         {
2080                 tx_desc->PktSize = (skb->len - TX_PACKET_SHIFT_BYTES) & 0xffff;
2081         }
2082
2083         /*DWORD 1*/
2084         tx_desc->SecCAMID= 0;
2085         tx_desc->RATid = tcb_desc->RATRIndex;
2086         {
2087                 //MPDUOverhead = 0;
2088                 tx_desc->NoEnc = 1;
2089         }
2090         tx_desc->SecType = 0x0;
2091                 if (tcb_desc->bHwSec)
2092                         {
2093                                 switch (priv->ieee80211->pairwise_key_type)
2094                                 {
2095                                         case KEY_TYPE_WEP40:
2096                                         case KEY_TYPE_WEP104:
2097                                                  tx_desc->SecType = 0x1;
2098                                                  tx_desc->NoEnc = 0;
2099                                                  break;
2100                                         case KEY_TYPE_TKIP:
2101                                                  tx_desc->SecType = 0x2;
2102                                                  tx_desc->NoEnc = 0;
2103                                                  break;
2104                                         case KEY_TYPE_CCMP:
2105                                                  tx_desc->SecType = 0x3;
2106                                                  tx_desc->NoEnc = 0;
2107                                                  break;
2108                                         case KEY_TYPE_NA:
2109                                                  tx_desc->SecType = 0x0;
2110                                                  tx_desc->NoEnc = 1;
2111                                                  break;
2112                                 }
2113                         }
2114
2115         tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
2116         tx_desc->TxFWInfoSize =  sizeof(tx_fwinfo_819x_usb);
2117
2118         tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
2119         tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
2120
2121         /* Fill fields that are required to be initialized in all of the descriptors */
2122         //DWORD 0
2123         tx_desc->FirstSeg = 1;
2124         tx_desc->LastSeg = 1;
2125         tx_desc->OWN = 1;
2126
2127 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
2128         if (tcb_desc->drv_agg_enable) {
2129                 tx_desc->TxBufferSize = tcb_desc->pkt_size + sizeof(tx_fwinfo_819x_usb);
2130         } else
2131 #endif
2132         {
2133                 //DWORD 2
2134                 tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
2135         }
2136         /* Get index to out pipe from specified QueueID */
2137 #ifndef USE_ONE_PIPE
2138         idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
2139 #else
2140         idx_pipe = 0x5;
2141 #endif
2142
2143         //RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
2144         //RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
2145
2146         /* To submit bulk urb */
2147         usb_fill_bulk_urb(tx_urb,udev,
2148                         usb_sndbulkpipe(udev,idx_pipe), skb->data,
2149                         skb->len, rtl8192_tx_isr, skb);
2150
2151         status = usb_submit_urb(tx_urb, GFP_ATOMIC);
2152         if (!status){
2153 //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
2154                 bool bSend0Byte = false;
2155                 u8 zero = 0;
2156                 if(udev->speed == USB_SPEED_HIGH)
2157                 {
2158                         if (skb->len > 0 && skb->len % 512 == 0)
2159                                 bSend0Byte = true;
2160                 }
2161                 else
2162                 {
2163                         if (skb->len > 0 && skb->len % 64 == 0)
2164                                 bSend0Byte = true;
2165                 }
2166                 if (bSend0Byte)
2167                 {
2168                         tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
2169                         if(!tx_urb_zero){
2170                                 RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
2171                                 return -ENOMEM;
2172                         }
2173                         usb_fill_bulk_urb(tx_urb_zero,udev,
2174                                         usb_sndbulkpipe(udev,idx_pipe), &zero,
2175                                         0, tx_zero_isr, dev);
2176                         status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
2177                         if (status){
2178                         RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
2179                         return -1;
2180                         }
2181                 }
2182                 dev->trans_start = jiffies;
2183                 atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
2184                 return 0;
2185         }else{
2186                 RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
2187                                 status);
2188                 return -1;
2189         }
2190 }
2191
2192 short rtl8192_usb_initendpoints(struct net_device *dev)
2193 {
2194         struct r8192_priv *priv = ieee80211_priv(dev);
2195
2196         priv->rx_urb = kmalloc(sizeof(struct urb *) * (MAX_RX_URB+1),
2197                                 GFP_KERNEL);
2198         if (priv->rx_urb == NULL)
2199                 return -ENOMEM;
2200
2201 #ifndef JACKSON_NEW_RX
2202         for(i=0;i<(MAX_RX_URB+1);i++){
2203
2204                 priv->rx_urb[i] = usb_alloc_urb(0,GFP_KERNEL);
2205
2206                 priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL);
2207
2208                 priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE;
2209         }
2210 #endif
2211
2212 #ifdef THOMAS_BEACON
2213 {
2214         long align = 0;
2215         void *oldaddr, *newaddr;
2216
2217         priv->rx_urb[16] = usb_alloc_urb(0, GFP_KERNEL);
2218         priv->oldaddr = kmalloc(16, GFP_KERNEL);
2219         oldaddr = priv->oldaddr;
2220         align = ((long)oldaddr) & 3;
2221         if (align) {
2222                 newaddr = oldaddr + 4 - align;
2223                 priv->rx_urb[16]->transfer_buffer_length = 16 - 4 + align;
2224         } else {
2225                 newaddr = oldaddr;
2226                 priv->rx_urb[16]->transfer_buffer_length = 16;
2227         }
2228         priv->rx_urb[16]->transfer_buffer = newaddr;
2229 }
2230 #endif
2231
2232         memset(priv->rx_urb, 0, sizeof(struct urb*) * MAX_RX_URB);
2233         priv->pp_rxskb = kcalloc(MAX_RX_URB, sizeof(struct sk_buff *),
2234                                  GFP_KERNEL);
2235         if (!priv->pp_rxskb) {
2236                 kfree(priv->rx_urb);
2237
2238                 priv->pp_rxskb = NULL;
2239                 priv->rx_urb = NULL;
2240
2241                 DMESGE("Endpoint Alloc Failure");
2242                 return -ENOMEM;
2243         }
2244
2245         printk("End of initendpoints\n");
2246         return 0;
2247
2248 }
2249 #ifdef THOMAS_BEACON
2250 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2251 {
2252         int i;
2253         struct r8192_priv *priv = ieee80211_priv(dev);
2254
2255         if(priv->rx_urb){
2256                 for(i=0;i<(MAX_RX_URB+1);i++){
2257                         usb_kill_urb(priv->rx_urb[i]);
2258                         usb_free_urb(priv->rx_urb[i]);
2259                 }
2260                 kfree(priv->rx_urb);
2261                 priv->rx_urb = NULL;
2262         }
2263         kfree(priv->oldaddr);
2264         priv->oldaddr = NULL;
2265         if (priv->pp_rxskb) {
2266                 kfree(priv->pp_rxskb);
2267                 priv->pp_rxskb = 0;
2268         }
2269 }
2270 #else
2271 void rtl8192_usb_deleteendpoints(struct net_device *dev)
2272 {
2273         int i;
2274         struct r8192_priv *priv = ieee80211_priv(dev);
2275
2276 #ifndef JACKSON_NEW_RX
2277
2278         if(priv->rx_urb){
2279                 for(i=0;i<(MAX_RX_URB+1);i++){
2280                         usb_kill_urb(priv->rx_urb[i]);
2281                         kfree(priv->rx_urb[i]->transfer_buffer);
2282                         usb_free_urb(priv->rx_urb[i]);
2283                 }
2284                 kfree(priv->rx_urb);
2285                 priv->rx_urb = NULL;
2286
2287         }
2288 #else
2289         kfree(priv->rx_urb);
2290         priv->rx_urb = NULL;
2291         kfree(priv->oldaddr);
2292         priv->oldaddr = NULL;
2293         if (priv->pp_rxskb) {
2294                 kfree(priv->pp_rxskb);
2295                 priv->pp_rxskb = 0;
2296
2297         }
2298
2299 #endif
2300 }
2301 #endif
2302
2303 extern void rtl8192_update_ratr_table(struct net_device* dev);
2304 void rtl8192_link_change(struct net_device *dev)
2305 {
2306 //      int i;
2307
2308         struct r8192_priv *priv = ieee80211_priv(dev);
2309         struct ieee80211_device* ieee = priv->ieee80211;
2310         //write_nic_word(dev, BCN_INTR_ITV, net->beacon_interval);
2311         if (ieee->state == IEEE80211_LINKED)
2312         {
2313                 rtl8192_net_update(dev);
2314                 rtl8192_update_ratr_table(dev);
2315                 //add this as in pure N mode, wep encryption will use software way, but there is no chance to set this as wep will not set group key in wext. WB.2008.07.08
2316                 if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
2317                 EnableHWSecurityConfig8192(dev);
2318         }
2319         /*update timing params*/
2320 //      RT_TRACE(COMP_CH, "========>%s(), chan:%d\n", __FUNCTION__, priv->chan);
2321 //      rtl8192_set_chan(dev, priv->chan);
2322          if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
2323         {
2324                 u32 reg = 0;
2325                 reg = read_nic_dword(dev, RCR);
2326                 if (priv->ieee80211->state == IEEE80211_LINKED)
2327                         priv->ReceiveConfig = reg |= RCR_CBSSID;
2328                 else
2329                         priv->ReceiveConfig = reg &= ~RCR_CBSSID;
2330                 write_nic_dword(dev, RCR, reg);
2331         }
2332
2333 //      rtl8192_set_rxconf(dev);
2334 }
2335
2336 static struct ieee80211_qos_parameters def_qos_parameters = {
2337         {3,3,3,3},/* cw_min */
2338         {7,7,7,7},/* cw_max */
2339         {2,2,2,2},/* aifs */
2340         {0,0,0,0},/* flags */
2341         {0,0,0,0} /* tx_op_limit */
2342 };
2343
2344
2345 void rtl8192_update_beacon(struct work_struct * work)
2346 {
2347         struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
2348         struct net_device *dev = priv->ieee80211->dev;
2349         struct ieee80211_device* ieee = priv->ieee80211;
2350         struct ieee80211_network* net = &ieee->current_network;
2351
2352         if (ieee->pHTInfo->bCurrentHTSupport)
2353                 HTUpdateSelfAndPeerSetting(ieee, net);
2354         ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
2355         rtl8192_update_cap(dev, net->capability);
2356 }
2357 /*
2358 * background support to run QoS activate functionality
2359 */
2360 int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
2361 void rtl8192_qos_activate(struct work_struct * work)
2362 {
2363         struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2364         struct net_device *dev = priv->ieee80211->dev;
2365         struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2366         u8 mode = priv->ieee80211->current_network.mode;
2367         //u32 size = sizeof(struct ieee80211_qos_parameters);
2368         u8  u1bAIFS;
2369         u32 u4bAcParam;
2370         int i;
2371
2372         if (priv == NULL)
2373                 return;
2374
2375        mutex_lock(&priv->mutex);
2376         if(priv->ieee80211->state != IEEE80211_LINKED)
2377                 goto success;
2378         RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
2379         /* It better set slot time at first */
2380         /* For we just support b/g mode at present, let the slot time at 9/20 selection */
2381         /* update the ac parameter to related registers */
2382         for(i = 0; i <  QOS_QUEUE_NUM; i++) {
2383                 //Mode G/A: slotTimeTimer = 9; Mode B: 20
2384                 u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
2385                 u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
2386                                 (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
2387                                 (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
2388                                 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
2389
2390                 write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
2391                 //write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4332);
2392         }
2393
2394 success:
2395        mutex_unlock(&priv->mutex);
2396 }
2397
2398 static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
2399                 int active_network,
2400                 struct ieee80211_network *network)
2401 {
2402         int ret = 0;
2403         u32 size = sizeof(struct ieee80211_qos_parameters);
2404
2405         if(priv->ieee80211->state !=IEEE80211_LINKED)
2406                 return ret;
2407
2408         if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2409                 return ret;
2410
2411         if (network->flags & NETWORK_HAS_QOS_MASK) {
2412                 if (active_network &&
2413                                 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
2414                         network->qos_data.active = network->qos_data.supported;
2415
2416                 if ((network->qos_data.active == 1) && (active_network == 1) &&
2417                                 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
2418                                 (network->qos_data.old_param_count !=
2419                                  network->qos_data.param_count)) {
2420                         network->qos_data.old_param_count =
2421                                 network->qos_data.param_count;
2422                         queue_work(priv->priv_wq, &priv->qos_activate);
2423                         RT_TRACE (COMP_QOS, "QoS parameters change call "
2424                                         "qos_activate\n");
2425                 }
2426         } else {
2427                 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2428                        &def_qos_parameters, size);
2429
2430                 if ((network->qos_data.active == 1) && (active_network == 1)) {
2431                         queue_work(priv->priv_wq, &priv->qos_activate);
2432                         RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
2433                 }
2434                 network->qos_data.active = 0;
2435                 network->qos_data.supported = 0;
2436         }
2437
2438         return 0;
2439 }
2440
2441 /* handle and manage frame from beacon and probe response */
2442 static int rtl8192_handle_beacon(struct net_device * dev,
2443                               struct ieee80211_beacon * beacon,
2444                               struct ieee80211_network * network)
2445 {
2446         struct r8192_priv *priv = ieee80211_priv(dev);
2447
2448         rtl8192_qos_handle_probe_response(priv,1,network);
2449         queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
2450         return 0;
2451
2452 }
2453
2454 /*
2455 * handling the beaconing responses. if we get different QoS setting
2456 * off the network from the associated setting, adjust the QoS
2457 * setting
2458 */
2459 static int rtl8192_qos_association_resp(struct r8192_priv *priv,
2460                                     struct ieee80211_network *network)
2461 {
2462         int ret = 0;
2463         unsigned long flags;
2464         u32 size = sizeof(struct ieee80211_qos_parameters);
2465         int set_qos_param = 0;
2466
2467         if ((priv == NULL) || (network == NULL))
2468                 return ret;
2469
2470         if(priv->ieee80211->state !=IEEE80211_LINKED)
2471                 return ret;
2472
2473         if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2474                 return ret;
2475
2476         spin_lock_irqsave(&priv->ieee80211->lock, flags);
2477         if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
2478                 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2479                          &network->qos_data.parameters,\
2480                         sizeof(struct ieee80211_qos_parameters));
2481                 priv->ieee80211->current_network.qos_data.active = 1;
2482                  {
2483                         set_qos_param = 1;
2484                         /* update qos parameter for current network */
2485                         priv->ieee80211->current_network.qos_data.old_param_count = \
2486                                  priv->ieee80211->current_network.qos_data.param_count;
2487                         priv->ieee80211->current_network.qos_data.param_count = \
2488                                  network->qos_data.param_count;
2489                 }
2490         } else {
2491                 memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
2492                        &def_qos_parameters, size);
2493                 priv->ieee80211->current_network.qos_data.active = 0;
2494                 priv->ieee80211->current_network.qos_data.supported = 0;
2495                 set_qos_param = 1;
2496         }
2497
2498         spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
2499
2500         RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
2501         if (set_qos_param == 1)
2502                 queue_work(priv->priv_wq, &priv->qos_activate);
2503
2504
2505         return ret;
2506 }
2507
2508
2509 static int rtl8192_handle_assoc_response(struct net_device *dev,
2510                                      struct ieee80211_assoc_response_frame *resp,
2511                                      struct ieee80211_network *network)
2512 {
2513         struct r8192_priv *priv = ieee80211_priv(dev);
2514         rtl8192_qos_association_resp(priv, network);
2515         return 0;
2516 }
2517
2518
2519 void rtl8192_update_ratr_table(struct net_device* dev)
2520         //      POCTET_STRING   posLegacyRate,
2521         //      u8*                     pMcsRate)
2522         //      PRT_WLAN_STA    pEntry)
2523 {
2524         struct r8192_priv* priv = ieee80211_priv(dev);
2525         struct ieee80211_device* ieee = priv->ieee80211;
2526         u8* pMcsRate = ieee->dot11HTOperationalRateSet;
2527         //struct ieee80211_network *net = &ieee->current_network;
2528         u32 ratr_value = 0;
2529         u8 rate_index = 0;
2530         rtl8192_config_rate(dev, (u16*)(&ratr_value));
2531         ratr_value |= (*(u16*)(pMcsRate)) << 12;
2532 //      switch (net->mode)
2533         switch (ieee->mode)
2534         {
2535                 case IEEE_A:
2536                         ratr_value &= 0x00000FF0;
2537                         break;
2538                 case IEEE_B:
2539                         ratr_value &= 0x0000000F;
2540                         break;
2541                 case IEEE_G:
2542                         ratr_value &= 0x00000FF7;
2543                         break;
2544                 case IEEE_N_24G:
2545                 case IEEE_N_5G:
2546                         if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
2547                                 ratr_value &= 0x0007F007;
2548                         else{
2549                                 if (priv->rf_type == RF_1T2R)
2550                                         ratr_value &= 0x000FF007;
2551                                 else
2552                                         ratr_value &= 0x0F81F007;
2553                         }
2554                         break;
2555                 default:
2556                         break;
2557         }
2558         ratr_value &= 0x0FFFFFFF;
2559         if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
2560                 ratr_value |= 0x80000000;
2561         }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
2562                 ratr_value |= 0x80000000;
2563         }
2564         write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
2565         write_nic_byte(dev, UFWP, 1);
2566 }
2567
2568 static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
2569 static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
2570 bool GetNmodeSupportBySecCfg8192(struct net_device*dev)
2571 {
2572         struct r8192_priv* priv = ieee80211_priv(dev);
2573         struct ieee80211_device* ieee = priv->ieee80211;
2574         struct ieee80211_network * network = &ieee->current_network;
2575         int wpa_ie_len= ieee->wpa_ie_len;
2576         struct ieee80211_crypt_data* crypt;
2577         int encrypt;
2578
2579         crypt = ieee->crypt[ieee->tx_keyidx];
2580         //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
2581         encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
2582
2583         /* simply judge  */
2584         if(encrypt && (wpa_ie_len == 0)) {
2585                 /* wep encryption, no N mode setting */
2586                 return false;
2587 //      } else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
2588         } else if((wpa_ie_len != 0)) {
2589                 /* parse pairwise key type */
2590                 //if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
2591                 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))))
2592                         return true;
2593                 else
2594                         return false;
2595         } else {
2596                 return true;
2597         }
2598
2599         return true;
2600 }
2601
2602 bool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
2603 {
2604         bool                    Reval;
2605         struct r8192_priv* priv = ieee80211_priv(dev);
2606         struct ieee80211_device* ieee = priv->ieee80211;
2607
2608         if(ieee->bHalfWirelessN24GMode == true)
2609                 Reval = true;
2610         else
2611                 Reval =  false;
2612
2613         return Reval;
2614 }
2615
2616 void rtl8192_refresh_supportrate(struct r8192_priv* priv)
2617 {
2618         struct ieee80211_device* ieee = priv->ieee80211;
2619         //we do not consider set support rate for ABG mode, only HT MCS rate is set here.
2620         if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
2621         {
2622                 memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
2623                 //RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
2624                 //RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
2625         }
2626         else
2627                 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
2628         return;
2629 }
2630
2631 u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
2632 {
2633         struct r8192_priv *priv = ieee80211_priv(dev);
2634         u8 ret = 0;
2635         switch(priv->rf_chip)
2636         {
2637                 case RF_8225:
2638                 case RF_8256:
2639                 case RF_PSEUDO_11N:
2640                         ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
2641                         break;
2642                 case RF_8258:
2643                         ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
2644                         break;
2645                 default:
2646                         ret = WIRELESS_MODE_B;
2647                         break;
2648         }
2649         return ret;
2650 }
2651 void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
2652 {
2653         struct r8192_priv *priv = ieee80211_priv(dev);
2654         u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
2655
2656         if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
2657         {
2658                 if(bSupportMode & WIRELESS_MODE_N_24G)
2659                 {
2660                         wireless_mode = WIRELESS_MODE_N_24G;
2661                 }
2662                 else if(bSupportMode & WIRELESS_MODE_N_5G)
2663                 {
2664                         wireless_mode = WIRELESS_MODE_N_5G;
2665                 }
2666                 else if((bSupportMode & WIRELESS_MODE_A))
2667                 {
2668                         wireless_mode = WIRELESS_MODE_A;
2669                 }
2670                 else if((bSupportMode & WIRELESS_MODE_G))
2671                 {
2672                         wireless_mode = WIRELESS_MODE_G;
2673                 }
2674                 else if((bSupportMode & WIRELESS_MODE_B))
2675                 {
2676                         wireless_mode = WIRELESS_MODE_B;
2677                 }
2678                 else{
2679                         RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
2680                         wireless_mode = WIRELESS_MODE_B;
2681                 }
2682         }
2683 #ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
2684         ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
2685 #endif
2686         priv->ieee80211->mode = wireless_mode;
2687
2688         if ((wireless_mode == WIRELESS_MODE_N_24G) ||  (wireless_mode == WIRELESS_MODE_N_5G))
2689                 priv->ieee80211->pHTInfo->bEnableHT = 1;
2690         else
2691                 priv->ieee80211->pHTInfo->bEnableHT = 0;
2692         RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
2693         rtl8192_refresh_supportrate(priv);
2694
2695 }
2696 //init priv variables here. only non_zero value should be initialized here.
2697 static void rtl8192_init_priv_variable(struct net_device* dev)
2698 {
2699         struct r8192_priv *priv = ieee80211_priv(dev);
2700         u8 i;
2701         priv->card_8192 = NIC_8192U;
2702         priv->chan = 1; //set to channel 1
2703         priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
2704         priv->ieee80211->iw_mode = IW_MODE_INFRA;
2705         priv->ieee80211->ieee_up=0;
2706         priv->retry_rts = DEFAULT_RETRY_RTS;
2707         priv->retry_data = DEFAULT_RETRY_DATA;
2708         priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
2709         priv->ieee80211->rate = 110; //11 mbps
2710         priv->ieee80211->short_slot = 1;
2711         priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
2712         priv->CckPwEnl = 6;
2713         //for silent reset
2714         priv->IrpPendingCount = 1;
2715         priv->ResetProgress = RESET_TYPE_NORESET;
2716         priv->bForcedSilentReset = 0;
2717         priv->bDisableNormalResetCheck = false;
2718         priv->force_reset = false;
2719
2720         priv->ieee80211->FwRWRF = 0;    //we don't use FW read/write RF until stable firmware is available.
2721         priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
2722         priv->ieee80211->iw_mode = IW_MODE_INFRA;
2723         priv->ieee80211->softmac_features  = IEEE_SOFTMAC_SCAN |
2724                 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2725                 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
2726                 IEEE_SOFTMAC_BEACONS;//added by amy 080604 //|  //IEEE_SOFTMAC_SINGLE_QUEUE;
2727
2728         priv->ieee80211->active_scan = 1;
2729         priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
2730         priv->ieee80211->host_encrypt = 1;
2731         priv->ieee80211->host_decrypt = 1;
2732         priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
2733         priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
2734         priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
2735         priv->ieee80211->set_chan = rtl8192_set_chan;
2736         priv->ieee80211->link_change = rtl8192_link_change;
2737         priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
2738         priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
2739         priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
2740         priv->ieee80211->init_wmmparam_flag = 0;
2741         priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
2742         priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
2743         priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
2744         priv->ieee80211->qos_support = 1;
2745
2746         //added by WB
2747 //      priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
2748         priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
2749         priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
2750         priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
2751         //added by david
2752         priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
2753         priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
2754         priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
2755         //added by amy
2756         priv->ieee80211->InitialGainHandler = InitialGain819xUsb;
2757         priv->card_type = USB;
2758 #ifdef TO_DO_LIST
2759         if(Adapter->bInHctTest)
2760         {
2761                 pHalData->ShortRetryLimit = 7;
2762                 pHalData->LongRetryLimit = 7;
2763         }
2764 #endif
2765         {
2766                 priv->ShortRetryLimit = 0x30;
2767                 priv->LongRetryLimit = 0x30;
2768         }
2769         priv->EarlyRxThreshold = 7;
2770         priv->enable_gpio0 = 0;
2771         priv->TransmitConfig =
2772         //      TCR_DurProcMode |       //for RTL8185B, duration setting by HW
2773         //?     TCR_DISReqQsize |
2774                 (TCR_MXDMA_2048<<TCR_MXDMA_OFFSET)|  // Max DMA Burst Size per Tx DMA Burst, 7: reserved.
2775                 (priv->ShortRetryLimit<<TCR_SRL_OFFSET)|        // Short retry limit
2776                 (priv->LongRetryLimit<<TCR_LRL_OFFSET) |        // Long retry limit
2777                 (false ? TCR_SAT: 0);   // FALSE: HW provides PLCP length and LENGEXT, TRUE: SW provides them
2778 #ifdef TO_DO_LIST
2779         if(Adapter->bInHctTest)
2780                 pHalData->ReceiveConfig =       pHalData->CSMethod |
2781                                                 RCR_AMF | RCR_ADF |     //RCR_AAP |     //accept management/data
2782                                                 //guangan200710
2783                                                 RCR_ACF |       //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2784                                                 RCR_AB | RCR_AM | RCR_APM |             //accept BC/MC/UC
2785                                                 RCR_AICV | RCR_ACRC32 |                 //accept ICV/CRC error packet
2786                                                 ((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2787                                                 (pHalData->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
2788                                                 (pHalData->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
2789         else
2790
2791 #endif
2792         priv->ReceiveConfig     =
2793                 RCR_AMF | RCR_ADF |             //accept management/data
2794                 RCR_ACF |                       //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
2795                 RCR_AB | RCR_AM | RCR_APM |     //accept BC/MC/UC
2796                 //RCR_AICV | RCR_ACRC32 |       //accept ICV/CRC error packet
2797                 ((u32)7<<RCR_MXDMA_OFFSET)| // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
2798                 (priv->EarlyRxThreshold<<RX_FIFO_THRESHOLD_SHIFT) | // Rx FIFO Threshold, 7: No Rx threshold.
2799                 (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
2800
2801         priv->AcmControl = 0;
2802         priv->pFirmware = kzalloc(sizeof(rt_firmware), GFP_KERNEL);
2803
2804         /* rx related queue */
2805         skb_queue_head_init(&priv->rx_queue);
2806         skb_queue_head_init(&priv->skb_queue);
2807
2808         /* Tx related queue */
2809         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2810                 skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
2811         }
2812         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2813                 skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
2814         }
2815         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
2816                 skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
2817         }
2818         priv->rf_set_chan = rtl8192_phy_SwChnl;
2819 }
2820
2821 //init lock here
2822 static void rtl8192_init_priv_lock(struct r8192_priv* priv)
2823 {
2824         spin_lock_init(&priv->tx_lock);
2825         spin_lock_init(&priv->irq_lock);//added by thomas
2826         //spin_lock_init(&priv->rf_lock);
2827         sema_init(&priv->wx_sem,1);
2828         sema_init(&priv->rf_sem,1);
2829         mutex_init(&priv->mutex);
2830 }
2831
2832 extern  void    rtl819x_watchdog_wqcallback(struct work_struct *work);
2833
2834 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
2835 //init tasklet and wait_queue here. only 2.6 above kernel is considered
2836 #define DRV_NAME "wlan0"
2837 static void rtl8192_init_priv_task(struct net_device* dev)
2838 {
2839         struct r8192_priv *priv = ieee80211_priv(dev);
2840
2841         priv->priv_wq = create_workqueue(DRV_NAME);
2842
2843         INIT_WORK(&priv->reset_wq, rtl8192_restart);
2844
2845         //INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
2846         INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
2847         INIT_DELAYED_WORK(&priv->txpower_tracking_wq,  dm_txpower_trackingcallback);
2848 //      INIT_DELAYED_WORK(&priv->gpio_change_rf_wq,  dm_gpio_change_rf_callback);
2849         INIT_DELAYED_WORK(&priv->rfpath_check_wq,  dm_rf_pathcheck_workitemcallback);
2850         INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
2851         INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
2852         //INIT_WORK(&priv->SwChnlWorkItem,  rtl8192_SwChnl_WorkItem);
2853         //INIT_WORK(&priv->SetBWModeWorkItem,  rtl8192_SetBWModeWorkItem);
2854         INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
2855
2856         tasklet_init(&priv->irq_rx_tasklet,
2857              (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
2858              (unsigned long)priv);
2859 }
2860
2861 static void rtl8192_get_eeprom_size(struct net_device* dev)
2862 {
2863         u16 curCR = 0;
2864         struct r8192_priv *priv = ieee80211_priv(dev);
2865         RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
2866         curCR = read_nic_word_E(dev,EPROM_CMD);
2867         RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
2868         //whether need I consider BIT5?
2869         priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
2870         RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
2871 }
2872
2873 //used to swap endian. as ntohl & htonl are not necessary to swap endian, so use this instead.
2874 static inline u16 endian_swap(u16* data)
2875 {
2876         u16 tmp = *data;
2877         *data = (tmp >> 8) | (tmp << 8);
2878         return *data;
2879 }
2880 static void rtl8192_read_eeprom_info(struct net_device* dev)
2881 {
2882         u16 wEPROM_ID = 0;
2883         u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x02};
2884         u8 bLoad_From_EEPOM = false;
2885         struct r8192_priv *priv = ieee80211_priv(dev);
2886         u16 tmpValue = 0;
2887         RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
2888         wEPROM_ID = eprom_read(dev, 0); //first read EEPROM ID out;
2889         RT_TRACE(COMP_EPROM, "EEPROM ID is 0x%x\n", wEPROM_ID);
2890
2891         if (wEPROM_ID != RTL8190_EEPROM_ID)
2892         {
2893                 RT_TRACE(COMP_ERR, "EEPROM ID is invalid(is 0x%x(should be 0x%x)\n", wEPROM_ID, RTL8190_EEPROM_ID);
2894         }
2895         else
2896                 bLoad_From_EEPOM = true;
2897
2898         if (bLoad_From_EEPOM)
2899         {
2900                 tmpValue = eprom_read(dev, (EEPROM_VID>>1));
2901                 priv->eeprom_vid = endian_swap(&tmpValue);
2902                 priv->eeprom_pid = eprom_read(dev, (EEPROM_PID>>1));
2903                 tmpValue = eprom_read(dev, (EEPROM_ChannelPlan>>1));
2904                 priv->eeprom_ChannelPlan =((tmpValue&0xff00)>>8);
2905                 priv->btxpowerdata_readfromEEPORM = true;
2906                 priv->eeprom_CustomerID = eprom_read(dev, (EEPROM_Customer_ID>>1)) >>8;
2907         }
2908         else
2909         {
2910                 priv->eeprom_vid = 0;
2911                 priv->eeprom_pid = 0;
2912                 priv->card_8192_version = VERSION_819xU_B;
2913                 priv->eeprom_ChannelPlan = 0;
2914                 priv->eeprom_CustomerID = 0;
2915         }
2916         RT_TRACE(COMP_EPROM, "vid:0x%4x, pid:0x%4x, CustomID:0x%2x, ChanPlan:0x%x\n", priv->eeprom_vid, priv->eeprom_pid, priv->eeprom_CustomerID, priv->eeprom_ChannelPlan);
2917         //set channelplan from eeprom
2918         priv->ChannelPlan = priv->eeprom_ChannelPlan;
2919         if (bLoad_From_EEPOM)
2920         {
2921                 int i;
2922                 for (i=0; i<6; i+=2)
2923                 {
2924                         u16 tmp = 0;
2925                         tmp = eprom_read(dev, (u16)((EEPROM_NODE_ADDRESS_BYTE_0 + i)>>1));
2926                         *(u16*)(&dev->dev_addr[i]) = tmp;
2927                 }
2928         }
2929         else
2930         {
2931                 memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
2932                 //should I set IDR0 here?
2933         }
2934         RT_TRACE(COMP_EPROM, "MAC addr:%pM\n", dev->dev_addr);
2935         priv->rf_type = RTL819X_DEFAULT_RF_TYPE; //default 1T2R
2936         priv->rf_chip = RF_8256;
2937
2938         if (priv->card_8192_version == (u8)VERSION_819xU_A)
2939         {
2940                 //read Tx power gain offset of legacy OFDM to HT rate
2941                 if (bLoad_From_EEPOM)
2942                         priv->EEPROMTxPowerDiff = (eprom_read(dev, (EEPROM_TxPowerDiff>>1))&0xff00) >> 8;
2943                 else
2944                         priv->EEPROMTxPowerDiff = EEPROM_Default_TxPower;
2945                 RT_TRACE(COMP_EPROM, "TxPowerDiff:%d\n", priv->EEPROMTxPowerDiff);
2946                 //read ThermalMeter from EEPROM
2947                 if (bLoad_From_EEPOM)
2948                         priv->EEPROMThermalMeter = (u8)(eprom_read(dev, (EEPROM_ThermalMeter>>1))&0x00ff);
2949                 else
2950                         priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
2951                 RT_TRACE(COMP_EPROM, "ThermalMeter:%d\n", priv->EEPROMThermalMeter);
2952                 //vivi, for tx power track
2953                 priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
2954                 //read antenna tx power offset of B/C/D to A from EEPROM
2955                 if (bLoad_From_EEPOM)
2956                         priv->EEPROMPwDiff = (eprom_read(dev, (EEPROM_PwDiff>>1))&0x0f00)>>8;
2957                 else
2958                         priv->EEPROMPwDiff = EEPROM_Default_PwDiff;
2959                 RT_TRACE(COMP_EPROM, "TxPwDiff:%d\n", priv->EEPROMPwDiff);
2960                 // Read CrystalCap from EEPROM
2961                 if (bLoad_From_EEPOM)
2962                         priv->EEPROMCrystalCap = (eprom_read(dev, (EEPROM_CrystalCap>>1))&0x0f);
2963                 else
2964                         priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
2965                 RT_TRACE(COMP_EPROM, "CrystalCap = %d\n", priv->EEPROMCrystalCap);
2966                 //get per-channel Tx power level
2967                 if (bLoad_From_EEPOM)
2968                         priv->EEPROM_Def_Ver = (eprom_read(dev, (EEPROM_TxPwIndex_Ver>>1))&0xff00)>>8;
2969                 else
2970                         priv->EEPROM_Def_Ver = 1;
2971                 RT_TRACE(COMP_EPROM, "EEPROM_DEF_VER:%d\n", priv->EEPROM_Def_Ver);
2972                 if (priv->EEPROM_Def_Ver == 0) //old eeprom definition
2973                 {
2974                         int i;
2975                         if (bLoad_From_EEPOM)
2976                                 priv->EEPROMTxPowerLevelCCK = (eprom_read(dev, (EEPROM_TxPwIndex_CCK>>1))&0xff) >> 8;
2977                         else
2978                                 priv->EEPROMTxPowerLevelCCK = 0x10;
2979                         RT_TRACE(COMP_EPROM, "CCK Tx Power Levl: 0x%02x\n", priv->EEPROMTxPowerLevelCCK);
2980                         for (i=0; i<3; i++)
2981                         {
2982                                 if (bLoad_From_EEPOM)
2983                                 {
2984                                         tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G+i)>>1);
2985                                         if (((EEPROM_TxPwIndex_OFDM_24G+i) % 2) == 0)
2986                                                 tmpValue = tmpValue & 0x00ff;
2987                                         else
2988                                                 tmpValue = (tmpValue & 0xff00) >> 8;
2989                                 }
2990                                 else
2991                                         tmpValue = 0x10;
2992                                 priv->EEPROMTxPowerLevelOFDM24G[i] = (u8) tmpValue;
2993                                 RT_TRACE(COMP_EPROM, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK);
2994                         }
2995                 }//end if EEPROM_DEF_VER == 0
2996                 else if (priv->EEPROM_Def_Ver == 1)
2997                 {
2998                         if (bLoad_From_EEPOM)
2999                         {
3000                                 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1>>1));
3001                                 tmpValue = (tmpValue & 0xff00) >> 8;
3002                         }
3003                         else
3004                                 tmpValue = 0x10;
3005                         priv->EEPROMTxPowerLevelCCK_V1[0] = (u8)tmpValue;
3006
3007                         if (bLoad_From_EEPOM)
3008                                 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1 + 2)>>1);
3009                         else
3010                                 tmpValue = 0x1010;
3011                         *((u16*)(&priv->EEPROMTxPowerLevelCCK_V1[1])) = tmpValue;
3012                         if (bLoad_From_EEPOM)
3013                                 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1>>1));
3014                         else
3015                                 tmpValue = 0x1010;
3016                         *((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[0])) = tmpValue;
3017                         if (bLoad_From_EEPOM)
3018                                 tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1+2)>>1);
3019                         else
3020                                 tmpValue = 0x10;
3021                         priv->EEPROMTxPowerLevelOFDM24G[2] = (u8)tmpValue;
3022                 }//endif EEPROM_Def_Ver == 1
3023
3024                 //update HAL variables
3025                 //
3026                 {
3027                         int i;
3028                         for (i=0; i<14; i++)
3029                         {
3030                                 if (i<=3)
3031                                         priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[0];
3032                                 else if (i>=4 && i<=9)
3033                                         priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[1];
3034                                 else
3035                                         priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[2];
3036                         }
3037
3038                         for (i=0; i<14; i++)
3039                         {
3040                                 if (priv->EEPROM_Def_Ver == 0)
3041                                 {
3042                                         if (i<=3)
3043                                                 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[0] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
3044                                         else if (i>=4 && i<=9)
3045                                                 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK;
3046                                         else
3047                                                 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[2] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
3048                                 }
3049                                 else if (priv->EEPROM_Def_Ver == 1)
3050                                 {
3051                                         if (i<=3)
3052                                                 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[0];
3053                                         else if (i>=4 && i<=9)
3054                                                 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[1];
3055                                         else
3056                                                 priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[2];
3057                                 }
3058                         }
3059                 }//end update HAL variables
3060                 priv->TxPowerDiff = priv->EEPROMPwDiff;
3061 // Antenna B gain offset to antenna A, bit0~3
3062                 priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);
3063                 // Antenna C gain offset to antenna A, bit4~7
3064                 priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);
3065                 // CrystalCap, bit12~15
3066                 priv->CrystalCap = priv->EEPROMCrystalCap;
3067                 // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
3068                 // 92U does not enable TX power tracking.
3069                 priv->ThermalMeter[0] = priv->EEPROMThermalMeter;
3070         }//end if VersionID == VERSION_819xU_A
3071
3072 //added by vivi, for dlink led, 20080416
3073         switch(priv->eeprom_CustomerID)
3074         {
3075                 case EEPROM_CID_RUNTOP:
3076                         priv->CustomerID = RT_CID_819x_RUNTOP;
3077                         break;
3078
3079                 case EEPROM_CID_DLINK:
3080                         priv->CustomerID = RT_CID_DLINK;
3081                         break;
3082
3083                 default:
3084                         priv->CustomerID = RT_CID_DEFAULT;
3085                         break;
3086
3087         }
3088
3089         switch(priv->CustomerID)
3090         {
3091                 case RT_CID_819x_RUNTOP:
3092                         priv->LedStrategy = SW_LED_MODE2;
3093                         break;
3094
3095                 case RT_CID_DLINK:
3096                         priv->LedStrategy = SW_LED_MODE4;
3097                         break;
3098
3099                 default:
3100                         priv->LedStrategy = SW_LED_MODE0;
3101                         break;
3102
3103         }
3104
3105
3106         if(priv->rf_type == RF_1T2R)
3107         {
3108                 RT_TRACE(COMP_EPROM, "\n1T2R config\n");
3109         }
3110         else
3111         {
3112                 RT_TRACE(COMP_EPROM, "\n2T4R config\n");
3113         }
3114
3115         // 2008/01/16 MH We can only know RF type in the function. So we have to init
3116         // DIG RATR table again.
3117         init_rate_adaptive(dev);
3118         //we need init DIG RATR table here again.
3119
3120         RT_TRACE(COMP_EPROM, "<===========%s()\n", __FUNCTION__);
3121         return;
3122 }
3123
3124 short rtl8192_get_channel_map(struct net_device * dev)
3125 {
3126         struct r8192_priv *priv = ieee80211_priv(dev);
3127         if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
3128                 printk("rtl8180_init:Error channel plan! Set to default.\n");
3129                 priv->ChannelPlan= 0;
3130         }
3131         RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
3132
3133         rtl819x_set_channel_map(priv->ChannelPlan, priv);
3134         return 0;
3135 }
3136
3137 short rtl8192_init(struct net_device *dev)
3138 {
3139
3140         struct r8192_priv *priv = ieee80211_priv(dev);
3141
3142         memset(&(priv->stats),0,sizeof(struct Stats));
3143         memset(priv->txqueue_to_outpipemap,0,9);
3144 #ifdef PIPE12
3145         {
3146                 int i=0;
3147                 u8 queuetopipe[]={3,2,1,0,4,8,7,6,5};
3148                 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
3149 /*              for(i=0;i<9;i++)
3150                         printk("%d ",priv->txqueue_to_outpipemap[i]);
3151                 printk("\n");*/
3152         }
3153 #else
3154         {
3155                 u8 queuetopipe[]={3,2,1,0,4,4,0,4,4};
3156                 memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
3157 /*              for(i=0;i<9;i++)
3158                         printk("%d ",priv->txqueue_to_outpipemap[i]);
3159                 printk("\n");*/
3160         }
3161 #endif
3162         rtl8192_init_priv_variable(dev);
3163         rtl8192_init_priv_lock(priv);
3164         rtl8192_init_priv_task(dev);
3165         rtl8192_get_eeprom_size(dev);
3166         rtl8192_read_eeprom_info(dev);
3167         rtl8192_get_channel_map(dev);
3168         init_hal_dm(dev);
3169         init_timer(&priv->watch_dog_timer);
3170         priv->watch_dog_timer.data = (unsigned long)dev;
3171         priv->watch_dog_timer.function = watch_dog_timer_callback;
3172         if(rtl8192_usb_initendpoints(dev)!=0){
3173                 DMESG("Endopoints initialization failed");
3174                 return -ENOMEM;
3175         }
3176
3177         //rtl8192_adapter_start(dev);
3178 #ifdef DEBUG_EPROM
3179         dump_eprom(dev);
3180 #endif
3181         return 0;
3182 }
3183
3184 /******************************************************************************
3185  *function:  This function actually only set RRSR, RATR and BW_OPMODE registers
3186  *           not to do all the hw config as its name says
3187  *   input:  net_device dev
3188  *  output:  none
3189  *  return:  none
3190  *  notice:  This part need to modified according to the rate set we filtered
3191  * ****************************************************************************/
3192 void rtl8192_hwconfig(struct net_device* dev)
3193 {
3194         u32 regRATR = 0, regRRSR = 0;
3195         u8 regBwOpMode = 0, regTmp = 0;
3196         struct r8192_priv *priv = ieee80211_priv(dev);
3197
3198 // Set RRSR, RATR, and BW_OPMODE registers
3199         //
3200         switch(priv->ieee80211->mode)
3201         {
3202         case WIRELESS_MODE_B:
3203                 regBwOpMode = BW_OPMODE_20MHZ;
3204                 regRATR = RATE_ALL_CCK;
3205                 regRRSR = RATE_ALL_CCK;
3206                 break;
3207         case WIRELESS_MODE_A:
3208                 regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
3209                 regRATR = RATE_ALL_OFDM_AG;
3210                 regRRSR = RATE_ALL_OFDM_AG;
3211                 break;
3212         case WIRELESS_MODE_G:
3213                 regBwOpMode = BW_OPMODE_20MHZ;
3214                 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3215                 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3216                 break;
3217         case WIRELESS_MODE_AUTO:
3218 #ifdef TO_DO_LIST
3219                 if (Adapter->bInHctTest)
3220                 {
3221                     regBwOpMode = BW_OPMODE_20MHZ;
3222                     regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3223                     regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3224                 }
3225                 else
3226 #endif
3227                 {
3228                     regBwOpMode = BW_OPMODE_20MHZ;
3229                     regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3230                     regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3231                 }
3232                 break;
3233         case WIRELESS_MODE_N_24G:
3234                 // It support CCK rate by default.
3235                 // CCK rate will be filtered out only when associated AP does not support it.
3236                 regBwOpMode = BW_OPMODE_20MHZ;
3237                         regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3238                         regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
3239                 break;
3240         case WIRELESS_MODE_N_5G:
3241                 regBwOpMode = BW_OPMODE_5G;
3242                 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
3243                 regRRSR = RATE_ALL_OFDM_AG;
3244                 break;
3245         }
3246
3247         write_nic_byte(dev, BW_OPMODE, regBwOpMode);
3248         {
3249                 u32 ratr_value = 0;
3250                 ratr_value = regRATR;
3251                 if (priv->rf_type == RF_1T2R)
3252                 {
3253                         ratr_value &= ~(RATE_ALL_OFDM_2SS);
3254                 }
3255                 write_nic_dword(dev, RATR0, ratr_value);
3256                 write_nic_byte(dev, UFWP, 1);
3257         }
3258         regTmp = read_nic_byte(dev, 0x313);
3259         regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
3260         write_nic_dword(dev, RRSR, regRRSR);
3261
3262         //
3263         // Set Retry Limit here
3264         //
3265         write_nic_word(dev, RETRY_LIMIT,
3266                         priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
3267                         priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
3268         // Set Contention Window here
3269
3270         // Set Tx AGC
3271
3272         // Set Tx Antenna including Feedback control
3273
3274         // Set Auto Rate fallback control
3275
3276
3277 }
3278
3279
3280 //InitializeAdapter and PhyCfg
3281 bool rtl8192_adapter_start(struct net_device *dev)
3282 {
3283         struct r8192_priv *priv = ieee80211_priv(dev);
3284         u32 dwRegRead = 0;
3285         bool init_status = true;
3286         RT_TRACE(COMP_INIT, "====>%s()\n", __FUNCTION__);
3287         priv->Rf_Mode = RF_OP_By_SW_3wire;
3288         //for ASIC power on sequence
3289         write_nic_byte_E(dev, 0x5f, 0x80);
3290         mdelay(50);
3291         write_nic_byte_E(dev, 0x5f, 0xf0);
3292         write_nic_byte_E(dev, 0x5d, 0x00);
3293         write_nic_byte_E(dev, 0x5e, 0x80);
3294         write_nic_byte(dev, 0x17, 0x37);
3295         mdelay(10);
3296 //#ifdef TO_DO_LIST
3297         priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
3298         //config CPUReset Register
3299         //Firmware Reset or not?
3300         dwRegRead = read_nic_dword(dev, CPU_GEN);
3301         if (priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
3302                 dwRegRead |= CPU_GEN_SYSTEM_RESET; //do nothing here?
3303         else if (priv->pFirmware->firmware_status == FW_STATUS_5_READY)
3304                 dwRegRead |= CPU_GEN_FIRMWARE_RESET;
3305         else
3306                 RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __FUNCTION__,   priv->pFirmware->firmware_status);
3307
3308         write_nic_dword(dev, CPU_GEN, dwRegRead);
3309         //mdelay(30);
3310         //config BB.
3311         rtl8192_BBConfig(dev);
3312
3313         //Loopback mode or not
3314         priv->LoopbackMode = RTL819xU_NO_LOOPBACK;
3315 //      priv->LoopbackMode = RTL819xU_MAC_LOOPBACK;
3316
3317         dwRegRead = read_nic_dword(dev, CPU_GEN);
3318         if (priv->LoopbackMode == RTL819xU_NO_LOOPBACK)
3319                 dwRegRead = ((dwRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
3320         else if (priv->LoopbackMode == RTL819xU_MAC_LOOPBACK)
3321                 dwRegRead |= CPU_CCK_LOOPBACK;
3322         else
3323                 RT_TRACE(COMP_ERR, "Serious error in %s(): wrong loopback mode setting(%d)\n", __FUNCTION__,  priv->LoopbackMode);
3324
3325         write_nic_dword(dev, CPU_GEN, dwRegRead);
3326
3327         //after reset cpu, we need wait for a seconds to write in register.
3328         udelay(500);
3329
3330         //xiong add for new bitfile:usb suspend reset pin set to 1. //do we need?
3331         write_nic_byte_E(dev, 0x5f, (read_nic_byte_E(dev, 0x5f)|0x20));
3332
3333         //Set Hardware
3334         rtl8192_hwconfig(dev);
3335
3336         //turn on Tx/Rx
3337         write_nic_byte(dev, CMDR, CR_RE|CR_TE);
3338
3339         //set IDR0 here
3340         write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
3341         write_nic_word(dev, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
3342
3343         //set RCR
3344         write_nic_dword(dev, RCR, priv->ReceiveConfig);
3345
3346         //Initialize Number of Reserved Pages in Firmware Queue
3347         write_nic_dword(dev, RQPN1,  NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
3348                                                 NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
3349                                                 NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
3350                                                 NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
3351         write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT |\
3352                                                 NUM_OF_PAGE_IN_FW_QUEUE_CMD << RSVD_FW_QUEUE_PAGE_CMD_SHIFT);
3353         write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
3354                                                 NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT
3355 //                                              | NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT
3356                                                 );
3357         write_nic_dword(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
3358
3359         //Set AckTimeout
3360         // TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
3361         write_nic_byte(dev, ACK_TIMEOUT, 0x30);
3362
3363 //      RT_TRACE(COMP_INIT, "%s():priv->ResetProgress is %d\n", __FUNCTION__,priv->ResetProgress);
3364         if(priv->ResetProgress == RESET_TYPE_NORESET)
3365         rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);
3366         if(priv->ResetProgress == RESET_TYPE_NORESET){
3367         CamResetAllEntry(dev);
3368         {
3369                 u8 SECR_value = 0x0;
3370                 SECR_value |= SCR_TxEncEnable;
3371                 SECR_value |= SCR_RxDecEnable;
3372                 SECR_value |= SCR_NoSKMC;
3373                 write_nic_byte(dev, SECR, SECR_value);
3374         }
3375         }
3376
3377         //Beacon related
3378         write_nic_word(dev, ATIMWND, 2);
3379         write_nic_word(dev, BCN_INTERVAL, 100);
3380
3381         {
3382 #define DEFAULT_EDCA 0x005e4332
3383                 int i;
3384                 for (i=0; i<QOS_QUEUE_NUM; i++)
3385                 write_nic_dword(dev, WDCAPARA_ADD[i], DEFAULT_EDCA);
3386         }
3387 #ifdef USB_RX_AGGREGATION_SUPPORT
3388         //3 For usb rx firmware aggregation control
3389         if(priv->ResetProgress == RESET_TYPE_NORESET)
3390         {
3391                 u32 ulValue;
3392                 PRT_HIGH_THROUGHPUT     pHTInfo = priv->ieee80211->pHTInfo;
3393                 ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
3394                                         (pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
3395                 /*
3396                  * If usb rx firmware aggregation is enabled,
3397                  * when anyone of three threshold conditions above is reached,
3398                  * firmware will send aggregated packet to driver.
3399                  */
3400                 write_nic_dword(dev, 0x1a8, ulValue);
3401                 priv->bCurrentRxAggrEnable = true;
3402         }
3403 #endif
3404
3405         rtl8192_phy_configmac(dev);
3406
3407         if (priv->card_8192_version == (u8) VERSION_819xU_A)
3408         {
3409                 rtl8192_phy_getTxPower(dev);
3410                 rtl8192_phy_setTxPower(dev, priv->chan);
3411         }
3412
3413         //Firmware download
3414         init_status = init_firmware(dev);
3415         if(!init_status)
3416         {
3417                 RT_TRACE(COMP_ERR,"ERR!!! %s(): Firmware download is failed\n", __FUNCTION__);
3418                 return init_status;
3419         }
3420         RT_TRACE(COMP_INIT, "%s():after firmware download\n", __FUNCTION__);
3421         //
3422 #ifdef TO_DO_LIST
3423 if(Adapter->ResetProgress == RESET_TYPE_NORESET)
3424         {
3425                 if(pMgntInfo->RegRfOff == TRUE)
3426                 { // User disable RF via registry.
3427                         RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RegRfOff ----------\n"));
3428                         MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);
3429                         // Those actions will be discard in MgntActSet_RF_State because of the same state
3430                         for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
3431                                 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3432                 }
3433                 else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS)
3434                 { // H/W or S/W RF OFF before sleep.
3435                         RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RfOffReason(%d) ----------\n", pMgntInfo->RfOffReason));
3436                         MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3437                 }
3438                 else
3439                 {
3440                         pHalData->eRFPowerState = eRfOn;
3441                         pMgntInfo->RfOffReason = 0;
3442                         RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): RF is on ----------\n"));
3443                 }
3444         }
3445         else
3446         {
3447                 if(pHalData->eRFPowerState == eRfOff)
3448                 {
3449                         MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
3450                         // Those actions will be discard in MgntActSet_RF_State because of the same state
3451                         for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
3452                                 PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
3453                 }
3454         }
3455 #endif
3456         //config RF.
3457         if(priv->ResetProgress == RESET_TYPE_NORESET){
3458         rtl8192_phy_RFConfig(dev);
3459         RT_TRACE(COMP_INIT, "%s():after phy RF config\n", __FUNCTION__);
3460         }
3461
3462
3463         if(priv->ieee80211->FwRWRF)
3464                 // We can force firmware to do RF-R/W
3465                 priv->Rf_Mode = RF_OP_By_FW;
3466         else
3467                 priv->Rf_Mode = RF_OP_By_SW_3wire;
3468
3469
3470         rtl8192_phy_updateInitGain(dev);
3471         /*--set CCK and OFDM Block "ON"--*/
3472         rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
3473         rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
3474
3475         if(priv->ResetProgress == RESET_TYPE_NORESET)
3476         {
3477                 //if D or C cut
3478                 u8 tmpvalue = read_nic_byte(dev, 0x301);
3479                 if(tmpvalue ==0x03)
3480                 {
3481                         priv->bDcut = TRUE;
3482                         RT_TRACE(COMP_POWER_TRACKING, "D-cut\n");
3483                 }
3484                 else
3485                 {
3486                         priv->bDcut = FALSE;
3487                         RT_TRACE(COMP_POWER_TRACKING, "C-cut\n");
3488                 }
3489                 dm_initialize_txpower_tracking(dev);
3490
3491                 if(priv->bDcut == TRUE)
3492                 {
3493                         u32 i, TempCCk;
3494                         u32 tmpRegA= rtl8192_QueryBBReg(dev,rOFDM0_XATxIQImbalance,bMaskDWord);
3495                 //      u32 tmpRegC= rtl8192_QueryBBReg(dev,rOFDM0_XCTxIQImbalance,bMaskDWord);
3496                         for(i = 0; i<TxBBGainTableLength; i++)
3497                         {
3498                                 if(tmpRegA == priv->txbbgain_table[i].txbbgain_value)
3499                                 {
3500                                         priv->rfa_txpowertrackingindex= (u8)i;
3501                                         priv->rfa_txpowertrackingindex_real= (u8)i;
3502                                         priv->rfa_txpowertracking_default= priv->rfa_txpowertrackingindex;
3503                                         break;
3504                                 }
3505                         }
3506
3507                         TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
3508
3509                         for(i=0 ; i<CCKTxBBGainTableLength ; i++)
3510                         {
3511
3512                                 if(TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0])
3513                                 {
3514                                         priv->cck_present_attentuation_20Mdefault=(u8) i;
3515                                         break;
3516                                 }
3517                         }
3518                         priv->cck_present_attentuation_40Mdefault= 0;
3519                         priv->cck_present_attentuation_difference= 0;
3520                         priv->cck_present_attentuation = priv->cck_present_attentuation_20Mdefault;
3521
3522         //              pMgntInfo->bTXPowerTracking = FALSE;//TEMPLY DISABLE
3523                 }
3524         }
3525         write_nic_byte(dev, 0x87, 0x0);
3526
3527
3528         return init_status;
3529 }
3530
3531 /* this configures registers for beacon tx and enables it via
3532  * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
3533  * be used to stop beacon transmission
3534  */
3535 /***************************************************************************
3536     -------------------------------NET STUFF---------------------------
3537 ***************************************************************************/
3538
3539 static struct net_device_stats *rtl8192_stats(struct net_device *dev)
3540 {
3541         struct r8192_priv *priv = ieee80211_priv(dev);
3542
3543         return &priv->ieee80211->stats;
3544 }
3545
3546 bool
3547 HalTxCheckStuck819xUsb(
3548         struct net_device *dev
3549         )
3550 {
3551         struct r8192_priv *priv = ieee80211_priv(dev);
3552         u16             RegTxCounter = read_nic_word(dev, 0x128);
3553         bool            bStuck = FALSE;
3554         RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
3555         if(priv->TxCounter==RegTxCounter)
3556                 bStuck = TRUE;
3557
3558         priv->TxCounter = RegTxCounter;
3559
3560         return bStuck;
3561 }
3562
3563 /*
3564 *       <Assumption: RT_TX_SPINLOCK is acquired.>
3565 *       First added: 2006.11.19 by emily
3566 */
3567 RESET_TYPE
3568 TxCheckStuck(struct net_device *dev)
3569 {
3570         struct r8192_priv *priv = ieee80211_priv(dev);
3571         u8                      QueueID;
3572 //      PRT_TCB                 pTcb;
3573 //      u8                      ResetThreshold;
3574         bool                    bCheckFwTxCnt = false;
3575         //unsigned long flags;
3576
3577         //
3578         // Decide such threshold according to current power save mode
3579         //
3580
3581 //     RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
3582 //           PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
3583 //           spin_lock_irqsave(&priv->ieee80211->lock,flags);
3584              for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
3585              {
3586                         if(QueueID == TXCMD_QUEUE)
3587                          continue;
3588 #ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
3589                         if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0) && (skb_queue_len(&priv->ieee80211->skb_drv_aggQ[QueueID]) == 0))
3590 #else
3591                         if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0)  && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
3592 #endif
3593                                 continue;
3594
3595                      bCheckFwTxCnt = true;
3596              }
3597 //           PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
3598 //      spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
3599 //      RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
3600         if(bCheckFwTxCnt)
3601         {
3602                 if(HalTxCheckStuck819xUsb(dev))
3603                 {
3604                         RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
3605                         return RESET_TYPE_SILENT;
3606                 }
3607         }
3608         return RESET_TYPE_NORESET;
3609 }
3610
3611 bool
3612 HalRxCheckStuck819xUsb(struct net_device *dev)
3613 {
3614         u16     RegRxCounter = read_nic_word(dev, 0x130);
3615         struct r8192_priv *priv = ieee80211_priv(dev);
3616         bool bStuck = FALSE;
3617         static u8       rx_chk_cnt = 0;
3618         RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
3619         // If rssi is small, we should check rx for long time because of bad rx.
3620         // or maybe it will continuous silent reset every 2 seconds.
3621         rx_chk_cnt++;
3622         if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
3623         {
3624                 rx_chk_cnt = 0; //high rssi, check rx stuck right now.
3625         }
3626         else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
3627                 ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
3628                 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
3629         {
3630                 if(rx_chk_cnt < 2)
3631                 {
3632                         return bStuck;
3633                 }
3634                 else
3635                 {
3636                         rx_chk_cnt = 0;
3637                 }
3638         }
3639         else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
3640                 (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
3641                 priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
3642         {
3643                 if(rx_chk_cnt < 4)
3644                 {
3645                         //DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
3646                         return bStuck;
3647                 }
3648                 else
3649                 {
3650                         rx_chk_cnt = 0;
3651                         //DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
3652                 }
3653         }
3654         else
3655         {
3656                 if(rx_chk_cnt < 8)
3657                 {
3658                         //DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
3659                         return bStuck;
3660                 }
3661                 else
3662                 {
3663                         rx_chk_cnt = 0;
3664                         //DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
3665                 }
3666         }
3667
3668         if(priv->RxCounter==RegRxCounter)
3669                 bStuck = TRUE;
3670
3671         priv->RxCounter = RegRxCounter;
3672
3673         return bStuck;
3674 }
3675
3676 RESET_TYPE
3677 RxCheckStuck(struct net_device *dev)
3678 {
3679         struct r8192_priv *priv = ieee80211_priv(dev);
3680         //int                     i;
3681         bool        bRxCheck = FALSE;
3682
3683 //       RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
3684         //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
3685
3686          if(priv->IrpPendingCount > 1)
3687                 bRxCheck = TRUE;
3688        //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
3689
3690 //       RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
3691         if(bRxCheck)
3692         {
3693                 if(HalRxCheckStuck819xUsb(dev))
3694                 {
3695                         RT_TRACE(COMP_RESET, "RxStuck Condition\n");
3696                         return RESET_TYPE_SILENT;
3697                 }
3698         }
3699         return RESET_TYPE_NORESET;
3700 }
3701
3702
3703 /**
3704 *       This function is called by Checkforhang to check whether we should ask OS to reset driver
3705 *
3706 *       \param pAdapter The adapter context for this miniport
3707 *
3708 *       Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
3709 *       to judge whether there is tx stuck.
3710 *       Note: This function may be required to be rewrite for Vista OS.
3711 *       <<<Assumption: Tx spinlock has been acquired >>>
3712 *
3713 *       8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
3714 */
3715 RESET_TYPE
3716 rtl819x_ifcheck_resetornot(struct net_device *dev)
3717 {
3718         struct r8192_priv *priv = ieee80211_priv(dev);
3719         RESET_TYPE      TxResetType = RESET_TYPE_NORESET;
3720         RESET_TYPE      RxResetType = RESET_TYPE_NORESET;
3721         RT_RF_POWER_STATE       rfState;
3722
3723         rfState = priv->ieee80211->eRFPowerState;
3724
3725         TxResetType = TxCheckStuck(dev);
3726         if( rfState != eRfOff ||
3727                 /*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
3728                 (priv->ieee80211->iw_mode != IW_MODE_ADHOC))
3729         {
3730                 // If driver is in the status of firmware download failure , driver skips RF initialization and RF is
3731                 // in turned off state. Driver should check whether Rx stuck and do silent reset. And
3732                 // if driver is in firmware download failure status, driver should initialize RF in the following
3733                 // silent reset procedure Emily, 2008.01.21
3734
3735                 // Driver should not check RX stuck in IBSS mode because it is required to
3736                 // set Check BSSID in order to send beacon, however, if check BSSID is
3737                 // set, STA cannot hear any packet at all. Emily, 2008.04.12
3738                 RxResetType = RxCheckStuck(dev);
3739         }
3740         if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
3741                 return RESET_TYPE_NORMAL;
3742         else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
3743                 RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
3744                 return RESET_TYPE_SILENT;
3745         }
3746         else
3747                 return RESET_TYPE_NORESET;
3748
3749 }
3750
3751 void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
3752 int _rtl8192_up(struct net_device *dev);
3753 int rtl8192_close(struct net_device *dev);
3754
3755
3756
3757 void
3758 CamRestoreAllEntry(     struct net_device *dev)
3759 {
3760         u8 EntryId = 0;
3761         struct r8192_priv *priv = ieee80211_priv(dev);
3762         u8*     MacAddr = priv->ieee80211->current_network.bssid;
3763
3764         static u8       CAM_CONST_ADDR[4][6] = {
3765                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3766                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3767                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3768                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
3769         static u8       CAM_CONST_BROAD[] =
3770                 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3771
3772         RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
3773
3774
3775         if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
3776             (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
3777         {
3778
3779                 for(EntryId=0; EntryId<4; EntryId++)
3780                 {
3781                         {
3782                                 MacAddr = CAM_CONST_ADDR[EntryId];
3783                                 setKey(dev,
3784                                                 EntryId ,
3785                                                 EntryId,
3786                                                 priv->ieee80211->pairwise_key_type,
3787                                                 MacAddr,
3788                                                 0,
3789                                                 NULL);
3790                         }
3791                 }
3792
3793         }
3794         else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
3795         {
3796
3797                 {
3798                         if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3799                                 setKey(dev,
3800                                                 4,
3801                                                 0,
3802                                                 priv->ieee80211->pairwise_key_type,
3803                                                 (u8*)dev->dev_addr,
3804                                                 0,
3805                                                 NULL);
3806                         else
3807                                 setKey(dev,
3808                                                 4,
3809                                                 0,
3810                                                 priv->ieee80211->pairwise_key_type,
3811                                                 MacAddr,
3812                                                 0,
3813                                                 NULL);
3814                 }
3815         }
3816         else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
3817         {
3818
3819                 {
3820                         if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3821                                 setKey(dev,
3822                                                 4,
3823                                                 0,
3824                                                 priv->ieee80211->pairwise_key_type,
3825                                                 (u8*)dev->dev_addr,
3826                                                 0,
3827                                                 NULL);
3828                         else
3829                                 setKey(dev,
3830                                                 4,
3831                                                 0,
3832                                                 priv->ieee80211->pairwise_key_type,
3833                                                 MacAddr,
3834                                                 0,
3835                                                 NULL);
3836                 }
3837         }
3838
3839
3840
3841         if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
3842         {
3843                 MacAddr = CAM_CONST_BROAD;
3844                 for(EntryId=1 ; EntryId<4 ; EntryId++)
3845                 {
3846                         {
3847                                 setKey(dev,
3848                                                 EntryId,
3849                                                 EntryId,
3850                                                 priv->ieee80211->group_key_type,
3851                                                 MacAddr,
3852                                                 0,
3853                                                 NULL);
3854                         }
3855                 }
3856                 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3857                                 setKey(dev,
3858                                                 0,
3859                                                 0,
3860                                                 priv->ieee80211->group_key_type,
3861                                                 CAM_CONST_ADDR[0],
3862                                                 0,
3863                                                 NULL);
3864         }
3865         else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
3866         {
3867                 MacAddr = CAM_CONST_BROAD;
3868                 for(EntryId=1; EntryId<4 ; EntryId++)
3869                 {
3870                         {
3871                                 setKey(dev,
3872                                                 EntryId ,
3873                                                 EntryId,
3874                                                 priv->ieee80211->group_key_type,
3875                                                 MacAddr,
3876                                                 0,
3877                                                 NULL);
3878                         }
3879                 }
3880
3881                 if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
3882                                 setKey(dev,
3883                                                 0 ,
3884                                                 0,
3885                                                 priv->ieee80211->group_key_type,
3886                                                 CAM_CONST_ADDR[0],
3887                                                 0,
3888                                                 NULL);
3889         }
3890 }
3891 //////////////////////////////////////////////////////////////
3892 // This function is used to fix Tx/Rx stop bug temporarily.
3893 // This function will do "system reset" to NIC when Tx or Rx is stuck.
3894 // The method checking Tx/Rx stuck of this function is supported by FW,
3895 // which reports Tx and Rx counter to register 0x128 and 0x130.
3896 //////////////////////////////////////////////////////////////
3897 void
3898 rtl819x_ifsilentreset(struct net_device *dev)
3899 {
3900         //OCTET_STRING asocpdu;
3901         struct r8192_priv *priv = ieee80211_priv(dev);
3902         u8      reset_times = 0;
3903         int reset_status = 0;
3904         struct ieee80211_device *ieee = priv->ieee80211;
3905
3906
3907         // 2007.07.20. If we need to check CCK stop, please uncomment this line.
3908         //bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
3909
3910         if(priv->ResetProgress==RESET_TYPE_NORESET)
3911         {
3912 RESET_START:
3913
3914                 RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
3915
3916                 // Set the variable for reset.
3917                 priv->ResetProgress = RESET_TYPE_SILENT;
3918 //              rtl8192_close(dev);
3919                 down(&priv->wx_sem);
3920                 if(priv->up == 0)
3921                 {
3922                         RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
3923                         up(&priv->wx_sem);
3924                         return ;
3925                 }
3926                 priv->up = 0;
3927                 RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
3928 //              if(!netif_queue_stopped(dev))
3929 //                      netif_stop_queue(dev);
3930
3931                 rtl8192_rtx_disable(dev);
3932                 rtl8192_cancel_deferred_work(priv);
3933                 deinit_hal_dm(dev);
3934                 del_timer_sync(&priv->watch_dog_timer);
3935
3936                 ieee->sync_scan_hurryup = 1;
3937                 if(ieee->state == IEEE80211_LINKED)
3938                 {
3939                         down(&ieee->wx_sem);
3940                         printk("ieee->state is IEEE80211_LINKED\n");
3941                         ieee80211_stop_send_beacons(priv->ieee80211);
3942                         del_timer_sync(&ieee->associate_timer);
3943                         cancel_delayed_work(&ieee->associate_retry_wq);
3944                         ieee80211_stop_scan(ieee);
3945                         netif_carrier_off(dev);
3946                         up(&ieee->wx_sem);
3947                 }
3948                 else{
3949                         printk("ieee->state is NOT LINKED\n");
3950                         ieee80211_softmac_stop_protocol(priv->ieee80211);                       }
3951                 up(&priv->wx_sem);
3952                 RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
3953         //rtl8192_irq_disable(dev);
3954                 RT_TRACE(COMP_RESET,"%s():===========>start up the driver\n",__FUNCTION__);
3955                 reset_status = _rtl8192_up(dev);
3956
3957                 RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
3958                 if(reset_status == -EAGAIN)
3959                 {
3960                         if(reset_times < 3)
3961                         {
3962                                 reset_times++;
3963                                 goto RESET_START;
3964                         }
3965                         else
3966                         {
3967                                 RT_TRACE(COMP_ERR," ERR!!! %s():  Reset Failed!!\n", __FUNCTION__);
3968                         }
3969                 }
3970                 ieee->is_silent_reset = 1;
3971                 EnableHWSecurityConfig8192(dev);
3972                 if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
3973                 {
3974                         ieee->set_chan(ieee->dev, ieee->current_network.channel);
3975
3976                         queue_work(ieee->wq, &ieee->associate_complete_wq);
3977
3978                 }
3979                 else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
3980                 {
3981                         ieee->set_chan(ieee->dev, ieee->current_network.channel);
3982                         ieee->link_change(ieee->dev);
3983
3984                 //      notify_wx_assoc_event(ieee);
3985
3986                         ieee80211_start_send_beacons(ieee);
3987
3988                         if (ieee->data_hard_resume)
3989                                 ieee->data_hard_resume(ieee->dev);
3990                         netif_carrier_on(ieee->dev);
3991                 }
3992
3993                 CamRestoreAllEntry(dev);
3994
3995                 priv->ResetProgress = RESET_TYPE_NORESET;
3996                 priv->reset_count++;
3997
3998                 priv->bForcedSilentReset =false;
3999                 priv->bResetInProgress = false;
4000
4001                 // For test --> force write UFWP.
4002                 write_nic_byte(dev, UFWP, 1);
4003                 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
4004         }
4005 }
4006
4007 void CAM_read_entry(
4008         struct net_device *dev,
4009         u32                     iIndex
4010 )
4011 {
4012         u32 target_command=0;
4013          u32 target_content=0;
4014          u8 entry_i=0;
4015          u32 ulStatus;
4016         s32 i=100;
4017 //      printk("=======>start read CAM\n");
4018         for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
4019         {
4020         // polling bit, and No Write enable, and address
4021                 target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
4022                 target_command= target_command | BIT31;
4023
4024         //Check polling bit is clear
4025 //      mdelay(1);
4026                 while((i--)>=0)
4027                 {
4028                         ulStatus = read_nic_dword(dev, RWCAM);
4029                         if(ulStatus & BIT31){
4030                                 continue;
4031                         }
4032                         else{
4033                                 break;
4034                         }
4035                 }
4036                 write_nic_dword(dev, RWCAM, target_command);
4037                 RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
4038          //     printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
4039                 target_content = read_nic_dword(dev, RCAMO);
4040                 RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
4041          //     printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
4042         }
4043         printk("\n");
4044 }
4045
4046 void rtl819x_update_rxcounts(
4047         struct r8192_priv *priv,
4048         u32* TotalRxBcnNum,
4049         u32* TotalRxDataNum
4050 )
4051 {
4052         u16                     SlotIndex;
4053         u8                      i;
4054
4055         *TotalRxBcnNum = 0;
4056         *TotalRxDataNum = 0;
4057
4058         SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
4059         priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
4060         priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
4061         for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
4062                 *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
4063                 *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
4064         }
4065 }
4066
4067
4068 extern  void    rtl819x_watchdog_wqcallback(struct work_struct *work)
4069 {
4070         struct delayed_work *dwork = container_of(work,struct delayed_work,work);
4071        struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
4072        struct net_device *dev = priv->ieee80211->dev;
4073         struct ieee80211_device* ieee = priv->ieee80211;
4074         RESET_TYPE      ResetType = RESET_TYPE_NORESET;
4075         static u8       check_reset_cnt=0;
4076         bool bBusyTraffic = false;
4077
4078         if(!priv->up)
4079                 return;
4080         hal_dm_watchdog(dev);
4081
4082         {//to get busy traffic condition
4083                 if(ieee->state == IEEE80211_LINKED)
4084                 {
4085                         if(     ieee->LinkDetectInfo.NumRxOkInPeriod> 666 ||
4086                                 ieee->LinkDetectInfo.NumTxOkInPeriod> 666 ) {
4087                                 bBusyTraffic = true;
4088                         }
4089                         ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
4090                         ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
4091                         ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
4092                 }
4093         }
4094         //added by amy for AP roaming
4095         {
4096                 if(priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA)
4097                 {
4098                         u32     TotalRxBcnNum = 0;
4099                         u32     TotalRxDataNum = 0;
4100
4101                         rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
4102                         if((TotalRxBcnNum+TotalRxDataNum) == 0)
4103                         {
4104                                 #ifdef TODO
4105                                 if(rfState == eRfOff)
4106                                         RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
4107                                 #endif
4108                                 printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
4109                         //      Dot11d_Reset(dev);
4110                                 priv->ieee80211->state = IEEE80211_ASSOCIATING;
4111                                 notify_wx_assoc_event(priv->ieee80211);
4112                                 RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
4113                                 priv->ieee80211->link_change(dev);
4114                                 queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
4115
4116                         }
4117                 }
4118                 priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod=0;
4119                 priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod=0;
4120         }
4121 //      CAM_read_entry(dev,4);
4122         //check if reset the driver
4123         if(check_reset_cnt++ >= 3)
4124         {
4125                 ResetType = rtl819x_ifcheck_resetornot(dev);
4126                 check_reset_cnt = 3;
4127                 //DbgPrint("Start to check silent reset\n");
4128         }
4129         //      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);
4130         if( (priv->force_reset) || (priv->ResetProgress==RESET_TYPE_NORESET &&
4131                 (priv->bForcedSilentReset ||
4132                 (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))) // This is control by OID set in Pomelo
4133         {
4134                 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);
4135                 rtl819x_ifsilentreset(dev);
4136         }
4137         priv->force_reset = false;
4138         priv->bForcedSilentReset = false;
4139         priv->bResetInProgress = false;
4140         RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
4141
4142 }
4143
4144 void watch_dog_timer_callback(unsigned long data)
4145 {
4146         struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
4147         //printk("===============>watch_dog timer\n");
4148         queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
4149         mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
4150 }
4151 int _rtl8192_up(struct net_device *dev)
4152 {
4153         struct r8192_priv *priv = ieee80211_priv(dev);
4154         //int i;
4155         int init_status = 0;
4156         priv->up=1;
4157         priv->ieee80211->ieee_up=1;
4158         RT_TRACE(COMP_INIT, "Bringing up iface");
4159         init_status = rtl8192_adapter_start(dev);
4160         if(!init_status)
4161         {
4162                 RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization failed!\n", __FUNCTION__);
4163                 priv->up=priv->ieee80211->ieee_up = 0;
4164                 return -EAGAIN;
4165         }
4166         RT_TRACE(COMP_INIT, "start adapter finished\n");
4167         rtl8192_rx_enable(dev);
4168 //      rtl8192_tx_enable(dev);
4169         if(priv->ieee80211->state != IEEE80211_LINKED)
4170         ieee80211_softmac_start_protocol(priv->ieee80211);
4171         ieee80211_reset_queue(priv->ieee80211);
4172         watch_dog_timer_callback((unsigned long) dev);
4173         if(!netif_queue_stopped(dev))
4174                 netif_start_queue(dev);
4175         else
4176                 netif_wake_queue(dev);
4177
4178         return 0;
4179 }
4180
4181
4182 int rtl8192_open(struct net_device *dev)
4183 {
4184         struct r8192_priv *priv = ieee80211_priv(dev);
4185         int ret;
4186         down(&priv->wx_sem);
4187         ret = rtl8192_up(dev);
4188         up(&priv->wx_sem);
4189         return ret;
4190
4191 }
4192
4193
4194 int rtl8192_up(struct net_device *dev)
4195 {
4196         struct r8192_priv *priv = ieee80211_priv(dev);
4197
4198         if (priv->up == 1) return -1;
4199
4200         return _rtl8192_up(dev);
4201 }
4202
4203
4204 int rtl8192_close(struct net_device *dev)
4205 {
4206         struct r8192_priv *priv = ieee80211_priv(dev);
4207         int ret;
4208
4209         down(&priv->wx_sem);
4210
4211         ret = rtl8192_down(dev);
4212
4213         up(&priv->wx_sem);
4214
4215         return ret;
4216
4217 }
4218
4219 int rtl8192_down(struct net_device *dev)
4220 {
4221         struct r8192_priv *priv = ieee80211_priv(dev);
4222         int i;
4223
4224         if (priv->up == 0) return -1;
4225
4226         priv->up=0;
4227         priv->ieee80211->ieee_up = 0;
4228         RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
4229 /* FIXME */
4230         if (!netif_queue_stopped(dev))
4231                 netif_stop_queue(dev);
4232
4233         rtl8192_rtx_disable(dev);
4234         //rtl8192_irq_disable(dev);
4235
4236  /* Tx related queue release */
4237         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4238                 skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
4239         }
4240         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4241                 skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
4242         }
4243
4244         for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4245                 skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
4246         }
4247
4248         //as cancel_delayed_work will del work->timer, so if work is not defined as struct delayed_work, it will corrupt
4249 //      flush_scheduled_work();
4250         rtl8192_cancel_deferred_work(priv);
4251         deinit_hal_dm(dev);
4252         del_timer_sync(&priv->watch_dog_timer);
4253
4254
4255         ieee80211_softmac_stop_protocol(priv->ieee80211);
4256         memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
4257         RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
4258
4259                 return 0;
4260 }
4261
4262
4263 void rtl8192_commit(struct net_device *dev)
4264 {
4265         struct r8192_priv *priv = ieee80211_priv(dev);
4266         int reset_status = 0;
4267         //u8 reset_times = 0;
4268         if (priv->up == 0) return ;
4269         priv->up = 0;
4270
4271         rtl8192_cancel_deferred_work(priv);
4272         del_timer_sync(&priv->watch_dog_timer);
4273         //cancel_delayed_work(&priv->SwChnlWorkItem);
4274
4275         ieee80211_softmac_stop_protocol(priv->ieee80211);
4276
4277         //rtl8192_irq_disable(dev);
4278         rtl8192_rtx_disable(dev);
4279         reset_status = _rtl8192_up(dev);
4280
4281 }
4282
4283 /*
4284 void rtl8192_restart(struct net_device *dev)
4285 {
4286         struct r8192_priv *priv = ieee80211_priv(dev);
4287 */
4288 void rtl8192_restart(struct work_struct *work)
4289 {
4290         struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
4291         struct net_device *dev = priv->ieee80211->dev;
4292
4293         down(&priv->wx_sem);
4294
4295         rtl8192_commit(dev);
4296
4297         up(&priv->wx_sem);
4298 }
4299
4300 static void r8192_set_multicast(struct net_device *dev)
4301 {
4302         struct r8192_priv *priv = ieee80211_priv(dev);
4303         short promisc;
4304
4305         //down(&priv->wx_sem);
4306
4307         /* FIXME FIXME */
4308
4309         promisc = (dev->flags & IFF_PROMISC) ? 1:0;
4310
4311         if (promisc != priv->promisc)
4312         //      rtl8192_commit(dev);
4313
4314         priv->promisc = promisc;
4315
4316         //schedule_work(&priv->reset_wq);
4317         //up(&priv->wx_sem);
4318 }
4319
4320
4321 int r8192_set_mac_adr(struct net_device *dev, void *mac)
4322 {
4323         struct r8192_priv *priv = ieee80211_priv(dev);
4324         struct sockaddr *addr = mac;
4325
4326         down(&priv->wx_sem);
4327
4328         memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
4329
4330         schedule_work(&priv->reset_wq);
4331         up(&priv->wx_sem);
4332
4333         return 0;
4334 }
4335
4336 /* based on ipw2200 driver */
4337 int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
4338 {
4339         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4340         struct iwreq *wrq = (struct iwreq *)rq;
4341         int ret=-1;
4342         struct ieee80211_device *ieee = priv->ieee80211;
4343         u32 key[4];
4344         u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
4345         struct iw_point *p = &wrq->u.data;
4346         struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
4347
4348         down(&priv->wx_sem);
4349
4350
4351      if (p->length < sizeof(struct ieee_param) || !p->pointer){
4352              ret = -EINVAL;
4353              goto out;
4354         }
4355
4356      ipw = kmalloc(p->length, GFP_KERNEL);
4357      if (ipw == NULL){
4358              ret = -ENOMEM;
4359              goto out;
4360      }
4361      if (copy_from_user(ipw, p->pointer, p->length)) {
4362                 kfree(ipw);
4363             ret = -EFAULT;
4364             goto out;
4365         }
4366
4367         switch (cmd) {
4368             case RTL_IOCTL_WPA_SUPPLICANT:
4369         //parse here for HW security
4370                         if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
4371                         {
4372                                 if (ipw->u.crypt.set_tx)
4373                                 {
4374                                         if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
4375                                                 ieee->pairwise_key_type = KEY_TYPE_CCMP;
4376                                         else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
4377                                                 ieee->pairwise_key_type = KEY_TYPE_TKIP;
4378                                         else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
4379                                         {
4380                                                 if (ipw->u.crypt.key_len == 13)
4381                                                         ieee->pairwise_key_type = KEY_TYPE_WEP104;
4382                                                 else if (ipw->u.crypt.key_len == 5)
4383                                                         ieee->pairwise_key_type = KEY_TYPE_WEP40;
4384                                         }
4385                                         else
4386                                                 ieee->pairwise_key_type = KEY_TYPE_NA;
4387
4388                                         if (ieee->pairwise_key_type)
4389                                         {
4390                                                 memcpy((u8*)key, ipw->u.crypt.key, 16);
4391                                                 EnableHWSecurityConfig8192(dev);
4392                                         //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!
4393                                         //added by WB.
4394                                                 setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
4395                                                 if (ieee->auth_mode != 2)
4396                                                 setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
4397                                         }
4398                                 }
4399                                 else //if (ipw->u.crypt.idx) //group key use idx > 0
4400                                 {
4401                                         memcpy((u8*)key, ipw->u.crypt.key, 16);
4402                                         if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
4403                                                 ieee->group_key_type= KEY_TYPE_CCMP;
4404                                         else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
4405                                                 ieee->group_key_type = KEY_TYPE_TKIP;
4406                                         else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
4407                                         {
4408                                                 if (ipw->u.crypt.key_len == 13)
4409                                                         ieee->group_key_type = KEY_TYPE_WEP104;
4410                                                 else if (ipw->u.crypt.key_len == 5)
4411                                                         ieee->group_key_type = KEY_TYPE_WEP40;
4412                                         }
4413                                         else
4414                                                 ieee->group_key_type = KEY_TYPE_NA;
4415
4416                                         if (ieee->group_key_type)
4417                                         {
4418                                                         setKey( dev,
4419                                                                 ipw->u.crypt.idx,
4420                                                                 ipw->u.crypt.idx,               //KeyIndex
4421                                                                 ieee->group_key_type,   //KeyType
4422                                                                 broadcast_addr, //MacAddr
4423                                                                 0,              //DefaultKey
4424                                                                 key);           //KeyContent
4425                                         }
4426                                 }
4427                         }
4428 #ifdef JOHN_HWSEC_DEBUG
4429                 //john's test 0711
4430                 printk("@@ wrq->u pointer = ");
4431                 for(i=0;i<wrq->u.data.length;i++){
4432                         if(i%10==0) printk("\n");
4433                         printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
4434                 }
4435                 printk("\n");
4436 #endif /*JOHN_HWSEC_DEBUG*/
4437                 ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
4438                 break;
4439
4440             default:
4441                 ret = -EOPNOTSUPP;
4442                 break;
4443         }
4444         kfree(ipw);
4445         ipw = NULL;
4446 out:
4447         up(&priv->wx_sem);
4448         return ret;
4449 }
4450
4451 u8 HwRateToMRate90(bool bIsHT, u8 rate)
4452 {
4453         u8  ret_rate = 0xff;
4454
4455         if(!bIsHT) {
4456                 switch(rate) {
4457                         case DESC90_RATE1M:   ret_rate = MGN_1M;         break;
4458                         case DESC90_RATE2M:   ret_rate = MGN_2M;         break;
4459                         case DESC90_RATE5_5M: ret_rate = MGN_5_5M;       break;
4460                         case DESC90_RATE11M:  ret_rate = MGN_11M;        break;
4461                         case DESC90_RATE6M:   ret_rate = MGN_6M;         break;
4462                         case DESC90_RATE9M:   ret_rate = MGN_9M;         break;
4463                         case DESC90_RATE12M:  ret_rate = MGN_12M;        break;
4464                         case DESC90_RATE18M:  ret_rate = MGN_18M;        break;
4465                         case DESC90_RATE24M:  ret_rate = MGN_24M;        break;
4466                         case DESC90_RATE36M:  ret_rate = MGN_36M;        break;
4467                         case DESC90_RATE48M:  ret_rate = MGN_48M;        break;
4468                         case DESC90_RATE54M:  ret_rate = MGN_54M;        break;
4469
4470                         default:
4471                                 ret_rate = 0xff;
4472                                 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
4473                                 break;
4474                 }
4475
4476         } else {
4477                 switch(rate) {
4478                         case DESC90_RATEMCS0:   ret_rate = MGN_MCS0;    break;
4479                         case DESC90_RATEMCS1:   ret_rate = MGN_MCS1;    break;
4480                         case DESC90_RATEMCS2:   ret_rate = MGN_MCS2;    break;
4481                         case DESC90_RATEMCS3:   ret_rate = MGN_MCS3;    break;
4482                         case DESC90_RATEMCS4:   ret_rate = MGN_MCS4;    break;
4483                         case DESC90_RATEMCS5:   ret_rate = MGN_MCS5;    break;
4484                         case DESC90_RATEMCS6:   ret_rate = MGN_MCS6;    break;
4485                         case DESC90_RATEMCS7:   ret_rate = MGN_MCS7;    break;
4486                         case DESC90_RATEMCS8:   ret_rate = MGN_MCS8;    break;
4487                         case DESC90_RATEMCS9:   ret_rate = MGN_MCS9;    break;
4488                         case DESC90_RATEMCS10:  ret_rate = MGN_MCS10;   break;
4489                         case DESC90_RATEMCS11:  ret_rate = MGN_MCS11;   break;
4490                         case DESC90_RATEMCS12:  ret_rate = MGN_MCS12;   break;
4491                         case DESC90_RATEMCS13:  ret_rate = MGN_MCS13;   break;
4492                         case DESC90_RATEMCS14:  ret_rate = MGN_MCS14;   break;
4493                         case DESC90_RATEMCS15:  ret_rate = MGN_MCS15;   break;
4494                         case DESC90_RATEMCS32:  ret_rate = (0x80|0x20); break;
4495
4496                         default:
4497                                 ret_rate = 0xff;
4498                                 RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
4499                                 break;
4500                 }
4501         }
4502
4503         return ret_rate;
4504 }
4505
4506 /**
4507  * Function:     UpdateRxPktTimeStamp
4508  * Overview:     Record the TSF time stamp when receiving a packet
4509  *
4510  * Input:
4511  *       PADAPTER        Adapter
4512  *       PRT_RFD         pRfd,
4513  *
4514  * Output:
4515  *       PRT_RFD         pRfd
4516  *                               (pRfd->Status.TimeStampHigh is updated)
4517  *                               (pRfd->Status.TimeStampLow is updated)
4518  * Return:
4519  *               None
4520  */
4521 void UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
4522 {
4523         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4524
4525         if(stats->bIsAMPDU && !stats->bFirstMPDU) {
4526                 stats->mac_time[0] = priv->LastRxDescTSFLow;
4527                 stats->mac_time[1] = priv->LastRxDescTSFHigh;
4528         } else {
4529                 priv->LastRxDescTSFLow = stats->mac_time[0];
4530                 priv->LastRxDescTSFHigh = stats->mac_time[1];
4531         }
4532 }
4533
4534 //by amy 080606
4535
4536 long rtl819x_translate_todbm(u8 signal_strength_index   )// 0-100 index.
4537 {
4538         long    signal_power; // in dBm.
4539
4540         // Translate to dBm (x=0.5y-95).
4541         signal_power = (long)((signal_strength_index + 1) >> 1);
4542         signal_power -= 95;
4543
4544         return signal_power;
4545 }
4546
4547
4548 /* 2008/01/22 MH We can not declare RSSI/EVM total value of sliding window to
4549     be a local static. Otherwise, it may increase when we return from S3/S4. The
4550     value will be kept in memory or disk. Declare the value in the adaptor
4551     and it will be reinitialized when returned from S3/S4. */
4552 void rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
4553 {
4554         bool bcheck = false;
4555         u8      rfpath;
4556         u32     nspatial_stream, tmp_val;
4557         //u8    i;
4558         static u32 slide_rssi_index=0, slide_rssi_statistics=0;
4559         static u32 slide_evm_index=0, slide_evm_statistics=0;
4560         static u32 last_rssi=0, last_evm=0;
4561
4562         static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
4563         static u32 last_beacon_adc_pwdb=0;
4564
4565         struct ieee80211_hdr_3addr *hdr;
4566         u16 sc ;
4567         unsigned int frag,seq;
4568         hdr = (struct ieee80211_hdr_3addr *)buffer;
4569         sc = le16_to_cpu(hdr->seq_ctl);
4570         frag = WLAN_GET_SEQ_FRAG(sc);
4571         seq = WLAN_GET_SEQ_SEQ(sc);
4572         //cosa add 04292008 to record the sequence number
4573         pcurrent_stats->Seq_Num = seq;
4574         //
4575         // Check whether we should take the previous packet into accounting
4576         //
4577         if(!pprevious_stats->bIsAMPDU)
4578         {
4579                 // if previous packet is not aggregated packet
4580                 bcheck = true;
4581         }else
4582         {
4583         }
4584
4585
4586         if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
4587         {
4588                 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
4589                 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
4590                 priv->stats.slide_rssi_total -= last_rssi;
4591         }
4592         priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
4593
4594         priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
4595         if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
4596                 slide_rssi_index = 0;
4597
4598         // <1> Showed on UI for user, in dbm
4599         tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
4600         priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
4601         pcurrent_stats->rssi = priv->stats.signal_strength;
4602         //
4603         // If the previous packet does not match the criteria, neglect it
4604         //
4605         if(!pprevious_stats->bPacketMatchBSSID)
4606         {
4607                 if(!pprevious_stats->bToSelfBA)
4608                         return;
4609         }
4610
4611         if(!bcheck)
4612                 return;
4613
4614
4615         //rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
4616
4617         //
4618         // Check RSSI
4619         //
4620         priv->stats.num_process_phyinfo++;
4621
4622         /* record the general signal strength to the sliding window. */
4623
4624
4625         // <2> Showed on UI for engineering
4626         // hardware does not provide rssi information for each rf path in CCK
4627         if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
4628         {
4629                 for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
4630                 {
4631                      if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
4632                                  continue;
4633
4634                         //Fixed by Jacken 2008-03-20
4635                         if(priv->stats.rx_rssi_percentage[rfpath] == 0)
4636                         {
4637                                 priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
4638                                 //DbgPrint("MIMO RSSI initialize \n");
4639                         }
4640                         if(pprevious_stats->RxMIMOSignalStrength[rfpath]  > priv->stats.rx_rssi_percentage[rfpath])
4641                         {
4642                                 priv->stats.rx_rssi_percentage[rfpath] =
4643                                         ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4644                                         (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4645                                 priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath]  + 1;
4646                         }
4647                         else
4648                         {
4649                                 priv->stats.rx_rssi_percentage[rfpath] =
4650                                         ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
4651                                         (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
4652                         }
4653                         RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath]  = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
4654                 }
4655         }
4656
4657
4658         //
4659         // Check PWDB.
4660         //
4661         RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4662                                 pprevious_stats->bIsCCK? "CCK": "OFDM",
4663                                 pprevious_stats->RxPWDBAll);
4664
4665         if(pprevious_stats->bPacketBeacon)
4666         {
4667 /* record the beacon pwdb to the sliding window. */
4668                 if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4669                 {
4670                         slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
4671                         last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
4672                         priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
4673                         //DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
4674                         //      slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
4675                 }
4676                 priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
4677                 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
4678                 //DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
4679                 slide_beacon_adc_pwdb_index++;
4680                 if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
4681                         slide_beacon_adc_pwdb_index = 0;
4682                 pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
4683                 if(pprevious_stats->RxPWDBAll >= 3)
4684                         pprevious_stats->RxPWDBAll -= 3;
4685         }
4686
4687         RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
4688                                 pprevious_stats->bIsCCK? "CCK": "OFDM",
4689                                 pprevious_stats->RxPWDBAll);
4690
4691
4692         if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
4693         {
4694                 if(priv->undecorated_smoothed_pwdb < 0) // initialize
4695                 {
4696                         priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
4697                         //DbgPrint("First pwdb initialize \n");
4698                 }
4699                 if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
4700                 {
4701                         priv->undecorated_smoothed_pwdb =
4702                                         ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4703                                         (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4704                         priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
4705                 }
4706                 else
4707                 {
4708                         priv->undecorated_smoothed_pwdb =
4709                                         ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
4710                                         (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
4711                 }
4712
4713         }
4714
4715         //
4716         // Check EVM
4717         //
4718         /* record the general EVM to the sliding window. */
4719         if(pprevious_stats->SignalQuality == 0)
4720         {
4721         }
4722         else
4723         {
4724                 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
4725                         if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
4726                                 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
4727                                 last_evm = priv->stats.slide_evm[slide_evm_index];
4728                                 priv->stats.slide_evm_total -= last_evm;
4729                         }
4730
4731                         priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
4732
4733                         priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
4734                         if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
4735                                 slide_evm_index = 0;
4736
4737                         // <1> Showed on UI for user, in percentage.
4738                         tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
4739                         priv->stats.signal_quality = tmp_val;
4740                         //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
4741                         priv->stats.last_signal_strength_inpercent = tmp_val;
4742                 }
4743
4744                 // <2> Showed on UI for engineering
4745                 if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
4746                 {
4747                         for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
4748                         {
4749                                 if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
4750                                 {
4751                                         if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
4752                                         {
4753                                                 priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
4754                                         }
4755                                         priv->stats.rx_evm_percentage[nspatial_stream] =
4756                                                 ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
4757                                                 (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
4758                                 }
4759                         }
4760                 }
4761         }
4762
4763
4764 }
4765
4766 /*-----------------------------------------------------------------------------
4767  * Function:    rtl819x_query_rxpwrpercentage()
4768  *
4769  * Overview:
4770  *
4771  * Input:               char            antpower
4772  *
4773  * Output:              NONE
4774  *
4775  * Return:              0-100 percentage
4776  *
4777  * Revised History:
4778  *      When            Who             Remark
4779  *      05/26/2008      amy             Create Version 0 porting from windows code.
4780  *
4781  *---------------------------------------------------------------------------*/
4782 static u8 rtl819x_query_rxpwrpercentage(
4783         char            antpower
4784         )
4785 {
4786         if ((antpower <= -100) || (antpower >= 20))
4787         {
4788                 return  0;
4789         }
4790         else if (antpower >= 0)
4791         {
4792                 return  100;
4793         }
4794         else
4795         {
4796                 return  (100+antpower);
4797         }
4798
4799 }       /* QueryRxPwrPercentage */
4800
4801 static u8
4802 rtl819x_evm_dbtopercentage(
4803     char value
4804     )
4805 {
4806     char ret_val;
4807
4808     ret_val = value;
4809
4810     if(ret_val >= 0)
4811         ret_val = 0;
4812     if(ret_val <= -33)
4813         ret_val = -33;
4814     ret_val = 0 - ret_val;
4815     ret_val*=3;
4816         if(ret_val == 99)
4817                 ret_val = 100;
4818     return(ret_val);
4819 }
4820 //
4821 //      Description:
4822 //      We want good-looking for signal strength/quality
4823 //      2007/7/19 01:09, by cosa.
4824 //
4825 long
4826 rtl819x_signal_scale_mapping(
4827         long currsig
4828         )
4829 {
4830         long retsig;
4831
4832         // Step 1. Scale mapping.
4833         if(currsig >= 61 && currsig <= 100)
4834         {
4835                 retsig = 90 + ((currsig - 60) / 4);
4836         }
4837         else if(currsig >= 41 && currsig <= 60)
4838         {
4839                 retsig = 78 + ((currsig - 40) / 2);
4840         }
4841         else if(currsig >= 31 && currsig <= 40)
4842         {
4843                 retsig = 66 + (currsig - 30);
4844         }
4845         else if(currsig >= 21 && currsig <= 30)
4846         {
4847                 retsig = 54 + (currsig - 20);
4848         }
4849         else if(currsig >= 5 && currsig <= 20)
4850         {
4851                 retsig = 42 + (((currsig - 5) * 2) / 3);
4852         }
4853         else if(currsig == 4)
4854         {
4855                 retsig = 36;
4856         }
4857         else if(currsig == 3)
4858         {
4859                 retsig = 27;
4860         }
4861         else if(currsig == 2)
4862         {
4863                 retsig = 18;
4864         }
4865         else if(currsig == 1)
4866         {
4867                 retsig = 9;
4868         }
4869         else
4870         {
4871                 retsig = currsig;
4872         }
4873
4874         return retsig;
4875 }
4876
4877 static void rtl8192_query_rxphystatus(
4878         struct r8192_priv * priv,
4879         struct ieee80211_rx_stats * pstats,
4880         rx_drvinfo_819x_usb  * pdrvinfo,
4881         struct ieee80211_rx_stats * precord_stats,
4882         bool bpacket_match_bssid,
4883         bool bpacket_toself,
4884         bool bPacketBeacon,
4885         bool bToSelfBA
4886         )
4887 {
4888         //PRT_RFD_STATUS                pRtRfdStatus = &(pRfd->Status);
4889         phy_sts_ofdm_819xusb_t* pofdm_buf;
4890         phy_sts_cck_819xusb_t   *       pcck_buf;
4891         phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
4892         u8                              *prxpkt;
4893         u8                              i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
4894         char                            rx_pwr[4], rx_pwr_all=0;
4895         //long                          rx_avg_pwr = 0;
4896         char                            rx_snrX, rx_evmX;
4897         u8                              evm, pwdb_all;
4898         u32                             RSSI, total_rssi=0;//, total_evm=0;
4899 //      long                            signal_strength_index = 0;
4900         u8                              is_cck_rate=0;
4901         u8                              rf_rx_num = 0;
4902
4903
4904         priv->stats.numqry_phystatus++;
4905
4906         is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
4907
4908         // Record it for next packet processing
4909         memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
4910         pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
4911         pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
4912         pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
4913         pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
4914         pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
4915
4916         prxpkt = (u8*)pdrvinfo;
4917
4918         /* Move pointer to the 16th bytes. Phy status start address. */
4919         prxpkt += sizeof(rx_drvinfo_819x_usb);
4920
4921         /* Initial the cck and ofdm buffer pointer */
4922         pcck_buf = (phy_sts_cck_819xusb_t *)prxpkt;
4923         pofdm_buf = (phy_sts_ofdm_819xusb_t *)prxpkt;
4924
4925         pstats->RxMIMOSignalQuality[0] = -1;
4926         pstats->RxMIMOSignalQuality[1] = -1;
4927         precord_stats->RxMIMOSignalQuality[0] = -1;
4928         precord_stats->RxMIMOSignalQuality[1] = -1;
4929
4930         if(is_cck_rate)
4931         {
4932                 //
4933                 // (1)Hardware does not provide RSSI for CCK
4934                 //
4935
4936                 //
4937                 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
4938                 //
4939                 u8 report;//, cck_agc_rpt;
4940
4941                 priv->stats.numqry_phystatusCCK++;
4942
4943                 if(!priv->bCckHighPower)
4944                 {
4945                         report = pcck_buf->cck_agc_rpt & 0xc0;
4946                         report = report>>6;
4947                         switch(report)
4948                         {
4949                                 //Fixed by Jacken from Bryant 2008-03-20
4950                                 //Original value is -38 , -26 , -14 , -2
4951                                 //Fixed value is -35 , -23 , -11 , 6
4952                                 case 0x3:
4953                                         rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
4954                                         break;
4955                                 case 0x2:
4956                                         rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
4957                                         break;
4958                                 case 0x1:
4959                                         rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
4960                                         break;
4961                                 case 0x0:
4962                                         rx_pwr_all = 6 - (pcck_buf->cck_agc_rpt & 0x3e);
4963                                         break;
4964                         }
4965                 }
4966                 else
4967                 {
4968                         report = pcck_buf->cck_agc_rpt & 0x60;
4969                         report = report>>5;
4970                         switch(report)
4971                         {
4972                                 case 0x3:
4973                                         rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
4974                                         break;
4975                                 case 0x2:
4976                                         rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
4977                                         break;
4978                                 case 0x1:
4979                                         rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
4980                                         break;
4981                                 case 0x0:
4982                                         rx_pwr_all = 6 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
4983                                         break;
4984                         }
4985                 }
4986
4987                 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
4988                 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
4989                 pstats->RecvSignalPower = pwdb_all;
4990
4991                 //
4992                 // (3) Get Signal Quality (EVM)
4993                 //
4994                 //if(bpacket_match_bssid)
4995                 {
4996                         u8      sq;
4997
4998                         if(pstats->RxPWDBAll > 40)
4999                         {
5000                                 sq = 100;
5001                         }else
5002                         {
5003                                 sq = pcck_buf->sq_rpt;
5004
5005                                 if(pcck_buf->sq_rpt > 64)
5006                                         sq = 0;
5007                                 else if (pcck_buf->sq_rpt < 20)
5008                                         sq = 100;
5009                                 else
5010                                         sq = ((64-sq) * 100) / 44;
5011                         }
5012                         pstats->SignalQuality = precord_stats->SignalQuality = sq;
5013                         pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
5014                         pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
5015                 }
5016         }
5017         else
5018         {
5019                 priv->stats.numqry_phystatusHT++;
5020                 //
5021                 // (1)Get RSSI for HT rate
5022                 //
5023                 for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
5024                 {
5025                         // 2008/01/30 MH we will judge RF RX path now.
5026                         if (priv->brfpath_rxenable[i])
5027                                 rf_rx_num++;
5028                         else
5029                                 continue;
5030
5031                 if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
5032                                 continue;
5033
5034                         //Fixed by Jacken from Bryant 2008-03-20
5035                         //Original value is 106
5036                         rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
5037
5038                         //Get Rx snr value in DB
5039                         tmp_rxsnr =     pofdm_buf->rxsnr_X[i];
5040                         rx_snrX = (char)(tmp_rxsnr);
5041                         //rx_snrX >>= 1;
5042                         rx_snrX /= 2;
5043                         priv->stats.rxSNRdB[i] = (long)rx_snrX;
5044
5045                         /* Translate DBM to percentage. */
5046                         RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
5047                         total_rssi += RSSI;
5048
5049                         /* Record Signal Strength for next packet */
5050                         //if(bpacket_match_bssid)
5051                         {
5052                                 pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
5053                                 precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
5054                         }
5055                 }
5056
5057
5058                 //
5059                 // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
5060                 //
5061                 //Fixed by Jacken from Bryant 2008-03-20
5062                 //Original value is 106
5063                 rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
5064                 pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
5065
5066                 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
5067                 pstats->RxPower = precord_stats->RxPower =  rx_pwr_all;
5068
5069                 //
5070                 // (3)EVM of HT rate
5071                 //
5072                 if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
5073                         pdrvinfo->RxRate<=DESC90_RATEMCS15)
5074                         max_spatial_stream = 2; //both spatial stream make sense
5075                 else
5076                         max_spatial_stream = 1; //only spatial stream 1 makes sense
5077
5078                 for(i=0; i<max_spatial_stream; i++)
5079                 {
5080                         tmp_rxevm =     pofdm_buf->rxevm_X[i];
5081                         rx_evmX = (char)(tmp_rxevm);
5082
5083                         // Do not use shift operation like "rx_evmX >>= 1" because the compiler of free build environment
5084                         // will set the most significant bit to "zero" when doing shifting operation which may change a negative
5085                         // value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.
5086                         rx_evmX /= 2;   //dbm
5087
5088                         evm = rtl819x_evm_dbtopercentage(rx_evmX);
5089                         //if(bpacket_match_bssid)
5090                         {
5091                                 if(i==0) // Fill value in RFD, Get the first spatial stream only
5092                                         pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
5093                                 pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
5094                         }
5095                 }
5096
5097
5098                 /* record rx statistics for debug */
5099                 rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
5100                 prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
5101                 if(pdrvinfo->BW)        //40M channel
5102                         priv->stats.received_bwtype[1+prxsc->rxsc]++;
5103                 else                            //20M channel
5104                         priv->stats.received_bwtype[0]++;
5105         }
5106
5107         //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
5108         //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
5109         if(is_cck_rate)
5110         {
5111                 pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;
5112
5113         }
5114         else
5115         {
5116                 //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
5117                 // We can judge RX path number now.
5118                 if (rf_rx_num != 0)
5119                         pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
5120         }
5121 }       /* QueryRxPhyStatus8190Pci */
5122
5123 void
5124 rtl8192_record_rxdesc_forlateruse(
5125         struct ieee80211_rx_stats *     psrc_stats,
5126         struct ieee80211_rx_stats *     ptarget_stats
5127 )
5128 {
5129         ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
5130         ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
5131         ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
5132 }
5133
5134
5135 void TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
5136                                    struct ieee80211_rx_stats * pstats,
5137                                    rx_drvinfo_819x_usb  *pdrvinfo)
5138 {
5139         // TODO: We must only check packet for current MAC address. Not finish
5140         rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5141         struct net_device *dev=info->dev;
5142         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5143         bool bpacket_match_bssid, bpacket_toself;
5144         bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
5145         static struct ieee80211_rx_stats  previous_stats;
5146         struct ieee80211_hdr_3addr *hdr;//by amy
5147        u16 fc,type;
5148
5149         // Get Signal Quality for only RX data queue (but not command queue)
5150
5151         u8* tmp_buf;
5152         //u16 tmp_buf_len = 0;
5153         u8  *praddr;
5154
5155         /* Get MAC frame start address. */
5156         tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
5157
5158         hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
5159         fc = le16_to_cpu(hdr->frame_ctl);
5160         type = WLAN_FC_GET_TYPE(fc);
5161         praddr = hdr->addr1;
5162
5163         /* Check if the received packet is acceptable. */
5164         bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
5165                                                         (eqMacAddr(priv->ieee80211->current_network.bssid,  (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
5166                                                                  && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
5167         bpacket_toself =  bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
5168
5169                 if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
5170                 {
5171                         bPacketBeacon = true;
5172                         //DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
5173                 }
5174                 if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
5175                 {
5176                         if((eqMacAddr(praddr,dev->dev_addr)))
5177                                 bToSelfBA = true;
5178                                 //DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
5179                 }
5180
5181
5182
5183         if(bpacket_match_bssid)
5184         {
5185                 priv->stats.numpacket_matchbssid++;
5186         }
5187         if(bpacket_toself){
5188                 priv->stats.numpacket_toself++;
5189         }
5190         //
5191         // Process PHY information for previous packet (RSSI/PWDB/EVM)
5192         //
5193         // Because phy information is contained in the last packet of AMPDU only, so driver
5194         // should process phy information of previous packet
5195         rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
5196         rtl8192_query_rxphystatus(priv, pstats, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
5197         rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
5198
5199 }
5200
5201 /**
5202 * Function:     UpdateReceivedRateHistogramStatistics
5203 * Overview:     Record the received data rate
5204 *
5205 * Input:
5206 *       struct net_device *dev
5207 *       struct ieee80211_rx_stats *stats
5208 *
5209 * Output:
5210 *
5211 *                       (priv->stats.ReceivedRateHistogram[] is updated)
5212 * Return:
5213 *               None
5214 */
5215 void
5216 UpdateReceivedRateHistogramStatistics8190(
5217         struct net_device *dev,
5218         struct ieee80211_rx_stats *stats
5219         )
5220 {
5221         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5222         u32 rcvType=1;   //0: Total, 1:OK, 2:CRC, 3:ICV
5223         u32 rateIndex;
5224         u32 preamble_guardinterval;  //1: short preamble/GI, 0: long preamble/GI
5225
5226
5227         if(stats->bCRC)
5228         rcvType = 2;
5229         else if(stats->bICV)
5230         rcvType = 3;
5231
5232         if(stats->bShortPreamble)
5233         preamble_guardinterval = 1;// short
5234         else
5235         preamble_guardinterval = 0;// long
5236
5237         switch(stats->rate)
5238         {
5239                 //
5240                 // CCK rate
5241                 //
5242                 case MGN_1M:    rateIndex = 0;  break;
5243                 case MGN_2M:    rateIndex = 1;  break;
5244                 case MGN_5_5M:  rateIndex = 2;  break;
5245                 case MGN_11M:   rateIndex = 3;  break;
5246                 //
5247                 // Legacy OFDM rate
5248                 //
5249                 case MGN_6M:    rateIndex = 4;  break;
5250                 case MGN_9M:    rateIndex = 5;  break;
5251                 case MGN_12M:   rateIndex = 6;  break;
5252                 case MGN_18M:   rateIndex = 7;  break;
5253                 case MGN_24M:   rateIndex = 8;  break;
5254                 case MGN_36M:   rateIndex = 9;  break;
5255                 case MGN_48M:   rateIndex = 10; break;
5256                 case MGN_54M:   rateIndex = 11; break;
5257                 //
5258                 // 11n High throughput rate
5259                 //
5260                 case MGN_MCS0:  rateIndex = 12; break;
5261                 case MGN_MCS1:  rateIndex = 13; break;
5262                 case MGN_MCS2:  rateIndex = 14; break;
5263                 case MGN_MCS3:  rateIndex = 15; break;
5264                 case MGN_MCS4:  rateIndex = 16; break;
5265                 case MGN_MCS5:  rateIndex = 17; break;
5266                 case MGN_MCS6:  rateIndex = 18; break;
5267                 case MGN_MCS7:  rateIndex = 19; break;
5268                 case MGN_MCS8:  rateIndex = 20; break;
5269                 case MGN_MCS9:  rateIndex = 21; break;
5270                 case MGN_MCS10: rateIndex = 22; break;
5271                 case MGN_MCS11: rateIndex = 23; break;
5272                 case MGN_MCS12: rateIndex = 24; break;
5273                 case MGN_MCS13: rateIndex = 25; break;
5274                 case MGN_MCS14: rateIndex = 26; break;
5275                 case MGN_MCS15: rateIndex = 27; break;
5276                 default:        rateIndex = 28; break;
5277         }
5278     priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
5279     priv->stats.received_rate_histogram[0][rateIndex]++; //total
5280     priv->stats.received_rate_histogram[rcvType][rateIndex]++;
5281 }
5282
5283
5284 void query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
5285 {
5286         rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5287         struct net_device *dev=info->dev;
5288         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5289         //rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5290         rx_drvinfo_819x_usb  *driver_info = NULL;
5291
5292         //
5293         //Get Rx Descriptor Information
5294         //
5295 #ifdef USB_RX_AGGREGATION_SUPPORT
5296         if (bIsRxAggrSubframe)
5297         {
5298                 rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
5299                 stats->Length = desc->Length ;
5300                 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
5301                 stats->RxBufShift = 0; //RxBufShift = 2 in RxDesc, but usb didn't shift bytes in fact.
5302                 stats->bICV = desc->ICV;
5303                 stats->bCRC = desc->CRC32;
5304                 stats->bHwError = stats->bCRC|stats->bICV;
5305                 stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
5306         } else
5307 #endif
5308         {
5309                 rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5310
5311                 stats->Length = desc->Length;
5312                 stats->RxDrvInfoSize = desc->RxDrvInfoSize;
5313                 stats->RxBufShift = 0;//desc->Shift&0x03;
5314                 stats->bICV = desc->ICV;
5315                 stats->bCRC = desc->CRC32;
5316                 stats->bHwError = stats->bCRC|stats->bICV;
5317                 //RTL8190 set this bit to indicate that Hw does not decrypt packet
5318                 stats->Decrypted = !desc->SWDec;
5319         }
5320
5321         if((priv->ieee80211->pHTInfo->bCurrentHTSupport == true) && (priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP))
5322         {
5323                 stats->bHwError = false;
5324         }
5325         else
5326         {
5327                 stats->bHwError = stats->bCRC|stats->bICV;
5328         }
5329
5330         if(stats->Length < 24 || stats->Length > MAX_8192U_RX_SIZE)
5331                 stats->bHwError |= 1;
5332         //
5333         //Get Driver Info
5334         //
5335         // TODO: Need to verify it on FGPA platform
5336         //Driver info are written to the RxBuffer following rx desc
5337         if (stats->RxDrvInfoSize != 0) {
5338                 driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
5339                                 stats->RxBufShift);
5340                 /* unit: 0.5M */
5341                 /* TODO */
5342                 if(!stats->bHwError){
5343                         u8      ret_rate;
5344                         ret_rate = HwRateToMRate90(driver_info->RxHT, driver_info->RxRate);
5345                         if(ret_rate == 0xff)
5346                         {
5347                                 // Abnormal Case: Receive CRC OK packet with Rx descriptor indicating non supported rate.
5348                                 // Special Error Handling here, 2008.05.16, by Emily
5349
5350                                 stats->bHwError = 1;
5351                                 stats->rate = MGN_1M;   //Set 1M rate by default
5352                         }else
5353                         {
5354                                 stats->rate = ret_rate;
5355                         }
5356                 }
5357                 else
5358                         stats->rate = 0x02;
5359
5360                 stats->bShortPreamble = driver_info->SPLCP;
5361
5362
5363                 UpdateReceivedRateHistogramStatistics8190(dev, stats);
5364
5365                 stats->bIsAMPDU = (driver_info->PartAggr==1);
5366                 stats->bFirstMPDU = (driver_info->PartAggr==1) && (driver_info->FirstAGGR==1);
5367                 stats->TimeStampLow = driver_info->TSFL;
5368                 // xiong mask it, 070514
5369                 //pRfd->Status.TimeStampHigh = PlatformEFIORead4Byte(Adapter, TSFR+4);
5370                 // stats->TimeStampHigh = read_nic_dword(dev,  TSFR+4);
5371
5372                 UpdateRxPktTimeStamp8190(dev, stats);
5373
5374                 //
5375                 // Rx A-MPDU
5376                 //
5377                 if(driver_info->FirstAGGR==1 || driver_info->PartAggr == 1)
5378                         RT_TRACE(COMP_RXDESC, "driver_info->FirstAGGR = %d, driver_info->PartAggr = %d\n",
5379                                         driver_info->FirstAGGR, driver_info->PartAggr);
5380
5381         }
5382
5383         skb_pull(skb,sizeof(rx_desc_819x_usb));
5384         //
5385         // Get Total offset of MPDU Frame Body
5386         //
5387         if((stats->RxBufShift + stats->RxDrvInfoSize) > 0) {
5388                 stats->bShift = 1;
5389                 skb_pull(skb,stats->RxBufShift + stats->RxDrvInfoSize);
5390         }
5391
5392 #ifdef USB_RX_AGGREGATION_SUPPORT
5393         /* for the rx aggregated sub frame, the redundant space truly contained in the packet */
5394         if(bIsRxAggrSubframe) {
5395                 skb_pull(skb, 8);
5396         }
5397 #endif
5398         /* for debug 2008.5.29 */
5399
5400         //added by vivi, for MP, 20080108
5401         stats->RxIs40MHzPacket = driver_info->BW;
5402         if(stats->RxDrvInfoSize != 0)
5403                 TranslateRxSignalStuff819xUsb(skb, stats, driver_info);
5404
5405 }
5406
5407 u32 GetRxPacketShiftBytes819xUsb(struct ieee80211_rx_stats  *Status, bool bIsRxAggrSubframe)
5408 {
5409 #ifdef USB_RX_AGGREGATION_SUPPORT
5410         if (bIsRxAggrSubframe)
5411                 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
5412                         + Status->RxBufShift + 8);
5413         else
5414 #endif
5415                 return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
5416                                 + Status->RxBufShift);
5417 }
5418
5419 void rtl8192_rx_nomal(struct sk_buff* skb)
5420 {
5421         rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5422         struct net_device *dev=info->dev;
5423         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5424         struct ieee80211_rx_stats stats = {
5425                 .signal = 0,
5426                 .noise = -98,
5427                 .rate = 0,
5428                 //      .mac_time = jiffies,
5429                 .freq = IEEE80211_24GHZ_BAND,
5430         };
5431         u32 rx_pkt_len = 0;
5432         struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
5433         bool unicast_packet = false;
5434 #ifdef USB_RX_AGGREGATION_SUPPORT
5435         struct sk_buff *agg_skb = NULL;
5436         u32  TotalLength = 0;
5437         u32  TempDWord = 0;
5438         u32  PacketLength = 0;
5439         u32  PacketOccupiedLendth = 0;
5440         u8   TempByte = 0;
5441         u32  PacketShiftBytes = 0;
5442         rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
5443         u8  PaddingBytes = 0;
5444         //add just for testing
5445         u8   testing;
5446
5447 #endif
5448
5449         /* 20 is for ps-poll */
5450         if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
5451 #ifdef USB_RX_AGGREGATION_SUPPORT
5452                 TempByte = *(skb->data + sizeof(rx_desc_819x_usb));
5453 #endif
5454                 /* first packet should not contain Rx aggregation header */
5455                 query_rxdesc_status(skb, &stats, false);
5456                 /* TODO */
5457                 /* hardware related info */
5458 #ifdef USB_RX_AGGREGATION_SUPPORT
5459                 if (TempByte & BIT0) {
5460                         agg_skb = skb;
5461                         //TotalLength = agg_skb->len - 4; /*sCrcLng*/
5462                         TotalLength = stats.Length - 4; /*sCrcLng*/
5463                         //RT_TRACE(COMP_RECV, "%s:first aggregated packet!Length=%d\n",__FUNCTION__,TotalLength);
5464                         /* though the head pointer has passed this position  */
5465                         TempDWord = *(u32 *)(agg_skb->data - 4);
5466                         PacketLength = (u16)(TempDWord & 0x3FFF); /*sCrcLng*/
5467                         skb = dev_alloc_skb(PacketLength);
5468                         memcpy(skb_put(skb,PacketLength),agg_skb->data,PacketLength);
5469                         PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, false);
5470                 }
5471 #endif
5472                 /* Process the MPDU received */
5473                 skb_trim(skb, skb->len - 4/*sCrcLng*/);
5474
5475                 rx_pkt_len = skb->len;
5476                 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
5477                 unicast_packet = false;
5478                 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
5479                         //TODO
5480                 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
5481                         //TODO
5482                 }else {
5483                         /* unicast packet */
5484                         unicast_packet = true;
5485                 }
5486
5487                 if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
5488                         dev_kfree_skb_any(skb);
5489                 } else {
5490                         priv->stats.rxoktotal++;
5491                         if(unicast_packet) {
5492                                 priv->stats.rxbytesunicast += rx_pkt_len;
5493                         }
5494                 }
5495 #ifdef USB_RX_AGGREGATION_SUPPORT
5496                 testing = 1;
5497                 // (PipeIndex == 0) && (TempByte & BIT0) => TotalLength > 0.
5498                 if (TotalLength > 0) {
5499                         PacketOccupiedLendth = PacketLength + (PacketShiftBytes + 8);
5500                         if ((PacketOccupiedLendth & 0xFF) != 0)
5501                                 PacketOccupiedLendth = (PacketOccupiedLendth & 0xFFFFFF00) + 256;
5502                         PacketOccupiedLendth -= 8;
5503                         TempDWord = PacketOccupiedLendth - PacketShiftBytes; /*- PacketLength */
5504                         if (agg_skb->len > TempDWord)
5505                                 skb_pull(agg_skb, TempDWord);
5506                         else
5507                                 agg_skb->len = 0;
5508
5509                         while (agg_skb->len>=GetRxPacketShiftBytes819xUsb(&stats, true)) {
5510                                 u8 tmpCRC = 0, tmpICV = 0;
5511                                 //RT_TRACE(COMP_RECV,"%s:aggred pkt,total_len = %d\n",__FUNCTION__,agg_skb->len);
5512                                 RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);
5513                                 tmpCRC = RxDescr->CRC32;
5514                                 tmpICV = RxDescr->ICV;
5515                                 memcpy(agg_skb->data, &agg_skb->data[44], 2);
5516                                 RxDescr->CRC32 = tmpCRC;
5517                                 RxDescr->ICV = tmpICV;
5518
5519                                 memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
5520                                 stats.signal = 0;
5521                                 stats.noise = -98;
5522                                 stats.rate = 0;
5523                                 stats.freq = IEEE80211_24GHZ_BAND;
5524                                 query_rxdesc_status(agg_skb, &stats, true);
5525                                 PacketLength = stats.Length;
5526
5527                                 if(PacketLength > agg_skb->len) {
5528                                         break;
5529                                 }
5530                                 /* Process the MPDU received */
5531                                 skb = dev_alloc_skb(PacketLength);
5532                                 memcpy(skb_put(skb,PacketLength),agg_skb->data, PacketLength);
5533                                 skb_trim(skb, skb->len - 4/*sCrcLng*/);
5534
5535                                 rx_pkt_len = skb->len;
5536                                 ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
5537                                 unicast_packet = false;
5538                                 if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
5539                                         //TODO
5540                                 }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
5541                                         //TODO
5542                                 }else {
5543                                         /* unicast packet */
5544                                         unicast_packet = true;
5545                                 }
5546                                 if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
5547                                         dev_kfree_skb_any(skb);
5548                                 } else {
5549                                         priv->stats.rxoktotal++;
5550                                         if(unicast_packet) {
5551                                                 priv->stats.rxbytesunicast += rx_pkt_len;
5552                                         }
5553                                 }
5554                                 /* should trim the packet which has been copied to target skb */
5555                                 skb_pull(agg_skb, PacketLength);
5556                                 PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, true);
5557                                 PacketOccupiedLendth = PacketLength + PacketShiftBytes;
5558                                 if ((PacketOccupiedLendth & 0xFF) != 0) {
5559                                         PaddingBytes = 256 - (PacketOccupiedLendth & 0xFF);
5560                                         if (agg_skb->len > PaddingBytes)
5561                                                 skb_pull(agg_skb, PaddingBytes);
5562                                         else
5563                                                 agg_skb->len = 0;
5564                                 }
5565                         }
5566                         dev_kfree_skb(agg_skb);
5567                 }
5568 #endif
5569         } else {
5570                 priv->stats.rxurberr++;
5571                 printk("actual_length:%d\n", skb->len);
5572                 dev_kfree_skb_any(skb);
5573         }
5574
5575 }
5576
5577 void
5578 rtl819xusb_process_received_packet(
5579         struct net_device *dev,
5580         struct ieee80211_rx_stats *pstats
5581         )
5582 {
5583 //      bool bfreerfd=false, bqueued=false;
5584         u8*     frame;
5585         u16     frame_len=0;
5586         struct r8192_priv *priv = ieee80211_priv(dev);
5587 //      u8                      index = 0;
5588 //      u8                      TID = 0;
5589         //u16                   seqnum = 0;
5590         //PRX_TS_RECORD pts = NULL;
5591
5592         // Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
5593         //porting by amy 080508
5594         pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
5595         frame = pstats->virtual_address;
5596         frame_len = pstats->packetlength;
5597 #ifdef TODO     // by amy about HCT
5598         if(!Adapter->bInHctTest)
5599                 CountRxErrStatistics(Adapter, pRfd);
5600 #endif
5601         {
5602         #ifdef ENABLE_PS  //by amy for adding ps function in future
5603                 RT_RF_POWER_STATE rtState;
5604                 // When RF is off, we should not count the packet for hw/sw synchronize
5605                 // reason, ie. there may be a duration while sw switch is changed and hw
5606                 // switch is being changed. 2006.12.04, by shien chang.
5607                 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
5608                 if (rtState == eRfOff)
5609                 {
5610                         return;
5611                 }
5612         #endif
5613         priv->stats.rxframgment++;
5614
5615         }
5616 #ifdef TODO
5617         RmMonitorSignalStrength(Adapter, pRfd);
5618 #endif
5619         /* 2007/01/16 MH Add RX command packet handle here. */
5620         /* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
5621         if (rtl819xusb_rx_command_packet(dev, pstats))
5622         {
5623                 return;
5624         }
5625
5626 #ifdef SW_CRC_CHECK
5627         SwCrcCheck();
5628 #endif
5629
5630
5631 }
5632
5633 void query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
5634 {
5635 //      rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5636 //      struct net_device *dev=info->dev;
5637 //      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5638         rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
5639 //      rx_drvinfo_819x_usb  *driver_info;
5640
5641         //
5642         //Get Rx Descriptor Information
5643         //
5644         stats->virtual_address = (u8*)skb->data;
5645         stats->Length = desc->Length;
5646         stats->RxDrvInfoSize = 0;
5647         stats->RxBufShift = 0;
5648         stats->packetlength = stats->Length-scrclng;
5649         stats->fraglength = stats->packetlength;
5650         stats->fragoffset = 0;
5651         stats->ntotalfrag = 1;
5652 }
5653
5654
5655 void rtl8192_rx_cmd(struct sk_buff *skb)
5656 {
5657         struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
5658         struct net_device *dev = info->dev;
5659         //int ret;
5660 //      struct urb *rx_urb = info->urb;
5661         /* TODO */
5662         struct ieee80211_rx_stats stats = {
5663                 .signal = 0,
5664                 .noise = -98,
5665                 .rate = 0,
5666                 //      .mac_time = jiffies,
5667                 .freq = IEEE80211_24GHZ_BAND,
5668         };
5669
5670         if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE))
5671         {
5672
5673                 query_rx_cmdpkt_desc_status(skb,&stats);
5674                 // this is to be done by amy 080508     prfd->queue_id = 1;
5675
5676
5677                 //
5678                 //  Process the command packet received.
5679                 //
5680
5681                 rtl819xusb_process_received_packet(dev,&stats);
5682
5683                 dev_kfree_skb_any(skb);
5684         }
5685         else
5686                 ;
5687
5688
5689 }
5690
5691 void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
5692 {
5693         struct sk_buff *skb;
5694         struct rtl8192_rx_info *info;
5695
5696         while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
5697                 info = (struct rtl8192_rx_info *)skb->cb;
5698                 switch (info->out_pipe) {
5699                 /* Nomal packet pipe */
5700                         case 3:
5701                                 //RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
5702                                 priv->IrpPendingCount--;
5703                                 rtl8192_rx_nomal(skb);
5704                                 break;
5705
5706                                 /* Command packet pipe */
5707                         case 9:
5708                                 RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
5709                                                 info->out_pipe);
5710
5711                                 rtl8192_rx_cmd(skb);
5712                                 break;
5713
5714                         default: /* should never get here! */
5715                                 RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
5716                                                 info->out_pipe);
5717                                 dev_kfree_skb(skb);
5718                                 break;
5719
5720                 }
5721         }
5722 }
5723
5724 static const struct net_device_ops rtl8192_netdev_ops = {
5725         .ndo_open               = rtl8192_open,
5726         .ndo_stop               = rtl8192_close,
5727         .ndo_get_stats          = rtl8192_stats,
5728         .ndo_tx_timeout         = tx_timeout,
5729         .ndo_do_ioctl           = rtl8192_ioctl,
5730         .ndo_set_rx_mode        = r8192_set_multicast,
5731         .ndo_set_mac_address    = r8192_set_mac_adr,
5732         .ndo_validate_addr      = eth_validate_addr,
5733         .ndo_change_mtu         = eth_change_mtu,
5734         .ndo_start_xmit         = ieee80211_xmit,
5735 };
5736
5737
5738 /****************************************************************************
5739      ---------------------------- USB_STUFF---------------------------
5740 *****************************************************************************/
5741
5742 static int rtl8192_usb_probe(struct usb_interface *intf,
5743                          const struct usb_device_id *id)
5744 {
5745 //      unsigned long ioaddr = 0;
5746         struct net_device *dev = NULL;
5747         struct r8192_priv *priv= NULL;
5748         struct usb_device *udev = interface_to_usbdev(intf);
5749         int ret;
5750         RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
5751
5752         dev = alloc_ieee80211(sizeof(struct r8192_priv));
5753         if (dev == NULL)
5754                 return -ENOMEM;
5755
5756         usb_set_intfdata(intf, dev);
5757         SET_NETDEV_DEV(dev, &intf->dev);
5758         priv = ieee80211_priv(dev);
5759         priv->ieee80211 = netdev_priv(dev);
5760         priv->udev=udev;
5761
5762         dev->netdev_ops = &rtl8192_netdev_ops;
5763
5764          //DMESG("Oops: i'm coming\n");
5765 #if WIRELESS_EXT >= 12
5766 #if WIRELESS_EXT < 17
5767         dev->get_wireless_stats = r8192_get_wireless_stats;
5768 #endif
5769         dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
5770 #endif
5771         dev->type=ARPHRD_ETHER;
5772
5773         dev->watchdog_timeo = HZ*3;     //modified by john, 0805
5774
5775         if (dev_alloc_name(dev, ifname) < 0){
5776                 RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
5777                 ifname = "wlan%d";
5778                 dev_alloc_name(dev, ifname);
5779         }
5780
5781         RT_TRACE(COMP_INIT, "Driver probe completed1\n");
5782         if(rtl8192_init(dev)!=0){
5783                 RT_TRACE(COMP_ERR, "Initialization failed");
5784                 ret = -ENODEV;
5785                 goto fail;
5786         }
5787         netif_carrier_off(dev);
5788         netif_stop_queue(dev);
5789
5790         ret = register_netdev(dev);
5791         if (ret)
5792                 goto fail2;
5793
5794         RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
5795         rtl8192_proc_init_one(dev);
5796
5797
5798         RT_TRACE(COMP_INIT, "Driver probe completed\n");
5799         return 0;
5800
5801 fail2:
5802         rtl8192_down(dev);
5803         kfree(priv->pFirmware);
5804         priv->pFirmware = NULL;
5805         rtl8192_usb_deleteendpoints(dev);
5806         destroy_workqueue(priv->priv_wq);
5807         mdelay(10);
5808 fail:
5809         free_ieee80211(dev);
5810
5811         RT_TRACE(COMP_ERR, "wlan driver load failed\n");
5812         return ret;
5813 }
5814
5815 //detach all the work and timer structure declared or inititialize in r8192U_init function.
5816 void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
5817 {
5818
5819         cancel_work_sync(&priv->reset_wq);
5820         cancel_delayed_work(&priv->watch_dog_wq);
5821         cancel_delayed_work(&priv->update_beacon_wq);
5822         cancel_work_sync(&priv->qos_activate);
5823         //cancel_work_sync(&priv->SetBWModeWorkItem);
5824         //cancel_work_sync(&priv->SwChnlWorkItem);
5825
5826 }
5827
5828
5829 static void rtl8192_usb_disconnect(struct usb_interface *intf)
5830 {
5831         struct net_device *dev = usb_get_intfdata(intf);
5832
5833         struct r8192_priv *priv = ieee80211_priv(dev);
5834         if(dev){
5835
5836                 unregister_netdev(dev);
5837
5838                 RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
5839                 rtl8192_proc_remove_one(dev);
5840
5841                         rtl8192_down(dev);
5842                 kfree(priv->pFirmware);
5843                 priv->pFirmware = NULL;
5844         //      priv->rf_close(dev);
5845 //              rtl8192_SetRFPowerState(dev, eRfOff);
5846                 rtl8192_usb_deleteendpoints(dev);
5847                 destroy_workqueue(priv->priv_wq);
5848                 //rtl8192_irq_disable(dev);
5849                 //rtl8192_reset(dev);
5850                 mdelay(10);
5851
5852         }
5853         free_ieee80211(dev);
5854         RT_TRACE(COMP_DOWN, "wlan driver removed\n");
5855 }
5856
5857 /* fun with the built-in ieee80211 stack... */
5858 extern int ieee80211_debug_init(void);
5859 extern void ieee80211_debug_exit(void);
5860 extern int ieee80211_crypto_init(void);
5861 extern void ieee80211_crypto_deinit(void);
5862 extern int ieee80211_crypto_tkip_init(void);
5863 extern void ieee80211_crypto_tkip_exit(void);
5864 extern int ieee80211_crypto_ccmp_init(void);
5865 extern void ieee80211_crypto_ccmp_exit(void);
5866 extern int ieee80211_crypto_wep_init(void);
5867 extern void ieee80211_crypto_wep_exit(void);
5868
5869 static int __init rtl8192_usb_module_init(void)
5870 {
5871         int ret;
5872
5873 #ifdef CONFIG_IEEE80211_DEBUG
5874         ret = ieee80211_debug_init();
5875         if (ret) {
5876                 printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
5877                 return ret;
5878         }
5879 #endif
5880         ret = ieee80211_crypto_init();
5881         if (ret) {
5882                 printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
5883                 return ret;
5884         }
5885
5886         ret = ieee80211_crypto_tkip_init();
5887         if (ret) {
5888                 printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
5889                         ret);
5890                 return ret;
5891         }
5892
5893         ret = ieee80211_crypto_ccmp_init();
5894         if (ret) {
5895                 printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
5896                         ret);
5897                 return ret;
5898         }
5899
5900         ret = ieee80211_crypto_wep_init();
5901         if (ret) {
5902                 printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
5903                 return ret;
5904         }
5905
5906         printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
5907         printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
5908         RT_TRACE(COMP_INIT, "Initializing module");
5909         RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
5910         rtl8192_proc_module_init();
5911         return usb_register(&rtl8192_usb_driver);
5912 }
5913
5914
5915 static void __exit rtl8192_usb_module_exit(void)
5916 {
5917         usb_deregister(&rtl8192_usb_driver);
5918
5919         RT_TRACE(COMP_DOWN, "Exiting");
5920 //      rtl8192_proc_module_remove();
5921 }
5922
5923
5924 void rtl8192_try_wake_queue(struct net_device *dev, int pri)
5925 {
5926         unsigned long flags;
5927         short enough_desc;
5928         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5929
5930         spin_lock_irqsave(&priv->tx_lock,flags);
5931         enough_desc = check_nic_enough_desc(dev,pri);
5932         spin_unlock_irqrestore(&priv->tx_lock,flags);
5933
5934         if(enough_desc)
5935                 ieee80211_wake_queue(priv->ieee80211);
5936 }
5937
5938 void EnableHWSecurityConfig8192(struct net_device *dev)
5939 {
5940         u8 SECR_value = 0x0;
5941         struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5942          struct ieee80211_device* ieee = priv->ieee80211;
5943         SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
5944         if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
5945         {
5946                 SECR_value |= SCR_RxUseDK;
5947                 SECR_value |= SCR_TxUseDK;
5948         }
5949         else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
5950         {
5951                 SECR_value |= SCR_RxUseDK;
5952                 SECR_value |= SCR_TxUseDK;
5953         }
5954         //add HWSec active enable here.
5955 //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
5956
5957         ieee->hwsec_active = 1;
5958
5959         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
5960         {
5961                 ieee->hwsec_active = 0;
5962                 SECR_value &= ~SCR_RxDecEnable;
5963         }
5964         RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__, \
5965                         ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
5966         {
5967                 write_nic_byte(dev, SECR,  SECR_value);//SECR_value |  SCR_UseDK );
5968         }
5969 }
5970
5971
5972 void setKey(    struct net_device *dev,
5973                 u8 EntryNo,
5974                 u8 KeyIndex,
5975                 u16 KeyType,
5976                 u8 *MacAddr,
5977                 u8 DefaultKey,
5978                 u32 *KeyContent )
5979 {
5980         u32 TargetCommand = 0;
5981         u32 TargetContent = 0;
5982         u16 usConfig = 0;
5983         u8 i;
5984         if (EntryNo >= TOTAL_CAM_ENTRY)
5985                 RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
5986
5987         RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", dev,EntryNo, KeyIndex, KeyType, MacAddr);
5988
5989         if (DefaultKey)
5990                 usConfig |= BIT15 | (KeyType<<2);
5991         else
5992                 usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
5993 //      usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
5994
5995
5996         for(i=0 ; i<CAM_CONTENT_COUNT; i++){
5997                 TargetCommand  = i+CAM_CONTENT_COUNT*EntryNo;
5998                 TargetCommand |= BIT31|BIT16;
5999
6000                 if(i==0){//MAC|Config
6001                         TargetContent = (u32)(*(MacAddr+0)) << 16|
6002                                         (u32)(*(MacAddr+1)) << 24|
6003                                         (u32)usConfig;
6004
6005                         write_nic_dword(dev, WCAMI, TargetContent);
6006                         write_nic_dword(dev, RWCAM, TargetCommand);
6007         //              printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
6008                 }
6009                 else if(i==1){//MAC
6010                         TargetContent = (u32)(*(MacAddr+2))      |
6011                                         (u32)(*(MacAddr+3)) <<  8|
6012                                         (u32)(*(MacAddr+4)) << 16|
6013                                         (u32)(*(MacAddr+5)) << 24;
6014                         write_nic_dword(dev, WCAMI, TargetContent);
6015                         write_nic_dword(dev, RWCAM, TargetCommand);
6016                 }
6017                 else {
6018                         //Key Material
6019                         if(KeyContent !=NULL){
6020                         write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
6021                         write_nic_dword(dev, RWCAM, TargetCommand);
6022                 }
6023         }
6024         }
6025
6026 }
6027
6028 /***************************************************************************
6029      ------------------- module init / exit stubs ----------------
6030 ****************************************************************************/
6031 module_init(rtl8192_usb_module_init);
6032 module_exit(rtl8192_usb_module_exit);