18fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/******************************************************************************
28fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
38fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Linux device driver for RTL8192U
48fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
58fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Based on the r8187 driver, which is:
68fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
78fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * This program is free software; you can redistribute it and/or modify it
88fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * under the terms of version 2 of the GNU General Public License as
98fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * published by the Free Software Foundation.
108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * This program is distributed in the hope that it will be useful, but WITHOUT
128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * more details.
158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * You should have received a copy of the GNU General Public License along with
178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * this program; if not, write to the Free Software Foundation, Inc.,
188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * The full GNU General Public License is included in this distribution in the
218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * file called LICENSE.
228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Contact Information:
248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Jerry chuang <wlanfae@realtek.com>
258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang */
268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifndef CONFIG_FORCE_HARD_FLOAT
288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangdouble __floatsidf (int i) { return i; }
298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangunsigned int __fixunsdfsi (double d) { return d; }
308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangdouble __adddf3(double a, double b) { return a+b; }
318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangdouble __addsf3(float a, float b) { return a+b; }
328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangdouble __subdf3(double a, double b) { return a-b; }
338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangdouble __extendsfdf2(float a) {return a;}
348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef LOOP_TEST
378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DUMP_RX
388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DUMP_TX
398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_TX_DESC2
408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef RX_DONT_PASS_UL
418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_EPROM
428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_RX_VERBOSE
438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DUMMY_RX
448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_ZERO_RX
458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_RX_SKB
468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_TX_FRAG
478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_RX_FRAG
488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_TX_FILLDESC
498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_TX
508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_IRQ
518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_RX
528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_RXALLOC
538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_REGISTERS
548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_RING
558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_IRQ_TASKLET
568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_TX_ALLOC
578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#undef DEBUG_TX_DESC
588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define CONFIG_RTL8192_IO_MAP
608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include <asm/uaccess.h>
628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192U_hw.h"
638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192U.h"
648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8190_rtl8256.h" /* RTL8225 Radio frontend */
658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8180_93cx6.h"   /* Card EEPROM */
668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192U_wx.h"
678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r819xU_phy.h" //added by WB 4.30.2008
688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r819xU_phyreg.h"
698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r819xU_cmdpkt.h"
708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192U_dm.h"
718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//#include "r8192xU_phyreg.h"
728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include <linux/usb.h>
735a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// FIXME: check if 2.6.7 is ok
758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef CONFIG_RTL8192_PM
778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192_pm.h"
788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "dot11d.h"
818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//set here to open your trace code. //WB
828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu32 rt_global_debug_component = \
838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	COMP_INIT    	|
848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//				COMP_DBG	|
858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	COMP_EPROM   	|
868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//				COMP_PHY	|
878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	COMP_RF		|
888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//				COMP_FIRMWARE	|
898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//				COMP_CH		|
908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	COMP_POWER_TRACKING |
918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//				COMP_RATE	|
928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	COMP_TXAGC	|
938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//		COMP_TRACE	|
948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				COMP_DOWN	|
958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//		COMP_RECV	|
96e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		//              COMP_SWBW	|
978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				COMP_SEC	|
988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//			COMP_RESET	|
998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//		COMP_SEND	|
1008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	COMP_EVENTS	|
1018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				COMP_ERR ; //always open err flags on
1028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define TOTAL_CAM_ENTRY 32
1048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define CAM_CONTENT_COUNT 8
1058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
106a457732b836b970c82c7ba35b4cfc938c9c543f9Németh Mártonstatic const struct usb_device_id rtl8192_usb_id_tbl[] = {
1078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Realtek */
1088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x0bda, 0x8709)},
1098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Corega */
1108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x07aa, 0x0043)},
1118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Belkin */
1128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x050d, 0x805E)},
1138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Sitecom */
1148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x0df6, 0x0031)},
1158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* EnGenius */
1168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x1740, 0x9201)},
1178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Dlink */
1188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x2001, 0x3301)},
1198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Zinwell */
1208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{USB_DEVICE(0x5a57, 0x0290)},
121e10ac155828324c475637827d4c3525012391f02Ben Hutchings	/* LG */
122e10ac155828324c475637827d4c3525012391f02Ben Hutchings	{USB_DEVICE(0x043e, 0x7a01)},
1238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{}
1248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang};
1258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_LICENSE("GPL");
1278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_VERSION("V 1.1");
1288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_DEVICE_TABLE(usb, rtl8192_usb_id_tbl);
1298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_DESCRIPTION("Linux driver for Realtek RTL8192 USB WiFi cards");
1308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic char* ifname = "wlan%d";
1328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int hwwep = 1;  //default use hw. set 0 to use software security
1338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int channels = 0x3fff;
1348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangmodule_param(ifname, charp, S_IRUGO|S_IWUSR );
1388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
1398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangmodule_param(hwwep,int, S_IRUGO|S_IWUSR);
1408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangmodule_param(channels,int, S_IRUGO|S_IWUSR);
1418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
1438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
1448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_PARM_DESC(hwwep," Try to use hardware security support. ");
1458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangMODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
1468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int __devinit rtl8192_usb_probe(struct usb_interface *intf,
1488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 const struct usb_device_id *id);
1498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void __devexit rtl8192_usb_disconnect(struct usb_interface *intf);
1508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic struct usb_driver rtl8192_usb_driver = {
153e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	.name		= RTL819xU_MODULE_NAME,		  /* Driver name   */
154e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	.id_table	= rtl8192_usb_id_tbl,		  /* PCI_ID table  */
155e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	.probe		= rtl8192_usb_probe,		  /* probe fn      */
1568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	.disconnect	= rtl8192_usb_disconnect,	  /* remove fn     */
1578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef CONFIG_RTL8192_PM
158e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	.suspend	= rtl8192_suspend,		  /* PM suspend fn */
1598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	.resume		= rtl8192_resume,                 /* PM resume fn  */
1608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
161e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	.suspend	= NULL,				  /* PM suspend fn */
162e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	.resume      	= NULL,				  /* PM resume fn  */
1638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
1648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang};
1658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangtypedef struct _CHANNEL_LIST
1688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
1698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8	Channel[32];
1708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8	Len;
1718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}CHANNEL_LIST, *PCHANNEL_LIST;
1728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic CHANNEL_LIST ChannelPlan[] = {
1748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{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
1758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11},11},                    				//IC
1768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},  	//ETSI
1778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11,12,13},13},    //Spain. Change to ETSI.
1788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11,12,13},13},  	//France. Change to ETSI.
1798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{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
1808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
1818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11,12,13},13},	//Israel.
1828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{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
1838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22},    //MIC
1848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{{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
1858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang};
1868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
1888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
1898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i, max_chan=-1, min_chan=-1;
1908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
1918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch (channel_plan)
1928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
1938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_FCC:
1948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_IC:
1958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_ETSI:
1968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_SPAIN:
1978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_FRANCE:
1988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_MKK:
1998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_MKK1:
2008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_ISRAEL:
2018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_TELEC:
2028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_MIC:
2038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
2048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			Dot11d_Init(ieee);
2058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->bGlobalDomain = false;
2068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//acturally 8225 & 8256 rf chip only support B,G,24N mode
2078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256))
2088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
2098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				min_chan = 1;
2108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				max_chan = 14;
2118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
2128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
2138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
2148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
2158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
2168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (ChannelPlan[channel_plan].Len != 0){
2178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				// Clear old channel map
2188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
2198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				// Set new channel map
2208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				for (i=0;i<ChannelPlan[channel_plan].Len;i++)
2218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
2228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
2238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
2248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
2258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
2268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
2278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case COUNTRY_CODE_GLOBAL_DOMAIN:
2308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
2318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			GET_DOT11D_INFO(ieee)->bEnabled = 0;//this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain settings.
2328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			Dot11d_Reset(ieee);
2338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->bGlobalDomain = true;
2348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:
2378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
2398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
2408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define 	rx_hal_is_cck_rate(_pdrvinfo)\
2448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			(_pdrvinfo->RxRate == DESC90_RATE1M ||\
2458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			_pdrvinfo->RxRate == DESC90_RATE2M ||\
2468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			_pdrvinfo->RxRate == DESC90_RATE5_5M ||\
2478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			_pdrvinfo->RxRate == DESC90_RATE11M) &&\
2488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			!_pdrvinfo->RxHT\
2498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid CamResetAllEntry(struct net_device *dev)
2528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 ulcommand = 0;
254e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//2004/02/11  In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
255e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	// However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
256e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	// In this condition, Cam can not be reset because upper layer will not set this static key again.
257e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//if(Adapter->EncAlgorithm == WEP_Encryption)
258e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//      return;
2598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//debug
260e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//DbgPrint("========================================\n");
261e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//DbgPrint("                            Call ResetAllEntry                                              \n");
262e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//DbgPrint("========================================\n\n");
2638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ulcommand |= BIT31|BIT30;
2648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RWCAM, ulcommand);
2658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid write_cam(struct net_device *dev, u8 addr, u32 data)
2708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
271e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	write_nic_dword(dev, WCAMI, data);
272e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
2738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu32 read_cam(struct net_device *dev, u8 addr)
2768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
277e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
278e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	return read_nic_dword(dev, 0xa8);
2798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid write_nic_byte_E(struct net_device *dev, int indx, u8 data)
2828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
2848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
2858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
2868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
2888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
2898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       indx|0xfe00, 0, &data, 1, HZ / 2);
2908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (status < 0)
2928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
2938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("write_nic_byte_E TimeOut! status:%d\n", status);
2948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
2958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 read_nic_byte_E(struct net_device *dev, int indx)
2988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
3008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 data;
3018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
3038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
3058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
3068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       indx|0xfe00, 0, &data, 1, HZ / 2);
3078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
308e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
309e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
310e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("read_nic_byte_E TimeOut! status:%d\n", status);
311e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
3128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return data;
3148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
3158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//as 92U has extend page from 4 to 16, so modify functions below.
3168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid write_nic_byte(struct net_device *dev, int indx, u8 data)
3178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
3188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
3198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
3228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
3248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
3258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
3268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
327e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
328e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
329e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("write_nic_byte TimeOut! status:%d\n", status);
330e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
3318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
3348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid write_nic_word(struct net_device *dev, int indx, u16 data)
3378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
3388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
3408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
3438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
3458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
3468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 2, HZ / 2);
3478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
348e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
349e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
350e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("write_nic_word TimeOut! status:%d\n", status);
351e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
3528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
3548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid write_nic_dword(struct net_device *dev, int indx, u32 data)
3578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
3588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
3608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
3638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
3658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
3668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 4, HZ / 2);
3678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
369e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
370e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
371e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("write_nic_dword TimeOut! status:%d\n", status);
372e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
3738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
3758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 read_nic_byte(struct net_device *dev, int indx)
3798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
3808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 data;
3818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
3828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
3838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
3848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
3868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
3878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       (indx&0xff)|0xff00, (indx>>8)&0x0f, &data, 1, HZ / 2);
3888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
389e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
390e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
391e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("read_nic_byte TimeOut! status:%d\n", status);
392e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
3938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return data;
3958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
3968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu16 read_nic_word(struct net_device *dev, int indx)
4008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
4018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 data;
4028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
4038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
4058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
407616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks				       RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
408616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks				       (indx&0xff)|0xff00, (indx>>8)&0x0f,
409616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks							&data, 2, HZ / 2);
4108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
411e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
412e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("read_nic_word TimeOut! status:%d\n", status);
4138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return data;
4158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
4168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu16 read_nic_word_E(struct net_device *dev, int indx)
4188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
4198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 data;
4208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
4218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
4238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
4258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			       RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
426616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks				       indx|0xfe00, 0, &data, 2, HZ / 2);
4278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
428e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
429e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("read_nic_word TimeOut! status:%d\n", status);
4308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return data;
4328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
4338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu32 read_nic_dword(struct net_device *dev, int indx)
4358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
4368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 data;
4378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
438616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks	/* int result; */
4398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
4428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
444616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks				       RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
445616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks					(indx&0xff)|0xff00, (indx>>8)&0x0f,
446616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks							&data, 4, HZ / 2);
447616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks	/* if(0 != result) {
448616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks	 *	printk(KERN_WARNING "read size of data = %d\, date = %d\n",
449616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks	 *							 result, data);
450616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks	 * }
451616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks	 */
4528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
453e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (status < 0)
454e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk("read_nic_dword TimeOut! status:%d\n", status);
4558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return data;
4578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
4588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
459616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks/* u8 read_phy_cck(struct net_device *dev, u8 adr); */
460616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks/* u8 read_phy_ofdm(struct net_device *dev, u8 adr); */
4618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* this might still called in what was the PHY rtl8185/rtl8192 common code
46225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * plans are to possibility turn it again in one common code...
4638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang */
4648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanginline void force_pci_posting(struct net_device *dev)
4658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
4668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
4678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic struct net_device_stats *rtl8192_stats(struct net_device *dev);
4698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_commit(struct net_device *dev);
470616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks/* void rtl8192_restart(struct net_device *dev); */
4718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_restart(struct work_struct *work);
472616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks/* void rtl8192_rq_tx_ack(struct work_struct *work); */
4738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid watch_dog_timer_callback(unsigned long data);
4748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/****************************************************************************
476616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks *   -----------------------------PROCFS STUFF-------------------------
477616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks*****************************************************************************
478616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks */
4798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
480616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilksstatic struct proc_dir_entry *rtl8192_proc;
4818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
482616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilksstatic int proc_get_stats_ap(char *page, char **start, off_t offset, int count,
483616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks							int *eof, void *data)
4848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
4858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = data;
4868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
4878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device *ieee = priv->ieee80211;
4888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_network *target;
4898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int len = 0;
4918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
492e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	list_for_each_entry(target, &ieee->network_list, list) {
4938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
494616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks		len += snprintf(page + len, count - len, "%s ", target->ssid);
4958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
496616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks		if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
497616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks			len += snprintf(page + len, count - len, "WPA\n");
498616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks		else
499616f58f6ec5e5777c343499ad65a34e671533e4bMike Gilks			len += snprintf(page + len, count - len, "non_WPA\n");
500e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*eof = 1;
5038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return len;
5048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
5058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int proc_get_registers(char *page, char **start,
5078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			  off_t offset, int count,
5088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			  int *eof, void *data)
5098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
5108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = data;
5118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int len = 0;
5148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i,n;
5158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int max=0xff;
5178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* This dump the current register page */
5198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanglen += snprintf(page + len, count - len,
520e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"\n####################page 0##################\n ");
5218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(n=0;n<=max;)
5238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
5248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//printk( "\nD: %2x> ", n);
5258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		len += snprintf(page + len, count - len,
5268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			"\nD:  %2x > ",n);
5278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=0;i<16 && n<=max;i++,n++)
5298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		len += snprintf(page + len, count - len,
5308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			"%2x ",read_nic_byte(dev,0x000|n));
5318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//	printk("%2x ",read_nic_byte(dev,n));
5338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
5348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanglen += snprintf(page + len, count - len,
535e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"\n####################page 1##################\n ");
536e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	for(n=0;n<=max;)
537e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
538e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		//printk( "\nD: %2x> ", n);
539e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		len += snprintf(page + len, count - len,
540e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"\nD:  %2x > ",n);
5418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
542e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		for(i=0;i<16 && n<=max;i++,n++)
543e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		len += snprintf(page + len, count - len,
544e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"%2x ",read_nic_byte(dev,0x100|n));
5458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
546e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		//      printk("%2x ",read_nic_byte(dev,n));
547e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanglen += snprintf(page + len, count - len,
549e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"\n####################page 3##################\n ");
550e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	for(n=0;n<=max;)
551e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
552e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		//printk( "\nD: %2x> ", n);
553e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		len += snprintf(page + len, count - len,
554e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"\nD:  %2x > ",n);
5558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
556e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		for(i=0;i<16 && n<=max;i++,n++)
557e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		len += snprintf(page + len, count - len,
558e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			"%2x ",read_nic_byte(dev,0x300|n));
5598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
560e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		//      printk("%2x ",read_nic_byte(dev,n));
561e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	len += snprintf(page + len, count - len,"\n");
5658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*eof = 1;
5668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return len;
5678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
5698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int proc_get_stats_tx(char *page, char **start,
5758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			  off_t offset, int count,
5768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			  int *eof, void *data)
5778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
5788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = data;
5798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int len = 0;
5828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	len += snprintf(page + len, count - len,
5848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VI priority ok int: %lu\n"
5858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VI priority error int: %lu\n"
5868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VO priority ok int: %lu\n"
5878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VO priority error int: %lu\n"
5888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BE priority ok int: %lu\n"
5898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BE priority error int: %lu\n"
5908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BK priority ok int: %lu\n"
5918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BK priority error int: %lu\n"
5928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX MANAGE priority ok int: %lu\n"
5938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX MANAGE priority error int: %lu\n"
5948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BEACON priority ok int: %lu\n"
5958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BEACON priority error int: %lu\n"
5968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		"TX high priority ok int: %lu\n"
5978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		"TX high priority failed error int: %lu\n"
5988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX queue resume: %lu\n"
5998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX queue stopped?: %d\n"
6008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX fifo overflow: %lu\n"
6018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		"TX beacon: %lu\n"
6028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VI queue: %d\n"
6038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VO queue: %d\n"
6048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BE queue: %d\n"
6058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BK queue: %d\n"
6068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		"TX HW queue: %d\n"
6078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VI dropped: %lu\n"
6088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX VO dropped: %lu\n"
6098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BE dropped: %lu\n"
6108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX BK dropped: %lu\n"
6118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"TX total data packets %lu\n",
6128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		"TX beacon aborted: %lu\n",
6138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txviokint,
6148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txvierr,
6158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txvookint,
6168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txvoerr,
6178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbeokint,
6188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbeerr,
6198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbkokint,
6208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbkerr,
6218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txmanageokint,
6228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txmanageerr,
6238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbeaconokint,
6248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbeaconerr,
6258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		priv->stats.txhpokint,
6268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		priv->stats.txhperr,
6278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txresumed,
6288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		netif_queue_stopped(dev),
6298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txoverflow,
6308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		priv->stats.txbeacon,
6318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		atomic_read(&(priv->tx_pending[VI_PRIORITY])),
6328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		atomic_read(&(priv->tx_pending[VO_PRIORITY])),
6338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		atomic_read(&(priv->tx_pending[BE_PRIORITY])),
6348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		atomic_read(&(priv->tx_pending[BK_PRIORITY])),
6358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		read_nic_byte(dev, TXFIFOCOUNT),
6368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txvidrop,
6378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txvodrop,
6388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbedrop,
6398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txbkdrop,
6408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.txdatapkt
6418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		priv->stats.txbeaconerr
6428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		);
6438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*eof = 1;
6458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return len;
6468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
6478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int proc_get_stats_rx(char *page, char **start,
6518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			  off_t offset, int count,
6528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			  int *eof, void *data)
6538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
6548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = data;
6558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int len = 0;
6588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	len += snprintf(page + len, count - len,
6608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"RX packets: %lu\n"
6618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"RX urb status error: %lu\n"
6628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		"RX invalid urb error: %lu\n",
6638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.rxoktotal,
6648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.rxstaterr,
6658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.rxurberr);
6668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*eof = 1;
6688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return len;
6698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
6708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_proc_module_init(void)
6718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
6728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Initializing proc filesystem");
673e55d92b92d240189241c22bfdfc885d4225a4d61Al Viro	rtl8192_proc = proc_mkdir(RTL819xU_MODULE_NAME, init_net.proc_net);
6748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
6758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_proc_module_remove(void)
6788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
6798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
6808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
6818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_proc_remove_one(struct net_device *dev)
6848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
6858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
6868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
6888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->dir_dev) {
6898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	remove_proc_entry("stats-hw", priv->dir_dev);
6908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		remove_proc_entry("stats-tx", priv->dir_dev);
6918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		remove_proc_entry("stats-rx", priv->dir_dev);
6928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	remove_proc_entry("stats-ieee", priv->dir_dev);
6938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		remove_proc_entry("stats-ap", priv->dir_dev);
6948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		remove_proc_entry("registers", priv->dir_dev);
6958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	remove_proc_entry("cck-registers",priv->dir_dev);
6968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	remove_proc_entry("ofdm-registers",priv->dir_dev);
6978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//remove_proc_entry(dev->name, rtl8192_proc);
6988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		remove_proc_entry("wlan0", rtl8192_proc);
6998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->dir_dev = NULL;
7008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
7018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
7028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_proc_init_one(struct net_device *dev)
7058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
7068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct proc_dir_entry *e;
7078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
708e55d92b92d240189241c22bfdfc885d4225a4d61Al Viro	priv->dir_dev = proc_mkdir(dev->name, rtl8192_proc);
7098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!priv->dir_dev) {
7108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
7118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      dev->name);
7128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return;
7138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
7148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
7158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				   priv->dir_dev, proc_get_stats_rx, dev);
7168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!e) {
7188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR,"Unable to initialize "
7198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      "/proc/net/rtl8192/%s/stats-rx\n",
7208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      dev->name);
7218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
7228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
7258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				   priv->dir_dev, proc_get_stats_tx, dev);
7268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!e) {
7288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Unable to initialize "
7298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      "/proc/net/rtl8192/%s/stats-tx\n",
7308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      dev->name);
7318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
7328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
7348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				   priv->dir_dev, proc_get_stats_ap, dev);
7358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!e) {
7378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Unable to initialize "
7388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      "/proc/net/rtl8192/%s/stats-ap\n",
7398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      dev->name);
7408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
7418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
7438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				   priv->dir_dev, proc_get_registers, dev);
7448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!e) {
7458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Unable to initialize "
7468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      "/proc/net/rtl8192/%s/registers\n",
7478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		      dev->name);
7488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
7498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
7508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/****************************************************************************
7518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang   -----------------------------MISC STUFF-------------------------
7528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*****************************************************************************/
7538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* this is only for debugging */
7558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid print_buffer(u32 *buffer, int len)
7568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
7578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
7588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 *buf =(u8*)buffer;
7598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("ASCII BUFFER DUMP (len: %x):\n",len);
7618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i=0;i<len;i++)
7638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("%c",buf[i]);
7648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
7668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i=0;i<len;i++)
7688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("%x",buf[i]);
7698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("\n");
7718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
7728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//short check_nic_enough_desc(struct net_device *dev, priority_t priority)
7748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangshort check_nic_enough_desc(struct net_device *dev,int queue_index)
7758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
7768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
7778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int used = atomic_read(&priv->tx_pending[queue_index]);
7788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return (used < MAX_TX_URB);
7808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
7818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid tx_timeout(struct net_device *dev)
7838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
7848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
7858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rtl8192_commit(dev);
7868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	schedule_work(&priv->reset_wq);
7888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//DMESG("TXTIMEOUT");
7898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
7908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
7928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* this is only for debug */
7938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid dump_eprom(struct net_device *dev)
7948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
7958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
7968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i=0; i<63; i++)
7978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "EEPROM addr %x : %x", i, eprom_read(dev,i));
7988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
7998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* this is only for debug */
8018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_dump_reg(struct net_device *dev)
8028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
8038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
8048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int n;
8058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int max=0x1ff;
8068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_PHY, "Dumping NIC register map");
8088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(n=0;n<=max;)
8108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
8118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk( "\nD: %2x> ", n);
8128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=0;i<16 && n<=max;i++,n++)
8138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			printk("%2x ",read_nic_byte(dev,n));
8148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
8158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("\n");
8168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
8178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/****************************************************************************
8198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang      ------------------------------HW STUFF---------------------------
8208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*****************************************************************************/
8218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_set_mode(struct net_device *dev,int mode)
8248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
8258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 ecmd;
8268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ecmd=read_nic_byte(dev, EPROM_CMD);
8278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
8288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
8298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
8308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
8318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, EPROM_CMD, ecmd);
8328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
8338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_update_msr(struct net_device *dev)
8368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
8378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
8388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 msr;
8398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	msr  = read_nic_byte(dev, MSR);
8418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	msr &= ~ MSR_LINK_MASK;
8428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* do not change in link_state != WLAN_LINK_ASSOCIATED.
8448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 * msr must be updated if the state is ASSOCIATING.
8458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 * this is intentional and make sense for ad-hoc and
8468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 * master (see the create BSS/IBSS func)
8478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 */
8488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->ieee80211->state == IEEE80211_LINKED){
8498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
8518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
8528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
8538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
8548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
8558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
8568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}else
8588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
8598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, MSR, msr);
8618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
8628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_set_chan(struct net_device *dev,short ch)
8648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
8658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
8668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	u32 tx;
8678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __FUNCTION__, ch);
8688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->chan=ch;
8698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* this hack should avoid frame TX during channel setting*/
8718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	tx = read_nic_dword(dev,TX_CONF);
8748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	tx &= ~TX_LOOPBACK_MASK;
8758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifndef LOOP_TEST
8778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
8788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//need to implement rf set channel here WB
8808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->rf_set_chan)
8828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->rf_set_chan(dev,priv->chan);
8838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	mdelay(10);
8848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
8858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
8868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
8878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_rx_isr(struct urb *urb);
8898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//static void rtl8192_rx_isr(struct urb *rx_urb);
8908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
8928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
8938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
8948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
8958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (pstats->bisrxaggrsubframe)
8968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
8978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			+ pstats->RxBufShift + 8);
8988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
8998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
9008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
9018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				+ pstats->RxBufShift);
9028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
9048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int rtl8192_rx_initiate(struct net_device*dev)
9058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
906e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
907e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct urb *entry;
908e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct sk_buff *skb;
909e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct rtl8192_rx_info *info;
9108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* nomal packet rx procedure */
912e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB) {
913e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb = __dev_alloc_skb(RX_URB_SIZE, GFP_KERNEL);
914e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		if (!skb)
915e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			break;
916e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		entry = usb_alloc_urb(0, GFP_KERNEL);
917e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		if (!entry) {
918e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			kfree_skb(skb);
919e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			break;
920e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		}
9218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		printk("nomal packet IN request!\n");
922e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		usb_fill_bulk_urb(entry, priv->udev,
923e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				  usb_rcvbulkpipe(priv->udev, 3), skb_tail_pointer(skb),
924e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				  RX_URB_SIZE, rtl8192_rx_isr, skb);
925e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info = (struct rtl8192_rx_info *) skb->cb;
926e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info->urb = entry;
927e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info->dev = dev;
9288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		info->out_pipe = 3; //denote rx normal packet queue
929e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb_queue_tail(&priv->rx_queue, skb);
930e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		usb_submit_urb(entry, GFP_KERNEL);
931e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
9328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* command packet rx procedure */
934e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	while (skb_queue_len(&priv->rx_queue) < MAX_RX_URB + 3) {
9358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		printk("command packet IN request!\n");
936e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb = __dev_alloc_skb(RX_URB_SIZE ,GFP_KERNEL);
937e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		if (!skb)
938e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			break;
939e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		entry = usb_alloc_urb(0, GFP_KERNEL);
940e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		if (!entry) {
941e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			kfree_skb(skb);
942e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			break;
943e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		}
944e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		usb_fill_bulk_urb(entry, priv->udev,
945e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				  usb_rcvbulkpipe(priv->udev, 9), skb_tail_pointer(skb),
946e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				  RX_URB_SIZE, rtl8192_rx_isr, skb);
947e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info = (struct rtl8192_rx_info *) skb->cb;
948e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info->urb = entry;
949e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info->dev = dev;
9508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		   info->out_pipe = 9; //denote rx cmd packet queue
951e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb_queue_tail(&priv->rx_queue, skb);
9528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		usb_submit_urb(entry, GFP_KERNEL);
953e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
9548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
955e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	return 0;
9568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
9578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_set_rxconf(struct net_device *dev)
9598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
9608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
9618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 rxconf;
9628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf=read_nic_dword(dev,RCR);
9648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf &~ MAC_FILTER_MASK;
9658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | RCR_AMF;
9668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | RCR_ADF;
9678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | RCR_AB;
9688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | RCR_AM;
9698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rxconf = rxconf | RCR_ACF;
9708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (dev->flags & IFF_PROMISC) {DMESG ("NIC in promisc mode");}
9728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
9748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	   dev->flags & IFF_PROMISC){
9758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | RCR_AAP;
9768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
9778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
9788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
9798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}*/else{
9808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | RCR_APM;
9818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | RCR_CBSSID;
9828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
9838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
9868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | RCR_AICV;
9878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | RCR_APWRMGT;
9888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
9898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
9918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxconf = rxconf | RCR_ACRC32;
9928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
9958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
9968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf &~ MAX_RX_DMA_MASK;
9978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | ((u32)7<<RCR_MXDMA_OFFSET);
9988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
9998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
10008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rxconf = rxconf | RCR_ONLYERLPKT;
10018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rxconf = rxconf &~ RCR_CS_MASK;
10038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rxconf = rxconf | (1<<RCR_CS_SHIFT);
10048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RCR, rxconf);
10068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	#ifdef DEBUG_RX
10088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RCR));
10098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	#endif
10108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
10118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//wait to be removed
10128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_rx_enable(struct net_device *dev)
10138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
10148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//u8 cmd;
10158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
10178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rx_initiate(dev);
10198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_set_rxconf(dev);
10218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
10228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_tx_enable(struct net_device *dev)
10258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
10268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
10278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_rtx_disable(struct net_device *dev)
10318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
10328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 cmd;
10338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
10348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct sk_buff *skb;
10358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct rtl8192_rx_info *info;
10368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cmd=read_nic_byte(dev,CMDR);
10388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, CMDR, cmd &~ \
10398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(CR_TE|CR_RE));
10408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	force_pci_posting(dev);
10418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	mdelay(10);
10428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	while ((skb = __skb_dequeue(&priv->rx_queue))) {
10448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		info = (struct rtl8192_rx_info *) skb->cb;
10458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (!info->urb)
10468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			continue;
10478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		usb_kill_urb(info->urb);
10498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		kfree_skb(skb);
10508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
10518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (skb_queue_len(&priv->skb_queue)) {
10538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk(KERN_WARNING "skb_queue not empty\n");
10548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
10558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb_queue_purge(&priv->skb_queue);
10578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
10588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
10598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
10628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
10638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
10648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
10658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanginline u16 ieeerate2rtlrate(int rate)
10678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
10688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(rate){
10698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 10:
10708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
10718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 20:
10728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 1;
10738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 55:
10748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 2;
10758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 110:
10768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 3;
10778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 60:
10788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 4;
10798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 90:
10808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 5;
10818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 120:
10828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 6;
10838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 180:
10848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 7;
10858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 240:
10868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 8;
10878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 360:
10888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 9;
10898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 480:
10908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 10;
10918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case 540:
10928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 11;
10938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	default:
10948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 3;
10958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
10968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
10978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
10988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540};
10998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanginline u16 rtl8192_rate2rate(short rate)
11008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
11018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (rate >11) return 0;
11028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return rtl_rate[rate];
11038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
11048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* The protype of rx_isr has changed since one verion of Linux Kernel */
11078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_rx_isr(struct urb *urb)
11088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
1109e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct sk_buff *skb = (struct sk_buff *) urb->context;
1110e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
1111e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct net_device *dev = info->dev;
11128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
11138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int out_pipe = info->out_pipe;
11148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int err;
11158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!priv->up)
11168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return;
1117e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (unlikely(urb->status)) {
1118e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		info->urb = NULL;
1119e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		priv->stats.rxstaterr++;
1120e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		priv->ieee80211->stats.rx_errors++;
1121e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		usb_free_urb(urb);
11228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	printk("%s():rx status err\n",__FUNCTION__);
1123e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return;
1124e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
1125e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	skb_unlink(skb, &priv->rx_queue);
1126e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	skb_put(skb, urb->actual_length);
11278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb_queue_tail(&priv->skb_queue, skb);
11298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tasklet_schedule(&priv->irq_rx_tasklet);
11308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1131e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	skb = dev_alloc_skb(RX_URB_SIZE);
1132e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (unlikely(!skb)) {
1133e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		usb_free_urb(urb);
11348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("%s():can,t alloc skb\n",__FUNCTION__);
1135e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		/* TODO check rx queue length and refill *somewhere* */
1136e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return;
1137e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
11388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	usb_fill_bulk_urb(urb, priv->udev,
1140f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab			usb_rcvbulkpipe(priv->udev, out_pipe), skb_tail_pointer(skb),
11418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RX_URB_SIZE, rtl8192_rx_isr, skb);
11428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1143e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	info = (struct rtl8192_rx_info *) skb->cb;
1144e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	info->urb = urb;
1145e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	info->dev = dev;
11468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	info->out_pipe = out_pipe;
11478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1148e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	urb->transfer_buffer = skb_tail_pointer(skb);
1149e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	urb->context = skb;
1150e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	skb_queue_tail(&priv->rx_queue, skb);
1151e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	err = usb_submit_urb(urb, GFP_ATOMIC);
11528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(err && err != EPERM)
11538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("can not submit rxurb, err is %x,URB status is %x\n",err,urb->status);
11548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
11558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu32
11578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl819xusb_rx_command_packet(
11588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev,
11598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats *pstats
11608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
11618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
11628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32	status;
11638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//RT_TRACE(COMP_RECV, DBG_TRACE, ("---> RxCommandPacketHandle819xUsb()\n"));
11658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = cmpk_message_handle_rx(dev, pstats);
11678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (status)
11688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
11698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		DMESG("rxcommandpackethandle819xusb: It is a command packet\n");
11708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
11718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
11728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
11738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//RT_TRACE(COMP_RECV, DBG_TRACE, ("RxCommandPacketHandle819xUsb: It is not a command packet\n"));
11748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
11758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//RT_TRACE(COMP_RECV, DBG_TRACE, ("<--- RxCommandPacketHandle819xUsb()\n"));
11778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return status;
11788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
11798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_data_hard_stop(struct net_device *dev)
11828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
11838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//FIXME !!
11848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
11858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_data_hard_resume(struct net_device *dev)
11888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
11898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// FIXME !!
11908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
11918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
11928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* this function TX data frames when the ieee80211 stack requires this.
11938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * It checks also if we need to stop the ieee tx queue, eventually do it
11948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang */
11958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
11968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
11978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
11988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int ret;
11998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	unsigned long flags;
12008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
12018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 queue_index = tcb_desc->queue_index;
12028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* shall not be referred by command packet */
12048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	assert(queue_index != TXCMD_QUEUE);
12058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_lock_irqsave(&priv->tx_lock,flags);
12078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1208e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
12098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	tcb_desc->RATRIndex = 7;
12108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	tcb_desc->bTxDisableRateFallBack = 1;
12118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	tcb_desc->bTxUseDriverAssingedRate = 1;
12128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tcb_desc->bTxEnableFwCalcDur = 1;
12138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb_push(skb, priv->ieee80211->tx_headroom);
12148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ret = rtl8192_tx(dev, skb);
12158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
12178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//priv->ieee80211->stats.tx_packets++;
12188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_unlock_irqrestore(&priv->tx_lock,flags);
12208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	return ret;
12228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
12238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
12248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* This is a rough attempt to TX a frame
12268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * This is called by the ieee 80211 stack to TX management frames.
12278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * If the ring is full packet are dropped (for data frame the queue
12288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * is stopped before this can happen).
12298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang */
12308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
12318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
12328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
12338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int ret;
12348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	unsigned long flags;
1235e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1236e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u8 queue_index = tcb_desc->queue_index;
12378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_lock_irqsave(&priv->tx_lock,flags);
12408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1241e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
12428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(queue_index == TXCMD_QUEUE) {
12438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_push(skb, USB_HWDESC_HEADER_LEN);
12448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl819xU_tx_cmd(dev, skb);
12458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ret = 1;
1246e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		spin_unlock_irqrestore(&priv->tx_lock,flags);
12478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return ret;
12488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
12498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_push(skb, priv->ieee80211->tx_headroom);
12508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ret = rtl8192_tx(dev, skb);
12518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
12528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_unlock_irqrestore(&priv->tx_lock,flags);
12548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret;
12568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
12578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_try_wake_queue(struct net_device *dev, int pri);
12608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
12628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu16 DrvAggr_PaddingAdd(struct net_device *dev, struct sk_buff *skb)
12638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
12648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16     PaddingNum =  256 - ((skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES) % 256);
12658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return  (PaddingNum&0xff);
12668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
12678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 MRateToHwRate8190Pci(u8 rate);
12698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc);
12708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 MapHwQueueToFirmwareQueue(u8 QueueID);
12718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstruct sk_buff *DrvAggr_Aggregation(struct net_device *dev, struct ieee80211_drv_agg_txb *pSendList)
12728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
12738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device *ieee = netdev_priv(dev);
12748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
12758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cb_desc 	*tcb_desc = NULL;
12768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 		i;
12778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32		TotalLength;
12788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct sk_buff	*skb;
12798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct sk_buff  *agg_skb;
12808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc_819x_usb_aggr_subframe *tx_agg_desc = NULL;
12818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo_819x_usb	       *tx_fwinfo = NULL;
12828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
12848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Local variable initialization.
12858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
12868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* first skb initialization */
12878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb = pSendList->tx_agg_frames[0];
12888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	TotalLength = skb->len;
12898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Get the total aggregation length including the padding space and
12918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 * sub frame header.
12928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 */
12938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
12948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TotalLength += DrvAggr_PaddingAdd(dev, skb);
12958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb = pSendList->tx_agg_frames[i];
12968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TotalLength += (skb->len + TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
12978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
12988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
12998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* allocate skb to contain the aggregated packets */
13008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	agg_skb = dev_alloc_skb(TotalLength + ieee->tx_headroom);
13018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(agg_skb->data, 0, agg_skb->len);
13028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb_reserve(agg_skb, ieee->tx_headroom);
13038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
13058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* reserve info for first subframe Tx descriptor to be set in the tx function */
13068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb = pSendList->tx_agg_frames[0];
13078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
13088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tcb_desc->drv_agg_enable = 1;
13098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tcb_desc->pkt_size = skb->len;
1310e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tcb_desc->DrvAggrNum = pSendList->nr_drv_agg_frames;
13118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("DrvAggNum = %d\n", tcb_desc->DrvAggrNum);
13128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_DEBUG_DATA(COMP_SEND, skb->cb, sizeof(skb->cb));
13138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	printk("========>skb->data ======> \n");
13148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_DEBUG_DATA(COMP_SEND, skb->data, skb->len);
13158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memcpy(agg_skb->cb, skb->cb, sizeof(skb->cb));
13168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
13178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 1; i < pSendList->nr_drv_agg_frames; i++) {
13198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* push the next sub frame to be 256 byte aline */
13208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_put(agg_skb,DrvAggr_PaddingAdd(dev,skb));
13218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Subframe drv Tx descriptor and firmware info setting */
13238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb = pSendList->tx_agg_frames[i];
13248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
13258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc = (tx_desc_819x_usb_aggr_subframe *)agg_skb->tail;
13268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo = (tx_fwinfo_819x_usb *)(agg_skb->tail + sizeof(tx_desc_819x_usb_aggr_subframe));
13278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
13298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* DWORD 0 */
13308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
13318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
13328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
13338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
13348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
13358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->AllowAggregation = 1;
13368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* DWORD 1 */
13378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
13388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
13398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		} else {
13408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->AllowAggregation = 0;
13418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* DWORD 1 */
13428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->RxMF = 0;
13438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->RxAMD = 0;
13448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
13458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Protection mode related */
13478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
13488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
13498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
13508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
13518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsRate =  MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
13528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
13538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
13548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
13558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				      (tcb_desc->bRTSUseShortGI?1:0);
13568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Set Bandwidth and sub-channel settings. */
13588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
13598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
13608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(tcb_desc->bPacketBW) {
13618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tx_fwinfo->TxBandwidth = 1;
13628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tx_fwinfo->TxSubCarrier = 0;    //By SD3's Jerry suggestion, use duplicated mode
13638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			} else {
13648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tx_fwinfo->TxBandwidth = 0;
13658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
13668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
13678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		} else {
13688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->TxBandwidth = 0;
13698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->TxSubCarrier = 0;
13708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
13718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Fill Tx descriptor */
13738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memset(tx_agg_desc, 0, sizeof(tx_desc_819x_usb_aggr_subframe));
13748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* DWORD 0 */
13758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//tx_agg_desc->LINIP = 0;
13768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//tx_agg_desc->CmdInit = 1;
13778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->Offset =  sizeof(tx_fwinfo_819x_usb) + 8;
137825985edcedea6396277003854657b5f3cb31a628Lucas De Marchi		/* already raw data, need not to subtract header length */
13798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->PktSize = skb->len & 0xffff;
13808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*DWORD 1*/
13828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->SecCAMID= 0;
13838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->RATid = tcb_desc->RATRIndex;
13848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
13858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//MPDUOverhead = 0;
13868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_agg_desc->NoEnc = 1;
13878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
13888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->SecType = 0x0;
13898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
13908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (tcb_desc->bHwSec) {
13918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			switch (priv->ieee80211->pairwise_key_type)
13928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
13938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case KEY_TYPE_WEP40:
13948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case KEY_TYPE_WEP104:
13958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->SecType = 0x1;
13968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->NoEnc = 0;
13978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
13988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case KEY_TYPE_TKIP:
13998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->SecType = 0x2;
14008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->NoEnc = 0;
14018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
14028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case KEY_TYPE_CCMP:
14038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->SecType = 0x3;
14048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->NoEnc = 0;
14058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
14068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case KEY_TYPE_NA:
14078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->SecType = 0x0;
14088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tx_agg_desc->NoEnc = 1;
14098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
14108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
14118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
14128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
14148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->TxFWInfoSize =  sizeof(tx_fwinfo_819x_usb);
14158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
14178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
14188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_agg_desc->OWN = 1;
14208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//DWORD 2
14228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* According windows driver, it seems that there no need to fill this field */
14238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//tx_agg_desc->TxBufferSize= (u32)(skb->len - USB_HWDESC_HEADER_LEN);
14248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* to fill next packet */
14268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_put(agg_skb,TX_PACKET_DRVAGGR_SUBFRAME_SHIFT_BYTES);
14278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(skb_put(agg_skb,skb->len),skb->data,skb->len);
14288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
14298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 0; i < pSendList->nr_drv_agg_frames; i++) {
14318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb_any(pSendList->tx_agg_frames[i]);
14328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
14338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return agg_skb;
14358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
14368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* NOTE:
14388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	This function return a list of PTCB which is proper to be aggregate with the input TCB.
14398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	If no proper TCB is found to do aggregation, SendList will only contain the input TCB.
14408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
14418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 DrvAggr_GetAggregatibleList(struct net_device *dev, struct sk_buff *skb,
14428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		struct ieee80211_drv_agg_txb *pSendList)
14438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
14448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device *ieee = netdev_priv(dev);
14458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	PRT_HIGH_THROUGHPUT	pHTInfo = ieee->pHTInfo;
14468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16		nMaxAggrNum = pHTInfo->UsbTxAggrNum;
14478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cb_desc 	*tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
14488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8		QueueID = tcb_desc->queue_index;
14498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	do {
14518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pSendList->tx_agg_frames[pSendList->nr_drv_agg_frames++] = skb;
14528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pSendList->nr_drv_agg_frames >= nMaxAggrNum) {
14538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
14548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
14558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} while((skb = skb_dequeue(&ieee->skb_drv_aggQ[QueueID])));
14578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_AMSDU, "DrvAggr_GetAggregatibleList, nAggrTcbNum = %d \n", pSendList->nr_drv_agg_frames);
14598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return pSendList->nr_drv_agg_frames;
14608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
14618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
14628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_tx_isr(struct urb *tx_urb)
14648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
14658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct sk_buff *skb = (struct sk_buff*)tx_urb->context;
14668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = NULL;
14678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = NULL;
14688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
14698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8  queue_index = tcb_desc->queue_index;
14708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	bool bToSend0Byte;
14718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	u16 BufLen = skb->len;
14728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memcpy(&dev,(struct net_device*)(skb->cb),sizeof(struct net_device*));
14748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv = ieee80211_priv(dev);
14758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(tcb_desc->queue_index != TXCMD_QUEUE) {
14778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(tx_urb->status == 0) {
14788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			dev->trans_start = jiffies;
14798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// As act as station mode, destion shall be  unicast address.
14808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//priv->ieee80211->stats.tx_bytes+=(skb->len - priv->ieee80211->tx_headroom);
14818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//priv->ieee80211->stats.tx_packets++;
14828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.txoktotal++;
14838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
14848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.txbytesunicast += (skb->len - priv->ieee80211->tx_headroom);
14858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		} else {
14868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->ieee80211->stats.tx_errors++;
14878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//priv->stats.txmanageerr++;
14888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* TODO */
14898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
14908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
14918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* free skb and tx_urb */
14938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(skb != NULL) {
14948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb_any(skb);
14958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		usb_free_urb(tx_urb);
14968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		atomic_dec(&priv->tx_pending[queue_index]);
14978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
14988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
14998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
15008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
15018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Handle HW Beacon:
1502af02b584bc0e1f46cf1477ad54ae18ec3842b6f4Uwe Kleine-König		// We had transfer our beacon frame to host controller at this moment.
15038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
15048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
15058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Caution:
15068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Handling the wait queue of command packets.
15078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// For Tx command packets, we must not do TCB fragment because it is not handled right now.
15088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// We must cut the packets to match the size of TX_CMD_PKT before we send it.
15098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
15108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Handle MPDU in wait queue. */
15128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(queue_index != BEACON_QUEUE) {
15138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* Don't send data frame during scanning.*/
15148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if((skb_queue_len(&priv->ieee80211->skb_waitQ[queue_index]) != 0)&&\
15158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(!(priv->ieee80211->queue_stop))) {
15168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(NULL != (skb = skb_dequeue(&(priv->ieee80211->skb_waitQ[queue_index]))))
15178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->ieee80211->softmac_hard_start_xmit(skb, dev);
15188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				return; //modified by david to avoid further processing AMSDU
15208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
15218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
15228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else if ((skb_queue_len(&priv->ieee80211->skb_drv_aggQ[queue_index])!= 0)&&\
1523e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				(!(priv->ieee80211->queue_stop))) {
15248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				// Tx Driver Aggregation process
15258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				/* The driver will aggregation the packets according to the following stets
15268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 * 1. check whether there's tx irq available, for it's a completion return
15278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 *    function, it should contain enough tx irq;
15288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 * 2. check pakcet type;
15299b0131cb24182ef6cc478a89fc56fc6e004651e7Uwe Kleine-König				 * 3. initialize sendlist, check whether the to-be send packet no greater than 1
15308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 * 4. aggregation the packets, and fill firmware info and tx desc to it, etc.
15318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 * 5. check whehter the packet could be sent, otherwise just insert to wait head
15328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 * */
15338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				skb = skb_dequeue(&priv->ieee80211->skb_drv_aggQ[queue_index]);
15348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(!check_nic_enough_desc(dev, queue_index)) {
15358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					skb_queue_head(&(priv->ieee80211->skb_drv_aggQ[queue_index]), skb);
15368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					return;
15378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
15388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
15408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					/*TODO*/
15418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					/*
15428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					u8* pHeader = skb->data;
15438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if(IsMgntQosData(pHeader) ||
1545e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab					    IsMgntQData_Ack(pHeader) ||
15468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					    IsMgntQData_Poll(pHeader) ||
15478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					    IsMgntQData_Poll_Ack(pHeader)
15488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					  )
15498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					*/
15508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					{
15518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						struct ieee80211_drv_agg_txb SendList;
15528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						memset(&SendList, 0, sizeof(struct ieee80211_drv_agg_txb));
15548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						if(DrvAggr_GetAggregatibleList(dev, skb, &SendList) > 1) {
15558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							skb = DrvAggr_Aggregation(dev, &SendList);
15568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						}
15588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
15598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->ieee80211->softmac_hard_start_xmit(skb, dev);
15608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
15618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
15628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
15638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
15648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
15658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
15678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_beacon_stop(struct net_device *dev)
15698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
15708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 msr, msrm, msr2;
15718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
15728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	msr  = read_nic_byte(dev, MSR);
15748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	msrm = msr & MSR_LINK_MASK;
15758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	msr2 = msr & ~MSR_LINK_MASK;
15768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(NIC_8192U == priv->card_8192) {
15788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
15798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
15808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
15818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
15828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
15838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_byte(dev, MSR, msr);
15848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
15858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
15868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_config_rate(struct net_device* dev, u16* rate_config)
15888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
15898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 struct r8192_priv *priv = ieee80211_priv(dev);
15908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 struct ieee80211_network *net;
15918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 u8 i=0, basic_rate = 0;
15928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 net = & priv->ieee80211->current_network;
15938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
15948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 for (i=0; i<net->rates_len; i++)
15958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 {
15968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 basic_rate = net->rates[i]&0x7f;
15978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 switch(basic_rate)
15988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 {
15998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_1M:	*rate_config |= RRSR_1M;	break;
16008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_2M:	*rate_config |= RRSR_2M;	break;
16018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_5_5M:	*rate_config |= RRSR_5_5M;	break;
16028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_11M:	*rate_config |= RRSR_11M;	break;
16038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_6M:	*rate_config |= RRSR_6M;	break;
16048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_9M:	*rate_config |= RRSR_9M;	break;
16058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_12M:	*rate_config |= RRSR_12M;	break;
16068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_18M:	*rate_config |= RRSR_18M;	break;
16078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_24M:	*rate_config |= RRSR_24M;	break;
16088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_36M:	*rate_config |= RRSR_36M;	break;
16098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_48M:	*rate_config |= RRSR_48M;	break;
16108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_54M:	*rate_config |= RRSR_54M;	break;
16118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 }
16128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 }
16138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 for (i=0; i<net->rates_ex_len; i++)
16148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 {
16158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 basic_rate = net->rates_ex[i]&0x7f;
16168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 switch(basic_rate)
16178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 {
16188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_1M:	*rate_config |= RRSR_1M;	break;
16198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_2M:	*rate_config |= RRSR_2M;	break;
16208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_5_5M:	*rate_config |= RRSR_5_5M;	break;
16218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_11M:	*rate_config |= RRSR_11M;	break;
16228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_6M:	*rate_config |= RRSR_6M;	break;
16238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_9M:	*rate_config |= RRSR_9M;	break;
16248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_12M:	*rate_config |= RRSR_12M;	break;
16258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_18M:	*rate_config |= RRSR_18M;	break;
16268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_24M:	*rate_config |= RRSR_24M;	break;
16278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_36M:	*rate_config |= RRSR_36M;	break;
16288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_48M:	*rate_config |= RRSR_48M;	break;
16298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 case MGN_54M:	*rate_config |= RRSR_54M;	break;
16308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 }
16318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 }
16328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
16338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define SHORT_SLOT_TIME 9
16368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define NON_SHORT_SLOT_TIME 20
16378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_update_cap(struct net_device* dev, u16 cap)
16398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
16408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 tmp = 0;
16418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
16428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_network *net = &priv->ieee80211->current_network;
16438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
16448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tmp = priv->basic_rate;
16458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->short_preamble)
16468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tmp |= BRSR_AckShortPmb;
16478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RRSR, tmp);
16488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (net->mode & (IEEE_G|IEEE_N_24G))
16508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
16518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 slot_time = 0;
16528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
16538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{//short slot time
16548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			slot_time = SHORT_SLOT_TIME;
16558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
16568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else //long slot time
16578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			slot_time = NON_SHORT_SLOT_TIME;
16588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->slot_time = slot_time;
16598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_byte(dev, SLOT_TIME, slot_time);
16608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
16618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
16638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_net_update(struct net_device *dev)
16648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
16658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
16678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_network *net;
16688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
16698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 rate_config = 0;
16708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	net = & priv->ieee80211->current_network;
16718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_config_rate(dev, &rate_config);
16738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->basic_rate = rate_config &= 0x15f;
16748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
16768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
16778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//for(i=0;i<ETH_ALEN;i++)
16788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	write_nic_byte(dev,BSSID+i,net->bssid[i]);
16798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_update_msr(dev);
16818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_update_cap(dev, net->capability);
16828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
16838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
16848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, ATIMWND, 2);
16858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, BCN_DMATIME, 1023);
16868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
16878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	write_nic_word(dev, BcnIntTime, 100);
16888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, BCN_DRV_EARLY_INT, 1);
16898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, BCN_ERR_THRESH, 100);
16908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
16918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// TODO: BcnIFS may required to be changed on ASIC
1692e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
16938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
16958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
16968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
16998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
17008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//temporary hw beacon is not used any more.
17028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//open it when necessary
17038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl819xusb_beacon_tx(struct net_device *dev,u16  tx_rate)
17048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
17058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
17078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanginline u8 rtl8192_IsWirelessBMode(u16 rate)
17088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
17098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
17108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return 1;
17118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else return 0;
17128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
17138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu16 N_DBPSOfRate(u16 DataRate);
17158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu16 ComputeTxTime(
17178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16		FrameLength,
17188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16		DataRate,
17198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8		bManagementFrame,
17208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8		bShortPreamble
17218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang)
17228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
17238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16	FrameTime;
17248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16	N_DBPS;
17258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16	Ceiling;
17268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if( rtl8192_IsWirelessBMode(DataRate) )
17288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
17298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if( bManagementFrame || !bShortPreamble || DataRate == 10 )
17308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{	// long preamble
17318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
17328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
17338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
17348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{	// Short preamble
17358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
17368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
17378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
17388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				FrameTime ++;
17398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {	//802.11g DSSS-OFDM PLCP length field calculation.
17408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		N_DBPS = N_DBPSOfRate(DataRate);
17418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
17428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				+ (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
17438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
17448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
17458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return FrameTime;
17468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
17478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu16 N_DBPSOfRate(u16 DataRate)
17498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
17508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 u16 N_DBPS = 24;
17518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 switch(DataRate)
17538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 {
17548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 60:
17558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 24;
17568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 90:
17598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 36;
17608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 120:
17638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 48;
17648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 180:
17678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 72;
17688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 240:
17718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 96;
17728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 360:
17758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 144;
17768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 480:
17798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 192;
17808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 case 540:
17838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  N_DBPS = 216;
17848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 default:
17878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	  break;
17888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 }
17898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 return N_DBPS;
17918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
17928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl819xU_cmd_isr(struct urb *tx_cmd_urb, struct pt_regs *regs)
17948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
17958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	usb_free_urb(tx_cmd_urb);
17968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
17978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
17988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangunsigned int txqueue2outpipe(struct r8192_priv* priv,unsigned int tx_queue) {
17998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(tx_queue >= 9)
18018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
18028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR,"%s():Unknown queue ID!!!\n",__FUNCTION__);
18038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return 0x04;
18048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
18058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return priv->txqueue_to_outpipemap[tx_queue];
18068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
18078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangshort rtl819xU_tx_cmd(struct net_device *dev, struct sk_buff *skb)
18098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
18108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
18118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//u8			*tx;
18128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int			status;
18138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct urb		*tx_urb;
18148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//int			urb_buf_len;
18158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	unsigned int 		idx_pipe;
18168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc_cmd_819x_usb *pdesc = (tx_desc_cmd_819x_usb *)skb->data;
18178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
18188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 queue_index = tcb_desc->queue_index;
18198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//printk("\n %s::queue_index = %d\n",__FUNCTION__, queue_index);
18218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	atomic_inc(&priv->tx_pending[queue_index]);
18228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
18238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!tx_urb){
18248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb(skb);
18258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -ENOMEM;
18268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
18278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(pdesc, 0, USB_HWDESC_HEADER_LEN);
18298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Tx descriptor ought to be set according to the skb->cb */
18308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pdesc->FirstSeg = 1;//bFirstSeg;
18318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pdesc->LastSeg = 1;//bLastSeg;
18328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pdesc->CmdInit = tcb_desc->bCmdOrInit;
18338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pdesc->TxBufferSize = tcb_desc->txbuf_size;
18348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pdesc->OWN = 1;
18358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pdesc->LINIP = tcb_desc->bLastIniPkt;
18368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//----------------------------------------------------------------------------
18388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Fill up USB_OUT_CONTEXT.
18398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//----------------------------------------------------------------------------
18408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Get index to out pipe from specified QueueID.
18418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifndef USE_ONE_PIPE
18428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	idx_pipe = txqueue2outpipe(priv,queue_index);
18438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
18448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	idx_pipe = 0x04;
18458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
18468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef JOHN_DUMP_TXDESC
18478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
18488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("<Tx descriptor>--rate %x---",rate);
18498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for (i = 0; i < 8; i++)
18508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("%8x ", tx[i]);
18518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("\n");
18528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
18538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,idx_pipe), \
18548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			skb->data, skb->len, rtl8192_tx_isr, skb);
18558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_submit_urb(tx_urb, GFP_ATOMIC);
18578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!status){
18598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return 0;
18608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}else{
18618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		DMESGE("Error TX CMD URB, error %d",
18628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				status);
18638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -1;
18648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
18658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
18668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
18688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
18698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * in TxFwInfo data structure
18708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * 2006.10.30 by Emily
18718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
18728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * \param QUEUEID       Software Queue
18738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
18748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 MapHwQueueToFirmwareQueue(u8 QueueID)
18758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
18768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 QueueSelect = 0x0;       //defualt set to
18778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(QueueID) {
18798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case BE_QUEUE:
18808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_BE;  //or QSelect = pTcb->priority;
18818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
18828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case BK_QUEUE:
18848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_BK;  //or QSelect = pTcb->priority;
18858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
18868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case VO_QUEUE:
18888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_VO;  //or QSelect = pTcb->priority;
18898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
18908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case VI_QUEUE:
18928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_VI;  //or QSelect = pTcb->priority;
18938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
18948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGNT_QUEUE:
18958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_MGNT;
18968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
18978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
18988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case BEACON_QUEUE:
18998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_BEACON;
19008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
19018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// TODO: 2006.10.30 mark other queue selection until we verify it is OK
19038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// TODO: Remove Assertions
19048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//#if (RTL819X_FPGA_VER & RTL819X_FPGA_GUANGAN_070502)
19058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case TXCMD_QUEUE:
19068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_CMD;
19078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
19088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//#endif
19098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case HIGH_QUEUE:
19108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			QueueSelect = QSLT_HIGH;
19118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
19128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:
19148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection: %d \n", QueueID);
19158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
19168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
19178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return QueueSelect;
19188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
19198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 MRateToHwRate8190Pci(u8 rate)
19218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
19228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8  ret = DESC90_RATE1M;
19238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(rate) {
19258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_1M:    ret = DESC90_RATE1M;    break;
19268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_2M:    ret = DESC90_RATE2M;    break;
19278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_5_5M:  ret = DESC90_RATE5_5M;  break;
19288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_11M:   ret = DESC90_RATE11M;   break;
19298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_6M:    ret = DESC90_RATE6M;    break;
19308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_9M:    ret = DESC90_RATE9M;    break;
19318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_12M:   ret = DESC90_RATE12M;   break;
19328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_18M:   ret = DESC90_RATE18M;   break;
19338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_24M:   ret = DESC90_RATE24M;   break;
19348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_36M:   ret = DESC90_RATE36M;   break;
19358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_48M:   ret = DESC90_RATE48M;   break;
19368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_54M:   ret = DESC90_RATE54M;   break;
19378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// HT rate since here
19398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS0:  ret = DESC90_RATEMCS0;  break;
19408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS1:  ret = DESC90_RATEMCS1;  break;
19418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS2:  ret = DESC90_RATEMCS2;  break;
19428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS3:  ret = DESC90_RATEMCS3;  break;
19438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS4:  ret = DESC90_RATEMCS4;  break;
19448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS5:  ret = DESC90_RATEMCS5;  break;
19458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS6:  ret = DESC90_RATEMCS6;  break;
19468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS7:  ret = DESC90_RATEMCS7;  break;
19478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS8:  ret = DESC90_RATEMCS8;  break;
19488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS9:  ret = DESC90_RATEMCS9;  break;
19498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS10: ret = DESC90_RATEMCS10; break;
19508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS11: ret = DESC90_RATEMCS11; break;
19518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS12: ret = DESC90_RATEMCS12; break;
19528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS13: ret = DESC90_RATEMCS13; break;
19538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS14: ret = DESC90_RATEMCS14; break;
19548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS15: ret = DESC90_RATEMCS15; break;
19558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case (0x80|0x20): ret = DESC90_RATEMCS32; break;
19568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:       break;
19588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
19598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret;
19608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
19618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
19648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
19658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8   tmp_Short;
19668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
19688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(TxHT==1 && TxRate != DESC90_RATEMCS15)
19708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tmp_Short = 0;
19718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return tmp_Short;
19738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
19748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void tx_zero_isr(struct urb *tx_urb)
19768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
19778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
19788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
19798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
19808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
19818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * The tx procedure is just as following,
19828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * skb->cb will contain all the following information,
19838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * priority, morefrag, rate, &dev.
19848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * */
19858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangshort rtl8192_tx(struct net_device *dev, struct sk_buff* skb)
19868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
19878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
19888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
19898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc_819x_usb *tx_desc = (tx_desc_819x_usb *)skb->data;
19908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo_819x_usb *tx_fwinfo = (tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN);
19918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = priv->udev;
19928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int pend;
19938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int status;
19948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct urb *tx_urb = NULL, *tx_urb_zero = NULL;
19958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//int urb_len;
19968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	unsigned int idx_pipe;
19978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_DEBUG_DATA(COMP_SEND, tcb_desc, sizeof(cb_desc));
19988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	printk("=============> %s\n", __FUNCTION__);
19998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pend = atomic_read(&priv->tx_pending[tcb_desc->queue_index]);
20008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* we are locked here so the two atomic_read and inc are executed
20018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 * without interleaves
20028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 * !!! For debug purpose
20038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 */
20048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if( pend > MAX_TX_URB){
20058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("To discard skb packet!\n");
20068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb_any(skb);
20078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -1;
20088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
20118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!tx_urb){
20128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb_any(skb);
20138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -ENOMEM;
20148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Fill Tx firmware info */
20178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(tx_fwinfo,0,sizeof(tx_fwinfo_819x_usb));
20188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* DWORD 0 */
20198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->TxHT = (tcb_desc->data_rate&0x80)?1:0;
20208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->TxRate = MRateToHwRate8190Pci(tcb_desc->data_rate);
20218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
20228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->Short = QueryIsShort(tx_fwinfo->TxHT, tx_fwinfo->TxRate, tcb_desc);
20238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(tcb_desc->bAMPDUEnable) {//AMPDU enabled
20248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->AllowAggregation = 1;
20258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* DWORD 1 */
20268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RxMF = tcb_desc->ampdu_factor;
20278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RxAMD = tcb_desc->ampdu_density&0x07;//ampdudensity
20288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
20298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->AllowAggregation = 0;
20308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* DWORD 1 */
20318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RxMF = 0;
20328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->RxAMD = 0;
20338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Protection mode related */
20368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsEnable = (tcb_desc->bRTSEnable)?1:0;
20378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->CtsEnable = (tcb_desc->bCTSEnable)?1:0;
20388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsSTBC = (tcb_desc->bRTSSTBC)?1:0;
20398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsHT = (tcb_desc->rts_rate&0x80)?1:0;
20408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsRate =  MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
20418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsSubcarrier = (tx_fwinfo->RtsHT==0)?(tcb_desc->RTSSC):0;
20428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsBandwidth = (tx_fwinfo->RtsHT==1)?((tcb_desc->bRTSBW)?1:0):0;
20438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_fwinfo->RtsShort = (tx_fwinfo->RtsHT==0)?(tcb_desc->bRTSUseShortPreamble?1:0):\
20448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				(tcb_desc->bRTSUseShortGI?1:0);
20458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Set Bandwidth and sub-channel settings. */
20478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
20488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
20498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(tcb_desc->bPacketBW) {
20508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->TxBandwidth = 1;
20518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->TxSubCarrier = 0;    //By SD3's Jerry suggestion, use duplicated mode
20528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		} else {
20538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->TxBandwidth = 0;
20548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_fwinfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
20558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
20568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
20578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->TxBandwidth = 0;
20588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->TxSubCarrier = 0;
20598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
20628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (tcb_desc->drv_agg_enable)
20638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
20648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_fwinfo->Tx_INFO_RSVD = (tcb_desc->DrvAggrNum & 0x1f) << 1;
20658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
20678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Fill Tx descriptor */
20688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(tx_desc, 0, sizeof(tx_desc_819x_usb));
20698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* DWORD 0 */
2070e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tx_desc->LINIP = 0;
2071e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tx_desc->CmdInit = 1;
2072e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tx_desc->Offset =  sizeof(tx_fwinfo_819x_usb) + 8;
20738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
20758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (tcb_desc->drv_agg_enable) {
20768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_desc->PktSize = tcb_desc->pkt_size;
20778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else
20788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
20798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
20808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_desc->PktSize = (skb->len - TX_PACKET_SHIFT_BYTES) & 0xffff;
20818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
20838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/*DWORD 1*/
20848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->SecCAMID= 0;
20858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->RATid = tcb_desc->RATRIndex;
20868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
20878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//MPDUOverhead = 0;
20888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_desc->NoEnc = 1;
20898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
20908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->SecType = 0x0;
20918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (tcb_desc->bHwSec)
20928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
20938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				switch (priv->ieee80211->pairwise_key_type)
20948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
20958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					case KEY_TYPE_WEP40:
20968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					case KEY_TYPE_WEP104:
20978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->SecType = 0x1;
20988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->NoEnc = 0;
20998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 break;
21008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					case KEY_TYPE_TKIP:
21018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->SecType = 0x2;
21028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->NoEnc = 0;
21038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 break;
21048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					case KEY_TYPE_CCMP:
21058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->SecType = 0x3;
21068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->NoEnc = 0;
21078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 break;
21088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					case KEY_TYPE_NA:
21098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->SecType = 0x0;
21108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 tx_desc->NoEnc = 1;
21118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						 break;
21128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
21138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
21148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
21168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->TxFWInfoSize =  sizeof(tx_fwinfo_819x_usb);
21178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->DISFB = tcb_desc->bTxDisableRateFallBack;
21198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tx_desc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
21208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2121e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	/* Fill fields that are required to be initialized in all of the descriptors */
2122e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//DWORD 0
2123e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tx_desc->FirstSeg = 1;
2124e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tx_desc->LastSeg = 1;
2125e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	tx_desc->OWN = 1;
21268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
21288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (tcb_desc->drv_agg_enable) {
21298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_desc->TxBufferSize = tcb_desc->pkt_size + sizeof(tx_fwinfo_819x_usb);
21308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else
21318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
21328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
21338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//DWORD 2
21348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tx_desc->TxBufferSize = (u32)(skb->len - USB_HWDESC_HEADER_LEN);
21358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
21368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Get index to out pipe from specified QueueID */
21378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifndef USE_ONE_PIPE
21388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	idx_pipe = txqueue2outpipe(priv,tcb_desc->queue_index);
21398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
21408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	idx_pipe = 0x5;
21418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
21428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//RT_DEBUG_DATA(COMP_SEND,tx_fwinfo,sizeof(tx_fwinfo_819x_usb));
21448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//RT_DEBUG_DATA(COMP_SEND,tx_desc,sizeof(tx_desc_819x_usb));
21458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* To submit bulk urb */
21478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	usb_fill_bulk_urb(tx_urb,udev,
21488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			usb_sndbulkpipe(udev,idx_pipe), skb->data,
21498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			skb->len, rtl8192_tx_isr, skb);
21508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	status = usb_submit_urb(tx_urb, GFP_ATOMIC);
21528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!status){
21538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//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
21548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		bool bSend0Byte = false;
21558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 zero = 0;
21568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(udev->speed == USB_SPEED_HIGH)
21578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
21588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (skb->len > 0 && skb->len % 512 == 0)
21598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				bSend0Byte = true;
21608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
21618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
21628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
21638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (skb->len > 0 && skb->len % 64 == 0)
21648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				bSend0Byte = true;
21658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
21668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (bSend0Byte)
21678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
21688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tx_urb_zero = usb_alloc_urb(0,GFP_ATOMIC);
21698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(!tx_urb_zero){
21708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_ERR, "can't alloc urb for zero byte\n");
21718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				return -ENOMEM;
21728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
21738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			usb_fill_bulk_urb(tx_urb_zero,udev,
21748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					usb_sndbulkpipe(udev,idx_pipe), &zero,
21758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					0, tx_zero_isr, dev);
21768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			status = usb_submit_urb(tx_urb_zero, GFP_ATOMIC);
21778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (status){
21788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_ERR, "Error TX URB for zero byte %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]), status);
21798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return -1;
21808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
21818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
21828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev->trans_start = jiffies;
21838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		atomic_inc(&priv->tx_pending[tcb_desc->queue_index]);
21848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return 0;
21858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}else{
21868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", atomic_read(&priv->tx_pending[tcb_desc->queue_index]),
21878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				status);
21888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -1;
21898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
21908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
21918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
21928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangshort rtl8192_usb_initendpoints(struct net_device *dev)
21938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
21948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
21958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2196324148788bf3744d90fb6894ec5744eb0ca91b74Julia Lawall	priv->rx_urb = kmalloc(sizeof(struct urb *) * (MAX_RX_URB+1),
2197324148788bf3744d90fb6894ec5744eb0ca91b74Julia Lawall				GFP_KERNEL);
2198b834517572d19d34c9cd9adb878aec3138db9224David Chosrova	if (priv->rx_urb == NULL)
2199b834517572d19d34c9cd9adb878aec3138db9224David Chosrova		return -ENOMEM;
22008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifndef JACKSON_NEW_RX
22028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i=0;i<(MAX_RX_URB+1);i++){
22038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->rx_urb[i] = usb_alloc_urb(0,GFP_KERNEL);
22058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL);
22078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE;
22098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
22108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
22118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef THOMAS_BEACON
22138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2214f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	long align = 0;
2215f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	void *oldaddr, *newaddr;
2216f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab
22178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->rx_urb[16] = usb_alloc_urb(0, GFP_KERNEL);
22188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->oldaddr = kmalloc(16, GFP_KERNEL);
2219f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	oldaddr = priv->oldaddr;
2220f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	align = ((long)oldaddr) & 3;
2221f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	if (align) {
22228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		newaddr = oldaddr + 4 - align;
2223f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab		priv->rx_urb[16]->transfer_buffer_length = 16 - 4 + align;
2224f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	} else {
22258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		newaddr = oldaddr;
22268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->rx_urb[16]->transfer_buffer_length = 16;
22278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
2228f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	priv->rx_urb[16]->transfer_buffer = newaddr;
22298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
22308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
22318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2232e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	memset(priv->rx_urb, 0, sizeof(struct urb*) * MAX_RX_URB);
22337a6cb0d5497418599d2125b670926b75e673861cJulia Lawall	priv->pp_rxskb = kcalloc(MAX_RX_URB, sizeof(struct sk_buff *),
2234324148788bf3744d90fb6894ec5744eb0ca91b74Julia Lawall				 GFP_KERNEL);
2235e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (priv->pp_rxskb == NULL)
2236e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		goto destroy;
22378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2238e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	goto _middle;
22398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangdestroy:
2242e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	kfree(priv->pp_rxskb);
2243e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	kfree(priv->rx_urb);
22448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2245e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	priv->pp_rxskb = NULL;
22468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->rx_urb = NULL;
22478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2248e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	DMESGE("Endpoint Alloc Failure");
2249e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	return -ENOMEM;
22508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang_middle:
22538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("End of initendpoints\n");
22558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
22568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
22588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef THOMAS_BEACON
22598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_usb_deleteendpoints(struct net_device *dev)
22608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
22618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
22628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
22638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->rx_urb){
22658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=0;i<(MAX_RX_URB+1);i++){
22668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			usb_kill_urb(priv->rx_urb[i]);
22678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			usb_free_urb(priv->rx_urb[i]);
22688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
22698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		kfree(priv->rx_urb);
22708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->rx_urb = NULL;
22718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
2272e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	kfree(priv->oldaddr);
2273e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	priv->oldaddr = NULL;
2274e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (priv->pp_rxskb) {
2275e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		kfree(priv->pp_rxskb);
2276e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		priv->pp_rxskb = 0;
22778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
22788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
22798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
22808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_usb_deleteendpoints(struct net_device *dev)
22818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
22828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
22838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
22848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifndef JACKSON_NEW_RX
22868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->rx_urb){
22888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=0;i<(MAX_RX_URB+1);i++){
22898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			usb_kill_urb(priv->rx_urb[i]);
22908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			kfree(priv->rx_urb[i]->transfer_buffer);
22918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			usb_free_urb(priv->rx_urb[i]);
22928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
22938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		kfree(priv->rx_urb);
22948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->rx_urb = NULL;
22958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
22968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
22978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
2298e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	kfree(priv->rx_urb);
2299e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	priv->rx_urb = NULL;
2300e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	kfree(priv->oldaddr);
2301e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	priv->oldaddr = NULL;
2302e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (priv->pp_rxskb) {
2303e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		kfree(priv->pp_rxskb);
2304e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		priv->pp_rxskb = 0;
23058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2306e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
23078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
23098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
23108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
23118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangextern void rtl8192_update_ratr_table(struct net_device* dev);
23138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_link_change(struct net_device *dev)
23148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
23158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	int i;
23168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
23188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
23198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//write_nic_word(dev, BCN_INTR_ITV, net->beacon_interval);
23208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (ieee->state == IEEE80211_LINKED)
23218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
23228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_net_update(dev);
23238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_update_ratr_table(dev);
23248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//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
23258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
23268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		EnableHWSecurityConfig8192(dev);
23278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
23288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/*update timing params*/
23298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_TRACE(COMP_CH, "========>%s(), chan:%d\n", __FUNCTION__, priv->chan);
23308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_set_chan(dev, priv->chan);
23318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
23328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        {
23338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                u32 reg = 0;
23348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                reg = read_nic_dword(dev, RCR);
23358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                if (priv->ieee80211->state == IEEE80211_LINKED)
23368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                        priv->ReceiveConfig = reg |= RCR_CBSSID;
23378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                else
23388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                        priv->ReceiveConfig = reg &= ~RCR_CBSSID;
23398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                write_nic_dword(dev, RCR, reg);
23408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        }
23418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_set_rxconf(dev);
23438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
23448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic struct ieee80211_qos_parameters def_qos_parameters = {
23468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        {3,3,3,3},/* cw_min */
23478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        {7,7,7,7},/* cw_max */
23488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        {2,2,2,2},/* aifs */
23498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        {0,0,0,0},/* flags */
23508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        {0,0,0,0} /* tx_op_limit */
23518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang};
23528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_update_beacon(struct work_struct * work)
23558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
23568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
23578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        struct net_device *dev = priv->ieee80211->dev;
23588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang 	struct ieee80211_device* ieee = priv->ieee80211;
23598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_network* net = &ieee->current_network;
23608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (ieee->pHTInfo->bCurrentHTSupport)
23628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		HTUpdateSelfAndPeerSetting(ieee, net);
23638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
23648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_update_cap(dev, net->capability);
23658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
23668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
23678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* background support to run QoS activate functionality
23688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
23698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
23708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_qos_activate(struct work_struct * work)
23718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2372e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
2373e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct net_device *dev = priv->ieee80211->dev;
2374e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2375e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u8 mode = priv->ieee80211->current_network.mode;
2376e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//u32 size = sizeof(struct ieee80211_qos_parameters);
23778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8  u1bAIFS;
23788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 u4bAcParam;
2379e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	int i;
23808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2381e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (priv == NULL)
2382e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return;
23838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang       mutex_lock(&priv->mutex);
2385e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if(priv->ieee80211->state != IEEE80211_LINKED)
23868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		goto success;
23878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
23888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* It better set slot time at first */
23898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* For we just support b/g mode at present, let the slot time at 9/20 selection */
23908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* update the ac parameter to related registers */
23918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 0; i <  QOS_QUEUE_NUM; i++) {
23928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//Mode G/A: slotTimeTimer = 9; Mode B: 20
23938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
23948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
23958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				(((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
23968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				(((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
23978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
23988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
23998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
24008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4332);
24018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
24028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangsuccess:
24048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang       mutex_unlock(&priv->mutex);
24058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
24068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
24088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		int active_network,
24098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		struct ieee80211_network *network)
24108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
24118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int ret = 0;
24128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 size = sizeof(struct ieee80211_qos_parameters);
24138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->state !=IEEE80211_LINKED)
2415e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
24168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2417e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2418e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
24198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (network->flags & NETWORK_HAS_QOS_MASK) {
24218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (active_network &&
24228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				(network->flags & NETWORK_HAS_QOS_PARAMETERS))
24238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			network->qos_data.active = network->qos_data.supported;
24248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if ((network->qos_data.active == 1) && (active_network == 1) &&
24268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				(network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
24278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				(network->qos_data.old_param_count !=
24288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 network->qos_data.param_count)) {
24298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			network->qos_data.old_param_count =
24308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				network->qos_data.param_count;
24318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			queue_work(priv->priv_wq, &priv->qos_activate);
24328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE (COMP_QOS, "QoS parameters change call "
24338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					"qos_activate\n");
24348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
24358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
24368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
24378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		       &def_qos_parameters, size);
24388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if ((network->qos_data.active == 1) && (active_network == 1)) {
24408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			queue_work(priv->priv_wq, &priv->qos_activate);
24418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
24428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
24438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		network->qos_data.active = 0;
24448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		network->qos_data.supported = 0;
24458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
24468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
24488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
24498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* handle manage frame frame beacon and probe response */
24518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int rtl8192_handle_beacon(struct net_device * dev,
2452e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			      struct ieee80211_beacon * beacon,
2453e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			      struct ieee80211_network * network)
24548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
24558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
24568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_qos_handle_probe_response(priv,1,network);
24588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
24598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
24608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
24628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
24648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* handling the beaconing responses. if we get different QoS setting
24658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* off the network from the associated setting, adjust the QoS
24668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* setting
24678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
24688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int rtl8192_qos_association_resp(struct r8192_priv *priv,
2469e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				    struct ieee80211_network *network)
24708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2471e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	int ret = 0;
2472e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	unsigned long flags;
2473e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u32 size = sizeof(struct ieee80211_qos_parameters);
2474e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	int set_qos_param = 0;
24758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2476e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if ((priv == NULL) || (network == NULL))
2477e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
24788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
24798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->state !=IEEE80211_LINKED)
2480e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
24818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2482e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
2483e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
24848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2485e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	spin_lock_irqsave(&priv->ieee80211->lock, flags);
24868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(network->flags & NETWORK_HAS_QOS_PARAMETERS) {
24878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
24888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 &network->qos_data.parameters,\
24898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			sizeof(struct ieee80211_qos_parameters));
24908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->current_network.qos_data.active = 1;
24918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 {
2492e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			set_qos_param = 1;
24938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* update qos parameter for current network */
24948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->ieee80211->current_network.qos_data.old_param_count = \
24958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				 priv->ieee80211->current_network.qos_data.param_count;
24968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->ieee80211->current_network.qos_data.param_count = \
2497e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				 network->qos_data.param_count;
24988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2499e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	} else {
25008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(&priv->ieee80211->current_network.qos_data.parameters,\
25018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		       &def_qos_parameters, size);
25028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->current_network.qos_data.active = 0;
25038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->current_network.qos_data.supported = 0;
2504e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		set_qos_param = 1;
2505e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
25068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2507e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
25088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n",__FUNCTION__,network->flags ,priv->ieee80211->current_network.qos_data.active);
25108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (set_qos_param == 1)
25118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		queue_work(priv->priv_wq, &priv->qos_activate);
25128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2514e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	return ret;
25158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
25168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int rtl8192_handle_assoc_response(struct net_device *dev,
2519e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				     struct ieee80211_assoc_response_frame *resp,
2520e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				     struct ieee80211_network *network)
25218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2522e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct r8192_priv *priv = ieee80211_priv(dev);
2523e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	rtl8192_qos_association_resp(priv, network);
2524e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	return 0;
25258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
25268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_update_ratr_table(struct net_device* dev)
25298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	POCTET_STRING	posLegacyRate,
25308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	u8*			pMcsRate)
25318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	PRT_WLAN_STA	pEntry)
25328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
25338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv* priv = ieee80211_priv(dev);
25348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
25358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8* pMcsRate = ieee->dot11HTOperationalRateSet;
25368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//struct ieee80211_network *net = &ieee->current_network;
25378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 ratr_value = 0;
25388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 rate_index = 0;
25398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_config_rate(dev, (u16*)(&ratr_value));
25408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ratr_value |= (*(u16*)(pMcsRate)) << 12;
25418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	switch (net->mode)
25428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch (ieee->mode)
25438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
25448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case IEEE_A:
25458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ratr_value &= 0x00000FF0;
25468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
25478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case IEEE_B:
25488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ratr_value &= 0x0000000F;
25498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
25508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case IEEE_G:
25518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ratr_value &= 0x00000FF7;
25528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
25538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case IEEE_N_24G:
25548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case IEEE_N_5G:
25558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
25568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ratr_value &= 0x0007F007;
25578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else{
25588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if (priv->rf_type == RF_1T2R)
25598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					ratr_value &= 0x000FF007;
25608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else
25618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					ratr_value &= 0x0F81F007;
25628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
25638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
25648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:
25658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
25668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
25678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ratr_value &= 0x0FFFFFFF;
25688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
25698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ratr_value |= 0x80000000;
25708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
25718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ratr_value |= 0x80000000;
25728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
25738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
25748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, UFWP, 1);
25758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
25768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
25788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
25798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangbool GetNmodeSupportBySecCfg8192(struct net_device*dev)
25808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
25818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv* priv = ieee80211_priv(dev);
25828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
25838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_network * network = &ieee->current_network;
2584e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	int wpa_ie_len= ieee->wpa_ie_len;
2585e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct ieee80211_crypt_data* crypt;
2586e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	int encrypt;
25878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2588e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	crypt = ieee->crypt[ieee->tx_keyidx];
25898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//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
2590e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	encrypt = (network->capability & WLAN_CAPABILITY_PRIVACY) || (ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name,"WEP")));
25918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
25928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* simply judge  */
25938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(encrypt && (wpa_ie_len == 0)) {
25948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* wep encryption, no N mode setting */
25958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return false;
25968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	} else if((wpa_ie_len != 0)&&(memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) {
25978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else if((wpa_ie_len != 0)) {
25988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* parse pairwise key type */
25998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//if((pairwisekey = WEP40)||(pairwisekey = WEP104)||(pairwisekey = TKIP))
26008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		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))))
26018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return true;
26028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
26038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return false;
26048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
26058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return true;
26068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
26078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return true;
26098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
26108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangbool GetHalfNmodeSupportByAPs819xUsb(struct net_device* dev)
26128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
26138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool			Reval;
26148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv* priv = ieee80211_priv(dev);
26158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
26168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(ieee->bHalfWirelessN24GMode == true)
26188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		Reval = true;
26198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
26208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		Reval =  false;
26218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return Reval;
26238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
26248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_refresh_supportrate(struct r8192_priv* priv)
26268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
26278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
26288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//we donot consider set support rate for ABG mode, only HT MCS rate is set here.
26298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
26308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
26318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
26328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//RT_DEBUG_DATA(COMP_INIT, ieee->RegHTSuppRateSet, 16);
26338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//RT_DEBUG_DATA(COMP_INIT, ieee->Regdot11HTOperationalRateSet, 16);
26348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
26358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
26368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
26378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
26388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
26398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
26418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
26428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
26438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 ret = 0;
26448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(priv->rf_chip)
26458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
26468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF_8225:
26478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF_8256:
26488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF_PSEUDO_11N:
26498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
26508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
26518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF_8258:
26528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
26538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
26548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:
26558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ret = WIRELESS_MODE_B;
26568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
26578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
26588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret;
26598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
26608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
26618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
26628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
26638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
26648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
26668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
26678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(bSupportMode & WIRELESS_MODE_N_24G)
26688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
26698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			wireless_mode = WIRELESS_MODE_N_24G;
26708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
26718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if(bSupportMode & WIRELESS_MODE_N_5G)
26728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
26738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			wireless_mode = WIRELESS_MODE_N_5G;
26748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
26758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if((bSupportMode & WIRELESS_MODE_A))
26768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
26778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			wireless_mode = WIRELESS_MODE_A;
26788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
26798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if((bSupportMode & WIRELESS_MODE_G))
26808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
26818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			wireless_mode = WIRELESS_MODE_G;
26828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
26838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if((bSupportMode & WIRELESS_MODE_B))
26848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
26858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			wireless_mode = WIRELESS_MODE_B;
26868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
26878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else{
26888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
26898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			wireless_mode = WIRELESS_MODE_B;
26908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
26918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
269239cfb97b0d89a99c8e50782b17e65114b89c2e59Adam Buchbinder#ifdef TO_DO_LIST //// TODO: this function doesn't work well at this time, we should wait for FPGA
26938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ActUpdateChannelAccessSetting( pAdapter, pHalData->CurrentWirelessMode, &pAdapter->MgntInfo.Info8185.ChannelAccessSetting );
26948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
26958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->mode = wireless_mode;
26968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
26978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if ((wireless_mode == WIRELESS_MODE_N_24G) ||  (wireless_mode == WIRELESS_MODE_N_5G))
26988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->pHTInfo->bEnableHT = 1;
26998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
27008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->pHTInfo->bEnableHT = 0;
27018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
27028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_refresh_supportrate(priv);
27038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
27048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
27058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//init priv variables here. only non_zero value should be initialized here.
27068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_init_priv_variable(struct net_device* dev)
27078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
27088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
27098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 i;
27108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->card_8192 = NIC_8192U;
27118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->chan = 1; //set to channel 1
27128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
27138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->iw_mode = IW_MODE_INFRA;
27148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->ieee_up=0;
27158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->retry_rts = DEFAULT_RETRY_RTS;
27168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->retry_data = DEFAULT_RETRY_DATA;
27178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
27188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->rate = 110; //11 mbps
27198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->short_slot = 1;
27208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
27218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->CckPwEnl = 6;
27228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//for silent reset
27238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->IrpPendingCount = 1;
27248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ResetProgress = RESET_TYPE_NORESET;
27258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->bForcedSilentReset = 0;
27268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->bDisableNormalResetCheck = false;
27278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->force_reset = false;
27288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
27298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->FwRWRF = 0; 	//we don't use FW read/write RF until stable firmware is available.
27308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
27318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->iw_mode = IW_MODE_INFRA;
27328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->softmac_features  = IEEE_SOFTMAC_SCAN |
27338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
27348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE |
27358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		IEEE_SOFTMAC_BEACONS;//added by amy 080604 //|  //IEEE_SOFTMAC_SINGLE_QUEUE;
27368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
27378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->active_scan = 1;
27388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
27398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->host_encrypt = 1;
27408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->host_decrypt = 1;
27418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->start_send_beacons = NULL;//rtl819xusb_beacon_tx;//-by amy 080604
27428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->stop_send_beacons = NULL;//rtl8192_beacon_stop;//-by amy 080604
27438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
27448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->set_chan = rtl8192_set_chan;
27458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->link_change = rtl8192_link_change;
27468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
27478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
27488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
27498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->init_wmmparam_flag = 0;
27508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
27518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
27528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->tx_headroom = TX_PACKET_SHIFT_BYTES;
27538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->qos_support = 1;
27548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
27558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//added by WB
27568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	priv->ieee80211->SwChnlByTimerHandler = rtl8192_phy_SwChnl;
27578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
27588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
27598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
27608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//added by david
27618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8192;
27628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xUsb;
27638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
27648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//added by amy
27658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->InitialGainHandler = InitialGain819xUsb;
27668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->card_type = USB;
27678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef TO_DO_LIST
27688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(Adapter->bInHctTest)
2769e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	{
27708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pHalData->ShortRetryLimit = 7;
27718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pHalData->LongRetryLimit = 7;
2772e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
27738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
27748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
27758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ShortRetryLimit = 0x30;
27768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->LongRetryLimit = 0x30;
27778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
27788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->EarlyRxThreshold = 7;
27798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->enable_gpio0 = 0;
27808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->TransmitConfig =
27818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	TCR_DurProcMode |	//for RTL8185B, duration setting by HW
27828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//?	TCR_DISReqQsize |
2783e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		(TCR_MXDMA_2048<<TCR_MXDMA_OFFSET)|  // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
27848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->ShortRetryLimit<<TCR_SRL_OFFSET)|	// Short retry limit
27858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->LongRetryLimit<<TCR_LRL_OFFSET) |	// Long retry limit
27868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(false ? TCR_SAT: 0);	// FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
27878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef TO_DO_LIST
27888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(Adapter->bInHctTest)
27898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pHalData->ReceiveConfig	=	pHalData->CSMethod |
27908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						RCR_AMF | RCR_ADF |	//RCR_AAP | 	//accept management/data
27918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						//guangan200710
27928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						RCR_ACF |	//accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
27938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						RCR_AB | RCR_AM | RCR_APM |		//accept BC/MC/UC
27948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						RCR_AICV | RCR_ACRC32 | 		//accept ICV/CRC error packet
27958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						((u32)7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
27968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						(pHalData->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold.
27978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						(pHalData->EarlyRxThreshold == 7 ? RCR_OnlyErlPkt:0);
27988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
27998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
28018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ReceiveConfig	=
28028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RCR_AMF | RCR_ADF |		//accept management/data
28038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RCR_ACF |			//accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
28048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RCR_AB | RCR_AM | RCR_APM |	//accept BC/MC/UC
28058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//RCR_AICV | RCR_ACRC32 | 	//accept ICV/CRC error packet
28068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		((u32)7<<RCR_MXDMA_OFFSET)| // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
28078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->EarlyRxThreshold<<RX_FIFO_THRESHOLD_SHIFT) | // Rx FIFO Threshold, 7: No Rx threshold.
28088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
28098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->AcmControl = 0;
2811324148788bf3744d90fb6894ec5744eb0ca91b74Julia Lawall	priv->pFirmware = kmalloc(sizeof(rt_firmware), GFP_KERNEL);
28128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->pFirmware)
28138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(priv->pFirmware, 0, sizeof(rt_firmware));
28148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* rx related queue */
2816e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	skb_queue_head_init(&priv->rx_queue);
28178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb_queue_head_init(&priv->skb_queue);
28188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Tx related queue */
28208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 0; i < MAX_QUEUE_SIZE; i++) {
28218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
28228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
28238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 0; i < MAX_QUEUE_SIZE; i++) {
28248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
28258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
28268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i = 0; i < MAX_QUEUE_SIZE; i++) {
28278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_queue_head_init(&priv->ieee80211->skb_drv_aggQ [i]);
28288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
28298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->rf_set_chan = rtl8192_phy_SwChnl;
28308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
28318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//init lock here
28338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_init_priv_lock(struct r8192_priv* priv)
28348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
28358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_lock_init(&priv->tx_lock);
28368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_lock_init(&priv->irq_lock);//added by thomas
28378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//spin_lock_init(&priv->rf_lock);
28388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	sema_init(&priv->wx_sem,1);
28398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	sema_init(&priv->rf_sem,1);
28408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	mutex_init(&priv->mutex);
28418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
28428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangextern  void    rtl819x_watchdog_wqcallback(struct work_struct *work);
28448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
28468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//init tasklet and wait_queue here. only 2.6 above kernel is considered
28478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define DRV_NAME "wlan0"
28488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_init_priv_task(struct net_device* dev)
28498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
28508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
28518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->priv_wq = create_workqueue(DRV_NAME);
28538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_WORK(&priv->reset_wq, rtl8192_restart);
28558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//INIT_DELAYED_WORK(&priv->watch_dog_wq, hal_dm_watchdog);
28578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
28588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_DELAYED_WORK(&priv->txpower_tracking_wq,  dm_txpower_trackingcallback);
28598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	INIT_DELAYED_WORK(&priv->gpio_change_rf_wq,  dm_gpio_change_rf_callback);
28608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_DELAYED_WORK(&priv->rfpath_check_wq,  dm_rf_pathcheck_workitemcallback);
28618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
28628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_DELAYED_WORK(&priv->initialgain_operate_wq, InitialGainOperateWorkItemCallBack);
28638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//INIT_WORK(&priv->SwChnlWorkItem,  rtl8192_SwChnl_WorkItem);
28648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//INIT_WORK(&priv->SetBWModeWorkItem,  rtl8192_SetBWModeWorkItem);
28658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
28668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tasklet_init(&priv->irq_rx_tasklet,
28688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	     (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
28698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	     (unsigned long)priv);
28708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
28718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
28728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_get_eeprom_size(struct net_device* dev)
28738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
28748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 curCR = 0;
28758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
28768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
28778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	curCR = read_nic_word_E(dev,EPROM_CMD);
28788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_EPROM, "read from Reg EPROM_CMD(%x):%x\n", EPROM_CMD, curCR);
28798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//whether need I consider BIT5?
28808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->epromtype = (curCR & Cmd9346CR_9356SEL) ? EPROM_93c56 : EPROM_93c46;
28818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_EPROM, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
28828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
28838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
288425985edcedea6396277003854657b5f3cb31a628Lucas De Marchi//used to swap endian. as ntohl & htonl are not necessary to swap endian, so use this instead.
28858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic inline u16 endian_swap(u16* data)
28868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
28878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 tmp = *data;
28888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*data = (tmp >> 8) | (tmp << 8);
28898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return *data;
28908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
28918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_read_eeprom_info(struct net_device* dev)
28928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
28938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 wEPROM_ID = 0;
28948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x02};
28958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 bLoad_From_EEPOM = false;
28968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
28978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 tmpValue = 0;
28988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_EPROM, "===========>%s()\n", __FUNCTION__);
28998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	wEPROM_ID = eprom_read(dev, 0); //first read EEPROM ID out;
29008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_EPROM, "EEPROM ID is 0x%x\n", wEPROM_ID);
29018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
29028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (wEPROM_ID != RTL8190_EEPROM_ID)
29038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
29048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "EEPROM ID is invalid(is 0x%x(should be 0x%x)\n", wEPROM_ID, RTL8190_EEPROM_ID);
29058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
29068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
29078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		bLoad_From_EEPOM = true;
29088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
29098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (bLoad_From_EEPOM)
29108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
29118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tmpValue = eprom_read(dev, (EEPROM_VID>>1));
29128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_vid = endian_swap(&tmpValue);
29138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_pid = eprom_read(dev, (EEPROM_PID>>1));
29148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		tmpValue = eprom_read(dev, (EEPROM_ChannelPlan>>1));
29158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_ChannelPlan =((tmpValue&0xff00)>>8);
29168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->btxpowerdata_readfromEEPORM = true;
29178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_CustomerID = eprom_read(dev, (EEPROM_Customer_ID>>1)) >>8;
29188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
29198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
29208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
29218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_vid = 0;
29228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_pid = 0;
29238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->card_8192_version = VERSION_819xU_B;
29248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_ChannelPlan = 0;
29258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->eeprom_CustomerID = 0;
29268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
29278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	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);
29288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//set channelplan from eeprom
29298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ChannelPlan = priv->eeprom_ChannelPlan;
29308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (bLoad_From_EEPOM)
29318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
29328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		int i;
29338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for (i=0; i<6; i+=2)
29348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
29358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u16 tmp = 0;
29368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tmp = eprom_read(dev, (u16)((EEPROM_NODE_ADDRESS_BYTE_0 + i)>>1));
29378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			*(u16*)(&dev->dev_addr[i]) = tmp;
29388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
29398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
29408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
29418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
29428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
29438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//should I set IDR0 here?
29448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
29450ee9f67c4028500a4348e8bc87ee7ec1139b8259Joe Perches	RT_TRACE(COMP_EPROM, "MAC addr:%pM\n", dev->dev_addr);
29468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->rf_type = RTL819X_DEFAULT_RF_TYPE; //default 1T2R
29478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->rf_chip = RF_8256;
29488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
29498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->card_8192_version == (u8)VERSION_819xU_A)
29508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
29518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//read Tx power gain offset of legacy OFDM to HT rate
29528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (bLoad_From_EEPOM)
29538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMTxPowerDiff = (eprom_read(dev, (EEPROM_TxPowerDiff>>1))&0xff00) >> 8;
29548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
29558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMTxPowerDiff = EEPROM_Default_TxPower;
29568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "TxPowerDiff:%d\n", priv->EEPROMTxPowerDiff);
29578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//read ThermalMeter from EEPROM
29588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (bLoad_From_EEPOM)
29598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMThermalMeter = (u8)(eprom_read(dev, (EEPROM_ThermalMeter>>1))&0x00ff);
29608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
29618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
29628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "ThermalMeter:%d\n", priv->EEPROMThermalMeter);
29638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//vivi, for tx power track
29648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
29658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//read antenna tx power offset of B/C/D to A from EEPROM
29668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (bLoad_From_EEPOM)
29678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMPwDiff = (eprom_read(dev, (EEPROM_PwDiff>>1))&0x0f00)>>8;
29688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
29698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMPwDiff = EEPROM_Default_PwDiff;
29708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "TxPwDiff:%d\n", priv->EEPROMPwDiff);
29718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Read CrystalCap from EEPROM
29728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (bLoad_From_EEPOM)
29738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMCrystalCap = (eprom_read(dev, (EEPROM_CrystalCap>>1))&0x0f);
29748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
29758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMCrystalCap = EEPROM_Default_CrystalCap;
29768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "CrystalCap = %d\n", priv->EEPROMCrystalCap);
29778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//get per-channel Tx power level
29788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (bLoad_From_EEPOM)
29798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROM_Def_Ver = (eprom_read(dev, (EEPROM_TxPwIndex_Ver>>1))&0xff00)>>8;
29808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
29818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROM_Def_Ver = 1;
29828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "EEPROM_DEF_VER:%d\n", priv->EEPROM_Def_Ver);
29838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (priv->EEPROM_Def_Ver == 0) //old eeprom definition
29848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
29858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			int i;
29868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (bLoad_From_EEPOM)
29878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->EEPROMTxPowerLevelCCK = (eprom_read(dev, (EEPROM_TxPwIndex_CCK>>1))&0xff) >> 8;
29888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
29898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->EEPROMTxPowerLevelCCK = 0x10;
29908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_EPROM, "CCK Tx Power Levl: 0x%02x\n", priv->EEPROMTxPowerLevelCCK);
29918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for (i=0; i<3; i++)
29928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
29938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if (bLoad_From_EEPOM)
29948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
29958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G+i)>>1);
29968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (((EEPROM_TxPwIndex_OFDM_24G+i) % 2) == 0)
29978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						tmpValue = tmpValue & 0x00ff;
29988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
29998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						tmpValue = (tmpValue & 0xff00) >> 8;
30008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
30018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else
30028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					tmpValue = 0x10;
30038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->EEPROMTxPowerLevelOFDM24G[i] = (u8) tmpValue;
30048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_EPROM, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK);
30058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
30068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}//end if EEPROM_DEF_VER == 0
30078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if (priv->EEPROM_Def_Ver == 1)
30088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
30098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (bLoad_From_EEPOM)
30108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
30118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1>>1));
30128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = (tmpValue & 0xff00) >> 8;
30138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
30148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
30158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = 0x10;
30168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMTxPowerLevelCCK_V1[0] = (u8)tmpValue;
30178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (bLoad_From_EEPOM)
30198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_CCK_V1 + 2)>>1);
30208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
30218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = 0x1010;
30228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			*((u16*)(&priv->EEPROMTxPowerLevelCCK_V1[1])) = tmpValue;
30238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (bLoad_From_EEPOM)
30248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1>>1));
30258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
30268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = 0x1010;
30278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			*((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[0])) = tmpValue;
30288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (bLoad_From_EEPOM)
30298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = eprom_read(dev, (EEPROM_TxPwIndex_OFDM_24G_V1+2)>>1);
30308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
30318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpValue = 0x10;
30328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->EEPROMTxPowerLevelOFDM24G[2] = (u8)tmpValue;
30338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}//endif EEPROM_Def_Ver == 1
30348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//update HAL variables
30368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
30378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
30388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			int i;
30398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for (i=0; i<14; i++)
30408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
30418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if (i<=3)
30428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[0];
30438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else if (i>=4 && i<=9)
30448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[1];
30458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else
30468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[2];
30478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
30488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for (i=0; i<14; i++)
30508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
30518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if (priv->EEPROM_Def_Ver == 0)
30528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
30538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (i<=3)
30548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[0] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
30558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else if (i>=4 && i<=9)
30568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK;
30578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
30588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelOFDM24G[2] + (priv->EEPROMTxPowerLevelCCK - priv->EEPROMTxPowerLevelOFDM24G[1]);
30598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
30608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else if (priv->EEPROM_Def_Ver == 1)
30618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
30628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (i<=3)
30638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[0];
30648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else if (i>=4 && i<=9)
30658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[1];
30668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
30678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK_V1[2];
30688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
30698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
30708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}//end update HAL variables
30718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->TxPowerDiff = priv->EEPROMPwDiff;
30728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// Antenna B gain offset to antenna A, bit0~3
30738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->AntennaTxPwDiff[0] = (priv->EEPROMTxPowerDiff & 0xf);
30748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Antenna C gain offset to antenna A, bit4~7
30758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->AntennaTxPwDiff[1] = ((priv->EEPROMTxPowerDiff & 0xf0)>>4);
30768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// CrystalCap, bit12~15
30778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->CrystalCap = priv->EEPROMCrystalCap;
30788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
30798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// 92U does not enable TX power tracking.
30808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ThermalMeter[0] = priv->EEPROMThermalMeter;
30818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}//end if VersionID == VERSION_819xU_A
30828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//added by vivi, for dlink led, 20080416
30848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(priv->eeprom_CustomerID)
30858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
30868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case EEPROM_CID_RUNTOP:
30878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->CustomerID = RT_CID_819x_RUNTOP;
30888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
30898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case EEPROM_CID_DLINK:
30918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->CustomerID = RT_CID_DLINK;
30928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
30938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:
30958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->CustomerID = RT_CID_DEFAULT;
30968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
30978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
30988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
30998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(priv->CustomerID)
31018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
31028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RT_CID_819x_RUNTOP:
31038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->LedStrategy = SW_LED_MODE2;
31048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
31058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3106e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		case RT_CID_DLINK:
31078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->LedStrategy = SW_LED_MODE4;
31088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
31098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:
31118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->LedStrategy = SW_LED_MODE0;
31128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
31138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->rf_type == RF_1T2R)
31188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
31198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "\n1T2R config\n");
31208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
31228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
31238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_EPROM, "\n2T4R config\n");
31248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// 2008/01/16 MH We can only know RF type in the function. So we have to init
31278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// DIG RATR table again.
31288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	init_rate_adaptive(dev);
31298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//we need init DIG RATR table here again.
31308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_EPROM, "<===========%s()\n", __FUNCTION__);
31328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
31338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
31348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangshort rtl8192_get_channel_map(struct net_device * dev)
31368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
31378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
31388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ChannelPlan > COUNTRY_CODE_GLOBAL_DOMAIN){
31398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("rtl8180_init:Error channel plan! Set to default.\n");
31408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ChannelPlan= 0;
31418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
31438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl819x_set_channel_map(priv->ChannelPlan, priv);
31458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
31468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
31478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangshort rtl8192_init(struct net_device *dev)
31498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
31508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
31528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(&(priv->stats),0,sizeof(struct Stats));
31548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(priv->txqueue_to_outpipemap,0,9);
31558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef PIPE12
31568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
31578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		int i=0;
31588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 queuetopipe[]={3,2,1,0,4,8,7,6,5};
31598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
31608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*		for(i=0;i<9;i++)
31618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			printk("%d ",priv->txqueue_to_outpipemap[i]);
31628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("\n");*/
31638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
31658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
31668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 queuetopipe[]={3,2,1,0,4,4,0,4,4};
31678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		memcpy(priv->txqueue_to_outpipemap,queuetopipe,9);
31688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*		for(i=0;i<9;i++)
31698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			printk("%d ",priv->txqueue_to_outpipemap[i]);
31708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("\n");*/
31718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
31738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_init_priv_variable(dev);
31748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_init_priv_lock(priv);
31758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_init_priv_task(dev);
31768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_get_eeprom_size(dev);
31778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_read_eeprom_info(dev);
31788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_get_channel_map(dev);
31798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	init_hal_dm(dev);
31808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	init_timer(&priv->watch_dog_timer);
31818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->watch_dog_timer.data = (unsigned long)dev;
31828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->watch_dog_timer.function = watch_dog_timer_callback;
31838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(rtl8192_usb_initendpoints(dev)!=0){
31848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		DMESG("Endopoints initialization failed");
31858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -ENOMEM;
31868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
31878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rtl8192_adapter_start(dev);
31898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef DEBUG_EPROM
31908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	dump_eprom(dev);
31918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
31928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
31938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
31948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
31958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/******************************************************************************
31968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *function:  This function actually only set RRSR, RATR and BW_OPMODE registers
31978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *	     not to do all the hw config as its name says
31988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *   input:  net_device dev
31998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *  output:  none
32008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *  return:  none
32018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *  notice:  This part need to modified according to the rate set we filtered
32028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * ****************************************************************************/
32038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_hwconfig(struct net_device* dev)
32048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
32058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 regRATR = 0, regRRSR = 0;
32068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 regBwOpMode = 0, regTmp = 0;
32078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
32088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// Set RRSR, RATR, and BW_OPMODE registers
32108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
32118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(priv->ieee80211->mode)
32128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
32138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case WIRELESS_MODE_B:
32148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regBwOpMode = BW_OPMODE_20MHZ;
32158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRATR = RATE_ALL_CCK;
32168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRRSR = RATE_ALL_CCK;
32178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
32188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case WIRELESS_MODE_A:
32198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
32208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRATR = RATE_ALL_OFDM_AG;
32218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRRSR = RATE_ALL_OFDM_AG;
32228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
32238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case WIRELESS_MODE_G:
32248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regBwOpMode = BW_OPMODE_20MHZ;
32258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
32268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
32278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
32288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case WIRELESS_MODE_AUTO:
32298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef TO_DO_LIST
32308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (Adapter->bInHctTest)
32318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
32328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		    regBwOpMode = BW_OPMODE_20MHZ;
32338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		    regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
32348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		    regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
32358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
32368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
32378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
32388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
32398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		    regBwOpMode = BW_OPMODE_20MHZ;
32408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		    regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
32418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		    regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
32428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
32438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
32448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case WIRELESS_MODE_N_24G:
32458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// It support CCK rate by default.
32468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// CCK rate will be filtered out only when associated AP does not support it.
32478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regBwOpMode = BW_OPMODE_20MHZ;
32488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
32498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
32508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
32518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	case WIRELESS_MODE_N_5G:
32528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regBwOpMode = BW_OPMODE_5G;
32538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
32548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		regRRSR = RATE_ALL_OFDM_AG;
32558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
32568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
32578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, BW_OPMODE, regBwOpMode);
32598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
32608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u32 ratr_value = 0;
32618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ratr_value = regRATR;
32628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (priv->rf_type == RF_1T2R)
32638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
32648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ratr_value &= ~(RATE_ALL_OFDM_2SS);
32658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
32668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_dword(dev, RATR0, ratr_value);
32678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_byte(dev, UFWP, 1);
32688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
32698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	regTmp = read_nic_byte(dev, 0x313);
32708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
32718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RRSR, regRRSR);
32728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
32748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Set Retry Limit here
32758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
32768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, RETRY_LIMIT,
32778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
32788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
32798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Set Contention Window here
32808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Set Tx AGC
32828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Set Tx Antenna including Feedback control
32848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Set Auto Rate fallback control
32868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
32898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
32918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//InitializeAdapter and PhyCfg
32928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangbool rtl8192_adapter_start(struct net_device *dev)
32938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
32948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
32958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 dwRegRead = 0;
32968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool init_status = true;
32978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "====>%s()\n", __FUNCTION__);
32988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->Rf_Mode = RF_OP_By_SW_3wire;
32998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//for ASIC power on sequence
33008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte_E(dev, 0x5f, 0x80);
33018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	mdelay(50);
33028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte_E(dev, 0x5f, 0xf0);
33038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte_E(dev, 0x5d, 0x00);
33048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte_E(dev, 0x5e, 0x80);
33058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, 0x17, 0x37);
33068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	mdelay(10);
33078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//#ifdef TO_DO_LIST
33088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
33098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//config CPUReset Register
33108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Firmware Reset or not?
33118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	dwRegRead = read_nic_dword(dev, CPU_GEN);
33128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
33138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dwRegRead |= CPU_GEN_SYSTEM_RESET; //do nothing here?
33148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if (priv->pFirmware->firmware_status == FW_STATUS_5_READY)
33158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dwRegRead |= CPU_GEN_FIRMWARE_RESET;
33168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
33178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __FUNCTION__,   priv->pFirmware->firmware_status);
33188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, CPU_GEN, dwRegRead);
33208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//mdelay(30);
33218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//config BB.
33228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_BBConfig(dev);
33238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Loopback mode or not
33258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->LoopbackMode = RTL819xU_NO_LOOPBACK;
33268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	priv->LoopbackMode = RTL819xU_MAC_LOOPBACK;
33278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	dwRegRead = read_nic_dword(dev, CPU_GEN);
33298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->LoopbackMode == RTL819xU_NO_LOOPBACK)
33308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dwRegRead = ((dwRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
33318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if (priv->LoopbackMode == RTL819xU_MAC_LOOPBACK)
33328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dwRegRead |= CPU_CCK_LOOPBACK;
33338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
33348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Serious error in %s(): wrong loopback mode setting(%d)\n", __FUNCTION__,  priv->LoopbackMode);
33358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, CPU_GEN, dwRegRead);
33378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//after reset cpu, we need wait for a seconds to write in register.
33398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	udelay(500);
33408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//xiong add for new bitfile:usb suspend reset pin set to 1. //do we need?
33428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte_E(dev, 0x5f, (read_nic_byte_E(dev, 0x5f)|0x20));
33438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Set Hardware
33458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_hwconfig(dev);
33468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//turn on Tx/Rx
33488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, CMDR, CR_RE|CR_TE);
33498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//set IDR0 here
33518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
33528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
33538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//set RCR
33558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RCR, priv->ReceiveConfig);
33568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Initialize Number of Reserved Pages in Firmware Queue
33588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RQPN1,  NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
33598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
33608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
33618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
33628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT |\
33638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NUM_OF_PAGE_IN_FW_QUEUE_CMD << RSVD_FW_QUEUE_PAGE_CMD_SHIFT);
33648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
33658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT
33668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//						| NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT
33678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						);
33688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_dword(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
33698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Set AckTimeout
33718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
33728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, ACK_TIMEOUT, 0x30);
33738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_TRACE(COMP_INIT, "%s():priv->ResetProgress is %d\n", __FUNCTION__,priv->ResetProgress);
33758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ResetProgress == RESET_TYPE_NORESET)
33768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_SetWirelessMode(dev, priv->ieee80211->mode);
33778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ResetProgress == RESET_TYPE_NORESET){
33788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	CamResetAllEntry(dev);
33798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
33808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 SECR_value = 0x0;
33818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_TxEncEnable;
33828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_RxDecEnable;
33838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_NoSKMC;
33848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_byte(dev, SECR, SECR_value);
33858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
33868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
33878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Beacon related
33898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, ATIMWND, 2);
33908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_word(dev, BCN_INTERVAL, 100);
33918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
33928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
33938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#define DEFAULT_EDCA 0x005e4332
33948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		int i;
33958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for (i=0; i<QOS_QUEUE_NUM; i++)
33968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_dword(dev, WDCAPARA_ADD[i], DEFAULT_EDCA);
33978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
33988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
33998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//3 For usb rx firmware aggregation control
34008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ResetProgress == RESET_TYPE_NORESET)
34018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
34028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u32 ulValue;
34038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		PRT_HIGH_THROUGHPUT	pHTInfo = priv->ieee80211->pHTInfo;
34048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
34058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
34068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*
34078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 * If usb rx firmware aggregation is enabled,
34088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 * when anyone of three threshold conditions above is reached,
34098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 * firmware will send aggregated packet to driver.
34108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		 */
34118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_dword(dev, 0x1a8, ulValue);
34128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->bCurrentRxAggrEnable = true;
34138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
34148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
34158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_phy_configmac(dev);
34178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->card_8192_version == (u8) VERSION_819xU_A)
34198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
34208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_phy_getTxPower(dev);
34218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_phy_setTxPower(dev, priv->chan);
34228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
34238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Firmware download
34258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	init_status = init_firmware(dev);
34268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!init_status)
34278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
34288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR,"ERR!!! %s(): Firmware download is failed\n", __FUNCTION__);
34298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return init_status;
34308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
34318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "%s():after firmware download\n", __FUNCTION__);
34328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
34338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef TO_DO_LIST
34348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangif(Adapter->ResetProgress == RESET_TYPE_NORESET)
34358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
34368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pMgntInfo->RegRfOff == TRUE)
34378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{ // User disable RF via registry.
34388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RegRfOff ----------\n"));
34398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);
34408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// Those action will be discard in MgntActSet_RF_State because off the same state
34418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
34428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
34438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
34448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS)
34458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{ // H/W or S/W RF OFF before sleep.
34468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): Turn off RF for RfOffReason(%d) ----------\n", pMgntInfo->RfOffReason));
34478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
34488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
34498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
34508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
34518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pHalData->eRFPowerState = eRfOn;
34528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pMgntInfo->RfOffReason = 0;
34538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter819xUsb(): RF is on ----------\n"));
34548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
34558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
34568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
34578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
34588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pHalData->eRFPowerState == eRfOff)
34598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
34608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
34618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// Those action will be discard in MgntActSet_RF_State because off the same state
34628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
34638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
34648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
34658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
34668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
34678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//config RF.
34688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ResetProgress == RESET_TYPE_NORESET){
34698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_phy_RFConfig(dev);
34708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "%s():after phy RF config\n", __FUNCTION__);
34718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
34728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->FwRWRF)
34758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// We can force firmware to do RF-R/W
34768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->Rf_Mode = RF_OP_By_FW;
34778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
34788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->Rf_Mode = RF_OP_By_SW_3wire;
34798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_phy_updateInitGain(dev);
34828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/*--set CCK and OFDM Block "ON"--*/
34838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
34848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
34858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
34868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ResetProgress == RESET_TYPE_NORESET)
34878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
34888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//if D or C cut
34898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 tmpvalue = read_nic_byte(dev, 0x301);
34908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(tmpvalue ==0x03)
34918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
34928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->bDcut = TRUE;
34938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_POWER_TRACKING, "D-cut\n");
34948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
34958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
34968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
34978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->bDcut = FALSE;
34988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_POWER_TRACKING, "C-cut\n");
34998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
35008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dm_initialize_txpower_tracking(dev);
35018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->bDcut == TRUE)
35038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
35048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u32 i, TempCCk;
35058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u32 tmpRegA= rtl8192_QueryBBReg(dev,rOFDM0_XATxIQImbalance,bMaskDWord);
35068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//	u32 tmpRegC= rtl8192_QueryBBReg(dev,rOFDM0_XCTxIQImbalance,bMaskDWord);
35078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for(i = 0; i<TxBBGainTableLength; i++)
35088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
35098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(tmpRegA == priv->txbbgain_table[i].txbbgain_value)
35108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
35118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->rfa_txpowertrackingindex= (u8)i;
35128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->rfa_txpowertrackingindex_real= (u8)i;
35138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->rfa_txpowertracking_default= priv->rfa_txpowertrackingindex;
35148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
35158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
35168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
35178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
35198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for(i=0 ; i<CCKTxBBGainTableLength ; i++)
35218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
35228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0])
35248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
35258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->cck_present_attentuation_20Mdefault=(u8) i;
35268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
35278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
35288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
35298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->cck_present_attentuation_40Mdefault= 0;
35308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->cck_present_attentuation_difference= 0;
35318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->cck_present_attentuation = priv->cck_present_attentuation_20Mdefault;
35328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//		pMgntInfo->bTXPowerTracking = FALSE;//TEMPLY DISABLE
35348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
35358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
35368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	write_nic_byte(dev, 0x87, 0x0);
35378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return init_status;
35408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
35418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* this configures registers for beacon tx and enables it via
35438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
35448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * be used to stop beacon transmission
35458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang */
35468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/***************************************************************************
35478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    -------------------------------NET STUFF---------------------------
35488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang***************************************************************************/
35498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic struct net_device_stats *rtl8192_stats(struct net_device *dev)
35518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
35528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
35538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return &priv->ieee80211->stats;
35558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
35568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangbool
35588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangHalTxCheckStuck819xUsb(
35598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev
35608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
35618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
35628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
35638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 		RegTxCounter = read_nic_word(dev, 0x128);
35648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool		bStuck = FALSE;
35658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_RESET,"%s():RegTxCounter is %d,TxCounter is %d\n",__FUNCTION__,RegTxCounter,priv->TxCounter);
35668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->TxCounter==RegTxCounter)
35678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		bStuck = TRUE;
35688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->TxCounter = RegTxCounter;
35708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return bStuck;
35728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
35738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
35758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	<Assumption: RT_TX_SPINLOCK is acquired.>
35768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	First added: 2006.11.19 by emily
35778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
35788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangRESET_TYPE
35798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangTxCheckStuck(struct net_device *dev)
35808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
35818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
35828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8			QueueID;
35838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	PRT_TCB			pTcb;
35848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	u8			ResetThreshold;
35858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool			bCheckFwTxCnt = false;
35868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//unsigned long flags;
35878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
35898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Decide Stuch threshold according to current power save mode
35908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
35918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
35928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//     RT_TRACE(COMP_RESET, " ==> TxCheckStuck()\n");
35938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	     PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
35948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	     spin_lock_irqsave(&priv->ieee80211->lock,flags);
35958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	     for (QueueID = 0; QueueID<=BEACON_QUEUE;QueueID ++)
35968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	     {
35978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	     		if(QueueID == TXCMD_QUEUE)
35988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		         continue;
35998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
36008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			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))
36018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#else
36028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		     	if((skb_queue_len(&priv->ieee80211->skb_waitQ[QueueID]) == 0)  && (skb_queue_len(&priv->ieee80211->skb_aggQ[QueueID]) == 0))
36038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
36048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 	continue;
36058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	             bCheckFwTxCnt = true;
36078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	     }
36088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	     PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
36098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	spin_unlock_irqrestore(&priv->ieee80211->lock,flags);
36108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	RT_TRACE(COMP_RESET,"bCheckFwTxCnt is %d\n",bCheckFwTxCnt);
36118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(bCheckFwTxCnt)
36128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
36138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(HalTxCheckStuck819xUsb(dev))
36148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
36168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return RESET_TYPE_SILENT;
36178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
36198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return RESET_TYPE_NORESET;
36208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
36218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangbool
36238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangHalRxCheckStuck819xUsb(struct net_device *dev)
36248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
36258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 	RegRxCounter = read_nic_word(dev, 0x130);
36268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
36278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bStuck = FALSE;
36288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u8	rx_chk_cnt = 0;
36298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
36308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// If rssi is small, we should check rx for long time because of bad rx.
36318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// or maybe it will continuous silent reset every 2 seconds.
36328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rx_chk_cnt++;
36338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
36348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
36358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rx_chk_cnt = 0;	//high rssi, check rx stuck right now.
36368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
36378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
36388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
36398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
36408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
36418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(rx_chk_cnt < 2)
36428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return bStuck;
36448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
36468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_chk_cnt = 0;
36488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
36508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
36518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
36528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
36538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
36548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(rx_chk_cnt < 4)
36558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("RSSI < %d && RSSI >= %d, no check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
36578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return bStuck;
36588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
36608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_chk_cnt = 0;
36628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("RSSI < %d && RSSI >= %d, check this time \n", RateAdaptiveTH_Low, VeryLowRSSI);
36638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
36658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
36668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
36678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(rx_chk_cnt < 8)
36688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("RSSI <= %d, no check this time \n", VeryLowRSSI);
36708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return bStuck;
36718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
36738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
36748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_chk_cnt = 0;
36758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("RSSI <= %d, check this time \n", VeryLowRSSI);
36768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
36778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
36788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->RxCounter==RegRxCounter)
36808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		bStuck = TRUE;
36818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->RxCounter = RegRxCounter;
36838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return bStuck;
36858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
36868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangRESET_TYPE
36888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangRxCheckStuck(struct net_device *dev)
36898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
36908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
36918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//int                     i;
36928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool        bRxCheck = FALSE;
36938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//       RT_TRACE(COMP_RESET," ==> RxCheckStuck()\n");
36958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
36968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
36978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 if(priv->IrpPendingCount > 1)
3698e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		bRxCheck = TRUE;
36998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang       //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
37008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//       RT_TRACE(COMP_RESET,"bRxCheck is %d \n",bRxCheck);
37028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(bRxCheck)
37038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
37048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(HalRxCheckStuck819xUsb(dev))
37058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
37068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_RESET, "RxStuck Condition\n");
37078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return RESET_TYPE_SILENT;
37088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
37098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
37108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return RESET_TYPE_NORESET;
37118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
37128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/**
37158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	This function is called by Checkforhang to check whether we should ask OS to reset driver
37168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*
37178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	\param pAdapter	The adapter context for this miniport
37188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*
37198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	Note:NIC with USB interface sholud not call this function because we cannot scan descriptor
37208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	to judge whether there is tx stuck.
37218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	Note: This function may be required to be rewrite for Vista OS.
37228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	<<<Assumption: Tx spinlock has been acquired >>>
37238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*
37248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	8185 and 8185b does not implement this function. This is added by Emily at 2006.11.24
37258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
37268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangRESET_TYPE
37278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl819x_ifcheck_resetornot(struct net_device *dev)
37288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
37298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
37308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RESET_TYPE	TxResetType = RESET_TYPE_NORESET;
37318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RESET_TYPE	RxResetType = RESET_TYPE_NORESET;
37328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_RF_POWER_STATE 	rfState;
37338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rfState = priv->ieee80211->eRFPowerState;
37358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	TxResetType = TxCheckStuck(dev);
37378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if( rfState != eRfOff ||
37388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FW_DOWNLOAD_FAILURE)) &&*/
37398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->ieee80211->iw_mode != IW_MODE_ADHOC))
37408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
37418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// If driver is in the status of firmware download failure , driver skips RF initialization and RF is
37428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// in turned off state. Driver should check whether Rx stuck and do silent reset. And
37438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// if driver is in firmware download failure status, driver should initialize RF in the following
37448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// silent reset procedure Emily, 2008.01.21
37458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Driver should not check RX stuck in IBSS mode because it is required to
37478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// set Check BSSID in order to send beacon, however, if check BSSID is
37488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// set, STA cannot hear any packet a all. Emily, 2008.04.12
37498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RxResetType = RxCheckStuck(dev);
37508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
37518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL)
37528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return RESET_TYPE_NORMAL;
37538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
37548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET,"%s():silent reset\n",__FUNCTION__);
37558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return RESET_TYPE_SILENT;
37568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
37578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
37588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return RESET_TYPE_NORESET;
37598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
37618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_cancel_deferred_work(struct r8192_priv* priv);
37638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint _rtl8192_up(struct net_device *dev);
37648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_close(struct net_device *dev);
37658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid
37698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangCamRestoreAllEntry(	struct net_device *dev)
37708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
37718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 EntryId = 0;
37728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
37738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8*	MacAddr = priv->ieee80211->current_network.bssid;
37748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u8	CAM_CONST_ADDR[4][6] = {
37768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
37778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
37788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
37798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
37808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u8	CAM_CONST_BROAD[] =
37818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
37828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
37848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if ((priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP40)||
37878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	    (priv->ieee80211->pairwise_key_type == KEY_TYPE_WEP104))
37888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
37898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
37908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(EntryId=0; EntryId<4; EntryId++)
37918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
37928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
37938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				MacAddr = CAM_CONST_ADDR[EntryId];
37948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
37958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EntryId ,
37968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EntryId,
37978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->pairwise_key_type,
37988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						MacAddr,
37998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
38028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
38038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
38058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_TKIP)
38068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
38078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
38098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
38108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						4,
38128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->pairwise_key_type,
38148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						(u8*)dev->dev_addr,
38158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
38188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						4,
38208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->pairwise_key_type,
38228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						MacAddr,
38238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
38268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
38278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP)
38288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
38298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
38318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
38328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						4,
38348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->pairwise_key_type,
38368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						(u8*)dev->dev_addr,
38378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
38408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						4,
38428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->pairwise_key_type,
38448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						MacAddr,
38458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
38488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
38498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->group_key_type == KEY_TYPE_TKIP)
38538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
38548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		MacAddr = CAM_CONST_BROAD;
38558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(EntryId=1 ; EntryId<4 ; EntryId++)
38568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
38578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
38588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EntryId,
38608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EntryId,
38618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->group_key_type,
38628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						MacAddr,
38638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
38668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
38678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
38688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->group_key_type,
38728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						CAM_CONST_ADDR[0],
38738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
38768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(priv->ieee80211->group_key_type == KEY_TYPE_CCMP)
38778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
38788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		MacAddr = CAM_CONST_BROAD;
38798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(EntryId=1; EntryId<4 ; EntryId++)
38808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
38818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
38828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EntryId ,
38848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EntryId,
38858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->group_key_type,
38868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						MacAddr,
38878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
38898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
38908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
38918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
38928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
38938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				setKey(dev,
38948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0 ,
38958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->ieee80211->group_key_type,
38978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						CAM_CONST_ADDR[0],
38988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						0,
38998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						NULL);
39008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
39018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
39028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//////////////////////////////////////////////////////////////
39038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// This function is used to fix Tx/Rx stop bug temporarily.
39048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// This function will do "system reset" to NIC when Tx or Rx is stuck.
39058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// The method checking Tx/Rx stuck of this function is supported by FW,
39068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// which reports Tx and Rx counter to register 0x128 and 0x130.
39078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//////////////////////////////////////////////////////////////
39088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid
39098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl819x_ifsilentreset(struct net_device *dev)
39108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
39118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//OCTET_STRING asocpdu;
39128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
39138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8	reset_times = 0;
39148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int reset_status = 0;
39158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device *ieee = priv->ieee80211;
39168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// 2007.07.20. If we need to check CCK stop, please uncomment this line.
39198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//bStuck = Adapter->HalFunc.CheckHWStopHandler(Adapter);
39208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ResetProgress==RESET_TYPE_NORESET)
39228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
39238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangRESET_START:
39248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
39268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Set the variable for reset.
39288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ResetProgress = RESET_TYPE_SILENT;
39298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		rtl8192_close(dev);
39308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		down(&priv->wx_sem);
39318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->up == 0)
39328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
39338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__FUNCTION__);
39348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			up(&priv->wx_sem);
39358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return ;
39368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
39378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->up = 0;
39388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__FUNCTION__);
39398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		if(!netif_queue_stopped(dev))
39408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//			netif_stop_queue(dev);
39418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_rtx_disable(dev);
39438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_cancel_deferred_work(priv);
39448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		deinit_hal_dm(dev);
39458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		del_timer_sync(&priv->watch_dog_timer);
39468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ieee->sync_scan_hurryup = 1;
39488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(ieee->state == IEEE80211_LINKED)
39498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
39508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			down(&ieee->wx_sem);
39518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			printk("ieee->state is IEEE80211_LINKED\n");
39528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee80211_stop_send_beacons(priv->ieee80211);
39538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			del_timer_sync(&ieee->associate_timer);
39548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			cancel_delayed_work(&ieee->associate_retry_wq);
39558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee80211_stop_scan(ieee);
39568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			netif_carrier_off(dev);
39578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			up(&ieee->wx_sem);
39588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
39598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else{
39608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			printk("ieee->state is NOT LINKED\n");
39618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee80211_softmac_stop_protocol(priv->ieee80211);			}
39628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		up(&priv->wx_sem);
39638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__FUNCTION__);
39648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rtl8192_irq_disable(dev);
39658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET,"%s():===========>start to up the driver\n",__FUNCTION__);
39668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		reset_status = _rtl8192_up(dev);
39678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__FUNCTION__);
39698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(reset_status == -EAGAIN)
39708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
39718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(reset_times < 3)
39728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
39738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				reset_times++;
39748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				goto RESET_START;
39758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
39768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
39778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
39788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_ERR," ERR!!! %s():  Reset Failed!!\n", __FUNCTION__);
39798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
39808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
39818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ieee->is_silent_reset = 1;
39828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		EnableHWSecurityConfig8192(dev);
39838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
39848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
39858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->set_chan(ieee->dev, ieee->current_network.channel);
39868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			queue_work(ieee->wq, &ieee->associate_complete_wq);
39888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
39908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_ADHOC)
39918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
39928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->set_chan(ieee->dev, ieee->current_network.channel);
39938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->link_change(ieee->dev);
39948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//	notify_wx_assoc_event(ieee);
39968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee80211_start_send_beacons(ieee);
39988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
39998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (ieee->data_hard_resume)
40008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ieee->data_hard_resume(ieee->dev);
40018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			netif_carrier_on(ieee->dev);
40028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
40038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		CamRestoreAllEntry(dev);
40058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ResetProgress = RESET_TYPE_NORESET;
40078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->reset_count++;
40088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->bForcedSilentReset =false;
40108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->bResetInProgress = false;
40118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// For test --> force write UFWP.
40138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		write_nic_byte(dev, UFWP, 1);
40148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
40158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
40168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
40178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid CAM_read_entry(
40198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev,
40208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32	 		iIndex
40218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang)
40228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
40238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang 	u32 target_command=0;
40248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 u32 target_content=0;
40258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 u8 entry_i=0;
40268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 u32 ulStatus;
40278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	s32 i=100;
40288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	printk("=======>start read CAM\n");
40298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang 	for(entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
40308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang 	{
40318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang   	// polling bit, and No Write enable, and address
40328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
40338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		target_command= target_command | BIT31;
40348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Check polling bit is clear
40368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	mdelay(1);
40378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		while((i--)>=0)
40388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
40398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ulStatus = read_nic_dword(dev, RWCAM);
40408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(ulStatus & BIT31){
40418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				continue;
40428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
40438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else{
40448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
40458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
40468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
4047e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		write_nic_dword(dev, RWCAM, target_command);
4048e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
4049e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	 //	printk("CAM_read_entry(): WRITE A0: %lx \n",target_command);
4050e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		target_content = read_nic_dword(dev, RCAMO);
4051e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
4052e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	 //	printk("CAM_read_entry(): WRITE A8: %lx \n",target_content);
4053e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
40548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk("\n");
40558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
40568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl819x_update_rxcounts(
40588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv,
40598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32* TotalRxBcnNum,
40608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32* TotalRxDataNum
40618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang)
40628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
40638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 			SlotIndex;
40648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8			i;
40658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*TotalRxBcnNum = 0;
40678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	*TotalRxDataNum = 0;
40688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
40708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
40718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
40728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
40738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		*TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
40748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		*TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
40758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
40768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
40778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangextern	void	rtl819x_watchdog_wqcallback(struct work_struct *work)
40808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
40818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct delayed_work *dwork = container_of(work,struct delayed_work,work);
40828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang       struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
40838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang       struct net_device *dev = priv->ieee80211->dev;
40848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device* ieee = priv->ieee80211;
40858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RESET_TYPE	ResetType = RESET_TYPE_NORESET;
4086e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	static u8	check_reset_cnt=0;
40878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bBusyTraffic = false;
40888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!priv->up)
40908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return;
40918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	hal_dm_watchdog(dev);
40928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
40938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{//to get busy traffic condition
40948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(ieee->state == IEEE80211_LINKED)
40958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
40968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(	ieee->LinkDetectInfo.NumRxOkInPeriod> 666 ||
40978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ieee->LinkDetectInfo.NumTxOkInPeriod> 666 ) {
40988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				bBusyTraffic = true;
40998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
41008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
41018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
41028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
41038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
41048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
41058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//added by amy for AP roaming
41068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
41078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->ieee80211->state == IEEE80211_LINKED && priv->ieee80211->iw_mode == IW_MODE_INFRA)
41088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
41098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u32	TotalRxBcnNum = 0;
41108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u32	TotalRxDataNum = 0;
41118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
41138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if((TotalRxBcnNum+TotalRxDataNum) == 0)
41148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
41158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				#ifdef TODO
41168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(rfState == eRfOff)
41178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
41188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				#endif
41198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
41208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	Dot11d_Reset(dev);
41218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->ieee80211->state = IEEE80211_ASSOCIATING;
41228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				notify_wx_assoc_event(priv->ieee80211);
41238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
41248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->ieee80211->link_change(dev);
41258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang                                queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
41268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
41288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
41298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod=0;
41308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod=0;
41318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
41328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	CAM_read_entry(dev,4);
41338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//check if reset the driver
41348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(check_reset_cnt++ >= 3)
41358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
41368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    		ResetType = rtl819x_ifcheck_resetornot(dev);
41378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		check_reset_cnt = 3;
41388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//DbgPrint("Start to check silent reset\n");
41398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
41408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	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);
41418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if( (priv->force_reset) || (priv->ResetProgress==RESET_TYPE_NORESET &&
41428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(priv->bForcedSilentReset ||
41438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		(!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))) // This is control by OID set in Pomelo
41448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
41458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		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);
41468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl819x_ifsilentreset(dev);
41478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
41488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->force_reset = false;
41498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->bForcedSilentReset = false;
41508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->bResetInProgress = false;
41518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
41528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
41548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid watch_dog_timer_callback(unsigned long data)
41568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
41578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv((struct net_device *) data);
41588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//printk("===============>watch_dog  timer\n");
41598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq, 0);
41608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
41618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
41628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint _rtl8192_up(struct net_device *dev)
41638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
41648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
41658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//int i;
41668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int init_status = 0;
41678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->up=1;
41688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->ieee_up=1;
41698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Bringing up iface");
41708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	init_status = rtl8192_adapter_start(dev);
41718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!init_status)
41728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
41738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n", __FUNCTION__);
41748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->up=priv->ieee80211->ieee_up = 0;
41758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return -EAGAIN;
41768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
41778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "start adapter finished\n");
41788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rx_enable(dev);
41798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_tx_enable(dev);
41808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->ieee80211->state != IEEE80211_LINKED)
41818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ieee80211_softmac_start_protocol(priv->ieee80211);
41828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ieee80211_reset_queue(priv->ieee80211);
41838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	watch_dog_timer_callback((unsigned long) dev);
41848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!netif_queue_stopped(dev))
41858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		netif_start_queue(dev);
41868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
41878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		netif_wake_queue(dev);
41888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
41908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
41918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
41938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_open(struct net_device *dev)
41948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
41958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
41968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int ret;
41978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	down(&priv->wx_sem);
41988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ret = rtl8192_up(dev);
41998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	up(&priv->wx_sem);
42008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret;
42018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
42038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_up(struct net_device *dev)
42068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
42078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
42088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->up == 1) return -1;
42108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return _rtl8192_up(dev);
42128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
42138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_close(struct net_device *dev)
42168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
42178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
42188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int ret;
42198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	down(&priv->wx_sem);
42218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ret = rtl8192_down(dev);
42238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	up(&priv->wx_sem);
42258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret;
42278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
42298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_down(struct net_device *dev)
42318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
42328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
42338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int i;
42348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->up == 0) return -1;
42368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->up=0;
42388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211->ieee_up = 0;
42398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
42408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* FIXME */
42418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (!netif_queue_stopped(dev))
42428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		netif_stop_queue(dev);
42438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rtx_disable(dev);
42458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rtl8192_irq_disable(dev);
42468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang /* Tx related queue release */
4248e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4249e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
4250e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
4251e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4252e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
4253e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
42548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4255e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	for(i = 0; i < MAX_QUEUE_SIZE; i++) {
4256e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		skb_queue_purge(&priv->ieee80211->skb_drv_aggQ [i]);
4257e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
42588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4259e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//as cancel_delayed_work will del work->timer, so if work is not definedas struct delayed_work, it will corrupt
42608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	flush_scheduled_work();
42618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_cancel_deferred_work(priv);
42628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	deinit_hal_dm(dev);
42638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	del_timer_sync(&priv->watch_dog_timer);
42648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ieee80211_softmac_stop_protocol(priv->ieee80211);
42678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
42688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
42698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return 0;
42718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
42728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_commit(struct net_device *dev)
42758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
42768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
42778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int reset_status = 0;
42788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//u8 reset_times = 0;
42798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (priv->up == 0) return ;
42808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->up = 0;
42818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_cancel_deferred_work(priv);
42838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	del_timer_sync(&priv->watch_dog_timer);
42848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//cancel_delayed_work(&priv->SwChnlWorkItem);
42858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ieee80211_softmac_stop_protocol(priv->ieee80211);
42878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rtl8192_irq_disable(dev);
42898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rtx_disable(dev);
42908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	reset_status = _rtl8192_up(dev);
42918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
42938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
42948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
42958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_restart(struct net_device *dev)
42968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
42978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
42988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
42998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_restart(struct work_struct *work)
43008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
4301e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
4302e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct net_device *dev = priv->ieee80211->dev;
43038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	down(&priv->wx_sem);
43058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_commit(dev);
43078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	up(&priv->wx_sem);
43098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
43108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void r8192_set_multicast(struct net_device *dev)
43128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
43138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
43148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	short promisc;
43158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//down(&priv->wx_sem);
43178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* FIXME FIXME */
43198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	promisc = (dev->flags & IFF_PROMISC) ? 1:0;
43218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (promisc != priv->promisc)
43238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	rtl8192_commit(dev);
43248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->promisc = promisc;
43268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//schedule_work(&priv->reset_wq);
43288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//up(&priv->wx_sem);
43298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
43308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint r8192_set_mac_adr(struct net_device *dev, void *mac)
43338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
43348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
43358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct sockaddr *addr = mac;
43368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	down(&priv->wx_sem);
43388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
43408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	schedule_work(&priv->reset_wq);
43428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	up(&priv->wx_sem);
43438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
43458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
43468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* based on ipw2200 driver */
43488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangint rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
43498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
43508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
43518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct iwreq *wrq = (struct iwreq *)rq;
43528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	int ret=-1;
43538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_device *ieee = priv->ieee80211;
43548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 key[4];
43558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
43568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct iw_point *p = &wrq->u.data;
43578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
43588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	down(&priv->wx_sem);
43608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang     if (p->length < sizeof(struct ieee_param) || !p->pointer){
4363e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	     ret = -EINVAL;
4364e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	     goto out;
43658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
43668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
4367324148788bf3744d90fb6894ec5744eb0ca91b74Julia Lawall     ipw = kmalloc(p->length, GFP_KERNEL);
43688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang     if (ipw == NULL){
4369e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	     ret = -ENOMEM;
4370e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	     goto out;
43718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang     }
43728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang     if (copy_from_user(ipw, p->pointer, p->length)) {
43738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		kfree(ipw);
4374e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	    ret = -EFAULT;
4375e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	    goto out;
43768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
43778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch (cmd) {
43798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	    case RTL_IOCTL_WPA_SUPPLICANT:
43808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//parse here for HW security
43818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
43828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
43838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if (ipw->u.crypt.set_tx)
43848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
43858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
43868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						ieee->pairwise_key_type = KEY_TYPE_CCMP;
43878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
43888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						ieee->pairwise_key_type = KEY_TYPE_TKIP;
43898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
43908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					{
43918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						if (ipw->u.crypt.key_len == 13)
43928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							ieee->pairwise_key_type = KEY_TYPE_WEP104;
43938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						else if (ipw->u.crypt.key_len == 5)
43948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							ieee->pairwise_key_type = KEY_TYPE_WEP40;
43958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
43968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
43978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						ieee->pairwise_key_type = KEY_TYPE_NA;
43988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
43998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (ieee->pairwise_key_type)
44008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					{
44018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						memcpy((u8*)key, ipw->u.crypt.key, 16);
44028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						EnableHWSecurityConfig8192(dev);
44038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					//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!
44048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					//added by WB.
44058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
44068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						if (ieee->auth_mode != 2)
44078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
44088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
44098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
44108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else //if (ipw->u.crypt.idx) //group key use idx > 0
44118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
44128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					memcpy((u8*)key, ipw->u.crypt.key, 16);
44138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
44148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						ieee->group_key_type= KEY_TYPE_CCMP;
44158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
44168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						ieee->group_key_type = KEY_TYPE_TKIP;
44178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
44188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					{
44198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						if (ipw->u.crypt.key_len == 13)
44208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							ieee->group_key_type = KEY_TYPE_WEP104;
44218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						else if (ipw->u.crypt.key_len == 5)
44228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							ieee->group_key_type = KEY_TYPE_WEP40;
44238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
44248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
44258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						ieee->group_key_type = KEY_TYPE_NA;
44268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
44278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (ieee->group_key_type)
44288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					{
44298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							setKey(	dev,
44308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang								ipw->u.crypt.idx,
44318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang								ipw->u.crypt.idx,		//KeyIndex
44328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						     		ieee->group_key_type,	//KeyType
44338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						            	broadcast_addr,	//MacAddr
44348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang								0,		//DefaultKey
44358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang							      	key);		//KeyContent
44368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
44378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
44388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
44398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef JOHN_HWSEC_DEBUG
44408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//john's test 0711
44418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("@@ wrq->u pointer = ");
44428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=0;i<wrq->u.data.length;i++){
44438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(i%10==0) printk("\n");
44448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
44458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
44468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("\n");
44478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif /*JOHN_HWSEC_DEBUG*/
44488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
44498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
44508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
44518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	    default:
44528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ret = -EOPNOTSUPP;
44538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		break;
44548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
44558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	kfree(ipw);
4456e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	ipw = NULL;
44578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangout:
44588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	up(&priv->wx_sem);
44598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret;
44608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
44618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
44628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu8 HwRateToMRate90(bool bIsHT, u8 rate)
44638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
44648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8  ret_rate = 0xff;
44658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
44668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!bIsHT) {
44678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		switch(rate) {
44688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE1M:   ret_rate = MGN_1M;         break;
44698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE2M:   ret_rate = MGN_2M;         break;
44708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE5_5M: ret_rate = MGN_5_5M;       break;
44718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE11M:  ret_rate = MGN_11M;        break;
44728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE6M:   ret_rate = MGN_6M;         break;
44738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE9M:   ret_rate = MGN_9M;         break;
44748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE12M:  ret_rate = MGN_12M;        break;
44758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE18M:  ret_rate = MGN_18M;        break;
44768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE24M:  ret_rate = MGN_24M;        break;
44778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE36M:  ret_rate = MGN_36M;        break;
44788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE48M:  ret_rate = MGN_48M;        break;
44798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATE54M:  ret_rate = MGN_54M;        break;
44808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
44818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			default:
44828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ret_rate = 0xff;
44838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
44848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
44858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
44868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
44878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
44888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		switch(rate) {
44898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS0:   ret_rate = MGN_MCS0;    break;
44908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS1:   ret_rate = MGN_MCS1;    break;
44918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS2:   ret_rate = MGN_MCS2;    break;
44928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS3:   ret_rate = MGN_MCS3;    break;
44938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS4:   ret_rate = MGN_MCS4;    break;
44948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS5:   ret_rate = MGN_MCS5;    break;
44958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS6:   ret_rate = MGN_MCS6;    break;
44968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS7:   ret_rate = MGN_MCS7;    break;
44978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS8:   ret_rate = MGN_MCS8;    break;
44988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS9:   ret_rate = MGN_MCS9;    break;
44998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS10:  ret_rate = MGN_MCS10;   break;
45008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS11:  ret_rate = MGN_MCS11;   break;
45018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS12:  ret_rate = MGN_MCS12;   break;
45028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS13:  ret_rate = MGN_MCS13;   break;
45038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS14:  ret_rate = MGN_MCS14;   break;
45048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS15:  ret_rate = MGN_MCS15;   break;
45058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case DESC90_RATEMCS32:  ret_rate = (0x80|0x20); break;
45068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			default:
45088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ret_rate = 0xff;
45098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
45108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
45118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
45128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
45138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ret_rate;
45158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
45168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/**
45188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Function:     UpdateRxPktTimeStamp
45198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Overview:     Recored down the TSF time stamp when receiving a packet
45208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
45218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Input:
45228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *       PADAPTER        Adapter
45238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *       PRT_RFD         pRfd,
45248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
45258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Output:
45268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *       PRT_RFD         pRfd
45278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *                               (pRfd->Status.TimeStampHigh is updated)
45288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *                               (pRfd->Status.TimeStampLow is updated)
45298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Return:
45308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *               None
45318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang */
45328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid UpdateRxPktTimeStamp8190 (struct net_device *dev, struct ieee80211_rx_stats *stats)
45338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
45348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
45358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(stats->bIsAMPDU && !stats->bFirstMPDU) {
45378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->mac_time[0] = priv->LastRxDescTSFLow;
45388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->mac_time[1] = priv->LastRxDescTSFHigh;
45398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
45408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->LastRxDescTSFLow = stats->mac_time[0];
45418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->LastRxDescTSFHigh = stats->mac_time[1];
45428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
45438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
45448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//by amy 080606
45468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanglong rtl819x_translate_todbm(u8 signal_strength_index	)// 0-100 index.
45488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
45498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	long	signal_power; // in dBm.
45508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Translate to dBm (x=0.5y-95).
45528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	signal_power = (long)((signal_strength_index + 1) >> 1);
45538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	signal_power -= 95;
45548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return signal_power;
45568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
45578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
45608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    be a local static. Otherwise, it may increase when we return from S3/S4. The
45618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    value will be kept in memory or disk. We must delcare the value in adapter
45628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    and it will be reinitialized when return from S3/S4. */
45638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_process_phyinfo(struct r8192_priv * priv,u8* buffer, struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
45648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
45658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bcheck = false;
45668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8	rfpath;
45678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32	nspatial_stream, tmp_val;
45688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//u8	i;
45698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u32 slide_rssi_index=0, slide_rssi_statistics=0;
45708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u32 slide_evm_index=0, slide_evm_statistics=0;
45718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u32 last_rssi=0, last_evm=0;
45728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
45748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static u32 last_beacon_adc_pwdb=0;
45758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_hdr_3addr *hdr;
45778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 sc ;
45788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	unsigned int frag,seq;
45798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	hdr = (struct ieee80211_hdr_3addr *)buffer;
45808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	sc = le16_to_cpu(hdr->seq_ctl);
45818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	frag = WLAN_GET_SEQ_FRAG(sc);
45828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	seq = WLAN_GET_SEQ_SEQ(sc);
45838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//cosa add 04292008 to record the sequence number
45848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pcurrent_stats->Seq_Num = seq;
45858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
45868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Check whether we should take the previous packet into accounting
45878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
45888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!pprevious_stats->bIsAMPDU)
45898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
45908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// if previous packet is not aggregated packet
45918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		bcheck = true;
45928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}else
45938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
45948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
45958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
45978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
45988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
45998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
46008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
46018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.slide_rssi_total -= last_rssi;
46028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
46038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
46048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
46068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
46078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		slide_rssi_index = 0;
46088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// <1> Showed on UI for user, in dbm
46108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
46118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
46128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pcurrent_stats->rssi = priv->stats.signal_strength;
46138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
46148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// If the previous packet does not match the criteria, neglect it
46158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
46168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!pprevious_stats->bPacketMatchBSSID)
46178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
46188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(!pprevious_stats->bToSelfBA)
46198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return;
46208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
46218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!bcheck)
46238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return;
46248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rtl8190_process_cck_rxpathsel(priv,pprevious_stats);//only rtl8190 supported
46278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
46298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Check RSSI
46308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
46318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->stats.num_process_phyinfo++;
46328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* record the general signal strength to the sliding window. */
46348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// <2> Showed on UI for engineering
46378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// hardware does not provide rssi information for each rf path in CCK
46388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!pprevious_stats->bIsCCK && (pprevious_stats->bPacketToSelf || pprevious_stats->bToSelfBA))
46398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
46408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for (rfpath = RF90_PATH_A; rfpath < priv->NumTotalRFPath; rfpath++)
46418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
4642e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		     if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, rfpath))
4643e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				 continue;
46448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//Fixed by Jacken 2008-03-20
46468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(priv->stats.rx_rssi_percentage[rfpath] == 0)
46478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
46488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
46498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//DbgPrint("MIMO RSSI initialize \n");
46508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
46518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(pprevious_stats->RxMIMOSignalStrength[rfpath]  > priv->stats.rx_rssi_percentage[rfpath])
46528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
46538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->stats.rx_rssi_percentage[rfpath] =
46548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
46558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
46568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath]  + 1;
46578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
46588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
46598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
46608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->stats.rx_rssi_percentage[rfpath] =
46618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
46628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
46638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
46648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_DBG,"priv->stats.rx_rssi_percentage[rfPath]  = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
46658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
46668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
46678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
46708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Check PWDB.
46718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
46728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
46738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				pprevious_stats->bIsCCK? "CCK": "OFDM",
46748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				pprevious_stats->RxPWDBAll);
46758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(pprevious_stats->bPacketBeacon)
46778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
46788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/* record the beacon pwdb to the sliding window. */
46798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
46808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
46818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
46828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
46838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
46848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("slide_beacon_adc_pwdb_index = %d, last_beacon_adc_pwdb = %d, Adapter->RxStats.Slide_Beacon_Total = %d\n",
46858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//	slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
46868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
46878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
46888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
46898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//DbgPrint("slide_beacon_adc_pwdb_index = %d, pPreviousRfd->Status.RxPWDBAll = %d\n", slide_beacon_adc_pwdb_index, pPreviousRfd->Status.RxPWDBAll);
46908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		slide_beacon_adc_pwdb_index++;
46918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
46928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			slide_beacon_adc_pwdb_index = 0;
46938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
46948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pprevious_stats->RxPWDBAll >= 3)
46958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pprevious_stats->RxPWDBAll -= 3;
46968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
46978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
46988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
46998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				pprevious_stats->bIsCCK? "CCK": "OFDM",
47008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				pprevious_stats->RxPWDBAll);
47018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
47048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
47058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->undecorated_smoothed_pwdb < 0)	// initialize
47068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
47078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
47088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("First pwdb initialize \n");
47098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
47108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
47118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
47128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->undecorated_smoothed_pwdb =
47138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
47148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
47158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
47168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
47178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
47188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
47198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->undecorated_smoothed_pwdb =
47208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
47218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
47228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
47238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
47258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
47278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Check EVM
47288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
47298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* record the general EVM to the sliding window. */
47308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(pprevious_stats->SignalQuality == 0)
47318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
47328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
47338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
47348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
47358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
47368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
47378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
47388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				last_evm = priv->stats.slide_evm[slide_evm_index];
47398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->stats.slide_evm_total -= last_evm;
47408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
47418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
47438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
47458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
47468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				slide_evm_index = 0;
47478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// <1> Showed on UI for user, in percentage.
47498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
47508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.signal_quality = tmp_val;
47518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
47528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.last_signal_strength_inpercent = tmp_val;
47538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
47548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// <2> Showed on UI for engineering
47568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
47578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
47588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
47598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
47608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
47618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
47628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if(priv->stats.rx_evm_percentage[nspatial_stream] == 0)	// initialize
47638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					{
47648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
47658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
47668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->stats.rx_evm_percentage[nspatial_stream] =
47678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
47688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						(pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
47698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
47708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
47718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
47728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
47738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
47768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
47778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*-----------------------------------------------------------------------------
47788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Function:	rtl819x_query_rxpwrpercentage()
47798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
47808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Overview:
47818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
47828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Input:		char		antpower
47838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
47848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Output:		NONE
47858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
47868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Return:		0-100 percentage
47878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
47888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Revised History:
47898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *	When		Who		Remark
47908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *	05/26/2008	amy		Create Version 0 porting from windows code.
47918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *
47928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *---------------------------------------------------------------------------*/
47938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic u8 rtl819x_query_rxpwrpercentage(
47948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	char		antpower
47958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
47968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
47978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if ((antpower <= -100) || (antpower >= 20))
47988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
47998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return	0;
48008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if (antpower >= 0)
48028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return	100;
48048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
48068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return	(100+antpower);
48088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}	/* QueryRxPwrPercentage */
48118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic u8
48138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl819x_evm_dbtopercentage(
48148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    char value
48158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    )
48168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
48178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    char ret_val;
48188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    ret_val = value;
48208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    if(ret_val >= 0)
48228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        ret_val = 0;
48238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    if(ret_val <= -33)
48248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang        ret_val = -33;
48258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    ret_val = 0 - ret_val;
48268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    ret_val*=3;
48278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(ret_val == 99)
48288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ret_val = 100;
48298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    return(ret_val);
48308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
48318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//
48328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	Description:
48338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang// 	We want good-looking for signal strength/quality
48348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	2007/7/19 01:09, by cosa.
48358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//
48368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuanglong
48378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl819x_signal_scale_mapping(
48388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	long currsig
48398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
48408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
48418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	long retsig;
48428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Step 1. Scale mapping.
48448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(currsig >= 61 && currsig <= 100)
48458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 90 + ((currsig - 60) / 4);
48478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig >= 41 && currsig <= 60)
48498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 78 + ((currsig - 40) / 2);
48518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig >= 31 && currsig <= 40)
48538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 66 + (currsig - 30);
48558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig >= 21 && currsig <= 30)
48578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 54 + (currsig - 20);
48598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig >= 5 && currsig <= 20)
48618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 42 + (((currsig - 5) * 2) / 3);
48638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig == 4)
48658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 36;
48678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig == 3)
48698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 27;
48718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig == 2)
48738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 18;
48758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if(currsig == 1)
48778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = 9;
48798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
48818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
48828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		retsig = currsig;
48838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
48848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return retsig;
48868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
48878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
48888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void rtl8192_query_rxphystatus(
48898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv * priv,
48908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats * pstats,
48918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rx_drvinfo_819x_usb  * pdrvinfo,
48928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats * precord_stats,
48938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bpacket_match_bssid,
48948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bpacket_toself,
48958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bPacketBeacon,
48968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bToSelfBA
48978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
48988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
48998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//PRT_RFD_STATUS		pRtRfdStatus = &(pRfd->Status);
49008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	phy_sts_ofdm_819xusb_t*	pofdm_buf;
49018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	phy_sts_cck_819xusb_t	*	pcck_buf;
49028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
49038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8				*prxpkt;
49048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8				i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
49058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	char				rx_pwr[4], rx_pwr_all=0;
49068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//long				rx_avg_pwr = 0;
49078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	char				rx_snrX, rx_evmX;
49088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8				evm, pwdb_all;
49098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32				RSSI, total_rssi=0;//, total_evm=0;
49108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	long				signal_strength_index = 0;
49118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8				is_cck_rate=0;
49128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8				rf_rx_num = 0;
49138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->stats.numqry_phystatus++;
49168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
49188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Record it for next packet processing
49208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
49218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
49228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
49238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
49248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
49258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
49268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	prxpkt = (u8*)pdrvinfo;
49288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Move pointer to the 16th bytes. Phy status start address. */
49308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	prxpkt += sizeof(rx_drvinfo_819x_usb);
49318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Initial the cck and ofdm buffer pointer */
49338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pcck_buf = (phy_sts_cck_819xusb_t *)prxpkt;
49348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pofdm_buf = (phy_sts_ofdm_819xusb_t *)prxpkt;
49358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->RxMIMOSignalQuality[0] = -1;
49378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->RxMIMOSignalQuality[1] = -1;
49388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	precord_stats->RxMIMOSignalQuality[0] = -1;
49398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	precord_stats->RxMIMOSignalQuality[1] = -1;
49408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(is_cck_rate)
49428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
49438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
49448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (1)Hardware does not provide RSSI for CCK
49458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
49468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
49488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
49498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
49508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 report;//, cck_agc_rpt;
49518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.numqry_phystatusCCK++;
49538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(!priv->bCckHighPower)
49558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
49568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			report = pcck_buf->cck_agc_rpt & 0xc0;
49578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			report = report>>6;
49588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			switch(report)
49598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
49608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//Fixed by Jacken from Bryant 2008-03-20
49618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//Original value is -38 , -26 , -14 , -2
49628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//Fixed value is -35 , -23 , -11 , 6
49638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x3:
49648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
49658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x2:
49678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
49688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x1:
49708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
49718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x0:
49738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = 6 - (pcck_buf->cck_agc_rpt & 0x3e);
49748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
49768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
49778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
49788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
49798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			report = pcck_buf->cck_agc_rpt & 0x60;
49808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			report = report>>5;
49818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			switch(report)
49828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
49838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x3:
49848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
49858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x2:
49878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
49888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x1:
49908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
49918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				case 0x0:
49938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rx_pwr_all = 6 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
49948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
49958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
49968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
49978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
49988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
49998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
50008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pstats->RecvSignalPower = pwdb_all;
50018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (3) Get Signal Quality (EVM)
50048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//if(bpacket_match_bssid)
50068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
50078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u8	sq;
50088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(pstats->RxPWDBAll > 40)
50108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
50118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				sq = 100;
50128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}else
50138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
50148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				sq = pcck_buf->sq_rpt;
50158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(pcck_buf->sq_rpt > 64)
50178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					sq = 0;
50188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else if (pcck_buf->sq_rpt < 20)
50198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					sq = 100;
50208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else
50218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					sq = ((64-sq) * 100) / 44;
50228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
50238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pstats->SignalQuality = precord_stats->SignalQuality = sq;
50248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
50258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
50268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
50278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
50288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
50298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
50308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.numqry_phystatusHT++;
50318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (1)Get RSSI for HT rate
50338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=RF90_PATH_A; i<priv->NumTotalRFPath; i++)
50358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
50368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// 2008/01/30 MH we will judge RF RX path now.
50378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (priv->brfpath_rxenable[i])
50388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				rf_rx_num++;
50398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
50408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				continue;
50418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (!rtl8192_phy_CheckIsLegalRFPath(priv->ieee80211->dev, i))
50438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				continue;
50448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//Fixed by Jacken from Bryant 2008-03-20
50468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//Original value is 106
50478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
50488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//Get Rx snr value in DB
50508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tmp_rxsnr =	pofdm_buf->rxsnr_X[i];
50518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_snrX = (char)(tmp_rxsnr);
5052859171ca92f2865453b4b2e17bf679c67044a833Joe Perches			//rx_snrX >>= 1;
50538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_snrX /= 2;
50548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.rxSNRdB[i] = (long)rx_snrX;
50558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* Translate DBM to percentage. */
50578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
50588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			total_rssi += RSSI;
50598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* Record Signal Strength for next packet */
50618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//if(bpacket_match_bssid)
50628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
50638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
50648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
50658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
50668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
50678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
50718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//Fixed by Jacken from Bryant 2008-03-20
50738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//Original value is 106
50748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
50758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
50768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
50788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pstats->RxPower = precord_stats->RxPower =  rx_pwr_all;
50798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (3)EVM of HT rate
50828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
50838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
5084e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			pdrvinfo->RxRate<=DESC90_RATEMCS15)
50858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			max_spatial_stream = 2; //both spatial stream make sense
50868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
50878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			max_spatial_stream = 1; //only spatial stream 1 makes sense
50888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		for(i=0; i<max_spatial_stream; i++)
50908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
50918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			tmp_rxevm =	pofdm_buf->rxevm_X[i];
50928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_evmX = (char)(tmp_rxevm);
50938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
50958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// fill most significant bit to "zero" when doing shifting operation which may change a negative
50968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.
50978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rx_evmX /= 2;	//dbm
50988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
50998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			evm = rtl819x_evm_dbtopercentage(rx_evmX);
51008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//if(bpacket_match_bssid)
51018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
51028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(i==0) // Fill value in RFD, Get the first spatial stream only
51038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
51048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
51058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
51068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
51078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* record rx statistics for debug */
51108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
51118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		prxsc =	(phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
51128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(pdrvinfo->BW)	//40M channel
51138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.received_bwtype[1+prxsc->rxsc]++;
51148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else				//20M channel
51158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.received_bwtype[0]++;
51168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
51178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//UI BSS List signal strength(in percentage), make it good looking, from 0~100.
51198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
51208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(is_cck_rate)
51218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
51228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;
51238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
51258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
51268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
51278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u8)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u8)(total_rssi/=RF90_PATH_MAX);
51288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// We can judge RX path number now.
51298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (rf_rx_num != 0)
51308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
51318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
51328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}	/* QueryRxPhyStatus8190Pci */
51338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid
51358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl8192_record_rxdesc_forlateruse(
51368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats *	psrc_stats,
51378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats *	ptarget_stats
51388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang)
51398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
51408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
51418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
51428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ptarget_stats->Seq_Num = psrc_stats->Seq_Num;
51438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
51448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid TranslateRxSignalStuff819xUsb(struct sk_buff *skb,
51478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				   struct ieee80211_rx_stats * pstats,
5148e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab				   rx_drvinfo_819x_usb  *pdrvinfo)
51498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
51508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// TODO: We must only check packet for current MAC address. Not finish
51518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
51528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev=info->dev;
51538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
51548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bpacket_match_bssid, bpacket_toself;
51558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool bPacketBeacon=FALSE, bToSelfBA=FALSE;
51568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	static struct ieee80211_rx_stats  previous_stats;
51578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_hdr_3addr *hdr;//by amy
51588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang       u16 fc,type;
51598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Get Signal Quality for only RX data queue (but not command queue)
51618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8* tmp_buf;
51638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//u16 tmp_buf_len = 0;
51648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8  *praddr;
51658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Get MAC frame start address. */
51678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	tmp_buf = (u8*)skb->data;// + get_rxpacket_shiftbytes_819xusb(pstats);
51688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
51708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	fc = le16_to_cpu(hdr->frame_ctl);
51718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	type = WLAN_FC_GET_TYPE(fc);
51728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	praddr = hdr->addr1;
51738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* Check if the received packet is acceptabe. */
51758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
5176e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab							(eqMacAddr(priv->ieee80211->current_network.bssid,  (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
5177e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab								 && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
51788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bpacket_toself =  bpacket_match_bssid & (eqMacAddr(praddr, priv->ieee80211->dev->dev_addr));
51798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
51818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
51828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			bPacketBeacon = true;
51838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//DbgPrint("Beacon 2, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
51848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
51858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
51868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
51878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if((eqMacAddr(praddr,dev->dev_addr)))
51888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				bToSelfBA = true;
51898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//DbgPrint("BlockAck, MatchBSSID = %d, ToSelf = %d \n", bPacketMatchBSSID, bPacketToSelf);
51908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
51918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
51948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(bpacket_match_bssid)
51958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
51968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.numpacket_matchbssid++;
51978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
51988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(bpacket_toself){
51998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.numpacket_toself++;
52008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
52018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
52028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Process PHY information for previous packet (RSSI/PWDB/EVM)
52038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
52048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Because phy information is contained in the last packet of AMPDU only, so driver
52058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// should process phy information of previous packet
52068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
52078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_query_rxphystatus(priv, pstats, pdrvinfo, &previous_stats, bpacket_match_bssid,bpacket_toself,bPacketBeacon,bToSelfBA);
52088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
52098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
52108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
52118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
52128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/**
52138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* Function:	UpdateReceivedRateHistogramStatistics
52148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* Overview:	Recored down the received data rate
52158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*
52168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* Input:
52178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* 	struct net_device *dev
52188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*	struct ieee80211_rx_stats *stats
52198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*
52208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* Output:
52218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*
52228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*			(priv->stats.ReceivedRateHistogram[] is updated)
52238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang* Return:
52248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*		None
52258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
52268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid
52278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry ChuangUpdateReceivedRateHistogramStatistics8190(
52288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev,
52298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats *stats
52308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
52318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
52328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
5233e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u32 rcvType=1;   //0: Total, 1:OK, 2:CRC, 3:ICV
5234e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u32 rateIndex;
5235e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u32 preamble_guardinterval;  //1: short preamble/GI, 0: long preamble/GI
52368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
52378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5238e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if(stats->bCRC)
5239e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	rcvType = 2;
5240e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	else if(stats->bICV)
5241e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	rcvType = 3;
52428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5243e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if(stats->bShortPreamble)
5244e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	preamble_guardinterval = 1;// short
5245e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	else
5246e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	preamble_guardinterval = 0;// long
52478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
52488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	switch(stats->rate)
52498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
52508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
52518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// CCK rate
52528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
52538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_1M:    rateIndex = 0;  break;
52548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_2M:    rateIndex = 1;  break;
52558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_5_5M:  rateIndex = 2;  break;
52568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_11M:   rateIndex = 3;  break;
52578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
52588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Legacy OFDM rate
52598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
52608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_6M:    rateIndex = 4;  break;
52618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_9M:    rateIndex = 5;  break;
52628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_12M:   rateIndex = 6;  break;
52638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_18M:   rateIndex = 7;  break;
52648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_24M:   rateIndex = 8;  break;
52658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_36M:   rateIndex = 9;  break;
52668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_48M:   rateIndex = 10; break;
52678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_54M:   rateIndex = 11; break;
52688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
52698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// 11n High throughput rate
52708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
52718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS0:  rateIndex = 12; break;
52728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS1:  rateIndex = 13; break;
52738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS2:  rateIndex = 14; break;
52748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS3:  rateIndex = 15; break;
52758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS4:  rateIndex = 16; break;
52768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS5:  rateIndex = 17; break;
52778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS6:  rateIndex = 18; break;
52788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS7:  rateIndex = 19; break;
52798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS8:  rateIndex = 20; break;
52808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS9:  rateIndex = 21; break;
52818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS10: rateIndex = 22; break;
52828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS11: rateIndex = 23; break;
52838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS12: rateIndex = 24; break;
52848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS13: rateIndex = 25; break;
52858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS14: rateIndex = 26; break;
52868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case MGN_MCS15: rateIndex = 27; break;
52878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		default:        rateIndex = 28; break;
52888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
52898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
52908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    priv->stats.received_rate_histogram[0][rateIndex]++; //total
52918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang    priv->stats.received_rate_histogram[rcvType][rateIndex]++;
52928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
52938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
52948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
52958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats, bool bIsRxAggrSubframe)
52968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
52978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
52988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev=info->dev;
52998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
53008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
53018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rx_drvinfo_819x_usb  *driver_info = NULL;
53028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
53048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Get Rx Descriptor Information
53058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
53068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
53078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (bIsRxAggrSubframe)
53088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
53098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
53108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->Length = desc->Length ;
53118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->RxDrvInfoSize = desc->RxDrvInfoSize;
53128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->RxBufShift = 0; //RxBufShift = 2 in RxDesc, but usb didn't shift bytes in fact.
53138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bICV = desc->ICV;
53148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bCRC = desc->CRC32;
53158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bHwError = stats->bCRC|stats->bICV;
53168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
53178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else
53188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
53198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
53208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
53218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->Length = desc->Length;
53238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->RxDrvInfoSize = desc->RxDrvInfoSize;
53248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->RxBufShift = 0;//desc->Shift&0x03;
53258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bICV = desc->ICV;
53268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bCRC = desc->CRC32;
53278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bHwError = stats->bCRC|stats->bICV;
53288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//RTL8190 set this bit to indicate that Hw does not decrypt packet
53298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->Decrypted = !desc->SWDec;
53308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
53318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if((priv->ieee80211->pHTInfo->bCurrentHTSupport == true) && (priv->ieee80211->pairwise_key_type == KEY_TYPE_CCMP))
53338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
53348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bHwError = false;
53358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
53368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
53378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
53388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bHwError = stats->bCRC|stats->bICV;
53398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
53408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(stats->Length < 24 || stats->Length > MAX_8192U_RX_SIZE)
53428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bHwError |= 1;
53438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
53448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Get Driver Info
53458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
53468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// TODO: Need to verify it on FGPA platform
53478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Driver info are written to the RxBuffer following rx desc
53488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (stats->RxDrvInfoSize != 0) {
53498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		driver_info = (rx_drvinfo_819x_usb *)(skb->data + sizeof(rx_desc_819x_usb) + \
53508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats->RxBufShift);
53518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* unit: 0.5M */
53528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* TODO */
53538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(!stats->bHwError){
53548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u8	ret_rate;
53558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ret_rate = HwRateToMRate90(driver_info->RxHT, driver_info->RxRate);
53568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(ret_rate == 0xff)
53578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
53588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				// Abnormal Case: Receive CRC OK packet with Rx descriptor indicating non supported rate.
53598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				// Special Error Handling here, 2008.05.16, by Emily
53608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats->bHwError = 1;
53628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats->rate = MGN_1M;	//Set 1M rate by default
53638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}else
53648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
53658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats->rate = ret_rate;
53668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
53678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
53688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
53698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			stats->rate = 0x02;
53708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bShortPreamble = driver_info->SPLCP;
53728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		UpdateReceivedRateHistogramStatistics8190(dev, stats);
53758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bIsAMPDU = (driver_info->PartAggr==1);
53778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bFirstMPDU = (driver_info->PartAggr==1) && (driver_info->FirstAGGR==1);
53788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->TimeStampLow = driver_info->TSFL;
53798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// xiong mask it, 070514
53808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//pRfd->Status.TimeStampHigh = PlatformEFIORead4Byte(Adapter, TSFR+4);
53818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// stats->TimeStampHigh = read_nic_dword(dev,  TSFR+4);
53828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		UpdateRxPktTimeStamp8190(dev, stats);
53848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
53868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Rx A-MPDU
53878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
53888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(driver_info->FirstAGGR==1 || driver_info->PartAggr == 1)
53898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_RXDESC, "driver_info->FirstAGGR = %d, driver_info->PartAggr = %d\n",
53908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					driver_info->FirstAGGR, driver_info->PartAggr);
53918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
53938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
53948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	skb_pull(skb,sizeof(rx_desc_819x_usb));
53958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
53968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Get Total offset of MPDU Frame Body
53978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
53988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if((stats->RxBufShift + stats->RxDrvInfoSize) > 0) {
53998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		stats->bShift = 1;
54008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_pull(skb,stats->RxBufShift + stats->RxDrvInfoSize);
54018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
54028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
54048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* for the rx aggregated sub frame, the redundant space truelly contained in the packet */
54058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(bIsRxAggrSubframe) {
54068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_pull(skb, 8);
54078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
54088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
54098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* for debug 2008.5.29 */
54108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//added by vivi, for MP, 20080108
54128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->RxIs40MHzPacket = driver_info->BW;
54138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(stats->RxDrvInfoSize != 0)
54148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TranslateRxSignalStuff819xUsb(skb, stats, driver_info);
54158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
54178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangu32 GetRxPacketShiftBytes819xUsb(struct ieee80211_rx_stats  *Status, bool bIsRxAggrSubframe)
54198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
54208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
54218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (bIsRxAggrSubframe)
54228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
54238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			+ Status->RxBufShift + 8);
54248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
54258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
54268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
54278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				+ Status->RxBufShift);
54288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
54298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_rx_nomal(struct sk_buff* skb)
54318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
54328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
54338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev=info->dev;
54348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
54358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats stats = {
54368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.signal = 0,
54378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.noise = -98,
54388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.rate = 0,
54398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//      .mac_time = jiffies,
54408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.freq = IEEE80211_24GHZ_BAND,
54418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	};
54428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 rx_pkt_len = 0;
54438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
54448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	bool unicast_packet = false;
54458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
54468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct sk_buff *agg_skb = NULL;
54478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32  TotalLength = 0;
54488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32  TempDWord = 0;
54498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32  PacketLength = 0;
54508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32  PacketOccupiedLendth = 0;
54518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8   TempByte = 0;
54528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32  PacketShiftBytes = 0;
54538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
54548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8  PaddingBytes = 0;
54558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//add just for testing
54568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8   testing;
54578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
54598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* 20 is for ps-poll */
54618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
54628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
54638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TempByte = *(skb->data + sizeof(rx_desc_819x_usb));
54648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
54658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* first packet should not contain Rx aggregation header */
54668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		query_rxdesc_status(skb, &stats, false);
54678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* TODO */
54688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* hardware related info */
54698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
54708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (TempByte & BIT0) {
54718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			agg_skb = skb;
54728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//TotalLength = agg_skb->len - 4; /*sCrcLng*/
54738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			TotalLength = stats.Length - 4; /*sCrcLng*/
54748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//RT_TRACE(COMP_RECV, "%s:first aggregated packet!Length=%d\n",__FUNCTION__,TotalLength);
54758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* though the head pointer has passed this position  */
54768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			TempDWord = *(u32 *)(agg_skb->data - 4);
54778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			PacketLength = (u16)(TempDWord & 0x3FFF); /*sCrcLng*/
54788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			skb = dev_alloc_skb(PacketLength);
54798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			memcpy(skb_put(skb,PacketLength),agg_skb->data,PacketLength);
54808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, false);
54818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
54828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
54838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Process the MPDU recevied */
54848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		skb_trim(skb, skb->len - 4/*sCrcLng*/);
54858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rx_pkt_len = skb->len;
54878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
54888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		unicast_packet = false;
54898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
54908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//TODO
54918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
54928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//TODO
54938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}else {
54948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			/* unicast packet */
54958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			unicast_packet = true;
54968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
54978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
54988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
54998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			dev_kfree_skb_any(skb);
55008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		} else {
55018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->stats.rxoktotal++;
55028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(unicast_packet) {
55038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->stats.rxbytesunicast += rx_pkt_len;
55048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
55058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
55068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef USB_RX_AGGREGATION_SUPPORT
55078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		testing = 1;
55088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// (PipeIndex == 0) && (TempByte & BIT0) => TotalLength > 0.
55098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (TotalLength > 0) {
55108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			PacketOccupiedLendth = PacketLength + (PacketShiftBytes + 8);
55118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if ((PacketOccupiedLendth & 0xFF) != 0)
55128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				PacketOccupiedLendth = (PacketOccupiedLendth & 0xFFFFFF00) + 256;
55138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			PacketOccupiedLendth -= 8;
55148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			TempDWord = PacketOccupiedLendth - PacketShiftBytes; /*- PacketLength */
55158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if (agg_skb->len > TempDWord)
55168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				skb_pull(agg_skb, TempDWord);
55178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			else
55188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				agg_skb->len = 0;
55198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
55208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			while (agg_skb->len>=GetRxPacketShiftBytes819xUsb(&stats, true)) {
55218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				u8 tmpCRC = 0, tmpICV = 0;
55228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//RT_TRACE(COMP_RECV,"%s:aggred pkt,total_len = %d\n",__FUNCTION__,agg_skb->len);
55238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);
55248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpCRC = RxDescr->CRC32;
55258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				tmpICV = RxDescr->ICV;
55268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				memcpy(agg_skb->data, &agg_skb->data[44], 2);
55278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RxDescr->CRC32 = tmpCRC;
55288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RxDescr->ICV = tmpICV;
55298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
55308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
55318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats.signal = 0;
55328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats.noise = -98;
55338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats.rate = 0;
55348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				stats.freq = IEEE80211_24GHZ_BAND;
55358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				query_rxdesc_status(agg_skb, &stats, true);
55368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				PacketLength = stats.Length;
55378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
55388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(PacketLength > agg_skb->len) {
55398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					break;
55408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
55418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				/* Process the MPDU recevied */
55428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				skb = dev_alloc_skb(PacketLength);
55438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				memcpy(skb_put(skb,PacketLength),agg_skb->data, PacketLength);
55448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				skb_trim(skb, skb->len - 4/*sCrcLng*/);
55458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
55468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				rx_pkt_len = skb->len;
55478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
55488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				unicast_packet = false;
55498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
55508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					//TODO
55518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
55528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					//TODO
55538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}else {
55548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					/* unicast packet */
55558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					unicast_packet = true;
55568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
55578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
55588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					dev_kfree_skb_any(skb);
55598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				} else {
55608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					priv->stats.rxoktotal++;
55618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if(unicast_packet) {
55628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						priv->stats.rxbytesunicast += rx_pkt_len;
55638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					}
55648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
55658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				/* should trim the packet which has been copied to target skb */
55668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				skb_pull(agg_skb, PacketLength);
55678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, true);
55688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				PacketOccupiedLendth = PacketLength + PacketShiftBytes;
55698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if ((PacketOccupiedLendth & 0xFF) != 0) {
55708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					PaddingBytes = 256 - (PacketOccupiedLendth & 0xFF);
55718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if (agg_skb->len > PaddingBytes)
55728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						skb_pull(agg_skb, PaddingBytes);
55738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
55748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						agg_skb->len = 0;
55758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
55768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
55778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			dev_kfree_skb(agg_skb);
55788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
55798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
55808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	} else {
55818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		priv->stats.rxurberr++;
55828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		printk("actual_length:%d\n", skb->len);
55838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb_any(skb);
55848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
55858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
55868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
55878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
55888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid
55898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangrtl819xusb_process_received_packet(
55908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev,
55918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats *pstats
55928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	)
55938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
55948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	bool bfreerfd=false, bqueued=false;
55958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8* 	frame;
55968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16     frame_len=0;
55978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
55988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	u8			index = 0;
55998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	u8			TID = 0;
56008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//u16			seqnum = 0;
56018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//PRX_TS_RECORD	pts = NULL;
56028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Get shifted bytes of Starting address of 802.11 header. 2006.09.28, by Emily
56048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//porting by amy 080508
56058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	pstats->virtual_address += get_rxpacket_shiftbytes_819xusb(pstats);
56068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	frame = pstats->virtual_address;
56078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	frame_len = pstats->packetlength;
56088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef TODO	// by amy about HCT
56098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(!Adapter->bInHctTest)
56108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		CountRxErrStatistics(Adapter, pRfd);
56118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
56128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
56138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	#ifdef ENABLE_PS  //by amy for adding ps function in future
56148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_RF_POWER_STATE rtState;
56158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// When RF is off, we should not count the packet for hw/sw synchronize
56168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// reason, ie. there may be a duration while sw switch is changed and hw
56178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// switch is being changed. 2006.12.04, by shien chang.
56188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (u8* )(&rtState));
56198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (rtState == eRfOff)
56208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
56218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			return;
56228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
56238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	#endif
56248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->stats.rxframgment++;
56258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
56278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef TODO
56288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RmMonitorSignalStrength(Adapter, pRfd);
56298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
56308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* 2007/01/16 MH Add RX command packet handle here. */
56318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* 2007/03/01 MH We have to release RFD and return if rx pkt is cmd pkt. */
56328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (rtl819xusb_rx_command_packet(dev, pstats))
56338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
56348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		return;
56358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
56368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#ifdef SW_CRC_CHECK
56388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	SwCrcCheck();
56398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
56408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
56438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid query_rx_cmdpkt_desc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats)
56458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
56468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
56478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	struct net_device *dev=info->dev;
56488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
56498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;
56508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rx_drvinfo_819x_usb  *driver_info;
56518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
56538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Get Rx Descriptor Information
56548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
56558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->virtual_address = (u8*)skb->data;
56568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->Length = desc->Length;
56578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->RxDrvInfoSize = 0;
56588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->RxBufShift = 0;
56598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->packetlength = stats->Length-scrclng;
56608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->fraglength = stats->packetlength;
56618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->fragoffset = 0;
56628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	stats->ntotalfrag = 1;
56638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
56648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_rx_cmd(struct sk_buff *skb)
56678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
56688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct rtl8192_rx_info *info = (struct rtl8192_rx_info *)skb->cb;
56698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = info->dev;
56708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//int ret;
56718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	struct urb *rx_urb = info->urb;
56728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	/* TODO */
56738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct ieee80211_rx_stats stats = {
56748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.signal = 0,
56758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.noise = -98,
56768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.rate = 0,
56778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//      .mac_time = jiffies,
56788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		.freq = IEEE80211_24GHZ_BAND,
56798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	};
56808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE))
56828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
56838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		query_rx_cmdpkt_desc_status(skb,&stats);
56858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// this is to be done by amy 080508     prfd->queue_id = 1;
56868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
56898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//  Process the command packet received.
56908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//
56918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl819xusb_process_received_packet(dev,&stats);
56938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_kfree_skb_any(skb);
56958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
56968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
56978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		;
56988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
56998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
57018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
57038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
5704e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	struct sk_buff *skb;
57058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct rtl8192_rx_info *info;
57068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5707e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	while (NULL != (skb = skb_dequeue(&priv->skb_queue))) {
57088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		info = (struct rtl8192_rx_info *)skb->cb;
5709e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		switch (info->out_pipe) {
57108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Nomal packet pipe */
57118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case 3:
57128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				//RT_TRACE(COMP_RECV, "normal in-pipe index(%d)\n",info->out_pipe);
57138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				priv->IrpPendingCount--;
57148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				rtl8192_rx_nomal(skb);
57158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
57168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				/* Command packet pipe */
57188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case 9:
57198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RECV, "command in-pipe index(%d)\n",\
57208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						info->out_pipe);
57218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				rtl8192_rx_cmd(skb);
57238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
57248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			default: /* should never get here! */
57268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_ERR, "Unknown in-pipe index(%d)\n",\
57278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						info->out_pipe);
57288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				dev_kfree_skb(skb);
57298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
57308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
5732e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
57338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
57348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5735f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabstatic const struct net_device_ops rtl8192_netdev_ops = {
5736f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_open               = rtl8192_open,
5737f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_stop               = rtl8192_close,
5738f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_get_stats          = rtl8192_stats,
5739f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_tx_timeout         = tx_timeout,
5740f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_do_ioctl           = rtl8192_ioctl,
5741afc4b13df143122f99a0eb10bfefb216c2806de0Jiri Pirko	.ndo_set_rx_mode	= r8192_set_multicast,
5742f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_set_mac_address    = r8192_set_mac_adr,
5743f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_validate_addr      = eth_validate_addr,
5744f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_change_mtu         = eth_change_mtu,
5745f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab	.ndo_start_xmit         = ieee80211_xmit,
5746f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab};
57478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/****************************************************************************
57508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang     ---------------------------- USB_STUFF---------------------------
57518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*****************************************************************************/
57528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int __devinit rtl8192_usb_probe(struct usb_interface *intf,
57548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			 const struct usb_device_id *id)
57558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
57568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	unsigned long ioaddr = 0;
57578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = NULL;
57588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv= NULL;
57598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct usb_device *udev = interface_to_usbdev(intf);
57602fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	int ret;
5761e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	RT_TRACE(COMP_INIT, "Oops: i'm coming\n");
57628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	dev = alloc_ieee80211(sizeof(struct r8192_priv));
57642fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	if (dev == NULL)
57652fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov		return -ENOMEM;
57668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	usb_set_intfdata(intf, dev);
57688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	SET_NETDEV_DEV(dev, &intf->dev);
57698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv = ieee80211_priv(dev);
57708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->ieee80211 = netdev_priv(dev);
57718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->udev=udev;
57728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5773e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	dev->netdev_ops = &rtl8192_netdev_ops;
57748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5775e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	 //DMESG("Oops: i'm coming\n");
57768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#if WIRELESS_EXT >= 12
57778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#if WIRELESS_EXT < 17
5778e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	dev->get_wireless_stats = r8192_get_wireless_stats;
57798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
5780e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
57818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#endif
57828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	dev->type=ARPHRD_ETHER;
57838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	dev->watchdog_timeo = HZ*3;	//modified by john, 0805
57858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (dev_alloc_name(dev, ifname) < 0){
5787e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
57888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ifname = "wlan%d";
57898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		dev_alloc_name(dev, ifname);
5790e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
57918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
57928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Driver probe completed1\n");
57938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(rtl8192_init(dev)!=0){
57948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "Initialization failed");
57952fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov		ret = -ENODEV;
57968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		goto fail;
57978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
57988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	netif_carrier_off(dev);
57998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	netif_stop_queue(dev);
58008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58012fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	ret = register_netdev(dev);
58022fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	if (ret)
58032fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov		goto fail2;
58042fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov
58058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
58068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_proc_init_one(dev);
58078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Driver probe completed\n");
58108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return 0;
58118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58122fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikovfail2:
58132fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	rtl8192_down(dev);
5814e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	kfree(priv->pFirmware);
5815e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin	priv->pFirmware = NULL;
58162fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	rtl8192_usb_deleteendpoints(dev);
58172fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	destroy_workqueue(priv->priv_wq);
58182fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	mdelay(10);
58198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangfail:
58208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	free_ieee80211(dev);
58218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_ERR, "wlan driver load failed\n");
58232fac6c290f9e7ac98256e9deaa668f6c2c305cf2Vasiliy Kulikov	return ret;
58248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
58258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//detach all the work and timer structure declared or inititialize in r8192U_init function.
58278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_cancel_deferred_work(struct r8192_priv* priv)
58288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
58298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cancel_work_sync(&priv->reset_wq);
58318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cancel_delayed_work(&priv->watch_dog_wq);
58328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cancel_delayed_work(&priv->update_beacon_wq);
58338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	cancel_work_sync(&priv->qos_activate);
58348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//cancel_work_sync(&priv->SetBWModeWorkItem);
58358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//cancel_work_sync(&priv->SwChnlWorkItem);
58368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
58388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void __devexit rtl8192_usb_disconnect(struct usb_interface *intf)
58418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
58428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct net_device *dev = usb_get_intfdata(intf);
58438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
5845e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if(dev){
58468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		unregister_netdev(dev);
58488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_DOWN, "=============>wlan driver to be removed\n");
58508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_proc_remove_one(dev);
58518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rtl8192_down(dev);
5853e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin		kfree(priv->pFirmware);
5854e72714fb20b2bac88e6bc06401a124243791ca08Ilia Mirkin		priv->pFirmware = NULL;
58558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	priv->rf_close(dev);
58568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//		rtl8192_SetRFPowerState(dev, eRfOff);
58578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_usb_deleteendpoints(dev);
58588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		destroy_workqueue(priv->priv_wq);
58598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//rtl8192_irq_disable(dev);
58608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//rtl8192_reset(dev);
58618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		mdelay(10);
58628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
58648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	free_ieee80211(dev);
58658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_DOWN, "wlan driver removed\n");
58668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
58678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
5868f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab/* fun with the built-in ieee80211 stack... */
5869f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern int ieee80211_debug_init(void);
5870f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern void ieee80211_debug_exit(void);
5871f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern int ieee80211_crypto_init(void);
5872f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern void ieee80211_crypto_deinit(void);
5873f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern int ieee80211_crypto_tkip_init(void);
5874f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern void ieee80211_crypto_tkip_exit(void);
5875f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern int ieee80211_crypto_ccmp_init(void);
5876f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern void ieee80211_crypto_ccmp_exit(void);
5877f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern int ieee80211_crypto_wep_init(void);
5878f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehabextern void ieee80211_crypto_wep_exit(void);
58798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic int __init rtl8192_usb_module_init(void)
58818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
5882e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	int ret;
5883f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab
5884f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab#ifdef CONFIG_IEEE80211_DEBUG
5885e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	ret = ieee80211_debug_init();
5886e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (ret) {
5887e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk(KERN_ERR "ieee80211_debug_init() failed %d\n", ret);
5888e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
5889e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5890f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab#endif
5891e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	ret = ieee80211_crypto_init();
5892e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (ret) {
5893e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
5894e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
5895e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5896f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab
5897e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	ret = ieee80211_crypto_tkip_init();
5898e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (ret) {
5899e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n",
5900e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			ret);
5901e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
5902e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5903f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab
5904e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	ret = ieee80211_crypto_ccmp_init();
5905e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (ret) {
5906e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n",
5907e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			ret);
5908e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
5909e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5910f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab
5911e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	ret = ieee80211_crypto_wep_init();
5912e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	if (ret) {
5913e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
5914e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		return ret;
5915e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
5916f61fb9356d20977258bb59a8d9f1857d2c58ac98Mauro Carvalho Chehab
59178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
59188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
59198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Initializing module");
59208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
59218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_proc_module_init();
59228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return usb_register(&rtl8192_usb_driver);
59238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
59248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangstatic void __exit rtl8192_usb_module_exit(void)
59278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
59288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	usb_deregister(&rtl8192_usb_driver);
59298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_DOWN, "Exiting");
59318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	rtl8192_proc_module_remove();
59328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
59338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid rtl8192_try_wake_queue(struct net_device *dev, int pri)
59368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
59378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	unsigned long flags;
59388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	short enough_desc;
59398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
59408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	spin_lock_irqsave(&priv->tx_lock,flags);
59428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	enough_desc = check_nic_enough_desc(dev,pri);
5943e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	spin_unlock_irqrestore(&priv->tx_lock,flags);
59448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(enough_desc)
59468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ieee80211_wake_queue(priv->ieee80211);
59478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
59488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid EnableHWSecurityConfig8192(struct net_device *dev)
59508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
5951e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	u8 SECR_value = 0x0;
59528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
59538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	 struct ieee80211_device* ieee = priv->ieee80211;
59548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
59558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
59568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
59578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_RxUseDK;
59588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_TxUseDK;
59598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
59608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
59618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
59628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_RxUseDK;
59638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value |= SCR_TxUseDK;
59648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
5965e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	//add HWSec active enable here.
59668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//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
59678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	ieee->hwsec_active = 1;
59698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	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
59718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
59728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		ieee->hwsec_active = 0;
59738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		SECR_value &= ~SCR_RxDecEnable;
59748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
59758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__, \
59768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
59778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
5978e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab		write_nic_byte(dev, SECR,  SECR_value);//SECR_value |  SCR_UseDK );
5979e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab	}
59808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
59818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid setKey(	struct net_device *dev,
59848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 EntryNo,
59858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 KeyIndex,
59868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u16 KeyType,
59878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 *MacAddr,
59888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u8 DefaultKey,
59898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		u32 *KeyContent )
59908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
59918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 TargetCommand = 0;
59928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 TargetContent = 0;
59938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 usConfig = 0;
59948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 i;
59958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (EntryNo >= TOTAL_CAM_ENTRY)
59968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
59978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
59980ee9f67c4028500a4348e8bc87ee7ec1139b8259Joe Perches	RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", dev,EntryNo, KeyIndex, KeyType, MacAddr);
59998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if (DefaultKey)
60018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		usConfig |= BIT15 | (KeyType<<2);
60028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	else
60038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
60048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang//	usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
60058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(i=0 ; i<CAM_CONTENT_COUNT; i++){
60088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TargetCommand  = i+CAM_CONTENT_COUNT*EntryNo;
60098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TargetCommand |= BIT31|BIT16;
60108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(i==0){//MAC|Config
60128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			TargetContent = (u32)(*(MacAddr+0)) << 16|
60138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(u32)(*(MacAddr+1)) << 24|
60148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					(u32)usConfig;
60158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			write_nic_dword(dev, WCAMI, TargetContent);
60178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			write_nic_dword(dev, RWCAM, TargetCommand);
60188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//		printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
60198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
60208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else if(i==1){//MAC
6021e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab			TargetContent = (u32)(*(MacAddr+2)) 	 |
6022e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab					(u32)(*(MacAddr+3)) <<  8|
6023e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab					(u32)(*(MacAddr+4)) << 16|
6024e406322b4b963e622f41d76193d8ca9e5435adb8Mauro Carvalho Chehab					(u32)(*(MacAddr+5)) << 24;
60258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			write_nic_dword(dev, WCAMI, TargetContent);
60268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			write_nic_dword(dev, RWCAM, TargetCommand);
60278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
60288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else {
60298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			//Key Material
60308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			if(KeyContent !=NULL){
60318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
60328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			write_nic_dword(dev, RWCAM, TargetCommand);
60338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
60348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
60358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
60368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
60388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
60398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/***************************************************************************
60408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang     ------------------- module init / exit stubs ----------------
60418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang****************************************************************************/
60428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangmodule_init(rtl8192_usb_module_init);
60438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangmodule_exit(rtl8192_usb_module_exit);
6044