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 * vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * cbGetFragCount - Calculate fragment number count
31 * csBeacon_xmit - beacon tx function
32 * csMgmt_xmit - management tx function
33 * s_cbFillTxBufHead - fulfill tx dma buffer header
34 * s_uGetDataDuration - get tx data required duration
35 * s_uFillDataHead- fulfill tx data duration header
36 * s_uGetRTSCTSDuration- get rtx/cts required duration
37 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
38 * s_uGetTxRsvTime- get frame reserved time
39 * s_vFillCTSHead- fulfill CTS ctl header
40 * s_vFillFragParameter- Set fragment ctl parameter.
41 * s_vFillRTSHead- fulfill RTS ctl header
42 * s_vFillTxKey- fulfill tx encrypt key
43 * s_vSWencryption- Software encrypt header
44 * vDMA0_tx_80211- tx 802.11 frame via dma0
45 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
71 //static int msglevel =MSG_LEVEL_DEBUG;
72 static int msglevel
= MSG_LEVEL_INFO
;
77 /*--------------------- Static Functions --------------------------*/
79 /*--------------------- Static Definitions -------------------------*/
80 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
81 // packet size >= 256 -> direct send
83 const unsigned short wTimeStampOff
[2][MAX_RATE
] = {
84 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
85 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
88 const unsigned short wFB_Opt0
[2][5] = {
89 {RATE_12M
, RATE_18M
, RATE_24M
, RATE_36M
, RATE_48M
}, // fallback_rate0
90 {RATE_12M
, RATE_12M
, RATE_18M
, RATE_24M
, RATE_36M
}, // fallback_rate1
92 const unsigned short wFB_Opt1
[2][5] = {
93 {RATE_12M
, RATE_18M
, RATE_24M
, RATE_24M
, RATE_36M
}, // fallback_rate0
94 {RATE_6M
, RATE_6M
, RATE_12M
, RATE_12M
, RATE_18M
}, // fallback_rate1
102 #define RTSDUR_BA_F0 4
103 #define RTSDUR_AA_F0 5
104 #define RTSDUR_BA_F1 6
105 #define RTSDUR_AA_F1 7
106 #define CTSDUR_BA_F0 8
107 #define CTSDUR_BA_F1 9
110 #define DATADUR_A_F0 12
111 #define DATADUR_A_F1 13
113 /*--------------------- Static Functions --------------------------*/
121 unsigned char *pbyBuf
,
122 unsigned char *pbyIVHead
,
123 PSKeyItem pTransmitKey
,
124 unsigned char *pbyHdrBuf
,
125 unsigned short wPayloadLen
,
126 unsigned char *pMICHDR
135 unsigned char byPktType
,
137 unsigned int cbFrameLength
,
140 PSEthernetHeader psEthHeader
,
141 unsigned short wCurrentRate
,
142 unsigned char byFBOption
147 s_vGenerateTxParameter(
149 unsigned char byPktType
,
154 unsigned int cbFrameSize
,
156 unsigned int uDMAIdx
,
157 PSEthernetHeader psEthHeader
,
158 unsigned short wCurrentRate
163 static void s_vFillFragParameter(
165 unsigned char *pbyBuffer
,
166 unsigned int uTxType
,
168 unsigned short wFragType
,
169 unsigned int cbReqCount
174 s_cbFillTxBufHead(PSDevice pDevice
, unsigned char byPktType
, unsigned char *pbyTxBufferAddr
,
175 unsigned int cbFrameBodySize
, unsigned int uDMAIdx
, PSTxDesc pHeadTD
,
176 PSEthernetHeader psEthHeader
, unsigned char *pPacket
, bool bNeedEncrypt
,
177 PSKeyItem pTransmitKey
, unsigned int uNodeIndex
, unsigned int *puMACfragNum
);
184 unsigned char byPktType
,
186 unsigned int cbFrameLength
,
187 unsigned int uDMAIdx
,
189 unsigned int uFragIdx
,
190 unsigned int cbLastFragmentSize
,
191 unsigned int uMACfragNum
,
192 unsigned char byFBOption
,
193 unsigned short wCurrentRate
197 /*--------------------- Export Variables --------------------------*/
205 unsigned char *pbyBuf
,
206 unsigned char *pbyIVHead
,
207 PSKeyItem pTransmitKey
,
208 unsigned char *pbyHdrBuf
,
209 unsigned short wPayloadLen
,
210 unsigned char *pMICHDR
213 unsigned long *pdwIV
= (unsigned long *)pbyIVHead
;
214 unsigned long *pdwExtIV
= (unsigned long *)((unsigned char *)pbyIVHead
+4);
215 unsigned short wValue
;
216 PS802_11Header pMACHeader
= (PS802_11Header
)pbyHdrBuf
;
217 unsigned long dwRevIVCounter
;
218 unsigned char byKeyIndex
= 0;
223 if (pTransmitKey
== NULL
)
226 dwRevIVCounter
= cpu_to_le32(pDevice
->dwIVCounter
);
227 *pdwIV
= pDevice
->dwIVCounter
;
228 byKeyIndex
= pTransmitKey
->dwKeyIndex
& 0xf;
230 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
231 if (pTransmitKey
->uKeyLength
== WLAN_WEP232_KEYLEN
) {
232 memcpy(pDevice
->abyPRNG
, (unsigned char *)&(dwRevIVCounter
), 3);
233 memcpy(pDevice
->abyPRNG
+3, pTransmitKey
->abyKey
, pTransmitKey
->uKeyLength
);
235 memcpy(pbyBuf
, (unsigned char *)&(dwRevIVCounter
), 3);
236 memcpy(pbyBuf
+3, pTransmitKey
->abyKey
, pTransmitKey
->uKeyLength
);
237 if (pTransmitKey
->uKeyLength
== WLAN_WEP40_KEYLEN
) {
238 memcpy(pbyBuf
+8, (unsigned char *)&(dwRevIVCounter
), 3);
239 memcpy(pbyBuf
+11, pTransmitKey
->abyKey
, pTransmitKey
->uKeyLength
);
241 memcpy(pDevice
->abyPRNG
, pbyBuf
, 16);
243 // Append IV after Mac Header
244 *pdwIV
&= WEP_IV_MASK
;//00000000 11111111 11111111 11111111
245 *pdwIV
|= (unsigned long)byKeyIndex
<< 30;
246 *pdwIV
= cpu_to_le32(*pdwIV
);
247 pDevice
->dwIVCounter
++;
248 if (pDevice
->dwIVCounter
> WEP_IV_MASK
) {
249 pDevice
->dwIVCounter
= 0;
251 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
252 pTransmitKey
->wTSC15_0
++;
253 if (pTransmitKey
->wTSC15_0
== 0) {
254 pTransmitKey
->dwTSC47_16
++;
256 TKIPvMixKey(pTransmitKey
->abyKey
, pDevice
->abyCurrentNetAddr
,
257 pTransmitKey
->wTSC15_0
, pTransmitKey
->dwTSC47_16
, pDevice
->abyPRNG
);
258 memcpy(pbyBuf
, pDevice
->abyPRNG
, 16);
260 memcpy(pdwIV
, pDevice
->abyPRNG
, 3);
262 *(pbyIVHead
+3) = (unsigned char)(((byKeyIndex
<< 6) & 0xc0) | 0x20); // 0x20 is ExtIV
263 // Append IV&ExtIV after Mac Header
264 *pdwExtIV
= cpu_to_le32(pTransmitKey
->dwTSC47_16
);
265 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV
);
267 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) {
268 pTransmitKey
->wTSC15_0
++;
269 if (pTransmitKey
->wTSC15_0
== 0) {
270 pTransmitKey
->dwTSC47_16
++;
272 memcpy(pbyBuf
, pTransmitKey
->abyKey
, 16);
276 *(pbyIVHead
+3) = (unsigned char)(((byKeyIndex
<< 6) & 0xc0) | 0x20); // 0x20 is ExtIV
277 *pdwIV
|= cpu_to_le16((unsigned short)(pTransmitKey
->wTSC15_0
));
278 //Append IV&ExtIV after Mac Header
279 *pdwExtIV
= cpu_to_le32(pTransmitKey
->dwTSC47_16
);
283 *((unsigned char *)(pMICHDR
+1)) = 0; // TxPriority
284 memcpy(pMICHDR
+2, &(pMACHeader
->abyAddr2
[0]), 6);
285 *((unsigned char *)(pMICHDR
+8)) = HIBYTE(HIWORD(pTransmitKey
->dwTSC47_16
));
286 *((unsigned char *)(pMICHDR
+9)) = LOBYTE(HIWORD(pTransmitKey
->dwTSC47_16
));
287 *((unsigned char *)(pMICHDR
+10)) = HIBYTE(LOWORD(pTransmitKey
->dwTSC47_16
));
288 *((unsigned char *)(pMICHDR
+11)) = LOBYTE(LOWORD(pTransmitKey
->dwTSC47_16
));
289 *((unsigned char *)(pMICHDR
+12)) = HIBYTE(pTransmitKey
->wTSC15_0
);
290 *((unsigned char *)(pMICHDR
+13)) = LOBYTE(pTransmitKey
->wTSC15_0
);
291 *((unsigned char *)(pMICHDR
+14)) = HIBYTE(wPayloadLen
);
292 *((unsigned char *)(pMICHDR
+15)) = LOBYTE(wPayloadLen
);
295 *((unsigned char *)(pMICHDR
+16)) = 0; // HLEN[15:8]
296 if (pDevice
->bLongHeader
) {
297 *((unsigned char *)(pMICHDR
+17)) = 28; // HLEN[7:0]
299 *((unsigned char *)(pMICHDR
+17)) = 22; // HLEN[7:0]
301 wValue
= cpu_to_le16(pMACHeader
->wFrameCtl
& 0xC78F);
302 memcpy(pMICHDR
+18, (unsigned char *)&wValue
, 2); // MSKFRACTL
303 memcpy(pMICHDR
+20, &(pMACHeader
->abyAddr1
[0]), 6);
304 memcpy(pMICHDR
+26, &(pMACHeader
->abyAddr2
[0]), 6);
307 memcpy(pMICHDR
+32, &(pMACHeader
->abyAddr3
[0]), 6);
308 wValue
= pMACHeader
->wSeqCtl
;
310 wValue
= cpu_to_le16(wValue
);
311 memcpy(pMICHDR
+38, (unsigned char *)&wValue
, 2); // MSKSEQCTL
312 if (pDevice
->bLongHeader
) {
313 memcpy(pMICHDR
+40, &(pMACHeader
->abyAddr4
[0]), 6);
323 PSKeyItem pTransmitKey
,
324 unsigned char *pbyPayloadHead
,
325 unsigned short wPayloadSize
328 unsigned int cbICVlen
= 4;
329 unsigned long dwICV
= 0xFFFFFFFFL
;
330 unsigned long *pdwICV
;
332 if (pTransmitKey
== NULL
)
335 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
336 //=======================================================================
337 // Append ICV after payload
338 dwICV
= CRCdwGetCrc32Ex(pbyPayloadHead
, wPayloadSize
, dwICV
);//ICV(Payload)
339 pdwICV
= (unsigned long *)(pbyPayloadHead
+ wPayloadSize
);
340 // finally, we must invert dwCRC to get the correct answer
341 *pdwICV
= cpu_to_le32(~dwICV
);
343 rc4_init(&pDevice
->SBox
, pDevice
->abyPRNG
, pTransmitKey
->uKeyLength
+ 3);
344 rc4_encrypt(&pDevice
->SBox
, pbyPayloadHead
, pbyPayloadHead
, wPayloadSize
+cbICVlen
);
345 //=======================================================================
346 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
347 //=======================================================================
348 //Append ICV after payload
349 dwICV
= CRCdwGetCrc32Ex(pbyPayloadHead
, wPayloadSize
, dwICV
);//ICV(Payload)
350 pdwICV
= (unsigned long *)(pbyPayloadHead
+ wPayloadSize
);
351 // finally, we must invert dwCRC to get the correct answer
352 *pdwICV
= cpu_to_le32(~dwICV
);
354 rc4_init(&pDevice
->SBox
, pDevice
->abyPRNG
, TKIP_KEY_LEN
);
355 rc4_encrypt(&pDevice
->SBox
, pbyPayloadHead
, pbyPayloadHead
, wPayloadSize
+cbICVlen
);
356 //=======================================================================
363 /*byPktType : PK_TYPE_11A 0
372 unsigned char byPktType
,
373 unsigned int cbFrameLength
,
374 unsigned short wRate
,
378 unsigned int uDataTime
, uAckTime
;
380 uDataTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, cbFrameLength
, wRate
);
381 if (byPktType
== PK_TYPE_11B
) {//llb,CCK mode
382 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, (unsigned short)pDevice
->byTopCCKBasicRate
);
383 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
384 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, (unsigned short)pDevice
->byTopOFDMBasicRate
);
388 return (uDataTime
+ pDevice
->uSIFS
+ uAckTime
);
395 //byFreqType: 0=>5GHZ 1=>2.4GHZ
400 unsigned char byRTSRsvType
,
401 unsigned char byPktType
,
402 unsigned int cbFrameLength
,
403 unsigned short wCurrentRate
406 unsigned int uRrvTime
, uRTSTime
, uCTSTime
, uAckTime
, uDataTime
;
408 uRrvTime
= uRTSTime
= uCTSTime
= uAckTime
= uDataTime
= 0;
411 uDataTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, cbFrameLength
, wCurrentRate
);
412 if (byRTSRsvType
== 0) { //RTSTxRrvTime_bb
413 uRTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 20, pDevice
->byTopCCKBasicRate
);
414 uCTSTime
= uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
416 else if (byRTSRsvType
== 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
417 uRTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 20, pDevice
->byTopCCKBasicRate
);
418 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
419 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
421 else if (byRTSRsvType
== 2) { //RTSTxRrvTime_aa
422 uRTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 20, pDevice
->byTopOFDMBasicRate
);
423 uCTSTime
= uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
425 else if (byRTSRsvType
== 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
426 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
427 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
428 uRrvTime
= uCTSTime
+ uAckTime
+ uDataTime
+ 2*pDevice
->uSIFS
;
433 uRrvTime
= uRTSTime
+ uCTSTime
+ uAckTime
+ uDataTime
+ 3*pDevice
->uSIFS
;
437 //byFreqType 0: 5GHz, 1:2.4Ghz
442 unsigned char byDurType
,
443 unsigned int cbFrameLength
,
444 unsigned char byPktType
,
445 unsigned short wRate
,
447 unsigned int uFragIdx
,
448 unsigned int cbLastFragmentSize
,
449 unsigned int uMACfragNum
,
450 unsigned char byFBOption
454 unsigned int uAckTime
= 0, uNextPktTime
= 0;
458 if (uFragIdx
== (uMACfragNum
-1)) {
465 case DATADUR_B
: //DATADUR_B
466 if (((uMACfragNum
== 1)) || (bLastFrag
== 1)) {//Non Frag or Last Frag
468 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
469 return (pDevice
->uSIFS
+ uAckTime
);
474 else {//First Frag or Mid Frag
475 if (uFragIdx
== (uMACfragNum
-2)) {
476 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wRate
, bNeedAck
);
478 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
481 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
482 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
484 return (pDevice
->uSIFS
+ uNextPktTime
);
489 case DATADUR_A
: //DATADUR_A
490 if (((uMACfragNum
== 1)) || (bLastFrag
== 1)) {//Non Frag or Last Frag
492 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
493 return (pDevice
->uSIFS
+ uAckTime
);
498 else {//First Frag or Mid Frag
499 if (uFragIdx
== (uMACfragNum
-2)) {
500 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wRate
, bNeedAck
);
502 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
505 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
506 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
508 return (pDevice
->uSIFS
+ uNextPktTime
);
513 case DATADUR_A_F0
: //DATADUR_A_F0
514 if (((uMACfragNum
== 1)) || (bLastFrag
== 1)) {//Non Frag or Last Frag
516 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
517 return (pDevice
->uSIFS
+ uAckTime
);
522 else { //First Frag or Mid Frag
523 if (byFBOption
== AUTO_FB_0
) {
524 if (wRate
< RATE_18M
)
526 else if (wRate
> RATE_54M
)
529 if (uFragIdx
== (uMACfragNum
-2)) {
530 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
532 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
534 } else { // (byFBOption == AUTO_FB_1)
535 if (wRate
< RATE_18M
)
537 else if (wRate
> RATE_54M
)
540 if (uFragIdx
== (uMACfragNum
-2)) {
541 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
543 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
548 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
549 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
551 return (pDevice
->uSIFS
+ uNextPktTime
);
556 case DATADUR_A_F1
: //DATADUR_A_F1
557 if (((uMACfragNum
== 1)) || (bLastFrag
== 1)) {//Non Frag or Last Frag
559 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
560 return (pDevice
->uSIFS
+ uAckTime
);
565 else { //First Frag or Mid Frag
566 if (byFBOption
== AUTO_FB_0
) {
567 if (wRate
< RATE_18M
)
569 else if (wRate
> RATE_54M
)
572 if (uFragIdx
== (uMACfragNum
-2)) {
573 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
575 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
578 } else { // (byFBOption == AUTO_FB_1)
579 if (wRate
< RATE_18M
)
581 else if (wRate
> RATE_54M
)
584 if (uFragIdx
== (uMACfragNum
-2)) {
585 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbLastFragmentSize
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
587 uNextPktTime
= s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
591 uAckTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
592 return (pDevice
->uSIFS
+ uAckTime
+ uNextPktTime
);
594 return (pDevice
->uSIFS
+ uNextPktTime
);
608 //byFreqType: 0=>5GHZ 1=>2.4GHZ
611 s_uGetRTSCTSDuration(
613 unsigned char byDurType
,
614 unsigned int cbFrameLength
,
615 unsigned char byPktType
,
616 unsigned short wRate
,
618 unsigned char byFBOption
621 unsigned int uCTSTime
= 0, uDurTime
= 0;
626 case RTSDUR_BB
: //RTSDuration_bb
627 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
628 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
631 case RTSDUR_BA
: //RTSDuration_ba
632 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
633 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
636 case RTSDUR_AA
: //RTSDuration_aa
637 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
638 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
641 case CTSDUR_BA
: //CTSDuration_ba
642 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wRate
, bNeedAck
);
645 case RTSDUR_BA_F0
: //RTSDuration_ba_f0
646 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
647 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
648 uDurTime
= uCTSTime
+ 2 * pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
649 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
650 uDurTime
= uCTSTime
+ 2 * pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
654 case RTSDUR_AA_F0
: //RTSDuration_aa_f0
655 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
656 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
657 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
658 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
659 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
663 case RTSDUR_BA_F1
: //RTSDuration_ba_f1
664 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopCCKBasicRate
);
665 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
666 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
667 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
668 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
672 case RTSDUR_AA_F1
: //RTSDuration_aa_f1
673 uCTSTime
= BBuGetFrameTime(pDevice
->byPreambleType
, byPktType
, 14, pDevice
->byTopOFDMBasicRate
);
674 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
675 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
676 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
677 uDurTime
= uCTSTime
+ 2*pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
681 case CTSDUR_BA_F0
: //CTSDuration_ba_f0
682 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
683 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
684 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
685 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE0
][wRate
-RATE_18M
], bNeedAck
);
689 case CTSDUR_BA_F1
: //CTSDuration_ba_f1
690 if ((byFBOption
== AUTO_FB_0
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
691 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt0
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
692 } else if ((byFBOption
== AUTO_FB_1
) && (wRate
>= RATE_18M
) && (wRate
<= RATE_54M
)) {
693 uDurTime
= pDevice
->uSIFS
+ s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameLength
, wFB_Opt1
[FB_RATE1
][wRate
-RATE_18M
], bNeedAck
);
711 unsigned char byPktType
,
713 unsigned int cbFrameLength
,
714 unsigned int uDMAIdx
,
716 unsigned int uFragIdx
,
717 unsigned int cbLastFragmentSize
,
718 unsigned int uMACfragNum
,
719 unsigned char byFBOption
,
720 unsigned short wCurrentRate
723 unsigned short wLen
= 0x0000;
725 if (pTxDataHead
== NULL
) {
729 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
730 if (byFBOption
== AUTO_FB_NONE
) {
731 PSTxDataHead_g pBuf
= (PSTxDataHead_g
)pTxDataHead
;
732 //Get SignalField,ServiceField,Length
733 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
734 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_a
), (unsigned char *)&(pBuf
->bySignalField_a
)
736 pBuf
->wTransmitLength_a
= cpu_to_le16(wLen
);
737 BBvCalculateParameter(pDevice
, cbFrameLength
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
738 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_b
), (unsigned char *)&(pBuf
->bySignalField_b
)
740 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
741 //Get Duration and TimeStamp
742 pBuf
->wDuration_a
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
,
743 byPktType
, wCurrentRate
, bNeedAck
, uFragIdx
,
744 cbLastFragmentSize
, uMACfragNum
,
745 byFBOption
)); //1: 2.4GHz
746 pBuf
->wDuration_b
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameLength
,
747 PK_TYPE_11B
, pDevice
->byTopCCKBasicRate
,
748 bNeedAck
, uFragIdx
, cbLastFragmentSize
,
749 uMACfragNum
, byFBOption
)); //1: 2.4
751 pBuf
->wTimeStampOff_a
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
]);
752 pBuf
->wTimeStampOff_b
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][pDevice
->byTopCCKBasicRate
%MAX_RATE
]);
754 return (pBuf
->wDuration_a
);
757 PSTxDataHead_g_FB pBuf
= (PSTxDataHead_g_FB
)pTxDataHead
;
758 //Get SignalField,ServiceField,Length
759 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
760 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_a
), (unsigned char *)&(pBuf
->bySignalField_a
)
762 pBuf
->wTransmitLength_a
= cpu_to_le16(wLen
);
763 BBvCalculateParameter(pDevice
, cbFrameLength
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
764 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_b
), (unsigned char *)&(pBuf
->bySignalField_b
)
766 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
767 //Get Duration and TimeStamp
768 pBuf
->wDuration_a
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
769 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //1: 2.4GHz
770 pBuf
->wDuration_b
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameLength
, PK_TYPE_11B
,
771 pDevice
->byTopCCKBasicRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //1: 2.4GHz
772 pBuf
->wDuration_a_f0
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A_F0
, cbFrameLength
, byPktType
,
773 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //1: 2.4GHz
774 pBuf
->wDuration_a_f1
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A_F1
, cbFrameLength
, byPktType
,
775 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //1: 2.4GHz
777 pBuf
->wTimeStampOff_a
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
]);
778 pBuf
->wTimeStampOff_b
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][pDevice
->byTopCCKBasicRate
%MAX_RATE
]);
780 return (pBuf
->wDuration_a
);
781 } //if (byFBOption == AUTO_FB_NONE)
783 else if (byPktType
== PK_TYPE_11A
) {
784 if ((byFBOption
!= AUTO_FB_NONE
)) {
786 PSTxDataHead_a_FB pBuf
= (PSTxDataHead_a_FB
)pTxDataHead
;
787 //Get SignalField,ServiceField,Length
788 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
789 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField
), (unsigned char *)&(pBuf
->bySignalField
)
791 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
792 //Get Duration and TimeStampOff
794 pBuf
->wDuration
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
795 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //0: 5GHz
796 pBuf
->wDuration_f0
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A_F0
, cbFrameLength
, byPktType
,
797 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //0: 5GHz
798 pBuf
->wDuration_f1
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A_F1
, cbFrameLength
, byPktType
,
799 wCurrentRate
, bNeedAck
, uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
)); //0: 5GHz
800 pBuf
->wTimeStampOff
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
]);
801 return (pBuf
->wDuration
);
803 PSTxDataHead_ab pBuf
= (PSTxDataHead_ab
)pTxDataHead
;
804 //Get SignalField,ServiceField,Length
805 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
806 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField
), (unsigned char *)&(pBuf
->bySignalField
)
808 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
809 //Get Duration and TimeStampOff
811 pBuf
->wDuration
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameLength
, byPktType
,
812 wCurrentRate
, bNeedAck
, uFragIdx
,
813 cbLastFragmentSize
, uMACfragNum
,
816 pBuf
->wTimeStampOff
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
]);
817 return (pBuf
->wDuration
);
821 PSTxDataHead_ab pBuf
= (PSTxDataHead_ab
)pTxDataHead
;
822 //Get SignalField,ServiceField,Length
823 BBvCalculateParameter(pDevice
, cbFrameLength
, wCurrentRate
, byPktType
,
824 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField
), (unsigned char *)&(pBuf
->bySignalField
)
826 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
827 //Get Duration and TimeStampOff
828 pBuf
->wDuration
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameLength
, byPktType
,
829 wCurrentRate
, bNeedAck
, uFragIdx
,
830 cbLastFragmentSize
, uMACfragNum
,
832 pBuf
->wTimeStampOff
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
]);
833 return (pBuf
->wDuration
);
843 unsigned char byPktType
,
845 unsigned int cbFrameLength
,
848 PSEthernetHeader psEthHeader
,
849 unsigned short wCurrentRate
,
850 unsigned char byFBOption
853 unsigned int uRTSFrameLen
= 20;
854 unsigned short wLen
= 0x0000;
860 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
861 // in this case we need to decrease its length by 4.
865 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
866 // Otherwise, we need to modify codes for them.
867 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
868 if (byFBOption
== AUTO_FB_NONE
) {
869 PSRTS_g pBuf
= (PSRTS_g
)pvRTS
;
870 //Get SignalField,ServiceField,Length
871 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
872 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_b
), (unsigned char *)&(pBuf
->bySignalField_b
)
874 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
875 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
876 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_a
), (unsigned char *)&(pBuf
->bySignalField_a
)
878 pBuf
->wTransmitLength_a
= cpu_to_le16(wLen
);
880 pBuf
->wDuration_bb
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BB
, cbFrameLength
, PK_TYPE_11B
, pDevice
->byTopCCKBasicRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
881 pBuf
->wDuration_aa
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
882 pBuf
->wDuration_ba
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
884 pBuf
->Data
.wDurationID
= pBuf
->wDuration_aa
;
886 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]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
892 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
894 if (pDevice
->eOPMode
== OP_MODE_AP
) {
895 memcpy(&(pBuf
->Data
.abyTA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
898 memcpy(&(pBuf
->Data
.abyTA
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
902 PSRTS_g_FB pBuf
= (PSRTS_g_FB
)pvRTS
;
903 //Get SignalField,ServiceField,Length
904 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
905 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_b
), (unsigned char *)&(pBuf
->bySignalField_b
)
907 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
908 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
909 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_a
), (unsigned char *)&(pBuf
->bySignalField_a
)
911 pBuf
->wTransmitLength_a
= cpu_to_le16(wLen
);
914 pBuf
->wDuration_bb
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BB
, cbFrameLength
, PK_TYPE_11B
, pDevice
->byTopCCKBasicRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
915 pBuf
->wDuration_aa
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
916 pBuf
->wDuration_ba
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
917 pBuf
->wRTSDuration_ba_f0
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
918 pBuf
->wRTSDuration_aa_f0
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
919 pBuf
->wRTSDuration_ba_f1
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
920 pBuf
->wRTSDuration_aa_f1
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
921 pBuf
->Data
.wDurationID
= pBuf
->wDuration_aa
;
923 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
925 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
926 (pDevice
->eOPMode
== OP_MODE_AP
)) {
927 memcpy(&(pBuf
->Data
.abyRA
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
930 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
933 if (pDevice
->eOPMode
== OP_MODE_AP
) {
934 memcpy(&(pBuf
->Data
.abyTA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
937 memcpy(&(pBuf
->Data
.abyTA
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
940 } // if (byFBOption == AUTO_FB_NONE)
942 else if (byPktType
== PK_TYPE_11A
) {
943 if (byFBOption
== AUTO_FB_NONE
) {
944 PSRTS_ab pBuf
= (PSRTS_ab
)pvRTS
;
945 //Get SignalField,ServiceField,Length
946 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
947 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField
), (unsigned char *)&(pBuf
->bySignalField
)
949 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
951 pBuf
->wDuration
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
952 pBuf
->Data
.wDurationID
= pBuf
->wDuration
;
954 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
956 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
957 (pDevice
->eOPMode
== OP_MODE_AP
)) {
958 memcpy(&(pBuf
->Data
.abyRA
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
961 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
964 if (pDevice
->eOPMode
== OP_MODE_AP
) {
965 memcpy(&(pBuf
->Data
.abyTA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
968 memcpy(&(pBuf
->Data
.abyTA
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
973 PSRTS_a_FB pBuf
= (PSRTS_a_FB
)pvRTS
;
974 //Get SignalField,ServiceField,Length
975 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopOFDMBasicRate
, byPktType
,
976 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField
), (unsigned char *)&(pBuf
->bySignalField
)
978 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
980 pBuf
->wDuration
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
981 pBuf
->wRTSDuration_f0
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
982 pBuf
->wRTSDuration_f1
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_AA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //7:RTSDuration_aa_f1, 0:5G, 0:
983 pBuf
->Data
.wDurationID
= pBuf
->wDuration
;
985 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
987 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
988 (pDevice
->eOPMode
== OP_MODE_AP
)) {
989 memcpy(&(pBuf
->Data
.abyRA
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
992 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
994 if (pDevice
->eOPMode
== OP_MODE_AP
) {
995 memcpy(&(pBuf
->Data
.abyTA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
998 memcpy(&(pBuf
->Data
.abyTA
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
1002 else if (byPktType
== PK_TYPE_11B
) {
1003 PSRTS_ab pBuf
= (PSRTS_ab
)pvRTS
;
1004 //Get SignalField,ServiceField,Length
1005 BBvCalculateParameter(pDevice
, uRTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
1006 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField
), (unsigned char *)&(pBuf
->bySignalField
)
1008 pBuf
->wTransmitLength
= cpu_to_le16(wLen
);
1010 pBuf
->wDuration
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, RTSDUR_BB
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1011 pBuf
->Data
.wDurationID
= pBuf
->wDuration
;
1012 //Get RTS Frame body
1013 pBuf
->Data
.wFrameControl
= TYPE_CTL_RTS
;//0x00B4
1016 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
1017 (pDevice
->eOPMode
== OP_MODE_AP
)) {
1018 memcpy(&(pBuf
->Data
.abyRA
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
1021 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
1024 if (pDevice
->eOPMode
== OP_MODE_AP
) {
1025 memcpy(&(pBuf
->Data
.abyTA
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
1028 memcpy(&(pBuf
->Data
.abyTA
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
1037 unsigned int uDMAIdx
,
1038 unsigned char byPktType
,
1040 unsigned int cbFrameLength
,
1043 unsigned short wCurrentRate
,
1044 unsigned char byFBOption
1047 unsigned int uCTSFrameLen
= 14;
1048 unsigned short wLen
= 0x0000;
1050 if (pvCTS
== NULL
) {
1055 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1056 // in this case we need to decrease its length by 4.
1060 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
1061 if (byFBOption
!= AUTO_FB_NONE
&& uDMAIdx
!= TYPE_ATIMDMA
&& uDMAIdx
!= TYPE_BEACONDMA
) {
1063 PSCTS_FB pBuf
= (PSCTS_FB
)pvCTS
;
1064 //Get SignalField,ServiceField,Length
1065 BBvCalculateParameter(pDevice
, uCTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
1066 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_b
), (unsigned char *)&(pBuf
->bySignalField_b
)
1070 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
1072 pBuf
->wDuration_ba
= (unsigned short)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1073 pBuf
->wDuration_ba
+= pDevice
->wCTSDuration
;
1074 pBuf
->wDuration_ba
= cpu_to_le16(pBuf
->wDuration_ba
);
1075 //Get CTSDuration_ba_f0
1076 pBuf
->wCTSDuration_ba_f0
= (unsigned short)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA_F0
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
1077 pBuf
->wCTSDuration_ba_f0
+= pDevice
->wCTSDuration
;
1078 pBuf
->wCTSDuration_ba_f0
= cpu_to_le16(pBuf
->wCTSDuration_ba_f0
);
1079 //Get CTSDuration_ba_f1
1080 pBuf
->wCTSDuration_ba_f1
= (unsigned short)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA_F1
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
1081 pBuf
->wCTSDuration_ba_f1
+= pDevice
->wCTSDuration
;
1082 pBuf
->wCTSDuration_ba_f1
= cpu_to_le16(pBuf
->wCTSDuration_ba_f1
);
1083 //Get CTS Frame body
1084 pBuf
->Data
.wDurationID
= pBuf
->wDuration_ba
;
1085 pBuf
->Data
.wFrameControl
= TYPE_CTL_CTS
;//0x00C4
1086 pBuf
->Data
.wReserved
= 0x0000;
1087 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyCurrentNetAddr
[0]), ETH_ALEN
);
1089 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1090 PSCTS pBuf
= (PSCTS
)pvCTS
;
1091 //Get SignalField,ServiceField,Length
1092 BBvCalculateParameter(pDevice
, uCTSFrameLen
, pDevice
->byTopCCKBasicRate
, PK_TYPE_11B
,
1093 (unsigned short *)&(wLen
), (unsigned char *)&(pBuf
->byServiceField_b
), (unsigned char *)&(pBuf
->bySignalField_b
)
1095 pBuf
->wTransmitLength_b
= cpu_to_le16(wLen
);
1096 //Get CTSDuration_ba
1097 pBuf
->wDuration_ba
= cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice
, CTSDUR_BA
, cbFrameLength
, byPktType
, wCurrentRate
, bNeedAck
, byFBOption
)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1098 pBuf
->wDuration_ba
+= pDevice
->wCTSDuration
;
1099 pBuf
->wDuration_ba
= cpu_to_le16(pBuf
->wDuration_ba
);
1101 //Get CTS Frame body
1102 pBuf
->Data
.wDurationID
= pBuf
->wDuration_ba
;
1103 pBuf
->Data
.wFrameControl
= TYPE_CTL_CTS
;//0x00C4
1104 pBuf
->Data
.wReserved
= 0x0000;
1105 memcpy(&(pBuf
->Data
.abyRA
[0]), &(pDevice
->abyCurrentNetAddr
[0]), ETH_ALEN
);
1118 * Generate FIFO control for MAC & Baseband controller
1122 * pDevice - Pointer to adapter
1123 * pTxDataHead - Transmit Data Buffer
1124 * pTxBufHead - pTxBufHead
1125 * pvRrvTime - pvRrvTime
1126 * pvRTS - RTS Buffer
1128 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1129 * bNeedACK - If need ACK
1130 * uDescIdx - Desc Index
1134 * Return Value: none
1137 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1140 s_vGenerateTxParameter(
1142 unsigned char byPktType
,
1147 unsigned int cbFrameSize
,
1149 unsigned int uDMAIdx
,
1150 PSEthernetHeader psEthHeader
,
1151 unsigned short wCurrentRate
1154 unsigned int cbMACHdLen
= WLAN_HDR_ADDR3_LEN
; //24
1155 unsigned short wFifoCtl
;
1156 bool bDisCRC
= false;
1157 unsigned char byFBOption
= AUTO_FB_NONE
;
1158 // unsigned short wCurrentRate = pDevice->wCurrentRate;
1160 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vGenerateTxParameter...\n");
1161 PSTxBufHead pFifoHead
= (PSTxBufHead
)pTxBufHead
;
1162 pFifoHead
->wReserved
= wCurrentRate
;
1163 wFifoCtl
= pFifoHead
->wFIFOCtl
;
1165 if (wFifoCtl
& FIFOCTL_CRCDIS
) {
1169 if (wFifoCtl
& FIFOCTL_AUTO_FB_0
) {
1170 byFBOption
= AUTO_FB_0
;
1172 else if (wFifoCtl
& FIFOCTL_AUTO_FB_1
) {
1173 byFBOption
= AUTO_FB_1
;
1176 if (pDevice
->bLongHeader
)
1177 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
+ 6;
1179 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
1181 if (pvRTS
!= NULL
) { //RTS_need
1184 PSRrvTime_gRTS pBuf
= (PSRrvTime_gRTS
)pvRrvTime
;
1185 pBuf
->wRTSTxRrvTime_aa
= cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice
, 2, byPktType
, cbFrameSize
, wCurrentRate
));//2:RTSTxRrvTime_aa, 1:2.4GHz
1186 pBuf
->wRTSTxRrvTime_ba
= cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice
, 1, byPktType
, cbFrameSize
, wCurrentRate
));//1:RTSTxRrvTime_ba, 1:2.4GHz
1187 pBuf
->wRTSTxRrvTime_bb
= cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice
, 0, byPktType
, cbFrameSize
, wCurrentRate
));//0:RTSTxRrvTime_bb, 1:2.4GHz
1188 pBuf
->wTxRrvTime_a
= cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameSize
, wCurrentRate
, bNeedACK
));//2.4G OFDM
1189 pBuf
->wTxRrvTime_b
= cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, pDevice
->byTopCCKBasicRate
, bNeedACK
));//1:CCK
1192 s_vFillRTSHead(pDevice
, byPktType
, pvRTS
, cbFrameSize
, bNeedACK
, bDisCRC
, psEthHeader
, wCurrentRate
, byFBOption
);
1194 else {//RTS_needless, PCF mode
1198 PSRrvTime_gCTS pBuf
= (PSRrvTime_gCTS
)pvRrvTime
;
1199 pBuf
->wTxRrvTime_a
= cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameSize
, wCurrentRate
, bNeedACK
));//2.4G OFDM
1200 pBuf
->wTxRrvTime_b
= cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, pDevice
->byTopCCKBasicRate
, bNeedACK
));//1:CCK
1201 pBuf
->wCTSTxRrvTime_ba
= cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice
, 3, byPktType
, cbFrameSize
, wCurrentRate
));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1206 s_vFillCTSHead(pDevice
, uDMAIdx
, byPktType
, pvCTS
, cbFrameSize
, bNeedACK
, bDisCRC
, wCurrentRate
, byFBOption
);
1209 else if (byPktType
== PK_TYPE_11A
) {
1211 if (pvRTS
!= NULL
) {//RTS_need, non PCF mode
1214 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1215 pBuf
->wRTSTxRrvTime
= cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice
, 2, byPktType
, cbFrameSize
, wCurrentRate
));//2:RTSTxRrvTime_aa, 0:5GHz
1216 pBuf
->wTxRrvTime
= cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice
, byPktType
, cbFrameSize
, wCurrentRate
, bNeedACK
));//0:OFDM
1219 s_vFillRTSHead(pDevice
, byPktType
, pvRTS
, cbFrameSize
, bNeedACK
, bDisCRC
, psEthHeader
, wCurrentRate
, byFBOption
);
1221 else if (pvRTS
== NULL
) {//RTS_needless, non PCF mode
1224 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1225 pBuf
->wTxRrvTime
= cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice
, PK_TYPE_11A
, cbFrameSize
, wCurrentRate
, bNeedACK
)); //0:OFDM
1229 else if (byPktType
== PK_TYPE_11B
) {
1231 if ((pvRTS
!= NULL
)) {//RTS_need, non PCF mode
1234 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1235 pBuf
->wRTSTxRrvTime
= cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice
, 0, byPktType
, cbFrameSize
, wCurrentRate
));//0:RTSTxRrvTime_bb, 1:2.4GHz
1236 pBuf
->wTxRrvTime
= cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, wCurrentRate
, bNeedACK
));//1:CCK
1239 s_vFillRTSHead(pDevice
, byPktType
, pvRTS
, cbFrameSize
, bNeedACK
, bDisCRC
, psEthHeader
, wCurrentRate
, byFBOption
);
1241 else { //RTS_needless, non PCF mode
1244 PSRrvTime_ab pBuf
= (PSRrvTime_ab
)pvRrvTime
;
1245 pBuf
->wTxRrvTime
= cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice
, PK_TYPE_11B
, cbFrameSize
, wCurrentRate
, bNeedACK
)); //1:CCK
1249 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vGenerateTxParameter END.\n");
1252 unsigned char *pbyBuffer,//point to pTxBufHead
1253 unsigned short wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1254 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1258 s_vFillFragParameter(
1260 unsigned char *pbyBuffer
,
1261 unsigned int uTxType
,
1263 unsigned short wFragType
,
1264 unsigned int cbReqCount
1267 PSTxBufHead pTxBufHead
= (PSTxBufHead
) pbyBuffer
;
1268 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vFillFragParameter...\n");
1270 if (uTxType
== TYPE_SYNCDMA
) {
1271 //PSTxSyncDesc ptdCurr = (PSTxSyncDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1272 PSTxSyncDesc ptdCurr
= (PSTxSyncDesc
)pvtdCurr
;
1274 //Set FIFOCtl & TimeStamp in TxSyncDesc
1275 ptdCurr
->m_wFIFOCtl
= pTxBufHead
->wFIFOCtl
;
1276 ptdCurr
->m_wTimeStamp
= pTxBufHead
->wTimeStamp
;
1277 //Set TSR1 & ReqCount in TxDescHead
1278 ptdCurr
->m_td1TD1
.wReqCount
= cpu_to_le16((unsigned short)(cbReqCount
));
1279 if (wFragType
== FRAGCTL_ENDFRAG
) { //Last Fragmentation
1280 ptdCurr
->m_td1TD1
.byTCR
|= (TCR_STP
| TCR_EDP
| EDMSDU
);
1283 ptdCurr
->m_td1TD1
.byTCR
|= (TCR_STP
| TCR_EDP
);
1287 //PSTxDesc ptdCurr = (PSTxDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1288 PSTxDesc ptdCurr
= (PSTxDesc
)pvtdCurr
;
1289 //Set TSR1 & ReqCount in TxDescHead
1290 ptdCurr
->m_td1TD1
.wReqCount
= cpu_to_le16((unsigned short)(cbReqCount
));
1291 if (wFragType
== FRAGCTL_ENDFRAG
) { //Last Fragmentation
1292 ptdCurr
->m_td1TD1
.byTCR
|= (TCR_STP
| TCR_EDP
| EDMSDU
);
1295 ptdCurr
->m_td1TD1
.byTCR
|= (TCR_STP
| TCR_EDP
);
1299 pTxBufHead
->wFragCtl
|= (unsigned short)wFragType
;//0x0001; //0000 0000 0000 0001
1301 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vFillFragParameter END\n");
1305 s_cbFillTxBufHead(PSDevice pDevice
, unsigned char byPktType
, unsigned char *pbyTxBufferAddr
,
1306 unsigned int cbFrameBodySize
, unsigned int uDMAIdx
, PSTxDesc pHeadTD
,
1307 PSEthernetHeader psEthHeader
, unsigned char *pPacket
, bool bNeedEncrypt
,
1308 PSKeyItem pTransmitKey
, unsigned int uNodeIndex
, unsigned int *puMACfragNum
)
1310 unsigned int cbMACHdLen
;
1311 unsigned int cbFrameSize
;
1312 unsigned int cbFragmentSize
; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1313 unsigned int cbFragPayloadSize
;
1314 unsigned int cbLastFragmentSize
; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1315 unsigned int cbLastFragPayloadSize
;
1316 unsigned int uFragIdx
;
1317 unsigned char *pbyPayloadHead
;
1318 unsigned char *pbyIVHead
;
1319 unsigned char *pbyMacHdr
;
1320 unsigned short wFragType
; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1321 unsigned int uDuration
;
1322 unsigned char *pbyBuffer
;
1323 // unsigned int uKeyEntryIdx = NUM_KEY_ENTRY+1;
1324 // unsigned char byKeySel = 0xFF;
1325 unsigned int cbIVlen
= 0;
1326 unsigned int cbICVlen
= 0;
1327 unsigned int cbMIClen
= 0;
1328 unsigned int cbFCSlen
= 4;
1329 unsigned int cb802_1_H_len
= 0;
1330 unsigned int uLength
= 0;
1331 unsigned int uTmpLen
= 0;
1332 // unsigned char abyTmp[8];
1333 // unsigned long dwCRC;
1334 unsigned int cbMICHDR
= 0;
1335 unsigned long dwMICKey0
, dwMICKey1
;
1336 unsigned long dwMIC_Priority
;
1337 unsigned long *pdwMIC_L
;
1338 unsigned long *pdwMIC_R
;
1339 unsigned long dwSafeMIC_L
, dwSafeMIC_R
; //Fix "Last Frag Size" < "MIC length".
1340 bool bMIC2Frag
= false;
1341 unsigned int uMICFragLen
= 0;
1342 unsigned int uMACfragNum
= 1;
1343 unsigned int uPadding
= 0;
1344 unsigned int cbReqCount
= 0;
1349 unsigned char *pbyType
;
1351 PSTxBufHead psTxBufHd
= (PSTxBufHead
) pbyTxBufferAddr
;
1352 // unsigned int tmpDescIdx;
1353 unsigned int cbHeaderLength
= 0;
1355 PSMICHDRHead pMICHDR
;
1359 unsigned short wTxBufSize
; // FFinfo size
1360 unsigned int uTotalCopyLength
= 0;
1361 unsigned char byFBOption
= AUTO_FB_NONE
;
1362 bool bIsWEP256
= false;
1363 PSMgmtObject pMgmt
= pDevice
->pMgmt
;
1366 pvRrvTime
= pMICHDR
= pvRTS
= pvCTS
= pvTxDataHd
= NULL
;
1368 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_cbFillTxBufHead...\n");
1369 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
1370 (pDevice
->eOPMode
== OP_MODE_AP
)) {
1372 if (is_multicast_ether_addr(&(psEthHeader
->abyDstAddr
[0])))
1379 // MSDUs in Infra mode always need ACK
1384 if (pDevice
->bLongHeader
)
1385 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
+ 6;
1387 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
;
1390 if ((bNeedEncrypt
== true) && (pTransmitKey
!= NULL
)) {
1391 if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
1394 if (pTransmitKey
->uKeyLength
== WLAN_WEP232_KEYLEN
) {
1398 if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
1399 cbIVlen
= 8;//IV+ExtIV
1403 if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) {
1404 cbIVlen
= 8;//RSN Header
1406 cbMICHDR
= sizeof(SMICHDRHead
);
1408 if (pDevice
->byLocalID
> REV_ID_VT3253_A1
) {
1409 //MAC Header should be padding 0 to DW alignment.
1410 uPadding
= 4 - (cbMACHdLen
%4);
1416 cbFrameSize
= cbMACHdLen
+ cbIVlen
+ (cbFrameBodySize
+ cbMIClen
) + cbICVlen
+ cbFCSlen
;
1418 if ((bNeedACK
== false) ||
1419 (cbFrameSize
< pDevice
->wRTSThreshold
) ||
1420 ((cbFrameSize
>= pDevice
->wFragmentationThreshold
) && (pDevice
->wFragmentationThreshold
<= pDevice
->wRTSThreshold
))
1426 psTxBufHd
->wFIFOCtl
|= (FIFOCTL_RTS
| FIFOCTL_LRETRY
);
1429 // Use for AUTO FALL BACK
1431 if (psTxBufHd
->wFIFOCtl
& FIFOCTL_AUTO_FB_0
) {
1432 byFBOption
= AUTO_FB_0
;
1434 else if (psTxBufHd
->wFIFOCtl
& FIFOCTL_AUTO_FB_1
) {
1435 byFBOption
= AUTO_FB_1
;
1438 //////////////////////////////////////////////////////
1439 //Set RrvTime/RTS/CTS Buffer
1440 wTxBufSize
= sizeof(STxBufHead
);
1441 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {//802.11g packet
1443 if (byFBOption
== AUTO_FB_NONE
) {
1444 if (bRTS
== true) {//RTS_need
1445 pvRrvTime
= (PSRrvTime_gRTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1446 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
));
1447 pvRTS
= (PSRTS_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
);
1449 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g
));
1450 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g
) + sizeof(STxDataHead_g
);
1452 else { //RTS_needless
1453 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1454 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
1456 pvCTS
= (PSCTS
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
);
1457 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
));
1458 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
) + sizeof(STxDataHead_g
);
1462 if (bRTS
== true) {//RTS_need
1463 pvRrvTime
= (PSRrvTime_gRTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1464 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
));
1465 pvRTS
= (PSRTS_g_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
);
1467 pvTxDataHd
= (PSTxDataHead_g_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g_FB
));
1468 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gRTS
) + cbMICHDR
+ sizeof(SRTS_g_FB
) + sizeof(STxDataHead_g_FB
);
1470 else { //RTS_needless
1471 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
1472 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
1474 pvCTS
= (PSCTS_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
);
1475 pvTxDataHd
= (PSTxDataHead_g_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS_FB
));
1476 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS_FB
) + sizeof(STxDataHead_g_FB
);
1480 else {//802.11a/b packet
1482 if (byFBOption
== AUTO_FB_NONE
) {
1484 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1485 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1486 pvRTS
= (PSRTS_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1488 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(PSRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_ab
));
1489 cbHeaderLength
= wTxBufSize
+ sizeof(PSRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_ab
) + sizeof(STxDataHead_ab
);
1491 else { //RTS_needless, need MICHDR
1492 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1493 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1496 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1497 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(STxDataHead_ab
);
1501 if (bRTS
== true) {//RTS_need
1502 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1503 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1504 pvRTS
= (PSRTS_a_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1506 pvTxDataHd
= (PSTxDataHead_a_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(PSRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_a_FB
));
1507 cbHeaderLength
= wTxBufSize
+ sizeof(PSRrvTime_ab
) + cbMICHDR
+ sizeof(SRTS_a_FB
) + sizeof(STxDataHead_a_FB
);
1509 else { //RTS_needless
1510 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
1511 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
1514 pvTxDataHd
= (PSTxDataHead_a_FB
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
1515 cbHeaderLength
= wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(STxDataHead_a_FB
);
1519 memset((void *)(pbyTxBufferAddr
+ wTxBufSize
), 0, (cbHeaderLength
- wTxBufSize
));
1521 //////////////////////////////////////////////////////////////////
1522 if ((bNeedEncrypt
== true) && (pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
1523 if (pDevice
->pMgmt
->eAuthenMode
== WMAC_AUTH_WPANONE
) {
1524 dwMICKey0
= *(unsigned long *)(&pTransmitKey
->abyKey
[16]);
1525 dwMICKey1
= *(unsigned long *)(&pTransmitKey
->abyKey
[20]);
1527 else if ((pTransmitKey
->dwKeyIndex
& AUTHENTICATOR_KEY
) != 0) {
1528 dwMICKey0
= *(unsigned long *)(&pTransmitKey
->abyKey
[16]);
1529 dwMICKey1
= *(unsigned long *)(&pTransmitKey
->abyKey
[20]);
1532 dwMICKey0
= *(unsigned long *)(&pTransmitKey
->abyKey
[24]);
1533 dwMICKey1
= *(unsigned long *)(&pTransmitKey
->abyKey
[28]);
1535 // DO Software Michael
1536 MIC_vInit(dwMICKey0
, dwMICKey1
);
1537 MIC_vAppend((unsigned char *)&(psEthHeader
->abyDstAddr
[0]), 12);
1539 MIC_vAppend((unsigned char *)&dwMIC_Priority
, 4);
1540 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"MIC KEY: %lX, %lX\n", dwMICKey0
, dwMICKey1
);
1543 ///////////////////////////////////////////////////////////////////
1545 pbyMacHdr
= (unsigned char *)(pbyTxBufferAddr
+ cbHeaderLength
);
1546 pbyPayloadHead
= (unsigned char *)(pbyMacHdr
+ cbMACHdLen
+ uPadding
+ cbIVlen
);
1547 pbyIVHead
= (unsigned char *)(pbyMacHdr
+ cbMACHdLen
+ uPadding
);
1549 if ((cbFrameSize
> pDevice
->wFragmentationThreshold
) && (bNeedACK
== true) && (bIsWEP256
== false)) {
1551 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1552 cbFragmentSize
= pDevice
->wFragmentationThreshold
;
1553 cbFragPayloadSize
= cbFragmentSize
- cbMACHdLen
- cbIVlen
- cbICVlen
- cbFCSlen
;
1554 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1555 uMACfragNum
= (unsigned short) ((cbFrameBodySize
+ cbMIClen
) / cbFragPayloadSize
);
1556 cbLastFragPayloadSize
= (cbFrameBodySize
+ cbMIClen
) % cbFragPayloadSize
;
1557 if (cbLastFragPayloadSize
== 0) {
1558 cbLastFragPayloadSize
= cbFragPayloadSize
;
1562 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1563 cbLastFragmentSize
= cbMACHdLen
+ cbLastFragPayloadSize
+ cbIVlen
+ cbICVlen
+ cbFCSlen
;
1565 for (uFragIdx
= 0; uFragIdx
< uMACfragNum
; uFragIdx
++) {
1566 if (uFragIdx
== 0) {
1567 //=========================
1568 // Start Fragmentation
1569 //=========================
1570 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Start Fragmentation...\n");
1571 wFragType
= FRAGCTL_STAFRAG
;
1574 //Fill FIFO,RrvTime,RTS,and CTS
1575 s_vGenerateTxParameter(pDevice
, byPktType
, (void *)psTxBufHd
, pvRrvTime
, pvRTS
, pvCTS
,
1576 cbFragmentSize
, bNeedACK
, uDMAIdx
, psEthHeader
, pDevice
->wCurrentRate
);
1578 uDuration
= s_uFillDataHead(pDevice
, byPktType
, pvTxDataHd
, cbFragmentSize
, uDMAIdx
, bNeedACK
,
1579 uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
, pDevice
->wCurrentRate
);
1580 // Generate TX MAC Header
1581 vGenerateMACHeader(pDevice
, pbyMacHdr
, (unsigned short)uDuration
, psEthHeader
, bNeedEncrypt
,
1582 wFragType
, uDMAIdx
, uFragIdx
);
1584 if (bNeedEncrypt
== true) {
1586 s_vFillTxKey(pDevice
, (unsigned char *)(psTxBufHd
->adwTxKey
), pbyIVHead
, pTransmitKey
,
1587 pbyMacHdr
, (unsigned short)cbFragPayloadSize
, (unsigned char *)pMICHDR
);
1588 //Fill IV(ExtIV,RSNHDR)
1589 if (pDevice
->bEnableHostWEP
) {
1590 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
1591 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
1597 if (ntohs(psEthHeader
->wType
) > ETH_DATA_LEN
) {
1598 if ((psEthHeader
->wType
== TYPE_PKT_IPX
) ||
1599 (psEthHeader
->wType
== cpu_to_le16(0xF380))) {
1600 memcpy((unsigned char *)(pbyPayloadHead
), &pDevice
->abySNAP_Bridgetunnel
[0], 6);
1603 memcpy((unsigned char *)(pbyPayloadHead
), &pDevice
->abySNAP_RFC1042
[0], 6);
1605 pbyType
= (unsigned char *)(pbyPayloadHead
+ 6);
1606 memcpy(pbyType
, &(psEthHeader
->wType
), sizeof(unsigned short));
1610 cbReqCount
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
+ cbFragPayloadSize
;
1611 //---------------------------
1612 // S/W or H/W Encryption
1613 //---------------------------
1615 //if (pDevice->bAES) {
1616 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1618 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1619 // pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1623 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1624 pbyBuffer
= (unsigned char *)pHeadTD
->pTDInfo
->buf
;
1626 uLength
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
+ cb802_1_H_len
;
1627 //copy TxBufferHeader + MacHeader to desc
1628 memcpy(pbyBuffer
, (void *)psTxBufHd
, uLength
);
1630 // Copy the Packet into a tx Buffer
1631 memcpy((pbyBuffer
+ uLength
), (pPacket
+ 14), (cbFragPayloadSize
- cb802_1_H_len
));
1634 uTotalCopyLength
+= cbFragPayloadSize
- cb802_1_H_len
;
1636 if ((bNeedEncrypt
== true) && (pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
1637 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Start MIC: %d\n", cbFragPayloadSize
);
1638 MIC_vAppend((pbyBuffer
+ uLength
- cb802_1_H_len
), cbFragPayloadSize
);
1642 //---------------------------
1644 //---------------------------
1645 if ((pDevice
->byLocalID
<= REV_ID_VT3253_A1
)) {
1647 s_vSWencryption(pDevice
, pTransmitKey
, (pbyBuffer
+ uLength
- cb802_1_H_len
), (unsigned short)cbFragPayloadSize
);
1648 cbReqCount
+= cbICVlen
;
1652 ptdCurr
= (PSTxDesc
)pHeadTD
;
1653 //--------------------
1654 //1.Set TSR1 & ReqCount in TxDescHead
1655 //2.Set FragCtl in TxBufferHead
1656 //3.Set Frame Control
1657 //4.Set Sequence Control
1658 //5.Get S/W generate FCS
1659 //--------------------
1660 s_vFillFragParameter(pDevice
, pbyBuffer
, uDMAIdx
, (void *)ptdCurr
, wFragType
, cbReqCount
);
1662 ptdCurr
->pTDInfo
->dwReqCount
= cbReqCount
- uPadding
;
1663 ptdCurr
->pTDInfo
->dwHeaderLength
= cbHeaderLength
;
1664 ptdCurr
->pTDInfo
->skb_dma
= ptdCurr
->pTDInfo
->buf_dma
;
1665 ptdCurr
->buff_addr
= cpu_to_le32(ptdCurr
->pTDInfo
->skb_dma
);
1666 pDevice
->iTDUsed
[uDMAIdx
]++;
1667 pHeadTD
= ptdCurr
->next
;
1669 else if (uFragIdx
== (uMACfragNum
-1)) {
1670 //=========================
1671 // Last Fragmentation
1672 //=========================
1673 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Last Fragmentation...\n");
1674 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1676 wFragType
= FRAGCTL_ENDFRAG
;
1678 //Fill FIFO,RrvTime,RTS,and CTS
1679 s_vGenerateTxParameter(pDevice
, byPktType
, (void *)psTxBufHd
, pvRrvTime
, pvRTS
, pvCTS
,
1680 cbLastFragmentSize
, bNeedACK
, uDMAIdx
, psEthHeader
, pDevice
->wCurrentRate
);
1682 uDuration
= s_uFillDataHead(pDevice
, byPktType
, pvTxDataHd
, cbLastFragmentSize
, uDMAIdx
, bNeedACK
,
1683 uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
, pDevice
->wCurrentRate
);
1685 // Generate TX MAC Header
1686 vGenerateMACHeader(pDevice
, pbyMacHdr
, (unsigned short)uDuration
, psEthHeader
, bNeedEncrypt
,
1687 wFragType
, uDMAIdx
, uFragIdx
);
1689 if (bNeedEncrypt
== true) {
1691 s_vFillTxKey(pDevice
, (unsigned char *)(psTxBufHd
->adwTxKey
), pbyIVHead
, pTransmitKey
,
1692 pbyMacHdr
, (unsigned short)cbLastFragPayloadSize
, (unsigned char *)pMICHDR
);
1694 if (pDevice
->bEnableHostWEP
) {
1695 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
1696 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
1702 cbReqCount
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
+ cbLastFragPayloadSize
;
1703 //---------------------------
1704 // S/W or H/W Encryption
1705 //---------------------------
1709 pbyBuffer
= (unsigned char *)pHeadTD
->pTDInfo
->buf
;
1710 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1712 uLength
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
;
1714 //copy TxBufferHeader + MacHeader to desc
1715 memcpy(pbyBuffer
, (void *)psTxBufHd
, uLength
);
1717 // Copy the Packet into a tx Buffer
1718 if (bMIC2Frag
== false) {
1720 memcpy((pbyBuffer
+ uLength
),
1721 (pPacket
+ 14 + uTotalCopyLength
),
1722 (cbLastFragPayloadSize
- cbMIClen
)
1724 //TODO check uTmpLen !
1725 uTmpLen
= cbLastFragPayloadSize
- cbMIClen
;
1728 if ((bNeedEncrypt
== true) && (pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
1729 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1730 uMICFragLen
, cbLastFragPayloadSize
, uTmpLen
);
1732 if (bMIC2Frag
== false) {
1734 MIC_vAppend((pbyBuffer
+ uLength
), uTmpLen
);
1735 pdwMIC_L
= (unsigned long *)(pbyBuffer
+ uLength
+ uTmpLen
);
1736 pdwMIC_R
= (unsigned long *)(pbyBuffer
+ uLength
+ uTmpLen
+ 4);
1737 MIC_vGetMIC(pdwMIC_L
, pdwMIC_R
);
1738 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Last MIC:%lX, %lX\n", *pdwMIC_L
, *pdwMIC_R
);
1740 if (uMICFragLen
>= 4) {
1741 memcpy((pbyBuffer
+ uLength
), ((unsigned char *)&dwSafeMIC_R
+ (uMICFragLen
- 4)),
1742 (cbMIClen
- uMICFragLen
));
1743 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"LAST: uMICFragLen >= 4: %X, %d\n",
1744 *(unsigned char *)((unsigned char *)&dwSafeMIC_R
+ (uMICFragLen
- 4)),
1745 (cbMIClen
- uMICFragLen
));
1748 memcpy((pbyBuffer
+ uLength
), ((unsigned char *)&dwSafeMIC_L
+ uMICFragLen
),
1750 memcpy((pbyBuffer
+ uLength
+ (4 - uMICFragLen
)), &dwSafeMIC_R
, 4);
1751 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"LAST: uMICFragLen < 4: %X, %d\n",
1752 *(unsigned char *)((unsigned char *)&dwSafeMIC_R
+ uMICFragLen
- 4),
1753 (cbMIClen
- uMICFragLen
));
1756 for (ii = 0; ii < cbLastFragPayloadSize + 8 + 24; ii++) {
1757 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii - 8 - 24)));
1759 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n\n");
1764 ASSERT(uTmpLen
== (cbLastFragPayloadSize
- cbMIClen
));
1768 //---------------------------
1770 //---------------------------
1771 if ((pDevice
->byLocalID
<= REV_ID_VT3253_A1
)) {
1773 s_vSWencryption(pDevice
, pTransmitKey
, (pbyBuffer
+ uLength
), (unsigned short)cbLastFragPayloadSize
);
1774 cbReqCount
+= cbICVlen
;
1778 ptdCurr
= (PSTxDesc
)pHeadTD
;
1780 //--------------------
1781 //1.Set TSR1 & ReqCount in TxDescHead
1782 //2.Set FragCtl in TxBufferHead
1783 //3.Set Frame Control
1784 //4.Set Sequence Control
1785 //5.Get S/W generate FCS
1786 //--------------------
1789 s_vFillFragParameter(pDevice
, pbyBuffer
, uDMAIdx
, (void *)ptdCurr
, wFragType
, cbReqCount
);
1791 ptdCurr
->pTDInfo
->dwReqCount
= cbReqCount
- uPadding
;
1792 ptdCurr
->pTDInfo
->dwHeaderLength
= cbHeaderLength
;
1793 ptdCurr
->pTDInfo
->skb_dma
= ptdCurr
->pTDInfo
->buf_dma
;
1794 ptdCurr
->buff_addr
= cpu_to_le32(ptdCurr
->pTDInfo
->skb_dma
);
1795 pDevice
->iTDUsed
[uDMAIdx
]++;
1796 pHeadTD
= ptdCurr
->next
;
1800 //=========================
1801 // Middle Fragmentation
1802 //=========================
1803 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Middle Fragmentation...\n");
1804 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1806 wFragType
= FRAGCTL_MIDFRAG
;
1808 //Fill FIFO,RrvTime,RTS,and CTS
1809 s_vGenerateTxParameter(pDevice
, byPktType
, (void *)psTxBufHd
, pvRrvTime
, pvRTS
, pvCTS
,
1810 cbFragmentSize
, bNeedACK
, uDMAIdx
, psEthHeader
, pDevice
->wCurrentRate
);
1812 uDuration
= s_uFillDataHead(pDevice
, byPktType
, pvTxDataHd
, cbFragmentSize
, uDMAIdx
, bNeedACK
,
1813 uFragIdx
, cbLastFragmentSize
, uMACfragNum
, byFBOption
, pDevice
->wCurrentRate
);
1815 // Generate TX MAC Header
1816 vGenerateMACHeader(pDevice
, pbyMacHdr
, (unsigned short)uDuration
, psEthHeader
, bNeedEncrypt
,
1817 wFragType
, uDMAIdx
, uFragIdx
);
1820 if (bNeedEncrypt
== true) {
1822 s_vFillTxKey(pDevice
, (unsigned char *)(psTxBufHd
->adwTxKey
), pbyIVHead
, pTransmitKey
,
1823 pbyMacHdr
, (unsigned short)cbFragPayloadSize
, (unsigned char *)pMICHDR
);
1825 if (pDevice
->bEnableHostWEP
) {
1826 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
1827 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
1831 cbReqCount
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
+ cbFragPayloadSize
;
1832 //---------------------------
1833 // S/W or H/W Encryption
1834 //---------------------------
1836 //if (pDevice->bAES) {
1837 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1839 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1840 // pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1843 pbyBuffer
= (unsigned char *)pHeadTD
->pTDInfo
->buf
;
1844 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1847 uLength
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
;
1849 //copy TxBufferHeader + MacHeader to desc
1850 memcpy(pbyBuffer
, (void *)psTxBufHd
, uLength
);
1852 // Copy the Packet into a tx Buffer
1853 memcpy((pbyBuffer
+ uLength
),
1854 (pPacket
+ 14 + uTotalCopyLength
),
1857 uTmpLen
= cbFragPayloadSize
;
1859 uTotalCopyLength
+= uTmpLen
;
1861 if ((bNeedEncrypt
== true) && (pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
1863 MIC_vAppend((pbyBuffer
+ uLength
), uTmpLen
);
1865 if (uTmpLen
< cbFragPayloadSize
) {
1867 uMICFragLen
= cbFragPayloadSize
- uTmpLen
;
1868 ASSERT(uMICFragLen
< cbMIClen
);
1870 pdwMIC_L
= (unsigned long *)(pbyBuffer
+ uLength
+ uTmpLen
);
1871 pdwMIC_R
= (unsigned long *)(pbyBuffer
+ uLength
+ uTmpLen
+ 4);
1872 MIC_vGetMIC(pdwMIC_L
, pdwMIC_R
);
1873 dwSafeMIC_L
= *pdwMIC_L
;
1874 dwSafeMIC_R
= *pdwMIC_R
;
1876 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1877 uMICFragLen
, cbFragPayloadSize
, uTmpLen
);
1878 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Fill MIC in Middle frag [%d]\n", uMICFragLen
);
1880 for (ii = 0; ii < uMICFragLen; ii++) {
1881 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength + uTmpLen) + ii)));
1883 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
1885 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get MIC:%lX, %lX\n", *pdwMIC_L
, *pdwMIC_R
);
1887 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Middle frag len: %d\n", uTmpLen
);
1889 for (ii = 0; ii < uTmpLen; ii++) {
1890 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
1892 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n\n");
1896 ASSERT(uTmpLen
== (cbFragPayloadSize
));
1899 if ((pDevice
->byLocalID
<= REV_ID_VT3253_A1
)) {
1901 s_vSWencryption(pDevice
, pTransmitKey
, (pbyBuffer
+ uLength
), (unsigned short)cbFragPayloadSize
);
1902 cbReqCount
+= cbICVlen
;
1906 ptdCurr
= (PSTxDesc
)pHeadTD
;
1908 //--------------------
1909 //1.Set TSR1 & ReqCount in TxDescHead
1910 //2.Set FragCtl in TxBufferHead
1911 //3.Set Frame Control
1912 //4.Set Sequence Control
1913 //5.Get S/W generate FCS
1914 //--------------------
1916 s_vFillFragParameter(pDevice
, pbyBuffer
, uDMAIdx
, (void *)ptdCurr
, wFragType
, cbReqCount
);
1918 ptdCurr
->pTDInfo
->dwReqCount
= cbReqCount
- uPadding
;
1919 ptdCurr
->pTDInfo
->dwHeaderLength
= cbHeaderLength
;
1920 ptdCurr
->pTDInfo
->skb_dma
= ptdCurr
->pTDInfo
->buf_dma
;
1921 ptdCurr
->buff_addr
= cpu_to_le32(ptdCurr
->pTDInfo
->skb_dma
);
1922 pDevice
->iTDUsed
[uDMAIdx
]++;
1923 pHeadTD
= ptdCurr
->next
;
1925 } // for (uMACfragNum)
1928 //=========================
1930 //=========================
1931 //DBG_PRTGRP03(("No Fragmentation...\n"));
1932 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "No Fragmentation...\n");
1933 wFragType
= FRAGCTL_NONFRAG
;
1935 //Set FragCtl in TxBufferHead
1936 psTxBufHd
->wFragCtl
|= (unsigned short)wFragType
;
1938 //Fill FIFO,RrvTime,RTS,and CTS
1939 s_vGenerateTxParameter(pDevice
, byPktType
, (void *)psTxBufHd
, pvRrvTime
, pvRTS
, pvCTS
,
1940 cbFrameSize
, bNeedACK
, uDMAIdx
, psEthHeader
, pDevice
->wCurrentRate
);
1942 uDuration
= s_uFillDataHead(pDevice
, byPktType
, pvTxDataHd
, cbFrameSize
, uDMAIdx
, bNeedACK
,
1943 0, 0, uMACfragNum
, byFBOption
, pDevice
->wCurrentRate
);
1945 // Generate TX MAC Header
1946 vGenerateMACHeader(pDevice
, pbyMacHdr
, (unsigned short)uDuration
, psEthHeader
, bNeedEncrypt
,
1947 wFragType
, uDMAIdx
, 0);
1949 if (bNeedEncrypt
== true) {
1951 s_vFillTxKey(pDevice
, (unsigned char *)(psTxBufHd
->adwTxKey
), pbyIVHead
, pTransmitKey
,
1952 pbyMacHdr
, (unsigned short)cbFrameBodySize
, (unsigned char *)pMICHDR
);
1954 if (pDevice
->bEnableHostWEP
) {
1955 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
1956 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
1961 if (ntohs(psEthHeader
->wType
) > ETH_DATA_LEN
) {
1962 if ((psEthHeader
->wType
== TYPE_PKT_IPX
) ||
1963 (psEthHeader
->wType
== cpu_to_le16(0xF380))) {
1964 memcpy((unsigned char *)(pbyPayloadHead
), &pDevice
->abySNAP_Bridgetunnel
[0], 6);
1967 memcpy((unsigned char *)(pbyPayloadHead
), &pDevice
->abySNAP_RFC1042
[0], 6);
1969 pbyType
= (unsigned char *)(pbyPayloadHead
+ 6);
1970 memcpy(pbyType
, &(psEthHeader
->wType
), sizeof(unsigned short));
1974 cbReqCount
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
+ (cbFrameBodySize
+ cbMIClen
);
1975 //---------------------------
1976 // S/W or H/W Encryption
1977 //---------------------------
1979 //if (pDevice->bAES) {
1980 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Fill MICHDR...\n");
1981 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFrameBodySize);
1984 pbyBuffer
= (unsigned char *)pHeadTD
->pTDInfo
->buf
;
1985 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1987 uLength
= cbHeaderLength
+ cbMACHdLen
+ uPadding
+ cbIVlen
+ cb802_1_H_len
;
1989 //copy TxBufferHeader + MacHeader to desc
1990 memcpy(pbyBuffer
, (void *)psTxBufHd
, uLength
);
1992 // Copy the Packet into a tx Buffer
1993 memcpy((pbyBuffer
+ uLength
),
1995 cbFrameBodySize
- cb802_1_H_len
1998 if ((bNeedEncrypt
== true) && (pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
2000 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Length:%d, %d\n", cbFrameBodySize
- cb802_1_H_len
, uLength
);
2002 for (ii = 0; ii < (cbFrameBodySize - cb802_1_H_len); ii++) {
2003 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
2005 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
2008 MIC_vAppend((pbyBuffer
+ uLength
- cb802_1_H_len
), cbFrameBodySize
);
2010 pdwMIC_L
= (unsigned long *)(pbyBuffer
+ uLength
- cb802_1_H_len
+ cbFrameBodySize
);
2011 pdwMIC_R
= (unsigned long *)(pbyBuffer
+ uLength
- cb802_1_H_len
+ cbFrameBodySize
+ 4);
2013 MIC_vGetMIC(pdwMIC_L
, pdwMIC_R
);
2017 if (pDevice
->bTxMICFail
== true) {
2020 pDevice
->bTxMICFail
= false;
2023 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"uLength: %d, %d\n", uLength
, cbFrameBodySize
);
2024 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"cbReqCount:%d, %d, %d, %d\n", cbReqCount
, cbHeaderLength
, uPadding
, cbIVlen
);
2025 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"MIC:%lx, %lx\n", *pdwMIC_L
, *pdwMIC_R
);
2027 for (ii = 0; ii < 8; ii++) {
2028 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *(((unsigned char *)(pdwMIC_L) + ii)));
2030 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
2036 if ((pDevice
->byLocalID
<= REV_ID_VT3253_A1
)) {
2038 s_vSWencryption(pDevice
, pTransmitKey
, (pbyBuffer
+ uLength
- cb802_1_H_len
),
2039 (unsigned short)(cbFrameBodySize
+ cbMIClen
));
2040 cbReqCount
+= cbICVlen
;
2045 ptdCurr
= (PSTxDesc
)pHeadTD
;
2047 ptdCurr
->pTDInfo
->dwReqCount
= cbReqCount
- uPadding
;
2048 ptdCurr
->pTDInfo
->dwHeaderLength
= cbHeaderLength
;
2049 ptdCurr
->pTDInfo
->skb_dma
= ptdCurr
->pTDInfo
->buf_dma
;
2050 ptdCurr
->buff_addr
= cpu_to_le32(ptdCurr
->pTDInfo
->skb_dma
);
2051 //Set TSR1 & ReqCount in TxDescHead
2052 ptdCurr
->m_td1TD1
.byTCR
|= (TCR_STP
| TCR_EDP
| EDMSDU
);
2053 ptdCurr
->m_td1TD1
.wReqCount
= cpu_to_le16((unsigned short)(cbReqCount
));
2055 pDevice
->iTDUsed
[uDMAIdx
]++;
2058 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ptdCurr->m_dwReserved0[%d] ptdCurr->m_dwReserved1[%d].\n", ptdCurr->pTDInfo->dwReqCount, ptdCurr->pTDInfo->dwHeaderLength);
2059 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " cbHeaderLength[%d]\n", cbHeaderLength);
2062 *puMACfragNum
= uMACfragNum
;
2063 //DBG_PRTGRP03(("s_cbFillTxBufHead END\n"));
2064 return cbHeaderLength
;
2069 vGenerateFIFOHeader(PSDevice pDevice
, unsigned char byPktType
, unsigned char *pbyTxBufferAddr
,
2070 bool bNeedEncrypt
, unsigned int cbPayloadSize
, unsigned int uDMAIdx
,
2071 PSTxDesc pHeadTD
, PSEthernetHeader psEthHeader
, unsigned char *pPacket
,
2072 PSKeyItem pTransmitKey
, unsigned int uNodeIndex
, unsigned int *puMACfragNum
,
2073 unsigned int *pcbHeaderSize
)
2075 unsigned int wTxBufSize
; // FFinfo size
2078 unsigned short cbMacHdLen
;
2079 PSTxBufHead pTxBufHead
= (PSTxBufHead
) pbyTxBufferAddr
;
2081 wTxBufSize
= sizeof(STxBufHead
);
2083 memset(pTxBufHead
, 0, wTxBufSize
);
2084 //Set FIFOCTL_NEEDACK
2086 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
2087 (pDevice
->eOPMode
== OP_MODE_AP
)) {
2088 if (is_multicast_ether_addr(&(psEthHeader
->abyDstAddr
[0]))) {
2090 pTxBufHead
->wFIFOCtl
= pTxBufHead
->wFIFOCtl
& (~FIFOCTL_NEEDACK
);
2094 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
2099 // MSDUs in Infra mode always need ACK
2101 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
2106 pTxBufHead
->wFIFOCtl
|= FIFOCTL_TMOEN
;
2107 pTxBufHead
->wTimeStamp
= cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us
);
2110 if (pDevice
->bLongHeader
)
2111 pTxBufHead
->wFIFOCtl
|= FIFOCTL_LHEAD
;
2113 //Set FIFOCTL_GENINT
2115 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GENINT
;
2118 //Set FIFOCTL_ISDMA0
2119 if (TYPE_TXDMA0
== uDMAIdx
) {
2120 pTxBufHead
->wFIFOCtl
|= FIFOCTL_ISDMA0
;
2123 //Set FRAGCTL_MACHDCNT
2124 if (pDevice
->bLongHeader
) {
2125 cbMacHdLen
= WLAN_HDR_ADDR3_LEN
+ 6;
2127 cbMacHdLen
= WLAN_HDR_ADDR3_LEN
;
2129 pTxBufHead
->wFragCtl
|= cpu_to_le16((unsigned short)(cbMacHdLen
<< 10));
2132 if (byPktType
== PK_TYPE_11A
) {//0000 0000 0000 0000
2135 else if (byPktType
== PK_TYPE_11B
) {//0000 0001 0000 0000
2136 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
2138 else if (byPktType
== PK_TYPE_11GB
) {//0000 0010 0000 0000
2139 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GB
;
2141 else if (byPktType
== PK_TYPE_11GA
) {//0000 0011 0000 0000
2142 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GA
;
2144 //Set FIFOCTL_GrpAckPolicy
2145 if (pDevice
->bGrpAckPolicy
== true) {//0000 0100 0000 0000
2146 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GRPACK
;
2149 //Set Auto Fallback Ctl
2150 if (pDevice
->wCurrentRate
>= RATE_18M
) {
2151 if (pDevice
->byAutoFBCtrl
== AUTO_FB_0
) {
2152 pTxBufHead
->wFIFOCtl
|= FIFOCTL_AUTO_FB_0
;
2153 } else if (pDevice
->byAutoFBCtrl
== AUTO_FB_1
) {
2154 pTxBufHead
->wFIFOCtl
|= FIFOCTL_AUTO_FB_1
;
2158 //Set FRAGCTL_WEPTYP
2159 pDevice
->bAES
= false;
2161 //Set FRAGCTL_WEPTYP
2162 if (pDevice
->byLocalID
> REV_ID_VT3253_A1
) {
2163 if ((bNeedEncrypt
) && (pTransmitKey
!= NULL
)) { //WEP enabled
2164 if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
2165 pTxBufHead
->wFragCtl
|= FRAGCTL_TKIP
;
2167 else if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) { //WEP40 or WEP104
2168 if (pTransmitKey
->uKeyLength
!= WLAN_WEP232_KEYLEN
)
2169 pTxBufHead
->wFragCtl
|= FRAGCTL_LEGACY
;
2171 else if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) { //CCMP
2172 pTxBufHead
->wFragCtl
|= FRAGCTL_AES
;
2178 //if (pDevice->wCurrentRate <= 3)
2180 // RFbRawSetPower(pDevice,36,pDevice->wCurrentRate);
2184 RFbSetPower(pDevice
, pDevice
->wCurrentRate
, pDevice
->byCurrentCh
);
2186 //if (pDevice->wCurrentRate == 3)
2187 //pDevice->byCurPwr = 46;
2188 pTxBufHead
->byTxPower
= pDevice
->byCurPwr
;
2194 if (pDevice->bEnableHostWEP)
2195 pTxBufHead->wFragCtl &= ~(FRAGCTL_TKIP | FRAGCTL_LEGACY |FRAGCTL_AES);
2197 *pcbHeaderSize
= s_cbFillTxBufHead(pDevice
, byPktType
, pbyTxBufferAddr
, cbPayloadSize
,
2198 uDMAIdx
, pHeadTD
, psEthHeader
, pPacket
, bNeedEncrypt
,
2199 pTransmitKey
, uNodeIndex
, puMACfragNum
);
2210 * Translate 802.3 to 802.11 header
2214 * pDevice - Pointer to adapter
2215 * dwTxBufferAddr - Transmit Buffer
2216 * pPacket - Packet from upper layer
2217 * cbPacketSize - Transmit Data Length
2219 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
2220 * pcbAppendPayload - size of append payload for 802.1H translation
2222 * Return Value: none
2229 unsigned char *pbyBufferAddr
,
2230 unsigned short wDuration
,
2231 PSEthernetHeader psEthHeader
,
2233 unsigned short wFragType
,
2234 unsigned int uDMAIdx
,
2235 unsigned int uFragIdx
2238 PS802_11Header pMACHeader
= (PS802_11Header
)pbyBufferAddr
;
2240 memset(pMACHeader
, 0, (sizeof(S802_11Header
))); //- sizeof(pMACHeader->dwIV)));
2242 if (uDMAIdx
== TYPE_ATIMDMA
) {
2243 pMACHeader
->wFrameCtl
= TYPE_802_11_ATIM
;
2245 pMACHeader
->wFrameCtl
= TYPE_802_11_DATA
;
2248 if (pDevice
->eOPMode
== OP_MODE_AP
) {
2249 memcpy(&(pMACHeader
->abyAddr1
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
2250 memcpy(&(pMACHeader
->abyAddr2
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
2251 memcpy(&(pMACHeader
->abyAddr3
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
2252 pMACHeader
->wFrameCtl
|= FC_FROMDS
;
2255 if (pDevice
->eOPMode
== OP_MODE_ADHOC
) {
2256 memcpy(&(pMACHeader
->abyAddr1
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
2257 memcpy(&(pMACHeader
->abyAddr2
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
2258 memcpy(&(pMACHeader
->abyAddr3
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
2261 memcpy(&(pMACHeader
->abyAddr3
[0]), &(psEthHeader
->abyDstAddr
[0]), ETH_ALEN
);
2262 memcpy(&(pMACHeader
->abyAddr2
[0]), &(psEthHeader
->abySrcAddr
[0]), ETH_ALEN
);
2263 memcpy(&(pMACHeader
->abyAddr1
[0]), &(pDevice
->abyBSSID
[0]), ETH_ALEN
);
2264 pMACHeader
->wFrameCtl
|= FC_TODS
;
2269 pMACHeader
->wFrameCtl
|= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2271 pMACHeader
->wDurationID
= cpu_to_le16(wDuration
);
2273 if (pDevice
->bLongHeader
) {
2274 PWLAN_80211HDR_A4 pMACA4Header
= (PWLAN_80211HDR_A4
) pbyBufferAddr
;
2275 pMACHeader
->wFrameCtl
|= (FC_TODS
| FC_FROMDS
);
2276 memcpy(pMACA4Header
->abyAddr4
, pDevice
->abyBSSID
, WLAN_ADDR_LEN
);
2278 pMACHeader
->wSeqCtl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
2280 //Set FragNumber in Sequence Control
2281 pMACHeader
->wSeqCtl
|= cpu_to_le16((unsigned short)uFragIdx
);
2283 if ((wFragType
== FRAGCTL_ENDFRAG
) || (wFragType
== FRAGCTL_NONFRAG
)) {
2284 pDevice
->wSeqCounter
++;
2285 if (pDevice
->wSeqCounter
> 0x0fff)
2286 pDevice
->wSeqCounter
= 0;
2289 if ((wFragType
== FRAGCTL_STAFRAG
) || (wFragType
== FRAGCTL_MIDFRAG
)) { //StartFrag or MidFrag
2290 pMACHeader
->wFrameCtl
|= FC_MOREFRAG
;
2299 CMD_STATUS
csMgmt_xmit(PSDevice pDevice
, PSTxMgmtPacket pPacket
) {
2302 unsigned char byPktType
;
2303 unsigned char *pbyTxBufferAddr
;
2307 unsigned int uDuration
;
2308 unsigned int cbReqCount
;
2309 PS802_11Header pMACHeader
;
2310 unsigned int cbHeaderSize
;
2311 unsigned int cbFrameBodySize
;
2313 bool bIsPSPOLL
= false;
2314 PSTxBufHead pTxBufHead
;
2315 unsigned int cbFrameSize
;
2316 unsigned int cbIVlen
= 0;
2317 unsigned int cbICVlen
= 0;
2318 unsigned int cbMIClen
= 0;
2319 unsigned int cbFCSlen
= 4;
2320 unsigned int uPadding
= 0;
2321 unsigned short wTxBufSize
;
2322 unsigned int cbMacHdLen
;
2323 SEthernetHeader sEthHeader
;
2326 PSMgmtObject pMgmt
= pDevice
->pMgmt
;
2327 unsigned short wCurrentRate
= RATE_1M
;
2330 if (AVAIL_TD(pDevice
, TYPE_TXDMA0
) <= 0) {
2331 return CMD_STATUS_RESOURCES
;
2334 pFrstTD
= pDevice
->apCurrTD
[TYPE_TXDMA0
];
2335 pbyTxBufferAddr
= (unsigned char *)pFrstTD
->pTDInfo
->buf
;
2336 cbFrameBodySize
= pPacket
->cbPayloadLen
;
2337 pTxBufHead
= (PSTxBufHead
) pbyTxBufferAddr
;
2338 wTxBufSize
= sizeof(STxBufHead
);
2339 memset(pTxBufHead
, 0, wTxBufSize
);
2341 if (pDevice
->eCurrentPHYType
== PHY_TYPE_11A
) {
2342 wCurrentRate
= RATE_6M
;
2343 byPktType
= PK_TYPE_11A
;
2345 wCurrentRate
= RATE_1M
;
2346 byPktType
= PK_TYPE_11B
;
2349 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2350 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2351 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2352 // to set power here.
2353 if (pDevice
->pMgmt
->eScanState
!= WMAC_NO_SCANNING
) {
2355 RFbSetPower(pDevice
, wCurrentRate
, pDevice
->byCurrentCh
);
2357 RFbSetPower(pDevice
, wCurrentRate
, pMgmt
->uCurrChannel
);
2359 pTxBufHead
->byTxPower
= pDevice
->byCurPwr
;
2360 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2361 if (pDevice
->byFOETuning
) {
2362 if ((pPacket
->p80211Header
->sA3
.wFrameCtl
& TYPE_DATE_NULL
) == TYPE_DATE_NULL
) {
2363 wCurrentRate
= RATE_24M
;
2364 byPktType
= PK_TYPE_11GA
;
2369 if (byPktType
== PK_TYPE_11A
) {//0000 0000 0000 0000
2370 pTxBufHead
->wFIFOCtl
= 0;
2372 else if (byPktType
== PK_TYPE_11B
) {//0000 0001 0000 0000
2373 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
2375 else if (byPktType
== PK_TYPE_11GB
) {//0000 0010 0000 0000
2376 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GB
;
2378 else if (byPktType
== PK_TYPE_11GA
) {//0000 0011 0000 0000
2379 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GA
;
2382 pTxBufHead
->wFIFOCtl
|= FIFOCTL_TMOEN
;
2383 pTxBufHead
->wTimeStamp
= cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us
);
2386 if (is_multicast_ether_addr(&(pPacket
->p80211Header
->sA3
.abyAddr1
[0])))
2390 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
2393 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) ||
2394 (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
)) {
2396 pTxBufHead
->wFIFOCtl
|= FIFOCTL_LRETRY
;
2397 //Set Preamble type always long
2398 //pDevice->byPreambleType = PREAMBLE_LONG;
2399 // probe-response don't retry
2400 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2401 // bNeedACK = false;
2402 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2406 pTxBufHead
->wFIFOCtl
|= (FIFOCTL_GENINT
| FIFOCTL_ISDMA0
);
2408 if ((pPacket
->p80211Header
->sA4
.wFrameCtl
& TYPE_SUBTYPE_MASK
) == TYPE_CTL_PSPOLL
) {
2410 cbMacHdLen
= WLAN_HDR_ADDR2_LEN
;
2412 cbMacHdLen
= WLAN_HDR_ADDR3_LEN
;
2415 //Set FRAGCTL_MACHDCNT
2416 pTxBufHead
->wFragCtl
|= cpu_to_le16((unsigned short)(cbMacHdLen
<< 10));
2419 // Although spec says MMPDU can be fragmented; In most cases,
2420 // no one will send a MMPDU under fragmentation. With RTS may occur.
2421 pDevice
->bAES
= false; //Set FRAGCTL_WEPTYP
2423 if (WLAN_GET_FC_ISWEP(pPacket
->p80211Header
->sA4
.wFrameCtl
) != 0) {
2424 if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption1Enabled
) {
2427 pTxBufHead
->wFragCtl
|= FRAGCTL_LEGACY
;
2429 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption2Enabled
) {
2430 cbIVlen
= 8;//IV+ExtIV
2433 pTxBufHead
->wFragCtl
|= FRAGCTL_TKIP
;
2434 //We need to get seed here for filling TxKey entry.
2435 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2436 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2438 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption3Enabled
) {
2439 cbIVlen
= 8;//RSN Header
2441 pTxBufHead
->wFragCtl
|= FRAGCTL_AES
;
2442 pDevice
->bAES
= true;
2444 //MAC Header should be padding 0 to DW alignment.
2445 uPadding
= 4 - (cbMacHdLen
%4);
2449 cbFrameSize
= cbMacHdLen
+ cbFrameBodySize
+ cbIVlen
+ cbMIClen
+ cbICVlen
+ cbFCSlen
;
2451 //Set FIFOCTL_GrpAckPolicy
2452 if (pDevice
->bGrpAckPolicy
== true) {//0000 0100 0000 0000
2453 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GRPACK
;
2455 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2457 //Set RrvTime/RTS/CTS Buffer
2458 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {//802.11g packet
2460 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
2463 pCTS
= (PSCTS
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
2464 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + sizeof(SCTS
));
2465 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + sizeof(SCTS
) + sizeof(STxDataHead_g
);
2467 else { // 802.11a/b packet
2468 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
2472 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
2473 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_ab
) + sizeof(STxDataHead_ab
);
2476 memset((void *)(pbyTxBufferAddr
+ wTxBufSize
), 0, (cbHeaderSize
- wTxBufSize
));
2478 memcpy(&(sEthHeader
.abyDstAddr
[0]), &(pPacket
->p80211Header
->sA3
.abyAddr1
[0]), ETH_ALEN
);
2479 memcpy(&(sEthHeader
.abySrcAddr
[0]), &(pPacket
->p80211Header
->sA3
.abyAddr2
[0]), ETH_ALEN
);
2480 //=========================
2482 //=========================
2483 pTxBufHead
->wFragCtl
|= (unsigned short)FRAGCTL_NONFRAG
;
2486 //Fill FIFO,RrvTime,RTS,and CTS
2487 s_vGenerateTxParameter(pDevice
, byPktType
, pbyTxBufferAddr
, pvRrvTime
, pvRTS
, pCTS
,
2488 cbFrameSize
, bNeedACK
, TYPE_TXDMA0
, &sEthHeader
, wCurrentRate
);
2491 uDuration
= s_uFillDataHead(pDevice
, byPktType
, pvTxDataHd
, cbFrameSize
, TYPE_TXDMA0
, bNeedACK
,
2492 0, 0, 1, AUTO_FB_NONE
, wCurrentRate
);
2494 pMACHeader
= (PS802_11Header
) (pbyTxBufferAddr
+ cbHeaderSize
);
2496 cbReqCount
= cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
+ cbFrameBodySize
;
2498 if (WLAN_GET_FC_ISWEP(pPacket
->p80211Header
->sA4
.wFrameCtl
) != 0) {
2499 unsigned char *pbyIVHead
;
2500 unsigned char *pbyPayloadHead
;
2501 unsigned char *pbyBSSID
;
2502 PSKeyItem pTransmitKey
= NULL
;
2504 pbyIVHead
= (unsigned char *)(pbyTxBufferAddr
+ cbHeaderSize
+ cbMacHdLen
+ uPadding
);
2505 pbyPayloadHead
= (unsigned char *)(pbyTxBufferAddr
+ cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
);
2508 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2509 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2511 //Fill IV(ExtIV,RSNHDR)
2512 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2513 //---------------------------
2514 // S/W or H/W Encryption
2515 //---------------------------
2517 //if (pDevice->bAES) {
2518 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize);
2521 if ((pDevice
->eOPMode
== OP_MODE_INFRASTRUCTURE
) &&
2522 (pDevice
->bLinkPass
== true)) {
2523 pbyBSSID
= pDevice
->abyBSSID
;
2525 if (KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, PAIRWISE_KEY
, &pTransmitKey
) == false) {
2527 if (KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == true) {
2528 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get GTK.\n");
2532 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get PTK.\n");
2537 pbyBSSID
= pDevice
->abyBroadcastAddr
;
2538 if (KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == false) {
2539 pTransmitKey
= NULL
;
2540 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"KEY is NULL. OP Mode[%d]\n", pDevice
->eOPMode
);
2542 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get GTK.\n");
2546 s_vFillTxKey(pDevice
, (unsigned char *)(pTxBufHead
->adwTxKey
), pbyIVHead
, pTransmitKey
,
2547 (unsigned char *)pMACHeader
, (unsigned short)cbFrameBodySize
, NULL
);
2549 memcpy(pMACHeader
, pPacket
->p80211Header
, cbMacHdLen
);
2550 memcpy(pbyPayloadHead
, ((unsigned char *)(pPacket
->p80211Header
) + cbMacHdLen
),
2554 // Copy the Packet into a tx Buffer
2555 memcpy(pMACHeader
, pPacket
->p80211Header
, pPacket
->cbMPDULen
);
2558 pMACHeader
->wSeqCtl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
2559 pDevice
->wSeqCounter
++;
2560 if (pDevice
->wSeqCounter
> 0x0fff)
2561 pDevice
->wSeqCounter
= 0;
2564 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2565 // of FIFO control header.
2566 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2567 // in the same place of other packet's Duration-field).
2568 // And it will cause Cisco-AP to issue Disassociation-packet
2569 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
2570 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_a
= cpu_to_le16(pPacket
->p80211Header
->sA2
.wDurationID
);
2571 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_b
= cpu_to_le16(pPacket
->p80211Header
->sA2
.wDurationID
);
2573 ((PSTxDataHead_ab
)pvTxDataHd
)->wDuration
= cpu_to_le16(pPacket
->p80211Header
->sA2
.wDurationID
);
2578 // first TD is the only TD
2579 //Set TSR1 & ReqCount in TxDescHead
2580 pFrstTD
->m_td1TD1
.byTCR
= (TCR_STP
| TCR_EDP
| EDMSDU
);
2581 pFrstTD
->pTDInfo
->skb_dma
= pFrstTD
->pTDInfo
->buf_dma
;
2582 pFrstTD
->m_td1TD1
.wReqCount
= cpu_to_le16((unsigned short)(cbReqCount
));
2583 pFrstTD
->buff_addr
= cpu_to_le32(pFrstTD
->pTDInfo
->skb_dma
);
2584 pFrstTD
->pTDInfo
->byFlags
= 0;
2586 if (MACbIsRegBitsOn(pDevice
->PortOffset
, MAC_REG_PSCTL
, PSCTL_PS
)) {
2588 MACbPSWakeup(pDevice
->PortOffset
);
2590 pDevice
->bPWBitOn
= false;
2593 pFrstTD
->m_td0TD0
.f1Owner
= OWNED_BY_NIC
;
2596 pDevice
->iTDUsed
[TYPE_TXDMA0
]++;
2598 if (AVAIL_TD(pDevice
, TYPE_TXDMA0
) <= 1) {
2599 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" available td0 <= 1\n");
2602 pDevice
->apCurrTD
[TYPE_TXDMA0
] = pFrstTD
->next
;
2605 pDevice
->nTxDataTimeCout
= 0; //2008-8-21 chester <add> for send null packet
2608 // Poll Transmit the adapter
2609 MACvTransmit0(pDevice
->PortOffset
);
2611 return CMD_STATUS_PENDING
;
2616 CMD_STATUS
csBeacon_xmit(PSDevice pDevice
, PSTxMgmtPacket pPacket
) {
2618 unsigned char byPktType
;
2619 unsigned char *pbyBuffer
= (unsigned char *)pDevice
->tx_beacon_bufs
;
2620 unsigned int cbFrameSize
= pPacket
->cbMPDULen
+ WLAN_FCS_LEN
;
2621 unsigned int cbHeaderSize
= 0;
2622 unsigned short wTxBufSize
= sizeof(STxShortBufHead
);
2623 PSTxShortBufHead pTxBufHead
= (PSTxShortBufHead
) pbyBuffer
;
2624 PSTxDataHead_ab pTxDataHead
= (PSTxDataHead_ab
) (pbyBuffer
+ wTxBufSize
);
2625 PS802_11Header pMACHeader
;
2626 unsigned short wCurrentRate
;
2627 unsigned short wLen
= 0x0000;
2630 memset(pTxBufHead
, 0, wTxBufSize
);
2632 if (pDevice
->eCurrentPHYType
== PHY_TYPE_11A
) {
2633 wCurrentRate
= RATE_6M
;
2634 byPktType
= PK_TYPE_11A
;
2636 wCurrentRate
= RATE_2M
;
2637 byPktType
= PK_TYPE_11B
;
2640 //Set Preamble type always long
2641 pDevice
->byPreambleType
= PREAMBLE_LONG
;
2643 //Set FIFOCTL_GENINT
2645 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GENINT
;
2648 //Set packet type & Get Duration
2649 if (byPktType
== PK_TYPE_11A
) {//0000 0000 0000 0000
2650 pTxDataHead
->wDuration
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_A
, cbFrameSize
, byPktType
,
2651 wCurrentRate
, false, 0, 0, 1, AUTO_FB_NONE
));
2653 else if (byPktType
== PK_TYPE_11B
) {//0000 0001 0000 0000
2654 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
2655 pTxDataHead
->wDuration
= cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice
, DATADUR_B
, cbFrameSize
, byPktType
,
2656 wCurrentRate
, false, 0, 0, 1, AUTO_FB_NONE
));
2659 BBvCalculateParameter(pDevice
, cbFrameSize
, wCurrentRate
, byPktType
,
2660 (unsigned short *)&(wLen
), (unsigned char *)&(pTxDataHead
->byServiceField
), (unsigned char *)&(pTxDataHead
->bySignalField
)
2662 pTxDataHead
->wTransmitLength
= cpu_to_le16(wLen
);
2664 pTxDataHead
->wTimeStampOff
= cpu_to_le16(wTimeStampOff
[pDevice
->byPreambleType
%2][wCurrentRate
%MAX_RATE
]);
2665 cbHeaderSize
= wTxBufSize
+ sizeof(STxDataHead_ab
);
2667 //Generate Beacon Header
2668 pMACHeader
= (PS802_11Header
)(pbyBuffer
+ cbHeaderSize
);
2669 memcpy(pMACHeader
, pPacket
->p80211Header
, pPacket
->cbMPDULen
);
2671 pMACHeader
->wDurationID
= 0;
2672 pMACHeader
->wSeqCtl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
2673 pDevice
->wSeqCounter
++;
2674 if (pDevice
->wSeqCounter
> 0x0fff)
2675 pDevice
->wSeqCounter
= 0;
2677 // Set Beacon buffer length
2678 pDevice
->wBCNBufLen
= pPacket
->cbMPDULen
+ cbHeaderSize
;
2680 MACvSetCurrBCNTxDescAddr(pDevice
->PortOffset
, (pDevice
->tx_beacon_dma
));
2682 MACvSetCurrBCNLength(pDevice
->PortOffset
, pDevice
->wBCNBufLen
);
2683 // Set auto Transmit on
2684 MACvRegBitsOn(pDevice
->PortOffset
, MAC_REG_TCR
, TCR_AUTOBCNTX
);
2685 // Poll Transmit the adapter
2686 MACvTransmitBCN(pDevice
->PortOffset
);
2688 return CMD_STATUS_PENDING
;
2696 PSKeyItem pTransmitKey
,
2697 unsigned int cbFrameBodySize
,
2698 PSEthernetHeader psEthHeader
2701 unsigned int cbMACHdLen
;
2702 unsigned int cbFrameSize
;
2703 unsigned int cbFragmentSize
; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2704 unsigned int cbFragPayloadSize
;
2705 unsigned int cbLastFragPayloadSize
;
2706 unsigned int cbIVlen
= 0;
2707 unsigned int cbICVlen
= 0;
2708 unsigned int cbMIClen
= 0;
2709 unsigned int cbFCSlen
= 4;
2710 unsigned int uMACfragNum
= 1;
2715 if ((pDevice
->eOPMode
== OP_MODE_ADHOC
) ||
2716 (pDevice
->eOPMode
== OP_MODE_AP
)) {
2717 if (is_multicast_ether_addr(&(psEthHeader
->abyDstAddr
[0])))
2723 // MSDUs in Infra mode always need ACK
2727 if (pDevice
->bLongHeader
)
2728 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
+ 6;
2730 cbMACHdLen
= WLAN_HDR_ADDR3_LEN
;
2733 if (pDevice
->bEncryptionEnable
== true) {
2735 if (pTransmitKey
== NULL
) {
2736 if ((pDevice
->eEncryptionStatus
== Ndis802_11Encryption1Enabled
) ||
2737 (pDevice
->pMgmt
->eAuthenMode
< WMAC_AUTH_WPA
)) {
2740 } else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption2Enabled
) {
2741 cbIVlen
= 8;//IV+ExtIV
2744 } else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption3Enabled
) {
2745 cbIVlen
= 8;//RSN Header
2748 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_WEP
) {
2751 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
) {
2752 cbIVlen
= 8;//IV+ExtIV
2755 } else if (pTransmitKey
->byCipherSuite
== KEY_CTL_CCMP
) {
2756 cbIVlen
= 8;//RSN Header
2761 cbFrameSize
= cbMACHdLen
+ cbIVlen
+ (cbFrameBodySize
+ cbMIClen
) + cbICVlen
+ cbFCSlen
;
2763 if ((cbFrameSize
> pDevice
->wFragmentationThreshold
) && (bNeedACK
== true)) {
2765 cbFragmentSize
= pDevice
->wFragmentationThreshold
;
2766 cbFragPayloadSize
= cbFragmentSize
- cbMACHdLen
- cbIVlen
- cbICVlen
- cbFCSlen
;
2767 uMACfragNum
= (unsigned short) ((cbFrameBodySize
+ cbMIClen
) / cbFragPayloadSize
);
2768 cbLastFragPayloadSize
= (cbFrameBodySize
+ cbMIClen
) % cbFragPayloadSize
;
2769 if (cbLastFragPayloadSize
== 0) {
2770 cbLastFragPayloadSize
= cbFragPayloadSize
;
2780 vDMA0_tx_80211(PSDevice pDevice
, struct sk_buff
*skb
, unsigned char *pbMPDU
, unsigned int cbMPDULen
) {
2783 unsigned char byPktType
;
2784 unsigned char *pbyTxBufferAddr
;
2788 unsigned int uDuration
;
2789 unsigned int cbReqCount
;
2790 PS802_11Header pMACHeader
;
2791 unsigned int cbHeaderSize
;
2792 unsigned int cbFrameBodySize
;
2794 bool bIsPSPOLL
= false;
2795 PSTxBufHead pTxBufHead
;
2796 unsigned int cbFrameSize
;
2797 unsigned int cbIVlen
= 0;
2798 unsigned int cbICVlen
= 0;
2799 unsigned int cbMIClen
= 0;
2800 unsigned int cbFCSlen
= 4;
2801 unsigned int uPadding
= 0;
2802 unsigned int cbMICHDR
= 0;
2803 unsigned int uLength
= 0;
2804 unsigned long dwMICKey0
, dwMICKey1
;
2805 unsigned long dwMIC_Priority
;
2806 unsigned long *pdwMIC_L
;
2807 unsigned long *pdwMIC_R
;
2808 unsigned short wTxBufSize
;
2809 unsigned int cbMacHdLen
;
2810 SEthernetHeader sEthHeader
;
2813 PSMgmtObject pMgmt
= pDevice
->pMgmt
;
2814 unsigned short wCurrentRate
= RATE_1M
;
2815 PUWLAN_80211HDR p80211Header
;
2816 unsigned int uNodeIndex
= 0;
2817 bool bNodeExist
= false;
2819 PSKeyItem pTransmitKey
= NULL
;
2820 unsigned char *pbyIVHead
;
2821 unsigned char *pbyPayloadHead
;
2822 unsigned char *pbyMacHdr
;
2824 unsigned int cbExtSuppRate
= 0;
2828 pvRrvTime
= pMICHDR
= pvRTS
= pvCTS
= pvTxDataHd
= NULL
;
2830 if (cbMPDULen
<= WLAN_HDR_ADDR3_LEN
) {
2831 cbFrameBodySize
= 0;
2834 cbFrameBodySize
= cbMPDULen
- WLAN_HDR_ADDR3_LEN
;
2836 p80211Header
= (PUWLAN_80211HDR
)pbMPDU
;
2839 pFrstTD
= pDevice
->apCurrTD
[TYPE_TXDMA0
];
2840 pbyTxBufferAddr
= (unsigned char *)pFrstTD
->pTDInfo
->buf
;
2841 pTxBufHead
= (PSTxBufHead
) pbyTxBufferAddr
;
2842 wTxBufSize
= sizeof(STxBufHead
);
2843 memset(pTxBufHead
, 0, wTxBufSize
);
2845 if (pDevice
->eCurrentPHYType
== PHY_TYPE_11A
) {
2846 wCurrentRate
= RATE_6M
;
2847 byPktType
= PK_TYPE_11A
;
2849 wCurrentRate
= RATE_1M
;
2850 byPktType
= PK_TYPE_11B
;
2853 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2854 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2855 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2856 // to set power here.
2857 if (pDevice
->pMgmt
->eScanState
!= WMAC_NO_SCANNING
) {
2858 RFbSetPower(pDevice
, wCurrentRate
, pDevice
->byCurrentCh
);
2860 RFbSetPower(pDevice
, wCurrentRate
, pMgmt
->uCurrChannel
);
2862 pTxBufHead
->byTxPower
= pDevice
->byCurPwr
;
2864 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2865 if (pDevice
->byFOETuning
) {
2866 if ((p80211Header
->sA3
.wFrameCtl
& TYPE_DATE_NULL
) == TYPE_DATE_NULL
) {
2867 wCurrentRate
= RATE_24M
;
2868 byPktType
= PK_TYPE_11GA
;
2872 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header
->sA3
.wFrameCtl
);
2875 if (byPktType
== PK_TYPE_11A
) {//0000 0000 0000 0000
2876 pTxBufHead
->wFIFOCtl
= 0;
2878 else if (byPktType
== PK_TYPE_11B
) {//0000 0001 0000 0000
2879 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11B
;
2881 else if (byPktType
== PK_TYPE_11GB
) {//0000 0010 0000 0000
2882 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GB
;
2884 else if (byPktType
== PK_TYPE_11GA
) {//0000 0011 0000 0000
2885 pTxBufHead
->wFIFOCtl
|= FIFOCTL_11GA
;
2888 pTxBufHead
->wFIFOCtl
|= FIFOCTL_TMOEN
;
2889 pTxBufHead
->wTimeStamp
= cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us
);
2892 if (is_multicast_ether_addr(&(p80211Header
->sA3
.abyAddr1
[0]))) {
2894 if (pDevice
->bEnableHostWEP
) {
2900 if (pDevice
->bEnableHostWEP
) {
2901 if (BSSDBbIsSTAInNodeDB(pDevice
->pMgmt
, (unsigned char *)(p80211Header
->sA3
.abyAddr1
), &uNodeIndex
))
2905 pTxBufHead
->wFIFOCtl
|= FIFOCTL_NEEDACK
;
2908 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) ||
2909 (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
)) {
2911 pTxBufHead
->wFIFOCtl
|= FIFOCTL_LRETRY
;
2912 //Set Preamble type always long
2913 //pDevice->byPreambleType = PREAMBLE_LONG;
2915 // probe-response don't retry
2916 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2917 // bNeedACK = false;
2918 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2922 pTxBufHead
->wFIFOCtl
|= (FIFOCTL_GENINT
| FIFOCTL_ISDMA0
);
2924 if ((p80211Header
->sA4
.wFrameCtl
& TYPE_SUBTYPE_MASK
) == TYPE_CTL_PSPOLL
) {
2926 cbMacHdLen
= WLAN_HDR_ADDR2_LEN
;
2928 cbMacHdLen
= WLAN_HDR_ADDR3_LEN
;
2931 // hostapd deamon ext support rate patch
2932 if (WLAN_GET_FC_FSTYPE(p80211Header
->sA4
.wFrameCtl
) == WLAN_FSTYPE_ASSOCRESP
) {
2934 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
!= 0) {
2935 cbExtSuppRate
+= ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
+ WLAN_IEHDR_LEN
;
2938 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
!= 0) {
2939 cbExtSuppRate
+= ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
+ WLAN_IEHDR_LEN
;
2942 if (cbExtSuppRate
> 0) {
2943 cbFrameBodySize
= WLAN_ASSOCRESP_OFF_SUPP_RATES
;
2948 //Set FRAGCTL_MACHDCNT
2949 pTxBufHead
->wFragCtl
|= cpu_to_le16((unsigned short)cbMacHdLen
<< 10);
2952 // Although spec says MMPDU can be fragmented; In most cases,
2953 // no one will send a MMPDU under fragmentation. With RTS may occur.
2954 pDevice
->bAES
= false; //Set FRAGCTL_WEPTYP
2957 if (WLAN_GET_FC_ISWEP(p80211Header
->sA4
.wFrameCtl
) != 0) {
2958 if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption1Enabled
) {
2961 pTxBufHead
->wFragCtl
|= FRAGCTL_LEGACY
;
2963 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption2Enabled
) {
2964 cbIVlen
= 8;//IV+ExtIV
2967 pTxBufHead
->wFragCtl
|= FRAGCTL_TKIP
;
2968 //We need to get seed here for filling TxKey entry.
2969 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2970 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2972 else if (pDevice
->eEncryptionStatus
== Ndis802_11Encryption3Enabled
) {
2973 cbIVlen
= 8;//RSN Header
2975 cbMICHDR
= sizeof(SMICHDRHead
);
2976 pTxBufHead
->wFragCtl
|= FRAGCTL_AES
;
2977 pDevice
->bAES
= true;
2979 //MAC Header should be padding 0 to DW alignment.
2980 uPadding
= 4 - (cbMacHdLen
%4);
2984 cbFrameSize
= cbMacHdLen
+ cbFrameBodySize
+ cbIVlen
+ cbMIClen
+ cbICVlen
+ cbFCSlen
+ cbExtSuppRate
;
2986 //Set FIFOCTL_GrpAckPolicy
2987 if (pDevice
->bGrpAckPolicy
== true) {//0000 0100 0000 0000
2988 pTxBufHead
->wFIFOCtl
|= FIFOCTL_GRPACK
;
2990 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2993 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {//802.11g packet
2995 pvRrvTime
= (PSRrvTime_gCTS
) (pbyTxBufferAddr
+ wTxBufSize
);
2996 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
));
2998 pvCTS
= (PSCTS
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
);
2999 pvTxDataHd
= (PSTxDataHead_g
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
));
3000 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_gCTS
) + cbMICHDR
+ sizeof(SCTS
) + sizeof(STxDataHead_g
);
3003 else {//802.11a/b packet
3005 pvRrvTime
= (PSRrvTime_ab
) (pbyTxBufferAddr
+ wTxBufSize
);
3006 pMICHDR
= (PSMICHDRHead
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
));
3009 pvTxDataHd
= (PSTxDataHead_ab
) (pbyTxBufferAddr
+ wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
);
3010 cbHeaderSize
= wTxBufSize
+ sizeof(SRrvTime_ab
) + cbMICHDR
+ sizeof(STxDataHead_ab
);
3014 memset((void *)(pbyTxBufferAddr
+ wTxBufSize
), 0, (cbHeaderSize
- wTxBufSize
));
3015 memcpy(&(sEthHeader
.abyDstAddr
[0]), &(p80211Header
->sA3
.abyAddr1
[0]), ETH_ALEN
);
3016 memcpy(&(sEthHeader
.abySrcAddr
[0]), &(p80211Header
->sA3
.abyAddr2
[0]), ETH_ALEN
);
3017 //=========================
3019 //=========================
3020 pTxBufHead
->wFragCtl
|= (unsigned short)FRAGCTL_NONFRAG
;
3023 //Fill FIFO,RrvTime,RTS,and CTS
3024 s_vGenerateTxParameter(pDevice
, byPktType
, pbyTxBufferAddr
, pvRrvTime
, pvRTS
, pvCTS
,
3025 cbFrameSize
, bNeedACK
, TYPE_TXDMA0
, &sEthHeader
, wCurrentRate
);
3028 uDuration
= s_uFillDataHead(pDevice
, byPktType
, pvTxDataHd
, cbFrameSize
, TYPE_TXDMA0
, bNeedACK
,
3029 0, 0, 1, AUTO_FB_NONE
, wCurrentRate
);
3031 pMACHeader
= (PS802_11Header
) (pbyTxBufferAddr
+ cbHeaderSize
);
3033 cbReqCount
= cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
+ (cbFrameBodySize
+ cbMIClen
) + cbExtSuppRate
;
3035 pbyMacHdr
= (unsigned char *)(pbyTxBufferAddr
+ cbHeaderSize
);
3036 pbyPayloadHead
= (unsigned char *)(pbyMacHdr
+ cbMacHdLen
+ uPadding
+ cbIVlen
);
3037 pbyIVHead
= (unsigned char *)(pbyMacHdr
+ cbMacHdLen
+ uPadding
);
3039 // Copy the Packet into a tx Buffer
3040 memcpy(pbyMacHdr
, pbMPDU
, cbMacHdLen
);
3042 // version set to 0, patch for hostapd deamon
3043 pMACHeader
->wFrameCtl
&= cpu_to_le16(0xfffc);
3044 memcpy(pbyPayloadHead
, (pbMPDU
+ cbMacHdLen
), cbFrameBodySize
);
3046 // replace support rate, patch for hostapd deamon(only support 11M)
3047 if (WLAN_GET_FC_FSTYPE(p80211Header
->sA4
.wFrameCtl
) == WLAN_FSTYPE_ASSOCRESP
) {
3048 if (cbExtSuppRate
!= 0) {
3049 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
!= 0)
3050 memcpy((pbyPayloadHead
+ cbFrameBodySize
),
3051 pMgmt
->abyCurrSuppRates
,
3052 ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
+ WLAN_IEHDR_LEN
3054 if (((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
!= 0)
3055 memcpy((pbyPayloadHead
+ cbFrameBodySize
) + ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
)->len
+ WLAN_IEHDR_LEN
,
3056 pMgmt
->abyCurrExtSuppRates
,
3057 ((PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
)->len
+ WLAN_IEHDR_LEN
3063 if (WLAN_GET_FC_ISWEP(p80211Header
->sA4
.wFrameCtl
) != 0) {
3065 if (pDevice
->bEnableHostWEP
) {
3066 pTransmitKey
= &STempKey
;
3067 pTransmitKey
->byCipherSuite
= pMgmt
->sNodeDBTable
[uNodeIndex
].byCipherSuite
;
3068 pTransmitKey
->dwKeyIndex
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwKeyIndex
;
3069 pTransmitKey
->uKeyLength
= pMgmt
->sNodeDBTable
[uNodeIndex
].uWepKeyLength
;
3070 pTransmitKey
->dwTSC47_16
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
;
3071 pTransmitKey
->wTSC15_0
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
;
3072 memcpy(pTransmitKey
->abyKey
,
3073 &pMgmt
->sNodeDBTable
[uNodeIndex
].abyWepKey
[0],
3074 pTransmitKey
->uKeyLength
3078 if ((pTransmitKey
!= NULL
) && (pTransmitKey
->byCipherSuite
== KEY_CTL_TKIP
)) {
3080 dwMICKey0
= *(unsigned long *)(&pTransmitKey
->abyKey
[16]);
3081 dwMICKey1
= *(unsigned long *)(&pTransmitKey
->abyKey
[20]);
3083 // DO Software Michael
3084 MIC_vInit(dwMICKey0
, dwMICKey1
);
3085 MIC_vAppend((unsigned char *)&(sEthHeader
.abyDstAddr
[0]), 12);
3087 MIC_vAppend((unsigned char *)&dwMIC_Priority
, 4);
3088 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0
, dwMICKey1
);
3090 uLength
= cbHeaderSize
+ cbMacHdLen
+ uPadding
+ cbIVlen
;
3092 MIC_vAppend((pbyTxBufferAddr
+ uLength
), cbFrameBodySize
);
3094 pdwMIC_L
= (unsigned long *)(pbyTxBufferAddr
+ uLength
+ cbFrameBodySize
);
3095 pdwMIC_R
= (unsigned long *)(pbyTxBufferAddr
+ uLength
+ cbFrameBodySize
+ 4);
3097 MIC_vGetMIC(pdwMIC_L
, pdwMIC_R
);
3100 if (pDevice
->bTxMICFail
== true) {
3103 pDevice
->bTxMICFail
= false;
3106 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"uLength: %d, %d\n", uLength
, cbFrameBodySize
);
3107 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"cbReqCount:%d, %d, %d, %d\n", cbReqCount
, cbHeaderSize
, uPadding
, cbIVlen
);
3108 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"MIC:%lx, %lx\n", *pdwMIC_L
, *pdwMIC_R
);
3113 s_vFillTxKey(pDevice
, (unsigned char *)(pTxBufHead
->adwTxKey
), pbyIVHead
, pTransmitKey
,
3114 pbyMacHdr
, (unsigned short)cbFrameBodySize
, (unsigned char *)pMICHDR
);
3116 if (pDevice
->bEnableHostWEP
) {
3117 pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
= pTransmitKey
->dwTSC47_16
;
3118 pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
= pTransmitKey
->wTSC15_0
;
3121 if ((pDevice
->byLocalID
<= REV_ID_VT3253_A1
)) {
3122 s_vSWencryption(pDevice
, pTransmitKey
, pbyPayloadHead
, (unsigned short)(cbFrameBodySize
+ cbMIClen
));
3126 pMACHeader
->wSeqCtl
= cpu_to_le16(pDevice
->wSeqCounter
<< 4);
3127 pDevice
->wSeqCounter
++;
3128 if (pDevice
->wSeqCounter
> 0x0fff)
3129 pDevice
->wSeqCounter
= 0;
3133 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
3134 // of FIFO control header.
3135 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
3136 // in the same place of other packet's Duration-field).
3137 // And it will cause Cisco-AP to issue Disassociation-packet
3138 if (byPktType
== PK_TYPE_11GB
|| byPktType
== PK_TYPE_11GA
) {
3139 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_a
= cpu_to_le16(p80211Header
->sA2
.wDurationID
);
3140 ((PSTxDataHead_g
)pvTxDataHd
)->wDuration_b
= cpu_to_le16(p80211Header
->sA2
.wDurationID
);
3142 ((PSTxDataHead_ab
)pvTxDataHd
)->wDuration
= cpu_to_le16(p80211Header
->sA2
.wDurationID
);
3147 // first TD is the only TD
3148 //Set TSR1 & ReqCount in TxDescHead
3149 pFrstTD
->pTDInfo
->skb
= skb
;
3150 pFrstTD
->m_td1TD1
.byTCR
= (TCR_STP
| TCR_EDP
| EDMSDU
);
3151 pFrstTD
->pTDInfo
->skb_dma
= pFrstTD
->pTDInfo
->buf_dma
;
3152 pFrstTD
->m_td1TD1
.wReqCount
= cpu_to_le16(cbReqCount
);
3153 pFrstTD
->buff_addr
= cpu_to_le32(pFrstTD
->pTDInfo
->skb_dma
);
3154 pFrstTD
->pTDInfo
->byFlags
= 0;
3155 pFrstTD
->pTDInfo
->byFlags
|= TD_FLAGS_PRIV_SKB
;
3157 if (MACbIsRegBitsOn(pDevice
->PortOffset
, MAC_REG_PSCTL
, PSCTL_PS
)) {
3159 MACbPSWakeup(pDevice
->PortOffset
);
3161 pDevice
->bPWBitOn
= false;
3164 pFrstTD
->m_td0TD0
.f1Owner
= OWNED_BY_NIC
;
3167 pDevice
->iTDUsed
[TYPE_TXDMA0
]++;
3169 if (AVAIL_TD(pDevice
, TYPE_TXDMA0
) <= 1) {
3170 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" available td0 <= 1\n");
3173 pDevice
->apCurrTD
[TYPE_TXDMA0
] = pFrstTD
->next
;
3175 // Poll Transmit the adapter
3176 MACvTransmit0(pDevice
->PortOffset
);