2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * s_vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * csBeacon_xmit - beacon tx function
31 * csMgmt_xmit - management tx function
32 * s_uGetDataDuration - get tx data required duration
33 * s_uFillDataHead- fulfill tx data duration header
34 * s_uGetRTSCTSDuration- get rtx/cts required duration
35 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
36 * s_uGetTxRsvTime- get frame reserved time
37 * s_vFillCTSHead- fulfill CTS ctl header
38 * s_vFillFragParameter- Set fragment ctl parameter.
39 * s_vFillRTSHead- fulfill RTS ctl header
40 * s_vFillTxKey- fulfill tx encrypt key
41 * s_vSWencryption- Software encrypt header
42 * vDMA0_tx_80211- tx 802.11 frame via dma0
43 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 static int msglevel
= MSG_LEVEL_INFO
;
68 const u16 wTimeStampOff
[2][MAX_RATE
] = {
69 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
70 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
73 const u16 wFB_Opt0
[2][5] = {
74 {RATE_12M
, RATE_18M
, RATE_24M
, RATE_36M
, RATE_48M
}, // fallback_rate0
75 {RATE_12M
, RATE_12M
, RATE_18M
, RATE_24M
, RATE_36M
}, // fallback_rate1
77 const u16 wFB_Opt1
[2][5] = {
78 {RATE_12M
, RATE_18M
, RATE_24M
, RATE_24M
, RATE_36M
}, // fallback_rate0
79 {RATE_6M
, RATE_6M
, RATE_12M
, RATE_12M
, RATE_18M
}, // fallback_rate1
86 #define RTSDUR_BA_F0 4
87 #define RTSDUR_AA_F0 5
88 #define RTSDUR_BA_F1 6
89 #define RTSDUR_AA_F1 7
90 #define CTSDUR_BA_F0 8
91 #define CTSDUR_BA_F1 9
94 #define DATADUR_A_F0 12
95 #define DATADUR_A_F1 13
97 static void s_vSaveTxPktInfo(struct vnt_private
*pDevice
, u8 byPktNum
,
98 u8
*pbyDestAddr
, u16 wPktLength
, u16 wFIFOCtl
);
100 static void *s_vGetFreeContext(struct vnt_private
*pDevice
);
102 static void s_vGenerateTxParameter(struct vnt_private
*pDevice
,
103 u8 byPktType
, u16 wCurrentRate
, void *pTxBufHead
, void *pvRrvTime
,
104 void *pvRTS
, void *pvCTS
, u32 cbFrameSize
, int bNeedACK
, u32 uDMAIdx
,
105 struct ethhdr
*psEthHeader
);
107 static u32
s_uFillDataHead(struct vnt_private
*pDevice
,
108 u8 byPktType
, u16 wCurrentRate
, void *pTxDataHead
, u32 cbFrameLength
,
109 u32 uDMAIdx
, int bNeedAck
, u32 uFragIdx
, u32 cbLastFragmentSize
,
110 u32 uMACfragNum
, u8 byFBOption
);
112 static void s_vGenerateMACHeader(struct vnt_private
*pDevice
,
113 u8
*pbyBufferAddr
, u16 wDuration
, struct ethhdr
*psEthHeader
,
114 int bNeedEncrypt
, u16 wFragType
, u32 uDMAIdx
, u32 uFragIdx
);
116 static void s_vFillTxKey(struct vnt_private
*pDevice
, u8
*pbyBuf
,
117 u8
*pbyIVHead
, PSKeyItem pTransmitKey
, u8
*pbyHdrBuf
, u16 wPayloadLen
,
120 static void s_vSWencryption(struct vnt_private
*pDevice
,
121 PSKeyItem pTransmitKey
, u8
*pbyPayloadHead
, u16 wPayloadSize
);
123 static unsigned int s_uGetTxRsvTime(struct vnt_private
*pDevice
, u8 byPktType
,
124 u32 cbFrameLength
, u16 wRate
, int bNeedAck
);
126 static u32
s_uGetRTSCTSRsvTime(struct vnt_private
*pDevice
, u8 byRTSRsvType
,
127 u8 byPktType
, u32 cbFrameLength
, u16 wCurrentRate
);
129 static void s_vFillCTSHead(struct vnt_private
*pDevice
, u32 uDMAIdx
,
130 u8 byPktType
, void *pvCTS
, u32 cbFrameLength
, int bNeedAck
,
131 int bDisCRC
, u16 wCurrentRate
, u8 byFBOption
);
133 static void s_vFillRTSHead(struct vnt_private
*pDevice
, u8 byPktType
,
134 void *pvRTS
, u32 cbFrameLength
, int bNeedAck
, int bDisCRC
,
135 struct ethhdr
*psEthHeader
, u16 wCurrentRate
, u8 byFBOption
);
137 static u32
s_uGetDataDuration(struct vnt_private
*pDevice
, u8 byDurType
,
138 u32 cbFrameLength
, u8 byPktType
, u16 wRate
, int bNeedAck
,
139 u32 uFragIdx
, u32 cbLastFragmentSize
, u32 uMACfragNum
,
142 static unsigned int s_uGetRTSCTSDuration(struct vnt_private
*pDevice
,
143 u8 byDurType
, u32 cbFrameLength
, u8 byPktType
, u16 wRate
,
144 int bNeedAck
, u8 byFBOption
);
146 static void *s_vGetFreeContext(struct vnt_private
*pDevice
)
148 PUSB_SEND_CONTEXT pContext
= NULL
;
149 PUSB_SEND_CONTEXT pReturnContext
= NULL
;
152 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"GetFreeContext()\n");
154 for (ii
= 0; ii
< pDevice
->cbTD
; ii
++) {
155 pContext
= pDevice
->apTD
[ii
];
156 if (pContext
->bBoolInUse
== false) {
157 pContext
->bBoolInUse
= true;
158 pReturnContext
= pContext
;
162 if ( ii
== pDevice
->cbTD
) {
163 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"No Free Tx Context\n");
165 return (void *) pReturnContext
;
168 static void s_vSaveTxPktInfo(struct vnt_private
*pDevice
, u8 byPktNum
,
169 u8
*pbyDestAddr
, u16 wPktLength
, u16 wFIFOCtl
)
171 PSStatCounter pStatistic
= &pDevice
->scStatistic
;
173 if (is_broadcast_ether_addr(pbyDestAddr
))
174 pStatistic
->abyTxPktInfo
[byPktNum
].byBroadMultiUni
= TX_PKT_BROAD
;
175 else if (is_multicast_ether_addr(pbyDestAddr
))
176 pStatistic
->abyTxPktInfo
[byPktNum
].byBroadMultiUni
= TX_PKT_MULTI
;
178 pStatistic
->abyTxPktInfo
[byPktNum
].byBroadMultiUni
= TX_PKT_UNI
;
180 pStatistic
->abyTxPktInfo
[byPktNum
].wLength
= wPktLength
;
181 pStatistic
->abyTxPktInfo
[byPktNum
].wFIFOCtl
= wFIFOCtl
;
182 memcpy(pStatistic
->abyTxPktInfo
[byPktNum
].abyDestAddr
,
187 static void s_vFillTxKey(struct vnt_private
*pDevice
, u8
*pbyBuf
,
188 u8
*pbyIVHead
, PSKeyItem pTransmitKey
, u8
*pbyHdrBuf
,
189 u16 wPayloadLen
, u8
*pMICHDR
)
191 u32
*pdwIV
= (u32
*)pbyIVHead
;
192 u32
*pdwExtIV
= (u32
*)((u8
*)pbyIVHead
+ 4);
194 struct ieee80211_hdr
*pMACHeader
= (struct ieee80211_hdr
*)pbyHdrBuf
;
198 if (pTransmitKey
== NULL
)
201 dwRevIVCounter
= cpu_to_le32(pDevice
->dwIVCounter
);
202 *pdwIV
= pDevice
->dwIVCounter
;
203 pDevice
->byKeyIndex
= pTransmitKey
->dwKeyIndex
& 0xf;
205 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
206 if (pTransmitKey
->uKeyLength
== WLAN_WEP232_KEYLEN
){
207 memcpy(pDevice
->abyPRNG
, (u8
*)&(dwRevIVCounter
), 3);
208 memcpy(pDevice
->abyPRNG
+3, pTransmitKey
->abyKey
, pTransmitKey
->uKeyLength
);
210 memcpy(pbyBuf
, (u8
*)&(dwRevIVCounter
), 3);
211 memcpy(pbyBuf
+3, pTransmitKey
->abyKey
, pTransmitKey
->uKeyLength
);
212 if(pTransmitKey
->uKeyLength
== WLAN_WEP40_KEYLEN
) {
213 memcpy(pbyBuf
+8, (u8
*)&(dwRevIVCounter
), 3);
214 memcpy(pbyBuf
+11, pTransmitKey
->abyKey
, pTransmitKey
->uKeyLength
);
216 memcpy(pDevice
->abyPRNG
, pbyBuf
, 16);
218 // Append IV after Mac Header
219 *pdwIV
&= WEP_IV_MASK
;//00000000 11111111 11111111 11111111
220 *pdwIV
|= (u32
)pDevice
->byKeyIndex
<< 30;
221 *pdwIV
= cpu_to_le32(*pdwIV
);
222 pDevice
->dwIVCounter
++;
223 if (pDevice
->dwIVCounter
> WEP_IV_MASK
) {
224 pDevice
->dwIVCounter
= 0;
226 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
227 pTransmitKey
->wTSC15_0
++;
228 if (pTransmitKey
->wTSC15_0
== 0) {
229 pTransmitKey
->dwTSC47_16
++;
231 TKIPvMixKey(pTransmitKey
->abyKey
, pDevice
->abyCurrentNetAddr
,
232 pTransmitKey
->wTSC15_0
, pTransmitKey
->dwTSC47_16
, pDevice
->abyPRNG
);
233 memcpy(pbyBuf
, pDevice
->abyPRNG
, 16);
235 memcpy(pdwIV
, pDevice
->abyPRNG
, 3);
237 *(pbyIVHead
+3) = (u8
)(((pDevice
->byKeyIndex
<< 6) & 0xc0) | 0x20); // 0x20 is ExtIV
238 // Append IV&ExtIV after Mac Header
239 *pdwExtIV
= cpu_to_le32(pTransmitKey
->dwTSC47_16
);
240 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"vFillTxKey()---- pdwExtIV: %x\n",
243 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) {
244 pTransmitKey
->wTSC15_0
++;
245 if (pTransmitKey
->wTSC15_0
== 0) {
246 pTransmitKey
->dwTSC47_16
++;
248 memcpy(pbyBuf
, pTransmitKey
->abyKey
, 16);
252 *(pbyIVHead
+3) = (u8
)(((pDevice
->byKeyIndex
<< 6) & 0xc0) | 0x20); // 0x20 is ExtIV
253 *pdwIV
|= cpu_to_le16((u16
)(pTransmitKey
->wTSC15_0
));
254 //Append IV&ExtIV after Mac Header
255 *pdwExtIV
= cpu_to_le32(pTransmitKey
->dwTSC47_16
);
259 *((u8
*)(pMICHDR
+1)) = 0; // TxPriority
260 memcpy(pMICHDR
+2, &(pMACHeader
->addr2
[0]), 6);
261 *((u8
*)(pMICHDR
+8)) = HIBYTE(HIWORD(pTransmitKey
->dwTSC47_16
));
262 *((u8
*)(pMICHDR
+9)) = LOBYTE(HIWORD(pTransmitKey
->dwTSC47_16
));
263 *((u8
*)(pMICHDR
+10)) = HIBYTE(LOWORD(pTransmitKey
->dwTSC47_16
));
264 *((u8
*)(pMICHDR
+11)) = LOBYTE(LOWORD(pTransmitKey
->dwTSC47_16
));
265 *((u8
*)(pMICHDR
+12)) = HIBYTE(pTransmitKey
->wTSC15_0
);
266 *((u8
*)(pMICHDR
+13)) = LOBYTE(pTransmitKey
->wTSC15_0
);
267 *((u8
*)(pMICHDR
+14)) = HIBYTE(wPayloadLen
);
268 *((u8
*)(pMICHDR
+15)) = LOBYTE(wPayloadLen
);
271 *((u8
*)(pMICHDR
+16)) = 0; // HLEN[15:8]
272 if (pDevice
->bLongHeader
) {
273 *((u8
*)(pMICHDR
+17)) = 28; // HLEN[7:0]
275 *((u8
*)(pMICHDR
+17)) = 22; // HLEN[7:0]
277 wValue
= cpu_to_le16(pMACHeader
->frame_control
& 0xC78F);
278 memcpy(pMICHDR
+18, (u8
*)&wValue
, 2); // MSKFRACTL
279 memcpy(pMICHDR
+20, &(pMACHeader
->addr1
[0]), 6);
280 memcpy(pMICHDR
+26, &(pMACHeader
->addr2
[0]), 6);
283 memcpy(pMICHDR
+32, &(pMACHeader
->addr3
[0]), 6);
284 wValue
= pMACHeader
->seq_ctrl
;
286 wValue
= cpu_to_le16(wValue
);
287 memcpy(pMICHDR
+38, (u8
*)&wValue
, 2); // MSKSEQCTL
288 if (pDevice
->bLongHeader
) {
289 memcpy(pMICHDR
+40, &(pMACHeader
->addr4
[0]), 6);
294 static void s_vSWencryption(struct vnt_private
*pDevice
,
295 PSKeyItem pTransmitKey
, u8
*pbyPayloadHead
, u16 wPayloadSize
)
298 u32 dwICV
= 0xffffffff;
301 if (pTransmitKey
== NULL
)
304 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
305 //=======================================================================
306 // Append ICV after payload
307 dwICV
= CRCdwGetCrc32Ex(pbyPayloadHead
, wPayloadSize
, dwICV
);//ICV(Payload)
308 pdwICV
= (u32
*)(pbyPayloadHead
+ wPayloadSize
);
309 // finally, we must invert dwCRC to get the correct answer
310 *pdwICV
= cpu_to_le32(~dwICV
);
312 rc4_init(&pDevice
->SBox
, pDevice
->abyPRNG
, pTransmitKey
->uKeyLength
+ 3);
313 rc4_encrypt(&pDevice
->SBox
, pbyPayloadHead
, pbyPayloadHead
, wPayloadSize
+cbICVlen
);
314 //=======================================================================
315 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
316 //=======================================================================
317 //Append ICV after payload
318 dwICV
= CRCdwGetCrc32Ex(pbyPayloadHead
, wPayloadSize
, dwICV
);//ICV(Payload)
319 pdwICV
= (u32
*)(pbyPayloadHead
+ wPayloadSize
);
320 // finally, we must invert dwCRC to get the correct answer
321 *pdwICV
= cpu_to_le32(~dwICV
);
323 rc4_init(&pDevice
->SBox
, pDevice
->abyPRNG
, TKIP_KEY_LEN
);
324 rc4_encrypt(&pDevice
->SBox
, pbyPayloadHead
, pbyPayloadHead
, wPayloadSize
+cbICVlen
);
325 //=======================================================================
329 /*byPktType : PK_TYPE_11A 0
334 static u32
s_uGetTxRsvTime(struct vnt_private
*pDevice
, u8 byPktType
,
335 u32 cbFrameLength
, u16 wRate
, int bNeedAck
)
337 u32 uDataTime
, uAckTime
;
339 uDataTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, cbFrameLength
, wRate
);
340 if (byPktType
== PK_TYPE_11B
) {//llb,CCK mode
341 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, (u16
)pDevice
->byTopCCKBasicRate
);
342 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
343 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, (u16
)pDevice
->byTopOFDMBasicRate
);
347 return (uDataTime
+ pDevice
->uSIFS
+ uAckTime
);
354 //byFreqType: 0=>5GHZ 1=>2.4GHZ
355 static u32
s_uGetRTSCTSRsvTime(struct vnt_private
*pDevice
,
356 u8 byRTSRsvType
, u8 byPktType
, u32 cbFrameLength
, u16 wCurrentRate
)
358 u32 uRrvTime
, uRTSTime
, uCTSTime
, uAckTime
, uDataTime
;
360 uRrvTime
= uRTSTime
= uCTSTime
= uAckTime
= uDataTime
= 0;
362 uDataTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, cbFrameLength
, wCurrentRate
);
363 if (byRTSRsvType
== 0) { //RTSTxRrvTime_bb
364 uRTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 20, pDevice
->byTopCCKBasicRate
);
365 uCTSTime
= uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
367 else if (byRTSRsvType
== 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
368 uRTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 20, pDevice
->byTopCCKBasicRate
);
369 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
370 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
372 else if (byRTSRsvType
== 2) { //RTSTxRrvTime_aa
373 uRTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 20, pDevice
->byTopOFDMBasicRate
);
374 uCTSTime
= uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
376 else if (byRTSRsvType
== 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
377 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
378 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
379 uRrvTime
= uCTSTime
+ uAckTime
+ uDataTime
+ 2*pDevice
->uSIFS
;
384 uRrvTime
= uRTSTime
+ uCTSTime
+ uAckTime
+ uDataTime
+ 3*pDevice
->uSIFS
;
388 //byFreqType 0: 5GHz, 1:2.4Ghz
389 static u32
s_uGetDataDuration(struct vnt_private
*pDevice
, u8 byDurType
,
390 u32 cbFrameLength
, u8 byPktType
, u16 wRate
, int bNeedAck
,
391 u32 uFragIdx
, u32 cbLastFragmentSize
, u32 uMACfragNum
,
395 u32 uAckTime
= 0, uNextPktTime
= 0;
397 if (uFragIdx
== (uMACfragNum
-1)) {
403 case DATADUR_B
: //DATADUR_B
404 if (((uMACfragNum
== 1)) || (bLastFrag
== 1)) {//Non Frag or Last Frag
406 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
407 return (pDevice
->uSIFS
+ uAckTime
);
412 else {//First Frag or Mid Frag
413 if (uFragIdx
== (uMACfragNum
-2)) {
414 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wRate
, bNeedAck
);
416 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
419 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
420 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
422 return (pDevice
->uSIFS
+ uNextPktTime
);
427 case DATADUR_A
: //DATADUR_A
428 if (((uMACfragNum
==1)) || (bLastFrag
==1)) {//Non Frag or Last Frag
430 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
431 return (pDevice
->uSIFS
+ uAckTime
);
436 else {//First Frag or Mid Frag
437 if(uFragIdx
== (uMACfragNum
-2)){
438 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wRate
, bNeedAck
);
440 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
443 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
444 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
446 return (pDevice
->uSIFS
+ uNextPktTime
);
451 case DATADUR_A_F0
: //DATADUR_A_F0
452 if (((uMACfragNum
==1)) || (bLastFrag
==1)) {//Non Frag or Last Frag
454 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
455 return (pDevice
->uSIFS
+ uAckTime
);
460 else { //First Frag or Mid Frag
461 if (byFBOption
== AUTO_FB_0
) {
462 if (wRate
< RATE_18M
)
464 else if (wRate
> RATE_54M
)
467 if(uFragIdx
== (uMACfragNum
-2)){
468 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
470 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
472 } else { // (byFBOption == AUTO_FB_1)
473 if (wRate
< RATE_18M
)
475 else if (wRate
> RATE_54M
)
478 if(uFragIdx
== (uMACfragNum
-2)){
479 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
481 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
486 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
487 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
489 return (pDevice
->uSIFS
+ uNextPktTime
);
494 case DATADUR_A_F1
: //DATADUR_A_F1
495 if (((uMACfragNum
==1)) || (bLastFrag
==1)) {//Non Frag or Last Frag
497 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
498 return (pDevice
->uSIFS
+ uAckTime
);
503 else { //First Frag or Mid Frag
504 if (byFBOption
== AUTO_FB_0
) {
505 if (wRate
< RATE_18M
)
507 else if (wRate
> RATE_54M
)
510 if(uFragIdx
== (uMACfragNum
-2)){
511 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
513 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
516 } else { // (byFBOption == AUTO_FB_1)
517 if (wRate
< RATE_18M
)
519 else if (wRate
> RATE_54M
)
522 if(uFragIdx
== (uMACfragNum
-2)){
523 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
525 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
529 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
530 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
532 return (pDevice
->uSIFS
+ uNextPktTime
);
545 //byFreqType: 0=>5GHZ 1=>2.4GHZ
546 static u32
s_uGetRTSCTSDuration(struct vnt_private
*pDevice
, u8 byDurType
,
547 u32 cbFrameLength
, u8 byPktType
, u16 wRate
, int bNeedAck
,
550 u32 uCTSTime
= 0, uDurTime
= 0;
554 case RTSDUR_BB
: //RTSDuration_bb
555 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
556 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
559 case RTSDUR_BA
: //RTSDuration_ba
560 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
561 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
564 case RTSDUR_AA
: //RTSDuration_aa
565 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
566 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
569 case CTSDUR_BA
: //CTSDuration_ba
570 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
573 case RTSDUR_BA_F0
: //RTSDuration_ba_f0
574 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
575 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
576 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
577 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
578 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
582 case RTSDUR_AA_F0
: //RTSDuration_aa_f0
583 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
584 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
585 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
586 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
587 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
591 case RTSDUR_BA_F1
: //RTSDuration_ba_f1
592 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
593 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
594 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
595 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
596 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
600 case RTSDUR_AA_F1
: //RTSDuration_aa_f1
601 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
602 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
603 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
604 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
605 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
609 case CTSDUR_BA_F0
: //CTSDuration_ba_f0
610 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
611 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
612 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
613 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
617 case CTSDUR_BA_F1
: //CTSDuration_ba_f1
618 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
619 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
620 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<=RATE_54M
)) {
621 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
633 static u32
s_uFillDataHead(struct vnt_private
*pDevice
,
634 u8 byPktType
, u16 wCurrentRate
, void *pTxDataHead
, u32 cbFrameLength
,
635 u32 uDMAIdx
, int bNeedAck
, u32 uFragIdx
, u32 cbLastFragmentSize
,
636 u32 uMACfragNum
, u8 byFBOption
)
639 if (pTxDataHead
== NULL
) {
643 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
644 if ((uDMAIdx
== TYPE_ATIMDMA
) || (uDMAIdx
== TYPE_BEACONDMA
)) {
645 PSTxDataHead_ab pBuf
= (PSTxDataHead_ab
) pTxDataHead
;
646 //Get SignalField,ServiceField,Length
647 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
648 (u16
*)&(pBuf
->wTransmitLength
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
650 //Get Duration and TimeStampOff
651 pBuf
->wDuration
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
652 wCurrentRate
, bNeedAck
, uFragIdx
,
653 cbLastFragmentSize
, uMACfragNum
,
654 byFBOption
); //1: 2.4GHz
655 if(uDMAIdx
!=TYPE_ATIMDMA
) {
656 pBuf
->wTimeStampOff
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
658 return (pBuf
->wDuration
);
660 else { // DATA & MANAGE Frame
661 if (byFBOption
== AUTO_FB_NONE
) {
662 PSTxDataHead_g pBuf
= (PSTxDataHead_g
)pTxDataHead
;
663 //Get SignalField,ServiceField,Length
664 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
665 (u16
*)&(pBuf
->wTransmitLength_a
), (u8
*)&(pBuf
->byServiceField_a
), (u8
*)&(pBuf
->bySignalField_a
)
667 BBvCalculateParameter(pDevice
, cbFrameLength
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
668 (u16
*)&(pBuf
->wTransmitLength_b
), (u8
*)&(pBuf
->byServiceField_b
), (u8
*)&(pBuf
->bySignalField_b
)
670 //Get Duration and TimeStamp
671 pBuf
->wDuration_a
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
,
672 byPktType
, wCurrentRate
, bNeedAck
, uFragIdx
,
673 cbLastFragmentSize
, uMACfragNum
,
674 byFBOption
); //1: 2.4GHz
675 pBuf
->wDuration_b
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameLength
,
676 PK_TYPE_11B
, pDevice
->byTopCCKBasicRate
,
677 bNeedAck
, uFragIdx
, cbLastFragmentSize
,
678 uMACfragNum
, byFBOption
); //1: 2.4GHz
680 pBuf
->wTimeStampOff_a
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
681 pBuf
->wTimeStampOff_b
= wTimeStampOff
[pDevice
->byPreambleType
%2][pDevice
->byTopCCKBasicRate
%MAX_RATE
];
682 return (pBuf
->wDuration_a
);
685 PSTxDataHead_g_FB pBuf
= (PSTxDataHead_g_FB
)pTxDataHead
;
686 //Get SignalField,ServiceField,Length
687 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
688 (u16
*)&(pBuf
->wTransmitLength_a
), (u8
*)&(pBuf
->byServiceField_a
), (u8
*)&(pBuf
->bySignalField_a
)
690 BBvCalculateParameter(pDevice
, cbFrameLength
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
691 (u16
*)&(pBuf
->wTransmitLength_b
), (u8
*)&(pBuf
->byServiceField_b
), (u8
*)&(pBuf
->bySignalField_b
)
693 //Get Duration and TimeStamp
694 pBuf
->wDuration_a
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
695 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //1: 2.4GHz
696 pBuf
->wDuration_b
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameLength
, PK_TYPE_11B
,
697 pDevice
->byTopCCKBasicRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //1: 2.4GHz
698 pBuf
->wDuration_a_f0
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A_F0
, cbFrameLength
, byPktType
,
699 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //1: 2.4GHz
700 pBuf
->wDuration_a_f1
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A_F1
, cbFrameLength
, byPktType
,
701 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //1: 2.4GHz
702 pBuf
->wTimeStampOff_a
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
703 pBuf
->wTimeStampOff_b
= wTimeStampOff
[pDevice
->byPreambleType
%2][pDevice
->byTopCCKBasicRate
%MAX_RATE
];
704 return (pBuf
->wDuration_a
);
705 } //if (byFBOption == AUTO_FB_NONE)
708 else if (byPktType
== PK_TYPE_11A
) {
709 if ((byFBOption
!= AUTO_FB_NONE
) && (uDMAIdx
!= TYPE_ATIMDMA
) && (uDMAIdx
!= TYPE_BEACONDMA
)) {
711 PSTxDataHead_a_FB pBuf
= (PSTxDataHead_a_FB
)pTxDataHead
;
712 //Get SignalField,ServiceField,Length
713 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
714 (u16
*)&(pBuf
->wTransmitLength
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
716 //Get Duration and TimeStampOff
717 pBuf
->wDuration
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
718 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //0: 5GHz
719 pBuf
->wDuration_f0
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A_F0
, cbFrameLength
, byPktType
,
720 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //0: 5GHz
721 pBuf
->wDuration_f1
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A_F1
, cbFrameLength
, byPktType
,
722 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
); //0: 5GHz
723 if(uDMAIdx
!=TYPE_ATIMDMA
) {
724 pBuf
->wTimeStampOff
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
726 return (pBuf
->wDuration
);
728 PSTxDataHead_ab pBuf
= (PSTxDataHead_ab
)pTxDataHead
;
729 //Get SignalField,ServiceField,Length
730 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
731 (u16
*)&(pBuf
->wTransmitLength
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
733 //Get Duration and TimeStampOff
734 pBuf
->wDuration
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
735 wCurrentRate
, bNeedAck
, uFragIdx
,
736 cbLastFragmentSize
, uMACfragNum
,
739 if(uDMAIdx
!=TYPE_ATIMDMA
) {
740 pBuf
->wTimeStampOff
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
742 return (pBuf
->wDuration
);
745 else if (byPktType
== PK_TYPE_11B
) {
746 PSTxDataHead_ab pBuf
= (PSTxDataHead_ab
)pTxDataHead
;
747 //Get SignalField,ServiceField,Length
748 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
749 (u16
*)&(pBuf
->wTransmitLength
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
751 //Get Duration and TimeStampOff
752 pBuf
->wDuration
= (u16
)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameLength
, byPktType
,
753 wCurrentRate
, bNeedAck
, uFragIdx
,
754 cbLastFragmentSize
, uMACfragNum
,
756 if (uDMAIdx
!= TYPE_ATIMDMA
) {
757 pBuf
->wTimeStampOff
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
759 return (pBuf
->wDuration
);
764 static void s_vFillRTSHead(struct vnt_private
*pDevice
, u8 byPktType
,
765 void *pvRTS
, u32 cbFrameLength
, int bNeedAck
, int bDisCRC
,
766 struct ethhdr
*psEthHeader
, u16 wCurrentRate
, u8 byFBOption
)
768 u32 uRTSFrameLen
= 20;
775 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
776 // in this case we need to decrease its length by 4.
780 // Note: So far RTSHead doesn't appear in ATIM & Beacom DMA, so we don't need to take them into account.
781 // Otherwise, we need to modified codes for them.
782 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
783 if (byFBOption
== AUTO_FB_NONE
) {
784 PSRTS_g pBuf
= (PSRTS_g
)pvRTS
;
785 //Get SignalField,ServiceField,Length
786 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
787 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField_b
), (u8
*)&(pBuf
->bySignalField_b
)
789 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
790 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
791 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField_a
), (u8
*)&(pBuf
->bySignalField_a
)
793 pBuf
->wTransmitLength_a
= cpu_to_le16(wLen
);
795 pBuf
->wDuration_bb
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BB
, cbFrameLength
, PK_TYPE_11B
, pDevice
->byTopCCKBasicRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
796 pBuf
->wDuration_aa
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
797 pBuf
->wDuration_ba
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
799 pBuf
->Data
.wDurationID
= pBuf
->wDuration_aa
;
801 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
803 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
804 (pDevice
->eOPMode
== OP_MODE_AP
)) {
805 memcpy(&(pBuf
->Data
.abyRA
[0]),
806 &(psEthHeader
->h_dest
[0]),
810 memcpy(&(pBuf
->Data
.abyRA
[0]),
811 &(pDevice
->abyBSSID
[0]),
814 if (pDevice
->eOPMode
== OP_MODE_AP
) {
815 memcpy(&(pBuf
->Data
.abyTA
[0]),
816 &(pDevice
->abyBSSID
[0]),
820 memcpy(&(pBuf
->Data
.abyTA
[0]),
821 &(psEthHeader
->h_source
[0]),
826 PSRTS_g_FB pBuf
= (PSRTS_g_FB
)pvRTS
;
827 //Get SignalField,ServiceField,Length
828 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
829 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField_b
), (u8
*)&(pBuf
->bySignalField_b
)
831 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
832 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
833 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField_a
), (u8
*)&(pBuf
->bySignalField_a
)
835 pBuf
->wTransmitLength_a
= cpu_to_le16(wLen
);
837 pBuf
->wDuration_bb
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BB
, cbFrameLength
, PK_TYPE_11B
, pDevice
->byTopCCKBasicRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
838 pBuf
->wDuration_aa
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
839 pBuf
->wDuration_ba
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
840 pBuf
->wRTSDuration_ba_f0
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
841 pBuf
->wRTSDuration_aa_f0
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
842 pBuf
->wRTSDuration_ba_f1
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
843 pBuf
->wRTSDuration_aa_f1
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
844 pBuf
->Data
.wDurationID
= pBuf
->wDuration_aa
;
846 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
848 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
849 (pDevice
->eOPMode
== OP_MODE_AP
)) {
850 memcpy(&(pBuf
->Data
.abyRA
[0]),
851 &(psEthHeader
->h_dest
[0]),
855 memcpy(&(pBuf
->Data
.abyRA
[0]),
856 &(pDevice
->abyBSSID
[0]),
860 if (pDevice
->eOPMode
== OP_MODE_AP
) {
861 memcpy(&(pBuf
->Data
.abyTA
[0]),
862 &(pDevice
->abyBSSID
[0]),
866 memcpy(&(pBuf
->Data
.abyTA
[0]),
867 &(psEthHeader
->h_source
[0]),
871 } // if (byFBOption == AUTO_FB_NONE)
873 else if (byPktType
== PK_TYPE_11A
) {
874 if (byFBOption
== AUTO_FB_NONE
) {
875 PSRTS_ab pBuf
= (PSRTS_ab
)pvRTS
;
876 //Get SignalField,ServiceField,Length
877 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
878 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
880 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
882 pBuf
->wDuration
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
883 pBuf
->Data
.wDurationID
= pBuf
->wDuration
;
885 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
887 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
888 (pDevice
->eOPMode
== OP_MODE_AP
)) {
889 memcpy(&(pBuf
->Data
.abyRA
[0]),
890 &(psEthHeader
->h_dest
[0]),
893 memcpy(&(pBuf
->Data
.abyRA
[0]),
894 &(pDevice
->abyBSSID
[0]),
898 if (pDevice
->eOPMode
== OP_MODE_AP
) {
899 memcpy(&(pBuf
->Data
.abyTA
[0]),
900 &(pDevice
->abyBSSID
[0]),
903 memcpy(&(pBuf
->Data
.abyTA
[0]),
904 &(psEthHeader
->h_source
[0]),
910 PSRTS_a_FB pBuf
= (PSRTS_a_FB
)pvRTS
;
911 //Get SignalField,ServiceField,Length
912 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
913 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
915 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
917 pBuf
->wDuration
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
918 pBuf
->wRTSDuration_f0
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
919 pBuf
->wRTSDuration_f1
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //7:RTSDuration_aa_f1, 0:5G, 0:
920 pBuf
->Data
.wDurationID
= pBuf
->wDuration
;
922 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
924 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
925 (pDevice
->eOPMode
== OP_MODE_AP
)) {
926 memcpy(&(pBuf
->Data
.abyRA
[0]),
927 &(psEthHeader
->h_dest
[0]),
930 memcpy(&(pBuf
->Data
.abyRA
[0]),
931 &(pDevice
->abyBSSID
[0]),
934 if (pDevice
->eOPMode
== OP_MODE_AP
) {
935 memcpy(&(pBuf
->Data
.abyTA
[0]),
936 &(pDevice
->abyBSSID
[0]),
939 memcpy(&(pBuf
->Data
.abyTA
[0]),
940 &(psEthHeader
->h_source
[0]),
945 else if (byPktType
== PK_TYPE_11B
) {
946 PSRTS_ab pBuf
= (PSRTS_ab
)pvRTS
;
947 //Get SignalField,ServiceField,Length
948 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
949 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField
), (u8
*)&(pBuf
->bySignalField
)
951 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
953 pBuf
->wDuration
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BB
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
954 pBuf
->Data
.wDurationID
= pBuf
->wDuration
;
956 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
958 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
959 (pDevice
->eOPMode
== OP_MODE_AP
)) {
960 memcpy(&(pBuf
->Data
.abyRA
[0]),
961 &(psEthHeader
->h_dest
[0]),
965 memcpy(&(pBuf
->Data
.abyRA
[0]),
966 &(pDevice
->abyBSSID
[0]),
970 if (pDevice
->eOPMode
== OP_MODE_AP
) {
971 memcpy(&(pBuf
->Data
.abyTA
[0]),
972 &(pDevice
->abyBSSID
[0]),
975 memcpy(&(pBuf
->Data
.abyTA
[0]),
976 &(psEthHeader
->h_source
[0]),
982 static void s_vFillCTSHead(struct vnt_private
*pDevice
, u32 uDMAIdx
,
983 u8 byPktType
, void *pvCTS
, u32 cbFrameLength
, int bNeedAck
,
984 int bDisCRC
, u16 wCurrentRate
, u8 byFBOption
)
986 u32 uCTSFrameLen
= 14;
994 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
995 // in this case we need to decrease its length by 4.
999 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
1000 if (byFBOption
!= AUTO_FB_NONE
&& uDMAIdx
!= TYPE_ATIMDMA
&& uDMAIdx
!= TYPE_BEACONDMA
) {
1002 PSCTS_FB pBuf
= (PSCTS_FB
)pvCTS
;
1003 //Get SignalField,ServiceField,Length
1004 BBvCalculateParameter(pDevice
, uCTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
1005 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField_b
), (u8
*)&(pBuf
->bySignalField_b
)
1007 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
1008 pBuf
->wDuration_ba
= (u16
)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1009 pBuf
->wDuration_ba
+= pDevice
->wCTSDuration
;
1010 pBuf
->wDuration_ba
= cpu_to_le16(pBuf
->wDuration_ba
);
1011 //Get CTSDuration_ba_f0
1012 pBuf
->wCTSDuration_ba_f0
= (u16
)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
1013 pBuf
->wCTSDuration_ba_f0
+= pDevice
->wCTSDuration
;
1014 pBuf
->wCTSDuration_ba_f0
= cpu_to_le16(pBuf
->wCTSDuration_ba_f0
);
1015 //Get CTSDuration_ba_f1
1016 pBuf
->wCTSDuration_ba_f1
= (u16
)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
1017 pBuf
->wCTSDuration_ba_f1
+= pDevice
->wCTSDuration
;
1018 pBuf
->wCTSDuration_ba_f1
= cpu_to_le16(pBuf
->wCTSDuration_ba_f1
);
1019 //Get CTS Frame body
1020 pBuf
->Data
.wDurationID
= pBuf
->wDuration_ba
;
1021 pBuf
->Data
.wFrameControl
= TYPE_CTL_CTS
;//0x00C4
1022 pBuf
->Data
.wReserved
= 0x0000;
1023 memcpy(&(pBuf
->Data
.abyRA
[0]),
1024 &(pDevice
->abyCurrentNetAddr
[0]),
1026 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1027 PSCTS pBuf
= (PSCTS
)pvCTS
;
1028 //Get SignalField,ServiceField,Length
1029 BBvCalculateParameter(pDevice
, uCTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
1030 (u16
*)&(wLen
), (u8
*)&(pBuf
->byServiceField_b
), (u8
*)&(pBuf
->bySignalField_b
)
1032 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
1033 //Get CTSDuration_ba
1034 pBuf
->wDuration_ba
= cpu_to_le16((u16
)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1035 pBuf
->wDuration_ba
+= pDevice
->wCTSDuration
;
1036 pBuf
->wDuration_ba
= cpu_to_le16(pBuf
->wDuration_ba
);
1038 //Get CTS Frame body
1039 pBuf
->Data
.wDurationID
= pBuf
->wDuration_ba
;
1040 pBuf
->Data
.wFrameControl
= TYPE_CTL_CTS
;//0x00C4
1041 pBuf
->Data
.wReserved
= 0x0000;
1042 memcpy(&(pBuf
->Data
.abyRA
[0]),
1043 &(pDevice
->abyCurrentNetAddr
[0]),
1052 * Generate FIFO control for MAC & Baseband controller
1056 * pDevice - Pointer to adpater
1057 * pTxDataHead - Transmit Data Buffer
1058 * pTxBufHead - pTxBufHead
1059 * pvRrvTime - pvRrvTime
1060 * pvRTS - RTS Buffer
1062 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1063 * bNeedACK - If need ACK
1064 * uDMAIdx - DMA Index
1068 * Return Value: none
1072 static void s_vGenerateTxParameter(struct vnt_private
*pDevice
,
1073 u8 byPktType
, u16 wCurrentRate
, void *pTxBufHead
, void *pvRrvTime
,
1074 void *pvRTS
, void *pvCTS
, u32 cbFrameSize
, int bNeedACK
, u32 uDMAIdx
,
1075 struct ethhdr
*psEthHeader
)
1077 u32 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
; /* 24 */
1079 int bDisCRC
= false;
1080 u8 byFBOption
= AUTO_FB_NONE
;
1082 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1083 PSTxBufHead pFifoHead
= (PSTxBufHead
)pTxBufHead
;
1084 pFifoHead
->wReserved
= wCurrentRate
;
1085 wFifoCtl
= pFifoHead
->wFIFOCtl
;
1087 if (wFifoCtl
& FIFOCTL_CRCDIS
) {
1091 if (wFifoCtl
& FIFOCTL_AUTO_FB_0
) {
1092 byFBOption
= AUTO_FB_0
;
1094 else if (wFifoCtl
& FIFOCTL_AUTO_FB_1
) {
1095 byFBOption
= AUTO_FB_1
;
1098 if (pDevice
->bLongHeader
)
1099 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
+ 6;
1101 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
1103 if (pvRTS
!= NULL
) { //RTS_need
1106 PSRrvTime_gRTS pBuf
= (PSRrvTime_gRTS
)pvRrvTime
;
1107 pBuf
->wRTSTxRrvTime_aa
= cpu_to_le16((u16
)s_uGetRTSCTSRsvTime(pDevice
, 2, byPktType
, cbFrameSize
, wCurrentRate
));//2:RTSTxRrvTime_aa, 1:2.4GHz
1108 pBuf
->wRTSTxRrvTime_ba
= cpu_to_le16((u16
)s_uGetRTSCTSRsvTime(pDevice
, 1, byPktType
, cbFrameSize
, wCurrentRate
));//1:RTSTxRrvTime_ba, 1:2.4GHz
1109 pBuf
->wRTSTxRrvTime_bb
= cpu_to_le16((u16
)s_uGetRTSCTSRsvTime(pDevice
, 0, byPktType
, cbFrameSize
, wCurrentRate
));//0:RTSTxRrvTime_bb, 1:2.4GHz
1110 pBuf
->wTxRrvTime_a
= cpu_to_le16((u16
) s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameSize
, wCurrentRate
, bNeedACK
));//2.4G OFDM
1111 pBuf
->wTxRrvTime_b
= cpu_to_le16((u16
) s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, pDevice
->byTopCCKBasicRate
, bNeedACK
));//1:CCK
1114 s_vFillRTSHead(pDevice
, byPktType
, pvRTS
, cbFrameSize
, bNeedACK
, bDisCRC
, psEthHeader
, wCurrentRate
, byFBOption
);
1116 else {//RTS_needless, PCF mode
1120 PSRrvTime_gCTS pBuf
= (PSRrvTime_gCTS
)pvRrvTime
;
1121 pBuf
->wTxRrvTime_a
= cpu_to_le16((u16
)s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameSize
, wCurrentRate
, bNeedACK
));//2.4G OFDM
1122 pBuf
->wTxRrvTime_b
= cpu_to_le16((u16
)s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, pDevice
->byTopCCKBasicRate
, bNeedACK
));//1:CCK
1123 pBuf
->wCTSTxRrvTime_ba
= cpu_to_le16((u16
)s_uGetRTSCTSRsvTime(pDevice
, 3, byPktType
, cbFrameSize
, wCurrentRate
));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1126 s_vFillCTSHead(pDevice
, uDMAIdx
, byPktType
, pvCTS
, cbFrameSize
, bNeedACK
, bDisCRC
, wCurrentRate
, byFBOption
);
1129 else if (byPktType
== PK_TYPE_11A
) {
1131 if (pvRTS
!= NULL
) {//RTS_need, non PCF mode
1134 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1135 pBuf
->wRTSTxRrvTime
= cpu_to_le16((u16
)s_uGetRTSCTSRsvTime(pDevice
, 2, byPktType
, cbFrameSize
, wCurrentRate
));//2:RTSTxRrvTime_aa, 0:5GHz
1136 pBuf
->wTxRrvTime
= cpu_to_le16((u16
)s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameSize
, wCurrentRate
, bNeedACK
));//0:OFDM
1139 s_vFillRTSHead(pDevice
, byPktType
, pvRTS
, cbFrameSize
, bNeedACK
, bDisCRC
, psEthHeader
, wCurrentRate
, byFBOption
);
1141 else if (pvRTS
== NULL
) {//RTS_needless, non PCF mode
1144 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1145 pBuf
->wTxRrvTime
= cpu_to_le16((u16
)s_uGetTxRsvTime(pDevice
, PK_TYPE_11A
, cbFrameSize
, wCurrentRate
, bNeedACK
)); //0:OFDM
1149 else if (byPktType
== PK_TYPE_11B
) {
1151 if ((pvRTS
!= NULL
)) {//RTS_need, non PCF mode
1154 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1155 pBuf
->wRTSTxRrvTime
= cpu_to_le16((u16
)s_uGetRTSCTSRsvTime(pDevice
, 0, byPktType
, cbFrameSize
, wCurrentRate
));//0:RTSTxRrvTime_bb, 1:2.4GHz
1156 pBuf
->wTxRrvTime
= cpu_to_le16((u16
)s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, wCurrentRate
, bNeedACK
));//1:CCK
1159 s_vFillRTSHead(pDevice
, byPktType
, pvRTS
, cbFrameSize
, bNeedACK
, bDisCRC
, psEthHeader
, wCurrentRate
, byFBOption
);
1161 else { //RTS_needless, non PCF mode
1164 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1165 pBuf
->wTxRrvTime
= cpu_to_le16((u16
)s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, wCurrentRate
, bNeedACK
)); //1:CCK
1169 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1172 u8 * pbyBuffer,//point to pTxBufHead
1173 u16 wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1174 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1177 static int s_bPacketToWirelessUsb(struct vnt_private
*pDevice
, u8 byPktType
,
1178 u8
*usbPacketBuf
, int bNeedEncryption
, u32 uSkbPacketLen
, u32 uDMAIdx
,
1179 struct ethhdr
*psEthHeader
, u8
*pPacket
, PSKeyItem pTransmitKey
,
1180 u32 uNodeIndex
, u16 wCurrentRate
, u32
*pcbHeaderLen
, u32
*pcbTotalLen
)
1182 struct vnt_manager
*pMgmt
= &pDevice
->vnt_mgmt
;
1183 u32 cbFrameSize
, cbFrameBodySize
;
1184 PTX_BUFFER pTxBufHead
;
1186 u32 cbIVlen
= 0, cbICVlen
= 0, cbMIClen
= 0, cbMACHdLen
= 0;
1187 u32 cbFCSlen
= 4, cbMICHDR
= 0;
1189 u8
*pbyType
, *pbyMacHdr
, *pbyIVHead
, *pbyPayloadHead
, *pbyTxBufferAddr
;
1190 u8 abySNAP_RFC1042
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
1191 u8 abySNAP_Bridgetunnel
[ETH_ALEN
]
1192 = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
1194 u32 cbHeaderLength
= 0, uPadding
= 0;
1196 PSMICHDRHead pMICHDR
;
1200 u8 byFBOption
= AUTO_FB_NONE
, byFragType
;
1202 u32 dwMICKey0
, dwMICKey1
, dwMIC_Priority
, dwCRC
;
1203 u32
*pdwMIC_L
, *pdwMIC_R
;
1204 int bSoftWEP
= false;
1206 pvRrvTime
= pMICHDR
= pvRTS
= pvCTS
= pvTxDataHd
= NULL
;
1208 if (bNeedEncryption
&& pTransmitKey
->pvKeyTable
) {
1209 if (((PSKeyTable
)pTransmitKey
->pvKeyTable
)->bSoftWEP
== true)
1210 bSoftWEP
= true; /* WEP 256 */
1213 pTxBufHead
= (PTX_BUFFER
) usbPacketBuf
;
1214 memset(pTxBufHead
, 0, sizeof(TX_BUFFER
));
1217 if (ntohs(psEthHeader
->h_proto
) > ETH_DATA_LEN
) {
1218 if (pDevice
->dwDiagRefCount
== 0) {
1227 cbFrameBodySize
= uSkbPacketLen
- ETH_HLEN
+ cb802_1_H_len
;
1230 pTxBufHead
->wFIFOCtl
|= (u16
)(byPktType
<<8);
1232 if (pDevice
->dwDiagRefCount
!= 0) {
1234 pTxBufHead
->wFIFOCtl
= pTxBufHead
->wFIFOCtl
& (~FIFOCTL_NEEDACK
);
1235 } else { //if (pDevice->dwDiagRefCount != 0) {
1236 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
1237 (pDevice
->eOPMode
== OP_MODE_AP
)) {
1238 if (is_multicast_ether_addr(psEthHeader
->h_dest
)) {
1240 pTxBufHead
->wFIFOCtl
=
1241 pTxBufHead
->wFIFOCtl
& (~FIFOCTL_NEEDACK
);
1244 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
1248 // MSDUs in Infra mode always need ACK
1250 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
1252 } //if (pDevice->dwDiagRefCount != 0) {
1254 pTxBufHead
->wTimeStamp
= DEFAULT_MSDU_LIFETIME_RES_64us
;
1257 if (pDevice
->bLongHeader
)
1258 pTxBufHead
->wFIFOCtl
|= FIFOCTL_LHEAD
;
1260 if (pDevice
->bSoftwareGenCrcErr
) {
1261 pTxBufHead
->wFIFOCtl
|= FIFOCTL_CRCDIS
; // set tx descriptors to NO hardware CRC
1264 //Set FRAGCTL_MACHDCNT
1265 if (pDevice
->bLongHeader
) {
1266 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
+ 6;
1268 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
;
1270 pTxBufHead
->wFragCtl
|= (u16
)(cbMACHdLen
<< 10);
1272 //Set FIFOCTL_GrpAckPolicy
1273 if (pDevice
->bGrpAckPolicy
== true) {//0000 0100 0000 0000
1274 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GRPACK
;
1277 //Set Auto Fallback Ctl
1278 if (wCurrentRate
>= RATE_18M
) {
1279 if (pDevice
->byAutoFBCtrl
== AUTO_FB_0
) {
1280 pTxBufHead
->wFIFOCtl
|= FIFOCTL_AUTO_FB_0
;
1281 byFBOption
= AUTO_FB_0
;
1282 } else if (pDevice
->byAutoFBCtrl
== AUTO_FB_1
) {
1283 pTxBufHead
->wFIFOCtl
|= FIFOCTL_AUTO_FB_1
;
1284 byFBOption
= AUTO_FB_1
;
1288 if (bSoftWEP
!= true) {
1289 if ((bNeedEncryption
) && (pTransmitKey
!= NULL
)) { //WEP enabled
1290 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) { //WEP40 or WEP104
1291 pTxBufHead
->wFragCtl
|= FRAGCTL_LEGACY
;
1293 if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
1294 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Tx Set wFragCtl == FRAGCTL_TKIP\n");
1295 pTxBufHead
->wFragCtl
|= FRAGCTL_TKIP
;
1297 else if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) { //CCMP
1298 pTxBufHead
->wFragCtl
|= FRAGCTL_AES
;
1303 if ((bNeedEncryption
) && (pTransmitKey
!= NULL
)) {
1304 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
1308 else if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
1309 cbIVlen
= 8;//IV+ExtIV
1313 if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) {
1314 cbIVlen
= 8;//RSN Header
1316 cbMICHDR
= sizeof(SMICHDRHead
);
1318 if (bSoftWEP
== false) {
1319 //MAC Header should be padding 0 to DW alignment.
1320 uPadding
= 4 - (cbMACHdLen
%4);
1325 cbFrameSize
= cbMACHdLen
+ cbIVlen
+ (cbFrameBodySize
+ cbMIClen
) + cbICVlen
+ cbFCSlen
;
1327 if ( (bNeedACK
== false) ||(cbFrameSize
< pDevice
->wRTSThreshold
) ) {
1331 pTxBufHead
->wFIFOCtl
|= (FIFOCTL_RTS
| FIFOCTL_LRETRY
);
1334 pbyTxBufferAddr
= (u8
*) &(pTxBufHead
->adwTxKey
[0]);
1335 wTxBufSize
= sizeof(STxBufHead
);
1336 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {//802.11g packet
1337 if (byFBOption
== AUTO_FB_NONE
) {
1338 if (bRTS
== true) {//RTS_need
1339 pvRrvTime
= (PSRrvTime_gRTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1340 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
));
1341 pvRTS
= (PSRTS_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
);
1343 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g
));
1344 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g
) + sizeof(STxDataHead_g
);
1346 else { //RTS_needless
1347 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1348 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
1350 pvCTS
= (PSCTS
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
);
1351 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
));
1352 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
) + sizeof(STxDataHead_g
);
1356 if (bRTS
== true) {//RTS_need
1357 pvRrvTime
= (PSRrvTime_gRTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1358 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
));
1359 pvRTS
= (PSRTS_g_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
);
1361 pvTxDataHd
= (PSTxDataHead_g_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g_FB
));
1362 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g_FB
) + sizeof(STxDataHead_g_FB
);
1364 else if (bRTS
== false) { //RTS_needless
1365 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1366 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
1368 pvCTS
= (PSCTS_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
);
1369 pvTxDataHd
= (PSTxDataHead_g_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS_FB
));
1370 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS_FB
) + sizeof(STxDataHead_g_FB
);
1374 else {//802.11a/b packet
1375 if (byFBOption
== AUTO_FB_NONE
) {
1376 if (bRTS
== true) {//RTS_need
1377 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1378 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1379 pvRTS
= (PSRTS_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1381 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_ab
));
1382 cbHeaderLength
= wTxBufSize
+ sizeof(PSRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_ab
) + sizeof(STxDataHead_ab
);
1384 else if (bRTS
== false) { //RTS_needless, no MICHDR
1385 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1386 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1389 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1390 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(STxDataHead_ab
);
1394 if (bRTS
== true) {//RTS_need
1395 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1396 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1397 pvRTS
= (PSRTS_a_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1399 pvTxDataHd
= (PSTxDataHead_a_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_a_FB
));
1400 cbHeaderLength
= wTxBufSize
+ sizeof(PSRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_a_FB
) + sizeof(STxDataHead_a_FB
);
1402 else if (bRTS
== false) { //RTS_needless
1403 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1404 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1407 pvTxDataHd
= (PSTxDataHead_a_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1408 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(STxDataHead_a_FB
);
1413 pbyMacHdr
= (u8
*)(pbyTxBufferAddr
+ cbHeaderLength
);
1414 pbyIVHead
= (u8
*)(pbyMacHdr
+ cbMACHdLen
+ uPadding
);
1415 pbyPayloadHead
= (u8
*)(pbyMacHdr
+ cbMACHdLen
+ uPadding
+ cbIVlen
);
1417 //=========================
1419 //=========================
1420 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"No Fragmentation...\n");
1421 byFragType
= FRAGCTL_NONFRAG
;
1422 //uDMAIdx = TYPE_AC0DMA;
1423 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
1425 //Fill FIFO,RrvTime,RTS,and CTS
1426 s_vGenerateTxParameter(pDevice
, byPktType
, wCurrentRate
,
1427 (void *)pbyTxBufferAddr
, pvRrvTime
, pvRTS
, pvCTS
,
1428 cbFrameSize
, bNeedACK
, uDMAIdx
, psEthHeader
);
1430 uDuration
= s_uFillDataHead(pDevice
, byPktType
, wCurrentRate
, pvTxDataHd
, cbFrameSize
, uDMAIdx
, bNeedACK
,
1431 0, 0, 1/*uMACfragNum*/, byFBOption
);
1432 // Generate TX MAC Header
1433 s_vGenerateMACHeader(pDevice
, pbyMacHdr
, (u16
)uDuration
, psEthHeader
, bNeedEncryption
,
1434 byFragType
, uDMAIdx
, 0);
1436 if (bNeedEncryption
== true) {
1438 s_vFillTxKey(pDevice
, (u8
*)(pTxBufHead
->adwTxKey
), pbyIVHead
, pTransmitKey
,
1439 pbyMacHdr
, (u16
)cbFrameBodySize
, (u8
*)pMICHDR
);
1441 if (pDevice
->bEnableHostWEP
) {
1442 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
1443 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
1448 if (ntohs(psEthHeader
->h_proto
) > ETH_DATA_LEN
) {
1449 if (pDevice
->dwDiagRefCount
== 0) {
1450 if ((psEthHeader
->h_proto
== cpu_to_be16(ETH_P_IPX
)) ||
1451 (psEthHeader
->h_proto
== cpu_to_le16(0xF380))) {
1452 memcpy((u8
*) (pbyPayloadHead
),
1453 abySNAP_Bridgetunnel
, 6);
1455 memcpy((u8
*) (pbyPayloadHead
), &abySNAP_RFC1042
[0], 6);
1457 pbyType
= (u8
*) (pbyPayloadHead
+ 6);
1458 memcpy(pbyType
, &(psEthHeader
->h_proto
), sizeof(u16
));
1460 memcpy((u8
*) (pbyPayloadHead
), &(psEthHeader
->h_proto
), sizeof(u16
));
1466 if (pPacket
!= NULL
) {
1467 // Copy the Packet into a tx Buffer
1468 memcpy((pbyPayloadHead
+ cb802_1_H_len
),
1469 (pPacket
+ ETH_HLEN
),
1470 uSkbPacketLen
- ETH_HLEN
1474 // while bRelayPacketSend psEthHeader is point to header+payload
1475 memcpy((pbyPayloadHead
+ cb802_1_H_len
), ((u8
*)psEthHeader
) + ETH_HLEN
, uSkbPacketLen
- ETH_HLEN
);
1478 ASSERT(uLength
== cbNdisBodySize
);
1480 if ((bNeedEncryption
== true) && (pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
1482 ///////////////////////////////////////////////////////////////////
1484 if (pDevice
->vnt_mgmt
.eAuthenMode
== WMAC_AUTH_WPANONE
) {
1485 dwMICKey0
= *(u32
*)(&pTransmitKey
->abyKey
[16]);
1486 dwMICKey1
= *(u32
*)(&pTransmitKey
->abyKey
[20]);
1488 else if ((pTransmitKey
->dwKeyIndex
& AUTHENTICATOR_KEY
) != 0) {
1489 dwMICKey0
= *(u32
*)(&pTransmitKey
->abyKey
[16]);
1490 dwMICKey1
= *(u32
*)(&pTransmitKey
->abyKey
[20]);
1493 dwMICKey0
= *(u32
*)(&pTransmitKey
->abyKey
[24]);
1494 dwMICKey1
= *(u32
*)(&pTransmitKey
->abyKey
[28]);
1496 // DO Software Michael
1497 MIC_vInit(dwMICKey0
, dwMICKey1
);
1498 MIC_vAppend((u8
*)&(psEthHeader
->h_dest
[0]), 12);
1500 MIC_vAppend((u8
*)&dwMIC_Priority
, 4);
1501 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"MIC KEY: %X, %X\n",
1502 dwMICKey0
, dwMICKey1
);
1504 ///////////////////////////////////////////////////////////////////
1506 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1507 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1508 // DBG_PRN_GRP12(("%02x ", *((u8 *)((pbyPayloadHead + cb802_1_H_len) + ii))));
1510 //DBG_PRN_GRP12(("\n\n\n"));
1512 MIC_vAppend(pbyPayloadHead
, cbFrameBodySize
);
1514 pdwMIC_L
= (u32
*)(pbyPayloadHead
+ cbFrameBodySize
);
1515 pdwMIC_R
= (u32
*)(pbyPayloadHead
+ cbFrameBodySize
+ 4);
1517 MIC_vGetMIC(pdwMIC_L
, pdwMIC_R
);
1520 if (pDevice
->bTxMICFail
== true) {
1523 pDevice
->bTxMICFail
= false;
1525 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1526 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1527 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1530 if (bSoftWEP
== true) {
1532 s_vSWencryption(pDevice
, pTransmitKey
, (pbyPayloadHead
), (u16
)(cbFrameBodySize
+ cbMIClen
));
1534 } else if ( ((pDevice
->eEncryptionStatus
== Ndis802_11Encryption1Enabled
) && (bNeedEncryption
== true)) ||
1535 ((pDevice
->eEncryptionStatus
== Ndis802_11Encryption2Enabled
) && (bNeedEncryption
== true)) ||
1536 ((pDevice
->eEncryptionStatus
== Ndis802_11Encryption3Enabled
) && (bNeedEncryption
== true)) ) {
1537 cbFrameSize
-= cbICVlen
;
1540 if (pDevice
->bSoftwareGenCrcErr
== true) {
1544 dwCRC
= 0xFFFFFFFFL
;
1545 cbLen
= cbFrameSize
- cbFCSlen
;
1546 // calculate CRC, and wrtie CRC value to end of TD
1547 dwCRC
= CRCdwGetCrc32Ex(pbyMacHdr
, cbLen
, dwCRC
);
1548 pdwCRC
= (u32
*)(pbyMacHdr
+ cbLen
);
1549 // finally, we must invert dwCRC to get the correct answer
1554 cbFrameSize
-= cbFCSlen
;
1557 *pcbHeaderLen
= cbHeaderLength
;
1558 *pcbTotalLen
= cbHeaderLength
+ cbFrameSize
;
1560 //Set FragCtl in TxBufferHead
1561 pTxBufHead
->wFragCtl
|= (u16
)byFragType
;
1570 * Translate 802.3 to 802.11 header
1574 * pDevice - Pointer to adapter
1575 * dwTxBufferAddr - Transmit Buffer
1576 * pPacket - Packet from upper layer
1577 * cbPacketSize - Transmit Data Length
1579 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1580 * pcbAppendPayload - size of append payload for 802.1H translation
1582 * Return Value: none
1586 static void s_vGenerateMACHeader(struct vnt_private
*pDevice
,
1587 u8
*pbyBufferAddr
, u16 wDuration
, struct ethhdr
*psEthHeader
,
1588 int bNeedEncrypt
, u16 wFragType
, u32 uDMAIdx
, u32 uFragIdx
)
1590 struct ieee80211_hdr
*pMACHeader
= (struct ieee80211_hdr
*)pbyBufferAddr
;
1592 memset(pMACHeader
, 0, (sizeof(struct ieee80211_hdr
)));
1594 if (uDMAIdx
== TYPE_ATIMDMA
) {
1595 pMACHeader
->frame_control
= TYPE_802_11_ATIM
;
1597 pMACHeader
->frame_control
= TYPE_802_11_DATA
;
1600 if (pDevice
->eOPMode
== OP_MODE_AP
) {
1601 memcpy(&(pMACHeader
->addr1
[0]),
1602 &(psEthHeader
->h_dest
[0]),
1604 memcpy(&(pMACHeader
->addr2
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
1605 memcpy(&(pMACHeader
->addr3
[0]),
1606 &(psEthHeader
->h_source
[0]),
1608 pMACHeader
->frame_control
|= FC_FROMDS
;
1610 if (pDevice
->eOPMode
== OP_MODE_ADHOC
) {
1611 memcpy(&(pMACHeader
->addr1
[0]),
1612 &(psEthHeader
->h_dest
[0]),
1614 memcpy(&(pMACHeader
->addr2
[0]),
1615 &(psEthHeader
->h_source
[0]),
1617 memcpy(&(pMACHeader
->addr3
[0]),
1618 &(pDevice
->abyBSSID
[0]),
1621 memcpy(&(pMACHeader
->addr3
[0]),
1622 &(psEthHeader
->h_dest
[0]),
1624 memcpy(&(pMACHeader
->addr2
[0]),
1625 &(psEthHeader
->h_source
[0]),
1627 memcpy(&(pMACHeader
->addr1
[0]),
1628 &(pDevice
->abyBSSID
[0]),
1630 pMACHeader
->frame_control
|= FC_TODS
;
1635 pMACHeader
->frame_control
|= cpu_to_le16((u16
)WLAN_SET_FC_ISWEP(1));
1637 pMACHeader
->duration_id
= cpu_to_le16(wDuration
);
1639 if (pDevice
->bLongHeader
) {
1640 PWLAN_80211HDR_A4 pMACA4Header
= (PWLAN_80211HDR_A4
) pbyBufferAddr
;
1641 pMACHeader
->frame_control
|= (FC_TODS
| FC_FROMDS
);
1642 memcpy(pMACA4Header
->abyAddr4
, pDevice
->abyBSSID
, WLAN_ADDR_LEN
);
1644 pMACHeader
->seq_ctrl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
1646 //Set FragNumber in Sequence Control
1647 pMACHeader
->seq_ctrl
|= cpu_to_le16((u16
)uFragIdx
);
1649 if ((wFragType
== FRAGCTL_ENDFRAG
) || (wFragType
== FRAGCTL_NONFRAG
)) {
1650 pDevice
->wSeqCounter
++;
1651 if (pDevice
->wSeqCounter
> 0x0fff)
1652 pDevice
->wSeqCounter
= 0;
1655 if ((wFragType
== FRAGCTL_STAFRAG
) || (wFragType
== FRAGCTL_MIDFRAG
)) { //StartFrag or MidFrag
1656 pMACHeader
->frame_control
|= FC_MOREFRAG
;
1663 * Request instructs a MAC to transmit a 802.11 management packet through
1664 * the adapter onto the medium.
1668 * hDeviceContext - Pointer to the adapter
1669 * pPacket - A pointer to a descriptor for the packet to transmit
1673 * Return Value: CMD_STATUS_PENDING if MAC Tx resource available; otherwise false
1677 CMD_STATUS
csMgmt_xmit(struct vnt_private
*pDevice
,
1678 struct vnt_tx_mgmt
*pPacket
)
1680 struct vnt_manager
*pMgmt
= &pDevice
->vnt_mgmt
;
1681 PTX_BUFFER pTX_Buffer
;
1682 PSTxBufHead pTxBufHead
;
1683 PUSB_SEND_CONTEXT pContext
;
1684 struct ieee80211_hdr
*pMACHeader
;
1686 struct ethhdr sEthHeader
;
1687 u8 byPktType
, *pbyTxBufferAddr
;
1688 void *pvRTS
, *pvTxDataHd
, *pvRrvTime
, *pMICHDR
;
1689 u32 uDuration
, cbReqCount
, cbHeaderSize
, cbFrameBodySize
, cbFrameSize
;
1690 int bNeedACK
, bIsPSPOLL
= false;
1691 u32 cbIVlen
= 0, cbICVlen
= 0, cbMIClen
= 0, cbFCSlen
= 4;
1695 u16 wCurrentRate
= RATE_1M
;
1697 pContext
= (PUSB_SEND_CONTEXT
)s_vGetFreeContext(pDevice
);
1699 if (NULL
== pContext
) {
1700 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"ManagementSend TX...NO CONTEXT!\n");
1701 return CMD_STATUS_RESOURCES
;
1704 pTX_Buffer
= (PTX_BUFFER
) (&pContext
->Data
[0]);
1705 pbyTxBufferAddr
= (u8
*)&(pTX_Buffer
->adwTxKey
[0]);
1706 cbFrameBodySize
= pPacket
->cbPayloadLen
;
1707 pTxBufHead
= (PSTxBufHead
) pbyTxBufferAddr
;
1708 wTxBufSize
= sizeof(STxBufHead
);
1709 memset(pTxBufHead
, 0, wTxBufSize
);
1711 if (pDevice
->byBBType
== BB_TYPE_11A
) {
1712 wCurrentRate
= RATE_6M
;
1713 byPktType
= PK_TYPE_11A
;
1715 wCurrentRate
= RATE_1M
;
1716 byPktType
= PK_TYPE_11B
;
1719 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
1720 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
1721 // And cmd timer will wait data pkt TX finish before scanning so it's OK
1722 // to set power here.
1723 if (pMgmt
->eScanState
!= WMAC_NO_SCANNING
) {
1724 RFbSetPower(pDevice
, wCurrentRate
, pDevice
->byCurrentCh
);
1726 RFbSetPower(pDevice
, wCurrentRate
, pMgmt
->uCurrChannel
);
1728 pDevice
->wCurrentRate
= wCurrentRate
;
1731 if (byPktType
== PK_TYPE_11A
) {//0000 0000 0000 0000
1732 pTxBufHead
->wFIFOCtl
= 0;
1734 else if (byPktType
== PK_TYPE_11B
) {//0000 0001 0000 0000
1735 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
1737 else if (byPktType
== PK_TYPE_11GB
) {//0000 0010 0000 0000
1738 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GB
;
1740 else if (byPktType
== PK_TYPE_11GA
) {//0000 0011 0000 0000
1741 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GA
;
1744 pTxBufHead
->wFIFOCtl
|= FIFOCTL_TMOEN
;
1745 pTxBufHead
->wTimeStamp
= cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us
);
1747 if (is_multicast_ether_addr(pPacket
->p80211Header
->sA3
.abyAddr1
)) {
1752 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
1755 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) ||
1756 (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) ) {
1758 pTxBufHead
->wFIFOCtl
|= FIFOCTL_LRETRY
;
1759 //Set Preamble type always long
1760 //pDevice->byPreambleType = PREAMBLE_LONG;
1761 // probe-response don't retry
1762 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
1763 // bNeedACK = false;
1764 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
1768 pTxBufHead
->wFIFOCtl
|= (FIFOCTL_GENINT
| FIFOCTL_ISDMA0
);
1770 if ((pPacket
->p80211Header
->sA4
.wFrameCtl
& TYPE_SUBTYPE_MASK
) == TYPE_CTL_PSPOLL
) {
1772 cbMacHdLen
= WLAN_HDR_ADDR2_LEN
;
1774 cbMacHdLen
= WLAN_HDR_ADDR3_LEN
;
1777 //Set FRAGCTL_MACHDCNT
1778 pTxBufHead
->wFragCtl
|= cpu_to_le16((u16
)(cbMacHdLen
<< 10));
1781 // Although spec says MMPDU can be fragmented; In most case,
1782 // no one will send a MMPDU under fragmentation. With RTS may occur.
1783 pDevice
->bAES
= false; //Set FRAGCTL_WEPTYP
1785 if (WLAN_GET_FC_ISWEP(pPacket
->p80211Header
->sA4
.wFrameCtl
) != 0) {
1786 if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption1Enabled
) {
1789 pTxBufHead
->wFragCtl
|= FRAGCTL_LEGACY
;
1791 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption2Enabled
) {
1792 cbIVlen
= 8;//IV+ExtIV
1795 pTxBufHead
->wFragCtl
|= FRAGCTL_TKIP
;
1796 //We need to get seed here for filling TxKey entry.
1797 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
1798 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
1800 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption3Enabled
) {
1801 cbIVlen
= 8;//RSN Header
1803 pTxBufHead
->wFragCtl
|= FRAGCTL_AES
;
1804 pDevice
->bAES
= true;
1806 //MAC Header should be padding 0 to DW alignment.
1807 uPadding
= 4 - (cbMacHdLen
%4);
1811 cbFrameSize
= cbMacHdLen
+ cbFrameBodySize
+ cbIVlen
+ cbMIClen
+ cbICVlen
+ cbFCSlen
;
1813 //Set FIFOCTL_GrpAckPolicy
1814 if (pDevice
->bGrpAckPolicy
== true) {//0000 0100 0000 0000
1815 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GRPACK
;
1817 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
1819 //Set RrvTime/RTS/CTS Buffer
1820 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {//802.11g packet
1822 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1825 pCTS
= (PSCTS
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
1826 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + sizeof(SCTS
));
1827 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + sizeof(SCTS
) + sizeof(STxDataHead_g
);
1829 else { // 802.11a/b packet
1830 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1834 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1835 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_ab
) + sizeof(STxDataHead_ab
);
1838 memset((void *)(pbyTxBufferAddr
+ wTxBufSize
), 0,
1839 (cbHeaderSize
- wTxBufSize
));
1841 memcpy(&(sEthHeader
.h_dest
[0]),
1842 &(pPacket
->p80211Header
->sA3
.abyAddr1
[0]),
1844 memcpy(&(sEthHeader
.h_source
[0]),
1845 &(pPacket
->p80211Header
->sA3
.abyAddr2
[0]),
1847 //=========================
1849 //=========================
1850 pTxBufHead
->wFragCtl
|= (u16
)FRAGCTL_NONFRAG
;
1852 //Fill FIFO,RrvTime,RTS,and CTS
1853 s_vGenerateTxParameter(pDevice
, byPktType
, wCurrentRate
, pbyTxBufferAddr
, pvRrvTime
, pvRTS
, pCTS
,
1854 cbFrameSize
, bNeedACK
, TYPE_TXDMA0
, &sEthHeader
);
1857 uDuration
= s_uFillDataHead(pDevice
, byPktType
, wCurrentRate
, pvTxDataHd
, cbFrameSize
, TYPE_TXDMA0
, bNeedACK
,
1858 0, 0, 1, AUTO_FB_NONE
);
1860 pMACHeader
= (struct ieee80211_hdr
*) (pbyTxBufferAddr
+ cbHeaderSize
);
1862 cbReqCount
= cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
+ cbFrameBodySize
;
1864 if (WLAN_GET_FC_ISWEP(pPacket
->p80211Header
->sA4
.wFrameCtl
) != 0) {
1866 u8
* pbyPayloadHead
;
1868 PSKeyItem pTransmitKey
= NULL
;
1870 pbyIVHead
= (u8
*)(pbyTxBufferAddr
+ cbHeaderSize
+ cbMacHdLen
+ uPadding
);
1871 pbyPayloadHead
= (u8
*)(pbyTxBufferAddr
+ cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
);
1873 if ((pDevice
->eOPMode
== OP_MODE_INFRASTRUCTURE
) &&
1874 (pDevice
->bLinkPass
== true)) {
1875 pbyBSSID
= pDevice
->abyBSSID
;
1877 if (KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, PAIRWISE_KEY
, &pTransmitKey
) == false) {
1879 if(KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == true) {
1880 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get GTK.\n");
1884 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get PTK.\n");
1889 pbyBSSID
= pDevice
->abyBroadcastAddr
;
1890 if(KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == false) {
1891 pTransmitKey
= NULL
;
1892 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"KEY is NULL. OP Mode[%d]\n", pDevice
->eOPMode
);
1894 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get GTK.\n");
1898 s_vFillTxKey(pDevice
, (u8
*)(pTxBufHead
->adwTxKey
), pbyIVHead
, pTransmitKey
,
1899 (u8
*)pMACHeader
, (u16
)cbFrameBodySize
, NULL
);
1901 memcpy(pMACHeader
, pPacket
->p80211Header
, cbMacHdLen
);
1902 memcpy(pbyPayloadHead
, ((u8
*)(pPacket
->p80211Header
) + cbMacHdLen
),
1906 // Copy the Packet into a tx Buffer
1907 memcpy(pMACHeader
, pPacket
->p80211Header
, pPacket
->cbMPDULen
);
1910 pMACHeader
->seq_ctrl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
1911 pDevice
->wSeqCounter
++ ;
1912 if (pDevice
->wSeqCounter
> 0x0fff)
1913 pDevice
->wSeqCounter
= 0;
1916 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
1917 // of FIFO control header.
1918 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
1919 // in the same place of other packet's Duration-field).
1920 // And it will cause Cisco-AP to issue Disassociation-packet
1921 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
1922 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_a
= cpu_to_le16(pPacket
->p80211Header
->sA2
.wDurationID
);
1923 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_b
= cpu_to_le16(pPacket
->p80211Header
->sA2
.wDurationID
);
1925 ((PSTxDataHead_ab
)pvTxDataHd
)->wDuration
= cpu_to_le16(pPacket
->p80211Header
->sA2
.wDurationID
);
1929 pTX_Buffer
->wTxByteCount
= cpu_to_le16((u16
)(cbReqCount
));
1930 pTX_Buffer
->byPKTNO
= (u8
) (((wCurrentRate
<<4) &0x00F0) | ((pDevice
->wSeqCounter
- 1) & 0x000F));
1931 pTX_Buffer
->byType
= 0x00;
1933 pContext
->pPacket
= NULL
;
1934 pContext
->Type
= CONTEXT_MGMT_PACKET
;
1935 pContext
->uBufLen
= (u16
)cbReqCount
+ 4; //USB header
1937 if (WLAN_GET_FC_TODS(pMACHeader
->frame_control
) == 0) {
1938 s_vSaveTxPktInfo(pDevice
, (u8
) (pTX_Buffer
->byPKTNO
& 0x0F), &(pMACHeader
->addr1
[0]), (u16
)cbFrameSize
, pTX_Buffer
->wFIFOCtl
);
1941 s_vSaveTxPktInfo(pDevice
, (u8
) (pTX_Buffer
->byPKTNO
& 0x0F), &(pMACHeader
->addr3
[0]), (u16
)cbFrameSize
, pTX_Buffer
->wFIFOCtl
);
1944 PIPEnsSendBulkOut(pDevice
,pContext
);
1945 return CMD_STATUS_PENDING
;
1948 CMD_STATUS
csBeacon_xmit(struct vnt_private
*pDevice
,
1949 struct vnt_tx_mgmt
*pPacket
)
1951 u32 cbFrameSize
= pPacket
->cbMPDULen
+ WLAN_FCS_LEN
;
1952 u32 cbHeaderSize
= 0;
1953 u16 wTxBufSize
= sizeof(STxShortBufHead
);
1954 PSTxShortBufHead pTxBufHead
;
1955 struct ieee80211_hdr
*pMACHeader
;
1956 PSTxDataHead_ab pTxDataHead
;
1958 u32 cbFrameBodySize
;
1960 PBEACON_BUFFER pTX_Buffer
;
1961 u8
*pbyTxBufferAddr
;
1962 PUSB_SEND_CONTEXT pContext
;
1965 pContext
= (PUSB_SEND_CONTEXT
)s_vGetFreeContext(pDevice
);
1966 if (NULL
== pContext
) {
1967 status
= CMD_STATUS_RESOURCES
;
1968 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"ManagementSend TX...NO CONTEXT!\n");
1971 pTX_Buffer
= (PBEACON_BUFFER
) (&pContext
->Data
[0]);
1972 pbyTxBufferAddr
= (u8
*)&(pTX_Buffer
->wFIFOCtl
);
1974 cbFrameBodySize
= pPacket
->cbPayloadLen
;
1976 pTxBufHead
= (PSTxShortBufHead
) pbyTxBufferAddr
;
1977 wTxBufSize
= sizeof(STxShortBufHead
);
1978 memset(pTxBufHead
, 0, wTxBufSize
);
1980 if (pDevice
->byBBType
== BB_TYPE_11A
) {
1981 wCurrentRate
= RATE_6M
;
1982 pTxDataHead
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1983 //Get SignalField,ServiceField,Length
1984 BBvCalculateParameter(pDevice
, cbFrameSize
, wCurrentRate
, PK_TYPE_11A
,
1985 (u16
*)&(pTxDataHead
->wTransmitLength
), (u8
*)&(pTxDataHead
->byServiceField
), (u8
*)&(pTxDataHead
->bySignalField
)
1987 //Get Duration and TimeStampOff
1988 pTxDataHead
->wDuration
= cpu_to_le16((u16
)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameSize
, PK_TYPE_11A
,
1989 wCurrentRate
, false, 0, 0, 1, AUTO_FB_NONE
));
1990 pTxDataHead
->wTimeStampOff
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
1991 cbHeaderSize
= wTxBufSize
+ sizeof(STxDataHead_ab
);
1993 wCurrentRate
= RATE_1M
;
1994 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
1995 pTxDataHead
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1996 //Get SignalField,ServiceField,Length
1997 BBvCalculateParameter(pDevice
, cbFrameSize
, wCurrentRate
, PK_TYPE_11B
,
1998 (u16
*)&(pTxDataHead
->wTransmitLength
), (u8
*)&(pTxDataHead
->byServiceField
), (u8
*)&(pTxDataHead
->bySignalField
)
2000 //Get Duration and TimeStampOff
2001 pTxDataHead
->wDuration
= cpu_to_le16((u16
)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameSize
, PK_TYPE_11B
,
2002 wCurrentRate
, false, 0, 0, 1, AUTO_FB_NONE
));
2003 pTxDataHead
->wTimeStampOff
= wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
];
2004 cbHeaderSize
= wTxBufSize
+ sizeof(STxDataHead_ab
);
2007 //Generate Beacon Header
2008 pMACHeader
= (struct ieee80211_hdr
*)(pbyTxBufferAddr
+ cbHeaderSize
);
2009 memcpy(pMACHeader
, pPacket
->p80211Header
, pPacket
->cbMPDULen
);
2011 pMACHeader
->duration_id
= 0;
2012 pMACHeader
->seq_ctrl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
2013 pDevice
->wSeqCounter
++ ;
2014 if (pDevice
->wSeqCounter
> 0x0fff)
2015 pDevice
->wSeqCounter
= 0;
2017 cbReqCount
= cbHeaderSize
+ WLAN_HDR_ADDR3_LEN
+ cbFrameBodySize
;
2019 pTX_Buffer
->wTxByteCount
= (u16
)cbReqCount
;
2020 pTX_Buffer
->byPKTNO
= (u8
) (((wCurrentRate
<<4) &0x00F0) | ((pDevice
->wSeqCounter
- 1) & 0x000F));
2021 pTX_Buffer
->byType
= 0x01;
2023 pContext
->pPacket
= NULL
;
2024 pContext
->Type
= CONTEXT_MGMT_PACKET
;
2025 pContext
->uBufLen
= (u16
)cbReqCount
+ 4; //USB header
2027 PIPEnsSendBulkOut(pDevice
,pContext
);
2028 return CMD_STATUS_PENDING
;
2032 void vDMA0_tx_80211(struct vnt_private
*pDevice
, struct sk_buff
*skb
)
2034 struct vnt_manager
*pMgmt
= &pDevice
->vnt_mgmt
;
2036 u8
*pbyTxBufferAddr
;
2037 void *pvRTS
, *pvCTS
, *pvTxDataHd
;
2038 u32 uDuration
, cbReqCount
;
2039 struct ieee80211_hdr
*pMACHeader
;
2040 u32 cbHeaderSize
, cbFrameBodySize
;
2041 int bNeedACK
, bIsPSPOLL
= false;
2042 PSTxBufHead pTxBufHead
;
2044 u32 cbIVlen
= 0, cbICVlen
= 0, cbMIClen
= 0, cbFCSlen
= 4;
2046 u32 cbMICHDR
= 0, uLength
= 0;
2047 u32 dwMICKey0
, dwMICKey1
;
2049 u32
*pdwMIC_L
, *pdwMIC_R
;
2052 struct ethhdr sEthHeader
;
2053 void *pvRrvTime
, *pMICHDR
;
2054 u32 wCurrentRate
= RATE_1M
;
2055 PUWLAN_80211HDR p80211Header
;
2057 int bNodeExist
= false;
2059 PSKeyItem pTransmitKey
= NULL
;
2060 u8
*pbyIVHead
, *pbyPayloadHead
, *pbyMacHdr
;
2061 u32 cbExtSuppRate
= 0;
2062 PTX_BUFFER pTX_Buffer
;
2063 PUSB_SEND_CONTEXT pContext
;
2065 pvRrvTime
= pMICHDR
= pvRTS
= pvCTS
= pvTxDataHd
= NULL
;
2067 if(skb
->len
<= WLAN_HDR_ADDR3_LEN
) {
2068 cbFrameBodySize
= 0;
2071 cbFrameBodySize
= skb
->len
- WLAN_HDR_ADDR3_LEN
;
2073 p80211Header
= (PUWLAN_80211HDR
)skb
->data
;
2075 pContext
= (PUSB_SEND_CONTEXT
)s_vGetFreeContext(pDevice
);
2077 if (NULL
== pContext
) {
2078 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"DMA0 TX...NO CONTEXT!\n");
2079 dev_kfree_skb_irq(skb
);
2083 pTX_Buffer
= (PTX_BUFFER
)(&pContext
->Data
[0]);
2084 pbyTxBufferAddr
= (u8
*)(&pTX_Buffer
->adwTxKey
[0]);
2085 pTxBufHead
= (PSTxBufHead
) pbyTxBufferAddr
;
2086 wTxBufSize
= sizeof(STxBufHead
);
2087 memset(pTxBufHead
, 0, wTxBufSize
);
2089 if (pDevice
->byBBType
== BB_TYPE_11A
) {
2090 wCurrentRate
= RATE_6M
;
2091 byPktType
= PK_TYPE_11A
;
2093 wCurrentRate
= RATE_1M
;
2094 byPktType
= PK_TYPE_11B
;
2097 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2098 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2099 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2100 // to set power here.
2101 if (pMgmt
->eScanState
!= WMAC_NO_SCANNING
) {
2102 RFbSetPower(pDevice
, wCurrentRate
, pDevice
->byCurrentCh
);
2104 RFbSetPower(pDevice
, wCurrentRate
, pMgmt
->uCurrChannel
);
2107 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header
->sA3
.wFrameCtl
);
2110 if (byPktType
== PK_TYPE_11A
) {//0000 0000 0000 0000
2111 pTxBufHead
->wFIFOCtl
= 0;
2113 else if (byPktType
== PK_TYPE_11B
) {//0000 0001 0000 0000
2114 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
2116 else if (byPktType
== PK_TYPE_11GB
) {//0000 0010 0000 0000
2117 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GB
;
2119 else if (byPktType
== PK_TYPE_11GA
) {//0000 0011 0000 0000
2120 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GA
;
2123 pTxBufHead
->wFIFOCtl
|= FIFOCTL_TMOEN
;
2124 pTxBufHead
->wTimeStamp
= cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us
);
2126 if (is_multicast_ether_addr(p80211Header
->sA3
.abyAddr1
)) {
2128 if (pDevice
->bEnableHostWEP
) {
2134 if (pDevice
->bEnableHostWEP
) {
2135 if (BSSbIsSTAInNodeDB(pDevice
, (u8
*)(p80211Header
->sA3
.abyAddr1
), &uNodeIndex
))
2139 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
2142 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) ||
2143 (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) ) {
2145 pTxBufHead
->wFIFOCtl
|= FIFOCTL_LRETRY
;
2146 //Set Preamble type always long
2147 //pDevice->byPreambleType = PREAMBLE_LONG;
2149 // probe-response don't retry
2150 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2151 // bNeedACK = false;
2152 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2156 pTxBufHead
->wFIFOCtl
|= (FIFOCTL_GENINT
| FIFOCTL_ISDMA0
);
2158 if ((p80211Header
->sA4
.wFrameCtl
& TYPE_SUBTYPE_MASK
) == TYPE_CTL_PSPOLL
) {
2160 cbMacHdLen
= WLAN_HDR_ADDR2_LEN
;
2162 cbMacHdLen
= WLAN_HDR_ADDR3_LEN
;
2165 // hostapd daemon ext support rate patch
2166 if (WLAN_GET_FC_FSTYPE(p80211Header
->sA4
.wFrameCtl
) == WLAN_FSTYPE_ASSOCRESP
) {
2168 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
!= 0) {
2169 cbExtSuppRate
+= ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
+ WLAN_IEHDR_LEN
;
2172 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
!= 0) {
2173 cbExtSuppRate
+= ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
+ WLAN_IEHDR_LEN
;
2176 if (cbExtSuppRate
>0) {
2177 cbFrameBodySize
= WLAN_ASSOCRESP_OFF_SUPP_RATES
;
2181 //Set FRAGCTL_MACHDCNT
2182 pTxBufHead
->wFragCtl
|= cpu_to_le16((u16
)cbMacHdLen
<< 10);
2185 // Although spec says MMPDU can be fragmented; In most case,
2186 // no one will send a MMPDU under fragmentation. With RTS may occur.
2187 pDevice
->bAES
= false; //Set FRAGCTL_WEPTYP
2189 if (WLAN_GET_FC_ISWEP(p80211Header
->sA4
.wFrameCtl
) != 0) {
2190 if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption1Enabled
) {
2193 pTxBufHead
->wFragCtl
|= FRAGCTL_LEGACY
;
2195 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption2Enabled
) {
2196 cbIVlen
= 8;//IV+ExtIV
2199 pTxBufHead
->wFragCtl
|= FRAGCTL_TKIP
;
2200 //We need to get seed here for filling TxKey entry.
2201 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2202 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2204 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption3Enabled
) {
2205 cbIVlen
= 8;//RSN Header
2207 cbMICHDR
= sizeof(SMICHDRHead
);
2208 pTxBufHead
->wFragCtl
|= FRAGCTL_AES
;
2209 pDevice
->bAES
= true;
2211 //MAC Header should be padding 0 to DW alignment.
2212 uPadding
= 4 - (cbMacHdLen
%4);
2216 cbFrameSize
= cbMacHdLen
+ cbFrameBodySize
+ cbIVlen
+ cbMIClen
+ cbICVlen
+ cbFCSlen
+ cbExtSuppRate
;
2218 //Set FIFOCTL_GrpAckPolicy
2219 if (pDevice
->bGrpAckPolicy
== true) {//0000 0100 0000 0000
2220 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GRPACK
;
2222 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2224 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {//802.11g packet
2226 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
2227 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
2229 pvCTS
= (PSCTS
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
);
2230 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
));
2231 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
) + sizeof(STxDataHead_g
);
2234 else {//802.11a/b packet
2236 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
2237 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
2240 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
2241 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(STxDataHead_ab
);
2243 memset((void *)(pbyTxBufferAddr
+ wTxBufSize
), 0,
2244 (cbHeaderSize
- wTxBufSize
));
2245 memcpy(&(sEthHeader
.h_dest
[0]),
2246 &(p80211Header
->sA3
.abyAddr1
[0]),
2248 memcpy(&(sEthHeader
.h_source
[0]),
2249 &(p80211Header
->sA3
.abyAddr2
[0]),
2251 //=========================
2253 //=========================
2254 pTxBufHead
->wFragCtl
|= (u16
)FRAGCTL_NONFRAG
;
2256 //Fill FIFO,RrvTime,RTS,and CTS
2257 s_vGenerateTxParameter(pDevice
, byPktType
, wCurrentRate
, pbyTxBufferAddr
, pvRrvTime
, pvRTS
, pvCTS
,
2258 cbFrameSize
, bNeedACK
, TYPE_TXDMA0
, &sEthHeader
);
2261 uDuration
= s_uFillDataHead(pDevice
, byPktType
, wCurrentRate
, pvTxDataHd
, cbFrameSize
, TYPE_TXDMA0
, bNeedACK
,
2262 0, 0, 1, AUTO_FB_NONE
);
2264 pMACHeader
= (struct ieee80211_hdr
*) (pbyTxBufferAddr
+ cbHeaderSize
);
2266 cbReqCount
= cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
+ (cbFrameBodySize
+ cbMIClen
) + cbExtSuppRate
;
2268 pbyMacHdr
= (u8
*)(pbyTxBufferAddr
+ cbHeaderSize
);
2269 pbyPayloadHead
= (u8
*)(pbyMacHdr
+ cbMacHdLen
+ uPadding
+ cbIVlen
);
2270 pbyIVHead
= (u8
*)(pbyMacHdr
+ cbMacHdLen
+ uPadding
);
2272 // Copy the Packet into a tx Buffer
2273 memcpy(pbyMacHdr
, skb
->data
, cbMacHdLen
);
2275 // version set to 0, patch for hostapd deamon
2276 pMACHeader
->frame_control
&= cpu_to_le16(0xfffc);
2277 memcpy(pbyPayloadHead
, (skb
->data
+ cbMacHdLen
), cbFrameBodySize
);
2279 // replace support rate, patch for hostapd daemon( only support 11M)
2280 if (WLAN_GET_FC_FSTYPE(p80211Header
->sA4
.wFrameCtl
) == WLAN_FSTYPE_ASSOCRESP
) {
2281 if (cbExtSuppRate
!= 0) {
2282 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
!= 0)
2283 memcpy((pbyPayloadHead
+ cbFrameBodySize
),
2284 pMgmt
->abyCurrSuppRates
,
2285 ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
+ WLAN_IEHDR_LEN
2287 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
!= 0)
2288 memcpy((pbyPayloadHead
+ cbFrameBodySize
) + ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
+ WLAN_IEHDR_LEN
,
2289 pMgmt
->abyCurrExtSuppRates
,
2290 ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
+ WLAN_IEHDR_LEN
2296 if (WLAN_GET_FC_ISWEP(p80211Header
->sA4
.wFrameCtl
) != 0) {
2298 if (pDevice
->bEnableHostWEP
) {
2299 pTransmitKey
= &STempKey
;
2300 pTransmitKey
->byCipherSuite
= pMgmt
->sNodeDBTable
[uNodeIndex
].byCipherSuite
;
2301 pTransmitKey
->dwKeyIndex
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwKeyIndex
;
2302 pTransmitKey
->uKeyLength
= pMgmt
->sNodeDBTable
[uNodeIndex
].uWepKeyLength
;
2303 pTransmitKey
->dwTSC47_16
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
;
2304 pTransmitKey
->wTSC15_0
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
;
2305 memcpy(pTransmitKey
->abyKey
,
2306 &pMgmt
->sNodeDBTable
[uNodeIndex
].abyWepKey
[0],
2307 pTransmitKey
->uKeyLength
2311 if ((pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
2313 dwMICKey0
= *(u32
*)(&pTransmitKey
->abyKey
[16]);
2314 dwMICKey1
= *(u32
*)(&pTransmitKey
->abyKey
[20]);
2316 // DO Software Michael
2317 MIC_vInit(dwMICKey0
, dwMICKey1
);
2318 MIC_vAppend((u8
*)&(sEthHeader
.h_dest
[0]), 12);
2320 MIC_vAppend((u8
*)&dwMIC_Priority
, 4);
2321 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"DMA0_tx_8021:MIC KEY:"\
2322 " %X, %X\n", dwMICKey0
, dwMICKey1
);
2324 uLength
= cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
;
2326 MIC_vAppend((pbyTxBufferAddr
+ uLength
), cbFrameBodySize
);
2328 pdwMIC_L
= (u32
*)(pbyTxBufferAddr
+ uLength
+ cbFrameBodySize
);
2329 pdwMIC_R
= (u32
*)(pbyTxBufferAddr
+ uLength
+ cbFrameBodySize
+ 4);
2331 MIC_vGetMIC(pdwMIC_L
, pdwMIC_R
);
2334 if (pDevice
->bTxMICFail
== true) {
2337 pDevice
->bTxMICFail
= false;
2340 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"uLength: %d, %d\n", uLength
, cbFrameBodySize
);
2341 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"cbReqCount:%d, %d, %d, %d\n", cbReqCount
, cbHeaderSize
, uPadding
, cbIVlen
);
2342 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"MIC:%x, %x\n",
2343 *pdwMIC_L
, *pdwMIC_R
);
2347 s_vFillTxKey(pDevice
, (u8
*)(pTxBufHead
->adwTxKey
), pbyIVHead
, pTransmitKey
,
2348 pbyMacHdr
, (u16
)cbFrameBodySize
, (u8
*)pMICHDR
);
2350 if (pDevice
->bEnableHostWEP
) {
2351 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
2352 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
2355 if ((pDevice
->byLocalID
<= REV_ID_VT3253_A1
)) {
2356 s_vSWencryption(pDevice
, pTransmitKey
, pbyPayloadHead
, (u16
)(cbFrameBodySize
+ cbMIClen
));
2360 pMACHeader
->seq_ctrl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
2361 pDevice
->wSeqCounter
++ ;
2362 if (pDevice
->wSeqCounter
> 0x0fff)
2363 pDevice
->wSeqCounter
= 0;
2366 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2367 // of FIFO control header.
2368 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2369 // in the same place of other packet's Duration-field).
2370 // And it will cause Cisco-AP to issue Disassociation-packet
2371 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
2372 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_a
= cpu_to_le16(p80211Header
->sA2
.wDurationID
);
2373 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_b
= cpu_to_le16(p80211Header
->sA2
.wDurationID
);
2375 ((PSTxDataHead_ab
)pvTxDataHd
)->wDuration
= cpu_to_le16(p80211Header
->sA2
.wDurationID
);
2379 pTX_Buffer
->wTxByteCount
= cpu_to_le16((u16
)(cbReqCount
));
2380 pTX_Buffer
->byPKTNO
= (u8
) (((wCurrentRate
<<4) &0x00F0) | ((pDevice
->wSeqCounter
- 1) & 0x000F));
2381 pTX_Buffer
->byType
= 0x00;
2383 pContext
->pPacket
= skb
;
2384 pContext
->Type
= CONTEXT_MGMT_PACKET
;
2385 pContext
->uBufLen
= (u16
)cbReqCount
+ 4; //USB header
2387 if (WLAN_GET_FC_TODS(pMACHeader
->frame_control
) == 0) {
2388 s_vSaveTxPktInfo(pDevice
, (u8
) (pTX_Buffer
->byPKTNO
& 0x0F), &(pMACHeader
->addr1
[0]), (u16
)cbFrameSize
, pTX_Buffer
->wFIFOCtl
);
2391 s_vSaveTxPktInfo(pDevice
, (u8
) (pTX_Buffer
->byPKTNO
& 0x0F), &(pMACHeader
->addr3
[0]), (u16
)cbFrameSize
, pTX_Buffer
->wFIFOCtl
);
2393 PIPEnsSendBulkOut(pDevice
,pContext
);
2398 //TYPE_AC0DMA data tx
2401 * Tx packet via AC0DMA(DMA1)
2405 * pDevice - Pointer to the adapter
2406 * skb - Pointer to tx skb packet
2410 * Return Value: NULL
2413 int nsDMA_tx_packet(struct vnt_private
*pDevice
,
2414 u32 uDMAIdx
, struct sk_buff
*skb
)
2416 struct net_device_stats
*pStats
= &pDevice
->stats
;
2417 struct vnt_manager
*pMgmt
= &pDevice
->vnt_mgmt
;
2418 u32 BytesToWrite
= 0, uHeaderLen
= 0;
2420 u8 byMask
[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2423 int bNeedEncryption
= false;
2424 PSKeyItem pTransmitKey
= NULL
;
2427 int bTKIP_UseGTK
= false;
2428 int bNeedDeAuth
= false;
2430 int bNodeExist
= false;
2431 PUSB_SEND_CONTEXT pContext
;
2432 bool fConvertedPacket
;
2433 PTX_BUFFER pTX_Buffer
;
2435 u16 wKeepRate
= pDevice
->wCurrentRate
;
2436 int bTxeapol_key
= false;
2438 if (pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) {
2440 if (pDevice
->uAssocCount
== 0) {
2441 dev_kfree_skb_irq(skb
);
2445 if (is_multicast_ether_addr((u8
*)(skb
->data
))) {
2448 if (pMgmt
->sNodeDBTable
[0].bPSEnable
) {
2450 skb_queue_tail(&(pMgmt
->sNodeDBTable
[0].sTxPSQueue
), skb
);
2451 pMgmt
->sNodeDBTable
[0].wEnQueueCnt
++;
2453 pMgmt
->abyPSTxMap
[0] |= byMask
[0];
2456 // multicast/broadcast data rate
2458 if (pDevice
->byBBType
!= BB_TYPE_11A
)
2459 pDevice
->wCurrentRate
= RATE_2M
;
2461 pDevice
->wCurrentRate
= RATE_24M
;
2462 // long preamble type
2463 pDevice
->byPreambleType
= PREAMBLE_SHORT
;
2467 if (BSSbIsSTAInNodeDB(pDevice
, (u8
*)(skb
->data
), &uNodeIndex
)) {
2469 if (pMgmt
->sNodeDBTable
[uNodeIndex
].bPSEnable
) {
2471 skb_queue_tail(&pMgmt
->sNodeDBTable
[uNodeIndex
].sTxPSQueue
, skb
);
2473 pMgmt
->sNodeDBTable
[uNodeIndex
].wEnQueueCnt
++;
2475 wAID
= pMgmt
->sNodeDBTable
[uNodeIndex
].wAID
;
2476 pMgmt
->abyPSTxMap
[wAID
>> 3] |= byMask
[wAID
& 7];
2477 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Set:pMgmt->abyPSTxMap[%d]= %d\n",
2478 (wAID
>> 3), pMgmt
->abyPSTxMap
[wAID
>> 3]);
2482 // AP rate decided from node
2483 pDevice
->wCurrentRate
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTxDataRate
;
2484 // tx preamble decided from node
2486 if (pMgmt
->sNodeDBTable
[uNodeIndex
].bShortPreamble
) {
2487 pDevice
->byPreambleType
= pDevice
->byShortPreamble
;
2490 pDevice
->byPreambleType
= PREAMBLE_LONG
;
2496 if (bNodeExist
== false) {
2497 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"Unknown STA not found in node DB \n");
2498 dev_kfree_skb_irq(skb
);
2503 pContext
= (PUSB_SEND_CONTEXT
)s_vGetFreeContext(pDevice
);
2505 if (pContext
== NULL
) {
2506 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
" pContext == NULL\n");
2507 dev_kfree_skb_irq(skb
);
2508 return STATUS_RESOURCES
;
2511 memcpy(pDevice
->sTxEthHeader
.h_dest
, (u8
*)(skb
->data
), ETH_HLEN
);
2513 //mike add:station mode check eapol-key challenge--->
2515 u8 Protocol_Version
; //802.1x Authentication
2516 u8 Packet_Type
; //802.1x Authentication
2520 Protocol_Version
= skb
->data
[ETH_HLEN
];
2521 Packet_Type
= skb
->data
[ETH_HLEN
+1];
2522 Descriptor_type
= skb
->data
[ETH_HLEN
+1+1+2];
2523 Key_info
= (skb
->data
[ETH_HLEN
+1+1+2+1] << 8)|(skb
->data
[ETH_HLEN
+1+1+2+2]);
2524 if (pDevice
->sTxEthHeader
.h_proto
== cpu_to_be16(ETH_P_PAE
)) {
2525 /* 802.1x OR eapol-key challenge frame transfer */
2526 if (((Protocol_Version
== 1) || (Protocol_Version
== 2)) &&
2527 (Packet_Type
== 3)) {
2528 bTxeapol_key
= true;
2529 if(!(Key_info
& BIT3
) && //WPA or RSN group-key challenge
2530 (Key_info
& BIT8
) && (Key_info
& BIT9
)) { //send 2/2 key
2531 if(Descriptor_type
==254) {
2532 pDevice
->fWPA_Authened
= true;
2536 pDevice
->fWPA_Authened
= true;
2537 PRINT_K("WPA2(re-keying) ");
2539 PRINT_K("Authentication completed!!\n");
2541 else if((Key_info
& BIT3
) && (Descriptor_type
==2) && //RSN pairwise-key challenge
2542 (Key_info
& BIT8
) && (Key_info
& BIT9
)) {
2543 pDevice
->fWPA_Authened
= true;
2544 PRINT_K("WPA2 Authentication completed!!\n");
2549 //mike add:station mode check eapol-key challenge<---
2551 if (pDevice
->bEncryptionEnable
== true) {
2552 bNeedEncryption
= true;
2555 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
) &&
2556 (pMgmt
->eCurrState
== WMAC_STATE_ASSOC
)) {
2557 pbyBSSID
= pDevice
->abyBSSID
;
2559 if (KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, PAIRWISE_KEY
, &pTransmitKey
) == false) {
2561 if(KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == true) {
2562 bTKIP_UseGTK
= true;
2563 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"Get GTK.\n");
2567 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"Get PTK.\n");
2570 }else if (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) {
2571 /* TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1 */
2572 pbyBSSID
= pDevice
->sTxEthHeader
.h_dest
;
2573 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"IBSS Serach Key: \n");
2574 for (ii
= 0; ii
< 6; ii
++)
2575 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"%x \n", *(pbyBSSID
+ii
));
2576 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"\n");
2579 if(KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, PAIRWISE_KEY
, &pTransmitKey
) == true)
2583 pbyBSSID
= pDevice
->abyBroadcastAddr
;
2584 if(KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == false) {
2585 pTransmitKey
= NULL
;
2586 if (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) {
2587 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"IBSS and KEY is NULL. [%d]\n", pMgmt
->eCurrMode
);
2590 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"NOT IBSS and KEY is NULL. [%d]\n", pMgmt
->eCurrMode
);
2592 bTKIP_UseGTK
= true;
2593 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"Get GTK.\n");
2598 if (pDevice
->bEnableHostWEP
) {
2599 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"acdma0: STA index %d\n", uNodeIndex
);
2600 if (pDevice
->bEncryptionEnable
== true) {
2601 pTransmitKey
= &STempKey
;
2602 pTransmitKey
->byCipherSuite
= pMgmt
->sNodeDBTable
[uNodeIndex
].byCipherSuite
;
2603 pTransmitKey
->dwKeyIndex
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwKeyIndex
;
2604 pTransmitKey
->uKeyLength
= pMgmt
->sNodeDBTable
[uNodeIndex
].uWepKeyLength
;
2605 pTransmitKey
->dwTSC47_16
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
;
2606 pTransmitKey
->wTSC15_0
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
;
2607 memcpy(pTransmitKey
->abyKey
,
2608 &pMgmt
->sNodeDBTable
[uNodeIndex
].abyWepKey
[0],
2609 pTransmitKey
->uKeyLength
2614 byPktType
= (u8
)pDevice
->byPacketType
;
2616 if (pDevice
->bFixRate
) {
2617 if (pDevice
->byBBType
== BB_TYPE_11B
) {
2618 if (pDevice
->uConnectionRate
>= RATE_11M
) {
2619 pDevice
->wCurrentRate
= RATE_11M
;
2621 pDevice
->wCurrentRate
= (u16
)pDevice
->uConnectionRate
;
2624 if ((pDevice
->byBBType
== BB_TYPE_11A
) &&
2625 (pDevice
->uConnectionRate
<= RATE_6M
)) {
2626 pDevice
->wCurrentRate
= RATE_6M
;
2628 if (pDevice
->uConnectionRate
>= RATE_54M
)
2629 pDevice
->wCurrentRate
= RATE_54M
;
2631 pDevice
->wCurrentRate
= (u16
)pDevice
->uConnectionRate
;
2636 if (pDevice
->eOPMode
== OP_MODE_ADHOC
) {
2637 // Adhoc Tx rate decided from node DB
2638 if (is_multicast_ether_addr(pDevice
->sTxEthHeader
.h_dest
)) {
2639 // Multicast use highest data rate
2640 pDevice
->wCurrentRate
= pMgmt
->sNodeDBTable
[0].wTxDataRate
;
2642 pDevice
->byPreambleType
= pDevice
->byShortPreamble
;
2645 if (BSSbIsSTAInNodeDB(pDevice
, &(pDevice
->sTxEthHeader
.h_dest
[0]), &uNodeIndex
)) {
2646 pDevice
->wCurrentRate
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTxDataRate
;
2647 if (pMgmt
->sNodeDBTable
[uNodeIndex
].bShortPreamble
) {
2648 pDevice
->byPreambleType
= pDevice
->byShortPreamble
;
2652 pDevice
->byPreambleType
= PREAMBLE_LONG
;
2654 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex
, pDevice
->wCurrentRate
);
2657 if (pDevice
->byBBType
!= BB_TYPE_11A
)
2658 pDevice
->wCurrentRate
= RATE_2M
;
2660 pDevice
->wCurrentRate
= RATE_24M
; // refer to vMgrCreateOwnIBSS()'s
2661 // abyCurrExtSuppRates[]
2662 pDevice
->byPreambleType
= PREAMBLE_SHORT
;
2663 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Not Found Node use highest basic Rate.....\n");
2667 if (pDevice
->eOPMode
== OP_MODE_INFRASTRUCTURE
) {
2668 // Infra STA rate decided from AP Node, index = 0
2669 pDevice
->wCurrentRate
= pMgmt
->sNodeDBTable
[0].wTxDataRate
;
2673 if (pDevice
->sTxEthHeader
.h_proto
== cpu_to_be16(ETH_P_PAE
)) {
2674 if (pDevice
->byBBType
!= BB_TYPE_11A
) {
2675 pDevice
->wCurrentRate
= RATE_1M
;
2676 pDevice
->byACKRate
= RATE_1M
;
2677 pDevice
->byTopCCKBasicRate
= RATE_1M
;
2678 pDevice
->byTopOFDMBasicRate
= RATE_6M
;
2680 pDevice
->wCurrentRate
= RATE_6M
;
2681 pDevice
->byACKRate
= RATE_6M
;
2682 pDevice
->byTopCCKBasicRate
= RATE_1M
;
2683 pDevice
->byTopOFDMBasicRate
= RATE_6M
;
2687 DBG_PRT(MSG_LEVEL_DEBUG
,
2688 KERN_INFO
"dma_tx: pDevice->wCurrentRate = %d\n",
2689 pDevice
->wCurrentRate
);
2691 if (wKeepRate
!= pDevice
->wCurrentRate
) {
2692 bScheduleCommand((void *) pDevice
, WLAN_CMD_SETPOWER
, NULL
);
2695 if (pDevice
->wCurrentRate
<= RATE_11M
) {
2696 byPktType
= PK_TYPE_11B
;
2699 if (bNeedEncryption
== true) {
2700 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"ntohs Pkt Type=%04x\n", ntohs(pDevice
->sTxEthHeader
.h_proto
));
2701 if ((pDevice
->sTxEthHeader
.h_proto
) == cpu_to_be16(ETH_P_PAE
)) {
2702 bNeedEncryption
= false;
2703 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Pkt Type=%04x\n", (pDevice
->sTxEthHeader
.h_proto
));
2704 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
) && (pMgmt
->eCurrState
== WMAC_STATE_ASSOC
)) {
2705 if (pTransmitKey
== NULL
) {
2706 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Don't Find TX KEY\n");
2709 if (bTKIP_UseGTK
== true) {
2710 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"error: KEY is GTK!!~~\n");
2713 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Find PTK [%X]\n",
2714 pTransmitKey
->dwKeyIndex
);
2715 bNeedEncryption
= true;
2720 if (pDevice
->bEnableHostWEP
) {
2721 if ((uNodeIndex
!= 0) &&
2722 (pMgmt
->sNodeDBTable
[uNodeIndex
].dwKeyIndex
& PAIRWISE_KEY
)) {
2723 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Find PTK [%X]\n",
2724 pTransmitKey
->dwKeyIndex
);
2725 bNeedEncryption
= true;
2731 if (pTransmitKey
== NULL
) {
2732 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"return no tx key\n");
2733 pContext
->bBoolInUse
= false;
2734 dev_kfree_skb_irq(skb
);
2735 pStats
->tx_dropped
++;
2736 return STATUS_FAILURE
;
2741 fConvertedPacket
= s_bPacketToWirelessUsb(pDevice
, byPktType
,
2742 (u8
*)(&pContext
->Data
[0]), bNeedEncryption
,
2743 skb
->len
, uDMAIdx
, &pDevice
->sTxEthHeader
,
2744 (u8
*)skb
->data
, pTransmitKey
, uNodeIndex
,
2745 pDevice
->wCurrentRate
,
2746 &uHeaderLen
, &BytesToWrite
2749 if (fConvertedPacket
== false) {
2750 pContext
->bBoolInUse
= false;
2751 dev_kfree_skb_irq(skb
);
2752 return STATUS_FAILURE
;
2755 if ( pDevice
->bEnablePSMode
== true ) {
2756 if ( !pDevice
->bPSModeTxBurst
) {
2757 bScheduleCommand((void *) pDevice
,
2758 WLAN_CMD_MAC_DISPOWERSAVING
,
2760 pDevice
->bPSModeTxBurst
= true;
2764 pTX_Buffer
= (PTX_BUFFER
)&(pContext
->Data
[0]);
2765 pTX_Buffer
->byPKTNO
= (u8
) (((pDevice
->wCurrentRate
<<4) &0x00F0) | ((pDevice
->wSeqCounter
- 1) & 0x000F));
2766 pTX_Buffer
->wTxByteCount
= (u16
)BytesToWrite
;
2768 pContext
->pPacket
= skb
;
2769 pContext
->Type
= CONTEXT_DATA_PACKET
;
2770 pContext
->uBufLen
= (u16
)BytesToWrite
+ 4 ; //USB header
2772 s_vSaveTxPktInfo(pDevice
, (u8
) (pTX_Buffer
->byPKTNO
& 0x0F), &(pContext
->sEthHeader
.h_dest
[0]), (u16
) (BytesToWrite
-uHeaderLen
), pTX_Buffer
->wFIFOCtl
);
2774 status
= PIPEnsSendBulkOut(pDevice
,pContext
);
2776 if (bNeedDeAuth
== true) {
2777 u16 wReason
= WLAN_MGMT_REASON_MIC_FAILURE
;
2779 bScheduleCommand((void *) pDevice
, WLAN_CMD_DEAUTH
, (u8
*) &wReason
);
2782 if(status
!=STATUS_PENDING
) {
2783 pContext
->bBoolInUse
= false;
2784 dev_kfree_skb_irq(skb
);
2785 return STATUS_FAILURE
;
2794 * Relay packet send (AC1DMA) from rx dpc.
2798 * pDevice - Pointer to the adapter
2799 * pPacket - Pointer to rx packet
2800 * cbPacketSize - rx ethernet frame size
2804 * Return Value: Return true if packet is copy to dma1; otherwise false
2807 int bRelayPacketSend(struct vnt_private
*pDevice
, u8
*pbySkbData
, u32 uDataLen
,
2810 struct vnt_manager
*pMgmt
= &pDevice
->vnt_mgmt
;
2811 u32 BytesToWrite
= 0, uHeaderLen
= 0;
2812 u8 byPktType
= PK_TYPE_11B
;
2813 int bNeedEncryption
= false;
2815 PSKeyItem pTransmitKey
= NULL
;
2817 PUSB_SEND_CONTEXT pContext
;
2819 int fConvertedPacket
;
2820 PTX_BUFFER pTX_Buffer
;
2822 u16 wKeepRate
= pDevice
->wCurrentRate
;
2824 pContext
= (PUSB_SEND_CONTEXT
)s_vGetFreeContext(pDevice
);
2826 if (NULL
== pContext
) {
2830 memcpy(pDevice
->sTxEthHeader
.h_dest
, (u8
*)pbySkbData
, ETH_HLEN
);
2832 if (pDevice
->bEncryptionEnable
== true) {
2833 bNeedEncryption
= true;
2835 pbyBSSID
= pDevice
->abyBroadcastAddr
;
2836 if(KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == false) {
2837 pTransmitKey
= NULL
;
2838 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"KEY is NULL. [%d]\n", pMgmt
->eCurrMode
);
2840 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"Get GTK.\n");
2844 if (pDevice
->bEnableHostWEP
) {
2845 if (uNodeIndex
< MAX_NODE_NUM
+ 1) {
2846 pTransmitKey
= &STempKey
;
2847 pTransmitKey
->byCipherSuite
= pMgmt
->sNodeDBTable
[uNodeIndex
].byCipherSuite
;
2848 pTransmitKey
->dwKeyIndex
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwKeyIndex
;
2849 pTransmitKey
->uKeyLength
= pMgmt
->sNodeDBTable
[uNodeIndex
].uWepKeyLength
;
2850 pTransmitKey
->dwTSC47_16
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
;
2851 pTransmitKey
->wTSC15_0
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
;
2852 memcpy(pTransmitKey
->abyKey
,
2853 &pMgmt
->sNodeDBTable
[uNodeIndex
].abyWepKey
[0],
2854 pTransmitKey
->uKeyLength
2859 if ( bNeedEncryption
&& (pTransmitKey
== NULL
) ) {
2860 pContext
->bBoolInUse
= false;
2864 byPktTyp
= (u8
)pDevice
->byPacketType
;
2866 if (pDevice
->bFixRate
) {
2867 if (pDevice
->byBBType
== BB_TYPE_11B
) {
2868 if (pDevice
->uConnectionRate
>= RATE_11M
) {
2869 pDevice
->wCurrentRate
= RATE_11M
;
2871 pDevice
->wCurrentRate
= (u16
)pDevice
->uConnectionRate
;
2874 if ((pDevice
->byBBType
== BB_TYPE_11A
) &&
2875 (pDevice
->uConnectionRate
<= RATE_6M
)) {
2876 pDevice
->wCurrentRate
= RATE_6M
;
2878 if (pDevice
->uConnectionRate
>= RATE_54M
)
2879 pDevice
->wCurrentRate
= RATE_54M
;
2881 pDevice
->wCurrentRate
= (u16
)pDevice
->uConnectionRate
;
2886 pDevice
->wCurrentRate
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTxDataRate
;
2889 if (wKeepRate
!= pDevice
->wCurrentRate
) {
2890 bScheduleCommand((void *) pDevice
, WLAN_CMD_SETPOWER
, NULL
);
2893 if (pDevice
->wCurrentRate
<= RATE_11M
)
2894 byPktType
= PK_TYPE_11B
;
2896 BytesToWrite
= uDataLen
+ ETH_FCS_LEN
;
2898 // Convert the packet to an usb frame and copy into our buffer
2899 // and send the irp.
2901 fConvertedPacket
= s_bPacketToWirelessUsb(pDevice
, byPktType
,
2902 (u8
*)(&pContext
->Data
[0]), bNeedEncryption
,
2903 uDataLen
, TYPE_AC0DMA
, &pDevice
->sTxEthHeader
,
2904 pbySkbData
, pTransmitKey
, uNodeIndex
,
2905 pDevice
->wCurrentRate
,
2906 &uHeaderLen
, &BytesToWrite
2909 if (fConvertedPacket
== false) {
2910 pContext
->bBoolInUse
= false;
2914 pTX_Buffer
= (PTX_BUFFER
)&(pContext
->Data
[0]);
2915 pTX_Buffer
->byPKTNO
= (u8
) (((pDevice
->wCurrentRate
<<4) &0x00F0) | ((pDevice
->wSeqCounter
- 1) & 0x000F));
2916 pTX_Buffer
->wTxByteCount
= (u16
)BytesToWrite
;
2918 pContext
->pPacket
= NULL
;
2919 pContext
->Type
= CONTEXT_DATA_PACKET
;
2920 pContext
->uBufLen
= (u16
)BytesToWrite
+ 4 ; //USB header
2922 s_vSaveTxPktInfo(pDevice
, (u8
) (pTX_Buffer
->byPKTNO
& 0x0F), &(pContext
->sEthHeader
.h_dest
[0]), (u16
) (BytesToWrite
-uHeaderLen
), pTX_Buffer
->wFIFOCtl
);
2924 status
= PIPEnsSendBulkOut(pDevice
,pContext
);