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