2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * cbGetFragCount - Calculate fragment number count
31 * csBeacon_xmit - beacon tx function
32 * csMgmt_xmit - management tx function
33 * s_cbFillTxBufHead - fulfill tx dma buffer header
34 * s_uGetDataDuration - get tx data required duration
35 * s_uFillDataHead- fulfill tx data duration header
36 * s_uGetRTSCTSDuration- get rtx/cts required duration
37 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
38 * s_uGetTxRsvTime- get frame reserved time
39 * s_vFillCTSHead- fulfill CTS ctl header
40 * s_vFillFragParameter- Set fragment ctl parameter.
41 * s_vFillRTSHead- fulfill RTS ctl header
42 * s_vFillTxKey- fulfill tx encrypt key
43 * s_vSWencryption- Software encrypt header
44 * vDMA0_tx_80211- tx 802.11 frame via dma0
45 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
72 /*--------------------- Static Functions --------------------------*/
74 /*--------------------- Static Definitions -------------------------*/
75 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
76 // packet size >= 256 -> direct send
78 static const unsigned short wTimeStampOff[2][MAX_RATE] = {
79 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
80 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
83 static const unsigned short wFB_Opt0[2][5] = {
84 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
85 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
87 static const unsigned short wFB_Opt1[2][5] = {
88 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
89 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
96 #define RTSDUR_BA_F0 4
97 #define RTSDUR_AA_F0 5
98 #define RTSDUR_BA_F1 6
99 #define RTSDUR_AA_F1 7
100 #define CTSDUR_BA_F0 8
101 #define CTSDUR_BA_F1 9
104 #define DATADUR_A_F0 12
105 #define DATADUR_A_F1 13
107 /*--------------------- Static Functions --------------------------*/
112 struct vnt_private *pDevice,
113 unsigned char *pbyBuf,
114 unsigned char *pbyIVHead,
115 PSKeyItem pTransmitKey,
116 unsigned char *pbyHdrBuf,
117 unsigned short wPayloadLen,
118 unsigned char *pMICHDR
124 struct vnt_private *pDevice,
125 unsigned char byPktType,
127 unsigned int cbFrameLength,
130 PSEthernetHeader psEthHeader,
131 unsigned short wCurrentRate,
132 unsigned char byFBOption
137 s_vGenerateTxParameter(
138 struct vnt_private *pDevice,
139 unsigned char byPktType,
144 unsigned int cbFrameSize,
146 unsigned int uDMAIdx,
147 PSEthernetHeader psEthHeader,
148 unsigned short wCurrentRate
151 static void s_vFillFragParameter(
152 struct vnt_private *pDevice,
153 unsigned char *pbyBuffer,
154 unsigned int uTxType,
156 unsigned short wFragType,
157 unsigned int cbReqCount
161 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
162 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
163 unsigned int uDMAIdx, PSTxDesc pHeadTD,
164 PSEthernetHeader psEthHeader, unsigned char *pPacket,
165 bool bNeedEncrypt, PSKeyItem pTransmitKey,
166 unsigned int uNodeIndex, unsigned int *puMACfragNum);
171 struct vnt_private *pDevice,
172 unsigned char byPktType,
174 unsigned int cbFrameLength,
175 unsigned int uDMAIdx,
177 unsigned int uFragIdx,
178 unsigned int cbLastFragmentSize,
179 unsigned int uMACfragNum,
180 unsigned char byFBOption,
181 unsigned short wCurrentRate
184 /*--------------------- Export Variables --------------------------*/
189 struct vnt_private *pDevice,
190 unsigned char *pbyBuf,
191 unsigned char *pbyIVHead,
192 PSKeyItem pTransmitKey,
193 unsigned char *pbyHdrBuf,
194 unsigned short wPayloadLen,
195 unsigned char *pMICHDR
198 struct vnt_mic_hdr *mic_hdr = (struct vnt_mic_hdr *)pMICHDR;
199 unsigned long *pdwIV = (unsigned long *)pbyIVHead;
200 unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
201 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
202 unsigned long dwRevIVCounter;
203 unsigned char byKeyIndex = 0;
206 if (pTransmitKey == NULL)
209 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
210 *pdwIV = pDevice->dwIVCounter;
211 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
213 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
214 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
215 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
216 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
218 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
219 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
220 if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
221 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
222 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
224 memcpy(pDevice->abyPRNG, pbyBuf, 16);
226 // Append IV after Mac Header
227 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
228 *pdwIV |= (unsigned long)byKeyIndex << 30;
229 *pdwIV = cpu_to_le32(*pdwIV);
230 pDevice->dwIVCounter++;
231 if (pDevice->dwIVCounter > WEP_IV_MASK)
232 pDevice->dwIVCounter = 0;
234 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
235 pTransmitKey->wTSC15_0++;
236 if (pTransmitKey->wTSC15_0 == 0)
237 pTransmitKey->dwTSC47_16++;
239 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
240 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
241 memcpy(pbyBuf, pDevice->abyPRNG, 16);
243 memcpy(pdwIV, pDevice->abyPRNG, 3);
245 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
246 // Append IV&ExtIV after Mac Header
247 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
248 pr_debug("vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
250 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
251 pTransmitKey->wTSC15_0++;
252 if (pTransmitKey->wTSC15_0 == 0)
253 pTransmitKey->dwTSC47_16++;
255 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
259 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
260 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
261 //Append IV&ExtIV after Mac Header
262 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
266 mic_hdr->tx_priority = 0;
267 memcpy(mic_hdr->mic_addr2, pMACHeader->abyAddr2, ETH_ALEN);
269 /* ccmp pn big endian order */
270 mic_hdr->ccmp_pn[0] = (u8)(pTransmitKey->dwTSC47_16 >> 24);
271 mic_hdr->ccmp_pn[1] = (u8)(pTransmitKey->dwTSC47_16 >> 16);
272 mic_hdr->ccmp_pn[2] = (u8)(pTransmitKey->dwTSC47_16 >> 8);
273 mic_hdr->ccmp_pn[3] = (u8)pTransmitKey->dwTSC47_16;
274 mic_hdr->ccmp_pn[4] = (u8)(pTransmitKey->wTSC15_0 >> 8);
275 mic_hdr->ccmp_pn[5] = (u8)pTransmitKey->wTSC15_0;
278 mic_hdr->payload_len = cpu_to_be16(wPayloadLen);
280 if (pDevice->bLongHeader)
281 mic_hdr->hlen = cpu_to_be16(28);
283 mic_hdr->hlen = cpu_to_be16(22);
285 memcpy(mic_hdr->addr1, pMACHeader->abyAddr1, ETH_ALEN);
286 memcpy(mic_hdr->addr2, pMACHeader->abyAddr2, ETH_ALEN);
289 memcpy(mic_hdr->addr3, pMACHeader->abyAddr3, ETH_ALEN);
290 mic_hdr->frame_control =
291 cpu_to_le16(pMACHeader->wFrameCtl & 0xc78f);
292 mic_hdr->seq_ctrl = cpu_to_le16(pMACHeader->wSeqCtl & 0xf);
294 if (pDevice->bLongHeader)
295 memcpy(mic_hdr->addr4, pMACHeader->abyAddr4, ETH_ALEN);
302 struct vnt_private *pDevice,
303 PSKeyItem pTransmitKey,
304 unsigned char *pbyPayloadHead,
305 unsigned short wPayloadSize
308 unsigned int cbICVlen = 4;
309 unsigned long dwICV = 0xFFFFFFFFL;
310 unsigned long *pdwICV;
312 if (pTransmitKey == NULL)
315 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
316 //=======================================================================
317 // Append ICV after payload
318 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
319 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
320 // finally, we must invert dwCRC to get the correct answer
321 *pdwICV = cpu_to_le32(~dwICV);
323 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
324 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
325 //=======================================================================
326 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
327 //=======================================================================
328 //Append ICV after payload
329 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
330 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
331 // finally, we must invert dwCRC to get the correct answer
332 *pdwICV = cpu_to_le32(~dwICV);
334 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
335 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
336 //=======================================================================
340 /*byPktType : PK_TYPE_11A 0
348 struct vnt_private *pDevice,
349 unsigned char byPktType,
350 unsigned int cbFrameLength,
351 unsigned short wRate,
355 unsigned int uDataTime, uAckTime;
357 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
358 if (byPktType == PK_TYPE_11B) //llb,CCK mode
359 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
360 else //11g 2.4G OFDM mode & 11a 5G OFDM mode
361 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
364 return uDataTime + pDevice->uSIFS + uAckTime;
369 //byFreqType: 0=>5GHZ 1=>2.4GHZ
373 struct vnt_private *pDevice,
374 unsigned char byRTSRsvType,
375 unsigned char byPktType,
376 unsigned int cbFrameLength,
377 unsigned short wCurrentRate
380 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
382 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
384 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
385 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
386 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
387 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
388 } else if (byRTSRsvType == 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
389 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
390 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
391 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
392 } else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
393 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
394 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
395 } else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
396 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
397 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
398 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
403 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
407 //byFreqType 0: 5GHz, 1:2.4Ghz
411 struct vnt_private *pDevice,
412 unsigned char byDurType,
413 unsigned int cbFrameLength,
414 unsigned char byPktType,
415 unsigned short wRate,
417 unsigned int uFragIdx,
418 unsigned int cbLastFragmentSize,
419 unsigned int uMACfragNum,
420 unsigned char byFBOption
424 unsigned int uAckTime = 0, uNextPktTime = 0;
426 if (uFragIdx == (uMACfragNum-1))
430 case DATADUR_B: //DATADUR_B
431 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
433 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
434 return pDevice->uSIFS + uAckTime;
438 } else {//First Frag or Mid Frag
439 if (uFragIdx == (uMACfragNum-2))
440 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
442 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
445 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
446 return pDevice->uSIFS + uAckTime + uNextPktTime;
448 return pDevice->uSIFS + uNextPktTime;
453 case DATADUR_A: //DATADUR_A
454 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
456 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
457 return pDevice->uSIFS + uAckTime;
461 } else {//First Frag or Mid Frag
462 if (uFragIdx == (uMACfragNum-2))
463 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
465 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
468 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
469 return pDevice->uSIFS + uAckTime + uNextPktTime;
471 return pDevice->uSIFS + uNextPktTime;
476 case DATADUR_A_F0: //DATADUR_A_F0
477 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
479 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
480 return pDevice->uSIFS + uAckTime;
484 } else { //First Frag or Mid Frag
485 if (byFBOption == AUTO_FB_0) {
486 if (wRate < RATE_18M)
488 else if (wRate > RATE_54M)
491 if (uFragIdx == (uMACfragNum-2))
492 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
494 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
496 } else { // (byFBOption == AUTO_FB_1)
497 if (wRate < RATE_18M)
499 else if (wRate > RATE_54M)
502 if (uFragIdx == (uMACfragNum-2))
503 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
505 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
510 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
511 return pDevice->uSIFS + uAckTime + uNextPktTime;
513 return pDevice->uSIFS + uNextPktTime;
518 case DATADUR_A_F1: //DATADUR_A_F1
519 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
521 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
522 return pDevice->uSIFS + uAckTime;
526 } else { //First Frag or Mid Frag
527 if (byFBOption == AUTO_FB_0) {
528 if (wRate < RATE_18M)
530 else if (wRate > RATE_54M)
533 if (uFragIdx == (uMACfragNum-2))
534 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
536 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
538 } else { // (byFBOption == AUTO_FB_1)
539 if (wRate < RATE_18M)
541 else if (wRate > RATE_54M)
544 if (uFragIdx == (uMACfragNum-2))
545 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
547 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
550 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
551 return pDevice->uSIFS + uAckTime + uNextPktTime;
553 return pDevice->uSIFS + uNextPktTime;
566 //byFreqType: 0=>5GHZ 1=>2.4GHZ
569 s_uGetRTSCTSDuration(
570 struct vnt_private *pDevice,
571 unsigned char byDurType,
572 unsigned int cbFrameLength,
573 unsigned char byPktType,
574 unsigned short wRate,
576 unsigned char byFBOption
579 unsigned int uCTSTime = 0, uDurTime = 0;
582 case RTSDUR_BB: //RTSDuration_bb
583 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
584 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
587 case RTSDUR_BA: //RTSDuration_ba
588 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
589 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
592 case RTSDUR_AA: //RTSDuration_aa
593 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
594 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
597 case CTSDUR_BA: //CTSDuration_ba
598 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
601 case RTSDUR_BA_F0: //RTSDuration_ba_f0
602 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
603 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
604 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
605 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
606 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
610 case RTSDUR_AA_F0: //RTSDuration_aa_f0
611 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
612 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
613 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
614 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
615 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
619 case RTSDUR_BA_F1: //RTSDuration_ba_f1
620 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
621 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
622 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
623 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
624 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
628 case RTSDUR_AA_F1: //RTSDuration_aa_f1
629 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
630 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
631 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
632 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
633 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
637 case CTSDUR_BA_F0: //CTSDuration_ba_f0
638 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
639 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
640 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
641 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
645 case CTSDUR_BA_F1: //CTSDuration_ba_f1
646 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
647 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
648 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
649 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
663 struct vnt_private *pDevice,
664 unsigned char byPktType,
666 unsigned int cbFrameLength,
667 unsigned int uDMAIdx,
669 unsigned int uFragIdx,
670 unsigned int cbLastFragmentSize,
671 unsigned int uMACfragNum,
672 unsigned char byFBOption,
673 unsigned short wCurrentRate
677 if (pTxDataHead == NULL)
681 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
682 if (byFBOption == AUTO_FB_NONE) {
683 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
684 /* Get SignalField, ServiceField & Length */
685 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
686 byPktType, &pBuf->a);
688 vnt_get_phy_field(pDevice, cbFrameLength,
689 pDevice->byTopCCKBasicRate,
690 PK_TYPE_11B, &pBuf->b);
692 //Get Duration and TimeStamp
693 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
694 byPktType, wCurrentRate, bNeedAck, uFragIdx,
695 cbLastFragmentSize, uMACfragNum,
696 byFBOption)); //1: 2.4GHz
697 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
698 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
699 bNeedAck, uFragIdx, cbLastFragmentSize,
700 uMACfragNum, byFBOption)); //1: 2.4
702 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
703 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
705 return pBuf->wDuration_a;
708 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
709 /* Get SignalField, ServiceField & Length */
710 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
711 byPktType, &pBuf->a);
713 vnt_get_phy_field(pDevice, cbFrameLength,
714 pDevice->byTopCCKBasicRate,
715 PK_TYPE_11B, &pBuf->b);
716 //Get Duration and TimeStamp
717 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
718 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
719 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
720 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
721 pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
722 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
723 pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
724 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
726 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
727 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
729 return pBuf->wDuration_a;
730 } //if (byFBOption == AUTO_FB_NONE)
731 } else if (byPktType == PK_TYPE_11A) {
732 if ((byFBOption != AUTO_FB_NONE)) {
734 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
735 /* Get SignalField, ServiceField & Length */
736 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
737 byPktType, &pBuf->a);
739 //Get Duration and TimeStampOff
741 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
742 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
743 pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
744 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
745 pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
746 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
747 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
748 return pBuf->wDuration;
750 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
751 /* Get SignalField, ServiceField & Length */
752 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
753 byPktType, &pBuf->ab);
754 //Get Duration and TimeStampOff
756 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
757 wCurrentRate, bNeedAck, uFragIdx,
758 cbLastFragmentSize, uMACfragNum,
761 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
762 return pBuf->wDuration;
765 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
766 /* Get SignalField, ServiceField & Length */
767 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
768 byPktType, &pBuf->ab);
769 //Get Duration and TimeStampOff
770 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
771 wCurrentRate, bNeedAck, uFragIdx,
772 cbLastFragmentSize, uMACfragNum,
774 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
775 return pBuf->wDuration;
783 struct vnt_private *pDevice,
784 unsigned char byPktType,
786 unsigned int cbFrameLength,
789 PSEthernetHeader psEthHeader,
790 unsigned short wCurrentRate,
791 unsigned char byFBOption
794 unsigned int uRTSFrameLen = 20;
800 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
801 // in this case we need to decrease its length by 4.
805 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
806 // Otherwise, we need to modify codes for them.
807 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
808 if (byFBOption == AUTO_FB_NONE) {
809 PSRTS_g pBuf = (PSRTS_g)pvRTS;
810 /* Get SignalField, ServiceField & Length */
811 vnt_get_phy_field(pDevice, uRTSFrameLen,
812 pDevice->byTopCCKBasicRate,
813 PK_TYPE_11B, &pBuf->b);
815 vnt_get_phy_field(pDevice, uRTSFrameLen,
816 pDevice->byTopOFDMBasicRate,
817 byPktType, &pBuf->a);
819 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
820 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
821 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
823 pBuf->Data.wDurationID = pBuf->wDuration_aa;
825 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
826 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
827 (pDevice->eOPMode == OP_MODE_AP)) {
828 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
830 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
832 if (pDevice->eOPMode == OP_MODE_AP)
833 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
835 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
838 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
839 /* Get SignalField, ServiceField & Length */
840 vnt_get_phy_field(pDevice, uRTSFrameLen,
841 pDevice->byTopCCKBasicRate,
842 PK_TYPE_11B, &pBuf->b);
844 vnt_get_phy_field(pDevice, uRTSFrameLen,
845 pDevice->byTopOFDMBasicRate,
846 byPktType, &pBuf->a);
848 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
849 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
850 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
851 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
852 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
853 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
854 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
855 pBuf->Data.wDurationID = pBuf->wDuration_aa;
857 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
859 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
860 (pDevice->eOPMode == OP_MODE_AP)) {
861 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
863 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
866 if (pDevice->eOPMode == OP_MODE_AP)
867 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
869 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
871 } // if (byFBOption == AUTO_FB_NONE)
872 } else if (byPktType == PK_TYPE_11A) {
873 if (byFBOption == AUTO_FB_NONE) {
874 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
875 /* Get SignalField, ServiceField & Length */
876 vnt_get_phy_field(pDevice, uRTSFrameLen,
877 pDevice->byTopOFDMBasicRate,
878 byPktType, &pBuf->ab);
880 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
881 pBuf->Data.wDurationID = pBuf->wDuration;
883 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
885 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
886 (pDevice->eOPMode == OP_MODE_AP)) {
887 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
889 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
892 if (pDevice->eOPMode == OP_MODE_AP)
893 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
895 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
898 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
899 /* Get SignalField, ServiceField & Length */
900 vnt_get_phy_field(pDevice, uRTSFrameLen,
901 pDevice->byTopOFDMBasicRate,
902 byPktType, &pBuf->a);
904 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
905 pBuf->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
906 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:
907 pBuf->Data.wDurationID = pBuf->wDuration;
909 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
911 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
912 (pDevice->eOPMode == OP_MODE_AP)) {
913 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
915 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
917 if (pDevice->eOPMode == OP_MODE_AP)
918 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
920 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
922 } else if (byPktType == PK_TYPE_11B) {
923 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
924 /* Get SignalField, ServiceField & Length */
925 vnt_get_phy_field(pDevice, uRTSFrameLen,
926 pDevice->byTopCCKBasicRate,
927 PK_TYPE_11B, &pBuf->ab);
929 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
930 pBuf->Data.wDurationID = pBuf->wDuration;
932 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
934 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
935 (pDevice->eOPMode == OP_MODE_AP)) {
936 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
938 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
941 if (pDevice->eOPMode == OP_MODE_AP)
942 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
944 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
951 struct vnt_private *pDevice,
952 unsigned int uDMAIdx,
953 unsigned char byPktType,
955 unsigned int cbFrameLength,
958 unsigned short wCurrentRate,
959 unsigned char byFBOption
962 unsigned int uCTSFrameLen = 14;
968 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
969 // in this case we need to decrease its length by 4.
973 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
974 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
976 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
977 /* Get SignalField, ServiceField & Length */
978 vnt_get_phy_field(pDevice, uCTSFrameLen,
979 pDevice->byTopCCKBasicRate,
980 PK_TYPE_11B, &pBuf->b);
982 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
983 pBuf->wDuration_ba += pDevice->wCTSDuration;
984 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
985 //Get CTSDuration_ba_f0
986 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
987 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
988 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
989 //Get CTSDuration_ba_f1
990 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
991 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
992 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
994 pBuf->Data.wDurationID = pBuf->wDuration_ba;
995 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
996 pBuf->Data.wReserved = 0x0000;
997 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
999 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1000 PSCTS pBuf = (PSCTS)pvCTS;
1001 /* Get SignalField, ServiceField & Length */
1002 vnt_get_phy_field(pDevice, uCTSFrameLen,
1003 pDevice->byTopCCKBasicRate,
1004 PK_TYPE_11B, &pBuf->b);
1006 //Get CTSDuration_ba
1007 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
1008 pBuf->wDuration_ba += pDevice->wCTSDuration;
1009 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1011 //Get CTS Frame body
1012 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1013 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1014 pBuf->Data.wReserved = 0x0000;
1015 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1023 * Generate FIFO control for MAC & Baseband controller
1027 * pDevice - Pointer to adapter
1028 * pTxDataHead - Transmit Data Buffer
1029 * pTxBufHead - pTxBufHead
1030 * pvRrvTime - pvRrvTime
1031 * pvRTS - RTS Buffer
1033 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1034 * bNeedACK - If need ACK
1035 * uDescIdx - Desc Index
1039 * Return Value: none
1042 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1045 s_vGenerateTxParameter(
1046 struct vnt_private *pDevice,
1047 unsigned char byPktType,
1052 unsigned int cbFrameSize,
1054 unsigned int uDMAIdx,
1055 PSEthernetHeader psEthHeader,
1056 unsigned short wCurrentRate
1059 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1060 unsigned short wFifoCtl;
1061 bool bDisCRC = false;
1062 unsigned char byFBOption = AUTO_FB_NONE;
1064 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1066 pFifoHead->wReserved = wCurrentRate;
1067 wFifoCtl = pFifoHead->wFIFOCtl;
1069 if (wFifoCtl & FIFOCTL_CRCDIS)
1072 if (wFifoCtl & FIFOCTL_AUTO_FB_0)
1073 byFBOption = AUTO_FB_0;
1074 else if (wFifoCtl & FIFOCTL_AUTO_FB_1)
1075 byFBOption = AUTO_FB_1;
1077 if (pDevice->bLongHeader)
1078 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1080 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1081 if (pvRTS != NULL) { //RTS_need
1084 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1086 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1087 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1088 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1089 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1090 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1093 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1094 } else {//RTS_needless, PCF mode
1098 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1100 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1101 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1102 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1106 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1108 } else if (byPktType == PK_TYPE_11A) {
1109 if (pvRTS != NULL) {//RTS_need, non PCF mode
1112 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1114 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1115 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1118 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1119 } else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1122 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1124 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1127 } else if (byPktType == PK_TYPE_11B) {
1128 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1131 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1133 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1134 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1137 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1138 } else { //RTS_needless, non PCF mode
1141 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1143 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1151 s_vFillFragParameter(
1152 struct vnt_private *pDevice,
1153 unsigned char *pbyBuffer,
1154 unsigned int uTxType,
1156 unsigned short wFragType,
1157 unsigned int cbReqCount
1160 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1162 if (uTxType == TYPE_SYNCDMA) {
1163 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1165 //Set FIFOCtl & TimeStamp in TxSyncDesc
1166 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1167 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1168 //Set TSR1 & ReqCount in TxDescHead
1169 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1170 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1171 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1173 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1175 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1176 //Set TSR1 & ReqCount in TxDescHead
1177 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1178 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1179 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1181 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1184 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1188 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
1189 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
1190 unsigned int uDMAIdx, PSTxDesc pHeadTD,
1191 PSEthernetHeader psEthHeader, unsigned char *pPacket,
1192 bool bNeedEncrypt, PSKeyItem pTransmitKey,
1193 unsigned int uNodeIndex, unsigned int *puMACfragNum)
1195 unsigned int cbMACHdLen;
1196 unsigned int cbFrameSize;
1197 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1198 unsigned int cbFragPayloadSize;
1199 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1200 unsigned int cbLastFragPayloadSize;
1201 unsigned int uFragIdx;
1202 unsigned char *pbyPayloadHead;
1203 unsigned char *pbyIVHead;
1204 unsigned char *pbyMacHdr;
1205 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1206 unsigned int uDuration;
1207 unsigned char *pbyBuffer;
1208 unsigned int cbIVlen = 0;
1209 unsigned int cbICVlen = 0;
1210 unsigned int cbMIClen = 0;
1211 unsigned int cbFCSlen = 4;
1212 unsigned int cb802_1_H_len = 0;
1213 unsigned int uLength = 0;
1214 unsigned int uTmpLen = 0;
1215 unsigned int cbMICHDR = 0;
1216 u32 dwMICKey0, dwMICKey1;
1220 u32 dwSafeMIC_L, dwSafeMIC_R; /* Fix "Last Frag Size" < "MIC length". */
1221 bool bMIC2Frag = false;
1222 unsigned int uMICFragLen = 0;
1223 unsigned int uMACfragNum = 1;
1224 unsigned int uPadding = 0;
1225 unsigned int cbReqCount = 0;
1230 unsigned char *pbyType;
1232 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1233 unsigned int cbHeaderLength = 0;
1235 struct vnt_mic_hdr *pMICHDR;
1239 unsigned short wTxBufSize; // FFinfo size
1240 unsigned int uTotalCopyLength = 0;
1241 unsigned char byFBOption = AUTO_FB_NONE;
1242 bool bIsWEP256 = false;
1243 PSMgmtObject pMgmt = pDevice->pMgmt;
1245 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1247 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1248 (pDevice->eOPMode == OP_MODE_AP)) {
1249 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1255 // MSDUs in Infra mode always need ACK
1260 if (pDevice->bLongHeader)
1261 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1263 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1265 if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1266 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1269 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)
1272 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1273 cbIVlen = 8;//IV+ExtIV
1277 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1278 cbIVlen = 8;//RSN Header
1280 cbMICHDR = sizeof(struct vnt_mic_hdr);
1282 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1283 //MAC Header should be padding 0 to DW alignment.
1284 uPadding = 4 - (cbMACHdLen%4);
1289 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1291 if ((bNeedACK == false) ||
1292 (cbFrameSize < pDevice->wRTSThreshold) ||
1293 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1298 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1301 // Use for AUTO FALL BACK
1303 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0)
1304 byFBOption = AUTO_FB_0;
1305 else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1)
1306 byFBOption = AUTO_FB_1;
1308 //////////////////////////////////////////////////////
1309 //Set RrvTime/RTS/CTS Buffer
1310 wTxBufSize = sizeof(STxBufHead);
1311 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1313 if (byFBOption == AUTO_FB_NONE) {
1314 if (bRTS == true) {//RTS_need
1315 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1316 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1317 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1319 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1320 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1321 } else { //RTS_needless
1322 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1323 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1325 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1326 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1327 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1331 if (bRTS == true) {//RTS_need
1332 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1333 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1334 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1336 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1337 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1338 } else { //RTS_needless
1339 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1340 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1342 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1343 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1344 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1347 } else {//802.11a/b packet
1349 if (byFBOption == AUTO_FB_NONE) {
1351 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1352 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1353 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1355 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1356 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1357 } else { //RTS_needless, need MICHDR
1358 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1359 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1362 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1363 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1367 if (bRTS == true) {//RTS_need
1368 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1369 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1370 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1372 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1373 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1374 } else { //RTS_needless
1375 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1376 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1379 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1380 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1384 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1386 //////////////////////////////////////////////////////////////////
1387 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1388 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1389 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1390 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1391 } else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1392 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1393 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1395 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]);
1396 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]);
1398 // DO Software Michael
1399 MIC_vInit(dwMICKey0, dwMICKey1);
1400 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1402 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1403 pr_debug("MIC KEY: %X, %X\n", dwMICKey0, dwMICKey1);
1406 ///////////////////////////////////////////////////////////////////
1408 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1409 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1410 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1412 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1414 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1415 cbFragmentSize = pDevice->wFragmentationThreshold;
1416 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1417 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1418 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1419 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1420 if (cbLastFragPayloadSize == 0)
1421 cbLastFragPayloadSize = cbFragPayloadSize;
1425 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1426 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1428 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
1429 if (uFragIdx == 0) {
1430 //=========================
1431 // Start Fragmentation
1432 //=========================
1433 pr_debug("Start Fragmentation...\n");
1434 wFragType = FRAGCTL_STAFRAG;
1436 //Fill FIFO,RrvTime,RTS,and CTS
1437 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1438 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1440 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1441 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1442 // Generate TX MAC Header
1443 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1444 wFragType, uDMAIdx, uFragIdx);
1446 if (bNeedEncrypt == true) {
1448 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1449 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1450 //Fill IV(ExtIV,RSNHDR)
1451 if (pDevice->bEnableHostWEP) {
1452 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1453 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1458 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1459 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1460 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1461 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1463 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1465 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1466 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1470 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1471 //---------------------------
1472 // S/W or H/W Encryption
1473 //---------------------------
1474 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1476 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1477 //copy TxBufferHeader + MacHeader to desc
1478 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1480 // Copy the Packet into a tx Buffer
1481 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1483 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1485 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1486 pr_debug("Start MIC: %d\n",
1488 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1492 //---------------------------
1494 //---------------------------
1495 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1497 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1498 cbReqCount += cbICVlen;
1502 ptdCurr = (PSTxDesc)pHeadTD;
1503 //--------------------
1504 //1.Set TSR1 & ReqCount in TxDescHead
1505 //2.Set FragCtl in TxBufferHead
1506 //3.Set Frame Control
1507 //4.Set Sequence Control
1508 //5.Get S/W generate FCS
1509 //--------------------
1510 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1512 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1513 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1514 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1515 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1516 pDevice->iTDUsed[uDMAIdx]++;
1517 pHeadTD = ptdCurr->next;
1518 } else if (uFragIdx == (uMACfragNum-1)) {
1519 //=========================
1520 // Last Fragmentation
1521 //=========================
1522 pr_debug("Last Fragmentation...\n");
1524 wFragType = FRAGCTL_ENDFRAG;
1526 //Fill FIFO,RrvTime,RTS,and CTS
1527 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1528 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1530 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1531 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1533 // Generate TX MAC Header
1534 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1535 wFragType, uDMAIdx, uFragIdx);
1537 if (bNeedEncrypt == true) {
1539 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1540 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1542 if (pDevice->bEnableHostWEP) {
1543 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1544 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1549 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1550 //---------------------------
1551 // S/W or H/W Encryption
1552 //---------------------------
1554 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1556 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1558 //copy TxBufferHeader + MacHeader to desc
1559 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1561 // Copy the Packet into a tx Buffer
1562 if (bMIC2Frag == false) {
1563 memcpy((pbyBuffer + uLength),
1564 (pPacket + 14 + uTotalCopyLength),
1565 (cbLastFragPayloadSize - cbMIClen)
1567 //TODO check uTmpLen !
1568 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1571 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1572 pr_debug("LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1574 cbLastFragPayloadSize,
1577 if (bMIC2Frag == false) {
1579 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1580 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1581 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1582 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1583 pr_debug("Last MIC:%X, %X\n",
1584 *pdwMIC_L, *pdwMIC_R);
1586 if (uMICFragLen >= 4) {
1587 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1588 (cbMIClen - uMICFragLen));
1589 pr_debug("LAST: uMICFragLen >= 4: %X, %d\n",
1590 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1591 (cbMIClen - uMICFragLen));
1594 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1596 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1597 pr_debug("LAST: uMICFragLen < 4: %X, %d\n",
1598 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1599 (cbMIClen - uMICFragLen));
1604 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1607 //---------------------------
1609 //---------------------------
1610 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1612 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1613 cbReqCount += cbICVlen;
1617 ptdCurr = (PSTxDesc)pHeadTD;
1619 //--------------------
1620 //1.Set TSR1 & ReqCount in TxDescHead
1621 //2.Set FragCtl in TxBufferHead
1622 //3.Set Frame Control
1623 //4.Set Sequence Control
1624 //5.Get S/W generate FCS
1625 //--------------------
1627 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1629 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1630 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1631 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1632 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1633 pDevice->iTDUsed[uDMAIdx]++;
1634 pHeadTD = ptdCurr->next;
1637 //=========================
1638 // Middle Fragmentation
1639 //=========================
1640 pr_debug("Middle Fragmentation...\n");
1642 wFragType = FRAGCTL_MIDFRAG;
1644 //Fill FIFO,RrvTime,RTS,and CTS
1645 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1646 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1648 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1649 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1651 // Generate TX MAC Header
1652 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1653 wFragType, uDMAIdx, uFragIdx);
1655 if (bNeedEncrypt == true) {
1657 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1658 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1660 if (pDevice->bEnableHostWEP) {
1661 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1662 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1666 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1667 //---------------------------
1668 // S/W or H/W Encryption
1669 //---------------------------
1671 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1672 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1674 //copy TxBufferHeader + MacHeader to desc
1675 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1677 // Copy the Packet into a tx Buffer
1678 memcpy((pbyBuffer + uLength),
1679 (pPacket + 14 + uTotalCopyLength),
1682 uTmpLen = cbFragPayloadSize;
1684 uTotalCopyLength += uTmpLen;
1686 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1687 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1689 if (uTmpLen < cbFragPayloadSize) {
1691 uMICFragLen = cbFragPayloadSize - uTmpLen;
1692 ASSERT(uMICFragLen < cbMIClen);
1694 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1695 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1696 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1697 dwSafeMIC_L = *pdwMIC_L;
1698 dwSafeMIC_R = *pdwMIC_R;
1700 pr_debug("MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1704 pr_debug("Fill MIC in Middle frag [%d]\n",
1706 pr_debug("Get MIC:%X, %X\n",
1707 *pdwMIC_L, *pdwMIC_R);
1709 pr_debug("Middle frag len: %d\n",
1713 ASSERT(uTmpLen == (cbFragPayloadSize));
1716 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1718 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1719 cbReqCount += cbICVlen;
1723 ptdCurr = (PSTxDesc)pHeadTD;
1725 //--------------------
1726 //1.Set TSR1 & ReqCount in TxDescHead
1727 //2.Set FragCtl in TxBufferHead
1728 //3.Set Frame Control
1729 //4.Set Sequence Control
1730 //5.Get S/W generate FCS
1731 //--------------------
1733 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1735 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1736 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1737 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1738 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1739 pDevice->iTDUsed[uDMAIdx]++;
1740 pHeadTD = ptdCurr->next;
1742 } // for (uMACfragNum)
1744 //=========================
1746 //=========================
1747 wFragType = FRAGCTL_NONFRAG;
1749 //Set FragCtl in TxBufferHead
1750 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1752 //Fill FIFO,RrvTime,RTS,and CTS
1753 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1754 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1756 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1757 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1759 // Generate TX MAC Header
1760 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1761 wFragType, uDMAIdx, 0);
1763 if (bNeedEncrypt == true) {
1765 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1766 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1768 if (pDevice->bEnableHostWEP) {
1769 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1770 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1775 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1776 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1777 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1778 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1780 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1782 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1783 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1787 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1788 //---------------------------
1789 // S/W or H/W Encryption
1790 //---------------------------
1791 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1792 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1794 //copy TxBufferHeader + MacHeader to desc
1795 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1797 // Copy the Packet into a tx Buffer
1798 memcpy((pbyBuffer + uLength),
1800 cbFrameBodySize - cb802_1_H_len
1803 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1804 pr_debug("Length:%d, %d\n",
1805 cbFrameBodySize - cb802_1_H_len, uLength);
1807 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
1809 pdwMIC_L = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
1810 pdwMIC_R = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
1812 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1815 if (pDevice->bTxMICFail == true) {
1818 pDevice->bTxMICFail = false;
1821 pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
1822 pr_debug("cbReqCount:%d, %d, %d, %d\n",
1823 cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1824 pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
1828 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1830 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
1831 (unsigned short)(cbFrameBodySize + cbMIClen));
1832 cbReqCount += cbICVlen;
1836 ptdCurr = (PSTxDesc)pHeadTD;
1838 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1839 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1840 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1841 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1842 //Set TSR1 & ReqCount in TxDescHead
1843 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1844 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1846 pDevice->iTDUsed[uDMAIdx]++;
1849 *puMACfragNum = uMACfragNum;
1851 return cbHeaderLength;
1855 vGenerateFIFOHeader(struct vnt_private *pDevice, unsigned char byPktType,
1856 unsigned char *pbyTxBufferAddr, bool bNeedEncrypt,
1857 unsigned int cbPayloadSize, unsigned int uDMAIdx,
1858 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
1859 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
1860 unsigned int *pcbHeaderSize)
1862 unsigned int wTxBufSize; // FFinfo size
1865 unsigned short cbMacHdLen;
1866 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1868 wTxBufSize = sizeof(STxBufHead);
1870 memset(pTxBufHead, 0, wTxBufSize);
1871 //Set FIFOCTL_NEEDACK
1873 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1874 (pDevice->eOPMode == OP_MODE_AP)) {
1875 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
1877 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1880 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1884 // MSDUs in Infra mode always need ACK
1886 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1890 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
1891 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
1894 if (pDevice->bLongHeader)
1895 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1897 //Set FIFOCTL_GENINT
1899 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
1901 //Set FIFOCTL_ISDMA0
1902 if (TYPE_TXDMA0 == uDMAIdx)
1903 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
1905 //Set FRAGCTL_MACHDCNT
1906 if (pDevice->bLongHeader)
1907 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
1909 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
1911 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
1914 if (byPktType == PK_TYPE_11A) //0000 0000 0000 0000
1916 else if (byPktType == PK_TYPE_11B) //0000 0001 0000 0000
1917 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
1918 else if (byPktType == PK_TYPE_11GB) //0000 0010 0000 0000
1919 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
1920 else if (byPktType == PK_TYPE_11GA) //0000 0011 0000 0000
1921 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
1923 //Set FIFOCTL_GrpAckPolicy
1924 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
1925 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1927 //Set Auto Fallback Ctl
1928 if (pDevice->wCurrentRate >= RATE_18M) {
1929 if (pDevice->byAutoFBCtrl == AUTO_FB_0)
1930 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1931 else if (pDevice->byAutoFBCtrl == AUTO_FB_1)
1932 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1935 //Set FRAGCTL_WEPTYP
1936 pDevice->bAES = false;
1938 //Set FRAGCTL_WEPTYP
1939 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1940 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
1941 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1942 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1943 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1944 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
1945 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1946 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1947 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1952 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
1954 pTxBufHead->byTxPower = pDevice->byCurPwr;
1956 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
1957 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
1958 pTransmitKey, uNodeIndex, puMACfragNum);
1964 * Translate 802.3 to 802.11 header
1968 * pDevice - Pointer to adapter
1969 * dwTxBufferAddr - Transmit Buffer
1970 * pPacket - Packet from upper layer
1971 * cbPacketSize - Transmit Data Length
1973 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1974 * pcbAppendPayload - size of append payload for 802.1H translation
1976 * Return Value: none
1982 struct vnt_private *pDevice,
1983 unsigned char *pbyBufferAddr,
1984 unsigned short wDuration,
1985 PSEthernetHeader psEthHeader,
1987 unsigned short wFragType,
1988 unsigned int uDMAIdx,
1989 unsigned int uFragIdx
1992 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
1994 memset(pMACHeader, 0, (sizeof(S802_11Header)));
1996 if (uDMAIdx == TYPE_ATIMDMA)
1997 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
1999 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2001 if (pDevice->eOPMode == OP_MODE_AP) {
2002 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2003 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2004 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2005 pMACHeader->wFrameCtl |= FC_FROMDS;
2007 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2008 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2009 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2010 memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2012 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2013 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2014 memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2015 pMACHeader->wFrameCtl |= FC_TODS;
2020 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2022 pMACHeader->wDurationID = cpu_to_le16(wDuration);
2024 if (pDevice->bLongHeader) {
2025 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2027 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2028 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2030 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2032 //Set FragNumber in Sequence Control
2033 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2035 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2036 pDevice->wSeqCounter++;
2037 if (pDevice->wSeqCounter > 0x0fff)
2038 pDevice->wSeqCounter = 0;
2041 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) //StartFrag or MidFrag
2042 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2045 CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2048 unsigned char byPktType;
2049 unsigned char *pbyTxBufferAddr;
2053 unsigned int uDuration;
2054 unsigned int cbReqCount;
2055 PS802_11Header pMACHeader;
2056 unsigned int cbHeaderSize;
2057 unsigned int cbFrameBodySize;
2059 bool bIsPSPOLL = false;
2060 PSTxBufHead pTxBufHead;
2061 unsigned int cbFrameSize;
2062 unsigned int cbIVlen = 0;
2063 unsigned int cbICVlen = 0;
2064 unsigned int cbMIClen = 0;
2065 unsigned int cbFCSlen = 4;
2066 unsigned int uPadding = 0;
2067 unsigned short wTxBufSize;
2068 unsigned int cbMacHdLen;
2069 SEthernetHeader sEthHeader;
2072 PSMgmtObject pMgmt = pDevice->pMgmt;
2073 unsigned short wCurrentRate = RATE_1M;
2075 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0)
2076 return CMD_STATUS_RESOURCES;
2078 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2079 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2080 cbFrameBodySize = pPacket->cbPayloadLen;
2081 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2082 wTxBufSize = sizeof(STxBufHead);
2083 memset(pTxBufHead, 0, wTxBufSize);
2085 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2086 wCurrentRate = RATE_6M;
2087 byPktType = PK_TYPE_11A;
2089 wCurrentRate = RATE_1M;
2090 byPktType = PK_TYPE_11B;
2093 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2094 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2095 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2096 // to set power here.
2097 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2098 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2100 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2102 pTxBufHead->byTxPower = pDevice->byCurPwr;
2103 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2104 if (pDevice->byFOETuning) {
2105 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2106 wCurrentRate = RATE_24M;
2107 byPktType = PK_TYPE_11GA;
2112 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2113 pTxBufHead->wFIFOCtl = 0;
2114 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2115 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2116 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2117 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2118 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2119 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2122 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2123 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2125 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2129 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2132 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2133 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2134 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2137 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2139 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2141 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2143 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2146 //Set FRAGCTL_MACHDCNT
2147 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2150 // Although spec says MMPDU can be fragmented; In most cases,
2151 // no one will send a MMPDU under fragmentation. With RTS may occur.
2152 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2154 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2155 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2158 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2159 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2160 cbIVlen = 8;//IV+ExtIV
2163 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2164 //We need to get seed here for filling TxKey entry.
2165 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2166 cbIVlen = 8;//RSN Header
2168 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2169 pDevice->bAES = true;
2171 //MAC Header should be padding 0 to DW alignment.
2172 uPadding = 4 - (cbMacHdLen%4);
2176 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2178 //Set FIFOCTL_GrpAckPolicy
2179 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2180 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2182 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2184 //Set RrvTime/RTS/CTS Buffer
2185 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2187 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2190 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2191 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2192 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2193 } else { // 802.11a/b packet
2194 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2198 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2199 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2202 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2204 memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2205 memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2206 //=========================
2208 //=========================
2209 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2211 //Fill FIFO,RrvTime,RTS,and CTS
2212 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2213 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2216 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2217 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2219 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2221 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2223 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2224 unsigned char *pbyIVHead;
2225 unsigned char *pbyPayloadHead;
2226 unsigned char *pbyBSSID;
2227 PSKeyItem pTransmitKey = NULL;
2229 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2230 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2233 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2234 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2236 //Fill IV(ExtIV,RSNHDR)
2237 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2238 //---------------------------
2239 // S/W or H/W Encryption
2240 //---------------------------
2242 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2243 (pDevice->bLinkPass == true)) {
2244 pbyBSSID = pDevice->abyBSSID;
2246 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2248 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2249 pr_debug("Get GTK\n");
2253 pr_debug("Get PTK\n");
2258 pbyBSSID = pDevice->abyBroadcastAddr;
2259 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2260 pTransmitKey = NULL;
2261 pr_debug("KEY is NULL. OP Mode[%d]\n",
2264 pr_debug("Get GTK\n");
2268 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2269 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2271 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2272 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2275 // Copy the Packet into a tx Buffer
2276 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2279 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2280 pDevice->wSeqCounter++;
2281 if (pDevice->wSeqCounter > 0x0fff)
2282 pDevice->wSeqCounter = 0;
2285 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2286 // of FIFO control header.
2287 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2288 // in the same place of other packet's Duration-field).
2289 // And it will cause Cisco-AP to issue Disassociation-packet
2290 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2291 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2292 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2294 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2298 // first TD is the only TD
2299 //Set TSR1 & ReqCount in TxDescHead
2300 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2301 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2302 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2303 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2304 pFrstTD->pTDInfo->byFlags = 0;
2306 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2308 MACbPSWakeup(pDevice->PortOffset);
2310 pDevice->bPWBitOn = false;
2313 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2316 pDevice->iTDUsed[TYPE_TXDMA0]++;
2318 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2319 pr_debug(" available td0 <= 1\n");
2321 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2323 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2325 // Poll Transmit the adapter
2326 MACvTransmit0(pDevice->PortOffset);
2328 return CMD_STATUS_PENDING;
2331 CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2333 unsigned char byPktType;
2334 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2335 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2336 unsigned int cbHeaderSize = 0;
2337 struct vnt_tx_short_buf_head *short_head =
2338 (struct vnt_tx_short_buf_head *)pbyBuffer;
2339 PS802_11Header pMACHeader;
2340 unsigned short wCurrentRate;
2342 memset(short_head, 0, sizeof(*short_head));
2344 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2345 wCurrentRate = RATE_6M;
2346 byPktType = PK_TYPE_11A;
2348 wCurrentRate = RATE_2M;
2349 byPktType = PK_TYPE_11B;
2352 //Set Preamble type always long
2353 pDevice->byPreambleType = PREAMBLE_LONG;
2355 /* Set FIFOCTL_GENINT */
2356 short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT);
2358 /* Set packet type & Get Duration */
2359 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2360 short_head->duration =
2361 cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A,
2362 cbFrameSize, byPktType, wCurrentRate, false,
2363 0, 0, 1, AUTO_FB_NONE));
2364 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2365 short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_11B);
2367 short_head->duration =
2368 cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B,
2369 cbFrameSize, byPktType, wCurrentRate, false,
2370 0, 0, 1, AUTO_FB_NONE));
2373 vnt_get_phy_field(pDevice, cbFrameSize,
2374 wCurrentRate, byPktType, &short_head->ab);
2376 /* Get TimeStampOff */
2377 short_head->time_stamp_off = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
2378 cbHeaderSize = sizeof(struct vnt_tx_short_buf_head);
2380 //Generate Beacon Header
2381 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2382 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2384 pMACHeader->wDurationID = 0;
2385 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2386 pDevice->wSeqCounter++;
2387 if (pDevice->wSeqCounter > 0x0fff)
2388 pDevice->wSeqCounter = 0;
2390 // Set Beacon buffer length
2391 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2393 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2395 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2396 // Set auto Transmit on
2397 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2398 // Poll Transmit the adapter
2399 MACvTransmitBCN(pDevice->PortOffset);
2401 return CMD_STATUS_PENDING;
2406 struct vnt_private *pDevice,
2407 PSKeyItem pTransmitKey,
2408 unsigned int cbFrameBodySize,
2409 PSEthernetHeader psEthHeader
2412 unsigned int cbMACHdLen;
2413 unsigned int cbFrameSize;
2414 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2415 unsigned int cbFragPayloadSize;
2416 unsigned int cbLastFragPayloadSize;
2417 unsigned int cbIVlen = 0;
2418 unsigned int cbICVlen = 0;
2419 unsigned int cbMIClen = 0;
2420 unsigned int cbFCSlen = 4;
2421 unsigned int uMACfragNum = 1;
2424 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2425 (pDevice->eOPMode == OP_MODE_AP)) {
2426 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2431 // MSDUs in Infra mode always need ACK
2435 if (pDevice->bLongHeader)
2436 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2438 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2440 if (pDevice->bEncryptionEnable == true) {
2441 if (pTransmitKey == NULL) {
2442 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2443 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2446 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2447 cbIVlen = 8;//IV+ExtIV
2450 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2451 cbIVlen = 8;//RSN Header
2454 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2457 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2458 cbIVlen = 8;//IV+ExtIV
2461 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2462 cbIVlen = 8;//RSN Header
2467 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2469 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2471 cbFragmentSize = pDevice->wFragmentationThreshold;
2472 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2473 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2474 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2475 if (cbLastFragPayloadSize == 0)
2476 cbLastFragPayloadSize = cbFragPayloadSize;
2483 void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb,
2484 unsigned char *pbMPDU, unsigned int cbMPDULen)
2487 unsigned char byPktType;
2488 unsigned char *pbyTxBufferAddr;
2492 unsigned int uDuration;
2493 unsigned int cbReqCount;
2494 PS802_11Header pMACHeader;
2495 unsigned int cbHeaderSize;
2496 unsigned int cbFrameBodySize;
2498 bool bIsPSPOLL = false;
2499 PSTxBufHead pTxBufHead;
2500 unsigned int cbFrameSize;
2501 unsigned int cbIVlen = 0;
2502 unsigned int cbICVlen = 0;
2503 unsigned int cbMIClen = 0;
2504 unsigned int cbFCSlen = 4;
2505 unsigned int uPadding = 0;
2506 unsigned int cbMICHDR = 0;
2507 unsigned int uLength = 0;
2508 u32 dwMICKey0, dwMICKey1;
2512 unsigned short wTxBufSize;
2513 unsigned int cbMacHdLen;
2514 SEthernetHeader sEthHeader;
2517 PSMgmtObject pMgmt = pDevice->pMgmt;
2518 unsigned short wCurrentRate = RATE_1M;
2519 PUWLAN_80211HDR p80211Header;
2520 unsigned int uNodeIndex = 0;
2521 bool bNodeExist = false;
2523 PSKeyItem pTransmitKey = NULL;
2524 unsigned char *pbyIVHead;
2525 unsigned char *pbyPayloadHead;
2526 unsigned char *pbyMacHdr;
2528 unsigned int cbExtSuppRate = 0;
2530 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2532 if (cbMPDULen <= WLAN_HDR_ADDR3_LEN)
2533 cbFrameBodySize = 0;
2535 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2537 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2539 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2540 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2541 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2542 wTxBufSize = sizeof(STxBufHead);
2543 memset(pTxBufHead, 0, wTxBufSize);
2545 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2546 wCurrentRate = RATE_6M;
2547 byPktType = PK_TYPE_11A;
2549 wCurrentRate = RATE_1M;
2550 byPktType = PK_TYPE_11B;
2553 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2554 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2555 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2556 // to set power here.
2557 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2558 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2560 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2562 pTxBufHead->byTxPower = pDevice->byCurPwr;
2564 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2565 if (pDevice->byFOETuning) {
2566 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2567 wCurrentRate = RATE_24M;
2568 byPktType = PK_TYPE_11GA;
2572 pr_debug("vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x\n",
2573 p80211Header->sA3.wFrameCtl);
2576 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2577 pTxBufHead->wFIFOCtl = 0;
2578 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2579 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2580 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2581 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2582 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2583 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2586 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2587 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2589 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2591 if (pDevice->bEnableHostWEP) {
2596 if (pDevice->bEnableHostWEP) {
2597 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2601 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2604 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2605 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2606 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2609 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2611 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2613 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2615 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2618 // hostapd deamon ext support rate patch
2619 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2620 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2621 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2623 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2624 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2626 if (cbExtSuppRate > 0)
2627 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2630 //Set FRAGCTL_MACHDCNT
2631 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2634 // Although spec says MMPDU can be fragmented; In most cases,
2635 // no one will send a MMPDU under fragmentation. With RTS may occur.
2636 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2638 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2639 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2642 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2643 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2644 cbIVlen = 8;//IV+ExtIV
2647 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2648 //We need to get seed here for filling TxKey entry.
2649 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2650 cbIVlen = 8;//RSN Header
2652 cbMICHDR = sizeof(struct vnt_mic_hdr);
2653 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2654 pDevice->bAES = true;
2656 //MAC Header should be padding 0 to DW alignment.
2657 uPadding = 4 - (cbMacHdLen%4);
2661 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2663 //Set FIFOCTL_GrpAckPolicy
2664 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2665 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2667 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2669 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2671 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2672 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2674 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2675 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2676 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2678 } else {//802.11a/b packet
2680 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2681 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2684 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2685 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2689 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2690 memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2691 memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2692 //=========================
2694 //=========================
2695 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2697 //Fill FIFO,RrvTime,RTS,and CTS
2698 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2699 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2702 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2703 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2705 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2707 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2709 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
2710 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2711 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
2713 // Copy the Packet into a tx Buffer
2714 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
2716 // version set to 0, patch for hostapd deamon
2717 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2718 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
2720 // replace support rate, patch for hostapd deamon(only support 11M)
2721 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2722 if (cbExtSuppRate != 0) {
2723 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2724 memcpy((pbyPayloadHead + cbFrameBodySize),
2725 pMgmt->abyCurrSuppRates,
2726 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2728 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2729 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2730 pMgmt->abyCurrExtSuppRates,
2731 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2737 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2738 if (pDevice->bEnableHostWEP) {
2739 pTransmitKey = &STempKey;
2740 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2741 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2742 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2743 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2744 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2745 memcpy(pTransmitKey->abyKey,
2746 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2747 pTransmitKey->uKeyLength
2751 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2752 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
2753 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
2755 // DO Software Michael
2756 MIC_vInit(dwMICKey0, dwMICKey1);
2757 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
2759 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
2760 pr_debug("DMA0_tx_8021:MIC KEY: %X, %X\n",
2761 dwMICKey0, dwMICKey1);
2763 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2765 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2767 pdwMIC_L = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2768 pdwMIC_R = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2770 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2773 if (pDevice->bTxMICFail == true) {
2776 pDevice->bTxMICFail = false;
2779 pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
2780 pr_debug("cbReqCount:%d, %d, %d, %d\n",
2781 cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2782 pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
2786 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2787 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
2789 if (pDevice->bEnableHostWEP) {
2790 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2791 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2794 if ((pDevice->byLocalID <= REV_ID_VT3253_A1))
2795 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
2798 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2799 pDevice->wSeqCounter++;
2800 if (pDevice->wSeqCounter > 0x0fff)
2801 pDevice->wSeqCounter = 0;
2804 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2805 // of FIFO control header.
2806 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2807 // in the same place of other packet's Duration-field).
2808 // And it will cause Cisco-AP to issue Disassociation-packet
2809 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2810 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2811 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2813 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2817 // first TD is the only TD
2818 //Set TSR1 & ReqCount in TxDescHead
2819 pFrstTD->pTDInfo->skb = skb;
2820 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2821 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2822 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
2823 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2824 pFrstTD->pTDInfo->byFlags = 0;
2825 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
2827 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2829 MACbPSWakeup(pDevice->PortOffset);
2831 pDevice->bPWBitOn = false;
2834 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2837 pDevice->iTDUsed[TYPE_TXDMA0]++;
2839 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2840 pr_debug(" available td0 <= 1\n");
2842 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2844 // Poll Transmit the adapter
2845 MACvTransmit0(pDevice->PortOffset);