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