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