diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-12-11 15:23:13 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-12-11 15:23:13 -0500 |
commit | 66cd8d6ec97bbfac53b5e67df9ef4668c3f96085 (patch) | |
tree | c02aa3e30ffa985055c417819fce0600b6fc95f4 /drivers/staging/rt2860 | |
parent | 460bb8df1e910a8c5d36ad363fbc1f0164cf0b85 (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.c | 74 | ||||
-rw-r--r-- | drivers/staging/rt2860/chips/rt3090.c | 32 | ||||
-rw-r--r-- | drivers/staging/rt2860/chips/rt30xx.c | 273 | ||||
-rw-r--r-- | drivers/staging/rt2860/pci_main_dev.c | 1016 | ||||
-rw-r--r-- | drivers/staging/rt2860/rt_linux.c | 1067 | ||||
-rw-r--r-- | drivers/staging/rt2860/rt_main_dev.c | 399 | ||||
-rw-r--r-- | drivers/staging/rt2860/rt_pci_rbus.c | 481 | ||||
-rw-r--r-- | drivers/staging/rt2860/rt_usb.c | 649 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta_ioctl.c | 3437 | ||||
-rw-r--r-- | drivers/staging/rt2860/usb_main_dev.c | 699 |
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 | |||
48 | VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) | 46 | VOID 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 | |||
48 | VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd) | 46 | VOID 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 | // |
52 | REG_PAIR RT30xx_RFRegTable[] = { | 49 | REG_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 | ||
74 | UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR)); | 90 | UCHAR 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( |
84 | VOID RT30xxSetRxAnt( | 98 | VOID 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 | */ |
154 | VOID RTMPFilterCalibration( | 162 | VOID 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 | */ |
317 | VOID RT30xxLoadRFNormalModeSetup( | 309 | VOID 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 | */ |
384 | VOID RT30xxLoadRFSleepModeSetup( | 375 | VOID 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 | */ |
443 | VOID RT30xxReverseRFSleepModeSetup( | 431 | VOID 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 | ||
512 | VOID RT30xxHaltAction( | 496 | VOID 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); | |||
53 | extern int rt28xx_open(struct net_device *net_dev); | 53 | extern int rt28xx_open(struct net_device *net_dev); |
54 | 54 | ||
55 | static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev); | 55 | static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev); |
56 | static INT __devinit rt2860_probe(struct pci_dev *pci_dev, const struct pci_device_id *ent); | 56 | static INT __devinit rt2860_probe(struct pci_dev *pci_dev, |
57 | const struct pci_device_id *ent); | ||
57 | static void __exit rt2860_cleanup_module(void); | 58 | static void __exit rt2860_cleanup_module(void); |
58 | static int __init rt2860_init_module(void); | 59 | static int __init rt2860_init_module(void); |
59 | 60 | ||
60 | static VOID RTMPInitPCIeDevice( | 61 | static 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 |
65 | static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state); | 65 | static 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 | // |
72 | static struct pci_device_id rt2860_pci_tbl[] __devinitdata = | 72 | static 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 | ||
101 | MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl); | 100 | MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl); |
@@ -103,23 +102,20 @@ MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl); | |||
103 | MODULE_VERSION(STA_DRIVER_VERSION); | 102 | MODULE_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 | // |
110 | static struct pci_driver rt2860_driver = | 108 | static struct pci_driver rt2860_driver = { |
111 | { | 109 | name: "rt2860", |
112 | name: "rt2860", | 110 | id_table:rt2860_pci_tbl, |
113 | id_table: rt2860_pci_tbl, | 111 | probe: rt2860_probe, |
114 | probe: rt2860_probe, | 112 | remove:__devexit_p(rt2860_remove_one), |
115 | remove: __devexit_p(rt2860_remove_one), | ||
116 | #ifdef CONFIG_PM | 113 | #ifdef CONFIG_PM |
117 | suspend: rt2860_suspend, | 114 | suspend:rt2860_suspend, |
118 | resume: rt2860_resume, | 115 | resume: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 | ||
130 | VOID RT2860RejectPendingPackets( | 126 | VOID 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 | ||
137 | static int rt2860_suspend( | 132 | static 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 | ||
196 | static int rt2860_resume( | 184 | static 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 | |||
270 | static INT __init rt2860_init_module(VOID) | 249 | static 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 | // |
279 | static VOID __exit rt2860_cleanup_module(VOID) | 257 | static VOID __exit rt2860_cleanup_module(VOID) |
280 | { | 258 | { |
281 | pci_unregister_driver(&rt2860_driver); | 259 | pci_unregister_driver(&rt2860_driver); |
282 | } | 260 | } |
283 | 261 | ||
284 | module_init(rt2860_init_module); | 262 | module_init(rt2860_init_module); |
285 | module_exit(rt2860_cleanup_module); | 263 | module_exit(rt2860_cleanup_module); |
286 | 264 | ||
287 | |||
288 | // | 265 | // |
289 | // PCI device probe & initialization function | 266 | // PCI device probe & initialization function |
290 | // | 267 | // |
291 | static INT __devinit rt2860_probe( | 268 | static 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 --------------------------- */ |
391 | err_out_free_netdev: | 368 | err_out_free_netdev: |
392 | RtmpOSNetDevFree(net_dev); | 369 | RtmpOSNetDevFree(net_dev); |
393 | 370 | ||
394 | err_out_free_radev: | 371 | err_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 | ||
398 | err_out_iounmap: | 375 | err_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 | ||
402 | err_out_free_res: | 380 | err_out_free_res: |
403 | pci_release_regions(pci_dev); | 381 | pci_release_regions(pci_dev); |
@@ -405,25 +383,23 @@ err_out_free_res: | |||
405 | err_out: | 383 | err_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 | 392 | static VOID __devexit rt2860_remove_one(IN struct pci_dev *pci_dev) | |
414 | static 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 | ======================================================================== |
460 | Routine Description: | 435 | Routine Description: |
@@ -470,24 +445,20 @@ Return Value: | |||
470 | Note: | 445 | Note: |
471 | ======================================================================== | 446 | ======================================================================== |
472 | */ | 447 | */ |
473 | BOOLEAN RT28XXChipsetCheck( | 448 | BOOLEAN 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( | 459 | static 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 | 498 | VOID RTMPInitPCIeLinkCtrlValue(IN PRTMP_ADAPTER pAd) | |
531 | VOID 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, ®16); | 683 | ®16); |
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, ®16); | 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 | ®16); |
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, ®16); | 795 | ®16); |
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 | ||
817 | VOID RTMPFindHostPCIDev( | 813 | VOID 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 | ®16); |
841 | pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, ®16); | 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, ®8); | 838 | ®8); |
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 | */ |
865 | VOID RTMPPCIeLinkCtrlValueRestore( | 859 | VOID 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 | */ |
959 | VOID RTMPPCIeLinkCtrlSetting( | 953 | VOID 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 | */ |
1084 | VOID RTMPrt3xSetPCIePowerLinkCtrl( | 1079 | VOID 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, ®16); | 1154 | ®16); |
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 | ||
31 | ULONG RTDebugLevel = RT_DEBUG_ERROR; | 31 | ULONG RTDebugLevel = RT_DEBUG_ERROR; |
32 | |||
33 | 32 | ||
34 | // for wireless system event message | 33 | // for wireless system event message |
35 | char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = { | 34 | char 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 |
59 | char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = { | 58 | char 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 |
73 | char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = { | 72 | char 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 */ |
84 | VOID RTMP_SetPeriodicTimer( | 83 | VOID 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 */ |
94 | VOID RTMP_OS_Init_Timer( | 92 | VOID 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 | 101 | VOID RTMP_OS_Add_Timer(IN NDIS_MINIPORT_TIMER * pTimer, | |
106 | VOID 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 | ||
118 | VOID RTMP_OS_Mod_Timer( | 112 | VOID 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 | ||
126 | VOID RTMP_OS_Del_Timer( | 119 | VOID 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 | ||
141 | VOID RTMP_OS_Release_Packet( | 130 | VOID 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 |
149 | VOID RTMPusecDelay( | 136 | VOID 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 | ||
161 | void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time) | 147 | void 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 |
167 | NDIS_STATUS os_alloc_mem( | 153 | NDIS_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 |
180 | NDIS_STATUS os_free_mem( | 163 | NDIS_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 | 171 | PNDIS_PACKET RtmpOSNetPktAlloc(IN RTMP_ADAPTER * pAd, IN int size) | |
191 | |||
192 | |||
193 | PNDIS_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 | 180 | PNDIS_PACKET RTMP_AllocateFragPacketBuffer(IN PRTMP_ADAPTER pAd, | |
205 | PNDIS_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 | 199 | PNDIS_PACKET RTMP_AllocateTxPacketBuffer(IN PRTMP_ADAPTER pAd, | |
227 | PNDIS_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 | 223 | VOID build_tx_packet(IN PRTMP_ADAPTER pAd, | |
256 | VOID 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 | ||
271 | VOID RTMPFreeAdapter( | 236 | VOID 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 |
288 | NdisFreeSpinLock(&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 | ||
307 | BOOLEAN OS_Need_Clone_Packet(void) | 268 | BOOLEAN 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 | */ |
336 | NDIS_STATUS RTMPCloneNdisPacket( | 295 | NDIS_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() |
370 | NDIS_STATUS RTMPAllocateNdisPacket( | 326 | NDIS_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 | */ |
415 | VOID RTMPFreeNdisPacket( | 370 | VOID 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 |
426 | NDIS_STATUS Sniff2BytesFromNdisBuffer( | 378 | NDIS_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 | 388 | void RTMP_QueryPacketInfo(IN PNDIS_PACKET pPacket, | |
439 | void 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 | ||
454 | void RTMP_QueryNextPacketInfo( | 401 | void 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 | 432 | PNDIS_PACKET DuplicatePacket(IN PRTMP_ADAPTER pAd, | |
490 | PNDIS_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 | ||
515 | PNDIS_PACKET duplicate_pkt( | 453 | PNDIS_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 |
543 | PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( | 477 | PNDIS_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 | 500 | PNDIS_PACKET ClonePacket(IN PRTMP_ADAPTER pAd, | |
568 | 501 | IN PNDIS_PACKET pPacket, | |
569 | 502 | IN PUCHAR pData, IN ULONG DataSize) | |
570 | PNDIS_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 | // |
600 | void update_os_packet_info( | 527 | void 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 | 541 | void wlan_802_11_to_802_3_packet(IN PRTMP_ADAPTER pAd, | |
617 | void 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 | ||
645 | void announce_802_3_packet( | 567 | void 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 | |||
663 | PRTMP_SCATTER_GATHER_LIST | 582 | PRTMP_SCATTER_GATHER_LIST |
664 | rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg) | 583 | rt_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 | */ |
712 | VOID RTMPSendWirelessEvent( | 631 | VOID 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 | ||
791 | void send_monitor_packets( | 718 | void 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 | ||
954 | err_free_sk_buff: | 897 | err_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 | *******************************************************************************/ |
1021 | RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode) | 961 | RTMP_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 | ||
1034 | int RtmpOSFileClose(RTMP_OS_FD osfd) | 975 | int 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 | |||
1041 | void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset) | 981 | void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset) |
1042 | { | 982 | { |
1043 | osfd->f_pos = offset; | 983 | osfd->f_pos = offset; |
1044 | } | 984 | } |
1045 | 985 | ||
1046 | |||
1047 | int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen) | 986 | int 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 | |||
1062 | int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen) | 997 | int 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 | *******************************************************************************/ |
1072 | NDIS_STATUS RtmpOSTaskKill( | 1008 | NDIS_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 | 1046 | INT RtmpOSTaskNotifyToExit(IN RTMP_OS_TASK * pTask) | |
1114 | INT 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 | 1056 | void RtmpOSTaskCustomize(IN RTMP_OS_TASK * pTask) | |
1126 | void 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 | 1073 | NDIS_STATUS RtmpOSTaskAttach(IN RTMP_OS_TASK * pTask, | |
1145 | NDIS_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 | 1101 | NDIS_STATUS RtmpOSTaskInit(IN RTMP_OS_TASK * pTask, | |
1178 | NDIS_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 | 1129 | void RTMP_IndicateMediaState(IN PRTMP_ADAPTER pAd) | |
1207 | void 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 | ||
1223 | int RtmpOSWrielessEventSend( | 1144 | int 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 | 1167 | int RtmpOSNetDevAddrSet(IN PNET_DEV pNetDev, IN PUCHAR pMacAddr) | |
1249 | int 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 | */ |
1275 | static int RtmpOSNetDevRequestName( | 1190 | static 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 | 1234 | void RtmpOSNetDevClose(IN PNET_DEV pNetDev) | |
1326 | void RtmpOSNetDevClose( | ||
1327 | IN PNET_DEV pNetDev) | ||
1328 | { | 1235 | { |
1329 | dev_close(pNetDev); | 1236 | dev_close(pNetDev); |
1330 | } | 1237 | } |
1331 | 1238 | ||
1332 | |||
1333 | void RtmpOSNetDevFree(PNET_DEV pNetDev) | 1239 | void 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 | 1246 | INT RtmpOSNetDevAlloc(IN PNET_DEV * new_dev_p, IN UINT32 privDataSize) | |
1341 | INT 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 | |||
1357 | PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName) | 1261 | PNET_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 | |||
1367 | void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev) | 1270 | void 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 | 1281 | INT RtmpOSNetDevDestory(IN RTMP_ADAPTER * pAd, IN PNET_DEV pNetDev) | |
1379 | INT 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 | |||
1390 | void RtmpOSNetDevDetach(PNET_DEV pNetDev) | 1289 | void RtmpOSNetDevDetach(PNET_DEV pNetDev) |
1391 | { | 1290 | { |
1392 | unregister_netdev(pNetDev); | 1291 | unregister_netdev(pNetDev); |
1393 | } | 1292 | } |
1394 | 1293 | ||
1395 | 1294 | int RtmpOSNetDevAttach(IN PNET_DEV pNetDev, | |
1396 | int 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 | 1334 | PNET_DEV RtmpOSNetDevCreate(IN RTMP_ADAPTER * pAd, | |
1441 | PNET_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 | ||
46 | PSTRING mac = ""; // default 00:00:00:00:00:00 | 44 | PSTRING mac = ""; // default 00:00:00:00:00:00 |
47 | PSTRING hostname = ""; // default CMPC | 45 | PSTRING hostname = ""; // default CMPC |
48 | module_param (mac, charp, 0); | 46 | module_param(mac, charp, 0); |
49 | MODULE_PARM_DESC (mac, "rt28xx: wireless mac addr"); | 47 | MODULE_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); | |||
58 | int rt28xx_open(struct net_device *net_dev); | 55 | int rt28xx_open(struct net_device *net_dev); |
59 | 56 | ||
60 | // private function prototype | 57 | // private function prototype |
61 | static INT rt28xx_send_packets(IN struct sk_buff *skb_p, IN struct net_device *net_dev); | 58 | static INT rt28xx_send_packets(IN struct sk_buff *skb_p, |
62 | 59 | IN struct net_device *net_dev); | |
63 | 60 | ||
64 | static struct net_device_stats *RT28xx_get_ether_stats( | 61 | static 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 | */ |
87 | int MainVirtualIF_close(IN struct net_device *net_dev) | 84 | int 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 | */ |
162 | int MainVirtualIF_open(IN struct net_device *net_dev) | 168 | int 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 | */ |
205 | int rt28xx_close(IN PNET_DEV dev) | 211 | int 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 | */ |
388 | int rt28xx_open(IN PNET_DEV dev) | 381 | int 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, ®); // clear garbage interrupts | 422 | RTMP_IO_READ32(pAd, 0x1300, ®); // 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, ®); | 431 | // RTMP_IO_READ32(pAd, XIFS_TIME_CFG, ®); |
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 | ||
462 | static const struct net_device_ops rt2860_netdev_ops = { | 451 | static 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 | ||
473 | PNET_DEV RtmpPhyNetDevInit( | 462 | PNET_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 | ======================================================================== |
504 | Routine Description: | 494 | Routine 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; |
552 | done: | 540 | done: |
@@ -554,7 +542,6 @@ done: | |||
554 | return status; | 542 | return status; |
555 | } | 543 | } |
556 | 544 | ||
557 | |||
558 | /* | 545 | /* |
559 | ======================================================================== | 546 | ======================================================================== |
560 | Routine Description: | 547 | Routine Description: |
@@ -571,30 +558,27 @@ Return Value: | |||
571 | Note: | 558 | Note: |
572 | ======================================================================== | 559 | ======================================================================== |
573 | */ | 560 | */ |
574 | static int rt28xx_send_packets( | 561 | static 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 |
596 | struct iw_statistics *rt28xx_get_wireless_stats( | 581 | struct 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 | |||
638 | void tbtt_tasklet(unsigned long data) | 621 | void 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 | */ |
660 | static struct net_device_stats *RT28xx_get_ether_stats( | 643 | static 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 | 693 | BOOLEAN RtmpPhyNetDevExit(IN RTMP_ADAPTER * pAd, IN PNET_DEV net_dev) | |
711 | BOOLEAN 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 | ======================================================================== |
732 | Routine Description: | 710 | Routine Description: |
@@ -743,17 +721,14 @@ Return Value: | |||
743 | Note: | 721 | Note: |
744 | ======================================================================== | 722 | ======================================================================== |
745 | */ | 723 | */ |
746 | NDIS_STATUS AdapterBlockAllocateMemory( | 724 | NDIS_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); | |||
48 | static void ac3_dma_done_tasklet(unsigned long data); | 48 | static void ac3_dma_done_tasklet(unsigned long data); |
49 | static void fifo_statistic_full_tasklet(unsigned long data); | 49 | static 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. |
83 | void RTMP_AllocateTxDescMemory( | 80 | void 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. |
99 | void RTMP_AllocateMgmtDescMemory( | 96 | void 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. |
114 | void RTMP_AllocateRxDescMemory( | 111 | void 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. |
129 | void RTMP_FreeDescMemory( | 126 | void 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. |
142 | void RTMP_AllocateFirstTxBuffer( | 138 | void 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 | 152 | void RTMP_FreeFirstTxBuffer(IN PRTMP_ADAPTER pAd, | |
156 | void 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 | */ |
178 | void RTMP_AllocateSharedMemory( | 173 | void 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 | */ |
202 | PNDIS_PACKET RTMP_AllocateRxPacketBuffer( | 197 | PNDIS_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 | 227 | VOID Invalid_Remaining_Packet(IN PRTMP_ADAPTER pAd, IN ULONG VirtualAddress) | |
230 | VOID 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 | ||
239 | NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER *pAd) | 236 | NDIS_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 | 260 | void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd) | |
258 | void 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 | 276 | NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER * pAd) | |
275 | NDIS_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 | ======================================================================== |
285 | Routine Description: | 284 | Routine Description: |
@@ -294,15 +293,12 @@ Return Value: | |||
294 | Note: | 293 | Note: |
295 | ======================================================================== | 294 | ======================================================================== |
296 | */ | 295 | */ |
297 | VOID RtmpMgmtTaskExit( | 296 | VOID RtmpMgmtTaskExit(IN RTMP_ADAPTER * pAd) |
298 | IN RTMP_ADAPTER *pAd) | ||
299 | { | 297 | { |
300 | 298 | ||
301 | |||
302 | return; | 299 | return; |
303 | } | 300 | } |
304 | 301 | ||
305 | |||
306 | static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode) | 302 | static 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 | |||
324 | static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode) | 319 | static 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 | |||
384 | static void rx_done_tasklet(unsigned long data) | 376 | static 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 | |||
419 | void fifo_statistic_full_tasklet(unsigned long data) | 410 | void 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 | |||
492 | static void ac2_dma_done_tasklet(unsigned long data) | 482 | static 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 | |||
531 | static void ac1_dma_done_tasklet(unsigned long data) | 520 | static 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 | |||
570 | static void ac0_dma_done_tasklet(unsigned long data) | 558 | static 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 | ||
619 | IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) | 604 | IRQ_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 | */ |
828 | dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction) | 793 | dma_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 | ||
865 | void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction) | 829 | void 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) | 41 | void 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: | |||
73 | Note: | 77 | Note: |
74 | ======================================================================== | 78 | ======================================================================== |
75 | */ | 79 | */ |
76 | NDIS_STATUS RtmpMgmtTaskInit( | 80 | NDIS_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 | ======================================================================== |
124 | Routine Description: | 124 | Routine Description: |
@@ -133,11 +133,10 @@ Return Value: | |||
133 | Note: | 133 | Note: |
134 | ======================================================================== | 134 | ======================================================================== |
135 | */ | 135 | */ |
136 | VOID RtmpMgmtTaskExit( | 136 | VOID 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 | |||
198 | static void rtusb_dataout_complete(unsigned long data) | 198 | static 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 | |||
286 | static void rtusb_null_frame_done_tasklet(unsigned long data) | 295 | static 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 | |||
338 | static void rtusb_rts_frame_done_tasklet(unsigned long data) | 344 | static 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 | |||
393 | static void rtusb_pspoll_frame_done_tasklet(unsigned long data) | 394 | static 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 | ======================================================================== |
443 | Routine Description: | 441 | Routine Description: |
@@ -454,18 +452,17 @@ Note: | |||
454 | */ | 452 | */ |
455 | static void rx_done_tasklet(unsigned long data) | 453 | static 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 | |||
519 | static void rtusb_mgmt_dma_done_tasklet(unsigned long data) | 515 | static 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 | ||
607 | static void rtusb_ac3_dma_done_tasklet(unsigned long data) | 596 | static 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 | |||
653 | static void rtusb_ac2_dma_done_tasklet(unsigned long data) | 636 | static 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 | |||
699 | static void rtusb_ac1_dma_done_tasklet(unsigned long data) | 676 | static 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 | |||
744 | static void rtusb_ac0_dma_done_tasklet(unsigned long data) | 716 | static 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 | 756 | NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER * pAd) | |
791 | NDIS_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 | 783 | void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd) | |
812 | void 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 |
43 | extern ULONG RTDebugLevel; | 43 | extern 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 | ||
52 | extern UCHAR CipherWpa2Template[]; | 52 | extern UCHAR CipherWpa2Template[]; |
53 | 53 | ||
54 | typedef struct PACKED _RT_VERSION_INFO{ | 54 | typedef 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 | ||
64 | static __s32 ralinkrate[] = | 64 | static __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 | ||
76 | INT Set_SSID_Proc( | 76 | INT Set_SSID_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg); |
77 | IN PRTMP_ADAPTER pAdapter, | ||
78 | IN PSTRING arg); | ||
79 | 77 | ||
80 | INT Set_NetworkType_Proc( | 78 | INT Set_NetworkType_Proc(IN PRTMP_ADAPTER pAdapter, IN PSTRING arg); |
81 | IN PRTMP_ADAPTER pAdapter, | ||
82 | IN PSTRING arg); | ||
83 | 79 | ||
84 | VOID RTMPAddKey( | 80 | VOID 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 | ||
289 | char * rtstrchr(const char * s, int c) | 350 | char *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 | ||
301 | int | 362 | int |
302 | rt_ioctl_giwname(struct net_device *dev, | 363 | rt_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 | ||
312 | int rt_ioctl_siwfreq(struct net_device *dev, | 372 | int 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 | |||
347 | int rt_ioctl_giwfreq(struct net_device *dev, | 406 | int 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 | ||
367 | int rt_ioctl_siwmode(struct net_device *dev, | 426 | int 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 | ||
404 | int rt_ioctl_giwmode(struct net_device *dev, | 462 | int 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 | ||
427 | int rt_ioctl_siwsens(struct net_device *dev, | 482 | int 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 | ||
445 | int rt_ioctl_giwsens(struct net_device *dev, | 498 | int 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 | ||
452 | int rt_ioctl_giwrange(struct net_device *dev, | 504 | int 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 | ||
535 | int rt_ioctl_siwap(struct net_device *dev, | 585 | int 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 | ||
577 | int rt_ioctl_giwap(struct net_device *dev, | 625 | int 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 | */ |
621 | static void set_quality(PRTMP_ADAPTER pAdapter, | 665 | static 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 | ||
645 | int rt_ioctl_iwaplist(struct net_device *dev, | 688 | int 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 | ||
682 | int rt_ioctl_siwscan(struct net_device *dev, | 725 | int 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 | ||
761 | int rt_ioctl_giwscan(struct net_device *dev, | 801 | int 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 | ||
1048 | int rt_ioctl_siwessid(struct net_device *dev, | 1128 | int 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 | ||
1091 | int rt_ioctl_giwessid(struct net_device *dev, | 1165 | int 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 | ||
1130 | int rt_ioctl_siwnickn(struct net_device *dev, | 1203 | int 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 | ||
1155 | int rt_ioctl_giwnickn(struct net_device *dev, | 1226 | int 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 | ||
1172 | int rt_ioctl_siwrts(struct net_device *dev, | 1243 | int 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 | ||
1203 | int rt_ioctl_giwrts(struct net_device *dev, | 1273 | int 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 | ||
1225 | int rt_ioctl_siwfrag(struct net_device *dev, | 1294 | int 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 | ||
1254 | int rt_ioctl_giwfrag(struct net_device *dev, | 1323 | int 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 |
1278 | int rt_ioctl_siwencode(struct net_device *dev, | 1346 | int 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 | ||
1374 | done: | 1431 | done: |
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 | ||
1382 | int | 1448 | int |
1383 | rt_ioctl_giwencode(struct net_device *dev, | 1449 | rt_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 | ||
1443 | void getBaInfo( | 1509 | void 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 | ||
1490 | int rt_ioctl_siwmlme(struct net_device *dev, | 1565 | int 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 | ||
1548 | int rt_ioctl_siwauth(struct net_device *dev, | 1625 | int 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 | ||
1695 | int rt_ioctl_giwauth(struct net_device *dev, | 1775 | int 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 | ||
1731 | void fnSetCipherKey( | 1818 | void 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 | ||
1770 | int rt_ioctl_siwencodeext(struct net_device *dev, | 1861 | int 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 | ||
1903 | int | 2016 | int |
1904 | rt_ioctl_giwencodeext(struct net_device *dev, | 2017 | rt_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 | ||
1989 | int rt_ioctl_siwgenie(struct net_device *dev, | 2095 | int 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 | ||
2018 | int rt_ioctl_giwgenie(struct net_device *dev, | 2122 | int 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 | ||
2061 | int rt_ioctl_siwpmksa(struct net_device *dev, | 2162 | int 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 | ||
2138 | int rt_ioctl_siwrate(struct net_device *dev, | 2266 | int 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 | ||
2194 | int rt_ioctl_giwrate(struct net_device *dev, | 2322 | int 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 | ||
2254 | static const iw_handler rt_handler[] = | 2384 | static 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 | ||
2313 | const struct iw_handler_def rt28xx_iw_handler_def = | 2442 | const 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 | ||
2322 | INT rt28xx_sta_ioctl( | 2450 | INT 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 | */ |
2511 | INT Set_SSID_Proc( | 2642 | INT 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 | */ |
2592 | INT Set_NetworkType_Proc( | 2721 | INT 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"); | |||
37 | MODULE_VERSION(STA_DRIVER_VERSION); | 36 | MODULE_VERSION(STA_DRIVER_VERSION); |
38 | #endif | 37 | #endif |
39 | 38 | ||
40 | |||
41 | /* module table */ | 39 | /* module table */ |
42 | struct usb_device_id rtusb_usb_id[] = { | 40 | struct 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 | ||
148 | INT const rtusb_usb_id_len = sizeof(rtusb_usb_id) / sizeof(struct usb_device_id); | 146 | INT const rtusb_usb_id_len = |
147 | sizeof(rtusb_usb_id) / sizeof(struct usb_device_id); | ||
149 | 148 | ||
150 | MODULE_DEVICE_TABLE(usb, rtusb_usb_id); | 149 | MODULE_DEVICE_TABLE(usb, rtusb_usb_id); |
151 | 150 | ||
152 | static void rt2870_disconnect( | 151 | static 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 | ||
156 | static int __devinit rt2870_probe( | 153 | static 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 | |||
167 | extern int rt28xx_close(IN struct net_device *net_dev); | 162 | extern int rt28xx_close(IN struct net_device *net_dev); |
168 | extern int rt28xx_open(struct net_device *net_dev); | 163 | extern int rt28xx_open(struct net_device *net_dev); |
169 | 164 | ||
170 | static BOOLEAN USBDevConfigInit( | 165 | static 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: | |||
188 | Note: | 181 | Note: |
189 | ======================================================================== | 182 | ======================================================================== |
190 | */ | 183 | */ |
191 | BOOLEAN RT28XXChipsetCheck( | 184 | BOOLEAN 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); | |||
227 | static int rt2870_resume(struct usb_interface *intf); | 216 | static int rt2870_resume(struct usb_interface *intf); |
228 | #endif // CONFIG_PM // | 217 | #endif // CONFIG_PM // |
229 | 218 | ||
230 | static int rtusb_probe (struct usb_interface *intf, | 219 | static int rtusb_probe(struct usb_interface *intf, |
231 | const struct usb_device_id *id); | 220 | const struct usb_device_id *id); |
232 | static void rtusb_disconnect(struct usb_interface *intf); | 221 | static void rtusb_disconnect(struct usb_interface *intf); |
233 | 222 | ||
234 | static BOOLEAN USBDevConfigInit( | 223 | static 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 | 299 | static int rtusb_probe(struct usb_interface *intf, | |
296 | 300 | const struct usb_device_id *id) | |
297 | static 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 | |||
315 | static void rtusb_disconnect(struct usb_interface *intf) | 316 | static 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 | |||
328 | struct usb_driver rtusb_driver = { | 327 | struct 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, | 334 | suspend:rt2870_suspend, |
336 | resume: rt2870_resume, | 335 | resume:rt2870_resume, |
337 | #endif | 336 | #endif |
338 | }; | 337 | }; |
339 | 338 | ||
340 | #ifdef CONFIG_PM | 339 | #ifdef CONFIG_PM |
341 | 340 | ||
342 | VOID RT2870RejectPendingPackets( | 341 | VOID 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 | ||
349 | static int rt2870_suspend( | 347 | static 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 | ||
370 | static int rt2870_resume( | 365 | static 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) | |||
405 | module_init(rtusb_init); | 398 | module_init(rtusb_init); |
406 | module_exit(rtusb_exit); | 399 | module_exit(rtusb_exit); |
407 | 400 | ||
408 | |||
409 | |||
410 | |||
411 | /*--------------------------------------------------------------------- */ | 401 | /*--------------------------------------------------------------------- */ |
412 | /* function declarations */ | 402 | /* function declarations */ |
413 | /*--------------------------------------------------------------------- */ | 403 | /*--------------------------------------------------------------------- */ |
@@ -426,35 +416,32 @@ Return Value: | |||
426 | Note: | 416 | Note: |
427 | ======================================================================== | 417 | ======================================================================== |
428 | */ | 418 | */ |
429 | INT MlmeThread( | 419 | INT 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 | ======================================================================== |
490 | Routine Description: | 476 | Routine Description: |
@@ -499,16 +485,15 @@ Return Value: | |||
499 | Note: | 485 | Note: |
500 | ======================================================================== | 486 | ======================================================================== |
501 | */ | 487 | */ |
502 | INT RTUSBCmdThread( | 488 | INT 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 | 573 | VOID RTUSBWatchDog(IN RTMP_ADAPTER * pAd) | |
594 | VOID 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 | */ |
776 | static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd) | 771 | static 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 | 805 | static int __devinit rt2870_probe(IN struct usb_interface *intf, | |
812 | static 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 |