aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rt2860
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2009-12-11 15:23:13 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-12-11 15:23:13 -0500
commit66cd8d6ec97bbfac53b5e67df9ef4668c3f96085 (patch)
treec02aa3e30ffa985055c417819fce0600b6fc95f4 /drivers/staging/rt2860
parent460bb8df1e910a8c5d36ad363fbc1f0164cf0b85 (diff)
Staging: rt28x0: run *.c files through Lindent
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/rt2860')
-rw-r--r--drivers/staging/rt2860/chips/rt3070.c74
-rw-r--r--drivers/staging/rt2860/chips/rt3090.c32
-rw-r--r--drivers/staging/rt2860/chips/rt30xx.c273
-rw-r--r--drivers/staging/rt2860/pci_main_dev.c1016
-rw-r--r--drivers/staging/rt2860/rt_linux.c1067
-rw-r--r--drivers/staging/rt2860/rt_main_dev.c399
-rw-r--r--drivers/staging/rt2860/rt_pci_rbus.c481
-rw-r--r--drivers/staging/rt2860/rt_usb.c649
-rw-r--r--drivers/staging/rt2860/sta_ioctl.c3437
-rw-r--r--drivers/staging/rt2860/usb_main_dev.c699
10 files changed, 4011 insertions, 4116 deletions
diff --git a/drivers/staging/rt2860/chips/rt3070.c b/drivers/staging/rt2860/chips/rt3070.c
index 5a3e668601a..eb3b214add2 100644
--- a/drivers/staging/rt2860/chips/rt3070.c
+++ b/drivers/staging/rt2860/chips/rt3070.c
@@ -39,12 +39,10 @@
39 39
40#include "../rt_config.h" 40#include "../rt_config.h"
41 41
42
43#ifndef RTMP_RF_RW_SUPPORT 42#ifndef RTMP_RF_RW_SUPPORT
44#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" 43#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
45#endif // RTMP_RF_RW_SUPPORT // 44#endif // RTMP_RF_RW_SUPPORT //
46 45
47
48VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) 46VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
49{ 47{
50 INT i; 48 INT i;
@@ -52,61 +50,55 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
52 50
53 // Driver must read EEPROM to get RfIcType before initial RF registers 51 // Driver must read EEPROM to get RfIcType before initial RF registers
54 // Initialize RF register to default value 52 // Initialize RF register to default value
55 if (IS_RT3070(pAd) || IS_RT3071(pAd)) 53 if (IS_RT3070(pAd) || IS_RT3071(pAd)) {
56 {
57 // Init RF calibration 54 // Init RF calibration
58 // Driver should toggle RF R30 bit7 before init RF registers 55 // Driver should toggle RF R30 bit7 before init RF registers
59 UINT32 RfReg = 0; 56 UINT32 RfReg = 0;
60 UINT32 data; 57 UINT32 data;
61 58
62 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg); 59 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR) & RfReg);
63 RfReg |= 0x80; 60 RfReg |= 0x80;
64 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); 61 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
65 RTMPusecDelay(1000); 62 RTMPusecDelay(1000);
66 RfReg &= 0x7F; 63 RfReg &= 0x7F;
67 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); 64 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
68 65
69 // Initialize RF register to default value 66 // Initialize RF register to default value
70 for (i = 0; i < NUM_RF_REG_PARMS; i++) 67 for (i = 0; i < NUM_RF_REG_PARMS; i++) {
71 { 68 RT30xxWriteRFRegister(pAd,
72 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value); 69 RT30xx_RFRegTable[i].Register,
70 RT30xx_RFRegTable[i].Value);
73 } 71 }
74 72
75 // add by johnli 73 // add by johnli
76 if (IS_RT3070(pAd)) 74 if (IS_RT3070(pAd)) {
77 {
78 // 75 //
79 // The DAC issue(LDO_CFG0) has been fixed in RT3070(F). 76 // The DAC issue(LDO_CFG0) has been fixed in RT3070(F).
80 // The voltage raising patch is no longer needed for RT3070(F) 77 // The voltage raising patch is no longer needed for RT3070(F)
81 // 78 //
82 if ((pAd->MACVersion & 0xffff) < 0x0201) 79 if ((pAd->MACVersion & 0xffff) < 0x0201) {
83 {
84 // Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate 80 // Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
85 RTUSBReadMACRegister(pAd, LDO_CFG0, &data); 81 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
86 data = ((data & 0xF0FFFFFF) | 0x0D000000); 82 data = ((data & 0xF0FFFFFF) | 0x0D000000);
87 RTUSBWriteMACRegister(pAd, LDO_CFG0, data); 83 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
88 } 84 }
89 } 85 } else if (IS_RT3071(pAd)) {
90 else if (IS_RT3071(pAd))
91 {
92 // Driver should set RF R6 bit6 on before init RF registers 86 // Driver should set RF R6 bit6 on before init RF registers
93 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg); 87 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR) & RfReg);
94 RfReg |= 0x40; 88 RfReg |= 0x40;
95 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg); 89 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR) RfReg);
96 90
97 // init R31 91 // init R31
98 RT30xxWriteRFRegister(pAd, RF_R31, 0x14); 92 RT30xxWriteRFRegister(pAd, RF_R31, 0x14);
99 93
100 // RT3071 version E has fixed this issue 94 // RT3071 version E has fixed this issue
101 if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) 95 if ((pAd->NicConfig2.field.DACTestBit == 1)
102 { 96 && ((pAd->MACVersion & 0xffff) < 0x0211)) {
103 // patch tx EVM issue temporarily 97 // patch tx EVM issue temporarily
104 RTUSBReadMACRegister(pAd, LDO_CFG0, &data); 98 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
105 data = ((data & 0xE0FFFFFF) | 0x0D000000); 99 data = ((data & 0xE0FFFFFF) | 0x0D000000);
106 RTUSBWriteMACRegister(pAd, LDO_CFG0, data); 100 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
107 } 101 } else {
108 else
109 {
110 RTMP_IO_READ32(pAd, LDO_CFG0, &data); 102 RTMP_IO_READ32(pAd, LDO_CFG0, &data);
111 data = ((data & 0xE0FFFFFF) | 0x01000000); 103 data = ((data & 0xE0FFFFFF) | 0x01000000);
112 RTMP_IO_WRITE32(pAd, LDO_CFG0, data); 104 RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
@@ -117,8 +109,7 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
117 data &= ~(0x20); 109 data &= ~(0x20);
118 RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data); 110 RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);
119 } 111 }
120 112 //For RF filter Calibration
121 //For RF filter Calibration
122 RTMPFilterCalibration(pAd); 113 RTMPFilterCalibration(pAd);
123 114
124 // Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration() 115 // Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration()
@@ -126,15 +117,12 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
126 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). 117 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
127 // Raising RF voltage is no longer needed for RT3070(F) 118 // Raising RF voltage is no longer needed for RT3070(F)
128 // 119 //
129 if ((IS_RT3070(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0201)) 120 if ((IS_RT3070(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0201)) {
130 {
131 RT30xxWriteRFRegister(pAd, RF_R27, 0x3); 121 RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
132 } 122 } else if ((IS_RT3071(pAd))
133 else if ((IS_RT3071(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0211)) 123 && ((pAd->MACVersion & 0xffff) < 0x0211)) {
134 {
135 RT30xxWriteRFRegister(pAd, RF_R27, 0x3); 124 RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
136 } 125 }
137
138 // set led open drain enable 126 // set led open drain enable
139 RTUSBReadMACRegister(pAd, OPT_14, &data); 127 RTUSBReadMACRegister(pAd, OPT_14, &data);
140 data |= 0x01; 128 data |= 0x01;
@@ -145,29 +133,25 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
145 RT30xxReadRFRegister(pAd, RF_R17, &RFValue); 133 RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
146 RFValue &= (~0x08); 134 RFValue &= (~0x08);
147 // to fix rx long range issue 135 // to fix rx long range issue
148 if (pAd->NicConfig2.field.ExternalLNAForG == 0) 136 if (pAd->NicConfig2.field.ExternalLNAForG == 0) {
149 { 137 if ((IS_RT3071(pAd)
150 if ((IS_RT3071(pAd) && ((pAd->MACVersion & 0xffff) >= 0x0211)) || IS_RT3070(pAd)) 138 && ((pAd->MACVersion & 0xffff) >= 0x0211))
151 { 139 || IS_RT3070(pAd)) {
152 RFValue |= 0x20; 140 RFValue |= 0x20;
153 } 141 }
154 } 142 }
155 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h 143 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
156 if (pAd->TxMixerGain24G >= 1) 144 if (pAd->TxMixerGain24G >= 1) {
157 { 145 RFValue &= (~0x7); // clean bit [2:0]
158 RFValue &= (~0x7); // clean bit [2:0]
159 RFValue |= pAd->TxMixerGain24G; 146 RFValue |= pAd->TxMixerGain24G;
160 } 147 }
161 RT30xxWriteRFRegister(pAd, RF_R17, RFValue); 148 RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
162 149
163 if (IS_RT3071(pAd)) 150 if (IS_RT3071(pAd)) {
164 {
165 // add by johnli, RF power sequence setup, load RF normal operation-mode setup 151 // add by johnli, RF power sequence setup, load RF normal operation-mode setup
166 RT30xxLoadRFNormalModeSetup(pAd); 152 RT30xxLoadRFNormalModeSetup(pAd);
167 } 153 } else if (IS_RT3070(pAd)) {
168 else if (IS_RT3070(pAd)) 154 /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem */
169 {
170 /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/
171 // LDORF_VC, RF R27 register Bit 2 to 0 155 // LDORF_VC, RF R27 register Bit 2 to 0
172 RT30xxReadRFRegister(pAd, RF_R27, &RFValue); 156 RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
173 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). 157 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
diff --git a/drivers/staging/rt2860/chips/rt3090.c b/drivers/staging/rt2860/chips/rt3090.c
index 35c549dc4ce..143529422f8 100644
--- a/drivers/staging/rt2860/chips/rt3090.c
+++ b/drivers/staging/rt2860/chips/rt3090.c
@@ -39,44 +39,39 @@
39 39
40#include "../rt_config.h" 40#include "../rt_config.h"
41 41
42
43#ifndef RTMP_RF_RW_SUPPORT 42#ifndef RTMP_RF_RW_SUPPORT
44#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" 43#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
45#endif // RTMP_RF_RW_SUPPORT // 44#endif // RTMP_RF_RW_SUPPORT //
46 45
47
48VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd) 46VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd)
49{ 47{
50 INT i; 48 INT i;
51 // Driver must read EEPROM to get RfIcType before initial RF registers 49 // Driver must read EEPROM to get RfIcType before initial RF registers
52 // Initialize RF register to default value 50 // Initialize RF register to default value
53 if (IS_RT3090(pAd)) 51 if (IS_RT3090(pAd)) {
54 {
55 // Init RF calibration 52 // Init RF calibration
56 // Driver should toggle RF R30 bit7 before init RF registers 53 // Driver should toggle RF R30 bit7 before init RF registers
57 UINT32 RfReg = 0, data; 54 UINT32 RfReg = 0, data;
58 55
59 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg); 56 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR) & RfReg);
60 RfReg |= 0x80; 57 RfReg |= 0x80;
61 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); 58 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
62 RTMPusecDelay(1000); 59 RTMPusecDelay(1000);
63 RfReg &= 0x7F; 60 RfReg &= 0x7F;
64 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); 61 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
65 62
66 // init R24, R31 63 // init R24, R31
67 RT30xxWriteRFRegister(pAd, RF_R24, 0x0F); 64 RT30xxWriteRFRegister(pAd, RF_R24, 0x0F);
68 RT30xxWriteRFRegister(pAd, RF_R31, 0x0F); 65 RT30xxWriteRFRegister(pAd, RF_R31, 0x0F);
69 66
70 // RT309x version E has fixed this issue 67 // RT309x version E has fixed this issue
71 if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) 68 if ((pAd->NicConfig2.field.DACTestBit == 1)
72 { 69 && ((pAd->MACVersion & 0xffff) < 0x0211)) {
73 // patch tx EVM issue temporarily 70 // patch tx EVM issue temporarily
74 RTMP_IO_READ32(pAd, LDO_CFG0, &data); 71 RTMP_IO_READ32(pAd, LDO_CFG0, &data);
75 data = ((data & 0xE0FFFFFF) | 0x0D000000); 72 data = ((data & 0xE0FFFFFF) | 0x0D000000);
76 RTMP_IO_WRITE32(pAd, LDO_CFG0, data); 73 RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
77 } 74 } else {
78 else
79 {
80 RTMP_IO_READ32(pAd, LDO_CFG0, &data); 75 RTMP_IO_READ32(pAd, LDO_CFG0, &data);
81 data = ((data & 0xE0FFFFFF) | 0x01000000); 76 data = ((data & 0xE0FFFFFF) | 0x01000000);
82 RTMP_IO_WRITE32(pAd, LDO_CFG0, data); 77 RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
@@ -88,15 +83,16 @@ VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd)
88 RTMP_IO_WRITE32(pAd, GPIO_SWITCH, data); 83 RTMP_IO_WRITE32(pAd, GPIO_SWITCH, data);
89 84
90 // Initialize RF register to default value 85 // Initialize RF register to default value
91 for (i = 0; i < NUM_RF_REG_PARMS; i++) 86 for (i = 0; i < NUM_RF_REG_PARMS; i++) {
92 { 87 RT30xxWriteRFRegister(pAd,
93 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value); 88 RT30xx_RFRegTable[i].Register,
89 RT30xx_RFRegTable[i].Value);
94 } 90 }
95 91
96 // Driver should set RF R6 bit6 on before calibration 92 // Driver should set RF R6 bit6 on before calibration
97 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg); 93 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR) & RfReg);
98 RfReg |= 0x40; 94 RfReg |= 0x40;
99 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg); 95 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR) RfReg);
100 96
101 //For RF filter Calibration 97 //For RF filter Calibration
102 RTMPFilterCalibration(pAd); 98 RTMPFilterCalibration(pAd);
diff --git a/drivers/staging/rt2860/chips/rt30xx.c b/drivers/staging/rt2860/chips/rt30xx.c
index c69fab56898..940f731a61c 100644
--- a/drivers/staging/rt2860/chips/rt30xx.c
+++ b/drivers/staging/rt2860/chips/rt30xx.c
@@ -35,73 +35,82 @@
35 -------- ---------- ---------------------------------------------- 35 -------- ---------- ----------------------------------------------
36*/ 36*/
37 37
38
39#ifdef RT30xx 38#ifdef RT30xx
40 39
41
42#ifndef RTMP_RF_RW_SUPPORT 40#ifndef RTMP_RF_RW_SUPPORT
43#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" 41#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
44#endif // RTMP_RF_RW_SUPPORT // 42#endif // RTMP_RF_RW_SUPPORT //
45 43
46#include "../rt_config.h" 44#include "../rt_config.h"
47 45
48
49// 46//
50// RF register initialization set 47// RF register initialization set
51// 48//
52REG_PAIR RT30xx_RFRegTable[] = { 49REG_PAIR RT30xx_RFRegTable[] = {
53 {RF_R04, 0x40}, 50 {RF_R04, 0x40}
54 {RF_R05, 0x03}, 51 ,
55 {RF_R06, 0x02}, 52 {RF_R05, 0x03}
56 {RF_R07, 0x70}, 53 ,
57 {RF_R09, 0x0F}, 54 {RF_R06, 0x02}
58 {RF_R10, 0x41}, 55 ,
59 {RF_R11, 0x21}, 56 {RF_R07, 0x70}
60 {RF_R12, 0x7B}, 57 ,
61 {RF_R14, 0x90}, 58 {RF_R09, 0x0F}
62 {RF_R15, 0x58}, 59 ,
63 {RF_R16, 0xB3}, 60 {RF_R10, 0x41}
64 {RF_R17, 0x92}, 61 ,
65 {RF_R18, 0x2C}, 62 {RF_R11, 0x21}
66 {RF_R19, 0x02}, 63 ,
67 {RF_R20, 0xBA}, 64 {RF_R12, 0x7B}
68 {RF_R21, 0xDB}, 65 ,
69 {RF_R24, 0x16}, 66 {RF_R14, 0x90}
70 {RF_R25, 0x01}, 67 ,
71 {RF_R29, 0x1F}, 68 {RF_R15, 0x58}
69 ,
70 {RF_R16, 0xB3}
71 ,
72 {RF_R17, 0x92}
73 ,
74 {RF_R18, 0x2C}
75 ,
76 {RF_R19, 0x02}
77 ,
78 {RF_R20, 0xBA}
79 ,
80 {RF_R21, 0xDB}
81 ,
82 {RF_R24, 0x16}
83 ,
84 {RF_R25, 0x01}
85 ,
86 {RF_R29, 0x1F}
87 ,
72}; 88};
73 89
74UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR)); 90UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR));
75 91
76
77
78// Antenna divesity use GPIO3 and EESK pin for control 92// Antenna divesity use GPIO3 and EESK pin for control
79// Antenna and EEPROM access are both using EESK pin, 93// Antenna and EEPROM access are both using EESK pin,
80// Therefor we should avoid accessing EESK at the same time 94// Therefor we should avoid accessing EESK at the same time
81// Then restore antenna after EEPROM access 95// Then restore antenna after EEPROM access
82// The original name of this function is AsicSetRxAnt(), now change to 96// The original name of this function is AsicSetRxAnt(), now change to
83//VOID AsicSetRxAnt( 97//VOID AsicSetRxAnt(
84VOID RT30xxSetRxAnt( 98VOID RT30xxSetRxAnt(IN PRTMP_ADAPTER pAd, IN UCHAR Ant)
85 IN PRTMP_ADAPTER pAd,
86 IN UCHAR Ant)
87{ 99{
88 UINT32 Value; 100 UINT32 Value;
89#ifdef RTMP_MAC_PCI 101#ifdef RTMP_MAC_PCI
90 UINT32 x; 102 UINT32 x;
91#endif 103#endif
92 104
93 if ((pAd->EepromAccess) || 105 if ((pAd->EepromAccess) ||
94 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) || 106 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||
95 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) || 107 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) ||
96 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) || 108 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) ||
97 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) 109 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
98 {
99 return; 110 return;
100 } 111 }
101
102 // the antenna selection is through firmware and MAC register(GPIO3) 112 // the antenna selection is through firmware and MAC register(GPIO3)
103 if (Ant == 0) 113 if (Ant == 0) {
104 {
105 // Main antenna 114 // Main antenna
106#ifdef RTMP_MAC_PCI 115#ifdef RTMP_MAC_PCI
107 RTMP_IO_READ32(pAd, E2PROM_CSR, &x); 116 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
@@ -114,10 +123,9 @@ VOID RT30xxSetRxAnt(
114 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value); 123 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value);
115 Value &= ~(0x0808); 124 Value &= ~(0x0808);
116 RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); 125 RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
117 DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to main antenna\n")); 126 DBGPRINT_RAW(RT_DEBUG_TRACE,
118 } 127 ("AsicSetRxAnt, switch to main antenna\n"));
119 else 128 } else {
120 {
121 // Aux antenna 129 // Aux antenna
122#ifdef RTMP_MAC_PCI 130#ifdef RTMP_MAC_PCI
123 RTMP_IO_READ32(pAd, E2PROM_CSR, &x); 131 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
@@ -130,11 +138,11 @@ VOID RT30xxSetRxAnt(
130 Value &= ~(0x0808); 138 Value &= ~(0x0808);
131 Value |= 0x08; 139 Value |= 0x08;
132 RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); 140 RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
133 DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to aux antenna\n")); 141 DBGPRINT_RAW(RT_DEBUG_TRACE,
142 ("AsicSetRxAnt, switch to aux antenna\n"));
134 } 143 }
135} 144}
136 145
137
138/* 146/*
139 ======================================================================== 147 ========================================================================
140 148
@@ -151,46 +159,43 @@ VOID RT30xxSetRxAnt(
151 159
152 ======================================================================== 160 ========================================================================
153*/ 161*/
154VOID RTMPFilterCalibration( 162VOID RTMPFilterCalibration(IN PRTMP_ADAPTER pAd)
155 IN PRTMP_ADAPTER pAd)
156{ 163{
157 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0; 164 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue = 0;
158 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0; 165 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
159 UCHAR RF_R24_Value = 0; 166 UCHAR RF_R24_Value = 0;
160 167
161 // Give bbp filter initial value 168 // Give bbp filter initial value
162 pAd->Mlme.CaliBW20RfR24 = 0x1F; 169 pAd->Mlme.CaliBW20RfR24 = 0x1F;
163 pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40 170 pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
164 171
165 do 172 do {
166 {
167 if (loop == 1) //BandWidth = 40 MHz 173 if (loop == 1) //BandWidth = 40 MHz
168 { 174 {
169 // Write 0x27 to RF_R24 to program filter 175 // Write 0x27 to RF_R24 to program filter
170 RF_R24_Value = 0x27; 176 RF_R24_Value = 0x27;
171 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); 177 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
172 if (IS_RT3090(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd)) 178 if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
173 FilterTarget = 0x15; 179 FilterTarget = 0x15;
174 else 180 else
175 FilterTarget = 0x19; 181 FilterTarget = 0x19;
176 182
177 // when calibrate BW40, BBP mask must set to BW40. 183 // when calibrate BW40, BBP mask must set to BW40.
178 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); 184 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
179 BBPValue&= (~0x18); 185 BBPValue &= (~0x18);
180 BBPValue|= (0x10); 186 BBPValue |= (0x10);
181 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); 187 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
182 188
183 // set to BW40 189 // set to BW40
184 RT30xxReadRFRegister(pAd, RF_R31, &value); 190 RT30xxReadRFRegister(pAd, RF_R31, &value);
185 value |= 0x20; 191 value |= 0x20;
186 RT30xxWriteRFRegister(pAd, RF_R31, value); 192 RT30xxWriteRFRegister(pAd, RF_R31, value);
187 } 193 } else //BandWidth = 20 MHz
188 else //BandWidth = 20 MHz
189 { 194 {
190 // Write 0x07 to RF_R24 to program filter 195 // Write 0x07 to RF_R24 to program filter
191 RF_R24_Value = 0x07; 196 RF_R24_Value = 0x07;
192 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); 197 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
193 if (IS_RT3090(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd)) 198 if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
194 FilterTarget = 0x13; 199 FilterTarget = 0x13;
195 else 200 else
196 FilterTarget = 0x16; 201 FilterTarget = 0x16;
@@ -209,8 +214,7 @@ VOID RTMPFilterCalibration(
209 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone 214 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
210 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0); 215 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
211 216
212 do 217 do {
213 {
214 // Write 0x90 to BBP_R25 to transmit test tone 218 // Write 0x90 to BBP_R25 to transmit test tone
215 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90); 219 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
216 220
@@ -224,8 +228,7 @@ VOID RTMPFilterCalibration(
224 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone 228 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
225 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06); 229 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);
226 230
227 while(TRUE) 231 while (TRUE) {
228 {
229 // Write 0x90 to BBP_R25 to transmit test tone 232 // Write 0x90 to BBP_R25 to transmit test tone
230 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90); 233 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
231 234
@@ -233,59 +236,47 @@ VOID RTMPFilterCalibration(
233 RTMPusecDelay(1000); 236 RTMPusecDelay(1000);
234 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value); 237 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
235 value &= 0xFF; 238 value &= 0xFF;
236 if ((R55x - value) < FilterTarget) 239 if ((R55x - value) < FilterTarget) {
237 { 240 RF_R24_Value++;
238 RF_R24_Value ++; 241 } else if ((R55x - value) == FilterTarget) {
239 } 242 RF_R24_Value++;
240 else if ((R55x - value) == FilterTarget) 243 count++;
241 { 244 } else {
242 RF_R24_Value ++;
243 count ++;
244 }
245 else
246 {
247 break; 245 break;
248 } 246 }
249 247
250 // prevent infinite loop cause driver hang. 248 // prevent infinite loop cause driver hang.
251 if (loopcnt++ > 100) 249 if (loopcnt++ > 100) {
252 { 250 DBGPRINT(RT_DEBUG_ERROR,
253 DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt)); 251 ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating",
252 loopcnt));
254 break; 253 break;
255 } 254 }
256
257 // Write RF_R24 to program filter 255 // Write RF_R24 to program filter
258 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); 256 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
259 } 257 }
260 258
261 if (count > 0) 259 if (count > 0) {
262 {
263 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0)); 260 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
264 } 261 }
265
266 // Store for future usage 262 // Store for future usage
267 if (loopcnt < 100) 263 if (loopcnt < 100) {
268 { 264 if (loop++ == 0) {
269 if (loop++ == 0)
270 {
271 //BandWidth = 20 MHz 265 //BandWidth = 20 MHz
272 pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value; 266 pAd->Mlme.CaliBW20RfR24 = (UCHAR) RF_R24_Value;
273 } 267 } else {
274 else
275 {
276 //BandWidth = 40 MHz 268 //BandWidth = 40 MHz
277 pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value; 269 pAd->Mlme.CaliBW40RfR24 = (UCHAR) RF_R24_Value;
278 break; 270 break;
279 } 271 }
280 } 272 } else
281 else
282 break; 273 break;
283 274
284 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); 275 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
285 276
286 // reset count 277 // reset count
287 count = 0; 278 count = 0;
288 } while(TRUE); 279 } while (TRUE);
289 280
290 // 281 //
291 // Set back to initial state 282 // Set back to initial state
@@ -298,13 +289,14 @@ VOID RTMPFilterCalibration(
298 289
299 // set BBP back to BW20 290 // set BBP back to BW20
300 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); 291 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
301 BBPValue&= (~0x18); 292 BBPValue &= (~0x18);
302 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); 293 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
303 294
304 DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24)); 295 DBGPRINT(RT_DEBUG_TRACE,
296 ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n",
297 pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
305} 298}
306 299
307
308// add by johnli, RF power sequence setup 300// add by johnli, RF power sequence setup
309/* 301/*
310 ========================================================================== 302 ==========================================================================
@@ -314,8 +306,7 @@ VOID RTMPFilterCalibration(
314 306
315 ========================================================================== 307 ==========================================================================
316 */ 308 */
317VOID RT30xxLoadRFNormalModeSetup( 309VOID RT30xxLoadRFNormalModeSetup(IN PRTMP_ADAPTER pAd)
318 IN PRTMP_ADAPTER pAd)
319{ 310{
320 UCHAR RFValue; 311 UCHAR RFValue;
321 312
@@ -330,22 +321,22 @@ VOID RT30xxLoadRFNormalModeSetup(
330 RT30xxWriteRFRegister(pAd, RF_R15, RFValue); 321 RT30xxWriteRFRegister(pAd, RF_R15, RFValue);
331 322
332 /* move to NICInitRT30xxRFRegisters 323 /* move to NICInitRT30xxRFRegisters
333 // TX_LO1_en, RF R17 register Bit 3 to 0 324 // TX_LO1_en, RF R17 register Bit 3 to 0
334 RT30xxReadRFRegister(pAd, RF_R17, &RFValue); 325 RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
335 RFValue &= (~0x08); 326 RFValue &= (~0x08);
336 // to fix rx long range issue 327 // to fix rx long range issue
337 if (((pAd->MACVersion & 0xffff) >= 0x0211) && (pAd->NicConfig2.field.ExternalLNAForG == 0)) 328 if (((pAd->MACVersion & 0xffff) >= 0x0211) && (pAd->NicConfig2.field.ExternalLNAForG == 0))
338 { 329 {
339 RFValue |= 0x20; 330 RFValue |= 0x20;
340 } 331 }
341 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h 332 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
342 if (pAd->TxMixerGain24G >= 2) 333 if (pAd->TxMixerGain24G >= 2)
343 { 334 {
344 RFValue &= (~0x7); // clean bit [2:0] 335 RFValue &= (~0x7); // clean bit [2:0]
345 RFValue |= pAd->TxMixerGain24G; 336 RFValue |= pAd->TxMixerGain24G;
346 } 337 }
347 RT30xxWriteRFRegister(pAd, RF_R17, RFValue); 338 RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
348 */ 339 */
349 340
350 // RX_LO1_en, RF R20 register Bit 3 to 0 341 // RX_LO1_en, RF R20 register Bit 3 to 0
351 RT30xxReadRFRegister(pAd, RF_R20, &RFValue); 342 RT30xxReadRFRegister(pAd, RF_R20, &RFValue);
@@ -357,7 +348,7 @@ VOID RT30xxLoadRFNormalModeSetup(
357 RFValue &= (~0x08); 348 RFValue &= (~0x08);
358 RT30xxWriteRFRegister(pAd, RF_R21, RFValue); 349 RT30xxWriteRFRegister(pAd, RF_R21, RFValue);
359 350
360 /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/ 351 /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem */
361 // LDORF_VC, RF R27 register Bit 2 to 0 352 // LDORF_VC, RF R27 register Bit 2 to 0
362 RT30xxReadRFRegister(pAd, RF_R27, &RFValue); 353 RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
363 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). 354 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
@@ -381,15 +372,13 @@ VOID RT30xxLoadRFNormalModeSetup(
381 372
382 ========================================================================== 373 ==========================================================================
383 */ 374 */
384VOID RT30xxLoadRFSleepModeSetup( 375VOID RT30xxLoadRFSleepModeSetup(IN PRTMP_ADAPTER pAd)
385 IN PRTMP_ADAPTER pAd)
386{ 376{
387 UCHAR RFValue; 377 UCHAR RFValue;
388 UINT32 MACValue; 378 UINT32 MACValue;
389 379
390
391#ifdef RTMP_MAC_USB 380#ifdef RTMP_MAC_USB
392 if(!IS_RT3572(pAd)) 381 if (!IS_RT3572(pAd))
393#endif // RTMP_MAC_USB // 382#endif // RTMP_MAC_USB //
394 { 383 {
395 // RF_BLOCK_en. RF R1 register Bit 0 to 0 384 // RF_BLOCK_en. RF R1 register Bit 0 to 0
@@ -414,9 +403,8 @@ VOID RT30xxLoadRFSleepModeSetup(
414 } 403 }
415 404
416 if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72 405 if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72
417 IS_RT3572(pAd) || 406 IS_RT3572(pAd) ||
418 (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) 407 (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) {
419 {
420#ifdef RTMP_MAC_USB 408#ifdef RTMP_MAC_USB
421 if (!IS_RT3572(pAd)) 409 if (!IS_RT3572(pAd))
422#endif // RTMP_MAC_USB // 410#endif // RTMP_MAC_USB //
@@ -440,14 +428,13 @@ VOID RT30xxLoadRFSleepModeSetup(
440 428
441 ========================================================================== 429 ==========================================================================
442 */ 430 */
443VOID RT30xxReverseRFSleepModeSetup( 431VOID RT30xxReverseRFSleepModeSetup(IN PRTMP_ADAPTER pAd)
444 IN PRTMP_ADAPTER pAd)
445{ 432{
446 UCHAR RFValue; 433 UCHAR RFValue;
447 UINT32 MACValue; 434 UINT32 MACValue;
448 435
449#ifdef RTMP_MAC_USB 436#ifdef RTMP_MAC_USB
450 if(!IS_RT3572(pAd)) 437 if (!IS_RT3572(pAd))
451#endif // RTMP_MAC_USB // 438#endif // RTMP_MAC_USB //
452 { 439 {
453 // RF_BLOCK_en, RF R1 register Bit 0 to 1 440 // RF_BLOCK_en, RF R1 register Bit 0 to 1
@@ -472,10 +459,9 @@ VOID RT30xxReverseRFSleepModeSetup(
472 } 459 }
473 460
474 if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72 461 if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72
475 IS_RT3572(pAd) || 462 IS_RT3572(pAd) ||
476 IS_RT3390(pAd) || 463 IS_RT3390(pAd) ||
477 (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) 464 (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) {
478 {
479#ifdef RTMP_MAC_USB 465#ifdef RTMP_MAC_USB
480 if (!IS_RT3572(pAd)) 466 if (!IS_RT3572(pAd))
481#endif // RTMP_MAC_USB // 467#endif // RTMP_MAC_USB //
@@ -487,48 +473,41 @@ VOID RT30xxReverseRFSleepModeSetup(
487 RFValue = (RFValue & (~0x77)); 473 RFValue = (RFValue & (~0x77));
488 RT30xxWriteRFRegister(pAd, RF_R27, RFValue); 474 RT30xxWriteRFRegister(pAd, RF_R27, RFValue);
489 } 475 }
490
491 // RT3071 version E has fixed this issue 476 // RT3071 version E has fixed this issue
492 if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) 477 if ((pAd->NicConfig2.field.DACTestBit == 1)
493 { 478 && ((pAd->MACVersion & 0xffff) < 0x0211)) {
494 // patch tx EVM issue temporarily 479 // patch tx EVM issue temporarily
495 RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); 480 RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
496 MACValue = ((MACValue & 0xE0FFFFFF) | 0x0D000000); 481 MACValue = ((MACValue & 0xE0FFFFFF) | 0x0D000000);
497 RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); 482 RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
498 } 483 } else {
499 else
500 {
501 RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); 484 RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
502 MACValue = ((MACValue & 0xE0FFFFFF) | 0x01000000); 485 MACValue = ((MACValue & 0xE0FFFFFF) | 0x01000000);
503 RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); 486 RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
504 } 487 }
505 } 488 }
506 489
507 if(IS_RT3572(pAd)) 490 if (IS_RT3572(pAd))
508 RT30xxWriteRFRegister(pAd, RF_R08, 0x80); 491 RT30xxWriteRFRegister(pAd, RF_R08, 0x80);
509} 492}
493
510// end johnli 494// end johnli
511 495
512VOID RT30xxHaltAction( 496VOID RT30xxHaltAction(IN PRTMP_ADAPTER pAd)
513 IN PRTMP_ADAPTER pAd)
514{ 497{
515 UINT32 TxPinCfg = 0x00050F0F; 498 UINT32 TxPinCfg = 0x00050F0F;
516 499
517 // 500 //
518 // Turn off LNA_PE or TRSW_POL 501 // Turn off LNA_PE or TRSW_POL
519 // 502 //
520 if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)) 503 if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)) {
521 {
522 if ((IS_RT3071(pAd) || IS_RT3572(pAd)) 504 if ((IS_RT3071(pAd) || IS_RT3572(pAd))
523#ifdef RTMP_EFUSE_SUPPORT 505#ifdef RTMP_EFUSE_SUPPORT
524 && (pAd->bUseEfuse) 506 && (pAd->bUseEfuse)
525#endif // RTMP_EFUSE_SUPPORT // 507#endif // RTMP_EFUSE_SUPPORT //
526 ) 508 ) {
527 { 509 TxPinCfg &= 0xFFFBF0F0; // bit18 off
528 TxPinCfg &= 0xFFFBF0F0; // bit18 off 510 } else {
529 }
530 else
531 {
532 TxPinCfg &= 0xFFFFF0F0; 511 TxPinCfg &= 0xFFFFF0F0;
533 } 512 }
534 513
diff --git a/drivers/staging/rt2860/pci_main_dev.c b/drivers/staging/rt2860/pci_main_dev.c
index 2c51d9d4f39..2a22e458ae0 100644
--- a/drivers/staging/rt2860/pci_main_dev.c
+++ b/drivers/staging/rt2860/pci_main_dev.c
@@ -53,13 +53,13 @@ extern int rt28xx_close(IN struct net_device *net_dev);
53extern int rt28xx_open(struct net_device *net_dev); 53extern int rt28xx_open(struct net_device *net_dev);
54 54
55static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev); 55static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev);
56static INT __devinit rt2860_probe(struct pci_dev *pci_dev, const struct pci_device_id *ent); 56static INT __devinit rt2860_probe(struct pci_dev *pci_dev,
57 const struct pci_device_id *ent);
57static void __exit rt2860_cleanup_module(void); 58static void __exit rt2860_cleanup_module(void);
58static int __init rt2860_init_module(void); 59static int __init rt2860_init_module(void);
59 60
60 static VOID RTMPInitPCIeDevice( 61static VOID RTMPInitPCIeDevice(IN struct pci_dev *pci_dev,
61 IN struct pci_dev *pci_dev, 62 IN PRTMP_ADAPTER pAd);
62 IN PRTMP_ADAPTER pAd);
63 63
64#ifdef CONFIG_PM 64#ifdef CONFIG_PM
65static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state); 65static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state);
@@ -69,10 +69,9 @@ static int rt2860_resume(struct pci_dev *pci_dev);
69// 69//
70// Ralink PCI device table, include all supported chipsets 70// Ralink PCI device table, include all supported chipsets
71// 71//
72static struct pci_device_id rt2860_pci_tbl[] __devinitdata = 72static struct pci_device_id rt2860_pci_tbl[] __devinitdata = {
73{
74#ifdef RT2860 73#ifdef RT2860
75 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, //RT28602.4G 74 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, //RT28602.4G
76 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)}, 75 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)},
77 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)}, 76 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)},
78 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)}, 77 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)},
@@ -95,7 +94,7 @@ static struct pci_device_id rt2860_pci_tbl[] __devinitdata =
95 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3391_PCIe_DEVICE_ID)}, 94 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3391_PCIe_DEVICE_ID)},
96 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3392_PCIe_DEVICE_ID)}, 95 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3392_PCIe_DEVICE_ID)},
97#endif // RT3390 // 96#endif // RT3390 //
98 {0,} // terminate list 97 {0,} // terminate list
99}; 98};
100 99
101MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl); 100MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl);
@@ -103,23 +102,20 @@ MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl);
103MODULE_VERSION(STA_DRIVER_VERSION); 102MODULE_VERSION(STA_DRIVER_VERSION);
104#endif 103#endif
105 104
106
107// 105//
108// Our PCI driver structure 106// Our PCI driver structure
109// 107//
110static struct pci_driver rt2860_driver = 108static struct pci_driver rt2860_driver = {
111{ 109name: "rt2860",
112 name: "rt2860", 110id_table:rt2860_pci_tbl,
113 id_table: rt2860_pci_tbl, 111probe: rt2860_probe,
114 probe: rt2860_probe, 112remove:__devexit_p(rt2860_remove_one),
115 remove: __devexit_p(rt2860_remove_one),
116#ifdef CONFIG_PM 113#ifdef CONFIG_PM
117 suspend: rt2860_suspend, 114suspend:rt2860_suspend,
118 resume: rt2860_resume, 115resume:rt2860_resume,
119#endif 116#endif
120}; 117};
121 118
122
123/*************************************************************************** 119/***************************************************************************
124 * 120 *
125 * PCI device initialization related procedures. 121 * PCI device initialization related procedures.
@@ -127,37 +123,29 @@ static struct pci_driver rt2860_driver =
127 ***************************************************************************/ 123 ***************************************************************************/
128#ifdef CONFIG_PM 124#ifdef CONFIG_PM
129 125
130VOID RT2860RejectPendingPackets( 126VOID RT2860RejectPendingPackets(IN PRTMP_ADAPTER pAd)
131 IN PRTMP_ADAPTER pAd)
132{ 127{
133 // clear PS packets 128 // clear PS packets
134 // clear TxSw packets 129 // clear TxSw packets
135} 130}
136 131
137static int rt2860_suspend( 132static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state)
138 struct pci_dev *pci_dev,
139 pm_message_t state)
140{ 133{
141 struct net_device *net_dev = pci_get_drvdata(pci_dev); 134 struct net_device *net_dev = pci_get_drvdata(pci_dev);
142 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; 135 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) NULL;
143 INT32 retval = 0; 136 INT32 retval = 0;
144 137
145
146 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n")); 138 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n"));
147 139
148 if (net_dev == NULL) 140 if (net_dev == NULL) {
149 {
150 DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); 141 DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
151 } 142 } else {
152 else
153 {
154 GET_PAD_FROM_NET_DEV(pAd, net_dev); 143 GET_PAD_FROM_NET_DEV(pAd, net_dev);
155 144
156 /* we can not use IFF_UP because ra0 down but ra1 up */ 145 /* we can not use IFF_UP because ra0 down but ra1 up */
157 /* and 1 suspend/resume function for 1 module, not for each interface */ 146 /* and 1 suspend/resume function for 1 module, not for each interface */
158 /* so Linux will call suspend/resume function once */ 147 /* so Linux will call suspend/resume function once */
159 if (VIRTUAL_IF_NUM(pAd) > 0) 148 if (VIRTUAL_IF_NUM(pAd) > 0) {
160 {
161 // avoid users do suspend after interface is down 149 // avoid users do suspend after interface is down
162 150
163 // stop interface 151 // stop interface
@@ -172,7 +160,7 @@ static int rt2860_suspend(
172 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); 160 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
173 161
174 // take down the device 162 // take down the device
175 rt28xx_close((PNET_DEV)net_dev); 163 rt28xx_close((PNET_DEV) net_dev);
176 164
177 RT_MOD_DEC_USE_COUNT(); 165 RT_MOD_DEC_USE_COUNT();
178 } 166 }
@@ -193,14 +181,12 @@ static int rt2860_suspend(
193 return retval; 181 return retval;
194} 182}
195 183
196static int rt2860_resume( 184static int rt2860_resume(struct pci_dev *pci_dev)
197 struct pci_dev *pci_dev)
198{ 185{
199 struct net_device *net_dev = pci_get_drvdata(pci_dev); 186 struct net_device *net_dev = pci_get_drvdata(pci_dev);
200 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; 187 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) NULL;
201 INT32 retval; 188 INT32 retval;
202 189
203
204 // set the power state of a PCI device 190 // set the power state of a PCI device
205 // PCI has 4 power states, DO (normal) ~ D3(less power) 191 // PCI has 4 power states, DO (normal) ~ D3(less power)
206 // in include/linux/pci.h, you can find that 192 // in include/linux/pci.h, you can find that
@@ -217,38 +203,32 @@ static int rt2860_resume(
217 pci_restore_state(pci_dev); 203 pci_restore_state(pci_dev);
218 204
219 // initialize device before it's used by a driver 205 // initialize device before it's used by a driver
220 if (pci_enable_device(pci_dev)) 206 if (pci_enable_device(pci_dev)) {
221 {
222 printk("pci enable fail!\n"); 207 printk("pci enable fail!\n");
223 return 0; 208 return 0;
224 } 209 }
225 210
226 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n")); 211 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n"));
227 212
228 if (net_dev == NULL) 213 if (net_dev == NULL) {
229 {
230 DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); 214 DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
231 } 215 } else
232 else
233 GET_PAD_FROM_NET_DEV(pAd, net_dev); 216 GET_PAD_FROM_NET_DEV(pAd, net_dev);
234 217
235 if (pAd != NULL) 218 if (pAd != NULL) {
236 {
237 /* we can not use IFF_UP because ra0 down but ra1 up */ 219 /* we can not use IFF_UP because ra0 down but ra1 up */
238 /* and 1 suspend/resume function for 1 module, not for each interface */ 220 /* and 1 suspend/resume function for 1 module, not for each interface */
239 /* so Linux will call suspend/resume function once */ 221 /* so Linux will call suspend/resume function once */
240 if (VIRTUAL_IF_NUM(pAd) > 0) 222 if (VIRTUAL_IF_NUM(pAd) > 0) {
241 {
242 // mark device as attached from system and restart if needed 223 // mark device as attached from system and restart if needed
243 netif_device_attach(net_dev); 224 netif_device_attach(net_dev);
244 225
245 if (rt28xx_open((PNET_DEV)net_dev) != 0) 226 if (rt28xx_open((PNET_DEV) net_dev) != 0) {
246 {
247 // open fail 227 // open fail
248 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); 228 DBGPRINT(RT_DEBUG_TRACE,
229 ("<=== rt2860_resume()\n"));
249 return 0; 230 return 0;
250 } 231 }
251
252 // increase MODULE use count 232 // increase MODULE use count
253 RT_MOD_INC_USE_COUNT(); 233 RT_MOD_INC_USE_COUNT();
254 234
@@ -266,113 +246,111 @@ static int rt2860_resume(
266} 246}
267#endif // CONFIG_PM // 247#endif // CONFIG_PM //
268 248
269
270static INT __init rt2860_init_module(VOID) 249static INT __init rt2860_init_module(VOID)
271{ 250{
272 return pci_register_driver(&rt2860_driver); 251 return pci_register_driver(&rt2860_driver);
273} 252}
274 253
275
276// 254//
277// Driver module unload function 255// Driver module unload function
278// 256//
279static VOID __exit rt2860_cleanup_module(VOID) 257static VOID __exit rt2860_cleanup_module(VOID)
280{ 258{
281 pci_unregister_driver(&rt2860_driver); 259 pci_unregister_driver(&rt2860_driver);
282} 260}
283 261
284module_init(rt2860_init_module); 262module_init(rt2860_init_module);
285module_exit(rt2860_cleanup_module); 263module_exit(rt2860_cleanup_module);
286 264
287
288// 265//
289// PCI device probe & initialization function 266// PCI device probe & initialization function
290// 267//
291static INT __devinit rt2860_probe( 268static INT __devinit rt2860_probe(IN struct pci_dev *pci_dev,
292 IN struct pci_dev *pci_dev, 269 IN const struct pci_device_id *pci_id)
293 IN const struct pci_device_id *pci_id)
294{ 270{
295 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; 271 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) NULL;
296 struct net_device *net_dev; 272 struct net_device *net_dev;
297 PVOID handle; 273 PVOID handle;
298 PSTRING print_name; 274 PSTRING print_name;
299 ULONG csr_addr; 275 ULONG csr_addr;
300 INT rv = 0; 276 INT rv = 0;
301 RTMP_OS_NETDEV_OP_HOOK netDevHook; 277 RTMP_OS_NETDEV_OP_HOOK netDevHook;
302 278
303 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_probe\n")); 279 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_probe\n"));
304 280
305//PCIDevInit============================================== 281//PCIDevInit==============================================
306 // wake up and enable device 282 // wake up and enable device
307 if ((rv = pci_enable_device(pci_dev))!= 0) 283 if ((rv = pci_enable_device(pci_dev)) != 0) {
308 { 284 DBGPRINT(RT_DEBUG_ERROR,
309 DBGPRINT(RT_DEBUG_ERROR, ("Enable PCI device failed, errno=%d!\n", rv)); 285 ("Enable PCI device failed, errno=%d!\n", rv));
310 return rv; 286 return rv;
311 } 287 }
312 288
313 print_name = (PSTRING)pci_name(pci_dev); 289 print_name = (PSTRING) pci_name(pci_dev);
314 290
315 if ((rv = pci_request_regions(pci_dev, print_name)) != 0) 291 if ((rv = pci_request_regions(pci_dev, print_name)) != 0) {
316 { 292 DBGPRINT(RT_DEBUG_ERROR,
317 DBGPRINT(RT_DEBUG_ERROR, ("Request PCI resource failed, errno=%d!\n", rv)); 293 ("Request PCI resource failed, errno=%d!\n", rv));
318 goto err_out; 294 goto err_out;
319 } 295 }
320
321 // map physical address to virtual address for accessing register 296 // map physical address to virtual address for accessing register
322 csr_addr = (unsigned long) ioremap(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); 297 csr_addr =
323 if (!csr_addr) 298 (unsigned long)ioremap(pci_resource_start(pci_dev, 0),
324 { 299 pci_resource_len(pci_dev, 0));
325 DBGPRINT(RT_DEBUG_ERROR, ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n", 300 if (!csr_addr) {
326 print_name, (ULONG)pci_resource_len(pci_dev, 0), (ULONG)pci_resource_start(pci_dev, 0))); 301 DBGPRINT(RT_DEBUG_ERROR,
302 ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n",
303 print_name, (ULONG) pci_resource_len(pci_dev, 0),
304 (ULONG) pci_resource_start(pci_dev, 0)));
327 goto err_out_free_res; 305 goto err_out_free_res;
328 } 306 } else {
329 else 307 DBGPRINT(RT_DEBUG_TRACE,
330 { 308 ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name,
331 DBGPRINT(RT_DEBUG_TRACE, ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name, 309 (ULONG) pci_resource_start(pci_dev, 0),
332 (ULONG)pci_resource_start(pci_dev, 0), (ULONG)csr_addr, pci_dev->irq)); 310 (ULONG) csr_addr, pci_dev->irq));
333 } 311 }
334 312
335 // Set DMA master 313 // Set DMA master
336 pci_set_master(pci_dev); 314 pci_set_master(pci_dev);
337 315
338
339//RtmpDevInit============================================== 316//RtmpDevInit==============================================
340 // Allocate RTMP_ADAPTER adapter structure 317 // Allocate RTMP_ADAPTER adapter structure
341 handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); 318 handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
342 if (handle == NULL) 319 if (handle == NULL) {
343 { 320 DBGPRINT(RT_DEBUG_ERROR,
344 DBGPRINT(RT_DEBUG_ERROR, ("%s(): Allocate memory for os handle failed!\n", __func__)); 321 ("%s(): Allocate memory for os handle failed!\n",
322 __func__));
345 goto err_out_iounmap; 323 goto err_out_iounmap;
346 } 324 }
347 325
348 ((POS_COOKIE)handle)->pci_dev = pci_dev; 326 ((POS_COOKIE) handle)->pci_dev = pci_dev;
349 327
350 rv = RTMPAllocAdapterBlock(handle, &pAd); //shiang: we may need the pci_dev for allocate structure of "RTMP_ADAPTER" 328 rv = RTMPAllocAdapterBlock(handle, &pAd); //shiang: we may need the pci_dev for allocate structure of "RTMP_ADAPTER"
351 if (rv != NDIS_STATUS_SUCCESS) 329 if (rv != NDIS_STATUS_SUCCESS)
352 goto err_out_iounmap; 330 goto err_out_iounmap;
353 // Here are the RTMP_ADAPTER structure with pci-bus specific parameters. 331 // Here are the RTMP_ADAPTER structure with pci-bus specific parameters.
354 pAd->CSRBaseAddress = (PUCHAR)csr_addr; 332 pAd->CSRBaseAddress = (PUCHAR) csr_addr;
355 DBGPRINT(RT_DEBUG_ERROR, ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n", (ULONG)pAd->CSRBaseAddress, csr_addr)); 333 DBGPRINT(RT_DEBUG_ERROR,
334 ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n",
335 (ULONG) pAd->CSRBaseAddress, csr_addr));
356 RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI); 336 RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI);
357 337
358
359//NetDevInit============================================== 338//NetDevInit==============================================
360 net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); 339 net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);
361 if (net_dev == NULL) 340 if (net_dev == NULL)
362 goto err_out_free_radev; 341 goto err_out_free_radev;
363 342
364 // Here are the net_device structure with pci-bus specific parameters. 343 // Here are the net_device structure with pci-bus specific parameters.
365 net_dev->irq = pci_dev->irq; // Interrupt IRQ number 344 net_dev->irq = pci_dev->irq; // Interrupt IRQ number
366 net_dev->base_addr = csr_addr; // Save CSR virtual address and irq to device structure 345 net_dev->base_addr = csr_addr; // Save CSR virtual address and irq to device structure
367 pci_set_drvdata(pci_dev, net_dev); // Set driver data 346 pci_set_drvdata(pci_dev, net_dev); // Set driver data
368 347
369/* for supporting Network Manager */ 348/* for supporting Network Manager */
370 /* Set the sysfs physical device reference for the network logical device 349 /* Set the sysfs physical device reference for the network logical device
371 * if set prior to registration will cause a symlink during initialization. 350 * if set prior to registration will cause a symlink during initialization.
372 */ 351 */
373 SET_NETDEV_DEV(net_dev, &(pci_dev->dev)); 352 SET_NETDEV_DEV(net_dev, &(pci_dev->dev));
374 353
375
376//All done, it's time to register the net device to linux kernel. 354//All done, it's time to register the net device to linux kernel.
377 // Register this device 355 // Register this device
378 rv = RtmpOSNetDevAttach(net_dev, &netDevHook); 356 rv = RtmpOSNetDevAttach(net_dev, &netDevHook);
@@ -384,20 +362,20 @@ static INT __devinit rt2860_probe(
384 362
385 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_probe\n")); 363 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_probe\n"));
386 364
387 return 0; // probe ok 365 return 0; // probe ok
388
389 366
390 /* --------------------------- ERROR HANDLE --------------------------- */ 367 /* --------------------------- ERROR HANDLE --------------------------- */
391err_out_free_netdev: 368err_out_free_netdev:
392 RtmpOSNetDevFree(net_dev); 369 RtmpOSNetDevFree(net_dev);
393 370
394err_out_free_radev: 371err_out_free_radev:
395 /* free RTMP_ADAPTER strcuture and os_cookie*/ 372 /* free RTMP_ADAPTER strcuture and os_cookie */
396 RTMPFreeAdapter(pAd); 373 RTMPFreeAdapter(pAd);
397 374
398err_out_iounmap: 375err_out_iounmap:
399 iounmap((void *)(csr_addr)); 376 iounmap((void *)(csr_addr));
400 release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); 377 release_mem_region(pci_resource_start(pci_dev, 0),
378 pci_resource_len(pci_dev, 0));
401 379
402err_out_free_res: 380err_out_free_res:
403 pci_release_regions(pci_dev); 381 pci_release_regions(pci_dev);
@@ -405,25 +383,23 @@ err_out_free_res:
405err_out: 383err_out:
406 pci_disable_device(pci_dev); 384 pci_disable_device(pci_dev);
407 385
408 DBGPRINT(RT_DEBUG_ERROR, ("<=== rt2860_probe failed with rv = %d!\n", rv)); 386 DBGPRINT(RT_DEBUG_ERROR,
387 ("<=== rt2860_probe failed with rv = %d!\n", rv));
409 388
410 return -ENODEV; /* probe fail */ 389 return -ENODEV; /* probe fail */
411} 390}
412 391
413 392static VOID __devexit rt2860_remove_one(IN struct pci_dev *pci_dev)
414static VOID __devexit rt2860_remove_one(
415 IN struct pci_dev *pci_dev)
416{ 393{
417 PNET_DEV net_dev = pci_get_drvdata(pci_dev); 394 PNET_DEV net_dev = pci_get_drvdata(pci_dev);
418 RTMP_ADAPTER *pAd = NULL; 395 RTMP_ADAPTER *pAd = NULL;
419 ULONG csr_addr = net_dev->base_addr; // pAd->CSRBaseAddress; 396 ULONG csr_addr = net_dev->base_addr; // pAd->CSRBaseAddress;
420 397
421 GET_PAD_FROM_NET_DEV(pAd, net_dev); 398 GET_PAD_FROM_NET_DEV(pAd, net_dev);
422 399
423 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); 400 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n"));
424 401
425 if (pAd != NULL) 402 if (pAd != NULL) {
426 {
427 // Unregister/Free all allocated net_device. 403 // Unregister/Free all allocated net_device.
428 RtmpPhyNetDevExit(pAd, net_dev); 404 RtmpPhyNetDevExit(pAd, net_dev);
429 405
@@ -431,14 +407,13 @@ static VOID __devexit rt2860_remove_one(
431 iounmap((char *)(csr_addr)); 407 iounmap((char *)(csr_addr));
432 408
433 // release memory region 409 // release memory region
434 release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); 410 release_mem_region(pci_resource_start(pci_dev, 0),
411 pci_resource_len(pci_dev, 0));
435 412
436 // Free RTMP_ADAPTER related structures. 413 // Free RTMP_ADAPTER related structures.
437 RtmpRaDevCtrlExit(pAd); 414 RtmpRaDevCtrlExit(pAd);
438 415
439 } 416 } else {
440 else
441 {
442 // Unregister network device 417 // Unregister network device
443 RtmpOSNetDevDetach(net_dev); 418 RtmpOSNetDevDetach(net_dev);
444 419
@@ -446,7 +421,8 @@ static VOID __devexit rt2860_remove_one(
446 iounmap((char *)(net_dev->base_addr)); 421 iounmap((char *)(net_dev->base_addr));
447 422
448 // release memory region 423 // release memory region
449 release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); 424 release_mem_region(pci_resource_start(pci_dev, 0),
425 pci_resource_len(pci_dev, 0));
450 } 426 }
451 427
452 // Free the root net_device 428 // Free the root net_device
@@ -454,7 +430,6 @@ static VOID __devexit rt2860_remove_one(
454 430
455} 431}
456 432
457
458/* 433/*
459======================================================================== 434========================================================================
460Routine Description: 435Routine Description:
@@ -470,24 +445,20 @@ Return Value:
470Note: 445Note:
471======================================================================== 446========================================================================
472*/ 447*/
473BOOLEAN RT28XXChipsetCheck( 448BOOLEAN RT28XXChipsetCheck(IN void *_dev_p)
474 IN void *_dev_p)
475{ 449{
476 /* always TRUE */ 450 /* always TRUE */
477 return TRUE; 451 return TRUE;
478} 452}
479 453
480
481/*************************************************************************** 454/***************************************************************************
482 * 455 *
483 * PCIe device initialization related procedures. 456 * PCIe device initialization related procedures.
484 * 457 *
485 ***************************************************************************/ 458 ***************************************************************************/
486 static VOID RTMPInitPCIeDevice( 459static VOID RTMPInitPCIeDevice(IN struct pci_dev *pci_dev, IN PRTMP_ADAPTER pAd)
487 IN struct pci_dev *pci_dev,
488 IN PRTMP_ADAPTER pAd)
489{ 460{
490 USHORT device_id; 461 USHORT device_id;
491 POS_COOKIE pObj; 462 POS_COOKIE pObj;
492 463
493 pObj = (POS_COOKIE) pAd->OS_Cookie; 464 pObj = (POS_COOKIE) pAd->OS_Cookie;
@@ -496,20 +467,18 @@ BOOLEAN RT28XXChipsetCheck(
496 pObj->DeviceID = device_id; 467 pObj->DeviceID = device_id;
497 if ( 468 if (
498#ifdef RT2860 469#ifdef RT2860
499 (device_id == NIC2860_PCIe_DEVICE_ID) || 470 (device_id == NIC2860_PCIe_DEVICE_ID) ||
500 (device_id == NIC2790_PCIe_DEVICE_ID) || 471 (device_id == NIC2790_PCIe_DEVICE_ID) ||
501 (device_id == VEN_AWT_PCIe_DEVICE_ID) || 472 (device_id == VEN_AWT_PCIe_DEVICE_ID) ||
502#endif 473#endif
503#ifdef RT3090 474#ifdef RT3090
504 (device_id == NIC3090_PCIe_DEVICE_ID) || 475 (device_id == NIC3090_PCIe_DEVICE_ID) ||
505 (device_id == NIC3091_PCIe_DEVICE_ID) || 476 (device_id == NIC3091_PCIe_DEVICE_ID) ||
506 (device_id == NIC3092_PCIe_DEVICE_ID) || 477 (device_id == NIC3092_PCIe_DEVICE_ID) ||
507#endif // RT3090 // 478#endif // RT3090 //
508 0) 479 0) {
509 { 480 UINT32 MacCsr0 = 0, Index = 0;
510 UINT32 MacCsr0 = 0, Index= 0; 481 do {
511 do
512 {
513 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); 482 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
514 483
515 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) 484 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
@@ -520,21 +489,18 @@ BOOLEAN RT28XXChipsetCheck(
520 489
521 // Support advanced power save after 2892/2790. 490 // Support advanced power save after 2892/2790.
522 // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). 491 // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO).
523 if ((MacCsr0&0xffff0000) != 0x28600000) 492 if ((MacCsr0 & 0xffff0000) != 0x28600000) {
524 {
525 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); 493 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE);
526 } 494 }
527 } 495 }
528} 496}
529 497
530 498VOID RTMPInitPCIeLinkCtrlValue(IN PRTMP_ADAPTER pAd)
531VOID RTMPInitPCIeLinkCtrlValue(
532 IN PRTMP_ADAPTER pAd)
533{ 499{
534 INT pos; 500 INT pos;
535 USHORT reg16, data2, PCIePowerSaveLevel, Configuration; 501 USHORT reg16, data2, PCIePowerSaveLevel, Configuration;
536 UINT32 MacValue; 502 UINT32 MacValue;
537 BOOLEAN bFindIntel = FALSE; 503 BOOLEAN bFindIntel = FALSE;
538 POS_COOKIE pObj; 504 POS_COOKIE pObj;
539 505
540 pObj = (POS_COOKIE) pAd->OS_Cookie; 506 pObj = (POS_COOKIE) pAd->OS_Cookie;
@@ -542,79 +508,83 @@ VOID RTMPInitPCIeLinkCtrlValue(
542 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) 508 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
543 return; 509 return;
544 510
545 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__)); 511 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
546 // Init EEPROM, and save settings 512 // Init EEPROM, and save settings
547 if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) 513 if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) {
548 {
549 RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel); 514 RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
550 pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff; 515 pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff;
551 516
552 pAd->LnkCtrlBitMask = 0; 517 pAd->LnkCtrlBitMask = 0;
553 if ((PCIePowerSaveLevel&0xff) == 0xff) 518 if ((PCIePowerSaveLevel & 0xff) == 0xff) {
554 {
555 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); 519 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PCIE_DEVICE);
556 DBGPRINT(RT_DEBUG_TRACE, ("====> PCIePowerSaveLevel = 0x%x.\n", PCIePowerSaveLevel)); 520 DBGPRINT(RT_DEBUG_TRACE,
521 ("====> PCIePowerSaveLevel = 0x%x.\n",
522 PCIePowerSaveLevel));
557 return; 523 return;
558 } 524 } else {
559 else 525 PCIePowerSaveLevel &= 0x3;
560 { 526 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
561 PCIePowerSaveLevel &= 0x3;
562 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
563 527
564 if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) ) 528 if (!
565 { 529 (((data2 & 0xff00) == 0x9200)
566 if (PCIePowerSaveLevel > 1 ) 530 && ((data2 & 0x80) != 0))) {
567 PCIePowerSaveLevel = 1; 531 if (PCIePowerSaveLevel > 1)
568 } 532 PCIePowerSaveLevel = 1;
533 }
569 534
570 DBGPRINT(RT_DEBUG_TRACE, ("====> Write 0x83 = 0x%x.\n", PCIePowerSaveLevel)); 535 DBGPRINT(RT_DEBUG_TRACE,
571 AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); 536 ("====> Write 0x83 = 0x%x.\n",
572 RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel); 537 PCIePowerSaveLevel));
573 PCIePowerSaveLevel &= 0xff; 538 AsicSendCommandToMcu(pAd, 0x83, 0xff,
574 PCIePowerSaveLevel = PCIePowerSaveLevel >> 6; 539 (UCHAR) PCIePowerSaveLevel, 0x00);
575 switch(PCIePowerSaveLevel) 540 RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
576 { 541 PCIePowerSaveLevel &= 0xff;
577 case 0: // Only support L0 542 PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
578 pAd->LnkCtrlBitMask = 0; 543 switch (PCIePowerSaveLevel) {
544 case 0: // Only support L0
545 pAd->LnkCtrlBitMask = 0;
579 break; 546 break;
580 case 1: // Only enable L0s 547 case 1: // Only enable L0s
581 pAd->LnkCtrlBitMask = 1; 548 pAd->LnkCtrlBitMask = 1;
582 break; 549 break;
583 case 2: // enable L1, L0s 550 case 2: // enable L1, L0s
584 pAd->LnkCtrlBitMask = 3; 551 pAd->LnkCtrlBitMask = 3;
585 break; 552 break;
586 case 3: // sync with host clk and enable L1, L0s 553 case 3: // sync with host clk and enable L1, L0s
587 pAd->LnkCtrlBitMask = 0x103; 554 pAd->LnkCtrlBitMask = 0x103;
588 break; 555 break;
589 } 556 }
590 RT28xx_EEPROM_READ16(pAd, 0x24, data2); 557 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
591 if ((PCIePowerSaveLevel&0xff) != 0xff) 558 if ((PCIePowerSaveLevel & 0xff) != 0xff) {
592 {
593 PCIePowerSaveLevel &= 0x3; 559 PCIePowerSaveLevel &= 0x3;
594 560
595 if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) ) 561 if (!
596 { 562 (((data2 & 0xff00) == 0x9200)
597 if (PCIePowerSaveLevel > 1 ) 563 && ((data2 & 0x80) != 0))) {
564 if (PCIePowerSaveLevel > 1)
598 PCIePowerSaveLevel = 1; 565 PCIePowerSaveLevel = 1;
599 } 566 }
600 567
601 DBGPRINT(RT_DEBUG_TRACE, ("====> rt28xx Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); 568 DBGPRINT(RT_DEBUG_TRACE,
569 ("====> rt28xx Write 0x83 Command = 0x%x.\n",
570 PCIePowerSaveLevel));
602 571
603 AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); 572 AsicSendCommandToMcu(pAd, 0x83, 0xff,
573 (UCHAR) PCIePowerSaveLevel,
574 0x00);
604 } 575 }
605 DBGPRINT(RT_DEBUG_TRACE, ("====> LnkCtrlBitMask = 0x%x.\n", pAd->LnkCtrlBitMask)); 576 DBGPRINT(RT_DEBUG_TRACE,
606 } 577 ("====> LnkCtrlBitMask = 0x%x.\n",
607 } 578 pAd->LnkCtrlBitMask));
608 else if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) 579 }
609 { 580 } else if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
610 UCHAR LinkCtrlSetting = 0; 581 UCHAR LinkCtrlSetting = 0;
611 582
612 // Check 3090E special setting chip. 583 // Check 3090E special setting chip.
613 RT28xx_EEPROM_READ16(pAd, 0x24, data2); 584 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
614 if ((data2 == 0x9280) && ((pAd->MACVersion&0xffff) == 0x0211)) 585 if ((data2 == 0x9280) && ((pAd->MACVersion & 0xffff) == 0x0211)) {
615 {
616 pAd->b3090ESpecialChip = TRUE; 586 pAd->b3090ESpecialChip = TRUE;
617 DBGPRINT_RAW(RT_DEBUG_ERROR,("Special 3090E chip \n")); 587 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Special 3090E chip \n"));
618 } 588 }
619 589
620 RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue); 590 RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue);
@@ -622,130 +592,148 @@ VOID RTMPInitPCIeLinkCtrlValue(
622 //Force PCIE 125MHz CLK to toggle 592 //Force PCIE 125MHz CLK to toggle
623 MacValue |= 0x402; 593 MacValue |= 0x402;
624 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue); 594 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue);
625 DBGPRINT_RAW(RT_DEBUG_ERROR,(" AUX_CTRL = 0x%32x\n", MacValue)); 595 DBGPRINT_RAW(RT_DEBUG_ERROR,
626 596 (" AUX_CTRL = 0x%32x\n", MacValue));
627
628 597
629 // for RT30xx F and after, PCIe infterface, and for power solution 3 598 // for RT30xx F and after, PCIe infterface, and for power solution 3
630 if ((IS_VERSION_AFTER_F(pAd)) 599 if ((IS_VERSION_AFTER_F(pAd))
631 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode >= 2) 600 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode >= 2)
632 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode <= 3)) 601 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode <= 3)) {
633 {
634 RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue); 602 RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue);
635 DBGPRINT_RAW(RT_DEBUG_ERROR,(" Read AUX_CTRL = 0x%x\n", MacValue)); 603 DBGPRINT_RAW(RT_DEBUG_ERROR,
604 (" Read AUX_CTRL = 0x%x\n", MacValue));
636 // turn on bit 12. 605 // turn on bit 12.
637 //enable 32KHz clock mode for power saving 606 //enable 32KHz clock mode for power saving
638 MacValue |= 0x1000; 607 MacValue |= 0x1000;
639 if (MacValue != 0xffffffff) 608 if (MacValue != 0xffffffff) {
640 {
641 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue); 609 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue);
642 DBGPRINT_RAW(RT_DEBUG_ERROR,(" Write AUX_CTRL = 0x%x\n", MacValue)); 610 DBGPRINT_RAW(RT_DEBUG_ERROR,
611 (" Write AUX_CTRL = 0x%x\n",
612 MacValue));
643 // 1. if use PCIePowerSetting is 2 or 3, need to program OSC_CTRL to 0x3ff11. 613 // 1. if use PCIePowerSetting is 2 or 3, need to program OSC_CTRL to 0x3ff11.
644 MacValue = 0x3ff11; 614 MacValue = 0x3ff11;
645 RTMP_IO_WRITE32(pAd, OSC_CTRL, MacValue); 615 RTMP_IO_WRITE32(pAd, OSC_CTRL, MacValue);
646 DBGPRINT_RAW(RT_DEBUG_ERROR,(" OSC_CTRL = 0x%x\n", MacValue)); 616 DBGPRINT_RAW(RT_DEBUG_ERROR,
617 (" OSC_CTRL = 0x%x\n", MacValue));
647 // 2. Write PCI register Clk ref bit 618 // 2. Write PCI register Clk ref bit
648 RTMPrt3xSetPCIePowerLinkCtrl(pAd); 619 RTMPrt3xSetPCIePowerLinkCtrl(pAd);
649 } 620 } else {
650 else
651 {
652 // Error read Aux_Ctrl value. Force to use solution 1 621 // Error read Aux_Ctrl value. Force to use solution 1
653 DBGPRINT(RT_DEBUG_ERROR,(" Error Value in AUX_CTRL = 0x%x\n", MacValue)); 622 DBGPRINT(RT_DEBUG_ERROR,
623 (" Error Value in AUX_CTRL = 0x%x\n",
624 MacValue));
654 pAd->StaCfg.PSControl.field.rt30xxPowerMode = 1; 625 pAd->StaCfg.PSControl.field.rt30xxPowerMode = 1;
655 DBGPRINT(RT_DEBUG_ERROR,(" Force to use power solution1 \n")); 626 DBGPRINT(RT_DEBUG_ERROR,
627 (" Force to use power solution1 \n"));
656 } 628 }
657 } 629 }
658 // 1. read setting from inf file. 630 // 1. read setting from inf file.
659 631
660 PCIePowerSaveLevel = (USHORT)pAd->StaCfg.PSControl.field.rt30xxPowerMode; 632 PCIePowerSaveLevel =
661 DBGPRINT(RT_DEBUG_ERROR, ("====> rt30xx Read PowerLevelMode = 0x%x.\n", PCIePowerSaveLevel)); 633 (USHORT) pAd->StaCfg.PSControl.field.rt30xxPowerMode;
634 DBGPRINT(RT_DEBUG_ERROR,
635 ("====> rt30xx Read PowerLevelMode = 0x%x.\n",
636 PCIePowerSaveLevel));
662 // 2. Check EnableNewPS. 637 // 2. Check EnableNewPS.
663 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) 638 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
664 PCIePowerSaveLevel = 1; 639 PCIePowerSaveLevel = 1;
665 640
666 if (IS_VERSION_BEFORE_F(pAd) && (pAd->b3090ESpecialChip == FALSE)) 641 if (IS_VERSION_BEFORE_F(pAd)
667 { 642 && (pAd->b3090ESpecialChip == FALSE)) {
668 // Chip Version E only allow 1, So force set 1. 643 // Chip Version E only allow 1, So force set 1.
669 PCIePowerSaveLevel &= 0x1; 644 PCIePowerSaveLevel &= 0x1;
670 pAd->PCIePowerSaveLevel = (USHORT)PCIePowerSaveLevel; 645 pAd->PCIePowerSaveLevel = (USHORT) PCIePowerSaveLevel;
671 DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xx E Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); 646 DBGPRINT(RT_DEBUG_TRACE,
672 647 ("====> rt30xx E Write 0x83 Command = 0x%x.\n",
673 AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); 648 PCIePowerSaveLevel));
674 } 649
675 else 650 AsicSendCommandToMcu(pAd, 0x83, 0xff,
676 { 651 (UCHAR) PCIePowerSaveLevel, 0x00);
652 } else {
677 // Chip Version F and after only allow 1 or 2 or 3. This might be modified after new chip version come out. 653 // Chip Version F and after only allow 1 or 2 or 3. This might be modified after new chip version come out.
678 if (!((PCIePowerSaveLevel == 1) || (PCIePowerSaveLevel == 3))) 654 if (!
655 ((PCIePowerSaveLevel == 1)
656 || (PCIePowerSaveLevel == 3)))
679 PCIePowerSaveLevel = 1; 657 PCIePowerSaveLevel = 1;
680 DBGPRINT(RT_DEBUG_ERROR, ("====> rt30xx F Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); 658 DBGPRINT(RT_DEBUG_ERROR,
681 pAd->PCIePowerSaveLevel = (USHORT)PCIePowerSaveLevel; 659 ("====> rt30xx F Write 0x83 Command = 0x%x.\n",
660 PCIePowerSaveLevel));
661 pAd->PCIePowerSaveLevel = (USHORT) PCIePowerSaveLevel;
682 // for 3090F , we need to add high-byte arg for 0x83 command to indicate the link control setting in 662 // for 3090F , we need to add high-byte arg for 0x83 command to indicate the link control setting in
683 // PCI Configuration Space. Because firmware can't read PCI Configuration Space 663 // PCI Configuration Space. Because firmware can't read PCI Configuration Space
684 if ((pAd->Rt3xxRalinkLinkCtrl & 0x2) && (pAd->Rt3xxHostLinkCtrl & 0x2)) 664 if ((pAd->Rt3xxRalinkLinkCtrl & 0x2)
685 { 665 && (pAd->Rt3xxHostLinkCtrl & 0x2)) {
686 LinkCtrlSetting = 1; 666 LinkCtrlSetting = 1;
687 } 667 }
688 DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xxF LinkCtrlSetting = 0x%x.\n", LinkCtrlSetting)); 668 DBGPRINT(RT_DEBUG_TRACE,
689 AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, LinkCtrlSetting); 669 ("====> rt30xxF LinkCtrlSetting = 0x%x.\n",
670 LinkCtrlSetting));
671 AsicSendCommandToMcu(pAd, 0x83, 0xff,
672 (UCHAR) PCIePowerSaveLevel,
673 LinkCtrlSetting);
690 } 674 }
691 } 675 }
692 676 // Find Ralink PCIe Device's Express Capability Offset
693 // Find Ralink PCIe Device's Express Capability Offset
694 pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP); 677 pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
695 678
696 if (pos != 0) 679 if (pos != 0) {
697 { 680 // Ralink PCIe Device's Link Control Register Offset
698 // Ralink PCIe Device's Link Control Register Offset 681 pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
699 pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL; 682 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
700 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16); 683 &reg16);
701 Configuration = le2cpu16(reg16); 684 Configuration = le2cpu16(reg16);
702 DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", 685 DBGPRINT(RT_DEBUG_TRACE,
703 pAd->RLnkCtrlOffset, Configuration)); 686 ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
704 pAd->RLnkCtrlConfiguration = (Configuration & 0x103); 687 pAd->RLnkCtrlOffset, Configuration));
705 Configuration &= 0xfefc; 688 pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
706 Configuration |= (0x0); 689 Configuration &= 0xfefc;
690 Configuration |= (0x0);
707#ifdef RT2860 691#ifdef RT2860
708 if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) 692 if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
709 ||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)) 693 || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)) {
710 {
711 reg16 = cpu2le16(Configuration); 694 reg16 = cpu2le16(Configuration);
712 pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); 695 pci_write_config_word(pObj->pci_dev,
713 DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", 696 pAd->RLnkCtrlOffset, reg16);
714 pos + PCI_EXP_LNKCTL, Configuration)); 697 DBGPRINT(RT_DEBUG_TRACE,
698 ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
699 pos + PCI_EXP_LNKCTL, Configuration));
715 } 700 }
716#endif // RT2860 // 701#endif // RT2860 //
717 702
718 RTMPFindHostPCIDev(pAd); 703 RTMPFindHostPCIDev(pAd);
719 if (pObj->parent_pci_dev) 704 if (pObj->parent_pci_dev) {
720 { 705 USHORT vendor_id;
721 USHORT vendor_id;
722 706
723 pci_read_config_word(pObj->parent_pci_dev, PCI_VENDOR_ID, &vendor_id); 707 pci_read_config_word(pObj->parent_pci_dev,
724 vendor_id = le2cpu16(vendor_id); 708 PCI_VENDOR_ID, &vendor_id);
725 if (vendor_id == PCIBUS_INTEL_VENDOR) 709 vendor_id = le2cpu16(vendor_id);
726 { 710 if (vendor_id == PCIBUS_INTEL_VENDOR) {
727 bFindIntel = TRUE; 711 bFindIntel = TRUE;
728 RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1); 712 RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1);
729 } 713 }
730 714 // Find PCI-to-PCI Bridge Express Capability Offset
731 // Find PCI-to-PCI Bridge Express Capability Offset 715 pos =
732 pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP); 716 pci_find_capability(pObj->parent_pci_dev,
733 717 PCI_CAP_ID_EXP);
734 if (pos != 0) 718
735 { 719 if (pos != 0) {
736 BOOLEAN bChange = FALSE; 720 BOOLEAN bChange = FALSE;
737 // PCI-to-PCI Bridge Link Control Register Offset 721 // PCI-to-PCI Bridge Link Control Register Offset
738 pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL; 722 pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
739 pci_read_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, &reg16); 723 pci_read_config_word(pObj->parent_pci_dev,
740 Configuration = le2cpu16(reg16); 724 pAd->HostLnkCtrlOffset,
741 DBGPRINT(RT_DEBUG_TRACE, ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", 725 &reg16);
742 pAd->HostLnkCtrlOffset, Configuration)); 726 Configuration = le2cpu16(reg16);
743 pAd->HostLnkCtrlConfiguration = (Configuration & 0x103); 727 DBGPRINT(RT_DEBUG_TRACE,
744 Configuration &= 0xfefc; 728 ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
745 Configuration |= (0x0); 729 pAd->HostLnkCtrlOffset,
730 Configuration));
731 pAd->HostLnkCtrlConfiguration =
732 (Configuration & 0x103);
733 Configuration &= 0xfefc;
734 Configuration |= (0x0);
746 735
747 switch (pObj->DeviceID) 736 switch (pObj->DeviceID) {
748 {
749#ifdef RT2860 737#ifdef RT2860
750 case NIC2860_PCIe_DEVICE_ID: 738 case NIC2860_PCIe_DEVICE_ID:
751 case NIC2790_PCIe_DEVICE_ID: 739 case NIC2790_PCIe_DEVICE_ID:
@@ -757,98 +745,104 @@ VOID RTMPInitPCIeLinkCtrlValue(
757 case NIC3091_PCIe_DEVICE_ID: 745 case NIC3091_PCIe_DEVICE_ID:
758 case NIC3092_PCIe_DEVICE_ID: 746 case NIC3092_PCIe_DEVICE_ID:
759 if (bFindIntel == FALSE) 747 if (bFindIntel == FALSE)
760 bChange = TRUE; 748 bChange = TRUE;
761 break; 749 break;
762#endif // RT3090 // 750#endif // RT3090 //
763 default: 751 default:
764 break; 752 break;
765 } 753 }
766 754
767 if (bChange) 755 if (bChange) {
768 { 756 reg16 = cpu2le16(Configuration);
769 reg16 = cpu2le16(Configuration); 757 pci_write_config_word(pObj->
770 pci_write_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, reg16); 758 parent_pci_dev,
771 DBGPRINT(RT_DEBUG_TRACE, ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", 759 pAd->
772 pAd->HostLnkCtrlOffset, Configuration)); 760 HostLnkCtrlOffset,
761 reg16);
762 DBGPRINT(RT_DEBUG_TRACE,
763 ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
764 pAd->HostLnkCtrlOffset,
765 Configuration));
766 }
767 } else {
768 pAd->HostLnkCtrlOffset = 0;
769 DBGPRINT(RT_DEBUG_ERROR,
770 ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n",
771 __func__));
773 } 772 }
774 } 773 }
775 else 774 } else {
776 { 775 pAd->RLnkCtrlOffset = 0;
777 pAd->HostLnkCtrlOffset = 0; 776 pAd->HostLnkCtrlOffset = 0;
778 DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n", __func__)); 777 DBGPRINT(RT_DEBUG_ERROR,
779 } 778 ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n",
780 } 779 __func__));
781 } 780 }
782 else 781
783 { 782 if (bFindIntel == FALSE) {
784 pAd->RLnkCtrlOffset = 0; 783 DBGPRINT(RT_DEBUG_TRACE,
785 pAd->HostLnkCtrlOffset = 0; 784 ("Doesn't find Intel PCI host controller. \n"));
786 DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n", __func__));
787 }
788
789 if (bFindIntel == FALSE)
790 {
791 DBGPRINT(RT_DEBUG_TRACE, ("Doesn't find Intel PCI host controller. \n"));
792 // Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff 785 // Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff
793 pAd->PCIePowerSaveLevel = 0xff; 786 pAd->PCIePowerSaveLevel = 0xff;
794 if ((pAd->RLnkCtrlOffset != 0) 787 if ((pAd->RLnkCtrlOffset != 0)
795#ifdef RT3090 788#ifdef RT3090
796 && ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID) 789 && ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
797 ||(pObj->DeviceID == NIC3091_PCIe_DEVICE_ID) 790 || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
798 ||(pObj->DeviceID == NIC3092_PCIe_DEVICE_ID)) 791 || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
799#endif // RT3090 // 792#endif // RT3090 //
800 ) 793 ) {
801 { 794 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
802 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16); 795 &reg16);
803 Configuration = le2cpu16(reg16); 796 Configuration = le2cpu16(reg16);
804 DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n", 797 DBGPRINT(RT_DEBUG_TRACE,
805 pAd->RLnkCtrlOffset, Configuration)); 798 ("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n",
799 pAd->RLnkCtrlOffset, Configuration));
806 pAd->RLnkCtrlConfiguration = (Configuration & 0x103); 800 pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
807 Configuration &= 0xfefc; 801 Configuration &= 0xfefc;
808 Configuration |= (0x0); 802 Configuration |= (0x0);
809 reg16 = cpu2le16(Configuration); 803 reg16 = cpu2le16(Configuration);
810 pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); 804 pci_write_config_word(pObj->pci_dev,
811 DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", 805 pAd->RLnkCtrlOffset, reg16);
812 pos + PCI_EXP_LNKCTL, Configuration)); 806 DBGPRINT(RT_DEBUG_TRACE,
807 ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
808 pos + PCI_EXP_LNKCTL, Configuration));
813 } 809 }
814 } 810 }
815} 811}
816 812
817VOID RTMPFindHostPCIDev( 813VOID RTMPFindHostPCIDev(IN PRTMP_ADAPTER pAd)
818 IN PRTMP_ADAPTER pAd)
819{ 814{
820 USHORT reg16; 815 USHORT reg16;
821 UCHAR reg8; 816 UCHAR reg8;
822 UINT DevFn; 817 UINT DevFn;
823 PPCI_DEV pPci_dev; 818 PPCI_DEV pPci_dev;
824 POS_COOKIE pObj; 819 POS_COOKIE pObj;
825 820
826 pObj = (POS_COOKIE) pAd->OS_Cookie; 821 pObj = (POS_COOKIE) pAd->OS_Cookie;
827 822
828 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) 823 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
829 return; 824 return;
830 825
831 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__)); 826 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
832 827
833 pObj->parent_pci_dev = NULL; 828 pObj->parent_pci_dev = NULL;
834 if (pObj->pci_dev->bus->parent) 829 if (pObj->pci_dev->bus->parent) {
835 { 830 for (DevFn = 0; DevFn < 255; DevFn++) {
836 for (DevFn = 0; DevFn < 255; DevFn++) 831 pPci_dev =
837 { 832 pci_get_slot(pObj->pci_dev->bus->parent, DevFn);
838 pPci_dev = pci_get_slot(pObj->pci_dev->bus->parent, DevFn); 833 if (pPci_dev) {
839 if (pPci_dev) 834 pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE,
840 { 835 &reg16);
841 pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, &reg16); 836 reg16 = le2cpu16(reg16);
842 reg16 = le2cpu16(reg16); 837 pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS,
843 pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, &reg8); 838 &reg8);
844 if ((reg16 == PCI_CLASS_BRIDGE_PCI) && 839 if ((reg16 == PCI_CLASS_BRIDGE_PCI)
845 (reg8 == pObj->pci_dev->bus->number)) 840 && (reg8 == pObj->pci_dev->bus->number)) {
846 { 841 pObj->parent_pci_dev = pPci_dev;
847 pObj->parent_pci_dev = pPci_dev; 842 }
848 } 843 }
849 } 844 }
850 } 845 }
851 }
852} 846}
853 847
854/* 848/*
@@ -862,13 +856,11 @@ VOID RTMPFindHostPCIDev(
862 856
863 ======================================================================== 857 ========================================================================
864*/ 858*/
865VOID RTMPPCIeLinkCtrlValueRestore( 859VOID RTMPPCIeLinkCtrlValueRestore(IN PRTMP_ADAPTER pAd, IN UCHAR Level)
866 IN PRTMP_ADAPTER pAd,
867 IN UCHAR Level)
868{ 860{
869 USHORT PCIePowerSaveLevel, reg16; 861 USHORT PCIePowerSaveLevel, reg16;
870 USHORT Configuration; 862 USHORT Configuration;
871 POS_COOKIE pObj; 863 POS_COOKIE pObj;
872 864
873 pObj = (POS_COOKIE) pAd->OS_Cookie; 865 pObj = (POS_COOKIE) pAd->OS_Cookie;
874 866
@@ -877,7 +869,7 @@ VOID RTMPPCIeLinkCtrlValueRestore(
877 869
878#ifdef RT2860 870#ifdef RT2860
879 if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) 871 if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
880 ||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))) 872 || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
881 return; 873 return;
882#endif // RT2860 // 874#endif // RT2860 //
883 // Check PSControl Configuration 875 // Check PSControl Configuration
@@ -889,60 +881,62 @@ VOID RTMPPCIeLinkCtrlValueRestore(
889 881
890#ifdef RT3090 882#ifdef RT3090
891 if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID) 883 if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
892 ||(pObj->DeviceID == NIC3091_PCIe_DEVICE_ID) 884 || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
893 ||(pObj->DeviceID == NIC3092_PCIe_DEVICE_ID)) 885 || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
894 return; 886 return;
895#endif // RT3090 // 887#endif // RT3090 //
896 888
897 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__)); 889 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
898 PCIePowerSaveLevel = pAd->PCIePowerSaveLevel; 890 PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
899 if ((PCIePowerSaveLevel&0xff) == 0xff) 891 if ((PCIePowerSaveLevel & 0xff) == 0xff) {
900 { 892 DBGPRINT(RT_DEBUG_TRACE, ("return \n"));
901 DBGPRINT(RT_DEBUG_TRACE,("return \n"));
902 return; 893 return;
903 } 894 }
904 895
905 if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) 896 if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) {
906 { 897 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
907 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); 898 Configuration);
908 if ((Configuration != 0) && 899 if ((Configuration != 0) && (Configuration != 0xFFFF)) {
909 (Configuration != 0xFFFF)) 900 Configuration &= 0xfefc;
910 { 901 // If call from interface down, restore to orginial setting.
911 Configuration &= 0xfefc; 902 if (Level == RESTORE_CLOSE) {
912 // If call from interface down, restore to orginial setting. 903 Configuration |= pAd->HostLnkCtrlConfiguration;
913 if (Level == RESTORE_CLOSE) 904 } else
914 { 905 Configuration |= 0x0;
915 Configuration |= pAd->HostLnkCtrlConfiguration; 906 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev,
916 } 907 pAd->HostLnkCtrlOffset,
917 else 908 Configuration);
918 Configuration |= 0x0; 909 DBGPRINT(RT_DEBUG_TRACE,
919 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); 910 ("Restore PCI host : offset 0x%x = 0x%x\n",
920 DBGPRINT(RT_DEBUG_TRACE, ("Restore PCI host : offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration)); 911 pAd->HostLnkCtrlOffset, Configuration));
921 } 912 } else
922 else 913 DBGPRINT(RT_DEBUG_ERROR,
923 DBGPRINT(RT_DEBUG_ERROR, ("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration)); 914 ("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n",
924 } 915 Configuration));
925 916 }
926 if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) 917
927 { 918 if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) {
928 PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); 919 PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
929 if ((Configuration != 0) && 920 Configuration);
930 (Configuration != 0xFFFF)) 921 if ((Configuration != 0) && (Configuration != 0xFFFF)) {
931 { 922 Configuration &= 0xfefc;
932 Configuration &= 0xfefc;
933 // If call from interface down, restore to orginial setting. 923 // If call from interface down, restore to orginial setting.
934 if (Level == RESTORE_CLOSE) 924 if (Level == RESTORE_CLOSE)
935 Configuration |= pAd->RLnkCtrlConfiguration; 925 Configuration |= pAd->RLnkCtrlConfiguration;
936 else 926 else
937 Configuration |= 0x0; 927 Configuration |= 0x0;
938 PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); 928 PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
939 DBGPRINT(RT_DEBUG_TRACE, ("Restore Ralink : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration)); 929 Configuration);
940 } 930 DBGPRINT(RT_DEBUG_TRACE,
941 else 931 ("Restore Ralink : offset 0x%x = 0x%x\n",
942 DBGPRINT(RT_DEBUG_ERROR, ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration)); 932 pAd->RLnkCtrlOffset, Configuration));
933 } else
934 DBGPRINT(RT_DEBUG_ERROR,
935 ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n",
936 Configuration));
943 } 937 }
944 938
945 DBGPRINT(RT_DEBUG_TRACE,("%s <===\n", __func__)); 939 DBGPRINT(RT_DEBUG_TRACE, ("%s <===\n", __func__));
946} 940}
947 941
948/* 942/*
@@ -956,13 +950,11 @@ VOID RTMPPCIeLinkCtrlValueRestore(
956 950
957 ======================================================================== 951 ========================================================================
958*/ 952*/
959VOID RTMPPCIeLinkCtrlSetting( 953VOID RTMPPCIeLinkCtrlSetting(IN PRTMP_ADAPTER pAd, IN USHORT Max)
960 IN PRTMP_ADAPTER pAd,
961 IN USHORT Max)
962{ 954{
963 USHORT PCIePowerSaveLevel, reg16; 955 USHORT PCIePowerSaveLevel, reg16;
964 USHORT Configuration; 956 USHORT Configuration;
965 POS_COOKIE pObj; 957 POS_COOKIE pObj;
966 958
967 pObj = (POS_COOKIE) pAd->OS_Cookie; 959 pObj = (POS_COOKIE) pAd->OS_Cookie;
968 960
@@ -971,7 +963,7 @@ VOID RTMPPCIeLinkCtrlSetting(
971 963
972#ifdef RT2860 964#ifdef RT2860
973 if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) 965 if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
974 ||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))) 966 || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
975 return; 967 return;
976#endif // RT2860 // 968#endif // RT2860 //
977 // Check PSControl Configuration 969 // Check PSControl Configuration
@@ -983,94 +975,97 @@ VOID RTMPPCIeLinkCtrlSetting(
983 975
984#ifdef RT3090 976#ifdef RT3090
985 if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID) 977 if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
986 ||(pObj->DeviceID == NIC3091_PCIe_DEVICE_ID) 978 || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
987 ||(pObj->DeviceID == NIC3092_PCIe_DEVICE_ID)) 979 || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
988 return; 980 return;
989#endif // RT3090 // 981#endif // RT3090 //
990 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)) 982 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)) {
991 { 983 DBGPRINT(RT_DEBUG_INFO,
992 DBGPRINT(RT_DEBUG_INFO, ("RTMPPCIePowerLinkCtrl return on fRTMP_PS_CAN_GO_SLEEP flag\n")); 984 ("RTMPPCIePowerLinkCtrl return on fRTMP_PS_CAN_GO_SLEEP flag\n"));
993 return; 985 return;
994 } 986 }
995 987
996 DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __func__)); 988 DBGPRINT(RT_DEBUG_TRACE, ("%s===>\n", __func__));
997 PCIePowerSaveLevel = pAd->PCIePowerSaveLevel; 989 PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
998 if ((PCIePowerSaveLevel&0xff) == 0xff) 990 if ((PCIePowerSaveLevel & 0xff) == 0xff) {
999 { 991 DBGPRINT(RT_DEBUG_TRACE, ("return \n"));
1000 DBGPRINT(RT_DEBUG_TRACE,("return \n"));
1001 return; 992 return;
1002 } 993 }
1003 PCIePowerSaveLevel = PCIePowerSaveLevel>>6; 994 PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
1004 995
1005 // Skip non-exist deice right away 996 // Skip non-exist deice right away
1006 if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) 997 if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) {
1007 { 998 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
1008 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); 999 Configuration);
1009 switch (PCIePowerSaveLevel) 1000 switch (PCIePowerSaveLevel) {
1010 { 1001 case 0:
1011 case 0: 1002 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00
1012 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 1003 Configuration &= 0xfefc;
1013 Configuration &= 0xfefc; 1004 break;
1014 break; 1005 case 1:
1015 case 1: 1006 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01
1016 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 1007 Configuration &= 0xfefc;
1017 Configuration &= 0xfefc; 1008 Configuration |= 0x1;
1018 Configuration |= 0x1; 1009 break;
1019 break; 1010 case 2:
1020 case 2: 1011 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11
1021 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 1012 Configuration &= 0xfefc;
1022 Configuration &= 0xfefc; 1013 Configuration |= 0x3;
1023 Configuration |= 0x3; 1014 break;
1024 break; 1015 case 3:
1025 case 3: 1016 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1
1026 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1 1017 Configuration &= 0xfefc;
1027 Configuration &= 0xfefc; 1018 Configuration |= 0x103;
1028 Configuration |= 0x103; 1019 break;
1029 break;
1030 } 1020 }
1031 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); 1021 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
1032 DBGPRINT(RT_DEBUG_TRACE, ("Write PCI host offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration)); 1022 Configuration);
1023 DBGPRINT(RT_DEBUG_TRACE,
1024 ("Write PCI host offset 0x%x = 0x%x\n",
1025 pAd->HostLnkCtrlOffset, Configuration));
1033 } 1026 }
1034 1027
1035 if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) 1028 if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) {
1036 {
1037 // first 2892 chip not allow to frequently set mode 3. will cause hang problem. 1029 // first 2892 chip not allow to frequently set mode 3. will cause hang problem.
1038 if (PCIePowerSaveLevel > Max) 1030 if (PCIePowerSaveLevel > Max)
1039 PCIePowerSaveLevel = Max; 1031 PCIePowerSaveLevel = Max;
1040 1032
1041 PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); 1033 PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
1042 switch (PCIePowerSaveLevel) 1034 Configuration);
1043 { 1035 switch (PCIePowerSaveLevel) {
1044 case 0: 1036 case 0:
1045 // No PCI power safe 1037 // No PCI power safe
1046 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 . 1038 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 .
1047 Configuration &= 0xfefc; 1039 Configuration &= 0xfefc;
1048 break; 1040 break;
1049 case 1: 1041 case 1:
1050 // L0 1042 // L0
1051 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 . 1043 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 .
1052 Configuration &= 0xfefc; 1044 Configuration &= 0xfefc;
1053 Configuration |= 0x1; 1045 Configuration |= 0x1;
1054 break; 1046 break;
1055 case 2: 1047 case 2:
1056 // L0 and L1 1048 // L0 and L1
1057 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 1049 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11
1058 Configuration &= 0xfefc; 1050 Configuration &= 0xfefc;
1059 Configuration |= 0x3; 1051 Configuration |= 0x3;
1060 break; 1052 break;
1061 case 3: 1053 case 3:
1062 // L0 , L1 and clock management. 1054 // L0 , L1 and clock management.
1063 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1 1055 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1
1064 Configuration &= 0xfefc; 1056 Configuration &= 0xfefc;
1065 Configuration |= 0x103; 1057 Configuration |= 0x103;
1066 pAd->bPCIclkOff = TRUE; 1058 pAd->bPCIclkOff = TRUE;
1067 break; 1059 break;
1068 } 1060 }
1069 PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); 1061 PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
1070 DBGPRINT(RT_DEBUG_TRACE, ("Write Ralink device : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration)); 1062 Configuration);
1063 DBGPRINT(RT_DEBUG_TRACE,
1064 ("Write Ralink device : offset 0x%x = 0x%x\n",
1065 pAd->RLnkCtrlOffset, Configuration));
1071 } 1066 }
1072 1067
1073 DBGPRINT(RT_DEBUG_TRACE,("RTMPPCIePowerLinkCtrl <==============\n")); 1068 DBGPRINT(RT_DEBUG_TRACE, ("RTMPPCIePowerLinkCtrl <==============\n"));
1074} 1069}
1075 1070
1076/* 1071/*
@@ -1081,15 +1076,14 @@ VOID RTMPPCIeLinkCtrlSetting(
1081 1076
1082 ======================================================================== 1077 ========================================================================
1083*/ 1078*/
1084VOID RTMPrt3xSetPCIePowerLinkCtrl( 1079VOID RTMPrt3xSetPCIePowerLinkCtrl(IN PRTMP_ADAPTER pAd)
1085 IN PRTMP_ADAPTER pAd)
1086{ 1080{
1087 1081
1088 ULONG HostConfiguration = 0; 1082 ULONG HostConfiguration = 0;
1089 ULONG Configuration; 1083 ULONG Configuration;
1090 POS_COOKIE pObj; 1084 POS_COOKIE pObj;
1091 INT pos; 1085 INT pos;
1092 USHORT reg16; 1086 USHORT reg16;
1093 1087
1094 pObj = (POS_COOKIE) pAd->OS_Cookie; 1088 pObj = (POS_COOKIE) pAd->OS_Cookie;
1095 1089
@@ -1101,28 +1095,28 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
1101 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) 1095 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
1102 return; 1096 return;
1103 RTMPFindHostPCIDev(pAd); 1097 RTMPFindHostPCIDev(pAd);
1104 if (pObj->parent_pci_dev) 1098 if (pObj->parent_pci_dev) {
1105 {
1106 // Find PCI-to-PCI Bridge Express Capability Offset 1099 // Find PCI-to-PCI Bridge Express Capability Offset
1107 pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP); 1100 pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP);
1108 1101
1109 if (pos != 0) 1102 if (pos != 0) {
1110 {
1111 pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL; 1103 pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
1112 } 1104 }
1113 // If configurared to turn on L1. 1105 // If configurared to turn on L1.
1114 HostConfiguration = 0; 1106 HostConfiguration = 0;
1115 if (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1) 1107 if (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1) {
1116 { 1108 DBGPRINT(RT_DEBUG_TRACE, ("Enter,PSM : Force ASPM \n"));
1117 DBGPRINT(RT_DEBUG_TRACE, ("Enter,PSM : Force ASPM \n"));
1118 1109
1119 // Skip non-exist deice right away 1110 // Skip non-exist deice right away
1120 if ((pAd->HostLnkCtrlOffset != 0)) 1111 if ((pAd->HostLnkCtrlOffset != 0)) {
1121 { 1112 PCI_REG_READ_WORD(pObj->parent_pci_dev,
1122 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); 1113 pAd->HostLnkCtrlOffset,
1114 HostConfiguration);
1123 // Prepare Configuration to write to Host 1115 // Prepare Configuration to write to Host
1124 HostConfiguration |= 0x3; 1116 HostConfiguration |= 0x3;
1125 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); 1117 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev,
1118 pAd->HostLnkCtrlOffset,
1119 HostConfiguration);
1126 pAd->Rt3xxHostLinkCtrl = HostConfiguration; 1120 pAd->Rt3xxHostLinkCtrl = HostConfiguration;
1127 // Because in rt30xxForceASPMTest Mode, Force turn on L0s, L1. 1121 // Because in rt30xxForceASPMTest Mode, Force turn on L0s, L1.
1128 // Fix HostConfiguration bit0:1 = 0x3 for later use. 1122 // Fix HostConfiguration bit0:1 = 0x3 for later use.
@@ -1132,14 +1126,14 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
1132 "Host device L1/L0s Value = 0x%lx\n", 1126 "Host device L1/L0s Value = 0x%lx\n",
1133 HostConfiguration)); 1127 HostConfiguration));
1134 } 1128 }
1135 } 1129 } else if (pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM ==
1136 else if (pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1) 1130 1) {
1137 {
1138 1131
1139 // Skip non-exist deice right away 1132 // Skip non-exist deice right away
1140 if ((pAd->HostLnkCtrlOffset != 0)) 1133 if ((pAd->HostLnkCtrlOffset != 0)) {
1141 { 1134 PCI_REG_READ_WORD(pObj->parent_pci_dev,
1142 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); 1135 pAd->HostLnkCtrlOffset,
1136 HostConfiguration);
1143 pAd->Rt3xxHostLinkCtrl = HostConfiguration; 1137 pAd->Rt3xxHostLinkCtrl = HostConfiguration;
1144 HostConfiguration &= 0x3; 1138 HostConfiguration &= 0x3;
1145 DBGPRINT(RT_DEBUG_TRACE, 1139 DBGPRINT(RT_DEBUG_TRACE,
@@ -1148,49 +1142,49 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
1148 HostConfiguration)); 1142 HostConfiguration));
1149 } 1143 }
1150 } 1144 }
1151 } 1145 }
1152 // Prepare to write Ralink setting. 1146 // Prepare to write Ralink setting.
1153 // Find Ralink PCIe Device's Express Capability Offset 1147 // Find Ralink PCIe Device's Express Capability Offset
1154 pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP); 1148 pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
1155 1149
1156 if (pos != 0) 1150 if (pos != 0) {
1157 { 1151 // Ralink PCIe Device's Link Control Register Offset
1158 // Ralink PCIe Device's Link Control Register Offset 1152 pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
1159 pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL; 1153 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
1160 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16); 1154 &reg16);
1161 Configuration = le2cpu16(reg16); 1155 Configuration = le2cpu16(reg16);
1162 DBGPRINT(RT_DEBUG_TRACE, 1156 DBGPRINT(RT_DEBUG_TRACE,
1163 ("Read (Ralink PCIe Link Control Register) " 1157 ("Read (Ralink PCIe Link Control Register) "
1164 "offset 0x%x = 0x%lx\n", 1158 "offset 0x%x = 0x%lx\n",
1165 pAd->RLnkCtrlOffset, Configuration)); 1159 pAd->RLnkCtrlOffset, Configuration));
1166 Configuration |= 0x100; 1160 Configuration |= 0x100;
1167 if ((pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1) 1161 if ((pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1)
1168 || (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1)) 1162 || (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1)) {
1169 { 1163 switch (HostConfiguration) {
1170 switch(HostConfiguration) 1164 case 0:
1171 { 1165 Configuration &= 0xffffffc;
1172 case 0: 1166 break;
1173 Configuration &= 0xffffffc; 1167 case 1:
1174 break; 1168 Configuration &= 0xffffffc;
1175 case 1: 1169 Configuration |= 0x1;
1176 Configuration &= 0xffffffc; 1170 break;
1177 Configuration |= 0x1; 1171 case 2:
1178 break; 1172 Configuration &= 0xffffffc;
1179 case 2: 1173 Configuration |= 0x2;
1180 Configuration &= 0xffffffc; 1174 break;
1181 Configuration |= 0x2; 1175 case 3:
1182 break; 1176 Configuration |= 0x3;
1183 case 3: 1177 break;
1184 Configuration |= 0x3;
1185 break;
1186 } 1178 }
1187 } 1179 }
1188 reg16 = cpu2le16(Configuration); 1180 reg16 = cpu2le16(Configuration);
1189 pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); 1181 pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
1182 reg16);
1190 pAd->Rt3xxRalinkLinkCtrl = Configuration; 1183 pAd->Rt3xxRalinkLinkCtrl = Configuration;
1191 DBGPRINT(RT_DEBUG_TRACE, 1184 DBGPRINT(RT_DEBUG_TRACE,
1192 ("PSM :Write Ralink device L1/L0s Value = 0x%lx\n", 1185 ("PSM :Write Ralink device L1/L0s Value = 0x%lx\n",
1193 Configuration)); 1186 Configuration));
1194 } 1187 }
1195 DBGPRINT(RT_DEBUG_INFO,("PSM :RTMPrt3xSetPCIePowerLinkCtrl <==============\n")); 1188 DBGPRINT(RT_DEBUG_INFO,
1189 ("PSM :RTMPrt3xSetPCIePowerLinkCtrl <==============\n"));
1196} 1190}
diff --git a/drivers/staging/rt2860/rt_linux.c b/drivers/staging/rt2860/rt_linux.c
index d57013fb7bf..fd577e08082 100644
--- a/drivers/staging/rt2860/rt_linux.c
+++ b/drivers/staging/rt2860/rt_linux.c
@@ -28,128 +28,114 @@
28#include <linux/sched.h> 28#include <linux/sched.h>
29#include "rt_config.h" 29#include "rt_config.h"
30 30
31ULONG RTDebugLevel = RT_DEBUG_ERROR; 31ULONG RTDebugLevel = RT_DEBUG_ERROR;
32
33 32
34// for wireless system event message 33// for wireless system event message
35char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = { 34char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
36 // system status event 35 // system status event
37 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */ 36 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
38 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */ 37 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
39 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */ 38 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
40 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */ 39 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
41 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */ 40 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
42 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */ 41 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
43 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */ 42 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
44 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */ 43 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
45 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */ 44 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
46 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */ 45 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
47 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */ 46 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
48 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */ 47 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
49 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */ 48 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
50 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */ 49 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
51 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */ 50 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
52 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */ 51 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
53 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */ 52 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
54 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */ 53 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
55 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */ 54 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
56 }; 55};
57 56
58// for wireless IDS_spoof_attack event message 57// for wireless IDS_spoof_attack event message
59char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = { 58char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
60 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */ 59 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
61 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */ 60 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
62 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */ 61 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
63 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */ 62 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
64 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */ 63 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
65 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */ 64 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
66 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */ 65 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
67 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */ 66 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
68 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */ 67 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
69 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */ 68 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
70 }; 69};
71 70
72// for wireless IDS_flooding_attack event message 71// for wireless IDS_flooding_attack event message
73char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = { 72char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
74 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */ 73 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
75 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */ 74 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
76 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */ 75 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
77 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */ 76 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
78 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */ 77 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
79 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */ 78 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
80 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */ 79 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
81 }; 80};
82 81
83/* timeout -- ms */ 82/* timeout -- ms */
84VOID RTMP_SetPeriodicTimer( 83VOID RTMP_SetPeriodicTimer(IN NDIS_MINIPORT_TIMER * pTimer,
85 IN NDIS_MINIPORT_TIMER *pTimer, 84 IN unsigned long timeout)
86 IN unsigned long timeout)
87{ 85{
88 timeout = ((timeout*OS_HZ) / 1000); 86 timeout = ((timeout * OS_HZ) / 1000);
89 pTimer->expires = jiffies + timeout; 87 pTimer->expires = jiffies + timeout;
90 add_timer(pTimer); 88 add_timer(pTimer);
91} 89}
92 90
93/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */ 91/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
94VOID RTMP_OS_Init_Timer( 92VOID RTMP_OS_Init_Timer(IN PRTMP_ADAPTER pAd,
95 IN PRTMP_ADAPTER pAd, 93 IN NDIS_MINIPORT_TIMER * pTimer,
96 IN NDIS_MINIPORT_TIMER *pTimer, 94 IN TIMER_FUNCTION function, IN PVOID data)
97 IN TIMER_FUNCTION function,
98 IN PVOID data)
99{ 95{
100 init_timer(pTimer); 96 init_timer(pTimer);
101 pTimer->data = (unsigned long)data; 97 pTimer->data = (unsigned long)data;
102 pTimer->function = function; 98 pTimer->function = function;
103} 99}
104 100
105 101VOID RTMP_OS_Add_Timer(IN NDIS_MINIPORT_TIMER * pTimer,
106VOID RTMP_OS_Add_Timer( 102 IN unsigned long timeout)
107 IN NDIS_MINIPORT_TIMER *pTimer,
108 IN unsigned long timeout)
109{ 103{
110 if (timer_pending(pTimer)) 104 if (timer_pending(pTimer))
111 return; 105 return;
112 106
113 timeout = ((timeout*OS_HZ) / 1000); 107 timeout = ((timeout * OS_HZ) / 1000);
114 pTimer->expires = jiffies + timeout; 108 pTimer->expires = jiffies + timeout;
115 add_timer(pTimer); 109 add_timer(pTimer);
116} 110}
117 111
118VOID RTMP_OS_Mod_Timer( 112VOID RTMP_OS_Mod_Timer(IN NDIS_MINIPORT_TIMER * pTimer,
119 IN NDIS_MINIPORT_TIMER *pTimer, 113 IN unsigned long timeout)
120 IN unsigned long timeout)
121{ 114{
122 timeout = ((timeout*OS_HZ) / 1000); 115 timeout = ((timeout * OS_HZ) / 1000);
123 mod_timer(pTimer, jiffies + timeout); 116 mod_timer(pTimer, jiffies + timeout);
124} 117}
125 118
126VOID RTMP_OS_Del_Timer( 119VOID RTMP_OS_Del_Timer(IN NDIS_MINIPORT_TIMER * pTimer,
127 IN NDIS_MINIPORT_TIMER *pTimer, 120 OUT BOOLEAN * pCancelled)
128 OUT BOOLEAN *pCancelled)
129{ 121{
130 if (timer_pending(pTimer)) 122 if (timer_pending(pTimer)) {
131 {
132 *pCancelled = del_timer_sync(pTimer); 123 *pCancelled = del_timer_sync(pTimer);
133 } 124 } else {
134 else
135 {
136 *pCancelled = TRUE; 125 *pCancelled = TRUE;
137 } 126 }
138 127
139} 128}
140 129
141VOID RTMP_OS_Release_Packet( 130VOID RTMP_OS_Release_Packet(IN PRTMP_ADAPTER pAd, IN PQUEUE_ENTRY pEntry)
142 IN PRTMP_ADAPTER pAd,
143 IN PQUEUE_ENTRY pEntry)
144{ 131{
145 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry); 132 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
146} 133}
147 134
148// Unify all delay routine by using udelay 135// Unify all delay routine by using udelay
149VOID RTMPusecDelay( 136VOID RTMPusecDelay(IN ULONG usec)
150 IN ULONG usec)
151{ 137{
152 ULONG i; 138 ULONG i;
153 139
154 for (i = 0; i < (usec / 50); i++) 140 for (i = 0; i < (usec / 50); i++)
155 udelay(50); 141 udelay(50);
@@ -158,16 +144,13 @@ VOID RTMPusecDelay(
158 udelay(usec % 50); 144 udelay(usec % 50);
159} 145}
160 146
161void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time) 147void RTMP_GetCurrentSystemTime(LARGE_INTEGER * time)
162{ 148{
163 time->u.LowPart = jiffies; 149 time->u.LowPart = jiffies;
164} 150}
165 151
166// pAd MUST allow to be NULL 152// pAd MUST allow to be NULL
167NDIS_STATUS os_alloc_mem( 153NDIS_STATUS os_alloc_mem(IN RTMP_ADAPTER * pAd, OUT UCHAR ** mem, IN ULONG size)
168 IN RTMP_ADAPTER *pAd,
169 OUT UCHAR **mem,
170 IN ULONG size)
171{ 154{
172 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC); 155 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
173 if (*mem) 156 if (*mem)
@@ -177,9 +160,7 @@ NDIS_STATUS os_alloc_mem(
177} 160}
178 161
179// pAd MUST allow to be NULL 162// pAd MUST allow to be NULL
180NDIS_STATUS os_free_mem( 163NDIS_STATUS os_free_mem(IN PRTMP_ADAPTER pAd, IN PVOID mem)
181 IN PRTMP_ADAPTER pAd,
182 IN PVOID mem)
183{ 164{
184 165
185 ASSERT(mem); 166 ASSERT(mem);
@@ -187,80 +168,64 @@ NDIS_STATUS os_free_mem(
187 return (NDIS_STATUS_SUCCESS); 168 return (NDIS_STATUS_SUCCESS);
188} 169}
189 170
190 171PNDIS_PACKET RtmpOSNetPktAlloc(IN RTMP_ADAPTER * pAd, IN int size)
191
192
193PNDIS_PACKET RtmpOSNetPktAlloc(
194 IN RTMP_ADAPTER *pAd,
195 IN int size)
196{ 172{
197 struct sk_buff *skb; 173 struct sk_buff *skb;
198 /* Add 2 more bytes for ip header alignment*/ 174 /* Add 2 more bytes for ip header alignment */
199 skb = dev_alloc_skb(size+2); 175 skb = dev_alloc_skb(size + 2);
200 176
201 return ((PNDIS_PACKET)skb); 177 return ((PNDIS_PACKET) skb);
202} 178}
203 179
204 180PNDIS_PACKET RTMP_AllocateFragPacketBuffer(IN PRTMP_ADAPTER pAd,
205PNDIS_PACKET RTMP_AllocateFragPacketBuffer( 181 IN ULONG Length)
206 IN PRTMP_ADAPTER pAd,
207 IN ULONG Length)
208{ 182{
209 struct sk_buff *pkt; 183 struct sk_buff *pkt;
210 184
211 pkt = dev_alloc_skb(Length); 185 pkt = dev_alloc_skb(Length);
212 186
213 if (pkt == NULL) 187 if (pkt == NULL) {
214 { 188 DBGPRINT(RT_DEBUG_ERROR,
215 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length)); 189 ("can't allocate frag rx %ld size packet\n", Length));
216 } 190 }
217 191
218 if (pkt) 192 if (pkt) {
219 {
220 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); 193 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
221 } 194 }
222 195
223 return (PNDIS_PACKET) pkt; 196 return (PNDIS_PACKET) pkt;
224} 197}
225 198
226 199PNDIS_PACKET RTMP_AllocateTxPacketBuffer(IN PRTMP_ADAPTER pAd,
227PNDIS_PACKET RTMP_AllocateTxPacketBuffer( 200 IN ULONG Length,
228 IN PRTMP_ADAPTER pAd, 201 IN BOOLEAN Cached,
229 IN ULONG Length, 202 OUT PVOID * VirtualAddress)
230 IN BOOLEAN Cached,
231 OUT PVOID *VirtualAddress)
232{ 203{
233 struct sk_buff *pkt; 204 struct sk_buff *pkt;
234 205
235 pkt = dev_alloc_skb(Length); 206 pkt = dev_alloc_skb(Length);
236 207
237 if (pkt == NULL) 208 if (pkt == NULL) {
238 { 209 DBGPRINT(RT_DEBUG_ERROR,
239 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length)); 210 ("can't allocate tx %ld size packet\n", Length));
240 } 211 }
241 212
242 if (pkt) 213 if (pkt) {
243 {
244 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); 214 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
245 *VirtualAddress = (PVOID) pkt->data; 215 *VirtualAddress = (PVOID) pkt->data;
246 } 216 } else {
247 else
248 {
249 *VirtualAddress = (PVOID) NULL; 217 *VirtualAddress = (PVOID) NULL;
250 } 218 }
251 219
252 return (PNDIS_PACKET) pkt; 220 return (PNDIS_PACKET) pkt;
253} 221}
254 222
255 223VOID build_tx_packet(IN PRTMP_ADAPTER pAd,
256VOID build_tx_packet( 224 IN PNDIS_PACKET pPacket,
257 IN PRTMP_ADAPTER pAd, 225 IN PUCHAR pFrame, IN ULONG FrameLen)
258 IN PNDIS_PACKET pPacket,
259 IN PUCHAR pFrame,
260 IN ULONG FrameLen)
261{ 226{
262 227
263 struct sk_buff *pTxPkt; 228 struct sk_buff *pTxPkt;
264 229
265 ASSERT(pPacket); 230 ASSERT(pPacket);
266 pTxPkt = RTPKT_TO_OSPKT(pPacket); 231 pTxPkt = RTPKT_TO_OSPKT(pPacket);
@@ -268,40 +233,36 @@ VOID build_tx_packet(
268 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen); 233 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
269} 234}
270 235
271VOID RTMPFreeAdapter( 236VOID RTMPFreeAdapter(IN PRTMP_ADAPTER pAd)
272 IN PRTMP_ADAPTER pAd)
273{ 237{
274 POS_COOKIE os_cookie; 238 POS_COOKIE os_cookie;
275 int index; 239 int index;
276 240
277 os_cookie=(POS_COOKIE)pAd->OS_Cookie; 241 os_cookie = (POS_COOKIE) pAd->OS_Cookie;
278 242
279 if (pAd->BeaconBuf) 243 if (pAd->BeaconBuf)
280 kfree(pAd->BeaconBuf); 244 kfree(pAd->BeaconBuf);
281
282 245
283 NdisFreeSpinLock(&pAd->MgmtRingLock); 246 NdisFreeSpinLock(&pAd->MgmtRingLock);
284 247
285#ifdef RTMP_MAC_PCI 248#ifdef RTMP_MAC_PCI
286 NdisFreeSpinLock(&pAd->RxRingLock); 249 NdisFreeSpinLock(&pAd->RxRingLock);
287#ifdef RT3090 250#ifdef RT3090
288NdisFreeSpinLock(&pAd->McuCmdLock); 251 NdisFreeSpinLock(&pAd->McuCmdLock);
289#endif // RT3090 // 252#endif // RT3090 //
290#endif // RTMP_MAC_PCI // 253#endif // RTMP_MAC_PCI //
291 254
292 for (index =0 ; index < NUM_OF_TX_RING; index++) 255 for (index = 0; index < NUM_OF_TX_RING; index++) {
293 { 256 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
294 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
295 NdisFreeSpinLock(&pAd->DeQueueLock[index]); 257 NdisFreeSpinLock(&pAd->DeQueueLock[index]);
296 pAd->DeQueueRunning[index] = FALSE; 258 pAd->DeQueueRunning[index] = FALSE;
297 } 259 }
298 260
299 NdisFreeSpinLock(&pAd->irq_lock); 261 NdisFreeSpinLock(&pAd->irq_lock);
300 262
301 263 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
302 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
303 if (os_cookie) 264 if (os_cookie)
304 kfree(os_cookie); 265 kfree(os_cookie);
305} 266}
306 267
307BOOLEAN OS_Need_Clone_Packet(void) 268BOOLEAN OS_Need_Clone_Packet(void)
@@ -309,8 +270,6 @@ BOOLEAN OS_Need_Clone_Packet(void)
309 return (FALSE); 270 return (FALSE);
310} 271}
311 272
312
313
314/* 273/*
315 ======================================================================== 274 ========================================================================
316 275
@@ -333,11 +292,10 @@ BOOLEAN OS_Need_Clone_Packet(void)
333 292
334 ======================================================================== 293 ========================================================================
335*/ 294*/
336NDIS_STATUS RTMPCloneNdisPacket( 295NDIS_STATUS RTMPCloneNdisPacket(IN PRTMP_ADAPTER pAd,
337 IN PRTMP_ADAPTER pAd, 296 IN BOOLEAN pInsAMSDUHdr,
338 IN BOOLEAN pInsAMSDUHdr, 297 IN PNDIS_PACKET pInPacket,
339 IN PNDIS_PACKET pInPacket, 298 OUT PNDIS_PACKET * ppOutPacket)
340 OUT PNDIS_PACKET *ppOutPacket)
341{ 299{
342 300
343 struct sk_buff *pkt; 301 struct sk_buff *pkt;
@@ -348,16 +306,15 @@ NDIS_STATUS RTMPCloneNdisPacket(
348 // 1. Allocate a packet 306 // 1. Allocate a packet
349 pkt = dev_alloc_skb(2048); 307 pkt = dev_alloc_skb(2048);
350 308
351 if (pkt == NULL) 309 if (pkt == NULL) {
352 {
353 return NDIS_STATUS_FAILURE; 310 return NDIS_STATUS_FAILURE;
354 } 311 }
355 312
356 skb_put(pkt, GET_OS_PKT_LEN(pInPacket)); 313 skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
357 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket)); 314 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket),
315 GET_OS_PKT_LEN(pInPacket));
358 *ppOutPacket = OSPKT_TO_RTPKT(pkt); 316 *ppOutPacket = OSPKT_TO_RTPKT(pkt);
359 317
360
361 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); 318 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
362 319
363 printk("###Clone###\n"); 320 printk("###Clone###\n");
@@ -365,42 +322,40 @@ NDIS_STATUS RTMPCloneNdisPacket(
365 return NDIS_STATUS_SUCCESS; 322 return NDIS_STATUS_SUCCESS;
366} 323}
367 324
368
369// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket() 325// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
370NDIS_STATUS RTMPAllocateNdisPacket( 326NDIS_STATUS RTMPAllocateNdisPacket(IN PRTMP_ADAPTER pAd,
371 IN PRTMP_ADAPTER pAd, 327 OUT PNDIS_PACKET * ppPacket,
372 OUT PNDIS_PACKET *ppPacket, 328 IN PUCHAR pHeader,
373 IN PUCHAR pHeader, 329 IN UINT HeaderLen,
374 IN UINT HeaderLen, 330 IN PUCHAR pData, IN UINT DataLen)
375 IN PUCHAR pData,
376 IN UINT DataLen)
377{ 331{
378 PNDIS_PACKET pPacket; 332 PNDIS_PACKET pPacket;
379 ASSERT(pData); 333 ASSERT(pData);
380 ASSERT(DataLen); 334 ASSERT(DataLen);
381 335
382 // 1. Allocate a packet 336 // 1. Allocate a packet
383 pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING); 337 pPacket =
384 if (pPacket == NULL) 338 (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen +
385 { 339 RTMP_PKT_TAIL_PADDING);
340 if (pPacket == NULL) {
386 *ppPacket = NULL; 341 *ppPacket = NULL;
387#ifdef DEBUG 342#ifdef DEBUG
388 printk("RTMPAllocateNdisPacket Fail\n\n"); 343 printk("RTMPAllocateNdisPacket Fail\n\n");
389#endif 344#endif
390 return NDIS_STATUS_FAILURE; 345 return NDIS_STATUS_FAILURE;
391 } 346 }
392
393 // 2. clone the frame content 347 // 2. clone the frame content
394 if (HeaderLen > 0) 348 if (HeaderLen > 0)
395 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen); 349 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
396 if (DataLen > 0) 350 if (DataLen > 0)
397 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen); 351 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData,
352 DataLen);
398 353
399 // 3. update length of packet 354 // 3. update length of packet
400 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen); 355 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen + DataLen);
401 356
402 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); 357 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
403// printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket)); 358// printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
404 *ppPacket = pPacket; 359 *ppPacket = pPacket;
405 return NDIS_STATUS_SUCCESS; 360 return NDIS_STATUS_SUCCESS;
406} 361}
@@ -412,38 +367,30 @@ NDIS_STATUS RTMPAllocateNdisPacket(
412 corresponding NDIS_BUFFER and allocated memory. 367 corresponding NDIS_BUFFER and allocated memory.
413 ======================================================================== 368 ========================================================================
414*/ 369*/
415VOID RTMPFreeNdisPacket( 370VOID RTMPFreeNdisPacket(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket)
416 IN PRTMP_ADAPTER pAd,
417 IN PNDIS_PACKET pPacket)
418{ 371{
419 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket)); 372 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
420} 373}
421 374
422
423// IRQL = DISPATCH_LEVEL 375// IRQL = DISPATCH_LEVEL
424// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same 376// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
425// scatter gather buffer 377// scatter gather buffer
426NDIS_STATUS Sniff2BytesFromNdisBuffer( 378NDIS_STATUS Sniff2BytesFromNdisBuffer(IN PNDIS_BUFFER pFirstBuffer,
427 IN PNDIS_BUFFER pFirstBuffer, 379 IN UCHAR DesiredOffset,
428 IN UCHAR DesiredOffset, 380 OUT PUCHAR pByte0, OUT PUCHAR pByte1)
429 OUT PUCHAR pByte0,
430 OUT PUCHAR pByte1)
431{ 381{
432 *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset); 382 *pByte0 = *(PUCHAR) (pFirstBuffer + DesiredOffset);
433 *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1); 383 *pByte1 = *(PUCHAR) (pFirstBuffer + DesiredOffset + 1);
434 384
435 return NDIS_STATUS_SUCCESS; 385 return NDIS_STATUS_SUCCESS;
436} 386}
437 387
438 388void RTMP_QueryPacketInfo(IN PNDIS_PACKET pPacket,
439void RTMP_QueryPacketInfo( 389 OUT PACKET_INFO * pPacketInfo,
440 IN PNDIS_PACKET pPacket, 390 OUT PUCHAR * pSrcBufVA, OUT UINT * pSrcBufLen)
441 OUT PACKET_INFO *pPacketInfo,
442 OUT PUCHAR *pSrcBufVA,
443 OUT UINT *pSrcBufLen)
444{ 391{
445 pPacketInfo->BufferCount = 1; 392 pPacketInfo->BufferCount = 1;
446 pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); 393 pPacketInfo->pFirstBuffer = (PNDIS_BUFFER) GET_OS_PKT_DATAPTR(pPacket);
447 pPacketInfo->PhysicalBufferCount = 1; 394 pPacketInfo->PhysicalBufferCount = 1;
448 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); 395 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
449 396
@@ -451,30 +398,26 @@ void RTMP_QueryPacketInfo(
451 *pSrcBufLen = GET_OS_PKT_LEN(pPacket); 398 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
452} 399}
453 400
454void RTMP_QueryNextPacketInfo( 401void RTMP_QueryNextPacketInfo(IN PNDIS_PACKET * ppPacket,
455 IN PNDIS_PACKET *ppPacket, 402 OUT PACKET_INFO * pPacketInfo,
456 OUT PACKET_INFO *pPacketInfo, 403 OUT PUCHAR * pSrcBufVA, OUT UINT * pSrcBufLen)
457 OUT PUCHAR *pSrcBufVA,
458 OUT UINT *pSrcBufLen)
459{ 404{
460 PNDIS_PACKET pPacket = NULL; 405 PNDIS_PACKET pPacket = NULL;
461 406
462 if (*ppPacket) 407 if (*ppPacket)
463 pPacket = GET_OS_PKT_NEXT(*ppPacket); 408 pPacket = GET_OS_PKT_NEXT(*ppPacket);
464 409
465 if (pPacket) 410 if (pPacket) {
466 {
467 pPacketInfo->BufferCount = 1; 411 pPacketInfo->BufferCount = 1;
468 pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); 412 pPacketInfo->pFirstBuffer =
413 (PNDIS_BUFFER) GET_OS_PKT_DATAPTR(pPacket);
469 pPacketInfo->PhysicalBufferCount = 1; 414 pPacketInfo->PhysicalBufferCount = 1;
470 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); 415 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
471 416
472 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); 417 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
473 *pSrcBufLen = GET_OS_PKT_LEN(pPacket); 418 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
474 *ppPacket = GET_OS_PKT_NEXT(pPacket); 419 *ppPacket = GET_OS_PKT_NEXT(pPacket);
475 } 420 } else {
476 else
477 {
478 pPacketInfo->BufferCount = 0; 421 pPacketInfo->BufferCount = 0;
479 pPacketInfo->pFirstBuffer = NULL; 422 pPacketInfo->pFirstBuffer = NULL;
480 pPacketInfo->PhysicalBufferCount = 0; 423 pPacketInfo->PhysicalBufferCount = 0;
@@ -486,24 +429,19 @@ void RTMP_QueryNextPacketInfo(
486 } 429 }
487} 430}
488 431
489 432PNDIS_PACKET DuplicatePacket(IN PRTMP_ADAPTER pAd,
490PNDIS_PACKET DuplicatePacket( 433 IN PNDIS_PACKET pPacket, IN UCHAR FromWhichBSSID)
491 IN PRTMP_ADAPTER pAd,
492 IN PNDIS_PACKET pPacket,
493 IN UCHAR FromWhichBSSID)
494{ 434{
495 struct sk_buff *skb; 435 struct sk_buff *skb;
496 PNDIS_PACKET pRetPacket = NULL; 436 PNDIS_PACKET pRetPacket = NULL;
497 USHORT DataSize; 437 USHORT DataSize;
498 UCHAR *pData; 438 UCHAR *pData;
499 439
500 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); 440 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
501 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); 441 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
502 442
503
504 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG); 443 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
505 if (skb) 444 if (skb) {
506 {
507 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); 445 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
508 pRetPacket = OSPKT_TO_RTPKT(skb); 446 pRetPacket = OSPKT_TO_RTPKT(skb);
509 } 447 }
@@ -512,20 +450,17 @@ PNDIS_PACKET DuplicatePacket(
512 450
513} 451}
514 452
515PNDIS_PACKET duplicate_pkt( 453PNDIS_PACKET duplicate_pkt(IN PRTMP_ADAPTER pAd,
516 IN PRTMP_ADAPTER pAd, 454 IN PUCHAR pHeader802_3,
517 IN PUCHAR pHeader802_3, 455 IN UINT HdrLen,
518 IN UINT HdrLen, 456 IN PUCHAR pData,
519 IN PUCHAR pData, 457 IN ULONG DataSize, IN UCHAR FromWhichBSSID)
520 IN ULONG DataSize,
521 IN UCHAR FromWhichBSSID)
522{ 458{
523 struct sk_buff *skb; 459 struct sk_buff *skb;
524 PNDIS_PACKET pPacket = NULL; 460 PNDIS_PACKET pPacket = NULL;
525
526 461
527 if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) 462 if ((skb =
528 { 463 __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) {
529 skb_reserve(skb, 2); 464 skb_reserve(skb, 2);
530 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen); 465 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
531 skb_put(skb, HdrLen); 466 skb_put(skb, HdrLen);
@@ -538,24 +473,22 @@ PNDIS_PACKET duplicate_pkt(
538 return pPacket; 473 return pPacket;
539} 474}
540 475
541
542#define TKIP_TX_MIC_SIZE 8 476#define TKIP_TX_MIC_SIZE 8
543PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( 477PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(IN PRTMP_ADAPTER pAd,
544 IN PRTMP_ADAPTER pAd, 478 IN PNDIS_PACKET pPacket)
545 IN PNDIS_PACKET pPacket)
546{ 479{
547 struct sk_buff *skb, *newskb; 480 struct sk_buff *skb, *newskb;
548
549 481
550 skb = RTPKT_TO_OSPKT(pPacket); 482 skb = RTPKT_TO_OSPKT(pPacket);
551 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) 483 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) {
552 {
553 // alloc a new skb and copy the packet 484 // alloc a new skb and copy the packet
554 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC); 485 newskb =
486 skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE,
487 GFP_ATOMIC);
555 dev_kfree_skb_any(skb); 488 dev_kfree_skb_any(skb);
556 if (newskb == NULL) 489 if (newskb == NULL) {
557 { 490 DBGPRINT(RT_DEBUG_ERROR,
558 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n")); 491 ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
559 return NULL; 492 return NULL;
560 } 493 }
561 skb = newskb; 494 skb = newskb;
@@ -564,17 +497,12 @@ PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
564 return OSPKT_TO_RTPKT(skb); 497 return OSPKT_TO_RTPKT(skb);
565} 498}
566 499
567 500PNDIS_PACKET ClonePacket(IN PRTMP_ADAPTER pAd,
568 501 IN PNDIS_PACKET pPacket,
569 502 IN PUCHAR pData, IN ULONG DataSize)
570PNDIS_PACKET ClonePacket(
571 IN PRTMP_ADAPTER pAd,
572 IN PNDIS_PACKET pPacket,
573 IN PUCHAR pData,
574 IN ULONG DataSize)
575{ 503{
576 struct sk_buff *pRxPkt; 504 struct sk_buff *pRxPkt;
577 struct sk_buff *pClonedPkt; 505 struct sk_buff *pClonedPkt;
578 506
579 ASSERT(pPacket); 507 ASSERT(pPacket);
580 pRxPkt = RTPKT_TO_OSPKT(pPacket); 508 pRxPkt = RTPKT_TO_OSPKT(pPacket);
@@ -582,13 +510,12 @@ PNDIS_PACKET ClonePacket(
582 // clone the packet 510 // clone the packet
583 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG); 511 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
584 512
585 if (pClonedPkt) 513 if (pClonedPkt) {
586 { 514 // set the correct dataptr and data len
587 // set the correct dataptr and data len 515 pClonedPkt->dev = pRxPkt->dev;
588 pClonedPkt->dev = pRxPkt->dev; 516 pClonedPkt->data = pData;
589 pClonedPkt->data = pData; 517 pClonedPkt->len = DataSize;
590 pClonedPkt->len = DataSize; 518 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
591 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
592 ASSERT(DataSize < 1530); 519 ASSERT(DataSize < 1530);
593 } 520 }
594 return pClonedPkt; 521 return pClonedPkt;
@@ -597,12 +524,10 @@ PNDIS_PACKET ClonePacket(
597// 524//
598// change OS packet DataPtr and DataLen 525// change OS packet DataPtr and DataLen
599// 526//
600void update_os_packet_info( 527void update_os_packet_info(IN PRTMP_ADAPTER pAd,
601 IN PRTMP_ADAPTER pAd, 528 IN RX_BLK * pRxBlk, IN UCHAR FromWhichBSSID)
602 IN RX_BLK *pRxBlk,
603 IN UCHAR FromWhichBSSID)
604{ 529{
605 struct sk_buff *pOSPkt; 530 struct sk_buff *pOSPkt;
606 531
607 ASSERT(pRxBlk->pRxPacket); 532 ASSERT(pRxBlk->pRxPacket);
608 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); 533 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
@@ -613,14 +538,12 @@ void update_os_packet_info(
613 pOSPkt->tail = pOSPkt->data + pOSPkt->len; 538 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
614} 539}
615 540
616 541void wlan_802_11_to_802_3_packet(IN PRTMP_ADAPTER pAd,
617void wlan_802_11_to_802_3_packet( 542 IN RX_BLK * pRxBlk,
618 IN PRTMP_ADAPTER pAd, 543 IN PUCHAR pHeader802_3,
619 IN RX_BLK *pRxBlk, 544 IN UCHAR FromWhichBSSID)
620 IN PUCHAR pHeader802_3,
621 IN UCHAR FromWhichBSSID)
622{ 545{
623 struct sk_buff *pOSPkt; 546 struct sk_buff *pOSPkt;
624 547
625 ASSERT(pRxBlk->pRxPacket); 548 ASSERT(pRxBlk->pRxPacket);
626 ASSERT(pHeader802_3); 549 ASSERT(pHeader802_3);
@@ -637,34 +560,30 @@ void wlan_802_11_to_802_3_packet(
637 // 560 //
638 // 561 //
639 562
640 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3); 563 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3,
641 } 564 LENGTH_802_3);
642 565}
643
644 566
645void announce_802_3_packet( 567void announce_802_3_packet(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket)
646 IN PRTMP_ADAPTER pAd,
647 IN PNDIS_PACKET pPacket)
648{ 568{
649 569
650 struct sk_buff *pRxPkt; 570 struct sk_buff *pRxPkt;
651 571
652 ASSERT(pPacket); 572 ASSERT(pPacket);
653 573
654 pRxPkt = RTPKT_TO_OSPKT(pPacket); 574 pRxPkt = RTPKT_TO_OSPKT(pPacket);
655 575
656 /* Push up the protocol stack */ 576 /* Push up the protocol stack */
657 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); 577 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
658 578
659 netif_rx(pRxPkt); 579 netif_rx(pRxPkt);
660} 580}
661 581
662
663PRTMP_SCATTER_GATHER_LIST 582PRTMP_SCATTER_GATHER_LIST
664rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg) 583rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST * sg)
665{ 584{
666 sg->NumberOfElements = 1; 585 sg->NumberOfElements = 1;
667 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket); 586 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
668 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket); 587 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
669 return (sg); 588 return (sg);
670} 589}
@@ -678,13 +597,13 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
678 return; 597 return;
679 598
680 pt = pSrcBufVA; 599 pt = pSrcBufVA;
681 printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen); 600 printk("%s: %p, len = %d\n", str, pSrcBufVA, SrcBufLen);
682 for (x=0; x<SrcBufLen; x++) 601 for (x = 0; x < SrcBufLen; x++) {
683 {
684 if (x % 16 == 0) 602 if (x % 16 == 0)
685 printk("0x%04x : ", x); 603 printk("0x%04x : ", x);
686 printk("%02x ", ((unsigned char)pt[x])); 604 printk("%02x ", ((unsigned char)pt[x]));
687 if (x%16 == 15) printk("\n"); 605 if (x % 16 == 15)
606 printk("\n");
688 } 607 }
689 printk("\n"); 608 printk("\n");
690} 609}
@@ -709,181 +628,197 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
709 628
710 ======================================================================== 629 ========================================================================
711*/ 630*/
712VOID RTMPSendWirelessEvent( 631VOID RTMPSendWirelessEvent(IN PRTMP_ADAPTER pAd,
713 IN PRTMP_ADAPTER pAd, 632 IN USHORT Event_flag,
714 IN USHORT Event_flag, 633 IN PUCHAR pAddr, IN UCHAR BssIdx, IN CHAR Rssi)
715 IN PUCHAR pAddr,
716 IN UCHAR BssIdx,
717 IN CHAR Rssi)
718{ 634{
719 635
720 //union iwreq_data wrqu; 636 //union iwreq_data wrqu;
721 PSTRING pBuf = NULL, pBufPtr = NULL; 637 PSTRING pBuf = NULL, pBufPtr = NULL;
722 USHORT event, type, BufLen; 638 USHORT event, type, BufLen;
723 UCHAR event_table_len = 0; 639 UCHAR event_table_len = 0;
724 640
725 type = Event_flag & 0xFF00; 641 type = Event_flag & 0xFF00;
726 event = Event_flag & 0x00FF; 642 event = Event_flag & 0x00FF;
727 643
728 switch (type) 644 switch (type) {
729 { 645 case IW_SYS_EVENT_FLAG_START:
730 case IW_SYS_EVENT_FLAG_START: 646 event_table_len = IW_SYS_EVENT_TYPE_NUM;
731 event_table_len = IW_SYS_EVENT_TYPE_NUM; 647 break;
732 break;
733 648
734 case IW_SPOOF_EVENT_FLAG_START: 649 case IW_SPOOF_EVENT_FLAG_START:
735 event_table_len = IW_SPOOF_EVENT_TYPE_NUM; 650 event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
736 break; 651 break;
737 652
738 case IW_FLOOD_EVENT_FLAG_START: 653 case IW_FLOOD_EVENT_FLAG_START:
739 event_table_len = IW_FLOOD_EVENT_TYPE_NUM; 654 event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
740 break; 655 break;
741 } 656 }
742 657
743 if (event_table_len == 0) 658 if (event_table_len == 0) {
744 { 659 DBGPRINT(RT_DEBUG_ERROR,
745 DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type)); 660 ("%s : The type(%0x02x) is not valid.\n", __func__,
661 type));
746 return; 662 return;
747 } 663 }
748 664
749 if (event >= event_table_len) 665 if (event >= event_table_len) {
750 { 666 DBGPRINT(RT_DEBUG_ERROR,
751 DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event)); 667 ("%s : The event(%0x02x) is not valid.\n", __func__,
668 event));
752 return; 669 return;
753 } 670 }
754
755 //Allocate memory and copy the msg. 671 //Allocate memory and copy the msg.
756 if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) 672 if ((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) {
757 {
758 //Prepare the payload 673 //Prepare the payload
759 memset(pBuf, 0, IW_CUSTOM_MAX_LEN); 674 memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
760 675
761 pBufPtr = pBuf; 676 pBufPtr = pBuf;
762 677
763 if (pAddr) 678 if (pAddr)
764 pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr)); 679 pBufPtr +=
680 sprintf(pBufPtr,
681 "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ",
682 PRINT_MAC(pAddr));
765 else if (BssIdx < MAX_MBSSID_NUM) 683 else if (BssIdx < MAX_MBSSID_NUM)
766 pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx); 684 pBufPtr +=
685 sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx);
767 else 686 else
768 pBufPtr += sprintf(pBufPtr, "(RT2860) "); 687 pBufPtr += sprintf(pBufPtr, "(RT2860) ");
769 688
770 if (type == IW_SYS_EVENT_FLAG_START) 689 if (type == IW_SYS_EVENT_FLAG_START)
771 pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]); 690 pBufPtr +=
691 sprintf(pBufPtr, "%s",
692 pWirelessSysEventText[event]);
772 else if (type == IW_SPOOF_EVENT_FLAG_START) 693 else if (type == IW_SPOOF_EVENT_FLAG_START)
773 pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi); 694 pBufPtr +=
695 sprintf(pBufPtr, "%s (RSSI=%d)",
696 pWirelessSpoofEventText[event], Rssi);
774 else if (type == IW_FLOOD_EVENT_FLAG_START) 697 else if (type == IW_FLOOD_EVENT_FLAG_START)
775 pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]); 698 pBufPtr +=
699 sprintf(pBufPtr, "%s",
700 pWirelessFloodEventText[event]);
776 else 701 else
777 pBufPtr += sprintf(pBufPtr, "%s", "unknown event"); 702 pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
778 703
779 pBufPtr[pBufPtr - pBuf] = '\0'; 704 pBufPtr[pBufPtr - pBuf] = '\0';
780 BufLen = pBufPtr - pBuf; 705 BufLen = pBufPtr - pBuf;
781 706
782 RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen); 707 RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL,
708 (PUCHAR) pBuf, BufLen);
783 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf)); 709 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
784 710
785 kfree(pBuf); 711 kfree(pBuf);
786 } 712 } else
787 else 713 DBGPRINT(RT_DEBUG_ERROR,
788 DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__)); 714 ("%s : Can't allocate memory for wireless event.\n",
715 __func__));
789} 716}
790 717
791void send_monitor_packets( 718void send_monitor_packets(IN PRTMP_ADAPTER pAd, IN RX_BLK * pRxBlk)
792 IN PRTMP_ADAPTER pAd,
793 IN RX_BLK *pRxBlk)
794{ 719{
795 struct sk_buff *pOSPkt; 720 struct sk_buff *pOSPkt;
796 wlan_ng_prism2_header *ph; 721 wlan_ng_prism2_header *ph;
797 int rate_index = 0; 722 int rate_index = 0;
798 USHORT header_len = 0; 723 USHORT header_len = 0;
799 UCHAR temp_header[40] = {0}; 724 UCHAR temp_header[40] = { 0 };
800 725
801 u_int32_t ralinkrate[256] = {2,4,11,22, 12,18,24,36,48,72,96, 108, 109, 110, 111, 112, 13, 26, 39, 52,78,104, 117, 130, 26, 52, 78,104, 156, 208, 234, 260, 27, 54,81,108,162, 216, 243, 270, // Last 38 726 u_int32_t ralinkrate[256] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 109, 110, 111, 112, 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, 27, 54, 81, 108, 162, 216, 243, 270, // Last 38
802 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115, 130, 144, 29, 59,87,115, 173, 230,260, 288, 30, 60,90,120,180,240,270,300,60,120,180,240,360,480,540,600, 0,1,2,3,4,5,6,7,8,9,10, 727 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115,
803 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80}; 728 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, 30, 60, 90,
804 729 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540,
730 600, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
731 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
732 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
733 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
734 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
735 72, 73, 74, 75, 76, 77, 78, 79, 80
736 };
805 737
806 ASSERT(pRxBlk->pRxPacket); 738 ASSERT(pRxBlk->pRxPacket);
807 if (pRxBlk->DataSize < 10) 739 if (pRxBlk->DataSize < 10) {
808 { 740 DBGPRINT(RT_DEBUG_ERROR,
809 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize)); 741 ("%s : Size is too small! (%d)\n", __func__,
742 pRxBlk->DataSize));
810 goto err_free_sk_buff; 743 goto err_free_sk_buff;
811 } 744 }
812 745
813 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE) 746 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) >
814 { 747 RX_BUFFER_AGGRESIZE) {
815 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header))); 748 DBGPRINT(RT_DEBUG_ERROR,
749 ("%s : Size is too large! (%zu)\n", __func__,
750 pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
816 goto err_free_sk_buff; 751 goto err_free_sk_buff;
817 } 752 }
818 753
819 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); 754 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
820 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0); 755 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
821 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) 756 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) {
822 { 757 pRxBlk->DataSize -= LENGTH_802_11;
823 pRxBlk->DataSize -= LENGTH_802_11; 758 if ((pRxBlk->pHeader->FC.ToDs == 1) &&
824 if ((pRxBlk->pHeader->FC.ToDs == 1) && 759 (pRxBlk->pHeader->FC.FrDs == 1))
825 (pRxBlk->pHeader->FC.FrDs == 1)) 760 header_len = LENGTH_802_11_WITH_ADDR4;
826 header_len = LENGTH_802_11_WITH_ADDR4; 761 else
827 else 762 header_len = LENGTH_802_11;
828 header_len = LENGTH_802_11; 763
829 764 // QOS
830 // QOS 765 if (pRxBlk->pHeader->FC.SubType & 0x08) {
831 if (pRxBlk->pHeader->FC.SubType & 0x08) 766 header_len += 2;
832 { 767 // Data skip QOS contorl field
833 header_len += 2; 768 pRxBlk->DataSize -= 2;
834 // Data skip QOS contorl field 769 }
835 pRxBlk->DataSize -=2; 770 // Order bit: A-Ralink or HTC+
836 } 771 if (pRxBlk->pHeader->FC.Order) {
837 772 header_len += 4;
838 // Order bit: A-Ralink or HTC+
839 if (pRxBlk->pHeader->FC.Order)
840 {
841 header_len += 4;
842 // Data skip HTC contorl field 773 // Data skip HTC contorl field
843 pRxBlk->DataSize -= 4; 774 pRxBlk->DataSize -= 4;
844 } 775 }
845 776 // Copy Header
846 // Copy Header 777 if (header_len <= 40)
847 if (header_len <= 40) 778 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
848 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
849
850 // skip HW padding
851 if (pRxBlk->RxD.L2PAD)
852 pRxBlk->pData += (header_len + 2);
853 else
854 pRxBlk->pData += header_len;
855 } //end if
856 779
780 // skip HW padding
781 if (pRxBlk->RxD.L2PAD)
782 pRxBlk->pData += (header_len + 2);
783 else
784 pRxBlk->pData += header_len;
785 } //end if
857 786
858 if (pRxBlk->DataSize < pOSPkt->len) { 787 if (pRxBlk->DataSize < pOSPkt->len) {
859 skb_trim(pOSPkt,pRxBlk->DataSize); 788 skb_trim(pOSPkt, pRxBlk->DataSize);
860 } else { 789 } else {
861 skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len)); 790 skb_put(pOSPkt, (pRxBlk->DataSize - pOSPkt->len));
862 } //end if 791 } //end if
863 792
864 if ((pRxBlk->pData - pOSPkt->data) > 0) { 793 if ((pRxBlk->pData - pOSPkt->data) > 0) {
865 skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data)); 794 skb_put(pOSPkt, (pRxBlk->pData - pOSPkt->data));
866 skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data)); 795 skb_pull(pOSPkt, (pRxBlk->pData - pOSPkt->data));
867 } //end if 796 } //end if
868 797
869 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) { 798 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header) + header_len)) {
870 if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) { 799 if (pskb_expand_head
871 DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__)); 800 (pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0,
801 GFP_ATOMIC)) {
802 DBGPRINT(RT_DEBUG_ERROR,
803 ("%s : Reallocate header size of sk_buff fail!\n",
804 __func__));
872 goto err_free_sk_buff; 805 goto err_free_sk_buff;
873 } //end if 806 } //end if
874 } //end if 807 } //end if
875 808
876 if (header_len > 0) 809 if (header_len > 0)
877 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len); 810 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header,
811 header_len);
878 812
879 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header)); 813 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt,
814 sizeof(wlan_ng_prism2_header));
880 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header)); 815 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
881 816
882 ph->msgcode = DIDmsg_lnxind_wlansniffrm; 817 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
883 ph->msglen = sizeof(wlan_ng_prism2_header); 818 ph->msglen = sizeof(wlan_ng_prism2_header);
884 strcpy((PSTRING) ph->devname, (PSTRING) pAd->net_dev->name); 819 strcpy((PSTRING) ph->devname, (PSTRING) pAd->net_dev->name);
885 820
886 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; 821 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
887 ph->hosttime.status = 0; 822 ph->hosttime.status = 0;
888 ph->hosttime.len = 4; 823 ph->hosttime.len = 4;
889 ph->hosttime.data = jiffies; 824 ph->hosttime.data = jiffies;
@@ -893,63 +828,71 @@ void send_monitor_packets(
893 ph->mactime.len = 0; 828 ph->mactime.len = 0;
894 ph->mactime.data = 0; 829 ph->mactime.data = 0;
895 830
896 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx; 831 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
897 ph->istx.status = 0; 832 ph->istx.status = 0;
898 ph->istx.len = 0; 833 ph->istx.len = 0;
899 ph->istx.data = 0; 834 ph->istx.data = 0;
900 835
901 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel; 836 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
902 ph->channel.status = 0; 837 ph->channel.status = 0;
903 ph->channel.len = 4; 838 ph->channel.len = 4;
904 839
905 ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel; 840 ph->channel.data = (u_int32_t) pAd->CommonCfg.Channel;
906 841
907 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; 842 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
908 ph->rssi.status = 0; 843 ph->rssi.status = 0;
909 ph->rssi.len = 4; 844 ph->rssi.len = 4;
910 ph->rssi.data = (u_int32_t)RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2));; 845 ph->rssi.data =
846 (u_int32_t) RTMPMaxRssi(pAd,
847 ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0,
848 RSSI_0), ConvertToRssi(pAd,
849 pRxBlk->
850 pRxWI->
851 RSSI1,
852 RSSI_1),
853 ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2,
854 RSSI_2));;
911 855
912 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal; 856 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
913 ph->signal.status = 0; 857 ph->signal.status = 0;
914 ph->signal.len = 4; 858 ph->signal.len = 4;
915 ph->signal.data = 0; //rssi + noise; 859 ph->signal.data = 0; //rssi + noise;
916 860
917 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise; 861 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
918 ph->noise.status = 0; 862 ph->noise.status = 0;
919 ph->noise.len = 4; 863 ph->noise.len = 4;
920 ph->noise.data = 0; 864 ph->noise.data = 0;
921 865
922 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) 866 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) {
923 { 867 rate_index =
924 rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS); 868 16 + ((UCHAR) pRxBlk->pRxWI->BW * 16) +
925 } 869 ((UCHAR) pRxBlk->pRxWI->ShortGI * 32) +
926 else 870 ((UCHAR) pRxBlk->pRxWI->MCS);
927 if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM) 871 } else if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
928 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4; 872 rate_index = (UCHAR) (pRxBlk->pRxWI->MCS) + 4;
929 else 873 else
930 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS); 874 rate_index = (UCHAR) (pRxBlk->pRxWI->MCS);
931 if (rate_index < 0) 875 if (rate_index < 0)
932 rate_index = 0; 876 rate_index = 0;
933 if (rate_index > 255) 877 if (rate_index > 255)
934 rate_index = 255; 878 rate_index = 255;
935 879
936 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate; 880 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
937 ph->rate.status = 0; 881 ph->rate.status = 0;
938 ph->rate.len = 4; 882 ph->rate.len = 4;
939 ph->rate.data = ralinkrate[rate_index]; 883 ph->rate.data = ralinkrate[rate_index];
940 884
941 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; 885 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
942 ph->frmlen.status = 0; 886 ph->frmlen.status = 0;
943 ph->frmlen.len = 4; 887 ph->frmlen.len = 4;
944 ph->frmlen.data = (u_int32_t)pRxBlk->DataSize; 888 ph->frmlen.data = (u_int32_t) pRxBlk->DataSize;
945
946 889
947 pOSPkt->pkt_type = PACKET_OTHERHOST; 890 pOSPkt->pkt_type = PACKET_OTHERHOST;
948 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev); 891 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
949 pOSPkt->ip_summed = CHECKSUM_NONE; 892 pOSPkt->ip_summed = CHECKSUM_NONE;
950 netif_rx(pOSPkt); 893 netif_rx(pOSPkt);
951 894
952 return; 895 return;
953 896
954err_free_sk_buff: 897err_free_sk_buff:
955 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); 898 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
@@ -957,7 +900,6 @@ err_free_sk_buff:
957 900
958} 901}
959 902
960
961/******************************************************************************* 903/*******************************************************************************
962 904
963 Device IRQ related functions. 905 Device IRQ related functions.
@@ -974,11 +916,12 @@ int RtmpOSIRQRequest(IN PNET_DEV pNetDev)
974 916
975 ASSERT(pAd); 917 ASSERT(pAd);
976 918
977 if (pAd->infType == RTMP_DEV_INF_PCI) 919 if (pAd->infType == RTMP_DEV_INF_PCI) {
978 { 920 POS_COOKIE _pObj = (POS_COOKIE) (pAd->OS_Cookie);
979 POS_COOKIE _pObj = (POS_COOKIE)(pAd->OS_Cookie);
980 RTMP_MSI_ENABLE(pAd); 921 RTMP_MSI_ENABLE(pAd);
981 retval = request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ, (net_dev)->name, (net_dev)); 922 retval =
923 request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ,
924 (net_dev)->name, (net_dev));
982 if (retval != 0) 925 if (retval != 0)
983 printk("RT2860: request_irq ERROR(%d)\n", retval); 926 printk("RT2860: request_irq ERROR(%d)\n", retval);
984 } 927 }
@@ -999,36 +942,34 @@ int RtmpOSIRQRelease(IN PNET_DEV pNetDev)
999 ASSERT(pAd); 942 ASSERT(pAd);
1000 943
1001#ifdef RTMP_PCI_SUPPORT 944#ifdef RTMP_PCI_SUPPORT
1002 if (pAd->infType == RTMP_DEV_INF_PCI) 945 if (pAd->infType == RTMP_DEV_INF_PCI) {
1003 { 946 POS_COOKIE pObj = (POS_COOKIE) (pAd->OS_Cookie);
1004 POS_COOKIE pObj = (POS_COOKIE)(pAd->OS_Cookie);
1005 synchronize_irq(pObj->pci_dev->irq); 947 synchronize_irq(pObj->pci_dev->irq);
1006 free_irq(pObj->pci_dev->irq, (net_dev)); 948 free_irq(pObj->pci_dev->irq, (net_dev));
1007 RTMP_MSI_DISABLE(pAd); 949 RTMP_MSI_DISABLE(pAd);
1008 } 950 }
1009#endif // RTMP_PCI_SUPPORT // 951#endif // RTMP_PCI_SUPPORT //
1010 952
1011
1012 return 0; 953 return 0;
1013} 954}
1014 955
1015
1016/******************************************************************************* 956/*******************************************************************************
1017 957
1018 File open/close related functions. 958 File open/close related functions.
1019 959
1020 *******************************************************************************/ 960 *******************************************************************************/
1021RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode) 961RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode)
1022{ 962{
1023 struct file *filePtr; 963 struct file *filePtr;
1024 964
1025 filePtr = filp_open(pPath, flag, 0); 965 filePtr = filp_open(pPath, flag, 0);
1026 if (IS_ERR(filePtr)) 966 if (IS_ERR(filePtr)) {
1027 { 967 DBGPRINT(RT_DEBUG_ERROR,
1028 DBGPRINT(RT_DEBUG_ERROR, ("%s(): Error %ld opening %s\n", __func__, -PTR_ERR(filePtr), pPath)); 968 ("%s(): Error %ld opening %s\n", __func__,
969 -PTR_ERR(filePtr), pPath));
1029 } 970 }
1030 971
1031 return (RTMP_OS_FD)filePtr; 972 return (RTMP_OS_FD) filePtr;
1032} 973}
1033 974
1034int RtmpOSFileClose(RTMP_OS_FD osfd) 975int RtmpOSFileClose(RTMP_OS_FD osfd)
@@ -1037,31 +978,26 @@ int RtmpOSFileClose(RTMP_OS_FD osfd)
1037 return 0; 978 return 0;
1038} 979}
1039 980
1040
1041void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset) 981void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset)
1042{ 982{
1043 osfd->f_pos = offset; 983 osfd->f_pos = offset;
1044} 984}
1045 985
1046
1047int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen) 986int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)
1048{ 987{
1049 // The object must have a read method 988 // The object must have a read method
1050 if (osfd->f_op && osfd->f_op->read) 989 if (osfd->f_op && osfd->f_op->read) {
1051 { 990 return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
1052 return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos); 991 } else {
1053 }
1054 else
1055 {
1056 DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n")); 992 DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n"));
1057 return -1; 993 return -1;
1058 } 994 }
1059} 995}
1060 996
1061
1062int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen) 997int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)
1063{ 998{
1064 return osfd->f_op->write(osfd, pDataPtr, (size_t)writeLen, &osfd->f_pos); 999 return osfd->f_op->write(osfd, pDataPtr, (size_t) writeLen,
1000 &osfd->f_pos);
1065} 1001}
1066 1002
1067/******************************************************************************* 1003/*******************************************************************************
@@ -1069,35 +1005,32 @@ int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)
1069 Task create/management/kill related functions. 1005 Task create/management/kill related functions.
1070 1006
1071 *******************************************************************************/ 1007 *******************************************************************************/
1072NDIS_STATUS RtmpOSTaskKill( 1008NDIS_STATUS RtmpOSTaskKill(IN RTMP_OS_TASK * pTask)
1073 IN RTMP_OS_TASK *pTask)
1074{ 1009{
1075 RTMP_ADAPTER *pAd; 1010 RTMP_ADAPTER *pAd;
1076 int ret = NDIS_STATUS_FAILURE; 1011 int ret = NDIS_STATUS_FAILURE;
1077 1012
1078 pAd = (RTMP_ADAPTER *)pTask->priv; 1013 pAd = (RTMP_ADAPTER *) pTask->priv;
1079 1014
1080#ifdef KTHREAD_SUPPORT 1015#ifdef KTHREAD_SUPPORT
1081 if (pTask->kthread_task) 1016 if (pTask->kthread_task) {
1082 {
1083 kthread_stop(pTask->kthread_task); 1017 kthread_stop(pTask->kthread_task);
1084 ret = NDIS_STATUS_SUCCESS; 1018 ret = NDIS_STATUS_SUCCESS;
1085 } 1019 }
1086#else 1020#else
1087 CHECK_PID_LEGALITY(pTask->taskPID) 1021 CHECK_PID_LEGALITY(pTask->taskPID) {
1088 { 1022 printk("Terminate the task(%s) with pid(%d)!\n",
1089 printk("Terminate the task(%s) with pid(%d)!\n", pTask->taskName, GET_PID_NUMBER(pTask->taskPID)); 1023 pTask->taskName, GET_PID_NUMBER(pTask->taskPID));
1090 mb(); 1024 mb();
1091 pTask->task_killed = 1; 1025 pTask->task_killed = 1;
1092 mb(); 1026 mb();
1093 ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1); 1027 ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1);
1094 if (ret) 1028 if (ret) {
1095 { 1029 printk(KERN_WARNING
1096 printk(KERN_WARNING "kill task(%s) with pid(%d) failed(retVal=%d)!\n", 1030 "kill task(%s) with pid(%d) failed(retVal=%d)!\n",
1097 pTask->taskName, GET_PID_NUMBER(pTask->taskPID), ret); 1031 pTask->taskName, GET_PID_NUMBER(pTask->taskPID),
1098 } 1032 ret);
1099 else 1033 } else {
1100 {
1101 wait_for_completion(&pTask->taskComplete); 1034 wait_for_completion(&pTask->taskComplete);
1102 pTask->taskPID = THREAD_PID_INIT_VALUE; 1035 pTask->taskPID = THREAD_PID_INIT_VALUE;
1103 pTask->task_killed = 0; 1036 pTask->task_killed = 0;
@@ -1110,9 +1043,7 @@ NDIS_STATUS RtmpOSTaskKill(
1110 1043
1111} 1044}
1112 1045
1113 1046INT RtmpOSTaskNotifyToExit(IN RTMP_OS_TASK * pTask)
1114INT RtmpOSTaskNotifyToExit(
1115 IN RTMP_OS_TASK *pTask)
1116{ 1047{
1117 1048
1118#ifndef KTHREAD_SUPPORT 1049#ifndef KTHREAD_SUPPORT
@@ -1122,14 +1053,12 @@ INT RtmpOSTaskNotifyToExit(
1122 return 0; 1053 return 0;
1123} 1054}
1124 1055
1125 1056void RtmpOSTaskCustomize(IN RTMP_OS_TASK * pTask)
1126void RtmpOSTaskCustomize(
1127 IN RTMP_OS_TASK *pTask)
1128{ 1057{
1129 1058
1130#ifndef KTHREAD_SUPPORT 1059#ifndef KTHREAD_SUPPORT
1131 1060
1132 daemonize((PSTRING)&pTask->taskName[0]/*"%s",pAd->net_dev->name*/); 1061 daemonize((PSTRING) & pTask->taskName[0] /*"%s",pAd->net_dev->name */ );
1133 1062
1134 allow_signal(SIGTERM); 1063 allow_signal(SIGTERM);
1135 allow_signal(SIGKILL); 1064 allow_signal(SIGKILL);
@@ -1141,11 +1070,8 @@ void RtmpOSTaskCustomize(
1141#endif 1070#endif
1142} 1071}
1143 1072
1144 1073NDIS_STATUS RtmpOSTaskAttach(IN RTMP_OS_TASK * pTask,
1145NDIS_STATUS RtmpOSTaskAttach( 1074 IN int (*fn) (void *), IN void *arg)
1146 IN RTMP_OS_TASK *pTask,
1147 IN int (*fn)(void *),
1148 IN void *arg)
1149{ 1075{
1150 NDIS_STATUS status = NDIS_STATUS_SUCCESS; 1076 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1151 1077
@@ -1157,13 +1083,11 @@ NDIS_STATUS RtmpOSTaskAttach(
1157 status = NDIS_STATUS_FAILURE; 1083 status = NDIS_STATUS_FAILURE;
1158#else 1084#else
1159 pid_number = kernel_thread(fn, arg, RTMP_OS_MGMT_TASK_FLAGS); 1085 pid_number = kernel_thread(fn, arg, RTMP_OS_MGMT_TASK_FLAGS);
1160 if (pid_number < 0) 1086 if (pid_number < 0) {
1161 { 1087 DBGPRINT(RT_DEBUG_ERROR,
1162 DBGPRINT (RT_DEBUG_ERROR, ("Attach task(%s) failed!\n", pTask->taskName)); 1088 ("Attach task(%s) failed!\n", pTask->taskName));
1163 status = NDIS_STATUS_FAILURE; 1089 status = NDIS_STATUS_FAILURE;
1164 } 1090 } else {
1165 else
1166 {
1167 pTask->taskPID = GET_PID(pid_number); 1091 pTask->taskPID = GET_PID(pid_number);
1168 1092
1169 // Wait for the thread to start 1093 // Wait for the thread to start
@@ -1174,22 +1098,21 @@ NDIS_STATUS RtmpOSTaskAttach(
1174 return status; 1098 return status;
1175} 1099}
1176 1100
1177 1101NDIS_STATUS RtmpOSTaskInit(IN RTMP_OS_TASK * pTask,
1178NDIS_STATUS RtmpOSTaskInit( 1102 IN PSTRING pTaskName, IN VOID * pPriv)
1179 IN RTMP_OS_TASK *pTask,
1180 IN PSTRING pTaskName,
1181 IN VOID *pPriv)
1182{ 1103{
1183 int len; 1104 int len;
1184 1105
1185 ASSERT(pTask); 1106 ASSERT(pTask);
1186 1107
1187#ifndef KTHREAD_SUPPORT 1108#ifndef KTHREAD_SUPPORT
1188 NdisZeroMemory((PUCHAR)(pTask), sizeof(RTMP_OS_TASK)); 1109 NdisZeroMemory((PUCHAR) (pTask), sizeof(RTMP_OS_TASK));
1189#endif 1110#endif
1190 1111
1191 len = strlen(pTaskName); 1112 len = strlen(pTaskName);
1192 len = len > (RTMP_OS_TASK_NAME_LEN -1) ? (RTMP_OS_TASK_NAME_LEN-1) : len; 1113 len =
1114 len >
1115 (RTMP_OS_TASK_NAME_LEN - 1) ? (RTMP_OS_TASK_NAME_LEN - 1) : len;
1193 NdisMoveMemory(&pTask->taskName[0], pTaskName, len); 1116 NdisMoveMemory(&pTask->taskName[0], pTaskName, len);
1194 pTask->priv = pPriv; 1117 pTask->priv = pPriv;
1195 1118
@@ -1197,58 +1120,51 @@ NDIS_STATUS RtmpOSTaskInit(
1197 RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema)); 1120 RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema));
1198 pTask->taskPID = THREAD_PID_INIT_VALUE; 1121 pTask->taskPID = THREAD_PID_INIT_VALUE;
1199 1122
1200 init_completion (&pTask->taskComplete); 1123 init_completion(&pTask->taskComplete);
1201#endif 1124#endif
1202 1125
1203 return NDIS_STATUS_SUCCESS; 1126 return NDIS_STATUS_SUCCESS;
1204} 1127}
1205 1128
1206 1129void RTMP_IndicateMediaState(IN PRTMP_ADAPTER pAd)
1207void RTMP_IndicateMediaState(
1208 IN PRTMP_ADAPTER pAd)
1209{ 1130{
1210 if (pAd->CommonCfg.bWirelessEvent) 1131 if (pAd->CommonCfg.bWirelessEvent) {
1211 { 1132 if (pAd->IndicateMediaState == NdisMediaStateConnected) {
1212 if (pAd->IndicateMediaState == NdisMediaStateConnected) 1133 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG,
1213 { 1134 pAd->MacTab.Content[BSSID_WCID].
1214 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1135 Addr, BSS0, 0);
1215 } 1136 } else {
1216 else 1137 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG,
1217 { 1138 pAd->MacTab.Content[BSSID_WCID].
1218 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1139 Addr, BSS0, 0);
1219 } 1140 }
1220 } 1141 }
1221} 1142}
1222 1143
1223int RtmpOSWrielessEventSend( 1144int RtmpOSWrielessEventSend(IN RTMP_ADAPTER * pAd,
1224 IN RTMP_ADAPTER *pAd, 1145 IN UINT32 eventType,
1225 IN UINT32 eventType, 1146 IN INT flags,
1226 IN INT flags, 1147 IN PUCHAR pSrcMac,
1227 IN PUCHAR pSrcMac, 1148 IN PUCHAR pData, IN UINT32 dataLen)
1228 IN PUCHAR pData,
1229 IN UINT32 dataLen)
1230{ 1149{
1231 union iwreq_data wrqu; 1150 union iwreq_data wrqu;
1232 1151
1233 memset(&wrqu, 0, sizeof(wrqu)); 1152 memset(&wrqu, 0, sizeof(wrqu));
1234 1153
1235 if (flags>-1) 1154 if (flags > -1)
1236 wrqu.data.flags = flags; 1155 wrqu.data.flags = flags;
1237 1156
1238 if (pSrcMac) 1157 if (pSrcMac)
1239 memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN); 1158 memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);
1240 1159
1241 if ((pData!= NULL) && (dataLen > 0)) 1160 if ((pData != NULL) && (dataLen > 0))
1242 wrqu.data.length = dataLen; 1161 wrqu.data.length = dataLen;
1243 1162
1244 wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData); 1163 wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData);
1245 return 0; 1164 return 0;
1246} 1165}
1247 1166
1248 1167int RtmpOSNetDevAddrSet(IN PNET_DEV pNetDev, IN PUCHAR pMacAddr)
1249int RtmpOSNetDevAddrSet(
1250 IN PNET_DEV pNetDev,
1251 IN PUCHAR pMacAddr)
1252{ 1168{
1253 struct net_device *net_dev; 1169 struct net_device *net_dev;
1254 RTMP_ADAPTER *pAd; 1170 RTMP_ADAPTER *pAd;
@@ -1259,7 +1175,8 @@ int RtmpOSNetDevAddrSet(
1259 // work-around for the SuSE due to it has it's own interface name management system. 1175 // work-around for the SuSE due to it has it's own interface name management system.
1260 { 1176 {
1261 NdisZeroMemory(pAd->StaCfg.dev_name, 16); 1177 NdisZeroMemory(pAd->StaCfg.dev_name, 16);
1262 NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name, strlen(net_dev->name)); 1178 NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name,
1179 strlen(net_dev->name));
1263 } 1180 }
1264 1181
1265 NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6); 1182 NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6);
@@ -1267,29 +1184,23 @@ int RtmpOSNetDevAddrSet(
1267 return 0; 1184 return 0;
1268} 1185}
1269 1186
1270
1271
1272/* 1187/*
1273 * Assign the network dev name for created Ralink WiFi interface. 1188 * Assign the network dev name for created Ralink WiFi interface.
1274 */ 1189 */
1275static int RtmpOSNetDevRequestName( 1190static int RtmpOSNetDevRequestName(IN RTMP_ADAPTER * pAd,
1276 IN RTMP_ADAPTER *pAd, 1191 IN PNET_DEV dev,
1277 IN PNET_DEV dev, 1192 IN PSTRING pPrefixStr, IN INT devIdx)
1278 IN PSTRING pPrefixStr,
1279 IN INT devIdx)
1280{ 1193{
1281 PNET_DEV existNetDev; 1194 PNET_DEV existNetDev;
1282 STRING suffixName[IFNAMSIZ]; 1195 STRING suffixName[IFNAMSIZ];
1283 STRING desiredName[IFNAMSIZ]; 1196 STRING desiredName[IFNAMSIZ];
1284 int ifNameIdx, prefixLen, slotNameLen; 1197 int ifNameIdx, prefixLen, slotNameLen;
1285 int Status; 1198 int Status;
1286 1199
1287
1288 prefixLen = strlen(pPrefixStr); 1200 prefixLen = strlen(pPrefixStr);
1289 ASSERT((prefixLen < IFNAMSIZ)); 1201 ASSERT((prefixLen < IFNAMSIZ));
1290 1202
1291 for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) 1203 for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) {
1292 {
1293 memset(suffixName, 0, IFNAMSIZ); 1204 memset(suffixName, 0, IFNAMSIZ);
1294 memset(desiredName, 0, IFNAMSIZ); 1205 memset(desiredName, 0, IFNAMSIZ);
1295 strncpy(&desiredName[0], pPrefixStr, prefixLen); 1206 strncpy(&desiredName[0], pPrefixStr, prefixLen);
@@ -1307,29 +1218,24 @@ static int RtmpOSNetDevRequestName(
1307 RtmpOSNetDeviceRefPut(existNetDev); 1218 RtmpOSNetDeviceRefPut(existNetDev);
1308 } 1219 }
1309 1220
1310 if(ifNameIdx < 32) 1221 if (ifNameIdx < 32) {
1311 {
1312 strcpy(&dev->name[0], &desiredName[0]); 1222 strcpy(&dev->name[0], &desiredName[0]);
1313 Status = NDIS_STATUS_SUCCESS; 1223 Status = NDIS_STATUS_SUCCESS;
1314 } 1224 } else {
1315 else
1316 {
1317 DBGPRINT(RT_DEBUG_ERROR, 1225 DBGPRINT(RT_DEBUG_ERROR,
1318 ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n", pPrefixStr)); 1226 ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n",
1227 pPrefixStr));
1319 Status = NDIS_STATUS_FAILURE; 1228 Status = NDIS_STATUS_FAILURE;
1320 } 1229 }
1321 1230
1322 return Status; 1231 return Status;
1323} 1232}
1324 1233
1325 1234void RtmpOSNetDevClose(IN PNET_DEV pNetDev)
1326void RtmpOSNetDevClose(
1327 IN PNET_DEV pNetDev)
1328{ 1235{
1329 dev_close(pNetDev); 1236 dev_close(pNetDev);
1330} 1237}
1331 1238
1332
1333void RtmpOSNetDevFree(PNET_DEV pNetDev) 1239void RtmpOSNetDevFree(PNET_DEV pNetDev)
1334{ 1240{
1335 ASSERT(pNetDev); 1241 ASSERT(pNetDev);
@@ -1337,15 +1243,14 @@ void RtmpOSNetDevFree(PNET_DEV pNetDev)
1337 free_netdev(pNetDev); 1243 free_netdev(pNetDev);
1338} 1244}
1339 1245
1340 1246INT RtmpOSNetDevAlloc(IN PNET_DEV * new_dev_p, IN UINT32 privDataSize)
1341INT RtmpOSNetDevAlloc(
1342 IN PNET_DEV *new_dev_p,
1343 IN UINT32 privDataSize)
1344{ 1247{
1345 // assign it as null first. 1248 // assign it as null first.
1346 *new_dev_p = NULL; 1249 *new_dev_p = NULL;
1347 1250
1348 DBGPRINT(RT_DEBUG_TRACE, ("Allocate a net device with private data size=%d!\n", privDataSize)); 1251 DBGPRINT(RT_DEBUG_TRACE,
1252 ("Allocate a net device with private data size=%d!\n",
1253 privDataSize));
1349 *new_dev_p = alloc_etherdev(privDataSize); 1254 *new_dev_p = alloc_etherdev(privDataSize);
1350 if (*new_dev_p) 1255 if (*new_dev_p)
1351 return NDIS_STATUS_SUCCESS; 1256 return NDIS_STATUS_SUCCESS;
@@ -1353,32 +1258,27 @@ INT RtmpOSNetDevAlloc(
1353 return NDIS_STATUS_FAILURE; 1258 return NDIS_STATUS_FAILURE;
1354} 1259}
1355 1260
1356
1357PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName) 1261PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName)
1358{ 1262{
1359 PNET_DEV pTargetNetDev = NULL; 1263 PNET_DEV pTargetNetDev = NULL;
1360 1264
1361 pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName); 1265 pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName);
1362 1266
1363 return pTargetNetDev; 1267 return pTargetNetDev;
1364} 1268}
1365 1269
1366
1367void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev) 1270void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev)
1368{ 1271{
1369 /* 1272 /*
1370 every time dev_get_by_name is called, and it has returned a valid struct 1273 every time dev_get_by_name is called, and it has returned a valid struct
1371 net_device*, dev_put should be called afterwards, because otherwise the 1274 net_device*, dev_put should be called afterwards, because otherwise the
1372 machine hangs when the device is unregistered (since dev->refcnt > 1). 1275 machine hangs when the device is unregistered (since dev->refcnt > 1).
1373 */ 1276 */
1374 if(pNetDev) 1277 if (pNetDev)
1375 dev_put(pNetDev); 1278 dev_put(pNetDev);
1376} 1279}
1377 1280
1378 1281INT RtmpOSNetDevDestory(IN RTMP_ADAPTER * pAd, IN PNET_DEV pNetDev)
1379INT RtmpOSNetDevDestory(
1380 IN RTMP_ADAPTER *pAd,
1381 IN PNET_DEV pNetDev)
1382{ 1282{
1383 1283
1384 // TODO: Need to fix this 1284 // TODO: Need to fix this
@@ -1386,23 +1286,19 @@ INT RtmpOSNetDevDestory(
1386 return 0; 1286 return 0;
1387} 1287}
1388 1288
1389
1390void RtmpOSNetDevDetach(PNET_DEV pNetDev) 1289void RtmpOSNetDevDetach(PNET_DEV pNetDev)
1391{ 1290{
1392 unregister_netdev(pNetDev); 1291 unregister_netdev(pNetDev);
1393} 1292}
1394 1293
1395 1294int RtmpOSNetDevAttach(IN PNET_DEV pNetDev,
1396int RtmpOSNetDevAttach( 1295 IN RTMP_OS_NETDEV_OP_HOOK * pDevOpHook)
1397 IN PNET_DEV pNetDev,
1398 IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook)
1399{ 1296{
1400 int ret, rtnl_locked = FALSE; 1297 int ret, rtnl_locked = FALSE;
1401 1298
1402 DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n")); 1299 DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n"));
1403 // If we need hook some callback function to the net device structrue, now do it. 1300 // If we need hook some callback function to the net device structrue, now do it.
1404 if (pDevOpHook) 1301 if (pDevOpHook) {
1405 {
1406 PRTMP_ADAPTER pAd = NULL; 1302 PRTMP_ADAPTER pAd = NULL;
1407 1303
1408 GET_PAD_FROM_NET_DEV(pAd, pNetDev); 1304 GET_PAD_FROM_NET_DEV(pAd, pNetDev);
@@ -1412,15 +1308,13 @@ int RtmpOSNetDevAttach(
1412 /* OS specific flags, here we used to indicate if we are virtual interface */ 1308 /* OS specific flags, here we used to indicate if we are virtual interface */
1413 pNetDev->priv_flags = pDevOpHook->priv_flags; 1309 pNetDev->priv_flags = pDevOpHook->priv_flags;
1414 1310
1415 1311 if (pAd->OpMode == OPMODE_STA) {
1416 if (pAd->OpMode == OPMODE_STA)
1417 {
1418 pNetDev->wireless_handlers = &rt28xx_iw_handler_def; 1312 pNetDev->wireless_handlers = &rt28xx_iw_handler_def;
1419 } 1313 }
1420 1314
1421
1422 // copy the net device mac address to the net_device structure. 1315 // copy the net device mac address to the net_device structure.
1423 NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0], MAC_ADDR_LEN); 1316 NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0],
1317 MAC_ADDR_LEN);
1424 1318
1425 rtnl_locked = pDevOpHook->needProtcted; 1319 rtnl_locked = pDevOpHook->needProtcted;
1426 } 1320 }
@@ -1437,41 +1331,38 @@ int RtmpOSNetDevAttach(
1437 return NDIS_STATUS_FAILURE; 1331 return NDIS_STATUS_FAILURE;
1438} 1332}
1439 1333
1440 1334PNET_DEV RtmpOSNetDevCreate(IN RTMP_ADAPTER * pAd,
1441PNET_DEV RtmpOSNetDevCreate( 1335 IN INT devType,
1442 IN RTMP_ADAPTER *pAd, 1336 IN INT devNum,
1443 IN INT devType, 1337 IN INT privMemSize, IN PSTRING pNamePrefix)
1444 IN INT devNum,
1445 IN INT privMemSize,
1446 IN PSTRING pNamePrefix)
1447{ 1338{
1448 struct net_device *pNetDev = NULL; 1339 struct net_device *pNetDev = NULL;
1449 int status; 1340 int status;
1450 1341
1451
1452 /* allocate a new network device */ 1342 /* allocate a new network device */
1453 status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize*/); 1343 status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize */ );
1454 if (status != NDIS_STATUS_SUCCESS) 1344 if (status != NDIS_STATUS_SUCCESS) {
1455 {
1456 /* allocation fail, exit */ 1345 /* allocation fail, exit */
1457 DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (%s)...\n", pNamePrefix)); 1346 DBGPRINT(RT_DEBUG_ERROR,
1347 ("Allocate network device fail (%s)...\n",
1348 pNamePrefix));
1458 return NULL; 1349 return NULL;
1459 } 1350 }
1460 1351
1461
1462 /* find a available interface name, max 32 interfaces */ 1352 /* find a available interface name, max 32 interfaces */
1463 status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum); 1353 status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum);
1464 if (status != NDIS_STATUS_SUCCESS) 1354 if (status != NDIS_STATUS_SUCCESS) {
1465 {
1466 /* error! no any available ra name can be used! */ 1355 /* error! no any available ra name can be used! */
1467 DBGPRINT(RT_DEBUG_ERROR, ("Assign interface name (%s with suffix 0~32) failed...\n", pNamePrefix)); 1356 DBGPRINT(RT_DEBUG_ERROR,
1357 ("Assign interface name (%s with suffix 0~32) failed...\n",
1358 pNamePrefix));
1468 RtmpOSNetDevFree(pNetDev); 1359 RtmpOSNetDevFree(pNetDev);
1469 1360
1470 return NULL; 1361 return NULL;
1471 } 1362 } else {
1472 else 1363 DBGPRINT(RT_DEBUG_TRACE,
1473 { 1364 ("The name of the new %s interface is %s...\n",
1474 DBGPRINT(RT_DEBUG_TRACE, ("The name of the new %s interface is %s...\n", pNamePrefix, pNetDev->name)); 1365 pNamePrefix, pNetDev->name));
1475 } 1366 }
1476 1367
1477 return pNetDev; 1368 return pNetDev;
diff --git a/drivers/staging/rt2860/rt_main_dev.c b/drivers/staging/rt2860/rt_main_dev.c
index 3a735717bcf..8f65e469b51 100644
--- a/drivers/staging/rt2860/rt_main_dev.c
+++ b/drivers/staging/rt2860/rt_main_dev.c
@@ -37,17 +37,14 @@
37 37
38#include "rt_config.h" 38#include "rt_config.h"
39 39
40
41
42/*---------------------------------------------------------------------*/ 40/*---------------------------------------------------------------------*/
43/* Private Variables Used */ 41/* Private Variables Used */
44/*---------------------------------------------------------------------*/ 42/*---------------------------------------------------------------------*/
45 43
46PSTRING mac = ""; // default 00:00:00:00:00:00 44PSTRING mac = ""; // default 00:00:00:00:00:00
47PSTRING hostname = ""; // default CMPC 45PSTRING hostname = ""; // default CMPC
48module_param (mac, charp, 0); 46module_param(mac, charp, 0);
49MODULE_PARM_DESC (mac, "rt28xx: wireless mac addr"); 47MODULE_PARM_DESC(mac, "rt28xx: wireless mac addr");
50
51 48
52/*---------------------------------------------------------------------*/ 49/*---------------------------------------------------------------------*/
53/* Prototypes of Functions Used */ 50/* Prototypes of Functions Used */
@@ -58,11 +55,11 @@ int rt28xx_close(IN struct net_device *net_dev);
58int rt28xx_open(struct net_device *net_dev); 55int rt28xx_open(struct net_device *net_dev);
59 56
60// private function prototype 57// private function prototype
61static INT rt28xx_send_packets(IN struct sk_buff *skb_p, IN struct net_device *net_dev); 58static INT rt28xx_send_packets(IN struct sk_buff *skb_p,
62 59 IN struct net_device *net_dev);
63 60
64static struct net_device_stats *RT28xx_get_ether_stats( 61static struct net_device_stats *RT28xx_get_ether_stats(IN struct net_device
65 IN struct net_device *net_dev); 62 *net_dev);
66 63
67/* 64/*
68======================================================================== 65========================================================================
@@ -86,57 +83,66 @@ Note:
86*/ 83*/
87int MainVirtualIF_close(IN struct net_device *net_dev) 84int MainVirtualIF_close(IN struct net_device *net_dev)
88{ 85{
89 RTMP_ADAPTER *pAd = NULL; 86 RTMP_ADAPTER *pAd = NULL;
90 87
91 GET_PAD_FROM_NET_DEV(pAd, net_dev); 88 GET_PAD_FROM_NET_DEV(pAd, net_dev);
92 89
93 // Sanity check for pAd 90 // Sanity check for pAd
94 if (pAd == NULL) 91 if (pAd == NULL)
95 return 0; // close ok 92 return 0; // close ok
96 93
97 netif_carrier_off(pAd->net_dev); 94 netif_carrier_off(pAd->net_dev);
98 netif_stop_queue(pAd->net_dev); 95 netif_stop_queue(pAd->net_dev);
99 96
100 { 97 {
101 BOOLEAN Cancelled; 98 BOOLEAN Cancelled;
102 99
103 if (INFRA_ON(pAd) && 100 if (INFRA_ON(pAd) &&
104 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) 101 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
105 { 102 MLME_DISASSOC_REQ_STRUCT DisReq;
106 MLME_DISASSOC_REQ_STRUCT DisReq; 103 MLME_QUEUE_ELEM *MsgElem =
107 MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); 104 (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM),
108 105 MEM_ALLOC_FLAG);
109 if (MsgElem) 106
110 { 107 if (MsgElem) {
111 COPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid); 108 COPY_MAC_ADDR(DisReq.Addr,
112 DisReq.Reason = REASON_DEAUTH_STA_LEAVING; 109 pAd->CommonCfg.Bssid);
113 110 DisReq.Reason = REASON_DEAUTH_STA_LEAVING;
114 MsgElem->Machine = ASSOC_STATE_MACHINE; 111
115 MsgElem->MsgType = MT2_MLME_DISASSOC_REQ; 112 MsgElem->Machine = ASSOC_STATE_MACHINE;
116 MsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); 113 MsgElem->MsgType = MT2_MLME_DISASSOC_REQ;
117 NdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); 114 MsgElem->MsgLen =
118 115 sizeof(MLME_DISASSOC_REQ_STRUCT);
119 // Prevent to connect AP again in STAMlmePeriodicExec 116 NdisMoveMemory(MsgElem->Msg, &DisReq,
120 pAd->MlmeAux.AutoReconnectSsidLen= 32; 117 sizeof
121 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); 118 (MLME_DISASSOC_REQ_STRUCT));
122 119
123 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; 120 // Prevent to connect AP again in STAMlmePeriodicExec
124 MlmeDisassocReqAction(pAd, MsgElem); 121 pAd->MlmeAux.AutoReconnectSsidLen = 32;
125 kfree(MsgElem); 122 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid,
123 pAd->MlmeAux.
124 AutoReconnectSsidLen);
125
126 pAd->Mlme.CntlMachine.CurrState =
127 CNTL_WAIT_OID_DISASSOC;
128 MlmeDisassocReqAction(pAd, MsgElem);
129 kfree(MsgElem);
126 } 130 }
127 131
128 RTMPusecDelay(1000); 132 RTMPusecDelay(1000);
129 } 133 }
130 134
131 RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, &Cancelled); 135 RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer,
132 RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, &Cancelled); 136 &Cancelled);
137 RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer,
138 &Cancelled);
133 } 139 }
134 140
135 VIRTUAL_IF_DOWN(pAd); 141 VIRTUAL_IF_DOWN(pAd);
136 142
137 RT_MOD_DEC_USE_COUNT(); 143 RT_MOD_DEC_USE_COUNT();
138 144
139 return 0; // close ok 145 return 0; // close ok
140} 146}
141 147
142/* 148/*
@@ -161,13 +167,13 @@ Note:
161*/ 167*/
162int MainVirtualIF_open(IN struct net_device *net_dev) 168int MainVirtualIF_open(IN struct net_device *net_dev)
163{ 169{
164 RTMP_ADAPTER *pAd = NULL; 170 RTMP_ADAPTER *pAd = NULL;
165 171
166 GET_PAD_FROM_NET_DEV(pAd, net_dev); 172 GET_PAD_FROM_NET_DEV(pAd, net_dev);
167 173
168 // Sanity check for pAd 174 // Sanity check for pAd
169 if (pAd == NULL) 175 if (pAd == NULL)
170 return 0; // close ok 176 return 0; // close ok
171 177
172 if (VIRTUAL_IF_UP(pAd) != 0) 178 if (VIRTUAL_IF_UP(pAd) != 0)
173 return -1; 179 return -1;
@@ -204,10 +210,10 @@ Note:
204*/ 210*/
205int rt28xx_close(IN PNET_DEV dev) 211int rt28xx_close(IN PNET_DEV dev)
206{ 212{
207 struct net_device * net_dev = (struct net_device *)dev; 213 struct net_device *net_dev = (struct net_device *)dev;
208 RTMP_ADAPTER *pAd = NULL; 214 RTMP_ADAPTER *pAd = NULL;
209 BOOLEAN Cancelled; 215 BOOLEAN Cancelled;
210 UINT32 i = 0; 216 UINT32 i = 0;
211 217
212#ifdef RTMP_MAC_USB 218#ifdef RTMP_MAC_USB
213 DECLARE_WAIT_QUEUE_HEAD(unlink_wakeup); 219 DECLARE_WAIT_QUEUE_HEAD(unlink_wakeup);
@@ -216,12 +222,12 @@ int rt28xx_close(IN PNET_DEV dev)
216 222
217 GET_PAD_FROM_NET_DEV(pAd, net_dev); 223 GET_PAD_FROM_NET_DEV(pAd, net_dev);
218 224
219 DBGPRINT(RT_DEBUG_TRACE, ("===> rt28xx_close\n")); 225 DBGPRINT(RT_DEBUG_TRACE, ("===> rt28xx_close\n"));
220 226
221 Cancelled = FALSE; 227 Cancelled = FALSE;
222 // Sanity check for pAd 228 // Sanity check for pAd
223 if (pAd == NULL) 229 if (pAd == NULL)
224 return 0; // close ok 230 return 0; // close ok
225 231
226 { 232 {
227#ifdef RTMP_MAC_PCI 233#ifdef RTMP_MAC_PCI
@@ -230,13 +236,11 @@ int rt28xx_close(IN PNET_DEV dev)
230 236
231 // If dirver doesn't wake up firmware here, 237 // If dirver doesn't wake up firmware here,
232 // NICLoadFirmware will hang forever when interface is up again. 238 // NICLoadFirmware will hang forever when interface is up again.
233 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 239 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
234 { 240 AsicForceWakeup(pAd, TRUE);
235 AsicForceWakeup(pAd, TRUE); 241 }
236 }
237
238#ifdef RTMP_MAC_USB 242#ifdef RTMP_MAC_USB
239 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); 243 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
240#endif // RTMP_MAC_USB // 244#endif // RTMP_MAC_USB //
241 245
242 MlmeRadioOff(pAd); 246 MlmeRadioOff(pAd);
@@ -247,30 +251,28 @@ int rt28xx_close(IN PNET_DEV dev)
247 251
248 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); 252 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
249 253
250 for (i = 0 ; i < NUM_OF_TX_RING; i++) 254 for (i = 0; i < NUM_OF_TX_RING; i++) {
251 { 255 while (pAd->DeQueueRunning[i] == TRUE) {
252 while (pAd->DeQueueRunning[i] == TRUE) 256 DBGPRINT(RT_DEBUG_TRACE,
253 { 257 ("Waiting for TxQueue[%d] done..........\n",
254 DBGPRINT(RT_DEBUG_TRACE, ("Waiting for TxQueue[%d] done..........\n", i)); 258 i));
255 RTMPusecDelay(1000); 259 RTMPusecDelay(1000);
256 } 260 }
257 } 261 }
258 262
259#ifdef RTMP_MAC_USB 263#ifdef RTMP_MAC_USB
260 // ensure there are no more active urbs. 264 // ensure there are no more active urbs.
261 add_wait_queue (&unlink_wakeup, &wait); 265 add_wait_queue(&unlink_wakeup, &wait);
262 pAd->wait = &unlink_wakeup; 266 pAd->wait = &unlink_wakeup;
263 267
264 // maybe wait for deletions to finish. 268 // maybe wait for deletions to finish.
265 i = 0; 269 i = 0;
266 //while((i < 25) && atomic_read(&pAd->PendingRx) > 0) 270 //while((i < 25) && atomic_read(&pAd->PendingRx) > 0)
267 while(i < 25) 271 while (i < 25) {
268 {
269 unsigned long IrqFlags; 272 unsigned long IrqFlags;
270 273
271 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); 274 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
272 if (pAd->PendingRx == 0) 275 if (pAd->PendingRx == 0) {
273 {
274 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); 276 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
275 break; 277 break;
276 } 278 }
@@ -280,7 +282,7 @@ int rt28xx_close(IN PNET_DEV dev)
280 i++; 282 i++;
281 } 283 }
282 pAd->wait = NULL; 284 pAd->wait = NULL;
283 remove_wait_queue (&unlink_wakeup, &wait); 285 remove_wait_queue(&unlink_wakeup, &wait);
284#endif // RTMP_MAC_USB // 286#endif // RTMP_MAC_USB //
285 287
286 // Stop Mlme state machine 288 // Stop Mlme state machine
@@ -293,42 +295,37 @@ int rt28xx_close(IN PNET_DEV dev)
293 MacTableReset(pAd); 295 MacTableReset(pAd);
294 } 296 }
295 297
296
297 MeasureReqTabExit(pAd); 298 MeasureReqTabExit(pAd);
298 TpcReqTabExit(pAd); 299 TpcReqTabExit(pAd);
299 300
300
301 // Close kernel threads 301 // Close kernel threads
302 RtmpMgmtTaskExit(pAd); 302 RtmpMgmtTaskExit(pAd);
303 303
304#ifdef RTMP_MAC_PCI 304#ifdef RTMP_MAC_PCI
305 { 305 {
306 BOOLEAN brc; 306 BOOLEAN brc;
307 // ULONG Value; 307 // ULONG Value;
308
309 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE))
310 {
311 RTMP_ASIC_INTERRUPT_DISABLE(pAd);
312 }
313
314 // Receive packets to clear DMA index after disable interrupt.
315 //RTMPHandleRxDoneInterrupt(pAd);
316 // put to radio off to save power when driver unload. After radiooff, can't write /read register. So need to finish all
317 // register access before Radio off.
318 308
309 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) {
310 RTMP_ASIC_INTERRUPT_DISABLE(pAd);
311 }
312 // Receive packets to clear DMA index after disable interrupt.
313 //RTMPHandleRxDoneInterrupt(pAd);
314 // put to radio off to save power when driver unload. After radiooff, can't write /read register. So need to finish all
315 // register access before Radio off.
319 316
320 brc=RT28xxPciAsicRadioOff(pAd, RTMP_HALT, 0); 317 brc = RT28xxPciAsicRadioOff(pAd, RTMP_HALT, 0);
321 318
322//In solution 3 of 3090F, the bPCIclkOff will be set to TRUE after calling RT28xxPciAsicRadioOff 319//In solution 3 of 3090F, the bPCIclkOff will be set to TRUE after calling RT28xxPciAsicRadioOff
323 pAd->bPCIclkOff = FALSE; 320 pAd->bPCIclkOff = FALSE;
324 321
325 if (brc==FALSE) 322 if (brc == FALSE) {
326 { 323 DBGPRINT(RT_DEBUG_ERROR,
327 DBGPRINT(RT_DEBUG_ERROR,("%s call RT28xxPciAsicRadioOff fail !!\n", __func__)); 324 ("%s call RT28xxPciAsicRadioOff fail !!\n",
328 } 325 __func__));
326 }
329 } 327 }
330 328
331
332/* 329/*
333 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) 330 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE))
334 { 331 {
@@ -341,15 +338,13 @@ int rt28xx_close(IN PNET_DEV dev)
341#endif // RTMP_MAC_PCI // 338#endif // RTMP_MAC_PCI //
342 339
343 // Free IRQ 340 // Free IRQ
344 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 341 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
345 {
346#ifdef RTMP_MAC_PCI 342#ifdef RTMP_MAC_PCI
347 // Deregister interrupt function 343 // Deregister interrupt function
348 RtmpOSIRQRelease(net_dev); 344 RtmpOSIRQRelease(net_dev);
349#endif // RTMP_MAC_PCI // 345#endif // RTMP_MAC_PCI //
350 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); 346 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
351 } 347 }
352
353 // Free Ring or USB buffers 348 // Free Ring or USB buffers
354 RTMPFreeTxRxRingMemory(pAd); 349 RTMPFreeTxRxRingMemory(pAd);
355 350
@@ -358,7 +353,6 @@ int rt28xx_close(IN PNET_DEV dev)
358 // Free BA reorder resource 353 // Free BA reorder resource
359 ba_reordering_resource_release(pAd); 354 ba_reordering_resource_release(pAd);
360 355
361
362 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP); 356 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP);
363 357
364/*+++Modify by woody to solve the bulk fail+++*/ 358/*+++Modify by woody to solve the bulk fail+++*/
@@ -366,9 +360,8 @@ int rt28xx_close(IN PNET_DEV dev)
366 } 360 }
367 361
368 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt28xx_close\n")); 362 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt28xx_close\n"));
369 return 0; // close ok 363 return 0; // close ok
370} /* End of rt28xx_close */ 364} /* End of rt28xx_close */
371
372 365
373/* 366/*
374======================================================================== 367========================================================================
@@ -387,7 +380,7 @@ Note:
387*/ 380*/
388int rt28xx_open(IN PNET_DEV dev) 381int rt28xx_open(IN PNET_DEV dev)
389{ 382{
390 struct net_device * net_dev = (struct net_device *)dev; 383 struct net_device *net_dev = (struct net_device *)dev;
391 PRTMP_ADAPTER pAd = NULL; 384 PRTMP_ADAPTER pAd = NULL;
392 int retval = 0; 385 int retval = 0;
393 //POS_COOKIE pObj; 386 //POS_COOKIE pObj;
@@ -395,24 +388,21 @@ int rt28xx_open(IN PNET_DEV dev)
395 GET_PAD_FROM_NET_DEV(pAd, net_dev); 388 GET_PAD_FROM_NET_DEV(pAd, net_dev);
396 389
397 // Sanity check for pAd 390 // Sanity check for pAd
398 if (pAd == NULL) 391 if (pAd == NULL) {
399 {
400 /* if 1st open fail, pAd will be free; 392 /* if 1st open fail, pAd will be free;
401 So the net_dev->ml_priv will be NULL in 2rd open */ 393 So the net_dev->ml_priv will be NULL in 2rd open */
402 return -1; 394 return -1;
403 } 395 }
404 396
405 if (net_dev->priv_flags == INT_MAIN) 397 if (net_dev->priv_flags == INT_MAIN) {
406 {
407 if (pAd->OpMode == OPMODE_STA) 398 if (pAd->OpMode == OPMODE_STA)
408 net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_iw_handler_def; 399 net_dev->wireless_handlers =
400 (struct iw_handler_def *)&rt28xx_iw_handler_def;
409 } 401 }
410
411 // Request interrupt service routine for PCI device 402 // Request interrupt service routine for PCI device
412 // register the interrupt routine with the os 403 // register the interrupt routine with the os
413 RtmpOSIRQRequest(net_dev); 404 RtmpOSIRQRequest(net_dev);
414 405
415
416 // Init IRQ parameters stored in pAd 406 // Init IRQ parameters stored in pAd
417 RTMP_IRQ_INIT(pAd); 407 RTMP_IRQ_INIT(pAd);
418 408
@@ -420,7 +410,6 @@ int rt28xx_open(IN PNET_DEV dev)
420 if (rt28xx_init(pAd, mac, hostname) == FALSE) 410 if (rt28xx_init(pAd, mac, hostname) == FALSE)
421 goto err; 411 goto err;
422 412
423
424 // Enable Interrupt 413 // Enable Interrupt
425 RTMP_IRQ_ENABLE(pAd); 414 RTMP_IRQ_ENABLE(pAd);
426 415
@@ -429,25 +418,25 @@ int rt28xx_open(IN PNET_DEV dev)
429 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); 418 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP);
430 419
431 { 420 {
432 UINT32 reg = 0; 421 UINT32 reg = 0;
433 RTMP_IO_READ32(pAd, 0x1300, &reg); // clear garbage interrupts 422 RTMP_IO_READ32(pAd, 0x1300, &reg); // clear garbage interrupts
434 printk("0x1300 = %08x\n", reg); 423 printk("0x1300 = %08x\n", reg);
435 } 424 }
436 425
437 { 426 {
438// u32 reg; 427// u32 reg;
439// UINT8 byte; 428// UINT8 byte;
440// u16 tmp; 429// u16 tmp;
441 430
442// RTMP_IO_READ32(pAd, XIFS_TIME_CFG, &reg); 431// RTMP_IO_READ32(pAd, XIFS_TIME_CFG, &reg);
443 432
444// tmp = 0x0805; 433// tmp = 0x0805;
445// reg = (reg & 0xffff0000) | tmp; 434// reg = (reg & 0xffff0000) | tmp;
446// RTMP_IO_WRITE32(pAd, XIFS_TIME_CFG, reg); 435// RTMP_IO_WRITE32(pAd, XIFS_TIME_CFG, reg);
447 436
448 } 437 }
449#ifdef RTMP_MAC_PCI 438#ifdef RTMP_MAC_PCI
450 RTMPInitPCIeLinkCtrlValue(pAd); 439 RTMPInitPCIeLinkCtrlValue(pAd);
451#endif // RTMP_MAC_PCI // 440#endif // RTMP_MAC_PCI //
452 441
453 return (retval); 442 return (retval);
@@ -457,39 +446,41 @@ err:
457 RtmpOSIRQRelease(net_dev); 446 RtmpOSIRQRelease(net_dev);
458//---Add by shiang, move from rt28xx_init() to here. 447//---Add by shiang, move from rt28xx_init() to here.
459 return (-1); 448 return (-1);
460} /* End of rt28xx_open */ 449} /* End of rt28xx_open */
461 450
462static const struct net_device_ops rt2860_netdev_ops = { 451static const struct net_device_ops rt2860_netdev_ops = {
463 .ndo_open = MainVirtualIF_open, 452 .ndo_open = MainVirtualIF_open,
464 .ndo_stop = MainVirtualIF_close, 453 .ndo_stop = MainVirtualIF_close,
465 .ndo_do_ioctl = rt28xx_sta_ioctl, 454 .ndo_do_ioctl = rt28xx_sta_ioctl,
466 .ndo_get_stats = RT28xx_get_ether_stats, 455 .ndo_get_stats = RT28xx_get_ether_stats,
467 .ndo_validate_addr = NULL, 456 .ndo_validate_addr = NULL,
468 .ndo_set_mac_address = eth_mac_addr, 457 .ndo_set_mac_address = eth_mac_addr,
469 .ndo_change_mtu = eth_change_mtu, 458 .ndo_change_mtu = eth_change_mtu,
470 .ndo_start_xmit = rt28xx_send_packets, 459 .ndo_start_xmit = rt28xx_send_packets,
471}; 460};
472 461
473PNET_DEV RtmpPhyNetDevInit( 462PNET_DEV RtmpPhyNetDevInit(IN RTMP_ADAPTER * pAd,
474 IN RTMP_ADAPTER *pAd, 463 IN RTMP_OS_NETDEV_OP_HOOK * pNetDevHook)
475 IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook)
476{ 464{
477 struct net_device *net_dev = NULL; 465 struct net_device *net_dev = NULL;
478// NDIS_STATUS Status; 466// NDIS_STATUS Status;
479 467
480 net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); 468 net_dev =
481 if (net_dev == NULL) 469 RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER),
482 { 470 INF_MAIN_DEV_NAME);
483 printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n"); 471 if (net_dev == NULL) {
472 printk
473 ("RtmpPhyNetDevInit(): creation failed for main physical net device!\n");
484 return NULL; 474 return NULL;
485 } 475 }
486 476
487 NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); 477 NdisZeroMemory((unsigned char *)pNetDevHook,
478 sizeof(RTMP_OS_NETDEV_OP_HOOK));
488 pNetDevHook->netdev_ops = &rt2860_netdev_ops; 479 pNetDevHook->netdev_ops = &rt2860_netdev_ops;
489 pNetDevHook->priv_flags = INT_MAIN; 480 pNetDevHook->priv_flags = INT_MAIN;
490 pNetDevHook->needProtcted = FALSE; 481 pNetDevHook->needProtcted = FALSE;
491 482
492 net_dev->ml_priv = (PVOID)pAd; 483 net_dev->ml_priv = (PVOID) pAd;
493 pAd->net_dev = net_dev; 484 pAd->net_dev = net_dev;
494 485
495 netif_stop_queue(net_dev); 486 netif_stop_queue(net_dev);
@@ -498,7 +489,6 @@ PNET_DEV RtmpPhyNetDevInit(
498 489
499} 490}
500 491
501
502/* 492/*
503======================================================================== 493========================================================================
504Routine Description: 494Routine Description:
@@ -529,16 +519,14 @@ int rt28xx_packet_xmit(struct sk_buff *skb)
529 519
530 { 520 {
531 // Drop send request since we are in monitor mode 521 // Drop send request since we are in monitor mode
532 if (MONITOR_ON(pAd)) 522 if (MONITOR_ON(pAd)) {
533 {
534 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 523 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
535 goto done; 524 goto done;
536 } 525 }
537 } 526 }
538 527
539 // EapolStart size is 18 528 // EapolStart size is 18
540 if (skb->len < 14) 529 if (skb->len < 14) {
541 {
542 //printk("bad packet size: %d\n", pkt->len); 530 //printk("bad packet size: %d\n", pkt->len);
543 hex_dump("bad packet", skb->data, skb->len); 531 hex_dump("bad packet", skb->data, skb->len);
544 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 532 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
@@ -546,7 +534,7 @@ int rt28xx_packet_xmit(struct sk_buff *skb)
546 } 534 }
547 535
548 RTMP_SET_PACKET_5VT(pPacket, 0); 536 RTMP_SET_PACKET_5VT(pPacket, 0);
549 STASendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1); 537 STASendPackets((NDIS_HANDLE) pAd, (PPNDIS_PACKET) & pPacket, 1);
550 538
551 status = NETDEV_TX_OK; 539 status = NETDEV_TX_OK;
552done: 540done:
@@ -554,7 +542,6 @@ done:
554 return status; 542 return status;
555} 543}
556 544
557
558/* 545/*
559======================================================================== 546========================================================================
560Routine Description: 547Routine Description:
@@ -571,30 +558,27 @@ Return Value:
571Note: 558Note:
572======================================================================== 559========================================================================
573*/ 560*/
574static int rt28xx_send_packets( 561static int rt28xx_send_packets(IN struct sk_buff *skb_p,
575 IN struct sk_buff *skb_p, 562 IN struct net_device *net_dev)
576 IN struct net_device *net_dev)
577{ 563{
578 RTMP_ADAPTER *pAd = NULL; 564 RTMP_ADAPTER *pAd = NULL;
579 565
580 GET_PAD_FROM_NET_DEV(pAd, net_dev); 566 GET_PAD_FROM_NET_DEV(pAd, net_dev);
581 567
582 if (!(net_dev->flags & IFF_UP)) 568 if (!(net_dev->flags & IFF_UP)) {
583 { 569 RELEASE_NDIS_PACKET(pAd, (PNDIS_PACKET) skb_p,
584 RELEASE_NDIS_PACKET(pAd, (PNDIS_PACKET)skb_p, NDIS_STATUS_FAILURE); 570 NDIS_STATUS_FAILURE);
585 return NETDEV_TX_OK; 571 return NETDEV_TX_OK;
586 } 572 }
587 573
588 NdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15); 574 NdisZeroMemory((PUCHAR) & skb_p->cb[CB_OFF], 15);
589 RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID); 575 RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID);
590 576
591 return rt28xx_packet_xmit(skb_p); 577 return rt28xx_packet_xmit(skb_p);
592} 578}
593 579
594
595// This function will be called when query /proc 580// This function will be called when query /proc
596struct iw_statistics *rt28xx_get_wireless_stats( 581struct iw_statistics *rt28xx_get_wireless_stats(IN struct net_device *net_dev)
597 IN struct net_device *net_dev)
598{ 582{
599 PRTMP_ADAPTER pAd = NULL; 583 PRTMP_ADAPTER pAd = NULL;
600 584
@@ -602,42 +586,41 @@ struct iw_statistics *rt28xx_get_wireless_stats(
602 586
603 DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_get_wireless_stats --->\n")); 587 DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_get_wireless_stats --->\n"));
604 588
605 pAd->iw_stats.status = 0; // Status - device dependent for now 589 pAd->iw_stats.status = 0; // Status - device dependent for now
606 590
607 // link quality 591 // link quality
608 if (pAd->OpMode == OPMODE_STA) 592 if (pAd->OpMode == OPMODE_STA)
609 pAd->iw_stats.qual.qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); 593 pAd->iw_stats.qual.qual =
594 ((pAd->Mlme.ChannelQuality * 12) / 10 + 10);
610 595
611 if(pAd->iw_stats.qual.qual > 100) 596 if (pAd->iw_stats.qual.qual > 100)
612 pAd->iw_stats.qual.qual = 100; 597 pAd->iw_stats.qual.qual = 100;
613 598
614 if (pAd->OpMode == OPMODE_STA) 599 if (pAd->OpMode == OPMODE_STA) {
615 {
616 pAd->iw_stats.qual.level = 600 pAd->iw_stats.qual.level =
617 RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, 601 RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0,
618 pAd->StaCfg.RssiSample.LastRssi1, 602 pAd->StaCfg.RssiSample.LastRssi1,
619 pAd->StaCfg.RssiSample.LastRssi2); 603 pAd->StaCfg.RssiSample.LastRssi2);
620 } 604 }
621 605
622 pAd->iw_stats.qual.noise = pAd->BbpWriteLatch[66]; // noise level (dBm) 606 pAd->iw_stats.qual.noise = pAd->BbpWriteLatch[66]; // noise level (dBm)
623 607
624 pAd->iw_stats.qual.noise += 256 - 143; 608 pAd->iw_stats.qual.noise += 256 - 143;
625 pAd->iw_stats.qual.updated = 1; // Flags to know if updated 609 pAd->iw_stats.qual.updated = 1; // Flags to know if updated
626#ifdef IW_QUAL_DBM 610#ifdef IW_QUAL_DBM
627 pAd->iw_stats.qual.updated |= IW_QUAL_DBM; // Level + Noise are dBm 611 pAd->iw_stats.qual.updated |= IW_QUAL_DBM; // Level + Noise are dBm
628#endif // IW_QUAL_DBM // 612#endif // IW_QUAL_DBM //
629 613
630 pAd->iw_stats.discard.nwid = 0; // Rx : Wrong nwid/essid 614 pAd->iw_stats.discard.nwid = 0; // Rx : Wrong nwid/essid
631 pAd->iw_stats.miss.beacon = 0; // Missed beacons/superframe 615 pAd->iw_stats.miss.beacon = 0; // Missed beacons/superframe
632 616
633 DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n")); 617 DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n"));
634 return &pAd->iw_stats; 618 return &pAd->iw_stats;
635} 619}
636 620
637
638void tbtt_tasklet(unsigned long data) 621void tbtt_tasklet(unsigned long data)
639{ 622{
640//#define MAX_TX_IN_TBTT (16) 623//#define MAX_TX_IN_TBTT (16)
641 624
642} 625}
643 626
@@ -657,19 +640,20 @@ void tbtt_tasklet(unsigned long data)
657 640
658 ======================================================================== 641 ========================================================================
659*/ 642*/
660static struct net_device_stats *RT28xx_get_ether_stats( 643static struct net_device_stats *RT28xx_get_ether_stats(IN struct net_device
661 IN struct net_device *net_dev) 644 *net_dev)
662{ 645{
663 RTMP_ADAPTER *pAd = NULL; 646 RTMP_ADAPTER *pAd = NULL;
664 647
665 if (net_dev) 648 if (net_dev)
666 GET_PAD_FROM_NET_DEV(pAd, net_dev); 649 GET_PAD_FROM_NET_DEV(pAd, net_dev);
667 650
668 if (pAd) 651 if (pAd) {
669 {
670 652
671 pAd->stats.rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; 653 pAd->stats.rx_packets =
672 pAd->stats.tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; 654 pAd->WlanCounters.ReceivedFragmentCount.QuadPart;
655 pAd->stats.tx_packets =
656 pAd->WlanCounters.TransmittedFragmentCount.QuadPart;
673 657
674 pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount; 658 pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount;
675 pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount; 659 pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount;
@@ -680,45 +664,40 @@ static struct net_device_stats *RT28xx_get_ether_stats(
680 pAd->stats.rx_dropped = 0; 664 pAd->stats.rx_dropped = 0;
681 pAd->stats.tx_dropped = 0; 665 pAd->stats.tx_dropped = 0;
682 666
683 pAd->stats.multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; // multicast packets received 667 pAd->stats.multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; // multicast packets received
684 pAd->stats.collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions; // Collision packets 668 pAd->stats.collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions; // Collision packets
685 669
686 pAd->stats.rx_length_errors = 0; 670 pAd->stats.rx_length_errors = 0;
687 pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer; // receiver ring buff overflow 671 pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer; // receiver ring buff overflow
688 pAd->stats.rx_crc_errors = 0;//pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error 672 pAd->stats.rx_crc_errors = 0; //pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error
689 pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors; // recv'd frame alignment error 673 pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors; // recv'd frame alignment error
690 pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer; // recv'r fifo overrun 674 pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer; // recv'r fifo overrun
691 pAd->stats.rx_missed_errors = 0; // receiver missed packet 675 pAd->stats.rx_missed_errors = 0; // receiver missed packet
692 676
693 // detailed tx_errors 677 // detailed tx_errors
694 pAd->stats.tx_aborted_errors = 0; 678 pAd->stats.tx_aborted_errors = 0;
695 pAd->stats.tx_carrier_errors = 0; 679 pAd->stats.tx_carrier_errors = 0;
696 pAd->stats.tx_fifo_errors = 0; 680 pAd->stats.tx_fifo_errors = 0;
697 pAd->stats.tx_heartbeat_errors = 0; 681 pAd->stats.tx_heartbeat_errors = 0;
698 pAd->stats.tx_window_errors = 0; 682 pAd->stats.tx_window_errors = 0;
699 683
700 // for cslip etc 684 // for cslip etc
701 pAd->stats.rx_compressed = 0; 685 pAd->stats.rx_compressed = 0;
702 pAd->stats.tx_compressed = 0; 686 pAd->stats.tx_compressed = 0;
703 687
704 return &pAd->stats; 688 return &pAd->stats;
705 } 689 } else
706 else 690 return NULL;
707 return NULL;
708} 691}
709 692
710 693BOOLEAN RtmpPhyNetDevExit(IN RTMP_ADAPTER * pAd, IN PNET_DEV net_dev)
711BOOLEAN RtmpPhyNetDevExit(
712 IN RTMP_ADAPTER *pAd,
713 IN PNET_DEV net_dev)
714{ 694{
715 695
716
717
718 // Unregister network device 696 // Unregister network device
719 if (net_dev != NULL) 697 if (net_dev != NULL) {
720 { 698 printk
721 printk("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n", net_dev->name); 699 ("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n",
700 net_dev->name);
722 RtmpOSNetDevDetach(net_dev); 701 RtmpOSNetDevDetach(net_dev);
723 } 702 }
724 703
@@ -726,7 +705,6 @@ BOOLEAN RtmpPhyNetDevExit(
726 705
727} 706}
728 707
729
730/* 708/*
731======================================================================== 709========================================================================
732Routine Description: 710Routine Description:
@@ -743,17 +721,14 @@ Return Value:
743Note: 721Note:
744======================================================================== 722========================================================================
745*/ 723*/
746NDIS_STATUS AdapterBlockAllocateMemory( 724NDIS_STATUS AdapterBlockAllocateMemory(IN PVOID handle, OUT PVOID * ppAd)
747 IN PVOID handle,
748 OUT PVOID *ppAd)
749{ 725{
750 726
751 *ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); 727 *ppAd = (PVOID) vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr);
752 728
753 if (*ppAd) 729 if (*ppAd) {
754 {
755 NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER)); 730 NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER));
756 ((PRTMP_ADAPTER)*ppAd)->OS_Cookie = handle; 731 ((PRTMP_ADAPTER) * ppAd)->OS_Cookie = handle;
757 return (NDIS_STATUS_SUCCESS); 732 return (NDIS_STATUS_SUCCESS);
758 } else { 733 } else {
759 return (NDIS_STATUS_FAILURE); 734 return (NDIS_STATUS_FAILURE);
diff --git a/drivers/staging/rt2860/rt_pci_rbus.c b/drivers/staging/rt2860/rt_pci_rbus.c
index 59900011b55..8ae0e3eb50e 100644
--- a/drivers/staging/rt2860/rt_pci_rbus.c
+++ b/drivers/staging/rt2860/rt_pci_rbus.c
@@ -48,31 +48,28 @@ static void ac2_dma_done_tasklet(unsigned long data);
48static void ac3_dma_done_tasklet(unsigned long data); 48static void ac3_dma_done_tasklet(unsigned long data);
49static void fifo_statistic_full_tasklet(unsigned long data); 49static void fifo_statistic_full_tasklet(unsigned long data);
50 50
51
52
53/*---------------------------------------------------------------------*/ 51/*---------------------------------------------------------------------*/
54/* Symbol & Macro Definitions */ 52/* Symbol & Macro Definitions */
55/*---------------------------------------------------------------------*/ 53/*---------------------------------------------------------------------*/
56#define RT2860_INT_RX_DLY (1<<0) // bit 0 54#define RT2860_INT_RX_DLY (1<<0) // bit 0
57#define RT2860_INT_TX_DLY (1<<1) // bit 1 55#define RT2860_INT_TX_DLY (1<<1) // bit 1
58#define RT2860_INT_RX_DONE (1<<2) // bit 2 56#define RT2860_INT_RX_DONE (1<<2) // bit 2
59#define RT2860_INT_AC0_DMA_DONE (1<<3) // bit 3 57#define RT2860_INT_AC0_DMA_DONE (1<<3) // bit 3
60#define RT2860_INT_AC1_DMA_DONE (1<<4) // bit 4 58#define RT2860_INT_AC1_DMA_DONE (1<<4) // bit 4
61#define RT2860_INT_AC2_DMA_DONE (1<<5) // bit 5 59#define RT2860_INT_AC2_DMA_DONE (1<<5) // bit 5
62#define RT2860_INT_AC3_DMA_DONE (1<<6) // bit 6 60#define RT2860_INT_AC3_DMA_DONE (1<<6) // bit 6
63#define RT2860_INT_HCCA_DMA_DONE (1<<7) // bit 7 61#define RT2860_INT_HCCA_DMA_DONE (1<<7) // bit 7
64#define RT2860_INT_MGMT_DONE (1<<8) // bit 8 62#define RT2860_INT_MGMT_DONE (1<<8) // bit 8
65 63
66#define INT_RX RT2860_INT_RX_DONE 64#define INT_RX RT2860_INT_RX_DONE
67 65
68#define INT_AC0_DLY (RT2860_INT_AC0_DMA_DONE) //| RT2860_INT_TX_DLY) 66#define INT_AC0_DLY (RT2860_INT_AC0_DMA_DONE) //| RT2860_INT_TX_DLY)
69#define INT_AC1_DLY (RT2860_INT_AC1_DMA_DONE) //| RT2860_INT_TX_DLY) 67#define INT_AC1_DLY (RT2860_INT_AC1_DMA_DONE) //| RT2860_INT_TX_DLY)
70#define INT_AC2_DLY (RT2860_INT_AC2_DMA_DONE) //| RT2860_INT_TX_DLY) 68#define INT_AC2_DLY (RT2860_INT_AC2_DMA_DONE) //| RT2860_INT_TX_DLY)
71#define INT_AC3_DLY (RT2860_INT_AC3_DMA_DONE) //| RT2860_INT_TX_DLY) 69#define INT_AC3_DLY (RT2860_INT_AC3_DMA_DONE) //| RT2860_INT_TX_DLY)
72#define INT_HCCA_DLY (RT2860_INT_HCCA_DMA_DONE) //| RT2860_INT_TX_DLY) 70#define INT_HCCA_DLY (RT2860_INT_HCCA_DMA_DONE) //| RT2860_INT_TX_DLY)
73#define INT_MGMT_DLY RT2860_INT_MGMT_DONE 71#define INT_MGMT_DLY RT2860_INT_MGMT_DONE
74 72
75
76/*************************************************************************** 73/***************************************************************************
77 * 74 *
78 * Interface-depended memory allocation/Free related procedures. 75 * Interface-depended memory allocation/Free related procedures.
@@ -80,92 +77,90 @@ static void fifo_statistic_full_tasklet(unsigned long data);
80 * 77 *
81 **************************************************************************/ 78 **************************************************************************/
82// Function for TxDesc Memory allocation. 79// Function for TxDesc Memory allocation.
83void RTMP_AllocateTxDescMemory( 80void RTMP_AllocateTxDescMemory(IN PRTMP_ADAPTER pAd,
84 IN PRTMP_ADAPTER pAd, 81 IN UINT Index,
85 IN UINT Index, 82 IN ULONG Length,
86 IN ULONG Length, 83 IN BOOLEAN Cached,
87 IN BOOLEAN Cached, 84 OUT PVOID * VirtualAddress,
88 OUT PVOID *VirtualAddress, 85 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
89 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
90{ 86{
91 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 87 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
92 88
93 *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); 89 *VirtualAddress =
90 (PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
91 PhysicalAddress);
94 92
95} 93}
96 94
97
98// Function for MgmtDesc Memory allocation. 95// Function for MgmtDesc Memory allocation.
99void RTMP_AllocateMgmtDescMemory( 96void RTMP_AllocateMgmtDescMemory(IN PRTMP_ADAPTER pAd,
100 IN PRTMP_ADAPTER pAd, 97 IN ULONG Length,
101 IN ULONG Length, 98 IN BOOLEAN Cached,
102 IN BOOLEAN Cached, 99 OUT PVOID * VirtualAddress,
103 OUT PVOID *VirtualAddress, 100 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
104 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
105{ 101{
106 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 102 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
107 103
108 *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); 104 *VirtualAddress =
105 (PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
106 PhysicalAddress);
109 107
110} 108}
111 109
112
113// Function for RxDesc Memory allocation. 110// Function for RxDesc Memory allocation.
114void RTMP_AllocateRxDescMemory( 111void RTMP_AllocateRxDescMemory(IN PRTMP_ADAPTER pAd,
115 IN PRTMP_ADAPTER pAd, 112 IN ULONG Length,
116 IN ULONG Length, 113 IN BOOLEAN Cached,
117 IN BOOLEAN Cached, 114 OUT PVOID * VirtualAddress,
118 OUT PVOID *VirtualAddress, 115 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
119 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
120{ 116{
121 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 117 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
122 118
123 *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); 119 *VirtualAddress =
120 (PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
121 PhysicalAddress);
124 122
125} 123}
126 124
127
128// Function for free allocated Desc Memory. 125// Function for free allocated Desc Memory.
129void RTMP_FreeDescMemory( 126void RTMP_FreeDescMemory(IN PRTMP_ADAPTER pAd,
130 IN PRTMP_ADAPTER pAd, 127 IN ULONG Length,
131 IN ULONG Length, 128 IN PVOID VirtualAddress,
132 IN PVOID VirtualAddress, 129 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
133 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
134{ 130{
135 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 131 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
136 132
137 pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress); 133 pci_free_consistent(pObj->pci_dev, Length, VirtualAddress,
134 PhysicalAddress);
138} 135}
139 136
140
141// Function for TxData DMA Memory allocation. 137// Function for TxData DMA Memory allocation.
142void RTMP_AllocateFirstTxBuffer( 138void RTMP_AllocateFirstTxBuffer(IN PRTMP_ADAPTER pAd,
143 IN PRTMP_ADAPTER pAd, 139 IN UINT Index,
144 IN UINT Index, 140 IN ULONG Length,
145 IN ULONG Length, 141 IN BOOLEAN Cached,
146 IN BOOLEAN Cached, 142 OUT PVOID * VirtualAddress,
147 OUT PVOID *VirtualAddress, 143 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
148 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
149{ 144{
150 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 145 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
151 146
152 *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); 147 *VirtualAddress =
148 (PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
149 PhysicalAddress);
153} 150}
154 151
155 152void RTMP_FreeFirstTxBuffer(IN PRTMP_ADAPTER pAd,
156void RTMP_FreeFirstTxBuffer( 153 IN ULONG Length,
157 IN PRTMP_ADAPTER pAd, 154 IN BOOLEAN Cached,
158 IN ULONG Length, 155 IN PVOID VirtualAddress,
159 IN BOOLEAN Cached, 156 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
160 IN PVOID VirtualAddress,
161 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
162{ 157{
163 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 158 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
164 159
165 pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress); 160 pci_free_consistent(pObj->pci_dev, Length, VirtualAddress,
161 PhysicalAddress);
166} 162}
167 163
168
169/* 164/*
170 * FUNCTION: Allocate a common buffer for DMA 165 * FUNCTION: Allocate a common buffer for DMA
171 * ARGUMENTS: 166 * ARGUMENTS:
@@ -175,19 +170,19 @@ void RTMP_FreeFirstTxBuffer(
175 * VirtualAddress: Pointer to memory is returned here 170 * VirtualAddress: Pointer to memory is returned here
176 * PhysicalAddress: Physical address corresponding to virtual address 171 * PhysicalAddress: Physical address corresponding to virtual address
177 */ 172 */
178void RTMP_AllocateSharedMemory( 173void RTMP_AllocateSharedMemory(IN PRTMP_ADAPTER pAd,
179 IN PRTMP_ADAPTER pAd, 174 IN ULONG Length,
180 IN ULONG Length, 175 IN BOOLEAN Cached,
181 IN BOOLEAN Cached, 176 OUT PVOID * VirtualAddress,
182 OUT PVOID *VirtualAddress, 177 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
183 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
184{ 178{
185 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 179 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
186 180
187 *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); 181 *VirtualAddress =
182 (PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
183 PhysicalAddress);
188} 184}
189 185
190
191/* 186/*
192 * FUNCTION: Allocate a packet buffer for DMA 187 * FUNCTION: Allocate a packet buffer for DMA
193 * ARGUMENTS: 188 * ARGUMENTS:
@@ -199,25 +194,28 @@ void RTMP_AllocateSharedMemory(
199 * Notes: 194 * Notes:
200 * Cached is ignored: always cached memory 195 * Cached is ignored: always cached memory
201 */ 196 */
202PNDIS_PACKET RTMP_AllocateRxPacketBuffer( 197PNDIS_PACKET RTMP_AllocateRxPacketBuffer(IN PRTMP_ADAPTER pAd,
203 IN PRTMP_ADAPTER pAd, 198 IN ULONG Length,
204 IN ULONG Length, 199 IN BOOLEAN Cached,
205 IN BOOLEAN Cached, 200 OUT PVOID * VirtualAddress,
206 OUT PVOID *VirtualAddress, 201 OUT PNDIS_PHYSICAL_ADDRESS
207 OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) 202 PhysicalAddress)
208{ 203{
209 struct sk_buff *pkt; 204 struct sk_buff *pkt;
210 205
211 pkt = dev_alloc_skb(Length); 206 pkt = dev_alloc_skb(Length);
212 207
213 if (pkt == NULL) { 208 if (pkt == NULL) {
214 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate rx %ld size packet\n",Length)); 209 DBGPRINT(RT_DEBUG_ERROR,
210 ("can't allocate rx %ld size packet\n", Length));
215 } 211 }
216 212
217 if (pkt) { 213 if (pkt) {
218 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); 214 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
219 *VirtualAddress = (PVOID) pkt->data; 215 *VirtualAddress = (PVOID) pkt->data;
220 *PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE); 216 *PhysicalAddress =
217 PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1,
218 PCI_DMA_FROMDEVICE);
221 } else { 219 } else {
222 *VirtualAddress = (PVOID) NULL; 220 *VirtualAddress = (PVOID) NULL;
223 *PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL; 221 *PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL;
@@ -226,36 +224,40 @@ PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
226 return (PNDIS_PACKET) pkt; 224 return (PNDIS_PACKET) pkt;
227} 225}
228 226
229 227VOID Invalid_Remaining_Packet(IN PRTMP_ADAPTER pAd, IN ULONG VirtualAddress)
230VOID Invalid_Remaining_Packet(
231 IN PRTMP_ADAPTER pAd,
232 IN ULONG VirtualAddress)
233{ 228{
234 NDIS_PHYSICAL_ADDRESS PhysicalAddress; 229 NDIS_PHYSICAL_ADDRESS PhysicalAddress;
235 230
236 PhysicalAddress = PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress+1600), RX_BUFFER_NORMSIZE-1600, -1, PCI_DMA_FROMDEVICE); 231 PhysicalAddress =
232 PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress + 1600),
233 RX_BUFFER_NORMSIZE - 1600, -1, PCI_DMA_FROMDEVICE);
237} 234}
238 235
239NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER *pAd) 236NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER * pAd)
240{ 237{
241 POS_COOKIE pObj; 238 POS_COOKIE pObj;
242 239
243 pObj = (POS_COOKIE) pAd->OS_Cookie; 240 pObj = (POS_COOKIE) pAd->OS_Cookie;
244 241
245 tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd); 242 tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd);
246 tasklet_init(&pObj->mgmt_dma_done_task, mgmt_dma_done_tasklet, (unsigned long)pAd); 243 tasklet_init(&pObj->mgmt_dma_done_task, mgmt_dma_done_tasklet,
247 tasklet_init(&pObj->ac0_dma_done_task, ac0_dma_done_tasklet, (unsigned long)pAd); 244 (unsigned long)pAd);
248 tasklet_init(&pObj->ac1_dma_done_task, ac1_dma_done_tasklet, (unsigned long)pAd); 245 tasklet_init(&pObj->ac0_dma_done_task, ac0_dma_done_tasklet,
249 tasklet_init(&pObj->ac2_dma_done_task, ac2_dma_done_tasklet, (unsigned long)pAd); 246 (unsigned long)pAd);
250 tasklet_init(&pObj->ac3_dma_done_task, ac3_dma_done_tasklet, (unsigned long)pAd); 247 tasklet_init(&pObj->ac1_dma_done_task, ac1_dma_done_tasklet,
248 (unsigned long)pAd);
249 tasklet_init(&pObj->ac2_dma_done_task, ac2_dma_done_tasklet,
250 (unsigned long)pAd);
251 tasklet_init(&pObj->ac3_dma_done_task, ac3_dma_done_tasklet,
252 (unsigned long)pAd);
251 tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd); 253 tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
252 tasklet_init(&pObj->fifo_statistic_full_task, fifo_statistic_full_tasklet, (unsigned long)pAd); 254 tasklet_init(&pObj->fifo_statistic_full_task,
255 fifo_statistic_full_tasklet, (unsigned long)pAd);
253 256
254 return NDIS_STATUS_SUCCESS; 257 return NDIS_STATUS_SUCCESS;
255} 258}
256 259
257 260void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd)
258void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
259{ 261{
260 POS_COOKIE pObj; 262 POS_COOKIE pObj;
261 263
@@ -271,15 +273,12 @@ void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
271 tasklet_kill(&pObj->fifo_statistic_full_task); 273 tasklet_kill(&pObj->fifo_statistic_full_task);
272} 274}
273 275
274 276NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER * pAd)
275NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER *pAd)
276{ 277{
277 278
278
279 return NDIS_STATUS_SUCCESS; 279 return NDIS_STATUS_SUCCESS;
280} 280}
281 281
282
283/* 282/*
284======================================================================== 283========================================================================
285Routine Description: 284Routine Description:
@@ -294,15 +293,12 @@ Return Value:
294Note: 293Note:
295======================================================================== 294========================================================================
296*/ 295*/
297VOID RtmpMgmtTaskExit( 296VOID RtmpMgmtTaskExit(IN RTMP_ADAPTER * pAd)
298 IN RTMP_ADAPTER *pAd)
299{ 297{
300 298
301
302 return; 299 return;
303} 300}
304 301
305
306static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode) 302static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode)
307{ 303{
308 u32 regValue; 304 u32 regValue;
@@ -311,31 +307,28 @@ static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode)
311 regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask); 307 regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask);
312 //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 308 //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
313 { 309 {
314 RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 1:enable 310 RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 1:enable
315 } 311 }
316 //else 312 //else
317 // DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_DOZE !\n")); 313 // DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_DOZE !\n"));
318 314
319 if (regValue != 0) 315 if (regValue != 0)
320 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE); 316 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);
321} 317}
322 318
323
324static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode) 319static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode)
325{ 320{
326 u32 regValue; 321 u32 regValue;
327 322
328 pAd->int_disable_mask |= mode; 323 pAd->int_disable_mask |= mode;
329 regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask); 324 regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask);
330 RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 0: disable 325 RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 0: disable
331 326
332 if (regValue == 0) 327 if (regValue == 0) {
333 {
334 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE); 328 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);
335 } 329 }
336} 330}
337 331
338
339/*************************************************************************** 332/***************************************************************************
340 * 333 *
341 * tasklet related procedures. 334 * tasklet related procedures.
@@ -345,17 +338,18 @@ static void mgmt_dma_done_tasklet(unsigned long data)
345{ 338{
346 unsigned long flags; 339 unsigned long flags;
347 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; 340 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
348 INT_SOURCE_CSR_STRUC IntSource; 341 INT_SOURCE_CSR_STRUC IntSource;
349 POS_COOKIE pObj; 342 POS_COOKIE pObj;
350 343
351 // Do nothing if the driver is starting halt state. 344 // Do nothing if the driver is starting halt state.
352 // This might happen when timer already been fired before cancel timer with mlmehalt 345 // This might happen when timer already been fired before cancel timer with mlmehalt
353 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 346 if (RTMP_TEST_FLAG
347 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
354 return; 348 return;
355 349
356 pObj = (POS_COOKIE) pAd->OS_Cookie; 350 pObj = (POS_COOKIE) pAd->OS_Cookie;
357 351
358// printk("mgmt_dma_done_process\n"); 352// printk("mgmt_dma_done_process\n");
359 IntSource.word = 0; 353 IntSource.word = 0;
360 IntSource.field.MgmtDmaDone = 1; 354 IntSource.field.MgmtDmaDone = 1;
361 pAd->int_pending &= ~INT_MGMT_DLY; 355 pAd->int_pending &= ~INT_MGMT_DLY;
@@ -368,8 +362,7 @@ static void mgmt_dma_done_tasklet(unsigned long data)
368 /* 362 /*
369 * double check to avoid lose of interrupts 363 * double check to avoid lose of interrupts
370 */ 364 */
371 if (pAd->int_pending & INT_MGMT_DLY) 365 if (pAd->int_pending & INT_MGMT_DLY) {
372 {
373 tasklet_hi_schedule(&pObj->mgmt_dma_done_task); 366 tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
374 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 367 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
375 return; 368 return;
@@ -380,30 +373,29 @@ static void mgmt_dma_done_tasklet(unsigned long data)
380 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 373 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
381} 374}
382 375
383
384static void rx_done_tasklet(unsigned long data) 376static void rx_done_tasklet(unsigned long data)
385{ 377{
386 unsigned long flags; 378 unsigned long flags;
387 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; 379 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
388 BOOLEAN bReschedule = 0; 380 BOOLEAN bReschedule = 0;
389 POS_COOKIE pObj; 381 POS_COOKIE pObj;
390 382
391 // Do nothing if the driver is starting halt state. 383 // Do nothing if the driver is starting halt state.
392 // This might happen when timer already been fired before cancel timer with mlmehalt 384 // This might happen when timer already been fired before cancel timer with mlmehalt
393 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 385 if (RTMP_TEST_FLAG
386 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
394 return; 387 return;
395 388
396 pObj = (POS_COOKIE) pAd->OS_Cookie; 389 pObj = (POS_COOKIE) pAd->OS_Cookie;
397 390
398 pAd->int_pending &= ~(INT_RX); 391 pAd->int_pending &= ~(INT_RX);
399 bReschedule = STARxDoneInterruptHandle(pAd, 0); 392 bReschedule = STARxDoneInterruptHandle(pAd, 0);
400 393
401 RTMP_INT_LOCK(&pAd->irq_lock, flags); 394 RTMP_INT_LOCK(&pAd->irq_lock, flags);
402 /* 395 /*
403 * double check to avoid rotting packet 396 * double check to avoid rotting packet
404 */ 397 */
405 if (pAd->int_pending & INT_RX || bReschedule) 398 if (pAd->int_pending & INT_RX || bReschedule) {
406 {
407 tasklet_hi_schedule(&pObj->rx_done_task); 399 tasklet_hi_schedule(&pObj->rx_done_task);
408 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 400 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
409 return; 401 return;
@@ -415,7 +407,6 @@ static void rx_done_tasklet(unsigned long data)
415 407
416} 408}
417 409
418
419void fifo_statistic_full_tasklet(unsigned long data) 410void fifo_statistic_full_tasklet(unsigned long data)
420{ 411{
421 unsigned long flags; 412 unsigned long flags;
@@ -424,10 +415,11 @@ void fifo_statistic_full_tasklet(unsigned long data)
424 415
425 // Do nothing if the driver is starting halt state. 416 // Do nothing if the driver is starting halt state.
426 // This might happen when timer already been fired before cancel timer with mlmehalt 417 // This might happen when timer already been fired before cancel timer with mlmehalt
427 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 418 if (RTMP_TEST_FLAG
419 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
428 return; 420 return;
429 421
430 pObj = (POS_COOKIE) pAd->OS_Cookie; 422 pObj = (POS_COOKIE) pAd->OS_Cookie;
431 423
432 pAd->int_pending &= ~(FifoStaFullInt); 424 pAd->int_pending &= ~(FifoStaFullInt);
433 NICUpdateFifoStaCounters(pAd); 425 NICUpdateFifoStaCounters(pAd);
@@ -436,8 +428,7 @@ void fifo_statistic_full_tasklet(unsigned long data)
436 /* 428 /*
437 * double check to avoid rotting packet 429 * double check to avoid rotting packet
438 */ 430 */
439 if (pAd->int_pending & FifoStaFullInt) 431 if (pAd->int_pending & FifoStaFullInt) {
440 {
441 tasklet_hi_schedule(&pObj->fifo_statistic_full_task); 432 tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
442 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 433 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
443 return; 434 return;
@@ -454,18 +445,19 @@ static void ac3_dma_done_tasklet(unsigned long data)
454{ 445{
455 unsigned long flags; 446 unsigned long flags;
456 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; 447 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
457 INT_SOURCE_CSR_STRUC IntSource; 448 INT_SOURCE_CSR_STRUC IntSource;
458 POS_COOKIE pObj; 449 POS_COOKIE pObj;
459 BOOLEAN bReschedule = 0; 450 BOOLEAN bReschedule = 0;
460 451
461 // Do nothing if the driver is starting halt state. 452 // Do nothing if the driver is starting halt state.
462 // This might happen when timer already been fired before cancel timer with mlmehalt 453 // This might happen when timer already been fired before cancel timer with mlmehalt
463 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 454 if (RTMP_TEST_FLAG
455 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
464 return; 456 return;
465 457
466 pObj = (POS_COOKIE) pAd->OS_Cookie; 458 pObj = (POS_COOKIE) pAd->OS_Cookie;
467 459
468// printk("ac0_dma_done_process\n"); 460// printk("ac0_dma_done_process\n");
469 IntSource.word = 0; 461 IntSource.word = 0;
470 IntSource.field.Ac3DmaDone = 1; 462 IntSource.field.Ac3DmaDone = 1;
471 pAd->int_pending &= ~INT_AC3_DLY; 463 pAd->int_pending &= ~INT_AC3_DLY;
@@ -476,8 +468,7 @@ static void ac3_dma_done_tasklet(unsigned long data)
476 /* 468 /*
477 * double check to avoid lose of interrupts 469 * double check to avoid lose of interrupts
478 */ 470 */
479 if ((pAd->int_pending & INT_AC3_DLY) || bReschedule) 471 if ((pAd->int_pending & INT_AC3_DLY) || bReschedule) {
480 {
481 tasklet_hi_schedule(&pObj->ac3_dma_done_task); 472 tasklet_hi_schedule(&pObj->ac3_dma_done_task);
482 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 473 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
483 return; 474 return;
@@ -488,21 +479,21 @@ static void ac3_dma_done_tasklet(unsigned long data)
488 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 479 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
489} 480}
490 481
491
492static void ac2_dma_done_tasklet(unsigned long data) 482static void ac2_dma_done_tasklet(unsigned long data)
493{ 483{
494 unsigned long flags; 484 unsigned long flags;
495 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; 485 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
496 INT_SOURCE_CSR_STRUC IntSource; 486 INT_SOURCE_CSR_STRUC IntSource;
497 POS_COOKIE pObj; 487 POS_COOKIE pObj;
498 BOOLEAN bReschedule = 0; 488 BOOLEAN bReschedule = 0;
499 489
500 // Do nothing if the driver is starting halt state. 490 // Do nothing if the driver is starting halt state.
501 // This might happen when timer already been fired before cancel timer with mlmehalt 491 // This might happen when timer already been fired before cancel timer with mlmehalt
502 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 492 if (RTMP_TEST_FLAG
493 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
503 return; 494 return;
504 495
505 pObj = (POS_COOKIE) pAd->OS_Cookie; 496 pObj = (POS_COOKIE) pAd->OS_Cookie;
506 497
507 IntSource.word = 0; 498 IntSource.word = 0;
508 IntSource.field.Ac2DmaDone = 1; 499 IntSource.field.Ac2DmaDone = 1;
@@ -515,8 +506,7 @@ static void ac2_dma_done_tasklet(unsigned long data)
515 /* 506 /*
516 * double check to avoid lose of interrupts 507 * double check to avoid lose of interrupts
517 */ 508 */
518 if ((pAd->int_pending & INT_AC2_DLY) || bReschedule) 509 if ((pAd->int_pending & INT_AC2_DLY) || bReschedule) {
519 {
520 tasklet_hi_schedule(&pObj->ac2_dma_done_task); 510 tasklet_hi_schedule(&pObj->ac2_dma_done_task);
521 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 511 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
522 return; 512 return;
@@ -527,23 +517,23 @@ static void ac2_dma_done_tasklet(unsigned long data)
527 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 517 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
528} 518}
529 519
530
531static void ac1_dma_done_tasklet(unsigned long data) 520static void ac1_dma_done_tasklet(unsigned long data)
532{ 521{
533 unsigned long flags; 522 unsigned long flags;
534 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; 523 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
535 INT_SOURCE_CSR_STRUC IntSource; 524 INT_SOURCE_CSR_STRUC IntSource;
536 POS_COOKIE pObj; 525 POS_COOKIE pObj;
537 BOOLEAN bReschedule = 0; 526 BOOLEAN bReschedule = 0;
538 527
539 // Do nothing if the driver is starting halt state. 528 // Do nothing if the driver is starting halt state.
540 // This might happen when timer already been fired before cancel timer with mlmehalt 529 // This might happen when timer already been fired before cancel timer with mlmehalt
541 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 530 if (RTMP_TEST_FLAG
531 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
542 return; 532 return;
543 533
544 pObj = (POS_COOKIE) pAd->OS_Cookie; 534 pObj = (POS_COOKIE) pAd->OS_Cookie;
545 535
546// printk("ac0_dma_done_process\n"); 536// printk("ac0_dma_done_process\n");
547 IntSource.word = 0; 537 IntSource.word = 0;
548 IntSource.field.Ac1DmaDone = 1; 538 IntSource.field.Ac1DmaDone = 1;
549 pAd->int_pending &= ~INT_AC1_DLY; 539 pAd->int_pending &= ~INT_AC1_DLY;
@@ -554,8 +544,7 @@ static void ac1_dma_done_tasklet(unsigned long data)
554 /* 544 /*
555 * double check to avoid lose of interrupts 545 * double check to avoid lose of interrupts
556 */ 546 */
557 if ((pAd->int_pending & INT_AC1_DLY) || bReschedule) 547 if ((pAd->int_pending & INT_AC1_DLY) || bReschedule) {
558 {
559 tasklet_hi_schedule(&pObj->ac1_dma_done_task); 548 tasklet_hi_schedule(&pObj->ac1_dma_done_task);
560 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 549 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
561 return; 550 return;
@@ -566,36 +555,35 @@ static void ac1_dma_done_tasklet(unsigned long data)
566 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 555 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
567} 556}
568 557
569
570static void ac0_dma_done_tasklet(unsigned long data) 558static void ac0_dma_done_tasklet(unsigned long data)
571{ 559{
572 unsigned long flags; 560 unsigned long flags;
573 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; 561 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
574 INT_SOURCE_CSR_STRUC IntSource; 562 INT_SOURCE_CSR_STRUC IntSource;
575 POS_COOKIE pObj; 563 POS_COOKIE pObj;
576 BOOLEAN bReschedule = 0; 564 BOOLEAN bReschedule = 0;
577 565
578 // Do nothing if the driver is starting halt state. 566 // Do nothing if the driver is starting halt state.
579 // This might happen when timer already been fired before cancel timer with mlmehalt 567 // This might happen when timer already been fired before cancel timer with mlmehalt
580 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 568 if (RTMP_TEST_FLAG
569 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
581 return; 570 return;
582 571
583 pObj = (POS_COOKIE) pAd->OS_Cookie; 572 pObj = (POS_COOKIE) pAd->OS_Cookie;
584 573
585// printk("ac0_dma_done_process\n"); 574// printk("ac0_dma_done_process\n");
586 IntSource.word = 0; 575 IntSource.word = 0;
587 IntSource.field.Ac0DmaDone = 1; 576 IntSource.field.Ac0DmaDone = 1;
588 pAd->int_pending &= ~INT_AC0_DLY; 577 pAd->int_pending &= ~INT_AC0_DLY;
589 578
590// RTMPHandleMgmtRingDmaDoneInterrupt(pAd); 579// RTMPHandleMgmtRingDmaDoneInterrupt(pAd);
591 bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource); 580 bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);
592 581
593 RTMP_INT_LOCK(&pAd->irq_lock, flags); 582 RTMP_INT_LOCK(&pAd->irq_lock, flags);
594 /* 583 /*
595 * double check to avoid lose of interrupts 584 * double check to avoid lose of interrupts
596 */ 585 */
597 if ((pAd->int_pending & INT_AC0_DLY) || bReschedule) 586 if ((pAd->int_pending & INT_AC0_DLY) || bReschedule) {
598 {
599 tasklet_hi_schedule(&pObj->ac0_dma_done_task); 587 tasklet_hi_schedule(&pObj->ac0_dma_done_task);
600 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 588 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
601 return; 589 return;
@@ -606,9 +594,6 @@ static void ac0_dma_done_tasklet(unsigned long data)
606 RTMP_INT_UNLOCK(&pAd->irq_lock, flags); 594 RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
607} 595}
608 596
609
610
611
612/*************************************************************************** 597/***************************************************************************
613 * 598 *
614 * interrupt handler related procedures. 599 * interrupt handler related procedures.
@@ -618,27 +603,25 @@ int print_int_count;
618 603
619IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) 604IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
620{ 605{
621 struct net_device *net_dev = (struct net_device *) dev_instance; 606 struct net_device *net_dev = (struct net_device *)dev_instance;
622 PRTMP_ADAPTER pAd = NULL; 607 PRTMP_ADAPTER pAd = NULL;
623 INT_SOURCE_CSR_STRUC IntSource; 608 INT_SOURCE_CSR_STRUC IntSource;
624 POS_COOKIE pObj; 609 POS_COOKIE pObj;
625 610
626 GET_PAD_FROM_NET_DEV(pAd, net_dev); 611 GET_PAD_FROM_NET_DEV(pAd, net_dev);
627 612
628 pObj = (POS_COOKIE) pAd->OS_Cookie; 613 pObj = (POS_COOKIE) pAd->OS_Cookie;
629 614
630
631 /* Note 03312008: we can not return here before 615 /* Note 03312008: we can not return here before
632 RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word); 616 RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);
633 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); 617 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word);
634 Or kernel will panic after ifconfig ra0 down sometimes */ 618 Or kernel will panic after ifconfig ra0 down sometimes */
635
636 619
637 // 620 //
638 // Inital the Interrupt source. 621 // Inital the Interrupt source.
639 // 622 //
640 IntSource.word = 0x00000000L; 623 IntSource.word = 0x00000000L;
641// McuIntSource.word = 0x00000000L; 624// McuIntSource.word = 0x00000000L;
642 625
643 // 626 //
644 // Get the interrupt sources & saved to local variable 627 // Get the interrupt sources & saved to local variable
@@ -655,25 +638,26 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
655 // 638 //
656 // RT2661 => when ASIC is sleeping, MAC register cannot be read and written. 639 // RT2661 => when ASIC is sleeping, MAC register cannot be read and written.
657 // RT2860 => when ASIC is sleeping, MAC register can be read and written. 640 // RT2860 => when ASIC is sleeping, MAC register can be read and written.
658// if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 641// if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
659 { 642 {
660 RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word); 643 RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);
661 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear 644 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear
662 } 645 }
663// else 646// else
664// DBGPRINT(RT_DEBUG_TRACE, (">>>fOP_STATUS_DOZE<<<\n")); 647// DBGPRINT(RT_DEBUG_TRACE, (">>>fOP_STATUS_DOZE<<<\n"));
665 648
666// RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IsrAfterClear); 649// RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IsrAfterClear);
667// RTMP_IO_READ32(pAd, MCU_INT_SOURCE_CSR, &McuIsrAfterClear); 650// RTMP_IO_READ32(pAd, MCU_INT_SOURCE_CSR, &McuIsrAfterClear);
668// DBGPRINT(RT_DEBUG_INFO, ("====> RTMPHandleInterrupt(ISR=%08x,Mcu ISR=%08x, After clear ISR=%08x, MCU ISR=%08x)\n", 651// DBGPRINT(RT_DEBUG_INFO, ("====> RTMPHandleInterrupt(ISR=%08x,Mcu ISR=%08x, After clear ISR=%08x, MCU ISR=%08x)\n",
669// IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear)); 652// IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear));
670 653
671 // Do nothing if Reset in progress 654 // Do nothing if Reset in progress
672 if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |fRTMP_ADAPTER_HALT_IN_PROGRESS))) 655 if (RTMP_TEST_FLAG
673 { 656 (pAd,
674 return IRQ_HANDLED; 657 (fRTMP_ADAPTER_RESET_IN_PROGRESS |
658 fRTMP_ADAPTER_HALT_IN_PROGRESS))) {
659 return IRQ_HANDLED;
675 } 660 }
676
677 // 661 //
678 // Handle interrupt, walk through all bits 662 // Handle interrupt, walk through all bits
679 // Should start from highest priority interrupt 663 // Should start from highest priority interrupt
@@ -684,7 +668,6 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
684 668
685#endif 669#endif
686 670
687
688 pAd->bPCIclkOff = FALSE; 671 pAd->bPCIclkOff = FALSE;
689 672
690 // If required spinlock, each interrupt service routine has to acquire 673 // If required spinlock, each interrupt service routine has to acquire
@@ -692,28 +675,25 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
692 // 675 //
693 676
694 // Do nothing if NIC doesn't exist 677 // Do nothing if NIC doesn't exist
695 if (IntSource.word == 0xffffffff) 678 if (IntSource.word == 0xffffffff) {
696 { 679 RTMP_SET_FLAG(pAd,
697 RTMP_SET_FLAG(pAd, (fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS)); 680 (fRTMP_ADAPTER_NIC_NOT_EXIST |
698 return IRQ_HANDLED; 681 fRTMP_ADAPTER_HALT_IN_PROGRESS));
682 return IRQ_HANDLED;
699 } 683 }
700 684
701 if (IntSource.word & TxCoherent) 685 if (IntSource.word & TxCoherent) {
702 {
703 DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n")); 686 DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n"));
704 RTMPHandleRxCoherentInterrupt(pAd); 687 RTMPHandleRxCoherentInterrupt(pAd);
705 } 688 }
706 689
707 if (IntSource.word & RxCoherent) 690 if (IntSource.word & RxCoherent) {
708 {
709 DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n")); 691 DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n"));
710 RTMPHandleRxCoherentInterrupt(pAd); 692 RTMPHandleRxCoherentInterrupt(pAd);
711 } 693 }
712 694
713 if (IntSource.word & FifoStaFullInt) 695 if (IntSource.word & FifoStaFullInt) {
714 { 696 if ((pAd->int_disable_mask & FifoStaFullInt) == 0) {
715 if ((pAd->int_disable_mask & FifoStaFullInt) == 0)
716 {
717 /* mask FifoStaFullInt */ 697 /* mask FifoStaFullInt */
718 rt2860_int_disable(pAd, FifoStaFullInt); 698 rt2860_int_disable(pAd, FifoStaFullInt);
719 tasklet_hi_schedule(&pObj->fifo_statistic_full_task); 699 tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
@@ -721,20 +701,16 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
721 pAd->int_pending |= FifoStaFullInt; 701 pAd->int_pending |= FifoStaFullInt;
722 } 702 }
723 703
724 if (IntSource.word & INT_MGMT_DLY) 704 if (IntSource.word & INT_MGMT_DLY) {
725 { 705 if ((pAd->int_disable_mask & INT_MGMT_DLY) == 0) {
726 if ((pAd->int_disable_mask & INT_MGMT_DLY) ==0 )
727 {
728 rt2860_int_disable(pAd, INT_MGMT_DLY); 706 rt2860_int_disable(pAd, INT_MGMT_DLY);
729 tasklet_hi_schedule(&pObj->mgmt_dma_done_task); 707 tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
730 } 708 }
731 pAd->int_pending |= INT_MGMT_DLY ; 709 pAd->int_pending |= INT_MGMT_DLY;
732 } 710 }
733 711
734 if (IntSource.word & INT_RX) 712 if (IntSource.word & INT_RX) {
735 { 713 if ((pAd->int_disable_mask & INT_RX) == 0) {
736 if ((pAd->int_disable_mask & INT_RX) == 0)
737 {
738 714
739 /* mask RxINT */ 715 /* mask RxINT */
740 rt2860_int_disable(pAd, INT_RX); 716 rt2860_int_disable(pAd, INT_RX);
@@ -743,11 +719,9 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
743 pAd->int_pending |= INT_RX; 719 pAd->int_pending |= INT_RX;
744 } 720 }
745 721
746 if (IntSource.word & INT_AC3_DLY) 722 if (IntSource.word & INT_AC3_DLY) {
747 {
748 723
749 if ((pAd->int_disable_mask & INT_AC3_DLY) == 0) 724 if ((pAd->int_disable_mask & INT_AC3_DLY) == 0) {
750 {
751 /* mask TxDataInt */ 725 /* mask TxDataInt */
752 rt2860_int_disable(pAd, INT_AC3_DLY); 726 rt2860_int_disable(pAd, INT_AC3_DLY);
753 tasklet_hi_schedule(&pObj->ac3_dma_done_task); 727 tasklet_hi_schedule(&pObj->ac3_dma_done_task);
@@ -755,11 +729,9 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
755 pAd->int_pending |= INT_AC3_DLY; 729 pAd->int_pending |= INT_AC3_DLY;
756 } 730 }
757 731
758 if (IntSource.word & INT_AC2_DLY) 732 if (IntSource.word & INT_AC2_DLY) {
759 {
760 733
761 if ((pAd->int_disable_mask & INT_AC2_DLY) == 0) 734 if ((pAd->int_disable_mask & INT_AC2_DLY) == 0) {
762 {
763 /* mask TxDataInt */ 735 /* mask TxDataInt */
764 rt2860_int_disable(pAd, INT_AC2_DLY); 736 rt2860_int_disable(pAd, INT_AC2_DLY);
765 tasklet_hi_schedule(&pObj->ac2_dma_done_task); 737 tasklet_hi_schedule(&pObj->ac2_dma_done_task);
@@ -767,13 +739,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
767 pAd->int_pending |= INT_AC2_DLY; 739 pAd->int_pending |= INT_AC2_DLY;
768 } 740 }
769 741
770 if (IntSource.word & INT_AC1_DLY) 742 if (IntSource.word & INT_AC1_DLY) {
771 {
772 743
773 pAd->int_pending |= INT_AC1_DLY; 744 pAd->int_pending |= INT_AC1_DLY;
774 745
775 if ((pAd->int_disable_mask & INT_AC1_DLY) == 0) 746 if ((pAd->int_disable_mask & INT_AC1_DLY) == 0) {
776 {
777 /* mask TxDataInt */ 747 /* mask TxDataInt */
778 rt2860_int_disable(pAd, INT_AC1_DLY); 748 rt2860_int_disable(pAd, INT_AC1_DLY);
779 tasklet_hi_schedule(&pObj->ac1_dma_done_task); 749 tasklet_hi_schedule(&pObj->ac1_dma_done_task);
@@ -781,8 +751,7 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
781 751
782 } 752 }
783 753
784 if (IntSource.word & INT_AC0_DLY) 754 if (IntSource.word & INT_AC0_DLY) {
785 {
786 755
787/* 756/*
788 if (IntSource.word & 0x2) { 757 if (IntSource.word & 0x2) {
@@ -793,8 +762,7 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
793*/ 762*/
794 pAd->int_pending |= INT_AC0_DLY; 763 pAd->int_pending |= INT_AC0_DLY;
795 764
796 if ((pAd->int_disable_mask & INT_AC0_DLY) == 0) 765 if ((pAd->int_disable_mask & INT_AC0_DLY) == 0) {
797 {
798 /* mask TxDataInt */ 766 /* mask TxDataInt */
799 rt2860_int_disable(pAd, INT_AC0_DLY); 767 rt2860_int_disable(pAd, INT_AC0_DLY);
800 tasklet_hi_schedule(&pObj->ac0_dma_done_task); 768 tasklet_hi_schedule(&pObj->ac0_dma_done_task);
@@ -802,14 +770,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
802 770
803 } 771 }
804 772
805 773 if (IntSource.word & PreTBTTInt) {
806 if (IntSource.word & PreTBTTInt)
807 {
808 RTMPHandlePreTBTTInterrupt(pAd); 774 RTMPHandlePreTBTTInterrupt(pAd);
809 } 775 }
810 776
811 if (IntSource.word & TBTTInt) 777 if (IntSource.word & TBTTInt) {
812 {
813 RTMPHandleTBTTInterrupt(pAd); 778 RTMPHandleTBTTInterrupt(pAd);
814 } 779 }
815 780
@@ -818,57 +783,57 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
818 RTMPHandleTwakeupInterrupt(pAd); 783 RTMPHandleTwakeupInterrupt(pAd);
819 } 784 }
820 785
821 return IRQ_HANDLED; 786 return IRQ_HANDLED;
822} 787}
823 788
824/* 789/*
825 * invaild or writeback cache 790 * invaild or writeback cache
826 * and convert virtual address to physical address 791 * and convert virtual address to physical address
827 */ 792 */
828dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction) 793dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size,
794 int sd_idx, int direction)
829{ 795{
830 PRTMP_ADAPTER pAd; 796 PRTMP_ADAPTER pAd;
831 POS_COOKIE pObj; 797 POS_COOKIE pObj;
832 798
833 /* 799 /*
834 ------ Porting Information ------ 800 ------ Porting Information ------
835 > For Tx Alloc: 801 > For Tx Alloc:
836 mgmt packets => sd_idx = 0 802 mgmt packets => sd_idx = 0
837 SwIdx: pAd->MgmtRing.TxCpuIdx 803 SwIdx: pAd->MgmtRing.TxCpuIdx
838 pTxD : pAd->MgmtRing.Cell[SwIdx].AllocVa; 804 pTxD : pAd->MgmtRing.Cell[SwIdx].AllocVa;
839 805
840 data packets => sd_idx = 1 806 data packets => sd_idx = 1
841 TxIdx : pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx 807 TxIdx : pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx
842 QueIdx: pTxBlk->QueIdx 808 QueIdx: pTxBlk->QueIdx
843 pTxD : pAd->TxRing[pTxBlk->QueIdx].Cell[TxIdx].AllocVa; 809 pTxD : pAd->TxRing[pTxBlk->QueIdx].Cell[TxIdx].AllocVa;
844 810
845 > For Rx Alloc: 811 > For Rx Alloc:
846 sd_idx = -1 812 sd_idx = -1
847 */ 813 */
848 814
849 pAd = (PRTMP_ADAPTER)handle; 815 pAd = (PRTMP_ADAPTER) handle;
850 pObj = (POS_COOKIE)pAd->OS_Cookie; 816 pObj = (POS_COOKIE) pAd->OS_Cookie;
851 817
852 if (sd_idx == 1) 818 if (sd_idx == 1) {
853 { 819 PTX_BLK pTxBlk;
854 PTX_BLK pTxBlk; 820 pTxBlk = (PTX_BLK) ptr;
855 pTxBlk = (PTX_BLK)ptr; 821 return pci_map_single(pObj->pci_dev, pTxBlk->pSrcBufData,
856 return pci_map_single(pObj->pci_dev, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, direction); 822 pTxBlk->SrcBufLen, direction);
857 } 823 } else {
858 else
859 {
860 return pci_map_single(pObj->pci_dev, ptr, size, direction); 824 return pci_map_single(pObj->pci_dev, ptr, size, direction);
861 } 825 }
862 826
863} 827}
864 828
865void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction) 829void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size,
830 int direction)
866{ 831{
867 PRTMP_ADAPTER pAd; 832 PRTMP_ADAPTER pAd;
868 POS_COOKIE pObj; 833 POS_COOKIE pObj;
869 834
870 pAd=(PRTMP_ADAPTER)handle; 835 pAd = (PRTMP_ADAPTER) handle;
871 pObj = (POS_COOKIE)pAd->OS_Cookie; 836 pObj = (POS_COOKIE) pAd->OS_Cookie;
872 837
873 pci_unmap_single(pObj->pci_dev, dma_addr, size, direction); 838 pci_unmap_single(pObj->pci_dev, dma_addr, size, direction);
874 839
diff --git a/drivers/staging/rt2860/rt_usb.c b/drivers/staging/rt2860/rt_usb.c
index 1e6d347a966..30fc4bb750f 100644
--- a/drivers/staging/rt2860/rt_usb.c
+++ b/drivers/staging/rt2860/rt_usb.c
@@ -38,7 +38,7 @@
38 38
39#include "rt_config.h" 39#include "rt_config.h"
40 40
41 void dump_urb(struct urb* purb) 41void dump_urb(struct urb *purb)
42{ 42{
43 printk("urb :0x%08lx\n", (unsigned long)purb); 43 printk("urb :0x%08lx\n", (unsigned long)purb);
44 printk("\tdev :0x%08lx\n", (unsigned long)purb->dev); 44 printk("\tdev :0x%08lx\n", (unsigned long)purb->dev);
@@ -46,16 +46,20 @@
46 printk("\tpipe :0x%08x\n", purb->pipe); 46 printk("\tpipe :0x%08x\n", purb->pipe);
47 printk("\tstatus :%d\n", purb->status); 47 printk("\tstatus :%d\n", purb->status);
48 printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags); 48 printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags);
49 printk("\ttransfer_buffer :0x%08lx\n", (unsigned long)purb->transfer_buffer); 49 printk("\ttransfer_buffer :0x%08lx\n",
50 (unsigned long)purb->transfer_buffer);
50 printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length); 51 printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);
51 printk("\tactual_length :%d\n", purb->actual_length); 52 printk("\tactual_length :%d\n", purb->actual_length);
52 printk("\tsetup_packet :0x%08lx\n", (unsigned long)purb->setup_packet); 53 printk("\tsetup_packet :0x%08lx\n",
54 (unsigned long)purb->setup_packet);
53 printk("\tstart_frame :%d\n", purb->start_frame); 55 printk("\tstart_frame :%d\n", purb->start_frame);
54 printk("\tnumber_of_packets :%d\n", purb->number_of_packets); 56 printk("\tnumber_of_packets :%d\n", purb->number_of_packets);
55 printk("\tinterval :%d\n", purb->interval); 57 printk("\tinterval :%d\n", purb->interval);
56 printk("\terror_count :%d\n", purb->error_count); 58 printk("\terror_count :%d\n", purb->error_count);
57 printk("\tcontext :0x%08lx\n", (unsigned long)purb->context); 59 printk("\tcontext :0x%08lx\n",
58 printk("\tcomplete :0x%08lx\n\n", (unsigned long)purb->complete); 60 (unsigned long)purb->context);
61 printk("\tcomplete :0x%08lx\n\n",
62 (unsigned long)purb->complete);
59} 63}
60 64
61/* 65/*
@@ -73,23 +77,22 @@ Return Value:
73Note: 77Note:
74======================================================================== 78========================================================================
75*/ 79*/
76NDIS_STATUS RtmpMgmtTaskInit( 80NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER * pAd)
77 IN RTMP_ADAPTER *pAd)
78{ 81{
79 RTMP_OS_TASK *pTask; 82 RTMP_OS_TASK *pTask;
80 NDIS_STATUS status; 83 NDIS_STATUS status;
81 84
82 /* 85 /*
83 Creat TimerQ Thread, We need init timerQ related structure before create the timer thread. 86 Creat TimerQ Thread, We need init timerQ related structure before create the timer thread.
84 */ 87 */
85 RtmpTimerQInit(pAd); 88 RtmpTimerQInit(pAd);
86 89
87 pTask = &pAd->timerTask; 90 pTask = &pAd->timerTask;
88 RtmpOSTaskInit(pTask, "RtmpTimerTask", pAd); 91 RtmpOSTaskInit(pTask, "RtmpTimerTask", pAd);
89 status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, pTask); 92 status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, pTask);
90 if (status == NDIS_STATUS_FAILURE) 93 if (status == NDIS_STATUS_FAILURE) {
91 { 94 printk(KERN_WARNING "%s: unable to start RtmpTimerQThread\n",
92 printk (KERN_WARNING "%s: unable to start RtmpTimerQThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); 95 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
93 return NDIS_STATUS_FAILURE; 96 return NDIS_STATUS_FAILURE;
94 } 97 }
95 98
@@ -97,9 +100,9 @@ NDIS_STATUS RtmpMgmtTaskInit(
97 pTask = &pAd->mlmeTask; 100 pTask = &pAd->mlmeTask;
98 RtmpOSTaskInit(pTask, "RtmpMlmeTask", pAd); 101 RtmpOSTaskInit(pTask, "RtmpMlmeTask", pAd);
99 status = RtmpOSTaskAttach(pTask, MlmeThread, pTask); 102 status = RtmpOSTaskAttach(pTask, MlmeThread, pTask);
100 if (status == NDIS_STATUS_FAILURE) 103 if (status == NDIS_STATUS_FAILURE) {
101 { 104 printk(KERN_WARNING "%s: unable to start MlmeThread\n",
102 printk (KERN_WARNING "%s: unable to start MlmeThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); 105 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
103 return NDIS_STATUS_FAILURE; 106 return NDIS_STATUS_FAILURE;
104 } 107 }
105 108
@@ -107,18 +110,15 @@ NDIS_STATUS RtmpMgmtTaskInit(
107 pTask = &pAd->cmdQTask; 110 pTask = &pAd->cmdQTask;
108 RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd); 111 RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd);
109 status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, pTask); 112 status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, pTask);
110 if (status == NDIS_STATUS_FAILURE) 113 if (status == NDIS_STATUS_FAILURE) {
111 { 114 printk(KERN_WARNING "%s: unable to start RTUSBCmdThread\n",
112 printk (KERN_WARNING "%s: unable to start RTUSBCmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); 115 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
113 return NDIS_STATUS_FAILURE; 116 return NDIS_STATUS_FAILURE;
114 } 117 }
115 118
116
117 return NDIS_STATUS_SUCCESS; 119 return NDIS_STATUS_SUCCESS;
118} 120}
119 121
120
121
122/* 122/*
123======================================================================== 123========================================================================
124Routine Description: 124Routine Description:
@@ -133,11 +133,10 @@ Return Value:
133Note: 133Note:
134======================================================================== 134========================================================================
135*/ 135*/
136VOID RtmpMgmtTaskExit( 136VOID RtmpMgmtTaskExit(IN RTMP_ADAPTER * pAd)
137 IN RTMP_ADAPTER *pAd)
138{ 137{
139 INT ret; 138 INT ret;
140 RTMP_OS_TASK *pTask; 139 RTMP_OS_TASK *pTask;
141 140
142 // Sleep 50 milliseconds so pending io might finish normally 141 // Sleep 50 milliseconds so pending io might finish normally
143 RTMPusecDelay(50000); 142 RTMPusecDelay(50000);
@@ -153,10 +152,11 @@ VOID RtmpMgmtTaskExit(
153 /* Terminate Mlme Thread */ 152 /* Terminate Mlme Thread */
154 pTask = &pAd->mlmeTask; 153 pTask = &pAd->mlmeTask;
155 ret = RtmpOSTaskKill(pTask); 154 ret = RtmpOSTaskKill(pTask);
156 if (ret == NDIS_STATUS_FAILURE) 155 if (ret == NDIS_STATUS_FAILURE) {
157 {
158 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", 156 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
159 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); 157 RTMP_OS_NETDEV_GET_DEVNAME(pAd->
158 net_dev),
159 pTask->taskName));
160 } 160 }
161 161
162 /* Terminate cmdQ thread */ 162 /* Terminate cmdQ thread */
@@ -174,10 +174,11 @@ VOID RtmpMgmtTaskExit(
174 mb(); 174 mb();
175 //RTUSBCMDUp(pAd); 175 //RTUSBCMDUp(pAd);
176 ret = RtmpOSTaskKill(pTask); 176 ret = RtmpOSTaskKill(pTask);
177 if (ret == NDIS_STATUS_FAILURE) 177 if (ret == NDIS_STATUS_FAILURE) {
178 {
179 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", 178 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
180 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); 179 RTMP_OS_NETDEV_GET_DEVNAME
180 (pAd->net_dev),
181 pTask->taskName));
181 } 182 }
182 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN; 183 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN;
183 } 184 }
@@ -185,47 +186,44 @@ VOID RtmpMgmtTaskExit(
185 /* Terminate timer thread */ 186 /* Terminate timer thread */
186 pTask = &pAd->timerTask; 187 pTask = &pAd->timerTask;
187 ret = RtmpOSTaskKill(pTask); 188 ret = RtmpOSTaskKill(pTask);
188 if (ret == NDIS_STATUS_FAILURE) 189 if (ret == NDIS_STATUS_FAILURE) {
189 {
190 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", 190 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
191 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); 191 RTMP_OS_NETDEV_GET_DEVNAME(pAd->
192 net_dev),
193 pTask->taskName));
192 } 194 }
193 195
194
195} 196}
196 197
197
198static void rtusb_dataout_complete(unsigned long data) 198static void rtusb_dataout_complete(unsigned long data)
199{ 199{
200 PRTMP_ADAPTER pAd; 200 PRTMP_ADAPTER pAd;
201 purbb_t pUrb; 201 purbb_t pUrb;
202 POS_COOKIE pObj; 202 POS_COOKIE pObj;
203 PHT_TX_CONTEXT pHTTXContext; 203 PHT_TX_CONTEXT pHTTXContext;
204 UCHAR BulkOutPipeId; 204 UCHAR BulkOutPipeId;
205 NTSTATUS Status; 205 NTSTATUS Status;
206 unsigned long IrqFlags; 206 unsigned long IrqFlags;
207 207
208 208 pUrb = (purbb_t) data;
209 pUrb = (purbb_t)data; 209 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
210 pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; 210 pAd = pHTTXContext->pAd;
211 pAd = pHTTXContext->pAd; 211 pObj = (POS_COOKIE) pAd->OS_Cookie;
212 pObj = (POS_COOKIE) pAd->OS_Cookie; 212 Status = pUrb->status;
213 Status = pUrb->status;
214 213
215 // Store BulkOut PipeId 214 // Store BulkOut PipeId
216 BulkOutPipeId = pHTTXContext->BulkOutPipeId; 215 BulkOutPipeId = pHTTXContext->BulkOutPipeId;
217 pAd->BulkOutDataOneSecCount++; 216 pAd->BulkOutDataOneSecCount++;
218 217
219 //DBGPRINT(RT_DEBUG_LOUD, ("Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition, 218 //DBGPRINT(RT_DEBUG_LOUD, ("Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition,
220 // pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad)); 219 // pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));
221 220
222 RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); 221 RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
223 pAd->BulkOutPending[BulkOutPipeId] = FALSE; 222 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
224 pHTTXContext->IRPPending = FALSE; 223 pHTTXContext->IRPPending = FALSE;
225 pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0; 224 pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
226 225
227 if (Status == USB_ST_NOERROR) 226 if (Status == USB_ST_NOERROR) {
228 {
229 pAd->BulkOutComplete++; 227 pAd->BulkOutComplete++;
230 228
231 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); 229 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
@@ -235,30 +233,37 @@ static void rtusb_dataout_complete(unsigned long data)
235 FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext); 233 FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);
236 //RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); 234 //RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
237 235
238 236 } else // STATUS_OTHER
239 }
240 else // STATUS_OTHER
241 { 237 {
242 PUCHAR pBuf; 238 PUCHAR pBuf;
243 239
244 pAd->BulkOutCompleteOther++; 240 pAd->BulkOutCompleteOther++;
245 241
246 pBuf = &pHTTXContext->TransferBuffer->field.WirelessPacket[pHTTXContext->NextBulkOutPosition]; 242 pBuf =
243 &pHTTXContext->TransferBuffer->field.
244 WirelessPacket[pHTTXContext->NextBulkOutPosition];
247 245
248 if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 246 if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
249 fRTMP_ADAPTER_HALT_IN_PROGRESS | 247 fRTMP_ADAPTER_HALT_IN_PROGRESS |
250 fRTMP_ADAPTER_NIC_NOT_EXIST | 248 fRTMP_ADAPTER_NIC_NOT_EXIST |
251 fRTMP_ADAPTER_BULKOUT_RESET))) 249 fRTMP_ADAPTER_BULKOUT_RESET))) {
252 {
253 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); 250 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
254 pAd->bulkResetPipeid = BulkOutPipeId; 251 pAd->bulkResetPipeid = BulkOutPipeId;
255 pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq; 252 pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;
256 } 253 }
257 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); 254 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
258 255
259 DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkOutDataPacket failed: ReasonCode=%d!\n", Status)); 256 DBGPRINT_RAW(RT_DEBUG_ERROR,
260 DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther)); 257 ("BulkOutDataPacket failed: ReasonCode=%d!\n",
261 DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n", pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7])); 258 Status));
259 DBGPRINT_RAW(RT_DEBUG_ERROR,
260 ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n",
261 pAd->BulkOutReq, pAd->BulkOutComplete,
262 pAd->BulkOutCompleteOther));
263 DBGPRINT_RAW(RT_DEBUG_ERROR,
264 ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n",
265 pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4],
266 pBuf[5], pBuf[6], pBuf[7]));
262 //DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther)); 267 //DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther));
263 268
264 } 269 }
@@ -268,12 +273,17 @@ static void rtusb_dataout_complete(unsigned long data)
268 // bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out. 273 // bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out.
269 // 274 //
270 //RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); 275 //RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
271 if ((pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition) && 276 if ((pHTTXContext->ENextBulkOutPosition !=
272 (pHTTXContext->ENextBulkOutPosition != (pHTTXContext->CurWritePosition+8)) && 277 pHTTXContext->CurWritePosition)
273 !RTUSB_TEST_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId))) 278 && (pHTTXContext->ENextBulkOutPosition !=
274 { 279 (pHTTXContext->CurWritePosition + 8))
280 && !RTUSB_TEST_BULK_FLAG(pAd,
281 (fRTUSB_BULK_OUT_DATA_FRAG <<
282 BulkOutPipeId))) {
275 // Indicate There is data avaliable 283 // Indicate There is data avaliable
276 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); 284 RTUSB_SET_BULK_FLAG(pAd,
285 (fRTUSB_BULK_OUT_DATA_NORMAL <<
286 BulkOutPipeId));
277 } 287 }
278 //RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); 288 //RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
279 289
@@ -282,49 +292,46 @@ static void rtusb_dataout_complete(unsigned long data)
282 RTUSBKickBulkOut(pAd); 292 RTUSBKickBulkOut(pAd);
283} 293}
284 294
285
286static void rtusb_null_frame_done_tasklet(unsigned long data) 295static void rtusb_null_frame_done_tasklet(unsigned long data)
287{ 296{
288 PRTMP_ADAPTER pAd; 297 PRTMP_ADAPTER pAd;
289 PTX_CONTEXT pNullContext; 298 PTX_CONTEXT pNullContext;
290 purbb_t pUrb; 299 purbb_t pUrb;
291 NTSTATUS Status; 300 NTSTATUS Status;
292 unsigned long irqFlag; 301 unsigned long irqFlag;
293 302
294 303 pUrb = (purbb_t) data;
295 pUrb = (purbb_t)data; 304 pNullContext = (PTX_CONTEXT) pUrb->context;
296 pNullContext = (PTX_CONTEXT)pUrb->context; 305 pAd = pNullContext->pAd;
297 pAd = pNullContext->pAd; 306 Status = pUrb->status;
298 Status = pUrb->status;
299 307
300 // Reset Null frame context flags 308 // Reset Null frame context flags
301 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag); 309 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
302 pNullContext->IRPPending = FALSE; 310 pNullContext->IRPPending = FALSE;
303 pNullContext->InUse = FALSE; 311 pNullContext->InUse = FALSE;
304 pAd->BulkOutPending[0] = FALSE; 312 pAd->BulkOutPending[0] = FALSE;
305 pAd->watchDogTxPendingCnt[0] = 0; 313 pAd->watchDogTxPendingCnt[0] = 0;
306 314
307 if (Status == USB_ST_NOERROR) 315 if (Status == USB_ST_NOERROR) {
308 {
309 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); 316 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
310 317
311 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); 318 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
312 } 319 } else // STATUS_OTHER
313 else // STATUS_OTHER
314 { 320 {
315 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && 321 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
316 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && 322 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
317 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && 323 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
318 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) 324 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
319 { 325 DBGPRINT_RAW(RT_DEBUG_ERROR,
320 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out Null Frame Failed, ReasonCode=%d!\n", Status)); 326 ("Bulk Out Null Frame Failed, ReasonCode=%d!\n",
327 Status));
321 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); 328 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
322 pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); 329 pAd->bulkResetPipeid =
330 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
323 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); 331 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
324 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 332 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
325 } 333 NULL, 0);
326 else 334 } else {
327 {
328 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); 335 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
329 } 336 }
330 } 337 }
@@ -334,46 +341,42 @@ static void rtusb_null_frame_done_tasklet(unsigned long data)
334 RTUSBKickBulkOut(pAd); 341 RTUSBKickBulkOut(pAd);
335} 342}
336 343
337
338static void rtusb_rts_frame_done_tasklet(unsigned long data) 344static void rtusb_rts_frame_done_tasklet(unsigned long data)
339{ 345{
340 PRTMP_ADAPTER pAd; 346 PRTMP_ADAPTER pAd;
341 PTX_CONTEXT pRTSContext; 347 PTX_CONTEXT pRTSContext;
342 purbb_t pUrb; 348 purbb_t pUrb;
343 NTSTATUS Status; 349 NTSTATUS Status;
344 unsigned long irqFlag; 350 unsigned long irqFlag;
345 351
346 352 pUrb = (purbb_t) data;
347 pUrb = (purbb_t)data; 353 pRTSContext = (PTX_CONTEXT) pUrb->context;
348 pRTSContext = (PTX_CONTEXT)pUrb->context; 354 pAd = pRTSContext->pAd;
349 pAd = pRTSContext->pAd; 355 Status = pUrb->status;
350 Status = pUrb->status;
351 356
352 // Reset RTS frame context flags 357 // Reset RTS frame context flags
353 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag); 358 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
354 pRTSContext->IRPPending = FALSE; 359 pRTSContext->IRPPending = FALSE;
355 pRTSContext->InUse = FALSE; 360 pRTSContext->InUse = FALSE;
356 361
357 if (Status == USB_ST_NOERROR) 362 if (Status == USB_ST_NOERROR) {
358 {
359 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); 363 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
360 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); 364 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
361 } 365 } else // STATUS_OTHER
362 else // STATUS_OTHER
363 { 366 {
364 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && 367 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
365 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && 368 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
366 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && 369 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
367 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) 370 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
368 { 371 DBGPRINT_RAW(RT_DEBUG_ERROR,
369 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out RTS Frame Failed\n")); 372 ("Bulk Out RTS Frame Failed\n"));
370 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); 373 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
371 pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); 374 pAd->bulkResetPipeid =
375 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
372 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); 376 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
373 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 377 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
374 } 378 NULL, 0);
375 else 379 } else {
376 {
377 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); 380 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
378 } 381 }
379 } 382 }
@@ -386,44 +389,40 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data)
386 // The protectioon of rest bulk should be in BulkOut routine 389 // The protectioon of rest bulk should be in BulkOut routine
387 RTUSBKickBulkOut(pAd); 390 RTUSBKickBulkOut(pAd);
388 391
389
390} 392}
391 393
392
393static void rtusb_pspoll_frame_done_tasklet(unsigned long data) 394static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
394{ 395{
395 PRTMP_ADAPTER pAd; 396 PRTMP_ADAPTER pAd;
396 PTX_CONTEXT pPsPollContext; 397 PTX_CONTEXT pPsPollContext;
397 purbb_t pUrb; 398 purbb_t pUrb;
398 NTSTATUS Status; 399 NTSTATUS Status;
399 400
400 401 pUrb = (purbb_t) data;
401 402 pPsPollContext = (PTX_CONTEXT) pUrb->context;
402 pUrb = (purbb_t)data; 403 pAd = pPsPollContext->pAd;
403 pPsPollContext = (PTX_CONTEXT)pUrb->context; 404 Status = pUrb->status;
404 pAd = pPsPollContext->pAd;
405 Status = pUrb->status;
406 405
407 // Reset PsPoll context flags 406 // Reset PsPoll context flags
408 pPsPollContext->IRPPending = FALSE; 407 pPsPollContext->IRPPending = FALSE;
409 pPsPollContext->InUse = FALSE; 408 pPsPollContext->InUse = FALSE;
410 pAd->watchDogTxPendingCnt[0] = 0; 409 pAd->watchDogTxPendingCnt[0] = 0;
411 410
412 if (Status == USB_ST_NOERROR) 411 if (Status == USB_ST_NOERROR) {
413 {
414 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); 412 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
415 } 413 } else // STATUS_OTHER
416 else // STATUS_OTHER
417 { 414 {
418 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && 415 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
419 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && 416 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
420 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && 417 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
421 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) 418 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
422 { 419 DBGPRINT_RAW(RT_DEBUG_ERROR,
423 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out PSPoll Failed\n")); 420 ("Bulk Out PSPoll Failed\n"));
424 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); 421 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
425 pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); 422 pAd->bulkResetPipeid =
426 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 423 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
424 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
425 NULL, 0);
427 } 426 }
428 } 427 }
429 428
@@ -437,7 +436,6 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
437 436
438} 437}
439 438
440
441/* 439/*
442======================================================================== 440========================================================================
443Routine Description: 441Routine Description:
@@ -454,18 +452,17 @@ Note:
454*/ 452*/
455static void rx_done_tasklet(unsigned long data) 453static void rx_done_tasklet(unsigned long data)
456{ 454{
457 purbb_t pUrb; 455 purbb_t pUrb;
458 PRX_CONTEXT pRxContext; 456 PRX_CONTEXT pRxContext;
459 PRTMP_ADAPTER pAd; 457 PRTMP_ADAPTER pAd;
460 NTSTATUS Status; 458 NTSTATUS Status;
461 unsigned int IrqFlags; 459 unsigned int IrqFlags;
462 460
463 pUrb = (purbb_t)data; 461 pUrb = (purbb_t) data;
464 pRxContext = (PRX_CONTEXT)pUrb->context; 462 pRxContext = (PRX_CONTEXT) pUrb->context;
465 pAd = pRxContext->pAd; 463 pAd = pRxContext->pAd;
466 Status = pUrb->status; 464 Status = pUrb->status;
467 465
468
469 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); 466 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
470 pRxContext->InUse = FALSE; 467 pRxContext->InUse = FALSE;
471 pRxContext->IRPPending = FALSE; 468 pRxContext->IRPPending = FALSE;
@@ -473,8 +470,7 @@ static void rx_done_tasklet(unsigned long data)
473 //NdisInterlockedDecrement(&pAd->PendingRx); 470 //NdisInterlockedDecrement(&pAd->PendingRx);
474 pAd->PendingRx--; 471 pAd->PendingRx--;
475 472
476 if (Status == USB_ST_NOERROR) 473 if (Status == USB_ST_NOERROR) {
477 {
478 pAd->BulkInComplete++; 474 pAd->BulkInComplete++;
479 pAd->NextRxBulkInPosition = 0; 475 pAd->NextRxBulkInPosition = 0;
480 if (pRxContext->BulkInOffset) // As jan's comment, it may bulk-in success but size is zero. 476 if (pRxContext->BulkInOffset) // As jan's comment, it may bulk-in success but size is zero.
@@ -483,8 +479,7 @@ static void rx_done_tasklet(unsigned long data)
483 INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE); 479 INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);
484 } 480 }
485 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); 481 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
486 } 482 } else // STATUS_OTHER
487 else // STATUS_OTHER
488 { 483 {
489 pAd->BulkInCompleteFail++; 484 pAd->BulkInCompleteFail++;
490 // Still read this packet although it may comtain wrong bytes. 485 // Still read this packet although it may comtain wrong bytes.
@@ -493,16 +488,19 @@ static void rx_done_tasklet(unsigned long data)
493 488
494 // Parsing all packets. because after reset, the index will reset to all zero. 489 // Parsing all packets. because after reset, the index will reset to all zero.
495 if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 490 if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
496 fRTMP_ADAPTER_BULKIN_RESET | 491 fRTMP_ADAPTER_BULKIN_RESET |
497 fRTMP_ADAPTER_HALT_IN_PROGRESS | 492 fRTMP_ADAPTER_HALT_IN_PROGRESS |
498 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 493 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
499 {
500 494
501 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n", 495 DBGPRINT_RAW(RT_DEBUG_ERROR,
502 Status, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, pRxContext->pUrb->actual_length)); 496 ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n",
497 Status, pAd->NextRxBulkInIndex,
498 pAd->NextRxBulkInReadIndex,
499 pRxContext->pUrb->actual_length));
503 500
504 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); 501 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
505 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0); 502 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN,
503 NULL, 0);
506 } 504 }
507 } 505 }
508 506
@@ -510,46 +508,43 @@ static void rx_done_tasklet(unsigned long data)
510 508
511 RTUSBBulkReceive(pAd); 509 RTUSBBulkReceive(pAd);
512 510
513
514 return; 511 return;
515 512
516} 513}
517 514
518
519static void rtusb_mgmt_dma_done_tasklet(unsigned long data) 515static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
520{ 516{
521 PRTMP_ADAPTER pAd; 517 PRTMP_ADAPTER pAd;
522 PTX_CONTEXT pMLMEContext; 518 PTX_CONTEXT pMLMEContext;
523 int index; 519 int index;
524 PNDIS_PACKET pPacket; 520 PNDIS_PACKET pPacket;
525 purbb_t pUrb; 521 purbb_t pUrb;
526 NTSTATUS Status; 522 NTSTATUS Status;
527 unsigned long IrqFlags; 523 unsigned long IrqFlags;
528 524
529 525 pUrb = (purbb_t) data;
530 pUrb = (purbb_t)data; 526 pMLMEContext = (PTX_CONTEXT) pUrb->context;
531 pMLMEContext = (PTX_CONTEXT)pUrb->context; 527 pAd = pMLMEContext->pAd;
532 pAd = pMLMEContext->pAd; 528 Status = pUrb->status;
533 Status = pUrb->status; 529 index = pMLMEContext->SelfIdx;
534 index = pMLMEContext->SelfIdx;
535 530
536 ASSERT((pAd->MgmtRing.TxDmaIdx == index)); 531 ASSERT((pAd->MgmtRing.TxDmaIdx == index));
537 532
538 RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); 533 RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
539 534
540 535 if (Status != USB_ST_NOERROR) {
541 if (Status != USB_ST_NOERROR)
542 {
543 //Bulk-Out fail status handle 536 //Bulk-Out fail status handle
544 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && 537 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
545 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && 538 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
546 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && 539 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
547 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) 540 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
548 { 541 DBGPRINT_RAW(RT_DEBUG_ERROR,
549 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out MLME Failed, Status=%d!\n", Status)); 542 ("Bulk Out MLME Failed, Status=%d!\n",
543 Status));
550 // TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt? 544 // TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt?
551 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); 545 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
552 pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); 546 pAd->bulkResetPipeid =
547 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
553 } 548 }
554 } 549 }
555 550
@@ -576,163 +571,141 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
576 RTMPFreeNdisPacket(pAd, pPacket); 571 RTMPFreeNdisPacket(pAd, pPacket);
577 572
578 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 573 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
579 fRTMP_ADAPTER_HALT_IN_PROGRESS | 574 fRTMP_ADAPTER_HALT_IN_PROGRESS |
580 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 575 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
581 {
582 // do nothing and return directly. 576 // do nothing and return directly.
583 } 577 } else {
584 else 578 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)) { // For Mgmt Bulk-Out failed, ignore it now.
585 { 579 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
586 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && 580 NULL, 0);
587 ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)) 581 } else {
588 { // For Mgmt Bulk-Out failed, ignore it now.
589 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
590 }
591 else
592 {
593 582
594 // Always call Bulk routine, even reset bulk. 583 // Always call Bulk routine, even reset bulk.
595 // The protectioon of rest bulk should be in BulkOut routine 584 // The protectioon of rest bulk should be in BulkOut routine
596 if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */) 585 if (pAd->MgmtRing.TxSwFreeIdx <
597 { 586 MGMT_RING_SIZE
587 /* pMLMEContext->bWaitingBulkOut == TRUE */ ) {
598 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); 588 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
599 } 589 }
600 RTUSBKickBulkOut(pAd); 590 RTUSBKickBulkOut(pAd);
601 }
602 } 591 }
603 592 }
604 593
605} 594}
606 595
607static void rtusb_ac3_dma_done_tasklet(unsigned long data) 596static void rtusb_ac3_dma_done_tasklet(unsigned long data)
608{ 597{
609 PRTMP_ADAPTER pAd; 598 PRTMP_ADAPTER pAd;
610 PHT_TX_CONTEXT pHTTXContext; 599 PHT_TX_CONTEXT pHTTXContext;
611 UCHAR BulkOutPipeId = 3; 600 UCHAR BulkOutPipeId = 3;
612 purbb_t pUrb; 601 purbb_t pUrb;
613
614 602
615 pUrb = (purbb_t)data; 603 pUrb = (purbb_t) data;
616 pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; 604 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
617 pAd = pHTTXContext->pAd; 605 pAd = pHTTXContext->pAd;
618 606
619 rtusb_dataout_complete((unsigned long)pUrb); 607 rtusb_dataout_complete((unsigned long)pUrb);
620 608
621 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 609 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
622 fRTMP_ADAPTER_HALT_IN_PROGRESS | 610 fRTMP_ADAPTER_HALT_IN_PROGRESS |
623 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 611 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
624 {
625 // do nothing and return directly. 612 // do nothing and return directly.
626 } 613 } else {
627 else 614 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
628 { 615 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
629 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) 616 NULL, 0);
630 { 617 } else {
631 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 618 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
632 }
633 else
634 { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
635 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 619 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
636 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ 620 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
637 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 621 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
638 (pHTTXContext->bCurWriting == FALSE)) 622 (pHTTXContext->bCurWriting == FALSE)) {
639 { 623 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
640 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); 624 MAX_TX_PROCESS);
641 } 625 }
642 626
643 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<3); 627 RTUSB_SET_BULK_FLAG(pAd,
628 fRTUSB_BULK_OUT_DATA_NORMAL << 3);
644 RTUSBKickBulkOut(pAd); 629 RTUSBKickBulkOut(pAd);
645 } 630 }
646 } 631 }
647 632
648
649 return; 633 return;
650} 634}
651 635
652
653static void rtusb_ac2_dma_done_tasklet(unsigned long data) 636static void rtusb_ac2_dma_done_tasklet(unsigned long data)
654{ 637{
655 PRTMP_ADAPTER pAd; 638 PRTMP_ADAPTER pAd;
656 PHT_TX_CONTEXT pHTTXContext; 639 PHT_TX_CONTEXT pHTTXContext;
657 UCHAR BulkOutPipeId = 2; 640 UCHAR BulkOutPipeId = 2;
658 purbb_t pUrb; 641 purbb_t pUrb;
659
660 642
661 pUrb = (purbb_t)data; 643 pUrb = (purbb_t) data;
662 pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; 644 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
663 pAd = pHTTXContext->pAd; 645 pAd = pHTTXContext->pAd;
664 646
665 rtusb_dataout_complete((unsigned long)pUrb); 647 rtusb_dataout_complete((unsigned long)pUrb);
666 648
667 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 649 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
668 fRTMP_ADAPTER_HALT_IN_PROGRESS | 650 fRTMP_ADAPTER_HALT_IN_PROGRESS |
669 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 651 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
670 {
671 // do nothing and return directly. 652 // do nothing and return directly.
672 } 653 } else {
673 else 654 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
674 { 655 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
675 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) 656 NULL, 0);
676 { 657 } else {
677 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 658 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
678 }
679 else
680 { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
681 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 659 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
682 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ 660 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
683 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 661 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
684 (pHTTXContext->bCurWriting == FALSE)) 662 (pHTTXContext->bCurWriting == FALSE)) {
685 { 663 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
686 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); 664 MAX_TX_PROCESS);
687 } 665 }
688 666
689 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<2); 667 RTUSB_SET_BULK_FLAG(pAd,
668 fRTUSB_BULK_OUT_DATA_NORMAL << 2);
690 RTUSBKickBulkOut(pAd); 669 RTUSBKickBulkOut(pAd);
691 } 670 }
692 } 671 }
693 672
694
695 return; 673 return;
696} 674}
697 675
698
699static void rtusb_ac1_dma_done_tasklet(unsigned long data) 676static void rtusb_ac1_dma_done_tasklet(unsigned long data)
700{ 677{
701 PRTMP_ADAPTER pAd; 678 PRTMP_ADAPTER pAd;
702 PHT_TX_CONTEXT pHTTXContext; 679 PHT_TX_CONTEXT pHTTXContext;
703 UCHAR BulkOutPipeId = 1; 680 UCHAR BulkOutPipeId = 1;
704 purbb_t pUrb; 681 purbb_t pUrb;
705
706 682
707 pUrb = (purbb_t)data; 683 pUrb = (purbb_t) data;
708 pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; 684 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
709 pAd = pHTTXContext->pAd; 685 pAd = pHTTXContext->pAd;
710 686
711 rtusb_dataout_complete((unsigned long)pUrb); 687 rtusb_dataout_complete((unsigned long)pUrb);
712 688
713 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 689 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
714 fRTMP_ADAPTER_HALT_IN_PROGRESS | 690 fRTMP_ADAPTER_HALT_IN_PROGRESS |
715 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 691 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
716 {
717 // do nothing and return directly. 692 // do nothing and return directly.
718 } 693 } else {
719 else 694 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
720 { 695 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
721 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) 696 NULL, 0);
722 { 697 } else {
723 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 698 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
724 }
725 else
726 { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
727 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 699 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
728 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ 700 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
729 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 701 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
730 (pHTTXContext->bCurWriting == FALSE)) 702 (pHTTXContext->bCurWriting == FALSE)) {
731 { 703 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
732 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); 704 MAX_TX_PROCESS);
733 } 705 }
734 706
735 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<1); 707 RTUSB_SET_BULK_FLAG(pAd,
708 fRTUSB_BULK_OUT_DATA_NORMAL << 1);
736 RTUSBKickBulkOut(pAd); 709 RTUSBKickBulkOut(pAd);
737 } 710 }
738 } 711 }
@@ -740,41 +713,35 @@ static void rtusb_ac1_dma_done_tasklet(unsigned long data)
740 713
741} 714}
742 715
743
744static void rtusb_ac0_dma_done_tasklet(unsigned long data) 716static void rtusb_ac0_dma_done_tasklet(unsigned long data)
745{ 717{
746 PRTMP_ADAPTER pAd; 718 PRTMP_ADAPTER pAd;
747 PHT_TX_CONTEXT pHTTXContext; 719 PHT_TX_CONTEXT pHTTXContext;
748 UCHAR BulkOutPipeId = 0; 720 UCHAR BulkOutPipeId = 0;
749 purbb_t pUrb; 721 purbb_t pUrb;
750 722
751 723 pUrb = (purbb_t) data;
752 pUrb = (purbb_t)data; 724 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
753 pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; 725 pAd = pHTTXContext->pAd;
754 pAd = pHTTXContext->pAd;
755 726
756 rtusb_dataout_complete((unsigned long)pUrb); 727 rtusb_dataout_complete((unsigned long)pUrb);
757 728
758 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 729 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
759 fRTMP_ADAPTER_HALT_IN_PROGRESS | 730 fRTMP_ADAPTER_HALT_IN_PROGRESS |
760 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 731 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
761 {
762 // do nothing and return directly. 732 // do nothing and return directly.
763 } 733 } else {
764 else 734 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
765 { 735 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
766 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) 736 NULL, 0);
767 { 737 } else {
768 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); 738 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
769 }
770 else
771 { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
772 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 739 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
773 /* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ 740 /* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
774 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 741 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
775 (pHTTXContext->bCurWriting == FALSE)) 742 (pHTTXContext->bCurWriting == FALSE)) {
776 { 743 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
777 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); 744 MAX_TX_PROCESS);
778 } 745 }
779 746
780 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL); 747 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);
@@ -782,34 +749,38 @@ static void rtusb_ac0_dma_done_tasklet(unsigned long data)
782 } 749 }
783 } 750 }
784 751
785
786 return; 752 return;
787 753
788} 754}
789 755
790 756NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER * pAd)
791NDIS_STATUS RtmpNetTaskInit(
792 IN RTMP_ADAPTER *pAd)
793{ 757{
794 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; 758 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
795 759
796 // Create receive tasklet 760 // Create receive tasklet
797 tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd); 761 tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG) pAd);
798 tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd); 762 tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet,
799 tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd); 763 (unsigned long)pAd);
800 tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd); 764 tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet,
801 tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd); 765 (unsigned long)pAd);
802 tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd); 766 tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet,
767 (unsigned long)pAd);
768 tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet,
769 (unsigned long)pAd);
770 tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet,
771 (unsigned long)pAd);
803 tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd); 772 tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
804 tasklet_init(&pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd); 773 tasklet_init(&pObj->null_frame_complete_task,
805 tasklet_init(&pObj->rts_frame_complete_task, rtusb_rts_frame_done_tasklet, (unsigned long)pAd); 774 rtusb_null_frame_done_tasklet, (unsigned long)pAd);
806 tasklet_init(&pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd); 775 tasklet_init(&pObj->rts_frame_complete_task,
776 rtusb_rts_frame_done_tasklet, (unsigned long)pAd);
777 tasklet_init(&pObj->pspoll_frame_complete_task,
778 rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);
807 779
808 return NDIS_STATUS_SUCCESS; 780 return NDIS_STATUS_SUCCESS;
809} 781}
810 782
811 783void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd)
812void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
813{ 784{
814 POS_COOKIE pObj; 785 POS_COOKIE pObj;
815 786
diff --git a/drivers/staging/rt2860/sta_ioctl.c b/drivers/staging/rt2860/sta_ioctl.c
index df6130c981c..dc1f60010ec 100644
--- a/drivers/staging/rt2860/sta_ioctl.c
+++ b/drivers/staging/rt2860/sta_ioctl.c
@@ -40,7 +40,7 @@
40#include "rt_config.h" 40#include "rt_config.h"
41 41
42#ifdef DBG 42#ifdef DBG
43extern ULONG RTDebugLevel; 43extern ULONG RTDebugLevel;
44#endif 44#endif
45 45
46#define NR_WEP_KEYS 4 46#define NR_WEP_KEYS 4
@@ -49,235 +49,296 @@ extern ULONG RTDebugLevel;
49 49
50#define GROUP_KEY_NO 4 50#define GROUP_KEY_NO 4
51 51
52extern UCHAR CipherWpa2Template[]; 52extern UCHAR CipherWpa2Template[];
53 53
54typedef struct PACKED _RT_VERSION_INFO{ 54typedef struct PACKED _RT_VERSION_INFO {
55 UCHAR DriverVersionW; 55 UCHAR DriverVersionW;
56 UCHAR DriverVersionX; 56 UCHAR DriverVersionX;
57 UCHAR DriverVersionY; 57 UCHAR DriverVersionY;
58 UCHAR DriverVersionZ; 58 UCHAR DriverVersionZ;
59 UINT DriverBuildYear; 59 UINT DriverBuildYear;
60 UINT DriverBuildMonth; 60 UINT DriverBuildMonth;
61 UINT DriverBuildDay; 61 UINT DriverBuildDay;
62} RT_VERSION_INFO, *PRT_VERSION_INFO; 62} RT_VERSION_INFO, *PRT_VERSION_INFO;
63 63
64static __s32 ralinkrate[] = 64static __s32 ralinkrate[] = { 2, 4, 11, 22, // CCK
65 {2, 4, 11, 22, // CCK 65 12, 18, 24, 36, 48, 72, 96, 108, // OFDM
66 12, 18, 24, 36, 48, 72, 96, 108, // OFDM 66 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, // 20MHz, 800ns GI, MCS: 0 ~ 15
67 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, // 20MHz, 800ns GI, MCS: 0 ~ 15 67 39, 78, 117, 156, 234, 312, 351, 390, // 20MHz, 800ns GI, MCS: 16 ~ 23
68 39, 78, 117, 156, 234, 312, 351, 390, // 20MHz, 800ns GI, MCS: 16 ~ 23 68 27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, // 40MHz, 800ns GI, MCS: 0 ~ 15
69 27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, // 40MHz, 800ns GI, MCS: 0 ~ 15 69 81, 162, 243, 324, 486, 648, 729, 810, // 40MHz, 800ns GI, MCS: 16 ~ 23
70 81, 162, 243, 324, 486, 648, 729, 810, // 40MHz, 800ns GI, MCS: 16 ~ 23 70 14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, // 20MHz, 400ns GI, MCS: 0 ~ 15
71 14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, // 20MHz, 400ns GI, MCS: 0 ~ 15 71 43, 87, 130, 173, 260, 317, 390, 433, // 20MHz, 400ns GI, MCS: 16 ~ 23
72 43, 87, 130, 173, 260, 317, 390, 433, // 20MHz, 400ns GI, MCS: 16 ~ 23 72 30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, // 40MHz, 400ns GI, MCS: 0 ~ 15
73 30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, // 40MHz, 400ns GI, MCS: 0 ~ 15 73 90, 180, 270, 360, 540, 720, 810, 900
74 90, 180, 270, 360, 540, 720, 810, 900}; 74};
75 75
76INT Set_SSID_Proc( 76INT Set_SSID_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg);
77 IN PRTMP_ADAPTER pAdapter,
78 IN PSTRING arg);
79 77
80INT Set_NetworkType_Proc( 78INT Set_NetworkType_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg);
81 IN PRTMP_ADAPTER pAdapter,
82 IN PSTRING arg);
83 79
84VOID RTMPAddKey( 80VOID RTMPAddKey(IN PRTMP_ADAPTER pAd, IN PNDIS_802_11_KEY pKey)
85 IN PRTMP_ADAPTER pAd,
86 IN PNDIS_802_11_KEY pKey)
87{ 81{
88 ULONG KeyIdx; 82 ULONG KeyIdx;
89 MAC_TABLE_ENTRY *pEntry; 83 MAC_TABLE_ENTRY *pEntry;
84
85 DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey ------>\n"));
86
87 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
88 if (pKey->KeyIndex & 0x80000000) {
89 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
90 NdisZeroMemory(pAd->StaCfg.PMK, 32);
91 NdisMoveMemory(pAd->StaCfg.PMK,
92 pKey->KeyMaterial,
93 pKey->KeyLength);
94 goto end;
95 }
96 // Update PTK
97 NdisZeroMemory(&pAd->SharedKey[BSS0][0],
98 sizeof(CIPHER_KEY));
99 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
100 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key,
101 pKey->KeyMaterial, LEN_TKIP_EK);
102
103 if (pAd->StaCfg.PairCipher ==
104 Ndis802_11Encryption2Enabled) {
105 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,
106 pKey->KeyMaterial + LEN_TKIP_EK,
107 LEN_TKIP_TXMICK);
108 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,
109 pKey->KeyMaterial + LEN_TKIP_EK +
110 LEN_TKIP_TXMICK,
111 LEN_TKIP_RXMICK);
112 } else {
113 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,
114 pKey->KeyMaterial + LEN_TKIP_EK,
115 LEN_TKIP_TXMICK);
116 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,
117 pKey->KeyMaterial + LEN_TKIP_EK +
118 LEN_TKIP_TXMICK,
119 LEN_TKIP_RXMICK);
120 }
90 121
91 DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey ------>\n")); 122 // Decide its ChiperAlg
123 if (pAd->StaCfg.PairCipher ==
124 Ndis802_11Encryption2Enabled)
125 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
126 else if (pAd->StaCfg.PairCipher ==
127 Ndis802_11Encryption3Enabled)
128 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
129 else
130 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
131
132 // Update these related information to MAC_TABLE_ENTRY
133 pEntry = &pAd->MacTab.Content[BSSID_WCID];
134 NdisMoveMemory(pEntry->PairwiseKey.Key,
135 pAd->SharedKey[BSS0][0].Key,
136 LEN_TKIP_EK);
137 NdisMoveMemory(pEntry->PairwiseKey.RxMic,
138 pAd->SharedKey[BSS0][0].RxMic,
139 LEN_TKIP_RXMICK);
140 NdisMoveMemory(pEntry->PairwiseKey.TxMic,
141 pAd->SharedKey[BSS0][0].TxMic,
142 LEN_TKIP_TXMICK);
143 pEntry->PairwiseKey.CipherAlg =
144 pAd->SharedKey[BSS0][0].CipherAlg;
145
146 // Update pairwise key information to ASIC Shared Key Table
147 AsicAddSharedKeyEntry(pAd,
148 BSS0,
149 0,
150 pAd->SharedKey[BSS0][0].CipherAlg,
151 pAd->SharedKey[BSS0][0].Key,
152 pAd->SharedKey[BSS0][0].TxMic,
153 pAd->SharedKey[BSS0][0].RxMic);
154
155 // Update ASIC WCID attribute table and IVEIV table
156 RTMPAddWcidAttributeEntry(pAd,
157 BSS0,
158 0,
159 pAd->SharedKey[BSS0][0].
160 CipherAlg, pEntry);
92 161
93 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) 162 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2) {
94 { 163 // set 802.1x port control
95 if (pKey->KeyIndex & 0x80000000) 164 //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
96 {
97 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
98 {
99 NdisZeroMemory(pAd->StaCfg.PMK, 32);
100 NdisMoveMemory(pAd->StaCfg.PMK, pKey->KeyMaterial, pKey->KeyLength);
101 goto end;
102 }
103 // Update PTK
104 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
105 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
106 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pKey->KeyMaterial, LEN_TKIP_EK);
107
108 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
109 {
110 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, pKey->KeyMaterial + LEN_TKIP_EK, LEN_TKIP_TXMICK);
111 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, pKey->KeyMaterial + LEN_TKIP_EK + LEN_TKIP_TXMICK, LEN_TKIP_RXMICK);
112 }
113 else
114 {
115 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, pKey->KeyMaterial + LEN_TKIP_EK, LEN_TKIP_TXMICK);
116 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, pKey->KeyMaterial + LEN_TKIP_EK + LEN_TKIP_TXMICK, LEN_TKIP_RXMICK);
117 }
118
119 // Decide its ChiperAlg
120 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
121 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
122 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
123 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
124 else
125 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
126
127 // Update these related information to MAC_TABLE_ENTRY
128 pEntry = &pAd->MacTab.Content[BSSID_WCID];
129 NdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[BSS0][0].Key, LEN_TKIP_EK);
130 NdisMoveMemory(pEntry->PairwiseKey.RxMic, pAd->SharedKey[BSS0][0].RxMic, LEN_TKIP_RXMICK);
131 NdisMoveMemory(pEntry->PairwiseKey.TxMic, pAd->SharedKey[BSS0][0].TxMic, LEN_TKIP_TXMICK);
132 pEntry->PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg;
133
134 // Update pairwise key information to ASIC Shared Key Table
135 AsicAddSharedKeyEntry(pAd,
136 BSS0,
137 0,
138 pAd->SharedKey[BSS0][0].CipherAlg,
139 pAd->SharedKey[BSS0][0].Key,
140 pAd->SharedKey[BSS0][0].TxMic,
141 pAd->SharedKey[BSS0][0].RxMic);
142
143 // Update ASIC WCID attribute table and IVEIV table
144 RTMPAddWcidAttributeEntry(pAd,
145 BSS0,
146 0,
147 pAd->SharedKey[BSS0][0].CipherAlg,
148 pEntry);
149
150 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2)
151 {
152 // set 802.1x port control
153 //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
154 STA_PORT_SECURED(pAd); 165 STA_PORT_SECURED(pAd);
155 166
156 // Indicate Connected for GUI 167 // Indicate Connected for GUI
157 pAd->IndicateMediaState = NdisMediaStateConnected; 168 pAd->IndicateMediaState =
158 } 169 NdisMediaStateConnected;
159 } 170 }
160 else 171 } else {
161 { 172 // Update GTK
162 // Update GTK 173 pAd->StaCfg.DefaultKeyId = (pKey->KeyIndex & 0xFF);
163 pAd->StaCfg.DefaultKeyId = (pKey->KeyIndex & 0xFF); 174 NdisZeroMemory(&pAd->
164 NdisZeroMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId], sizeof(CIPHER_KEY)); 175 SharedKey[BSS0][pAd->StaCfg.
165 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = LEN_TKIP_EK; 176 DefaultKeyId],
166 NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, pKey->KeyMaterial, LEN_TKIP_EK); 177 sizeof(CIPHER_KEY));
167 178 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen =
168 if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled) 179 LEN_TKIP_EK;
169 { 180 NdisMoveMemory(pAd->
170 NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TKIP_EK, LEN_TKIP_TXMICK); 181 SharedKey[BSS0][pAd->StaCfg.
171 NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TKIP_EK + LEN_TKIP_TXMICK, LEN_TKIP_RXMICK); 182 DefaultKeyId].Key,
172 } 183 pKey->KeyMaterial, LEN_TKIP_EK);
173 else 184
174 { 185 if (pAd->StaCfg.GroupCipher ==
175 NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TKIP_EK, LEN_TKIP_TXMICK); 186 Ndis802_11Encryption2Enabled) {
176 NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TKIP_EK + LEN_TKIP_TXMICK, LEN_TKIP_RXMICK); 187 NdisMoveMemory(pAd->
177 } 188 SharedKey[BSS0][pAd->StaCfg.
178 189 DefaultKeyId].
179 // Update Shared Key CipherAlg 190 RxMic,
180 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_NONE; 191 pKey->KeyMaterial + LEN_TKIP_EK,
181 if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled) 192 LEN_TKIP_TXMICK);
182 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP; 193 NdisMoveMemory(pAd->
183 else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) 194 SharedKey[BSS0][pAd->StaCfg.
184 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES; 195 DefaultKeyId].
185 196 TxMic,
186 // Update group key information to ASIC Shared Key Table 197 pKey->KeyMaterial + LEN_TKIP_EK +
187 AsicAddSharedKeyEntry(pAd, 198 LEN_TKIP_TXMICK,
188 BSS0, 199 LEN_TKIP_RXMICK);
189 pAd->StaCfg.DefaultKeyId, 200 } else {
190 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, 201 NdisMoveMemory(pAd->
191 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, 202 SharedKey[BSS0][pAd->StaCfg.
192 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, 203 DefaultKeyId].
193 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic); 204 TxMic,
194 205 pKey->KeyMaterial + LEN_TKIP_EK,
195 // Update ASIC WCID attribute table and IVEIV table 206 LEN_TKIP_TXMICK);
196 RTMPAddWcidAttributeEntry(pAd, 207 NdisMoveMemory(pAd->
197 BSS0, 208 SharedKey[BSS0][pAd->StaCfg.
198 pAd->StaCfg.DefaultKeyId, 209 DefaultKeyId].
199 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, 210 RxMic,
200 NULL); 211 pKey->KeyMaterial + LEN_TKIP_EK +
201 212 LEN_TKIP_TXMICK,
202 // set 802.1x port control 213 LEN_TKIP_RXMICK);
203 //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 214 }
215
216 // Update Shared Key CipherAlg
217 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].
218 CipherAlg = CIPHER_NONE;
219 if (pAd->StaCfg.GroupCipher ==
220 Ndis802_11Encryption2Enabled)
221 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].
222 CipherAlg = CIPHER_TKIP;
223 else if (pAd->StaCfg.GroupCipher ==
224 Ndis802_11Encryption3Enabled)
225 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].
226 CipherAlg = CIPHER_AES;
227
228 // Update group key information to ASIC Shared Key Table
229 AsicAddSharedKeyEntry(pAd,
230 BSS0,
231 pAd->StaCfg.DefaultKeyId,
232 pAd->SharedKey[BSS0][pAd->StaCfg.
233 DefaultKeyId].
234 CipherAlg,
235 pAd->SharedKey[BSS0][pAd->StaCfg.
236 DefaultKeyId].
237 Key,
238 pAd->SharedKey[BSS0][pAd->StaCfg.
239 DefaultKeyId].
240 TxMic,
241 pAd->SharedKey[BSS0][pAd->StaCfg.
242 DefaultKeyId].
243 RxMic);
244
245 // Update ASIC WCID attribute table and IVEIV table
246 RTMPAddWcidAttributeEntry(pAd,
247 BSS0,
248 pAd->StaCfg.DefaultKeyId,
249 pAd->SharedKey[BSS0][pAd->
250 StaCfg.
251 DefaultKeyId].
252 CipherAlg, NULL);
253
254 // set 802.1x port control
255 //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
204 STA_PORT_SECURED(pAd); 256 STA_PORT_SECURED(pAd);
205 257
206 // Indicate Connected for GUI 258 // Indicate Connected for GUI
207 pAd->IndicateMediaState = NdisMediaStateConnected; 259 pAd->IndicateMediaState = NdisMediaStateConnected;
208 } 260 }
209 } 261 } else // dynamic WEP from wpa_supplicant
210 else // dynamic WEP from wpa_supplicant
211 { 262 {
212 UCHAR CipherAlg; 263 UCHAR CipherAlg;
213 PUCHAR Key; 264 PUCHAR Key;
214 265
215 if(pKey->KeyLength == 32) 266 if (pKey->KeyLength == 32)
216 goto end; 267 goto end;
217 268
218 KeyIdx = pKey->KeyIndex & 0x0fffffff; 269 KeyIdx = pKey->KeyIndex & 0x0fffffff;
219 270
220 if (KeyIdx < 4) 271 if (KeyIdx < 4) {
221 {
222 // it is a default shared key, for Pairwise key setting 272 // it is a default shared key, for Pairwise key setting
223 if (pKey->KeyIndex & 0x80000000) 273 if (pKey->KeyIndex & 0x80000000) {
224 {
225 pEntry = MacTableLookup(pAd, pKey->BSSID); 274 pEntry = MacTableLookup(pAd, pKey->BSSID);
226 275
227 if (pEntry) 276 if (pEntry) {
228 { 277 DBGPRINT(RT_DEBUG_TRACE,
229 DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey: Set Pair-wise Key\n")); 278 ("RTMPAddKey: Set Pair-wise Key\n"));
230 279
231 // set key material and key length 280 // set key material and key length
232 pEntry->PairwiseKey.KeyLen = (UCHAR)pKey->KeyLength; 281 pEntry->PairwiseKey.KeyLen =
233 NdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength); 282 (UCHAR) pKey->KeyLength;
283 NdisMoveMemory(pEntry->PairwiseKey.Key,
284 &pKey->KeyMaterial,
285 pKey->KeyLength);
234 286
235 // set Cipher type 287 // set Cipher type
236 if (pKey->KeyLength == 5) 288 if (pKey->KeyLength == 5)
237 pEntry->PairwiseKey.CipherAlg = CIPHER_WEP64; 289 pEntry->PairwiseKey.CipherAlg =
290 CIPHER_WEP64;
238 else 291 else
239 pEntry->PairwiseKey.CipherAlg = CIPHER_WEP128; 292 pEntry->PairwiseKey.CipherAlg =
293 CIPHER_WEP128;
240 294
241 // Add Pair-wise key to Asic 295 // Add Pair-wise key to Asic
242 AsicAddPairwiseKeyEntry( 296 AsicAddPairwiseKeyEntry(pAd,
243 pAd, 297 pEntry->Addr,
244 pEntry->Addr, 298 (UCHAR) pEntry->
245 (UCHAR)pEntry->Aid, 299 Aid,
246 &pEntry->PairwiseKey); 300 &pEntry->
301 PairwiseKey);
247 302
248 // update WCID attribute table and IVEIV table for this entry 303 // update WCID attribute table and IVEIV table for this entry
249 RTMPAddWcidAttributeEntry( 304 RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, // The value may be not zero
250 pAd, 305 pEntry->
251 BSS0, 306 PairwiseKey.
252 KeyIdx, // The value may be not zero 307 CipherAlg,
253 pEntry->PairwiseKey.CipherAlg, 308 pEntry);
254 pEntry);
255 309
256 } 310 }
257 } 311 } else {
258 else
259 {
260 // Default key for tx (shared key) 312 // Default key for tx (shared key)
261 pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; 313 pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;
262 314
263 // set key material and key length 315 // set key material and key length
264 pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pKey->KeyLength; 316 pAd->SharedKey[BSS0][KeyIdx].KeyLen =
265 NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength); 317 (UCHAR) pKey->KeyLength;
318 NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key,
319 &pKey->KeyMaterial,
320 pKey->KeyLength);
266 321
267 // Set Ciper type 322 // Set Ciper type
268 if (pKey->KeyLength == 5) 323 if (pKey->KeyLength == 5)
269 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_WEP64; 324 pAd->SharedKey[BSS0][KeyIdx].CipherAlg =
325 CIPHER_WEP64;
270 else 326 else
271 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_WEP128; 327 pAd->SharedKey[BSS0][KeyIdx].CipherAlg =
328 CIPHER_WEP128;
272 329
273 CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg; 330 CipherAlg =
274 Key = pAd->SharedKey[BSS0][KeyIdx].Key; 331 pAd->SharedKey[BSS0][KeyIdx].CipherAlg;
332 Key = pAd->SharedKey[BSS0][KeyIdx].Key;
275 333
276 // Set Group key material to Asic 334 // Set Group key material to Asic
277 AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL); 335 AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx,
336 CipherAlg, Key, NULL,
337 NULL);
278 338
279 // Update WCID attribute table and IVEIV table for this group key table 339 // Update WCID attribute table and IVEIV table for this group key table
280 RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, NULL); 340 RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx,
341 CipherAlg, NULL);
281 342
282 } 343 }
283 } 344 }
@@ -286,12 +347,12 @@ end:
286 return; 347 return;
287} 348}
288 349
289char * rtstrchr(const char * s, int c) 350char *rtstrchr(const char *s, int c)
290{ 351{
291 for(; *s != (char) c; ++s) 352 for (; *s != (char)c; ++s)
292 if (*s == '\0') 353 if (*s == '\0')
293 return NULL; 354 return NULL;
294 return (char *) s; 355 return (char *)s;
295} 356}
296 357
297/* 358/*
@@ -300,8 +361,7 @@ This is required for LinEX2004/kernel2.6.7 to provide iwlist scanning function
300 361
301int 362int
302rt_ioctl_giwname(struct net_device *dev, 363rt_ioctl_giwname(struct net_device *dev,
303 struct iw_request_info *info, 364 struct iw_request_info *info, char *name, char *extra)
304 char *name, char *extra)
305{ 365{
306 strncpy(name, "Ralink STA", IFNAMSIZ); 366 strncpy(name, "Ralink STA", IFNAMSIZ);
307 // RT2870 2.1.0.0 uses "RT2870 Wireless" 367 // RT2870 2.1.0.0 uses "RT2870 Wireless"
@@ -310,89 +370,87 @@ rt_ioctl_giwname(struct net_device *dev,
310} 370}
311 371
312int rt_ioctl_siwfreq(struct net_device *dev, 372int rt_ioctl_siwfreq(struct net_device *dev,
313 struct iw_request_info *info, 373 struct iw_request_info *info,
314 struct iw_freq *freq, char *extra) 374 struct iw_freq *freq, char *extra)
315{ 375{
316 PRTMP_ADAPTER pAdapter = NULL; 376 PRTMP_ADAPTER pAdapter = NULL;
317 int chan = -1; 377 int chan = -1;
318 378
319 GET_PAD_FROM_NET_DEV(pAdapter, dev); 379 GET_PAD_FROM_NET_DEV(pAdapter, dev);
320 380
321 //check if the interface is down 381 //check if the interface is down
322 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 382 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
323 { 383 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
324 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 384 return -ENETDOWN;
325 return -ENETDOWN; 385 }
326 }
327
328 386
329 if (freq->e > 1) 387 if (freq->e > 1)
330 return -EINVAL; 388 return -EINVAL;
331 389
332 if((freq->e == 0) && (freq->m <= 1000)) 390 if ((freq->e == 0) && (freq->m <= 1000))
333 chan = freq->m; // Setting by channel number 391 chan = freq->m; // Setting by channel number
334 else 392 else
335 MAP_KHZ_TO_CHANNEL_ID( (freq->m /100) , chan); // Setting by frequency - search the table , like 2.412G, 2.422G, 393 MAP_KHZ_TO_CHANNEL_ID((freq->m / 100), chan); // Setting by frequency - search the table , like 2.412G, 2.422G,
336 394
337 if (ChannelSanity(pAdapter, chan) == TRUE) 395 if (ChannelSanity(pAdapter, chan) == TRUE) {
338 { 396 pAdapter->CommonCfg.Channel = chan;
339 pAdapter->CommonCfg.Channel = chan; 397 DBGPRINT(RT_DEBUG_ERROR,
340 DBGPRINT(RT_DEBUG_ERROR, ("==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n", SIOCSIWFREQ, pAdapter->CommonCfg.Channel)); 398 ("==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n",
341 } 399 SIOCSIWFREQ, pAdapter->CommonCfg.Channel));
342 else 400 } else
343 return -EINVAL; 401 return -EINVAL;
344 402
345 return 0; 403 return 0;
346} 404}
405
347int rt_ioctl_giwfreq(struct net_device *dev, 406int rt_ioctl_giwfreq(struct net_device *dev,
348 struct iw_request_info *info, 407 struct iw_request_info *info,
349 struct iw_freq *freq, char *extra) 408 struct iw_freq *freq, char *extra)
350{ 409{
351 PRTMP_ADAPTER pAdapter = NULL; 410 PRTMP_ADAPTER pAdapter = NULL;
352 UCHAR ch; 411 UCHAR ch;
353 ULONG m = 2412000; 412 ULONG m = 2412000;
354 413
355 GET_PAD_FROM_NET_DEV(pAdapter, dev); 414 GET_PAD_FROM_NET_DEV(pAdapter, dev);
356 415
357 ch = pAdapter->CommonCfg.Channel; 416 ch = pAdapter->CommonCfg.Channel;
358 417
359 DBGPRINT(RT_DEBUG_TRACE,("==>rt_ioctl_giwfreq %d\n", ch)); 418 DBGPRINT(RT_DEBUG_TRACE, ("==>rt_ioctl_giwfreq %d\n", ch));
360 419
361 MAP_CHANNEL_ID_TO_KHZ(ch, m); 420 MAP_CHANNEL_ID_TO_KHZ(ch, m);
362 freq->m = m * 100; 421 freq->m = m * 100;
363 freq->e = 1; 422 freq->e = 1;
364 return 0; 423 return 0;
365} 424}
366 425
367int rt_ioctl_siwmode(struct net_device *dev, 426int rt_ioctl_siwmode(struct net_device *dev,
368 struct iw_request_info *info, 427 struct iw_request_info *info, __u32 * mode, char *extra)
369 __u32 *mode, char *extra)
370{ 428{
371 PRTMP_ADAPTER pAdapter = NULL; 429 PRTMP_ADAPTER pAdapter = NULL;
372 430
373 GET_PAD_FROM_NET_DEV(pAdapter, dev); 431 GET_PAD_FROM_NET_DEV(pAdapter, dev);
374 432
375 //check if the interface is down 433 //check if the interface is down
376 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 434 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
377 { 435 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
378 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 436 return -ENETDOWN;
379 return -ENETDOWN; 437 }
380 }
381 438
382 switch (*mode) 439 switch (*mode) {
383 { 440 case IW_MODE_ADHOC:
384 case IW_MODE_ADHOC: 441 Set_NetworkType_Proc(pAdapter, "Adhoc");
385 Set_NetworkType_Proc(pAdapter, "Adhoc"); 442 break;
386 break; 443 case IW_MODE_INFRA:
387 case IW_MODE_INFRA: 444 Set_NetworkType_Proc(pAdapter, "Infra");
388 Set_NetworkType_Proc(pAdapter, "Infra"); 445 break;
389 break; 446 case IW_MODE_MONITOR:
390 case IW_MODE_MONITOR: 447 Set_NetworkType_Proc(pAdapter, "Monitor");
391 Set_NetworkType_Proc(pAdapter, "Monitor"); 448 break;
392 break; 449 default:
393 default: 450 DBGPRINT(RT_DEBUG_TRACE,
394 DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_siwmode::SIOCSIWMODE (unknown %d)\n", *mode)); 451 ("===>rt_ioctl_siwmode::SIOCSIWMODE (unknown %d)\n",
395 return -EINVAL; 452 *mode));
453 return -EINVAL;
396 } 454 }
397 455
398 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key 456 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
@@ -402,8 +460,7 @@ int rt_ioctl_siwmode(struct net_device *dev,
402} 460}
403 461
404int rt_ioctl_giwmode(struct net_device *dev, 462int rt_ioctl_giwmode(struct net_device *dev,
405 struct iw_request_info *info, 463 struct iw_request_info *info, __u32 * mode, char *extra)
406 __u32 *mode, char *extra)
407{ 464{
408 PRTMP_ADAPTER pAdapter = NULL; 465 PRTMP_ADAPTER pAdapter = NULL;
409 466
@@ -411,63 +468,57 @@ int rt_ioctl_giwmode(struct net_device *dev,
411 468
412 if (ADHOC_ON(pAdapter)) 469 if (ADHOC_ON(pAdapter))
413 *mode = IW_MODE_ADHOC; 470 *mode = IW_MODE_ADHOC;
414 else if (INFRA_ON(pAdapter)) 471 else if (INFRA_ON(pAdapter))
415 *mode = IW_MODE_INFRA; 472 *mode = IW_MODE_INFRA;
416 else if (MONITOR_ON(pAdapter)) 473 else if (MONITOR_ON(pAdapter)) {
417 { 474 *mode = IW_MODE_MONITOR;
418 *mode = IW_MODE_MONITOR; 475 } else
419 } 476 *mode = IW_MODE_AUTO;
420 else
421 *mode = IW_MODE_AUTO;
422 477
423 DBGPRINT(RT_DEBUG_TRACE, ("==>rt_ioctl_giwmode(mode=%d)\n", *mode)); 478 DBGPRINT(RT_DEBUG_TRACE, ("==>rt_ioctl_giwmode(mode=%d)\n", *mode));
424 return 0; 479 return 0;
425} 480}
426 481
427int rt_ioctl_siwsens(struct net_device *dev, 482int rt_ioctl_siwsens(struct net_device *dev,
428 struct iw_request_info *info, 483 struct iw_request_info *info, char *name, char *extra)
429 char *name, char *extra)
430{ 484{
431 PRTMP_ADAPTER pAdapter = NULL; 485 PRTMP_ADAPTER pAdapter = NULL;
432 486
433 GET_PAD_FROM_NET_DEV(pAdapter, dev); 487 GET_PAD_FROM_NET_DEV(pAdapter, dev);
434 488
435 //check if the interface is down 489 //check if the interface is down
436 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 490 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
437 { 491 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
438 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 492 return -ENETDOWN;
439 return -ENETDOWN; 493 }
440 }
441 494
442 return 0; 495 return 0;
443} 496}
444 497
445int rt_ioctl_giwsens(struct net_device *dev, 498int rt_ioctl_giwsens(struct net_device *dev,
446 struct iw_request_info *info, 499 struct iw_request_info *info, char *name, char *extra)
447 char *name, char *extra)
448{ 500{
449 return 0; 501 return 0;
450} 502}
451 503
452int rt_ioctl_giwrange(struct net_device *dev, 504int rt_ioctl_giwrange(struct net_device *dev,
453 struct iw_request_info *info, 505 struct iw_request_info *info,
454 struct iw_point *data, char *extra) 506 struct iw_point *data, char *extra)
455{ 507{
456 PRTMP_ADAPTER pAdapter = NULL; 508 PRTMP_ADAPTER pAdapter = NULL;
457 struct iw_range *range = (struct iw_range *) extra; 509 struct iw_range *range = (struct iw_range *)extra;
458 u16 val; 510 u16 val;
459 int i; 511 int i;
460 512
461 GET_PAD_FROM_NET_DEV(pAdapter, dev); 513 GET_PAD_FROM_NET_DEV(pAdapter, dev);
462 514
463 DBGPRINT(RT_DEBUG_TRACE ,("===>rt_ioctl_giwrange\n")); 515 DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_giwrange\n"));
464 data->length = sizeof(struct iw_range); 516 data->length = sizeof(struct iw_range);
465 memset(range, 0, sizeof(struct iw_range)); 517 memset(range, 0, sizeof(struct iw_range));
466 518
467 range->txpower_capa = IW_TXPOW_DBM; 519 range->txpower_capa = IW_TXPOW_DBM;
468 520
469 if (INFRA_ON(pAdapter)||ADHOC_ON(pAdapter)) 521 if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) {
470 {
471 range->min_pmp = 1 * 1024; 522 range->min_pmp = 1 * 1024;
472 range->max_pmp = 65535 * 1024; 523 range->max_pmp = 65535 * 1024;
473 range->min_pmt = 1 * 1024; 524 range->min_pmt = 1 * 1024;
@@ -475,7 +526,7 @@ int rt_ioctl_giwrange(struct net_device *dev,
475 range->pmp_flags = IW_POWER_PERIOD; 526 range->pmp_flags = IW_POWER_PERIOD;
476 range->pmt_flags = IW_POWER_TIMEOUT; 527 range->pmt_flags = IW_POWER_TIMEOUT;
477 range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | 528 range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT |
478 IW_POWER_UNICAST_R | IW_POWER_ALL_R; 529 IW_POWER_UNICAST_R | IW_POWER_ALL_R;
479 } 530 }
480 531
481 range->we_version_compiled = WIRELESS_EXT; 532 range->we_version_compiled = WIRELESS_EXT;
@@ -486,15 +537,14 @@ int rt_ioctl_giwrange(struct net_device *dev,
486 range->min_retry = 0; 537 range->min_retry = 0;
487 range->max_retry = 255; 538 range->max_retry = 255;
488 539
489 range->num_channels = pAdapter->ChannelListNum; 540 range->num_channels = pAdapter->ChannelListNum;
490 541
491 val = 0; 542 val = 0;
492 for (i = 1; i <= range->num_channels; i++) 543 for (i = 1; i <= range->num_channels; i++) {
493 {
494 u32 m = 2412000; 544 u32 m = 2412000;
495 range->freq[val].i = pAdapter->ChannelList[i-1].Channel; 545 range->freq[val].i = pAdapter->ChannelList[i - 1].Channel;
496 MAP_CHANNEL_ID_TO_KHZ(pAdapter->ChannelList[i-1].Channel, m); 546 MAP_CHANNEL_ID_TO_KHZ(pAdapter->ChannelList[i - 1].Channel, m);
497 range->freq[val].m = m * 100; /* OS_HZ */ 547 range->freq[val].m = m * 100; /* OS_HZ */
498 548
499 range->freq[val].e = 1; 549 range->freq[val].e = 1;
500 val++; 550 val++;
@@ -503,11 +553,11 @@ int rt_ioctl_giwrange(struct net_device *dev,
503 } 553 }
504 range->num_frequency = val; 554 range->num_frequency = val;
505 555
506 range->max_qual.qual = 100; /* what is correct max? This was not 556 range->max_qual.qual = 100; /* what is correct max? This was not
507 * documented exactly. At least 557 * documented exactly. At least
508 * 69 has been observed. */ 558 * 69 has been observed. */
509 range->max_qual.level = 0; /* dB */ 559 range->max_qual.level = 0; /* dB */
510 range->max_qual.noise = 0; /* dB */ 560 range->max_qual.noise = 0; /* dB */
511 561
512 /* What would be suitable values for "average/typical" qual? */ 562 /* What would be suitable values for "average/typical" qual? */
513 range->avg_qual.qual = 20; 563 range->avg_qual.qual = 20;
@@ -527,74 +577,68 @@ int rt_ioctl_giwrange(struct net_device *dev,
527 577
528 /* IW_ENC_CAPA_* bit field */ 578 /* IW_ENC_CAPA_* bit field */
529 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | 579 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
530 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; 580 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
531 581
532 return 0; 582 return 0;
533} 583}
534 584
535int rt_ioctl_siwap(struct net_device *dev, 585int rt_ioctl_siwap(struct net_device *dev,
536 struct iw_request_info *info, 586 struct iw_request_info *info,
537 struct sockaddr *ap_addr, char *extra) 587 struct sockaddr *ap_addr, char *extra)
538{ 588{
539 PRTMP_ADAPTER pAdapter = NULL; 589 PRTMP_ADAPTER pAdapter = NULL;
540 NDIS_802_11_MAC_ADDRESS Bssid; 590 NDIS_802_11_MAC_ADDRESS Bssid;
541 591
542 GET_PAD_FROM_NET_DEV(pAdapter, dev); 592 GET_PAD_FROM_NET_DEV(pAdapter, dev);
543 593
544 //check if the interface is down 594 //check if the interface is down
545 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 595 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
546 { 596 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
547 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 597 return -ENETDOWN;
548 return -ENETDOWN; 598 }
549 } 599
550 600 if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) {
551 if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) 601 RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
552 { 602 DBGPRINT(RT_DEBUG_TRACE,
553 RTMP_MLME_RESET_STATE_MACHINE(pAdapter); 603 ("!!! MLME busy, reset MLME state machine !!!\n"));
554 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); 604 }
555 } 605 // tell CNTL state machine to call NdisMSetInformationComplete() after completing
556 606 // this request, because this request is initiated by NDIS.
557 // tell CNTL state machine to call NdisMSetInformationComplete() after completing 607 pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
558 // this request, because this request is initiated by NDIS.
559 pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
560 // Prevent to connect AP again in STAMlmePeriodicExec 608 // Prevent to connect AP again in STAMlmePeriodicExec
561 pAdapter->MlmeAux.AutoReconnectSsidLen= 32; 609 pAdapter->MlmeAux.AutoReconnectSsidLen = 32;
562 610
563 memset(Bssid, 0, MAC_ADDR_LEN); 611 memset(Bssid, 0, MAC_ADDR_LEN);
564 memcpy(Bssid, ap_addr->sa_data, MAC_ADDR_LEN); 612 memcpy(Bssid, ap_addr->sa_data, MAC_ADDR_LEN);
565 MlmeEnqueue(pAdapter, 613 MlmeEnqueue(pAdapter,
566 MLME_CNTL_STATE_MACHINE, 614 MLME_CNTL_STATE_MACHINE,
567 OID_802_11_BSSID, 615 OID_802_11_BSSID,
568 sizeof(NDIS_802_11_MAC_ADDRESS), 616 sizeof(NDIS_802_11_MAC_ADDRESS), (VOID *) & Bssid);
569 (VOID *)&Bssid);
570 617
571 DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\n", 618 DBGPRINT(RT_DEBUG_TRACE,
572 Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5])); 619 ("IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\n", Bssid[0],
620 Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));
573 621
574 return 0; 622 return 0;
575} 623}
576 624
577int rt_ioctl_giwap(struct net_device *dev, 625int rt_ioctl_giwap(struct net_device *dev,
578 struct iw_request_info *info, 626 struct iw_request_info *info,
579 struct sockaddr *ap_addr, char *extra) 627 struct sockaddr *ap_addr, char *extra)
580{ 628{
581 PRTMP_ADAPTER pAdapter = NULL; 629 PRTMP_ADAPTER pAdapter = NULL;
582 630
583 GET_PAD_FROM_NET_DEV(pAdapter, dev); 631 GET_PAD_FROM_NET_DEV(pAdapter, dev);
584 632
585 if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) 633 if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) {
586 {
587 ap_addr->sa_family = ARPHRD_ETHER; 634 ap_addr->sa_family = ARPHRD_ETHER;
588 memcpy(ap_addr->sa_data, &pAdapter->CommonCfg.Bssid, ETH_ALEN); 635 memcpy(ap_addr->sa_data, &pAdapter->CommonCfg.Bssid, ETH_ALEN);
589 } 636 }
590 // Add for RT2870 637 // Add for RT2870
591 else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) 638 else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) {
592 { 639 ap_addr->sa_family = ARPHRD_ETHER;
593 ap_addr->sa_family = ARPHRD_ETHER; 640 memcpy(ap_addr->sa_data, &pAdapter->MlmeAux.Bssid, ETH_ALEN);
594 memcpy(ap_addr->sa_data, &pAdapter->MlmeAux.Bssid, ETH_ALEN); 641 } else {
595 }
596 else
597 {
598 DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWAP(=EMPTY)\n")); 642 DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWAP(=EMPTY)\n"));
599 return -ENOTCONN; 643 return -ENOTCONN;
600 } 644 }
@@ -619,32 +663,31 @@ int rt_ioctl_giwap(struct net_device *dev,
619 * drivers for compatibility 663 * drivers for compatibility
620 */ 664 */
621static void set_quality(PRTMP_ADAPTER pAdapter, 665static void set_quality(PRTMP_ADAPTER pAdapter,
622 struct iw_quality *iq, 666 struct iw_quality *iq, signed char rssi)
623 signed char rssi)
624{ 667{
625 __u8 ChannelQuality; 668 __u8 ChannelQuality;
626 669
627 // Normalize Rssi 670 // Normalize Rssi
628 if (rssi >= -50) 671 if (rssi >= -50)
629 ChannelQuality = 100; 672 ChannelQuality = 100;
630 else if (rssi >= -80) // between -50 ~ -80dbm 673 else if (rssi >= -80) // between -50 ~ -80dbm
631 ChannelQuality = (__u8)(24 + ((rssi + 80) * 26)/10); 674 ChannelQuality = (__u8) (24 + ((rssi + 80) * 26) / 10);
632 else if (rssi >= -90) // between -80 ~ -90dbm 675 else if (rssi >= -90) // between -80 ~ -90dbm
633 ChannelQuality = (__u8)((rssi + 90) * 26)/10; 676 ChannelQuality = (__u8) ((rssi + 90) * 26) / 10;
634 else 677 else
635 ChannelQuality = 0; 678 ChannelQuality = 0;
636 679
637 iq->qual = (__u8)ChannelQuality; 680 iq->qual = (__u8) ChannelQuality;
638 681
639 iq->level = (__u8)(rssi); 682 iq->level = (__u8) (rssi);
640 iq->noise = (pAdapter->BbpWriteLatch[66] > pAdapter->BbpTuning.FalseCcaUpperThreshold) ? ((__u8)pAdapter->BbpTuning.FalseCcaUpperThreshold) : ((__u8) pAdapter->BbpWriteLatch[66]); // noise level (dBm) 683 iq->noise = (pAdapter->BbpWriteLatch[66] > pAdapter->BbpTuning.FalseCcaUpperThreshold) ? ((__u8) pAdapter->BbpTuning.FalseCcaUpperThreshold) : ((__u8) pAdapter->BbpWriteLatch[66]); // noise level (dBm)
641 iq->noise += 256 - 143; 684 iq->noise += 256 - 143;
642 iq->updated = pAdapter->iw_stats.qual.updated; 685 iq->updated = pAdapter->iw_stats.qual.updated;
643} 686}
644 687
645int rt_ioctl_iwaplist(struct net_device *dev, 688int rt_ioctl_iwaplist(struct net_device *dev,
646 struct iw_request_info *info, 689 struct iw_request_info *info,
647 struct iw_point *data, char *extra) 690 struct iw_point *data, char *extra)
648{ 691{
649 PRTMP_ADAPTER pAdapter = NULL; 692 PRTMP_ADAPTER pAdapter = NULL;
650 693
@@ -654,91 +697,90 @@ int rt_ioctl_iwaplist(struct net_device *dev,
654 697
655 GET_PAD_FROM_NET_DEV(pAdapter, dev); 698 GET_PAD_FROM_NET_DEV(pAdapter, dev);
656 699
657 //check if the interface is down 700 //check if the interface is down
658 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 701 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
659 { 702 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
660 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
661 data->length = 0; 703 data->length = 0;
662 return 0; 704 return 0;
663 //return -ENETDOWN; 705 //return -ENETDOWN;
664 } 706 }
665 707
666 for (i = 0; i <IW_MAX_AP ; i++) 708 for (i = 0; i < IW_MAX_AP; i++) {
667 { 709 if (i >= pAdapter->ScanTab.BssNr)
668 if (i >= pAdapter->ScanTab.BssNr)
669 break; 710 break;
670 addr[i].sa_family = ARPHRD_ETHER; 711 addr[i].sa_family = ARPHRD_ETHER;
671 memcpy(addr[i].sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN); 712 memcpy(addr[i].sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid,
672 set_quality(pAdapter, &qual[i], pAdapter->ScanTab.BssEntry[i].Rssi); 713 MAC_ADDR_LEN);
714 set_quality(pAdapter, &qual[i],
715 pAdapter->ScanTab.BssEntry[i].Rssi);
673 } 716 }
674 data->length = i; 717 data->length = i;
675 memcpy(extra, &addr, i*sizeof(addr[0])); 718 memcpy(extra, &addr, i * sizeof(addr[0]));
676 data->flags = 1; /* signal quality present (sort of) */ 719 data->flags = 1; /* signal quality present (sort of) */
677 memcpy(extra + i*sizeof(addr[0]), &qual, i*sizeof(qual[i])); 720 memcpy(extra + i * sizeof(addr[0]), &qual, i * sizeof(qual[i]));
678 721
679 return 0; 722 return 0;
680} 723}
681 724
682int rt_ioctl_siwscan(struct net_device *dev, 725int rt_ioctl_siwscan(struct net_device *dev,
683 struct iw_request_info *info, 726 struct iw_request_info *info,
684 struct iw_point *data, char *extra) 727 struct iw_point *data, char *extra)
685{ 728{
686 PRTMP_ADAPTER pAdapter = NULL; 729 PRTMP_ADAPTER pAdapter = NULL;
687 730
688 ULONG Now; 731 ULONG Now;
689 int Status = NDIS_STATUS_SUCCESS; 732 int Status = NDIS_STATUS_SUCCESS;
690 733
691 GET_PAD_FROM_NET_DEV(pAdapter, dev); 734 GET_PAD_FROM_NET_DEV(pAdapter, dev);
692 735
693 //check if the interface is down 736 //check if the interface is down
694 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 737 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
695 {
696 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 738 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
697 return -ENETDOWN; 739 return -ENETDOWN;
698 } 740 }
699 741
700 if (MONITOR_ON(pAdapter)) 742 if (MONITOR_ON(pAdapter)) {
701 { 743 DBGPRINT(RT_DEBUG_TRACE,
702 DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n")); 744 ("!!! Driver is in Monitor Mode now !!!\n"));
703 return -EINVAL; 745 return -EINVAL;
704 } 746 }
705
706 747
707 if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) 748 if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) {
708 {
709 pAdapter->StaCfg.WpaSupplicantScanCount++; 749 pAdapter->StaCfg.WpaSupplicantScanCount++;
710 } 750 }
711 751
712 pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE; 752 pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
713 if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) 753 if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
714 return NDIS_STATUS_SUCCESS; 754 return NDIS_STATUS_SUCCESS;
715 do{ 755 do {
716 Now = jiffies; 756 Now = jiffies;
717 757
718 if ((pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) && 758 if ((pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
719 (pAdapter->StaCfg.WpaSupplicantScanCount > 3)) 759 && (pAdapter->StaCfg.WpaSupplicantScanCount > 3)) {
720 { 760 DBGPRINT(RT_DEBUG_TRACE,
721 DBGPRINT(RT_DEBUG_TRACE, ("!!! WpaSupplicantScanCount > 3\n")); 761 ("!!! WpaSupplicantScanCount > 3\n"));
722 Status = NDIS_STATUS_SUCCESS; 762 Status = NDIS_STATUS_SUCCESS;
723 break; 763 break;
724 } 764 }
725 765
726 if ((OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) && 766 if ((OPSTATUS_TEST_FLAG
727 ((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 767 (pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED))
728 (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) && 768 && ((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA)
729 (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) 769 || (pAdapter->StaCfg.AuthMode ==
730 { 770 Ndis802_11AuthModeWPAPSK))
731 DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n")); 771 && (pAdapter->StaCfg.PortSecured ==
772 WPA_802_1X_PORT_NOT_SECURED)) {
773 DBGPRINT(RT_DEBUG_TRACE,
774 ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n"));
732 Status = NDIS_STATUS_SUCCESS; 775 Status = NDIS_STATUS_SUCCESS;
733 break; 776 break;
734 } 777 }
735 778
736 if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) 779 if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) {
737 {
738 RTMP_MLME_RESET_STATE_MACHINE(pAdapter); 780 RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
739 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); 781 DBGPRINT(RT_DEBUG_TRACE,
782 ("!!! MLME busy, reset MLME state machine !!!\n"));
740 } 783 }
741
742 // tell CNTL state machine to call NdisMSetInformationComplete() after completing 784 // tell CNTL state machine to call NdisMSetInformationComplete() after completing
743 // this request, because this request is initiated by NDIS. 785 // this request, because this request is initiated by NDIS.
744 pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE; 786 pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
@@ -747,148 +789,151 @@ int rt_ioctl_siwscan(struct net_device *dev,
747 pAdapter->StaCfg.LastScanTime = Now; 789 pAdapter->StaCfg.LastScanTime = Now;
748 790
749 MlmeEnqueue(pAdapter, 791 MlmeEnqueue(pAdapter,
750 MLME_CNTL_STATE_MACHINE, 792 MLME_CNTL_STATE_MACHINE,
751 OID_802_11_BSSID_LIST_SCAN, 793 OID_802_11_BSSID_LIST_SCAN, 0, NULL);
752 0,
753 NULL);
754 794
755 Status = NDIS_STATUS_SUCCESS; 795 Status = NDIS_STATUS_SUCCESS;
756 RTMP_MLME_HANDLER(pAdapter); 796 RTMP_MLME_HANDLER(pAdapter);
757 }while(0); 797 } while (0);
758 return NDIS_STATUS_SUCCESS; 798 return NDIS_STATUS_SUCCESS;
759} 799}
760 800
761int rt_ioctl_giwscan(struct net_device *dev, 801int rt_ioctl_giwscan(struct net_device *dev,
762 struct iw_request_info *info, 802 struct iw_request_info *info,
763 struct iw_point *data, char *extra) 803 struct iw_point *data, char *extra)
764{ 804{
765 PRTMP_ADAPTER pAdapter = NULL; 805 PRTMP_ADAPTER pAdapter = NULL;
766 int i=0; 806 int i = 0;
767 PSTRING current_ev = extra, previous_ev = extra; 807 PSTRING current_ev = extra, previous_ev = extra;
768 PSTRING end_buf; 808 PSTRING end_buf;
769 PSTRING current_val; 809 PSTRING current_val;
770 STRING custom[MAX_CUSTOM_LEN] = {0}; 810 STRING custom[MAX_CUSTOM_LEN] = { 0 };
771 struct iw_event iwe; 811 struct iw_event iwe;
772 812
773 GET_PAD_FROM_NET_DEV(pAdapter, dev); 813 GET_PAD_FROM_NET_DEV(pAdapter, dev);
774 814
775 if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) 815 if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) {
776 {
777 /* 816 /*
778 * Still scanning, indicate the caller should try again. 817 * Still scanning, indicate the caller should try again.
779 */ 818 */
780 return -EAGAIN; 819 return -EAGAIN;
781 } 820 }
782 821
783 if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) 822 if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) {
784 {
785 pAdapter->StaCfg.WpaSupplicantScanCount = 0; 823 pAdapter->StaCfg.WpaSupplicantScanCount = 0;
786 } 824 }
787 825
788 if (pAdapter->ScanTab.BssNr == 0) 826 if (pAdapter->ScanTab.BssNr == 0) {
789 {
790 data->length = 0; 827 data->length = 0;
791 return 0; 828 return 0;
792 } 829 }
793 830
794 if (data->length > 0) 831 if (data->length > 0)
795 end_buf = extra + data->length; 832 end_buf = extra + data->length;
796 else 833 else
797 end_buf = extra + IW_SCAN_MAX_DATA; 834 end_buf = extra + IW_SCAN_MAX_DATA;
798 835
799 for (i = 0; i < pAdapter->ScanTab.BssNr; i++) 836 for (i = 0; i < pAdapter->ScanTab.BssNr; i++) {
800 { 837 if (current_ev >= end_buf) {
801 if (current_ev >= end_buf)
802 {
803 return -E2BIG; 838 return -E2BIG;
804 } 839 }
805
806 //MAC address 840 //MAC address
807 //================================ 841 //================================
808 memset(&iwe, 0, sizeof(iwe)); 842 memset(&iwe, 0, sizeof(iwe));
809 iwe.cmd = SIOCGIWAP; 843 iwe.cmd = SIOCGIWAP;
810 iwe.u.ap_addr.sa_family = ARPHRD_ETHER; 844 iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
811 memcpy(iwe.u.ap_addr.sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN); 845 memcpy(iwe.u.ap_addr.sa_data,
846 &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN);
812 847
813 previous_ev = current_ev; 848 previous_ev = current_ev;
814 current_ev = iwe_stream_add_event(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); 849 current_ev =
815 if (current_ev == previous_ev) 850 iwe_stream_add_event(info, current_ev, end_buf, &iwe,
816 return -E2BIG; 851 IW_EV_ADDR_LEN);
852 if (current_ev == previous_ev)
853 return -E2BIG;
817 854
818 /* 855 /*
819 Protocol: 856 Protocol:
820 it will show scanned AP's WirelessMode . 857 it will show scanned AP's WirelessMode .
821 it might be 858 it might be
822 802.11a 859 802.11a
823 802.11a/n 860 802.11a/n
824 802.11g/n 861 802.11g/n
825 802.11b/g/n 862 802.11b/g/n
826 802.11g 863 802.11g
827 802.11b/g 864 802.11b/g
828 */ 865 */
829 memset(&iwe, 0, sizeof(iwe)); 866 memset(&iwe, 0, sizeof(iwe));
830 iwe.cmd = SIOCGIWNAME; 867 iwe.cmd = SIOCGIWNAME;
831 868
832
833 {
834 PBSS_ENTRY pBssEntry=&pAdapter->ScanTab.BssEntry[i];
835 BOOLEAN isGonly=FALSE;
836 int rateCnt=0;
837
838 if (pBssEntry->Channel>14)
839 {
840 if (pBssEntry->HtCapabilityLen!=0)
841 strcpy(iwe.u.name,"802.11a/n");
842 else
843 strcpy(iwe.u.name,"802.11a");
844 }
845 else
846 { 869 {
847 /* 870 PBSS_ENTRY pBssEntry = &pAdapter->ScanTab.BssEntry[i];
848 if one of non B mode rate is set supported rate . it mean G only. 871 BOOLEAN isGonly = FALSE;
849 */ 872 int rateCnt = 0;
850 for (rateCnt=0;rateCnt<pBssEntry->SupRateLen;rateCnt++)
851 {
852 /*
853 6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate , it mean G only.
854 */
855 if (pBssEntry->SupRate[rateCnt]==140 || pBssEntry->SupRate[rateCnt]==146 || pBssEntry->SupRate[rateCnt]>=152)
856 isGonly=TRUE;
857 }
858 873
859 for (rateCnt=0;rateCnt<pBssEntry->ExtRateLen;rateCnt++) 874 if (pBssEntry->Channel > 14) {
860 { 875 if (pBssEntry->HtCapabilityLen != 0)
861 if (pBssEntry->ExtRate[rateCnt]==140 || pBssEntry->ExtRate[rateCnt]==146 || pBssEntry->ExtRate[rateCnt]>=152) 876 strcpy(iwe.u.name, "802.11a/n");
862 isGonly=TRUE; 877 else
863 } 878 strcpy(iwe.u.name, "802.11a");
879 } else {
880 /*
881 if one of non B mode rate is set supported rate . it mean G only.
882 */
883 for (rateCnt = 0;
884 rateCnt < pBssEntry->SupRateLen;
885 rateCnt++) {
886 /*
887 6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate , it mean G only.
888 */
889 if (pBssEntry->SupRate[rateCnt] == 140
890 || pBssEntry->SupRate[rateCnt] ==
891 146
892 || pBssEntry->SupRate[rateCnt] >=
893 152)
894 isGonly = TRUE;
895 }
864 896
897 for (rateCnt = 0;
898 rateCnt < pBssEntry->ExtRateLen;
899 rateCnt++) {
900 if (pBssEntry->ExtRate[rateCnt] == 140
901 || pBssEntry->ExtRate[rateCnt] ==
902 146
903 || pBssEntry->ExtRate[rateCnt] >=
904 152)
905 isGonly = TRUE;
906 }
865 907
866 if (pBssEntry->HtCapabilityLen!=0) 908 if (pBssEntry->HtCapabilityLen != 0) {
867 { 909 if (isGonly == TRUE)
868 if (isGonly==TRUE) 910 strcpy(iwe.u.name, "802.11g/n");
869 strcpy(iwe.u.name,"802.11g/n");
870 else
871 strcpy(iwe.u.name,"802.11b/g/n");
872 }
873 else
874 {
875 if (isGonly==TRUE)
876 strcpy(iwe.u.name,"802.11g");
877 else
878 {
879 if (pBssEntry->SupRateLen==4 && pBssEntry->ExtRateLen==0)
880 strcpy(iwe.u.name,"802.11b");
881 else 911 else
882 strcpy(iwe.u.name,"802.11b/g"); 912 strcpy(iwe.u.name,
913 "802.11b/g/n");
914 } else {
915 if (isGonly == TRUE)
916 strcpy(iwe.u.name, "802.11g");
917 else {
918 if (pBssEntry->SupRateLen == 4
919 && pBssEntry->ExtRateLen ==
920 0)
921 strcpy(iwe.u.name,
922 "802.11b");
923 else
924 strcpy(iwe.u.name,
925 "802.11b/g");
926 }
883 } 927 }
884 } 928 }
885 } 929 }
886 }
887 930
888 previous_ev = current_ev; 931 previous_ev = current_ev;
889 current_ev = iwe_stream_add_event(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); 932 current_ev =
890 if (current_ev == previous_ev) 933 iwe_stream_add_event(info, current_ev, end_buf, &iwe,
891 return -E2BIG; 934 IW_EV_ADDR_LEN);
935 if (current_ev == previous_ev)
936 return -E2BIG;
892 937
893 //ESSID 938 //ESSID
894 //================================ 939 //================================
@@ -897,33 +942,34 @@ int rt_ioctl_giwscan(struct net_device *dev,
897 iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].SsidLen; 942 iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].SsidLen;
898 iwe.u.data.flags = 1; 943 iwe.u.data.flags = 1;
899 944
900 previous_ev = current_ev; 945 previous_ev = current_ev;
901 current_ev = iwe_stream_add_point(info, current_ev,end_buf, &iwe, (PSTRING) pAdapter->ScanTab.BssEntry[i].Ssid); 946 current_ev =
902 if (current_ev == previous_ev) 947 iwe_stream_add_point(info, current_ev, end_buf, &iwe,
903 return -E2BIG; 948 (PSTRING) pAdapter->ScanTab.
949 BssEntry[i].Ssid);
950 if (current_ev == previous_ev)
951 return -E2BIG;
904 952
905 //Network Type 953 //Network Type
906 //================================ 954 //================================
907 memset(&iwe, 0, sizeof(iwe)); 955 memset(&iwe, 0, sizeof(iwe));
908 iwe.cmd = SIOCGIWMODE; 956 iwe.cmd = SIOCGIWMODE;
909 if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11IBSS) 957 if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11IBSS) {
910 {
911 iwe.u.mode = IW_MODE_ADHOC; 958 iwe.u.mode = IW_MODE_ADHOC;
912 } 959 } else if (pAdapter->ScanTab.BssEntry[i].BssType ==
913 else if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11Infrastructure) 960 Ndis802_11Infrastructure) {
914 {
915 iwe.u.mode = IW_MODE_INFRA; 961 iwe.u.mode = IW_MODE_INFRA;
916 } 962 } else {
917 else
918 {
919 iwe.u.mode = IW_MODE_AUTO; 963 iwe.u.mode = IW_MODE_AUTO;
920 } 964 }
921 iwe.len = IW_EV_UINT_LEN; 965 iwe.len = IW_EV_UINT_LEN;
922 966
923 previous_ev = current_ev; 967 previous_ev = current_ev;
924 current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_UINT_LEN); 968 current_ev =
925 if (current_ev == previous_ev) 969 iwe_stream_add_event(info, current_ev, end_buf, &iwe,
926 return -E2BIG; 970 IW_EV_UINT_LEN);
971 if (current_ev == previous_ev)
972 return -E2BIG;
927 973
928 //Channel and Frequency 974 //Channel and Frequency
929 //================================ 975 //================================
@@ -937,190 +983,217 @@ int rt_ioctl_giwscan(struct net_device *dev,
937 iwe.u.freq.i = 0; 983 iwe.u.freq.i = 0;
938 984
939 previous_ev = current_ev; 985 previous_ev = current_ev;
940 current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); 986 current_ev =
941 if (current_ev == previous_ev) 987 iwe_stream_add_event(info, current_ev, end_buf, &iwe,
942 return -E2BIG; 988 IW_EV_FREQ_LEN);
943 989 if (current_ev == previous_ev)
944 //Add quality statistics 990 return -E2BIG;
945 //================================ 991
946 memset(&iwe, 0, sizeof(iwe)); 992 //Add quality statistics
947 iwe.cmd = IWEVQUAL; 993 //================================
948 iwe.u.qual.level = 0; 994 memset(&iwe, 0, sizeof(iwe));
949 iwe.u.qual.noise = 0; 995 iwe.cmd = IWEVQUAL;
950 set_quality(pAdapter, &iwe.u.qual, pAdapter->ScanTab.BssEntry[i].Rssi); 996 iwe.u.qual.level = 0;
951 current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN); 997 iwe.u.qual.noise = 0;
952 if (current_ev == previous_ev) 998 set_quality(pAdapter, &iwe.u.qual,
953 return -E2BIG; 999 pAdapter->ScanTab.BssEntry[i].Rssi);
1000 current_ev =
1001 iwe_stream_add_event(info, current_ev, end_buf, &iwe,
1002 IW_EV_QUAL_LEN);
1003 if (current_ev == previous_ev)
1004 return -E2BIG;
954 1005
955 //Encyption key 1006 //Encyption key
956 //================================ 1007 //================================
957 memset(&iwe, 0, sizeof(iwe)); 1008 memset(&iwe, 0, sizeof(iwe));
958 iwe.cmd = SIOCGIWENCODE; 1009 iwe.cmd = SIOCGIWENCODE;
959 if (CAP_IS_PRIVACY_ON (pAdapter->ScanTab.BssEntry[i].CapabilityInfo )) 1010 if (CAP_IS_PRIVACY_ON
960 iwe.u.data.flags =IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; 1011 (pAdapter->ScanTab.BssEntry[i].CapabilityInfo))
1012 iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
961 else 1013 else
962 iwe.u.data.flags = IW_ENCODE_DISABLED; 1014 iwe.u.data.flags = IW_ENCODE_DISABLED;
963 1015
964 previous_ev = current_ev; 1016 previous_ev = current_ev;
965 current_ev = iwe_stream_add_point(info, current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[BSS0][(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key); 1017 current_ev =
966 if (current_ev == previous_ev) 1018 iwe_stream_add_point(info, current_ev, end_buf, &iwe,
967 return -E2BIG; 1019 (char *)pAdapter->
1020 SharedKey[BSS0][(iwe.u.data.
1021 flags &
1022 IW_ENCODE_INDEX) -
1023 1].Key);
1024 if (current_ev == previous_ev)
1025 return -E2BIG;
968 1026
969 //Bit Rate 1027 //Bit Rate
970 //================================ 1028 //================================
971 if (pAdapter->ScanTab.BssEntry[i].SupRateLen) 1029 if (pAdapter->ScanTab.BssEntry[i].SupRateLen) {
972 { 1030 UCHAR tmpRate =
973 UCHAR tmpRate = pAdapter->ScanTab.BssEntry[i].SupRate[pAdapter->ScanTab.BssEntry[i].SupRateLen-1]; 1031 pAdapter->ScanTab.BssEntry[i].SupRate[pAdapter->
1032 ScanTab.
1033 BssEntry[i].
1034 SupRateLen -
1035 1];
974 memset(&iwe, 0, sizeof(iwe)); 1036 memset(&iwe, 0, sizeof(iwe));
975 iwe.cmd = SIOCGIWRATE; 1037 iwe.cmd = SIOCGIWRATE;
976 current_val = current_ev + IW_EV_LCP_LEN; 1038 current_val = current_ev + IW_EV_LCP_LEN;
977 if (tmpRate == 0x82) 1039 if (tmpRate == 0x82)
978 iwe.u.bitrate.value = 1 * 1000000; 1040 iwe.u.bitrate.value = 1 * 1000000;
979 else if (tmpRate == 0x84) 1041 else if (tmpRate == 0x84)
980 iwe.u.bitrate.value = 2 * 1000000; 1042 iwe.u.bitrate.value = 2 * 1000000;
981 else if (tmpRate == 0x8B) 1043 else if (tmpRate == 0x8B)
982 iwe.u.bitrate.value = 5.5 * 1000000; 1044 iwe.u.bitrate.value = 5.5 * 1000000;
983 else if (tmpRate == 0x96) 1045 else if (tmpRate == 0x96)
984 iwe.u.bitrate.value = 11 * 1000000; 1046 iwe.u.bitrate.value = 11 * 1000000;
985 else 1047 else
986 iwe.u.bitrate.value = (tmpRate/2) * 1000000; 1048 iwe.u.bitrate.value = (tmpRate / 2) * 1000000;
987 1049
988 if (tmpRate == 0x6c && pAdapter->ScanTab.BssEntry[i].HtCapabilityLen > 0) 1050 if (tmpRate == 0x6c
989 { 1051 && pAdapter->ScanTab.BssEntry[i].HtCapabilityLen >
990 int rate_count = sizeof(ralinkrate)/sizeof(__s32); 1052 0) {
991 HT_CAP_INFO capInfo = pAdapter->ScanTab.BssEntry[i].HtCapability.HtCapInfo; 1053 int rate_count =
992 int shortGI = capInfo.ChannelWidth ? capInfo.ShortGIfor40 : capInfo.ShortGIfor20; 1054 sizeof(ralinkrate) / sizeof(__s32);
993 int maxMCS = pAdapter->ScanTab.BssEntry[i].HtCapability.MCSSet[1] ? 15 : 7; 1055 HT_CAP_INFO capInfo =
994 int rate_index = 12 + ((UCHAR)capInfo.ChannelWidth * 24) + ((UCHAR)shortGI *48) + ((UCHAR)maxMCS); 1056 pAdapter->ScanTab.BssEntry[i].HtCapability.
1057 HtCapInfo;
1058 int shortGI =
1059 capInfo.ChannelWidth ? capInfo.
1060 ShortGIfor40 : capInfo.ShortGIfor20;
1061 int maxMCS =
1062 pAdapter->ScanTab.BssEntry[i].HtCapability.
1063 MCSSet[1] ? 15 : 7;
1064 int rate_index =
1065 12 + ((UCHAR) capInfo.ChannelWidth * 24) +
1066 ((UCHAR) shortGI * 48) + ((UCHAR) maxMCS);
995 if (rate_index < 0) 1067 if (rate_index < 0)
996 rate_index = 0; 1068 rate_index = 0;
997 if (rate_index > rate_count) 1069 if (rate_index > rate_count)
998 rate_index = rate_count; 1070 rate_index = rate_count;
999 iwe.u.bitrate.value = ralinkrate[rate_index] * 500000; 1071 iwe.u.bitrate.value =
1072 ralinkrate[rate_index] * 500000;
1000 } 1073 }
1001 1074
1002 iwe.u.bitrate.disabled = 0; 1075 iwe.u.bitrate.disabled = 0;
1003 current_val = iwe_stream_add_value(info, current_ev, 1076 current_val = iwe_stream_add_value(info, current_ev,
1004 current_val, end_buf, &iwe, 1077 current_val, end_buf,
1005 IW_EV_PARAM_LEN); 1078 &iwe,
1006 1079 IW_EV_PARAM_LEN);
1007 if((current_val-current_ev)>IW_EV_LCP_LEN)
1008 current_ev = current_val;
1009 else
1010 return -E2BIG;
1011 }
1012 1080
1081 if ((current_val - current_ev) > IW_EV_LCP_LEN)
1082 current_ev = current_val;
1083 else
1084 return -E2BIG;
1085 }
1013 //WPA IE 1086 //WPA IE
1014 if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0) 1087 if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0) {
1015 {
1016 memset(&iwe, 0, sizeof(iwe)); 1088 memset(&iwe, 0, sizeof(iwe));
1017 memset(&custom[0], 0, MAX_CUSTOM_LEN); 1089 memset(&custom[0], 0, MAX_CUSTOM_LEN);
1018 memcpy(custom, &(pAdapter->ScanTab.BssEntry[i].WpaIE.IE[0]), 1090 memcpy(custom,
1019 pAdapter->ScanTab.BssEntry[i].WpaIE.IELen); 1091 &(pAdapter->ScanTab.BssEntry[i].WpaIE.IE[0]),
1092 pAdapter->ScanTab.BssEntry[i].WpaIE.IELen);
1020 iwe.cmd = IWEVGENIE; 1093 iwe.cmd = IWEVGENIE;
1021 iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].WpaIE.IELen; 1094 iwe.u.data.length =
1022 current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom); 1095 pAdapter->ScanTab.BssEntry[i].WpaIE.IELen;
1096 current_ev =
1097 iwe_stream_add_point(info, current_ev, end_buf,
1098 &iwe, custom);
1023 if (current_ev == previous_ev) 1099 if (current_ev == previous_ev)
1024 return -E2BIG; 1100 return -E2BIG;
1025 } 1101 }
1026
1027 //WPA2 IE 1102 //WPA2 IE
1028 if (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen > 0) 1103 if (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen > 0) {
1029 { 1104 memset(&iwe, 0, sizeof(iwe));
1030 memset(&iwe, 0, sizeof(iwe));
1031 memset(&custom[0], 0, MAX_CUSTOM_LEN); 1105 memset(&custom[0], 0, MAX_CUSTOM_LEN);
1032 memcpy(custom, &(pAdapter->ScanTab.BssEntry[i].RsnIE.IE[0]), 1106 memcpy(custom,
1033 pAdapter->ScanTab.BssEntry[i].RsnIE.IELen); 1107 &(pAdapter->ScanTab.BssEntry[i].RsnIE.IE[0]),
1108 pAdapter->ScanTab.BssEntry[i].RsnIE.IELen);
1034 iwe.cmd = IWEVGENIE; 1109 iwe.cmd = IWEVGENIE;
1035 iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].RsnIE.IELen; 1110 iwe.u.data.length =
1036 current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom); 1111 pAdapter->ScanTab.BssEntry[i].RsnIE.IELen;
1112 current_ev =
1113 iwe_stream_add_point(info, current_ev, end_buf,
1114 &iwe, custom);
1037 if (current_ev == previous_ev) 1115 if (current_ev == previous_ev)
1038 return -E2BIG; 1116 return -E2BIG;
1039 } 1117 }
1040 } 1118 }
1041 1119
1042 data->length = current_ev - extra; 1120 data->length = current_ev - extra;
1043 pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE; 1121 pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
1044 DBGPRINT(RT_DEBUG_ERROR ,("===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\n",i , pAdapter->ScanTab.BssNr, data->length)); 1122 DBGPRINT(RT_DEBUG_ERROR,
1123 ("===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\n",
1124 i, pAdapter->ScanTab.BssNr, data->length));
1045 return 0; 1125 return 0;
1046} 1126}
1047 1127
1048int rt_ioctl_siwessid(struct net_device *dev, 1128int rt_ioctl_siwessid(struct net_device *dev,
1049 struct iw_request_info *info, 1129 struct iw_request_info *info,
1050 struct iw_point *data, char *essid) 1130 struct iw_point *data, char *essid)
1051{ 1131{
1052 PRTMP_ADAPTER pAdapter = NULL; 1132 PRTMP_ADAPTER pAdapter = NULL;
1053 1133
1054 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1134 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1055 1135
1056 //check if the interface is down 1136 //check if the interface is down
1057 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1137 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1058 { 1138 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1059 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1139 return -ENETDOWN;
1060 return -ENETDOWN; 1140 }
1061 }
1062 1141
1063 if (data->flags) 1142 if (data->flags) {
1064 { 1143 PSTRING pSsidString = NULL;
1065 PSTRING pSsidString = NULL;
1066 1144
1067 // Includes null character. 1145 // Includes null character.
1068 if (data->length > (IW_ESSID_MAX_SIZE + 1)) 1146 if (data->length > (IW_ESSID_MAX_SIZE + 1))
1069 return -E2BIG; 1147 return -E2BIG;
1070 1148
1071 pSsidString = kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG); 1149 pSsidString = kmalloc(MAX_LEN_OF_SSID + 1, MEM_ALLOC_FLAG);
1072 if (pSsidString) 1150 if (pSsidString) {
1073 { 1151 NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID + 1);
1074 NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);
1075 NdisMoveMemory(pSsidString, essid, data->length); 1152 NdisMoveMemory(pSsidString, essid, data->length);
1076 if (Set_SSID_Proc(pAdapter, pSsidString) == FALSE) 1153 if (Set_SSID_Proc(pAdapter, pSsidString) == FALSE)
1077 return -EINVAL; 1154 return -EINVAL;
1078 } 1155 } else
1079 else
1080 return -ENOMEM; 1156 return -ENOMEM;
1081 } 1157 } else {
1082 else
1083 {
1084 // ANY ssid 1158 // ANY ssid
1085 if (Set_SSID_Proc(pAdapter, "") == FALSE) 1159 if (Set_SSID_Proc(pAdapter, "") == FALSE)
1086 return -EINVAL; 1160 return -EINVAL;
1087 } 1161 }
1088 return 0; 1162 return 0;
1089} 1163}
1090 1164
1091int rt_ioctl_giwessid(struct net_device *dev, 1165int rt_ioctl_giwessid(struct net_device *dev,
1092 struct iw_request_info *info, 1166 struct iw_request_info *info,
1093 struct iw_point *data, char *essid) 1167 struct iw_point *data, char *essid)
1094{ 1168{
1095 PRTMP_ADAPTER pAdapter = NULL; 1169 PRTMP_ADAPTER pAdapter = NULL;
1096 1170
1097 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1171 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1098 1172
1099 data->flags = 1; 1173 data->flags = 1;
1100 if (MONITOR_ON(pAdapter)) 1174 if (MONITOR_ON(pAdapter)) {
1101 { 1175 data->length = 0;
1102 data->length = 0; 1176 return 0;
1103 return 0; 1177 }
1104 }
1105 1178
1106 if (OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) 1179 if (OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
1107 { 1180 DBGPRINT(RT_DEBUG_TRACE, ("MediaState is connected\n"));
1108 DBGPRINT(RT_DEBUG_TRACE ,("MediaState is connected\n"));
1109 data->length = pAdapter->CommonCfg.SsidLen; 1181 data->length = pAdapter->CommonCfg.SsidLen;
1110 memcpy(essid, pAdapter->CommonCfg.Ssid, pAdapter->CommonCfg.SsidLen); 1182 memcpy(essid, pAdapter->CommonCfg.Ssid,
1183 pAdapter->CommonCfg.SsidLen);
1111 } 1184 }
1112#ifdef RTMP_MAC_USB 1185#ifdef RTMP_MAC_USB
1113 // Add for RT2870 1186 // Add for RT2870
1114 else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) 1187 else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) {
1115 { 1188 data->length = pAdapter->CommonCfg.SsidLen;
1116 data->length = pAdapter->CommonCfg.SsidLen; 1189 memcpy(essid, pAdapter->CommonCfg.Ssid,
1117 memcpy(essid, pAdapter->CommonCfg.Ssid, pAdapter->CommonCfg.SsidLen); 1190 pAdapter->CommonCfg.SsidLen);
1118 } 1191 }
1119#endif // RTMP_MAC_USB // 1192#endif // RTMP_MAC_USB //
1120 else 1193 else { //the ANY ssid was specified
1121 {//the ANY ssid was specified 1194 data->length = 0;
1122 data->length = 0; 1195 DBGPRINT(RT_DEBUG_TRACE,
1123 DBGPRINT(RT_DEBUG_TRACE ,("MediaState is not connected, ess\n")); 1196 ("MediaState is not connected, ess\n"));
1124 } 1197 }
1125 1198
1126 return 0; 1199 return 0;
@@ -1128,19 +1201,18 @@ int rt_ioctl_giwessid(struct net_device *dev,
1128} 1201}
1129 1202
1130int rt_ioctl_siwnickn(struct net_device *dev, 1203int rt_ioctl_siwnickn(struct net_device *dev,
1131 struct iw_request_info *info, 1204 struct iw_request_info *info,
1132 struct iw_point *data, char *nickname) 1205 struct iw_point *data, char *nickname)
1133{ 1206{
1134 PRTMP_ADAPTER pAdapter = NULL; 1207 PRTMP_ADAPTER pAdapter = NULL;
1135 1208
1136 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1209 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1137 1210
1138 //check if the interface is down 1211 //check if the interface is down
1139 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1212 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1140 { 1213 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1141 DBGPRINT(RT_DEBUG_TRACE ,("INFO::Network is down!\n")); 1214 return -ENETDOWN;
1142 return -ENETDOWN; 1215 }
1143 }
1144 1216
1145 if (data->length > IW_ESSID_MAX_SIZE) 1217 if (data->length > IW_ESSID_MAX_SIZE)
1146 return -EINVAL; 1218 return -EINVAL;
@@ -1148,13 +1220,12 @@ int rt_ioctl_siwnickn(struct net_device *dev,
1148 memset(pAdapter->nickname, 0, IW_ESSID_MAX_SIZE + 1); 1220 memset(pAdapter->nickname, 0, IW_ESSID_MAX_SIZE + 1);
1149 memcpy(pAdapter->nickname, nickname, data->length); 1221 memcpy(pAdapter->nickname, nickname, data->length);
1150 1222
1151
1152 return 0; 1223 return 0;
1153} 1224}
1154 1225
1155int rt_ioctl_giwnickn(struct net_device *dev, 1226int rt_ioctl_giwnickn(struct net_device *dev,
1156 struct iw_request_info *info, 1227 struct iw_request_info *info,
1157 struct iw_point *data, char *nickname) 1228 struct iw_point *data, char *nickname)
1158{ 1229{
1159 PRTMP_ADAPTER pAdapter = NULL; 1230 PRTMP_ADAPTER pAdapter = NULL;
1160 1231
@@ -1163,34 +1234,33 @@ int rt_ioctl_giwnickn(struct net_device *dev,
1163 if (data->length > strlen((PSTRING) pAdapter->nickname) + 1) 1234 if (data->length > strlen((PSTRING) pAdapter->nickname) + 1)
1164 data->length = strlen((PSTRING) pAdapter->nickname) + 1; 1235 data->length = strlen((PSTRING) pAdapter->nickname) + 1;
1165 if (data->length > 0) { 1236 if (data->length > 0) {
1166 memcpy(nickname, pAdapter->nickname, data->length-1); 1237 memcpy(nickname, pAdapter->nickname, data->length - 1);
1167 nickname[data->length-1] = '\0'; 1238 nickname[data->length - 1] = '\0';
1168 } 1239 }
1169 return 0; 1240 return 0;
1170} 1241}
1171 1242
1172int rt_ioctl_siwrts(struct net_device *dev, 1243int rt_ioctl_siwrts(struct net_device *dev,
1173 struct iw_request_info *info, 1244 struct iw_request_info *info,
1174 struct iw_param *rts, char *extra) 1245 struct iw_param *rts, char *extra)
1175{ 1246{
1176 PRTMP_ADAPTER pAdapter = NULL; 1247 PRTMP_ADAPTER pAdapter = NULL;
1177 u16 val; 1248 u16 val;
1178 1249
1179 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1250 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1180 1251
1181 //check if the interface is down 1252 //check if the interface is down
1182 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1253 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1183 { 1254 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1184 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1255 return -ENETDOWN;
1185 return -ENETDOWN; 1256 }
1186 }
1187 1257
1188 if (rts->disabled) 1258 if (rts->disabled)
1189 val = MAX_RTS_THRESHOLD; 1259 val = MAX_RTS_THRESHOLD;
1190 else if (rts->value < 0 || rts->value > MAX_RTS_THRESHOLD) 1260 else if (rts->value < 0 || rts->value > MAX_RTS_THRESHOLD)
1191 return -EINVAL; 1261 return -EINVAL;
1192 else if (rts->value == 0) 1262 else if (rts->value == 0)
1193 val = MAX_RTS_THRESHOLD; 1263 val = MAX_RTS_THRESHOLD;
1194 else 1264 else
1195 val = rts->value; 1265 val = rts->value;
1196 1266
@@ -1201,19 +1271,18 @@ int rt_ioctl_siwrts(struct net_device *dev,
1201} 1271}
1202 1272
1203int rt_ioctl_giwrts(struct net_device *dev, 1273int rt_ioctl_giwrts(struct net_device *dev,
1204 struct iw_request_info *info, 1274 struct iw_request_info *info,
1205 struct iw_param *rts, char *extra) 1275 struct iw_param *rts, char *extra)
1206{ 1276{
1207 PRTMP_ADAPTER pAdapter = NULL; 1277 PRTMP_ADAPTER pAdapter = NULL;
1208 1278
1209 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1279 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1210 1280
1211 //check if the interface is down 1281 //check if the interface is down
1212 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1282 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1213 { 1283 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1214 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1284 return -ENETDOWN;
1215 return -ENETDOWN; 1285 }
1216 }
1217 1286
1218 rts->value = pAdapter->CommonCfg.RtsThreshold; 1287 rts->value = pAdapter->CommonCfg.RtsThreshold;
1219 rts->disabled = (rts->value == MAX_RTS_THRESHOLD); 1288 rts->disabled = (rts->value == MAX_RTS_THRESHOLD);
@@ -1223,8 +1292,8 @@ int rt_ioctl_giwrts(struct net_device *dev,
1223} 1292}
1224 1293
1225int rt_ioctl_siwfrag(struct net_device *dev, 1294int rt_ioctl_siwfrag(struct net_device *dev,
1226 struct iw_request_info *info, 1295 struct iw_request_info *info,
1227 struct iw_param *frag, char *extra) 1296 struct iw_param *frag, char *extra)
1228{ 1297{
1229 PRTMP_ADAPTER pAdapter = NULL; 1298 PRTMP_ADAPTER pAdapter = NULL;
1230 u16 val; 1299 u16 val;
@@ -1232,18 +1301,18 @@ int rt_ioctl_siwfrag(struct net_device *dev,
1232 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1301 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1233 1302
1234 //check if the interface is down 1303 //check if the interface is down
1235 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1304 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1236 { 1305 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1237 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1306 return -ENETDOWN;
1238 return -ENETDOWN; 1307 }
1239 }
1240 1308
1241 if (frag->disabled) 1309 if (frag->disabled)
1242 val = MAX_FRAG_THRESHOLD; 1310 val = MAX_FRAG_THRESHOLD;
1243 else if (frag->value >= MIN_FRAG_THRESHOLD && frag->value <= MAX_FRAG_THRESHOLD) 1311 else if (frag->value >= MIN_FRAG_THRESHOLD
1244 val = __cpu_to_le16(frag->value & ~0x1); /* even numbers only */ 1312 && frag->value <= MAX_FRAG_THRESHOLD)
1313 val = __cpu_to_le16(frag->value & ~0x1); /* even numbers only */
1245 else if (frag->value == 0) 1314 else if (frag->value == 0)
1246 val = MAX_FRAG_THRESHOLD; 1315 val = MAX_FRAG_THRESHOLD;
1247 else 1316 else
1248 return -EINVAL; 1317 return -EINVAL;
1249 1318
@@ -1252,19 +1321,18 @@ int rt_ioctl_siwfrag(struct net_device *dev,
1252} 1321}
1253 1322
1254int rt_ioctl_giwfrag(struct net_device *dev, 1323int rt_ioctl_giwfrag(struct net_device *dev,
1255 struct iw_request_info *info, 1324 struct iw_request_info *info,
1256 struct iw_param *frag, char *extra) 1325 struct iw_param *frag, char *extra)
1257{ 1326{
1258 PRTMP_ADAPTER pAdapter = NULL; 1327 PRTMP_ADAPTER pAdapter = NULL;
1259 1328
1260 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1329 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1261 1330
1262 //check if the interface is down 1331 //check if the interface is down
1263 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1332 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1264 { 1333 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1265 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1334 return -ENETDOWN;
1266 return -ENETDOWN; 1335 }
1267 }
1268 1336
1269 frag->value = pAdapter->CommonCfg.FragmentThreshold; 1337 frag->value = pAdapter->CommonCfg.FragmentThreshold;
1270 frag->disabled = (frag->value == MAX_FRAG_THRESHOLD); 1338 frag->disabled = (frag->value == MAX_FRAG_THRESHOLD);
@@ -1276,113 +1344,111 @@ int rt_ioctl_giwfrag(struct net_device *dev,
1276#define MAX_WEP_KEY_SIZE 13 1344#define MAX_WEP_KEY_SIZE 13
1277#define MIN_WEP_KEY_SIZE 5 1345#define MIN_WEP_KEY_SIZE 5
1278int rt_ioctl_siwencode(struct net_device *dev, 1346int rt_ioctl_siwencode(struct net_device *dev,
1279 struct iw_request_info *info, 1347 struct iw_request_info *info,
1280 struct iw_point *erq, char *extra) 1348 struct iw_point *erq, char *extra)
1281{ 1349{
1282 PRTMP_ADAPTER pAdapter = NULL; 1350 PRTMP_ADAPTER pAdapter = NULL;
1283 1351
1284 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1352 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1285 1353
1286 //check if the interface is down 1354 //check if the interface is down
1287 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1355 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1288 { 1356 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1289 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1357 return -ENETDOWN;
1290 return -ENETDOWN; 1358 }
1291 } 1359
1292 1360 if ((erq->length == 0) && (erq->flags & IW_ENCODE_DISABLED)) {
1293 if ((erq->length == 0) &&
1294 (erq->flags & IW_ENCODE_DISABLED))
1295 {
1296 pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled; 1361 pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
1297 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled; 1362 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
1298 pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled; 1363 pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1299 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1364 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
1300 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; 1365 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1301 goto done; 1366 goto done;
1302 } 1367 } else if (erq->flags & IW_ENCODE_RESTRICTED
1303 else if (erq->flags & IW_ENCODE_RESTRICTED || erq->flags & IW_ENCODE_OPEN) 1368 || erq->flags & IW_ENCODE_OPEN) {
1304 { 1369 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1305 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1306 STA_PORT_SECURED(pAdapter); 1370 STA_PORT_SECURED(pAdapter);
1307 pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled; 1371 pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
1308 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled; 1372 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
1309 pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled; 1373 pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1310 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1374 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
1311 if (erq->flags & IW_ENCODE_RESTRICTED) 1375 if (erq->flags & IW_ENCODE_RESTRICTED)
1312 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared; 1376 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1313 else 1377 else
1314 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; 1378 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1315 } 1379 }
1316 1380
1317 if (erq->length > 0) 1381 if (erq->length > 0) {
1318 {
1319 int keyIdx = (erq->flags & IW_ENCODE_INDEX) - 1; 1382 int keyIdx = (erq->flags & IW_ENCODE_INDEX) - 1;
1320 /* Check the size of the key */ 1383 /* Check the size of the key */
1321 if (erq->length > MAX_WEP_KEY_SIZE) 1384 if (erq->length > MAX_WEP_KEY_SIZE) {
1322 {
1323 return -EINVAL; 1385 return -EINVAL;
1324 } 1386 }
1325 /* Check key index */ 1387 /* Check key index */
1326 if ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS)) 1388 if ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS)) {
1327 { 1389 DBGPRINT(RT_DEBUG_TRACE,
1328 DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::Wrong keyIdx=%d! Using default key instead (%d)\n", 1390 ("==>rt_ioctl_siwencode::Wrong keyIdx=%d! Using default key instead (%d)\n",
1329 keyIdx, pAdapter->StaCfg.DefaultKeyId)); 1391 keyIdx, pAdapter->StaCfg.DefaultKeyId));
1330 1392
1331 //Using default key 1393 //Using default key
1332 keyIdx = pAdapter->StaCfg.DefaultKeyId; 1394 keyIdx = pAdapter->StaCfg.DefaultKeyId;
1333 } 1395 } else
1334 else
1335 pAdapter->StaCfg.DefaultKeyId = keyIdx; 1396 pAdapter->StaCfg.DefaultKeyId = keyIdx;
1336 1397
1337 NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16); 1398 NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16);
1338 1399
1339 if (erq->length == MAX_WEP_KEY_SIZE) 1400 if (erq->length == MAX_WEP_KEY_SIZE) {
1340 { 1401 pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
1341 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MAX_WEP_KEY_SIZE; 1402 MAX_WEP_KEY_SIZE;
1342 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP128; 1403 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
1343 } 1404 CIPHER_WEP128;
1344 else if (erq->length == MIN_WEP_KEY_SIZE) 1405 } else if (erq->length == MIN_WEP_KEY_SIZE) {
1345 { 1406 pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
1346 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MIN_WEP_KEY_SIZE; 1407 MIN_WEP_KEY_SIZE;
1347 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP64; 1408 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
1348 } 1409 CIPHER_WEP64;
1349 else 1410 } else
1350 /* Disable the key */ 1411 /* Disable the key */
1351 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0; 1412 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0;
1352 1413
1353 /* Check if the key is not marked as invalid */ 1414 /* Check if the key is not marked as invalid */
1354 if(!(erq->flags & IW_ENCODE_NOKEY)) 1415 if (!(erq->flags & IW_ENCODE_NOKEY)) {
1355 {
1356 /* Copy the key in the driver */ 1416 /* Copy the key in the driver */
1357 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, extra, erq->length); 1417 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,
1358 } 1418 extra, erq->length);
1359 } 1419 }
1360 else 1420 } else {
1361 {
1362 /* Do we want to just set the transmit key index ? */ 1421 /* Do we want to just set the transmit key index ? */
1363 int index = (erq->flags & IW_ENCODE_INDEX) - 1; 1422 int index = (erq->flags & IW_ENCODE_INDEX) - 1;
1364 if ((index >= 0) && (index < 4)) 1423 if ((index >= 0) && (index < 4)) {
1365 {
1366 pAdapter->StaCfg.DefaultKeyId = index; 1424 pAdapter->StaCfg.DefaultKeyId = index;
1367 } 1425 } else
1368 else
1369 /* Don't complain if only change the mode */ 1426 /* Don't complain if only change the mode */
1370 if (!(erq->flags & IW_ENCODE_MODE)) 1427 if (!(erq->flags & IW_ENCODE_MODE))
1371 return -EINVAL; 1428 return -EINVAL;
1372 } 1429 }
1373 1430
1374done: 1431done:
1375 DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::erq->flags=%x\n",erq->flags)); 1432 DBGPRINT(RT_DEBUG_TRACE,
1376 DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::AuthMode=%x\n",pAdapter->StaCfg.AuthMode)); 1433 ("==>rt_ioctl_siwencode::erq->flags=%x\n", erq->flags));
1377 DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::DefaultKeyId=%x, KeyLen = %d\n",pAdapter->StaCfg.DefaultKeyId , pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen)); 1434 DBGPRINT(RT_DEBUG_TRACE,
1378 DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::WepStatus=%x\n",pAdapter->StaCfg.WepStatus)); 1435 ("==>rt_ioctl_siwencode::AuthMode=%x\n",
1436 pAdapter->StaCfg.AuthMode));
1437 DBGPRINT(RT_DEBUG_TRACE,
1438 ("==>rt_ioctl_siwencode::DefaultKeyId=%x, KeyLen = %d\n",
1439 pAdapter->StaCfg.DefaultKeyId,
1440 pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].
1441 KeyLen));
1442 DBGPRINT(RT_DEBUG_TRACE,
1443 ("==>rt_ioctl_siwencode::WepStatus=%x\n",
1444 pAdapter->StaCfg.WepStatus));
1379 return 0; 1445 return 0;
1380} 1446}
1381 1447
1382int 1448int
1383rt_ioctl_giwencode(struct net_device *dev, 1449rt_ioctl_giwencode(struct net_device *dev,
1384 struct iw_request_info *info, 1450 struct iw_request_info *info,
1385 struct iw_point *erq, char *key) 1451 struct iw_point *erq, char *key)
1386{ 1452{
1387 int kid; 1453 int kid;
1388 PRTMP_ADAPTER pAdapter = NULL; 1454 PRTMP_ADAPTER pAdapter = NULL;
@@ -1390,49 +1456,49 @@ rt_ioctl_giwencode(struct net_device *dev,
1390 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1456 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1391 1457
1392 //check if the interface is down 1458 //check if the interface is down
1393 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1459 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1394 { 1460 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1395 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1461 return -ENETDOWN;
1396 return -ENETDOWN;
1397 } 1462 }
1398 1463
1399 kid = erq->flags & IW_ENCODE_INDEX; 1464 kid = erq->flags & IW_ENCODE_INDEX;
1400 DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_giwencode %d\n", erq->flags & IW_ENCODE_INDEX)); 1465 DBGPRINT(RT_DEBUG_TRACE,
1466 ("===>rt_ioctl_giwencode %d\n", erq->flags & IW_ENCODE_INDEX));
1401 1467
1402 if (pAdapter->StaCfg.WepStatus == Ndis802_11WEPDisabled) 1468 if (pAdapter->StaCfg.WepStatus == Ndis802_11WEPDisabled) {
1403 {
1404 erq->length = 0; 1469 erq->length = 0;
1405 erq->flags = IW_ENCODE_DISABLED; 1470 erq->flags = IW_ENCODE_DISABLED;
1406 } 1471 } else if ((kid > 0) && (kid <= 4)) {
1407 else if ((kid > 0) && (kid <=4))
1408 {
1409 // copy wep key 1472 // copy wep key
1410 erq->flags = kid ; /* NB: base 1 */ 1473 erq->flags = kid; /* NB: base 1 */
1411 if (erq->length > pAdapter->SharedKey[BSS0][kid-1].KeyLen) 1474 if (erq->length > pAdapter->SharedKey[BSS0][kid - 1].KeyLen)
1412 erq->length = pAdapter->SharedKey[BSS0][kid-1].KeyLen; 1475 erq->length = pAdapter->SharedKey[BSS0][kid - 1].KeyLen;
1413 memcpy(key, pAdapter->SharedKey[BSS0][kid-1].Key, erq->length); 1476 memcpy(key, pAdapter->SharedKey[BSS0][kid - 1].Key,
1477 erq->length);
1414 //if ((kid == pAdapter->PortCfg.DefaultKeyId)) 1478 //if ((kid == pAdapter->PortCfg.DefaultKeyId))
1415 //erq->flags |= IW_ENCODE_ENABLED; /* XXX */ 1479 //erq->flags |= IW_ENCODE_ENABLED; /* XXX */
1416 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) 1480 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared)
1417 erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */ 1481 erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */
1418 else 1482 else
1419 erq->flags |= IW_ENCODE_OPEN; /* XXX */ 1483 erq->flags |= IW_ENCODE_OPEN; /* XXX */
1420 1484
1421 } 1485 } else if (kid == 0) {
1422 else if (kid == 0)
1423 {
1424 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) 1486 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared)
1425 erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */ 1487 erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */
1426 else 1488 else
1427 erq->flags |= IW_ENCODE_OPEN; /* XXX */ 1489 erq->flags |= IW_ENCODE_OPEN; /* XXX */
1428 erq->length = pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen; 1490 erq->length =
1429 memcpy(key, pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].Key, erq->length); 1491 pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].
1492 KeyLen;
1493 memcpy(key,
1494 pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].
1495 Key, erq->length);
1430 // copy default key ID 1496 // copy default key ID
1431 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) 1497 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared)
1432 erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */ 1498 erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */
1433 else 1499 else
1434 erq->flags |= IW_ENCODE_OPEN; /* XXX */ 1500 erq->flags |= IW_ENCODE_OPEN; /* XXX */
1435 erq->flags = pAdapter->StaCfg.DefaultKeyId + 1; /* NB: base 1 */ 1501 erq->flags = pAdapter->StaCfg.DefaultKeyId + 1; /* NB: base 1 */
1436 erq->flags |= IW_ENCODE_ENABLED; /* XXX */ 1502 erq->flags |= IW_ENCODE_ENABLED; /* XXX */
1437 } 1503 }
1438 1504
@@ -1440,63 +1506,71 @@ rt_ioctl_giwencode(struct net_device *dev,
1440 1506
1441} 1507}
1442 1508
1443void getBaInfo( 1509void getBaInfo(IN PRTMP_ADAPTER pAd, IN PSTRING pOutBuf)
1444 IN PRTMP_ADAPTER pAd,
1445 IN PSTRING pOutBuf)
1446{ 1510{
1447 INT i, j; 1511 INT i, j;
1448 BA_ORI_ENTRY *pOriBAEntry; 1512 BA_ORI_ENTRY *pOriBAEntry;
1449 BA_REC_ENTRY *pRecBAEntry; 1513 BA_REC_ENTRY *pRecBAEntry;
1450 1514
1451 for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) 1515 for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) {
1452 {
1453 PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; 1516 PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
1454 if (((pEntry->ValidAsCLI || pEntry->ValidAsApCli) && (pEntry->Sst == SST_ASSOC)) 1517 if (((pEntry->ValidAsCLI || pEntry->ValidAsApCli)
1455 || (pEntry->ValidAsWDS) || (pEntry->ValidAsMesh)) 1518 && (pEntry->Sst == SST_ASSOC))
1456 { 1519 || (pEntry->ValidAsWDS) || (pEntry->ValidAsMesh)) {
1457 sprintf(pOutBuf + strlen(pOutBuf), "\n%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (AP) -\n", 1520 sprintf(pOutBuf + strlen(pOutBuf),
1458 pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], 1521 "\n%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (AP) -\n",
1459 pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid); 1522 pEntry->Addr[0], pEntry->Addr[1],
1523 pEntry->Addr[2], pEntry->Addr[3],
1524 pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid);
1460 1525
1461 sprintf(pOutBuf, "%s[Recipient]\n", pOutBuf); 1526 sprintf(pOutBuf, "%s[Recipient]\n", pOutBuf);
1462 for (j=0; j < NUM_OF_TID; j++) 1527 for (j = 0; j < NUM_OF_TID; j++) {
1463 { 1528 if (pEntry->BARecWcidArray[j] != 0) {
1464 if (pEntry->BARecWcidArray[j] != 0) 1529 pRecBAEntry =
1465 { 1530 &pAd->BATable.BARecEntry[pEntry->
1466 pRecBAEntry =&pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]]; 1531 BARecWcidArray
1467 sprintf(pOutBuf + strlen(pOutBuf), "TID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\n", j, pRecBAEntry->BAWinSize, pRecBAEntry->LastIndSeq, pRecBAEntry->list.qlen); 1532 [j]];
1533 sprintf(pOutBuf + strlen(pOutBuf),
1534 "TID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\n",
1535 j, pRecBAEntry->BAWinSize,
1536 pRecBAEntry->LastIndSeq,
1537 pRecBAEntry->list.qlen);
1468 } 1538 }
1469 } 1539 }
1470 sprintf(pOutBuf, "%s\n", pOutBuf); 1540 sprintf(pOutBuf, "%s\n", pOutBuf);
1471 1541
1472 sprintf(pOutBuf, "%s[Originator]\n", pOutBuf); 1542 sprintf(pOutBuf, "%s[Originator]\n", pOutBuf);
1473 for (j=0; j < NUM_OF_TID; j++) 1543 for (j = 0; j < NUM_OF_TID; j++) {
1474 { 1544 if (pEntry->BAOriWcidArray[j] != 0) {
1475 if (pEntry->BAOriWcidArray[j] != 0) 1545 pOriBAEntry =
1476 { 1546 &pAd->BATable.BAOriEntry[pEntry->
1477 pOriBAEntry =&pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]]; 1547 BAOriWcidArray
1478 sprintf(pOutBuf + strlen(pOutBuf), "TID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\n", j, pOriBAEntry->BAWinSize, pOriBAEntry->Sequence, pEntry->TxSeq[j]); 1548 [j]];
1549 sprintf(pOutBuf + strlen(pOutBuf),
1550 "TID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\n",
1551 j, pOriBAEntry->BAWinSize,
1552 pOriBAEntry->Sequence,
1553 pEntry->TxSeq[j]);
1479 } 1554 }
1480 } 1555 }
1481 sprintf(pOutBuf, "%s\n\n", pOutBuf); 1556 sprintf(pOutBuf, "%s\n\n", pOutBuf);
1482 } 1557 }
1483 if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) 1558 if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30))
1484 break; 1559 break;
1485 } 1560 }
1486 1561
1487 return; 1562 return;
1488} 1563}
1489 1564
1490int rt_ioctl_siwmlme(struct net_device *dev, 1565int rt_ioctl_siwmlme(struct net_device *dev,
1491 struct iw_request_info *info, 1566 struct iw_request_info *info,
1492 union iwreq_data *wrqu, 1567 union iwreq_data *wrqu, char *extra)
1493 char *extra)
1494{ 1568{
1495 PRTMP_ADAPTER pAd = NULL; 1569 PRTMP_ADAPTER pAd = NULL;
1496 struct iw_mlme *pMlme = (struct iw_mlme *)wrqu->data.pointer; 1570 struct iw_mlme *pMlme = (struct iw_mlme *)wrqu->data.pointer;
1497 MLME_QUEUE_ELEM MsgElem; 1571 MLME_QUEUE_ELEM MsgElem;
1498 MLME_DISASSOC_REQ_STRUCT DisAssocReq; 1572 MLME_DISASSOC_REQ_STRUCT DisAssocReq;
1499 MLME_DEAUTH_REQ_STRUCT DeAuthReq; 1573 MLME_DEAUTH_REQ_STRUCT DeAuthReq;
1500 1574
1501 GET_PAD_FROM_NET_DEV(pAd, dev); 1575 GET_PAD_FROM_NET_DEV(pAd, dev);
1502 1576
@@ -1505,405 +1579,444 @@ int rt_ioctl_siwmlme(struct net_device *dev,
1505 if (pMlme == NULL) 1579 if (pMlme == NULL)
1506 return -EINVAL; 1580 return -EINVAL;
1507 1581
1508 switch(pMlme->cmd) 1582 switch (pMlme->cmd) {
1509 {
1510#ifdef IW_MLME_DEAUTH 1583#ifdef IW_MLME_DEAUTH
1511 case IW_MLME_DEAUTH: 1584 case IW_MLME_DEAUTH:
1512 DBGPRINT(RT_DEBUG_TRACE, ("====> %s - IW_MLME_DEAUTH\n", __func__)); 1585 DBGPRINT(RT_DEBUG_TRACE,
1513 COPY_MAC_ADDR(DeAuthReq.Addr, pAd->CommonCfg.Bssid); 1586 ("====> %s - IW_MLME_DEAUTH\n", __func__));
1514 DeAuthReq.Reason = pMlme->reason_code; 1587 COPY_MAC_ADDR(DeAuthReq.Addr, pAd->CommonCfg.Bssid);
1515 MsgElem.MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT); 1588 DeAuthReq.Reason = pMlme->reason_code;
1516 NdisMoveMemory(MsgElem.Msg, &DeAuthReq, sizeof(MLME_DEAUTH_REQ_STRUCT)); 1589 MsgElem.MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT);
1517 MlmeDeauthReqAction(pAd, &MsgElem); 1590 NdisMoveMemory(MsgElem.Msg, &DeAuthReq,
1518 if (INFRA_ON(pAd)) 1591 sizeof(MLME_DEAUTH_REQ_STRUCT));
1519 { 1592 MlmeDeauthReqAction(pAd, &MsgElem);
1520 LinkDown(pAd, FALSE); 1593 if (INFRA_ON(pAd)) {
1521 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1594 LinkDown(pAd, FALSE);
1522 } 1595 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1523 break; 1596 }
1597 break;
1524#endif // IW_MLME_DEAUTH // 1598#endif // IW_MLME_DEAUTH //
1525#ifdef IW_MLME_DISASSOC 1599#ifdef IW_MLME_DISASSOC
1526 case IW_MLME_DISASSOC: 1600 case IW_MLME_DISASSOC:
1527 DBGPRINT(RT_DEBUG_TRACE, ("====> %s - IW_MLME_DISASSOC\n", __func__)); 1601 DBGPRINT(RT_DEBUG_TRACE,
1528 COPY_MAC_ADDR(DisAssocReq.Addr, pAd->CommonCfg.Bssid); 1602 ("====> %s - IW_MLME_DISASSOC\n", __func__));
1529 DisAssocReq.Reason = pMlme->reason_code; 1603 COPY_MAC_ADDR(DisAssocReq.Addr, pAd->CommonCfg.Bssid);
1530 1604 DisAssocReq.Reason = pMlme->reason_code;
1531 MsgElem.Machine = ASSOC_STATE_MACHINE; 1605
1532 MsgElem.MsgType = MT2_MLME_DISASSOC_REQ; 1606 MsgElem.Machine = ASSOC_STATE_MACHINE;
1533 MsgElem.MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); 1607 MsgElem.MsgType = MT2_MLME_DISASSOC_REQ;
1534 NdisMoveMemory(MsgElem.Msg, &DisAssocReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); 1608 MsgElem.MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);
1535 1609 NdisMoveMemory(MsgElem.Msg, &DisAssocReq,
1536 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; 1610 sizeof(MLME_DISASSOC_REQ_STRUCT));
1537 MlmeDisassocReqAction(pAd, &MsgElem); 1611
1538 break; 1612 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;
1613 MlmeDisassocReqAction(pAd, &MsgElem);
1614 break;
1539#endif // IW_MLME_DISASSOC // 1615#endif // IW_MLME_DISASSOC //
1540 default: 1616 default:
1541 DBGPRINT(RT_DEBUG_TRACE, ("====> %s - Unknow Command\n", __func__)); 1617 DBGPRINT(RT_DEBUG_TRACE,
1542 break; 1618 ("====> %s - Unknow Command\n", __func__));
1619 break;
1543 } 1620 }
1544 1621
1545 return 0; 1622 return 0;
1546} 1623}
1547 1624
1548int rt_ioctl_siwauth(struct net_device *dev, 1625int rt_ioctl_siwauth(struct net_device *dev,
1549 struct iw_request_info *info, 1626 struct iw_request_info *info,
1550 union iwreq_data *wrqu, char *extra) 1627 union iwreq_data *wrqu, char *extra)
1551{ 1628{
1552 PRTMP_ADAPTER pAdapter = NULL; 1629 PRTMP_ADAPTER pAdapter = NULL;
1553 struct iw_param *param = &wrqu->param; 1630 struct iw_param *param = &wrqu->param;
1554 1631
1555 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1632 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1556 1633
1557 //check if the interface is down 1634 //check if the interface is down
1558 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1635 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1559 { 1636 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1560 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1637 return -ENETDOWN;
1561 return -ENETDOWN;
1562 } 1638 }
1563 switch (param->flags & IW_AUTH_INDEX) { 1639 switch (param->flags & IW_AUTH_INDEX) {
1564 case IW_AUTH_WPA_VERSION: 1640 case IW_AUTH_WPA_VERSION:
1565 if (param->value == IW_AUTH_WPA_VERSION_WPA) 1641 if (param->value == IW_AUTH_WPA_VERSION_WPA) {
1566 { 1642 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1567 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK; 1643 if (pAdapter->StaCfg.BssType == BSS_ADHOC)
1568 if (pAdapter->StaCfg.BssType == BSS_ADHOC) 1644 pAdapter->StaCfg.AuthMode =
1569 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPANone; 1645 Ndis802_11AuthModeWPANone;
1570 } 1646 } else if (param->value == IW_AUTH_WPA_VERSION_WPA2)
1571 else if (param->value == IW_AUTH_WPA_VERSION_WPA2) 1647 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1572 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK; 1648
1573 1649 DBGPRINT(RT_DEBUG_TRACE,
1574 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n", __func__, param->value)); 1650 ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n",
1575 break; 1651 __func__, param->value));
1576 case IW_AUTH_CIPHER_PAIRWISE: 1652 break;
1577 if (param->value == IW_AUTH_CIPHER_NONE) 1653 case IW_AUTH_CIPHER_PAIRWISE:
1578 { 1654 if (param->value == IW_AUTH_CIPHER_NONE) {
1579 pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled; 1655 pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1580 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1656 pAdapter->StaCfg.OrigWepStatus =
1581 pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled; 1657 pAdapter->StaCfg.WepStatus;
1582 } 1658 pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
1583 else if (param->value == IW_AUTH_CIPHER_WEP40 || 1659 } else if (param->value == IW_AUTH_CIPHER_WEP40 ||
1584 param->value == IW_AUTH_CIPHER_WEP104) 1660 param->value == IW_AUTH_CIPHER_WEP104) {
1585 { 1661 pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1586 pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled; 1662 pAdapter->StaCfg.OrigWepStatus =
1587 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1663 pAdapter->StaCfg.WepStatus;
1588 pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled; 1664 pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
1589 pAdapter->StaCfg.IEEE8021X = FALSE; 1665 pAdapter->StaCfg.IEEE8021X = FALSE;
1590 } 1666 } else if (param->value == IW_AUTH_CIPHER_TKIP) {
1591 else if (param->value == IW_AUTH_CIPHER_TKIP) 1667 pAdapter->StaCfg.WepStatus =
1592 { 1668 Ndis802_11Encryption2Enabled;
1593 pAdapter->StaCfg.WepStatus = Ndis802_11Encryption2Enabled; 1669 pAdapter->StaCfg.OrigWepStatus =
1594 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1670 pAdapter->StaCfg.WepStatus;
1595 pAdapter->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; 1671 pAdapter->StaCfg.PairCipher =
1596 } 1672 Ndis802_11Encryption2Enabled;
1597 else if (param->value == IW_AUTH_CIPHER_CCMP) 1673 } else if (param->value == IW_AUTH_CIPHER_CCMP) {
1598 { 1674 pAdapter->StaCfg.WepStatus =
1599 pAdapter->StaCfg.WepStatus = Ndis802_11Encryption3Enabled; 1675 Ndis802_11Encryption3Enabled;
1600 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1676 pAdapter->StaCfg.OrigWepStatus =
1601 pAdapter->StaCfg.PairCipher = Ndis802_11Encryption3Enabled; 1677 pAdapter->StaCfg.WepStatus;
1602 } 1678 pAdapter->StaCfg.PairCipher =
1603 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_CIPHER_PAIRWISE - param->value = %d!\n", __func__, param->value)); 1679 Ndis802_11Encryption3Enabled;
1604 break; 1680 }
1605 case IW_AUTH_CIPHER_GROUP: 1681 DBGPRINT(RT_DEBUG_TRACE,
1606 if (param->value == IW_AUTH_CIPHER_NONE) 1682 ("%s::IW_AUTH_CIPHER_PAIRWISE - param->value = %d!\n",
1607 { 1683 __func__, param->value));
1608 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled; 1684 break;
1609 } 1685 case IW_AUTH_CIPHER_GROUP:
1610 else if (param->value == IW_AUTH_CIPHER_WEP40 || 1686 if (param->value == IW_AUTH_CIPHER_NONE) {
1611 param->value == IW_AUTH_CIPHER_WEP104) 1687 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
1612 { 1688 } else if (param->value == IW_AUTH_CIPHER_WEP40 ||
1613 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled; 1689 param->value == IW_AUTH_CIPHER_WEP104) {
1614 } 1690 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
1615 else if (param->value == IW_AUTH_CIPHER_TKIP) 1691 } else if (param->value == IW_AUTH_CIPHER_TKIP) {
1616 { 1692 pAdapter->StaCfg.GroupCipher =
1617 pAdapter->StaCfg.GroupCipher = Ndis802_11Encryption2Enabled; 1693 Ndis802_11Encryption2Enabled;
1618 } 1694 } else if (param->value == IW_AUTH_CIPHER_CCMP) {
1619 else if (param->value == IW_AUTH_CIPHER_CCMP) 1695 pAdapter->StaCfg.GroupCipher =
1620 { 1696 Ndis802_11Encryption3Enabled;
1621 pAdapter->StaCfg.GroupCipher = Ndis802_11Encryption3Enabled; 1697 }
1622 } 1698 DBGPRINT(RT_DEBUG_TRACE,
1623 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_CIPHER_GROUP - param->value = %d!\n", __func__, param->value)); 1699 ("%s::IW_AUTH_CIPHER_GROUP - param->value = %d!\n",
1624 break; 1700 __func__, param->value));
1625 case IW_AUTH_KEY_MGMT: 1701 break;
1626 if (param->value == IW_AUTH_KEY_MGMT_802_1X) 1702 case IW_AUTH_KEY_MGMT:
1627 { 1703 if (param->value == IW_AUTH_KEY_MGMT_802_1X) {
1628 if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) 1704 if (pAdapter->StaCfg.AuthMode ==
1629 { 1705 Ndis802_11AuthModeWPAPSK) {
1630 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA; 1706 pAdapter->StaCfg.AuthMode =
1631 pAdapter->StaCfg.IEEE8021X = FALSE; 1707 Ndis802_11AuthModeWPA;
1632 } 1708 pAdapter->StaCfg.IEEE8021X = FALSE;
1633 else if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) 1709 } else if (pAdapter->StaCfg.AuthMode ==
1634 { 1710 Ndis802_11AuthModeWPA2PSK) {
1635 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2; 1711 pAdapter->StaCfg.AuthMode =
1636 pAdapter->StaCfg.IEEE8021X = FALSE; 1712 Ndis802_11AuthModeWPA2;
1637 } 1713 pAdapter->StaCfg.IEEE8021X = FALSE;
1638 else 1714 } else
1639 // WEP 1x 1715 // WEP 1x
1640 pAdapter->StaCfg.IEEE8021X = TRUE; 1716 pAdapter->StaCfg.IEEE8021X = TRUE;
1641 } 1717 } else if (param->value == 0) {
1642 else if (param->value == 0) 1718 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1643 { 1719 STA_PORT_SECURED(pAdapter);
1644 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 1720 }
1645 STA_PORT_SECURED(pAdapter); 1721 DBGPRINT(RT_DEBUG_TRACE,
1646 } 1722 ("%s::IW_AUTH_KEY_MGMT - param->value = %d!\n",
1647 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_KEY_MGMT - param->value = %d!\n", __func__, param->value)); 1723 __func__, param->value));
1648 break; 1724 break;
1649 case IW_AUTH_RX_UNENCRYPTED_EAPOL: 1725 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
1650 break; 1726 break;
1651 case IW_AUTH_PRIVACY_INVOKED: 1727 case IW_AUTH_PRIVACY_INVOKED:
1652 /*if (param->value == 0) 1728 /*if (param->value == 0)
1653 { 1729 {
1654 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; 1730 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1655 pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled; 1731 pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1656 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; 1732 pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
1657 pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled; 1733 pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
1658 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled; 1734 pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
1659 }*/ 1735 } */
1660 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_PRIVACY_INVOKED - param->value = %d!\n", __func__, param->value)); 1736 DBGPRINT(RT_DEBUG_TRACE,
1661 break; 1737 ("%s::IW_AUTH_PRIVACY_INVOKED - param->value = %d!\n",
1662 case IW_AUTH_DROP_UNENCRYPTED: 1738 __func__, param->value));
1663 if (param->value != 0) 1739 break;
1664 pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; 1740 case IW_AUTH_DROP_UNENCRYPTED:
1665 else 1741 if (param->value != 0)
1666 { 1742 pAdapter->StaCfg.PortSecured =
1667 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 1743 WPA_802_1X_PORT_NOT_SECURED;
1668 STA_PORT_SECURED(pAdapter); 1744 else {
1669 } 1745 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1670 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n", __func__, param->value)); 1746 STA_PORT_SECURED(pAdapter);
1671 break; 1747 }
1672 case IW_AUTH_80211_AUTH_ALG: 1748 DBGPRINT(RT_DEBUG_TRACE,
1673 if (param->value & IW_AUTH_ALG_SHARED_KEY) 1749 ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n",
1674 { 1750 __func__, param->value));
1675 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared; 1751 break;
1676 } 1752 case IW_AUTH_80211_AUTH_ALG:
1677 else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) 1753 if (param->value & IW_AUTH_ALG_SHARED_KEY) {
1678 { 1754 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1679 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; 1755 } else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
1680 } 1756 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1681 else 1757 } else
1682 return -EINVAL; 1758 return -EINVAL;
1683 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_80211_AUTH_ALG - param->value = %d!\n", __func__, param->value)); 1759 DBGPRINT(RT_DEBUG_TRACE,
1684 break; 1760 ("%s::IW_AUTH_80211_AUTH_ALG - param->value = %d!\n",
1685 case IW_AUTH_WPA_ENABLED: 1761 __func__, param->value));
1686 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_ENABLED - Driver supports WPA!(param->value = %d)\n", __func__, param->value)); 1762 break;
1687 break; 1763 case IW_AUTH_WPA_ENABLED:
1688 default: 1764 DBGPRINT(RT_DEBUG_TRACE,
1689 return -EOPNOTSUPP; 1765 ("%s::IW_AUTH_WPA_ENABLED - Driver supports WPA!(param->value = %d)\n",
1690} 1766 __func__, param->value));
1767 break;
1768 default:
1769 return -EOPNOTSUPP;
1770 }
1691 1771
1692 return 0; 1772 return 0;
1693} 1773}
1694 1774
1695int rt_ioctl_giwauth(struct net_device *dev, 1775int rt_ioctl_giwauth(struct net_device *dev,
1696 struct iw_request_info *info, 1776 struct iw_request_info *info,
1697 union iwreq_data *wrqu, char *extra) 1777 union iwreq_data *wrqu, char *extra)
1698{ 1778{
1699 PRTMP_ADAPTER pAdapter = NULL; 1779 PRTMP_ADAPTER pAdapter = NULL;
1700 struct iw_param *param = &wrqu->param; 1780 struct iw_param *param = &wrqu->param;
1701 1781
1702 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1782 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1703 1783
1704 //check if the interface is down 1784 //check if the interface is down
1705 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1785 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1706 { 1786 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1707 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1787 return -ENETDOWN;
1708 return -ENETDOWN; 1788 }
1709 }
1710 1789
1711 switch (param->flags & IW_AUTH_INDEX) { 1790 switch (param->flags & IW_AUTH_INDEX) {
1712 case IW_AUTH_DROP_UNENCRYPTED: 1791 case IW_AUTH_DROP_UNENCRYPTED:
1713 param->value = (pAdapter->StaCfg.WepStatus == Ndis802_11WEPDisabled) ? 0 : 1; 1792 param->value =
1793 (pAdapter->StaCfg.WepStatus ==
1794 Ndis802_11WEPDisabled) ? 0 : 1;
1714 break; 1795 break;
1715 1796
1716 case IW_AUTH_80211_AUTH_ALG: 1797 case IW_AUTH_80211_AUTH_ALG:
1717 param->value = (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) ? IW_AUTH_ALG_SHARED_KEY : IW_AUTH_ALG_OPEN_SYSTEM; 1798 param->value =
1799 (pAdapter->StaCfg.AuthMode ==
1800 Ndis802_11AuthModeShared) ? IW_AUTH_ALG_SHARED_KEY :
1801 IW_AUTH_ALG_OPEN_SYSTEM;
1718 break; 1802 break;
1719 1803
1720 case IW_AUTH_WPA_ENABLED: 1804 case IW_AUTH_WPA_ENABLED:
1721 param->value = (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) ? 1 : 0; 1805 param->value =
1806 (pAdapter->StaCfg.AuthMode >=
1807 Ndis802_11AuthModeWPA) ? 1 : 0;
1722 break; 1808 break;
1723 1809
1724 default: 1810 default:
1725 return -EOPNOTSUPP; 1811 return -EOPNOTSUPP;
1726 } 1812 }
1727 DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_giwauth::param->value = %d!\n", param->value)); 1813 DBGPRINT(RT_DEBUG_TRACE,
1814 ("rt_ioctl_giwauth::param->value = %d!\n", param->value));
1728 return 0; 1815 return 0;
1729} 1816}
1730 1817
1731void fnSetCipherKey( 1818void fnSetCipherKey(IN PRTMP_ADAPTER pAdapter,
1732 IN PRTMP_ADAPTER pAdapter, 1819 IN INT keyIdx,
1733 IN INT keyIdx, 1820 IN UCHAR CipherAlg,
1734 IN UCHAR CipherAlg, 1821 IN BOOLEAN bGTK, IN struct iw_encode_ext *ext)
1735 IN BOOLEAN bGTK,
1736 IN struct iw_encode_ext *ext)
1737{ 1822{
1738 NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY)); 1823 NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY));
1739 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = LEN_TKIP_EK; 1824 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = LEN_TKIP_EK;
1740 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, LEN_TKIP_EK); 1825 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key,
1741 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].TxMic, ext->key + LEN_TKIP_EK, LEN_TKIP_TXMICK); 1826 LEN_TKIP_EK);
1742 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].RxMic, ext->key + LEN_TKIP_EK + LEN_TKIP_TXMICK, LEN_TKIP_RXMICK); 1827 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].TxMic,
1743 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CipherAlg; 1828 ext->key + LEN_TKIP_EK, LEN_TKIP_TXMICK);
1744 1829 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].RxMic,
1745 // Update group key information to ASIC Shared Key Table 1830 ext->key + LEN_TKIP_EK + LEN_TKIP_TXMICK,
1831 LEN_TKIP_RXMICK);
1832 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CipherAlg;
1833
1834 // Update group key information to ASIC Shared Key Table
1746 AsicAddSharedKeyEntry(pAdapter, 1835 AsicAddSharedKeyEntry(pAdapter,
1747 BSS0, 1836 BSS0,
1748 keyIdx, 1837 keyIdx,
1749 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, 1838 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg,
1750 pAdapter->SharedKey[BSS0][keyIdx].Key, 1839 pAdapter->SharedKey[BSS0][keyIdx].Key,
1751 pAdapter->SharedKey[BSS0][keyIdx].TxMic, 1840 pAdapter->SharedKey[BSS0][keyIdx].TxMic,
1752 pAdapter->SharedKey[BSS0][keyIdx].RxMic); 1841 pAdapter->SharedKey[BSS0][keyIdx].RxMic);
1753 1842
1754 if (bGTK) 1843 if (bGTK)
1755 // Update ASIC WCID attribute table and IVEIV table 1844 // Update ASIC WCID attribute table and IVEIV table
1756 RTMPAddWcidAttributeEntry(pAdapter, 1845 RTMPAddWcidAttributeEntry(pAdapter,
1757 BSS0, 1846 BSS0,
1758 keyIdx, 1847 keyIdx,
1759 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, 1848 pAdapter->SharedKey[BSS0][keyIdx].
1760 NULL); 1849 CipherAlg, NULL);
1761 else 1850 else
1762 // Update ASIC WCID attribute table and IVEIV table 1851 // Update ASIC WCID attribute table and IVEIV table
1763 RTMPAddWcidAttributeEntry(pAdapter, 1852 RTMPAddWcidAttributeEntry(pAdapter,
1764 BSS0, 1853 BSS0,
1765 keyIdx, 1854 keyIdx,
1766 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, 1855 pAdapter->SharedKey[BSS0][keyIdx].
1767 &pAdapter->MacTab.Content[BSSID_WCID]); 1856 CipherAlg,
1857 &pAdapter->MacTab.
1858 Content[BSSID_WCID]);
1768} 1859}
1769 1860
1770int rt_ioctl_siwencodeext(struct net_device *dev, 1861int rt_ioctl_siwencodeext(struct net_device *dev,
1771 struct iw_request_info *info, 1862 struct iw_request_info *info,
1772 union iwreq_data *wrqu, 1863 union iwreq_data *wrqu, char *extra)
1773 char *extra) 1864{
1774 { 1865 PRTMP_ADAPTER pAdapter = NULL;
1775 PRTMP_ADAPTER pAdapter = NULL;
1776 struct iw_point *encoding = &wrqu->encoding; 1866 struct iw_point *encoding = &wrqu->encoding;
1777 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; 1867 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
1778 int keyIdx, alg = ext->alg; 1868 int keyIdx, alg = ext->alg;
1779 1869
1780 GET_PAD_FROM_NET_DEV(pAdapter, dev); 1870 GET_PAD_FROM_NET_DEV(pAdapter, dev);
1781 1871
1782 //check if the interface is down 1872 //check if the interface is down
1783 if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 1873 if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
1784 { 1874 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
1785 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 1875 return -ENETDOWN;
1786 return -ENETDOWN;
1787 } 1876 }
1788 1877
1789 if (encoding->flags & IW_ENCODE_DISABLED) 1878 if (encoding->flags & IW_ENCODE_DISABLED) {
1790 { 1879 keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1;
1791 keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1; 1880 // set BSSID wcid entry of the Pair-wise Key table as no-security mode
1792 // set BSSID wcid entry of the Pair-wise Key table as no-security mode 1881 AsicRemovePairwiseKeyEntry(pAdapter, BSS0, BSSID_WCID);
1793 AsicRemovePairwiseKeyEntry(pAdapter, BSS0, BSSID_WCID); 1882 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0;
1794 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0;
1795 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_NONE; 1883 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_NONE;
1796 AsicRemoveSharedKeyEntry(pAdapter, 0, (UCHAR)keyIdx); 1884 AsicRemoveSharedKeyEntry(pAdapter, 0, (UCHAR) keyIdx);
1797 NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY)); 1885 NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx],
1798 DBGPRINT(RT_DEBUG_TRACE, ("%s::Remove all keys!(encoding->flags = %x)\n", __func__, encoding->flags)); 1886 sizeof(CIPHER_KEY));
1799 } 1887 DBGPRINT(RT_DEBUG_TRACE,
1800 else 1888 ("%s::Remove all keys!(encoding->flags = %x)\n",
1801 { 1889 __func__, encoding->flags));
1802 // Get Key Index and convet to our own defined key index 1890 } else {
1803 keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1; 1891 // Get Key Index and convet to our own defined key index
1804 if((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS)) 1892 keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1;
1805 return -EINVAL; 1893 if ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS))
1806 1894 return -EINVAL;
1807 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)
1808 {
1809 pAdapter->StaCfg.DefaultKeyId = keyIdx;
1810 DBGPRINT(RT_DEBUG_TRACE, ("%s::DefaultKeyId = %d\n", __func__, pAdapter->StaCfg.DefaultKeyId));
1811 }
1812
1813 switch (alg) {
1814 case IW_ENCODE_ALG_NONE:
1815 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_NONE\n", __func__));
1816 break;
1817 case IW_ENCODE_ALG_WEP:
1818 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_WEP - ext->key_len = %d, keyIdx = %d\n", __func__, ext->key_len, keyIdx));
1819 if (ext->key_len == MAX_WEP_KEY_SIZE)
1820 {
1821 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MAX_WEP_KEY_SIZE;
1822 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP128;
1823 }
1824 else if (ext->key_len == MIN_WEP_KEY_SIZE)
1825 {
1826 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MIN_WEP_KEY_SIZE;
1827 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP64;
1828 }
1829 else
1830 return -EINVAL;
1831 1895
1832 NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16); 1896 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
1833 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, ext->key_len); 1897 pAdapter->StaCfg.DefaultKeyId = keyIdx;
1834 if (pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled || 1898 DBGPRINT(RT_DEBUG_TRACE,
1835 pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled) 1899 ("%s::DefaultKeyId = %d\n", __func__,
1836 { 1900 pAdapter->StaCfg.DefaultKeyId));
1837 // Set Group key material to Asic 1901 }
1838 AsicAddSharedKeyEntry(pAdapter, BSS0, keyIdx, pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, pAdapter->SharedKey[BSS0][keyIdx].Key, NULL, NULL);
1839 1902
1840 // Update WCID attribute table and IVEIV table for this group key table 1903 switch (alg) {
1841 RTMPAddWcidAttributeEntry(pAdapter, BSS0, keyIdx, pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, NULL); 1904 case IW_ENCODE_ALG_NONE:
1905 DBGPRINT(RT_DEBUG_TRACE,
1906 ("%s::IW_ENCODE_ALG_NONE\n", __func__));
1907 break;
1908 case IW_ENCODE_ALG_WEP:
1909 DBGPRINT(RT_DEBUG_TRACE,
1910 ("%s::IW_ENCODE_ALG_WEP - ext->key_len = %d, keyIdx = %d\n",
1911 __func__, ext->key_len, keyIdx));
1912 if (ext->key_len == MAX_WEP_KEY_SIZE) {
1913 pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
1914 MAX_WEP_KEY_SIZE;
1915 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
1916 CIPHER_WEP128;
1917 } else if (ext->key_len == MIN_WEP_KEY_SIZE) {
1918 pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
1919 MIN_WEP_KEY_SIZE;
1920 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
1921 CIPHER_WEP64;
1922 } else
1923 return -EINVAL;
1842 1924
1843 STA_PORT_SECURED(pAdapter); 1925 NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,
1926 16);
1927 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,
1928 ext->key, ext->key_len);
1929 if (pAdapter->StaCfg.GroupCipher ==
1930 Ndis802_11GroupWEP40Enabled
1931 || pAdapter->StaCfg.GroupCipher ==
1932 Ndis802_11GroupWEP104Enabled) {
1933 // Set Group key material to Asic
1934 AsicAddSharedKeyEntry(pAdapter, BSS0, keyIdx,
1935 pAdapter->
1936 SharedKey[BSS0][keyIdx].
1937 CipherAlg,
1938 pAdapter->
1939 SharedKey[BSS0][keyIdx].
1940 Key, NULL, NULL);
1941
1942 // Update WCID attribute table and IVEIV table for this group key table
1943 RTMPAddWcidAttributeEntry(pAdapter, BSS0,
1944 keyIdx,
1945 pAdapter->
1946 SharedKey[BSS0]
1947 [keyIdx].CipherAlg,
1948 NULL);
1949
1950 STA_PORT_SECURED(pAdapter);
1951
1952 // Indicate Connected for GUI
1953 pAdapter->IndicateMediaState =
1954 NdisMediaStateConnected;
1955 }
1956 break;
1957 case IW_ENCODE_ALG_TKIP:
1958 DBGPRINT(RT_DEBUG_TRACE,
1959 ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n",
1960 __func__, keyIdx, ext->key_len));
1961 if (ext->key_len == 32) {
1962 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
1963 fnSetCipherKey(pAdapter, keyIdx,
1964 CIPHER_TKIP, FALSE, ext);
1965 if (pAdapter->StaCfg.AuthMode >=
1966 Ndis802_11AuthModeWPA2) {
1967 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1968 STA_PORT_SECURED(pAdapter);
1969 pAdapter->IndicateMediaState =
1970 NdisMediaStateConnected;
1971 }
1972 } else if (ext->
1973 ext_flags & IW_ENCODE_EXT_GROUP_KEY)
1974 {
1975 fnSetCipherKey(pAdapter, keyIdx,
1976 CIPHER_TKIP, TRUE, ext);
1844 1977
1845 // Indicate Connected for GUI 1978 // set 802.1x port control
1846 pAdapter->IndicateMediaState = NdisMediaStateConnected; 1979 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1980 STA_PORT_SECURED(pAdapter);
1981 pAdapter->IndicateMediaState =
1982 NdisMediaStateConnected;
1847 } 1983 }
1848 break; 1984 } else
1849 case IW_ENCODE_ALG_TKIP: 1985 return -EINVAL;
1850 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n", __func__, keyIdx, ext->key_len)); 1986 break;
1851 if (ext->key_len == 32) 1987 case IW_ENCODE_ALG_CCMP:
1852 { 1988 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
1853 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) 1989 fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES,
1854 { 1990 FALSE, ext);
1855 fnSetCipherKey(pAdapter, keyIdx, CIPHER_TKIP, FALSE, ext); 1991 if (pAdapter->StaCfg.AuthMode >=
1856 if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2) 1992 Ndis802_11AuthModeWPA2)
1857 { 1993 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1858 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 1994 STA_PORT_SECURED(pAdapter);
1859 STA_PORT_SECURED(pAdapter); 1995 pAdapter->IndicateMediaState =
1860 pAdapter->IndicateMediaState = NdisMediaStateConnected; 1996 NdisMediaStateConnected;
1861 } 1997 } else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
1862 } 1998 fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES,
1863 else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) 1999 TRUE, ext);
1864 { 2000
1865 fnSetCipherKey(pAdapter, keyIdx, CIPHER_TKIP, TRUE, ext); 2001 // set 802.1x port control
1866 2002 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1867 // set 802.1x port control 2003 STA_PORT_SECURED(pAdapter);
1868 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 2004 pAdapter->IndicateMediaState =
1869 STA_PORT_SECURED(pAdapter); 2005 NdisMediaStateConnected;
1870 pAdapter->IndicateMediaState = NdisMediaStateConnected; 2006 }
1871 } 2007 break;
1872 } 2008 default:
1873 else 2009 return -EINVAL;
1874 return -EINVAL;
1875 break;
1876 case IW_ENCODE_ALG_CCMP:
1877 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)
1878 {
1879 fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES, FALSE, ext);
1880 if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2)
1881 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1882 STA_PORT_SECURED(pAdapter);
1883 pAdapter->IndicateMediaState = NdisMediaStateConnected;
1884 }
1885 else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
1886 {
1887 fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES, TRUE, ext);
1888
1889 // set 802.1x port control
1890 //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1891 STA_PORT_SECURED(pAdapter);
1892 pAdapter->IndicateMediaState = NdisMediaStateConnected;
1893 }
1894 break;
1895 default:
1896 return -EINVAL;
1897 } 2010 }
1898 } 2011 }
1899 2012
1900 return 0; 2013 return 0;
1901} 2014}
1902 2015
1903int 2016int
1904rt_ioctl_giwencodeext(struct net_device *dev, 2017rt_ioctl_giwencodeext(struct net_device *dev,
1905 struct iw_request_info *info, 2018 struct iw_request_info *info,
1906 union iwreq_data *wrqu, char *extra) 2019 union iwreq_data *wrqu, char *extra)
1907{ 2020{
1908 PRTMP_ADAPTER pAd = NULL; 2021 PRTMP_ADAPTER pAd = NULL;
1909 PCHAR pKey = NULL; 2022 PCHAR pKey = NULL;
@@ -1913,72 +2026,65 @@ rt_ioctl_giwencodeext(struct net_device *dev,
1913 2026
1914 GET_PAD_FROM_NET_DEV(pAd, dev); 2027 GET_PAD_FROM_NET_DEV(pAd, dev);
1915 2028
1916 DBGPRINT(RT_DEBUG_TRACE ,("===> rt_ioctl_giwencodeext\n")); 2029 DBGPRINT(RT_DEBUG_TRACE, ("===> rt_ioctl_giwencodeext\n"));
1917 2030
1918 max_key_len = encoding->length - sizeof(*ext); 2031 max_key_len = encoding->length - sizeof(*ext);
1919 if (max_key_len < 0) 2032 if (max_key_len < 0)
1920 return -EINVAL; 2033 return -EINVAL;
1921 2034
1922 idx = encoding->flags & IW_ENCODE_INDEX; 2035 idx = encoding->flags & IW_ENCODE_INDEX;
1923 if (idx) 2036 if (idx) {
1924 {
1925 if (idx < 1 || idx > 4) 2037 if (idx < 1 || idx > 4)
1926 return -EINVAL; 2038 return -EINVAL;
1927 idx--; 2039 idx--;
1928 2040
1929 if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || 2041 if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) ||
1930 (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)) 2042 (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)) {
1931 { 2043 if (idx != pAd->StaCfg.DefaultKeyId) {
1932 if (idx != pAd->StaCfg.DefaultKeyId)
1933 {
1934 ext->key_len = 0; 2044 ext->key_len = 0;
1935 return 0; 2045 return 0;
1936 } 2046 }
1937 } 2047 }
1938 } 2048 } else
1939 else
1940 idx = pAd->StaCfg.DefaultKeyId; 2049 idx = pAd->StaCfg.DefaultKeyId;
1941 2050
1942 encoding->flags = idx + 1; 2051 encoding->flags = idx + 1;
1943 memset(ext, 0, sizeof(*ext)); 2052 memset(ext, 0, sizeof(*ext));
1944 2053
1945 ext->key_len = 0; 2054 ext->key_len = 0;
1946 switch(pAd->StaCfg.WepStatus) { 2055 switch (pAd->StaCfg.WepStatus) {
1947 case Ndis802_11WEPDisabled: 2056 case Ndis802_11WEPDisabled:
1948 ext->alg = IW_ENCODE_ALG_NONE; 2057 ext->alg = IW_ENCODE_ALG_NONE;
1949 encoding->flags |= IW_ENCODE_DISABLED; 2058 encoding->flags |= IW_ENCODE_DISABLED;
1950 break; 2059 break;
1951 case Ndis802_11WEPEnabled: 2060 case Ndis802_11WEPEnabled:
1952 ext->alg = IW_ENCODE_ALG_WEP; 2061 ext->alg = IW_ENCODE_ALG_WEP;
1953 if (pAd->SharedKey[BSS0][idx].KeyLen > max_key_len) 2062 if (pAd->SharedKey[BSS0][idx].KeyLen > max_key_len)
1954 return -E2BIG; 2063 return -E2BIG;
1955 else 2064 else {
1956 { 2065 ext->key_len = pAd->SharedKey[BSS0][idx].KeyLen;
1957 ext->key_len = pAd->SharedKey[BSS0][idx].KeyLen; 2066 pKey = (PCHAR) & (pAd->SharedKey[BSS0][idx].Key[0]);
1958 pKey = (PCHAR)&(pAd->SharedKey[BSS0][idx].Key[0]); 2067 }
1959 } 2068 break;
1960 break; 2069 case Ndis802_11Encryption2Enabled:
1961 case Ndis802_11Encryption2Enabled: 2070 case Ndis802_11Encryption3Enabled:
1962 case Ndis802_11Encryption3Enabled: 2071 if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
1963 if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) 2072 ext->alg = IW_ENCODE_ALG_TKIP;
1964 ext->alg = IW_ENCODE_ALG_TKIP; 2073 else
1965 else 2074 ext->alg = IW_ENCODE_ALG_CCMP;
1966 ext->alg = IW_ENCODE_ALG_CCMP;
1967 2075
1968 if (max_key_len < 32) 2076 if (max_key_len < 32)
1969 return -E2BIG; 2077 return -E2BIG;
1970 else 2078 else {
1971 { 2079 ext->key_len = 32;
1972 ext->key_len = 32; 2080 pKey = (PCHAR) & pAd->StaCfg.PMK[0];
1973 pKey = (PCHAR)&pAd->StaCfg.PMK[0]; 2081 }
1974 } 2082 break;
1975 break; 2083 default:
1976 default: 2084 return -EINVAL;
1977 return -EINVAL;
1978 } 2085 }
1979 2086
1980 if (ext->key_len && pKey) 2087 if (ext->key_len && pKey) {
1981 {
1982 encoding->flags |= IW_ENCODE_ENABLED; 2088 encoding->flags |= IW_ENCODE_ENABLED;
1983 memcpy(ext->key, pKey, ext->key_len); 2089 memcpy(ext->key, pKey, ext->key_len);
1984 } 2090 }
@@ -1987,27 +2093,25 @@ rt_ioctl_giwencodeext(struct net_device *dev,
1987} 2093}
1988 2094
1989int rt_ioctl_siwgenie(struct net_device *dev, 2095int rt_ioctl_siwgenie(struct net_device *dev,
1990 struct iw_request_info *info, 2096 struct iw_request_info *info,
1991 union iwreq_data *wrqu, char *extra) 2097 union iwreq_data *wrqu, char *extra)
1992{ 2098{
1993 PRTMP_ADAPTER pAd = NULL; 2099 PRTMP_ADAPTER pAd = NULL;
1994 2100
1995 GET_PAD_FROM_NET_DEV(pAd, dev); 2101 GET_PAD_FROM_NET_DEV(pAd, dev);
1996 2102
1997 DBGPRINT(RT_DEBUG_TRACE ,("===> rt_ioctl_siwgenie\n")); 2103 DBGPRINT(RT_DEBUG_TRACE, ("===> rt_ioctl_siwgenie\n"));
1998 pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE; 2104 pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;
1999 if (wrqu->data.length > MAX_LEN_OF_RSNIE || 2105 if (wrqu->data.length > MAX_LEN_OF_RSNIE ||
2000 (wrqu->data.length && extra == NULL)) 2106 (wrqu->data.length && extra == NULL))
2001 return -EINVAL; 2107 return -EINVAL;
2002 2108
2003 if (wrqu->data.length) 2109 if (wrqu->data.length) {
2004 {
2005 pAd->StaCfg.RSNIE_Len = wrqu->data.length; 2110 pAd->StaCfg.RSNIE_Len = wrqu->data.length;
2006 NdisMoveMemory(&pAd->StaCfg.RSN_IE[0], extra, pAd->StaCfg.RSNIE_Len); 2111 NdisMoveMemory(&pAd->StaCfg.RSN_IE[0], extra,
2112 pAd->StaCfg.RSNIE_Len);
2007 pAd->StaCfg.bRSN_IE_FromWpaSupplicant = TRUE; 2113 pAd->StaCfg.bRSN_IE_FromWpaSupplicant = TRUE;
2008 } 2114 } else {
2009 else
2010 {
2011 pAd->StaCfg.RSNIE_Len = 0; 2115 pAd->StaCfg.RSNIE_Len = 0;
2012 NdisZeroMemory(&pAd->StaCfg.RSN_IE[0], MAX_LEN_OF_RSNIE); 2116 NdisZeroMemory(&pAd->StaCfg.RSN_IE[0], MAX_LEN_OF_RSNIE);
2013 } 2117 }
@@ -2016,188 +2120,212 @@ int rt_ioctl_siwgenie(struct net_device *dev,
2016} 2120}
2017 2121
2018int rt_ioctl_giwgenie(struct net_device *dev, 2122int rt_ioctl_giwgenie(struct net_device *dev,
2019 struct iw_request_info *info, 2123 struct iw_request_info *info,
2020 union iwreq_data *wrqu, char *extra) 2124 union iwreq_data *wrqu, char *extra)
2021{ 2125{
2022 PRTMP_ADAPTER pAd = NULL; 2126 PRTMP_ADAPTER pAd = NULL;
2023 2127
2024 GET_PAD_FROM_NET_DEV(pAd, dev); 2128 GET_PAD_FROM_NET_DEV(pAd, dev);
2025 2129
2026 if ((pAd->StaCfg.RSNIE_Len == 0) || 2130 if ((pAd->StaCfg.RSNIE_Len == 0) ||
2027 (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)) 2131 (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)) {
2028 {
2029 wrqu->data.length = 0; 2132 wrqu->data.length = 0;
2030 return 0; 2133 return 0;
2031 } 2134 }
2032 2135
2033 if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) 2136 if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) {
2034 { 2137 if (wrqu->data.length < pAd->StaCfg.RSNIE_Len)
2035 if (wrqu->data.length < pAd->StaCfg.RSNIE_Len) 2138 return -E2BIG;
2036 return -E2BIG;
2037 2139
2038 wrqu->data.length = pAd->StaCfg.RSNIE_Len; 2140 wrqu->data.length = pAd->StaCfg.RSNIE_Len;
2039 memcpy(extra, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len); 2141 memcpy(extra, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len);
2040 } 2142 } else {
2041 else
2042 {
2043 UCHAR RSNIe = IE_WPA; 2143 UCHAR RSNIe = IE_WPA;
2044 2144
2045 if (wrqu->data.length < (pAd->StaCfg.RSNIE_Len + 2)) // ID, Len 2145 if (wrqu->data.length < (pAd->StaCfg.RSNIE_Len + 2)) // ID, Len
2046 return -E2BIG; 2146 return -E2BIG;
2047 wrqu->data.length = pAd->StaCfg.RSNIE_Len + 2; 2147 wrqu->data.length = pAd->StaCfg.RSNIE_Len + 2;
2048 2148
2049 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || 2149 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
2050 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)) 2150 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))
2051 RSNIe = IE_RSN; 2151 RSNIe = IE_RSN;
2052 2152
2053 extra[0] = (char)RSNIe; 2153 extra[0] = (char)RSNIe;
2054 extra[1] = pAd->StaCfg.RSNIE_Len; 2154 extra[1] = pAd->StaCfg.RSNIE_Len;
2055 memcpy(extra+2, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len); 2155 memcpy(extra + 2, &pAd->StaCfg.RSN_IE[0],
2156 pAd->StaCfg.RSNIE_Len);
2056 } 2157 }
2057 2158
2058 return 0; 2159 return 0;
2059} 2160}
2060 2161
2061int rt_ioctl_siwpmksa(struct net_device *dev, 2162int rt_ioctl_siwpmksa(struct net_device *dev,
2062 struct iw_request_info *info, 2163 struct iw_request_info *info,
2063 union iwreq_data *wrqu, 2164 union iwreq_data *wrqu, char *extra)
2064 char *extra)
2065{ 2165{
2066 PRTMP_ADAPTER pAd = NULL; 2166 PRTMP_ADAPTER pAd = NULL;
2067 struct iw_pmksa *pPmksa = (struct iw_pmksa *)wrqu->data.pointer; 2167 struct iw_pmksa *pPmksa = (struct iw_pmksa *)wrqu->data.pointer;
2068 INT CachedIdx = 0, idx = 0; 2168 INT CachedIdx = 0, idx = 0;
2069 2169
2070 GET_PAD_FROM_NET_DEV(pAd, dev); 2170 GET_PAD_FROM_NET_DEV(pAd, dev);
2071 2171
2072 if (pPmksa == NULL) 2172 if (pPmksa == NULL)
2073 return -EINVAL; 2173 return -EINVAL;
2074 2174
2075 DBGPRINT(RT_DEBUG_TRACE ,("===> rt_ioctl_siwpmksa\n")); 2175 DBGPRINT(RT_DEBUG_TRACE, ("===> rt_ioctl_siwpmksa\n"));
2076 switch(pPmksa->cmd) 2176 switch (pPmksa->cmd) {
2077 { 2177 case IW_PMKSA_FLUSH:
2078 case IW_PMKSA_FLUSH: 2178 NdisZeroMemory(pAd->StaCfg.SavedPMK,
2079 NdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO); 2179 sizeof(BSSID_INFO) * PMKID_NO);
2080 DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - IW_PMKSA_FLUSH\n")); 2180 DBGPRINT(RT_DEBUG_TRACE,
2081 break; 2181 ("rt_ioctl_siwpmksa - IW_PMKSA_FLUSH\n"));
2082 case IW_PMKSA_REMOVE: 2182 break;
2083 for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++) 2183 case IW_PMKSA_REMOVE:
2084 { 2184 for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum;
2085 // compare the BSSID 2185 CachedIdx++) {
2086 if (NdisEqualMemory(pPmksa->bssid.sa_data, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN)) 2186 // compare the BSSID
2087 { 2187 if (NdisEqualMemory
2088 NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN); 2188 (pPmksa->bssid.sa_data,
2089 NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].PMKID, 16); 2189 pAd->StaCfg.SavedPMK[CachedIdx].BSSID,
2090 for (idx = CachedIdx; idx < (pAd->StaCfg.SavedPMKNum - 1); idx++) 2190 MAC_ADDR_LEN)) {
2091 { 2191 NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].
2092 NdisMoveMemory(&pAd->StaCfg.SavedPMK[idx].BSSID[0], &pAd->StaCfg.SavedPMK[idx+1].BSSID[0], MAC_ADDR_LEN); 2192 BSSID, MAC_ADDR_LEN);
2093 NdisMoveMemory(&pAd->StaCfg.SavedPMK[idx].PMKID[0], &pAd->StaCfg.SavedPMK[idx+1].PMKID[0], 16); 2193 NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].
2094 } 2194 PMKID, 16);
2095 pAd->StaCfg.SavedPMKNum--; 2195 for (idx = CachedIdx;
2096 break; 2196 idx < (pAd->StaCfg.SavedPMKNum - 1);
2097 } 2197 idx++) {
2098 } 2198 NdisMoveMemory(&pAd->StaCfg.
2199 SavedPMK[idx].BSSID[0],
2200 &pAd->StaCfg.
2201 SavedPMK[idx +
2202 1].BSSID[0],
2203 MAC_ADDR_LEN);
2204 NdisMoveMemory(&pAd->StaCfg.
2205 SavedPMK[idx].PMKID[0],
2206 &pAd->StaCfg.
2207 SavedPMK[idx +
2208 1].PMKID[0],
2209 16);
2210 }
2211 pAd->StaCfg.SavedPMKNum--;
2212 break;
2213 }
2214 }
2099 2215
2100 DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - IW_PMKSA_REMOVE\n")); 2216 DBGPRINT(RT_DEBUG_TRACE,
2101 break; 2217 ("rt_ioctl_siwpmksa - IW_PMKSA_REMOVE\n"));
2102 case IW_PMKSA_ADD: 2218 break;
2103 for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++) 2219 case IW_PMKSA_ADD:
2104 { 2220 for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum;
2105 // compare the BSSID 2221 CachedIdx++) {
2106 if (NdisEqualMemory(pPmksa->bssid.sa_data, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN)) 2222 // compare the BSSID
2107 break; 2223 if (NdisEqualMemory
2108 } 2224 (pPmksa->bssid.sa_data,
2109 2225 pAd->StaCfg.SavedPMK[CachedIdx].BSSID,
2110 // Found, replace it 2226 MAC_ADDR_LEN))
2111 if (CachedIdx < PMKID_NO) 2227 break;
2112 { 2228 }
2113 DBGPRINT(RT_DEBUG_OFF, ("Update PMKID, idx = %d\n", CachedIdx)); 2229
2114 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].BSSID[0], pPmksa->bssid.sa_data, MAC_ADDR_LEN); 2230 // Found, replace it
2115 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].PMKID[0], pPmksa->pmkid, 16); 2231 if (CachedIdx < PMKID_NO) {
2116 pAd->StaCfg.SavedPMKNum++; 2232 DBGPRINT(RT_DEBUG_OFF,
2117 } 2233 ("Update PMKID, idx = %d\n", CachedIdx));
2118 // Not found, replace the last one 2234 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
2119 else 2235 BSSID[0], pPmksa->bssid.sa_data,
2120 { 2236 MAC_ADDR_LEN);
2121 // Randomly replace one 2237 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
2122 CachedIdx = (pPmksa->bssid.sa_data[5] % PMKID_NO); 2238 PMKID[0], pPmksa->pmkid, 16);
2123 DBGPRINT(RT_DEBUG_OFF, ("Update PMKID, idx = %d\n", CachedIdx)); 2239 pAd->StaCfg.SavedPMKNum++;
2124 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].BSSID[0], pPmksa->bssid.sa_data, MAC_ADDR_LEN); 2240 }
2125 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].PMKID[0], pPmksa->pmkid, 16); 2241 // Not found, replace the last one
2126 } 2242 else {
2127 2243 // Randomly replace one
2128 DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - IW_PMKSA_ADD\n")); 2244 CachedIdx = (pPmksa->bssid.sa_data[5] % PMKID_NO);
2129 break; 2245 DBGPRINT(RT_DEBUG_OFF,
2130 default: 2246 ("Update PMKID, idx = %d\n", CachedIdx));
2131 DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - Unknow Command!!\n")); 2247 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
2132 break; 2248 BSSID[0], pPmksa->bssid.sa_data,
2249 MAC_ADDR_LEN);
2250 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
2251 PMKID[0], pPmksa->pmkid, 16);
2252 }
2253
2254 DBGPRINT(RT_DEBUG_TRACE,
2255 ("rt_ioctl_siwpmksa - IW_PMKSA_ADD\n"));
2256 break;
2257 default:
2258 DBGPRINT(RT_DEBUG_TRACE,
2259 ("rt_ioctl_siwpmksa - Unknow Command!!\n"));
2260 break;
2133 } 2261 }
2134 2262
2135 return 0; 2263 return 0;
2136} 2264}
2137 2265
2138int rt_ioctl_siwrate(struct net_device *dev, 2266int rt_ioctl_siwrate(struct net_device *dev,
2139 struct iw_request_info *info, 2267 struct iw_request_info *info,
2140 union iwreq_data *wrqu, char *extra) 2268 union iwreq_data *wrqu, char *extra)
2141{ 2269{
2142 PRTMP_ADAPTER pAd = NULL; 2270 PRTMP_ADAPTER pAd = NULL;
2143 UINT32 rate = wrqu->bitrate.value, fixed = wrqu->bitrate.fixed; 2271 UINT32 rate = wrqu->bitrate.value, fixed = wrqu->bitrate.fixed;
2144 2272
2145 GET_PAD_FROM_NET_DEV(pAd, dev); 2273 GET_PAD_FROM_NET_DEV(pAd, dev);
2146 2274
2147 //check if the interface is down 2275 //check if the interface is down
2148 if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 2276 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
2149 { 2277 DBGPRINT(RT_DEBUG_TRACE,
2150 DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::Network is down!\n")); 2278 ("rt_ioctl_siwrate::Network is down!\n"));
2151 return -ENETDOWN; 2279 return -ENETDOWN;
2152 } 2280 }
2153 2281
2154 DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::(rate = %d, fixed = %d)\n", rate, fixed)); 2282 DBGPRINT(RT_DEBUG_TRACE,
2155 /* rate = -1 => auto rate 2283 ("rt_ioctl_siwrate::(rate = %d, fixed = %d)\n", rate, fixed));
2156 rate = X, fixed = 1 => (fixed rate X) 2284 /* rate = -1 => auto rate
2157 */ 2285 rate = X, fixed = 1 => (fixed rate X)
2158 if (rate == -1) 2286 */
2159 { 2287 if (rate == -1) {
2160 //Auto Rate 2288 //Auto Rate
2161 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; 2289 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
2162 pAd->StaCfg.bAutoTxRateSwitch = TRUE; 2290 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
2163 if ((pAd->CommonCfg.PhyMode <= PHY_11G) || 2291 if ((pAd->CommonCfg.PhyMode <= PHY_11G) ||
2164 (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM)) 2292 (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <=
2293 MODE_OFDM))
2165 RTMPSetDesiredRates(pAd, -1); 2294 RTMPSetDesiredRates(pAd, -1);
2166 2295
2167 SetCommonHT(pAd); 2296 SetCommonHT(pAd);
2168 } 2297 } else {
2169 else 2298 if (fixed) {
2170 { 2299 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
2171 if (fixed) 2300 if ((pAd->CommonCfg.PhyMode <= PHY_11G) ||
2172 { 2301 (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.
2173 pAd->StaCfg.bAutoTxRateSwitch = FALSE; 2302 MODE <= MODE_OFDM))
2174 if ((pAd->CommonCfg.PhyMode <= PHY_11G) || 2303 RTMPSetDesiredRates(pAd, rate);
2175 (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM)) 2304 else {
2176 RTMPSetDesiredRates(pAd, rate); 2305 pAd->StaCfg.DesiredTransmitSetting.field.MCS =
2177 else 2306 MCS_AUTO;
2178 { 2307 SetCommonHT(pAd);
2179 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; 2308 }
2180 SetCommonHT(pAd); 2309 DBGPRINT(RT_DEBUG_TRACE,
2181 } 2310 ("rt_ioctl_siwrate::(HtMcs=%d)\n",
2182 DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::(HtMcs=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.MCS)); 2311 pAd->StaCfg.DesiredTransmitSetting.field.
2183 } 2312 MCS));
2184 else 2313 } else {
2185 { 2314 // TODO: rate = X, fixed = 0 => (rates <= X)
2186 // TODO: rate = X, fixed = 0 => (rates <= X) 2315 return -EOPNOTSUPP;
2187 return -EOPNOTSUPP; 2316 }
2188 } 2317 }
2189 } 2318
2190 2319 return 0;
2191 return 0;
2192} 2320}
2193 2321
2194int rt_ioctl_giwrate(struct net_device *dev, 2322int rt_ioctl_giwrate(struct net_device *dev,
2195 struct iw_request_info *info, 2323 struct iw_request_info *info,
2196 union iwreq_data *wrqu, char *extra) 2324 union iwreq_data *wrqu, char *extra)
2197{ 2325{
2198 PRTMP_ADAPTER pAd = NULL; 2326 PRTMP_ADAPTER pAd = NULL;
2199 int rate_index = 0, rate_count = 0; 2327 int rate_index = 0, rate_count = 0;
2200 HTTRANSMIT_SETTING ht_setting; 2328 HTTRANSMIT_SETTING ht_setting;
2201/* Remove to global variable 2329/* Remove to global variable
2202 __s32 ralinkrate[] = 2330 __s32 ralinkrate[] =
2203 {2, 4, 11, 22, // CCK 2331 {2, 4, 11, 22, // CCK
@@ -2213,289 +2341,292 @@ int rt_ioctl_giwrate(struct net_device *dev,
2213*/ 2341*/
2214 GET_PAD_FROM_NET_DEV(pAd, dev); 2342 GET_PAD_FROM_NET_DEV(pAd, dev);
2215 2343
2216 rate_count = sizeof(ralinkrate)/sizeof(__s32); 2344 rate_count = sizeof(ralinkrate) / sizeof(__s32);
2217 //check if the interface is down 2345 //check if the interface is down
2218 if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 2346 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
2219 { 2347 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
2220 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 2348 return -ENETDOWN;
2221 return -ENETDOWN;
2222 } 2349 }
2223 2350
2224 if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE) && 2351 if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE) &&
2225 (INFRA_ON(pAd)) && 2352 (INFRA_ON(pAd)) &&
2226 ((pAd->CommonCfg.PhyMode <= PHY_11G) || (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM))) 2353 ((pAd->CommonCfg.PhyMode <= PHY_11G)
2227 ht_setting.word = pAd->StaCfg.HTPhyMode.word; 2354 || (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <=
2228 else 2355 MODE_OFDM)))
2229 ht_setting.word = pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word; 2356 ht_setting.word = pAd->StaCfg.HTPhyMode.word;
2230 2357 else
2231 if (ht_setting.field.MODE >= MODE_HTMIX) 2358 ht_setting.word =
2232 { 2359 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word;
2233// rate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS); 2360
2234 rate_index = 12 + ((UCHAR)ht_setting.field.BW *24) + ((UCHAR)ht_setting.field.ShortGI *48) + ((UCHAR)ht_setting.field.MCS); 2361 if (ht_setting.field.MODE >= MODE_HTMIX) {
2235 } 2362// rate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS);
2236 else 2363 rate_index =
2237 if (ht_setting.field.MODE == MODE_OFDM) 2364 12 + ((UCHAR) ht_setting.field.BW * 24) +
2238 rate_index = (UCHAR)(ht_setting.field.MCS) + 4; 2365 ((UCHAR) ht_setting.field.ShortGI * 48) +
2239 else if (ht_setting.field.MODE == MODE_CCK) 2366 ((UCHAR) ht_setting.field.MCS);
2240 rate_index = (UCHAR)(ht_setting.field.MCS); 2367 } else if (ht_setting.field.MODE == MODE_OFDM)
2241 2368 rate_index = (UCHAR) (ht_setting.field.MCS) + 4;
2242 if (rate_index < 0) 2369 else if (ht_setting.field.MODE == MODE_CCK)
2243 rate_index = 0; 2370 rate_index = (UCHAR) (ht_setting.field.MCS);
2244 2371
2245 if (rate_index > rate_count) 2372 if (rate_index < 0)
2246 rate_index = rate_count; 2373 rate_index = 0;
2247 2374
2248 wrqu->bitrate.value = ralinkrate[rate_index] * 500000; 2375 if (rate_index > rate_count)
2249 wrqu->bitrate.disabled = 0; 2376 rate_index = rate_count;
2250 2377
2251 return 0; 2378 wrqu->bitrate.value = ralinkrate[rate_index] * 500000;
2379 wrqu->bitrate.disabled = 0;
2380
2381 return 0;
2252} 2382}
2253 2383
2254static const iw_handler rt_handler[] = 2384static const iw_handler rt_handler[] = {
2255{ 2385 (iw_handler) NULL, /* SIOCSIWCOMMIT */
2256 (iw_handler) NULL, /* SIOCSIWCOMMIT */ 2386 (iw_handler) rt_ioctl_giwname, /* SIOCGIWNAME */
2257 (iw_handler) rt_ioctl_giwname, /* SIOCGIWNAME */ 2387 (iw_handler) NULL, /* SIOCSIWNWID */
2258 (iw_handler) NULL, /* SIOCSIWNWID */ 2388 (iw_handler) NULL, /* SIOCGIWNWID */
2259 (iw_handler) NULL, /* SIOCGIWNWID */ 2389 (iw_handler) rt_ioctl_siwfreq, /* SIOCSIWFREQ */
2260 (iw_handler) rt_ioctl_siwfreq, /* SIOCSIWFREQ */ 2390 (iw_handler) rt_ioctl_giwfreq, /* SIOCGIWFREQ */
2261 (iw_handler) rt_ioctl_giwfreq, /* SIOCGIWFREQ */ 2391 (iw_handler) rt_ioctl_siwmode, /* SIOCSIWMODE */
2262 (iw_handler) rt_ioctl_siwmode, /* SIOCSIWMODE */ 2392 (iw_handler) rt_ioctl_giwmode, /* SIOCGIWMODE */
2263 (iw_handler) rt_ioctl_giwmode, /* SIOCGIWMODE */ 2393 (iw_handler) NULL, /* SIOCSIWSENS */
2264 (iw_handler) NULL, /* SIOCSIWSENS */ 2394 (iw_handler) NULL, /* SIOCGIWSENS */
2265 (iw_handler) NULL, /* SIOCGIWSENS */ 2395 (iw_handler) NULL /* not used */ , /* SIOCSIWRANGE */
2266 (iw_handler) NULL /* not used */, /* SIOCSIWRANGE */ 2396 (iw_handler) rt_ioctl_giwrange, /* SIOCGIWRANGE */
2267 (iw_handler) rt_ioctl_giwrange, /* SIOCGIWRANGE */ 2397 (iw_handler) NULL /* not used */ , /* SIOCSIWPRIV */
2268 (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */ 2398 (iw_handler) NULL /* kernel code */ , /* SIOCGIWPRIV */
2269 (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */ 2399 (iw_handler) NULL /* not used */ , /* SIOCSIWSTATS */
2270 (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */ 2400 (iw_handler) rt28xx_get_wireless_stats /* kernel code */ , /* SIOCGIWSTATS */
2271 (iw_handler) rt28xx_get_wireless_stats /* kernel code */, /* SIOCGIWSTATS */ 2401 (iw_handler) NULL, /* SIOCSIWSPY */
2272 (iw_handler) NULL, /* SIOCSIWSPY */ 2402 (iw_handler) NULL, /* SIOCGIWSPY */
2273 (iw_handler) NULL, /* SIOCGIWSPY */ 2403 (iw_handler) NULL, /* SIOCSIWTHRSPY */
2274 (iw_handler) NULL, /* SIOCSIWTHRSPY */ 2404 (iw_handler) NULL, /* SIOCGIWTHRSPY */
2275 (iw_handler) NULL, /* SIOCGIWTHRSPY */ 2405 (iw_handler) rt_ioctl_siwap, /* SIOCSIWAP */
2276 (iw_handler) rt_ioctl_siwap, /* SIOCSIWAP */ 2406 (iw_handler) rt_ioctl_giwap, /* SIOCGIWAP */
2277 (iw_handler) rt_ioctl_giwap, /* SIOCGIWAP */ 2407 (iw_handler) rt_ioctl_siwmlme, /* SIOCSIWMLME */
2278 (iw_handler) rt_ioctl_siwmlme, /* SIOCSIWMLME */ 2408 (iw_handler) rt_ioctl_iwaplist, /* SIOCGIWAPLIST */
2279 (iw_handler) rt_ioctl_iwaplist, /* SIOCGIWAPLIST */ 2409 (iw_handler) rt_ioctl_siwscan, /* SIOCSIWSCAN */
2280 (iw_handler) rt_ioctl_siwscan, /* SIOCSIWSCAN */ 2410 (iw_handler) rt_ioctl_giwscan, /* SIOCGIWSCAN */
2281 (iw_handler) rt_ioctl_giwscan, /* SIOCGIWSCAN */ 2411 (iw_handler) rt_ioctl_siwessid, /* SIOCSIWESSID */
2282 (iw_handler) rt_ioctl_siwessid, /* SIOCSIWESSID */ 2412 (iw_handler) rt_ioctl_giwessid, /* SIOCGIWESSID */
2283 (iw_handler) rt_ioctl_giwessid, /* SIOCGIWESSID */ 2413 (iw_handler) rt_ioctl_siwnickn, /* SIOCSIWNICKN */
2284 (iw_handler) rt_ioctl_siwnickn, /* SIOCSIWNICKN */ 2414 (iw_handler) rt_ioctl_giwnickn, /* SIOCGIWNICKN */
2285 (iw_handler) rt_ioctl_giwnickn, /* SIOCGIWNICKN */ 2415 (iw_handler) NULL, /* -- hole -- */
2286 (iw_handler) NULL, /* -- hole -- */ 2416 (iw_handler) NULL, /* -- hole -- */
2287 (iw_handler) NULL, /* -- hole -- */ 2417 (iw_handler) rt_ioctl_siwrate, /* SIOCSIWRATE */
2288 (iw_handler) rt_ioctl_siwrate, /* SIOCSIWRATE */ 2418 (iw_handler) rt_ioctl_giwrate, /* SIOCGIWRATE */
2289 (iw_handler) rt_ioctl_giwrate, /* SIOCGIWRATE */ 2419 (iw_handler) rt_ioctl_siwrts, /* SIOCSIWRTS */
2290 (iw_handler) rt_ioctl_siwrts, /* SIOCSIWRTS */ 2420 (iw_handler) rt_ioctl_giwrts, /* SIOCGIWRTS */
2291 (iw_handler) rt_ioctl_giwrts, /* SIOCGIWRTS */ 2421 (iw_handler) rt_ioctl_siwfrag, /* SIOCSIWFRAG */
2292 (iw_handler) rt_ioctl_siwfrag, /* SIOCSIWFRAG */ 2422 (iw_handler) rt_ioctl_giwfrag, /* SIOCGIWFRAG */
2293 (iw_handler) rt_ioctl_giwfrag, /* SIOCGIWFRAG */ 2423 (iw_handler) NULL, /* SIOCSIWTXPOW */
2294 (iw_handler) NULL, /* SIOCSIWTXPOW */ 2424 (iw_handler) NULL, /* SIOCGIWTXPOW */
2295 (iw_handler) NULL, /* SIOCGIWTXPOW */ 2425 (iw_handler) NULL, /* SIOCSIWRETRY */
2296 (iw_handler) NULL, /* SIOCSIWRETRY */ 2426 (iw_handler) NULL, /* SIOCGIWRETRY */
2297 (iw_handler) NULL, /* SIOCGIWRETRY */ 2427 (iw_handler) rt_ioctl_siwencode, /* SIOCSIWENCODE */
2298 (iw_handler) rt_ioctl_siwencode, /* SIOCSIWENCODE */ 2428 (iw_handler) rt_ioctl_giwencode, /* SIOCGIWENCODE */
2299 (iw_handler) rt_ioctl_giwencode, /* SIOCGIWENCODE */ 2429 (iw_handler) NULL, /* SIOCSIWPOWER */
2300 (iw_handler) NULL, /* SIOCSIWPOWER */ 2430 (iw_handler) NULL, /* SIOCGIWPOWER */
2301 (iw_handler) NULL, /* SIOCGIWPOWER */ 2431 (iw_handler) NULL, /* -- hole -- */
2302 (iw_handler) NULL, /* -- hole -- */ 2432 (iw_handler) NULL, /* -- hole -- */
2303 (iw_handler) NULL, /* -- hole -- */ 2433 (iw_handler) rt_ioctl_siwgenie, /* SIOCSIWGENIE */
2304 (iw_handler) rt_ioctl_siwgenie, /* SIOCSIWGENIE */ 2434 (iw_handler) rt_ioctl_giwgenie, /* SIOCGIWGENIE */
2305 (iw_handler) rt_ioctl_giwgenie, /* SIOCGIWGENIE */ 2435 (iw_handler) rt_ioctl_siwauth, /* SIOCSIWAUTH */
2306 (iw_handler) rt_ioctl_siwauth, /* SIOCSIWAUTH */ 2436 (iw_handler) rt_ioctl_giwauth, /* SIOCGIWAUTH */
2307 (iw_handler) rt_ioctl_giwauth, /* SIOCGIWAUTH */ 2437 (iw_handler) rt_ioctl_siwencodeext, /* SIOCSIWENCODEEXT */
2308 (iw_handler) rt_ioctl_siwencodeext, /* SIOCSIWENCODEEXT */ 2438 (iw_handler) rt_ioctl_giwencodeext, /* SIOCGIWENCODEEXT */
2309 (iw_handler) rt_ioctl_giwencodeext, /* SIOCGIWENCODEEXT */ 2439 (iw_handler) rt_ioctl_siwpmksa, /* SIOCSIWPMKSA */
2310 (iw_handler) rt_ioctl_siwpmksa, /* SIOCSIWPMKSA */
2311}; 2440};
2312 2441
2313const struct iw_handler_def rt28xx_iw_handler_def = 2442const struct iw_handler_def rt28xx_iw_handler_def = {
2314{ 2443 .standard = (iw_handler *) rt_handler,
2315 .standard = (iw_handler *) rt_handler, 2444 .num_standard = sizeof(rt_handler) / sizeof(iw_handler),
2316 .num_standard = sizeof(rt_handler) / sizeof(iw_handler),
2317#if IW_HANDLER_VERSION >= 7 2445#if IW_HANDLER_VERSION >= 7
2318 .get_wireless_stats = rt28xx_get_wireless_stats, 2446 .get_wireless_stats = rt28xx_get_wireless_stats,
2319#endif 2447#endif
2320}; 2448};
2321 2449
2322INT rt28xx_sta_ioctl( 2450INT rt28xx_sta_ioctl(IN struct net_device *net_dev,
2323 IN struct net_device *net_dev, 2451 IN OUT struct ifreq *rq, IN INT cmd)
2324 IN OUT struct ifreq *rq,
2325 IN INT cmd)
2326{ 2452{
2327 POS_COOKIE pObj; 2453 POS_COOKIE pObj;
2328 RTMP_ADAPTER *pAd = NULL; 2454 RTMP_ADAPTER *pAd = NULL;
2329 struct iwreq *wrq = (struct iwreq *) rq; 2455 struct iwreq *wrq = (struct iwreq *)rq;
2330 BOOLEAN StateMachineTouched = FALSE; 2456 BOOLEAN StateMachineTouched = FALSE;
2331 INT Status = NDIS_STATUS_SUCCESS; 2457 INT Status = NDIS_STATUS_SUCCESS;
2332 2458
2333 GET_PAD_FROM_NET_DEV(pAd, net_dev); 2459 GET_PAD_FROM_NET_DEV(pAd, net_dev);
2334 2460
2335 pObj = (POS_COOKIE) pAd->OS_Cookie; 2461 pObj = (POS_COOKIE) pAd->OS_Cookie;
2336 2462
2337 //check if the interface is down 2463 //check if the interface is down
2338 if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) 2464 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
2339 { 2465 {
2340 { 2466 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
2341 DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); 2467 return -ENETDOWN;
2342 return -ENETDOWN; 2468 }
2343 } 2469 }
2344 }
2345 2470
2346 { // determine this ioctl command is comming from which interface. 2471 { // determine this ioctl command is comming from which interface.
2347 pObj->ioctl_if_type = INT_MAIN; 2472 pObj->ioctl_if_type = INT_MAIN;
2348 pObj->ioctl_if = MAIN_MBSSID; 2473 pObj->ioctl_if = MAIN_MBSSID;
2349 } 2474 }
2350 2475
2351 switch(cmd) 2476 switch (cmd) {
2352 { 2477 case SIOCGIFHWADDR:
2353 case SIOCGIFHWADDR: 2478 DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIFHWADDR\n"));
2354 DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIFHWADDR\n")); 2479 memcpy(wrq->u.name, pAd->CurrentAddress, ETH_ALEN);
2355 memcpy(wrq->u.name, pAd->CurrentAddress, ETH_ALEN); 2480 break;
2356 break; 2481 case SIOCGIWNAME:
2357 case SIOCGIWNAME: 2482 {
2358 { 2483 char *name = &wrq->u.name[0];
2359 char *name=&wrq->u.name[0]; 2484 rt_ioctl_giwname(net_dev, NULL, name, NULL);
2360 rt_ioctl_giwname(net_dev, NULL, name, NULL);
2361 break; 2485 break;
2362 } 2486 }
2363 case SIOCGIWESSID: //Get ESSID 2487 case SIOCGIWESSID: //Get ESSID
2364 { 2488 {
2365 struct iw_point *essid=&wrq->u.essid; 2489 struct iw_point *essid = &wrq->u.essid;
2366 rt_ioctl_giwessid(net_dev, NULL, essid, essid->pointer); 2490 rt_ioctl_giwessid(net_dev, NULL, essid, essid->pointer);
2367 break; 2491 break;
2368 } 2492 }
2369 case SIOCSIWESSID: //Set ESSID 2493 case SIOCSIWESSID: //Set ESSID
2370 { 2494 {
2371 struct iw_point *essid=&wrq->u.essid; 2495 struct iw_point *essid = &wrq->u.essid;
2372 rt_ioctl_siwessid(net_dev, NULL, essid, essid->pointer); 2496 rt_ioctl_siwessid(net_dev, NULL, essid, essid->pointer);
2373 break; 2497 break;
2374 } 2498 }
2375 case SIOCSIWNWID: // set network id (the cell) 2499 case SIOCSIWNWID: // set network id (the cell)
2376 case SIOCGIWNWID: // get network id 2500 case SIOCGIWNWID: // get network id
2377 Status = -EOPNOTSUPP; 2501 Status = -EOPNOTSUPP;
2378 break; 2502 break;
2379 case SIOCSIWFREQ: //set channel/frequency (Hz) 2503 case SIOCSIWFREQ: //set channel/frequency (Hz)
2380 { 2504 {
2381 struct iw_freq *freq=&wrq->u.freq; 2505 struct iw_freq *freq = &wrq->u.freq;
2382 rt_ioctl_siwfreq(net_dev, NULL, freq, NULL); 2506 rt_ioctl_siwfreq(net_dev, NULL, freq, NULL);
2383 break; 2507 break;
2384 } 2508 }
2385 case SIOCGIWFREQ: // get channel/frequency (Hz) 2509 case SIOCGIWFREQ: // get channel/frequency (Hz)
2386 { 2510 {
2387 struct iw_freq *freq=&wrq->u.freq; 2511 struct iw_freq *freq = &wrq->u.freq;
2388 rt_ioctl_giwfreq(net_dev, NULL, freq, NULL); 2512 rt_ioctl_giwfreq(net_dev, NULL, freq, NULL);
2389 break; 2513 break;
2390 } 2514 }
2391 case SIOCSIWNICKN: //set node name/nickname 2515 case SIOCSIWNICKN: //set node name/nickname
2392 { 2516 {
2393 //struct iw_point *data=&wrq->u.data; 2517 //struct iw_point *data=&wrq->u.data;
2394 //rt_ioctl_siwnickn(net_dev, NULL, data, NULL); 2518 //rt_ioctl_siwnickn(net_dev, NULL, data, NULL);
2395 break; 2519 break;
2396 } 2520 }
2397 case SIOCGIWNICKN: //get node name/nickname 2521 case SIOCGIWNICKN: //get node name/nickname
2398 { 2522 {
2399 struct iw_point *erq = NULL; 2523 struct iw_point *erq = NULL;
2400 erq = &wrq->u.data; 2524 erq = &wrq->u.data;
2401 erq->length = strlen((PSTRING) pAd->nickname); 2525 erq->length = strlen((PSTRING) pAd->nickname);
2402 Status = copy_to_user(erq->pointer, pAd->nickname, erq->length); 2526 Status =
2527 copy_to_user(erq->pointer, pAd->nickname,
2528 erq->length);
2403 break; 2529 break;
2404 } 2530 }
2405 case SIOCGIWRATE: //get default bit rate (bps) 2531 case SIOCGIWRATE: //get default bit rate (bps)
2406 rt_ioctl_giwrate(net_dev, NULL, &wrq->u, NULL); 2532 rt_ioctl_giwrate(net_dev, NULL, &wrq->u, NULL);
2407 break; 2533 break;
2408 case SIOCSIWRATE: //set default bit rate (bps) 2534 case SIOCSIWRATE: //set default bit rate (bps)
2409 rt_ioctl_siwrate(net_dev, NULL, &wrq->u, NULL); 2535 rt_ioctl_siwrate(net_dev, NULL, &wrq->u, NULL);
2410 break; 2536 break;
2411 case SIOCGIWRTS: // get RTS/CTS threshold (bytes) 2537 case SIOCGIWRTS: // get RTS/CTS threshold (bytes)
2412 { 2538 {
2413 struct iw_param *rts=&wrq->u.rts; 2539 struct iw_param *rts = &wrq->u.rts;
2414 rt_ioctl_giwrts(net_dev, NULL, rts, NULL); 2540 rt_ioctl_giwrts(net_dev, NULL, rts, NULL);
2415 break; 2541 break;
2416 } 2542 }
2417 case SIOCSIWRTS: //set RTS/CTS threshold (bytes) 2543 case SIOCSIWRTS: //set RTS/CTS threshold (bytes)
2418 { 2544 {
2419 struct iw_param *rts=&wrq->u.rts; 2545 struct iw_param *rts = &wrq->u.rts;
2420 rt_ioctl_siwrts(net_dev, NULL, rts, NULL); 2546 rt_ioctl_siwrts(net_dev, NULL, rts, NULL);
2421 break; 2547 break;
2422 } 2548 }
2423 case SIOCGIWFRAG: //get fragmentation thr (bytes) 2549 case SIOCGIWFRAG: //get fragmentation thr (bytes)
2424 { 2550 {
2425 struct iw_param *frag=&wrq->u.frag; 2551 struct iw_param *frag = &wrq->u.frag;
2426 rt_ioctl_giwfrag(net_dev, NULL, frag, NULL); 2552 rt_ioctl_giwfrag(net_dev, NULL, frag, NULL);
2427 break; 2553 break;
2428 } 2554 }
2429 case SIOCSIWFRAG: //set fragmentation thr (bytes) 2555 case SIOCSIWFRAG: //set fragmentation thr (bytes)
2430 { 2556 {
2431 struct iw_param *frag=&wrq->u.frag; 2557 struct iw_param *frag = &wrq->u.frag;
2432 rt_ioctl_siwfrag(net_dev, NULL, frag, NULL); 2558 rt_ioctl_siwfrag(net_dev, NULL, frag, NULL);
2433 break; 2559 break;
2434 } 2560 }
2435 case SIOCGIWENCODE: //get encoding token & mode 2561 case SIOCGIWENCODE: //get encoding token & mode
2436 { 2562 {
2437 struct iw_point *erq=&wrq->u.encoding; 2563 struct iw_point *erq = &wrq->u.encoding;
2438 if(erq) 2564 if (erq)
2439 rt_ioctl_giwencode(net_dev, NULL, erq, erq->pointer); 2565 rt_ioctl_giwencode(net_dev, NULL, erq,
2566 erq->pointer);
2440 break; 2567 break;
2441 } 2568 }
2442 case SIOCSIWENCODE: //set encoding token & mode 2569 case SIOCSIWENCODE: //set encoding token & mode
2443 { 2570 {
2444 struct iw_point *erq=&wrq->u.encoding; 2571 struct iw_point *erq = &wrq->u.encoding;
2445 if(erq) 2572 if (erq)
2446 rt_ioctl_siwencode(net_dev, NULL, erq, erq->pointer); 2573 rt_ioctl_siwencode(net_dev, NULL, erq,
2574 erq->pointer);
2447 break; 2575 break;
2448 } 2576 }
2449 case SIOCGIWAP: //get access point MAC addresses 2577 case SIOCGIWAP: //get access point MAC addresses
2450 { 2578 {
2451 struct sockaddr *ap_addr=&wrq->u.ap_addr; 2579 struct sockaddr *ap_addr = &wrq->u.ap_addr;
2452 rt_ioctl_giwap(net_dev, NULL, ap_addr, ap_addr->sa_data); 2580 rt_ioctl_giwap(net_dev, NULL, ap_addr,
2581 ap_addr->sa_data);
2453 break; 2582 break;
2454 } 2583 }
2455 case SIOCSIWAP: //set access point MAC addresses 2584 case SIOCSIWAP: //set access point MAC addresses
2456 { 2585 {
2457 struct sockaddr *ap_addr=&wrq->u.ap_addr; 2586 struct sockaddr *ap_addr = &wrq->u.ap_addr;
2458 rt_ioctl_siwap(net_dev, NULL, ap_addr, ap_addr->sa_data); 2587 rt_ioctl_siwap(net_dev, NULL, ap_addr,
2588 ap_addr->sa_data);
2459 break; 2589 break;
2460 } 2590 }
2461 case SIOCGIWMODE: //get operation mode 2591 case SIOCGIWMODE: //get operation mode
2462 { 2592 {
2463 __u32 *mode=&wrq->u.mode; 2593 __u32 *mode = &wrq->u.mode;
2464 rt_ioctl_giwmode(net_dev, NULL, mode, NULL); 2594 rt_ioctl_giwmode(net_dev, NULL, mode, NULL);
2465 break; 2595 break;
2466 } 2596 }
2467 case SIOCSIWMODE: //set operation mode 2597 case SIOCSIWMODE: //set operation mode
2468 { 2598 {
2469 __u32 *mode=&wrq->u.mode; 2599 __u32 *mode = &wrq->u.mode;
2470 rt_ioctl_siwmode(net_dev, NULL, mode, NULL); 2600 rt_ioctl_siwmode(net_dev, NULL, mode, NULL);
2471 break; 2601 break;
2472 } 2602 }
2473 case SIOCGIWSENS: //get sensitivity (dBm) 2603 case SIOCGIWSENS: //get sensitivity (dBm)
2474 case SIOCSIWSENS: //set sensitivity (dBm) 2604 case SIOCSIWSENS: //set sensitivity (dBm)
2475 case SIOCGIWPOWER: //get Power Management settings 2605 case SIOCGIWPOWER: //get Power Management settings
2476 case SIOCSIWPOWER: //set Power Management settings 2606 case SIOCSIWPOWER: //set Power Management settings
2477 case SIOCGIWTXPOW: //get transmit power (dBm) 2607 case SIOCGIWTXPOW: //get transmit power (dBm)
2478 case SIOCSIWTXPOW: //set transmit power (dBm) 2608 case SIOCSIWTXPOW: //set transmit power (dBm)
2479 case SIOCGIWRANGE: //Get range of parameters 2609 case SIOCGIWRANGE: //Get range of parameters
2480 case SIOCGIWRETRY: //get retry limits and lifetime 2610 case SIOCGIWRETRY: //get retry limits and lifetime
2481 case SIOCSIWRETRY: //set retry limits and lifetime 2611 case SIOCSIWRETRY: //set retry limits and lifetime
2482 case RT_PRIV_IOCTL: 2612 case RT_PRIV_IOCTL:
2483 case RT_PRIV_IOCTL_EXT: 2613 case RT_PRIV_IOCTL_EXT:
2484 case RTPRIV_IOCTL_SET: 2614 case RTPRIV_IOCTL_SET:
2485 case RTPRIV_IOCTL_GSITESURVEY: 2615 case RTPRIV_IOCTL_GSITESURVEY:
2486 case SIOCGIWPRIV: 2616 case SIOCGIWPRIV:
2487 Status = -EOPNOTSUPP; 2617 Status = -EOPNOTSUPP;
2488 break; 2618 break;
2489 case SIOCETHTOOL: 2619 case SIOCETHTOOL:
2490 break; 2620 break;
2491 default: 2621 default:
2492 DBGPRINT(RT_DEBUG_ERROR, ("IOCTL::unknown IOCTL's cmd = 0x%08x\n", cmd)); 2622 DBGPRINT(RT_DEBUG_ERROR,
2493 Status = -EOPNOTSUPP; 2623 ("IOCTL::unknown IOCTL's cmd = 0x%08x\n", cmd));
2494 break; 2624 Status = -EOPNOTSUPP;
2625 break;
2495 } 2626 }
2496 2627
2497 if(StateMachineTouched) // Upper layer sent a MLME-related operations 2628 if (StateMachineTouched) // Upper layer sent a MLME-related operations
2498 RTMP_MLME_HANDLER(pAd); 2629 RTMP_MLME_HANDLER(pAd);
2499 2630
2500 return Status; 2631 return Status;
2501} 2632}
@@ -2508,77 +2639,75 @@ INT rt28xx_sta_ioctl(
2508 TRUE if all parameters are OK, FALSE otherwise 2639 TRUE if all parameters are OK, FALSE otherwise
2509 ========================================================================== 2640 ==========================================================================
2510*/ 2641*/
2511INT Set_SSID_Proc( 2642INT Set_SSID_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg)
2512 IN PRTMP_ADAPTER pAdapter,
2513 IN PSTRING arg)
2514{ 2643{
2515 NDIS_802_11_SSID Ssid, *pSsid=NULL; 2644 NDIS_802_11_SSID Ssid, *pSsid = NULL;
2516 BOOLEAN StateMachineTouched = FALSE; 2645 BOOLEAN StateMachineTouched = FALSE;
2517 int success = TRUE; 2646 int success = TRUE;
2518 2647
2519 if( strlen(arg) <= MAX_LEN_OF_SSID) 2648 if (strlen(arg) <= MAX_LEN_OF_SSID) {
2520 { 2649 NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
2521 NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); 2650 if (strlen(arg) != 0) {
2522 if (strlen(arg) != 0) 2651 NdisMoveMemory(Ssid.Ssid, arg, strlen(arg));
2523 { 2652 Ssid.SsidLength = strlen(arg);
2524 NdisMoveMemory(Ssid.Ssid, arg, strlen(arg)); 2653 } else //ANY ssid
2525 Ssid.SsidLength = strlen(arg); 2654 {
2526 } 2655 Ssid.SsidLength = 0;
2527 else //ANY ssid 2656 memcpy(Ssid.Ssid, "", 0);
2528 {
2529 Ssid.SsidLength = 0;
2530 memcpy(Ssid.Ssid, "", 0);
2531 pAdapter->StaCfg.BssType = BSS_INFRA; 2657 pAdapter->StaCfg.BssType = BSS_INFRA;
2532 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; 2658 pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
2533 pAdapter->StaCfg.WepStatus = Ndis802_11EncryptionDisabled; 2659 pAdapter->StaCfg.WepStatus =
2660 Ndis802_11EncryptionDisabled;
2534 } 2661 }
2535 pSsid = &Ssid; 2662 pSsid = &Ssid;
2536 2663
2537 if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) 2664 if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) {
2538 { 2665 RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
2539 RTMP_MLME_RESET_STATE_MACHINE(pAdapter); 2666 DBGPRINT(RT_DEBUG_TRACE,
2540 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); 2667 ("!!! MLME busy, reset MLME state machine !!!\n"));
2541 } 2668 }
2542 2669
2543 if ((pAdapter->StaCfg.WpaPassPhraseLen >= 8) && 2670 if ((pAdapter->StaCfg.WpaPassPhraseLen >= 8) &&
2544 (pAdapter->StaCfg.WpaPassPhraseLen <= 64)) 2671 (pAdapter->StaCfg.WpaPassPhraseLen <= 64)) {
2545 { 2672 STRING passphrase_str[65] = { 0 };
2546 STRING passphrase_str[65] = {0};
2547 UCHAR keyMaterial[40]; 2673 UCHAR keyMaterial[40];
2548 2674
2549 RTMPMoveMemory(passphrase_str, pAdapter->StaCfg.WpaPassPhrase, pAdapter->StaCfg.WpaPassPhraseLen); 2675 RTMPMoveMemory(passphrase_str,
2676 pAdapter->StaCfg.WpaPassPhrase,
2677 pAdapter->StaCfg.WpaPassPhraseLen);
2550 RTMPZeroMemory(pAdapter->StaCfg.PMK, 32); 2678 RTMPZeroMemory(pAdapter->StaCfg.PMK, 32);
2551 if (pAdapter->StaCfg.WpaPassPhraseLen == 64) 2679 if (pAdapter->StaCfg.WpaPassPhraseLen == 64) {
2552 { 2680 AtoH((PSTRING) pAdapter->StaCfg.WpaPassPhrase,
2553 AtoH((PSTRING) pAdapter->StaCfg.WpaPassPhrase, pAdapter->StaCfg.PMK, 32); 2681 pAdapter->StaCfg.PMK, 32);
2554 } 2682 } else {
2555 else 2683 PasswordHash((PSTRING) pAdapter->StaCfg.
2556 { 2684 WpaPassPhrase, Ssid.Ssid,
2557 PasswordHash((PSTRING) pAdapter->StaCfg.WpaPassPhrase, Ssid.Ssid, Ssid.SsidLength, keyMaterial); 2685 Ssid.SsidLength, keyMaterial);
2558 NdisMoveMemory(pAdapter->StaCfg.PMK, keyMaterial, 32); 2686 NdisMoveMemory(pAdapter->StaCfg.PMK,
2687 keyMaterial, 32);
2559 } 2688 }
2560 } 2689 }
2561 2690
2562 pAdapter->MlmeAux.CurrReqIsFromNdis = TRUE; 2691 pAdapter->MlmeAux.CurrReqIsFromNdis = TRUE;
2563 pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE; 2692 pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
2564 pAdapter->bConfigChanged = TRUE; 2693 pAdapter->bConfigChanged = TRUE;
2565 2694
2566 MlmeEnqueue(pAdapter, 2695 MlmeEnqueue(pAdapter,
2567 MLME_CNTL_STATE_MACHINE, 2696 MLME_CNTL_STATE_MACHINE,
2568 OID_802_11_SSID, 2697 OID_802_11_SSID,
2569 sizeof(NDIS_802_11_SSID), 2698 sizeof(NDIS_802_11_SSID), (VOID *) pSsid);
2570 (VOID *)pSsid); 2699
2571 2700 StateMachineTouched = TRUE;
2572 StateMachineTouched = TRUE; 2701 DBGPRINT(RT_DEBUG_TRACE,
2573 DBGPRINT(RT_DEBUG_TRACE, ("Set_SSID_Proc::(Len=%d,Ssid=%s)\n", Ssid.SsidLength, Ssid.Ssid)); 2702 ("Set_SSID_Proc::(Len=%d,Ssid=%s)\n", Ssid.SsidLength,
2574 } 2703 Ssid.Ssid));
2575 else 2704 } else
2576 success = FALSE; 2705 success = FALSE;
2577 2706
2578 if (StateMachineTouched) // Upper layer sent a MLME-related operations 2707 if (StateMachineTouched) // Upper layer sent a MLME-related operations
2579 RTMP_MLME_HANDLER(pAdapter); 2708 RTMP_MLME_HANDLER(pAdapter);
2580 2709
2581 return success; 2710 return success;
2582} 2711}
2583 2712
2584/* 2713/*
@@ -2589,156 +2718,176 @@ INT Set_SSID_Proc(
2589 TRUE if all parameters are OK, FALSE otherwise 2718 TRUE if all parameters are OK, FALSE otherwise
2590 ========================================================================== 2719 ==========================================================================
2591*/ 2720*/
2592INT Set_NetworkType_Proc( 2721INT Set_NetworkType_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg)
2593 IN PRTMP_ADAPTER pAdapter,
2594 IN PSTRING arg)
2595{ 2722{
2596 UINT32 Value = 0; 2723 UINT32 Value = 0;
2597 2724
2598 if (strcmp(arg, "Adhoc") == 0) 2725 if (strcmp(arg, "Adhoc") == 0) {
2599 { 2726 if (pAdapter->StaCfg.BssType != BSS_ADHOC) {
2600 if (pAdapter->StaCfg.BssType != BSS_ADHOC)
2601 {
2602 // Config has changed 2727 // Config has changed
2603 pAdapter->bConfigChanged = TRUE; 2728 pAdapter->bConfigChanged = TRUE;
2604 if (MONITOR_ON(pAdapter)) 2729 if (MONITOR_ON(pAdapter)) {
2605 { 2730 RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG,
2606 RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG, STANORMAL); 2731 STANORMAL);
2607 RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value); 2732 RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value);
2608 Value &= (~0x80); 2733 Value &= (~0x80);
2609 RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value); 2734 RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value);
2610 OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED); 2735 OPSTATUS_CLEAR_FLAG(pAdapter,
2611 pAdapter->StaCfg.bAutoReconnect = TRUE; 2736 fOP_STATUS_MEDIA_STATE_CONNECTED);
2612 LinkDown(pAdapter, FALSE); 2737 pAdapter->StaCfg.bAutoReconnect = TRUE;
2613 } 2738 LinkDown(pAdapter, FALSE);
2614 if (INFRA_ON(pAdapter)) 2739 }
2615 { 2740 if (INFRA_ON(pAdapter)) {
2616 //BOOLEAN Cancelled; 2741 //BOOLEAN Cancelled;
2617 // Set the AutoReconnectSsid to prevent it reconnect to old SSID 2742 // Set the AutoReconnectSsid to prevent it reconnect to old SSID
2618 // Since calling this indicate user don't want to connect to that SSID anymore. 2743 // Since calling this indicate user don't want to connect to that SSID anymore.
2619 pAdapter->MlmeAux.AutoReconnectSsidLen= 32; 2744 pAdapter->MlmeAux.AutoReconnectSsidLen = 32;
2620 NdisZeroMemory(pAdapter->MlmeAux.AutoReconnectSsid, pAdapter->MlmeAux.AutoReconnectSsidLen); 2745 NdisZeroMemory(pAdapter->MlmeAux.
2746 AutoReconnectSsid,
2747 pAdapter->MlmeAux.
2748 AutoReconnectSsidLen);
2621 2749
2622 LinkDown(pAdapter, FALSE); 2750 LinkDown(pAdapter, FALSE);
2623 2751
2624 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event BB!\n")); 2752 DBGPRINT(RT_DEBUG_TRACE,
2753 ("NDIS_STATUS_MEDIA_DISCONNECT Event BB!\n"));
2625 } 2754 }
2626 } 2755 }
2627 pAdapter->StaCfg.BssType = BSS_ADHOC; 2756 pAdapter->StaCfg.BssType = BSS_ADHOC;
2628 pAdapter->net_dev->type = pAdapter->StaCfg.OriDevType; 2757 pAdapter->net_dev->type = pAdapter->StaCfg.OriDevType;
2629 DBGPRINT(RT_DEBUG_TRACE, ("===>Set_NetworkType_Proc::(AD-HOC)\n")); 2758 DBGPRINT(RT_DEBUG_TRACE,
2630 } 2759 ("===>Set_NetworkType_Proc::(AD-HOC)\n"));
2631 else if (strcmp(arg, "Infra") == 0) 2760 } else if (strcmp(arg, "Infra") == 0) {
2632 { 2761 if (pAdapter->StaCfg.BssType != BSS_INFRA) {
2633 if (pAdapter->StaCfg.BssType != BSS_INFRA)
2634 {
2635 // Config has changed 2762 // Config has changed
2636 pAdapter->bConfigChanged = TRUE; 2763 pAdapter->bConfigChanged = TRUE;
2637 if (MONITOR_ON(pAdapter)) 2764 if (MONITOR_ON(pAdapter)) {
2638 { 2765 RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG,
2639 RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG, STANORMAL); 2766 STANORMAL);
2640 RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value); 2767 RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value);
2641 Value &= (~0x80); 2768 Value &= (~0x80);
2642 RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value); 2769 RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value);
2643 OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED); 2770 OPSTATUS_CLEAR_FLAG(pAdapter,
2644 pAdapter->StaCfg.bAutoReconnect = TRUE; 2771 fOP_STATUS_MEDIA_STATE_CONNECTED);
2645 LinkDown(pAdapter, FALSE); 2772 pAdapter->StaCfg.bAutoReconnect = TRUE;
2646 } 2773 LinkDown(pAdapter, FALSE);
2647 if (ADHOC_ON(pAdapter)) 2774 }
2648 { 2775 if (ADHOC_ON(pAdapter)) {
2649 // Set the AutoReconnectSsid to prevent it reconnect to old SSID 2776 // Set the AutoReconnectSsid to prevent it reconnect to old SSID
2650 // Since calling this indicate user don't want to connect to that SSID anymore. 2777 // Since calling this indicate user don't want to connect to that SSID anymore.
2651 pAdapter->MlmeAux.AutoReconnectSsidLen= 32; 2778 pAdapter->MlmeAux.AutoReconnectSsidLen = 32;
2652 NdisZeroMemory(pAdapter->MlmeAux.AutoReconnectSsid, pAdapter->MlmeAux.AutoReconnectSsidLen); 2779 NdisZeroMemory(pAdapter->MlmeAux.
2780 AutoReconnectSsid,
2781 pAdapter->MlmeAux.
2782 AutoReconnectSsidLen);
2653 2783
2654 LinkDown(pAdapter, FALSE); 2784 LinkDown(pAdapter, FALSE);
2655 } 2785 }
2656 } 2786 }
2657 pAdapter->StaCfg.BssType = BSS_INFRA; 2787 pAdapter->StaCfg.BssType = BSS_INFRA;
2658 pAdapter->net_dev->type = pAdapter->StaCfg.OriDevType; 2788 pAdapter->net_dev->type = pAdapter->StaCfg.OriDevType;
2659 DBGPRINT(RT_DEBUG_TRACE, ("===>Set_NetworkType_Proc::(INFRA)\n")); 2789 DBGPRINT(RT_DEBUG_TRACE,
2660 } 2790 ("===>Set_NetworkType_Proc::(INFRA)\n"));
2661 else if (strcmp(arg, "Monitor") == 0) 2791 } else if (strcmp(arg, "Monitor") == 0) {
2662 { 2792 UCHAR bbpValue = 0;
2663 UCHAR bbpValue = 0;
2664 BCN_TIME_CFG_STRUC csr; 2793 BCN_TIME_CFG_STRUC csr;
2665 OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_INFRA_ON); 2794 OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_INFRA_ON);
2666 OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_ADHOC_ON); 2795 OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_ADHOC_ON);
2667 OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED); 2796 OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED);
2668 // disable all periodic state machine 2797 // disable all periodic state machine
2669 pAdapter->StaCfg.bAutoReconnect = FALSE; 2798 pAdapter->StaCfg.bAutoReconnect = FALSE;
2670 // reset all mlme state machine 2799 // reset all mlme state machine
2671 RTMP_MLME_RESET_STATE_MACHINE(pAdapter); 2800 RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
2672 DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_MEDIA_STATE_CONNECTED \n")); 2801 DBGPRINT(RT_DEBUG_TRACE,
2673 if (pAdapter->CommonCfg.CentralChannel == 0) 2802 ("fOP_STATUS_MEDIA_STATE_CONNECTED \n"));
2674 { 2803 if (pAdapter->CommonCfg.CentralChannel == 0) {
2675 if (pAdapter->CommonCfg.PhyMode == PHY_11AN_MIXED) 2804 if (pAdapter->CommonCfg.PhyMode == PHY_11AN_MIXED)
2676 pAdapter->CommonCfg.CentralChannel = 36; 2805 pAdapter->CommonCfg.CentralChannel = 36;
2677 else 2806 else
2678 pAdapter->CommonCfg.CentralChannel = 6; 2807 pAdapter->CommonCfg.CentralChannel = 6;
2679 } 2808 } else
2680 else 2809 N_ChannelCheck(pAdapter);
2681 N_ChannelCheck(pAdapter); 2810
2682 2811 if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
2683 if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && 2812 pAdapter->CommonCfg.RegTransmitSetting.field.BW == BW_40 &&
2684 pAdapter->CommonCfg.RegTransmitSetting.field.BW == BW_40 && 2813 pAdapter->CommonCfg.RegTransmitSetting.field.EXTCHA ==
2685 pAdapter->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) 2814 EXTCHA_ABOVE) {
2686 {
2687 // 40MHz ,control channel at lower 2815 // 40MHz ,control channel at lower
2688 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4, &bbpValue); 2816 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4,
2817 &bbpValue);
2689 bbpValue &= (~0x18); 2818 bbpValue &= (~0x18);
2690 bbpValue |= 0x10; 2819 bbpValue |= 0x10;
2691 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4, bbpValue); 2820 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4,
2821 bbpValue);
2692 pAdapter->CommonCfg.BBPCurrentBW = BW_40; 2822 pAdapter->CommonCfg.BBPCurrentBW = BW_40;
2693 // RX : control channel at lower 2823 // RX : control channel at lower
2694 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R3, &bbpValue); 2824 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R3,
2825 &bbpValue);
2695 bbpValue &= (~0x20); 2826 bbpValue &= (~0x20);
2696 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R3, bbpValue); 2827 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R3,
2828 bbpValue);
2697 2829
2698 RTMP_IO_READ32(pAdapter, TX_BAND_CFG, &Value); 2830 RTMP_IO_READ32(pAdapter, TX_BAND_CFG, &Value);
2699 Value &= 0xfffffffe; 2831 Value &= 0xfffffffe;
2700 RTMP_IO_WRITE32(pAdapter, TX_BAND_CFG, Value); 2832 RTMP_IO_WRITE32(pAdapter, TX_BAND_CFG, Value);
2701 pAdapter->CommonCfg.CentralChannel = pAdapter->CommonCfg.Channel + 2; 2833 pAdapter->CommonCfg.CentralChannel =
2702 AsicSwitchChannel(pAdapter, pAdapter->CommonCfg.CentralChannel, FALSE); 2834 pAdapter->CommonCfg.Channel + 2;
2703 AsicLockChannel(pAdapter, pAdapter->CommonCfg.CentralChannel); 2835 AsicSwitchChannel(pAdapter,
2704 DBGPRINT(RT_DEBUG_TRACE, ("BW_40 ,control_channel(%d), CentralChannel(%d) \n", 2836 pAdapter->CommonCfg.CentralChannel,
2705 pAdapter->CommonCfg.Channel, 2837 FALSE);
2706 pAdapter->CommonCfg.CentralChannel)); 2838 AsicLockChannel(pAdapter,
2707 } 2839 pAdapter->CommonCfg.CentralChannel);
2708 else if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && 2840 DBGPRINT(RT_DEBUG_TRACE,
2709 pAdapter->CommonCfg.RegTransmitSetting.field.BW == BW_40 && 2841 ("BW_40 ,control_channel(%d), CentralChannel(%d) \n",
2710 pAdapter->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW) 2842 pAdapter->CommonCfg.Channel,
2711 { 2843 pAdapter->CommonCfg.CentralChannel));
2844 } else if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED
2845 && pAdapter->CommonCfg.RegTransmitSetting.field.BW ==
2846 BW_40
2847 && pAdapter->CommonCfg.RegTransmitSetting.field.
2848 EXTCHA == EXTCHA_BELOW) {
2712 // 40MHz ,control channel at upper 2849 // 40MHz ,control channel at upper
2713 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4, &bbpValue); 2850 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4,
2851 &bbpValue);
2714 bbpValue &= (~0x18); 2852 bbpValue &= (~0x18);
2715 bbpValue |= 0x10; 2853 bbpValue |= 0x10;
2716 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4, bbpValue); 2854 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4,
2855 bbpValue);
2717 pAdapter->CommonCfg.BBPCurrentBW = BW_40; 2856 pAdapter->CommonCfg.BBPCurrentBW = BW_40;
2718 RTMP_IO_READ32(pAdapter, TX_BAND_CFG, &Value); 2857 RTMP_IO_READ32(pAdapter, TX_BAND_CFG, &Value);
2719 Value |= 0x1; 2858 Value |= 0x1;
2720 RTMP_IO_WRITE32(pAdapter, TX_BAND_CFG, Value); 2859 RTMP_IO_WRITE32(pAdapter, TX_BAND_CFG, Value);
2721 2860
2722 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R3, &bbpValue); 2861 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R3,
2862 &bbpValue);
2723 bbpValue |= (0x20); 2863 bbpValue |= (0x20);
2724 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R3, bbpValue); 2864 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R3,
2725 pAdapter->CommonCfg.CentralChannel = pAdapter->CommonCfg.Channel - 2; 2865 bbpValue);
2726 AsicSwitchChannel(pAdapter, pAdapter->CommonCfg.CentralChannel, FALSE); 2866 pAdapter->CommonCfg.CentralChannel =
2727 AsicLockChannel(pAdapter, pAdapter->CommonCfg.CentralChannel); 2867 pAdapter->CommonCfg.Channel - 2;
2728 DBGPRINT(RT_DEBUG_TRACE, ("BW_40 ,control_channel(%d), CentralChannel(%d) \n", 2868 AsicSwitchChannel(pAdapter,
2729 pAdapter->CommonCfg.Channel, 2869 pAdapter->CommonCfg.CentralChannel,
2730 pAdapter->CommonCfg.CentralChannel)); 2870 FALSE);
2731 } 2871 AsicLockChannel(pAdapter,
2732 else 2872 pAdapter->CommonCfg.CentralChannel);
2733 { 2873 DBGPRINT(RT_DEBUG_TRACE,
2874 ("BW_40 ,control_channel(%d), CentralChannel(%d) \n",
2875 pAdapter->CommonCfg.Channel,
2876 pAdapter->CommonCfg.CentralChannel));
2877 } else {
2734 // 20MHz 2878 // 20MHz
2735 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4, &bbpValue); 2879 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4,
2880 &bbpValue);
2736 bbpValue &= (~0x18); 2881 bbpValue &= (~0x18);
2737 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4, bbpValue); 2882 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4,
2883 bbpValue);
2738 pAdapter->CommonCfg.BBPCurrentBW = BW_20; 2884 pAdapter->CommonCfg.BBPCurrentBW = BW_20;
2739 AsicSwitchChannel(pAdapter, pAdapter->CommonCfg.Channel, FALSE); 2885 AsicSwitchChannel(pAdapter, pAdapter->CommonCfg.Channel,
2886 FALSE);
2740 AsicLockChannel(pAdapter, pAdapter->CommonCfg.Channel); 2887 AsicLockChannel(pAdapter, pAdapter->CommonCfg.Channel);
2741 DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAdapter->CommonCfg.Channel)); 2888 DBGPRINT(RT_DEBUG_TRACE,
2889 ("BW_20, Channel(%d)\n",
2890 pAdapter->CommonCfg.Channel));
2742 } 2891 }
2743 // Enable Rx with promiscuous reception 2892 // Enable Rx with promiscuous reception
2744 RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG, 0x3); 2893 RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG, 0x3);
@@ -2754,14 +2903,16 @@ INT Set_NetworkType_Proc(
2754 RTMP_IO_WRITE32(pAdapter, BCN_TIME_CFG, csr.word); 2903 RTMP_IO_WRITE32(pAdapter, BCN_TIME_CFG, csr.word);
2755 2904
2756 pAdapter->StaCfg.BssType = BSS_MONITOR; 2905 pAdapter->StaCfg.BssType = BSS_MONITOR;
2757 pAdapter->net_dev->type = ARPHRD_IEEE80211_PRISM; //ARPHRD_IEEE80211; // IEEE80211 2906 pAdapter->net_dev->type = ARPHRD_IEEE80211_PRISM; //ARPHRD_IEEE80211; // IEEE80211
2758 DBGPRINT(RT_DEBUG_TRACE, ("===>Set_NetworkType_Proc::(MONITOR)\n")); 2907 DBGPRINT(RT_DEBUG_TRACE,
2759 } 2908 ("===>Set_NetworkType_Proc::(MONITOR)\n"));
2760 2909 }
2761 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key 2910 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
2762 pAdapter->StaCfg.WpaState = SS_NOTUSE; 2911 pAdapter->StaCfg.WpaState = SS_NOTUSE;
2763 2912
2764 DBGPRINT(RT_DEBUG_TRACE, ("Set_NetworkType_Proc::(NetworkType=%d)\n", pAdapter->StaCfg.BssType)); 2913 DBGPRINT(RT_DEBUG_TRACE,
2914 ("Set_NetworkType_Proc::(NetworkType=%d)\n",
2915 pAdapter->StaCfg.BssType));
2765 2916
2766 return TRUE; 2917 return TRUE;
2767} 2918}
diff --git a/drivers/staging/rt2860/usb_main_dev.c b/drivers/staging/rt2860/usb_main_dev.c
index 00732be4f00..ebc22616d1e 100644
--- a/drivers/staging/rt2860/usb_main_dev.c
+++ b/drivers/staging/rt2860/usb_main_dev.c
@@ -26,7 +26,6 @@
26 26
27#include "rt_config.h" 27#include "rt_config.h"
28 28
29
30// Following information will be show when you run 'modinfo' 29// Following information will be show when you run 'modinfo'
31// *** If you have a solution for the bug in current version of driver, please mail to me. 30// *** If you have a solution for the bug in current version of driver, please mail to me.
32// Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. *** 31// Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. ***
@@ -37,141 +36,135 @@ MODULE_LICENSE("GPL");
37MODULE_VERSION(STA_DRIVER_VERSION); 36MODULE_VERSION(STA_DRIVER_VERSION);
38#endif 37#endif
39 38
40
41/* module table */ 39/* module table */
42struct usb_device_id rtusb_usb_id[] = { 40struct usb_device_id rtusb_usb_id[] = {
43#ifdef RT2870 41#ifdef RT2870
44 {USB_DEVICE(0x148F,0x2770)}, /* Ralink */ 42 {USB_DEVICE(0x148F, 0x2770)}, /* Ralink */
45 {USB_DEVICE(0x148F,0x2870)}, /* Ralink */ 43 {USB_DEVICE(0x148F, 0x2870)}, /* Ralink */
46 {USB_DEVICE(0x07B8,0x2870)}, /* AboCom */ 44 {USB_DEVICE(0x07B8, 0x2870)}, /* AboCom */
47 {USB_DEVICE(0x07B8,0x2770)}, /* AboCom */ 45 {USB_DEVICE(0x07B8, 0x2770)}, /* AboCom */
48 {USB_DEVICE(0x0DF6,0x0039)}, /* Sitecom 2770 */ 46 {USB_DEVICE(0x0DF6, 0x0039)}, /* Sitecom 2770 */
49 {USB_DEVICE(0x083A,0x7512)}, /* Arcadyan 2770 */ 47 {USB_DEVICE(0x083A, 0x7512)}, /* Arcadyan 2770 */
50 {USB_DEVICE(0x0789,0x0162)}, /* Logitec 2870 */ 48 {USB_DEVICE(0x0789, 0x0162)}, /* Logitec 2870 */
51 {USB_DEVICE(0x0789,0x0163)}, /* Logitec 2870 */ 49 {USB_DEVICE(0x0789, 0x0163)}, /* Logitec 2870 */
52 {USB_DEVICE(0x0789,0x0164)}, /* Logitec 2870 */ 50 {USB_DEVICE(0x0789, 0x0164)}, /* Logitec 2870 */
53 {USB_DEVICE(0x177f,0x0302)}, /* lsusb */ 51 {USB_DEVICE(0x177f, 0x0302)}, /* lsusb */
54 {USB_DEVICE(0x0B05,0x1731)}, /* Asus */ 52 {USB_DEVICE(0x0B05, 0x1731)}, /* Asus */
55 {USB_DEVICE(0x0B05,0x1732)}, /* Asus */ 53 {USB_DEVICE(0x0B05, 0x1732)}, /* Asus */
56 {USB_DEVICE(0x0B05,0x1742)}, /* Asus */ 54 {USB_DEVICE(0x0B05, 0x1742)}, /* Asus */
57 {USB_DEVICE(0x0DF6,0x0017)}, /* Sitecom */ 55 {USB_DEVICE(0x0DF6, 0x0017)}, /* Sitecom */
58 {USB_DEVICE(0x0DF6,0x002B)}, /* Sitecom */ 56 {USB_DEVICE(0x0DF6, 0x002B)}, /* Sitecom */
59 {USB_DEVICE(0x0DF6,0x002C)}, /* Sitecom */ 57 {USB_DEVICE(0x0DF6, 0x002C)}, /* Sitecom */
60 {USB_DEVICE(0x0DF6,0x002D)}, /* Sitecom */ 58 {USB_DEVICE(0x0DF6, 0x002D)}, /* Sitecom */
61 {USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ 59 {USB_DEVICE(0x14B2, 0x3C06)}, /* Conceptronic */
62 {USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ 60 {USB_DEVICE(0x14B2, 0x3C28)}, /* Conceptronic */
63 {USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ 61 {USB_DEVICE(0x2019, 0xED06)}, /* Planex Communications, Inc. */
64 {USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */ 62 {USB_DEVICE(0x07D1, 0x3C09)}, /* D-Link */
65 {USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */ 63 {USB_DEVICE(0x07D1, 0x3C11)}, /* D-Link */
66 {USB_DEVICE(0x14B2,0x3C07)}, /* AL */ 64 {USB_DEVICE(0x14B2, 0x3C07)}, /* AL */
67 {USB_DEVICE(0x050D,0x8053)}, /* Belkin */ 65 {USB_DEVICE(0x050D, 0x8053)}, /* Belkin */
68 {USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */ 66 {USB_DEVICE(0x14B2, 0x3C23)}, /* Airlink */
69 {USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */ 67 {USB_DEVICE(0x14B2, 0x3C27)}, /* Airlink */
70 {USB_DEVICE(0x07AA,0x002F)}, /* Corega */ 68 {USB_DEVICE(0x07AA, 0x002F)}, /* Corega */
71 {USB_DEVICE(0x07AA,0x003C)}, /* Corega */ 69 {USB_DEVICE(0x07AA, 0x003C)}, /* Corega */
72 {USB_DEVICE(0x07AA,0x003F)}, /* Corega */ 70 {USB_DEVICE(0x07AA, 0x003F)}, /* Corega */
73 {USB_DEVICE(0x1044,0x800B)}, /* Gigabyte */ 71 {USB_DEVICE(0x1044, 0x800B)}, /* Gigabyte */
74 {USB_DEVICE(0x15A9,0x0006)}, /* Sparklan */ 72 {USB_DEVICE(0x15A9, 0x0006)}, /* Sparklan */
75 {USB_DEVICE(0x083A,0xB522)}, /* SMC */ 73 {USB_DEVICE(0x083A, 0xB522)}, /* SMC */
76 {USB_DEVICE(0x083A,0xA618)}, /* SMC */ 74 {USB_DEVICE(0x083A, 0xA618)}, /* SMC */
77 {USB_DEVICE(0x083A,0x8522)}, /* Arcadyan */ 75 {USB_DEVICE(0x083A, 0x8522)}, /* Arcadyan */
78 {USB_DEVICE(0x083A,0x7522)}, /* Arcadyan */ 76 {USB_DEVICE(0x083A, 0x7522)}, /* Arcadyan */
79 {USB_DEVICE(0x0CDE,0x0022)}, /* ZCOM */ 77 {USB_DEVICE(0x0CDE, 0x0022)}, /* ZCOM */
80 {USB_DEVICE(0x0586,0x3416)}, /* Zyxel */ 78 {USB_DEVICE(0x0586, 0x3416)}, /* Zyxel */
81 {USB_DEVICE(0x0CDE,0x0025)}, /* Zyxel */ 79 {USB_DEVICE(0x0CDE, 0x0025)}, /* Zyxel */
82 {USB_DEVICE(0x1740,0x9701)}, /* EnGenius */ 80 {USB_DEVICE(0x1740, 0x9701)}, /* EnGenius */
83 {USB_DEVICE(0x1740,0x9702)}, /* EnGenius */ 81 {USB_DEVICE(0x1740, 0x9702)}, /* EnGenius */
84 {USB_DEVICE(0x0471,0x200f)}, /* Philips */ 82 {USB_DEVICE(0x0471, 0x200f)}, /* Philips */
85 {USB_DEVICE(0x14B2,0x3C25)}, /* Draytek */ 83 {USB_DEVICE(0x14B2, 0x3C25)}, /* Draytek */
86 {USB_DEVICE(0x13D3,0x3247)}, /* AzureWave */ 84 {USB_DEVICE(0x13D3, 0x3247)}, /* AzureWave */
87 {USB_DEVICE(0x083A,0x6618)}, /* Accton */ 85 {USB_DEVICE(0x083A, 0x6618)}, /* Accton */
88 {USB_DEVICE(0x15c5,0x0008)}, /* Amit */ 86 {USB_DEVICE(0x15c5, 0x0008)}, /* Amit */
89 {USB_DEVICE(0x0E66,0x0001)}, /* Hawking */ 87 {USB_DEVICE(0x0E66, 0x0001)}, /* Hawking */
90 {USB_DEVICE(0x0E66,0x0003)}, /* Hawking */ 88 {USB_DEVICE(0x0E66, 0x0003)}, /* Hawking */
91 {USB_DEVICE(0x129B,0x1828)}, /* Siemens */ 89 {USB_DEVICE(0x129B, 0x1828)}, /* Siemens */
92 {USB_DEVICE(0x157E,0x300E)}, /* U-Media */ 90 {USB_DEVICE(0x157E, 0x300E)}, /* U-Media */
93 {USB_DEVICE(0x050d,0x805c)}, 91 {USB_DEVICE(0x050d, 0x805c)},
94 {USB_DEVICE(0x050d,0x815c)}, 92 {USB_DEVICE(0x050d, 0x815c)},
95 {USB_DEVICE(0x1482,0x3C09)}, /* Abocom*/ 93 {USB_DEVICE(0x1482, 0x3C09)}, /* Abocom */
96 {USB_DEVICE(0x14B2,0x3C09)}, /* Alpha */ 94 {USB_DEVICE(0x14B2, 0x3C09)}, /* Alpha */
97 {USB_DEVICE(0x04E8,0x2018)}, /* samsung */ 95 {USB_DEVICE(0x04E8, 0x2018)}, /* samsung */
98 {USB_DEVICE(0x5A57,0x0280)}, /* Zinwell */ 96 {USB_DEVICE(0x5A57, 0x0280)}, /* Zinwell */
99 {USB_DEVICE(0x5A57,0x0282)}, /* Zinwell */ 97 {USB_DEVICE(0x5A57, 0x0282)}, /* Zinwell */
100 {USB_DEVICE(0x7392,0x7718)}, 98 {USB_DEVICE(0x7392, 0x7718)},
101 {USB_DEVICE(0x7392,0x7717)}, 99 {USB_DEVICE(0x7392, 0x7717)},
102 {USB_DEVICE(0x1737,0x0070)}, /* Linksys WUSB100 */ 100 {USB_DEVICE(0x1737, 0x0070)}, /* Linksys WUSB100 */
103 {USB_DEVICE(0x1737,0x0071)}, /* Linksys WUSB600N */ 101 {USB_DEVICE(0x1737, 0x0071)}, /* Linksys WUSB600N */
104 {USB_DEVICE(0x0411,0x00e8)}, /* Buffalo WLI-UC-G300N*/ 102 {USB_DEVICE(0x0411, 0x00e8)}, /* Buffalo WLI-UC-G300N */
105 {USB_DEVICE(0x050d,0x815c)}, /* Belkin F5D8053 */ 103 {USB_DEVICE(0x050d, 0x815c)}, /* Belkin F5D8053 */
106#endif // RT2870 // 104#endif // RT2870 //
107#ifdef RT3070 105#ifdef RT3070
108 {USB_DEVICE(0x148F,0x3070)}, /* Ralink 3070 */ 106 {USB_DEVICE(0x148F, 0x3070)}, /* Ralink 3070 */
109 {USB_DEVICE(0x148F,0x3071)}, /* Ralink 3071 */ 107 {USB_DEVICE(0x148F, 0x3071)}, /* Ralink 3071 */
110 {USB_DEVICE(0x148F,0x3072)}, /* Ralink 3072 */ 108 {USB_DEVICE(0x148F, 0x3072)}, /* Ralink 3072 */
111 {USB_DEVICE(0x0DB0,0x3820)}, /* Ralink 3070 */ 109 {USB_DEVICE(0x0DB0, 0x3820)}, /* Ralink 3070 */
112 {USB_DEVICE(0x0DF6,0x003E)}, /* Sitecom 3070 */ 110 {USB_DEVICE(0x0DF6, 0x003E)}, /* Sitecom 3070 */
113 {USB_DEVICE(0x0DF6,0x0042)}, /* Sitecom 3072 */ 111 {USB_DEVICE(0x0DF6, 0x0042)}, /* Sitecom 3072 */
114 {USB_DEVICE(0x14B2,0x3C12)}, /* AL 3070 */ 112 {USB_DEVICE(0x14B2, 0x3C12)}, /* AL 3070 */
115 {USB_DEVICE(0x18C5,0x0012)}, /* Corega 3070 */ 113 {USB_DEVICE(0x18C5, 0x0012)}, /* Corega 3070 */
116 {USB_DEVICE(0x083A,0x7511)}, /* Arcadyan 3070 */ 114 {USB_DEVICE(0x083A, 0x7511)}, /* Arcadyan 3070 */
117 {USB_DEVICE(0x1740,0x9703)}, /* EnGenius 3070 */ 115 {USB_DEVICE(0x1740, 0x9703)}, /* EnGenius 3070 */
118 {USB_DEVICE(0x1740,0x9705)}, /* EnGenius 3071 */ 116 {USB_DEVICE(0x1740, 0x9705)}, /* EnGenius 3071 */
119 {USB_DEVICE(0x1740,0x9706)}, /* EnGenius 3072 */ 117 {USB_DEVICE(0x1740, 0x9706)}, /* EnGenius 3072 */
120 {USB_DEVICE(0x13D3,0x3273)}, /* AzureWave 3070*/ 118 {USB_DEVICE(0x13D3, 0x3273)}, /* AzureWave 3070 */
121 {USB_DEVICE(0x1044,0x800D)}, /* Gigabyte GN-WB32L 3070 */ 119 {USB_DEVICE(0x1044, 0x800D)}, /* Gigabyte GN-WB32L 3070 */
122 {USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */ 120 {USB_DEVICE(0x2019, 0xAB25)}, /* Planex Communications, Inc. RT3070 */
123 {USB_DEVICE(0x07B8,0x3070)}, /* AboCom 3070 */ 121 {USB_DEVICE(0x07B8, 0x3070)}, /* AboCom 3070 */
124 {USB_DEVICE(0x07B8,0x3071)}, /* AboCom 3071 */ 122 {USB_DEVICE(0x07B8, 0x3071)}, /* AboCom 3071 */
125 {USB_DEVICE(0x07B8,0x3072)}, /* Abocom 3072 */ 123 {USB_DEVICE(0x07B8, 0x3072)}, /* Abocom 3072 */
126 {USB_DEVICE(0x7392,0x7711)}, /* Edimax 3070 */ 124 {USB_DEVICE(0x7392, 0x7711)}, /* Edimax 3070 */
127 {USB_DEVICE(0x1A32,0x0304)}, /* Quanta 3070 */ 125 {USB_DEVICE(0x1A32, 0x0304)}, /* Quanta 3070 */
128 {USB_DEVICE(0x1EDA,0x2310)}, /* AirTies 3070 */ 126 {USB_DEVICE(0x1EDA, 0x2310)}, /* AirTies 3070 */
129 {USB_DEVICE(0x07D1,0x3C0A)}, /* D-Link 3072 */ 127 {USB_DEVICE(0x07D1, 0x3C0A)}, /* D-Link 3072 */
130 {USB_DEVICE(0x07D1,0x3C0D)}, /* D-Link 3070 */ 128 {USB_DEVICE(0x07D1, 0x3C0D)}, /* D-Link 3070 */
131 {USB_DEVICE(0x07D1,0x3C0E)}, /* D-Link 3070 */ 129 {USB_DEVICE(0x07D1, 0x3C0E)}, /* D-Link 3070 */
132 {USB_DEVICE(0x07D1,0x3C0F)}, /* D-Link 3070 */ 130 {USB_DEVICE(0x07D1, 0x3C0F)}, /* D-Link 3070 */
133 {USB_DEVICE(0x1D4D,0x000C)}, /* Pegatron Corporation 3070 */ 131 {USB_DEVICE(0x1D4D, 0x000C)}, /* Pegatron Corporation 3070 */
134 {USB_DEVICE(0x1D4D,0x000E)}, /* Pegatron Corporation 3070 */ 132 {USB_DEVICE(0x1D4D, 0x000E)}, /* Pegatron Corporation 3070 */
135 {USB_DEVICE(0x5A57,0x5257)}, /* Zinwell 3070 */ 133 {USB_DEVICE(0x5A57, 0x5257)}, /* Zinwell 3070 */
136 {USB_DEVICE(0x5A57,0x0283)}, /* Zinwell 3072 */ 134 {USB_DEVICE(0x5A57, 0x0283)}, /* Zinwell 3072 */
137 {USB_DEVICE(0x04BB,0x0945)}, /* I-O DATA 3072 */ 135 {USB_DEVICE(0x04BB, 0x0945)}, /* I-O DATA 3072 */
138 {USB_DEVICE(0x203D,0x1480)}, /* Encore 3070 */ 136 {USB_DEVICE(0x203D, 0x1480)}, /* Encore 3070 */
139#endif // RT3070 // 137#endif // RT3070 //
140 { USB_DEVICE(0x0DF6, 0x003F) }, /* Sitecom WL-608 */ 138 {USB_DEVICE(0x0DF6, 0x003F)}, /* Sitecom WL-608 */
141 { USB_DEVICE(0x1737, 0x0077) }, /* Linksys WUSB54GC-EU v3 */ 139 {USB_DEVICE(0x1737, 0x0077)}, /* Linksys WUSB54GC-EU v3 */
142 { USB_DEVICE(0x2001, 0x3C09) }, /* D-Link */ 140 {USB_DEVICE(0x2001, 0x3C09)}, /* D-Link */
143 { USB_DEVICE(0x2001, 0x3C0A) }, /* D-Link 3072*/ 141 {USB_DEVICE(0x2001, 0x3C0A)}, /* D-Link 3072 */
144 { USB_DEVICE(0x2019, 0xED14) }, /* Planex Communications, Inc. */ 142 {USB_DEVICE(0x2019, 0xED14)}, /* Planex Communications, Inc. */
145 { }/* Terminating entry */ 143 {} /* Terminating entry */
146}; 144};
147 145
148INT const rtusb_usb_id_len = sizeof(rtusb_usb_id) / sizeof(struct usb_device_id); 146INT const rtusb_usb_id_len =
147 sizeof(rtusb_usb_id) / sizeof(struct usb_device_id);
149 148
150MODULE_DEVICE_TABLE(usb, rtusb_usb_id); 149MODULE_DEVICE_TABLE(usb, rtusb_usb_id);
151 150
152static void rt2870_disconnect( 151static void rt2870_disconnect(IN struct usb_device *dev, IN PRTMP_ADAPTER pAd);
153 IN struct usb_device *dev,
154 IN PRTMP_ADAPTER pAd);
155 152
156static int __devinit rt2870_probe( 153static int __devinit rt2870_probe(IN struct usb_interface *intf,
157 IN struct usb_interface *intf, 154 IN struct usb_device *usb_dev,
158 IN struct usb_device *usb_dev, 155 IN const struct usb_device_id *dev_id,
159 IN const struct usb_device_id *dev_id, 156 IN RTMP_ADAPTER ** ppAd);
160 IN RTMP_ADAPTER **ppAd);
161 157
162#ifndef PF_NOFREEZE 158#ifndef PF_NOFREEZE
163#define PF_NOFREEZE 0 159#define PF_NOFREEZE 0
164#endif 160#endif
165 161
166
167extern int rt28xx_close(IN struct net_device *net_dev); 162extern int rt28xx_close(IN struct net_device *net_dev);
168extern int rt28xx_open(struct net_device *net_dev); 163extern int rt28xx_open(struct net_device *net_dev);
169 164
170static BOOLEAN USBDevConfigInit( 165static BOOLEAN USBDevConfigInit(IN struct usb_device *dev,
171 IN struct usb_device *dev, 166 IN struct usb_interface *intf,
172 IN struct usb_interface *intf, 167 IN RTMP_ADAPTER * pAd);
173 IN RTMP_ADAPTER *pAd);
174
175 168
176/* 169/*
177======================================================================== 170========================================================================
@@ -188,27 +181,23 @@ Return Value:
188Note: 181Note:
189======================================================================== 182========================================================================
190*/ 183*/
191BOOLEAN RT28XXChipsetCheck( 184BOOLEAN RT28XXChipsetCheck(IN void *_dev_p)
192 IN void *_dev_p)
193{ 185{
194 struct usb_interface *intf = (struct usb_interface *)_dev_p; 186 struct usb_interface *intf = (struct usb_interface *)_dev_p;
195 struct usb_device *dev_p = interface_to_usbdev(intf); 187 struct usb_device *dev_p = interface_to_usbdev(intf);
196 UINT32 i; 188 UINT32 i;
197 189
198 190 for (i = 0; i < rtusb_usb_id_len; i++) {
199 for(i=0; i<rtusb_usb_id_len; i++)
200 {
201 if (dev_p->descriptor.idVendor == rtusb_usb_id[i].idVendor && 191 if (dev_p->descriptor.idVendor == rtusb_usb_id[i].idVendor &&
202 dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) 192 dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) {
203 {
204 printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n", 193 printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
205 dev_p->descriptor.idVendor, dev_p->descriptor.idProduct); 194 dev_p->descriptor.idVendor,
195 dev_p->descriptor.idProduct);
206 break; 196 break;
207 } 197 }
208 } 198 }
209 199
210 if (i == rtusb_usb_id_len) 200 if (i == rtusb_usb_id_len) {
211 {
212 printk("rt2870: Error! Device Descriptor not matching!\n"); 201 printk("rt2870: Error! Device Descriptor not matching!\n");
213 return FALSE; 202 return FALSE;
214 } 203 }
@@ -227,61 +216,76 @@ static int rt2870_suspend(struct usb_interface *intf, pm_message_t state);
227static int rt2870_resume(struct usb_interface *intf); 216static int rt2870_resume(struct usb_interface *intf);
228#endif // CONFIG_PM // 217#endif // CONFIG_PM //
229 218
230static int rtusb_probe (struct usb_interface *intf, 219static int rtusb_probe(struct usb_interface *intf,
231 const struct usb_device_id *id); 220 const struct usb_device_id *id);
232static void rtusb_disconnect(struct usb_interface *intf); 221static void rtusb_disconnect(struct usb_interface *intf);
233 222
234static BOOLEAN USBDevConfigInit( 223static BOOLEAN USBDevConfigInit(IN struct usb_device *dev,
235 IN struct usb_device *dev, 224 IN struct usb_interface *intf,
236 IN struct usb_interface *intf, 225 IN RTMP_ADAPTER * pAd)
237 IN RTMP_ADAPTER *pAd)
238{ 226{
239 struct usb_host_interface *iface_desc; 227 struct usb_host_interface *iface_desc;
240 ULONG BulkOutIdx; 228 ULONG BulkOutIdx;
241 UINT32 i; 229 UINT32 i;
242 230
243
244 /* get the active interface descriptor */ 231 /* get the active interface descriptor */
245 iface_desc = intf->cur_altsetting; 232 iface_desc = intf->cur_altsetting;
246 233
247 /* get # of enpoints */ 234 /* get # of enpoints */
248 pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints; 235 pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints;
249 DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints)); 236 DBGPRINT(RT_DEBUG_TRACE,
237 ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints));
250 238
251 /* Configure Pipes */ 239 /* Configure Pipes */
252 BulkOutIdx = 0; 240 BulkOutIdx = 0;
253 241
254 for(i=0; i<pAd->NumberOfPipes; i++) 242 for (i = 0; i < pAd->NumberOfPipes; i++) {
255 {
256 if ((iface_desc->endpoint[i].desc.bmAttributes == 243 if ((iface_desc->endpoint[i].desc.bmAttributes ==
257 USB_ENDPOINT_XFER_BULK) && 244 USB_ENDPOINT_XFER_BULK) &&
258 ((iface_desc->endpoint[i].desc.bEndpointAddress & 245 ((iface_desc->endpoint[i].desc.bEndpointAddress &
259 USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) 246 USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) {
260 { 247 pAd->BulkInEpAddr =
261 pAd->BulkInEpAddr = iface_desc->endpoint[i].desc.bEndpointAddress; 248 iface_desc->endpoint[i].desc.bEndpointAddress;
262 pAd->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); 249 pAd->BulkInMaxPacketSize =
263 250 le2cpu16(iface_desc->endpoint[i].desc.
264 DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pAd->BulkInMaxPacketSize)); 251 wMaxPacketSize);
265 DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress)); 252
266 } 253 DBGPRINT_RAW(RT_DEBUG_TRACE,
267 else if ((iface_desc->endpoint[i].desc.bmAttributes == 254 ("BULK IN MaxPacketSize = %d\n",
268 USB_ENDPOINT_XFER_BULK) && 255 pAd->BulkInMaxPacketSize));
269 ((iface_desc->endpoint[i].desc.bEndpointAddress & 256 DBGPRINT_RAW(RT_DEBUG_TRACE,
270 USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)) 257 ("EP address = 0x%2x\n",
271 { 258 iface_desc->endpoint[i].desc.
259 bEndpointAddress));
260 } else
261 if ((iface_desc->endpoint[i].desc.bmAttributes ==
262 USB_ENDPOINT_XFER_BULK)
263 &&
264 ((iface_desc->endpoint[i].desc.
265 bEndpointAddress & USB_ENDPOINT_DIR_MASK) ==
266 USB_DIR_OUT)) {
272 // there are 6 bulk out EP. EP6 highest priority. 267 // there are 6 bulk out EP. EP6 highest priority.
273 // EP1-4 is EDCA. EP5 is HCCA. 268 // EP1-4 is EDCA. EP5 is HCCA.
274 pAd->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress; 269 pAd->BulkOutEpAddr[BulkOutIdx++] =
275 pAd->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); 270 iface_desc->endpoint[i].desc.bEndpointAddress;
276 271 pAd->BulkOutMaxPacketSize =
277 DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pAd->BulkOutMaxPacketSize)); 272 le2cpu16(iface_desc->endpoint[i].desc.
278 DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc.bEndpointAddress)); 273 wMaxPacketSize);
274
275 DBGPRINT_RAW(RT_DEBUG_TRACE,
276 ("BULK OUT MaxPacketSize = %d\n",
277 pAd->BulkOutMaxPacketSize));
278 DBGPRINT_RAW(RT_DEBUG_TRACE,
279 ("EP address = 0x%2x \n",
280 iface_desc->endpoint[i].desc.
281 bEndpointAddress));
279 } 282 }
280 } 283 }
281 284
282 if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0])) 285 if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0])) {
283 { 286 printk
284 printk("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__); 287 ("%s: Could not find both bulk-in and bulk-out endpoints\n",
288 __FUNCTION__);
285 return FALSE; 289 return FALSE;
286 } 290 }
287 291
@@ -292,10 +296,8 @@ static BOOLEAN USBDevConfigInit(
292 296
293} 297}
294 298
295 299static int rtusb_probe(struct usb_interface *intf,
296 300 const struct usb_device_id *id)
297static int rtusb_probe (struct usb_interface *intf,
298 const struct usb_device_id *id)
299{ 301{
300 RTMP_ADAPTER *pAd; 302 RTMP_ADAPTER *pAd;
301 struct usb_device *dev; 303 struct usb_device *dev;
@@ -311,12 +313,10 @@ static int rtusb_probe (struct usb_interface *intf,
311 return rv; 313 return rv;
312} 314}
313 315
314
315static void rtusb_disconnect(struct usb_interface *intf) 316static void rtusb_disconnect(struct usb_interface *intf)
316{ 317{
317 struct usb_device *dev = interface_to_usbdev(intf); 318 struct usb_device *dev = interface_to_usbdev(intf);
318 PRTMP_ADAPTER pAd; 319 PRTMP_ADAPTER pAd;
319
320 320
321 pAd = usb_get_intfdata(intf); 321 pAd = usb_get_intfdata(intf);
322 usb_set_intfdata(intf, NULL); 322 usb_set_intfdata(intf, NULL);
@@ -324,36 +324,31 @@ static void rtusb_disconnect(struct usb_interface *intf)
324 rt2870_disconnect(dev, pAd); 324 rt2870_disconnect(dev, pAd);
325} 325}
326 326
327
328struct usb_driver rtusb_driver = { 327struct usb_driver rtusb_driver = {
329 .name="rt2870", 328 .name = "rt2870",
330 .probe=rtusb_probe, 329 .probe = rtusb_probe,
331 .disconnect=rtusb_disconnect, 330 .disconnect = rtusb_disconnect,
332 .id_table=rtusb_usb_id, 331 .id_table = rtusb_usb_id,
333 332
334#ifdef CONFIG_PM 333#ifdef CONFIG_PM
335 suspend: rt2870_suspend, 334suspend:rt2870_suspend,
336 resume: rt2870_resume, 335resume:rt2870_resume,
337#endif 336#endif
338 }; 337};
339 338
340#ifdef CONFIG_PM 339#ifdef CONFIG_PM
341 340
342VOID RT2870RejectPendingPackets( 341VOID RT2870RejectPendingPackets(IN PRTMP_ADAPTER pAd)
343 IN PRTMP_ADAPTER pAd)
344{ 342{
345 // clear PS packets 343 // clear PS packets
346 // clear TxSw packets 344 // clear TxSw packets
347} 345}
348 346
349static int rt2870_suspend( 347static int rt2870_suspend(struct usb_interface *intf, pm_message_t state)
350 struct usb_interface *intf,
351 pm_message_t state)
352{ 348{
353 struct net_device *net_dev; 349 struct net_device *net_dev;
354 PRTMP_ADAPTER pAd = usb_get_intfdata(intf); 350 PRTMP_ADAPTER pAd = usb_get_intfdata(intf);
355 351
356
357 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_suspend()\n")); 352 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_suspend()\n"));
358 net_dev = pAd->net_dev; 353 net_dev = pAd->net_dev;
359 netif_device_detach(net_dev); 354 netif_device_detach(net_dev);
@@ -367,13 +362,11 @@ static int rt2870_suspend(
367 return 0; 362 return 0;
368} 363}
369 364
370static int rt2870_resume( 365static int rt2870_resume(struct usb_interface *intf)
371 struct usb_interface *intf)
372{ 366{
373 struct net_device *net_dev; 367 struct net_device *net_dev;
374 PRTMP_ADAPTER pAd = usb_get_intfdata(intf); 368 PRTMP_ADAPTER pAd = usb_get_intfdata(intf);
375 369
376
377 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_resume()\n")); 370 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_resume()\n"));
378 371
379 pAd->PM_FlgSuspend = 0; 372 pAd->PM_FlgSuspend = 0;
@@ -405,9 +398,6 @@ VOID __exit rtusb_exit(void)
405module_init(rtusb_init); 398module_init(rtusb_init);
406module_exit(rtusb_exit); 399module_exit(rtusb_exit);
407 400
408
409
410
411/*--------------------------------------------------------------------- */ 401/*--------------------------------------------------------------------- */
412/* function declarations */ 402/* function declarations */
413/*--------------------------------------------------------------------- */ 403/*--------------------------------------------------------------------- */
@@ -426,35 +416,32 @@ Return Value:
426Note: 416Note:
427======================================================================== 417========================================================================
428*/ 418*/
429INT MlmeThread( 419INT MlmeThread(IN void *Context)
430 IN void *Context)
431{ 420{
432 RTMP_ADAPTER *pAd; 421 RTMP_ADAPTER *pAd;
433 RTMP_OS_TASK *pTask; 422 RTMP_OS_TASK *pTask;
434 int status; 423 int status;
435 status = 0; 424 status = 0;
436 425
437 pTask = (RTMP_OS_TASK *)Context; 426 pTask = (RTMP_OS_TASK *) Context;
438 pAd = (PRTMP_ADAPTER)pTask->priv; 427 pAd = (PRTMP_ADAPTER) pTask->priv;
439 428
440 RtmpOSTaskCustomize(pTask); 429 RtmpOSTaskCustomize(pTask);
441 430
442 while(!pTask->task_killed) 431 while (!pTask->task_killed) {
443 {
444#ifdef KTHREAD_SUPPORT 432#ifdef KTHREAD_SUPPORT
445 RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask); 433 RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
446#else 434#else
447 RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status); 435 RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
448 436
449 /* unlock the device pointers */ 437 /* unlock the device pointers */
450 if (status != 0) 438 if (status != 0) {
451 {
452 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); 439 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
453 break; 440 break;
454 } 441 }
455#endif 442#endif
456 443
457 /* lock the device pointers , need to check if required*/ 444 /* lock the device pointers , need to check if required */
458 //down(&(pAd->usbdev_semaphore)); 445 //down(&(pAd->usbdev_semaphore));
459 446
460 if (!pAd->PM_FlgSuspend) 447 if (!pAd->PM_FlgSuspend)
@@ -475,16 +462,15 @@ INT MlmeThread(
475 * This is important in preemption kernels, which transfer the flow 462 * This is important in preemption kernels, which transfer the flow
476 * of execution immediately upon a complete(). 463 * of execution immediately upon a complete().
477 */ 464 */
478 DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__FUNCTION__)); 465 DBGPRINT(RT_DEBUG_TRACE, ("<---%s\n", __FUNCTION__));
479#ifndef KTHREAD_SUPPORT 466#ifndef KTHREAD_SUPPORT
480 pTask->taskPID = THREAD_PID_INIT_VALUE; 467 pTask->taskPID = THREAD_PID_INIT_VALUE;
481 complete_and_exit (&pTask->taskComplete, 0); 468 complete_and_exit(&pTask->taskComplete, 0);
482#endif 469#endif
483 return 0; 470 return 0;
484 471
485} 472}
486 473
487
488/* 474/*
489======================================================================== 475========================================================================
490Routine Description: 476Routine Description:
@@ -499,16 +485,15 @@ Return Value:
499Note: 485Note:
500======================================================================== 486========================================================================
501*/ 487*/
502INT RTUSBCmdThread( 488INT RTUSBCmdThread(IN void *Context)
503 IN void * Context)
504{ 489{
505 RTMP_ADAPTER *pAd; 490 RTMP_ADAPTER *pAd;
506 RTMP_OS_TASK *pTask; 491 RTMP_OS_TASK *pTask;
507 int status; 492 int status;
508 status = 0; 493 status = 0;
509 494
510 pTask = (RTMP_OS_TASK *)Context; 495 pTask = (RTMP_OS_TASK *) Context;
511 pAd = (PRTMP_ADAPTER)pTask->priv; 496 pAd = (PRTMP_ADAPTER) pTask->priv;
512 497
513 RtmpOSTaskCustomize(pTask); 498 RtmpOSTaskCustomize(pTask);
514 499
@@ -516,16 +501,14 @@ INT RTUSBCmdThread(
516 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING; 501 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING;
517 NdisReleaseSpinLock(&pAd->CmdQLock); 502 NdisReleaseSpinLock(&pAd->CmdQLock);
518 503
519 while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING) 504 while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING) {
520 {
521#ifdef KTHREAD_SUPPORT 505#ifdef KTHREAD_SUPPORT
522 RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask); 506 RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
523#else 507#else
524 /* lock the device pointers */ 508 /* lock the device pointers */
525 RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status); 509 RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
526 510
527 if (status != 0) 511 if (status != 0) {
528 {
529 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); 512 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
530 break; 513 break;
531 } 514 }
@@ -538,28 +521,25 @@ INT RTUSBCmdThread(
538 CMDHandler(pAd); 521 CMDHandler(pAd);
539 } 522 }
540 523
541 if (pAd && !pAd->PM_FlgSuspend) 524 if (pAd && !pAd->PM_FlgSuspend) { // Clear the CmdQElements.
542 { // Clear the CmdQElements. 525 CmdQElmt *pCmdQElmt = NULL;
543 CmdQElmt *pCmdQElmt = NULL;
544 526
545 NdisAcquireSpinLock(&pAd->CmdQLock); 527 NdisAcquireSpinLock(&pAd->CmdQLock);
546 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED; 528 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
547 while(pAd->CmdQ.size) 529 while (pAd->CmdQ.size) {
548 {
549 RTUSBDequeueCmd(&pAd->CmdQ, &pCmdQElmt); 530 RTUSBDequeueCmd(&pAd->CmdQ, &pCmdQElmt);
550 if (pCmdQElmt) 531 if (pCmdQElmt) {
551 { 532 if (pCmdQElmt->CmdFromNdis == TRUE) {
552 if (pCmdQElmt->CmdFromNdis == TRUE)
553 {
554 if (pCmdQElmt->buffer != NULL) 533 if (pCmdQElmt->buffer != NULL)
555 os_free_mem(pAd, pCmdQElmt->buffer); 534 os_free_mem(pAd,
556 os_free_mem(pAd, (PUCHAR)pCmdQElmt); 535 pCmdQElmt->buffer);
557 } 536 os_free_mem(pAd, (PUCHAR) pCmdQElmt);
558 else 537 } else {
559 { 538 if ((pCmdQElmt->buffer != NULL)
560 if ((pCmdQElmt->buffer != NULL) && (pCmdQElmt->bufferlength != 0)) 539 && (pCmdQElmt->bufferlength != 0))
561 os_free_mem(pAd, pCmdQElmt->buffer); 540 os_free_mem(pAd,
562 os_free_mem(pAd, (PUCHAR)pCmdQElmt); 541 pCmdQElmt->buffer);
542 os_free_mem(pAd, (PUCHAR) pCmdQElmt);
563 } 543 }
564 } 544 }
565 } 545 }
@@ -580,52 +560,54 @@ INT RTUSBCmdThread(
580 * This is important in preemption kernels, which transfer the flow 560 * This is important in preemption kernels, which transfer the flow
581 * of execution immediately upon a complete(). 561 * of execution immediately upon a complete().
582 */ 562 */
583 DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n")); 563 DBGPRINT(RT_DEBUG_TRACE, ("<---RTUSBCmdThread\n"));
584 564
585#ifndef KTHREAD_SUPPORT 565#ifndef KTHREAD_SUPPORT
586 pTask->taskPID = THREAD_PID_INIT_VALUE; 566 pTask->taskPID = THREAD_PID_INIT_VALUE;
587 complete_and_exit (&pTask->taskComplete, 0); 567 complete_and_exit(&pTask->taskComplete, 0);
588#endif 568#endif
589 return 0; 569 return 0;
590 570
591} 571}
592 572
593 573VOID RTUSBWatchDog(IN RTMP_ADAPTER * pAd)
594VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
595{ 574{
596 PHT_TX_CONTEXT pHTTXContext; 575 PHT_TX_CONTEXT pHTTXContext;
597 int idx; 576 int idx;
598 ULONG irqFlags; 577 ULONG irqFlags;
599 PURB pUrb; 578 PURB pUrb;
600 BOOLEAN needDumpSeq = FALSE; 579 BOOLEAN needDumpSeq = FALSE;
601 UINT32 MACValue; 580 UINT32 MACValue;
602 UINT32 TxRxQ_Pcnt; 581 UINT32 TxRxQ_Pcnt;
603 582
604 idx = 0; 583 idx = 0;
605 RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue); 584 RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);
606 if ((MACValue & 0xff) !=0 ) 585 if ((MACValue & 0xff) != 0) {
607 { 586 DBGPRINT(RT_DEBUG_TRACE,
608 DBGPRINT(RT_DEBUG_TRACE, ("TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n", MACValue)); 587 ("TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n",
588 MACValue));
609 RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012); 589 RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012);
610 while((MACValue &0xff) != 0 && (idx++ < 10)) 590 while ((MACValue & 0xff) != 0 && (idx++ < 10)) {
611 { 591 RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);
612 RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue); 592 RTMPusecDelay(1);
613 RTMPusecDelay(1);
614 } 593 }
615 RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006); 594 RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);
616 } 595 }
617 596
618 if (pAd->watchDogRxOverFlowCnt >= 2) 597 if (pAd->watchDogRxOverFlowCnt >= 2) {
619 { 598 DBGPRINT(RT_DEBUG_TRACE,
620 DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\n")); 599 ("Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\n"));
621 if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 600 if ((!RTMP_TEST_FLAG
622 fRTMP_ADAPTER_BULKIN_RESET | 601 (pAd,
623 fRTMP_ADAPTER_HALT_IN_PROGRESS | 602 (fRTMP_ADAPTER_RESET_IN_PROGRESS |
624 fRTMP_ADAPTER_NIC_NOT_EXIST)))) 603 fRTMP_ADAPTER_BULKIN_RESET |
625 { 604 fRTMP_ADAPTER_HALT_IN_PROGRESS |
626 DBGPRINT(RT_DEBUG_TRACE, ("Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\n")); 605 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
606 DBGPRINT(RT_DEBUG_TRACE,
607 ("Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\n"));
627 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); 608 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
628 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0); 609 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN,
610 NULL, 0);
629 needDumpSeq = TRUE; 611 needDumpSeq = TRUE;
630 } 612 }
631 pAd->watchDogRxOverFlowCnt = 0; 613 pAd->watchDogRxOverFlowCnt = 0;
@@ -633,126 +615,139 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
633 615
634 RTUSBReadMACRegister(pAd, 0x438, &TxRxQ_Pcnt); 616 RTUSBReadMACRegister(pAd, 0x438, &TxRxQ_Pcnt);
635 617
636 for (idx = 0; idx < NUM_OF_TX_RING; idx++) 618 for (idx = 0; idx < NUM_OF_TX_RING; idx++) {
637 {
638 pUrb = NULL; 619 pUrb = NULL;
639 620
640 RTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags); 621 RTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags);
641 if ((pAd->BulkOutPending[idx] == TRUE) && pAd->watchDogTxPendingCnt) 622 if ((pAd->BulkOutPending[idx] == TRUE)
642 { 623 && pAd->watchDogTxPendingCnt) {
643 INT actual_length=0,transfer_buffer_length=0; 624 INT actual_length = 0, transfer_buffer_length = 0;
644 BOOLEAN isDataPacket=FALSE; 625 BOOLEAN isDataPacket = FALSE;
645 pAd->watchDogTxPendingCnt[idx]++; 626 pAd->watchDogTxPendingCnt[idx]++;
646 627
647 if ((pAd->watchDogTxPendingCnt[idx] > 2) && 628 if ((pAd->watchDogTxPendingCnt[idx] > 2) &&
648 (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_BULKOUT_RESET))) 629 (!RTMP_TEST_FLAG
649 ) 630 (pAd,
650 { 631 (fRTMP_ADAPTER_RESET_IN_PROGRESS |
632 fRTMP_ADAPTER_HALT_IN_PROGRESS |
633 fRTMP_ADAPTER_NIC_NOT_EXIST |
634 fRTMP_ADAPTER_BULKOUT_RESET)))
635 ) {
651 // FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it! 636 // FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it!
652 pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[idx]); 637 pHTTXContext =
653 if (pHTTXContext->IRPPending) 638 (PHT_TX_CONTEXT) (&pAd->TxContext[idx]);
654 { // Check TxContext. 639 if (pHTTXContext->IRPPending) { // Check TxContext.
655 pUrb = pHTTXContext->pUrb; 640 pUrb = pHTTXContext->pUrb;
656 641
657 actual_length=pUrb->actual_length; 642 actual_length = pUrb->actual_length;
658 transfer_buffer_length=pUrb->transfer_buffer_length; 643 transfer_buffer_length =
659 isDataPacket=TRUE; 644 pUrb->transfer_buffer_length;
660 } 645 isDataPacket = TRUE;
661 else if (idx == MGMTPIPEIDX) 646 } else if (idx == MGMTPIPEIDX) {
662 { 647 PTX_CONTEXT pMLMEContext, pNULLContext,
663 PTX_CONTEXT pMLMEContext, pNULLContext, pPsPollContext; 648 pPsPollContext;
664 649
665 //Check MgmtContext. 650 //Check MgmtContext.
666 pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa); 651 pMLMEContext =
667 pPsPollContext = (PTX_CONTEXT)(&pAd->PsPollContext); 652 (PTX_CONTEXT) (pAd->MgmtRing.
668 pNULLContext = (PTX_CONTEXT)(&pAd->NullContext); 653 Cell[pAd->MgmtRing.
669 654 TxDmaIdx].
670 if (pMLMEContext->IRPPending) 655 AllocVa);
671 { 656 pPsPollContext =
672 ASSERT(pMLMEContext->IRPPending); 657 (PTX_CONTEXT) (&pAd->PsPollContext);
658 pNULLContext =
659 (PTX_CONTEXT) (&pAd->NullContext);
660
661 if (pMLMEContext->IRPPending) {
662 ASSERT(pMLMEContext->
663 IRPPending);
673 pUrb = pMLMEContext->pUrb; 664 pUrb = pMLMEContext->pUrb;
674 } 665 } else if (pNULLContext->IRPPending) {
675 else if (pNULLContext->IRPPending) 666 ASSERT(pNULLContext->
676 { 667 IRPPending);
677 ASSERT(pNULLContext->IRPPending);
678 pUrb = pNULLContext->pUrb; 668 pUrb = pNULLContext->pUrb;
679 } 669 } else if (pPsPollContext->IRPPending) {
680 else if (pPsPollContext->IRPPending) 670 ASSERT(pPsPollContext->
681 { 671 IRPPending);
682 ASSERT(pPsPollContext->IRPPending);
683 pUrb = pPsPollContext->pUrb; 672 pUrb = pPsPollContext->pUrb;
684 } 673 }
685 } 674 }
686 675
687 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags); 676 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx],
677 irqFlags);
688 678
689 printk(KERN_INFO "%d:%lu LTL=%d , TL=%d L:%d\n", 679 printk(KERN_INFO "%d:%lu LTL=%d , TL=%d L:%d\n",
690 idx, pAd->watchDogTxPendingCnt[idx], 680 idx, pAd->watchDogTxPendingCnt[idx],
691 pAd->TransferedLength[idx], 681 pAd->TransferedLength[idx],
692 actual_length, transfer_buffer_length); 682 actual_length, transfer_buffer_length);
693 683
694 if (pUrb) 684 if (pUrb) {
695 {
696 if ((isDataPacket 685 if ((isDataPacket
697 && pAd->TransferedLength[idx]==actual_length 686 && pAd->TransferedLength[idx] ==
698 && pAd->TransferedLength[idx]<transfer_buffer_length 687 actual_length
699 && actual_length!=0 688 && pAd->TransferedLength[idx] <
700// && TxRxQ_Pcnt==0 689 transfer_buffer_length
701 && pAd->watchDogTxPendingCnt[idx]>3) 690 && actual_length != 0
702 || isDataPacket==FALSE || pAd->watchDogTxPendingCnt[idx]>6) 691// && TxRxQ_Pcnt==0
703 { 692 && pAd->watchDogTxPendingCnt[idx] >
704 DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\n", idx)); 693 3)
705 DBGPRINT(RT_DEBUG_TRACE, ("Unlink the pending URB!\n")); 694 || isDataPacket == FALSE
706 // unlink it now 695 || pAd->watchDogTxPendingCnt[idx] >
707 RTUSB_UNLINK_URB(pUrb); 696 6) {
708 // Sleep 200 microseconds to give cancellation time to work 697 DBGPRINT(RT_DEBUG_TRACE,
698 ("Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\n",
699 idx));
700 DBGPRINT(RT_DEBUG_TRACE,
701 ("Unlink the pending URB!\n"));
702 // unlink it now
703 RTUSB_UNLINK_URB(pUrb);
704 // Sleep 200 microseconds to give cancellation time to work
709 //RTMPusecDelay(200); 705 //RTMPusecDelay(200);
710 needDumpSeq = TRUE; 706 needDumpSeq = TRUE;
711 } 707 }
708 } else {
709 DBGPRINT(RT_DEBUG_ERROR,
710 ("Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\n"));
712 } 711 }
713 else 712 } else {
714 { 713 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx],
715 DBGPRINT(RT_DEBUG_ERROR, ("Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\n")); 714 irqFlags);
716 }
717 }
718 else
719 {
720 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
721 } 715 }
722 716
723 if (isDataPacket==TRUE) 717 if (isDataPacket == TRUE)
724 pAd->TransferedLength[idx]=actual_length; 718 pAd->TransferedLength[idx] = actual_length;
725 } 719 } else {
726 else
727 {
728 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags); 720 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
729 } 721 }
730 } 722 }
731 723
732 // For Sigma debug, dump the ba_reordering sequence. 724 // For Sigma debug, dump the ba_reordering sequence.
733 if((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0)) 725 if ((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0)) {
734 { 726 USHORT Idx;
735 USHORT Idx; 727 PBA_REC_ENTRY pBAEntry = NULL;
736 PBA_REC_ENTRY pBAEntry = NULL; 728 UCHAR count = 0;
737 UCHAR count = 0;
738 struct reordering_mpdu *mpdu_blk; 729 struct reordering_mpdu *mpdu_blk;
739 730
740 Idx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0]; 731 Idx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0];
741 732
742 pBAEntry = &pAd->BATable.BARecEntry[Idx]; 733 pBAEntry = &pAd->BATable.BARecEntry[Idx];
743 if((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL)) 734 if ((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL)) {
744 { 735 DBGPRINT(RT_DEBUG_TRACE,
745 DBGPRINT(RT_DEBUG_TRACE, ("NICUpdateRawCounters():The Queueing pkt in reordering buffer:\n")); 736 ("NICUpdateRawCounters():The Queueing pkt in reordering buffer:\n"));
746 NdisAcquireSpinLock(&pBAEntry->RxReRingLock); 737 NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
747 mpdu_blk = pBAEntry->list.next; 738 mpdu_blk = pBAEntry->list.next;
748 while (mpdu_blk) 739 while (mpdu_blk) {
749 { 740 DBGPRINT(RT_DEBUG_TRACE,
750 DBGPRINT(RT_DEBUG_TRACE, ("\t%d:Seq-%d, bAMSDU-%d!\n", count, mpdu_blk->Sequence, mpdu_blk->bAMSDU)); 741 ("\t%d:Seq-%d, bAMSDU-%d!\n", count,
742 mpdu_blk->Sequence,
743 mpdu_blk->bAMSDU));
751 mpdu_blk = mpdu_blk->next; 744 mpdu_blk = mpdu_blk->next;
752 count++; 745 count++;
753 } 746 }
754 747
755 DBGPRINT(RT_DEBUG_TRACE, ("\npBAEntry->LastIndSeq=%d!\n", pBAEntry->LastIndSeq)); 748 DBGPRINT(RT_DEBUG_TRACE,
749 ("\npBAEntry->LastIndSeq=%d!\n",
750 pBAEntry->LastIndSeq));
756 NdisReleaseSpinLock(&pBAEntry->RxReRingLock); 751 NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
757 } 752 }
758 } 753 }
@@ -775,10 +770,10 @@ Note:
775*/ 770*/
776static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd) 771static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
777{ 772{
778 DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n", 773 DBGPRINT(RT_DEBUG_ERROR,
779 dev->bus->bus_name, dev->devpath)); 774 ("rtusb_disconnect: unregister usbnet usb-%s-%s\n",
780 if (!pAd) 775 dev->bus->bus_name, dev->devpath));
781 { 776 if (!pAd) {
782 usb_put_dev(dev); 777 usb_put_dev(dev);
783 printk("rtusb_disconnect: pAd == NULL!\n"); 778 printk("rtusb_disconnect: pAd == NULL!\n");
784 return; 779 return;
@@ -788,7 +783,6 @@ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
788 // for debug, wait to show some messages to /proc system 783 // for debug, wait to show some messages to /proc system
789 udelay(1); 784 udelay(1);
790 785
791
792 RtmpPhyNetDevExit(pAd, pAd->net_dev); 786 RtmpPhyNetDevExit(pAd, pAd->net_dev);
793 787
794 // FIXME: Shall we need following delay and flush the schedule?? 788 // FIXME: Shall we need following delay and flush the schedule??
@@ -808,43 +802,38 @@ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
808 DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n")); 802 DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n"));
809} 803}
810 804
811 805static int __devinit rt2870_probe(IN struct usb_interface *intf,
812static int __devinit rt2870_probe( 806 IN struct usb_device *usb_dev,
813 IN struct usb_interface *intf, 807 IN const struct usb_device_id *dev_id,
814 IN struct usb_device *usb_dev, 808 IN RTMP_ADAPTER ** ppAd)
815 IN const struct usb_device_id *dev_id,
816 IN RTMP_ADAPTER **ppAd)
817{ 809{
818 struct net_device *net_dev = NULL; 810 struct net_device *net_dev = NULL;
819 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) NULL; 811 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) NULL;
820 INT status, rv; 812 INT status, rv;
821 PVOID handle; 813 PVOID handle;
822 RTMP_OS_NETDEV_OP_HOOK netDevHook; 814 RTMP_OS_NETDEV_OP_HOOK netDevHook;
823
824 815
825 DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n")); 816 DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n"));
826 817
827 // Check chipset vendor/product ID 818 // Check chipset vendor/product ID
828 //if (RT28XXChipsetCheck(_dev_p) == FALSE) 819 //if (RT28XXChipsetCheck(_dev_p) == FALSE)
829 // goto err_out; 820 // goto err_out;
830 821
831//RtmpDevInit============================================= 822//RtmpDevInit=============================================
832 // Allocate RTMP_ADAPTER adapter structure 823 // Allocate RTMP_ADAPTER adapter structure
833 handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); 824 handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
834 if (handle == NULL) 825 if (handle == NULL) {
835 { 826 printk
836 printk("rt2870_probe(): Allocate memory for os handle failed!\n"); 827 ("rt2870_probe(): Allocate memory for os handle failed!\n");
837 return -ENOMEM; 828 return -ENOMEM;
838 } 829 }
839 ((POS_COOKIE)handle)->pUsb_Dev = usb_dev; 830 ((POS_COOKIE) handle)->pUsb_Dev = usb_dev;
840 831
841 rv = RTMPAllocAdapterBlock(handle, &pAd); 832 rv = RTMPAllocAdapterBlock(handle, &pAd);
842 if (rv != NDIS_STATUS_SUCCESS) 833 if (rv != NDIS_STATUS_SUCCESS) {
843 {
844 kfree(handle); 834 kfree(handle);
845 goto err_out; 835 goto err_out;
846 } 836 }
847
848//USBDevInit============================================== 837//USBDevInit==============================================
849 if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE) 838 if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE)
850 goto err_out_free_radev; 839 goto err_out_free_radev;
@@ -858,12 +847,12 @@ static int __devinit rt2870_probe(
858 847
859 // Here are the net_device structure with usb specific parameters. 848 // Here are the net_device structure with usb specific parameters.
860 /* for supporting Network Manager. 849 /* for supporting Network Manager.
861 * Set the sysfs physical device reference for the network logical device if set prior to registration will 850 * Set the sysfs physical device reference for the network logical device if set prior to registration will
862 * cause a symlink during initialization. 851 * cause a symlink during initialization.
863 */ 852 */
864 SET_NETDEV_DEV(net_dev, &(usb_dev->dev)); 853 SET_NETDEV_DEV(net_dev, &(usb_dev->dev));
865 854
866 pAd->StaCfg.OriDevType = net_dev->type; 855 pAd->StaCfg.OriDevType = net_dev->type;
867 856
868//All done, it's time to register the net device to linux kernel. 857//All done, it's time to register the net device to linux kernel.
869 // Register this device 858 // Register this device