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