2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * cbGetFragCount - Calculate fragment number count
31 * csBeacon_xmit - beacon tx function
32 * csMgmt_xmit - management tx function
33 * s_cbFillTxBufHead - fulfill tx dma buffer header
34 * s_uGetDataDuration - get tx data required duration
35 * s_uFillDataHead- fulfill tx data duration header
36 * s_uGetRTSCTSDuration- get rtx/cts required duration
37 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
38 * s_uGetTxRsvTime- get frame reserved time
39 * s_vFillCTSHead- fulfill CTS ctl header
40 * s_vFillFragParameter- Set fragment ctl parameter.
41 * s_vFillRTSHead- fulfill RTS ctl header
42 * s_vFillTxKey- fulfill tx encrypt key
43 * s_vSWencryption- Software encrypt header
44 * vDMA0_tx_80211- tx 802.11 frame via dma0
45 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
72 /*--------------------- Static Functions --------------------------*/
74 /*--------------------- Static Definitions -------------------------*/
75 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
76 // packet size >= 256 -> direct send
78 static const unsigned short wTimeStampOff[2][MAX_RATE] = {
79 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
80 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
83 static const unsigned short wFB_Opt0[2][5] = {
84 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
85 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
87 static const unsigned short wFB_Opt1[2][5] = {
88 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
89 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
96 #define RTSDUR_BA_F0 4
97 #define RTSDUR_AA_F0 5
98 #define RTSDUR_BA_F1 6
99 #define RTSDUR_AA_F1 7
100 #define CTSDUR_BA_F0 8
101 #define CTSDUR_BA_F1 9
104 #define DATADUR_A_F0 12
105 #define DATADUR_A_F1 13
107 /*--------------------- Static Functions --------------------------*/
112 struct vnt_private *pDevice,
113 unsigned char *pbyBuf,
114 unsigned char *pbyIVHead,
115 PSKeyItem pTransmitKey,
116 unsigned char *pbyHdrBuf,
117 unsigned short wPayloadLen,
118 unsigned char *pMICHDR
124 struct vnt_private *pDevice,
125 unsigned char byPktType,
127 unsigned int cbFrameLength,
130 PSEthernetHeader psEthHeader,
131 unsigned short wCurrentRate,
132 unsigned char byFBOption
137 s_vGenerateTxParameter(
138 struct vnt_private *pDevice,
139 unsigned char byPktType,
144 unsigned int cbFrameSize,
146 unsigned int uDMAIdx,
147 PSEthernetHeader psEthHeader,
148 unsigned short wCurrentRate
151 static void s_vFillFragParameter(
152 struct vnt_private *pDevice,
153 unsigned char *pbyBuffer,
154 unsigned int uTxType,
156 unsigned short wFragType,
157 unsigned int cbReqCount
161 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
162 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
163 unsigned int uDMAIdx, PSTxDesc pHeadTD,
164 PSEthernetHeader psEthHeader, unsigned char *pPacket,
165 bool bNeedEncrypt, PSKeyItem pTransmitKey,
166 unsigned int uNodeIndex, unsigned int *puMACfragNum);
171 struct vnt_private *pDevice,
172 unsigned char byPktType,
174 unsigned int cbFrameLength,
175 unsigned int uDMAIdx,
177 unsigned int uFragIdx,
178 unsigned int cbLastFragmentSize,
179 unsigned int uMACfragNum,
180 unsigned char byFBOption,
181 unsigned short wCurrentRate
184 /*--------------------- Export Variables --------------------------*/
189 struct vnt_private *pDevice,
190 unsigned char *pbyBuf,
191 unsigned char *pbyIVHead,
192 PSKeyItem pTransmitKey,
193 unsigned char *pbyHdrBuf,
194 unsigned short wPayloadLen,
195 unsigned char *pMICHDR
198 struct vnt_mic_hdr *mic_hdr = (struct vnt_mic_hdr *)pMICHDR;
199 unsigned long *pdwIV = (unsigned long *)pbyIVHead;
200 unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
201 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
202 unsigned long dwRevIVCounter;
203 unsigned char byKeyIndex = 0;
206 if (pTransmitKey == NULL)
209 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
210 *pdwIV = pDevice->dwIVCounter;
211 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
213 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
214 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
215 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
216 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
218 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
219 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
220 if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
221 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
222 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
224 memcpy(pDevice->abyPRNG, pbyBuf, 16);
226 // Append IV after Mac Header
227 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
228 *pdwIV |= (unsigned long)byKeyIndex << 30;
229 *pdwIV = cpu_to_le32(*pdwIV);
230 pDevice->dwIVCounter++;
231 if (pDevice->dwIVCounter > WEP_IV_MASK)
232 pDevice->dwIVCounter = 0;
234 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
235 pTransmitKey->wTSC15_0++;
236 if (pTransmitKey->wTSC15_0 == 0)
237 pTransmitKey->dwTSC47_16++;
239 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
240 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
241 memcpy(pbyBuf, pDevice->abyPRNG, 16);
243 memcpy(pdwIV, pDevice->abyPRNG, 3);
245 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
246 // Append IV&ExtIV after Mac Header
247 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
248 pr_debug("vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
250 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
251 pTransmitKey->wTSC15_0++;
252 if (pTransmitKey->wTSC15_0 == 0)
253 pTransmitKey->dwTSC47_16++;
255 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
259 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
260 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
261 //Append IV&ExtIV after Mac Header
262 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
266 mic_hdr->tx_priority = 0;
267 ether_addr_copy(mic_hdr->mic_addr2, pMACHeader->abyAddr2);
269 /* ccmp pn big endian order */
270 mic_hdr->ccmp_pn[0] = (u8)(pTransmitKey->dwTSC47_16 >> 24);
271 mic_hdr->ccmp_pn[1] = (u8)(pTransmitKey->dwTSC47_16 >> 16);
272 mic_hdr->ccmp_pn[2] = (u8)(pTransmitKey->dwTSC47_16 >> 8);
273 mic_hdr->ccmp_pn[3] = (u8)pTransmitKey->dwTSC47_16;
274 mic_hdr->ccmp_pn[4] = (u8)(pTransmitKey->wTSC15_0 >> 8);
275 mic_hdr->ccmp_pn[5] = (u8)pTransmitKey->wTSC15_0;
278 mic_hdr->payload_len = cpu_to_be16(wPayloadLen);
280 if (pDevice->bLongHeader)
281 mic_hdr->hlen = cpu_to_be16(28);
283 mic_hdr->hlen = cpu_to_be16(22);
285 ether_addr_copy(mic_hdr->addr1, pMACHeader->abyAddr1);
286 ether_addr_copy(mic_hdr->addr2, pMACHeader->abyAddr2);
289 ether_addr_copy(mic_hdr->addr3, pMACHeader->abyAddr3);
290 mic_hdr->frame_control =
291 cpu_to_le16(pMACHeader->wFrameCtl & 0xc78f);
292 mic_hdr->seq_ctrl = cpu_to_le16(pMACHeader->wSeqCtl & 0xf);
294 if (pDevice->bLongHeader)
295 ether_addr_copy(mic_hdr->addr4, pMACHeader->abyAddr4);
302 struct vnt_private *pDevice,
303 PSKeyItem pTransmitKey,
304 unsigned char *pbyPayloadHead,
305 unsigned short wPayloadSize
308 unsigned int cbICVlen = 4;
309 unsigned long dwICV = 0xFFFFFFFFL;
310 unsigned long *pdwICV;
312 if (pTransmitKey == NULL)
315 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
316 //=======================================================================
317 // Append ICV after payload
318 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
319 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
320 // finally, we must invert dwCRC to get the correct answer
321 *pdwICV = cpu_to_le32(~dwICV);
323 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
324 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
325 //=======================================================================
326 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
327 //=======================================================================
328 //Append ICV after payload
329 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
330 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
331 // finally, we must invert dwCRC to get the correct answer
332 *pdwICV = cpu_to_le32(~dwICV);
334 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
335 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
336 //=======================================================================
340 static __le16 vnt_time_stamp_off(struct vnt_private *priv, u16 rate)
342 return cpu_to_le16(wTimeStampOff[priv->byPreambleType % 2]
346 /*byPktType : PK_TYPE_11A 0
354 struct vnt_private *pDevice,
355 unsigned char byPktType,
356 unsigned int cbFrameLength,
357 unsigned short wRate,
361 unsigned int uDataTime, uAckTime;
363 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
364 if (byPktType == PK_TYPE_11B) //llb,CCK mode
365 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
366 else //11g 2.4G OFDM mode & 11a 5G OFDM mode
367 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
370 return uDataTime + pDevice->uSIFS + uAckTime;
375 static __le16 vnt_rxtx_rsvtime_le16(struct vnt_private *priv, u8 pkt_type,
376 u32 frame_length, u16 rate, bool need_ack)
378 return cpu_to_le16((u16)s_uGetTxRsvTime(priv, pkt_type,
379 frame_length, rate, need_ack));
382 //byFreqType: 0=>5GHZ 1=>2.4GHZ
386 struct vnt_private *pDevice,
387 unsigned char byRTSRsvType,
388 unsigned char byPktType,
389 unsigned int cbFrameLength,
390 unsigned short wCurrentRate
393 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
395 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
397 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
398 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
399 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
400 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
401 } else if (byRTSRsvType == 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
402 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
403 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
404 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
405 } else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
406 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
407 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
408 } else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
409 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
410 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
411 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
412 return cpu_to_le16((u16)uRrvTime);
416 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
417 return cpu_to_le16((u16)uRrvTime);
420 //byFreqType 0: 5GHz, 1:2.4Ghz
424 struct vnt_private *pDevice,
425 unsigned char byDurType,
426 unsigned int cbFrameLength,
427 unsigned char byPktType,
428 unsigned short wRate,
430 unsigned int uFragIdx,
431 unsigned int cbLastFragmentSize,
432 unsigned int uMACfragNum,
433 unsigned char byFBOption
437 unsigned int uAckTime = 0, uNextPktTime = 0;
439 if (uFragIdx == (uMACfragNum-1))
443 case DATADUR_B: //DATADUR_B
444 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
446 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
447 return pDevice->uSIFS + uAckTime;
451 } else {//First Frag or Mid Frag
452 if (uFragIdx == (uMACfragNum-2))
453 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
455 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
458 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
459 return pDevice->uSIFS + uAckTime + uNextPktTime;
461 return pDevice->uSIFS + uNextPktTime;
466 case DATADUR_A: //DATADUR_A
467 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
469 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
470 return pDevice->uSIFS + uAckTime;
474 } else {//First Frag or Mid Frag
475 if (uFragIdx == (uMACfragNum-2))
476 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
478 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
481 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
482 return pDevice->uSIFS + uAckTime + uNextPktTime;
484 return pDevice->uSIFS + uNextPktTime;
489 case DATADUR_A_F0: //DATADUR_A_F0
490 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
492 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
493 return pDevice->uSIFS + uAckTime;
497 } else { //First Frag or Mid Frag
498 if (byFBOption == AUTO_FB_0) {
499 if (wRate < RATE_18M)
501 else if (wRate > RATE_54M)
504 if (uFragIdx == (uMACfragNum-2))
505 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
507 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
509 } else { // (byFBOption == AUTO_FB_1)
510 if (wRate < RATE_18M)
512 else if (wRate > RATE_54M)
515 if (uFragIdx == (uMACfragNum-2))
516 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
518 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
523 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
524 return pDevice->uSIFS + uAckTime + uNextPktTime;
526 return pDevice->uSIFS + uNextPktTime;
531 case DATADUR_A_F1: //DATADUR_A_F1
532 if (((uMACfragNum == 1)) || bLastFrag) {//Non Frag or Last Frag
534 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
535 return pDevice->uSIFS + uAckTime;
539 } else { //First Frag or Mid Frag
540 if (byFBOption == AUTO_FB_0) {
541 if (wRate < RATE_18M)
543 else if (wRate > RATE_54M)
546 if (uFragIdx == (uMACfragNum-2))
547 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
549 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
551 } else { // (byFBOption == AUTO_FB_1)
552 if (wRate < RATE_18M)
554 else if (wRate > RATE_54M)
557 if (uFragIdx == (uMACfragNum-2))
558 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
560 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
563 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
564 return pDevice->uSIFS + uAckTime + uNextPktTime;
566 return pDevice->uSIFS + uNextPktTime;
579 //byFreqType: 0=>5GHZ 1=>2.4GHZ
582 s_uGetRTSCTSDuration(
583 struct vnt_private *pDevice,
584 unsigned char byDurType,
585 unsigned int cbFrameLength,
586 unsigned char byPktType,
587 unsigned short wRate,
589 unsigned char byFBOption
592 unsigned int uCTSTime = 0, uDurTime = 0;
595 case RTSDUR_BB: //RTSDuration_bb
596 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
597 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
600 case RTSDUR_BA: //RTSDuration_ba
601 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
602 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
605 case RTSDUR_AA: //RTSDuration_aa
606 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
607 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
610 case CTSDUR_BA: //CTSDuration_ba
611 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
614 case RTSDUR_BA_F0: //RTSDuration_ba_f0
615 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
616 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
617 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
618 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
619 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
623 case RTSDUR_AA_F0: //RTSDuration_aa_f0
624 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
625 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
626 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
627 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
628 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
632 case RTSDUR_BA_F1: //RTSDuration_ba_f1
633 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
634 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
635 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
636 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
637 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
641 case RTSDUR_AA_F1: //RTSDuration_aa_f1
642 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
643 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
644 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
645 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
646 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
650 case CTSDUR_BA_F0: //CTSDuration_ba_f0
651 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
652 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
653 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
654 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
658 case CTSDUR_BA_F1: //CTSDuration_ba_f1
659 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
660 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
661 else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
662 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
670 return cpu_to_le16((u16)uDurTime);
676 struct vnt_private *pDevice,
677 unsigned char byPktType,
679 unsigned int cbFrameLength,
680 unsigned int uDMAIdx,
682 unsigned int uFragIdx,
683 unsigned int cbLastFragmentSize,
684 unsigned int uMACfragNum,
685 unsigned char byFBOption,
686 unsigned short wCurrentRate
690 if (pTxDataHead == NULL)
694 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
695 if (byFBOption == AUTO_FB_NONE) {
696 struct vnt_tx_datahead_g *buf = pTxDataHead;
697 /* Get SignalField, ServiceField & Length */
698 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
701 vnt_get_phy_field(pDevice, cbFrameLength,
702 pDevice->byTopCCKBasicRate,
703 PK_TYPE_11B, &buf->b);
705 /* Get Duration and TimeStamp */
706 buf->duration_a = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
707 byPktType, wCurrentRate, bNeedAck, uFragIdx,
708 cbLastFragmentSize, uMACfragNum,
710 buf->duration_b = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
711 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
712 bNeedAck, uFragIdx, cbLastFragmentSize,
713 uMACfragNum, byFBOption));
715 buf->time_stamp_off_a = vnt_time_stamp_off(pDevice, wCurrentRate);
716 buf->time_stamp_off_b = vnt_time_stamp_off(pDevice, pDevice->byTopCCKBasicRate);
718 return buf->duration_a;
721 struct vnt_tx_datahead_g_fb *buf = pTxDataHead;
722 /* Get SignalField, ServiceField & Length */
723 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
726 vnt_get_phy_field(pDevice, cbFrameLength,
727 pDevice->byTopCCKBasicRate,
728 PK_TYPE_11B, &buf->b);
729 /* Get Duration and TimeStamp */
730 buf->duration_a = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
731 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
732 buf->duration_b = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
733 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
734 buf->duration_a_f0 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
735 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
736 buf->duration_a_f1 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
737 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
739 buf->time_stamp_off_a = vnt_time_stamp_off(pDevice, wCurrentRate);
740 buf->time_stamp_off_b = vnt_time_stamp_off(pDevice, pDevice->byTopCCKBasicRate);
742 return buf->duration_a;
743 } //if (byFBOption == AUTO_FB_NONE)
744 } else if (byPktType == PK_TYPE_11A) {
745 if ((byFBOption != AUTO_FB_NONE)) {
747 struct vnt_tx_datahead_a_fb *buf = pTxDataHead;
748 /* Get SignalField, ServiceField & Length */
749 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
752 /* Get Duration and TimeStampOff */
753 buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
754 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
755 buf->duration_f0 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
756 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
757 buf->duration_f1 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
758 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
759 buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
760 return buf->duration;
762 struct vnt_tx_datahead_ab *buf = pTxDataHead;
763 /* Get SignalField, ServiceField & Length */
764 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
765 byPktType, &buf->ab);
767 /* Get Duration and TimeStampOff */
768 buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
769 wCurrentRate, bNeedAck, uFragIdx,
770 cbLastFragmentSize, uMACfragNum,
773 buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
774 return buf->duration;
777 struct vnt_tx_datahead_ab *buf = pTxDataHead;
778 /* Get SignalField, ServiceField & Length */
779 vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
780 byPktType, &buf->ab);
781 /* Get Duration and TimeStampOff */
782 buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
783 wCurrentRate, bNeedAck, uFragIdx,
784 cbLastFragmentSize, uMACfragNum,
786 buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
787 return buf->duration;
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;
812 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
813 // in this case we need to decrease its length by 4.
817 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
818 // Otherwise, we need to modify codes for them.
819 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
820 if (byFBOption == AUTO_FB_NONE) {
821 struct vnt_rts_g *buf = pvRTS;
822 /* Get SignalField, ServiceField & Length */
823 vnt_get_phy_field(pDevice, uRTSFrameLen,
824 pDevice->byTopCCKBasicRate,
825 PK_TYPE_11B, &buf->b);
827 vnt_get_phy_field(pDevice, uRTSFrameLen,
828 pDevice->byTopOFDMBasicRate,
832 s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
833 cbFrameLength, PK_TYPE_11B,
834 pDevice->byTopCCKBasicRate,
835 bNeedAck, byFBOption);
837 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
838 cbFrameLength, byPktType,
839 wCurrentRate, bNeedAck,
842 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
843 cbFrameLength, byPktType,
844 wCurrentRate, bNeedAck,
847 buf->data.duration = buf->duration_aa;
848 /* Get RTS Frame body */
849 buf->data.frame_control =
850 cpu_to_le16(IEEE80211_FTYPE_CTL |
851 IEEE80211_STYPE_RTS);
854 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
855 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
856 ether_addr_copy(buf->data.ra,
857 psEthHeader->abyDstAddr);
859 ether_addr_copy(buf->data.ra,
862 if (pDevice->op_mode == NL80211_IFTYPE_AP)
863 ether_addr_copy(buf->data.ta,
866 ether_addr_copy(buf->data.ta,
867 psEthHeader->abySrcAddr);
870 struct vnt_rts_g_fb *buf = pvRTS;
871 /* Get SignalField, ServiceField & Length */
872 vnt_get_phy_field(pDevice, uRTSFrameLen,
873 pDevice->byTopCCKBasicRate,
874 PK_TYPE_11B, &buf->b);
876 vnt_get_phy_field(pDevice, uRTSFrameLen,
877 pDevice->byTopOFDMBasicRate,
881 s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
882 cbFrameLength, PK_TYPE_11B,
883 pDevice->byTopCCKBasicRate,
884 bNeedAck, byFBOption);
886 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
887 cbFrameLength, byPktType,
888 wCurrentRate, bNeedAck,
891 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
892 cbFrameLength, byPktType,
893 wCurrentRate, bNeedAck,
895 buf->rts_duration_ba_f0 =
896 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0,
897 cbFrameLength, byPktType,
898 wCurrentRate, bNeedAck,
900 buf->rts_duration_aa_f0 =
901 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
902 cbFrameLength, byPktType,
903 wCurrentRate, bNeedAck,
905 buf->rts_duration_ba_f1 =
906 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1,
907 cbFrameLength, byPktType,
908 wCurrentRate, bNeedAck,
910 buf->rts_duration_aa_f1 =
911 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
912 cbFrameLength, byPktType,
913 wCurrentRate, bNeedAck,
915 buf->data.duration = buf->duration_aa;
916 /* Get RTS Frame body */
917 buf->data.frame_control =
918 cpu_to_le16(IEEE80211_FTYPE_CTL |
919 IEEE80211_STYPE_RTS);
922 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
923 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
924 ether_addr_copy(buf->data.ra,
925 psEthHeader->abyDstAddr);
927 ether_addr_copy(buf->data.ra,
931 if (pDevice->op_mode == NL80211_IFTYPE_AP)
932 ether_addr_copy(buf->data.ta,
935 ether_addr_copy(buf->data.ta,
936 psEthHeader->abySrcAddr);
938 } // if (byFBOption == AUTO_FB_NONE)
939 } else if (byPktType == PK_TYPE_11A) {
940 if (byFBOption == AUTO_FB_NONE) {
941 struct vnt_rts_ab *buf = pvRTS;
942 /* Get SignalField, ServiceField & Length */
943 vnt_get_phy_field(pDevice, uRTSFrameLen,
944 pDevice->byTopOFDMBasicRate,
945 byPktType, &buf->ab);
948 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
949 cbFrameLength, byPktType,
950 wCurrentRate, bNeedAck,
952 buf->data.duration = buf->duration;
953 /* Get RTS Frame body */
954 buf->data.frame_control =
955 cpu_to_le16(IEEE80211_FTYPE_CTL |
956 IEEE80211_STYPE_RTS);
959 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
960 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
961 ether_addr_copy(buf->data.ra,
962 psEthHeader->abyDstAddr);
964 ether_addr_copy(buf->data.ra,
968 if (pDevice->op_mode == NL80211_IFTYPE_AP)
969 ether_addr_copy(buf->data.ta,
972 ether_addr_copy(buf->data.ta,
973 psEthHeader->abySrcAddr);
976 struct vnt_rts_a_fb *buf = pvRTS;
977 /* Get SignalField, ServiceField & Length */
978 vnt_get_phy_field(pDevice, uRTSFrameLen,
979 pDevice->byTopOFDMBasicRate,
983 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
984 cbFrameLength, byPktType,
985 wCurrentRate, bNeedAck,
987 buf->rts_duration_f0 =
988 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
989 cbFrameLength, byPktType,
990 wCurrentRate, bNeedAck,
992 buf->rts_duration_f1 =
993 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
994 cbFrameLength, byPktType,
995 wCurrentRate, bNeedAck,
997 buf->data.duration = buf->duration;
998 /* Get RTS Frame body */
999 buf->data.frame_control =
1000 cpu_to_le16(IEEE80211_FTYPE_CTL |
1001 IEEE80211_STYPE_RTS);
1003 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
1004 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
1005 ether_addr_copy(buf->data.ra,
1006 psEthHeader->abyDstAddr);
1008 ether_addr_copy(buf->data.ra,
1011 if (pDevice->op_mode == NL80211_IFTYPE_AP)
1012 ether_addr_copy(buf->data.ta,
1015 ether_addr_copy(buf->data.ta,
1016 psEthHeader->abySrcAddr);
1018 } else if (byPktType == PK_TYPE_11B) {
1019 struct vnt_rts_ab *buf = pvRTS;
1020 /* Get SignalField, ServiceField & Length */
1021 vnt_get_phy_field(pDevice, uRTSFrameLen,
1022 pDevice->byTopCCKBasicRate,
1023 PK_TYPE_11B, &buf->ab);
1026 s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength,
1027 byPktType, wCurrentRate, bNeedAck,
1030 buf->data.duration = buf->duration;
1031 /* Get RTS Frame body */
1032 buf->data.frame_control =
1033 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
1035 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
1036 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
1037 ether_addr_copy(buf->data.ra,
1038 psEthHeader->abyDstAddr);
1040 ether_addr_copy(buf->data.ra, pDevice->abyBSSID);
1043 if (pDevice->op_mode == NL80211_IFTYPE_AP)
1044 ether_addr_copy(buf->data.ta, pDevice->abyBSSID);
1046 ether_addr_copy(buf->data.ta,
1047 psEthHeader->abySrcAddr);
1054 struct vnt_private *pDevice,
1055 unsigned int uDMAIdx,
1056 unsigned char byPktType,
1058 unsigned int cbFrameLength,
1061 unsigned short wCurrentRate,
1062 unsigned char byFBOption
1065 unsigned int uCTSFrameLen = 14;
1071 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1072 // in this case we need to decrease its length by 4.
1076 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1077 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1079 struct vnt_cts_fb *buf = pvCTS;
1080 /* Get SignalField, ServiceField & Length */
1081 vnt_get_phy_field(pDevice, uCTSFrameLen,
1082 pDevice->byTopCCKBasicRate,
1083 PK_TYPE_11B, &buf->b);
1086 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
1087 cbFrameLength, byPktType,
1088 wCurrentRate, bNeedAck,
1091 /* Get CTSDuration_ba_f0 */
1092 buf->cts_duration_ba_f0 =
1093 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0,
1094 cbFrameLength, byPktType,
1095 wCurrentRate, bNeedAck,
1098 /* Get CTSDuration_ba_f1 */
1099 buf->cts_duration_ba_f1 =
1100 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1,
1101 cbFrameLength, byPktType,
1102 wCurrentRate, bNeedAck,
1105 /* Get CTS Frame body */
1106 buf->data.duration = buf->duration_ba;
1108 buf->data.frame_control =
1109 cpu_to_le16(IEEE80211_FTYPE_CTL |
1110 IEEE80211_STYPE_CTS);
1112 buf->reserved2 = 0x0;
1114 ether_addr_copy(buf->data.ra,
1115 pDevice->abyCurrentNetAddr);
1116 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1117 struct vnt_cts *buf = pvCTS;
1118 /* Get SignalField, ServiceField & Length */
1119 vnt_get_phy_field(pDevice, uCTSFrameLen,
1120 pDevice->byTopCCKBasicRate,
1121 PK_TYPE_11B, &buf->b);
1123 /* Get CTSDuration_ba */
1125 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
1126 cbFrameLength, byPktType,
1127 wCurrentRate, bNeedAck,
1130 /* Get CTS Frame body */
1131 buf->data.duration = buf->duration_ba;
1133 buf->data.frame_control =
1134 cpu_to_le16(IEEE80211_FTYPE_CTL |
1135 IEEE80211_STYPE_CTS);
1137 buf->reserved2 = 0x0;
1138 ether_addr_copy(buf->data.ra,
1139 pDevice->abyCurrentNetAddr);
1147 * Generate FIFO control for MAC & Baseband controller
1151 * pDevice - Pointer to adapter
1152 * pTxDataHead - Transmit Data Buffer
1153 * pTxBufHead - pTxBufHead
1154 * pvRrvTime - pvRrvTime
1155 * pvRTS - RTS Buffer
1157 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1158 * bNeedACK - If need ACK
1159 * uDescIdx - Desc Index
1163 * Return Value: none
1166 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1169 s_vGenerateTxParameter(
1170 struct vnt_private *pDevice,
1171 unsigned char byPktType,
1176 unsigned int cbFrameSize,
1178 unsigned int uDMAIdx,
1179 PSEthernetHeader psEthHeader,
1180 unsigned short wCurrentRate
1183 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1184 unsigned short wFifoCtl;
1185 bool bDisCRC = false;
1186 unsigned char byFBOption = AUTO_FB_NONE;
1188 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1190 pFifoHead->wReserved = wCurrentRate;
1191 wFifoCtl = pFifoHead->wFIFOCtl;
1193 if (wFifoCtl & FIFOCTL_CRCDIS)
1196 if (wFifoCtl & FIFOCTL_AUTO_FB_0)
1197 byFBOption = AUTO_FB_0;
1198 else if (wFifoCtl & FIFOCTL_AUTO_FB_1)
1199 byFBOption = AUTO_FB_1;
1201 if (pDevice->bLongHeader)
1202 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1207 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1208 if (pvRTS != NULL) { //RTS_need
1210 struct vnt_rrv_time_rts *buf = pvRrvTime;
1212 buf->rts_rrv_time_aa = s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
1213 buf->rts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate);
1214 buf->rts_rrv_time_bb = s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
1215 buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
1216 buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
1218 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1219 } else {//RTS_needless, PCF mode
1220 struct vnt_rrv_time_cts *buf = pvRrvTime;
1222 buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
1223 buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
1224 buf->cts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate);
1227 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1229 } else if (byPktType == PK_TYPE_11A) {
1230 if (pvRTS != NULL) {//RTS_need, non PCF mode
1231 struct vnt_rrv_time_ab *buf = pvRrvTime;
1233 buf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
1234 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
1237 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1238 } else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1239 struct vnt_rrv_time_ab *buf = pvRrvTime;
1241 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK);
1243 } else if (byPktType == PK_TYPE_11B) {
1244 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1245 struct vnt_rrv_time_ab *buf = pvRrvTime;
1247 buf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
1248 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
1251 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1252 } else { //RTS_needless, non PCF mode
1253 struct vnt_rrv_time_ab *buf = pvRrvTime;
1255 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
1262 s_vFillFragParameter(
1263 struct vnt_private *pDevice,
1264 unsigned char *pbyBuffer,
1265 unsigned int uTxType,
1267 unsigned short wFragType,
1268 unsigned int cbReqCount
1271 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1273 if (uTxType == TYPE_SYNCDMA) {
1274 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1276 //Set FIFOCtl & TimeStamp in TxSyncDesc
1277 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1278 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1279 //Set TSR1 & ReqCount in TxDescHead
1280 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1281 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1282 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1284 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1286 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1287 //Set TSR1 & ReqCount in TxDescHead
1288 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1289 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1290 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1292 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1295 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1299 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
1300 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
1301 unsigned int uDMAIdx, PSTxDesc pHeadTD,
1302 PSEthernetHeader psEthHeader, unsigned char *pPacket,
1303 bool bNeedEncrypt, PSKeyItem pTransmitKey,
1304 unsigned int uNodeIndex, unsigned int *puMACfragNum)
1306 unsigned int cbMACHdLen;
1307 unsigned int cbFrameSize;
1308 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1309 unsigned int cbFragPayloadSize;
1310 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1311 unsigned int cbLastFragPayloadSize;
1312 unsigned int uFragIdx;
1313 unsigned char *pbyPayloadHead;
1314 unsigned char *pbyIVHead;
1315 unsigned char *pbyMacHdr;
1316 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1318 unsigned char *pbyBuffer;
1319 unsigned int cbIVlen = 0;
1320 unsigned int cbICVlen = 0;
1321 unsigned int cbMIClen = 0;
1322 unsigned int cbFCSlen = 4;
1323 unsigned int cb802_1_H_len = 0;
1324 unsigned int uLength = 0;
1325 unsigned int uTmpLen = 0;
1326 unsigned int cbMICHDR = 0;
1327 u32 dwMICKey0, dwMICKey1;
1331 u32 dwSafeMIC_L, dwSafeMIC_R; /* Fix "Last Frag Size" < "MIC length". */
1332 bool bMIC2Frag = false;
1333 unsigned int uMICFragLen = 0;
1334 unsigned int uMACfragNum = 1;
1335 unsigned int uPadding = 0;
1336 unsigned int cbReqCount = 0;
1341 unsigned char *pbyType;
1343 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1344 unsigned int cbHeaderLength = 0;
1346 struct vnt_mic_hdr *pMICHDR;
1350 unsigned short wTxBufSize; // FFinfo size
1351 unsigned int uTotalCopyLength = 0;
1352 unsigned char byFBOption = AUTO_FB_NONE;
1353 bool bIsWEP256 = false;
1354 PSMgmtObject pMgmt = pDevice->pMgmt;
1356 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1358 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
1359 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
1360 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1366 // MSDUs in Infra mode always need ACK
1371 if (pDevice->bLongHeader)
1372 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1374 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1376 if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1377 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1380 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)
1383 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1384 cbIVlen = 8;//IV+ExtIV
1388 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1389 cbIVlen = 8;//RSN Header
1391 cbMICHDR = sizeof(struct vnt_mic_hdr);
1393 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1394 //MAC Header should be padding 0 to DW alignment.
1395 uPadding = 4 - (cbMACHdLen%4);
1400 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1402 if ((bNeedACK == false) ||
1403 (cbFrameSize < pDevice->wRTSThreshold) ||
1404 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1409 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1412 // Use for AUTO FALL BACK
1414 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0)
1415 byFBOption = AUTO_FB_0;
1416 else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1)
1417 byFBOption = AUTO_FB_1;
1419 //////////////////////////////////////////////////////
1420 //Set RrvTime/RTS/CTS Buffer
1421 wTxBufSize = sizeof(STxBufHead);
1422 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1424 if (byFBOption == AUTO_FB_NONE) {
1425 if (bRTS == true) {//RTS_need
1426 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1427 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
1428 pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
1430 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1431 cbMICHDR + sizeof(struct vnt_rts_g));
1432 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1433 cbMICHDR + sizeof(struct vnt_rts_g) +
1434 sizeof(struct vnt_tx_datahead_g);
1435 } else { //RTS_needless
1436 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1437 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
1439 pvCTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
1440 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
1441 sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
1442 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
1443 cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
1447 if (bRTS == true) {//RTS_need
1448 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1449 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
1450 pvRTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
1452 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1453 cbMICHDR + sizeof(struct vnt_rts_g_fb));
1454 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1455 cbMICHDR + sizeof(struct vnt_rts_g_fb) + sizeof(struct vnt_tx_datahead_g_fb);
1456 } else { //RTS_needless
1457 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1458 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
1460 pvCTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
1461 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
1462 cbMICHDR + sizeof(struct vnt_cts_fb));
1463 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
1464 cbMICHDR + sizeof(struct vnt_cts_fb) + sizeof(struct vnt_tx_datahead_g_fb);
1467 } else {//802.11a/b packet
1469 if (byFBOption == AUTO_FB_NONE) {
1471 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1472 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
1473 pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
1475 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
1476 sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_ab));
1477 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1478 cbMICHDR + sizeof(struct vnt_rts_ab) + sizeof(struct vnt_tx_datahead_ab);
1479 } else { //RTS_needless, need MICHDR
1480 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1481 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
1484 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
1485 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1486 cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
1490 if (bRTS == true) {//RTS_need
1491 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1492 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
1493 pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
1495 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
1496 sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_a_fb));
1497 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1498 cbMICHDR + sizeof(struct vnt_rts_a_fb) + sizeof(struct vnt_tx_datahead_a_fb);
1499 } else { //RTS_needless
1500 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1501 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
1504 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
1505 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1506 cbMICHDR + sizeof(struct vnt_tx_datahead_a_fb);
1510 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1512 //////////////////////////////////////////////////////////////////
1513 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1514 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1515 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1516 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1517 } else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1518 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1519 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1521 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]);
1522 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]);
1524 // DO Software Michael
1525 MIC_vInit(dwMICKey0, dwMICKey1);
1526 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1528 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1529 pr_debug("MIC KEY: %X, %X\n", dwMICKey0, dwMICKey1);
1532 ///////////////////////////////////////////////////////////////////
1534 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1535 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1536 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1538 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1540 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1541 cbFragmentSize = pDevice->wFragmentationThreshold;
1542 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1543 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1544 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1545 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1546 if (cbLastFragPayloadSize == 0)
1547 cbLastFragPayloadSize = cbFragPayloadSize;
1551 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1552 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1554 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
1555 if (uFragIdx == 0) {
1556 //=========================
1557 // Start Fragmentation
1558 //=========================
1559 pr_debug("Start Fragmentation...\n");
1560 wFragType = FRAGCTL_STAFRAG;
1562 //Fill FIFO,RrvTime,RTS,and CTS
1563 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1564 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1566 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1567 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1568 // Generate TX MAC Header
1569 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1570 wFragType, uDMAIdx, uFragIdx);
1572 if (bNeedEncrypt == true) {
1574 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1575 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1576 //Fill IV(ExtIV,RSNHDR)
1577 if (pDevice->bEnableHostWEP) {
1578 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1579 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1584 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1585 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1586 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1587 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1589 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1591 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1592 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1596 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1597 //---------------------------
1598 // S/W or H/W Encryption
1599 //---------------------------
1600 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1602 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1603 //copy TxBufferHeader + MacHeader to desc
1604 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1606 // Copy the Packet into a tx Buffer
1607 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1609 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1611 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1612 pr_debug("Start MIC: %d\n",
1614 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1618 //---------------------------
1620 //---------------------------
1621 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1623 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1624 cbReqCount += cbICVlen;
1628 ptdCurr = (PSTxDesc)pHeadTD;
1629 //--------------------
1630 //1.Set TSR1 & ReqCount in TxDescHead
1631 //2.Set FragCtl in TxBufferHead
1632 //3.Set Frame Control
1633 //4.Set Sequence Control
1634 //5.Get S/W generate FCS
1635 //--------------------
1636 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1638 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1639 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1640 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1641 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1642 pDevice->iTDUsed[uDMAIdx]++;
1643 pHeadTD = ptdCurr->next;
1644 } else if (uFragIdx == (uMACfragNum-1)) {
1645 //=========================
1646 // Last Fragmentation
1647 //=========================
1648 pr_debug("Last Fragmentation...\n");
1650 wFragType = FRAGCTL_ENDFRAG;
1652 //Fill FIFO,RrvTime,RTS,and CTS
1653 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1654 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1656 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1657 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1659 // Generate TX MAC Header
1660 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1661 wFragType, uDMAIdx, uFragIdx);
1663 if (bNeedEncrypt == true) {
1665 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1666 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1668 if (pDevice->bEnableHostWEP) {
1669 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1670 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1675 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1676 //---------------------------
1677 // S/W or H/W Encryption
1678 //---------------------------
1680 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1682 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1684 //copy TxBufferHeader + MacHeader to desc
1685 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1687 // Copy the Packet into a tx Buffer
1688 if (bMIC2Frag == false) {
1689 memcpy((pbyBuffer + uLength),
1690 (pPacket + 14 + uTotalCopyLength),
1691 (cbLastFragPayloadSize - cbMIClen)
1693 //TODO check uTmpLen !
1694 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1697 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1698 pr_debug("LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1700 cbLastFragPayloadSize,
1703 if (bMIC2Frag == false) {
1705 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1706 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1707 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1708 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1709 pr_debug("Last MIC:%X, %X\n",
1710 *pdwMIC_L, *pdwMIC_R);
1712 if (uMICFragLen >= 4) {
1713 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1714 (cbMIClen - uMICFragLen));
1715 pr_debug("LAST: uMICFragLen >= 4: %X, %d\n",
1716 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1717 (cbMIClen - uMICFragLen));
1720 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1722 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1723 pr_debug("LAST: uMICFragLen < 4: %X, %d\n",
1724 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1725 (cbMIClen - uMICFragLen));
1730 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1733 //---------------------------
1735 //---------------------------
1736 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1738 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1739 cbReqCount += cbICVlen;
1743 ptdCurr = (PSTxDesc)pHeadTD;
1745 //--------------------
1746 //1.Set TSR1 & ReqCount in TxDescHead
1747 //2.Set FragCtl in TxBufferHead
1748 //3.Set Frame Control
1749 //4.Set Sequence Control
1750 //5.Get S/W generate FCS
1751 //--------------------
1753 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1755 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1756 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1757 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1758 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1759 pDevice->iTDUsed[uDMAIdx]++;
1760 pHeadTD = ptdCurr->next;
1763 //=========================
1764 // Middle Fragmentation
1765 //=========================
1766 pr_debug("Middle Fragmentation...\n");
1768 wFragType = FRAGCTL_MIDFRAG;
1770 //Fill FIFO,RrvTime,RTS,and CTS
1771 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1772 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1774 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1775 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1777 // Generate TX MAC Header
1778 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1779 wFragType, uDMAIdx, uFragIdx);
1781 if (bNeedEncrypt == true) {
1783 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1784 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1786 if (pDevice->bEnableHostWEP) {
1787 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1788 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1792 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1793 //---------------------------
1794 // S/W or H/W Encryption
1795 //---------------------------
1797 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1798 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1800 //copy TxBufferHeader + MacHeader to desc
1801 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1803 // Copy the Packet into a tx Buffer
1804 memcpy((pbyBuffer + uLength),
1805 (pPacket + 14 + uTotalCopyLength),
1808 uTmpLen = cbFragPayloadSize;
1810 uTotalCopyLength += uTmpLen;
1812 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1813 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1815 if (uTmpLen < cbFragPayloadSize) {
1817 uMICFragLen = cbFragPayloadSize - uTmpLen;
1818 ASSERT(uMICFragLen < cbMIClen);
1820 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1821 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1822 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1823 dwSafeMIC_L = *pdwMIC_L;
1824 dwSafeMIC_R = *pdwMIC_R;
1826 pr_debug("MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1830 pr_debug("Fill MIC in Middle frag [%d]\n",
1832 pr_debug("Get MIC:%X, %X\n",
1833 *pdwMIC_L, *pdwMIC_R);
1835 pr_debug("Middle frag len: %d\n",
1839 ASSERT(uTmpLen == (cbFragPayloadSize));
1842 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1844 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1845 cbReqCount += cbICVlen;
1849 ptdCurr = (PSTxDesc)pHeadTD;
1851 //--------------------
1852 //1.Set TSR1 & ReqCount in TxDescHead
1853 //2.Set FragCtl in TxBufferHead
1854 //3.Set Frame Control
1855 //4.Set Sequence Control
1856 //5.Get S/W generate FCS
1857 //--------------------
1859 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1861 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1862 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1863 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1864 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1865 pDevice->iTDUsed[uDMAIdx]++;
1866 pHeadTD = ptdCurr->next;
1868 } // for (uMACfragNum)
1870 //=========================
1872 //=========================
1873 wFragType = FRAGCTL_NONFRAG;
1875 //Set FragCtl in TxBufferHead
1876 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1878 //Fill FIFO,RrvTime,RTS,and CTS
1879 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1880 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1882 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1883 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1885 // Generate TX MAC Header
1886 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1887 wFragType, uDMAIdx, 0);
1889 if (bNeedEncrypt == true) {
1891 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1892 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1894 if (pDevice->bEnableHostWEP) {
1895 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1896 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1901 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1902 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1903 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1904 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1906 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1908 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1909 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1913 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1914 //---------------------------
1915 // S/W or H/W Encryption
1916 //---------------------------
1917 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1918 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1920 //copy TxBufferHeader + MacHeader to desc
1921 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1923 // Copy the Packet into a tx Buffer
1924 memcpy((pbyBuffer + uLength),
1926 cbFrameBodySize - cb802_1_H_len
1929 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1930 pr_debug("Length:%d, %d\n",
1931 cbFrameBodySize - cb802_1_H_len, uLength);
1933 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
1935 pdwMIC_L = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
1936 pdwMIC_R = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
1938 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1941 if (pDevice->bTxMICFail == true) {
1944 pDevice->bTxMICFail = false;
1947 pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
1948 pr_debug("cbReqCount:%d, %d, %d, %d\n",
1949 cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1950 pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
1954 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1956 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
1957 (unsigned short)(cbFrameBodySize + cbMIClen));
1958 cbReqCount += cbICVlen;
1962 ptdCurr = (PSTxDesc)pHeadTD;
1964 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1965 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1966 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1967 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1968 //Set TSR1 & ReqCount in TxDescHead
1969 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1970 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1972 pDevice->iTDUsed[uDMAIdx]++;
1975 *puMACfragNum = uMACfragNum;
1977 return cbHeaderLength;
1981 vGenerateFIFOHeader(struct vnt_private *pDevice, unsigned char byPktType,
1982 unsigned char *pbyTxBufferAddr, bool bNeedEncrypt,
1983 unsigned int cbPayloadSize, unsigned int uDMAIdx,
1984 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
1985 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
1986 unsigned int *pcbHeaderSize)
1988 unsigned int wTxBufSize; // FFinfo size
1991 unsigned short cbMacHdLen;
1992 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1994 wTxBufSize = sizeof(STxBufHead);
1996 memset(pTxBufHead, 0, wTxBufSize);
1997 //Set FIFOCTL_NEEDACK
1999 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
2000 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
2001 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
2003 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
2006 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2010 // MSDUs in Infra mode always need ACK
2012 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2016 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2017 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
2020 if (pDevice->bLongHeader)
2021 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
2023 //Set FIFOCTL_GENINT
2025 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2027 //Set FIFOCTL_ISDMA0
2028 if (TYPE_TXDMA0 == uDMAIdx)
2029 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
2031 //Set FRAGCTL_MACHDCNT
2032 if (pDevice->bLongHeader)
2033 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
2035 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2037 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2040 if (byPktType == PK_TYPE_11A) //0000 0000 0000 0000
2042 else if (byPktType == PK_TYPE_11B) //0000 0001 0000 0000
2043 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2044 else if (byPktType == PK_TYPE_11GB) //0000 0010 0000 0000
2045 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2046 else if (byPktType == PK_TYPE_11GA) //0000 0011 0000 0000
2047 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2049 //Set FIFOCTL_GrpAckPolicy
2050 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2051 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2053 //Set Auto Fallback Ctl
2054 if (pDevice->wCurrentRate >= RATE_18M) {
2055 if (pDevice->byAutoFBCtrl == AUTO_FB_0)
2056 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
2057 else if (pDevice->byAutoFBCtrl == AUTO_FB_1)
2058 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
2061 //Set FRAGCTL_WEPTYP
2062 pDevice->bAES = false;
2064 //Set FRAGCTL_WEPTYP
2065 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
2066 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
2067 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2068 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2069 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
2070 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
2071 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2072 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
2073 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2078 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
2080 pTxBufHead->byTxPower = pDevice->byCurPwr;
2082 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
2083 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
2084 pTransmitKey, uNodeIndex, puMACfragNum);
2090 * Translate 802.3 to 802.11 header
2094 * pDevice - Pointer to adapter
2095 * dwTxBufferAddr - Transmit Buffer
2096 * pPacket - Packet from upper layer
2097 * cbPacketSize - Transmit Data Length
2099 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
2100 * pcbAppendPayload - size of append payload for 802.1H translation
2102 * Return Value: none
2108 struct vnt_private *pDevice,
2109 unsigned char *pbyBufferAddr,
2111 PSEthernetHeader psEthHeader,
2113 unsigned short wFragType,
2114 unsigned int uDMAIdx,
2115 unsigned int uFragIdx
2118 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
2120 memset(pMACHeader, 0, (sizeof(S802_11Header)));
2122 if (uDMAIdx == TYPE_ATIMDMA)
2123 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2125 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2127 if (pDevice->op_mode == NL80211_IFTYPE_AP) {
2128 ether_addr_copy(&(pMACHeader->abyAddr1[0]),
2129 &(psEthHeader->abyDstAddr[0]));
2130 ether_addr_copy(&(pMACHeader->abyAddr2[0]),
2131 &(pDevice->abyBSSID[0]));
2132 ether_addr_copy(&(pMACHeader->abyAddr3[0]),
2133 &(psEthHeader->abySrcAddr[0]));
2134 pMACHeader->wFrameCtl |= FC_FROMDS;
2136 if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) {
2137 ether_addr_copy(&(pMACHeader->abyAddr1[0]),
2138 &(psEthHeader->abyDstAddr[0]));
2139 ether_addr_copy(&(pMACHeader->abyAddr2[0]),
2140 &(psEthHeader->abySrcAddr[0]));
2141 ether_addr_copy(&(pMACHeader->abyAddr3[0]),
2142 &(pDevice->abyBSSID[0]));
2144 ether_addr_copy(&(pMACHeader->abyAddr3[0]),
2145 &(psEthHeader->abyDstAddr[0]));
2146 ether_addr_copy(&(pMACHeader->abyAddr2[0]),
2147 &(psEthHeader->abySrcAddr[0]));
2148 ether_addr_copy(&(pMACHeader->abyAddr1[0]),
2149 &(pDevice->abyBSSID[0]));
2150 pMACHeader->wFrameCtl |= FC_TODS;
2155 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2157 pMACHeader->wDurationID = le16_to_cpu(wDuration);
2159 if (pDevice->bLongHeader) {
2160 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2162 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2163 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2165 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2167 //Set FragNumber in Sequence Control
2168 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2170 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2171 pDevice->wSeqCounter++;
2172 if (pDevice->wSeqCounter > 0x0fff)
2173 pDevice->wSeqCounter = 0;
2176 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) //StartFrag or MidFrag
2177 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2180 CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2183 unsigned char byPktType;
2184 unsigned char *pbyTxBufferAddr;
2186 struct vnt_cts *pCTS;
2188 unsigned int uDuration;
2189 unsigned int cbReqCount;
2190 PS802_11Header pMACHeader;
2191 unsigned int cbHeaderSize;
2192 unsigned int cbFrameBodySize;
2194 bool bIsPSPOLL = false;
2195 PSTxBufHead pTxBufHead;
2196 unsigned int cbFrameSize;
2197 unsigned int cbIVlen = 0;
2198 unsigned int cbICVlen = 0;
2199 unsigned int cbMIClen = 0;
2200 unsigned int cbFCSlen = 4;
2201 unsigned int uPadding = 0;
2202 unsigned short wTxBufSize;
2203 unsigned int cbMacHdLen;
2204 SEthernetHeader sEthHeader;
2207 PSMgmtObject pMgmt = pDevice->pMgmt;
2208 unsigned short wCurrentRate = RATE_1M;
2210 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0)
2211 return CMD_STATUS_RESOURCES;
2213 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2214 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2215 cbFrameBodySize = pPacket->cbPayloadLen;
2216 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2217 wTxBufSize = sizeof(STxBufHead);
2218 memset(pTxBufHead, 0, wTxBufSize);
2220 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2221 wCurrentRate = RATE_6M;
2222 byPktType = PK_TYPE_11A;
2224 wCurrentRate = RATE_1M;
2225 byPktType = PK_TYPE_11B;
2228 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2229 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2230 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2231 // to set power here.
2232 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2233 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2235 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2237 pTxBufHead->byTxPower = pDevice->byCurPwr;
2238 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2239 if (pDevice->byFOETuning) {
2240 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2241 wCurrentRate = RATE_24M;
2242 byPktType = PK_TYPE_11GA;
2247 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2248 pTxBufHead->wFIFOCtl = 0;
2249 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2250 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2251 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2252 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2253 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2254 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2257 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2258 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2260 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2264 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2267 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2268 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2269 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2272 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2274 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2276 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2278 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2281 //Set FRAGCTL_MACHDCNT
2282 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2285 // Although spec says MMPDU can be fragmented; In most cases,
2286 // no one will send a MMPDU under fragmentation. With RTS may occur.
2287 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2289 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2290 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2293 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2294 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2295 cbIVlen = 8;//IV+ExtIV
2298 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2299 //We need to get seed here for filling TxKey entry.
2300 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2301 cbIVlen = 8;//RSN Header
2303 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2304 pDevice->bAES = true;
2306 //MAC Header should be padding 0 to DW alignment.
2307 uPadding = 4 - (cbMacHdLen%4);
2311 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2313 //Set FIFOCTL_GrpAckPolicy
2314 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2315 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2317 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2319 //Set RrvTime/RTS/CTS Buffer
2320 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2321 pvRrvTime = (void *) (pbyTxBufferAddr + wTxBufSize);
2324 pCTS = (struct vnt_cts *)(pbyTxBufferAddr + wTxBufSize +
2325 sizeof(struct vnt_rrv_time_cts));
2326 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
2327 sizeof(struct vnt_rrv_time_cts) + sizeof(struct vnt_cts));
2328 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
2329 sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
2330 } else { // 802.11a/b packet
2331 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
2335 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
2336 sizeof(struct vnt_rrv_time_ab));
2337 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
2338 sizeof(struct vnt_tx_datahead_ab);
2341 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2343 ether_addr_copy(&(sEthHeader.abyDstAddr[0]),
2344 &(pPacket->p80211Header->sA3.abyAddr1[0]));
2345 ether_addr_copy(&(sEthHeader.abySrcAddr[0]),
2346 &(pPacket->p80211Header->sA3.abyAddr2[0]));
2347 //=========================
2349 //=========================
2350 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2352 //Fill FIFO,RrvTime,RTS,and CTS
2353 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2354 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2357 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2358 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2360 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2362 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2364 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2365 unsigned char *pbyIVHead;
2366 unsigned char *pbyPayloadHead;
2367 unsigned char *pbyBSSID;
2368 PSKeyItem pTransmitKey = NULL;
2370 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2371 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2374 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2375 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2377 //Fill IV(ExtIV,RSNHDR)
2378 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2379 //---------------------------
2380 // S/W or H/W Encryption
2381 //---------------------------
2383 if ((pDevice->op_mode == NL80211_IFTYPE_STATION) &&
2384 (pDevice->bLinkPass == true)) {
2385 pbyBSSID = pDevice->abyBSSID;
2387 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2389 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2390 pr_debug("Get GTK\n");
2394 pr_debug("Get PTK\n");
2399 pbyBSSID = pDevice->abyBroadcastAddr;
2400 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2401 pTransmitKey = NULL;
2402 pr_debug("KEY is NULL. OP Mode[%d]\n",
2405 pr_debug("Get GTK\n");
2409 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2410 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2412 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2413 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2416 // Copy the Packet into a tx Buffer
2417 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2420 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2421 pDevice->wSeqCounter++;
2422 if (pDevice->wSeqCounter > 0x0fff)
2423 pDevice->wSeqCounter = 0;
2426 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2427 // of FIFO control header.
2428 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2429 // in the same place of other packet's Duration-field).
2430 // And it will cause Cisco-AP to issue Disassociation-packet
2431 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2432 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2433 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2435 ((struct vnt_tx_datahead_ab *)pvTxDataHd)->duration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2439 // first TD is the only TD
2440 //Set TSR1 & ReqCount in TxDescHead
2441 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2442 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2443 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2444 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2445 pFrstTD->pTDInfo->byFlags = 0;
2447 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2449 MACbPSWakeup(pDevice->PortOffset);
2451 pDevice->bPWBitOn = false;
2454 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2457 pDevice->iTDUsed[TYPE_TXDMA0]++;
2459 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2460 pr_debug(" available td0 <= 1\n");
2462 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2464 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2466 // Poll Transmit the adapter
2467 MACvTransmit0(pDevice->PortOffset);
2469 return CMD_STATUS_PENDING;
2472 CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2474 unsigned char byPktType;
2475 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2476 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2477 unsigned int cbHeaderSize = 0;
2478 struct vnt_tx_short_buf_head *short_head =
2479 (struct vnt_tx_short_buf_head *)pbyBuffer;
2480 PS802_11Header pMACHeader;
2481 unsigned short wCurrentRate;
2483 memset(short_head, 0, sizeof(*short_head));
2485 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2486 wCurrentRate = RATE_6M;
2487 byPktType = PK_TYPE_11A;
2489 wCurrentRate = RATE_2M;
2490 byPktType = PK_TYPE_11B;
2493 //Set Preamble type always long
2494 pDevice->byPreambleType = PREAMBLE_LONG;
2496 /* Set FIFOCTL_GENINT */
2497 short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT);
2499 /* Set packet type & Get Duration */
2500 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2501 short_head->duration =
2502 cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A,
2503 cbFrameSize, byPktType, wCurrentRate, false,
2504 0, 0, 1, AUTO_FB_NONE));
2505 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2506 short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_11B);
2508 short_head->duration =
2509 cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B,
2510 cbFrameSize, byPktType, wCurrentRate, false,
2511 0, 0, 1, AUTO_FB_NONE));
2514 vnt_get_phy_field(pDevice, cbFrameSize,
2515 wCurrentRate, byPktType, &short_head->ab);
2517 /* Get TimeStampOff */
2518 short_head->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
2519 cbHeaderSize = sizeof(struct vnt_tx_short_buf_head);
2521 //Generate Beacon Header
2522 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2523 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2525 pMACHeader->wDurationID = 0;
2526 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2527 pDevice->wSeqCounter++;
2528 if (pDevice->wSeqCounter > 0x0fff)
2529 pDevice->wSeqCounter = 0;
2531 // Set Beacon buffer length
2532 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2534 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2536 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2537 // Set auto Transmit on
2538 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2539 // Poll Transmit the adapter
2540 MACvTransmitBCN(pDevice->PortOffset);
2542 return CMD_STATUS_PENDING;
2547 struct vnt_private *pDevice,
2548 PSKeyItem pTransmitKey,
2549 unsigned int cbFrameBodySize,
2550 PSEthernetHeader psEthHeader
2553 unsigned int cbMACHdLen;
2554 unsigned int cbFrameSize;
2555 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2556 unsigned int cbFragPayloadSize;
2557 unsigned int cbLastFragPayloadSize;
2558 unsigned int cbIVlen = 0;
2559 unsigned int cbICVlen = 0;
2560 unsigned int cbMIClen = 0;
2561 unsigned int cbFCSlen = 4;
2562 unsigned int uMACfragNum = 1;
2565 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
2566 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
2567 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2572 // MSDUs in Infra mode always need ACK
2576 if (pDevice->bLongHeader)
2577 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2579 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2581 if (pDevice->bEncryptionEnable == true) {
2582 if (pTransmitKey == NULL) {
2583 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2584 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2587 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2588 cbIVlen = 8;//IV+ExtIV
2591 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2592 cbIVlen = 8;//RSN Header
2595 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2598 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2599 cbIVlen = 8;//IV+ExtIV
2602 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2603 cbIVlen = 8;//RSN Header
2608 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2610 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2612 cbFragmentSize = pDevice->wFragmentationThreshold;
2613 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2614 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2615 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2616 if (cbLastFragPayloadSize == 0)
2617 cbLastFragPayloadSize = cbFragPayloadSize;
2624 void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb,
2625 unsigned char *pbMPDU, unsigned int cbMPDULen)
2628 unsigned char byPktType;
2629 unsigned char *pbyTxBufferAddr;
2633 unsigned int uDuration;
2634 unsigned int cbReqCount;
2635 PS802_11Header pMACHeader;
2636 unsigned int cbHeaderSize;
2637 unsigned int cbFrameBodySize;
2639 bool bIsPSPOLL = false;
2640 PSTxBufHead pTxBufHead;
2641 unsigned int cbFrameSize;
2642 unsigned int cbIVlen = 0;
2643 unsigned int cbICVlen = 0;
2644 unsigned int cbMIClen = 0;
2645 unsigned int cbFCSlen = 4;
2646 unsigned int uPadding = 0;
2647 unsigned int cbMICHDR = 0;
2648 unsigned int uLength = 0;
2649 u32 dwMICKey0, dwMICKey1;
2653 unsigned short wTxBufSize;
2654 unsigned int cbMacHdLen;
2655 SEthernetHeader sEthHeader;
2658 PSMgmtObject pMgmt = pDevice->pMgmt;
2659 unsigned short wCurrentRate = RATE_1M;
2660 PUWLAN_80211HDR p80211Header;
2661 unsigned int uNodeIndex = 0;
2662 bool bNodeExist = false;
2664 PSKeyItem pTransmitKey = NULL;
2665 unsigned char *pbyIVHead;
2666 unsigned char *pbyPayloadHead;
2667 unsigned char *pbyMacHdr;
2669 unsigned int cbExtSuppRate = 0;
2671 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2673 if (cbMPDULen <= WLAN_HDR_ADDR3_LEN)
2674 cbFrameBodySize = 0;
2676 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2678 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2680 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2681 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2682 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2683 wTxBufSize = sizeof(STxBufHead);
2684 memset(pTxBufHead, 0, wTxBufSize);
2686 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2687 wCurrentRate = RATE_6M;
2688 byPktType = PK_TYPE_11A;
2690 wCurrentRate = RATE_1M;
2691 byPktType = PK_TYPE_11B;
2694 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2695 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2696 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2697 // to set power here.
2698 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2699 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2701 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2703 pTxBufHead->byTxPower = pDevice->byCurPwr;
2705 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2706 if (pDevice->byFOETuning) {
2707 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2708 wCurrentRate = RATE_24M;
2709 byPktType = PK_TYPE_11GA;
2713 pr_debug("vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x\n",
2714 p80211Header->sA3.wFrameCtl);
2717 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2718 pTxBufHead->wFIFOCtl = 0;
2719 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2720 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2721 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2722 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2723 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2724 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2727 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2728 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2730 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2732 if (pDevice->bEnableHostWEP) {
2737 if (pDevice->bEnableHostWEP) {
2738 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2742 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2745 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2746 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2747 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2750 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2752 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2754 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2756 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2759 // hostapd deamon ext support rate patch
2760 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2761 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2762 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2764 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2765 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2767 if (cbExtSuppRate > 0)
2768 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2771 //Set FRAGCTL_MACHDCNT
2772 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2775 // Although spec says MMPDU can be fragmented; In most cases,
2776 // no one will send a MMPDU under fragmentation. With RTS may occur.
2777 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2779 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2780 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2783 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2784 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2785 cbIVlen = 8;//IV+ExtIV
2788 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2789 //We need to get seed here for filling TxKey entry.
2790 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2791 cbIVlen = 8;//RSN Header
2793 cbMICHDR = sizeof(struct vnt_mic_hdr);
2794 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2795 pDevice->bAES = true;
2797 //MAC Header should be padding 0 to DW alignment.
2798 uPadding = 4 - (cbMacHdLen%4);
2802 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2804 //Set FIFOCTL_GrpAckPolicy
2805 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2806 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2808 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2810 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2812 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
2813 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize +
2814 sizeof(struct vnt_rrv_time_cts));
2816 pvCTS = (struct vnt_cts *)(pbyTxBufferAddr + wTxBufSize +
2817 sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
2818 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
2819 sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
2820 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
2821 cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
2823 } else {//802.11a/b packet
2825 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
2826 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr +
2827 wTxBufSize + sizeof(struct vnt_rrv_time_ab));
2830 pvTxDataHd = (void *)(pbyTxBufferAddr +
2831 wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
2832 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
2833 cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
2837 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2838 ether_addr_copy(&(sEthHeader.abyDstAddr[0]),
2839 &(p80211Header->sA3.abyAddr1[0]));
2840 ether_addr_copy(&(sEthHeader.abySrcAddr[0]),
2841 &(p80211Header->sA3.abyAddr2[0]));
2842 //=========================
2844 //=========================
2845 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2847 //Fill FIFO,RrvTime,RTS,and CTS
2848 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2849 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2852 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2853 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2855 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2857 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2859 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
2860 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2861 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
2863 // Copy the Packet into a tx Buffer
2864 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
2866 // version set to 0, patch for hostapd deamon
2867 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2868 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
2870 // replace support rate, patch for hostapd deamon(only support 11M)
2871 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2872 if (cbExtSuppRate != 0) {
2873 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2874 memcpy((pbyPayloadHead + cbFrameBodySize),
2875 pMgmt->abyCurrSuppRates,
2876 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2878 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2879 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2880 pMgmt->abyCurrExtSuppRates,
2881 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2887 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2888 if (pDevice->bEnableHostWEP) {
2889 pTransmitKey = &STempKey;
2890 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2891 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2892 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2893 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2894 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2895 memcpy(pTransmitKey->abyKey,
2896 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2897 pTransmitKey->uKeyLength
2901 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2902 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
2903 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
2905 // DO Software Michael
2906 MIC_vInit(dwMICKey0, dwMICKey1);
2907 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
2909 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
2910 pr_debug("DMA0_tx_8021:MIC KEY: %X, %X\n",
2911 dwMICKey0, dwMICKey1);
2913 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2915 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2917 pdwMIC_L = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2918 pdwMIC_R = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2920 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2923 if (pDevice->bTxMICFail == true) {
2926 pDevice->bTxMICFail = false;
2929 pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
2930 pr_debug("cbReqCount:%d, %d, %d, %d\n",
2931 cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2932 pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
2936 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2937 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
2939 if (pDevice->bEnableHostWEP) {
2940 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2941 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2944 if ((pDevice->byLocalID <= REV_ID_VT3253_A1))
2945 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
2948 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2949 pDevice->wSeqCounter++;
2950 if (pDevice->wSeqCounter > 0x0fff)
2951 pDevice->wSeqCounter = 0;
2954 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2955 // of FIFO control header.
2956 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2957 // in the same place of other packet's Duration-field).
2958 // And it will cause Cisco-AP to issue Disassociation-packet
2959 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2960 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2961 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2963 ((struct vnt_tx_datahead_ab *)pvTxDataHd)->duration = cpu_to_le16(p80211Header->sA2.wDurationID);
2967 // first TD is the only TD
2968 //Set TSR1 & ReqCount in TxDescHead
2969 pFrstTD->pTDInfo->skb = skb;
2970 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2971 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2972 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
2973 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2974 pFrstTD->pTDInfo->byFlags = 0;
2975 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
2977 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2979 MACbPSWakeup(pDevice->PortOffset);
2981 pDevice->bPWBitOn = false;
2984 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2987 pDevice->iTDUsed[TYPE_TXDMA0]++;
2989 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2990 pr_debug(" available td0 <= 1\n");
2992 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2994 // Poll Transmit the adapter
2995 MACvTransmit0(pDevice->PortOffset);