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