staging: vt6655: Remove commented out printks
[linux-2.6/btrfs-unstable.git] / drivers / staging / vt6655 / rxtx.c
blob091162d5d43ce463eb3145181a7e8423e776c09b
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
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.
19 * File: rxtx.c
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
23 * Author: Lyndon Chen
25 * Date: May 20, 2003
27 * 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
47 * Revision History:
51 #include "device.h"
52 #include "rxtx.h"
53 #include "tether.h"
54 #include "card.h"
55 #include "bssdb.h"
56 #include "mac.h"
57 #include "baseband.h"
58 #include "michael.h"
59 #include "tkip.h"
60 #include "tcrc.h"
61 #include "wctl.h"
62 #include "wroute.h"
63 #include "hostap.h"
64 #include "rf.h"
66 /*--------------------- Static Definitions -------------------------*/
68 /*--------------------- Static Classes ----------------------------*/
70 /*--------------------- Static Variables --------------------------*/
71 //static int msglevel =MSG_LEVEL_DEBUG;
72 static int msglevel = MSG_LEVEL_INFO;
74 #define PLICE_DEBUG
77 /*--------------------- Static Functions --------------------------*/
79 /*--------------------- Static Definitions -------------------------*/
80 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
81 // packet size >= 256 -> direct send
83 const unsigned short wTimeStampOff[2][MAX_RATE] = {
84 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
85 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
88 const unsigned short wFB_Opt0[2][5] = {
89 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
90 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
92 const unsigned short wFB_Opt1[2][5] = {
93 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
94 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
98 #define RTSDUR_BB 0
99 #define RTSDUR_BA 1
100 #define RTSDUR_AA 2
101 #define CTSDUR_BA 3
102 #define RTSDUR_BA_F0 4
103 #define RTSDUR_AA_F0 5
104 #define RTSDUR_BA_F1 6
105 #define RTSDUR_AA_F1 7
106 #define CTSDUR_BA_F0 8
107 #define CTSDUR_BA_F1 9
108 #define DATADUR_B 10
109 #define DATADUR_A 11
110 #define DATADUR_A_F0 12
111 #define DATADUR_A_F1 13
113 /*--------------------- Static Functions --------------------------*/
117 static
118 void
119 s_vFillTxKey(
120 PSDevice pDevice,
121 unsigned char *pbyBuf,
122 unsigned char *pbyIVHead,
123 PSKeyItem pTransmitKey,
124 unsigned char *pbyHdrBuf,
125 unsigned short wPayloadLen,
126 unsigned char *pMICHDR
131 static
132 void
133 s_vFillRTSHead(
134 PSDevice pDevice,
135 unsigned char byPktType,
136 void *pvRTS,
137 unsigned int cbFrameLength,
138 bool bNeedAck,
139 bool bDisCRC,
140 PSEthernetHeader psEthHeader,
141 unsigned short wCurrentRate,
142 unsigned char byFBOption
145 static
146 void
147 s_vGenerateTxParameter(
148 PSDevice pDevice,
149 unsigned char byPktType,
150 void *pTxBufHead,
151 void *pvRrvTime,
152 void *pvRTS,
153 void *pvCTS,
154 unsigned int cbFrameSize,
155 bool bNeedACK,
156 unsigned int uDMAIdx,
157 PSEthernetHeader psEthHeader,
158 unsigned short wCurrentRate
163 static void s_vFillFragParameter(
164 PSDevice pDevice,
165 unsigned char *pbyBuffer,
166 unsigned int uTxType,
167 void *pvtdCurr,
168 unsigned short wFragType,
169 unsigned int cbReqCount
173 static unsigned int
174 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
175 unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
176 PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
177 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum);
180 static
181 unsigned int
182 s_uFillDataHead(
183 PSDevice pDevice,
184 unsigned char byPktType,
185 void *pTxDataHead,
186 unsigned int cbFrameLength,
187 unsigned int uDMAIdx,
188 bool bNeedAck,
189 unsigned int uFragIdx,
190 unsigned int cbLastFragmentSize,
191 unsigned int uMACfragNum,
192 unsigned char byFBOption,
193 unsigned short wCurrentRate
197 /*--------------------- Export Variables --------------------------*/
201 static
202 void
203 s_vFillTxKey(
204 PSDevice pDevice,
205 unsigned char *pbyBuf,
206 unsigned char *pbyIVHead,
207 PSKeyItem pTransmitKey,
208 unsigned char *pbyHdrBuf,
209 unsigned short wPayloadLen,
210 unsigned char *pMICHDR
213 unsigned long *pdwIV = (unsigned long *)pbyIVHead;
214 unsigned long *pdwExtIV = (unsigned long *)((unsigned char *)pbyIVHead+4);
215 unsigned short wValue;
216 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
217 unsigned long dwRevIVCounter;
218 unsigned char byKeyIndex = 0;
222 //Fill TXKEY
223 if (pTransmitKey == NULL)
224 return;
226 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
227 *pdwIV = pDevice->dwIVCounter;
228 byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
230 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
231 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
232 memcpy(pDevice->abyPRNG, (unsigned char *)&(dwRevIVCounter), 3);
233 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
234 } else {
235 memcpy(pbyBuf, (unsigned char *)&(dwRevIVCounter), 3);
236 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
237 if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
238 memcpy(pbyBuf+8, (unsigned char *)&(dwRevIVCounter), 3);
239 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
241 memcpy(pDevice->abyPRNG, pbyBuf, 16);
243 // Append IV after Mac Header
244 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
245 *pdwIV |= (unsigned long)byKeyIndex << 30;
246 *pdwIV = cpu_to_le32(*pdwIV);
247 pDevice->dwIVCounter++;
248 if (pDevice->dwIVCounter > WEP_IV_MASK) {
249 pDevice->dwIVCounter = 0;
251 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
252 pTransmitKey->wTSC15_0++;
253 if (pTransmitKey->wTSC15_0 == 0) {
254 pTransmitKey->dwTSC47_16++;
256 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
257 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
258 memcpy(pbyBuf, pDevice->abyPRNG, 16);
259 // Make IV
260 memcpy(pdwIV, pDevice->abyPRNG, 3);
262 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
263 // Append IV&ExtIV after Mac Header
264 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
265 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
267 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
268 pTransmitKey->wTSC15_0++;
269 if (pTransmitKey->wTSC15_0 == 0) {
270 pTransmitKey->dwTSC47_16++;
272 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
274 // Make IV
275 *pdwIV = 0;
276 *(pbyIVHead+3) = (unsigned char)(((byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
277 *pdwIV |= cpu_to_le16((unsigned short)(pTransmitKey->wTSC15_0));
278 //Append IV&ExtIV after Mac Header
279 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
281 //Fill MICHDR0
282 *pMICHDR = 0x59;
283 *((unsigned char *)(pMICHDR+1)) = 0; // TxPriority
284 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
285 *((unsigned char *)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
286 *((unsigned char *)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
287 *((unsigned char *)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
288 *((unsigned char *)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
289 *((unsigned char *)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
290 *((unsigned char *)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
291 *((unsigned char *)(pMICHDR+14)) = HIBYTE(wPayloadLen);
292 *((unsigned char *)(pMICHDR+15)) = LOBYTE(wPayloadLen);
294 //Fill MICHDR1
295 *((unsigned char *)(pMICHDR+16)) = 0; // HLEN[15:8]
296 if (pDevice->bLongHeader) {
297 *((unsigned char *)(pMICHDR+17)) = 28; // HLEN[7:0]
298 } else {
299 *((unsigned char *)(pMICHDR+17)) = 22; // HLEN[7:0]
301 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
302 memcpy(pMICHDR+18, (unsigned char *)&wValue, 2); // MSKFRACTL
303 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
304 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
306 //Fill MICHDR2
307 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
308 wValue = pMACHeader->wSeqCtl;
309 wValue &= 0x000F;
310 wValue = cpu_to_le16(wValue);
311 memcpy(pMICHDR+38, (unsigned char *)&wValue, 2); // MSKSEQCTL
312 if (pDevice->bLongHeader) {
313 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
319 static
320 void
321 s_vSWencryption(
322 PSDevice pDevice,
323 PSKeyItem pTransmitKey,
324 unsigned char *pbyPayloadHead,
325 unsigned short wPayloadSize
328 unsigned int cbICVlen = 4;
329 unsigned long dwICV = 0xFFFFFFFFL;
330 unsigned long *pdwICV;
332 if (pTransmitKey == NULL)
333 return;
335 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
336 //=======================================================================
337 // Append ICV after payload
338 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
339 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
340 // finally, we must invert dwCRC to get the correct answer
341 *pdwICV = cpu_to_le32(~dwICV);
342 // RC4 encryption
343 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
344 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
345 //=======================================================================
346 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
347 //=======================================================================
348 //Append ICV after payload
349 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
350 pdwICV = (unsigned long *)(pbyPayloadHead + wPayloadSize);
351 // finally, we must invert dwCRC to get the correct answer
352 *pdwICV = cpu_to_le32(~dwICV);
353 // RC4 encryption
354 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
355 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
356 //=======================================================================
363 /*byPktType : PK_TYPE_11A 0
364 PK_TYPE_11B 1
365 PK_TYPE_11GB 2
366 PK_TYPE_11GA 3
368 static
369 unsigned int
370 s_uGetTxRsvTime(
371 PSDevice pDevice,
372 unsigned char byPktType,
373 unsigned int cbFrameLength,
374 unsigned short wRate,
375 bool bNeedAck
378 unsigned int uDataTime, uAckTime;
380 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
381 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
382 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
383 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
384 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
387 if (bNeedAck) {
388 return (uDataTime + pDevice->uSIFS + uAckTime);
390 else {
391 return uDataTime;
395 //byFreqType: 0=>5GHZ 1=>2.4GHZ
396 static
397 unsigned int
398 s_uGetRTSCTSRsvTime(
399 PSDevice pDevice,
400 unsigned char byRTSRsvType,
401 unsigned char byPktType,
402 unsigned int cbFrameLength,
403 unsigned short wCurrentRate
406 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
408 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
411 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
412 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
413 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
414 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
416 else if (byRTSRsvType == 1) { //RTSTxRrvTime_ba, only in 2.4GHZ
417 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
418 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
419 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
421 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
422 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
423 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
425 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
426 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
427 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
428 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
429 return uRrvTime;
432 //RTSRrvTime
433 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
434 return uRrvTime;
437 //byFreqType 0: 5GHz, 1:2.4Ghz
438 static
439 unsigned int
440 s_uGetDataDuration(
441 PSDevice pDevice,
442 unsigned char byDurType,
443 unsigned int cbFrameLength,
444 unsigned char byPktType,
445 unsigned short wRate,
446 bool bNeedAck,
447 unsigned int uFragIdx,
448 unsigned int cbLastFragmentSize,
449 unsigned int uMACfragNum,
450 unsigned char byFBOption
453 bool bLastFrag = 0;
454 unsigned int uAckTime = 0, uNextPktTime = 0;
458 if (uFragIdx == (uMACfragNum-1)) {
459 bLastFrag = 1;
463 switch (byDurType) {
465 case DATADUR_B: //DATADUR_B
466 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
467 if (bNeedAck) {
468 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
469 return (pDevice->uSIFS + uAckTime);
470 } else {
471 return 0;
474 else {//First Frag or Mid Frag
475 if (uFragIdx == (uMACfragNum-2)) {
476 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
477 } else {
478 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
480 if (bNeedAck) {
481 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
482 return (pDevice->uSIFS + uAckTime + uNextPktTime);
483 } else {
484 return (pDevice->uSIFS + uNextPktTime);
487 break;
489 case DATADUR_A: //DATADUR_A
490 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
491 if (bNeedAck) {
492 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
493 return (pDevice->uSIFS + uAckTime);
494 } else {
495 return 0;
498 else {//First Frag or Mid Frag
499 if (uFragIdx == (uMACfragNum-2)) {
500 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
501 } else {
502 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
504 if (bNeedAck) {
505 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
506 return (pDevice->uSIFS + uAckTime + uNextPktTime);
507 } else {
508 return (pDevice->uSIFS + uNextPktTime);
511 break;
513 case DATADUR_A_F0: //DATADUR_A_F0
514 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
515 if (bNeedAck) {
516 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
517 return (pDevice->uSIFS + uAckTime);
518 } else {
519 return 0;
522 else { //First Frag or Mid Frag
523 if (byFBOption == AUTO_FB_0) {
524 if (wRate < RATE_18M)
525 wRate = RATE_18M;
526 else if (wRate > RATE_54M)
527 wRate = RATE_54M;
529 if (uFragIdx == (uMACfragNum-2)) {
530 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
531 } else {
532 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
534 } else { // (byFBOption == AUTO_FB_1)
535 if (wRate < RATE_18M)
536 wRate = RATE_18M;
537 else if (wRate > RATE_54M)
538 wRate = RATE_54M;
540 if (uFragIdx == (uMACfragNum-2)) {
541 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
542 } else {
543 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
547 if (bNeedAck) {
548 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
549 return (pDevice->uSIFS + uAckTime + uNextPktTime);
550 } else {
551 return (pDevice->uSIFS + uNextPktTime);
554 break;
556 case DATADUR_A_F1: //DATADUR_A_F1
557 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
558 if (bNeedAck) {
559 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
560 return (pDevice->uSIFS + uAckTime);
561 } else {
562 return 0;
565 else { //First Frag or Mid Frag
566 if (byFBOption == AUTO_FB_0) {
567 if (wRate < RATE_18M)
568 wRate = RATE_18M;
569 else if (wRate > RATE_54M)
570 wRate = RATE_54M;
572 if (uFragIdx == (uMACfragNum-2)) {
573 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
574 } else {
575 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
578 } else { // (byFBOption == AUTO_FB_1)
579 if (wRate < RATE_18M)
580 wRate = RATE_18M;
581 else if (wRate > RATE_54M)
582 wRate = RATE_54M;
584 if (uFragIdx == (uMACfragNum-2)) {
585 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
586 } else {
587 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
590 if (bNeedAck) {
591 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
592 return (pDevice->uSIFS + uAckTime + uNextPktTime);
593 } else {
594 return (pDevice->uSIFS + uNextPktTime);
597 break;
599 default:
600 break;
603 ASSERT(false);
604 return 0;
608 //byFreqType: 0=>5GHZ 1=>2.4GHZ
609 static
610 unsigned int
611 s_uGetRTSCTSDuration(
612 PSDevice pDevice,
613 unsigned char byDurType,
614 unsigned int cbFrameLength,
615 unsigned char byPktType,
616 unsigned short wRate,
617 bool bNeedAck,
618 unsigned char byFBOption
621 unsigned int uCTSTime = 0, uDurTime = 0;
624 switch (byDurType) {
626 case RTSDUR_BB: //RTSDuration_bb
627 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
628 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
629 break;
631 case RTSDUR_BA: //RTSDuration_ba
632 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
633 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
634 break;
636 case RTSDUR_AA: //RTSDuration_aa
637 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
638 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
639 break;
641 case CTSDUR_BA: //CTSDuration_ba
642 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
643 break;
645 case RTSDUR_BA_F0: //RTSDuration_ba_f0
646 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
647 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
648 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
649 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
650 uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
652 break;
654 case RTSDUR_AA_F0: //RTSDuration_aa_f0
655 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
656 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
657 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
658 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
659 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
661 break;
663 case RTSDUR_BA_F1: //RTSDuration_ba_f1
664 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
665 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
666 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
667 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
668 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
670 break;
672 case RTSDUR_AA_F1: //RTSDuration_aa_f1
673 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
674 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
675 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
676 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
677 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
679 break;
681 case CTSDUR_BA_F0: //CTSDuration_ba_f0
682 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
683 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
684 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
685 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
687 break;
689 case CTSDUR_BA_F1: //CTSDuration_ba_f1
690 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
691 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
692 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M)) {
693 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
695 break;
697 default:
698 break;
701 return uDurTime;
707 static
708 unsigned int
709 s_uFillDataHead(
710 PSDevice pDevice,
711 unsigned char byPktType,
712 void *pTxDataHead,
713 unsigned int cbFrameLength,
714 unsigned int uDMAIdx,
715 bool bNeedAck,
716 unsigned int uFragIdx,
717 unsigned int cbLastFragmentSize,
718 unsigned int uMACfragNum,
719 unsigned char byFBOption,
720 unsigned short wCurrentRate
723 unsigned short wLen = 0x0000;
725 if (pTxDataHead == NULL) {
726 return 0;
729 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
730 if (byFBOption == AUTO_FB_NONE) {
731 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
732 //Get SignalField,ServiceField,Length
733 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
734 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
736 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
737 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
738 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
740 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
741 //Get Duration and TimeStamp
742 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
743 byPktType, wCurrentRate, bNeedAck, uFragIdx,
744 cbLastFragmentSize, uMACfragNum,
745 byFBOption)); //1: 2.4GHz
746 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
747 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
748 bNeedAck, uFragIdx, cbLastFragmentSize,
749 uMACfragNum, byFBOption)); //1: 2.4
751 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
752 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
754 return (pBuf->wDuration_a);
755 } else {
756 // Auto Fallback
757 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
758 //Get SignalField,ServiceField,Length
759 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
760 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
762 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
763 BBvCalculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
764 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
766 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
767 //Get Duration and TimeStamp
768 pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
769 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
770 pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
771 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
772 pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
773 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
774 pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
775 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
777 pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
778 pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
780 return (pBuf->wDuration_a);
781 } //if (byFBOption == AUTO_FB_NONE)
783 else if (byPktType == PK_TYPE_11A) {
784 if ((byFBOption != AUTO_FB_NONE)) {
785 // Auto Fallback
786 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
787 //Get SignalField,ServiceField,Length
788 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
789 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
791 pBuf->wTransmitLength = cpu_to_le16(wLen);
792 //Get Duration and TimeStampOff
794 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
795 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
796 pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
797 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
798 pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
799 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
800 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
801 return (pBuf->wDuration);
802 } else {
803 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
804 //Get SignalField,ServiceField,Length
805 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
806 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
808 pBuf->wTransmitLength = cpu_to_le16(wLen);
809 //Get Duration and TimeStampOff
811 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
812 wCurrentRate, bNeedAck, uFragIdx,
813 cbLastFragmentSize, uMACfragNum,
814 byFBOption));
816 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
817 return (pBuf->wDuration);
820 else {
821 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
822 //Get SignalField,ServiceField,Length
823 BBvCalculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
824 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
826 pBuf->wTransmitLength = cpu_to_le16(wLen);
827 //Get Duration and TimeStampOff
828 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
829 wCurrentRate, bNeedAck, uFragIdx,
830 cbLastFragmentSize, uMACfragNum,
831 byFBOption));
832 pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
833 return (pBuf->wDuration);
835 return 0;
839 static
840 void
841 s_vFillRTSHead(
842 PSDevice pDevice,
843 unsigned char byPktType,
844 void *pvRTS,
845 unsigned int cbFrameLength,
846 bool bNeedAck,
847 bool bDisCRC,
848 PSEthernetHeader psEthHeader,
849 unsigned short wCurrentRate,
850 unsigned char byFBOption
853 unsigned int uRTSFrameLen = 20;
854 unsigned short wLen = 0x0000;
856 if (pvRTS == NULL)
857 return;
859 if (bDisCRC) {
860 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
861 // in this case we need to decrease its length by 4.
862 uRTSFrameLen -= 4;
865 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
866 // Otherwise, we need to modify codes for them.
867 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
868 if (byFBOption == AUTO_FB_NONE) {
869 PSRTS_g pBuf = (PSRTS_g)pvRTS;
870 //Get SignalField,ServiceField,Length
871 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
872 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
874 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
875 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
876 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
878 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
879 //Get Duration
880 pBuf->wDuration_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
881 pBuf->wDuration_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
882 pBuf->wDuration_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
884 pBuf->Data.wDurationID = pBuf->wDuration_aa;
885 //Get RTS Frame body
886 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
887 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
888 (pDevice->eOPMode == OP_MODE_AP)) {
889 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
891 else {
892 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
894 if (pDevice->eOPMode == OP_MODE_AP) {
895 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
897 else {
898 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
901 else {
902 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
903 //Get SignalField,ServiceField,Length
904 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
905 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
907 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
908 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
909 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
911 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
913 //Get Duration
914 pBuf->wDuration_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
915 pBuf->wDuration_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
916 pBuf->wDuration_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
917 pBuf->wRTSDuration_ba_f0 = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
918 pBuf->wRTSDuration_aa_f0 = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
919 pBuf->wRTSDuration_ba_f1 = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
920 pBuf->wRTSDuration_aa_f1 = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
921 pBuf->Data.wDurationID = pBuf->wDuration_aa;
922 //Get RTS Frame body
923 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
925 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
926 (pDevice->eOPMode == OP_MODE_AP)) {
927 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
929 else {
930 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
933 if (pDevice->eOPMode == OP_MODE_AP) {
934 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
936 else {
937 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
940 } // if (byFBOption == AUTO_FB_NONE)
942 else if (byPktType == PK_TYPE_11A) {
943 if (byFBOption == AUTO_FB_NONE) {
944 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
945 //Get SignalField,ServiceField,Length
946 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
947 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
949 pBuf->wTransmitLength = cpu_to_le16(wLen);
950 //Get Duration
951 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
952 pBuf->Data.wDurationID = pBuf->wDuration;
953 //Get RTS Frame body
954 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
956 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
957 (pDevice->eOPMode == OP_MODE_AP)) {
958 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
960 else {
961 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
964 if (pDevice->eOPMode == OP_MODE_AP) {
965 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
967 else {
968 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
972 else {
973 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
974 //Get SignalField,ServiceField,Length
975 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
976 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
978 pBuf->wTransmitLength = cpu_to_le16(wLen);
979 //Get Duration
980 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
981 pBuf->wRTSDuration_f0 = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
982 pBuf->wRTSDuration_f1 = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:RTSDuration_aa_f1, 0:5G, 0:
983 pBuf->Data.wDurationID = pBuf->wDuration;
984 //Get RTS Frame body
985 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
987 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
988 (pDevice->eOPMode == OP_MODE_AP)) {
989 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
991 else {
992 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
994 if (pDevice->eOPMode == OP_MODE_AP) {
995 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
997 else {
998 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
1002 else if (byPktType == PK_TYPE_11B) {
1003 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1004 //Get SignalField,ServiceField,Length
1005 BBvCalculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1006 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
1008 pBuf->wTransmitLength = cpu_to_le16(wLen);
1009 //Get Duration
1010 pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1011 pBuf->Data.wDurationID = pBuf->wDuration;
1012 //Get RTS Frame body
1013 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1016 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1017 (pDevice->eOPMode == OP_MODE_AP)) {
1018 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
1020 else {
1021 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1024 if (pDevice->eOPMode == OP_MODE_AP) {
1025 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1027 else {
1028 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
1033 static
1034 void
1035 s_vFillCTSHead(
1036 PSDevice pDevice,
1037 unsigned int uDMAIdx,
1038 unsigned char byPktType,
1039 void *pvCTS,
1040 unsigned int cbFrameLength,
1041 bool bNeedAck,
1042 bool bDisCRC,
1043 unsigned short wCurrentRate,
1044 unsigned char byFBOption
1047 unsigned int uCTSFrameLen = 14;
1048 unsigned short wLen = 0x0000;
1050 if (pvCTS == NULL) {
1051 return;
1054 if (bDisCRC) {
1055 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1056 // in this case we need to decrease its length by 4.
1057 uCTSFrameLen -= 4;
1060 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1061 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1062 // Auto Fall back
1063 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1064 //Get SignalField,ServiceField,Length
1065 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1066 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1070 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1072 pBuf->wDuration_ba = (unsigned short)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1073 pBuf->wDuration_ba += pDevice->wCTSDuration;
1074 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1075 //Get CTSDuration_ba_f0
1076 pBuf->wCTSDuration_ba_f0 = (unsigned short)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
1077 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1078 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1079 //Get CTSDuration_ba_f1
1080 pBuf->wCTSDuration_ba_f1 = (unsigned short)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
1081 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1082 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1083 //Get CTS Frame body
1084 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1085 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1086 pBuf->Data.wReserved = 0x0000;
1087 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1089 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1090 PSCTS pBuf = (PSCTS)pvCTS;
1091 //Get SignalField,ServiceField,Length
1092 BBvCalculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1093 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1095 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1096 //Get CTSDuration_ba
1097 pBuf->wDuration_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1098 pBuf->wDuration_ba += pDevice->wCTSDuration;
1099 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1101 //Get CTS Frame body
1102 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1103 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1104 pBuf->Data.wReserved = 0x0000;
1105 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1117 * Description:
1118 * Generate FIFO control for MAC & Baseband controller
1120 * Parameters:
1121 * In:
1122 * pDevice - Pointer to adapter
1123 * pTxDataHead - Transmit Data Buffer
1124 * pTxBufHead - pTxBufHead
1125 * pvRrvTime - pvRrvTime
1126 * pvRTS - RTS Buffer
1127 * pCTS - CTS Buffer
1128 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1129 * bNeedACK - If need ACK
1130 * uDescIdx - Desc Index
1131 * Out:
1132 * none
1134 * Return Value: none
1137 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1138 static
1139 void
1140 s_vGenerateTxParameter(
1141 PSDevice pDevice,
1142 unsigned char byPktType,
1143 void *pTxBufHead,
1144 void *pvRrvTime,
1145 void *pvRTS,
1146 void *pvCTS,
1147 unsigned int cbFrameSize,
1148 bool bNeedACK,
1149 unsigned int uDMAIdx,
1150 PSEthernetHeader psEthHeader,
1151 unsigned short wCurrentRate
1154 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1155 unsigned short wFifoCtl;
1156 bool bDisCRC = false;
1157 unsigned char byFBOption = AUTO_FB_NONE;
1158 // unsigned short wCurrentRate = pDevice->wCurrentRate;
1160 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vGenerateTxParameter...\n");
1161 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1162 pFifoHead->wReserved = wCurrentRate;
1163 wFifoCtl = pFifoHead->wFIFOCtl;
1165 if (wFifoCtl & FIFOCTL_CRCDIS) {
1166 bDisCRC = true;
1169 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1170 byFBOption = AUTO_FB_0;
1172 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1173 byFBOption = AUTO_FB_1;
1176 if (pDevice->bLongHeader)
1177 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1179 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1181 if (pvRTS != NULL) { //RTS_need
1182 //Fill RsvTime
1183 if (pvRrvTime) {
1184 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1185 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1186 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1187 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1188 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1189 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1191 //Fill RTS
1192 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1194 else {//RTS_needless, PCF mode
1196 //Fill RsvTime
1197 if (pvRrvTime) {
1198 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1199 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1200 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1201 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1205 //Fill CTS
1206 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1209 else if (byPktType == PK_TYPE_11A) {
1211 if (pvRTS != NULL) {//RTS_need, non PCF mode
1212 //Fill RsvTime
1213 if (pvRrvTime) {
1214 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1215 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1216 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1218 //Fill RTS
1219 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1221 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1222 //Fill RsvTime
1223 if (pvRrvTime) {
1224 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1225 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1229 else if (byPktType == PK_TYPE_11B) {
1231 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1232 //Fill RsvTime
1233 if (pvRrvTime) {
1234 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1235 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1236 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1238 //Fill RTS
1239 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1241 else { //RTS_needless, non PCF mode
1242 //Fill RsvTime
1243 if (pvRrvTime) {
1244 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1245 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1249 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vGenerateTxParameter END.\n");
1252 unsigned char *pbyBuffer,//point to pTxBufHead
1253 unsigned short wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1254 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1256 static
1257 void
1258 s_vFillFragParameter(
1259 PSDevice pDevice,
1260 unsigned char *pbyBuffer,
1261 unsigned int uTxType,
1262 void *pvtdCurr,
1263 unsigned short wFragType,
1264 unsigned int cbReqCount
1267 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1268 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vFillFragParameter...\n");
1270 if (uTxType == TYPE_SYNCDMA) {
1271 //PSTxSyncDesc ptdCurr = (PSTxSyncDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1272 PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1274 //Set FIFOCtl & TimeStamp in TxSyncDesc
1275 ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1276 ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1277 //Set TSR1 & ReqCount in TxDescHead
1278 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1279 if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1280 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1282 else {
1283 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1286 else {
1287 //PSTxDesc ptdCurr = (PSTxDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1288 PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1289 //Set TSR1 & ReqCount in TxDescHead
1290 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1291 if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1292 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1294 else {
1295 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1299 pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1301 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_vFillFragParameter END\n");
1304 static unsigned int
1305 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
1306 unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
1307 PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
1308 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum)
1310 unsigned int cbMACHdLen;
1311 unsigned int cbFrameSize;
1312 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1313 unsigned int cbFragPayloadSize;
1314 unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1315 unsigned int cbLastFragPayloadSize;
1316 unsigned int uFragIdx;
1317 unsigned char *pbyPayloadHead;
1318 unsigned char *pbyIVHead;
1319 unsigned char *pbyMacHdr;
1320 unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1321 unsigned int uDuration;
1322 unsigned char *pbyBuffer;
1323 // unsigned int uKeyEntryIdx = NUM_KEY_ENTRY+1;
1324 // unsigned char byKeySel = 0xFF;
1325 unsigned int cbIVlen = 0;
1326 unsigned int cbICVlen = 0;
1327 unsigned int cbMIClen = 0;
1328 unsigned int cbFCSlen = 4;
1329 unsigned int cb802_1_H_len = 0;
1330 unsigned int uLength = 0;
1331 unsigned int uTmpLen = 0;
1332 // unsigned char abyTmp[8];
1333 // unsigned long dwCRC;
1334 unsigned int cbMICHDR = 0;
1335 unsigned long dwMICKey0, dwMICKey1;
1336 unsigned long dwMIC_Priority;
1337 unsigned long *pdwMIC_L;
1338 unsigned long *pdwMIC_R;
1339 unsigned long dwSafeMIC_L, dwSafeMIC_R; //Fix "Last Frag Size" < "MIC length".
1340 bool bMIC2Frag = false;
1341 unsigned int uMICFragLen = 0;
1342 unsigned int uMACfragNum = 1;
1343 unsigned int uPadding = 0;
1344 unsigned int cbReqCount = 0;
1346 bool bNeedACK;
1347 bool bRTS;
1348 bool bIsAdhoc;
1349 unsigned char *pbyType;
1350 PSTxDesc ptdCurr;
1351 PSTxBufHead psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1352 // unsigned int tmpDescIdx;
1353 unsigned int cbHeaderLength = 0;
1354 void *pvRrvTime;
1355 PSMICHDRHead pMICHDR;
1356 void *pvRTS;
1357 void *pvCTS;
1358 void *pvTxDataHd;
1359 unsigned short wTxBufSize; // FFinfo size
1360 unsigned int uTotalCopyLength = 0;
1361 unsigned char byFBOption = AUTO_FB_NONE;
1362 bool bIsWEP256 = false;
1363 PSMgmtObject pMgmt = pDevice->pMgmt;
1366 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1368 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "s_cbFillTxBufHead...\n");
1369 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1370 (pDevice->eOPMode == OP_MODE_AP)) {
1372 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1373 bNeedACK = false;
1374 else
1375 bNeedACK = true;
1376 bIsAdhoc = true;
1378 else {
1379 // MSDUs in Infra mode always need ACK
1380 bNeedACK = true;
1381 bIsAdhoc = false;
1384 if (pDevice->bLongHeader)
1385 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1386 else
1387 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1390 if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1391 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1392 cbIVlen = 4;
1393 cbICVlen = 4;
1394 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
1395 bIsWEP256 = true;
1398 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1399 cbIVlen = 8;//IV+ExtIV
1400 cbMIClen = 8;
1401 cbICVlen = 4;
1403 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1404 cbIVlen = 8;//RSN Header
1405 cbICVlen = 8;//MIC
1406 cbMICHDR = sizeof(SMICHDRHead);
1408 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1409 //MAC Header should be padding 0 to DW alignment.
1410 uPadding = 4 - (cbMACHdLen%4);
1411 uPadding %= 4;
1416 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1418 if ((bNeedACK == false) ||
1419 (cbFrameSize < pDevice->wRTSThreshold) ||
1420 ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1422 bRTS = false;
1424 else {
1425 bRTS = true;
1426 psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1429 // Use for AUTO FALL BACK
1431 if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
1432 byFBOption = AUTO_FB_0;
1434 else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
1435 byFBOption = AUTO_FB_1;
1438 //////////////////////////////////////////////////////
1439 //Set RrvTime/RTS/CTS Buffer
1440 wTxBufSize = sizeof(STxBufHead);
1441 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1443 if (byFBOption == AUTO_FB_NONE) {
1444 if (bRTS == true) {//RTS_need
1445 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1446 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1447 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1448 pvCTS = NULL;
1449 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1450 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1452 else { //RTS_needless
1453 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1454 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1455 pvRTS = NULL;
1456 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1457 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1458 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1460 } else {
1461 // Auto Fall Back
1462 if (bRTS == true) {//RTS_need
1463 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1464 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1465 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1466 pvCTS = NULL;
1467 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1468 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1470 else { //RTS_needless
1471 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1472 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1473 pvRTS = NULL;
1474 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1475 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1476 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1478 } // Auto Fall Back
1480 else {//802.11a/b packet
1482 if (byFBOption == AUTO_FB_NONE) {
1483 if (bRTS == true) {
1484 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1485 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1486 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1487 pvCTS = NULL;
1488 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1489 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1491 else { //RTS_needless, need MICHDR
1492 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1493 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1494 pvRTS = NULL;
1495 pvCTS = NULL;
1496 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1497 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1499 } else {
1500 // Auto Fall Back
1501 if (bRTS == true) {//RTS_need
1502 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1503 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1504 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1505 pvCTS = NULL;
1506 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1507 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1509 else { //RTS_needless
1510 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1511 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1512 pvRTS = NULL;
1513 pvCTS = NULL;
1514 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1515 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1517 } // Auto Fall Back
1519 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1521 //////////////////////////////////////////////////////////////////
1522 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1523 if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1524 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1525 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1527 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1528 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1529 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1531 else {
1532 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[24]);
1533 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[28]);
1535 // DO Software Michael
1536 MIC_vInit(dwMICKey0, dwMICKey1);
1537 MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1538 dwMIC_Priority = 0;
1539 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1540 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1543 ///////////////////////////////////////////////////////////////////
1545 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1546 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1547 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1549 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1550 // Fragmentation
1551 // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1552 cbFragmentSize = pDevice->wFragmentationThreshold;
1553 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1554 //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1555 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1556 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1557 if (cbLastFragPayloadSize == 0) {
1558 cbLastFragPayloadSize = cbFragPayloadSize;
1559 } else {
1560 uMACfragNum++;
1562 //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1563 cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1565 for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx++) {
1566 if (uFragIdx == 0) {
1567 //=========================
1568 // Start Fragmentation
1569 //=========================
1570 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Start Fragmentation...\n");
1571 wFragType = FRAGCTL_STAFRAG;
1574 //Fill FIFO,RrvTime,RTS,and CTS
1575 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1576 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1577 //Fill DataHead
1578 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1579 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1580 // Generate TX MAC Header
1581 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1582 wFragType, uDMAIdx, uFragIdx);
1584 if (bNeedEncrypt == true) {
1585 //Fill TXKEY
1586 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1587 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1588 //Fill IV(ExtIV,RSNHDR)
1589 if (pDevice->bEnableHostWEP) {
1590 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1591 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1596 // 802.1H
1597 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1598 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1599 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1600 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1602 else {
1603 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1605 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1606 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1607 cb802_1_H_len = 8;
1610 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1611 //---------------------------
1612 // S/W or H/W Encryption
1613 //---------------------------
1614 //Fill MICHDR
1615 //if (pDevice->bAES) {
1616 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1618 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1619 // pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1623 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1624 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1626 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1627 //copy TxBufferHeader + MacHeader to desc
1628 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1630 // Copy the Packet into a tx Buffer
1631 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1634 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1636 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1637 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Start MIC: %d\n", cbFragPayloadSize);
1638 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1642 //---------------------------
1643 // S/W Encryption
1644 //---------------------------
1645 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1646 if (bNeedEncrypt) {
1647 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1648 cbReqCount += cbICVlen;
1652 ptdCurr = (PSTxDesc)pHeadTD;
1653 //--------------------
1654 //1.Set TSR1 & ReqCount in TxDescHead
1655 //2.Set FragCtl in TxBufferHead
1656 //3.Set Frame Control
1657 //4.Set Sequence Control
1658 //5.Get S/W generate FCS
1659 //--------------------
1660 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1662 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1663 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1664 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1665 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1666 pDevice->iTDUsed[uDMAIdx]++;
1667 pHeadTD = ptdCurr->next;
1669 else if (uFragIdx == (uMACfragNum-1)) {
1670 //=========================
1671 // Last Fragmentation
1672 //=========================
1673 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last Fragmentation...\n");
1674 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1676 wFragType = FRAGCTL_ENDFRAG;
1678 //Fill FIFO,RrvTime,RTS,and CTS
1679 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1680 cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1681 //Fill DataHead
1682 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1683 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1685 // Generate TX MAC Header
1686 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1687 wFragType, uDMAIdx, uFragIdx);
1689 if (bNeedEncrypt == true) {
1690 //Fill TXKEY
1691 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1692 pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1694 if (pDevice->bEnableHostWEP) {
1695 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1696 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1702 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1703 //---------------------------
1704 // S/W or H/W Encryption
1705 //---------------------------
1709 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1710 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1712 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1714 //copy TxBufferHeader + MacHeader to desc
1715 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1717 // Copy the Packet into a tx Buffer
1718 if (bMIC2Frag == false) {
1720 memcpy((pbyBuffer + uLength),
1721 (pPacket + 14 + uTotalCopyLength),
1722 (cbLastFragPayloadSize - cbMIClen)
1724 //TODO check uTmpLen !
1725 uTmpLen = cbLastFragPayloadSize - cbMIClen;
1728 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1729 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1730 uMICFragLen, cbLastFragPayloadSize, uTmpLen);
1732 if (bMIC2Frag == false) {
1733 if (uTmpLen != 0)
1734 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1735 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1736 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1737 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1738 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1739 } else {
1740 if (uMICFragLen >= 4) {
1741 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1742 (cbMIClen - uMICFragLen));
1743 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen >= 4: %X, %d\n",
1744 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1745 (cbMIClen - uMICFragLen));
1747 } else {
1748 memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1749 (4 - uMICFragLen));
1750 memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1751 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LAST: uMICFragLen < 4: %X, %d\n",
1752 *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1753 (cbMIClen - uMICFragLen));
1756 for (ii = 0; ii < cbLastFragPayloadSize + 8 + 24; ii++) {
1757 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii - 8 - 24)));
1759 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n\n");
1762 MIC_vUnInit();
1763 } else {
1764 ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1768 //---------------------------
1769 // S/W Encryption
1770 //---------------------------
1771 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1772 if (bNeedEncrypt) {
1773 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1774 cbReqCount += cbICVlen;
1778 ptdCurr = (PSTxDesc)pHeadTD;
1780 //--------------------
1781 //1.Set TSR1 & ReqCount in TxDescHead
1782 //2.Set FragCtl in TxBufferHead
1783 //3.Set Frame Control
1784 //4.Set Sequence Control
1785 //5.Get S/W generate FCS
1786 //--------------------
1789 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1791 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1792 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1793 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1794 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1795 pDevice->iTDUsed[uDMAIdx]++;
1796 pHeadTD = ptdCurr->next;
1799 else {
1800 //=========================
1801 // Middle Fragmentation
1802 //=========================
1803 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Middle Fragmentation...\n");
1804 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1806 wFragType = FRAGCTL_MIDFRAG;
1808 //Fill FIFO,RrvTime,RTS,and CTS
1809 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1810 cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1811 //Fill DataHead
1812 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1813 uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1815 // Generate TX MAC Header
1816 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1817 wFragType, uDMAIdx, uFragIdx);
1820 if (bNeedEncrypt == true) {
1821 //Fill TXKEY
1822 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1823 pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1825 if (pDevice->bEnableHostWEP) {
1826 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1827 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1831 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1832 //---------------------------
1833 // S/W or H/W Encryption
1834 //---------------------------
1835 //Fill MICHDR
1836 //if (pDevice->bAES) {
1837 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1839 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1840 // pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1843 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1844 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1847 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1849 //copy TxBufferHeader + MacHeader to desc
1850 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1852 // Copy the Packet into a tx Buffer
1853 memcpy((pbyBuffer + uLength),
1854 (pPacket + 14 + uTotalCopyLength),
1855 cbFragPayloadSize
1857 uTmpLen = cbFragPayloadSize;
1859 uTotalCopyLength += uTmpLen;
1861 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1863 MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1865 if (uTmpLen < cbFragPayloadSize) {
1866 bMIC2Frag = true;
1867 uMICFragLen = cbFragPayloadSize - uTmpLen;
1868 ASSERT(uMICFragLen < cbMIClen);
1870 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1871 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1872 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1873 dwSafeMIC_L = *pdwMIC_L;
1874 dwSafeMIC_R = *pdwMIC_R;
1876 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1877 uMICFragLen, cbFragPayloadSize, uTmpLen);
1878 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Fill MIC in Middle frag [%d]\n", uMICFragLen);
1880 for (ii = 0; ii < uMICFragLen; ii++) {
1881 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength + uTmpLen) + ii)));
1883 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
1885 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1887 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Middle frag len: %d\n", uTmpLen);
1889 for (ii = 0; ii < uTmpLen; ii++) {
1890 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
1892 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n\n");
1895 } else {
1896 ASSERT(uTmpLen == (cbFragPayloadSize));
1899 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1900 if (bNeedEncrypt) {
1901 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1902 cbReqCount += cbICVlen;
1906 ptdCurr = (PSTxDesc)pHeadTD;
1908 //--------------------
1909 //1.Set TSR1 & ReqCount in TxDescHead
1910 //2.Set FragCtl in TxBufferHead
1911 //3.Set Frame Control
1912 //4.Set Sequence Control
1913 //5.Get S/W generate FCS
1914 //--------------------
1916 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1918 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1919 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1920 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1921 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1922 pDevice->iTDUsed[uDMAIdx]++;
1923 pHeadTD = ptdCurr->next;
1925 } // for (uMACfragNum)
1927 else {
1928 //=========================
1929 // No Fragmentation
1930 //=========================
1931 //DBG_PRTGRP03(("No Fragmentation...\n"));
1932 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "No Fragmentation...\n");
1933 wFragType = FRAGCTL_NONFRAG;
1935 //Set FragCtl in TxBufferHead
1936 psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1938 //Fill FIFO,RrvTime,RTS,and CTS
1939 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1940 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1941 //Fill DataHead
1942 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1943 0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1945 // Generate TX MAC Header
1946 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1947 wFragType, uDMAIdx, 0);
1949 if (bNeedEncrypt == true) {
1950 //Fill TXKEY
1951 s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1952 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1954 if (pDevice->bEnableHostWEP) {
1955 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1956 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1960 // 802.1H
1961 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1962 if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1963 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1964 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1966 else {
1967 memcpy((unsigned char *)(pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1969 pbyType = (unsigned char *)(pbyPayloadHead + 6);
1970 memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1971 cb802_1_H_len = 8;
1974 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1975 //---------------------------
1976 // S/W or H/W Encryption
1977 //---------------------------
1978 //Fill MICHDR
1979 //if (pDevice->bAES) {
1980 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Fill MICHDR...\n");
1981 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFrameBodySize);
1984 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1985 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1987 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1989 //copy TxBufferHeader + MacHeader to desc
1990 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1992 // Copy the Packet into a tx Buffer
1993 memcpy((pbyBuffer + uLength),
1994 (pPacket + 14),
1995 cbFrameBodySize - cb802_1_H_len
1998 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2000 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Length:%d, %d\n", cbFrameBodySize - cb802_1_H_len, uLength);
2002 for (ii = 0; ii < (cbFrameBodySize - cb802_1_H_len); ii++) {
2003 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
2005 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
2008 MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
2010 pdwMIC_L = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
2011 pdwMIC_R = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
2013 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2014 MIC_vUnInit();
2017 if (pDevice->bTxMICFail == true) {
2018 *pdwMIC_L = 0;
2019 *pdwMIC_R = 0;
2020 pDevice->bTxMICFail = false;
2023 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "uLength: %d, %d\n", uLength, cbFrameBodySize);
2024 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
2025 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2027 for (ii = 0; ii < 8; ii++) {
2028 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", *(((unsigned char *)(pdwMIC_L) + ii)));
2030 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
2036 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2037 if (bNeedEncrypt) {
2038 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
2039 (unsigned short)(cbFrameBodySize + cbMIClen));
2040 cbReqCount += cbICVlen;
2045 ptdCurr = (PSTxDesc)pHeadTD;
2047 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
2048 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
2049 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
2050 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
2051 //Set TSR1 & ReqCount in TxDescHead
2052 ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
2053 ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2055 pDevice->iTDUsed[uDMAIdx]++;
2058 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ptdCurr->m_dwReserved0[%d] ptdCurr->m_dwReserved1[%d].\n", ptdCurr->pTDInfo->dwReqCount, ptdCurr->pTDInfo->dwHeaderLength);
2059 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " cbHeaderLength[%d]\n", cbHeaderLength);
2062 *puMACfragNum = uMACfragNum;
2063 //DBG_PRTGRP03(("s_cbFillTxBufHead END\n"));
2064 return cbHeaderLength;
2068 void
2069 vGenerateFIFOHeader(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
2070 bool bNeedEncrypt, unsigned int cbPayloadSize, unsigned int uDMAIdx,
2071 PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
2072 PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
2073 unsigned int *pcbHeaderSize)
2075 unsigned int wTxBufSize; // FFinfo size
2076 bool bNeedACK;
2077 bool bIsAdhoc;
2078 unsigned short cbMacHdLen;
2079 PSTxBufHead pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2081 wTxBufSize = sizeof(STxBufHead);
2083 memset(pTxBufHead, 0, wTxBufSize);
2084 //Set FIFOCTL_NEEDACK
2086 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2087 (pDevice->eOPMode == OP_MODE_AP)) {
2088 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
2089 bNeedACK = false;
2090 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
2092 else {
2093 bNeedACK = true;
2094 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2096 bIsAdhoc = true;
2098 else {
2099 // MSDUs in Infra mode always need ACK
2100 bNeedACK = true;
2101 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2102 bIsAdhoc = false;
2106 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2107 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
2109 //Set FIFOCTL_LHEAD
2110 if (pDevice->bLongHeader)
2111 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
2113 //Set FIFOCTL_GENINT
2115 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2118 //Set FIFOCTL_ISDMA0
2119 if (TYPE_TXDMA0 == uDMAIdx) {
2120 pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
2123 //Set FRAGCTL_MACHDCNT
2124 if (pDevice->bLongHeader) {
2125 cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
2126 } else {
2127 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2129 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2131 //Set packet type
2132 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2135 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2136 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2138 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2139 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2141 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2142 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2144 //Set FIFOCTL_GrpAckPolicy
2145 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2146 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2149 //Set Auto Fallback Ctl
2150 if (pDevice->wCurrentRate >= RATE_18M) {
2151 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
2152 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
2153 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
2154 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
2158 //Set FRAGCTL_WEPTYP
2159 pDevice->bAES = false;
2161 //Set FRAGCTL_WEPTYP
2162 if (pDevice->byLocalID > REV_ID_VT3253_A1) {
2163 if ((bNeedEncrypt) && (pTransmitKey != NULL)) { //WEP enabled
2164 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2165 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2167 else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
2168 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
2169 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2171 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
2172 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2177 #ifdef PLICE_DEBUG
2178 //if (pDevice->wCurrentRate <= 3)
2180 // RFbRawSetPower(pDevice,36,pDevice->wCurrentRate);
2182 //else
2184 RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
2185 #endif
2186 //if (pDevice->wCurrentRate == 3)
2187 //pDevice->byCurPwr = 46;
2188 pTxBufHead->byTxPower = pDevice->byCurPwr;
2194 if (pDevice->bEnableHostWEP)
2195 pTxBufHead->wFragCtl &= ~(FRAGCTL_TKIP | FRAGCTL_LEGACY |FRAGCTL_AES);
2197 *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
2198 uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
2199 pTransmitKey, uNodeIndex, puMACfragNum);
2201 return;
2209 * Description:
2210 * Translate 802.3 to 802.11 header
2212 * Parameters:
2213 * In:
2214 * pDevice - Pointer to adapter
2215 * dwTxBufferAddr - Transmit Buffer
2216 * pPacket - Packet from upper layer
2217 * cbPacketSize - Transmit Data Length
2218 * Out:
2219 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
2220 * pcbAppendPayload - size of append payload for 802.1H translation
2222 * Return Value: none
2226 void
2227 vGenerateMACHeader(
2228 PSDevice pDevice,
2229 unsigned char *pbyBufferAddr,
2230 unsigned short wDuration,
2231 PSEthernetHeader psEthHeader,
2232 bool bNeedEncrypt,
2233 unsigned short wFragType,
2234 unsigned int uDMAIdx,
2235 unsigned int uFragIdx
2238 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
2240 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
2242 if (uDMAIdx == TYPE_ATIMDMA) {
2243 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2244 } else {
2245 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2248 if (pDevice->eOPMode == OP_MODE_AP) {
2249 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2250 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2251 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2252 pMACHeader->wFrameCtl |= FC_FROMDS;
2254 else {
2255 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2256 memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2257 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2258 memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2260 else {
2261 memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2262 memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2263 memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2264 pMACHeader->wFrameCtl |= FC_TODS;
2268 if (bNeedEncrypt)
2269 pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2271 pMACHeader->wDurationID = cpu_to_le16(wDuration);
2273 if (pDevice->bLongHeader) {
2274 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
2275 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2276 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2278 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2280 //Set FragNumber in Sequence Control
2281 pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2283 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2284 pDevice->wSeqCounter++;
2285 if (pDevice->wSeqCounter > 0x0fff)
2286 pDevice->wSeqCounter = 0;
2289 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
2290 pMACHeader->wFrameCtl |= FC_MOREFRAG;
2299 CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2301 PSTxDesc pFrstTD;
2302 unsigned char byPktType;
2303 unsigned char *pbyTxBufferAddr;
2304 void *pvRTS;
2305 PSCTS pCTS;
2306 void *pvTxDataHd;
2307 unsigned int uDuration;
2308 unsigned int cbReqCount;
2309 PS802_11Header pMACHeader;
2310 unsigned int cbHeaderSize;
2311 unsigned int cbFrameBodySize;
2312 bool bNeedACK;
2313 bool bIsPSPOLL = false;
2314 PSTxBufHead pTxBufHead;
2315 unsigned int cbFrameSize;
2316 unsigned int cbIVlen = 0;
2317 unsigned int cbICVlen = 0;
2318 unsigned int cbMIClen = 0;
2319 unsigned int cbFCSlen = 4;
2320 unsigned int uPadding = 0;
2321 unsigned short wTxBufSize;
2322 unsigned int cbMacHdLen;
2323 SEthernetHeader sEthHeader;
2324 void *pvRrvTime;
2325 void *pMICHDR;
2326 PSMgmtObject pMgmt = pDevice->pMgmt;
2327 unsigned short wCurrentRate = RATE_1M;
2330 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2331 return CMD_STATUS_RESOURCES;
2334 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2335 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2336 cbFrameBodySize = pPacket->cbPayloadLen;
2337 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2338 wTxBufSize = sizeof(STxBufHead);
2339 memset(pTxBufHead, 0, wTxBufSize);
2341 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2342 wCurrentRate = RATE_6M;
2343 byPktType = PK_TYPE_11A;
2344 } else {
2345 wCurrentRate = RATE_1M;
2346 byPktType = PK_TYPE_11B;
2349 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2350 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2351 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2352 // to set power here.
2353 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2355 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2356 } else {
2357 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2359 pTxBufHead->byTxPower = pDevice->byCurPwr;
2360 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2361 if (pDevice->byFOETuning) {
2362 if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2363 wCurrentRate = RATE_24M;
2364 byPktType = PK_TYPE_11GA;
2368 //Set packet type
2369 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2370 pTxBufHead->wFIFOCtl = 0;
2372 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2373 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2375 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2376 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2378 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2379 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2382 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2383 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2386 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2387 bNeedACK = false;
2388 else {
2389 bNeedACK = true;
2390 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2393 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2394 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2396 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2397 //Set Preamble type always long
2398 //pDevice->byPreambleType = PREAMBLE_LONG;
2399 // probe-response don't retry
2400 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2401 // bNeedACK = false;
2402 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2406 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2408 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2409 bIsPSPOLL = true;
2410 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2411 } else {
2412 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2415 //Set FRAGCTL_MACHDCNT
2416 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2418 // Notes:
2419 // Although spec says MMPDU can be fragmented; In most cases,
2420 // no one will send a MMPDU under fragmentation. With RTS may occur.
2421 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2423 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2424 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2425 cbIVlen = 4;
2426 cbICVlen = 4;
2427 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2429 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2430 cbIVlen = 8;//IV+ExtIV
2431 cbMIClen = 8;
2432 cbICVlen = 4;
2433 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2434 //We need to get seed here for filling TxKey entry.
2435 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2436 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2438 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2439 cbIVlen = 8;//RSN Header
2440 cbICVlen = 8;//MIC
2441 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2442 pDevice->bAES = true;
2444 //MAC Header should be padding 0 to DW alignment.
2445 uPadding = 4 - (cbMacHdLen%4);
2446 uPadding %= 4;
2449 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2451 //Set FIFOCTL_GrpAckPolicy
2452 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2453 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2455 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2457 //Set RrvTime/RTS/CTS Buffer
2458 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2460 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2461 pMICHDR = NULL;
2462 pvRTS = NULL;
2463 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2464 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2465 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2467 else { // 802.11a/b packet
2468 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2469 pMICHDR = NULL;
2470 pvRTS = NULL;
2471 pCTS = NULL;
2472 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2473 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2476 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2478 memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2479 memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2480 //=========================
2481 // No Fragmentation
2482 //=========================
2483 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2486 //Fill FIFO,RrvTime,RTS,and CTS
2487 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2488 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2490 //Fill DataHead
2491 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2492 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2494 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2496 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2498 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2499 unsigned char *pbyIVHead;
2500 unsigned char *pbyPayloadHead;
2501 unsigned char *pbyBSSID;
2502 PSKeyItem pTransmitKey = NULL;
2504 pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2505 pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2507 //Fill TXKEY
2508 //Kyle: Need fix: TKIP and AES did't encrypt Mnt Packet.
2509 //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2511 //Fill IV(ExtIV,RSNHDR)
2512 //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2513 //---------------------------
2514 // S/W or H/W Encryption
2515 //---------------------------
2516 //Fill MICHDR
2517 //if (pDevice->bAES) {
2518 // s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize);
2520 do {
2521 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2522 (pDevice->bLinkPass == true)) {
2523 pbyBSSID = pDevice->abyBSSID;
2524 // get pairwise key
2525 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2526 // get group key
2527 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2528 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get GTK.\n");
2529 break;
2531 } else {
2532 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get PTK.\n");
2533 break;
2536 // get group key
2537 pbyBSSID = pDevice->abyBroadcastAddr;
2538 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2539 pTransmitKey = NULL;
2540 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2541 } else {
2542 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get GTK.\n");
2544 } while (false);
2545 //Fill TXKEY
2546 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2547 (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2549 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2550 memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2551 cbFrameBodySize);
2553 else {
2554 // Copy the Packet into a tx Buffer
2555 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2558 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2559 pDevice->wSeqCounter++;
2560 if (pDevice->wSeqCounter > 0x0fff)
2561 pDevice->wSeqCounter = 0;
2563 if (bIsPSPOLL) {
2564 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2565 // of FIFO control header.
2566 // This will cause AID-field of PS-POLL packet to be incorrect (Because PS-POLL's AID field is
2567 // in the same place of other packet's Duration-field).
2568 // And it will cause Cisco-AP to issue Disassociation-packet
2569 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2570 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2571 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2572 } else {
2573 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2578 // first TD is the only TD
2579 //Set TSR1 & ReqCount in TxDescHead
2580 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2581 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2582 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2583 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2584 pFrstTD->pTDInfo->byFlags = 0;
2586 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2587 // Disable PS
2588 MACbPSWakeup(pDevice->PortOffset);
2590 pDevice->bPWBitOn = false;
2592 wmb();
2593 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2594 wmb();
2596 pDevice->iTDUsed[TYPE_TXDMA0]++;
2598 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
2599 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2602 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2604 #ifdef TxInSleep
2605 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2606 #endif
2608 // Poll Transmit the adapter
2609 MACvTransmit0(pDevice->PortOffset);
2611 return CMD_STATUS_PENDING;
2616 CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2618 unsigned char byPktType;
2619 unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2620 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2621 unsigned int cbHeaderSize = 0;
2622 unsigned short wTxBufSize = sizeof(STxShortBufHead);
2623 PSTxShortBufHead pTxBufHead = (PSTxShortBufHead) pbyBuffer;
2624 PSTxDataHead_ab pTxDataHead = (PSTxDataHead_ab) (pbyBuffer + wTxBufSize);
2625 PS802_11Header pMACHeader;
2626 unsigned short wCurrentRate;
2627 unsigned short wLen = 0x0000;
2630 memset(pTxBufHead, 0, wTxBufSize);
2632 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2633 wCurrentRate = RATE_6M;
2634 byPktType = PK_TYPE_11A;
2635 } else {
2636 wCurrentRate = RATE_2M;
2637 byPktType = PK_TYPE_11B;
2640 //Set Preamble type always long
2641 pDevice->byPreambleType = PREAMBLE_LONG;
2643 //Set FIFOCTL_GENINT
2645 pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2648 //Set packet type & Get Duration
2649 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2650 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, byPktType,
2651 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2653 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2654 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2655 pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, byPktType,
2656 wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2659 BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, byPktType,
2660 (unsigned short *)&(wLen), (unsigned char *)&(pTxDataHead->byServiceField), (unsigned char *)&(pTxDataHead->bySignalField)
2662 pTxDataHead->wTransmitLength = cpu_to_le16(wLen);
2663 //Get TimeStampOff
2664 pTxDataHead->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
2665 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2667 //Generate Beacon Header
2668 pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2669 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2671 pMACHeader->wDurationID = 0;
2672 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2673 pDevice->wSeqCounter++;
2674 if (pDevice->wSeqCounter > 0x0fff)
2675 pDevice->wSeqCounter = 0;
2677 // Set Beacon buffer length
2678 pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2680 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2682 MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2683 // Set auto Transmit on
2684 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2685 // Poll Transmit the adapter
2686 MACvTransmitBCN(pDevice->PortOffset);
2688 return CMD_STATUS_PENDING;
2693 unsigned int
2694 cbGetFragCount(
2695 PSDevice pDevice,
2696 PSKeyItem pTransmitKey,
2697 unsigned int cbFrameBodySize,
2698 PSEthernetHeader psEthHeader
2701 unsigned int cbMACHdLen;
2702 unsigned int cbFrameSize;
2703 unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2704 unsigned int cbFragPayloadSize;
2705 unsigned int cbLastFragPayloadSize;
2706 unsigned int cbIVlen = 0;
2707 unsigned int cbICVlen = 0;
2708 unsigned int cbMIClen = 0;
2709 unsigned int cbFCSlen = 4;
2710 unsigned int uMACfragNum = 1;
2711 bool bNeedACK;
2715 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2716 (pDevice->eOPMode == OP_MODE_AP)) {
2717 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2718 bNeedACK = false;
2719 else
2720 bNeedACK = true;
2722 else {
2723 // MSDUs in Infra mode always need ACK
2724 bNeedACK = true;
2727 if (pDevice->bLongHeader)
2728 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2729 else
2730 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2733 if (pDevice->bEncryptionEnable == true) {
2735 if (pTransmitKey == NULL) {
2736 if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2737 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2738 cbIVlen = 4;
2739 cbICVlen = 4;
2740 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2741 cbIVlen = 8;//IV+ExtIV
2742 cbMIClen = 8;
2743 cbICVlen = 4;
2744 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2745 cbIVlen = 8;//RSN Header
2746 cbICVlen = 8;//MIC
2748 } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2749 cbIVlen = 4;
2750 cbICVlen = 4;
2751 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2752 cbIVlen = 8;//IV+ExtIV
2753 cbMIClen = 8;
2754 cbICVlen = 4;
2755 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2756 cbIVlen = 8;//RSN Header
2757 cbICVlen = 8;//MIC
2761 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2763 if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2764 // Fragmentation
2765 cbFragmentSize = pDevice->wFragmentationThreshold;
2766 cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2767 uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2768 cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2769 if (cbLastFragPayloadSize == 0) {
2770 cbLastFragPayloadSize = cbFragPayloadSize;
2771 } else {
2772 uMACfragNum++;
2775 return uMACfragNum;
2779 void
2780 vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb, unsigned char *pbMPDU, unsigned int cbMPDULen) {
2782 PSTxDesc pFrstTD;
2783 unsigned char byPktType;
2784 unsigned char *pbyTxBufferAddr;
2785 void *pvRTS;
2786 void *pvCTS;
2787 void *pvTxDataHd;
2788 unsigned int uDuration;
2789 unsigned int cbReqCount;
2790 PS802_11Header pMACHeader;
2791 unsigned int cbHeaderSize;
2792 unsigned int cbFrameBodySize;
2793 bool bNeedACK;
2794 bool bIsPSPOLL = false;
2795 PSTxBufHead pTxBufHead;
2796 unsigned int cbFrameSize;
2797 unsigned int cbIVlen = 0;
2798 unsigned int cbICVlen = 0;
2799 unsigned int cbMIClen = 0;
2800 unsigned int cbFCSlen = 4;
2801 unsigned int uPadding = 0;
2802 unsigned int cbMICHDR = 0;
2803 unsigned int uLength = 0;
2804 unsigned long dwMICKey0, dwMICKey1;
2805 unsigned long dwMIC_Priority;
2806 unsigned long *pdwMIC_L;
2807 unsigned long *pdwMIC_R;
2808 unsigned short wTxBufSize;
2809 unsigned int cbMacHdLen;
2810 SEthernetHeader sEthHeader;
2811 void *pvRrvTime;
2812 void *pMICHDR;
2813 PSMgmtObject pMgmt = pDevice->pMgmt;
2814 unsigned short wCurrentRate = RATE_1M;
2815 PUWLAN_80211HDR p80211Header;
2816 unsigned int uNodeIndex = 0;
2817 bool bNodeExist = false;
2818 SKeyItem STempKey;
2819 PSKeyItem pTransmitKey = NULL;
2820 unsigned char *pbyIVHead;
2821 unsigned char *pbyPayloadHead;
2822 unsigned char *pbyMacHdr;
2824 unsigned int cbExtSuppRate = 0;
2825 // PWLAN_IE pItem;
2828 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2830 if (cbMPDULen <= WLAN_HDR_ADDR3_LEN) {
2831 cbFrameBodySize = 0;
2833 else {
2834 cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2836 p80211Header = (PUWLAN_80211HDR)pbMPDU;
2839 pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2840 pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2841 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2842 wTxBufSize = sizeof(STxBufHead);
2843 memset(pTxBufHead, 0, wTxBufSize);
2845 if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2846 wCurrentRate = RATE_6M;
2847 byPktType = PK_TYPE_11A;
2848 } else {
2849 wCurrentRate = RATE_1M;
2850 byPktType = PK_TYPE_11B;
2853 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2854 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2855 // And cmd timer will wait data pkt TX to finish before scanning so it's OK
2856 // to set power here.
2857 if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2858 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2859 } else {
2860 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2862 pTxBufHead->byTxPower = pDevice->byCurPwr;
2864 //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2865 if (pDevice->byFOETuning) {
2866 if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2867 wCurrentRate = RATE_24M;
2868 byPktType = PK_TYPE_11GA;
2872 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2874 //Set packet type
2875 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2876 pTxBufHead->wFIFOCtl = 0;
2878 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2879 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2881 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2882 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2884 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2885 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2888 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2889 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2892 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2893 bNeedACK = false;
2894 if (pDevice->bEnableHostWEP) {
2895 uNodeIndex = 0;
2896 bNodeExist = true;
2899 else {
2900 if (pDevice->bEnableHostWEP) {
2901 if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2902 bNodeExist = true;
2904 bNeedACK = true;
2905 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2908 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2909 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
2911 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2912 //Set Preamble type always long
2913 //pDevice->byPreambleType = PREAMBLE_LONG;
2915 // probe-response don't retry
2916 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2917 // bNeedACK = false;
2918 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2922 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2924 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2925 bIsPSPOLL = true;
2926 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2927 } else {
2928 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2931 // hostapd deamon ext support rate patch
2932 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2934 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2935 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2938 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2939 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2942 if (cbExtSuppRate > 0) {
2943 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2948 //Set FRAGCTL_MACHDCNT
2949 pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2951 // Notes:
2952 // Although spec says MMPDU can be fragmented; In most cases,
2953 // no one will send a MMPDU under fragmentation. With RTS may occur.
2954 pDevice->bAES = false; //Set FRAGCTL_WEPTYP
2957 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2958 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2959 cbIVlen = 4;
2960 cbICVlen = 4;
2961 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2963 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2964 cbIVlen = 8;//IV+ExtIV
2965 cbMIClen = 8;
2966 cbICVlen = 4;
2967 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2968 //We need to get seed here for filling TxKey entry.
2969 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2970 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2972 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2973 cbIVlen = 8;//RSN Header
2974 cbICVlen = 8;//MIC
2975 cbMICHDR = sizeof(SMICHDRHead);
2976 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2977 pDevice->bAES = true;
2979 //MAC Header should be padding 0 to DW alignment.
2980 uPadding = 4 - (cbMacHdLen%4);
2981 uPadding %= 4;
2984 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2986 //Set FIFOCTL_GrpAckPolicy
2987 if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2988 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2990 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2993 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2995 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2996 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2997 pvRTS = NULL;
2998 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2999 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
3000 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
3003 else {//802.11a/b packet
3005 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
3006 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
3007 pvRTS = NULL;
3008 pvCTS = NULL;
3009 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
3010 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
3014 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
3015 memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
3016 memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
3017 //=========================
3018 // No Fragmentation
3019 //=========================
3020 pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
3023 //Fill FIFO,RrvTime,RTS,and CTS
3024 s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
3025 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
3027 //Fill DataHead
3028 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
3029 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
3031 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
3033 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
3035 pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
3036 pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
3037 pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
3039 // Copy the Packet into a tx Buffer
3040 memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
3042 // version set to 0, patch for hostapd deamon
3043 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
3044 memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
3046 // replace support rate, patch for hostapd deamon(only support 11M)
3047 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
3048 if (cbExtSuppRate != 0) {
3049 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
3050 memcpy((pbyPayloadHead + cbFrameBodySize),
3051 pMgmt->abyCurrSuppRates,
3052 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
3054 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
3055 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
3056 pMgmt->abyCurrExtSuppRates,
3057 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3062 // Set wep
3063 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
3065 if (pDevice->bEnableHostWEP) {
3066 pTransmitKey = &STempKey;
3067 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3068 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3069 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3070 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3071 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3072 memcpy(pTransmitKey->abyKey,
3073 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3074 pTransmitKey->uKeyLength
3078 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
3080 dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
3081 dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
3083 // DO Software Michael
3084 MIC_vInit(dwMICKey0, dwMICKey1);
3085 MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
3086 dwMIC_Priority = 0;
3087 MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
3088 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
3090 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
3092 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
3094 pdwMIC_L = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
3095 pdwMIC_R = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
3097 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
3098 MIC_vUnInit();
3100 if (pDevice->bTxMICFail == true) {
3101 *pdwMIC_L = 0;
3102 *pdwMIC_R = 0;
3103 pDevice->bTxMICFail = false;
3106 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "uLength: %d, %d\n", uLength, cbFrameBodySize);
3107 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
3108 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
3113 s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
3114 pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
3116 if (pDevice->bEnableHostWEP) {
3117 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
3118 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
3121 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
3122 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
3126 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
3127 pDevice->wSeqCounter++;
3128 if (pDevice->wSeqCounter > 0x0fff)
3129 pDevice->wSeqCounter = 0;
3132 if (bIsPSPOLL) {
3133 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
3134 // of FIFO control header.
3135 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
3136 // in the same place of other packet's Duration-field).
3137 // And it will cause Cisco-AP to issue Disassociation-packet
3138 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
3139 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
3140 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
3141 } else {
3142 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
3147 // first TD is the only TD
3148 //Set TSR1 & ReqCount in TxDescHead
3149 pFrstTD->pTDInfo->skb = skb;
3150 pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
3151 pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
3152 pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
3153 pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
3154 pFrstTD->pTDInfo->byFlags = 0;
3155 pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
3157 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
3158 // Disable PS
3159 MACbPSWakeup(pDevice->PortOffset);
3161 pDevice->bPWBitOn = false;
3163 wmb();
3164 pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
3165 wmb();
3167 pDevice->iTDUsed[TYPE_TXDMA0]++;
3169 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
3170 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
3173 pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
3175 // Poll Transmit the adapter
3176 MACvTransmit0(pDevice->PortOffset);
3178 return;