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