Staging: vt6656: Removed IN definition
[linux-2.6.git] / drivers / staging / vt6656 / rxtx.c
blob1d7ca2286248540880839cef057e1ac761475464
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
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.
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.
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.
19 * File: rxtx.c
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
23 * Author: Lyndon Chen
25 * Date: May 20, 2003
27 * Functions:
28 * s_vGenerateTxParameter - Generate tx dma requried parameter.
29 * s_vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * csBeacon_xmit - beacon tx function
31 * csMgmt_xmit - management tx function
32 * s_uGetDataDuration - get tx data required duration
33 * s_uFillDataHead- fulfill tx data duration header
34 * s_uGetRTSCTSDuration- get rtx/cts requried duration
35 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
36 * s_uGetTxRsvTime- get frame reserved time
37 * s_vFillCTSHead- fulfill CTS ctl header
38 * s_vFillFragParameter- Set fragement ctl parameter.
39 * s_vFillRTSHead- fulfill RTS ctl header
40 * s_vFillTxKey- fulfill tx encrypt key
41 * s_vSWencryption- Software encrypt header
42 * vDMA0_tx_80211- tx 802.11 frame via dma0
43 * vGenerateFIFOHeader- Generate tx FIFO ctl header
45 * Revision History:
49 #include "device.h"
50 #include "rxtx.h"
51 #include "tether.h"
52 #include "card.h"
53 #include "bssdb.h"
54 #include "mac.h"
55 #include "baseband.h"
56 #include "michael.h"
57 #include "tkip.h"
58 #include "tcrc.h"
59 #include "wctl.h"
60 #include "hostap.h"
61 #include "rf.h"
62 #include "datarate.h"
63 #include "usbpipe.h"
65 #ifdef WPA_SM_Transtatus
66 #include "iocmd.h"
67 #endif
69 /*--------------------- Static Definitions -------------------------*/
71 /*--------------------- Static Classes ----------------------------*/
73 /*--------------------- Static Variables --------------------------*/
74 //static int msglevel =MSG_LEVEL_DEBUG;
75 static int msglevel =MSG_LEVEL_INFO;
77 /*--------------------- Static Functions --------------------------*/
79 /*--------------------- Static Definitions -------------------------*/
80 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
81 // packet size >= 256 -> direct send
83 const WORD wTimeStampOff[2][MAX_RATE] = {
84 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
85 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
88 const WORD wFB_Opt0[2][5] = {
89 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
90 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
92 const WORD wFB_Opt1[2][5] = {
93 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
94 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
98 #define RTSDUR_BB 0
99 #define RTSDUR_BA 1
100 #define RTSDUR_AA 2
101 #define CTSDUR_BA 3
102 #define RTSDUR_BA_F0 4
103 #define RTSDUR_AA_F0 5
104 #define RTSDUR_BA_F1 6
105 #define RTSDUR_AA_F1 7
106 #define CTSDUR_BA_F0 8
107 #define CTSDUR_BA_F1 9
108 #define DATADUR_B 10
109 #define DATADUR_A 11
110 #define DATADUR_A_F0 12
111 #define DATADUR_A_F1 13
113 /*--------------------- Static Functions --------------------------*/
115 static
116 VOID
117 s_vSaveTxPktInfo(
118 PSDevice pDevice,
119 BYTE byPktNum,
120 PBYTE pbyDestAddr,
121 WORD wPktLength,
122 WORD wFIFOCtl
125 static
126 PVOID
127 s_vGetFreeContext(
128 PSDevice pDevice
132 static
133 VOID
134 s_vGenerateTxParameter(
135 PSDevice pDevice,
136 BYTE byPktType,
137 WORD wCurrentRate,
138 PVOID pTxBufHead,
139 PVOID pvRrvTime,
140 PVOID pvRTS,
141 PVOID pvCTS,
142 UINT cbFrameSize,
143 BOOL bNeedACK,
144 UINT uDMAIdx,
145 PSEthernetHeader psEthHeader
149 static
150 UINT
151 s_uFillDataHead (
152 PSDevice pDevice,
153 BYTE byPktType,
154 WORD wCurrentRate,
155 PVOID pTxDataHead,
156 UINT cbFrameLength,
157 UINT uDMAIdx,
158 BOOL bNeedAck,
159 UINT uFragIdx,
160 UINT cbLastFragmentSize,
161 UINT uMACfragNum,
162 BYTE byFBOption
168 static
169 VOID
170 s_vGenerateMACHeader (
171 PSDevice pDevice,
172 PBYTE pbyBufferAddr,
173 WORD wDuration,
174 PSEthernetHeader psEthHeader,
175 BOOL bNeedEncrypt,
176 WORD wFragType,
177 UINT uDMAIdx,
178 UINT uFragIdx
181 static
182 VOID
183 s_vFillTxKey(
184 PSDevice pDevice,
185 PBYTE pbyBuf,
186 PBYTE pbyIVHead,
187 PSKeyItem pTransmitKey,
188 PBYTE pbyHdrBuf,
189 WORD wPayloadLen,
190 OUT PBYTE pMICHDR
193 static
194 VOID
195 s_vSWencryption (
196 PSDevice pDevice,
197 PSKeyItem pTransmitKey,
198 PBYTE pbyPayloadHead,
199 WORD wPayloadSize
202 static
203 UINT
204 s_uGetTxRsvTime (
205 PSDevice pDevice,
206 BYTE byPktType,
207 UINT cbFrameLength,
208 WORD wRate,
209 BOOL bNeedAck
213 static
214 UINT
215 s_uGetRTSCTSRsvTime (
216 PSDevice pDevice,
217 BYTE byRTSRsvType,
218 BYTE byPktType,
219 UINT cbFrameLength,
220 WORD wCurrentRate
223 static
224 VOID
225 s_vFillCTSHead (
226 PSDevice pDevice,
227 UINT uDMAIdx,
228 BYTE byPktType,
229 PVOID pvCTS,
230 UINT cbFrameLength,
231 BOOL bNeedAck,
232 BOOL bDisCRC,
233 WORD wCurrentRate,
234 BYTE byFBOption
237 static
238 VOID
239 s_vFillRTSHead(
240 PSDevice pDevice,
241 BYTE byPktType,
242 PVOID pvRTS,
243 UINT cbFrameLength,
244 BOOL bNeedAck,
245 BOOL bDisCRC,
246 PSEthernetHeader psEthHeader,
247 WORD wCurrentRate,
248 BYTE byFBOption
251 static
252 UINT
253 s_uGetDataDuration (
254 PSDevice pDevice,
255 BYTE byDurType,
256 UINT cbFrameLength,
257 BYTE byPktType,
258 WORD wRate,
259 BOOL bNeedAck,
260 UINT uFragIdx,
261 UINT cbLastFragmentSize,
262 UINT uMACfragNum,
263 BYTE byFBOption
267 static
268 UINT
269 s_uGetRTSCTSDuration (
270 PSDevice pDevice,
271 BYTE byDurType,
272 UINT cbFrameLength,
273 BYTE byPktType,
274 WORD wRate,
275 BOOL bNeedAck,
276 BYTE byFBOption
280 /*--------------------- Export Variables --------------------------*/
282 static
283 PVOID
284 s_vGetFreeContext(
285 PSDevice pDevice
288 PUSB_SEND_CONTEXT pContext = NULL;
289 PUSB_SEND_CONTEXT pReturnContext = NULL;
290 UINT ii;
292 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
294 for (ii = 0; ii < pDevice->cbTD; ii++) {
295 pContext = pDevice->apTD[ii];
296 if (pContext->bBoolInUse == FALSE) {
297 pContext->bBoolInUse = TRUE;
298 pReturnContext = pContext;
299 break;
302 if ( ii == pDevice->cbTD ) {
303 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");
305 return ((PVOID) pReturnContext);
309 static
310 VOID
311 s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl)
313 PSStatCounter pStatistic=&(pDevice->scStatistic);
316 if (IS_BROADCAST_ADDRESS(pbyDestAddr))
317 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;
318 else if (IS_MULTICAST_ADDRESS(pbyDestAddr))
319 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;
320 else
321 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;
323 pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;
324 pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;
325 memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr,
326 pbyDestAddr,
327 ETH_ALEN);
333 static
334 VOID
335 s_vFillTxKey (
336 PSDevice pDevice,
337 PBYTE pbyBuf,
338 PBYTE pbyIVHead,
339 PSKeyItem pTransmitKey,
340 PBYTE pbyHdrBuf,
341 WORD wPayloadLen,
342 OUT PBYTE pMICHDR
345 PDWORD pdwIV = (PDWORD) pbyIVHead;
346 PDWORD pdwExtIV = (PDWORD) ((PBYTE)pbyIVHead+4);
347 WORD wValue;
348 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
349 DWORD dwRevIVCounter;
353 //Fill TXKEY
354 if (pTransmitKey == NULL)
355 return;
357 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
358 *pdwIV = pDevice->dwIVCounter;
359 pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
361 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
362 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
363 memcpy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3);
364 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
365 } else {
366 memcpy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3);
367 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
368 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
369 memcpy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3);
370 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
372 memcpy(pDevice->abyPRNG, pbyBuf, 16);
374 // Append IV after Mac Header
375 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
376 *pdwIV |= (pDevice->byKeyIndex << 30);
377 *pdwIV = cpu_to_le32(*pdwIV);
378 pDevice->dwIVCounter++;
379 if (pDevice->dwIVCounter > WEP_IV_MASK) {
380 pDevice->dwIVCounter = 0;
382 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
383 pTransmitKey->wTSC15_0++;
384 if (pTransmitKey->wTSC15_0 == 0) {
385 pTransmitKey->dwTSC47_16++;
387 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
388 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
389 memcpy(pbyBuf, pDevice->abyPRNG, 16);
390 // Make IV
391 memcpy(pdwIV, pDevice->abyPRNG, 3);
393 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
394 // Append IV&ExtIV after Mac Header
395 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
396 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
398 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
399 pTransmitKey->wTSC15_0++;
400 if (pTransmitKey->wTSC15_0 == 0) {
401 pTransmitKey->dwTSC47_16++;
403 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
405 // Make IV
406 *pdwIV = 0;
407 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
408 *pdwIV |= cpu_to_le16((WORD)(pTransmitKey->wTSC15_0));
409 //Append IV&ExtIV after Mac Header
410 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
412 //Fill MICHDR0
413 *pMICHDR = 0x59;
414 *((PBYTE)(pMICHDR+1)) = 0; // TxPriority
415 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
416 *((PBYTE)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
417 *((PBYTE)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
418 *((PBYTE)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
419 *((PBYTE)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
420 *((PBYTE)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
421 *((PBYTE)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
422 *((PBYTE)(pMICHDR+14)) = HIBYTE(wPayloadLen);
423 *((PBYTE)(pMICHDR+15)) = LOBYTE(wPayloadLen);
425 //Fill MICHDR1
426 *((PBYTE)(pMICHDR+16)) = 0; // HLEN[15:8]
427 if (pDevice->bLongHeader) {
428 *((PBYTE)(pMICHDR+17)) = 28; // HLEN[7:0]
429 } else {
430 *((PBYTE)(pMICHDR+17)) = 22; // HLEN[7:0]
432 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
433 memcpy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL
434 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
435 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
437 //Fill MICHDR2
438 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
439 wValue = pMACHeader->wSeqCtl;
440 wValue &= 0x000F;
441 wValue = cpu_to_le16(wValue);
442 memcpy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL
443 if (pDevice->bLongHeader) {
444 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
450 static
451 VOID
452 s_vSWencryption (
453 PSDevice pDevice,
454 PSKeyItem pTransmitKey,
455 PBYTE pbyPayloadHead,
456 WORD wPayloadSize
459 UINT cbICVlen = 4;
460 DWORD dwICV = 0xFFFFFFFFL;
461 PDWORD pdwICV;
463 if (pTransmitKey == NULL)
464 return;
466 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
467 //=======================================================================
468 // Append ICV after payload
469 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
470 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
471 // finally, we must invert dwCRC to get the correct answer
472 *pdwICV = cpu_to_le32(~dwICV);
473 // RC4 encryption
474 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
475 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
476 //=======================================================================
477 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
478 //=======================================================================
479 //Append ICV after payload
480 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
481 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
482 // finally, we must invert dwCRC to get the correct answer
483 *pdwICV = cpu_to_le32(~dwICV);
484 // RC4 encryption
485 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
486 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
487 //=======================================================================
494 /*byPktType : PK_TYPE_11A 0
495 PK_TYPE_11B 1
496 PK_TYPE_11GB 2
497 PK_TYPE_11GA 3
499 static
500 UINT
501 s_uGetTxRsvTime (
502 PSDevice pDevice,
503 BYTE byPktType,
504 UINT cbFrameLength,
505 WORD wRate,
506 BOOL bNeedAck
509 UINT uDataTime, uAckTime;
511 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
512 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
513 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopCCKBasicRate);
514 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
515 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopOFDMBasicRate);
518 if (bNeedAck) {
519 return (uDataTime + pDevice->uSIFS + uAckTime);
521 else {
522 return uDataTime;
526 //byFreqType: 0=>5GHZ 1=>2.4GHZ
527 static
528 UINT
529 s_uGetRTSCTSRsvTime (
530 PSDevice pDevice,
531 BYTE byRTSRsvType,
532 BYTE byPktType,
533 UINT cbFrameLength,
534 WORD wCurrentRate
537 UINT uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
539 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
542 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
543 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
544 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
545 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
547 else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
548 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
549 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
550 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
552 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
553 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
554 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
556 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
557 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
558 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
559 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
560 return uRrvTime;
563 //RTSRrvTime
564 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
565 return uRrvTime;
568 //byFreqType 0: 5GHz, 1:2.4Ghz
569 static
570 UINT
571 s_uGetDataDuration (
572 PSDevice pDevice,
573 BYTE byDurType,
574 UINT cbFrameLength,
575 BYTE byPktType,
576 WORD wRate,
577 BOOL bNeedAck,
578 UINT uFragIdx,
579 UINT cbLastFragmentSize,
580 UINT uMACfragNum,
581 BYTE byFBOption
584 BOOL bLastFrag = 0;
585 UINT uAckTime =0, uNextPktTime = 0;
588 if (uFragIdx == (uMACfragNum-1)) {
589 bLastFrag = 1;
592 switch (byDurType) {
594 case DATADUR_B: //DATADUR_B
595 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
596 if (bNeedAck) {
597 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
598 return (pDevice->uSIFS + uAckTime);
599 } else {
600 return 0;
603 else {//First Frag or Mid Frag
604 if (uFragIdx == (uMACfragNum-2)) {
605 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
606 } else {
607 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
609 if (bNeedAck) {
610 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
611 return (pDevice->uSIFS + uAckTime + uNextPktTime);
612 } else {
613 return (pDevice->uSIFS + uNextPktTime);
616 break;
619 case DATADUR_A: //DATADUR_A
620 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
621 if(bNeedAck){
622 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
623 return (pDevice->uSIFS + uAckTime);
624 } else {
625 return 0;
628 else {//First Frag or Mid Frag
629 if(uFragIdx == (uMACfragNum-2)){
630 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
631 } else {
632 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
634 if(bNeedAck){
635 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
636 return (pDevice->uSIFS + uAckTime + uNextPktTime);
637 } else {
638 return (pDevice->uSIFS + uNextPktTime);
641 break;
643 case DATADUR_A_F0: //DATADUR_A_F0
644 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
645 if(bNeedAck){
646 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
647 return (pDevice->uSIFS + uAckTime);
648 } else {
649 return 0;
652 else { //First Frag or Mid Frag
653 if (byFBOption == AUTO_FB_0) {
654 if (wRate < RATE_18M)
655 wRate = RATE_18M;
656 else if (wRate > RATE_54M)
657 wRate = RATE_54M;
659 if(uFragIdx == (uMACfragNum-2)){
660 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
661 } else {
662 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
664 } else { // (byFBOption == AUTO_FB_1)
665 if (wRate < RATE_18M)
666 wRate = RATE_18M;
667 else if (wRate > RATE_54M)
668 wRate = RATE_54M;
670 if(uFragIdx == (uMACfragNum-2)){
671 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
672 } else {
673 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
677 if(bNeedAck){
678 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
679 return (pDevice->uSIFS + uAckTime + uNextPktTime);
680 } else {
681 return (pDevice->uSIFS + uNextPktTime);
684 break;
686 case DATADUR_A_F1: //DATADUR_A_F1
687 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
688 if(bNeedAck){
689 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
690 return (pDevice->uSIFS + uAckTime);
691 } else {
692 return 0;
695 else { //First Frag or Mid Frag
696 if (byFBOption == AUTO_FB_0) {
697 if (wRate < RATE_18M)
698 wRate = RATE_18M;
699 else if (wRate > RATE_54M)
700 wRate = RATE_54M;
702 if(uFragIdx == (uMACfragNum-2)){
703 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
704 } else {
705 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
708 } else { // (byFBOption == AUTO_FB_1)
709 if (wRate < RATE_18M)
710 wRate = RATE_18M;
711 else if (wRate > RATE_54M)
712 wRate = RATE_54M;
714 if(uFragIdx == (uMACfragNum-2)){
715 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
716 } else {
717 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
720 if(bNeedAck){
721 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
722 return (pDevice->uSIFS + uAckTime + uNextPktTime);
723 } else {
724 return (pDevice->uSIFS + uNextPktTime);
727 break;
729 default:
730 break;
733 ASSERT(FALSE);
734 return 0;
738 //byFreqType: 0=>5GHZ 1=>2.4GHZ
739 static
740 UINT
741 s_uGetRTSCTSDuration (
742 PSDevice pDevice,
743 BYTE byDurType,
744 UINT cbFrameLength,
745 BYTE byPktType,
746 WORD wRate,
747 BOOL bNeedAck,
748 BYTE byFBOption
751 UINT uCTSTime = 0, uDurTime = 0;
754 switch (byDurType) {
756 case RTSDUR_BB: //RTSDuration_bb
757 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
758 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
759 break;
761 case RTSDUR_BA: //RTSDuration_ba
762 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
763 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
764 break;
766 case RTSDUR_AA: //RTSDuration_aa
767 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
768 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
769 break;
771 case CTSDUR_BA: //CTSDuration_ba
772 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
773 break;
775 case RTSDUR_BA_F0: //RTSDuration_ba_f0
776 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
777 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
778 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
779 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
780 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
782 break;
784 case RTSDUR_AA_F0: //RTSDuration_aa_f0
785 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
786 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
787 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
788 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
789 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
791 break;
793 case RTSDUR_BA_F1: //RTSDuration_ba_f1
794 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
795 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
796 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
797 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
798 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
800 break;
802 case RTSDUR_AA_F1: //RTSDuration_aa_f1
803 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
804 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
805 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
806 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
807 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
809 break;
811 case CTSDUR_BA_F0: //CTSDuration_ba_f0
812 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
813 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
814 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
815 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
817 break;
819 case CTSDUR_BA_F1: //CTSDuration_ba_f1
820 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
821 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
822 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
823 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
825 break;
827 default:
828 break;
831 return uDurTime;
838 static
839 UINT
840 s_uFillDataHead (
841 PSDevice pDevice,
842 BYTE byPktType,
843 WORD wCurrentRate,
844 PVOID pTxDataHead,
845 UINT cbFrameLength,
846 UINT uDMAIdx,
847 BOOL bNeedAck,
848 UINT uFragIdx,
849 UINT cbLastFragmentSize,
850 UINT uMACfragNum,
851 BYTE byFBOption
855 if (pTxDataHead == NULL) {
856 return 0;
859 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
860 if((uDMAIdx==TYPE_ATIMDMA)||(uDMAIdx==TYPE_BEACONDMA)) {
861 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
862 //Get SignalField,ServiceField,Length
863 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
864 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
866 //Get Duration and TimeStampOff
867 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
868 wCurrentRate, bNeedAck, uFragIdx,
869 cbLastFragmentSize, uMACfragNum,
870 byFBOption); //1: 2.4GHz
871 if(uDMAIdx!=TYPE_ATIMDMA) {
872 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
874 return (pBuf->wDuration);
876 else { // DATA & MANAGE Frame
877 if (byFBOption == AUTO_FB_NONE) {
878 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
879 //Get SignalField,ServiceField,Length
880 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
881 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
883 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
884 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
886 //Get Duration and TimeStamp
887 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
888 byPktType, wCurrentRate, bNeedAck, uFragIdx,
889 cbLastFragmentSize, uMACfragNum,
890 byFBOption); //1: 2.4GHz
891 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
892 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
893 bNeedAck, uFragIdx, cbLastFragmentSize,
894 uMACfragNum, byFBOption); //1: 2.4GHz
896 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
897 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
898 return (pBuf->wDuration_a);
899 } else {
900 // Auto Fallback
901 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
902 //Get SignalField,ServiceField,Length
903 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
904 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
906 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
907 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
909 //Get Duration and TimeStamp
910 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
911 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
912 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
913 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
914 pBuf->wDuration_a_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
915 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
916 pBuf->wDuration_a_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
917 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
918 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
919 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
920 return (pBuf->wDuration_a);
921 } //if (byFBOption == AUTO_FB_NONE)
924 else if (byPktType == PK_TYPE_11A) {
925 if ((byFBOption != AUTO_FB_NONE) && (uDMAIdx != TYPE_ATIMDMA) && (uDMAIdx != TYPE_BEACONDMA)) {
926 // Auto Fallback
927 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
928 //Get SignalField,ServiceField,Length
929 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
930 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
932 //Get Duration and TimeStampOff
933 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
934 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
935 pBuf->wDuration_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
936 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
937 pBuf->wDuration_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
938 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
939 if(uDMAIdx!=TYPE_ATIMDMA) {
940 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
942 return (pBuf->wDuration);
943 } else {
944 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
945 //Get SignalField,ServiceField,Length
946 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
947 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
949 //Get Duration and TimeStampOff
950 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
951 wCurrentRate, bNeedAck, uFragIdx,
952 cbLastFragmentSize, uMACfragNum,
953 byFBOption);
955 if(uDMAIdx!=TYPE_ATIMDMA) {
956 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
958 return (pBuf->wDuration);
961 else if (byPktType == PK_TYPE_11B) {
962 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
963 //Get SignalField,ServiceField,Length
964 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
965 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
967 //Get Duration and TimeStampOff
968 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
969 wCurrentRate, bNeedAck, uFragIdx,
970 cbLastFragmentSize, uMACfragNum,
971 byFBOption);
972 if (uDMAIdx != TYPE_ATIMDMA) {
973 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
975 return (pBuf->wDuration);
977 return 0;
983 static
984 VOID
985 s_vFillRTSHead (
986 PSDevice pDevice,
987 BYTE byPktType,
988 PVOID pvRTS,
989 UINT cbFrameLength,
990 BOOL bNeedAck,
991 BOOL bDisCRC,
992 PSEthernetHeader psEthHeader,
993 WORD wCurrentRate,
994 BYTE byFBOption
997 UINT uRTSFrameLen = 20;
998 WORD wLen = 0x0000;
1000 if (pvRTS == NULL)
1001 return;
1003 if (bDisCRC) {
1004 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
1005 // in this case we need to decrease its length by 4.
1006 uRTSFrameLen -= 4;
1009 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
1010 // Otherwise, we need to modified codes for them.
1011 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1012 if (byFBOption == AUTO_FB_NONE) {
1013 PSRTS_g pBuf = (PSRTS_g)pvRTS;
1014 //Get SignalField,ServiceField,Length
1015 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1016 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1018 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1019 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1020 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1022 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1023 //Get Duration
1024 pBuf->wDuration_bb = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1025 pBuf->wDuration_aa = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
1026 pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1028 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1029 //Get RTS Frame body
1030 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1032 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1033 (pDevice->eOPMode == OP_MODE_AP)) {
1034 memcpy(&(pBuf->Data.abyRA[0]),
1035 &(psEthHeader->abyDstAddr[0]),
1036 ETH_ALEN);
1038 else {
1039 memcpy(&(pBuf->Data.abyRA[0]),
1040 &(pDevice->abyBSSID[0]),
1041 ETH_ALEN);
1043 if (pDevice->eOPMode == OP_MODE_AP) {
1044 memcpy(&(pBuf->Data.abyTA[0]),
1045 &(pDevice->abyBSSID[0]),
1046 ETH_ALEN);
1048 else {
1049 memcpy(&(pBuf->Data.abyTA[0]),
1050 &(psEthHeader->abySrcAddr[0]),
1051 ETH_ALEN);
1054 else {
1055 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
1056 //Get SignalField,ServiceField,Length
1057 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1058 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1060 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1061 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1062 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1064 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1065 //Get Duration
1066 pBuf->wDuration_bb = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1067 pBuf->wDuration_aa = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
1068 pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
1069 pBuf->wRTSDuration_ba_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
1070 pBuf->wRTSDuration_aa_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
1071 pBuf->wRTSDuration_ba_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
1072 pBuf->wRTSDuration_aa_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
1073 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1074 //Get RTS Frame body
1075 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1077 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1078 (pDevice->eOPMode == OP_MODE_AP)) {
1079 memcpy(&(pBuf->Data.abyRA[0]),
1080 &(psEthHeader->abyDstAddr[0]),
1081 ETH_ALEN);
1083 else {
1084 memcpy(&(pBuf->Data.abyRA[0]),
1085 &(pDevice->abyBSSID[0]),
1086 ETH_ALEN);
1089 if (pDevice->eOPMode == OP_MODE_AP) {
1090 memcpy(&(pBuf->Data.abyTA[0]),
1091 &(pDevice->abyBSSID[0]),
1092 ETH_ALEN);
1094 else {
1095 memcpy(&(pBuf->Data.abyTA[0]),
1096 &(psEthHeader->abySrcAddr[0]),
1097 ETH_ALEN);
1100 } // if (byFBOption == AUTO_FB_NONE)
1102 else if (byPktType == PK_TYPE_11A) {
1103 if (byFBOption == AUTO_FB_NONE) {
1104 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1105 //Get SignalField,ServiceField,Length
1106 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1107 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1109 pBuf->wTransmitLength = cpu_to_le16(wLen);
1110 //Get Duration
1111 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1112 pBuf->Data.wDurationID = pBuf->wDuration;
1113 //Get RTS Frame body
1114 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1116 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1117 (pDevice->eOPMode == OP_MODE_AP)) {
1118 memcpy(&(pBuf->Data.abyRA[0]),
1119 &(psEthHeader->abyDstAddr[0]),
1120 ETH_ALEN);
1121 } else {
1122 memcpy(&(pBuf->Data.abyRA[0]),
1123 &(pDevice->abyBSSID[0]),
1124 ETH_ALEN);
1127 if (pDevice->eOPMode == OP_MODE_AP) {
1128 memcpy(&(pBuf->Data.abyTA[0]),
1129 &(pDevice->abyBSSID[0]),
1130 ETH_ALEN);
1131 } else {
1132 memcpy(&(pBuf->Data.abyTA[0]),
1133 &(psEthHeader->abySrcAddr[0]),
1134 ETH_ALEN);
1138 else {
1139 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
1140 //Get SignalField,ServiceField,Length
1141 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1142 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1144 pBuf->wTransmitLength = cpu_to_le16(wLen);
1145 //Get Duration
1146 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1147 pBuf->wRTSDuration_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
1148 pBuf->wRTSDuration_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:RTSDuration_aa_f1, 0:5G, 0:
1149 pBuf->Data.wDurationID = pBuf->wDuration;
1150 //Get RTS Frame body
1151 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1153 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1154 (pDevice->eOPMode == OP_MODE_AP)) {
1155 memcpy(&(pBuf->Data.abyRA[0]),
1156 &(psEthHeader->abyDstAddr[0]),
1157 ETH_ALEN);
1158 } else {
1159 memcpy(&(pBuf->Data.abyRA[0]),
1160 &(pDevice->abyBSSID[0]),
1161 ETH_ALEN);
1163 if (pDevice->eOPMode == OP_MODE_AP) {
1164 memcpy(&(pBuf->Data.abyTA[0]),
1165 &(pDevice->abyBSSID[0]),
1166 ETH_ALEN);
1167 } else {
1168 memcpy(&(pBuf->Data.abyTA[0]),
1169 &(psEthHeader->abySrcAddr[0]),
1170 ETH_ALEN);
1174 else if (byPktType == PK_TYPE_11B) {
1175 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1176 //Get SignalField,ServiceField,Length
1177 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1178 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1180 pBuf->wTransmitLength = cpu_to_le16(wLen);
1181 //Get Duration
1182 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1183 pBuf->Data.wDurationID = pBuf->wDuration;
1184 //Get RTS Frame body
1185 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1187 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1188 (pDevice->eOPMode == OP_MODE_AP)) {
1189 memcpy(&(pBuf->Data.abyRA[0]),
1190 &(psEthHeader->abyDstAddr[0]),
1191 ETH_ALEN);
1193 else {
1194 memcpy(&(pBuf->Data.abyRA[0]),
1195 &(pDevice->abyBSSID[0]),
1196 ETH_ALEN);
1199 if (pDevice->eOPMode == OP_MODE_AP) {
1200 memcpy(&(pBuf->Data.abyTA[0]),
1201 &(pDevice->abyBSSID[0]),
1202 ETH_ALEN);
1203 } else {
1204 memcpy(&(pBuf->Data.abyTA[0]),
1205 &(psEthHeader->abySrcAddr[0]),
1206 ETH_ALEN);
1211 static
1212 VOID
1213 s_vFillCTSHead (
1214 PSDevice pDevice,
1215 UINT uDMAIdx,
1216 BYTE byPktType,
1217 PVOID pvCTS,
1218 UINT cbFrameLength,
1219 BOOL bNeedAck,
1220 BOOL bDisCRC,
1221 WORD wCurrentRate,
1222 BYTE byFBOption
1225 UINT uCTSFrameLen = 14;
1226 WORD wLen = 0x0000;
1228 if (pvCTS == NULL) {
1229 return;
1232 if (bDisCRC) {
1233 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1234 // in this case we need to decrease its length by 4.
1235 uCTSFrameLen -= 4;
1238 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1239 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1240 // Auto Fall back
1241 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1242 //Get SignalField,ServiceField,Length
1243 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1244 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1246 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1247 pBuf->wDuration_ba = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1248 pBuf->wDuration_ba += pDevice->wCTSDuration;
1249 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1250 //Get CTSDuration_ba_f0
1251 pBuf->wCTSDuration_ba_f0 = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
1252 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1253 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1254 //Get CTSDuration_ba_f1
1255 pBuf->wCTSDuration_ba_f1 = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
1256 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1257 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1258 //Get CTS Frame body
1259 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1260 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1261 pBuf->Data.wReserved = 0x0000;
1262 memcpy(&(pBuf->Data.abyRA[0]),
1263 &(pDevice->abyCurrentNetAddr[0]),
1264 ETH_ALEN);
1265 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1266 PSCTS pBuf = (PSCTS)pvCTS;
1267 //Get SignalField,ServiceField,Length
1268 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1269 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1271 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1272 //Get CTSDuration_ba
1273 pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1274 pBuf->wDuration_ba += pDevice->wCTSDuration;
1275 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1277 //Get CTS Frame body
1278 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1279 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1280 pBuf->Data.wReserved = 0x0000;
1281 memcpy(&(pBuf->Data.abyRA[0]),
1282 &(pDevice->abyCurrentNetAddr[0]),
1283 ETH_ALEN);
1290 * Description:
1291 * Generate FIFO control for MAC & Baseband controller
1293 * Parameters:
1294 * In:
1295 * pDevice - Pointer to adpater
1296 * pTxDataHead - Transmit Data Buffer
1297 * pTxBufHead - pTxBufHead
1298 * pvRrvTime - pvRrvTime
1299 * pvRTS - RTS Buffer
1300 * pCTS - CTS Buffer
1301 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1302 * bNeedACK - If need ACK
1303 * uDMAIdx - DMA Index
1304 * Out:
1305 * none
1307 * Return Value: none
1310 // UINT cbFrameSize,//Hdr+Payload+FCS
1311 static
1312 VOID
1313 s_vGenerateTxParameter (
1314 PSDevice pDevice,
1315 BYTE byPktType,
1316 WORD wCurrentRate,
1317 PVOID pTxBufHead,
1318 PVOID pvRrvTime,
1319 PVOID pvRTS,
1320 PVOID pvCTS,
1321 UINT cbFrameSize,
1322 BOOL bNeedACK,
1323 UINT uDMAIdx,
1324 PSEthernetHeader psEthHeader
1327 UINT cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1328 WORD wFifoCtl;
1329 BOOL bDisCRC = FALSE;
1330 BYTE byFBOption = AUTO_FB_NONE;
1331 // WORD wCurrentRate = pDevice->wCurrentRate;
1333 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1334 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1335 pFifoHead->wReserved = wCurrentRate;
1336 wFifoCtl = pFifoHead->wFIFOCtl;
1338 if (wFifoCtl & FIFOCTL_CRCDIS) {
1339 bDisCRC = TRUE;
1342 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1343 byFBOption = AUTO_FB_0;
1345 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1346 byFBOption = AUTO_FB_1;
1349 if (pDevice->bLongHeader)
1350 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1352 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1354 if (pvRTS != NULL) { //RTS_need
1355 //Fill RsvTime
1356 if (pvRrvTime) {
1357 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1358 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1359 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1360 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1361 pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1362 pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1364 //Fill RTS
1365 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1367 else {//RTS_needless, PCF mode
1369 //Fill RsvTime
1370 if (pvRrvTime) {
1371 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1372 pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1373 pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1374 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1376 //Fill CTS
1377 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1380 else if (byPktType == PK_TYPE_11A) {
1382 if (pvRTS != NULL) {//RTS_need, non PCF mode
1383 //Fill RsvTime
1384 if (pvRrvTime) {
1385 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1386 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1387 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1389 //Fill RTS
1390 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1392 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1393 //Fill RsvTime
1394 if (pvRrvTime) {
1395 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1396 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1400 else if (byPktType == PK_TYPE_11B) {
1402 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1403 //Fill RsvTime
1404 if (pvRrvTime) {
1405 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1406 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1407 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1409 //Fill RTS
1410 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1412 else { //RTS_needless, non PCF mode
1413 //Fill RsvTime
1414 if (pvRrvTime) {
1415 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1416 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1420 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1423 PBYTE pbyBuffer,//point to pTxBufHead
1424 WORD wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1425 UINT cbFragmentSize,//Hdr+payoad+FCS
1429 BOOL
1430 s_bPacketToWirelessUsb(
1431 PSDevice pDevice,
1432 BYTE byPktType,
1433 PBYTE usbPacketBuf,
1434 BOOL bNeedEncryption,
1435 UINT uSkbPacketLen,
1436 UINT uDMAIdx,
1437 PSEthernetHeader psEthHeader,
1438 PBYTE pPacket,
1439 PSKeyItem pTransmitKey,
1440 UINT uNodeIndex,
1441 WORD wCurrentRate,
1442 OUT UINT *pcbHeaderLen,
1443 OUT UINT *pcbTotalLen
1446 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1447 UINT cbFrameSize,cbFrameBodySize;
1448 PTX_BUFFER pTxBufHead;
1449 UINT cb802_1_H_len;
1450 UINT cbIVlen=0,cbICVlen=0,cbMIClen=0,cbMACHdLen=0,cbFCSlen=4;
1451 UINT cbMICHDR = 0;
1452 BOOL bNeedACK,bRTS;
1453 PBYTE pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr;
1454 BYTE abySNAP_RFC1042[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
1455 BYTE abySNAP_Bridgetunnel[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
1456 UINT uDuration;
1457 UINT cbHeaderLength= 0,uPadding = 0;
1458 PVOID pvRrvTime;
1459 PSMICHDRHead pMICHDR;
1460 PVOID pvRTS;
1461 PVOID pvCTS;
1462 PVOID pvTxDataHd;
1463 BYTE byFBOption = AUTO_FB_NONE,byFragType;
1464 WORD wTxBufSize;
1465 DWORD dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC;
1466 PDWORD pdwMIC_L,pdwMIC_R;
1467 BOOL bSoftWEP = FALSE;
1472 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1473 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1474 if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) {
1475 // WEP 256
1476 bSoftWEP = TRUE;
1480 pTxBufHead = (PTX_BUFFER) usbPacketBuf;
1481 memset(pTxBufHead, 0, sizeof(TX_BUFFER));
1483 // Get pkt type
1484 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1485 if (pDevice->dwDiagRefCount == 0) {
1486 cb802_1_H_len = 8;
1487 } else {
1488 cb802_1_H_len = 2;
1490 } else {
1491 cb802_1_H_len = 0;
1494 cbFrameBodySize = uSkbPacketLen - U_HEADER_LEN + cb802_1_H_len;
1496 //Set packet type
1497 pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8);
1499 if (pDevice->dwDiagRefCount != 0) {
1500 bNeedACK = FALSE;
1501 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1502 } else { //if (pDevice->dwDiagRefCount != 0) {
1503 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1504 (pDevice->eOPMode == OP_MODE_AP)) {
1505 if (IS_MULTICAST_ADDRESS(&(psEthHeader->abyDstAddr[0])) ||
1506 IS_BROADCAST_ADDRESS(&(psEthHeader->abyDstAddr[0]))) {
1507 bNeedACK = FALSE;
1508 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1510 else {
1511 bNeedACK = TRUE;
1512 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1515 else {
1516 // MSDUs in Infra mode always need ACK
1517 bNeedACK = TRUE;
1518 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1520 } //if (pDevice->dwDiagRefCount != 0) {
1522 pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
1524 //Set FIFOCTL_LHEAD
1525 if (pDevice->bLongHeader)
1526 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1528 if (pDevice->bSoftwareGenCrcErr) {
1529 pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC
1532 //Set FRAGCTL_MACHDCNT
1533 if (pDevice->bLongHeader) {
1534 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1535 } else {
1536 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1538 pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10);
1540 //Set FIFOCTL_GrpAckPolicy
1541 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
1542 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1545 //Set Auto Fallback Ctl
1546 if (wCurrentRate >= RATE_18M) {
1547 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
1548 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1549 byFBOption = AUTO_FB_0;
1550 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
1551 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1552 byFBOption = AUTO_FB_1;
1556 if (bSoftWEP != TRUE) {
1557 if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled
1558 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1559 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1561 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1562 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");
1563 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1565 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1566 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1572 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1573 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1574 cbIVlen = 4;
1575 cbICVlen = 4;
1577 else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1578 cbIVlen = 8;//IV+ExtIV
1579 cbMIClen = 8;
1580 cbICVlen = 4;
1582 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1583 cbIVlen = 8;//RSN Header
1584 cbICVlen = 8;//MIC
1585 cbMICHDR = sizeof(SMICHDRHead);
1587 if (bSoftWEP == FALSE) {
1588 //MAC Header should be padding 0 to DW alignment.
1589 uPadding = 4 - (cbMACHdLen%4);
1590 uPadding %= 4;
1594 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1596 if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) {
1597 bRTS = FALSE;
1598 } else {
1599 bRTS = TRUE;
1600 pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1603 pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]);
1604 wTxBufSize = sizeof(STxBufHead);
1605 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1606 if (byFBOption == AUTO_FB_NONE) {
1607 if (bRTS == TRUE) {//RTS_need
1608 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1609 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1610 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1611 pvCTS = NULL;
1612 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1613 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1615 else { //RTS_needless
1616 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1617 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1618 pvRTS = NULL;
1619 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1620 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1621 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1623 } else {
1624 // Auto Fall Back
1625 if (bRTS == TRUE) {//RTS_need
1626 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1627 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1628 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1629 pvCTS = NULL;
1630 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1631 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1633 else if (bRTS == FALSE) { //RTS_needless
1634 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1635 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1636 pvRTS = NULL;
1637 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1638 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1639 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1641 } // Auto Fall Back
1643 else {//802.11a/b packet
1644 if (byFBOption == AUTO_FB_NONE) {
1645 if (bRTS == TRUE) {//RTS_need
1646 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1647 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1648 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1649 pvCTS = NULL;
1650 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1651 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1653 else if (bRTS == FALSE) { //RTS_needless, no MICHDR
1654 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1655 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1656 pvRTS = NULL;
1657 pvCTS = NULL;
1658 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1659 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1661 } else {
1662 // Auto Fall Back
1663 if (bRTS == TRUE) {//RTS_need
1664 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1665 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1666 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1667 pvCTS = NULL;
1668 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1669 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1671 else if (bRTS == FALSE) { //RTS_needless
1672 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1673 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1674 pvRTS = NULL;
1675 pvCTS = NULL;
1676 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1677 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1679 } // Auto Fall Back
1682 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderLength);
1683 pbyIVHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding);
1684 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1687 //=========================
1688 // No Fragmentation
1689 //=========================
1690 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1691 byFragType = FRAGCTL_NONFRAG;
1692 //uDMAIdx = TYPE_AC0DMA;
1693 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
1696 //Fill FIFO,RrvTime,RTS,and CTS
1697 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, (PVOID)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
1698 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
1699 //Fill DataHead
1700 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1701 0, 0, 1/*uMACfragNum*/, byFBOption);
1702 // Generate TX MAC Header
1703 s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption,
1704 byFragType, uDMAIdx, 0);
1706 if (bNeedEncryption == TRUE) {
1707 //Fill TXKEY
1708 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1709 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
1711 if (pDevice->bEnableHostWEP) {
1712 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1713 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1717 // 802.1H
1718 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1719 if (pDevice->dwDiagRefCount == 0) {
1720 if ( (psEthHeader->wType == TYPE_PKT_IPX) ||
1721 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1722 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_Bridgetunnel[0], 6);
1723 } else {
1724 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
1726 pbyType = (PBYTE) (pbyPayloadHead + 6);
1727 memcpy(pbyType, &(psEthHeader->wType), sizeof(WORD));
1728 } else {
1729 memcpy((PBYTE) (pbyPayloadHead), &(psEthHeader->wType), sizeof(WORD));
1736 if (pPacket != NULL) {
1737 // Copy the Packet into a tx Buffer
1738 memcpy((pbyPayloadHead + cb802_1_H_len),
1739 (pPacket + U_HEADER_LEN),
1740 uSkbPacketLen - U_HEADER_LEN
1743 } else {
1744 // while bRelayPacketSend psEthHeader is point to header+payload
1745 memcpy((pbyPayloadHead + cb802_1_H_len), ((PBYTE)psEthHeader)+U_HEADER_LEN, uSkbPacketLen - U_HEADER_LEN);
1748 ASSERT(uLength == cbNdisBodySize);
1750 if ((bNeedEncryption == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1752 ///////////////////////////////////////////////////////////////////
1754 if (pDevice->sMgmtObj.eAuthenMode == WMAC_AUTH_WPANONE) {
1755 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1756 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1758 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1759 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1760 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1762 else {
1763 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[24]);
1764 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[28]);
1766 // DO Software Michael
1767 MIC_vInit(dwMICKey0, dwMICKey1);
1768 MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12);
1769 dwMIC_Priority = 0;
1770 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
1771 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1773 ///////////////////////////////////////////////////////////////////
1775 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1776 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1777 // DBG_PRN_GRP12(("%02x ", *((PBYTE)((pbyPayloadHead + cb802_1_H_len) + ii))));
1779 //DBG_PRN_GRP12(("\n\n\n"));
1781 MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
1783 pdwMIC_L = (PDWORD)(pbyPayloadHead + cbFrameBodySize);
1784 pdwMIC_R = (PDWORD)(pbyPayloadHead + cbFrameBodySize + 4);
1786 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1787 MIC_vUnInit();
1789 if (pDevice->bTxMICFail == TRUE) {
1790 *pdwMIC_L = 0;
1791 *pdwMIC_R = 0;
1792 pDevice->bTxMICFail = FALSE;
1794 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1795 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1796 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1800 if (bSoftWEP == TRUE) {
1802 s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (WORD)(cbFrameBodySize + cbMIClen));
1804 } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == TRUE)) ||
1805 ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == TRUE)) ||
1806 ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == TRUE)) ) {
1807 cbFrameSize -= cbICVlen;
1810 if (pDevice->bSoftwareGenCrcErr == TRUE) {
1811 UINT cbLen;
1812 PDWORD pdwCRC;
1814 dwCRC = 0xFFFFFFFFL;
1815 cbLen = cbFrameSize - cbFCSlen;
1816 // calculate CRC, and wrtie CRC value to end of TD
1817 dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
1818 pdwCRC = (PDWORD)(pbyMacHdr + cbLen);
1819 // finally, we must invert dwCRC to get the correct answer
1820 *pdwCRC = ~dwCRC;
1821 // Force Error
1822 *pdwCRC -= 1;
1823 } else {
1824 cbFrameSize -= cbFCSlen;
1827 *pcbHeaderLen = cbHeaderLength;
1828 *pcbTotalLen = cbHeaderLength + cbFrameSize ;
1831 //Set FragCtl in TxBufferHead
1832 pTxBufHead->wFragCtl |= (WORD)byFragType;
1835 return TRUE;
1842 * Description:
1843 * Translate 802.3 to 802.11 header
1845 * Parameters:
1846 * In:
1847 * pDevice - Pointer to adpater
1848 * dwTxBufferAddr - Transmit Buffer
1849 * pPacket - Packet from upper layer
1850 * cbPacketSize - Transmit Data Length
1851 * Out:
1852 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1853 * pcbAppendPayload - size of append payload for 802.1H translation
1855 * Return Value: none
1859 VOID
1860 s_vGenerateMACHeader (
1861 PSDevice pDevice,
1862 PBYTE pbyBufferAddr,
1863 WORD wDuration,
1864 PSEthernetHeader psEthHeader,
1865 BOOL bNeedEncrypt,
1866 WORD wFragType,
1867 UINT uDMAIdx,
1868 UINT uFragIdx
1871 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
1873 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
1875 if (uDMAIdx == TYPE_ATIMDMA) {
1876 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
1877 } else {
1878 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
1881 if (pDevice->eOPMode == OP_MODE_AP) {
1882 memcpy(&(pMACHeader->abyAddr1[0]),
1883 &(psEthHeader->abyDstAddr[0]),
1884 ETH_ALEN);
1885 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1886 memcpy(&(pMACHeader->abyAddr3[0]),
1887 &(psEthHeader->abySrcAddr[0]),
1888 ETH_ALEN);
1889 pMACHeader->wFrameCtl |= FC_FROMDS;
1890 } else {
1891 if (pDevice->eOPMode == OP_MODE_ADHOC) {
1892 memcpy(&(pMACHeader->abyAddr1[0]),
1893 &(psEthHeader->abyDstAddr[0]),
1894 ETH_ALEN);
1895 memcpy(&(pMACHeader->abyAddr2[0]),
1896 &(psEthHeader->abySrcAddr[0]),
1897 ETH_ALEN);
1898 memcpy(&(pMACHeader->abyAddr3[0]),
1899 &(pDevice->abyBSSID[0]),
1900 ETH_ALEN);
1901 } else {
1902 memcpy(&(pMACHeader->abyAddr3[0]),
1903 &(psEthHeader->abyDstAddr[0]),
1904 ETH_ALEN);
1905 memcpy(&(pMACHeader->abyAddr2[0]),
1906 &(psEthHeader->abySrcAddr[0]),
1907 ETH_ALEN);
1908 memcpy(&(pMACHeader->abyAddr1[0]),
1909 &(pDevice->abyBSSID[0]),
1910 ETH_ALEN);
1911 pMACHeader->wFrameCtl |= FC_TODS;
1915 if (bNeedEncrypt)
1916 pMACHeader->wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_ISWEP(1));
1918 pMACHeader->wDurationID = cpu_to_le16(wDuration);
1920 if (pDevice->bLongHeader) {
1921 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
1922 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
1923 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
1925 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
1927 //Set FragNumber in Sequence Control
1928 pMACHeader->wSeqCtl |= cpu_to_le16((WORD)uFragIdx);
1930 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
1931 pDevice->wSeqCounter++;
1932 if (pDevice->wSeqCounter > 0x0fff)
1933 pDevice->wSeqCounter = 0;
1936 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
1937 pMACHeader->wFrameCtl |= FC_MOREFRAG;
1945 * Description:
1946 * Request instructs a MAC to transmit a 802.11 management packet through
1947 * the adapter onto the medium.
1949 * Parameters:
1950 * In:
1951 * hDeviceContext - Pointer to the adapter
1952 * pPacket - A pointer to a descriptor for the packet to transmit
1953 * Out:
1954 * none
1956 * Return Value: CMD_STATUS_PENDING if MAC Tx resource avaliable; otherwise FALSE
1960 CMD_STATUS csMgmt_xmit(
1961 PSDevice pDevice,
1962 PSTxMgmtPacket pPacket
1965 BYTE byPktType;
1966 PBYTE pbyTxBufferAddr;
1967 PVOID pvRTS;
1968 PSCTS pCTS;
1969 PVOID pvTxDataHd;
1970 UINT uDuration;
1971 UINT cbReqCount;
1972 PS802_11Header pMACHeader;
1973 UINT cbHeaderSize;
1974 UINT cbFrameBodySize;
1975 BOOL bNeedACK;
1976 BOOL bIsPSPOLL = FALSE;
1977 PSTxBufHead pTxBufHead;
1978 UINT cbFrameSize;
1979 UINT cbIVlen = 0;
1980 UINT cbICVlen = 0;
1981 UINT cbMIClen = 0;
1982 UINT cbFCSlen = 4;
1983 UINT uPadding = 0;
1984 WORD wTxBufSize;
1985 UINT cbMacHdLen;
1986 SEthernetHeader sEthHeader;
1987 PVOID pvRrvTime;
1988 PVOID pMICHDR;
1989 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1990 WORD wCurrentRate = RATE_1M;
1991 PTX_BUFFER pTX_Buffer;
1992 PUSB_SEND_CONTEXT pContext;
1996 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1998 if (NULL == pContext) {
1999 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2000 return CMD_STATUS_RESOURCES;
2003 pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
2004 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->adwTxKey[0]);
2005 cbFrameBodySize = pPacket->cbPayloadLen;
2006 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2007 wTxBufSize = sizeof(STxBufHead);
2008 memset(pTxBufHead, 0, wTxBufSize);
2010 if (pDevice->byBBType == BB_TYPE_11A) {
2011 wCurrentRate = RATE_6M;
2012 byPktType = PK_TYPE_11A;
2013 } else {
2014 wCurrentRate = RATE_1M;
2015 byPktType = PK_TYPE_11B;
2018 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2019 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2020 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2021 // to set power here.
2022 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2023 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2024 } else {
2025 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2027 pDevice->wCurrentRate = wCurrentRate;
2030 //Set packet type
2031 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2032 pTxBufHead->wFIFOCtl = 0;
2034 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2035 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2037 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2038 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2040 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2041 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2044 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2045 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2048 if (IS_MULTICAST_ADDRESS(&(pPacket->p80211Header->sA3.abyAddr1[0])) ||
2049 IS_BROADCAST_ADDRESS(&(pPacket->p80211Header->sA3.abyAddr1[0]))) {
2050 bNeedACK = FALSE;
2052 else {
2053 bNeedACK = TRUE;
2054 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2057 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2058 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2060 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2061 //Set Preamble type always long
2062 //pDevice->byPreambleType = PREAMBLE_LONG;
2063 // probe-response don't retry
2064 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2065 // bNeedACK = FALSE;
2066 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2070 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2072 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2073 bIsPSPOLL = TRUE;
2074 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2075 } else {
2076 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2079 //Set FRAGCTL_MACHDCNT
2080 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)(cbMacHdLen << 10));
2082 // Notes:
2083 // Although spec says MMPDU can be fragmented; In most case,
2084 // no one will send a MMPDU under fragmentation. With RTS may occur.
2085 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2087 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2088 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2089 cbIVlen = 4;
2090 cbICVlen = 4;
2091 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2093 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2094 cbIVlen = 8;//IV+ExtIV
2095 cbMIClen = 8;
2096 cbICVlen = 4;
2097 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2098 //We need to get seed here for filling TxKey entry.
2099 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2100 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2102 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2103 cbIVlen = 8;//RSN Header
2104 cbICVlen = 8;//MIC
2105 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2106 pDevice->bAES = TRUE;
2108 //MAC Header should be padding 0 to DW alignment.
2109 uPadding = 4 - (cbMacHdLen%4);
2110 uPadding %= 4;
2113 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2115 //Set FIFOCTL_GrpAckPolicy
2116 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2117 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2119 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2121 //Set RrvTime/RTS/CTS Buffer
2122 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2124 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2125 pMICHDR = NULL;
2126 pvRTS = NULL;
2127 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2128 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2129 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2131 else { // 802.11a/b packet
2132 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2133 pMICHDR = NULL;
2134 pvRTS = NULL;
2135 pCTS = NULL;
2136 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2137 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2140 memset((PVOID)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2142 memcpy(&(sEthHeader.abyDstAddr[0]),
2143 &(pPacket->p80211Header->sA3.abyAddr1[0]),
2144 ETH_ALEN);
2145 memcpy(&(sEthHeader.abySrcAddr[0]),
2146 &(pPacket->p80211Header->sA3.abyAddr2[0]),
2147 ETH_ALEN);
2148 //=========================
2149 // No Fragmentation
2150 //=========================
2151 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2154 //Fill FIFO,RrvTime,RTS,and CTS
2155 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2156 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2158 //Fill DataHead
2159 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2160 0, 0, 1, AUTO_FB_NONE);
2162 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2164 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2166 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2167 PBYTE pbyIVHead;
2168 PBYTE pbyPayloadHead;
2169 PBYTE pbyBSSID;
2170 PSKeyItem pTransmitKey = NULL;
2172 pbyIVHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2173 pbyPayloadHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2174 do {
2175 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2176 (pDevice->bLinkPass == TRUE)) {
2177 pbyBSSID = pDevice->abyBSSID;
2178 // get pairwise key
2179 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2180 // get group key
2181 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2182 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2183 break;
2185 } else {
2186 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2187 break;
2190 // get group key
2191 pbyBSSID = pDevice->abyBroadcastAddr;
2192 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2193 pTransmitKey = NULL;
2194 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2195 } else {
2196 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2198 } while(FALSE);
2199 //Fill TXKEY
2200 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2201 (PBYTE)pMACHeader, (WORD)cbFrameBodySize, NULL);
2203 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2204 memcpy(pbyPayloadHead, ((PBYTE)(pPacket->p80211Header) + cbMacHdLen),
2205 cbFrameBodySize);
2207 else {
2208 // Copy the Packet into a tx Buffer
2209 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2212 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2213 pDevice->wSeqCounter++ ;
2214 if (pDevice->wSeqCounter > 0x0fff)
2215 pDevice->wSeqCounter = 0;
2217 if (bIsPSPOLL) {
2218 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2219 // of FIFO control header.
2220 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2221 // in the same place of other packet's Duration-field).
2222 // And it will cause Cisco-AP to issue Disassociation-packet
2223 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2224 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2225 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2226 } else {
2227 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2232 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2233 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2234 pTX_Buffer->byType = 0x00;
2236 pContext->pPacket = NULL;
2237 pContext->Type = CONTEXT_MGMT_PACKET;
2238 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2240 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2241 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2243 else {
2244 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2247 PIPEnsSendBulkOut(pDevice,pContext);
2248 return CMD_STATUS_PENDING;
2252 CMD_STATUS
2253 csBeacon_xmit(
2254 PSDevice pDevice,
2255 PSTxMgmtPacket pPacket
2259 UINT cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2260 UINT cbHeaderSize = 0;
2261 WORD wTxBufSize = sizeof(STxShortBufHead);
2262 PSTxShortBufHead pTxBufHead;
2263 PS802_11Header pMACHeader;
2264 PSTxDataHead_ab pTxDataHead;
2265 WORD wCurrentRate;
2266 UINT cbFrameBodySize;
2267 UINT cbReqCount;
2268 PBEACON_BUFFER pTX_Buffer;
2269 PBYTE pbyTxBufferAddr;
2270 PUSB_SEND_CONTEXT pContext;
2271 CMD_STATUS status;
2274 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2275 if (NULL == pContext) {
2276 status = CMD_STATUS_RESOURCES;
2277 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2278 return status ;
2280 pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
2281 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->wFIFOCtl);
2283 cbFrameBodySize = pPacket->cbPayloadLen;
2285 pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
2286 wTxBufSize = sizeof(STxShortBufHead);
2287 memset(pTxBufHead, 0, wTxBufSize);
2289 if (pDevice->byBBType == BB_TYPE_11A) {
2290 wCurrentRate = RATE_6M;
2291 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2292 //Get SignalField,ServiceField,Length
2293 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
2294 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2296 //Get Duration and TimeStampOff
2297 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
2298 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2299 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2300 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2301 } else {
2302 wCurrentRate = RATE_1M;
2303 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2304 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2305 //Get SignalField,ServiceField,Length
2306 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
2307 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2309 //Get Duration and TimeStampOff
2310 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
2311 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2312 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2313 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2316 //Generate Beacon Header
2317 pMACHeader = (PS802_11Header)(pbyTxBufferAddr + cbHeaderSize);
2318 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2320 pMACHeader->wDurationID = 0;
2321 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2322 pDevice->wSeqCounter++ ;
2323 if (pDevice->wSeqCounter > 0x0fff)
2324 pDevice->wSeqCounter = 0;
2326 cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
2328 pTX_Buffer->wTxByteCount = (WORD)cbReqCount;
2329 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2330 pTX_Buffer->byType = 0x01;
2332 pContext->pPacket = NULL;
2333 pContext->Type = CONTEXT_MGMT_PACKET;
2334 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2336 PIPEnsSendBulkOut(pDevice,pContext);
2337 return CMD_STATUS_PENDING;
2345 VOID
2346 vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
2348 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2349 BYTE byPktType;
2350 PBYTE pbyTxBufferAddr;
2351 PVOID pvRTS;
2352 PVOID pvCTS;
2353 PVOID pvTxDataHd;
2354 UINT uDuration;
2355 UINT cbReqCount;
2356 PS802_11Header pMACHeader;
2357 UINT cbHeaderSize;
2358 UINT cbFrameBodySize;
2359 BOOL bNeedACK;
2360 BOOL bIsPSPOLL = FALSE;
2361 PSTxBufHead pTxBufHead;
2362 UINT cbFrameSize;
2363 UINT cbIVlen = 0;
2364 UINT cbICVlen = 0;
2365 UINT cbMIClen = 0;
2366 UINT cbFCSlen = 4;
2367 UINT uPadding = 0;
2368 UINT cbMICHDR = 0;
2369 UINT uLength = 0;
2370 DWORD dwMICKey0, dwMICKey1;
2371 DWORD dwMIC_Priority;
2372 PDWORD pdwMIC_L;
2373 PDWORD pdwMIC_R;
2374 WORD wTxBufSize;
2375 UINT cbMacHdLen;
2376 SEthernetHeader sEthHeader;
2377 PVOID pvRrvTime;
2378 PVOID pMICHDR;
2379 WORD wCurrentRate = RATE_1M;
2380 PUWLAN_80211HDR p80211Header;
2381 UINT uNodeIndex = 0;
2382 BOOL bNodeExist = FALSE;
2383 SKeyItem STempKey;
2384 PSKeyItem pTransmitKey = NULL;
2385 PBYTE pbyIVHead;
2386 PBYTE pbyPayloadHead;
2387 PBYTE pbyMacHdr;
2388 UINT cbExtSuppRate = 0;
2389 PTX_BUFFER pTX_Buffer;
2390 PUSB_SEND_CONTEXT pContext;
2391 // PWLAN_IE pItem;
2394 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2396 if(skb->len <= WLAN_HDR_ADDR3_LEN) {
2397 cbFrameBodySize = 0;
2399 else {
2400 cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
2402 p80211Header = (PUWLAN_80211HDR)skb->data;
2404 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2406 if (NULL == pContext) {
2407 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
2408 dev_kfree_skb_irq(skb);
2409 return ;
2412 pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
2413 pbyTxBufferAddr = (PBYTE)(&pTX_Buffer->adwTxKey[0]);
2414 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2415 wTxBufSize = sizeof(STxBufHead);
2416 memset(pTxBufHead, 0, wTxBufSize);
2418 if (pDevice->byBBType == BB_TYPE_11A) {
2419 wCurrentRate = RATE_6M;
2420 byPktType = PK_TYPE_11A;
2421 } else {
2422 wCurrentRate = RATE_1M;
2423 byPktType = PK_TYPE_11B;
2426 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2427 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2428 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2429 // to set power here.
2430 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2431 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2432 } else {
2433 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2436 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2438 //Set packet type
2439 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2440 pTxBufHead->wFIFOCtl = 0;
2442 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2443 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2445 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2446 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2448 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2449 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2452 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2453 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2456 if (IS_MULTICAST_ADDRESS(&(p80211Header->sA3.abyAddr1[0])) ||
2457 IS_BROADCAST_ADDRESS(&(p80211Header->sA3.abyAddr1[0]))) {
2458 bNeedACK = FALSE;
2459 if (pDevice->bEnableHostWEP) {
2460 uNodeIndex = 0;
2461 bNodeExist = TRUE;
2464 else {
2465 if (pDevice->bEnableHostWEP) {
2466 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2467 bNodeExist = TRUE;
2469 bNeedACK = TRUE;
2470 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2473 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2474 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2476 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2477 //Set Preamble type always long
2478 //pDevice->byPreambleType = PREAMBLE_LONG;
2480 // probe-response don't retry
2481 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2482 // bNeedACK = FALSE;
2483 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2487 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2489 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2490 bIsPSPOLL = TRUE;
2491 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2492 } else {
2493 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2496 // hostapd deamon ext support rate patch
2497 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2499 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2500 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2503 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2504 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2507 if (cbExtSuppRate >0) {
2508 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2513 //Set FRAGCTL_MACHDCNT
2514 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)cbMacHdLen << 10);
2516 // Notes:
2517 // Although spec says MMPDU can be fragmented; In most case,
2518 // no one will send a MMPDU under fragmentation. With RTS may occur.
2519 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2522 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2523 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2524 cbIVlen = 4;
2525 cbICVlen = 4;
2526 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2528 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2529 cbIVlen = 8;//IV+ExtIV
2530 cbMIClen = 8;
2531 cbICVlen = 4;
2532 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2533 //We need to get seed here for filling TxKey entry.
2534 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2535 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2537 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2538 cbIVlen = 8;//RSN Header
2539 cbICVlen = 8;//MIC
2540 cbMICHDR = sizeof(SMICHDRHead);
2541 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2542 pDevice->bAES = TRUE;
2544 //MAC Header should be padding 0 to DW alignment.
2545 uPadding = 4 - (cbMacHdLen%4);
2546 uPadding %= 4;
2549 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2551 //Set FIFOCTL_GrpAckPolicy
2552 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2553 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2555 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2558 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2560 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2561 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2562 pvRTS = NULL;
2563 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2564 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2565 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2568 else {//802.11a/b packet
2570 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2571 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2572 pvRTS = NULL;
2573 pvCTS = NULL;
2574 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2575 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2577 memset((PVOID)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
2578 memcpy(&(sEthHeader.abyDstAddr[0]),
2579 &(p80211Header->sA3.abyAddr1[0]),
2580 ETH_ALEN);
2581 memcpy(&(sEthHeader.abySrcAddr[0]),
2582 &(p80211Header->sA3.abyAddr2[0]),
2583 ETH_ALEN);
2584 //=========================
2585 // No Fragmentation
2586 //=========================
2587 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2590 //Fill FIFO,RrvTime,RTS,and CTS
2591 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2592 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2594 //Fill DataHead
2595 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2596 0, 0, 1, AUTO_FB_NONE);
2598 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2600 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2602 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderSize);
2603 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2604 pbyIVHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding);
2606 // Copy the Packet into a tx Buffer
2607 memcpy(pbyMacHdr, skb->data, cbMacHdLen);
2609 // version set to 0, patch for hostapd deamon
2610 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2611 memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
2613 // replace support rate, patch for hostapd deamon( only support 11M)
2614 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2615 if (cbExtSuppRate != 0) {
2616 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2617 memcpy((pbyPayloadHead + cbFrameBodySize),
2618 pMgmt->abyCurrSuppRates,
2619 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2621 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2622 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2623 pMgmt->abyCurrExtSuppRates,
2624 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2629 // Set wep
2630 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2632 if (pDevice->bEnableHostWEP) {
2633 pTransmitKey = &STempKey;
2634 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2635 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2636 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2637 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2638 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2639 memcpy(pTransmitKey->abyKey,
2640 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2641 pTransmitKey->uKeyLength
2645 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2647 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
2648 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
2650 // DO Software Michael
2651 MIC_vInit(dwMICKey0, dwMICKey1);
2652 MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12);
2653 dwMIC_Priority = 0;
2654 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
2655 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
2657 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2659 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2661 pdwMIC_L = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2662 pdwMIC_R = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2664 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2665 MIC_vUnInit();
2667 if (pDevice->bTxMICFail == TRUE) {
2668 *pdwMIC_L = 0;
2669 *pdwMIC_R = 0;
2670 pDevice->bTxMICFail = FALSE;
2673 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2674 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2675 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2679 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2680 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
2682 if (pDevice->bEnableHostWEP) {
2683 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2684 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2687 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2688 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (WORD)(cbFrameBodySize + cbMIClen));
2692 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2693 pDevice->wSeqCounter++ ;
2694 if (pDevice->wSeqCounter > 0x0fff)
2695 pDevice->wSeqCounter = 0;
2698 if (bIsPSPOLL) {
2699 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2700 // of FIFO control header.
2701 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2702 // in the same place of other packet's Duration-field).
2703 // And it will cause Cisco-AP to issue Disassociation-packet
2704 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2705 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2706 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2707 } else {
2708 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2712 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2713 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2714 pTX_Buffer->byType = 0x00;
2716 pContext->pPacket = skb;
2717 pContext->Type = CONTEXT_MGMT_PACKET;
2718 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2720 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2721 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2723 else {
2724 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2726 PIPEnsSendBulkOut(pDevice,pContext);
2727 return ;
2734 //TYPE_AC0DMA data tx
2736 * Description:
2737 * Tx packet via AC0DMA(DMA1)
2739 * Parameters:
2740 * In:
2741 * pDevice - Pointer to the adapter
2742 * skb - Pointer to tx skb packet
2743 * Out:
2744 * void
2746 * Return Value: NULL
2751 NTSTATUS
2752 nsDMA_tx_packet(
2753 PSDevice pDevice,
2754 UINT uDMAIdx,
2755 struct sk_buff *skb
2758 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2759 UINT BytesToWrite =0,uHeaderLen = 0;
2760 UINT uNodeIndex = 0;
2761 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2762 WORD wAID;
2763 BYTE byPktType;
2764 BOOL bNeedEncryption = FALSE;
2765 PSKeyItem pTransmitKey = NULL;
2766 SKeyItem STempKey;
2767 UINT ii;
2768 BOOL bTKIP_UseGTK = FALSE;
2769 BOOL bNeedDeAuth = FALSE;
2770 PBYTE pbyBSSID;
2771 BOOL bNodeExist = FALSE;
2772 PUSB_SEND_CONTEXT pContext;
2773 BOOL fConvertedPacket;
2774 PTX_BUFFER pTX_Buffer;
2775 UINT status;
2776 WORD wKeepRate = pDevice->wCurrentRate;
2777 struct net_device_stats* pStats = &pDevice->stats;
2778 //#ifdef WPA_SM_Transtatus
2779 // extern SWPAResult wpa_Result;
2780 //#endif
2781 BOOL bTxeapol_key = FALSE;
2784 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2786 if (pDevice->uAssocCount == 0) {
2787 dev_kfree_skb_irq(skb);
2788 return 0;
2791 if (IS_MULTICAST_ADDRESS((PBYTE)(skb->data))) {
2792 uNodeIndex = 0;
2793 bNodeExist = TRUE;
2794 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2796 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2797 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2798 // set tx map
2799 pMgmt->abyPSTxMap[0] |= byMask[0];
2800 return 0;
2802 // muticast/broadcast data rate
2804 if (pDevice->byBBType != BB_TYPE_11A)
2805 pDevice->wCurrentRate = RATE_2M;
2806 else
2807 pDevice->wCurrentRate = RATE_24M;
2808 // long preamble type
2809 pDevice->byPreambleType = PREAMBLE_SHORT;
2811 }else {
2813 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data), &uNodeIndex)) {
2815 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2817 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2819 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2820 // set tx map
2821 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2822 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2823 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2824 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2826 return 0;
2828 // AP rate decided from node
2829 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2830 // tx preamble decided from node
2832 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2833 pDevice->byPreambleType = pDevice->byShortPreamble;
2835 }else {
2836 pDevice->byPreambleType = PREAMBLE_LONG;
2838 bNodeExist = TRUE;
2842 if (bNodeExist == FALSE) {
2843 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2844 dev_kfree_skb_irq(skb);
2845 return 0;
2849 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2851 if (pContext == NULL) {
2852 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
2853 dev_kfree_skb_irq(skb);
2854 return STATUS_RESOURCES;
2857 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
2859 //mike add:station mode check eapol-key challenge--->
2861 BYTE Protocol_Version; //802.1x Authentication
2862 BYTE Packet_Type; //802.1x Authentication
2863 BYTE Descriptor_type;
2864 WORD Key_info;
2866 Protocol_Version = skb->data[U_HEADER_LEN];
2867 Packet_Type = skb->data[U_HEADER_LEN+1];
2868 Descriptor_type = skb->data[U_HEADER_LEN+1+1+2];
2869 Key_info = (skb->data[U_HEADER_LEN+1+1+2+1] << 8)|(skb->data[U_HEADER_LEN+1+1+2+2]);
2870 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2871 if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2872 (Packet_Type==3)) { //802.1x OR eapol-key challenge frame transfer
2873 bTxeapol_key = TRUE;
2874 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
2875 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2876 if(Descriptor_type==254) {
2877 pDevice->fWPA_Authened = TRUE;
2878 PRINT_K("WPA ");
2880 else {
2881 pDevice->fWPA_Authened = TRUE;
2882 PRINT_K("WPA2(re-keying) ");
2884 PRINT_K("Authentication completed!!\n");
2886 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge
2887 (Key_info & BIT8) && (Key_info & BIT9)) {
2888 pDevice->fWPA_Authened = TRUE;
2889 PRINT_K("WPA2 Authentication completed!!\n");
2894 //mike add:station mode check eapol-key challenge<---
2896 if (pDevice->bEncryptionEnable == TRUE) {
2897 bNeedEncryption = TRUE;
2898 // get Transmit key
2899 do {
2900 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2901 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2902 pbyBSSID = pDevice->abyBSSID;
2903 // get pairwise key
2904 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2905 // get group key
2906 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2907 bTKIP_UseGTK = TRUE;
2908 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2909 break;
2911 } else {
2912 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2913 break;
2915 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2917 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2919 for (ii = 0; ii< 6; ii++)
2920 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2921 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2923 // get pairwise key
2924 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
2925 break;
2927 // get group key
2928 pbyBSSID = pDevice->abyBroadcastAddr;
2929 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2930 pTransmitKey = NULL;
2931 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2932 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2934 else
2935 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2936 } else {
2937 bTKIP_UseGTK = TRUE;
2938 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2940 } while(FALSE);
2943 if (pDevice->bEnableHostWEP) {
2944 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2945 if (pDevice->bEncryptionEnable == TRUE) {
2946 pTransmitKey = &STempKey;
2947 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2948 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2949 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2950 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2951 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2952 memcpy(pTransmitKey->abyKey,
2953 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2954 pTransmitKey->uKeyLength
2959 byPktType = (BYTE)pDevice->byPacketType;
2961 if (pDevice->bFixRate) {
2962 if (pDevice->byBBType == BB_TYPE_11B) {
2963 if (pDevice->uConnectionRate >= RATE_11M) {
2964 pDevice->wCurrentRate = RATE_11M;
2965 } else {
2966 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2968 } else {
2969 if ((pDevice->byBBType == BB_TYPE_11A) &&
2970 (pDevice->uConnectionRate <= RATE_6M)) {
2971 pDevice->wCurrentRate = RATE_6M;
2972 } else {
2973 if (pDevice->uConnectionRate >= RATE_54M)
2974 pDevice->wCurrentRate = RATE_54M;
2975 else
2976 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2980 else {
2981 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2982 // Adhoc Tx rate decided from node DB
2983 if (IS_MULTICAST_ADDRESS(&(pDevice->sTxEthHeader.abyDstAddr[0]))) {
2984 // Multicast use highest data rate
2985 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2986 // preamble type
2987 pDevice->byPreambleType = pDevice->byShortPreamble;
2989 else {
2990 if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) {
2991 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2992 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2993 pDevice->byPreambleType = pDevice->byShortPreamble;
2996 else {
2997 pDevice->byPreambleType = PREAMBLE_LONG;
2999 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
3001 else {
3002 if (pDevice->byBBType != BB_TYPE_11A)
3003 pDevice->wCurrentRate = RATE_2M;
3004 else
3005 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
3006 // abyCurrExtSuppRates[]
3007 pDevice->byPreambleType = PREAMBLE_SHORT;
3008 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
3012 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
3013 // Infra STA rate decided from AP Node, index = 0
3014 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
3018 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
3019 if (pDevice->byBBType != BB_TYPE_11A) {
3020 pDevice->wCurrentRate = RATE_1M;
3021 pDevice->byACKRate = RATE_1M;
3022 pDevice->byTopCCKBasicRate = RATE_1M;
3023 pDevice->byTopOFDMBasicRate = RATE_6M;
3024 } else {
3025 pDevice->wCurrentRate = RATE_6M;
3026 pDevice->byACKRate = RATE_6M;
3027 pDevice->byTopCCKBasicRate = RATE_1M;
3028 pDevice->byTopOFDMBasicRate = RATE_6M;
3032 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma_tx: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
3034 if (wKeepRate != pDevice->wCurrentRate) {
3035 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SETPOWER, NULL);
3038 if (pDevice->wCurrentRate <= RATE_11M) {
3039 byPktType = PK_TYPE_11B;
3042 if (bNeedEncryption == TRUE) {
3043 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
3044 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
3045 bNeedEncryption = FALSE;
3046 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
3047 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
3048 if (pTransmitKey == NULL) {
3049 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
3051 else {
3052 if (bTKIP_UseGTK == TRUE) {
3053 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
3055 else {
3056 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3057 bNeedEncryption = TRUE;
3062 if (pDevice->byCntMeasure == 2) {
3063 bNeedDeAuth = TRUE;
3064 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
3067 if (pDevice->bEnableHostWEP) {
3068 if ((uNodeIndex != 0) &&
3069 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
3070 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3071 bNeedEncryption = TRUE;
3075 else {
3077 #if 0
3078 if((pDevice->fWPA_Authened == FALSE) &&
3079 ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)||(pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK))){
3080 dev_kfree_skb_irq(skb);
3081 pStats->tx_dropped++;
3082 return STATUS_FAILURE;
3084 else if (pTransmitKey == NULL) {
3085 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3086 dev_kfree_skb_irq(skb);
3087 pStats->tx_dropped++;
3088 return STATUS_FAILURE;
3090 #else
3091 if (pTransmitKey == NULL) {
3092 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3093 dev_kfree_skb_irq(skb);
3094 pStats->tx_dropped++;
3095 return STATUS_FAILURE;
3097 #endif
3102 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3103 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3104 skb->len, uDMAIdx, &pDevice->sTxEthHeader,
3105 (PBYTE)skb->data, pTransmitKey, uNodeIndex,
3106 pDevice->wCurrentRate,
3107 &uHeaderLen, &BytesToWrite
3110 if (fConvertedPacket == FALSE) {
3111 pContext->bBoolInUse = FALSE;
3112 dev_kfree_skb_irq(skb);
3113 return STATUS_FAILURE;
3116 if ( pDevice->bEnablePSMode == TRUE ) {
3117 if ( !pDevice->bPSModeTxBurst ) {
3118 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_MAC_DISPOWERSAVING, NULL);
3119 pDevice->bPSModeTxBurst = TRUE;
3123 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3124 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3125 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3127 pContext->pPacket = skb;
3128 pContext->Type = CONTEXT_DATA_PACKET;
3129 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3131 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3133 status = PIPEnsSendBulkOut(pDevice,pContext);
3135 if (bNeedDeAuth == TRUE) {
3136 WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE;
3138 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_DEAUTH, (PBYTE)&wReason);
3141 if(status!=STATUS_PENDING) {
3142 pContext->bBoolInUse = FALSE;
3143 dev_kfree_skb_irq(skb);
3144 return STATUS_FAILURE;
3146 else
3147 return 0;
3154 * Description:
3155 * Relay packet send (AC1DMA) from rx dpc.
3157 * Parameters:
3158 * In:
3159 * pDevice - Pointer to the adapter
3160 * pPacket - Pointer to rx packet
3161 * cbPacketSize - rx ethernet frame size
3162 * Out:
3163 * TURE, FALSE
3165 * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE
3169 BOOL
3170 bRelayPacketSend (
3171 PSDevice pDevice,
3172 PBYTE pbySkbData,
3173 UINT uDataLen,
3174 UINT uNodeIndex
3177 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3178 UINT BytesToWrite =0,uHeaderLen = 0;
3179 BYTE byPktType = PK_TYPE_11B;
3180 BOOL bNeedEncryption = FALSE;
3181 SKeyItem STempKey;
3182 PSKeyItem pTransmitKey = NULL;
3183 PBYTE pbyBSSID;
3184 PUSB_SEND_CONTEXT pContext;
3185 BYTE byPktTyp;
3186 BOOL fConvertedPacket;
3187 PTX_BUFFER pTX_Buffer;
3188 UINT status;
3189 WORD wKeepRate = pDevice->wCurrentRate;
3193 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
3195 if (NULL == pContext) {
3196 return FALSE;
3199 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, U_HEADER_LEN);
3201 if (pDevice->bEncryptionEnable == TRUE) {
3202 bNeedEncryption = TRUE;
3203 // get group key
3204 pbyBSSID = pDevice->abyBroadcastAddr;
3205 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
3206 pTransmitKey = NULL;
3207 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
3208 } else {
3209 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
3213 if (pDevice->bEnableHostWEP) {
3214 if (uNodeIndex < MAX_NODE_NUM + 1) {
3215 pTransmitKey = &STempKey;
3216 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3217 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3218 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3219 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3220 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3221 memcpy(pTransmitKey->abyKey,
3222 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3223 pTransmitKey->uKeyLength
3228 if ( bNeedEncryption && (pTransmitKey == NULL) ) {
3229 pContext->bBoolInUse = FALSE;
3230 return FALSE;
3233 byPktTyp = (BYTE)pDevice->byPacketType;
3235 if (pDevice->bFixRate) {
3236 if (pDevice->byBBType == BB_TYPE_11B) {
3237 if (pDevice->uConnectionRate >= RATE_11M) {
3238 pDevice->wCurrentRate = RATE_11M;
3239 } else {
3240 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3242 } else {
3243 if ((pDevice->byBBType == BB_TYPE_11A) &&
3244 (pDevice->uConnectionRate <= RATE_6M)) {
3245 pDevice->wCurrentRate = RATE_6M;
3246 } else {
3247 if (pDevice->uConnectionRate >= RATE_54M)
3248 pDevice->wCurrentRate = RATE_54M;
3249 else
3250 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3254 else {
3255 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
3259 if (wKeepRate != pDevice->wCurrentRate) {
3260 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SETPOWER, NULL);
3263 if (pDevice->wCurrentRate <= RATE_11M)
3264 byPktType = PK_TYPE_11B;
3266 BytesToWrite = uDataLen + U_CRC_LEN;
3267 // Convert the packet to an usb frame and copy into our buffer
3268 // and send the irp.
3270 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3271 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3272 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
3273 pbySkbData, pTransmitKey, uNodeIndex,
3274 pDevice->wCurrentRate,
3275 &uHeaderLen, &BytesToWrite
3278 if (fConvertedPacket == FALSE) {
3279 pContext->bBoolInUse = FALSE;
3280 return FALSE;
3283 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3284 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3285 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3287 pContext->pPacket = NULL;
3288 pContext->Type = CONTEXT_DATA_PACKET;
3289 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3291 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3293 status = PIPEnsSendBulkOut(pDevice,pContext);
3295 return TRUE;