2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * cbGetFragCount - Calculate fragment number count
31 * csBeacon_xmit - beacon tx function
32 * csMgmt_xmit - management tx function
33 * s_cbFillTxBufHead - fulfill tx dma buffer header
34 * s_uGetDataDuration - get tx data required duration
35 * s_uFillDataHead- fulfill tx data duration header
36 * s_uGetRTSCTSDuration- get rtx/cts required duration
37 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
38 * s_uGetTxRsvTime- get frame reserved time
39 * s_vFillCTSHead- fulfill CTS ctl header
40 * s_vFillFragParameter- Set fragment ctl parameter.
41 * s_vFillRTSHead- fulfill RTS ctl header
42 * s_vFillTxKey- fulfill tx encrypt key
43 * s_vSWencryption- Software encrypt header
44 * vDMA0_tx_80211- tx 802.11 frame via dma0
45 * vGenerateFIFOHeader- Generate tx FIFO ctl header
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
72 /*--------------------- Static Functions --------------------------*/
74 /*--------------------- Static Definitions -------------------------*/
75 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
76 // packet size >= 256 -> direct send
78 static const unsigned short wTimeStampOff[2][MAX_RATE] = {
79 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
80 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
83 static const unsigned short wFB_Opt0[2][5] = {
84 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
85 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
87 static const unsigned short wFB_Opt1[2][5] = {
88 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
89 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
96 #define RTSDUR_BA_F0 4
97 #define RTSDUR_AA_F0 5
98 #define RTSDUR_BA_F1 6
99 #define RTSDUR_AA_F1 7
100 #define CTSDUR_BA_F0 8
101 #define CTSDUR_BA_F1 9
104 #define DATADUR_A_F0 12
105 #define DATADUR_A_F1 13
107 /*--------------------- Static Functions --------------------------*/
112 struct vnt_private *pDevice,
113 unsigned char *pbyBuf,
114 unsigned char *pbyIVHead,
115 PSKeyItem pTransmitKey,
116 unsigned char *pbyHdrBuf,
117 unsigned short wPayloadLen,
118 unsigned char *pMICHDR
124 struct vnt_private *pDevice,
125 unsigned char byPktType,
127 unsigned int cbFrameLength,
130 PSEthernetHeader psEthHeader,
131 unsigned short wCurrentRate,
132 unsigned char byFBOption
137 s_vGenerateTxParameter(
138 struct vnt_private *pDevice,
139 unsigned char byPktType,
144 unsigned int cbFrameSize,
146 unsigned int uDMAIdx,
147 PSEthernetHeader psEthHeader,
148 unsigned short wCurrentRate
151 static void s_vFillFragParameter(
152 struct vnt_private *pDevice,
153 unsigned char *pbyBuffer,
154 unsigned int uTxType,
156 unsigned short wFragType,
157 unsigned int cbReqCount
161 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
162 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
163 unsigned int uDMAIdx, PSTxDesc pHeadTD,
164 PSEthernetHeader psEthHeader, unsigned char *pPacket,
165 bool bNeedEncrypt, PSKeyItem pTransmitKey,
166 unsigned int uNodeIndex, unsigned int *puMACfragNum);
171 struct vnt_private *pDevice,
172 unsigned char byPktType,
174 unsigned int cbFrameLength,
175 unsigned int uDMAIdx,
177 unsigned int uFragIdx,
178 unsigned int cbLastFragmentSize,
179 unsigned int uMACfragNum,
180 unsigned char byFBOption,
181 unsigned short wCurrentRate
184 /*--------------------- Export Variables --------------------------*/
189 struct vnt_private *pDevice,
190 unsigned char *pbyBuf,
191 unsigned char *pbyIVHead,
192 PSKeyItem pTransmitKey,
193 unsigned char *pbyHdrBuf,
194 unsigned short wPayloadLen,
195 unsigned char *pMICHDR
198 struct vnt_mic_hdr *mic_hdr = (struct vnt_mic_hdr *)pMICHDR;
199 unsigned long *pdwIV = (unsigned long *)pbyIVHead;
200 unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
201 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
202 unsigned long dwRevIVCounter;
203 unsigned char byKeyIndex = 0;
206 if (pTransmitKey == NULL)
209 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
210 *pdwIV = pDevice->dwIVCounter;
211 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
213 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
214 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
215 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
216 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
218 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
219 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
220 if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
221 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
222 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
224 memcpy(pDevice->abyPRNG, pbyBuf, 16);
226 // Append IV after Mac Header
227 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
228 *pdwIV |= (unsigned long)byKeyIndex << 30;
229 *pdwIV = cpu_to_le32(*pdwIV);
230 pDevice->dwIVCounter++;
231 if (pDevice->dwIVCounter > WEP_IV_MASK)
232 pDevice->dwIVCounter = 0;
234 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
235 pTransmitKey->wTSC15_0++;
236 if (pTransmitKey->wTSC15_0 == 0)
237 pTransmitKey->dwTSC47_16++;
239 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
240 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
241 memcpy(pbyBuf, pDevice->abyPRNG, 16);
243 memcpy(pdwIV, pDevice->abyPRNG, 3);
245 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
246 // Append IV&ExtIV after Mac Header
247 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
248 pr_debug("vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
250 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
251 pTransmitKey->wTSC15_0++;
252 if (pTransmitKey->wTSC15_0 == 0)
253 pTransmitKey->dwTSC47_16++;
255 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
259 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
260 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
261 //Append IV&ExtIV after Mac Header
262 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
266 mic_hdr->tx_priority = 0;
267 memcpy(mic_hdr->mic_addr2, pMACHeader->abyAddr2, ETH_ALEN);
269 /* ccmp pn big endian order */
270 mic_hdr->ccmp_pn[0] = (u8)(pTransmitKey->dwTSC47_16 >> 24);
271 mic_hdr->ccmp_pn[1] = (u8)(pTransmitKey->dwTSC47_16 >> 16);
272 mic_hdr->ccmp_pn[2] = (u8)(pTransmitKey->dwTSC47_16 >> 8);
273 mic_hdr->ccmp_pn[3] = (u8)pTransmitKey->dwTSC47_16;
274 mic_hdr->ccmp_pn[4] = (u8)(pTransmitKey->wTSC15_0 >> 8);
275 mic_hdr->ccmp_pn[5] = (u8)pTransmitKey->wTSC15_0;
278 mic_hdr->payload_len = cpu_to_be16(wPayloadLen);
280 if (pDevice->bLongHeader)
281 mic_hdr->hlen = cpu_to_be16(28);
283 mic_hdr->hlen = cpu_to_be16(22);
285 memcpy(mic_hdr->addr1, pMACHeader->abyAddr1, ETH_ALEN);
286 memcpy(mic_hdr->addr2, pMACHeader->abyAddr2, ETH_ALEN);
289 memcpy(mic_hdr->addr3, pMACHeader->abyAddr3, ETH_ALEN);
290 mic_hdr->frame_control =
291 cpu_to_le16(pMACHeader->wFrameCtl & 0xc78f);
292 mic_hdr->seq_ctrl = cpu_to_le16(pMACHeader->wSeqCtl & 0xf);
294 if (pDevice->bLongHeader)
295 memcpy(mic_hdr->addr4, pMACHeader->abyAddr4, ETH_ALEN);
302 struct vnt_private *pDevice,
303 PSKeyItem pTransmitKey,
304 unsigned char *pbyPayloadHead,
305 unsigned short wPayloadSize
308 unsigned int cbICVlen = 4;
309 unsigned long dwICV = 0xFFFFFFFFL;
310 unsigned long *pdwICV;
312 if (pTransmitKey == NULL)
315 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
316 //=======================================================================
317 // Append ICV after payload
318 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
319 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
320 // finally, we must invert dwCRC to get the correct answer
321 *pdwICV = cpu_to_le32(~dwICV);
323 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
324 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
325 //=======================================================================
326 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
327 //=======================================================================
328 //Append ICV after payload
329 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
330 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
331 // finally, we must invert dwCRC to get the correct answer
332 *pdwICV = cpu_to_le32(~dwICV);
334 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
335 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
336 //=======================================================================
340 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 memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
858 memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
860 if (pDevice->op_mode == NL80211_IFTYPE_AP)
861 memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
863 memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
866 struct vnt_rts_g_fb *buf = pvRTS;
867 /* Get SignalField, ServiceField & Length */
868 vnt_get_phy_field(pDevice, uRTSFrameLen,
869 pDevice->byTopCCKBasicRate,
870 PK_TYPE_11B, &buf->b);
872 vnt_get_phy_field(pDevice, uRTSFrameLen,
873 pDevice->byTopOFDMBasicRate,
877 s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
878 cbFrameLength, PK_TYPE_11B,
879 pDevice->byTopCCKBasicRate,
880 bNeedAck, byFBOption);
882 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
883 cbFrameLength, byPktType,
884 wCurrentRate, bNeedAck,
887 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
888 cbFrameLength, byPktType,
889 wCurrentRate, bNeedAck,
891 buf->rts_duration_ba_f0 =
892 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0,
893 cbFrameLength, byPktType,
894 wCurrentRate, bNeedAck,
896 buf->rts_duration_aa_f0 =
897 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
898 cbFrameLength, byPktType,
899 wCurrentRate, bNeedAck,
901 buf->rts_duration_ba_f1 =
902 s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1,
903 cbFrameLength, byPktType,
904 wCurrentRate, bNeedAck,
906 buf->rts_duration_aa_f1 =
907 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
908 cbFrameLength, byPktType,
909 wCurrentRate, bNeedAck,
911 buf->data.duration = buf->duration_aa;
912 /* Get RTS Frame body */
913 buf->data.frame_control =
914 cpu_to_le16(IEEE80211_FTYPE_CTL |
915 IEEE80211_STYPE_RTS);
918 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
919 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
920 memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
922 memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
925 if (pDevice->op_mode == NL80211_IFTYPE_AP)
926 memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
928 memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
930 } // if (byFBOption == AUTO_FB_NONE)
931 } else if (byPktType == PK_TYPE_11A) {
932 if (byFBOption == AUTO_FB_NONE) {
933 struct vnt_rts_ab *buf = pvRTS;
934 /* Get SignalField, ServiceField & Length */
935 vnt_get_phy_field(pDevice, uRTSFrameLen,
936 pDevice->byTopOFDMBasicRate,
937 byPktType, &buf->ab);
940 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
941 cbFrameLength, byPktType,
942 wCurrentRate, bNeedAck,
944 buf->data.duration = buf->duration;
945 /* Get RTS Frame body */
946 buf->data.frame_control =
947 cpu_to_le16(IEEE80211_FTYPE_CTL |
948 IEEE80211_STYPE_RTS);
951 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
952 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
953 memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
955 memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
958 if (pDevice->op_mode == NL80211_IFTYPE_AP)
959 memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
961 memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
964 struct vnt_rts_a_fb *buf = pvRTS;
965 /* Get SignalField, ServiceField & Length */
966 vnt_get_phy_field(pDevice, uRTSFrameLen,
967 pDevice->byTopOFDMBasicRate,
971 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
972 cbFrameLength, byPktType,
973 wCurrentRate, bNeedAck,
975 buf->rts_duration_f0 =
976 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
977 cbFrameLength, byPktType,
978 wCurrentRate, bNeedAck,
980 buf->rts_duration_f1 =
981 s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
982 cbFrameLength, byPktType,
983 wCurrentRate, bNeedAck,
985 buf->data.duration = buf->duration;
986 /* Get RTS Frame body */
987 buf->data.frame_control =
988 cpu_to_le16(IEEE80211_FTYPE_CTL |
989 IEEE80211_STYPE_RTS);
991 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
992 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
993 memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
995 memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
997 if (pDevice->op_mode == NL80211_IFTYPE_AP)
998 memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
1000 memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
1002 } else if (byPktType == PK_TYPE_11B) {
1003 struct vnt_rts_ab *buf = pvRTS;
1004 /* Get SignalField, ServiceField & Length */
1005 vnt_get_phy_field(pDevice, uRTSFrameLen,
1006 pDevice->byTopCCKBasicRate,
1007 PK_TYPE_11B, &buf->ab);
1010 s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength,
1011 byPktType, wCurrentRate, bNeedAck,
1014 buf->data.duration = buf->duration;
1015 /* Get RTS Frame body */
1016 buf->data.frame_control =
1017 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
1019 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
1020 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
1021 memcpy(&buf->data.ra, psEthHeader->abyDstAddr, ETH_ALEN);
1023 memcpy(&buf->data.ra, pDevice->abyBSSID, ETH_ALEN);
1026 if (pDevice->op_mode == NL80211_IFTYPE_AP)
1027 memcpy(&buf->data.ta, pDevice->abyBSSID, ETH_ALEN);
1029 memcpy(&buf->data.ta, psEthHeader->abySrcAddr, ETH_ALEN);
1036 struct vnt_private *pDevice,
1037 unsigned int uDMAIdx,
1038 unsigned char byPktType,
1040 unsigned int cbFrameLength,
1043 unsigned short wCurrentRate,
1044 unsigned char byFBOption
1047 unsigned int uCTSFrameLen = 14;
1053 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1054 // in this case we need to decrease its length by 4.
1058 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1059 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1061 struct vnt_cts_fb *buf = pvCTS;
1062 /* Get SignalField, ServiceField & Length */
1063 vnt_get_phy_field(pDevice, uCTSFrameLen,
1064 pDevice->byTopCCKBasicRate,
1065 PK_TYPE_11B, &buf->b);
1068 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
1069 cbFrameLength, byPktType,
1070 wCurrentRate, bNeedAck,
1073 /* Get CTSDuration_ba_f0 */
1074 buf->cts_duration_ba_f0 =
1075 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0,
1076 cbFrameLength, byPktType,
1077 wCurrentRate, bNeedAck,
1080 /* Get CTSDuration_ba_f1 */
1081 buf->cts_duration_ba_f1 =
1082 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1,
1083 cbFrameLength, byPktType,
1084 wCurrentRate, bNeedAck,
1087 /* Get CTS Frame body */
1088 buf->data.duration = buf->duration_ba;
1090 buf->data.frame_control =
1091 cpu_to_le16(IEEE80211_FTYPE_CTL |
1092 IEEE80211_STYPE_CTS);
1094 buf->reserved2 = 0x0;
1096 memcpy(&buf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN);
1097 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1098 struct vnt_cts *buf = pvCTS;
1099 /* Get SignalField, ServiceField & Length */
1100 vnt_get_phy_field(pDevice, uCTSFrameLen,
1101 pDevice->byTopCCKBasicRate,
1102 PK_TYPE_11B, &buf->b);
1104 /* Get CTSDuration_ba */
1106 s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
1107 cbFrameLength, byPktType,
1108 wCurrentRate, bNeedAck,
1111 /* Get CTS Frame body */
1112 buf->data.duration = buf->duration_ba;
1114 buf->data.frame_control =
1115 cpu_to_le16(IEEE80211_FTYPE_CTL |
1116 IEEE80211_STYPE_CTS);
1118 buf->reserved2 = 0x0;
1119 memcpy(&buf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN);
1127 * Generate FIFO control for MAC & Baseband controller
1131 * pDevice - Pointer to adapter
1132 * pTxDataHead - Transmit Data Buffer
1133 * pTxBufHead - pTxBufHead
1134 * pvRrvTime - pvRrvTime
1135 * pvRTS - RTS Buffer
1137 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1138 * bNeedACK - If need ACK
1139 * uDescIdx - Desc Index
1143 * Return Value: none
1146 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1149 s_vGenerateTxParameter(
1150 struct vnt_private *pDevice,
1151 unsigned char byPktType,
1156 unsigned int cbFrameSize,
1158 unsigned int uDMAIdx,
1159 PSEthernetHeader psEthHeader,
1160 unsigned short wCurrentRate
1163 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1164 unsigned short wFifoCtl;
1165 bool bDisCRC = false;
1166 unsigned char byFBOption = AUTO_FB_NONE;
1168 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1170 pFifoHead->wReserved = wCurrentRate;
1171 wFifoCtl = pFifoHead->wFIFOCtl;
1173 if (wFifoCtl & FIFOCTL_CRCDIS)
1176 if (wFifoCtl & FIFOCTL_AUTO_FB_0)
1177 byFBOption = AUTO_FB_0;
1178 else if (wFifoCtl & FIFOCTL_AUTO_FB_1)
1179 byFBOption = AUTO_FB_1;
1181 if (pDevice->bLongHeader)
1182 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1187 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1188 if (pvRTS != NULL) { //RTS_need
1190 struct vnt_rrv_time_rts *buf = pvRrvTime;
1192 buf->rts_rrv_time_aa = s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
1193 buf->rts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate);
1194 buf->rts_rrv_time_bb = s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
1195 buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
1196 buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
1198 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1199 } else {//RTS_needless, PCF mode
1200 struct vnt_rrv_time_cts *buf = pvRrvTime;
1202 buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
1203 buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
1204 buf->cts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate);
1207 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1209 } else if (byPktType == PK_TYPE_11A) {
1210 if (pvRTS != NULL) {//RTS_need, non PCF mode
1211 struct vnt_rrv_time_ab *buf = pvRrvTime;
1213 buf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
1214 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
1217 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1218 } else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1219 struct vnt_rrv_time_ab *buf = pvRrvTime;
1221 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK);
1223 } else if (byPktType == PK_TYPE_11B) {
1224 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1225 struct vnt_rrv_time_ab *buf = pvRrvTime;
1227 buf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
1228 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
1231 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1232 } else { //RTS_needless, non PCF mode
1233 struct vnt_rrv_time_ab *buf = pvRrvTime;
1235 buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
1242 s_vFillFragParameter(
1243 struct vnt_private *pDevice,
1244 unsigned char *pbyBuffer,
1245 unsigned int uTxType,
1247 unsigned short wFragType,
1248 unsigned int cbReqCount
1251 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1253 if (uTxType == TYPE_SYNCDMA) {
1254 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1256 //Set FIFOCtl & TimeStamp in TxSyncDesc
1257 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1258 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1259 //Set TSR1 & ReqCount in TxDescHead
1260 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1261 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1262 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1264 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1266 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1267 //Set TSR1 & ReqCount in TxDescHead
1268 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1269 if (wFragType == FRAGCTL_ENDFRAG) //Last Fragmentation
1270 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1272 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1275 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1279 s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
1280 unsigned char *pbyTxBufferAddr, unsigned int cbFrameBodySize,
1281 unsigned int uDMAIdx, PSTxDesc pHeadTD,
1282 PSEthernetHeader psEthHeader, unsigned char *pPacket,
1283 bool bNeedEncrypt, PSKeyItem pTransmitKey,
1284 unsigned int uNodeIndex, unsigned int *puMACfragNum)
1286 unsigned int cbMACHdLen;
1287 unsigned int cbFrameSize;
1288 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1289 unsigned int cbFragPayloadSize;
1290 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1291 unsigned int cbLastFragPayloadSize;
1292 unsigned int uFragIdx;
1293 unsigned char *pbyPayloadHead;
1294 unsigned char *pbyIVHead;
1295 unsigned char *pbyMacHdr;
1296 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1298 unsigned char *pbyBuffer;
1299 unsigned int cbIVlen = 0;
1300 unsigned int cbICVlen = 0;
1301 unsigned int cbMIClen = 0;
1302 unsigned int cbFCSlen = 4;
1303 unsigned int cb802_1_H_len = 0;
1304 unsigned int uLength = 0;
1305 unsigned int uTmpLen = 0;
1306 unsigned int cbMICHDR = 0;
1307 u32 dwMICKey0, dwMICKey1;
1311 u32 dwSafeMIC_L, dwSafeMIC_R; /* Fix "Last Frag Size" < "MIC length". */
1312 bool bMIC2Frag = false;
1313 unsigned int uMICFragLen = 0;
1314 unsigned int uMACfragNum = 1;
1315 unsigned int uPadding = 0;
1316 unsigned int cbReqCount = 0;
1321 unsigned char *pbyType;
1323 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1324 unsigned int cbHeaderLength = 0;
1326 struct vnt_mic_hdr *pMICHDR;
1330 unsigned short wTxBufSize; // FFinfo size
1331 unsigned int uTotalCopyLength = 0;
1332 unsigned char byFBOption = AUTO_FB_NONE;
1333 bool bIsWEP256 = false;
1334 PSMgmtObject pMgmt = pDevice->pMgmt;
1336 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1338 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
1339 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
1340 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1346 // MSDUs in Infra mode always need ACK
1351 if (pDevice->bLongHeader)
1352 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1354 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1356 if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1357 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1360 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)
1363 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1364 cbIVlen = 8;//IV+ExtIV
1368 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1369 cbIVlen = 8;//RSN Header
1371 cbMICHDR = sizeof(struct vnt_mic_hdr);
1373 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1374 //MAC Header should be padding 0 to DW alignment.
1375 uPadding = 4 - (cbMACHdLen%4);
1380 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1382 if ((bNeedACK == false) ||
1383 (cbFrameSize < pDevice->wRTSThreshold) ||
1384 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1389 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1392 // Use for AUTO FALL BACK
1394 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0)
1395 byFBOption = AUTO_FB_0;
1396 else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1)
1397 byFBOption = AUTO_FB_1;
1399 //////////////////////////////////////////////////////
1400 //Set RrvTime/RTS/CTS Buffer
1401 wTxBufSize = sizeof(STxBufHead);
1402 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1404 if (byFBOption == AUTO_FB_NONE) {
1405 if (bRTS == true) {//RTS_need
1406 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1407 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
1408 pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
1410 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1411 cbMICHDR + sizeof(struct vnt_rts_g));
1412 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1413 cbMICHDR + sizeof(struct vnt_rts_g) +
1414 sizeof(struct vnt_tx_datahead_g);
1415 } else { //RTS_needless
1416 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1417 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
1419 pvCTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
1420 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
1421 sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
1422 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
1423 cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
1427 if (bRTS == true) {//RTS_need
1428 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1429 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
1430 pvRTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
1432 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1433 cbMICHDR + sizeof(struct vnt_rts_g_fb));
1434 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
1435 cbMICHDR + sizeof(struct vnt_rts_g_fb) + sizeof(struct vnt_tx_datahead_g_fb);
1436 } else { //RTS_needless
1437 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1438 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
1440 pvCTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
1441 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
1442 cbMICHDR + sizeof(struct vnt_cts_fb));
1443 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
1444 cbMICHDR + sizeof(struct vnt_cts_fb) + sizeof(struct vnt_tx_datahead_g_fb);
1447 } else {//802.11a/b packet
1449 if (byFBOption == AUTO_FB_NONE) {
1451 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1452 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
1453 pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
1455 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
1456 sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_ab));
1457 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1458 cbMICHDR + sizeof(struct vnt_rts_ab) + sizeof(struct vnt_tx_datahead_ab);
1459 } else { //RTS_needless, need MICHDR
1460 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
1461 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
1464 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
1465 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1466 cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
1470 if (bRTS == true) {//RTS_need
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_a_fb));
1477 cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
1478 cbMICHDR + sizeof(struct vnt_rts_a_fb) + sizeof(struct vnt_tx_datahead_a_fb);
1479 } else { //RTS_needless
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_a_fb);
1490 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1492 //////////////////////////////////////////////////////////////////
1493 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1494 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1495 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1496 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1497 } else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1498 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
1499 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
1501 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]);
1502 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]);
1504 // DO Software Michael
1505 MIC_vInit(dwMICKey0, dwMICKey1);
1506 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1508 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1509 pr_debug("MIC KEY: %X, %X\n", dwMICKey0, dwMICKey1);
1512 ///////////////////////////////////////////////////////////////////
1514 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1515 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1516 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1518 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1520 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1521 cbFragmentSize = pDevice->wFragmentationThreshold;
1522 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1523 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1524 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1525 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1526 if (cbLastFragPayloadSize == 0)
1527 cbLastFragPayloadSize = cbFragPayloadSize;
1531 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1532 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1534 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
1535 if (uFragIdx == 0) {
1536 //=========================
1537 // Start Fragmentation
1538 //=========================
1539 pr_debug("Start Fragmentation...\n");
1540 wFragType = FRAGCTL_STAFRAG;
1542 //Fill FIFO,RrvTime,RTS,and CTS
1543 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1544 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1546 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1547 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1548 // Generate TX MAC Header
1549 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1550 wFragType, uDMAIdx, uFragIdx);
1552 if (bNeedEncrypt == true) {
1554 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1555 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1556 //Fill IV(ExtIV,RSNHDR)
1557 if (pDevice->bEnableHostWEP) {
1558 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1559 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1564 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1565 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1566 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1567 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1569 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1571 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1572 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1576 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1577 //---------------------------
1578 // S/W or H/W Encryption
1579 //---------------------------
1580 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1582 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1583 //copy TxBufferHeader + MacHeader to desc
1584 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1586 // Copy the Packet into a tx Buffer
1587 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1589 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1591 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1592 pr_debug("Start MIC: %d\n",
1594 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1598 //---------------------------
1600 //---------------------------
1601 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1603 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1604 cbReqCount += cbICVlen;
1608 ptdCurr = (PSTxDesc)pHeadTD;
1609 //--------------------
1610 //1.Set TSR1 & ReqCount in TxDescHead
1611 //2.Set FragCtl in TxBufferHead
1612 //3.Set Frame Control
1613 //4.Set Sequence Control
1614 //5.Get S/W generate FCS
1615 //--------------------
1616 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1618 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1619 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1620 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1621 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1622 pDevice->iTDUsed[uDMAIdx]++;
1623 pHeadTD = ptdCurr->next;
1624 } else if (uFragIdx == (uMACfragNum-1)) {
1625 //=========================
1626 // Last Fragmentation
1627 //=========================
1628 pr_debug("Last Fragmentation...\n");
1630 wFragType = FRAGCTL_ENDFRAG;
1632 //Fill FIFO,RrvTime,RTS,and CTS
1633 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1634 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1636 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1637 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1639 // Generate TX MAC Header
1640 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1641 wFragType, uDMAIdx, uFragIdx);
1643 if (bNeedEncrypt == true) {
1645 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1646 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1648 if (pDevice->bEnableHostWEP) {
1649 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1650 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1655 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1656 //---------------------------
1657 // S/W or H/W Encryption
1658 //---------------------------
1660 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1662 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1664 //copy TxBufferHeader + MacHeader to desc
1665 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1667 // Copy the Packet into a tx Buffer
1668 if (bMIC2Frag == false) {
1669 memcpy((pbyBuffer + uLength),
1670 (pPacket + 14 + uTotalCopyLength),
1671 (cbLastFragPayloadSize - cbMIClen)
1673 //TODO check uTmpLen !
1674 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1677 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1678 pr_debug("LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1680 cbLastFragPayloadSize,
1683 if (bMIC2Frag == false) {
1685 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1686 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1687 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1688 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1689 pr_debug("Last MIC:%X, %X\n",
1690 *pdwMIC_L, *pdwMIC_R);
1692 if (uMICFragLen >= 4) {
1693 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1694 (cbMIClen - uMICFragLen));
1695 pr_debug("LAST: uMICFragLen >= 4: %X, %d\n",
1696 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1697 (cbMIClen - uMICFragLen));
1700 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1702 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1703 pr_debug("LAST: uMICFragLen < 4: %X, %d\n",
1704 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1705 (cbMIClen - uMICFragLen));
1710 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1713 //---------------------------
1715 //---------------------------
1716 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1718 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1719 cbReqCount += cbICVlen;
1723 ptdCurr = (PSTxDesc)pHeadTD;
1725 //--------------------
1726 //1.Set TSR1 & ReqCount in TxDescHead
1727 //2.Set FragCtl in TxBufferHead
1728 //3.Set Frame Control
1729 //4.Set Sequence Control
1730 //5.Get S/W generate FCS
1731 //--------------------
1733 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1735 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1736 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1737 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1738 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1739 pDevice->iTDUsed[uDMAIdx]++;
1740 pHeadTD = ptdCurr->next;
1743 //=========================
1744 // Middle Fragmentation
1745 //=========================
1746 pr_debug("Middle Fragmentation...\n");
1748 wFragType = FRAGCTL_MIDFRAG;
1750 //Fill FIFO,RrvTime,RTS,and CTS
1751 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1752 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1754 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1755 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1757 // Generate TX MAC Header
1758 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1759 wFragType, uDMAIdx, uFragIdx);
1761 if (bNeedEncrypt == true) {
1763 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1764 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1766 if (pDevice->bEnableHostWEP) {
1767 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1768 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1772 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1773 //---------------------------
1774 // S/W or H/W Encryption
1775 //---------------------------
1777 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1778 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1780 //copy TxBufferHeader + MacHeader to desc
1781 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1783 // Copy the Packet into a tx Buffer
1784 memcpy((pbyBuffer + uLength),
1785 (pPacket + 14 + uTotalCopyLength),
1788 uTmpLen = cbFragPayloadSize;
1790 uTotalCopyLength += uTmpLen;
1792 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1793 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1795 if (uTmpLen < cbFragPayloadSize) {
1797 uMICFragLen = cbFragPayloadSize - uTmpLen;
1798 ASSERT(uMICFragLen < cbMIClen);
1800 pdwMIC_L = (u32 *)(pbyBuffer + uLength + uTmpLen);
1801 pdwMIC_R = (u32 *)(pbyBuffer + uLength + uTmpLen + 4);
1802 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1803 dwSafeMIC_L = *pdwMIC_L;
1804 dwSafeMIC_R = *pdwMIC_R;
1806 pr_debug("MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1810 pr_debug("Fill MIC in Middle frag [%d]\n",
1812 pr_debug("Get MIC:%X, %X\n",
1813 *pdwMIC_L, *pdwMIC_R);
1815 pr_debug("Middle frag len: %d\n",
1819 ASSERT(uTmpLen == (cbFragPayloadSize));
1822 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1824 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1825 cbReqCount += cbICVlen;
1829 ptdCurr = (PSTxDesc)pHeadTD;
1831 //--------------------
1832 //1.Set TSR1 & ReqCount in TxDescHead
1833 //2.Set FragCtl in TxBufferHead
1834 //3.Set Frame Control
1835 //4.Set Sequence Control
1836 //5.Get S/W generate FCS
1837 //--------------------
1839 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1841 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1842 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1843 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1844 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1845 pDevice->iTDUsed[uDMAIdx]++;
1846 pHeadTD = ptdCurr->next;
1848 } // for (uMACfragNum)
1850 //=========================
1852 //=========================
1853 wFragType = FRAGCTL_NONFRAG;
1855 //Set FragCtl in TxBufferHead
1856 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1858 //Fill FIFO,RrvTime,RTS,and CTS
1859 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1860 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1862 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1863 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1865 // Generate TX MAC Header
1866 vGenerateMACHeader(pDevice, pbyMacHdr, uDuration, psEthHeader, bNeedEncrypt,
1867 wFragType, uDMAIdx, 0);
1869 if (bNeedEncrypt == true) {
1871 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1872 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1874 if (pDevice->bEnableHostWEP) {
1875 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1876 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1881 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1882 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1883 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1884 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1886 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1888 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1889 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1893 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1894 //---------------------------
1895 // S/W or H/W Encryption
1896 //---------------------------
1897 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1898 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1900 //copy TxBufferHeader + MacHeader to desc
1901 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1903 // Copy the Packet into a tx Buffer
1904 memcpy((pbyBuffer + uLength),
1906 cbFrameBodySize - cb802_1_H_len
1909 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1910 pr_debug("Length:%d, %d\n",
1911 cbFrameBodySize - cb802_1_H_len, uLength);
1913 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
1915 pdwMIC_L = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
1916 pdwMIC_R = (u32 *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
1918 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1921 if (pDevice->bTxMICFail == true) {
1924 pDevice->bTxMICFail = false;
1927 pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
1928 pr_debug("cbReqCount:%d, %d, %d, %d\n",
1929 cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1930 pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
1934 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1936 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
1937 (unsigned short)(cbFrameBodySize + cbMIClen));
1938 cbReqCount += cbICVlen;
1942 ptdCurr = (PSTxDesc)pHeadTD;
1944 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1945 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1946 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1947 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1948 //Set TSR1 & ReqCount in TxDescHead
1949 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1950 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1952 pDevice->iTDUsed[uDMAIdx]++;
1955 *puMACfragNum = uMACfragNum;
1957 return cbHeaderLength;
1961 vGenerateFIFOHeader(struct vnt_private *pDevice, unsigned char byPktType,
1962 unsigned char *pbyTxBufferAddr, bool bNeedEncrypt,
1963 unsigned int cbPayloadSize, unsigned int uDMAIdx,
1964 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
1965 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
1966 unsigned int *pcbHeaderSize)
1968 unsigned int wTxBufSize; // FFinfo size
1971 unsigned short cbMacHdLen;
1972 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1974 wTxBufSize = sizeof(STxBufHead);
1976 memset(pTxBufHead, 0, wTxBufSize);
1977 //Set FIFOCTL_NEEDACK
1979 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
1980 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
1981 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
1983 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1986 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1990 // MSDUs in Infra mode always need ACK
1992 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1996 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
1997 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
2000 if (pDevice->bLongHeader)
2001 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
2003 //Set FIFOCTL_GENINT
2005 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2007 //Set FIFOCTL_ISDMA0
2008 if (TYPE_TXDMA0 == uDMAIdx)
2009 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
2011 //Set FRAGCTL_MACHDCNT
2012 if (pDevice->bLongHeader)
2013 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
2015 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2017 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2020 if (byPktType == PK_TYPE_11A) //0000 0000 0000 0000
2022 else if (byPktType == PK_TYPE_11B) //0000 0001 0000 0000
2023 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2024 else if (byPktType == PK_TYPE_11GB) //0000 0010 0000 0000
2025 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2026 else if (byPktType == PK_TYPE_11GA) //0000 0011 0000 0000
2027 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2029 //Set FIFOCTL_GrpAckPolicy
2030 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2031 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2033 //Set Auto Fallback Ctl
2034 if (pDevice->wCurrentRate >= RATE_18M) {
2035 if (pDevice->byAutoFBCtrl == AUTO_FB_0)
2036 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
2037 else if (pDevice->byAutoFBCtrl == AUTO_FB_1)
2038 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
2041 //Set FRAGCTL_WEPTYP
2042 pDevice->bAES = false;
2044 //Set FRAGCTL_WEPTYP
2045 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
2046 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
2047 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2048 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2049 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
2050 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
2051 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2052 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
2053 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2058 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
2060 pTxBufHead->byTxPower = pDevice->byCurPwr;
2062 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
2063 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
2064 pTransmitKey, uNodeIndex, puMACfragNum);
2070 * Translate 802.3 to 802.11 header
2074 * pDevice - Pointer to adapter
2075 * dwTxBufferAddr - Transmit Buffer
2076 * pPacket - Packet from upper layer
2077 * cbPacketSize - Transmit Data Length
2079 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
2080 * pcbAppendPayload - size of append payload for 802.1H translation
2082 * Return Value: none
2088 struct vnt_private *pDevice,
2089 unsigned char *pbyBufferAddr,
2091 PSEthernetHeader psEthHeader,
2093 unsigned short wFragType,
2094 unsigned int uDMAIdx,
2095 unsigned int uFragIdx
2098 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
2100 memset(pMACHeader, 0, (sizeof(S802_11Header)));
2102 if (uDMAIdx == TYPE_ATIMDMA)
2103 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2105 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2107 if (pDevice->op_mode == NL80211_IFTYPE_AP) {
2108 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2109 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2110 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2111 pMACHeader->wFrameCtl |= FC_FROMDS;
2113 if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) {
2114 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2115 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2116 memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2118 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2119 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2120 memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2121 pMACHeader->wFrameCtl |= FC_TODS;
2126 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2128 pMACHeader->wDurationID = le16_to_cpu(wDuration);
2130 if (pDevice->bLongHeader) {
2131 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2133 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2134 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2136 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2138 //Set FragNumber in Sequence Control
2139 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2141 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2142 pDevice->wSeqCounter++;
2143 if (pDevice->wSeqCounter > 0x0fff)
2144 pDevice->wSeqCounter = 0;
2147 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) //StartFrag or MidFrag
2148 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2151 CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2154 unsigned char byPktType;
2155 unsigned char *pbyTxBufferAddr;
2157 struct vnt_cts *pCTS;
2159 unsigned int uDuration;
2160 unsigned int cbReqCount;
2161 PS802_11Header pMACHeader;
2162 unsigned int cbHeaderSize;
2163 unsigned int cbFrameBodySize;
2165 bool bIsPSPOLL = false;
2166 PSTxBufHead pTxBufHead;
2167 unsigned int cbFrameSize;
2168 unsigned int cbIVlen = 0;
2169 unsigned int cbICVlen = 0;
2170 unsigned int cbMIClen = 0;
2171 unsigned int cbFCSlen = 4;
2172 unsigned int uPadding = 0;
2173 unsigned short wTxBufSize;
2174 unsigned int cbMacHdLen;
2175 SEthernetHeader sEthHeader;
2178 PSMgmtObject pMgmt = pDevice->pMgmt;
2179 unsigned short wCurrentRate = RATE_1M;
2181 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0)
2182 return CMD_STATUS_RESOURCES;
2184 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2185 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2186 cbFrameBodySize = pPacket->cbPayloadLen;
2187 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2188 wTxBufSize = sizeof(STxBufHead);
2189 memset(pTxBufHead, 0, wTxBufSize);
2191 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2192 wCurrentRate = RATE_6M;
2193 byPktType = PK_TYPE_11A;
2195 wCurrentRate = RATE_1M;
2196 byPktType = PK_TYPE_11B;
2199 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2200 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2201 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2202 // to set power here.
2203 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2204 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2206 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2208 pTxBufHead->byTxPower = pDevice->byCurPwr;
2209 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2210 if (pDevice->byFOETuning) {
2211 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2212 wCurrentRate = RATE_24M;
2213 byPktType = PK_TYPE_11GA;
2218 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2219 pTxBufHead->wFIFOCtl = 0;
2220 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2221 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2222 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2223 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2224 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2225 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2228 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2229 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2231 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2235 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2238 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2239 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2240 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2243 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2245 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2247 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2249 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2252 //Set FRAGCTL_MACHDCNT
2253 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2256 // Although spec says MMPDU can be fragmented; In most cases,
2257 // no one will send a MMPDU under fragmentation. With RTS may occur.
2258 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2260 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2261 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2264 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2265 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2266 cbIVlen = 8;//IV+ExtIV
2269 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2270 //We need to get seed here for filling TxKey entry.
2271 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2272 cbIVlen = 8;//RSN Header
2274 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2275 pDevice->bAES = true;
2277 //MAC Header should be padding 0 to DW alignment.
2278 uPadding = 4 - (cbMacHdLen%4);
2282 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2284 //Set FIFOCTL_GrpAckPolicy
2285 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2286 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2288 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2290 //Set RrvTime/RTS/CTS Buffer
2291 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2292 pvRrvTime = (void *) (pbyTxBufferAddr + wTxBufSize);
2295 pCTS = (struct vnt_cts *)(pbyTxBufferAddr + wTxBufSize +
2296 sizeof(struct vnt_rrv_time_cts));
2297 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
2298 sizeof(struct vnt_rrv_time_cts) + sizeof(struct vnt_cts));
2299 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
2300 sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
2301 } else { // 802.11a/b packet
2302 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
2306 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
2307 sizeof(struct vnt_rrv_time_ab));
2308 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
2309 sizeof(struct vnt_tx_datahead_ab);
2312 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2314 memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2315 memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2316 //=========================
2318 //=========================
2319 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2321 //Fill FIFO,RrvTime,RTS,and CTS
2322 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2323 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2326 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2327 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2329 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2331 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2333 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2334 unsigned char *pbyIVHead;
2335 unsigned char *pbyPayloadHead;
2336 unsigned char *pbyBSSID;
2337 PSKeyItem pTransmitKey = NULL;
2339 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2340 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2343 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2344 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2346 //Fill IV(ExtIV,RSNHDR)
2347 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2348 //---------------------------
2349 // S/W or H/W Encryption
2350 //---------------------------
2352 if ((pDevice->op_mode == NL80211_IFTYPE_STATION) &&
2353 (pDevice->bLinkPass == true)) {
2354 pbyBSSID = pDevice->abyBSSID;
2356 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2358 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2359 pr_debug("Get GTK\n");
2363 pr_debug("Get PTK\n");
2368 pbyBSSID = pDevice->abyBroadcastAddr;
2369 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2370 pTransmitKey = NULL;
2371 pr_debug("KEY is NULL. OP Mode[%d]\n",
2374 pr_debug("Get GTK\n");
2378 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2379 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2381 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2382 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2385 // Copy the Packet into a tx Buffer
2386 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2389 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2390 pDevice->wSeqCounter++;
2391 if (pDevice->wSeqCounter > 0x0fff)
2392 pDevice->wSeqCounter = 0;
2395 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2396 // of FIFO control header.
2397 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2398 // in the same place of other packet's Duration-field).
2399 // And it will cause Cisco-AP to issue Disassociation-packet
2400 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2401 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2402 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2404 ((struct vnt_tx_datahead_ab *)pvTxDataHd)->duration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2408 // first TD is the only TD
2409 //Set TSR1 & ReqCount in TxDescHead
2410 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2411 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2412 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2413 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2414 pFrstTD->pTDInfo->byFlags = 0;
2416 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2418 MACbPSWakeup(pDevice->PortOffset);
2420 pDevice->bPWBitOn = false;
2423 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2426 pDevice->iTDUsed[TYPE_TXDMA0]++;
2428 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2429 pr_debug(" available td0 <= 1\n");
2431 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2433 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2435 // Poll Transmit the adapter
2436 MACvTransmit0(pDevice->PortOffset);
2438 return CMD_STATUS_PENDING;
2441 CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice, PSTxMgmtPacket pPacket)
2443 unsigned char byPktType;
2444 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2445 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2446 unsigned int cbHeaderSize = 0;
2447 struct vnt_tx_short_buf_head *short_head =
2448 (struct vnt_tx_short_buf_head *)pbyBuffer;
2449 PS802_11Header pMACHeader;
2450 unsigned short wCurrentRate;
2452 memset(short_head, 0, sizeof(*short_head));
2454 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2455 wCurrentRate = RATE_6M;
2456 byPktType = PK_TYPE_11A;
2458 wCurrentRate = RATE_2M;
2459 byPktType = PK_TYPE_11B;
2462 //Set Preamble type always long
2463 pDevice->byPreambleType = PREAMBLE_LONG;
2465 /* Set FIFOCTL_GENINT */
2466 short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT);
2468 /* Set packet type & Get Duration */
2469 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2470 short_head->duration =
2471 cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A,
2472 cbFrameSize, byPktType, wCurrentRate, false,
2473 0, 0, 1, AUTO_FB_NONE));
2474 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2475 short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_11B);
2477 short_head->duration =
2478 cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B,
2479 cbFrameSize, byPktType, wCurrentRate, false,
2480 0, 0, 1, AUTO_FB_NONE));
2483 vnt_get_phy_field(pDevice, cbFrameSize,
2484 wCurrentRate, byPktType, &short_head->ab);
2486 /* Get TimeStampOff */
2487 short_head->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
2488 cbHeaderSize = sizeof(struct vnt_tx_short_buf_head);
2490 //Generate Beacon Header
2491 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2492 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2494 pMACHeader->wDurationID = 0;
2495 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2496 pDevice->wSeqCounter++;
2497 if (pDevice->wSeqCounter > 0x0fff)
2498 pDevice->wSeqCounter = 0;
2500 // Set Beacon buffer length
2501 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2503 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2505 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2506 // Set auto Transmit on
2507 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2508 // Poll Transmit the adapter
2509 MACvTransmitBCN(pDevice->PortOffset);
2511 return CMD_STATUS_PENDING;
2516 struct vnt_private *pDevice,
2517 PSKeyItem pTransmitKey,
2518 unsigned int cbFrameBodySize,
2519 PSEthernetHeader psEthHeader
2522 unsigned int cbMACHdLen;
2523 unsigned int cbFrameSize;
2524 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2525 unsigned int cbFragPayloadSize;
2526 unsigned int cbLastFragPayloadSize;
2527 unsigned int cbIVlen = 0;
2528 unsigned int cbICVlen = 0;
2529 unsigned int cbMIClen = 0;
2530 unsigned int cbFCSlen = 4;
2531 unsigned int uMACfragNum = 1;
2534 if ((pDevice->op_mode == NL80211_IFTYPE_ADHOC) ||
2535 (pDevice->op_mode == NL80211_IFTYPE_AP)) {
2536 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2541 // MSDUs in Infra mode always need ACK
2545 if (pDevice->bLongHeader)
2546 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2548 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2550 if (pDevice->bEncryptionEnable == true) {
2551 if (pTransmitKey == NULL) {
2552 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2553 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2556 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2557 cbIVlen = 8;//IV+ExtIV
2560 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2561 cbIVlen = 8;//RSN Header
2564 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2567 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2568 cbIVlen = 8;//IV+ExtIV
2571 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2572 cbIVlen = 8;//RSN Header
2577 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2579 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2581 cbFragmentSize = pDevice->wFragmentationThreshold;
2582 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2583 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2584 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2585 if (cbLastFragPayloadSize == 0)
2586 cbLastFragPayloadSize = cbFragPayloadSize;
2593 void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb,
2594 unsigned char *pbMPDU, unsigned int cbMPDULen)
2597 unsigned char byPktType;
2598 unsigned char *pbyTxBufferAddr;
2602 unsigned int uDuration;
2603 unsigned int cbReqCount;
2604 PS802_11Header pMACHeader;
2605 unsigned int cbHeaderSize;
2606 unsigned int cbFrameBodySize;
2608 bool bIsPSPOLL = false;
2609 PSTxBufHead pTxBufHead;
2610 unsigned int cbFrameSize;
2611 unsigned int cbIVlen = 0;
2612 unsigned int cbICVlen = 0;
2613 unsigned int cbMIClen = 0;
2614 unsigned int cbFCSlen = 4;
2615 unsigned int uPadding = 0;
2616 unsigned int cbMICHDR = 0;
2617 unsigned int uLength = 0;
2618 u32 dwMICKey0, dwMICKey1;
2622 unsigned short wTxBufSize;
2623 unsigned int cbMacHdLen;
2624 SEthernetHeader sEthHeader;
2627 PSMgmtObject pMgmt = pDevice->pMgmt;
2628 unsigned short wCurrentRate = RATE_1M;
2629 PUWLAN_80211HDR p80211Header;
2630 unsigned int uNodeIndex = 0;
2631 bool bNodeExist = false;
2633 PSKeyItem pTransmitKey = NULL;
2634 unsigned char *pbyIVHead;
2635 unsigned char *pbyPayloadHead;
2636 unsigned char *pbyMacHdr;
2638 unsigned int cbExtSuppRate = 0;
2640 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2642 if (cbMPDULen <= WLAN_HDR_ADDR3_LEN)
2643 cbFrameBodySize = 0;
2645 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2647 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2649 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2650 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2651 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2652 wTxBufSize = sizeof(STxBufHead);
2653 memset(pTxBufHead, 0, wTxBufSize);
2655 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2656 wCurrentRate = RATE_6M;
2657 byPktType = PK_TYPE_11A;
2659 wCurrentRate = RATE_1M;
2660 byPktType = PK_TYPE_11B;
2663 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2664 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2665 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2666 // to set power here.
2667 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING)
2668 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2670 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2672 pTxBufHead->byTxPower = pDevice->byCurPwr;
2674 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2675 if (pDevice->byFOETuning) {
2676 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2677 wCurrentRate = RATE_24M;
2678 byPktType = PK_TYPE_11GA;
2682 pr_debug("vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x\n",
2683 p80211Header->sA3.wFrameCtl);
2686 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2687 pTxBufHead->wFIFOCtl = 0;
2688 } else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2689 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2690 } else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2691 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2692 } else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2693 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2696 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2697 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2699 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2701 if (pDevice->bEnableHostWEP) {
2706 if (pDevice->bEnableHostWEP) {
2707 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2711 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2714 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2715 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2716 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2719 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2721 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2723 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2725 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2728 // hostapd deamon ext support rate patch
2729 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2730 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2731 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2733 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2734 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2736 if (cbExtSuppRate > 0)
2737 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2740 //Set FRAGCTL_MACHDCNT
2741 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2744 // Although spec says MMPDU can be fragmented; In most cases,
2745 // no one will send a MMPDU under fragmentation. With RTS may occur.
2746 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2748 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2749 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2752 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2753 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2754 cbIVlen = 8;//IV+ExtIV
2757 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2758 //We need to get seed here for filling TxKey entry.
2759 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2760 cbIVlen = 8;//RSN Header
2762 cbMICHDR = sizeof(struct vnt_mic_hdr);
2763 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2764 pDevice->bAES = true;
2766 //MAC Header should be padding 0 to DW alignment.
2767 uPadding = 4 - (cbMacHdLen%4);
2771 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2773 //Set FIFOCTL_GrpAckPolicy
2774 if (pDevice->bGrpAckPolicy == true) //0000 0100 0000 0000
2775 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2777 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2779 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2781 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
2782 pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize +
2783 sizeof(struct vnt_rrv_time_cts));
2785 pvCTS = (struct vnt_cts *)(pbyTxBufferAddr + wTxBufSize +
2786 sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
2787 pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
2788 sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
2789 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
2790 cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
2792 } else {//802.11a/b packet
2794 pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
2795 pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr +
2796 wTxBufSize + sizeof(struct vnt_rrv_time_ab));
2799 pvTxDataHd = (void *)(pbyTxBufferAddr +
2800 wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
2801 cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
2802 cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
2806 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2807 memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2808 memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2809 //=========================
2811 //=========================
2812 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2814 //Fill FIFO,RrvTime,RTS,and CTS
2815 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2816 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2819 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2820 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2822 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2824 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2826 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
2827 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2828 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
2830 // Copy the Packet into a tx Buffer
2831 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
2833 // version set to 0, patch for hostapd deamon
2834 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2835 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
2837 // replace support rate, patch for hostapd deamon(only support 11M)
2838 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2839 if (cbExtSuppRate != 0) {
2840 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2841 memcpy((pbyPayloadHead + cbFrameBodySize),
2842 pMgmt->abyCurrSuppRates,
2843 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2845 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2846 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2847 pMgmt->abyCurrExtSuppRates,
2848 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2854 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2855 if (pDevice->bEnableHostWEP) {
2856 pTransmitKey = &STempKey;
2857 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2858 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2859 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2860 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2861 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2862 memcpy(pTransmitKey->abyKey,
2863 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2864 pTransmitKey->uKeyLength
2868 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2869 dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]);
2870 dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]);
2872 // DO Software Michael
2873 MIC_vInit(dwMICKey0, dwMICKey1);
2874 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
2876 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
2877 pr_debug("DMA0_tx_8021:MIC KEY: %X, %X\n",
2878 dwMICKey0, dwMICKey1);
2880 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2882 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2884 pdwMIC_L = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2885 pdwMIC_R = (u32 *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2887 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2890 if (pDevice->bTxMICFail == true) {
2893 pDevice->bTxMICFail = false;
2896 pr_debug("uLength: %d, %d\n", uLength, cbFrameBodySize);
2897 pr_debug("cbReqCount:%d, %d, %d, %d\n",
2898 cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2899 pr_debug("MIC:%x, %x\n", *pdwMIC_L, *pdwMIC_R);
2903 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2904 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
2906 if (pDevice->bEnableHostWEP) {
2907 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2908 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2911 if ((pDevice->byLocalID <= REV_ID_VT3253_A1))
2912 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
2915 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2916 pDevice->wSeqCounter++;
2917 if (pDevice->wSeqCounter > 0x0fff)
2918 pDevice->wSeqCounter = 0;
2921 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2922 // of FIFO control header.
2923 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2924 // in the same place of other packet's Duration-field).
2925 // And it will cause Cisco-AP to issue Disassociation-packet
2926 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2927 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2928 ((struct vnt_tx_datahead_g *)pvTxDataHd)->duration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2930 ((struct vnt_tx_datahead_ab *)pvTxDataHd)->duration = cpu_to_le16(p80211Header->sA2.wDurationID);
2934 // first TD is the only TD
2935 //Set TSR1 & ReqCount in TxDescHead
2936 pFrstTD->pTDInfo->skb = skb;
2937 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2938 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2939 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
2940 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2941 pFrstTD->pTDInfo->byFlags = 0;
2942 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
2944 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2946 MACbPSWakeup(pDevice->PortOffset);
2948 pDevice->bPWBitOn = false;
2951 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2954 pDevice->iTDUsed[TYPE_TXDMA0]++;
2956 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1)
2957 pr_debug(" available td0 <= 1\n");
2959 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2961 // Poll Transmit the adapter
2962 MACvTransmit0(pDevice->PortOffset);