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