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;
76 /*--------------------- Static Functions --------------------------*/
78 /*--------------------- Static Definitions -------------------------*/
79 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
80 // packet size >= 256 -> direct send
82 const unsigned short wTimeStampOff[2][MAX_RATE] = {
83 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
84 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
87 const unsigned short wFB_Opt0[2][5] = {
88 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
89 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
91 const unsigned short wFB_Opt1[2][5] = {
92 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
93 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
100 #define RTSDUR_BA_F0 4
101 #define RTSDUR_AA_F0 5
102 #define RTSDUR_BA_F1 6
103 #define RTSDUR_AA_F1 7
104 #define CTSDUR_BA_F0 8
105 #define CTSDUR_BA_F1 9
108 #define DATADUR_A_F0 12
109 #define DATADUR_A_F1 13
111 /*--------------------- Static Functions --------------------------*/
117 unsigned char *pbyBuf,
118 unsigned char *pbyIVHead,
119 PSKeyItem pTransmitKey,
120 unsigned char *pbyHdrBuf,
121 unsigned short wPayloadLen,
122 unsigned char *pMICHDR
129 unsigned char byPktType,
131 unsigned int cbFrameLength,
134 PSEthernetHeader psEthHeader,
135 unsigned short wCurrentRate,
136 unsigned char byFBOption
141 s_vGenerateTxParameter(
143 unsigned char byPktType,
148 unsigned int cbFrameSize,
150 unsigned int uDMAIdx,
151 PSEthernetHeader psEthHeader,
152 unsigned short wCurrentRate
155 static void s_vFillFragParameter(
157 unsigned char *pbyBuffer,
158 unsigned int uTxType,
160 unsigned short wFragType,
161 unsigned int cbReqCount
165 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
166 unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
167 PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
168 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum);
174 unsigned char byPktType,
176 unsigned int cbFrameLength,
177 unsigned int uDMAIdx,
179 unsigned int uFragIdx,
180 unsigned int cbLastFragmentSize,
181 unsigned int uMACfragNum,
182 unsigned char byFBOption,
183 unsigned short wCurrentRate
186 /*--------------------- Export Variables --------------------------*/
192 unsigned char *pbyBuf,
193 unsigned char *pbyIVHead,
194 PSKeyItem pTransmitKey,
195 unsigned char *pbyHdrBuf,
196 unsigned short wPayloadLen,
197 unsigned char *pMICHDR
200 unsigned long *pdwIV = (unsigned long *)pbyIVHead;
201 unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
202 unsigned short wValue;
203 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
204 unsigned long dwRevIVCounter;
205 unsigned char byKeyIndex = 0;
208 if (pTransmitKey == NULL)
211 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
212 *pdwIV = pDevice->dwIVCounter;
213 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
215 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
216 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
217 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
218 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
220 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
221 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
222 if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
223 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
224 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
226 memcpy(pDevice->abyPRNG, pbyBuf, 16);
228 // Append IV after Mac Header
229 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
230 *pdwIV |= (unsigned long)byKeyIndex << 30;
231 *pdwIV = cpu_to_le32(*pdwIV);
232 pDevice->dwIVCounter++;
233 if (pDevice->dwIVCounter > WEP_IV_MASK) {
234 pDevice->dwIVCounter = 0;
236 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
237 pTransmitKey->wTSC15_0++;
238 if (pTransmitKey->wTSC15_0 == 0) {
239 pTransmitKey->dwTSC47_16++;
241 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
242 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
243 memcpy(pbyBuf, pDevice->abyPRNG, 16);
245 memcpy(pdwIV, pDevice->abyPRNG, 3);
247 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
248 // Append IV&ExtIV after Mac Header
249 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
250 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
252 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
253 pTransmitKey->wTSC15_0++;
254 if (pTransmitKey->wTSC15_0 == 0) {
255 pTransmitKey->dwTSC47_16++;
257 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
261 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
262 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
263 //Append IV&ExtIV after Mac Header
264 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
268 *((unsigned char *)(pMICHDR+1)) = 0; // TxPriority
269 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
270 *((unsigned char *)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
271 *((unsigned char *)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
272 *((unsigned char *)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
273 *((unsigned char *)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
274 *((unsigned char *)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
275 *((unsigned char *)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
276 *((unsigned char *)(pMICHDR+14)) = HIBYTE(wPayloadLen);
277 *((unsigned char *)(pMICHDR+15)) = LOBYTE(wPayloadLen);
280 *((unsigned char *)(pMICHDR+16)) = 0; // HLEN[15:8]
281 if (pDevice->bLongHeader) {
282 *((unsigned char *)(pMICHDR+17)) = 28; // HLEN[7:0]
284 *((unsigned char *)(pMICHDR+17)) = 22; // HLEN[7:0]
286 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
287 memcpy(pMICHDR+18, (unsigned char *)&wValue, 2); // MSKFRACTL
288 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
289 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
292 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
293 wValue = pMACHeader->wSeqCtl;
295 wValue = cpu_to_le16(wValue);
296 memcpy(pMICHDR+38, (unsigned char *)&wValue, 2); // MSKSEQCTL
297 if (pDevice->bLongHeader) {
298 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
307 PSKeyItem pTransmitKey,
308 unsigned char *pbyPayloadHead,
309 unsigned short wPayloadSize
312 unsigned int cbICVlen = 4;
313 unsigned long dwICV = 0xFFFFFFFFL;
314 unsigned long *pdwICV;
316 if (pTransmitKey == NULL)
319 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
320 //=======================================================================
321 // Append ICV after payload
322 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
323 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
324 // finally, we must invert dwCRC to get the correct answer
325 *pdwICV = cpu_to_le32(~dwICV);
327 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
328 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
329 //=======================================================================
330 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
331 //=======================================================================
332 //Append ICV after payload
333 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
334 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
335 // finally, we must invert dwCRC to get the correct answer
336 *pdwICV = cpu_to_le32(~dwICV);
338 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
339 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
340 //=======================================================================
344 /*byPktType : PK_TYPE_11A 0
353 unsigned char byPktType,
354 unsigned int cbFrameLength,
355 unsigned short wRate,
359 unsigned int uDataTime, uAckTime;
361 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
362 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
363 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
364 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
365 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
369 return uDataTime + pDevice->uSIFS + uAckTime;
375 //byFreqType: 0=>5GHZ 1=>2.4GHZ
380 unsigned char byRTSRsvType,
381 unsigned char byPktType,
382 unsigned int cbFrameLength,
383 unsigned short wCurrentRate
386 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
388 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
390 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
391 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
392 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
393 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
394 } else if (byRTSRsvType == 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
395 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
396 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
397 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
398 } else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
399 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
400 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
401 } else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
402 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
403 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
404 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
409 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
413 //byFreqType 0: 5GHz, 1:2.4Ghz
418 unsigned char byDurType,
419 unsigned int cbFrameLength,
420 unsigned char byPktType,
421 unsigned short wRate,
423 unsigned int uFragIdx,
424 unsigned int cbLastFragmentSize,
425 unsigned int uMACfragNum,
426 unsigned char byFBOption
430 unsigned int uAckTime = 0, uNextPktTime = 0;
432 if (uFragIdx == (uMACfragNum-1)) {
437 case DATADUR_B: //DATADUR_B
438 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
440 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
441 return pDevice->uSIFS + uAckTime;
445 } else {//First Frag or Mid Frag
446 if (uFragIdx == (uMACfragNum-2)) {
447 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
449 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
452 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
453 return pDevice->uSIFS + uAckTime + uNextPktTime;
455 return pDevice->uSIFS + uNextPktTime;
460 case DATADUR_A: //DATADUR_A
461 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
463 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
464 return pDevice->uSIFS + uAckTime;
468 } else {//First Frag or Mid Frag
469 if (uFragIdx == (uMACfragNum-2)) {
470 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
472 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
475 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
476 return pDevice->uSIFS + uAckTime + uNextPktTime;
478 return pDevice->uSIFS + uNextPktTime;
483 case DATADUR_A_F0: //DATADUR_A_F0
484 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
486 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
487 return pDevice->uSIFS + uAckTime;
491 } else { //First Frag or Mid Frag
492 if (byFBOption == AUTO_FB_0) {
493 if (wRate < RATE_18M)
495 else if (wRate > RATE_54M)
498 if (uFragIdx == (uMACfragNum-2)) {
499 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
501 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
503 } else { // (byFBOption == AUTO_FB_1)
504 if (wRate < RATE_18M)
506 else if (wRate > RATE_54M)
509 if (uFragIdx == (uMACfragNum-2)) {
510 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
512 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
517 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
518 return pDevice->uSIFS + uAckTime + uNextPktTime;
520 return pDevice->uSIFS + uNextPktTime;
525 case DATADUR_A_F1: //DATADUR_A_F1
526 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
528 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
529 return pDevice->uSIFS + uAckTime;
533 } else { //First Frag or Mid Frag
534 if (byFBOption == AUTO_FB_0) {
535 if (wRate < RATE_18M)
537 else if (wRate > RATE_54M)
540 if (uFragIdx == (uMACfragNum-2)) {
541 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
543 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
546 } else { // (byFBOption == AUTO_FB_1)
547 if (wRate < RATE_18M)
549 else if (wRate > RATE_54M)
552 if (uFragIdx == (uMACfragNum-2)) {
553 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
555 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
559 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
560 return pDevice->uSIFS + uAckTime + uNextPktTime;
562 return pDevice->uSIFS + uNextPktTime;
575 //byFreqType: 0=>5GHZ 1=>2.4GHZ
578 s_uGetRTSCTSDuration(
580 unsigned char byDurType,
581 unsigned int cbFrameLength,
582 unsigned char byPktType,
583 unsigned short wRate,
585 unsigned char byFBOption
588 unsigned int uCTSTime = 0, uDurTime = 0;
591 case RTSDUR_BB: //RTSDuration_bb
592 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
593 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
596 case RTSDUR_BA: //RTSDuration_ba
597 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
598 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
601 case RTSDUR_AA: //RTSDuration_aa
602 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
603 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
606 case CTSDUR_BA: //CTSDuration_ba
607 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
610 case RTSDUR_BA_F0: //RTSDuration_ba_f0
611 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
612 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
613 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
614 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
615 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
619 case RTSDUR_AA_F0: //RTSDuration_aa_f0
620 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
621 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
622 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
623 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
624 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
628 case RTSDUR_BA_F1: //RTSDuration_ba_f1
629 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
630 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
631 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
632 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
633 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
637 case RTSDUR_AA_F1: //RTSDuration_aa_f1
638 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
639 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
640 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
641 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
642 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
646 case CTSDUR_BA_F0: //CTSDuration_ba_f0
647 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
648 uDurTime = 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 = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
654 case CTSDUR_BA_F1: //CTSDuration_ba_f1
655 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
656 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
657 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
658 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
673 unsigned char byPktType,
675 unsigned int cbFrameLength,
676 unsigned int uDMAIdx,
678 unsigned int uFragIdx,
679 unsigned int cbLastFragmentSize,
680 unsigned int uMACfragNum,
681 unsigned char byFBOption,
682 unsigned short wCurrentRate
685 unsigned short wLen = 0x0000;
687 if (pTxDataHead == NULL) {
691 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
692 if (byFBOption == AUTO_FB_NONE) {
693 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
694 //Get SignalField,ServiceField,Length
695 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
696 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
698 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
699 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
700 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
702 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
703 //Get Duration and TimeStamp
704 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
705 byPktType, wCurrentRate, bNeedAck, uFragIdx,
706 cbLastFragmentSize, uMACfragNum,
707 byFBOption)); //1: 2.4GHz
708 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
709 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
710 bNeedAck, uFragIdx, cbLastFragmentSize,
711 uMACfragNum, byFBOption)); //1: 2.4
713 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
714 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
716 return pBuf->wDuration_a;
719 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
720 //Get SignalField,ServiceField,Length
721 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
722 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
724 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
725 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
726 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
728 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
729 //Get Duration and TimeStamp
730 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
731 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
732 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
733 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
734 pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
735 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
736 pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
737 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
739 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
740 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
742 return pBuf->wDuration_a;
743 } //if (byFBOption == AUTO_FB_NONE)
744 } else if (byPktType == PK_TYPE_11A) {
745 if ((byFBOption != AUTO_FB_NONE)) {
747 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
748 //Get SignalField,ServiceField,Length
749 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
750 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
752 pBuf->wTransmitLength = cpu_to_le16(wLen);
753 //Get Duration and TimeStampOff
755 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
756 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
757 pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
758 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
759 pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
760 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
761 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
762 return pBuf->wDuration;
764 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
765 //Get SignalField,ServiceField,Length
766 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
767 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
769 pBuf->wTransmitLength = cpu_to_le16(wLen);
770 //Get Duration and TimeStampOff
772 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
773 wCurrentRate, bNeedAck, uFragIdx,
774 cbLastFragmentSize, uMACfragNum,
777 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
778 return pBuf->wDuration;
781 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
782 //Get SignalField,ServiceField,Length
783 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
784 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
786 pBuf->wTransmitLength = cpu_to_le16(wLen);
787 //Get Duration and TimeStampOff
788 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
789 wCurrentRate, bNeedAck, uFragIdx,
790 cbLastFragmentSize, uMACfragNum,
792 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
793 return pBuf->wDuration;
802 unsigned char byPktType,
804 unsigned int cbFrameLength,
807 PSEthernetHeader psEthHeader,
808 unsigned short wCurrentRate,
809 unsigned char byFBOption
812 unsigned int uRTSFrameLen = 20;
813 unsigned short wLen = 0x0000;
819 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
820 // in this case we need to decrease its length by 4.
824 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
825 // Otherwise, we need to modify codes for them.
826 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
827 if (byFBOption == AUTO_FB_NONE) {
828 PSRTS_g pBuf = (PSRTS_g)pvRTS;
829 //Get SignalField,ServiceField,Length
830 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
831 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
833 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
834 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
835 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
837 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
839 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
840 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
841 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
843 pBuf->Data.wDurationID = pBuf->wDuration_aa;
845 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
846 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
847 (pDevice->eOPMode == OP_MODE_AP)) {
848 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
850 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
852 if (pDevice->eOPMode == OP_MODE_AP) {
853 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
855 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
858 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
859 //Get SignalField,ServiceField,Length
860 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
861 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
863 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
864 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
865 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
867 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
870 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
871 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
872 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
873 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
874 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
875 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
876 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
877 pBuf->Data.wDurationID = pBuf->wDuration_aa;
879 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
881 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
882 (pDevice->eOPMode == OP_MODE_AP)) {
883 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
885 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
888 if (pDevice->eOPMode == OP_MODE_AP) {
889 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
891 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
894 } // if (byFBOption == AUTO_FB_NONE)
895 } else if (byPktType == PK_TYPE_11A) {
896 if (byFBOption == AUTO_FB_NONE) {
897 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
898 //Get SignalField,ServiceField,Length
899 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
900 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
902 pBuf->wTransmitLength = cpu_to_le16(wLen);
904 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
905 pBuf->Data.wDurationID = pBuf->wDuration;
907 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
909 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
910 (pDevice->eOPMode == OP_MODE_AP)) {
911 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
913 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
916 if (pDevice->eOPMode == OP_MODE_AP) {
917 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
919 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
923 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
924 //Get SignalField,ServiceField,Length
925 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
926 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
928 pBuf->wTransmitLength = cpu_to_le16(wLen);
930 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
931 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
932 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:
933 pBuf->Data.wDurationID = pBuf->wDuration;
935 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
937 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
938 (pDevice->eOPMode == OP_MODE_AP)) {
939 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
941 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
943 if (pDevice->eOPMode == OP_MODE_AP) {
944 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
946 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
949 } else if (byPktType == PK_TYPE_11B) {
950 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
951 //Get SignalField,ServiceField,Length
952 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
953 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
955 pBuf->wTransmitLength = cpu_to_le16(wLen);
957 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
958 pBuf->Data.wDurationID = pBuf->wDuration;
960 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
962 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
963 (pDevice->eOPMode == OP_MODE_AP)) {
964 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
966 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
969 if (pDevice->eOPMode == OP_MODE_AP) {
970 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
972 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
981 unsigned int uDMAIdx,
982 unsigned char byPktType,
984 unsigned int cbFrameLength,
987 unsigned short wCurrentRate,
988 unsigned char byFBOption
991 unsigned int uCTSFrameLen = 14;
992 unsigned short wLen = 0x0000;
999 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1000 // in this case we need to decrease its length by 4.
1004 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1005 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1007 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1008 //Get SignalField,ServiceField,Length
1009 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1010 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1013 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1015 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
1016 pBuf->wDuration_ba += pDevice->wCTSDuration;
1017 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1018 //Get CTSDuration_ba_f0
1019 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
1020 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1021 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1022 //Get CTSDuration_ba_f1
1023 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
1024 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1025 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1026 //Get CTS Frame body
1027 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1028 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1029 pBuf->Data.wReserved = 0x0000;
1030 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1032 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1033 PSCTS pBuf = (PSCTS)pvCTS;
1034 //Get SignalField,ServiceField,Length
1035 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1036 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1038 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1039 //Get CTSDuration_ba
1040 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
1041 pBuf->wDuration_ba += pDevice->wCTSDuration;
1042 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1044 //Get CTS Frame body
1045 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1046 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1047 pBuf->Data.wReserved = 0x0000;
1048 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1056 * Generate FIFO control for MAC & Baseband controller
1060 * pDevice - Pointer to adapter
1061 * pTxDataHead - Transmit Data Buffer
1062 * pTxBufHead - pTxBufHead
1063 * pvRrvTime - pvRrvTime
1064 * pvRTS - RTS Buffer
1066 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1067 * bNeedACK - If need ACK
1068 * uDescIdx - Desc Index
1072 * Return Value: none
1075 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1078 s_vGenerateTxParameter(
1080 unsigned char byPktType,
1085 unsigned int cbFrameSize,
1087 unsigned int uDMAIdx,
1088 PSEthernetHeader psEthHeader,
1089 unsigned short wCurrentRate
1092 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1093 unsigned short wFifoCtl;
1094 bool bDisCRC = false;
1095 unsigned char byFBOption = AUTO_FB_NONE;
1096 // unsigned short wCurrentRate = pDevice->wCurrentRate;
1098 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vGenerateTxParameter...\n");
1099 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1100 pFifoHead->wReserved = wCurrentRate;
1101 wFifoCtl = pFifoHead->wFIFOCtl;
1103 if (wFifoCtl & FIFOCTL_CRCDIS) {
1107 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1108 byFBOption = AUTO_FB_0;
1109 } else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1110 byFBOption = AUTO_FB_1;
1113 if (pDevice->bLongHeader)
1114 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1116 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1117 if (pvRTS != NULL) { //RTS_need
1120 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1121 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1122 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1123 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1124 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1125 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1128 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1129 } else {//RTS_needless, PCF mode
1133 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1134 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1135 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1136 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1140 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1142 } else if (byPktType == PK_TYPE_11A) {
1143 if (pvRTS != NULL) {//RTS_need, non PCF mode
1146 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1147 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1148 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1151 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1152 } else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1155 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1156 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1159 } else if (byPktType == PK_TYPE_11B) {
1160 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1163 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1164 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1165 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1168 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1169 } else { //RTS_needless, non PCF mode
1172 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1173 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1177 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vGenerateTxParameter END.\n");
1180 unsigned char *pbyBuffer,//point to pTxBufHead
1181 unsigned short wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1182 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1186 s_vFillFragParameter(
1188 unsigned char *pbyBuffer,
1189 unsigned int uTxType,
1191 unsigned short wFragType,
1192 unsigned int cbReqCount
1195 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1196 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vFillFragParameter...\n");
1198 if (uTxType == TYPE_SYNCDMA) {
1199 //PSTxSyncDesc ptdCurr = (PSTxSyncDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1200 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1202 //Set FIFOCtl & TimeStamp in TxSyncDesc
1203 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1204 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1205 //Set TSR1 & ReqCount in TxDescHead
1206 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1207 if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1208 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1210 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1213 //PSTxDesc ptdCurr = (PSTxDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1214 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1215 //Set TSR1 & ReqCount in TxDescHead
1216 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1217 if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1218 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1220 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1224 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1226 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vFillFragParameter END\n");
1230 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
1231 unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
1232 PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
1233 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum)
1235 unsigned int cbMACHdLen;
1236 unsigned int cbFrameSize;
1237 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1238 unsigned int cbFragPayloadSize;
1239 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1240 unsigned int cbLastFragPayloadSize;
1241 unsigned int uFragIdx;
1242 unsigned char *pbyPayloadHead;
1243 unsigned char *pbyIVHead;
1244 unsigned char *pbyMacHdr;
1245 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1246 unsigned int uDuration;
1247 unsigned char *pbyBuffer;
1248 // unsigned int uKeyEntryIdx = NUM_KEY_ENTRY+1;
1249 // unsigned char byKeySel = 0xFF;
1250 unsigned int cbIVlen = 0;
1251 unsigned int cbICVlen = 0;
1252 unsigned int cbMIClen = 0;
1253 unsigned int cbFCSlen = 4;
1254 unsigned int cb802_1_H_len = 0;
1255 unsigned int uLength = 0;
1256 unsigned int uTmpLen = 0;
1257 // unsigned char abyTmp[8];
1258 // unsigned long dwCRC;
1259 unsigned int cbMICHDR = 0;
1260 unsigned long dwMICKey0, dwMICKey1;
1261 unsigned long dwMIC_Priority;
1262 unsigned long *pdwMIC_L;
1263 unsigned long *pdwMIC_R;
1264 unsigned long dwSafeMIC_L, dwSafeMIC_R; //Fix "Last Frag Size" < "MIC length".
1265 bool bMIC2Frag = false;
1266 unsigned int uMICFragLen = 0;
1267 unsigned int uMACfragNum = 1;
1268 unsigned int uPadding = 0;
1269 unsigned int cbReqCount = 0;
1274 unsigned char *pbyType;
1276 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1277 // unsigned int tmpDescIdx;
1278 unsigned int cbHeaderLength = 0;
1280 PSMICHDRHead pMICHDR;
1284 unsigned short wTxBufSize; // FFinfo size
1285 unsigned int uTotalCopyLength = 0;
1286 unsigned char byFBOption = AUTO_FB_NONE;
1287 bool bIsWEP256 = false;
1288 PSMgmtObject pMgmt = pDevice->pMgmt;
1290 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1292 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_cbFillTxBufHead...\n");
1293 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1294 (pDevice->eOPMode == OP_MODE_AP)) {
1295 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1301 // MSDUs in Infra mode always need ACK
1306 if (pDevice->bLongHeader)
1307 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1309 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1311 if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1312 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1315 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
1319 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1320 cbIVlen = 8;//IV+ExtIV
1324 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1325 cbIVlen = 8;//RSN Header
1327 cbMICHDR = sizeof(SMICHDRHead);
1329 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1330 //MAC Header should be padding 0 to DW alignment.
1331 uPadding = 4 - (cbMACHdLen%4);
1336 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1338 if ((bNeedACK == false) ||
1339 (cbFrameSize < pDevice->wRTSThreshold) ||
1340 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1345 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1348 // Use for AUTO FALL BACK
1350 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
1351 byFBOption = AUTO_FB_0;
1352 } else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
1353 byFBOption = AUTO_FB_1;
1356 //////////////////////////////////////////////////////
1357 //Set RrvTime/RTS/CTS Buffer
1358 wTxBufSize = sizeof(STxBufHead);
1359 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1361 if (byFBOption == AUTO_FB_NONE) {
1362 if (bRTS == true) {//RTS_need
1363 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1364 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1365 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1367 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1368 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1369 } else { //RTS_needless
1370 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1371 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1373 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1374 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1375 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1379 if (bRTS == true) {//RTS_need
1380 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1381 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1382 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1384 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1385 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1386 } else { //RTS_needless
1387 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1388 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1390 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1391 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1392 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1395 } else {//802.11a/b packet
1397 if (byFBOption == AUTO_FB_NONE) {
1399 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1400 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1401 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1403 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1404 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1405 } else { //RTS_needless, need MICHDR
1406 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1407 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1410 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1411 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1415 if (bRTS == true) {//RTS_need
1416 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1417 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1418 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1420 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1421 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1422 } else { //RTS_needless
1423 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1424 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1427 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1428 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1432 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1434 //////////////////////////////////////////////////////////////////
1435 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1436 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1437 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1438 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1439 } else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1440 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1441 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1443 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[24]);
1444 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[28]);
1446 // DO Software Michael
1447 MIC_vInit(dwMICKey0, dwMICKey1);
1448 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1450 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1451 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1454 ///////////////////////////////////////////////////////////////////
1456 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1457 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1458 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1460 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1462 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1463 cbFragmentSize = pDevice->wFragmentationThreshold;
1464 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1465 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1466 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1467 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1468 if (cbLastFragPayloadSize == 0) {
1469 cbLastFragPayloadSize = cbFragPayloadSize;
1473 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1474 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1476 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
1477 if (uFragIdx == 0) {
1478 //=========================
1479 // Start Fragmentation
1480 //=========================
1481 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Start Fragmentation...\n");
1482 wFragType = FRAGCTL_STAFRAG;
1484 //Fill FIFO,RrvTime,RTS,and CTS
1485 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1486 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1488 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1489 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1490 // Generate TX MAC Header
1491 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1492 wFragType, uDMAIdx, uFragIdx);
1494 if (bNeedEncrypt == true) {
1496 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1497 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1498 //Fill IV(ExtIV,RSNHDR)
1499 if (pDevice->bEnableHostWEP) {
1500 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1501 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1506 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1507 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1508 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1509 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1511 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1513 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1514 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1518 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1519 //---------------------------
1520 // S/W or H/W Encryption
1521 //---------------------------
1522 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1524 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1525 //copy TxBufferHeader + MacHeader to desc
1526 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1528 // Copy the Packet into a tx Buffer
1529 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1531 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1533 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1534 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Start MIC: %d\n", cbFragPayloadSize);
1535 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1539 //---------------------------
1541 //---------------------------
1542 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1544 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1545 cbReqCount += cbICVlen;
1549 ptdCurr = (PSTxDesc)pHeadTD;
1550 //--------------------
1551 //1.Set TSR1 & ReqCount in TxDescHead
1552 //2.Set FragCtl in TxBufferHead
1553 //3.Set Frame Control
1554 //4.Set Sequence Control
1555 //5.Get S/W generate FCS
1556 //--------------------
1557 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1559 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1560 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1561 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1562 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1563 pDevice->iTDUsed[uDMAIdx]++;
1564 pHeadTD = ptdCurr->next;
1565 } else if (uFragIdx == (uMACfragNum-1)) {
1566 //=========================
1567 // Last Fragmentation
1568 //=========================
1569 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last Fragmentation...\n");
1570 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1572 wFragType = FRAGCTL_ENDFRAG;
1574 //Fill FIFO,RrvTime,RTS,and CTS
1575 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1576 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1578 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1579 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1581 // Generate TX MAC Header
1582 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1583 wFragType, uDMAIdx, uFragIdx);
1585 if (bNeedEncrypt == true) {
1587 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1588 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1590 if (pDevice->bEnableHostWEP) {
1591 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1592 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1597 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1598 //---------------------------
1599 // S/W or H/W Encryption
1600 //---------------------------
1602 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1603 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1605 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1607 //copy TxBufferHeader + MacHeader to desc
1608 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1610 // Copy the Packet into a tx Buffer
1611 if (bMIC2Frag == false) {
1612 memcpy((pbyBuffer + uLength),
1613 (pPacket + 14 + uTotalCopyLength),
1614 (cbLastFragPayloadSize - cbMIClen)
1616 //TODO check uTmpLen !
1617 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1620 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1621 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1622 uMICFragLen, cbLastFragPayloadSize, uTmpLen);
1624 if (bMIC2Frag == false) {
1626 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1627 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1628 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1629 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1630 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1632 if (uMICFragLen >= 4) {
1633 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1634 (cbMIClen - uMICFragLen));
1635 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen >= 4: %X, %d\n",
1636 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1637 (cbMIClen - uMICFragLen));
1640 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1642 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1643 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen < 4: %X, %d\n",
1644 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1645 (cbMIClen - uMICFragLen));
1648 for (ii = 0; ii < cbLastFragPayloadSize + 8 + 24; ii++) {
1649 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii - 8 - 24)));
1651 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n\n");
1656 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1659 //---------------------------
1661 //---------------------------
1662 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1664 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1665 cbReqCount += cbICVlen;
1669 ptdCurr = (PSTxDesc)pHeadTD;
1671 //--------------------
1672 //1.Set TSR1 & ReqCount in TxDescHead
1673 //2.Set FragCtl in TxBufferHead
1674 //3.Set Frame Control
1675 //4.Set Sequence Control
1676 //5.Get S/W generate FCS
1677 //--------------------
1679 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1681 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1682 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1683 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1684 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1685 pDevice->iTDUsed[uDMAIdx]++;
1686 pHeadTD = ptdCurr->next;
1689 //=========================
1690 // Middle Fragmentation
1691 //=========================
1692 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Middle Fragmentation...\n");
1693 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1695 wFragType = FRAGCTL_MIDFRAG;
1697 //Fill FIFO,RrvTime,RTS,and CTS
1698 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1699 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1701 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1702 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1704 // Generate TX MAC Header
1705 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1706 wFragType, uDMAIdx, uFragIdx);
1708 if (bNeedEncrypt == true) {
1710 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1711 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1713 if (pDevice->bEnableHostWEP) {
1714 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1715 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1719 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1720 //---------------------------
1721 // S/W or H/W Encryption
1722 //---------------------------
1724 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1725 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1727 //copy TxBufferHeader + MacHeader to desc
1728 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1730 // Copy the Packet into a tx Buffer
1731 memcpy((pbyBuffer + uLength),
1732 (pPacket + 14 + uTotalCopyLength),
1735 uTmpLen = cbFragPayloadSize;
1737 uTotalCopyLength += uTmpLen;
1739 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1740 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1742 if (uTmpLen < cbFragPayloadSize) {
1744 uMICFragLen = cbFragPayloadSize - uTmpLen;
1745 ASSERT(uMICFragLen < cbMIClen);
1747 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1748 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1749 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1750 dwSafeMIC_L = *pdwMIC_L;
1751 dwSafeMIC_R = *pdwMIC_R;
1753 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1754 uMICFragLen, cbFragPayloadSize, uTmpLen);
1755 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Fill MIC in Middle frag [%d]\n", uMICFragLen);
1757 for (ii = 0; ii < uMICFragLen; ii++) {
1758 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength + uTmpLen) + ii)));
1760 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
1762 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1764 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Middle frag len: %d\n", uTmpLen);
1766 for (ii = 0; ii < uTmpLen; ii++) {
1767 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
1769 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n\n");
1773 ASSERT(uTmpLen == (cbFragPayloadSize));
1776 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1778 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1779 cbReqCount += cbICVlen;
1783 ptdCurr = (PSTxDesc)pHeadTD;
1785 //--------------------
1786 //1.Set TSR1 & ReqCount in TxDescHead
1787 //2.Set FragCtl in TxBufferHead
1788 //3.Set Frame Control
1789 //4.Set Sequence Control
1790 //5.Get S/W generate FCS
1791 //--------------------
1793 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1795 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1796 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1797 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1798 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1799 pDevice->iTDUsed[uDMAIdx]++;
1800 pHeadTD = ptdCurr->next;
1802 } // for (uMACfragNum)
1804 //=========================
1806 //=========================
1807 //DBG_PRTGRP03(("No Fragmentation...\n"));
1808 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "No Fragmentation...\n");
1809 wFragType = FRAGCTL_NONFRAG;
1811 //Set FragCtl in TxBufferHead
1812 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1814 //Fill FIFO,RrvTime,RTS,and CTS
1815 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1816 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1818 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1819 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1821 // Generate TX MAC Header
1822 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1823 wFragType, uDMAIdx, 0);
1825 if (bNeedEncrypt == true) {
1827 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1828 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1830 if (pDevice->bEnableHostWEP) {
1831 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1832 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1837 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1838 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1839 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1840 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1842 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1844 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1845 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1849 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1850 //---------------------------
1851 // S/W or H/W Encryption
1852 //---------------------------
1853 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1854 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1856 //copy TxBufferHeader + MacHeader to desc
1857 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1859 // Copy the Packet into a tx Buffer
1860 memcpy((pbyBuffer + uLength),
1862 cbFrameBodySize - cb802_1_H_len
1865 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1866 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Length:%d, %d\n", cbFrameBodySize - cb802_1_H_len, uLength);
1868 for (ii = 0; ii < (cbFrameBodySize - cb802_1_H_len); ii++) {
1869 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
1871 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
1874 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
1876 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
1877 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
1879 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1882 if (pDevice->bTxMICFail == true) {
1885 pDevice->bTxMICFail = false;
1888 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "uLength: %d, %d\n", uLength, cbFrameBodySize);
1889 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1890 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
1892 for (ii = 0; ii < 8; ii++) {
1893 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *(((unsigned char *)(pdwMIC_L) + ii)));
1895 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
1900 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1902 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
1903 (unsigned short)(cbFrameBodySize + cbMIClen));
1904 cbReqCount += cbICVlen;
1908 ptdCurr = (PSTxDesc)pHeadTD;
1910 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1911 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1912 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1913 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1914 //Set TSR1 & ReqCount in TxDescHead
1915 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1916 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1918 pDevice->iTDUsed[uDMAIdx]++;
1920 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ptdCurr->m_dwReserved0[%d] ptdCurr->m_dwReserved1[%d].\n", ptdCurr->pTDInfo->dwReqCount, ptdCurr->pTDInfo->dwHeaderLength);
1921 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " cbHeaderLength[%d]\n", cbHeaderLength);
1924 *puMACfragNum = uMACfragNum;
1925 //DBG_PRTGRP03(("s_cbFillTxBufHead END\n"));
1926 return cbHeaderLength;
1930 vGenerateFIFOHeader(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
1931 bool bNeedEncrypt, unsigned int cbPayloadSize, unsigned int uDMAIdx,
1932 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
1933 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
1934 unsigned int *pcbHeaderSize)
1936 unsigned int wTxBufSize; // FFinfo size
1939 unsigned short cbMacHdLen;
1940 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1942 wTxBufSize = sizeof(STxBufHead);
1944 memset(pTxBufHead, 0, wTxBufSize);
1945 //Set FIFOCTL_NEEDACK
1947 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1948 (pDevice->eOPMode == OP_MODE_AP)) {
1949 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
1951 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1954 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1958 // MSDUs in Infra mode always need ACK
1960 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1964 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
1965 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
1968 if (pDevice->bLongHeader)
1969 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1971 //Set FIFOCTL_GENINT
1973 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
1975 //Set FIFOCTL_ISDMA0
1976 if (TYPE_TXDMA0 == uDMAIdx) {
1977 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
1980 //Set FRAGCTL_MACHDCNT
1981 if (pDevice->bLongHeader) {
1982 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
1984 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
1986 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
1989 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
1991 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
1992 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
1993 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
1994 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
1995 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
1996 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
1998 //Set FIFOCTL_GrpAckPolicy
1999 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2000 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2003 //Set Auto Fallback Ctl
2004 if (pDevice->wCurrentRate >= RATE_18M) {
2005 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
2006 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
2007 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
2008 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
2012 //Set FRAGCTL_WEPTYP
2013 pDevice->bAES = false;
2015 //Set FRAGCTL_WEPTYP
2016 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
2017 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
2018 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2019 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2020 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
2021 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
2022 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2023 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
2024 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2030 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
2032 pTxBufHead->byTxPower = pDevice->byCurPwr;
2035 if (pDevice->bEnableHostWEP)
2036 pTxBufHead->wFragCtl &= ~(FRAGCTL_TKIP | FRAGCTL_LEGACY |FRAGCTL_AES);
2038 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
2039 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
2040 pTransmitKey, uNodeIndex, puMACfragNum);
2048 * Translate 802.3 to 802.11 header
2052 * pDevice - Pointer to adapter
2053 * dwTxBufferAddr - Transmit Buffer
2054 * pPacket - Packet from upper layer
2055 * cbPacketSize - Transmit Data Length
2057 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
2058 * pcbAppendPayload - size of append payload for 802.1H translation
2060 * Return Value: none
2067 unsigned char *pbyBufferAddr,
2068 unsigned short wDuration,
2069 PSEthernetHeader psEthHeader,
2071 unsigned short wFragType,
2072 unsigned int uDMAIdx,
2073 unsigned int uFragIdx
2076 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
2078 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
2080 if (uDMAIdx == TYPE_ATIMDMA) {
2081 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2083 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2086 if (pDevice->eOPMode == OP_MODE_AP) {
2087 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2088 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2089 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2090 pMACHeader->wFrameCtl |= FC_FROMDS;
2092 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2093 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2094 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2095 memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2097 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2098 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2099 memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2100 pMACHeader->wFrameCtl |= FC_TODS;
2105 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2107 pMACHeader->wDurationID = cpu_to_le16(wDuration);
2109 if (pDevice->bLongHeader) {
2110 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2111 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2112 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2114 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2116 //Set FragNumber in Sequence Control
2117 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2119 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2120 pDevice->wSeqCounter++;
2121 if (pDevice->wSeqCounter > 0x0fff)
2122 pDevice->wSeqCounter = 0;
2125 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
2126 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2130 CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2132 unsigned char byPktType;
2133 unsigned char *pbyTxBufferAddr;
2137 unsigned int uDuration;
2138 unsigned int cbReqCount;
2139 PS802_11Header pMACHeader;
2140 unsigned int cbHeaderSize;
2141 unsigned int cbFrameBodySize;
2143 bool bIsPSPOLL = false;
2144 PSTxBufHead pTxBufHead;
2145 unsigned int cbFrameSize;
2146 unsigned int cbIVlen = 0;
2147 unsigned int cbICVlen = 0;
2148 unsigned int cbMIClen = 0;
2149 unsigned int cbFCSlen = 4;
2150 unsigned int uPadding = 0;
2151 unsigned short wTxBufSize;
2152 unsigned int cbMacHdLen;
2153 SEthernetHeader sEthHeader;
2156 PSMgmtObject pMgmt = pDevice->pMgmt;
2157 unsigned short wCurrentRate = RATE_1M;
2159 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2160 return CMD_STATUS_RESOURCES;
2163 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2164 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2165 cbFrameBodySize = pPacket->cbPayloadLen;
2166 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2167 wTxBufSize = sizeof(STxBufHead);
2168 memset(pTxBufHead, 0, wTxBufSize);
2170 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2171 wCurrentRate = RATE_6M;
2172 byPktType = PK_TYPE_11A;
2174 wCurrentRate = RATE_1M;
2175 byPktType = PK_TYPE_11B;
2178 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2179 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2180 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2181 // to set power here.
2182 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2183 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2185 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2187 pTxBufHead->byTxPower = pDevice->byCurPwr;
2188 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2189 if (pDevice->byFOETuning) {
2190 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2191 wCurrentRate = RATE_24M;
2192 byPktType = PK_TYPE_11GA;
2197 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2198 pTxBufHead->wFIFOCtl = 0;
2199 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2200 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2201 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2202 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2203 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2204 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2207 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2208 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2210 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2214 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2217 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2218 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2219 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2222 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2224 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2226 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2228 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2231 //Set FRAGCTL_MACHDCNT
2232 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2235 // Although spec says MMPDU can be fragmented; In most cases,
2236 // no one will send a MMPDU under fragmentation. With RTS may occur.
2237 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2239 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2240 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2243 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2244 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2245 cbIVlen = 8;//IV+ExtIV
2248 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2249 //We need to get seed here for filling TxKey entry.
2250 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2251 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2252 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2253 cbIVlen = 8;//RSN Header
2255 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2256 pDevice->bAES = true;
2258 //MAC Header should be padding 0 to DW alignment.
2259 uPadding = 4 - (cbMacHdLen%4);
2263 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2265 //Set FIFOCTL_GrpAckPolicy
2266 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2267 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2269 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2271 //Set RrvTime/RTS/CTS Buffer
2272 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2274 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2277 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2278 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2279 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2280 } else { // 802.11a/b packet
2281 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2285 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2286 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2289 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2291 memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2292 memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2293 //=========================
2295 //=========================
2296 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2298 //Fill FIFO,RrvTime,RTS,and CTS
2299 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2300 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2303 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2304 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2306 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2308 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2310 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2311 unsigned char *pbyIVHead;
2312 unsigned char *pbyPayloadHead;
2313 unsigned char *pbyBSSID;
2314 PSKeyItem pTransmitKey = NULL;
2316 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2317 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2320 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2321 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2323 //Fill IV(ExtIV,RSNHDR)
2324 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2325 //---------------------------
2326 // S/W or H/W Encryption
2327 //---------------------------
2329 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2330 (pDevice->bLinkPass == true)) {
2331 pbyBSSID = pDevice->abyBSSID;
2333 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2335 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2336 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get GTK.\n");
2340 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get PTK.\n");
2345 pbyBSSID = pDevice->abyBroadcastAddr;
2346 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2347 pTransmitKey = NULL;
2348 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2350 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get GTK.\n");
2354 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2355 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2357 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2358 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2361 // Copy the Packet into a tx Buffer
2362 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2365 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2366 pDevice->wSeqCounter++;
2367 if (pDevice->wSeqCounter > 0x0fff)
2368 pDevice->wSeqCounter = 0;
2371 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2372 // of FIFO control header.
2373 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2374 // in the same place of other packet's Duration-field).
2375 // And it will cause Cisco-AP to issue Disassociation-packet
2376 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2377 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2378 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2380 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2384 // first TD is the only TD
2385 //Set TSR1 & ReqCount in TxDescHead
2386 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2387 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2388 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2389 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2390 pFrstTD->pTDInfo->byFlags = 0;
2392 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2394 MACbPSWakeup(pDevice->PortOffset);
2396 pDevice->bPWBitOn = false;
2399 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2402 pDevice->iTDUsed[TYPE_TXDMA0]++;
2404 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
2405 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2408 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2411 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2414 // Poll Transmit the adapter
2415 MACvTransmit0(pDevice->PortOffset);
2417 return CMD_STATUS_PENDING;
2420 CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2421 unsigned char byPktType;
2422 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2423 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2424 unsigned int cbHeaderSize = 0;
2425 unsigned short wTxBufSize = sizeof(STxShortBufHead);
2426 PSTxShortBufHead pTxBufHead = (PSTxShortBufHead) pbyBuffer;
2427 PSTxDataHead_ab pTxDataHead = (PSTxDataHead_ab) (pbyBuffer + wTxBufSize);
2428 PS802_11Header pMACHeader;
2429 unsigned short wCurrentRate;
2430 unsigned short wLen = 0x0000;
2432 memset(pTxBufHead, 0, wTxBufSize);
2434 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2435 wCurrentRate = RATE_6M;
2436 byPktType = PK_TYPE_11A;
2438 wCurrentRate = RATE_2M;
2439 byPktType = PK_TYPE_11B;
2442 //Set Preamble type always long
2443 pDevice->byPreambleType = PREAMBLE_LONG;
2445 //Set FIFOCTL_GENINT
2447 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2449 //Set packet type & Get Duration
2450 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2451 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, byPktType,
2452 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2453 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2454 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2455 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, byPktType,
2456 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2459 BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, byPktType,
2460 (unsigned short *)&(wLen), (unsigned char *)&(pTxDataHead->byServiceField), (unsigned char *)&(pTxDataHead->bySignalField)
2462 pTxDataHead->wTransmitLength = cpu_to_le16(wLen);
2464 pTxDataHead->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
2465 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2467 //Generate Beacon Header
2468 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2469 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2471 pMACHeader->wDurationID = 0;
2472 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2473 pDevice->wSeqCounter++;
2474 if (pDevice->wSeqCounter > 0x0fff)
2475 pDevice->wSeqCounter = 0;
2477 // Set Beacon buffer length
2478 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2480 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2482 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2483 // Set auto Transmit on
2484 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2485 // Poll Transmit the adapter
2486 MACvTransmitBCN(pDevice->PortOffset);
2488 return CMD_STATUS_PENDING;
2494 PSKeyItem pTransmitKey,
2495 unsigned int cbFrameBodySize,
2496 PSEthernetHeader psEthHeader
2499 unsigned int cbMACHdLen;
2500 unsigned int cbFrameSize;
2501 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2502 unsigned int cbFragPayloadSize;
2503 unsigned int cbLastFragPayloadSize;
2504 unsigned int cbIVlen = 0;
2505 unsigned int cbICVlen = 0;
2506 unsigned int cbMIClen = 0;
2507 unsigned int cbFCSlen = 4;
2508 unsigned int uMACfragNum = 1;
2511 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2512 (pDevice->eOPMode == OP_MODE_AP)) {
2513 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2518 // MSDUs in Infra mode always need ACK
2522 if (pDevice->bLongHeader)
2523 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2525 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2527 if (pDevice->bEncryptionEnable == true) {
2528 if (pTransmitKey == NULL) {
2529 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2530 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2533 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2534 cbIVlen = 8;//IV+ExtIV
2537 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2538 cbIVlen = 8;//RSN Header
2541 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2544 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2545 cbIVlen = 8;//IV+ExtIV
2548 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2549 cbIVlen = 8;//RSN Header
2554 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2556 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2558 cbFragmentSize = pDevice->wFragmentationThreshold;
2559 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2560 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2561 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2562 if (cbLastFragPayloadSize == 0) {
2563 cbLastFragPayloadSize = cbFragPayloadSize;
2572 vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb, unsigned char *pbMPDU, unsigned int cbMPDULen) {
2574 unsigned char byPktType;
2575 unsigned char *pbyTxBufferAddr;
2579 unsigned int uDuration;
2580 unsigned int cbReqCount;
2581 PS802_11Header pMACHeader;
2582 unsigned int cbHeaderSize;
2583 unsigned int cbFrameBodySize;
2585 bool bIsPSPOLL = false;
2586 PSTxBufHead pTxBufHead;
2587 unsigned int cbFrameSize;
2588 unsigned int cbIVlen = 0;
2589 unsigned int cbICVlen = 0;
2590 unsigned int cbMIClen = 0;
2591 unsigned int cbFCSlen = 4;
2592 unsigned int uPadding = 0;
2593 unsigned int cbMICHDR = 0;
2594 unsigned int uLength = 0;
2595 unsigned long dwMICKey0, dwMICKey1;
2596 unsigned long dwMIC_Priority;
2597 unsigned long *pdwMIC_L;
2598 unsigned long *pdwMIC_R;
2599 unsigned short wTxBufSize;
2600 unsigned int cbMacHdLen;
2601 SEthernetHeader sEthHeader;
2604 PSMgmtObject pMgmt = pDevice->pMgmt;
2605 unsigned short wCurrentRate = RATE_1M;
2606 PUWLAN_80211HDR p80211Header;
2607 unsigned int uNodeIndex = 0;
2608 bool bNodeExist = false;
2610 PSKeyItem pTransmitKey = NULL;
2611 unsigned char *pbyIVHead;
2612 unsigned char *pbyPayloadHead;
2613 unsigned char *pbyMacHdr;
2615 unsigned int cbExtSuppRate = 0;
2618 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2620 if (cbMPDULen <= WLAN_HDR_ADDR3_LEN) {
2621 cbFrameBodySize = 0;
2623 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2625 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2627 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2628 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2629 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2630 wTxBufSize = sizeof(STxBufHead);
2631 memset(pTxBufHead, 0, wTxBufSize);
2633 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2634 wCurrentRate = RATE_6M;
2635 byPktType = PK_TYPE_11A;
2637 wCurrentRate = RATE_1M;
2638 byPktType = PK_TYPE_11B;
2641 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2642 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2643 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2644 // to set power here.
2645 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2646 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2648 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2650 pTxBufHead->byTxPower = pDevice->byCurPwr;
2652 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2653 if (pDevice->byFOETuning) {
2654 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2655 wCurrentRate = RATE_24M;
2656 byPktType = PK_TYPE_11GA;
2660 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2663 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2664 pTxBufHead->wFIFOCtl = 0;
2665 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2666 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2667 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2668 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2669 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2670 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2673 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2674 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2676 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2678 if (pDevice->bEnableHostWEP) {
2683 if (pDevice->bEnableHostWEP) {
2684 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2688 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2691 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2692 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2693 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2696 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2698 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2700 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2702 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2705 // hostapd deamon ext support rate patch
2706 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2707 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2708 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2711 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2712 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2715 if (cbExtSuppRate > 0) {
2716 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2720 //Set FRAGCTL_MACHDCNT
2721 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2724 // Although spec says MMPDU can be fragmented; In most cases,
2725 // no one will send a MMPDU under fragmentation. With RTS may occur.
2726 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2728 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2729 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2732 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2733 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2734 cbIVlen = 8;//IV+ExtIV
2737 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2738 //We need to get seed here for filling TxKey entry.
2739 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2740 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2741 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2742 cbIVlen = 8;//RSN Header
2744 cbMICHDR = sizeof(SMICHDRHead);
2745 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2746 pDevice->bAES = true;
2748 //MAC Header should be padding 0 to DW alignment.
2749 uPadding = 4 - (cbMacHdLen%4);
2753 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2755 //Set FIFOCTL_GrpAckPolicy
2756 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2757 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2759 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2761 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2763 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2764 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2766 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2767 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2768 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2770 } else {//802.11a/b packet
2772 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2773 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2776 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2777 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2781 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2782 memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2783 memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2784 //=========================
2786 //=========================
2787 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2789 //Fill FIFO,RrvTime,RTS,and CTS
2790 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2791 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2794 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2795 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2797 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2799 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2801 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
2802 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2803 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
2805 // Copy the Packet into a tx Buffer
2806 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
2808 // version set to 0, patch for hostapd deamon
2809 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2810 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
2812 // replace support rate, patch for hostapd deamon(only support 11M)
2813 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2814 if (cbExtSuppRate != 0) {
2815 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2816 memcpy((pbyPayloadHead + cbFrameBodySize),
2817 pMgmt->abyCurrSuppRates,
2818 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2820 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2821 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2822 pMgmt->abyCurrExtSuppRates,
2823 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2829 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2830 if (pDevice->bEnableHostWEP) {
2831 pTransmitKey = &STempKey;
2832 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2833 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2834 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2835 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2836 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2837 memcpy(pTransmitKey->abyKey,
2838 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2839 pTransmitKey->uKeyLength
2843 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2844 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
2845 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
2847 // DO Software Michael
2848 MIC_vInit(dwMICKey0, dwMICKey1);
2849 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
2851 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
2852 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
2854 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2856 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2858 pdwMIC_L = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2859 pdwMIC_R = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2861 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2864 if (pDevice->bTxMICFail == true) {
2867 pDevice->bTxMICFail = false;
2870 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "uLength: %d, %d\n", uLength, cbFrameBodySize);
2871 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2872 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2876 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2877 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
2879 if (pDevice->bEnableHostWEP) {
2880 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2881 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2884 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2885 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
2889 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2890 pDevice->wSeqCounter++;
2891 if (pDevice->wSeqCounter > 0x0fff)
2892 pDevice->wSeqCounter = 0;
2895 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2896 // of FIFO control header.
2897 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2898 // in the same place of other packet's Duration-field).
2899 // And it will cause Cisco-AP to issue Disassociation-packet
2900 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2901 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2902 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2904 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2908 // first TD is the only TD
2909 //Set TSR1 & ReqCount in TxDescHead
2910 pFrstTD->pTDInfo->skb = skb;
2911 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2912 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2913 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
2914 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2915 pFrstTD->pTDInfo->byFlags = 0;
2916 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
2918 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2920 MACbPSWakeup(pDevice->PortOffset);
2922 pDevice->bPWBitOn = false;
2925 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2928 pDevice->iTDUsed[TYPE_TXDMA0]++;
2930 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
2931 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2934 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2936 // Poll Transmit the adapter
2937 MACvTransmit0(pDevice->PortOffset);