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 - Caculate fragment number count
31 * csBeacon_xmit - beacon tx function
32 * csMgmt_xmit - management tx function
33 * s_cbFillTxBufHead - fulfill tx dma buffer header
34 * s_uGetDataDuration - get tx data required duration
35 * s_uFillDataHead- fulfill tx data duration header
36 * s_uGetRTSCTSDuration- get rtx/cts required duration
37 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
38 * s_uGetTxRsvTime- get frame reserved time
39 * s_vFillCTSHead- fulfill CTS ctl header
40 * s_vFillFragParameter- Set fragment ctl parameter.
41 * s_vFillRTSHead- fulfill RTS ctl header
42 * s_vFillTxKey- fulfill tx encrypt key
43 * s_vSWencryption- Software encrypt header
44 * vDMA0_tx_80211- tx 802.11 frame via dma0
45 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
71 //static int msglevel =MSG_LEVEL_DEBUG;
72 static int msglevel =MSG_LEVEL_INFO;
77 /*--------------------- Static Functions --------------------------*/
79 /*--------------------- Static Definitions -------------------------*/
80 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
81 // packet size >= 256 -> direct send
83 const unsigned short wTimeStampOff[2][MAX_RATE] = {
84 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
85 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
88 const unsigned short wFB_Opt0[2][5] = {
89 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
90 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
92 const unsigned short wFB_Opt1[2][5] = {
93 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
94 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
102 #define RTSDUR_BA_F0 4
103 #define RTSDUR_AA_F0 5
104 #define RTSDUR_BA_F1 6
105 #define RTSDUR_AA_F1 7
106 #define CTSDUR_BA_F0 8
107 #define CTSDUR_BA_F1 9
110 #define DATADUR_A_F0 12
111 #define DATADUR_A_F1 13
113 /*--------------------- Static Functions --------------------------*/
121 unsigned char *pbyBuf,
122 unsigned char *pbyIVHead,
123 PSKeyItem pTransmitKey,
124 unsigned char *pbyHdrBuf,
125 unsigned short wPayloadLen,
126 unsigned char *pMICHDR
135 unsigned char byPktType,
137 unsigned int cbFrameLength,
140 PSEthernetHeader psEthHeader,
141 unsigned short wCurrentRate,
142 unsigned char byFBOption
147 s_vGenerateTxParameter(
149 unsigned char byPktType,
154 unsigned int cbFrameSize,
156 unsigned int uDMAIdx,
157 PSEthernetHeader psEthHeader,
158 unsigned short wCurrentRate
163 static void s_vFillFragParameter(
165 unsigned char *pbyBuffer,
166 unsigned int uTxType,
168 unsigned short wFragType,
169 unsigned int cbReqCount
174 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
175 unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
176 PSEthernetHeader psEthHeader, unsigned char *pPacket, BOOL bNeedEncrypt,
177 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum);
184 unsigned char byPktType,
186 unsigned int cbFrameLength,
187 unsigned int uDMAIdx,
189 unsigned int uFragIdx,
190 unsigned int cbLastFragmentSize,
191 unsigned int uMACfragNum,
192 unsigned char byFBOption,
193 unsigned short wCurrentRate
197 /*--------------------- Export Variables --------------------------*/
205 unsigned char *pbyBuf,
206 unsigned char *pbyIVHead,
207 PSKeyItem pTransmitKey,
208 unsigned char *pbyHdrBuf,
209 unsigned short wPayloadLen,
210 unsigned char *pMICHDR
213 unsigned long *pdwIV = (unsigned long *) pbyIVHead;
214 unsigned long *pdwExtIV = (unsigned long *) ((unsigned char *)pbyIVHead+4);
215 unsigned short wValue;
216 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
217 unsigned long dwRevIVCounter;
218 unsigned char byKeyIndex = 0;
223 if (pTransmitKey == NULL)
226 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
227 *pdwIV = pDevice->dwIVCounter;
228 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
230 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
231 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
232 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
233 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
235 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
236 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
237 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
238 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
239 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
241 memcpy(pDevice->abyPRNG, pbyBuf, 16);
243 // Append IV after Mac Header
244 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
245 *pdwIV |= (byKeyIndex << 30);
246 *pdwIV = cpu_to_le32(*pdwIV);
247 pDevice->dwIVCounter++;
248 if (pDevice->dwIVCounter > WEP_IV_MASK) {
249 pDevice->dwIVCounter = 0;
251 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
252 pTransmitKey->wTSC15_0++;
253 if (pTransmitKey->wTSC15_0 == 0) {
254 pTransmitKey->dwTSC47_16++;
256 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
257 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
258 memcpy(pbyBuf, pDevice->abyPRNG, 16);
260 memcpy(pdwIV, pDevice->abyPRNG, 3);
262 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
263 // Append IV&ExtIV after Mac Header
264 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
265 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
267 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
268 pTransmitKey->wTSC15_0++;
269 if (pTransmitKey->wTSC15_0 == 0) {
270 pTransmitKey->dwTSC47_16++;
272 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
276 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
277 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
278 //Append IV&ExtIV after Mac Header
279 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
283 *((unsigned char *)(pMICHDR+1)) = 0; // TxPriority
284 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
285 *((unsigned char *)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
286 *((unsigned char *)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
287 *((unsigned char *)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
288 *((unsigned char *)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
289 *((unsigned char *)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
290 *((unsigned char *)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
291 *((unsigned char *)(pMICHDR+14)) = HIBYTE(wPayloadLen);
292 *((unsigned char *)(pMICHDR+15)) = LOBYTE(wPayloadLen);
295 *((unsigned char *)(pMICHDR+16)) = 0; // HLEN[15:8]
296 if (pDevice->bLongHeader) {
297 *((unsigned char *)(pMICHDR+17)) = 28; // HLEN[7:0]
299 *((unsigned char *)(pMICHDR+17)) = 22; // HLEN[7:0]
301 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
302 memcpy(pMICHDR+18, (unsigned char *)&wValue, 2); // MSKFRACTL
303 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
304 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
307 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
308 wValue = pMACHeader->wSeqCtl;
310 wValue = cpu_to_le16(wValue);
311 memcpy(pMICHDR+38, (unsigned char *)&wValue, 2); // MSKSEQCTL
312 if (pDevice->bLongHeader) {
313 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
323 PSKeyItem pTransmitKey,
324 unsigned char *pbyPayloadHead,
325 unsigned short wPayloadSize
328 unsigned int cbICVlen = 4;
329 unsigned long dwICV = 0xFFFFFFFFL;
330 unsigned long *pdwICV;
332 if (pTransmitKey == NULL)
335 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
336 //=======================================================================
337 // Append ICV after payload
338 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
339 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
340 // finally, we must invert dwCRC to get the correct answer
341 *pdwICV = cpu_to_le32(~dwICV);
343 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
344 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
345 //=======================================================================
346 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
347 //=======================================================================
348 //Append ICV after payload
349 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
350 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
351 // finally, we must invert dwCRC to get the correct answer
352 *pdwICV = cpu_to_le32(~dwICV);
354 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
355 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
356 //=======================================================================
363 /*byPktType : PK_TYPE_11A 0
372 unsigned char byPktType,
373 unsigned int cbFrameLength,
374 unsigned short wRate,
378 unsigned int uDataTime, uAckTime;
380 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
382 //printk("s_uGetTxRsvTime is %d\n",uDataTime);
384 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
385 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
386 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
387 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
391 return (uDataTime + pDevice->uSIFS + uAckTime);
398 //byFreqType: 0=>5GHZ 1=>2.4GHZ
401 s_uGetRTSCTSRsvTime (
403 unsigned char byRTSRsvType,
404 unsigned char byPktType,
405 unsigned int cbFrameLength,
406 unsigned short wCurrentRate
409 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
411 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
414 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
415 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
416 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
417 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
419 else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
420 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
421 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
422 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
424 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
425 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
426 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
428 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
429 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
430 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
431 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
436 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
440 //byFreqType 0: 5GHz, 1:2.4Ghz
445 unsigned char byDurType,
446 unsigned int cbFrameLength,
447 unsigned char byPktType,
448 unsigned short wRate,
450 unsigned int uFragIdx,
451 unsigned int cbLastFragmentSize,
452 unsigned int uMACfragNum,
453 unsigned char byFBOption
457 unsigned int uAckTime =0, uNextPktTime = 0;
461 if (uFragIdx == (uMACfragNum-1)) {
468 case DATADUR_B: //DATADUR_B
469 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
471 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
472 return (pDevice->uSIFS + uAckTime);
477 else {//First Frag or Mid Frag
478 if (uFragIdx == (uMACfragNum-2)) {
479 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
481 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
484 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
485 return (pDevice->uSIFS + uAckTime + uNextPktTime);
487 return (pDevice->uSIFS + uNextPktTime);
492 case DATADUR_A: //DATADUR_A
493 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
495 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
496 return (pDevice->uSIFS + uAckTime);
501 else {//First Frag or Mid Frag
502 if(uFragIdx == (uMACfragNum-2)){
503 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
505 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
508 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
509 return (pDevice->uSIFS + uAckTime + uNextPktTime);
511 return (pDevice->uSIFS + uNextPktTime);
516 case DATADUR_A_F0: //DATADUR_A_F0
517 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
519 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
520 return (pDevice->uSIFS + uAckTime);
525 else { //First Frag or Mid Frag
526 if (byFBOption == AUTO_FB_0) {
527 if (wRate < RATE_18M)
529 else if (wRate > RATE_54M)
532 if(uFragIdx == (uMACfragNum-2)){
533 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
535 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
537 } else { // (byFBOption == AUTO_FB_1)
538 if (wRate < RATE_18M)
540 else if (wRate > RATE_54M)
543 if(uFragIdx == (uMACfragNum-2)){
544 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
546 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
551 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
552 return (pDevice->uSIFS + uAckTime + uNextPktTime);
554 return (pDevice->uSIFS + uNextPktTime);
559 case DATADUR_A_F1: //DATADUR_A_F1
560 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
562 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
563 return (pDevice->uSIFS + uAckTime);
568 else { //First Frag or Mid Frag
569 if (byFBOption == AUTO_FB_0) {
570 if (wRate < RATE_18M)
572 else if (wRate > RATE_54M)
575 if(uFragIdx == (uMACfragNum-2)){
576 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
578 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
581 } else { // (byFBOption == AUTO_FB_1)
582 if (wRate < RATE_18M)
584 else if (wRate > RATE_54M)
587 if(uFragIdx == (uMACfragNum-2)){
588 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
590 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
594 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
595 return (pDevice->uSIFS + uAckTime + uNextPktTime);
597 return (pDevice->uSIFS + uNextPktTime);
611 //byFreqType: 0=>5GHZ 1=>2.4GHZ
614 s_uGetRTSCTSDuration (
616 unsigned char byDurType,
617 unsigned int cbFrameLength,
618 unsigned char byPktType,
619 unsigned short wRate,
621 unsigned char byFBOption
624 unsigned int uCTSTime = 0, uDurTime = 0;
629 case RTSDUR_BB: //RTSDuration_bb
630 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
631 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
634 case RTSDUR_BA: //RTSDuration_ba
635 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
636 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
639 case RTSDUR_AA: //RTSDuration_aa
640 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
641 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
644 case CTSDUR_BA: //CTSDuration_ba
645 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
648 case RTSDUR_BA_F0: //RTSDuration_ba_f0
649 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
650 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
651 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
652 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
653 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
657 case RTSDUR_AA_F0: //RTSDuration_aa_f0
658 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
659 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
660 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
661 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
662 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
666 case RTSDUR_BA_F1: //RTSDuration_ba_f1
667 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
668 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
669 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
670 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
671 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
675 case RTSDUR_AA_F1: //RTSDuration_aa_f1
676 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
677 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
678 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
679 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
680 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
684 case CTSDUR_BA_F0: //CTSDuration_ba_f0
685 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
686 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
687 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
688 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
692 case CTSDUR_BA_F1: //CTSDuration_ba_f1
693 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
694 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
695 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
696 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
714 unsigned char byPktType,
716 unsigned int cbFrameLength,
717 unsigned int uDMAIdx,
719 unsigned int uFragIdx,
720 unsigned int cbLastFragmentSize,
721 unsigned int uMACfragNum,
722 unsigned char byFBOption,
723 unsigned short wCurrentRate
726 unsigned short wLen = 0x0000;
728 if (pTxDataHead == NULL) {
732 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
733 if (byFBOption == AUTO_FB_NONE) {
734 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
735 //Get SignalField,ServiceField,Length
736 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
737 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
739 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
740 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
741 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
743 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
744 //Get Duration and TimeStamp
745 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
746 byPktType, wCurrentRate, bNeedAck, uFragIdx,
747 cbLastFragmentSize, uMACfragNum,
748 byFBOption)); //1: 2.4GHz
749 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
750 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
751 bNeedAck, uFragIdx, cbLastFragmentSize,
752 uMACfragNum, byFBOption)); //1: 2.4
754 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
755 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
757 return (pBuf->wDuration_a);
760 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
761 //Get SignalField,ServiceField,Length
762 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
763 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
765 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
766 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
767 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
769 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
770 //Get Duration and TimeStamp
771 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
772 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
773 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
774 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
775 pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
776 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
777 pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
778 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
780 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
781 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
783 return (pBuf->wDuration_a);
784 } //if (byFBOption == AUTO_FB_NONE)
786 else if (byPktType == PK_TYPE_11A) {
787 if ((byFBOption != AUTO_FB_NONE)) {
789 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
790 //Get SignalField,ServiceField,Length
791 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
792 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
794 pBuf->wTransmitLength = cpu_to_le16(wLen);
795 //Get Duration and TimeStampOff
797 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
798 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
799 pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
800 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
801 pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
802 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
803 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
804 return (pBuf->wDuration);
806 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
807 //Get SignalField,ServiceField,Length
808 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
809 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
811 pBuf->wTransmitLength = cpu_to_le16(wLen);
812 //Get Duration and TimeStampOff
814 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
815 wCurrentRate, bNeedAck, uFragIdx,
816 cbLastFragmentSize, uMACfragNum,
819 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
820 return (pBuf->wDuration);
824 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
825 //Get SignalField,ServiceField,Length
826 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
827 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
829 pBuf->wTransmitLength = cpu_to_le16(wLen);
830 //Get Duration and TimeStampOff
831 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
832 wCurrentRate, bNeedAck, uFragIdx,
833 cbLastFragmentSize, uMACfragNum,
835 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
836 return (pBuf->wDuration);
846 unsigned char byPktType,
848 unsigned int cbFrameLength,
851 PSEthernetHeader psEthHeader,
852 unsigned short wCurrentRate,
853 unsigned char byFBOption
856 unsigned int uRTSFrameLen = 20;
857 unsigned short wLen = 0x0000;
863 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
864 // in this case we need to decrease its length by 4.
868 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
869 // Otherwise, we need to modify codes for them.
870 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
871 if (byFBOption == AUTO_FB_NONE) {
872 PSRTS_g pBuf = (PSRTS_g)pvRTS;
873 //Get SignalField,ServiceField,Length
874 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
875 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
877 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
878 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
879 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
881 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
883 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
884 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
885 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
887 pBuf->Data.wDurationID = pBuf->wDuration_aa;
889 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
890 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
891 (pDevice->eOPMode == OP_MODE_AP)) {
892 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
895 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
897 if (pDevice->eOPMode == OP_MODE_AP) {
898 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
901 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
905 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
906 //Get SignalField,ServiceField,Length
907 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
908 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
910 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
911 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
912 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
914 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
917 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
918 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
919 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
920 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
921 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
922 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
923 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
924 pBuf->Data.wDurationID = pBuf->wDuration_aa;
926 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
928 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
929 (pDevice->eOPMode == OP_MODE_AP)) {
930 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
933 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
936 if (pDevice->eOPMode == OP_MODE_AP) {
937 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
940 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
943 } // if (byFBOption == AUTO_FB_NONE)
945 else if (byPktType == PK_TYPE_11A) {
946 if (byFBOption == AUTO_FB_NONE) {
947 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
948 //Get SignalField,ServiceField,Length
949 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
950 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
952 pBuf->wTransmitLength = cpu_to_le16(wLen);
954 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
955 pBuf->Data.wDurationID = pBuf->wDuration;
957 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
959 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
960 (pDevice->eOPMode == OP_MODE_AP)) {
961 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
964 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
967 if (pDevice->eOPMode == OP_MODE_AP) {
968 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
971 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
976 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
977 //Get SignalField,ServiceField,Length
978 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
979 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
981 pBuf->wTransmitLength = cpu_to_le16(wLen);
983 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
984 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
985 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:
986 pBuf->Data.wDurationID = pBuf->wDuration;
988 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
990 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
991 (pDevice->eOPMode == OP_MODE_AP)) {
992 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
995 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
997 if (pDevice->eOPMode == OP_MODE_AP) {
998 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1001 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
1005 else if (byPktType == PK_TYPE_11B) {
1006 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1007 //Get SignalField,ServiceField,Length
1008 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1009 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
1011 pBuf->wTransmitLength = cpu_to_le16(wLen);
1013 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
1014 pBuf->Data.wDurationID = pBuf->wDuration;
1015 //Get RTS Frame body
1016 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1019 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1020 (pDevice->eOPMode == OP_MODE_AP)) {
1021 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
1024 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1027 if (pDevice->eOPMode == OP_MODE_AP) {
1028 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1031 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
1040 unsigned int uDMAIdx,
1041 unsigned char byPktType,
1043 unsigned int cbFrameLength,
1046 unsigned short wCurrentRate,
1047 unsigned char byFBOption
1050 unsigned int uCTSFrameLen = 14;
1051 unsigned short wLen = 0x0000;
1053 if (pvCTS == NULL) {
1058 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1059 // in this case we need to decrease its length by 4.
1063 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1064 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1066 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1067 //Get SignalField,ServiceField,Length
1068 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1069 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1073 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1075 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
1076 pBuf->wDuration_ba += pDevice->wCTSDuration;
1077 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1078 //Get CTSDuration_ba_f0
1079 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
1080 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1081 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1082 //Get CTSDuration_ba_f1
1083 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
1084 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1085 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1086 //Get CTS Frame body
1087 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1088 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1089 pBuf->Data.wReserved = 0x0000;
1090 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1092 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1093 PSCTS pBuf = (PSCTS)pvCTS;
1094 //Get SignalField,ServiceField,Length
1095 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1096 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1098 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1099 //Get CTSDuration_ba
1100 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
1101 pBuf->wDuration_ba += pDevice->wCTSDuration;
1102 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1104 //Get CTS Frame body
1105 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1106 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1107 pBuf->Data.wReserved = 0x0000;
1108 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1121 * Generate FIFO control for MAC & Baseband controller
1125 * pDevice - Pointer to adapter
1126 * pTxDataHead - Transmit Data Buffer
1127 * pTxBufHead - pTxBufHead
1128 * pvRrvTime - pvRrvTime
1129 * pvRTS - RTS Buffer
1131 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1132 * bNeedACK - If need ACK
1133 * uDescIdx - Desc Index
1137 * Return Value: none
1140 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1143 s_vGenerateTxParameter (
1145 unsigned char byPktType,
1150 unsigned int cbFrameSize,
1152 unsigned int uDMAIdx,
1153 PSEthernetHeader psEthHeader,
1154 unsigned short wCurrentRate
1157 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1158 unsigned short wFifoCtl;
1159 BOOL bDisCRC = FALSE;
1160 unsigned char byFBOption = AUTO_FB_NONE;
1161 // unsigned short wCurrentRate = pDevice->wCurrentRate;
1163 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1164 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1165 pFifoHead->wReserved = wCurrentRate;
1166 wFifoCtl = pFifoHead->wFIFOCtl;
1168 if (wFifoCtl & FIFOCTL_CRCDIS) {
1172 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1173 byFBOption = AUTO_FB_0;
1175 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1176 byFBOption = AUTO_FB_1;
1179 if (pDevice->bLongHeader)
1180 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1182 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1184 if (pvRTS != NULL) { //RTS_need
1187 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1188 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1189 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1190 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1191 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1192 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1195 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1197 else {//RTS_needless, PCF mode
1201 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1202 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1203 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1204 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1209 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1212 else if (byPktType == PK_TYPE_11A) {
1214 if (pvRTS != NULL) {//RTS_need, non PCF mode
1217 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1218 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1219 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1222 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1224 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1227 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1228 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1232 else if (byPktType == PK_TYPE_11B) {
1234 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1237 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1238 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1239 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1242 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1244 else { //RTS_needless, non PCF mode
1247 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1248 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1252 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1255 unsigned char *pbyBuffer,//point to pTxBufHead
1256 unsigned short wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1257 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1261 s_vFillFragParameter(
1263 unsigned char *pbyBuffer,
1264 unsigned int uTxType,
1266 unsigned short wFragType,
1267 unsigned int cbReqCount
1270 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1271 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vFillFragParameter...\n");
1273 if (uTxType == TYPE_SYNCDMA) {
1274 //PSTxSyncDesc ptdCurr = (PSTxSyncDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1275 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1277 //Set FIFOCtl & TimeStamp in TxSyncDesc
1278 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1279 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1280 //Set TSR1 & ReqCount in TxDescHead
1281 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1282 if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1283 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1286 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1290 //PSTxDesc ptdCurr = (PSTxDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1291 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1292 //Set TSR1 & ReqCount in TxDescHead
1293 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1294 if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1295 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1298 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1302 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1304 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vFillFragParameter END\n");
1308 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
1309 unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
1310 PSEthernetHeader psEthHeader, unsigned char *pPacket, BOOL bNeedEncrypt,
1311 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum)
1313 unsigned int cbMACHdLen;
1314 unsigned int cbFrameSize;
1315 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1316 unsigned int cbFragPayloadSize;
1317 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1318 unsigned int cbLastFragPayloadSize;
1319 unsigned int uFragIdx;
1320 unsigned char *pbyPayloadHead;
1321 unsigned char *pbyIVHead;
1322 unsigned char *pbyMacHdr;
1323 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1324 unsigned int uDuration;
1325 unsigned char *pbyBuffer;
1326 // unsigned int uKeyEntryIdx = NUM_KEY_ENTRY+1;
1327 // unsigned char byKeySel = 0xFF;
1328 unsigned int cbIVlen = 0;
1329 unsigned int cbICVlen = 0;
1330 unsigned int cbMIClen = 0;
1331 unsigned int cbFCSlen = 4;
1332 unsigned int cb802_1_H_len = 0;
1333 unsigned int uLength = 0;
1334 unsigned int uTmpLen = 0;
1335 // unsigned char abyTmp[8];
1336 // unsigned long dwCRC;
1337 unsigned int cbMICHDR = 0;
1338 unsigned long dwMICKey0, dwMICKey1;
1339 unsigned long dwMIC_Priority;
1340 unsigned long *pdwMIC_L;
1341 unsigned long *pdwMIC_R;
1342 unsigned long dwSafeMIC_L, dwSafeMIC_R; //Fix "Last Frag Size" < "MIC length".
1343 BOOL bMIC2Frag = FALSE;
1344 unsigned int uMICFragLen = 0;
1345 unsigned int uMACfragNum = 1;
1346 unsigned int uPadding = 0;
1347 unsigned int cbReqCount = 0;
1352 unsigned char *pbyType;
1354 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1355 // unsigned int tmpDescIdx;
1356 unsigned int cbHeaderLength = 0;
1358 PSMICHDRHead pMICHDR;
1362 unsigned short wTxBufSize; // FFinfo size
1363 unsigned int uTotalCopyLength = 0;
1364 unsigned char byFBOption = AUTO_FB_NONE;
1365 BOOL bIsWEP256 = FALSE;
1366 PSMgmtObject pMgmt = pDevice->pMgmt;
1369 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1371 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_cbFillTxBufHead...\n");
1372 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1373 (pDevice->eOPMode == OP_MODE_AP)) {
1375 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])) ||
1376 is_broadcast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
1385 // MSDUs in Infra mode always need ACK
1390 if (pDevice->bLongHeader)
1391 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1393 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1396 if ((bNeedEncrypt == TRUE) && (pTransmitKey != NULL)) {
1397 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1400 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
1404 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1405 cbIVlen = 8;//IV+ExtIV
1409 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1410 cbIVlen = 8;//RSN Header
1412 cbMICHDR = sizeof(SMICHDRHead);
1414 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1415 //MAC Header should be padding 0 to DW alignment.
1416 uPadding = 4 - (cbMACHdLen%4);
1422 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1424 if ((bNeedACK == FALSE) ||
1425 (cbFrameSize < pDevice->wRTSThreshold) ||
1426 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1432 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1435 // Use for AUTO FALL BACK
1437 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
1438 byFBOption = AUTO_FB_0;
1440 else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
1441 byFBOption = AUTO_FB_1;
1444 //////////////////////////////////////////////////////
1445 //Set RrvTime/RTS/CTS Buffer
1446 wTxBufSize = sizeof(STxBufHead);
1447 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1449 if (byFBOption == AUTO_FB_NONE) {
1450 if (bRTS == TRUE) {//RTS_need
1451 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1452 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1453 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1455 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1456 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1458 else { //RTS_needless
1459 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1460 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1462 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1463 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1464 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1468 if (bRTS == TRUE) {//RTS_need
1469 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1470 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1471 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1473 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1474 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1476 else { //RTS_needless
1477 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1478 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1480 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1481 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1482 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1486 else {//802.11a/b packet
1488 if (byFBOption == AUTO_FB_NONE) {
1490 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1491 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1492 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1494 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1495 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1497 else { //RTS_needless, need MICHDR
1498 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1499 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1502 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1503 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1507 if (bRTS == TRUE) {//RTS_need
1508 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1509 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1510 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1512 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1513 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1515 else { //RTS_needless
1516 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1517 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1520 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1521 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1525 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1527 //////////////////////////////////////////////////////////////////
1528 if ((bNeedEncrypt == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1529 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1530 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1531 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1533 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1534 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1535 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1538 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[24]);
1539 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[28]);
1541 // DO Software Michael
1542 MIC_vInit(dwMICKey0, dwMICKey1);
1543 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1545 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1546 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1549 ///////////////////////////////////////////////////////////////////
1551 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1552 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1553 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1555 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == TRUE) && (bIsWEP256 == FALSE)) {
1557 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1558 cbFragmentSize = pDevice->wFragmentationThreshold;
1559 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1560 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1561 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1562 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1563 if (cbLastFragPayloadSize == 0) {
1564 cbLastFragPayloadSize = cbFragPayloadSize;
1568 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1569 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1571 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx ++) {
1572 if (uFragIdx == 0) {
1573 //=========================
1574 // Start Fragmentation
1575 //=========================
1576 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Start Fragmentation...\n");
1577 wFragType = FRAGCTL_STAFRAG;
1580 //Fill FIFO,RrvTime,RTS,and CTS
1581 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1582 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1584 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1585 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1586 // Generate TX MAC Header
1587 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1588 wFragType, uDMAIdx, uFragIdx);
1590 if (bNeedEncrypt == TRUE) {
1592 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1593 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1594 //Fill IV(ExtIV,RSNHDR)
1595 if (pDevice->bEnableHostWEP) {
1596 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1597 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1603 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1604 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1605 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1606 memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1609 memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1611 pbyType = (unsigned char *) (pbyPayloadHead + 6);
1612 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1616 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1617 //---------------------------
1618 // S/W or H/W Encryption
1619 //---------------------------
1621 //if (pDevice->bAES) {
1622 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1624 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1625 // pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1629 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1630 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1632 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1633 //copy TxBufferHeader + MacHeader to desc
1634 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1636 // Copy the Packet into a tx Buffer
1637 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1640 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1642 if ((bNeedEncrypt == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1643 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Start MIC: %d\n", cbFragPayloadSize);
1644 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1648 //---------------------------
1650 //---------------------------
1651 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1653 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1654 cbReqCount += cbICVlen;
1658 ptdCurr = (PSTxDesc)pHeadTD;
1659 //--------------------
1660 //1.Set TSR1 & ReqCount in TxDescHead
1661 //2.Set FragCtl in TxBufferHead
1662 //3.Set Frame Control
1663 //4.Set Sequence Control
1664 //5.Get S/W generate FCS
1665 //--------------------
1666 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1668 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1669 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1670 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1671 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1672 pDevice->iTDUsed[uDMAIdx]++;
1673 pHeadTD = ptdCurr->next;
1675 else if (uFragIdx == (uMACfragNum-1)) {
1676 //=========================
1677 // Last Fragmentation
1678 //=========================
1679 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Last Fragmentation...\n");
1680 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1682 wFragType = FRAGCTL_ENDFRAG;
1684 //Fill FIFO,RrvTime,RTS,and CTS
1685 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1686 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1688 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1689 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1691 // Generate TX MAC Header
1692 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1693 wFragType, uDMAIdx, uFragIdx);
1695 if (bNeedEncrypt == TRUE) {
1697 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1698 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1700 if (pDevice->bEnableHostWEP) {
1701 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1702 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1708 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1709 //---------------------------
1710 // S/W or H/W Encryption
1711 //---------------------------
1715 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1716 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1718 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1720 //copy TxBufferHeader + MacHeader to desc
1721 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1723 // Copy the Packet into a tx Buffer
1724 if (bMIC2Frag == FALSE) {
1726 memcpy((pbyBuffer + uLength),
1727 (pPacket + 14 + uTotalCopyLength),
1728 (cbLastFragPayloadSize - cbMIClen)
1730 //TODO check uTmpLen !
1731 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1734 if ((bNeedEncrypt == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1735 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1736 uMICFragLen, cbLastFragPayloadSize, uTmpLen);
1738 if (bMIC2Frag == FALSE) {
1740 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1741 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1742 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1743 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1744 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Last MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1746 if (uMICFragLen >= 4) {
1747 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1748 (cbMIClen - uMICFragLen));
1749 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen >= 4: %X, %d\n",
1750 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1751 (cbMIClen - uMICFragLen));
1754 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1756 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1757 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen < 4: %X, %d\n",
1758 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1759 (cbMIClen - uMICFragLen));
1762 for (ii = 0; ii < cbLastFragPayloadSize + 8 + 24; ii++) {
1763 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii - 8 - 24)));
1765 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n\n");
1770 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1774 //---------------------------
1776 //---------------------------
1777 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1779 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1780 cbReqCount += cbICVlen;
1784 ptdCurr = (PSTxDesc)pHeadTD;
1786 //--------------------
1787 //1.Set TSR1 & ReqCount in TxDescHead
1788 //2.Set FragCtl in TxBufferHead
1789 //3.Set Frame Control
1790 //4.Set Sequence Control
1791 //5.Get S/W generate FCS
1792 //--------------------
1795 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1797 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1798 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1799 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1800 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1801 pDevice->iTDUsed[uDMAIdx]++;
1802 pHeadTD = ptdCurr->next;
1806 //=========================
1807 // Middle Fragmentation
1808 //=========================
1809 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Middle Fragmentation...\n");
1810 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1812 wFragType = FRAGCTL_MIDFRAG;
1814 //Fill FIFO,RrvTime,RTS,and CTS
1815 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1816 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1818 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1819 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1821 // Generate TX MAC Header
1822 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1823 wFragType, uDMAIdx, uFragIdx);
1826 if (bNeedEncrypt == TRUE) {
1828 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1829 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1831 if (pDevice->bEnableHostWEP) {
1832 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1833 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1837 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1838 //---------------------------
1839 // S/W or H/W Encryption
1840 //---------------------------
1842 //if (pDevice->bAES) {
1843 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1845 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1846 // pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1849 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1850 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1853 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1855 //copy TxBufferHeader + MacHeader to desc
1856 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1858 // Copy the Packet into a tx Buffer
1859 memcpy((pbyBuffer + uLength),
1860 (pPacket + 14 + uTotalCopyLength),
1863 uTmpLen = cbFragPayloadSize;
1865 uTotalCopyLength += uTmpLen;
1867 if ((bNeedEncrypt == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1869 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1871 if (uTmpLen < cbFragPayloadSize) {
1873 uMICFragLen = cbFragPayloadSize - uTmpLen;
1874 ASSERT(uMICFragLen < cbMIClen);
1876 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1877 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1878 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1879 dwSafeMIC_L = *pdwMIC_L;
1880 dwSafeMIC_R = *pdwMIC_R;
1882 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1883 uMICFragLen, cbFragPayloadSize, uTmpLen);
1884 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Fill MIC in Middle frag [%d]\n", uMICFragLen);
1886 for (ii = 0; ii < uMICFragLen; ii++) {
1887 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength + uTmpLen) + ii)));
1889 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
1891 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1893 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Middle frag len: %d\n", uTmpLen);
1895 for (ii = 0; ii < uTmpLen; ii++) {
1896 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
1898 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n\n");
1902 ASSERT(uTmpLen == (cbFragPayloadSize));
1905 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1907 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1908 cbReqCount += cbICVlen;
1912 ptdCurr = (PSTxDesc)pHeadTD;
1914 //--------------------
1915 //1.Set TSR1 & ReqCount in TxDescHead
1916 //2.Set FragCtl in TxBufferHead
1917 //3.Set Frame Control
1918 //4.Set Sequence Control
1919 //5.Get S/W generate FCS
1920 //--------------------
1922 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1924 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1925 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1926 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1927 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1928 pDevice->iTDUsed[uDMAIdx]++;
1929 pHeadTD = ptdCurr->next;
1931 } // for (uMACfragNum)
1934 //=========================
1936 //=========================
1937 //DBG_PRTGRP03(("No Fragmentation...\n"));
1938 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1939 wFragType = FRAGCTL_NONFRAG;
1941 //Set FragCtl in TxBufferHead
1942 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1944 //Fill FIFO,RrvTime,RTS,and CTS
1945 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1946 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1948 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1949 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1951 // Generate TX MAC Header
1952 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1953 wFragType, uDMAIdx, 0);
1955 if (bNeedEncrypt == TRUE) {
1957 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1958 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1960 if (pDevice->bEnableHostWEP) {
1961 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1962 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1967 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1968 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1969 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1970 memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1973 memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1975 pbyType = (unsigned char *) (pbyPayloadHead + 6);
1976 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1980 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1981 //---------------------------
1982 // S/W or H/W Encryption
1983 //---------------------------
1985 //if (pDevice->bAES) {
1986 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Fill MICHDR...\n");
1987 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFrameBodySize);
1990 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1991 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1993 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1995 //copy TxBufferHeader + MacHeader to desc
1996 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1998 // Copy the Packet into a tx Buffer
1999 memcpy((pbyBuffer + uLength),
2001 cbFrameBodySize - cb802_1_H_len
2004 if ((bNeedEncrypt == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)){
2006 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Length:%d, %d\n", cbFrameBodySize - cb802_1_H_len, uLength);
2008 for (ii = 0; ii < (cbFrameBodySize - cb802_1_H_len); ii++) {
2009 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
2011 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
2014 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
2016 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
2017 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
2019 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2023 if (pDevice->bTxMICFail == TRUE) {
2026 pDevice->bTxMICFail = FALSE;
2029 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2030 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
2031 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2033 for (ii = 0; ii < 8; ii++) {
2034 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *(((unsigned char *)(pdwMIC_L) + ii)));
2036 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
2042 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)){
2044 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
2045 (unsigned short)(cbFrameBodySize + cbMIClen));
2046 cbReqCount += cbICVlen;
2051 ptdCurr = (PSTxDesc)pHeadTD;
2053 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
2054 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
2055 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
2056 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
2057 //Set TSR1 & ReqCount in TxDescHead
2058 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
2059 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2061 pDevice->iTDUsed[uDMAIdx]++;
2064 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ptdCurr->m_dwReserved0[%d] ptdCurr->m_dwReserved1[%d].\n", ptdCurr->pTDInfo->dwReqCount, ptdCurr->pTDInfo->dwHeaderLength);
2065 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" cbHeaderLength[%d]\n", cbHeaderLength);
2068 *puMACfragNum = uMACfragNum;
2069 //DBG_PRTGRP03(("s_cbFillTxBufHead END\n"));
2070 return cbHeaderLength;
2075 vGenerateFIFOHeader(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
2076 BOOL bNeedEncrypt, unsigned int cbPayloadSize, unsigned int uDMAIdx,
2077 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
2078 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
2079 unsigned int *pcbHeaderSize)
2081 unsigned int wTxBufSize; // FFinfo size
2084 unsigned short cbMacHdLen;
2085 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2087 wTxBufSize = sizeof(STxBufHead);
2089 memset(pTxBufHead, 0, wTxBufSize);
2090 //Set FIFOCTL_NEEDACK
2092 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2093 (pDevice->eOPMode == OP_MODE_AP)) {
2094 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])) ||
2095 is_broadcast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
2097 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
2101 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2106 // MSDUs in Infra mode always need ACK
2108 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2113 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2114 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
2117 if (pDevice->bLongHeader)
2118 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
2120 //Set FIFOCTL_GENINT
2122 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2125 //Set FIFOCTL_ISDMA0
2126 if (TYPE_TXDMA0 == uDMAIdx) {
2127 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
2130 //Set FRAGCTL_MACHDCNT
2131 if (pDevice->bLongHeader) {
2132 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
2134 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2136 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2139 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2142 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2143 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2145 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2146 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2148 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2149 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2151 //Set FIFOCTL_GrpAckPolicy
2152 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2153 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2156 //Set Auto Fallback Ctl
2157 if (pDevice->wCurrentRate >= RATE_18M) {
2158 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
2159 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
2160 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
2161 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
2165 //Set FRAGCTL_WEPTYP
2166 pDevice->bAES = FALSE;
2168 //Set FRAGCTL_WEPTYP
2169 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
2170 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
2171 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2172 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2174 else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
2175 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
2176 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2178 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
2179 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2185 //printk("Func:vGenerateFIFOHeader:TxDataRate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2187 //if (pDevice->wCurrentRate <= 3)
2189 // RFbRawSetPower(pDevice,36,pDevice->wCurrentRate);
2193 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
2195 //if (pDevice->wCurrentRate == 3)
2196 //pDevice->byCurPwr = 46;
2197 pTxBufHead->byTxPower = pDevice->byCurPwr;
2203 if(pDevice->bEnableHostWEP)
2204 pTxBufHead->wFragCtl &= ~(FRAGCTL_TKIP | FRAGCTL_LEGACY |FRAGCTL_AES);
2206 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
2207 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
2208 pTransmitKey, uNodeIndex, puMACfragNum);
2219 * Translate 802.3 to 802.11 header
2223 * pDevice - Pointer to adapter
2224 * dwTxBufferAddr - Transmit Buffer
2225 * pPacket - Packet from upper layer
2226 * cbPacketSize - Transmit Data Length
2228 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
2229 * pcbAppendPayload - size of append payload for 802.1H translation
2231 * Return Value: none
2236 vGenerateMACHeader (
2238 unsigned char *pbyBufferAddr,
2239 unsigned short wDuration,
2240 PSEthernetHeader psEthHeader,
2242 unsigned short wFragType,
2243 unsigned int uDMAIdx,
2244 unsigned int uFragIdx
2247 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
2249 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
2251 if (uDMAIdx == TYPE_ATIMDMA) {
2252 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2254 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2257 if (pDevice->eOPMode == OP_MODE_AP) {
2258 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2259 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2260 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2261 pMACHeader->wFrameCtl |= FC_FROMDS;
2264 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2265 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2266 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2267 memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2270 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2271 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2272 memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2273 pMACHeader->wFrameCtl |= FC_TODS;
2278 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2280 pMACHeader->wDurationID = cpu_to_le16(wDuration);
2282 if (pDevice->bLongHeader) {
2283 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2284 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2285 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2287 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2289 //Set FragNumber in Sequence Control
2290 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2292 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2293 pDevice->wSeqCounter++;
2294 if (pDevice->wSeqCounter > 0x0fff)
2295 pDevice->wSeqCounter = 0;
2298 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
2299 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2308 CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2311 unsigned char byPktType;
2312 unsigned char *pbyTxBufferAddr;
2316 unsigned int uDuration;
2317 unsigned int cbReqCount;
2318 PS802_11Header pMACHeader;
2319 unsigned int cbHeaderSize;
2320 unsigned int cbFrameBodySize;
2322 BOOL bIsPSPOLL = FALSE;
2323 PSTxBufHead pTxBufHead;
2324 unsigned int cbFrameSize;
2325 unsigned int cbIVlen = 0;
2326 unsigned int cbICVlen = 0;
2327 unsigned int cbMIClen = 0;
2328 unsigned int cbFCSlen = 4;
2329 unsigned int uPadding = 0;
2330 unsigned short wTxBufSize;
2331 unsigned int cbMacHdLen;
2332 SEthernetHeader sEthHeader;
2335 PSMgmtObject pMgmt = pDevice->pMgmt;
2336 unsigned short wCurrentRate = RATE_1M;
2339 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2340 return CMD_STATUS_RESOURCES;
2343 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2344 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2345 cbFrameBodySize = pPacket->cbPayloadLen;
2346 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2347 wTxBufSize = sizeof(STxBufHead);
2348 memset(pTxBufHead, 0, wTxBufSize);
2350 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2351 wCurrentRate = RATE_6M;
2352 byPktType = PK_TYPE_11A;
2354 wCurrentRate = RATE_1M;
2355 byPktType = PK_TYPE_11B;
2358 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2359 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2360 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2361 // to set power here.
2362 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2364 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2366 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2368 pTxBufHead->byTxPower = pDevice->byCurPwr;
2369 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2370 if (pDevice->byFOETuning) {
2371 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2372 wCurrentRate = RATE_24M;
2373 byPktType = PK_TYPE_11GA;
2378 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2379 pTxBufHead->wFIFOCtl = 0;
2381 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2382 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2384 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2385 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2387 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2388 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2391 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2392 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2395 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])) ||
2396 is_broadcast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0]))) {
2401 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2404 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2405 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2407 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2408 //Set Preamble type always long
2409 //pDevice->byPreambleType = PREAMBLE_LONG;
2410 // probe-response don't retry
2411 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2412 // bNeedACK = FALSE;
2413 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2417 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2419 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2421 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2423 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2426 //Set FRAGCTL_MACHDCNT
2427 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2430 // Although spec says MMPDU can be fragmented; In most case,
2431 // no one will send a MMPDU under fragmentation. With RTS may occur.
2432 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2434 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2435 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2438 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2440 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2441 cbIVlen = 8;//IV+ExtIV
2444 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2445 //We need to get seed here for filling TxKey entry.
2446 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2447 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2449 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2450 cbIVlen = 8;//RSN Header
2452 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2453 pDevice->bAES = TRUE;
2455 //MAC Header should be padding 0 to DW alignment.
2456 uPadding = 4 - (cbMacHdLen%4);
2460 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2462 //Set FIFOCTL_GrpAckPolicy
2463 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2464 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2466 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2468 //Set RrvTime/RTS/CTS Buffer
2469 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2471 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2474 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2475 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2476 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2478 else { // 802.11a/b packet
2479 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2483 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2484 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2487 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2489 memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2490 memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2491 //=========================
2493 //=========================
2494 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2497 //Fill FIFO,RrvTime,RTS,and CTS
2498 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2499 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2502 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2503 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2505 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2507 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2509 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2510 unsigned char *pbyIVHead;
2511 unsigned char *pbyPayloadHead;
2512 unsigned char *pbyBSSID;
2513 PSKeyItem pTransmitKey = NULL;
2515 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2516 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2519 //Kyle: Need fix: TKIP and AES did't encryt Mnt Packet.
2520 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2522 //Fill IV(ExtIV,RSNHDR)
2523 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2524 //---------------------------
2525 // S/W or H/W Encryption
2526 //---------------------------
2528 //if (pDevice->bAES) {
2529 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize);
2532 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2533 (pDevice->bLinkPass == TRUE)) {
2534 pbyBSSID = pDevice->abyBSSID;
2536 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2538 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2539 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2543 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2548 pbyBSSID = pDevice->abyBroadcastAddr;
2549 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2550 pTransmitKey = NULL;
2551 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2553 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2557 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2558 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2560 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2561 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2565 // Copy the Packet into a tx Buffer
2566 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2569 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2570 pDevice->wSeqCounter++ ;
2571 if (pDevice->wSeqCounter > 0x0fff)
2572 pDevice->wSeqCounter = 0;
2575 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2576 // of FIFO control header.
2577 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2578 // in the same place of other packet's Duration-field).
2579 // And it will cause Cisco-AP to issue Disassociation-packet
2580 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2581 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2582 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2584 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2589 // first TD is the only TD
2590 //Set TSR1 & ReqCount in TxDescHead
2591 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2592 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2593 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2594 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2595 pFrstTD->pTDInfo->byFlags = 0;
2597 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2599 MACbPSWakeup(pDevice->PortOffset);
2601 pDevice->bPWBitOn = FALSE;
2604 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2607 pDevice->iTDUsed[TYPE_TXDMA0]++;
2609 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
2610 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2613 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2615 //printk("SCAN:CurrentRate is %d,TxPower is %d\n",wCurrentRate,pTxBufHead->byTxPower);
2619 pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
2622 // Poll Transmit the adapter
2623 MACvTransmit0(pDevice->PortOffset);
2625 return CMD_STATUS_PENDING;
2630 CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2632 unsigned char byPktType;
2633 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2634 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2635 unsigned int cbHeaderSize = 0;
2636 unsigned short wTxBufSize = sizeof(STxShortBufHead);
2637 PSTxShortBufHead pTxBufHead = (PSTxShortBufHead) pbyBuffer;
2638 PSTxDataHead_ab pTxDataHead = (PSTxDataHead_ab) (pbyBuffer + wTxBufSize);
2639 PS802_11Header pMACHeader;
2640 unsigned short wCurrentRate;
2641 unsigned short wLen = 0x0000;
2644 memset(pTxBufHead, 0, wTxBufSize);
2646 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2647 wCurrentRate = RATE_6M;
2648 byPktType = PK_TYPE_11A;
2650 wCurrentRate = RATE_2M;
2651 byPktType = PK_TYPE_11B;
2654 //Set Preamble type always long
2655 pDevice->byPreambleType = PREAMBLE_LONG;
2657 //Set FIFOCTL_GENINT
2659 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2662 //Set packet type & Get Duration
2663 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2664 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, byPktType,
2665 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2667 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2668 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2669 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, byPktType,
2670 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2673 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, byPktType,
2674 (unsigned short *)&(wLen), (unsigned char *)&(pTxDataHead->byServiceField), (unsigned char *)&(pTxDataHead->bySignalField)
2676 pTxDataHead->wTransmitLength = cpu_to_le16(wLen);
2678 pTxDataHead->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
2679 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2681 //Generate Beacon Header
2682 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2683 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2685 pMACHeader->wDurationID = 0;
2686 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2687 pDevice->wSeqCounter++ ;
2688 if (pDevice->wSeqCounter > 0x0fff)
2689 pDevice->wSeqCounter = 0;
2691 // Set Beacon buffer length
2692 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2694 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2696 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2697 // Set auto Transmit on
2698 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2699 // Poll Transmit the adapter
2700 MACvTransmitBCN(pDevice->PortOffset);
2702 return CMD_STATUS_PENDING;
2710 PSKeyItem pTransmitKey,
2711 unsigned int cbFrameBodySize,
2712 PSEthernetHeader psEthHeader
2715 unsigned int cbMACHdLen;
2716 unsigned int cbFrameSize;
2717 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2718 unsigned int cbFragPayloadSize;
2719 unsigned int cbLastFragPayloadSize;
2720 unsigned int cbIVlen = 0;
2721 unsigned int cbICVlen = 0;
2722 unsigned int cbMIClen = 0;
2723 unsigned int cbFCSlen = 4;
2724 unsigned int uMACfragNum = 1;
2729 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2730 (pDevice->eOPMode == OP_MODE_AP)) {
2731 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])) ||
2732 is_broadcast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
2740 // MSDUs in Infra mode always need ACK
2744 if (pDevice->bLongHeader)
2745 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2747 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2750 if (pDevice->bEncryptionEnable == TRUE) {
2752 if (pTransmitKey == NULL) {
2753 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2754 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2757 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2758 cbIVlen = 8;//IV+ExtIV
2761 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2762 cbIVlen = 8;//RSN Header
2765 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2768 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2769 cbIVlen = 8;//IV+ExtIV
2772 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2773 cbIVlen = 8;//RSN Header
2778 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2780 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == TRUE)) {
2782 cbFragmentSize = pDevice->wFragmentationThreshold;
2783 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2784 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2785 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2786 if (cbLastFragPayloadSize == 0) {
2787 cbLastFragPayloadSize = cbFragPayloadSize;
2797 vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb, unsigned char *pbMPDU, unsigned int cbMPDULen) {
2800 unsigned char byPktType;
2801 unsigned char *pbyTxBufferAddr;
2805 unsigned int uDuration;
2806 unsigned int cbReqCount;
2807 PS802_11Header pMACHeader;
2808 unsigned int cbHeaderSize;
2809 unsigned int cbFrameBodySize;
2811 BOOL bIsPSPOLL = FALSE;
2812 PSTxBufHead pTxBufHead;
2813 unsigned int cbFrameSize;
2814 unsigned int cbIVlen = 0;
2815 unsigned int cbICVlen = 0;
2816 unsigned int cbMIClen = 0;
2817 unsigned int cbFCSlen = 4;
2818 unsigned int uPadding = 0;
2819 unsigned int cbMICHDR = 0;
2820 unsigned int uLength = 0;
2821 unsigned long dwMICKey0, dwMICKey1;
2822 unsigned long dwMIC_Priority;
2823 unsigned long *pdwMIC_L;
2824 unsigned long *pdwMIC_R;
2825 unsigned short wTxBufSize;
2826 unsigned int cbMacHdLen;
2827 SEthernetHeader sEthHeader;
2830 PSMgmtObject pMgmt = pDevice->pMgmt;
2831 unsigned short wCurrentRate = RATE_1M;
2832 PUWLAN_80211HDR p80211Header;
2833 unsigned int uNodeIndex = 0;
2834 BOOL bNodeExist = FALSE;
2836 PSKeyItem pTransmitKey = NULL;
2837 unsigned char *pbyIVHead;
2838 unsigned char *pbyPayloadHead;
2839 unsigned char *pbyMacHdr;
2841 unsigned int cbExtSuppRate = 0;
2845 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2847 if(cbMPDULen <= WLAN_HDR_ADDR3_LEN) {
2848 cbFrameBodySize = 0;
2851 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2853 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2856 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2857 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2858 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2859 wTxBufSize = sizeof(STxBufHead);
2860 memset(pTxBufHead, 0, wTxBufSize);
2862 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2863 wCurrentRate = RATE_6M;
2864 byPktType = PK_TYPE_11A;
2866 wCurrentRate = RATE_1M;
2867 byPktType = PK_TYPE_11B;
2870 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2871 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2872 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2873 // to set power here.
2874 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2875 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2877 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2879 pTxBufHead->byTxPower = pDevice->byCurPwr;
2881 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2882 if (pDevice->byFOETuning) {
2883 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2884 wCurrentRate = RATE_24M;
2885 byPktType = PK_TYPE_11GA;
2889 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2892 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2893 pTxBufHead->wFIFOCtl = 0;
2895 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2896 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2898 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2899 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2901 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2902 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2905 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2906 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2909 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0])) ||
2910 is_broadcast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2912 if (pDevice->bEnableHostWEP) {
2918 if (pDevice->bEnableHostWEP) {
2919 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2923 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2926 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2927 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2929 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2930 //Set Preamble type always long
2931 //pDevice->byPreambleType = PREAMBLE_LONG;
2933 // probe-response don't retry
2934 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2935 // bNeedACK = FALSE;
2936 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2940 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2942 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2944 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2946 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2949 // hostapd deamon ext support rate patch
2950 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2952 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2953 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2956 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2957 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2960 if (cbExtSuppRate >0) {
2961 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2966 //Set FRAGCTL_MACHDCNT
2967 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2970 // Although spec says MMPDU can be fragmented; In most case,
2971 // no one will send a MMPDU under fragmentation. With RTS may occur.
2972 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2975 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2976 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2979 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2981 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2982 cbIVlen = 8;//IV+ExtIV
2985 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2986 //We need to get seed here for filling TxKey entry.
2987 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2988 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2990 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2991 cbIVlen = 8;//RSN Header
2993 cbMICHDR = sizeof(SMICHDRHead);
2994 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2995 pDevice->bAES = TRUE;
2997 //MAC Header should be padding 0 to DW alignment.
2998 uPadding = 4 - (cbMacHdLen%4);
3002 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
3004 //Set FIFOCTL_GrpAckPolicy
3005 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
3006 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
3008 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
3011 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
3013 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
3014 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
3016 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
3017 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
3018 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
3021 else {//802.11a/b packet
3023 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
3024 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
3027 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
3028 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
3032 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
3033 memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
3034 memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
3035 //=========================
3037 //=========================
3038 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
3041 //Fill FIFO,RrvTime,RTS,and CTS
3042 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
3043 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
3046 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
3047 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
3049 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
3051 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
3053 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
3054 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
3055 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
3057 // Copy the Packet into a tx Buffer
3058 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
3060 // version set to 0, patch for hostapd deamon
3061 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
3062 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
3064 // replace support rate, patch for hostapd deamon( only support 11M)
3065 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
3066 if (cbExtSuppRate != 0) {
3067 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
3068 memcpy((pbyPayloadHead + cbFrameBodySize),
3069 pMgmt->abyCurrSuppRates,
3070 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
3072 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
3073 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
3074 pMgmt->abyCurrExtSuppRates,
3075 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3081 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
3083 if (pDevice->bEnableHostWEP) {
3084 pTransmitKey = &STempKey;
3085 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3086 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3087 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3088 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3089 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3090 memcpy(pTransmitKey->abyKey,
3091 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3092 pTransmitKey->uKeyLength
3096 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
3098 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
3099 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
3101 // DO Software Michael
3102 MIC_vInit(dwMICKey0, dwMICKey1);
3103 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
3105 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
3106 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
3108 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
3110 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
3112 pdwMIC_L = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
3113 pdwMIC_R = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
3115 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
3118 if (pDevice->bTxMICFail == TRUE) {
3121 pDevice->bTxMICFail = FALSE;
3124 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
3125 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
3126 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
3131 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
3132 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
3134 if (pDevice->bEnableHostWEP) {
3135 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
3136 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
3139 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
3140 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
3144 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
3145 pDevice->wSeqCounter++ ;
3146 if (pDevice->wSeqCounter > 0x0fff)
3147 pDevice->wSeqCounter = 0;
3151 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
3152 // of FIFO control header.
3153 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
3154 // in the same place of other packet's Duration-field).
3155 // And it will cause Cisco-AP to issue Disassociation-packet
3156 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
3157 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
3158 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
3160 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
3165 // first TD is the only TD
3166 //Set TSR1 & ReqCount in TxDescHead
3167 pFrstTD->pTDInfo->skb = skb;
3168 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
3169 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
3170 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
3171 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
3172 pFrstTD->pTDInfo->byFlags = 0;
3173 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
3175 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
3177 MACbPSWakeup(pDevice->PortOffset);
3179 pDevice->bPWBitOn = FALSE;
3182 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
3185 pDevice->iTDUsed[TYPE_TXDMA0]++;
3187 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
3188 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
3191 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
3193 // Poll Transmit the adapter
3194 MACvTransmit0(pDevice->PortOffset);