2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * cbGetFragCount - Calculate fragment number count
31 * csBeacon_xmit - beacon tx function
32 * csMgmt_xmit - management tx function
33 * s_cbFillTxBufHead - fulfill tx dma buffer header
34 * s_uGetDataDuration - get tx data required duration
35 * s_uFillDataHead- fulfill tx data duration header
36 * s_uGetRTSCTSDuration- get rtx/cts required duration
37 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
38 * s_uGetTxRsvTime- get frame reserved time
39 * s_vFillCTSHead- fulfill CTS ctl header
40 * s_vFillFragParameter- Set fragment ctl parameter.
41 * s_vFillRTSHead- fulfill RTS ctl header
42 * s_vFillTxKey- fulfill tx encrypt key
43 * s_vSWencryption- Software encrypt header
44 * vDMA0_tx_80211- tx 802.11 frame via dma0
45 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
71 static int msglevel = MSG_LEVEL_INFO;
75 /*--------------------- Static Functions --------------------------*/
77 /*--------------------- Static Definitions -------------------------*/
78 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
79 // packet size >= 256 -> direct send
81 static const unsigned short wTimeStampOff[2][MAX_RATE] = {
82 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
83 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
86 static const unsigned short wFB_Opt0[2][5] = {
87 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
88 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
90 static const unsigned short wFB_Opt1[2][5] = {
91 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
92 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
99 #define RTSDUR_BA_F0 4
100 #define RTSDUR_AA_F0 5
101 #define RTSDUR_BA_F1 6
102 #define RTSDUR_AA_F1 7
103 #define CTSDUR_BA_F0 8
104 #define CTSDUR_BA_F1 9
107 #define DATADUR_A_F0 12
108 #define DATADUR_A_F1 13
110 /*--------------------- Static Functions --------------------------*/
115 struct vnt_private *pDevice,
116 unsigned char *pbyBuf,
117 unsigned char *pbyIVHead,
118 PSKeyItem pTransmitKey,
119 unsigned char *pbyHdrBuf,
120 unsigned short wPayloadLen,
121 unsigned char *pMICHDR
127 struct vnt_private *pDevice,
128 unsigned char byPktType,
130 unsigned int cbFrameLength,
133 PSEthernetHeader psEthHeader,
134 unsigned short wCurrentRate,
135 unsigned char byFBOption
140 s_vGenerateTxParameter(
141 struct vnt_private *pDevice,
142 unsigned char byPktType,
147 unsigned int cbFrameSize,
149 unsigned int uDMAIdx,
150 PSEthernetHeader psEthHeader,
151 unsigned short wCurrentRate
154 static void s_vFillFragParameter(
155 struct vnt_private *pDevice,
156 unsigned char *pbyBuffer,
157 unsigned int uTxType,
159 unsigned short wFragType,
160 unsigned int cbReqCount
164 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
165 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
166 unsigned int uDMAIdx, PSTxDesc pHeadTD,
167 PSEthernetHeader psEthHeader, unsigned char *pPacket,
168 bool bNeedEncrypt, PSKeyItem pTransmitKey,
169 unsigned int uNodeIndex, unsigned int *puMACfragNum);
174 struct vnt_private *pDevice,
175 unsigned char byPktType,
177 unsigned int cbFrameLength,
178 unsigned int uDMAIdx,
180 unsigned int uFragIdx,
181 unsigned int cbLastFragmentSize,
182 unsigned int uMACfragNum,
183 unsigned char byFBOption,
184 unsigned short wCurrentRate
187 /*--------------------- Export Variables --------------------------*/
192 struct vnt_private *pDevice,
193 unsigned char *pbyBuf,
194 unsigned char *pbyIVHead,
195 PSKeyItem pTransmitKey,
196 unsigned char *pbyHdrBuf,
197 unsigned short wPayloadLen,
198 unsigned char *pMICHDR
201 struct vnt_mic_hdr *mic_hdr = (struct vnt_mic_hdr *)pMICHDR;
202 unsigned long *pdwIV = (unsigned long *)pbyIVHead;
203 unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
204 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
205 unsigned long dwRevIVCounter;
206 unsigned char byKeyIndex = 0;
209 if (pTransmitKey == NULL)
212 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
213 *pdwIV = pDevice->dwIVCounter;
214 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
216 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
217 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
218 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
219 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
221 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
222 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
223 if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
224 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
225 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
227 memcpy(pDevice->abyPRNG, pbyBuf, 16);
229 // Append IV after Mac Header
230 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
231 *pdwIV |= (unsigned long)byKeyIndex << 30;
232 *pdwIV = cpu_to_le32(*pdwIV);
233 pDevice->dwIVCounter++;
234 if (pDevice->dwIVCounter > WEP_IV_MASK)
235 pDevice->dwIVCounter = 0;
237 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
238 pTransmitKey->wTSC15_0++;
239 if (pTransmitKey->wTSC15_0 == 0)
240 pTransmitKey->dwTSC47_16++;
242 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
243 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
244 memcpy(pbyBuf, pDevice->abyPRNG, 16);
246 memcpy(pdwIV, pDevice->abyPRNG, 3);
248 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
249 // Append IV&ExtIV after Mac Header
250 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
251 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
253 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
254 pTransmitKey->wTSC15_0++;
255 if (pTransmitKey->wTSC15_0 == 0)
256 pTransmitKey->dwTSC47_16++;
258 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
262 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
263 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
264 //Append IV&ExtIV after Mac Header
265 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
269 mic_hdr->tx_priority = 0;
270 memcpy(mic_hdr->mic_addr2, pMACHeader->abyAddr2, ETH_ALEN);
272 /* ccmp pn big endian order */
273 mic_hdr->ccmp_pn[0] = (u8)(pTransmitKey->dwTSC47_16 >> 24);
274 mic_hdr->ccmp_pn[1] = (u8)(pTransmitKey->dwTSC47_16 >> 16);
275 mic_hdr->ccmp_pn[2] = (u8)(pTransmitKey->dwTSC47_16 >> 8);
276 mic_hdr->ccmp_pn[3] = (u8)pTransmitKey->dwTSC47_16;
277 mic_hdr->ccmp_pn[4] = (u8)(pTransmitKey->wTSC15_0 >> 8);
278 mic_hdr->ccmp_pn[5] = (u8)pTransmitKey->wTSC15_0;
281 mic_hdr->payload_len = cpu_to_be16(wPayloadLen);
283 if (pDevice->bLongHeader)
284 mic_hdr->hlen = cpu_to_be16(28);
286 mic_hdr->hlen = cpu_to_be16(22);
288 memcpy(mic_hdr->addr1, pMACHeader->abyAddr1, ETH_ALEN);
289 memcpy(mic_hdr->addr2, pMACHeader->abyAddr2, ETH_ALEN);
292 memcpy(mic_hdr->addr3, pMACHeader->abyAddr3, ETH_ALEN);
293 mic_hdr->frame_control =
294 cpu_to_le16(pMACHeader->wFrameCtl & 0xc78f);
295 mic_hdr->seq_ctrl = cpu_to_le16(pMACHeader->wSeqCtl & 0xf);
297 if (pDevice->bLongHeader)
298 memcpy(mic_hdr->addr4, pMACHeader->abyAddr4, ETH_ALEN);
305 struct vnt_private *pDevice,
306 PSKeyItem pTransmitKey,
307 unsigned char *pbyPayloadHead,
308 unsigned short wPayloadSize
311 unsigned int cbICVlen = 4;
312 unsigned long dwICV = 0xFFFFFFFFL;
313 unsigned long *pdwICV;
315 if (pTransmitKey == NULL)
318 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
319 //=======================================================================
320 // Append ICV after payload
321 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
322 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
323 // finally, we must invert dwCRC to get the correct answer
324 *pdwICV = cpu_to_le32(~dwICV);
326 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
327 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
328 //=======================================================================
329 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
330 //=======================================================================
331 //Append ICV after payload
332 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
333 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
334 // finally, we must invert dwCRC to get the correct answer
335 *pdwICV = cpu_to_le32(~dwICV);
337 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
338 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
339 //=======================================================================
343 /*byPktType : PK_TYPE_11A 0
351 struct vnt_private *pDevice,
352 unsigned char byPktType,
353 unsigned int cbFrameLength,
354 unsigned short wRate,
358 unsigned int uDataTime, uAckTime;
360 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
361 if (byPktType == PK_TYPE_11B) //llb,CCK mode
362 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
363 else //11g 2.4G OFDM mode & 11a 5G OFDM mode
364 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
367 return uDataTime + pDevice->uSIFS + uAckTime;
372 //byFreqType: 0=>5GHZ 1=>2.4GHZ
376 struct vnt_private *pDevice,
377 unsigned char byRTSRsvType,
378 unsigned char byPktType,
379 unsigned int cbFrameLength,
380 unsigned short wCurrentRate
383 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
385 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
387 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
388 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
389 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
390 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
391 } else if (byRTSRsvType == 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
392 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
393 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
394 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
395 } else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
396 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
397 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
398 } else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
399 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
400 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
401 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
406 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
410 //byFreqType 0: 5GHz, 1:2.4Ghz
414 struct vnt_private *pDevice,
415 unsigned char byDurType,
416 unsigned int cbFrameLength,
417 unsigned char byPktType,
418 unsigned short wRate,
420 unsigned int uFragIdx,
421 unsigned int cbLastFragmentSize,
422 unsigned int uMACfragNum,
423 unsigned char byFBOption
427 unsigned int uAckTime = 0, uNextPktTime = 0;
429 if (uFragIdx == (uMACfragNum-1))
433 case DATADUR_B: //DATADUR_B
434 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
436 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
437 return pDevice->uSIFS + uAckTime;
441 } else {//First Frag or Mid Frag
442 if (uFragIdx == (uMACfragNum-2))
443 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
445 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
448 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
449 return pDevice->uSIFS + uAckTime + uNextPktTime;
451 return pDevice->uSIFS + uNextPktTime;
456 case DATADUR_A: //DATADUR_A
457 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
459 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
460 return pDevice->uSIFS + uAckTime;
464 } else {//First Frag or Mid Frag
465 if (uFragIdx == (uMACfragNum-2))
466 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
468 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
471 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
472 return pDevice->uSIFS + uAckTime + uNextPktTime;
474 return pDevice->uSIFS + uNextPktTime;
479 case DATADUR_A_F0: //DATADUR_A_F0
480 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
482 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
483 return pDevice->uSIFS + uAckTime;
487 } else { //First Frag or Mid Frag
488 if (byFBOption == AUTO_FB_0) {
489 if (wRate < RATE_18M)
491 else if (wRate > RATE_54M)
494 if (uFragIdx == (uMACfragNum-2))
495 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
497 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
499 } else { // (byFBOption == AUTO_FB_1)
500 if (wRate < RATE_18M)
502 else if (wRate > RATE_54M)
505 if (uFragIdx == (uMACfragNum-2))
506 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
508 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
513 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
514 return pDevice->uSIFS + uAckTime + uNextPktTime;
516 return pDevice->uSIFS + uNextPktTime;
521 case DATADUR_A_F1: //DATADUR_A_F1
522 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
524 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
525 return pDevice->uSIFS + uAckTime;
529 } else { //First Frag or Mid Frag
530 if (byFBOption == AUTO_FB_0) {
531 if (wRate < RATE_18M)
533 else if (wRate > RATE_54M)
536 if (uFragIdx == (uMACfragNum-2))
537 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
539 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
541 } else { // (byFBOption == AUTO_FB_1)
542 if (wRate < RATE_18M)
544 else if (wRate > RATE_54M)
547 if (uFragIdx == (uMACfragNum-2))
548 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
550 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
553 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
554 return pDevice->uSIFS + uAckTime + uNextPktTime;
556 return pDevice->uSIFS + uNextPktTime;
569 //byFreqType: 0=>5GHZ 1=>2.4GHZ
572 s_uGetRTSCTSDuration(
573 struct vnt_private *pDevice,
574 unsigned char byDurType,
575 unsigned int cbFrameLength,
576 unsigned char byPktType,
577 unsigned short wRate,
579 unsigned char byFBOption
582 unsigned int uCTSTime = 0, uDurTime = 0;
585 case RTSDUR_BB: //RTSDuration_bb
586 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
587 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
590 case RTSDUR_BA: //RTSDuration_ba
591 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
592 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
595 case RTSDUR_AA: //RTSDuration_aa
596 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
597 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
600 case CTSDUR_BA: //CTSDuration_ba
601 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
604 case RTSDUR_BA_F0: //RTSDuration_ba_f0
605 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
606 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
607 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
608 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
609 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
613 case RTSDUR_AA_F0: //RTSDuration_aa_f0
614 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
615 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
616 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
617 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
618 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
622 case RTSDUR_BA_F1: //RTSDuration_ba_f1
623 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
624 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
625 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
626 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
627 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
631 case RTSDUR_AA_F1: //RTSDuration_aa_f1
632 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
633 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
634 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
635 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
636 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
640 case CTSDUR_BA_F0: //CTSDuration_ba_f0
641 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
642 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
643 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
644 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
648 case CTSDUR_BA_F1: //CTSDuration_ba_f1
649 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
650 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
651 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
652 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
666 struct vnt_private *pDevice,
667 unsigned char byPktType,
669 unsigned int cbFrameLength,
670 unsigned int uDMAIdx,
672 unsigned int uFragIdx,
673 unsigned int cbLastFragmentSize,
674 unsigned int uMACfragNum,
675 unsigned char byFBOption,
676 unsigned short wCurrentRate
679 unsigned short wLen = 0x0000;
681 if (pTxDataHead == NULL)
685 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
686 if (byFBOption == AUTO_FB_NONE) {
687 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
688 //Get SignalField,ServiceField,Length
689 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
690 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
692 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
693 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
694 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
696 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
697 //Get Duration and TimeStamp
698 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
699 byPktType, wCurrentRate, bNeedAck, uFragIdx,
700 cbLastFragmentSize, uMACfragNum,
701 byFBOption)); //1: 2.4GHz
702 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
703 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
704 bNeedAck, uFragIdx, cbLastFragmentSize,
705 uMACfragNum, byFBOption)); //1: 2.4
707 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
708 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
710 return pBuf->wDuration_a;
713 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
714 //Get SignalField,ServiceField,Length
715 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
716 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
718 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
719 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
720 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
722 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
723 //Get Duration and TimeStamp
724 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
725 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
726 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
727 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
728 pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
729 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
730 pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
731 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
733 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
734 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
736 return pBuf->wDuration_a;
737 } //if (byFBOption == AUTO_FB_NONE)
738 } else if (byPktType == PK_TYPE_11A) {
739 if ((byFBOption != AUTO_FB_NONE)) {
741 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
742 //Get SignalField,ServiceField,Length
743 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
744 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
746 pBuf->wTransmitLength = cpu_to_le16(wLen);
747 //Get Duration and TimeStampOff
749 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
750 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
751 pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
752 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
753 pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
754 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
755 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
756 return pBuf->wDuration;
758 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
759 //Get SignalField,ServiceField,Length
760 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
761 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
763 pBuf->wTransmitLength = cpu_to_le16(wLen);
764 //Get Duration and TimeStampOff
766 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
767 wCurrentRate, bNeedAck, uFragIdx,
768 cbLastFragmentSize, uMACfragNum,
771 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
772 return pBuf->wDuration;
775 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
776 //Get SignalField,ServiceField,Length
777 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
778 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
780 pBuf->wTransmitLength = cpu_to_le16(wLen);
781 //Get Duration and TimeStampOff
782 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
783 wCurrentRate, bNeedAck, uFragIdx,
784 cbLastFragmentSize, uMACfragNum,
786 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
787 return pBuf->wDuration;
795 struct vnt_private *pDevice,
796 unsigned char byPktType,
798 unsigned int cbFrameLength,
801 PSEthernetHeader psEthHeader,
802 unsigned short wCurrentRate,
803 unsigned char byFBOption
806 unsigned int uRTSFrameLen = 20;
807 unsigned short wLen = 0x0000;
813 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
814 // in this case we need to decrease its length by 4.
818 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
819 // Otherwise, we need to modify codes for them.
820 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
821 if (byFBOption == AUTO_FB_NONE) {
822 PSRTS_g pBuf = (PSRTS_g)pvRTS;
823 //Get SignalField,ServiceField,Length
824 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
825 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
827 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
828 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
829 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
831 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
833 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
834 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
835 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
837 pBuf->Data.wDurationID = pBuf->wDuration_aa;
839 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
840 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
841 (pDevice->eOPMode == OP_MODE_AP)) {
842 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
844 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
846 if (pDevice->eOPMode == OP_MODE_AP)
847 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
849 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
852 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
853 //Get SignalField,ServiceField,Length
854 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
855 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
857 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
858 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
859 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
861 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
864 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
865 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
866 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
867 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
868 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
869 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
870 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
871 pBuf->Data.wDurationID = pBuf->wDuration_aa;
873 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
875 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
876 (pDevice->eOPMode == OP_MODE_AP)) {
877 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
879 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
882 if (pDevice->eOPMode == OP_MODE_AP)
883 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
885 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
887 } // if (byFBOption == AUTO_FB_NONE)
888 } else if (byPktType == PK_TYPE_11A) {
889 if (byFBOption == AUTO_FB_NONE) {
890 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
891 //Get SignalField,ServiceField,Length
892 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
893 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
895 pBuf->wTransmitLength = cpu_to_le16(wLen);
897 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
898 pBuf->Data.wDurationID = pBuf->wDuration;
900 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
902 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
903 (pDevice->eOPMode == OP_MODE_AP)) {
904 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
906 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
909 if (pDevice->eOPMode == OP_MODE_AP)
910 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
912 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
915 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
916 //Get SignalField,ServiceField,Length
917 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
918 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
920 pBuf->wTransmitLength = cpu_to_le16(wLen);
922 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
923 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
924 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:
925 pBuf->Data.wDurationID = pBuf->wDuration;
927 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
929 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
930 (pDevice->eOPMode == OP_MODE_AP)) {
931 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
933 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
935 if (pDevice->eOPMode == OP_MODE_AP)
936 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
938 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
940 } else if (byPktType == PK_TYPE_11B) {
941 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
942 //Get SignalField,ServiceField,Length
943 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
944 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
946 pBuf->wTransmitLength = cpu_to_le16(wLen);
948 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
949 pBuf->Data.wDurationID = pBuf->wDuration;
951 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
953 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
954 (pDevice->eOPMode == OP_MODE_AP)) {
955 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
957 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
960 if (pDevice->eOPMode == OP_MODE_AP)
961 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
963 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
970 struct vnt_private *pDevice,
971 unsigned int uDMAIdx,
972 unsigned char byPktType,
974 unsigned int cbFrameLength,
977 unsigned short wCurrentRate,
978 unsigned char byFBOption
981 unsigned int uCTSFrameLen = 14;
982 unsigned short wLen = 0x0000;
988 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
989 // in this case we need to decrease its length by 4.
993 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
994 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
996 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
997 //Get SignalField,ServiceField,Length
998 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
999 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1002 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1004 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
1005 pBuf->wDuration_ba += pDevice->wCTSDuration;
1006 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1007 //Get CTSDuration_ba_f0
1008 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
1009 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1010 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1011 //Get CTSDuration_ba_f1
1012 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
1013 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1014 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1015 //Get CTS Frame body
1016 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1017 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1018 pBuf->Data.wReserved = 0x0000;
1019 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1021 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1022 PSCTS pBuf = (PSCTS)pvCTS;
1023 //Get SignalField,ServiceField,Length
1024 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1025 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1027 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1028 //Get CTSDuration_ba
1029 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
1030 pBuf->wDuration_ba += pDevice->wCTSDuration;
1031 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1033 //Get CTS Frame body
1034 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1035 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1036 pBuf->Data.wReserved = 0x0000;
1037 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1045 * Generate FIFO control for MAC & Baseband controller
1049 * pDevice - Pointer to adapter
1050 * pTxDataHead - Transmit Data Buffer
1051 * pTxBufHead - pTxBufHead
1052 * pvRrvTime - pvRrvTime
1053 * pvRTS - RTS Buffer
1055 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1056 * bNeedACK - If need ACK
1057 * uDescIdx - Desc Index
1061 * Return Value: none
1064 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1067 s_vGenerateTxParameter(
1068 struct vnt_private *pDevice,
1069 unsigned char byPktType,
1074 unsigned int cbFrameSize,
1076 unsigned int uDMAIdx,
1077 PSEthernetHeader psEthHeader,
1078 unsigned short wCurrentRate
1081 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1082 unsigned short wFifoCtl;
1083 bool bDisCRC = false;
1084 unsigned char byFBOption = AUTO_FB_NONE;
1086 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1088 pFifoHead->wReserved = wCurrentRate;
1089 wFifoCtl = pFifoHead->wFIFOCtl;
1091 if (wFifoCtl & FIFOCTL_CRCDIS)
1094 if (wFifoCtl & FIFOCTL_AUTO_FB_0)
1095 byFBOption = AUTO_FB_0;
1096 else if (wFifoCtl & FIFOCTL_AUTO_FB_1)
1097 byFBOption = AUTO_FB_1;
1099 if (pDevice->bLongHeader)
1100 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1102 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1103 if (pvRTS != NULL) { //RTS_need
1106 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1108 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1109 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1110 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1111 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1112 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1115 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1116 } else {//RTS_needless, PCF mode
1120 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1122 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1123 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1124 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1128 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1130 } else if (byPktType == PK_TYPE_11A) {
1131 if (pvRTS != NULL) {//RTS_need, non PCF mode
1134 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1136 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1137 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1140 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1141 } else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1144 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1146 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1149 } else if (byPktType == PK_TYPE_11B) {
1150 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1153 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1155 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1156 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1159 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1160 } else { //RTS_needless, non PCF mode
1163 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1165 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1173 s_vFillFragParameter(
1174 struct vnt_private *pDevice,
1175 unsigned char *pbyBuffer,
1176 unsigned int uTxType,
1178 unsigned short wFragType,
1179 unsigned int cbReqCount
1182 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1184 if (uTxType == TYPE_SYNCDMA) {
1185 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1187 //Set FIFOCtl & TimeStamp in TxSyncDesc
1188 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1189 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1190 //Set TSR1 & ReqCount in TxDescHead
1191 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1192 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1193 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1195 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1197 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1198 //Set TSR1 & ReqCount in TxDescHead
1199 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1200 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1201 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1203 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1206 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1210 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
1211 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
1212 unsigned int uDMAIdx, PSTxDesc pHeadTD,
1213 PSEthernetHeader psEthHeader, unsigned char *pPacket,
1214 bool bNeedEncrypt, PSKeyItem pTransmitKey,
1215 unsigned int uNodeIndex, unsigned int *puMACfragNum)
1217 unsigned int cbMACHdLen;
1218 unsigned int cbFrameSize;
1219 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1220 unsigned int cbFragPayloadSize;
1221 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1222 unsigned int cbLastFragPayloadSize;
1223 unsigned int uFragIdx;
1224 unsigned char *pbyPayloadHead;
1225 unsigned char *pbyIVHead;
1226 unsigned char *pbyMacHdr;
1227 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1228 unsigned int uDuration;
1229 unsigned char *pbyBuffer;
1230 unsigned int cbIVlen = 0;
1231 unsigned int cbICVlen = 0;
1232 unsigned int cbMIClen = 0;
1233 unsigned int cbFCSlen = 4;
1234 unsigned int cb802_1_H_len = 0;
1235 unsigned int uLength = 0;
1236 unsigned int uTmpLen = 0;
1237 unsigned int cbMICHDR = 0;
1238 u32 dwMICKey0, dwMICKey1;
1242 u32 dwSafeMIC_L, dwSafeMIC_R; /* Fix "Last Frag Size" < "MIC length". */
1243 bool bMIC2Frag = false;
1244 unsigned int uMICFragLen = 0;
1245 unsigned int uMACfragNum = 1;
1246 unsigned int uPadding = 0;
1247 unsigned int cbReqCount = 0;
1252 unsigned char *pbyType;
1254 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1255 unsigned int cbHeaderLength = 0;
1257 struct vnt_mic_hdr *pMICHDR;
1261 unsigned short wTxBufSize; // FFinfo size
1262 unsigned int uTotalCopyLength = 0;
1263 unsigned char byFBOption = AUTO_FB_NONE;
1264 bool bIsWEP256 = false;
1265 PSMgmtObject pMgmt = pDevice->pMgmt;
1267 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1269 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1270 (pDevice->eOPMode == OP_MODE_AP)) {
1271 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1277 // MSDUs in Infra mode always need ACK
1282 if (pDevice->bLongHeader)
1283 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1285 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1287 if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1288 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1291 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)
1294 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1295 cbIVlen = 8;//IV+ExtIV
1299 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1300 cbIVlen = 8;//RSN Header
1302 cbMICHDR = sizeof(struct vnt_mic_hdr);
1304 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1305 //MAC Header should be padding 0 to DW alignment.
1306 uPadding = 4 - (cbMACHdLen%4);
1311 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1313 if ((bNeedACK == false) ||
1314 (cbFrameSize < pDevice->wRTSThreshold) ||
1315 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1320 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1323 // Use for AUTO FALL BACK
1325 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0)
1326 byFBOption = AUTO_FB_0;
1327 else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1)
1328 byFBOption = AUTO_FB_1;
1330 //////////////////////////////////////////////////////
1331 //Set RrvTime/RTS/CTS Buffer
1332 wTxBufSize = sizeof(STxBufHead);
1333 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1335 if (byFBOption == AUTO_FB_NONE) {
1336 if (bRTS == true) {//RTS_need
1337 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1338 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1339 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1341 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1342 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1343 } else { //RTS_needless
1344 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1345 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1347 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1348 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1349 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1353 if (bRTS == true) {//RTS_need
1354 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1355 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1356 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1358 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1359 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1360 } else { //RTS_needless
1361 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1362 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1364 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1365 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1366 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1369 } else {//802.11a/b packet
1371 if (byFBOption == AUTO_FB_NONE) {
1373 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1374 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1375 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1377 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1378 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1379 } else { //RTS_needless, need MICHDR
1380 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1381 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1384 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1385 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1389 if (bRTS == true) {//RTS_need
1390 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1391 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1392 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1394 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1395 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1396 } else { //RTS_needless
1397 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1398 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1401 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1402 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1406 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1408 //////////////////////////////////////////////////////////////////
1409 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1410 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1411 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1412 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1413 } else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1414 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1415 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1417 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]);
1418 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]);
1420 // DO Software Michael
1421 MIC_vInit(dwMICKey0, dwMICKey1);
1422 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1424 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1425 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC KEY: %X, %X\n", dwMICKey0, dwMICKey1);
1428 ///////////////////////////////////////////////////////////////////
1430 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1431 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1432 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1434 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1436 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1437 cbFragmentSize = pDevice->wFragmentationThreshold;
1438 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1439 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1440 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1441 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1442 if (cbLastFragPayloadSize == 0)
1443 cbLastFragPayloadSize = cbFragPayloadSize;
1447 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1448 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1450 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
1451 if (uFragIdx == 0) {
1452 //=========================
1453 // Start Fragmentation
1454 //=========================
1455 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Start Fragmentation...\n");
1456 wFragType = FRAGCTL_STAFRAG;
1458 //Fill FIFO,RrvTime,RTS,and CTS
1459 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1460 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1462 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1463 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1464 // Generate TX MAC Header
1465 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1466 wFragType, uDMAIdx, uFragIdx);
1468 if (bNeedEncrypt == true) {
1470 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1471 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1472 //Fill IV(ExtIV,RSNHDR)
1473 if (pDevice->bEnableHostWEP) {
1474 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1475 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1480 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1481 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1482 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1483 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1485 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1487 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1488 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1492 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1493 //---------------------------
1494 // S/W or H/W Encryption
1495 //---------------------------
1496 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1498 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1499 //copy TxBufferHeader + MacHeader to desc
1500 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1502 // Copy the Packet into a tx Buffer
1503 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1505 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1507 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1508 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Start MIC: %d\n", cbFragPayloadSize);
1509 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1513 //---------------------------
1515 //---------------------------
1516 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1518 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1519 cbReqCount += cbICVlen;
1523 ptdCurr = (PSTxDesc)pHeadTD;
1524 //--------------------
1525 //1.Set TSR1 & ReqCount in TxDescHead
1526 //2.Set FragCtl in TxBufferHead
1527 //3.Set Frame Control
1528 //4.Set Sequence Control
1529 //5.Get S/W generate FCS
1530 //--------------------
1531 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1533 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1534 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1535 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1536 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1537 pDevice->iTDUsed[uDMAIdx]++;
1538 pHeadTD = ptdCurr->next;
1539 } else if (uFragIdx == (uMACfragNum-1)) {
1540 //=========================
1541 // Last Fragmentation
1542 //=========================
1543 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last Fragmentation...\n");
1545 wFragType = FRAGCTL_ENDFRAG;
1547 //Fill FIFO,RrvTime,RTS,and CTS
1548 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1549 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1551 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1552 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1554 // Generate TX MAC Header
1555 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1556 wFragType, uDMAIdx, uFragIdx);
1558 if (bNeedEncrypt == true) {
1560 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1561 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1563 if (pDevice->bEnableHostWEP) {
1564 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1565 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1570 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1571 //---------------------------
1572 // S/W or H/W Encryption
1573 //---------------------------
1575 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1577 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1579 //copy TxBufferHeader + MacHeader to desc
1580 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1582 // Copy the Packet into a tx Buffer
1583 if (bMIC2Frag == false) {
1584 memcpy((pbyBuffer + uLength),
1585 (pPacket + 14 + uTotalCopyLength),
1586 (cbLastFragPayloadSize - cbMIClen)
1588 //TODO check uTmpLen !
1589 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1592 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1593 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1594 uMICFragLen, cbLastFragPayloadSize, uTmpLen);
1596 if (bMIC2Frag == false) {
1598 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1599 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1600 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1601 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1602 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last MIC:%X, %X\n", *pdwMIC_L, *pdwMIC_R);
1604 if (uMICFragLen >= 4) {
1605 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1606 (cbMIClen - uMICFragLen));
1607 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen >= 4: %X, %d\n",
1608 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1609 (cbMIClen - uMICFragLen));
1612 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1614 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1615 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen < 4: %X, %d\n",
1616 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1617 (cbMIClen - uMICFragLen));
1622 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1625 //---------------------------
1627 //---------------------------
1628 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1630 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1631 cbReqCount += cbICVlen;
1635 ptdCurr = (PSTxDesc)pHeadTD;
1637 //--------------------
1638 //1.Set TSR1 & ReqCount in TxDescHead
1639 //2.Set FragCtl in TxBufferHead
1640 //3.Set Frame Control
1641 //4.Set Sequence Control
1642 //5.Get S/W generate FCS
1643 //--------------------
1645 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1647 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1648 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1649 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1650 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1651 pDevice->iTDUsed[uDMAIdx]++;
1652 pHeadTD = ptdCurr->next;
1655 //=========================
1656 // Middle Fragmentation
1657 //=========================
1658 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Middle Fragmentation...\n");
1660 wFragType = FRAGCTL_MIDFRAG;
1662 //Fill FIFO,RrvTime,RTS,and CTS
1663 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1664 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1666 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1667 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1669 // Generate TX MAC Header
1670 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1671 wFragType, uDMAIdx, uFragIdx);
1673 if (bNeedEncrypt == true) {
1675 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1676 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1678 if (pDevice->bEnableHostWEP) {
1679 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1680 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1684 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1685 //---------------------------
1686 // S/W or H/W Encryption
1687 //---------------------------
1689 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1690 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1692 //copy TxBufferHeader + MacHeader to desc
1693 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1695 // Copy the Packet into a tx Buffer
1696 memcpy((pbyBuffer + uLength),
1697 (pPacket + 14 + uTotalCopyLength),
1700 uTmpLen = cbFragPayloadSize;
1702 uTotalCopyLength += uTmpLen;
1704 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1705 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1707 if (uTmpLen < cbFragPayloadSize) {
1709 uMICFragLen = cbFragPayloadSize - uTmpLen;
1710 ASSERT(uMICFragLen < cbMIClen);
1712 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1713 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1714 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1715 dwSafeMIC_L = *pdwMIC_L;
1716 dwSafeMIC_R = *pdwMIC_R;
1718 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1719 uMICFragLen, cbFragPayloadSize, uTmpLen);
1720 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Fill MIC in Middle frag [%d]\n", uMICFragLen);
1721 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get MIC:%X, %X\n", *pdwMIC_L, *pdwMIC_R);
1723 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Middle frag len: %d\n", uTmpLen);
1726 ASSERT(uTmpLen == (cbFragPayloadSize));
1729 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1731 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1732 cbReqCount += cbICVlen;
1736 ptdCurr = (PSTxDesc)pHeadTD;
1738 //--------------------
1739 //1.Set TSR1 & ReqCount in TxDescHead
1740 //2.Set FragCtl in TxBufferHead
1741 //3.Set Frame Control
1742 //4.Set Sequence Control
1743 //5.Get S/W generate FCS
1744 //--------------------
1746 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1748 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1749 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1750 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1751 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1752 pDevice->iTDUsed[uDMAIdx]++;
1753 pHeadTD = ptdCurr->next;
1755 } // for (uMACfragNum)
1757 //=========================
1759 //=========================
1760 wFragType = FRAGCTL_NONFRAG;
1762 //Set FragCtl in TxBufferHead
1763 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1765 //Fill FIFO,RrvTime,RTS,and CTS
1766 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1767 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1769 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1770 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1772 // Generate TX MAC Header
1773 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1774 wFragType, uDMAIdx, 0);
1776 if (bNeedEncrypt == true) {
1778 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1779 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1781 if (pDevice->bEnableHostWEP) {
1782 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1783 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1788 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1789 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1790 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1791 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1793 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1795 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1796 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1800 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1801 //---------------------------
1802 // S/W or H/W Encryption
1803 //---------------------------
1804 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1805 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1807 //copy TxBufferHeader + MacHeader to desc
1808 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1810 // Copy the Packet into a tx Buffer
1811 memcpy((pbyBuffer + uLength),
1813 cbFrameBodySize - cb802_1_H_len
1816 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1817 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Length:%d, %d\n", cbFrameBodySize - cb802_1_H_len, uLength);
1819 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
1821 pdwMIC_L = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
1822 pdwMIC_R = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
1824 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1827 if (pDevice->bTxMICFail == true) {
1830 pDevice->bTxMICFail = false;
1833 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "uLength: %d, %d\n", uLength, cbFrameBodySize);
1834 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1835 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
1839 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1841 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
1842 (unsigned short)(cbFrameBodySize + cbMIClen));
1843 cbReqCount += cbICVlen;
1847 ptdCurr = (PSTxDesc)pHeadTD;
1849 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1850 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1851 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1852 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1853 //Set TSR1 & ReqCount in TxDescHead
1854 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1855 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1857 pDevice->iTDUsed[uDMAIdx]++;
1860 *puMACfragNum = uMACfragNum;
1862 return cbHeaderLength;
1866 vGenerateFIFOHeader(struct vnt_private *pDevice, unsigned char byPktType,
1867 unsigned char *pbyTxBufferAddr, bool bNeedEncrypt,
1868 unsigned int cbPayloadSize, unsigned int uDMAIdx,
1869 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
1870 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
1871 unsigned int *pcbHeaderSize)
1873 unsigned int wTxBufSize; // FFinfo size
1876 unsigned short cbMacHdLen;
1877 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1879 wTxBufSize = sizeof(STxBufHead);
1881 memset(pTxBufHead, 0, wTxBufSize);
1882 //Set FIFOCTL_NEEDACK
1884 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1885 (pDevice->eOPMode == OP_MODE_AP)) {
1886 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
1888 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1891 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1895 // MSDUs in Infra mode always need ACK
1897 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1901 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
1902 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
1905 if (pDevice->bLongHeader)
1906 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1908 //Set FIFOCTL_GENINT
1910 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
1912 //Set FIFOCTL_ISDMA0
1913 if (TYPE_TXDMA0 == uDMAIdx)
1914 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
1916 //Set FRAGCTL_MACHDCNT
1917 if (pDevice->bLongHeader)
1918 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
1920 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
1922 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
1925 if (byPktType == PK_TYPE_11A) //0000 0000 0000 0000
1927 else if (byPktType == PK_TYPE_11B) //0000 0001 0000 0000
1928 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
1929 else if (byPktType == PK_TYPE_11GB) //0000 0010 0000 0000
1930 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
1931 else if (byPktType == PK_TYPE_11GA) //0000 0011 0000 0000
1932 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
1934 //Set FIFOCTL_GrpAckPolicy
1935 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
1936 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1938 //Set Auto Fallback Ctl
1939 if (pDevice->wCurrentRate >= RATE_18M) {
1940 if (pDevice->byAutoFBCtrl == AUTO_FB_0)
1941 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1942 else if (pDevice->byAutoFBCtrl == AUTO_FB_1)
1943 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1946 //Set FRAGCTL_WEPTYP
1947 pDevice->bAES = false;
1949 //Set FRAGCTL_WEPTYP
1950 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1951 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
1952 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1953 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1954 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1955 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
1956 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1957 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1958 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1964 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
1966 pTxBufHead->byTxPower = pDevice->byCurPwr;
1968 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
1969 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
1970 pTransmitKey, uNodeIndex, puMACfragNum);
1976 * Translate 802.3 to 802.11 header
1980 * pDevice - Pointer to adapter
1981 * dwTxBufferAddr - Transmit Buffer
1982 * pPacket - Packet from upper layer
1983 * cbPacketSize - Transmit Data Length
1985 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1986 * pcbAppendPayload - size of append payload for 802.1H translation
1988 * Return Value: none
1994 struct vnt_private *pDevice,
1995 unsigned char *pbyBufferAddr,
1996 unsigned short wDuration,
1997 PSEthernetHeader psEthHeader,
1999 unsigned short wFragType,
2000 unsigned int uDMAIdx,
2001 unsigned int uFragIdx
2004 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
2006 memset(pMACHeader, 0, (sizeof(S802_11Header)));
2008 if (uDMAIdx == TYPE_ATIMDMA)
2009 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2011 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2013 if (pDevice->eOPMode == OP_MODE_AP) {
2014 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2015 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2016 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2017 pMACHeader->wFrameCtl |= FC_FROMDS;
2019 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2020 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2021 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2022 memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2024 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2025 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2026 memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2027 pMACHeader->wFrameCtl |= FC_TODS;
2032 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2034 pMACHeader->wDurationID = cpu_to_le16(wDuration);
2036 if (pDevice->bLongHeader) {
2037 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2039 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2040 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2042 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2044 //Set FragNumber in Sequence Control
2045 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2047 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2048 pDevice->wSeqCounter++;
2049 if (pDevice->wSeqCounter > 0x0fff)
2050 pDevice->wSeqCounter = 0;
2053 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) //StartFrag or MidFrag
2054 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2057 CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2060 unsigned char byPktType;
2061 unsigned char *pbyTxBufferAddr;
2065 unsigned int uDuration;
2066 unsigned int cbReqCount;
2067 PS802_11Header pMACHeader;
2068 unsigned int cbHeaderSize;
2069 unsigned int cbFrameBodySize;
2071 bool bIsPSPOLL = false;
2072 PSTxBufHead pTxBufHead;
2073 unsigned int cbFrameSize;
2074 unsigned int cbIVlen = 0;
2075 unsigned int cbICVlen = 0;
2076 unsigned int cbMIClen = 0;
2077 unsigned int cbFCSlen = 4;
2078 unsigned int uPadding = 0;
2079 unsigned short wTxBufSize;
2080 unsigned int cbMacHdLen;
2081 SEthernetHeader sEthHeader;
2084 PSMgmtObject pMgmt = pDevice->pMgmt;
2085 unsigned short wCurrentRate = RATE_1M;
2087 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0)
2088 return CMD_STATUS_RESOURCES;
2090 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2091 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2092 cbFrameBodySize = pPacket->cbPayloadLen;
2093 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2094 wTxBufSize = sizeof(STxBufHead);
2095 memset(pTxBufHead, 0, wTxBufSize);
2097 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2098 wCurrentRate = RATE_6M;
2099 byPktType = PK_TYPE_11A;
2101 wCurrentRate = RATE_1M;
2102 byPktType = PK_TYPE_11B;
2105 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2106 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2107 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2108 // to set power here.
2109 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2110 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2112 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2114 pTxBufHead->byTxPower = pDevice->byCurPwr;
2115 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2116 if (pDevice->byFOETuning) {
2117 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2118 wCurrentRate = RATE_24M;
2119 byPktType = PK_TYPE_11GA;
2124 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2125 pTxBufHead->wFIFOCtl = 0;
2126 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2127 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2128 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2129 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2130 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2131 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2134 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2135 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2137 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2141 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2144 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2145 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2146 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2149 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2151 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2153 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2155 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2158 //Set FRAGCTL_MACHDCNT
2159 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2162 // Although spec says MMPDU can be fragmented; In most cases,
2163 // no one will send a MMPDU under fragmentation. With RTS may occur.
2164 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2166 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2167 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2170 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2171 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2172 cbIVlen = 8;//IV+ExtIV
2175 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2176 //We need to get seed here for filling TxKey entry.
2177 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2178 cbIVlen = 8;//RSN Header
2180 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2181 pDevice->bAES = true;
2183 //MAC Header should be padding 0 to DW alignment.
2184 uPadding = 4 - (cbMacHdLen%4);
2188 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2190 //Set FIFOCTL_GrpAckPolicy
2191 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2192 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2194 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2196 //Set RrvTime/RTS/CTS Buffer
2197 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2199 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2202 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2203 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2204 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2205 } else { // 802.11a/b packet
2206 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2210 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2211 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2214 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2216 memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2217 memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2218 //=========================
2220 //=========================
2221 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2223 //Fill FIFO,RrvTime,RTS,and CTS
2224 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2225 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2228 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2229 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2231 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2233 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2235 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2236 unsigned char *pbyIVHead;
2237 unsigned char *pbyPayloadHead;
2238 unsigned char *pbyBSSID;
2239 PSKeyItem pTransmitKey = NULL;
2241 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2242 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2245 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2246 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2248 //Fill IV(ExtIV,RSNHDR)
2249 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2250 //---------------------------
2251 // S/W or H/W Encryption
2252 //---------------------------
2254 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2255 (pDevice->bLinkPass == true)) {
2256 pbyBSSID = pDevice->abyBSSID;
2258 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2260 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2261 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get GTK.\n");
2265 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get PTK.\n");
2270 pbyBSSID = pDevice->abyBroadcastAddr;
2271 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2272 pTransmitKey = NULL;
2273 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2275 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get GTK.\n");
2279 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2280 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2282 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2283 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2286 // Copy the Packet into a tx Buffer
2287 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2290 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2291 pDevice->wSeqCounter++;
2292 if (pDevice->wSeqCounter > 0x0fff)
2293 pDevice->wSeqCounter = 0;
2296 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2297 // of FIFO control header.
2298 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2299 // in the same place of other packet's Duration-field).
2300 // And it will cause Cisco-AP to issue Disassociation-packet
2301 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2302 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2303 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2305 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2309 // first TD is the only TD
2310 //Set TSR1 & ReqCount in TxDescHead
2311 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2312 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2313 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2314 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2315 pFrstTD->pTDInfo->byFlags = 0;
2317 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2319 MACbPSWakeup(pDevice->PortOffset);
2321 pDevice->bPWBitOn = false;
2324 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2327 pDevice->iTDUsed[TYPE_TXDMA0]++;
2329 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2330 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2332 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2334 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2336 // Poll Transmit the adapter
2337 MACvTransmit0(pDevice->PortOffset);
2339 return CMD_STATUS_PENDING;
2342 CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2344 unsigned char byPktType;
2345 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2346 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2347 unsigned int cbHeaderSize = 0;
2348 unsigned short wTxBufSize = sizeof(STxShortBufHead);
2349 PSTxShortBufHead pTxBufHead = (PSTxShortBufHead) pbyBuffer;
2350 PSTxDataHead_ab pTxDataHead = (PSTxDataHead_ab) (pbyBuffer + wTxBufSize);
2351 PS802_11Header pMACHeader;
2352 unsigned short wCurrentRate;
2353 unsigned short wLen = 0x0000;
2355 memset(pTxBufHead, 0, wTxBufSize);
2357 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2358 wCurrentRate = RATE_6M;
2359 byPktType = PK_TYPE_11A;
2361 wCurrentRate = RATE_2M;
2362 byPktType = PK_TYPE_11B;
2365 //Set Preamble type always long
2366 pDevice->byPreambleType = PREAMBLE_LONG;
2368 //Set FIFOCTL_GENINT
2370 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2372 //Set packet type & Get Duration
2373 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2374 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, byPktType,
2375 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2376 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2377 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2378 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, byPktType,
2379 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2382 BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, byPktType,
2383 (unsigned short *)&(wLen), (unsigned char *)&(pTxDataHead->byServiceField), (unsigned char *)&(pTxDataHead->bySignalField)
2385 pTxDataHead->wTransmitLength = cpu_to_le16(wLen);
2387 pTxDataHead->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
2388 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2390 //Generate Beacon Header
2391 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2392 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2394 pMACHeader->wDurationID = 0;
2395 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2396 pDevice->wSeqCounter++;
2397 if (pDevice->wSeqCounter > 0x0fff)
2398 pDevice->wSeqCounter = 0;
2400 // Set Beacon buffer length
2401 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2403 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2405 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2406 // Set auto Transmit on
2407 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2408 // Poll Transmit the adapter
2409 MACvTransmitBCN(pDevice->PortOffset);
2411 return CMD_STATUS_PENDING;
2416 struct vnt_private *pDevice,
2417 PSKeyItem pTransmitKey,
2418 unsigned int cbFrameBodySize,
2419 PSEthernetHeader psEthHeader
2422 unsigned int cbMACHdLen;
2423 unsigned int cbFrameSize;
2424 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2425 unsigned int cbFragPayloadSize;
2426 unsigned int cbLastFragPayloadSize;
2427 unsigned int cbIVlen = 0;
2428 unsigned int cbICVlen = 0;
2429 unsigned int cbMIClen = 0;
2430 unsigned int cbFCSlen = 4;
2431 unsigned int uMACfragNum = 1;
2434 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2435 (pDevice->eOPMode == OP_MODE_AP)) {
2436 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2441 // MSDUs in Infra mode always need ACK
2445 if (pDevice->bLongHeader)
2446 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2448 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2450 if (pDevice->bEncryptionEnable == true) {
2451 if (pTransmitKey == NULL) {
2452 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2453 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2456 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2457 cbIVlen = 8;//IV+ExtIV
2460 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2461 cbIVlen = 8;//RSN Header
2464 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2467 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2468 cbIVlen = 8;//IV+ExtIV
2471 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2472 cbIVlen = 8;//RSN Header
2477 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2479 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2481 cbFragmentSize = pDevice->wFragmentationThreshold;
2482 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2483 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2484 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2485 if (cbLastFragPayloadSize == 0)
2486 cbLastFragPayloadSize = cbFragPayloadSize;
2493 void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb,
2494 unsigned char *pbMPDU, unsigned int cbMPDULen)
2497 unsigned char byPktType;
2498 unsigned char *pbyTxBufferAddr;
2502 unsigned int uDuration;
2503 unsigned int cbReqCount;
2504 PS802_11Header pMACHeader;
2505 unsigned int cbHeaderSize;
2506 unsigned int cbFrameBodySize;
2508 bool bIsPSPOLL = false;
2509 PSTxBufHead pTxBufHead;
2510 unsigned int cbFrameSize;
2511 unsigned int cbIVlen = 0;
2512 unsigned int cbICVlen = 0;
2513 unsigned int cbMIClen = 0;
2514 unsigned int cbFCSlen = 4;
2515 unsigned int uPadding = 0;
2516 unsigned int cbMICHDR = 0;
2517 unsigned int uLength = 0;
2518 u32 dwMICKey0, dwMICKey1;
2522 unsigned short wTxBufSize;
2523 unsigned int cbMacHdLen;
2524 SEthernetHeader sEthHeader;
2527 PSMgmtObject pMgmt = pDevice->pMgmt;
2528 unsigned short wCurrentRate = RATE_1M;
2529 PUWLAN_80211HDR p80211Header;
2530 unsigned int uNodeIndex = 0;
2531 bool bNodeExist = false;
2533 PSKeyItem pTransmitKey = NULL;
2534 unsigned char *pbyIVHead;
2535 unsigned char *pbyPayloadHead;
2536 unsigned char *pbyMacHdr;
2538 unsigned int cbExtSuppRate = 0;
2540 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2542 if (cbMPDULen <= WLAN_HDR_ADDR3_LEN)
2543 cbFrameBodySize = 0;
2545 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2547 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2549 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2550 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2551 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2552 wTxBufSize = sizeof(STxBufHead);
2553 memset(pTxBufHead, 0, wTxBufSize);
2555 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2556 wCurrentRate = RATE_6M;
2557 byPktType = PK_TYPE_11A;
2559 wCurrentRate = RATE_1M;
2560 byPktType = PK_TYPE_11B;
2563 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2564 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2565 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2566 // to set power here.
2567 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2568 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2570 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2572 pTxBufHead->byTxPower = pDevice->byCurPwr;
2574 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2575 if (pDevice->byFOETuning) {
2576 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2577 wCurrentRate = RATE_24M;
2578 byPktType = PK_TYPE_11GA;
2582 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x\n", p80211Header->sA3.wFrameCtl);
2585 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2586 pTxBufHead->wFIFOCtl = 0;
2587 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2588 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2589 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2590 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2591 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2592 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2595 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2596 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2598 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2600 if (pDevice->bEnableHostWEP) {
2605 if (pDevice->bEnableHostWEP) {
2606 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2610 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2613 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2614 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2615 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2618 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2620 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2622 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2624 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2627 // hostapd deamon ext support rate patch
2628 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2629 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2630 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2632 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2633 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2635 if (cbExtSuppRate > 0)
2636 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2639 //Set FRAGCTL_MACHDCNT
2640 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2643 // Although spec says MMPDU can be fragmented; In most cases,
2644 // no one will send a MMPDU under fragmentation. With RTS may occur.
2645 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2647 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2648 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2651 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2652 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2653 cbIVlen = 8;//IV+ExtIV
2656 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2657 //We need to get seed here for filling TxKey entry.
2658 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2659 cbIVlen = 8;//RSN Header
2661 cbMICHDR = sizeof(struct vnt_mic_hdr);
2662 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2663 pDevice->bAES = true;
2665 //MAC Header should be padding 0 to DW alignment.
2666 uPadding = 4 - (cbMacHdLen%4);
2670 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2672 //Set FIFOCTL_GrpAckPolicy
2673 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2674 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2676 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2678 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2680 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2681 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2683 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2684 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2685 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2687 } else {//802.11a/b packet
2689 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2690 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2693 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2694 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2698 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2699 memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2700 memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2701 //=========================
2703 //=========================
2704 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2706 //Fill FIFO,RrvTime,RTS,and CTS
2707 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2708 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2711 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2712 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2714 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2716 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2718 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
2719 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2720 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
2722 // Copy the Packet into a tx Buffer
2723 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
2725 // version set to 0, patch for hostapd deamon
2726 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2727 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
2729 // replace support rate, patch for hostapd deamon(only support 11M)
2730 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2731 if (cbExtSuppRate != 0) {
2732 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2733 memcpy((pbyPayloadHead + cbFrameBodySize),
2734 pMgmt->abyCurrSuppRates,
2735 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2737 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2738 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2739 pMgmt->abyCurrExtSuppRates,
2740 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2746 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2747 if (pDevice->bEnableHostWEP) {
2748 pTransmitKey = &STempKey;
2749 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2750 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2751 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2752 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2753 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2754 memcpy(pTransmitKey->abyKey,
2755 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2756 pTransmitKey->uKeyLength
2760 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2761 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
2762 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
2764 // DO Software Michael
2765 MIC_vInit(dwMICKey0, dwMICKey1);
2766 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
2768 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
2769 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "DMA0_tx_8021:MIC KEY: %X, %X\n", dwMICKey0, dwMICKey1);
2771 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2773 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2775 pdwMIC_L = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2776 pdwMIC_R = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2778 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2781 if (pDevice->bTxMICFail == true) {
2784 pDevice->bTxMICFail = false;
2787 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "uLength: %d, %d\n", uLength, cbFrameBodySize);
2788 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2789 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
2793 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2794 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
2796 if (pDevice->bEnableHostWEP) {
2797 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2798 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2801 if ((pDevice->byLocalID <= REV_ID_VT3253_A1))
2802 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
2805 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2806 pDevice->wSeqCounter++;
2807 if (pDevice->wSeqCounter > 0x0fff)
2808 pDevice->wSeqCounter = 0;
2811 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2812 // of FIFO control header.
2813 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2814 // in the same place of other packet's Duration-field).
2815 // And it will cause Cisco-AP to issue Disassociation-packet
2816 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2817 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2818 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2820 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2824 // first TD is the only TD
2825 //Set TSR1 & ReqCount in TxDescHead
2826 pFrstTD->pTDInfo->skb = skb;
2827 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2828 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2829 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
2830 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2831 pFrstTD->pTDInfo->byFlags = 0;
2832 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
2834 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2836 MACbPSWakeup(pDevice->PortOffset);
2838 pDevice->bPWBitOn = false;
2841 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2844 pDevice->iTDUsed[TYPE_TXDMA0]++;
2846 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2847 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2849 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2851 // Poll Transmit the adapter
2852 MACvTransmit0(pDevice->PortOffset);