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