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