gma500: udelay(20000) it too long again
[pandora-kernel.git] / drivers / staging / vt6655 / rxtx.c
1 /*
2  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3  * All rights reserved.
4  *
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.
9  *
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.
14  *
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.
18  *
19  * File: rxtx.c
20  *
21  * Purpose: handle WMAC/802.3/802.11 rx & tx functions
22  *
23  * Author: Lyndon Chen
24  *
25  * Date: May 20, 2003
26  *
27  * Functions:
28  *      s_vGenerateTxParameter - Generate tx dma required parameter.
29  *      vGenerateMACHeader - Translate 802.3 to 802.11 header
30  *      cbGetFragCount - Caculate 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
46  *
47  * Revision History:
48  *
49  */
50
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"
65
66 /*---------------------  Static Definitions -------------------------*/
67
68 /*---------------------  Static Classes  ----------------------------*/
69
70 /*---------------------  Static Variables  --------------------------*/
71 //static int          msglevel                =MSG_LEVEL_DEBUG;
72 static int          msglevel                =MSG_LEVEL_INFO;
73
74 #define PLICE_DEBUG
75
76
77 /*---------------------  Static Functions  --------------------------*/
78
79 /*---------------------  Static Definitions -------------------------*/
80 #define CRITICAL_PACKET_LEN      256    // if packet size < 256 -> in-direct send
81                                         //    packet size >= 256 -> direct send
82
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
86     };
87
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
91     };
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
95     };
96
97
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
112
113 /*---------------------  Static Functions  --------------------------*/
114
115
116
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
127     );
128
129
130
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
143     );
144
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
159     );
160
161
162
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
170     );
171
172
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);
178
179
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
194     );
195
196
197 /*---------------------  Export Variables  --------------------------*/
198
199
200
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
211     )
212 {
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;
219
220
221
222     //Fill TXKEY
223     if (pTransmitKey == NULL)
224         return;
225
226     dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
227     *pdwIV = pDevice->dwIVCounter;
228     byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
229
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);
240             }
241             memcpy(pDevice->abyPRNG, pbyBuf, 16);
242         }
243         // Append IV after Mac Header
244         *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
245         *pdwIV |= (byKeyIndex << 30);
246         *pdwIV = cpu_to_le32(*pdwIV);
247         pDevice->dwIVCounter++;
248         if (pDevice->dwIVCounter > WEP_IV_MASK) {
249             pDevice->dwIVCounter = 0;
250         }
251     } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
252         pTransmitKey->wTSC15_0++;
253         if (pTransmitKey->wTSC15_0 == 0) {
254             pTransmitKey->dwTSC47_16++;
255         }
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);
261
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);
266
267     } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
268         pTransmitKey->wTSC15_0++;
269         if (pTransmitKey->wTSC15_0 == 0) {
270             pTransmitKey->dwTSC47_16++;
271         }
272         memcpy(pbyBuf, pTransmitKey->abyKey, 16);
273
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);
280
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);
293
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]
300         }
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);
305
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);
314         }
315     }
316 }
317
318
319 static
320 void
321 s_vSWencryption (
322     PSDevice            pDevice,
323     PSKeyItem           pTransmitKey,
324     unsigned char *pbyPayloadHead,
325     unsigned short wPayloadSize
326     )
327 {
328     unsigned int cbICVlen = 4;
329     unsigned long dwICV = 0xFFFFFFFFL;
330     unsigned long *pdwICV;
331
332     if (pTransmitKey == NULL)
333         return;
334
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         //=======================================================================
357     }
358 }
359
360
361
362
363 /*byPktType : PK_TYPE_11A     0
364              PK_TYPE_11B     1
365              PK_TYPE_11GB    2
366              PK_TYPE_11GA    3
367 */
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
376     )
377 {
378     unsigned int uDataTime, uAckTime;
379
380     uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
381 #ifdef  PLICE_DEBUG
382         //printk("s_uGetTxRsvTime is %d\n",uDataTime);
383 #endif
384     if (byPktType == PK_TYPE_11B) {//llb,CCK mode
385         uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopCCKBasicRate);
386     } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
387         uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (unsigned short)pDevice->byTopOFDMBasicRate);
388     }
389
390     if (bNeedAck) {
391         return (uDataTime + pDevice->uSIFS + uAckTime);
392     }
393     else {
394         return uDataTime;
395     }
396 }
397
398 //byFreqType: 0=>5GHZ 1=>2.4GHZ
399 static
400 unsigned int
401 s_uGetRTSCTSRsvTime (
402     PSDevice pDevice,
403     unsigned char byRTSRsvType,
404     unsigned char byPktType,
405     unsigned int cbFrameLength,
406     unsigned short wCurrentRate
407     )
408 {
409     unsigned int uRrvTime  , uRTSTime, uCTSTime, uAckTime, uDataTime;
410
411     uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
412
413
414     uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
415     if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
416         uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
417         uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
418     }
419     else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
420         uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
421         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
422         uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
423     }
424     else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
425         uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
426         uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
427     }
428     else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
429         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
430         uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
431         uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
432         return uRrvTime;
433     }
434
435     //RTSRrvTime
436     uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
437     return uRrvTime;
438 }
439
440 //byFreqType 0: 5GHz, 1:2.4Ghz
441 static
442 unsigned int
443 s_uGetDataDuration (
444     PSDevice pDevice,
445     unsigned char byDurType,
446     unsigned int cbFrameLength,
447     unsigned char byPktType,
448     unsigned short wRate,
449     bool bNeedAck,
450     unsigned int uFragIdx,
451     unsigned int cbLastFragmentSize,
452     unsigned int uMACfragNum,
453     unsigned char byFBOption
454     )
455 {
456     bool bLastFrag = 0;
457     unsigned int uAckTime =0, uNextPktTime = 0;
458
459
460
461     if (uFragIdx == (uMACfragNum-1)) {
462         bLastFrag = 1;
463     }
464
465
466     switch (byDurType) {
467
468     case DATADUR_B:    //DATADUR_B
469         if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
470             if (bNeedAck) {
471                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
472                 return (pDevice->uSIFS + uAckTime);
473             } else {
474                 return 0;
475             }
476         }
477         else {//First Frag or Mid Frag
478             if (uFragIdx == (uMACfragNum-2)) {
479                 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
480             } else {
481                 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
482             }
483             if (bNeedAck) {
484                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
485                 return (pDevice->uSIFS + uAckTime + uNextPktTime);
486             } else {
487                 return (pDevice->uSIFS + uNextPktTime);
488             }
489         }
490         break;
491
492     case DATADUR_A:    //DATADUR_A
493         if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
494             if(bNeedAck){
495                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
496                 return (pDevice->uSIFS + uAckTime);
497             } else {
498                 return 0;
499             }
500         }
501         else {//First Frag or Mid Frag
502             if(uFragIdx == (uMACfragNum-2)){
503                 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
504             } else {
505                 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
506             }
507             if(bNeedAck){
508                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
509                 return (pDevice->uSIFS + uAckTime + uNextPktTime);
510             } else {
511                 return (pDevice->uSIFS + uNextPktTime);
512             }
513         }
514         break;
515
516     case DATADUR_A_F0:    //DATADUR_A_F0
517             if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
518             if(bNeedAck){
519                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
520                 return (pDevice->uSIFS + uAckTime);
521             } else {
522                 return 0;
523             }
524         }
525             else { //First Frag or Mid Frag
526                 if (byFBOption == AUTO_FB_0) {
527                 if (wRate < RATE_18M)
528                     wRate = RATE_18M;
529                 else if (wRate > RATE_54M)
530                     wRate = RATE_54M;
531
532                     if(uFragIdx == (uMACfragNum-2)){
533                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
534                 } else {
535                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
536                 }
537                 } else { // (byFBOption == AUTO_FB_1)
538                 if (wRate < RATE_18M)
539                     wRate = RATE_18M;
540                 else if (wRate > RATE_54M)
541                     wRate = RATE_54M;
542
543                     if(uFragIdx == (uMACfragNum-2)){
544                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
545                 } else {
546                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
547                 }
548                 }
549
550                 if(bNeedAck){
551                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
552                 return (pDevice->uSIFS + uAckTime + uNextPktTime);
553             } else {
554                 return (pDevice->uSIFS + uNextPktTime);
555             }
556             }
557         break;
558
559     case DATADUR_A_F1:    //DATADUR_A_F1
560         if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
561             if(bNeedAck){
562                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
563                 return (pDevice->uSIFS + uAckTime);
564             } else {
565                 return 0;
566             }
567         }
568             else { //First Frag or Mid Frag
569                 if (byFBOption == AUTO_FB_0) {
570                 if (wRate < RATE_18M)
571                     wRate = RATE_18M;
572                 else if (wRate > RATE_54M)
573                     wRate = RATE_54M;
574
575                     if(uFragIdx == (uMACfragNum-2)){
576                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
577                 } else {
578                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
579                 }
580
581                 } else { // (byFBOption == AUTO_FB_1)
582                 if (wRate < RATE_18M)
583                     wRate = RATE_18M;
584                 else if (wRate > RATE_54M)
585                     wRate = RATE_54M;
586
587                     if(uFragIdx == (uMACfragNum-2)){
588                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
589                 } else {
590                     uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
591                 }
592                 }
593                 if(bNeedAck){
594                 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
595                 return (pDevice->uSIFS + uAckTime + uNextPktTime);
596             } else {
597                 return (pDevice->uSIFS + uNextPktTime);
598             }
599             }
600         break;
601
602     default:
603         break;
604     }
605
606         ASSERT(false);
607         return 0;
608 }
609
610
611 //byFreqType: 0=>5GHZ 1=>2.4GHZ
612 static
613 unsigned int
614 s_uGetRTSCTSDuration (
615     PSDevice pDevice,
616     unsigned char byDurType,
617     unsigned int cbFrameLength,
618     unsigned char byPktType,
619     unsigned short wRate,
620     bool bNeedAck,
621     unsigned char byFBOption
622     )
623 {
624     unsigned int uCTSTime = 0, uDurTime = 0;
625
626
627     switch (byDurType) {
628
629     case RTSDUR_BB:    //RTSDuration_bb
630         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
631         uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
632         break;
633
634     case RTSDUR_BA:    //RTSDuration_ba
635         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
636         uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
637         break;
638
639     case RTSDUR_AA:    //RTSDuration_aa
640         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
641         uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
642         break;
643
644     case CTSDUR_BA:    //CTSDuration_ba
645         uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
646         break;
647
648     case RTSDUR_BA_F0: //RTSDuration_ba_f0
649         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
650         if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
651             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
652         } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
653             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
654         }
655         break;
656
657     case RTSDUR_AA_F0: //RTSDuration_aa_f0
658         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
659         if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
660             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
661         } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
662             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
663         }
664         break;
665
666     case RTSDUR_BA_F1: //RTSDuration_ba_f1
667         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
668         if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
669             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
670         } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
671             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
672         }
673         break;
674
675     case RTSDUR_AA_F1: //RTSDuration_aa_f1
676         uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
677         if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
678             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
679         } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
680             uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
681         }
682         break;
683
684     case CTSDUR_BA_F0: //CTSDuration_ba_f0
685         if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
686             uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
687         } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
688             uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
689         }
690         break;
691
692     case CTSDUR_BA_F1: //CTSDuration_ba_f1
693         if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
694             uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
695         } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
696             uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
697         }
698         break;
699
700     default:
701         break;
702     }
703
704     return uDurTime;
705
706 }
707
708
709
710 static
711 unsigned int
712 s_uFillDataHead (
713     PSDevice pDevice,
714     unsigned char byPktType,
715     void *   pTxDataHead,
716     unsigned int cbFrameLength,
717     unsigned int uDMAIdx,
718     bool bNeedAck,
719     unsigned int uFragIdx,
720     unsigned int cbLastFragmentSize,
721     unsigned int uMACfragNum,
722     unsigned char byFBOption,
723     unsigned short wCurrentRate
724     )
725 {
726     unsigned short wLen = 0x0000;
727
728     if (pTxDataHead == NULL) {
729         return 0;
730     }
731
732     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
733         if (byFBOption == AUTO_FB_NONE) {
734             PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
735             //Get SignalField,ServiceField,Length
736             BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
737                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
738             );
739             pBuf->wTransmitLength_a = cpu_to_le16(wLen);
740             BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
741                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
742             );
743             pBuf->wTransmitLength_b = cpu_to_le16(wLen);
744             //Get Duration and TimeStamp
745             pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
746                                                          byPktType, wCurrentRate, bNeedAck, uFragIdx,
747                                                          cbLastFragmentSize, uMACfragNum,
748                                                          byFBOption)); //1: 2.4GHz
749             pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
750                                                          PK_TYPE_11B, pDevice->byTopCCKBasicRate,
751                                                          bNeedAck, uFragIdx, cbLastFragmentSize,
752                                                          uMACfragNum, byFBOption)); //1: 2.4
753
754             pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
755             pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
756
757             return (pBuf->wDuration_a);
758          } else {
759             // Auto Fallback
760             PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
761             //Get SignalField,ServiceField,Length
762             BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
763                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
764             );
765             pBuf->wTransmitLength_a = cpu_to_le16(wLen);
766             BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
767                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
768             );
769             pBuf->wTransmitLength_b = cpu_to_le16(wLen);
770             //Get Duration and TimeStamp
771             pBuf->wDuration_a = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
772                                          wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
773             pBuf->wDuration_b = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
774                                          pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
775             pBuf->wDuration_a_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
776                                          wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
777             pBuf->wDuration_a_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
778                                          wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //1: 2.4GHz
779
780             pBuf->wTimeStampOff_a = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
781             pBuf->wTimeStampOff_b = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]);
782
783             return (pBuf->wDuration_a);
784         } //if (byFBOption == AUTO_FB_NONE)
785     }
786     else if (byPktType == PK_TYPE_11A) {
787         if ((byFBOption != AUTO_FB_NONE)) {
788             // Auto Fallback
789             PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
790             //Get SignalField,ServiceField,Length
791             BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
792                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
793             );
794             pBuf->wTransmitLength = cpu_to_le16(wLen);
795             //Get Duration and TimeStampOff
796
797             pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
798                                         wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
799             pBuf->wDuration_f0 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
800                                         wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
801             pBuf->wDuration_f1 = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
802                                         wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption)); //0: 5GHz
803             pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
804             return (pBuf->wDuration);
805         } else {
806             PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
807             //Get SignalField,ServiceField,Length
808             BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
809                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
810             );
811             pBuf->wTransmitLength = cpu_to_le16(wLen);
812             //Get Duration and TimeStampOff
813
814             pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
815                                                        wCurrentRate, bNeedAck, uFragIdx,
816                                                        cbLastFragmentSize, uMACfragNum,
817                                                        byFBOption));
818
819             pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
820             return (pBuf->wDuration);
821         }
822     }
823     else {
824             PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
825             //Get SignalField,ServiceField,Length
826             BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
827                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
828             );
829             pBuf->wTransmitLength = cpu_to_le16(wLen);
830             //Get Duration and TimeStampOff
831             pBuf->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
832                                                        wCurrentRate, bNeedAck, uFragIdx,
833                                                        cbLastFragmentSize, uMACfragNum,
834                                                        byFBOption));
835             pBuf->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
836             return (pBuf->wDuration);
837     }
838     return 0;
839 }
840
841
842 static
843 void
844 s_vFillRTSHead (
845     PSDevice         pDevice,
846     unsigned char byPktType,
847     void *           pvRTS,
848     unsigned int cbFrameLength,
849     bool bNeedAck,
850     bool bDisCRC,
851     PSEthernetHeader psEthHeader,
852     unsigned short wCurrentRate,
853     unsigned char byFBOption
854     )
855 {
856     unsigned int uRTSFrameLen = 20;
857     unsigned short wLen = 0x0000;
858
859     if (pvRTS == NULL)
860         return;
861
862     if (bDisCRC) {
863         // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
864         // in this case we need to decrease its length by 4.
865         uRTSFrameLen -= 4;
866     }
867
868     // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
869     //       Otherwise, we need to modify codes for them.
870     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
871         if (byFBOption == AUTO_FB_NONE) {
872             PSRTS_g pBuf = (PSRTS_g)pvRTS;
873             //Get SignalField,ServiceField,Length
874             BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
875                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
876             );
877             pBuf->wTransmitLength_b = cpu_to_le16(wLen);
878             BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
879                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
880             );
881             pBuf->wTransmitLength_a = cpu_to_le16(wLen);
882             //Get Duration
883             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
884             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
885             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
886
887             pBuf->Data.wDurationID = pBuf->wDuration_aa;
888             //Get RTS Frame body
889             pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
890             if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
891                 (pDevice->eOPMode == OP_MODE_AP)) {
892                 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
893             }
894             else {
895                 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
896             }
897             if (pDevice->eOPMode == OP_MODE_AP) {
898                 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
899             }
900             else {
901                 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
902             }
903         }
904         else {
905            PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
906             //Get SignalField,ServiceField,Length
907             BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
908                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
909             );
910             pBuf->wTransmitLength_b = cpu_to_le16(wLen);
911             BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
912                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_a), (unsigned char *)&(pBuf->bySignalField_a)
913             );
914             pBuf->wTransmitLength_a = cpu_to_le16(wLen);
915
916             //Get Duration
917             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
918             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
919             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
920             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
921             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
922             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
923             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
924             pBuf->Data.wDurationID = pBuf->wDuration_aa;
925             //Get RTS Frame body
926             pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
927
928             if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
929                 (pDevice->eOPMode == OP_MODE_AP)) {
930                 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
931             }
932             else {
933                 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
934             }
935
936             if (pDevice->eOPMode == OP_MODE_AP) {
937                 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
938             }
939             else {
940                 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
941             }
942
943         } // if (byFBOption == AUTO_FB_NONE)
944     }
945     else if (byPktType == PK_TYPE_11A) {
946         if (byFBOption == AUTO_FB_NONE) {
947             PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
948             //Get SignalField,ServiceField,Length
949             BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
950                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
951             );
952             pBuf->wTransmitLength = cpu_to_le16(wLen);
953             //Get Duration
954             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
955             pBuf->Data.wDurationID = pBuf->wDuration;
956             //Get RTS Frame body
957             pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
958
959             if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
960                 (pDevice->eOPMode == OP_MODE_AP)) {
961                 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
962             }
963             else {
964                 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
965             }
966
967             if (pDevice->eOPMode == OP_MODE_AP) {
968                 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
969             }
970             else {
971                 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
972             }
973
974         }
975         else {
976             PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
977             //Get SignalField,ServiceField,Length
978             BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
979                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
980             );
981             pBuf->wTransmitLength = cpu_to_le16(wLen);
982             //Get Duration
983             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
984             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
985             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:
986             pBuf->Data.wDurationID = pBuf->wDuration;
987             //Get RTS Frame body
988             pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
989
990             if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
991                 (pDevice->eOPMode == OP_MODE_AP)) {
992                 memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
993             }
994             else {
995                 memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
996             }
997             if (pDevice->eOPMode == OP_MODE_AP) {
998                 memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
999             }
1000             else {
1001                 memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
1002             }
1003         }
1004     }
1005     else if (byPktType == PK_TYPE_11B) {
1006         PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1007         //Get SignalField,ServiceField,Length
1008         BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1009             (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField), (unsigned char *)&(pBuf->bySignalField)
1010         );
1011         pBuf->wTransmitLength = cpu_to_le16(wLen);
1012         //Get Duration
1013         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
1014         pBuf->Data.wDurationID = pBuf->wDuration;
1015         //Get RTS Frame body
1016         pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1017
1018
1019         if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1020             (pDevice->eOPMode == OP_MODE_AP)) {
1021             memcpy(&(pBuf->Data.abyRA[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
1022         }
1023         else {
1024             memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1025         }
1026
1027         if (pDevice->eOPMode == OP_MODE_AP) {
1028             memcpy(&(pBuf->Data.abyTA[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1029         }
1030         else {
1031             memcpy(&(pBuf->Data.abyTA[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
1032         }
1033     }
1034 }
1035
1036 static
1037 void
1038 s_vFillCTSHead (
1039     PSDevice pDevice,
1040     unsigned int uDMAIdx,
1041     unsigned char byPktType,
1042     void *   pvCTS,
1043     unsigned int cbFrameLength,
1044     bool bNeedAck,
1045     bool bDisCRC,
1046     unsigned short wCurrentRate,
1047     unsigned char byFBOption
1048     )
1049 {
1050     unsigned int uCTSFrameLen = 14;
1051     unsigned short wLen = 0x0000;
1052
1053     if (pvCTS == NULL) {
1054         return;
1055     }
1056
1057     if (bDisCRC) {
1058         // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1059         // in this case we need to decrease its length by 4.
1060         uCTSFrameLen -= 4;
1061     }
1062
1063     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1064         if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1065             // Auto Fall back
1066             PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1067             //Get SignalField,ServiceField,Length
1068             BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1069                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1070             );
1071
1072
1073             pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1074
1075             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
1076             pBuf->wDuration_ba += pDevice->wCTSDuration;
1077             pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1078             //Get CTSDuration_ba_f0
1079             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
1080             pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1081             pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1082             //Get CTSDuration_ba_f1
1083             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
1084             pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1085             pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1086             //Get CTS Frame body
1087             pBuf->Data.wDurationID = pBuf->wDuration_ba;
1088             pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1089             pBuf->Data.wReserved = 0x0000;
1090             memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1091
1092         } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1093             PSCTS pBuf = (PSCTS)pvCTS;
1094             //Get SignalField,ServiceField,Length
1095             BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1096                 (unsigned short *)&(wLen), (unsigned char *)&(pBuf->byServiceField_b), (unsigned char *)&(pBuf->bySignalField_b)
1097             );
1098             pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1099             //Get CTSDuration_ba
1100             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
1101             pBuf->wDuration_ba += pDevice->wCTSDuration;
1102             pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1103
1104             //Get CTS Frame body
1105             pBuf->Data.wDurationID = pBuf->wDuration_ba;
1106             pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1107             pBuf->Data.wReserved = 0x0000;
1108             memcpy(&(pBuf->Data.abyRA[0]), &(pDevice->abyCurrentNetAddr[0]), ETH_ALEN);
1109         }
1110     }
1111 }
1112
1113
1114
1115
1116
1117
1118 /*+
1119  *
1120  * Description:
1121  *      Generate FIFO control for MAC & Baseband controller
1122  *
1123  * Parameters:
1124  *  In:
1125  *      pDevice         - Pointer to adapter
1126  *      pTxDataHead     - Transmit Data Buffer
1127  *      pTxBufHead      - pTxBufHead
1128  *      pvRrvTime        - pvRrvTime
1129  *      pvRTS            - RTS Buffer
1130  *      pCTS            - CTS Buffer
1131  *      cbFrameSize     - Transmit Data Length (Hdr+Payload+FCS)
1132  *      bNeedACK        - If need ACK
1133  *      uDescIdx        - Desc Index
1134  *  Out:
1135  *      none
1136  *
1137  * Return Value: none
1138  *
1139 -*/
1140 // unsigned int cbFrameSize,//Hdr+Payload+FCS
1141 static
1142 void
1143 s_vGenerateTxParameter (
1144     PSDevice         pDevice,
1145     unsigned char byPktType,
1146     void *           pTxBufHead,
1147     void *           pvRrvTime,
1148     void *           pvRTS,
1149     void *           pvCTS,
1150     unsigned int cbFrameSize,
1151     bool bNeedACK,
1152     unsigned int uDMAIdx,
1153     PSEthernetHeader psEthHeader,
1154     unsigned short wCurrentRate
1155     )
1156 {
1157     unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1158     unsigned short wFifoCtl;
1159     bool bDisCRC = false;
1160     unsigned char byFBOption = AUTO_FB_NONE;
1161 //    unsigned short wCurrentRate = pDevice->wCurrentRate;
1162
1163     //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1164     PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1165     pFifoHead->wReserved = wCurrentRate;
1166     wFifoCtl = pFifoHead->wFIFOCtl;
1167
1168     if (wFifoCtl & FIFOCTL_CRCDIS) {
1169         bDisCRC = true;
1170     }
1171
1172     if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1173         byFBOption = AUTO_FB_0;
1174     }
1175     else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1176         byFBOption = AUTO_FB_1;
1177     }
1178
1179     if (pDevice->bLongHeader)
1180         cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1181
1182     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1183
1184         if (pvRTS != NULL) { //RTS_need
1185             //Fill RsvTime
1186             if (pvRrvTime) {
1187                 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1188                 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1189                 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1190                 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1191                 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1192                 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1193             }
1194             //Fill RTS
1195             s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1196         }
1197         else {//RTS_needless, PCF mode
1198
1199             //Fill RsvTime
1200             if (pvRrvTime) {
1201                 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1202                 pBuf->wTxRrvTime_a = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1203                 pBuf->wTxRrvTime_b = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1204                 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1205             }
1206
1207
1208             //Fill CTS
1209             s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1210         }
1211     }
1212     else if (byPktType == PK_TYPE_11A) {
1213
1214         if (pvRTS != NULL) {//RTS_need, non PCF mode
1215             //Fill RsvTime
1216             if (pvRrvTime) {
1217                 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1218                 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1219                 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1220             }
1221             //Fill RTS
1222             s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1223         }
1224         else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1225             //Fill RsvTime
1226             if (pvRrvTime) {
1227                 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1228                 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1229             }
1230         }
1231     }
1232     else if (byPktType == PK_TYPE_11B) {
1233
1234         if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1235             //Fill RsvTime
1236             if (pvRrvTime) {
1237                 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1238                 pBuf->wRTSTxRrvTime = cpu_to_le16((unsigned short)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1239                 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1240             }
1241             //Fill RTS
1242             s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1243         }
1244         else { //RTS_needless, non PCF mode
1245             //Fill RsvTime
1246             if (pvRrvTime) {
1247                 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1248                 pBuf->wTxRrvTime = cpu_to_le16((unsigned short)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1249             }
1250         }
1251     }
1252     //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1253 }
1254 /*
1255     unsigned char *pbyBuffer,//point to pTxBufHead
1256     unsigned short wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1257     unsigned int cbFragmentSize,//Hdr+payoad+FCS
1258 */
1259 static
1260 void
1261 s_vFillFragParameter(
1262     PSDevice pDevice,
1263     unsigned char *pbyBuffer,
1264     unsigned int uTxType,
1265     void *   pvtdCurr,
1266     unsigned short wFragType,
1267     unsigned int cbReqCount
1268     )
1269 {
1270     PSTxBufHead pTxBufHead = (PSTxBufHead) pbyBuffer;
1271     //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vFillFragParameter...\n");
1272
1273     if (uTxType == TYPE_SYNCDMA) {
1274         //PSTxSyncDesc ptdCurr = (PSTxSyncDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1275         PSTxSyncDesc ptdCurr = (PSTxSyncDesc)pvtdCurr;
1276
1277          //Set FIFOCtl & TimeStamp in TxSyncDesc
1278         ptdCurr->m_wFIFOCtl = pTxBufHead->wFIFOCtl;
1279         ptdCurr->m_wTimeStamp = pTxBufHead->wTimeStamp;
1280         //Set TSR1 & ReqCount in TxDescHead
1281         ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1282         if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1283             ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1284         }
1285         else {
1286             ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1287         }
1288     }
1289     else {
1290         //PSTxDesc ptdCurr = (PSTxDesc)s_pvGetTxDescHead(pDevice, uTxType, uCurIdx);
1291         PSTxDesc ptdCurr = (PSTxDesc)pvtdCurr;
1292         //Set TSR1 & ReqCount in TxDescHead
1293         ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
1294         if (wFragType == FRAGCTL_ENDFRAG) { //Last Fragmentation
1295             ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1296         }
1297         else {
1298             ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP);
1299         }
1300     }
1301
1302     pTxBufHead->wFragCtl |= (unsigned short)wFragType;//0x0001; //0000 0000 0000 0001
1303
1304     //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vFillFragParameter END\n");
1305 }
1306
1307 static unsigned int
1308 s_cbFillTxBufHead(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
1309         unsigned int cbFrameBodySize, unsigned int uDMAIdx, PSTxDesc pHeadTD,
1310         PSEthernetHeader psEthHeader, unsigned char *pPacket, bool bNeedEncrypt,
1311         PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum)
1312 {
1313     unsigned int cbMACHdLen;
1314     unsigned int cbFrameSize;
1315     unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1316     unsigned int cbFragPayloadSize;
1317     unsigned int cbLastFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
1318     unsigned int cbLastFragPayloadSize;
1319     unsigned int uFragIdx;
1320     unsigned char *pbyPayloadHead;
1321     unsigned char *pbyIVHead;
1322     unsigned char *pbyMacHdr;
1323     unsigned short wFragType; //00:Non-Frag, 01:Start, 10:Mid, 11:Last
1324     unsigned int uDuration;
1325     unsigned char *pbyBuffer;
1326 //    unsigned int uKeyEntryIdx = NUM_KEY_ENTRY+1;
1327 //    unsigned char byKeySel = 0xFF;
1328     unsigned int cbIVlen = 0;
1329     unsigned int cbICVlen = 0;
1330     unsigned int cbMIClen = 0;
1331     unsigned int cbFCSlen = 4;
1332     unsigned int cb802_1_H_len = 0;
1333     unsigned int uLength = 0;
1334     unsigned int uTmpLen = 0;
1335 //    unsigned char abyTmp[8];
1336 //    unsigned long dwCRC;
1337     unsigned int cbMICHDR = 0;
1338     unsigned long dwMICKey0, dwMICKey1;
1339     unsigned long dwMIC_Priority;
1340     unsigned long *pdwMIC_L;
1341     unsigned long *pdwMIC_R;
1342     unsigned long dwSafeMIC_L, dwSafeMIC_R; //Fix "Last Frag Size" < "MIC length".
1343     bool bMIC2Frag = false;
1344     unsigned int uMICFragLen = 0;
1345     unsigned int uMACfragNum = 1;
1346     unsigned int uPadding = 0;
1347     unsigned int cbReqCount = 0;
1348
1349     bool bNeedACK;
1350     bool bRTS;
1351     bool bIsAdhoc;
1352     unsigned char *pbyType;
1353     PSTxDesc       ptdCurr;
1354     PSTxBufHead    psTxBufHd = (PSTxBufHead) pbyTxBufferAddr;
1355 //    unsigned int tmpDescIdx;
1356     unsigned int cbHeaderLength = 0;
1357     void *         pvRrvTime;
1358     PSMICHDRHead   pMICHDR;
1359     void *         pvRTS;
1360     void *         pvCTS;
1361     void *         pvTxDataHd;
1362     unsigned short wTxBufSize;   // FFinfo size
1363     unsigned int uTotalCopyLength = 0;
1364     unsigned char byFBOption = AUTO_FB_NONE;
1365     bool bIsWEP256 = false;
1366     PSMgmtObject    pMgmt = pDevice->pMgmt;
1367
1368
1369     pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1370
1371     //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_cbFillTxBufHead...\n");
1372     if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1373         (pDevice->eOPMode == OP_MODE_AP)) {
1374
1375         if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
1376                 bNeedACK = false;
1377         else
1378             bNeedACK = true;
1379         bIsAdhoc = true;
1380     }
1381     else {
1382         // MSDUs in Infra mode always need ACK
1383         bNeedACK = true;
1384         bIsAdhoc = false;
1385     }
1386
1387     if (pDevice->bLongHeader)
1388         cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1389     else
1390         cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1391
1392
1393     if ((bNeedEncrypt == true) && (pTransmitKey != NULL)) {
1394         if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1395             cbIVlen = 4;
1396             cbICVlen = 4;
1397             if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
1398                 bIsWEP256 = true;
1399             }
1400         }
1401         if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1402             cbIVlen = 8;//IV+ExtIV
1403             cbMIClen = 8;
1404             cbICVlen = 4;
1405         }
1406         if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1407             cbIVlen = 8;//RSN Header
1408             cbICVlen = 8;//MIC
1409             cbMICHDR = sizeof(SMICHDRHead);
1410         }
1411         if (pDevice->byLocalID > REV_ID_VT3253_A1) {
1412             //MAC Header should be padding 0 to DW alignment.
1413             uPadding = 4 - (cbMACHdLen%4);
1414             uPadding %= 4;
1415         }
1416     }
1417
1418
1419     cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1420
1421     if ((bNeedACK == false) ||
1422         (cbFrameSize < pDevice->wRTSThreshold) ||
1423         ((cbFrameSize >= pDevice->wFragmentationThreshold) && (pDevice->wFragmentationThreshold <= pDevice->wRTSThreshold))
1424         ) {
1425         bRTS = false;
1426     }
1427     else {
1428         bRTS = true;
1429         psTxBufHd->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1430     }
1431     //
1432     // Use for AUTO FALL BACK
1433     //
1434     if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
1435         byFBOption = AUTO_FB_0;
1436     }
1437     else if (psTxBufHd->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
1438         byFBOption = AUTO_FB_1;
1439     }
1440
1441     //////////////////////////////////////////////////////
1442     //Set RrvTime/RTS/CTS Buffer
1443     wTxBufSize = sizeof(STxBufHead);
1444     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1445
1446         if (byFBOption == AUTO_FB_NONE) {
1447             if (bRTS == true) {//RTS_need
1448                 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1449                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1450                 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1451                 pvCTS = NULL;
1452                 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1453                 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1454             }
1455             else { //RTS_needless
1456                 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1457                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1458                 pvRTS = NULL;
1459                 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1460                 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1461                 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1462             }
1463         } else {
1464             // Auto Fall Back
1465             if (bRTS == true) {//RTS_need
1466                 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1467                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1468                 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1469                 pvCTS = NULL;
1470                 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1471                 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1472             }
1473             else { //RTS_needless
1474                 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1475                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1476                 pvRTS = NULL;
1477                 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1478                 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1479                 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1480             }
1481         } // Auto Fall Back
1482     }
1483     else {//802.11a/b packet
1484
1485         if (byFBOption == AUTO_FB_NONE) {
1486             if (bRTS == true) {
1487                 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1488                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1489                 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1490                 pvCTS = NULL;
1491                 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1492                 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1493             }
1494             else { //RTS_needless, need MICHDR
1495                 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1496                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1497                 pvRTS = NULL;
1498                 pvCTS = NULL;
1499                 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1500                 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1501             }
1502         } else {
1503             // Auto Fall Back
1504             if (bRTS == true) {//RTS_need
1505                 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1506                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1507                 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1508                 pvCTS = NULL;
1509                 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1510                 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1511             }
1512             else { //RTS_needless
1513                 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1514                 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1515                 pvRTS = NULL;
1516                 pvCTS = NULL;
1517                 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1518                 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1519             }
1520         } // Auto Fall Back
1521     }
1522     memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
1523
1524 //////////////////////////////////////////////////////////////////
1525     if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1526         if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
1527             dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1528             dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1529         }
1530         else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1531             dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
1532             dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
1533         }
1534         else {
1535             dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[24]);
1536             dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[28]);
1537         }
1538         // DO Software Michael
1539         MIC_vInit(dwMICKey0, dwMICKey1);
1540         MIC_vAppend((unsigned char *)&(psEthHeader->abyDstAddr[0]), 12);
1541         dwMIC_Priority = 0;
1542         MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
1543         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1544     }
1545
1546 ///////////////////////////////////////////////////////////////////
1547
1548     pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderLength);
1549     pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1550     pbyIVHead = (unsigned char *)(pbyMacHdr + cbMACHdLen + uPadding);
1551
1552     if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true) && (bIsWEP256 == false)) {
1553         // Fragmentation
1554         // FragThreshold = Fragment size(Hdr+(IV)+fragment payload+(MIC)+(ICV)+FCS)
1555         cbFragmentSize = pDevice->wFragmentationThreshold;
1556         cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
1557         //FragNum = (FrameSize-(Hdr+FCS))/(Fragment Size -(Hrd+FCS)))
1558         uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
1559         cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
1560         if (cbLastFragPayloadSize == 0) {
1561             cbLastFragPayloadSize = cbFragPayloadSize;
1562         } else {
1563             uMACfragNum++;
1564         }
1565         //[Hdr+(IV)+last fragment payload+(MIC)+(ICV)+FCS]
1566         cbLastFragmentSize = cbMACHdLen + cbLastFragPayloadSize + cbIVlen + cbICVlen + cbFCSlen;
1567
1568         for (uFragIdx = 0; uFragIdx < uMACfragNum; uFragIdx ++) {
1569             if (uFragIdx == 0) {
1570                 //=========================
1571                 //    Start Fragmentation
1572                 //=========================
1573                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Start Fragmentation...\n");
1574                 wFragType = FRAGCTL_STAFRAG;
1575
1576
1577                 //Fill FIFO,RrvTime,RTS,and CTS
1578                 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1579                                        cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1580                 //Fill DataHead
1581                 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1582                                             uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1583                 // Generate TX MAC Header
1584                 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1585                                    wFragType, uDMAIdx, uFragIdx);
1586
1587                 if (bNeedEncrypt == true) {
1588                     //Fill TXKEY
1589                     s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1590                                  pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1591                     //Fill IV(ExtIV,RSNHDR)
1592                     if (pDevice->bEnableHostWEP) {
1593                         pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1594                         pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1595                     }
1596                 }
1597
1598
1599                 // 802.1H
1600                 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1601                     if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1602                         (psEthHeader->wType == cpu_to_le16(0xF380))) {
1603                         memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1604                     }
1605                     else {
1606                         memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1607                     }
1608                     pbyType = (unsigned char *) (pbyPayloadHead + 6);
1609                     memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1610                     cb802_1_H_len = 8;
1611                 }
1612
1613                 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1614                 //---------------------------
1615                 // S/W or H/W Encryption
1616                 //---------------------------
1617                 //Fill MICHDR
1618                 //if (pDevice->bAES) {
1619                 //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1620                 //}
1621                 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1622                 //                                pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1623
1624
1625
1626                 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1627                 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1628
1629                 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1630                 //copy TxBufferHeader + MacHeader to desc
1631                 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1632
1633                 // Copy the Packet into a tx Buffer
1634                 memcpy((pbyBuffer + uLength), (pPacket + 14), (cbFragPayloadSize - cb802_1_H_len));
1635
1636
1637                 uTotalCopyLength += cbFragPayloadSize - cb802_1_H_len;
1638
1639                 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1640                     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Start MIC: %d\n", cbFragPayloadSize);
1641                     MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFragPayloadSize);
1642
1643                 }
1644
1645                 //---------------------------
1646                 // S/W Encryption
1647                 //---------------------------
1648                 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1649                     if (bNeedEncrypt) {
1650                         s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len), (unsigned short)cbFragPayloadSize);
1651                         cbReqCount += cbICVlen;
1652                     }
1653                 }
1654
1655                 ptdCurr = (PSTxDesc)pHeadTD;
1656                 //--------------------
1657                 //1.Set TSR1 & ReqCount in TxDescHead
1658                 //2.Set FragCtl in TxBufferHead
1659                 //3.Set Frame Control
1660                 //4.Set Sequence Control
1661                 //5.Get S/W generate FCS
1662                 //--------------------
1663                 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1664
1665                 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1666                 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1667                 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1668                 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1669                 pDevice->iTDUsed[uDMAIdx]++;
1670                 pHeadTD = ptdCurr->next;
1671             }
1672             else if (uFragIdx == (uMACfragNum-1)) {
1673                 //=========================
1674                 //    Last Fragmentation
1675                 //=========================
1676                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Last Fragmentation...\n");
1677                 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1678
1679                 wFragType = FRAGCTL_ENDFRAG;
1680
1681                 //Fill FIFO,RrvTime,RTS,and CTS
1682                 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1683                                        cbLastFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1684                 //Fill DataHead
1685                 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbLastFragmentSize, uDMAIdx, bNeedACK,
1686                                             uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1687
1688                 // Generate TX MAC Header
1689                 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1690                                    wFragType, uDMAIdx, uFragIdx);
1691
1692                 if (bNeedEncrypt == true) {
1693                     //Fill TXKEY
1694                     s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1695                                  pbyMacHdr, (unsigned short)cbLastFragPayloadSize, (unsigned char *)pMICHDR);
1696
1697                     if (pDevice->bEnableHostWEP) {
1698                         pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1699                         pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1700                     }
1701
1702                 }
1703
1704
1705                 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbLastFragPayloadSize;
1706                 //---------------------------
1707                 // S/W or H/W Encryption
1708                 //---------------------------
1709
1710
1711
1712                 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1713                 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1714
1715                 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1716
1717                 //copy TxBufferHeader + MacHeader to desc
1718                 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1719
1720                 // Copy the Packet into a tx Buffer
1721                 if (bMIC2Frag == false) {
1722
1723                     memcpy((pbyBuffer + uLength),
1724                              (pPacket + 14 + uTotalCopyLength),
1725                              (cbLastFragPayloadSize - cbMIClen)
1726                              );
1727                     //TODO check uTmpLen !
1728                     uTmpLen = cbLastFragPayloadSize - cbMIClen;
1729
1730                 }
1731                 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1732                     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen:%d, cbLastFragPayloadSize:%d, uTmpLen:%d\n",
1733                                    uMICFragLen, cbLastFragPayloadSize, uTmpLen);
1734
1735                     if (bMIC2Frag == false) {
1736                         if (uTmpLen != 0)
1737                             MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1738                         pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1739                         pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1740                         MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1741                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Last MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1742                     } else {
1743                         if (uMICFragLen >= 4) {
1744                             memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1745                                      (cbMIClen - uMICFragLen));
1746                             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen >= 4: %X, %d\n",
1747                                            *(unsigned char *)((unsigned char *)&dwSafeMIC_R + (uMICFragLen - 4)),
1748                                            (cbMIClen - uMICFragLen));
1749
1750                         } else {
1751                             memcpy((pbyBuffer + uLength), ((unsigned char *)&dwSafeMIC_L + uMICFragLen),
1752                                      (4 - uMICFragLen));
1753                             memcpy((pbyBuffer + uLength + (4 - uMICFragLen)), &dwSafeMIC_R, 4);
1754                             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LAST: uMICFragLen < 4: %X, %d\n",
1755                                            *(unsigned char *)((unsigned char *)&dwSafeMIC_R + uMICFragLen - 4),
1756                                            (cbMIClen - uMICFragLen));
1757                         }
1758                         /*
1759                         for (ii = 0; ii < cbLastFragPayloadSize + 8 + 24; ii++) {
1760                             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii - 8 - 24)));
1761                         }
1762                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n\n");
1763                         */
1764                     }
1765                     MIC_vUnInit();
1766                 } else {
1767                     ASSERT(uTmpLen == (cbLastFragPayloadSize - cbMIClen));
1768                 }
1769
1770
1771                 //---------------------------
1772                 // S/W Encryption
1773                 //---------------------------
1774                 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1775                     if (bNeedEncrypt) {
1776                         s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbLastFragPayloadSize);
1777                         cbReqCount += cbICVlen;
1778                     }
1779                 }
1780
1781                 ptdCurr = (PSTxDesc)pHeadTD;
1782
1783                 //--------------------
1784                 //1.Set TSR1 & ReqCount in TxDescHead
1785                 //2.Set FragCtl in TxBufferHead
1786                 //3.Set Frame Control
1787                 //4.Set Sequence Control
1788                 //5.Get S/W generate FCS
1789                 //--------------------
1790
1791
1792                 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1793
1794                 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1795                 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1796                 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1797                 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1798                 pDevice->iTDUsed[uDMAIdx]++;
1799                 pHeadTD = ptdCurr->next;
1800
1801             }
1802             else {
1803                 //=========================
1804                 //    Middle Fragmentation
1805                 //=========================
1806                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Middle Fragmentation...\n");
1807                 //tmpDescIdx = (uDescIdx + uFragIdx) % pDevice->cbTD[uDMAIdx];
1808
1809                 wFragType = FRAGCTL_MIDFRAG;
1810
1811                 //Fill FIFO,RrvTime,RTS,and CTS
1812                 s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1813                                        cbFragmentSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1814                 //Fill DataHead
1815                 uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFragmentSize, uDMAIdx, bNeedACK,
1816                                             uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1817
1818                 // Generate TX MAC Header
1819                 vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1820                                    wFragType, uDMAIdx, uFragIdx);
1821
1822
1823                 if (bNeedEncrypt == true) {
1824                     //Fill TXKEY
1825                     s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1826                                  pbyMacHdr, (unsigned short)cbFragPayloadSize, (unsigned char *)pMICHDR);
1827
1828                     if (pDevice->bEnableHostWEP) {
1829                         pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1830                         pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1831                     }
1832                 }
1833
1834                 cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cbFragPayloadSize;
1835                 //---------------------------
1836                 // S/W or H/W Encryption
1837                 //---------------------------
1838                 //Fill MICHDR
1839                 //if (pDevice->bAES) {
1840                 //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFragPayloadSize);
1841                 //}
1842                 //cbReqCount += s_uDoEncryption(pDevice, psEthHeader, (void *)psTxBufHd, byKeySel,
1843                 //                              pbyPayloadHead, (unsigned short)cbFragPayloadSize, uDMAIdx);
1844
1845
1846                 pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1847                 //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][tmpDescIdx].pbyVAddr;
1848
1849
1850                 uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen;
1851
1852                 //copy TxBufferHeader + MacHeader to desc
1853                 memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1854
1855                 // Copy the Packet into a tx Buffer
1856                 memcpy((pbyBuffer + uLength),
1857                          (pPacket + 14 + uTotalCopyLength),
1858                          cbFragPayloadSize
1859                         );
1860                 uTmpLen = cbFragPayloadSize;
1861
1862                 uTotalCopyLength += uTmpLen;
1863
1864                 if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1865
1866                     MIC_vAppend((pbyBuffer + uLength), uTmpLen);
1867
1868                     if (uTmpLen < cbFragPayloadSize) {
1869                         bMIC2Frag = true;
1870                         uMICFragLen = cbFragPayloadSize - uTmpLen;
1871                         ASSERT(uMICFragLen < cbMIClen);
1872
1873                         pdwMIC_L = (unsigned long *)(pbyBuffer + uLength + uTmpLen);
1874                         pdwMIC_R = (unsigned long *)(pbyBuffer + uLength + uTmpLen + 4);
1875                         MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1876                         dwSafeMIC_L = *pdwMIC_L;
1877                         dwSafeMIC_R = *pdwMIC_R;
1878
1879                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIDDLE: uMICFragLen:%d, cbFragPayloadSize:%d, uTmpLen:%d\n",
1880                                        uMICFragLen, cbFragPayloadSize, uTmpLen);
1881                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Fill MIC in Middle frag [%d]\n", uMICFragLen);
1882                         /*
1883                         for (ii = 0; ii < uMICFragLen; ii++) {
1884                             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength + uTmpLen) + ii)));
1885                         }
1886                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
1887                         */
1888                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1889                     }
1890                     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Middle frag len: %d\n", uTmpLen);
1891                     /*
1892                     for (ii = 0; ii < uTmpLen; ii++) {
1893                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
1894                     }
1895                     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n\n");
1896                     */
1897
1898                 } else {
1899                     ASSERT(uTmpLen == (cbFragPayloadSize));
1900                 }
1901
1902                 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
1903                     if (bNeedEncrypt) {
1904                         s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength), (unsigned short)cbFragPayloadSize);
1905                         cbReqCount += cbICVlen;
1906                     }
1907                 }
1908
1909                 ptdCurr = (PSTxDesc)pHeadTD;
1910
1911                 //--------------------
1912                 //1.Set TSR1 & ReqCount in TxDescHead
1913                 //2.Set FragCtl in TxBufferHead
1914                 //3.Set Frame Control
1915                 //4.Set Sequence Control
1916                 //5.Get S/W generate FCS
1917                 //--------------------
1918
1919                 s_vFillFragParameter(pDevice, pbyBuffer, uDMAIdx, (void *)ptdCurr, wFragType, cbReqCount);
1920
1921                 ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
1922                 ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
1923                 ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
1924                 ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
1925                 pDevice->iTDUsed[uDMAIdx]++;
1926                 pHeadTD = ptdCurr->next;
1927             }
1928         }  // for (uMACfragNum)
1929     }
1930     else {
1931         //=========================
1932         //    No Fragmentation
1933         //=========================
1934         //DBG_PRTGRP03(("No Fragmentation...\n"));
1935         //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1936         wFragType = FRAGCTL_NONFRAG;
1937
1938         //Set FragCtl in TxBufferHead
1939         psTxBufHd->wFragCtl |= (unsigned short)wFragType;
1940
1941         //Fill FIFO,RrvTime,RTS,and CTS
1942         s_vGenerateTxParameter(pDevice, byPktType, (void *)psTxBufHd, pvRrvTime, pvRTS, pvCTS,
1943                                cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, pDevice->wCurrentRate);
1944         //Fill DataHead
1945         uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1946                                     0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate);
1947
1948         // Generate TX MAC Header
1949         vGenerateMACHeader(pDevice, pbyMacHdr, (unsigned short)uDuration, psEthHeader, bNeedEncrypt,
1950                            wFragType, uDMAIdx, 0);
1951
1952         if (bNeedEncrypt == true) {
1953             //Fill TXKEY
1954             s_vFillTxKey(pDevice, (unsigned char *)(psTxBufHd->adwTxKey), pbyIVHead, pTransmitKey,
1955                          pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
1956
1957             if (pDevice->bEnableHostWEP) {
1958                 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1959                 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1960             }
1961         }
1962
1963         // 802.1H
1964         if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1965             if ((psEthHeader->wType == TYPE_PKT_IPX) ||
1966                 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1967                 memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_Bridgetunnel[0], 6);
1968             }
1969             else {
1970                 memcpy((unsigned char *) (pbyPayloadHead), &pDevice->abySNAP_RFC1042[0], 6);
1971             }
1972             pbyType = (unsigned char *) (pbyPayloadHead + 6);
1973             memcpy(pbyType, &(psEthHeader->wType), sizeof(unsigned short));
1974             cb802_1_H_len = 8;
1975         }
1976
1977         cbReqCount = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen);
1978         //---------------------------
1979         // S/W or H/W Encryption
1980         //---------------------------
1981         //Fill MICHDR
1982         //if (pDevice->bAES) {
1983         //    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Fill MICHDR...\n");
1984         //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, pbyMacHdr, (unsigned short)cbFrameBodySize);
1985         //}
1986
1987         pbyBuffer = (unsigned char *)pHeadTD->pTDInfo->buf;
1988         //pbyBuffer = (unsigned char *)pDevice->aamTxBuf[uDMAIdx][uDescIdx].pbyVAddr;
1989
1990         uLength = cbHeaderLength + cbMACHdLen + uPadding + cbIVlen + cb802_1_H_len;
1991
1992         //copy TxBufferHeader + MacHeader to desc
1993         memcpy(pbyBuffer, (void *)psTxBufHd, uLength);
1994
1995         // Copy the Packet into a tx Buffer
1996         memcpy((pbyBuffer + uLength),
1997                  (pPacket + 14),
1998                  cbFrameBodySize - cb802_1_H_len
1999                  );
2000
2001         if ((bNeedEncrypt == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)){
2002
2003             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Length:%d, %d\n", cbFrameBodySize - cb802_1_H_len, uLength);
2004             /*
2005             for (ii = 0; ii < (cbFrameBodySize - cb802_1_H_len); ii++) {
2006                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *((unsigned char *)((pbyBuffer + uLength) + ii)));
2007             }
2008             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
2009             */
2010
2011             MIC_vAppend((pbyBuffer + uLength - cb802_1_H_len), cbFrameBodySize);
2012
2013             pdwMIC_L = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize);
2014             pdwMIC_R = (unsigned long *)(pbyBuffer + uLength - cb802_1_H_len + cbFrameBodySize + 4);
2015
2016             MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2017             MIC_vUnInit();
2018
2019
2020             if (pDevice->bTxMICFail == true) {
2021                 *pdwMIC_L = 0;
2022                 *pdwMIC_R = 0;
2023                 pDevice->bTxMICFail = false;
2024             }
2025
2026             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2027             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
2028             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2029 /*
2030             for (ii = 0; ii < 8; ii++) {
2031                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *(((unsigned char *)(pdwMIC_L) + ii)));
2032             }
2033             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
2034 */
2035
2036         }
2037
2038
2039         if ((pDevice->byLocalID <= REV_ID_VT3253_A1)){
2040             if (bNeedEncrypt) {
2041                 s_vSWencryption(pDevice, pTransmitKey, (pbyBuffer + uLength - cb802_1_H_len),
2042                                 (unsigned short)(cbFrameBodySize + cbMIClen));
2043                 cbReqCount += cbICVlen;
2044             }
2045         }
2046
2047
2048         ptdCurr = (PSTxDesc)pHeadTD;
2049
2050         ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding;
2051         ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength;
2052         ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma;
2053         ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma);
2054             //Set TSR1 & ReqCount in TxDescHead
2055         ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
2056         ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2057
2058         pDevice->iTDUsed[uDMAIdx]++;
2059
2060
2061 //   DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ptdCurr->m_dwReserved0[%d] ptdCurr->m_dwReserved1[%d].\n", ptdCurr->pTDInfo->dwReqCount, ptdCurr->pTDInfo->dwHeaderLength);
2062 //   DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" cbHeaderLength[%d]\n", cbHeaderLength);
2063
2064     }
2065     *puMACfragNum = uMACfragNum;
2066     //DBG_PRTGRP03(("s_cbFillTxBufHead END\n"));
2067     return cbHeaderLength;
2068 }
2069
2070
2071 void
2072 vGenerateFIFOHeader(PSDevice pDevice, unsigned char byPktType, unsigned char *pbyTxBufferAddr,
2073         bool bNeedEncrypt, unsigned int cbPayloadSize, unsigned int uDMAIdx,
2074         PSTxDesc pHeadTD, PSEthernetHeader psEthHeader, unsigned char *pPacket,
2075         PSKeyItem pTransmitKey, unsigned int uNodeIndex, unsigned int *puMACfragNum,
2076         unsigned int *pcbHeaderSize)
2077 {
2078     unsigned int wTxBufSize;       // FFinfo size
2079     bool bNeedACK;
2080     bool bIsAdhoc;
2081     unsigned short cbMacHdLen;
2082     PSTxBufHead     pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2083
2084     wTxBufSize = sizeof(STxBufHead);
2085
2086     memset(pTxBufHead, 0, wTxBufSize);
2087     //Set FIFOCTL_NEEDACK
2088
2089     if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2090         (pDevice->eOPMode == OP_MODE_AP)) {
2091         if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
2092             bNeedACK = false;
2093             pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
2094         }
2095         else {
2096             bNeedACK = true;
2097             pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2098         }
2099         bIsAdhoc = true;
2100     }
2101     else {
2102         // MSDUs in Infra mode always need ACK
2103         bNeedACK = true;
2104         pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2105         bIsAdhoc = false;
2106     }
2107
2108
2109     pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2110     pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
2111
2112     //Set FIFOCTL_LHEAD
2113     if (pDevice->bLongHeader)
2114         pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
2115
2116     //Set FIFOCTL_GENINT
2117
2118     pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2119
2120
2121     //Set FIFOCTL_ISDMA0
2122     if (TYPE_TXDMA0 == uDMAIdx) {
2123         pTxBufHead->wFIFOCtl |= FIFOCTL_ISDMA0;
2124     }
2125
2126     //Set FRAGCTL_MACHDCNT
2127     if (pDevice->bLongHeader) {
2128         cbMacHdLen = WLAN_HDR_ADDR3_LEN + 6;
2129     } else {
2130         cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2131     }
2132     pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2133
2134     //Set packet type
2135     if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2136         ;
2137     }
2138     else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2139         pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2140     }
2141     else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2142         pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2143     }
2144     else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2145         pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2146     }
2147     //Set FIFOCTL_GrpAckPolicy
2148     if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2149         pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2150     }
2151
2152     //Set Auto Fallback Ctl
2153     if (pDevice->wCurrentRate >= RATE_18M) {
2154         if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
2155             pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
2156         } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
2157             pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
2158         }
2159     }
2160
2161     //Set FRAGCTL_WEPTYP
2162     pDevice->bAES = false;
2163
2164     //Set FRAGCTL_WEPTYP
2165     if (pDevice->byLocalID > REV_ID_VT3253_A1) {
2166         if ((bNeedEncrypt) && (pTransmitKey != NULL))  { //WEP enabled
2167             if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2168                 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2169             }
2170             else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
2171                 if (pTransmitKey->uKeyLength != WLAN_WEP232_KEYLEN)
2172                     pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2173             }
2174             else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
2175                 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2176             }
2177         }
2178     }
2179
2180 #ifdef  PLICE_DEBUG
2181         //printk("Func:vGenerateFIFOHeader:TxDataRate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2182
2183         //if (pDevice->wCurrentRate <= 3)
2184         //{
2185         //      RFbRawSetPower(pDevice,36,pDevice->wCurrentRate);
2186         //}
2187         //else
2188
2189         RFbSetPower(pDevice, pDevice->wCurrentRate, pDevice->byCurrentCh);
2190 #endif
2191                 //if (pDevice->wCurrentRate == 3)
2192                 //pDevice->byCurPwr = 46;
2193                 pTxBufHead->byTxPower = pDevice->byCurPwr;
2194
2195
2196
2197
2198 /*
2199     if(pDevice->bEnableHostWEP)
2200         pTxBufHead->wFragCtl &=  ~(FRAGCTL_TKIP | FRAGCTL_LEGACY |FRAGCTL_AES);
2201 */
2202     *pcbHeaderSize = s_cbFillTxBufHead(pDevice, byPktType, pbyTxBufferAddr, cbPayloadSize,
2203                                    uDMAIdx, pHeadTD, psEthHeader, pPacket, bNeedEncrypt,
2204                                    pTransmitKey, uNodeIndex, puMACfragNum);
2205
2206     return;
2207 }
2208
2209
2210
2211
2212 /*+
2213  *
2214  * Description:
2215  *      Translate 802.3 to 802.11 header
2216  *
2217  * Parameters:
2218  *  In:
2219  *      pDevice         - Pointer to adapter
2220  *      dwTxBufferAddr  - Transmit Buffer
2221  *      pPacket         - Packet from upper layer
2222  *      cbPacketSize    - Transmit Data Length
2223  *  Out:
2224  *      pcbHeadSize         - Header size of MAC&Baseband control and 802.11 Header
2225  *      pcbAppendPayload    - size of append payload for 802.1H translation
2226  *
2227  * Return Value: none
2228  *
2229 -*/
2230
2231 void
2232 vGenerateMACHeader (
2233     PSDevice         pDevice,
2234     unsigned char *pbyBufferAddr,
2235     unsigned short wDuration,
2236     PSEthernetHeader psEthHeader,
2237     bool bNeedEncrypt,
2238     unsigned short wFragType,
2239     unsigned int uDMAIdx,
2240     unsigned int uFragIdx
2241     )
2242 {
2243     PS802_11Header  pMACHeader = (PS802_11Header)pbyBufferAddr;
2244
2245     memset(pMACHeader, 0, (sizeof(S802_11Header)));  //- sizeof(pMACHeader->dwIV)));
2246
2247     if (uDMAIdx == TYPE_ATIMDMA) {
2248         pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
2249     } else {
2250         pMACHeader->wFrameCtl = TYPE_802_11_DATA;
2251     }
2252
2253     if (pDevice->eOPMode == OP_MODE_AP) {
2254         memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2255         memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2256         memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2257         pMACHeader->wFrameCtl |= FC_FROMDS;
2258     }
2259     else {
2260         if (pDevice->eOPMode == OP_MODE_ADHOC) {
2261             memcpy(&(pMACHeader->abyAddr1[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2262             memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2263             memcpy(&(pMACHeader->abyAddr3[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2264         }
2265         else {
2266             memcpy(&(pMACHeader->abyAddr3[0]), &(psEthHeader->abyDstAddr[0]), ETH_ALEN);
2267             memcpy(&(pMACHeader->abyAddr2[0]), &(psEthHeader->abySrcAddr[0]), ETH_ALEN);
2268             memcpy(&(pMACHeader->abyAddr1[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
2269             pMACHeader->wFrameCtl |= FC_TODS;
2270         }
2271     }
2272
2273     if (bNeedEncrypt)
2274         pMACHeader->wFrameCtl |= cpu_to_le16((unsigned short)WLAN_SET_FC_ISWEP(1));
2275
2276     pMACHeader->wDurationID = cpu_to_le16(wDuration);
2277
2278     if (pDevice->bLongHeader) {
2279         PWLAN_80211HDR_A4 pMACA4Header  = (PWLAN_80211HDR_A4) pbyBufferAddr;
2280         pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
2281         memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
2282     }
2283     pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2284
2285     //Set FragNumber in Sequence Control
2286     pMACHeader->wSeqCtl |= cpu_to_le16((unsigned short)uFragIdx);
2287
2288     if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
2289         pDevice->wSeqCounter++;
2290         if (pDevice->wSeqCounter > 0x0fff)
2291             pDevice->wSeqCounter = 0;
2292     }
2293
2294     if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
2295         pMACHeader->wFrameCtl |= FC_MOREFRAG;
2296     }
2297 }
2298
2299
2300
2301
2302
2303
2304 CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2305
2306     PSTxDesc        pFrstTD;
2307     unsigned char byPktType;
2308     unsigned char *pbyTxBufferAddr;
2309     void *          pvRTS;
2310     PSCTS           pCTS;
2311     void *          pvTxDataHd;
2312     unsigned int uDuration;
2313     unsigned int cbReqCount;
2314     PS802_11Header  pMACHeader;
2315     unsigned int cbHeaderSize;
2316     unsigned int cbFrameBodySize;
2317     bool bNeedACK;
2318     bool bIsPSPOLL = false;
2319     PSTxBufHead     pTxBufHead;
2320     unsigned int cbFrameSize;
2321     unsigned int cbIVlen = 0;
2322     unsigned int cbICVlen = 0;
2323     unsigned int cbMIClen = 0;
2324     unsigned int cbFCSlen = 4;
2325     unsigned int uPadding = 0;
2326     unsigned short wTxBufSize;
2327     unsigned int cbMacHdLen;
2328     SEthernetHeader sEthHeader;
2329     void *          pvRrvTime;
2330     void *          pMICHDR;
2331     PSMgmtObject    pMgmt = pDevice->pMgmt;
2332     unsigned short wCurrentRate = RATE_1M;
2333
2334
2335     if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2336         return CMD_STATUS_RESOURCES;
2337     }
2338
2339     pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2340     pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2341     cbFrameBodySize = pPacket->cbPayloadLen;
2342     pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2343     wTxBufSize = sizeof(STxBufHead);
2344     memset(pTxBufHead, 0, wTxBufSize);
2345
2346     if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2347         wCurrentRate = RATE_6M;
2348         byPktType = PK_TYPE_11A;
2349     } else {
2350         wCurrentRate = RATE_1M;
2351         byPktType = PK_TYPE_11B;
2352     }
2353
2354     // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2355     // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2356     //                    And cmd timer will wait data pkt TX finish before scanning so it's OK
2357     //                    to set power here.
2358     if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2359
2360                 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2361     } else {
2362         RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2363     }
2364     pTxBufHead->byTxPower = pDevice->byCurPwr;
2365     //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2366     if (pDevice->byFOETuning) {
2367         if ((pPacket->p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2368             wCurrentRate = RATE_24M;
2369             byPktType = PK_TYPE_11GA;
2370         }
2371     }
2372
2373     //Set packet type
2374     if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2375         pTxBufHead->wFIFOCtl = 0;
2376     }
2377     else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2378         pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2379     }
2380     else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2381         pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2382     }
2383     else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2384         pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2385     }
2386
2387     pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2388     pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2389
2390
2391     if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])))
2392         bNeedACK = false;
2393     else {
2394         bNeedACK = true;
2395         pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2396     };
2397
2398     if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2399         (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2400
2401         pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2402         //Set Preamble type always long
2403         //pDevice->byPreambleType = PREAMBLE_LONG;
2404         // probe-response don't retry
2405         //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2406         //     bNeedACK = false;
2407         //     pTxBufHead->wFIFOCtl  &= (~FIFOCTL_NEEDACK);
2408         //}
2409     }
2410
2411     pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2412
2413     if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2414         bIsPSPOLL = true;
2415         cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2416     } else {
2417         cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2418     }
2419
2420     //Set FRAGCTL_MACHDCNT
2421     pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)(cbMacHdLen << 10));
2422
2423     // Notes:
2424     // Although spec says MMPDU can be fragmented; In most case,
2425     // no one will send a MMPDU under fragmentation. With RTS may occur.
2426     pDevice->bAES = false;  //Set FRAGCTL_WEPTYP
2427
2428     if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2429         if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2430             cbIVlen = 4;
2431             cbICVlen = 4;
2432             pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2433         }
2434         else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2435             cbIVlen = 8;//IV+ExtIV
2436             cbMIClen = 8;
2437             cbICVlen = 4;
2438             pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2439             //We need to get seed here for filling TxKey entry.
2440             //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2441             //            pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2442         }
2443         else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2444             cbIVlen = 8;//RSN Header
2445             cbICVlen = 8;//MIC
2446             pTxBufHead->wFragCtl |= FRAGCTL_AES;
2447             pDevice->bAES = true;
2448         }
2449         //MAC Header should be padding 0 to DW alignment.
2450         uPadding = 4 - (cbMacHdLen%4);
2451         uPadding %= 4;
2452     }
2453
2454     cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2455
2456     //Set FIFOCTL_GrpAckPolicy
2457     if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2458         pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2459     }
2460     //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2461
2462     //Set RrvTime/RTS/CTS Buffer
2463     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2464
2465         pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2466         pMICHDR = NULL;
2467         pvRTS = NULL;
2468         pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2469         pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2470         cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2471     }
2472     else { // 802.11a/b packet
2473         pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2474         pMICHDR = NULL;
2475         pvRTS = NULL;
2476         pCTS = NULL;
2477         pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2478         cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2479     }
2480
2481     memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2482
2483     memcpy(&(sEthHeader.abyDstAddr[0]), &(pPacket->p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
2484     memcpy(&(sEthHeader.abySrcAddr[0]), &(pPacket->p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
2485     //=========================
2486     //    No Fragmentation
2487     //=========================
2488     pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
2489
2490
2491     //Fill FIFO,RrvTime,RTS,and CTS
2492     s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2493                            cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
2494
2495     //Fill DataHead
2496     uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2497                                 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
2498
2499     pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2500
2501     cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2502
2503     if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2504         unsigned char *pbyIVHead;
2505         unsigned char *pbyPayloadHead;
2506         unsigned char *pbyBSSID;
2507         PSKeyItem       pTransmitKey = NULL;
2508
2509         pbyIVHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2510         pbyPayloadHead = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2511
2512         //Fill TXKEY
2513         //Kyle: Need fix: TKIP and AES did't encryt Mnt Packet.
2514         //s_vFillTxKey(pDevice, (unsigned char *)pTxBufHead->adwTxKey, NULL);
2515
2516         //Fill IV(ExtIV,RSNHDR)
2517         //s_vFillPrePayload(pDevice, pbyIVHead, NULL);
2518         //---------------------------
2519         // S/W or H/W Encryption
2520         //---------------------------
2521         //Fill MICHDR
2522         //if (pDevice->bAES) {
2523         //    s_vFillMICHDR(pDevice, (unsigned char *)pMICHDR, (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize);
2524         //}
2525         do {
2526             if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2527                 (pDevice->bLinkPass == true)) {
2528                 pbyBSSID = pDevice->abyBSSID;
2529                 // get pairwise key
2530                 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2531                     // get group key
2532                     if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2533                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2534                         break;
2535                     }
2536                 } else {
2537                     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2538                     break;
2539                 }
2540             }
2541             // get group key
2542             pbyBSSID = pDevice->abyBroadcastAddr;
2543             if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2544                 pTransmitKey = NULL;
2545                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2546             } else {
2547                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2548             }
2549         } while(false);
2550         //Fill TXKEY
2551         s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2552                      (unsigned char *)pMACHeader, (unsigned short)cbFrameBodySize, NULL);
2553
2554         memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2555         memcpy(pbyPayloadHead, ((unsigned char *)(pPacket->p80211Header) + cbMacHdLen),
2556                  cbFrameBodySize);
2557     }
2558     else {
2559         // Copy the Packet into a tx Buffer
2560         memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2561     }
2562
2563     pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2564     pDevice->wSeqCounter++ ;
2565     if (pDevice->wSeqCounter > 0x0fff)
2566         pDevice->wSeqCounter = 0;
2567
2568     if (bIsPSPOLL) {
2569         // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2570         // of  FIFO control header.
2571         // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2572         // in the same place of other packet's Duration-field).
2573         // And it will cause Cisco-AP to issue Disassociation-packet
2574         if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2575             ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2576             ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2577         } else {
2578             ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2579         }
2580     }
2581
2582
2583     // first TD is the only TD
2584     //Set TSR1 & ReqCount in TxDescHead
2585     pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
2586     pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
2587     pFrstTD->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount));
2588     pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
2589     pFrstTD->pTDInfo->byFlags = 0;
2590
2591     if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2592         // Disable PS
2593         MACbPSWakeup(pDevice->PortOffset);
2594     }
2595     pDevice->bPWBitOn = false;
2596
2597     wmb();
2598     pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2599     wmb();
2600
2601     pDevice->iTDUsed[TYPE_TXDMA0]++;
2602
2603     if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
2604         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
2605     }
2606
2607     pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
2608 #ifdef  PLICE_DEBUG
2609                 //printk("SCAN:CurrentRate is  %d,TxPower is %d\n",wCurrentRate,pTxBufHead->byTxPower);
2610 #endif
2611
2612 #ifdef TxInSleep
2613   pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
2614   #endif
2615
2616     // Poll Transmit the adapter
2617     MACvTransmit0(pDevice->PortOffset);
2618
2619     return CMD_STATUS_PENDING;
2620
2621 }
2622
2623
2624 CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket) {
2625
2626     unsigned char byPktType;
2627     unsigned char *pbyBuffer = (unsigned char *)pDevice->tx_beacon_bufs;
2628     unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2629     unsigned int cbHeaderSize = 0;
2630     unsigned short wTxBufSize = sizeof(STxShortBufHead);
2631     PSTxShortBufHead pTxBufHead = (PSTxShortBufHead) pbyBuffer;
2632     PSTxDataHead_ab  pTxDataHead = (PSTxDataHead_ab) (pbyBuffer + wTxBufSize);
2633     PS802_11Header   pMACHeader;
2634     unsigned short wCurrentRate;
2635     unsigned short wLen = 0x0000;
2636
2637
2638     memset(pTxBufHead, 0, wTxBufSize);
2639
2640     if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2641         wCurrentRate = RATE_6M;
2642         byPktType = PK_TYPE_11A;
2643     } else {
2644         wCurrentRate = RATE_2M;
2645         byPktType = PK_TYPE_11B;
2646     }
2647
2648     //Set Preamble type always long
2649     pDevice->byPreambleType = PREAMBLE_LONG;
2650
2651     //Set FIFOCTL_GENINT
2652
2653     pTxBufHead->wFIFOCtl |= FIFOCTL_GENINT;
2654
2655
2656     //Set packet type & Get Duration
2657     if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2658         pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, byPktType,
2659                                                           wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2660     }
2661     else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2662         pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2663         pTxDataHead->wDuration = cpu_to_le16((unsigned short)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, byPktType,
2664                                                           wCurrentRate, false, 0, 0, 1, AUTO_FB_NONE));
2665     }
2666
2667     BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, byPktType,
2668         (unsigned short *)&(wLen), (unsigned char *)&(pTxDataHead->byServiceField), (unsigned char *)&(pTxDataHead->bySignalField)
2669     );
2670     pTxDataHead->wTransmitLength = cpu_to_le16(wLen);
2671     //Get TimeStampOff
2672     pTxDataHead->wTimeStampOff = cpu_to_le16(wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]);
2673     cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2674
2675    //Generate Beacon Header
2676     pMACHeader = (PS802_11Header)(pbyBuffer + cbHeaderSize);
2677     memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2678
2679     pMACHeader->wDurationID = 0;
2680     pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2681     pDevice->wSeqCounter++ ;
2682     if (pDevice->wSeqCounter > 0x0fff)
2683         pDevice->wSeqCounter = 0;
2684
2685     // Set Beacon buffer length
2686     pDevice->wBCNBufLen = pPacket->cbMPDULen + cbHeaderSize;
2687
2688     MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, (pDevice->tx_beacon_dma));
2689
2690     MACvSetCurrBCNLength(pDevice->PortOffset, pDevice->wBCNBufLen);
2691     // Set auto Transmit on
2692     MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
2693     // Poll Transmit the adapter
2694     MACvTransmitBCN(pDevice->PortOffset);
2695
2696     return CMD_STATUS_PENDING;
2697 }
2698
2699
2700
2701 unsigned int
2702 cbGetFragCount (
2703     PSDevice         pDevice,
2704     PSKeyItem        pTransmitKey,
2705     unsigned int cbFrameBodySize,
2706     PSEthernetHeader psEthHeader
2707     )
2708 {
2709     unsigned int cbMACHdLen;
2710     unsigned int cbFrameSize;
2711     unsigned int cbFragmentSize; //Hdr+(IV)+payoad+(MIC)+(ICV)+FCS
2712     unsigned int cbFragPayloadSize;
2713     unsigned int cbLastFragPayloadSize;
2714     unsigned int cbIVlen = 0;
2715     unsigned int cbICVlen = 0;
2716     unsigned int cbMIClen = 0;
2717     unsigned int cbFCSlen = 4;
2718     unsigned int uMACfragNum = 1;
2719     bool bNeedACK;
2720
2721
2722
2723     if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
2724         (pDevice->eOPMode == OP_MODE_AP)) {
2725         if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])))
2726             bNeedACK = false;
2727         else
2728             bNeedACK = true;
2729     }
2730     else {
2731         // MSDUs in Infra mode always need ACK
2732         bNeedACK = true;
2733     }
2734
2735     if (pDevice->bLongHeader)
2736         cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
2737     else
2738         cbMACHdLen = WLAN_HDR_ADDR3_LEN;
2739
2740
2741     if (pDevice->bEncryptionEnable == true) {
2742
2743         if (pTransmitKey == NULL) {
2744             if ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) ||
2745                 (pDevice->pMgmt->eAuthenMode < WMAC_AUTH_WPA)) {
2746                 cbIVlen = 4;
2747                 cbICVlen = 4;
2748             } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2749                 cbIVlen = 8;//IV+ExtIV
2750                 cbMIClen = 8;
2751                 cbICVlen = 4;
2752             } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2753                 cbIVlen = 8;//RSN Header
2754                 cbICVlen = 8;//MIC
2755             }
2756         } else if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
2757             cbIVlen = 4;
2758             cbICVlen = 4;
2759         } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
2760             cbIVlen = 8;//IV+ExtIV
2761             cbMIClen = 8;
2762             cbICVlen = 4;
2763         } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
2764             cbIVlen = 8;//RSN Header
2765             cbICVlen = 8;//MIC
2766         }
2767     }
2768
2769     cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
2770
2771     if ((cbFrameSize > pDevice->wFragmentationThreshold) && (bNeedACK == true)) {
2772         // Fragmentation
2773         cbFragmentSize = pDevice->wFragmentationThreshold;
2774         cbFragPayloadSize = cbFragmentSize - cbMACHdLen - cbIVlen - cbICVlen - cbFCSlen;
2775         uMACfragNum = (unsigned short) ((cbFrameBodySize + cbMIClen) / cbFragPayloadSize);
2776         cbLastFragPayloadSize = (cbFrameBodySize + cbMIClen) % cbFragPayloadSize;
2777         if (cbLastFragPayloadSize == 0) {
2778             cbLastFragPayloadSize = cbFragPayloadSize;
2779         } else {
2780             uMACfragNum++;
2781         }
2782     }
2783     return uMACfragNum;
2784 }
2785
2786
2787 void
2788 vDMA0_tx_80211(PSDevice  pDevice, struct sk_buff *skb, unsigned char *pbMPDU, unsigned int cbMPDULen) {
2789
2790     PSTxDesc        pFrstTD;
2791     unsigned char byPktType;
2792     unsigned char *pbyTxBufferAddr;
2793     void *          pvRTS;
2794     void *          pvCTS;
2795     void *          pvTxDataHd;
2796     unsigned int uDuration;
2797     unsigned int cbReqCount;
2798     PS802_11Header  pMACHeader;
2799     unsigned int cbHeaderSize;
2800     unsigned int cbFrameBodySize;
2801     bool bNeedACK;
2802     bool bIsPSPOLL = false;
2803     PSTxBufHead     pTxBufHead;
2804     unsigned int cbFrameSize;
2805     unsigned int cbIVlen = 0;
2806     unsigned int cbICVlen = 0;
2807     unsigned int cbMIClen = 0;
2808     unsigned int cbFCSlen = 4;
2809     unsigned int uPadding = 0;
2810     unsigned int cbMICHDR = 0;
2811     unsigned int uLength = 0;
2812     unsigned long dwMICKey0, dwMICKey1;
2813     unsigned long dwMIC_Priority;
2814     unsigned long *pdwMIC_L;
2815     unsigned long *pdwMIC_R;
2816     unsigned short wTxBufSize;
2817     unsigned int cbMacHdLen;
2818     SEthernetHeader sEthHeader;
2819     void *          pvRrvTime;
2820     void *          pMICHDR;
2821     PSMgmtObject    pMgmt = pDevice->pMgmt;
2822     unsigned short wCurrentRate = RATE_1M;
2823     PUWLAN_80211HDR  p80211Header;
2824     unsigned int uNodeIndex = 0;
2825     bool bNodeExist = false;
2826     SKeyItem        STempKey;
2827     PSKeyItem       pTransmitKey = NULL;
2828     unsigned char *pbyIVHead;
2829     unsigned char *pbyPayloadHead;
2830     unsigned char *pbyMacHdr;
2831
2832     unsigned int cbExtSuppRate = 0;
2833 //    PWLAN_IE        pItem;
2834
2835
2836     pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2837
2838     if(cbMPDULen <= WLAN_HDR_ADDR3_LEN) {
2839        cbFrameBodySize = 0;
2840     }
2841     else {
2842        cbFrameBodySize = cbMPDULen - WLAN_HDR_ADDR3_LEN;
2843     }
2844     p80211Header = (PUWLAN_80211HDR)pbMPDU;
2845
2846
2847     pFrstTD = pDevice->apCurrTD[TYPE_TXDMA0];
2848     pbyTxBufferAddr = (unsigned char *)pFrstTD->pTDInfo->buf;
2849     pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2850     wTxBufSize = sizeof(STxBufHead);
2851     memset(pTxBufHead, 0, wTxBufSize);
2852
2853     if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2854         wCurrentRate = RATE_6M;
2855         byPktType = PK_TYPE_11A;
2856     } else {
2857         wCurrentRate = RATE_1M;
2858         byPktType = PK_TYPE_11B;
2859     }
2860
2861     // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2862     // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2863     //                    And cmd timer will wait data pkt TX finish before scanning so it's OK
2864     //                    to set power here.
2865     if (pDevice->pMgmt->eScanState != WMAC_NO_SCANNING) {
2866         RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2867     } else {
2868         RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2869     }
2870     pTxBufHead->byTxPower = pDevice->byCurPwr;
2871
2872     //+++++++++++++++++++++ Patch VT3253 A1 performance +++++++++++++++++++++++++++
2873     if (pDevice->byFOETuning) {
2874         if ((p80211Header->sA3.wFrameCtl & TYPE_DATE_NULL) == TYPE_DATE_NULL) {
2875             wCurrentRate = RATE_24M;
2876             byPktType = PK_TYPE_11GA;
2877         }
2878     }
2879
2880     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2881
2882     //Set packet type
2883     if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2884         pTxBufHead->wFIFOCtl = 0;
2885     }
2886     else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2887         pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2888     }
2889     else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2890         pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2891     }
2892     else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2893         pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2894     }
2895
2896     pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2897     pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2898
2899
2900     if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
2901         bNeedACK = false;
2902         if (pDevice->bEnableHostWEP) {
2903             uNodeIndex = 0;
2904             bNodeExist = true;
2905         }
2906     }
2907     else {
2908         if (pDevice->bEnableHostWEP) {
2909             if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2910                 bNodeExist = true;
2911         }
2912         bNeedACK = true;
2913         pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2914     };
2915
2916     if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2917         (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2918
2919         pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2920         //Set Preamble type always long
2921         //pDevice->byPreambleType = PREAMBLE_LONG;
2922
2923         // probe-response don't retry
2924         //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2925         //     bNeedACK = false;
2926         //     pTxBufHead->wFIFOCtl  &= (~FIFOCTL_NEEDACK);
2927         //}
2928     }
2929
2930     pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2931
2932     if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2933         bIsPSPOLL = true;
2934         cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2935     } else {
2936         cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2937     }
2938
2939     // hostapd deamon ext support rate patch
2940     if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2941
2942         if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2943             cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2944          }
2945
2946         if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2947             cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2948          }
2949
2950          if (cbExtSuppRate >0) {
2951             cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2952          }
2953     }
2954
2955
2956     //Set FRAGCTL_MACHDCNT
2957     pTxBufHead->wFragCtl |= cpu_to_le16((unsigned short)cbMacHdLen << 10);
2958
2959     // Notes:
2960     // Although spec says MMPDU can be fragmented; In most case,
2961     // no one will send a MMPDU under fragmentation. With RTS may occur.
2962     pDevice->bAES = false;  //Set FRAGCTL_WEPTYP
2963
2964
2965     if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2966         if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2967             cbIVlen = 4;
2968             cbICVlen = 4;
2969             pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2970         }
2971         else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2972             cbIVlen = 8;//IV+ExtIV
2973             cbMIClen = 8;
2974             cbICVlen = 4;
2975             pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2976             //We need to get seed here for filling TxKey entry.
2977             //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2978             //            pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2979         }
2980         else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2981             cbIVlen = 8;//RSN Header
2982             cbICVlen = 8;//MIC
2983             cbMICHDR = sizeof(SMICHDRHead);
2984             pTxBufHead->wFragCtl |= FRAGCTL_AES;
2985             pDevice->bAES = true;
2986         }
2987         //MAC Header should be padding 0 to DW alignment.
2988         uPadding = 4 - (cbMacHdLen%4);
2989         uPadding %= 4;
2990     }
2991
2992     cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2993
2994     //Set FIFOCTL_GrpAckPolicy
2995     if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000
2996         pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2997     }
2998     //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2999
3000
3001     if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
3002
3003         pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
3004         pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
3005         pvRTS = NULL;
3006         pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
3007         pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
3008         cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
3009
3010     }
3011     else {//802.11a/b packet
3012
3013         pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
3014         pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
3015         pvRTS = NULL;
3016         pvCTS = NULL;
3017         pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
3018         cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
3019
3020     }
3021
3022     memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
3023     memcpy(&(sEthHeader.abyDstAddr[0]), &(p80211Header->sA3.abyAddr1[0]), ETH_ALEN);
3024     memcpy(&(sEthHeader.abySrcAddr[0]), &(p80211Header->sA3.abyAddr2[0]), ETH_ALEN);
3025     //=========================
3026     //    No Fragmentation
3027     //=========================
3028     pTxBufHead->wFragCtl |= (unsigned short)FRAGCTL_NONFRAG;
3029
3030
3031     //Fill FIFO,RrvTime,RTS,and CTS
3032     s_vGenerateTxParameter(pDevice, byPktType, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
3033                            cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, wCurrentRate);
3034
3035     //Fill DataHead
3036     uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
3037                                 0, 0, 1, AUTO_FB_NONE, wCurrentRate);
3038
3039     pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
3040
3041     cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
3042
3043     pbyMacHdr = (unsigned char *)(pbyTxBufferAddr + cbHeaderSize);
3044     pbyPayloadHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
3045     pbyIVHead = (unsigned char *)(pbyMacHdr + cbMacHdLen + uPadding);
3046
3047     // Copy the Packet into a tx Buffer
3048     memcpy(pbyMacHdr, pbMPDU, cbMacHdLen);
3049
3050     // version set to 0, patch for hostapd deamon
3051     pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
3052     memcpy(pbyPayloadHead, (pbMPDU + cbMacHdLen), cbFrameBodySize);
3053
3054     // replace support rate, patch for hostapd deamon( only support 11M)
3055     if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
3056         if (cbExtSuppRate != 0) {
3057             if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
3058                 memcpy((pbyPayloadHead + cbFrameBodySize),
3059                         pMgmt->abyCurrSuppRates,
3060                         ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
3061                        );
3062              if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
3063                 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
3064                         pMgmt->abyCurrExtSuppRates,
3065                         ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3066                        );
3067          }
3068     }
3069
3070     // Set wep
3071     if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
3072
3073         if (pDevice->bEnableHostWEP) {
3074             pTransmitKey = &STempKey;
3075             pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3076             pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3077             pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3078             pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3079             pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3080             memcpy(pTransmitKey->abyKey,
3081                 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3082                 pTransmitKey->uKeyLength
3083                 );
3084         }
3085
3086         if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
3087
3088             dwMICKey0 = *(unsigned long *)(&pTransmitKey->abyKey[16]);
3089             dwMICKey1 = *(unsigned long *)(&pTransmitKey->abyKey[20]);
3090
3091             // DO Software Michael
3092             MIC_vInit(dwMICKey0, dwMICKey1);
3093             MIC_vAppend((unsigned char *)&(sEthHeader.abyDstAddr[0]), 12);
3094             dwMIC_Priority = 0;
3095             MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
3096             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
3097
3098             uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
3099
3100             MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
3101
3102             pdwMIC_L = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize);
3103             pdwMIC_R = (unsigned long *)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
3104
3105             MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
3106             MIC_vUnInit();
3107
3108             if (pDevice->bTxMICFail == true) {
3109                 *pdwMIC_L = 0;
3110                 *pdwMIC_R = 0;
3111                 pDevice->bTxMICFail = false;
3112             }
3113
3114             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
3115             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
3116             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
3117
3118         }
3119
3120
3121         s_vFillTxKey(pDevice, (unsigned char *)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
3122                      pbyMacHdr, (unsigned short)cbFrameBodySize, (unsigned char *)pMICHDR);
3123
3124         if (pDevice->bEnableHostWEP) {
3125             pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
3126             pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
3127         }
3128
3129         if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
3130             s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (unsigned short)(cbFrameBodySize + cbMIClen));
3131         }
3132     }
3133
3134     pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
3135     pDevice->wSeqCounter++ ;
3136     if (pDevice->wSeqCounter > 0x0fff)
3137         pDevice->wSeqCounter = 0;
3138
3139
3140     if (bIsPSPOLL) {
3141         // The MAC will automatically replace the Duration-field of MAC header by Duration-field
3142         // of  FIFO control header.
3143         // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
3144         // in the same place of other packet's Duration-field).
3145         // And it will cause Cisco-AP to issue Disassociation-packet
3146         if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
3147             ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
3148             ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
3149         } else {
3150             ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
3151         }
3152     }
3153
3154
3155     // first TD is the only TD
3156     //Set TSR1 & ReqCount in TxDescHead
3157     pFrstTD->pTDInfo->skb = skb;
3158     pFrstTD->m_td1TD1.byTCR = (TCR_STP | TCR_EDP | EDMSDU);
3159     pFrstTD->pTDInfo->skb_dma = pFrstTD->pTDInfo->buf_dma;
3160     pFrstTD->m_td1TD1.wReqCount = cpu_to_le16(cbReqCount);
3161     pFrstTD->buff_addr = cpu_to_le32(pFrstTD->pTDInfo->skb_dma);
3162     pFrstTD->pTDInfo->byFlags = 0;
3163     pFrstTD->pTDInfo->byFlags |= TD_FLAGS_PRIV_SKB;
3164
3165     if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
3166         // Disable PS
3167         MACbPSWakeup(pDevice->PortOffset);
3168     }
3169     pDevice->bPWBitOn = false;
3170
3171     wmb();
3172     pFrstTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
3173     wmb();
3174
3175     pDevice->iTDUsed[TYPE_TXDMA0]++;
3176
3177     if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 1) {
3178         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " available td0 <= 1\n");
3179     }
3180
3181     pDevice->apCurrTD[TYPE_TXDMA0] = pFrstTD->next;
3182
3183     // Poll Transmit the adapter
3184     MACvTransmit0(pDevice->PortOffset);
3185
3186     return;
3187 }
3188
3189