linux/drivers/staging/vt6655/mib.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: mib.c
  20 *
  21 * Purpose: Implement MIB Data Structure
  22 *
  23 * Author: Tevin Chen
  24 *
  25 * Date: May 21, 1996
  26 *
  27 * Functions:
  28 *      STAvClearAllCounter - Clear All MIB Counter
  29 *      STAvUpdateIstStatCounter - Update ISR statistic counter
  30 *      STAvUpdateRDStatCounter - Update Rx statistic counter
  31 *      STAvUpdateRDStatCounterEx - Update Rx statistic counter and copy rcv data
  32 *      STAvUpdateTDStatCounter - Update Tx statistic counter
  33 *      STAvUpdateTDStatCounterEx - Update Tx statistic counter and copy tx data
  34 *      STAvUpdate802_11Counter - Update 802.11 mib counter
  35 *
  36 * Revision History:
  37 *
  38 */
  39
  40#include "upc.h"
  41#include "mac.h"
  42#include "tether.h"
  43#include "mib.h"
  44#include "wctl.h"
  45#include "baseband.h"
  46
  47/*---------------------  Static Definitions -------------------------*/
  48static int          msglevel                =MSG_LEVEL_INFO;
  49/*---------------------  Static Classes  ----------------------------*/
  50
  51/*---------------------  Static Variables  --------------------------*/
  52
  53/*---------------------  Static Functions  --------------------------*/
  54
  55/*---------------------  Export Variables  --------------------------*/
  56
  57/*---------------------  Export Functions  --------------------------*/
  58
  59
  60
  61/*
  62 * Description: Clear All Statistic Counter
  63 *
  64 * Parameters:
  65 *  In:
  66 *      pStatistic  - Pointer to Statistic Counter Data Structure
  67 *  Out:
  68 *      none
  69 *
  70 * Return Value: none
  71 *
  72 */
  73void STAvClearAllCounter (PSStatCounter pStatistic)
  74{
  75    // set memory to zero
  76        memset(pStatistic, 0, sizeof(SStatCounter));
  77}
  78
  79
  80/*
  81 * Description: Update Isr Statistic Counter
  82 *
  83 * Parameters:
  84 *  In:
  85 *      pStatistic  - Pointer to Statistic Counter Data Structure
  86 *      wisr        - Interrupt status
  87 *  Out:
  88 *      none
  89 *
  90 * Return Value: none
  91 *
  92 */
  93void STAvUpdateIsrStatCounter (PSStatCounter pStatistic, unsigned long dwIsr)
  94{
  95    /**********************/
  96    /* ABNORMAL interrupt */
  97    /**********************/
  98    // not any IMR bit invoke irq
  99
 100    if (dwIsr == 0) {
 101        pStatistic->ISRStat.dwIsrUnknown++;
 102        return;
 103    }
 104
 105//Added by Kyle
 106    if (dwIsr & ISR_TXDMA0)               // ISR, bit0
 107        pStatistic->ISRStat.dwIsrTx0OK++;             // TXDMA0 successful
 108
 109    if (dwIsr & ISR_AC0DMA)               // ISR, bit1
 110        pStatistic->ISRStat.dwIsrAC0TxOK++;           // AC0DMA successful
 111
 112    if (dwIsr & ISR_BNTX)                 // ISR, bit2
 113        pStatistic->ISRStat.dwIsrBeaconTxOK++;        // BeaconTx successful
 114
 115    if (dwIsr & ISR_RXDMA0)               // ISR, bit3
 116        pStatistic->ISRStat.dwIsrRx0OK++;             // Rx0 successful
 117
 118    if (dwIsr & ISR_TBTT)                 // ISR, bit4
 119        pStatistic->ISRStat.dwIsrTBTTInt++;           // TBTT successful
 120
 121    if (dwIsr & ISR_SOFTTIMER)            // ISR, bit6
 122        pStatistic->ISRStat.dwIsrSTIMERInt++;
 123
 124    if (dwIsr & ISR_WATCHDOG)             // ISR, bit7
 125        pStatistic->ISRStat.dwIsrWatchDog++;
 126
 127    if (dwIsr & ISR_FETALERR)             // ISR, bit8
 128        pStatistic->ISRStat.dwIsrUnrecoverableError++;
 129
 130    if (dwIsr & ISR_SOFTINT)              // ISR, bit9
 131        pStatistic->ISRStat.dwIsrSoftInterrupt++;     // software interrupt
 132
 133    if (dwIsr & ISR_MIBNEARFULL)          // ISR, bit10
 134        pStatistic->ISRStat.dwIsrMIBNearfull++;
 135
 136    if (dwIsr & ISR_RXNOBUF)              // ISR, bit11
 137        pStatistic->ISRStat.dwIsrRxNoBuf++;           // Rx No Buff
 138
 139    if (dwIsr & ISR_RXDMA1)               // ISR, bit12
 140        pStatistic->ISRStat.dwIsrRx1OK++;             // Rx1 successful
 141
 142//    if (dwIsr & ISR_ATIMTX)               // ISR, bit13
 143//        pStatistic->ISRStat.dwIsrATIMTxOK++;          // ATIMTX successful
 144
 145//    if (dwIsr & ISR_SYNCTX)               // ISR, bit14
 146//        pStatistic->ISRStat.dwIsrSYNCTxOK++;          // SYNCTX successful
 147
 148//    if (dwIsr & ISR_CFPEND)               // ISR, bit18
 149//        pStatistic->ISRStat.dwIsrCFPEnd++;
 150
 151//    if (dwIsr & ISR_ATIMEND)              // ISR, bit19
 152//        pStatistic->ISRStat.dwIsrATIMEnd++;
 153
 154//    if (dwIsr & ISR_SYNCFLUSHOK)          // ISR, bit20
 155//        pStatistic->ISRStat.dwIsrSYNCFlushOK++;
 156
 157    if (dwIsr & ISR_SOFTTIMER1)           // ISR, bit21
 158        pStatistic->ISRStat.dwIsrSTIMER1Int++;
 159
 160}
 161
 162
 163/*
 164 * Description: Update Rx Statistic Counter
 165 *
 166 * Parameters:
 167 *  In:
 168 *      pStatistic      - Pointer to Statistic Counter Data Structure
 169 *      byRSR           - Rx Status
 170 *      byNewRSR        - Rx Status
 171 *      pbyBuffer       - Rx Buffer
 172 *      cbFrameLength   - Rx Length
 173 *  Out:
 174 *      none
 175 *
 176 * Return Value: none
 177 *
 178 */
 179void STAvUpdateRDStatCounter (PSStatCounter pStatistic,
 180                              unsigned char byRSR, unsigned char byNewRSR, unsigned char byRxRate,
 181                              unsigned char *pbyBuffer, unsigned int cbFrameLength)
 182{
 183    //need change
 184    PS802_11Header pHeader = (PS802_11Header)pbyBuffer;
 185
 186    if (byRSR & RSR_ADDROK)
 187        pStatistic->dwRsrADDROk++;
 188    if (byRSR & RSR_CRCOK) {
 189        pStatistic->dwRsrCRCOk++;
 190
 191        pStatistic->ullRsrOK++;
 192
 193        if (cbFrameLength >= ETH_ALEN) {
 194            // update counters in case of successful transmit
 195            if (byRSR & RSR_ADDRBROAD) {
 196                pStatistic->ullRxBroadcastFrames++;
 197                pStatistic->ullRxBroadcastBytes += (unsigned long long) cbFrameLength;
 198            }
 199            else if (byRSR & RSR_ADDRMULTI) {
 200                pStatistic->ullRxMulticastFrames++;
 201                pStatistic->ullRxMulticastBytes += (unsigned long long) cbFrameLength;
 202            }
 203            else {
 204                pStatistic->ullRxDirectedFrames++;
 205                pStatistic->ullRxDirectedBytes += (unsigned long long) cbFrameLength;
 206            }
 207        }
 208    }
 209
 210    if(byRxRate==22) {
 211        pStatistic->CustomStat.ullRsr11M++;
 212        if(byRSR & RSR_CRCOK) {
 213            pStatistic->CustomStat.ullRsr11MCRCOk++;
 214        }
 215        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"11M: ALL[%d], OK[%d]:[%02x]\n", (int)pStatistic->CustomStat.ullRsr11M, (int)pStatistic->CustomStat.ullRsr11MCRCOk, byRSR);
 216    }
 217    else if(byRxRate==11) {
 218        pStatistic->CustomStat.ullRsr5M++;
 219        if(byRSR & RSR_CRCOK) {
 220            pStatistic->CustomStat.ullRsr5MCRCOk++;
 221        }
 222        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 5M: ALL[%d], OK[%d]:[%02x]\n", (int)pStatistic->CustomStat.ullRsr5M, (int)pStatistic->CustomStat.ullRsr5MCRCOk, byRSR);
 223    }
 224    else if(byRxRate==4) {
 225        pStatistic->CustomStat.ullRsr2M++;
 226        if(byRSR & RSR_CRCOK) {
 227            pStatistic->CustomStat.ullRsr2MCRCOk++;
 228        }
 229        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 2M: ALL[%d], OK[%d]:[%02x]\n", (int)pStatistic->CustomStat.ullRsr2M, (int)pStatistic->CustomStat.ullRsr2MCRCOk, byRSR);
 230    }
 231    else if(byRxRate==2){
 232        pStatistic->CustomStat.ullRsr1M++;
 233        if(byRSR & RSR_CRCOK) {
 234            pStatistic->CustomStat.ullRsr1MCRCOk++;
 235        }
 236        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 1M: ALL[%d], OK[%d]:[%02x]\n", (int)pStatistic->CustomStat.ullRsr1M, (int)pStatistic->CustomStat.ullRsr1MCRCOk, byRSR);
 237    }
 238    else if(byRxRate==12){
 239        pStatistic->CustomStat.ullRsr6M++;
 240        if(byRSR & RSR_CRCOK) {
 241            pStatistic->CustomStat.ullRsr6MCRCOk++;
 242        }
 243        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 6M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr6M, (int)pStatistic->CustomStat.ullRsr6MCRCOk);
 244    }
 245    else if(byRxRate==18){
 246        pStatistic->CustomStat.ullRsr9M++;
 247        if(byRSR & RSR_CRCOK) {
 248            pStatistic->CustomStat.ullRsr9MCRCOk++;
 249        }
 250        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 9M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr9M, (int)pStatistic->CustomStat.ullRsr9MCRCOk);
 251    }
 252    else if(byRxRate==24){
 253        pStatistic->CustomStat.ullRsr12M++;
 254        if(byRSR & RSR_CRCOK) {
 255            pStatistic->CustomStat.ullRsr12MCRCOk++;
 256        }
 257        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"12M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr12M, (int)pStatistic->CustomStat.ullRsr12MCRCOk);
 258    }
 259    else if(byRxRate==36){
 260        pStatistic->CustomStat.ullRsr18M++;
 261        if(byRSR & RSR_CRCOK) {
 262            pStatistic->CustomStat.ullRsr18MCRCOk++;
 263        }
 264        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"18M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr18M, (int)pStatistic->CustomStat.ullRsr18MCRCOk);
 265    }
 266    else if(byRxRate==48){
 267        pStatistic->CustomStat.ullRsr24M++;
 268        if(byRSR & RSR_CRCOK) {
 269            pStatistic->CustomStat.ullRsr24MCRCOk++;
 270        }
 271        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"24M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr24M, (int)pStatistic->CustomStat.ullRsr24MCRCOk);
 272    }
 273    else if(byRxRate==72){
 274        pStatistic->CustomStat.ullRsr36M++;
 275        if(byRSR & RSR_CRCOK) {
 276            pStatistic->CustomStat.ullRsr36MCRCOk++;
 277        }
 278        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"36M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr36M, (int)pStatistic->CustomStat.ullRsr36MCRCOk);
 279    }
 280    else if(byRxRate==96){
 281        pStatistic->CustomStat.ullRsr48M++;
 282        if(byRSR & RSR_CRCOK) {
 283            pStatistic->CustomStat.ullRsr48MCRCOk++;
 284        }
 285        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"48M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr48M, (int)pStatistic->CustomStat.ullRsr48MCRCOk);
 286    }
 287    else if(byRxRate==108){
 288        pStatistic->CustomStat.ullRsr54M++;
 289        if(byRSR & RSR_CRCOK) {
 290            pStatistic->CustomStat.ullRsr54MCRCOk++;
 291        }
 292        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"54M: ALL[%d], OK[%d]\n", (int)pStatistic->CustomStat.ullRsr54M, (int)pStatistic->CustomStat.ullRsr54MCRCOk);
 293    }
 294    else {
 295        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Unknown: Total[%d], CRCOK[%d]\n", (int)pStatistic->dwRsrRxPacket+1, (int)pStatistic->dwRsrCRCOk);
 296    }
 297
 298    if (byRSR & RSR_BSSIDOK)
 299        pStatistic->dwRsrBSSIDOk++;
 300
 301    if (byRSR & RSR_BCNSSIDOK)
 302        pStatistic->dwRsrBCNSSIDOk++;
 303    if (byRSR & RSR_IVLDLEN)  //invalid len (> 2312 byte)
 304        pStatistic->dwRsrLENErr++;
 305    if (byRSR & RSR_IVLDTYP)  //invalid packet type
 306        pStatistic->dwRsrTYPErr++;
 307    if (byRSR & (RSR_IVLDTYP | RSR_IVLDLEN))
 308        pStatistic->dwRsrErr++;
 309
 310    if (byNewRSR & NEWRSR_DECRYPTOK)
 311        pStatistic->dwNewRsrDECRYPTOK++;
 312    if (byNewRSR & NEWRSR_CFPIND)
 313        pStatistic->dwNewRsrCFP++;
 314    if (byNewRSR & NEWRSR_HWUTSF)
 315        pStatistic->dwNewRsrUTSF++;
 316    if (byNewRSR & NEWRSR_BCNHITAID)
 317        pStatistic->dwNewRsrHITAID++;
 318    if (byNewRSR & NEWRSR_BCNHITAID0)
 319        pStatistic->dwNewRsrHITAID0++;
 320
 321    // increase rx packet count
 322    pStatistic->dwRsrRxPacket++;
 323    pStatistic->dwRsrRxOctet += cbFrameLength;
 324
 325
 326    if (IS_TYPE_DATA(pbyBuffer)) {
 327        pStatistic->dwRsrRxData++;
 328    } else if (IS_TYPE_MGMT(pbyBuffer)){
 329        pStatistic->dwRsrRxManage++;
 330    } else if (IS_TYPE_CONTROL(pbyBuffer)){
 331        pStatistic->dwRsrRxControl++;
 332    }
 333
 334    if (byRSR & RSR_ADDRBROAD)
 335        pStatistic->dwRsrBroadcast++;
 336    else if (byRSR & RSR_ADDRMULTI)
 337        pStatistic->dwRsrMulticast++;
 338    else
 339        pStatistic->dwRsrDirected++;
 340
 341    if (WLAN_GET_FC_MOREFRAG(pHeader->wFrameCtl))
 342        pStatistic->dwRsrRxFragment++;
 343
 344    if (cbFrameLength < ETH_ZLEN + 4) {
 345        pStatistic->dwRsrRunt++;
 346    }
 347    else if (cbFrameLength == ETH_ZLEN + 4) {
 348        pStatistic->dwRsrRxFrmLen64++;
 349    }
 350    else if ((65 <= cbFrameLength) && (cbFrameLength <= 127)) {
 351        pStatistic->dwRsrRxFrmLen65_127++;
 352    }
 353    else if ((128 <= cbFrameLength) && (cbFrameLength <= 255)) {
 354        pStatistic->dwRsrRxFrmLen128_255++;
 355    }
 356    else if ((256 <= cbFrameLength) && (cbFrameLength <= 511)) {
 357        pStatistic->dwRsrRxFrmLen256_511++;
 358    }
 359    else if ((512 <= cbFrameLength) && (cbFrameLength <= 1023)) {
 360        pStatistic->dwRsrRxFrmLen512_1023++;
 361    }
 362    else if ((1024 <= cbFrameLength) && (cbFrameLength <= ETH_FRAME_LEN + 4)) {
 363        pStatistic->dwRsrRxFrmLen1024_1518++;
 364    } else if (cbFrameLength > ETH_FRAME_LEN + 4) {
 365        pStatistic->dwRsrLong++;
 366    }
 367
 368}
 369
 370
 371
 372/*
 373 * Description: Update Rx Statistic Counter and copy Rx buffer
 374 *
 375 * Parameters:
 376 *  In:
 377 *      pStatistic      - Pointer to Statistic Counter Data Structure
 378 *      byRSR           - Rx Status
 379 *      byNewRSR        - Rx Status
 380 *      pbyBuffer       - Rx Buffer
 381 *      cbFrameLength   - Rx Length
 382 *  Out:
 383 *      none
 384 *
 385 * Return Value: none
 386 *
 387 */
 388
 389void
 390STAvUpdateRDStatCounterEx (
 391    PSStatCounter   pStatistic,
 392    unsigned char byRSR,
 393    unsigned char byNewRSR,
 394    unsigned char byRxRate,
 395    unsigned char *pbyBuffer,
 396    unsigned int cbFrameLength
 397    )
 398{
 399    STAvUpdateRDStatCounter(
 400                    pStatistic,
 401                    byRSR,
 402                    byNewRSR,
 403                    byRxRate,
 404                    pbyBuffer,
 405                    cbFrameLength
 406                    );
 407
 408    // rx length
 409    pStatistic->dwCntRxFrmLength = cbFrameLength;
 410    // rx pattern, we just see 10 bytes for sample
 411    memcpy(pStatistic->abyCntRxPattern, (unsigned char *)pbyBuffer, 10);
 412}
 413
 414
 415/*
 416 * Description: Update Tx Statistic Counter
 417 *
 418 * Parameters:
 419 *  In:
 420 *      pStatistic      - Pointer to Statistic Counter Data Structure
 421 *      byTSR0          - Tx Status
 422 *      byTSR1          - Tx Status
 423 *      pbyBuffer       - Tx Buffer
 424 *      cbFrameLength   - Tx Length
 425 *      uIdx            - Index of Tx DMA
 426 *  Out:
 427 *      none
 428 *
 429 * Return Value: none
 430 *
 431 */
 432void
 433STAvUpdateTDStatCounter (
 434    PSStatCounter   pStatistic,
 435    unsigned char byTSR0,
 436    unsigned char byTSR1,
 437    unsigned char *pbyBuffer,
 438    unsigned int cbFrameLength,
 439    unsigned int uIdx
 440    )
 441{
 442    PWLAN_80211HDR_A4   pHeader;
 443    unsigned char *pbyDestAddr;
 444    unsigned char byTSR0_NCR = byTSR0 & TSR0_NCR;
 445
 446
 447
 448    pHeader = (PWLAN_80211HDR_A4) pbyBuffer;
 449    if (WLAN_GET_FC_TODS(pHeader->wFrameCtl) == 0) {
 450        pbyDestAddr = &(pHeader->abyAddr1[0]);
 451    }
 452    else {
 453        pbyDestAddr = &(pHeader->abyAddr3[0]);
 454    }
 455    // increase tx packet count
 456    pStatistic->dwTsrTxPacket[uIdx]++;
 457    pStatistic->dwTsrTxOctet[uIdx] += cbFrameLength;
 458
 459    if (byTSR0_NCR != 0) {
 460        pStatistic->dwTsrRetry[uIdx]++;
 461        pStatistic->dwTsrTotalRetry[uIdx] += byTSR0_NCR;
 462
 463        if (byTSR0_NCR == 1)
 464            pStatistic->dwTsrOnceRetry[uIdx]++;
 465        else
 466            pStatistic->dwTsrMoreThanOnceRetry[uIdx]++;
 467    }
 468
 469    if ((byTSR1&(TSR1_TERR|TSR1_RETRYTMO|TSR1_TMO|ACK_DATA)) == 0) {
 470        pStatistic->ullTsrOK[uIdx]++;
 471        pStatistic->CustomStat.ullTsrAllOK =
 472            (pStatistic->ullTsrOK[TYPE_AC0DMA] + pStatistic->ullTsrOK[TYPE_TXDMA0]);
 473        // update counters in case that successful transmit
 474        if (is_broadcast_ether_addr(pbyDestAddr)) {
 475            pStatistic->ullTxBroadcastFrames[uIdx]++;
 476            pStatistic->ullTxBroadcastBytes[uIdx] += (unsigned long long) cbFrameLength;
 477        }
 478        else if (is_multicast_ether_addr(pbyDestAddr)) {
 479            pStatistic->ullTxMulticastFrames[uIdx]++;
 480            pStatistic->ullTxMulticastBytes[uIdx] += (unsigned long long) cbFrameLength;
 481        }
 482        else {
 483            pStatistic->ullTxDirectedFrames[uIdx]++;
 484            pStatistic->ullTxDirectedBytes[uIdx] += (unsigned long long) cbFrameLength;
 485        }
 486    }
 487    else {
 488        if (byTSR1 & TSR1_TERR)
 489            pStatistic->dwTsrErr[uIdx]++;
 490        if (byTSR1 & TSR1_RETRYTMO)
 491            pStatistic->dwTsrRetryTimeout[uIdx]++;
 492        if (byTSR1 & TSR1_TMO)
 493            pStatistic->dwTsrTransmitTimeout[uIdx]++;
 494        if (byTSR1 & ACK_DATA)
 495            pStatistic->dwTsrACKData[uIdx]++;
 496    }
 497
 498    if (is_broadcast_ether_addr(pbyDestAddr))
 499        pStatistic->dwTsrBroadcast[uIdx]++;
 500    else if (is_multicast_ether_addr(pbyDestAddr))
 501        pStatistic->dwTsrMulticast[uIdx]++;
 502    else
 503        pStatistic->dwTsrDirected[uIdx]++;
 504
 505}
 506
 507
 508/*
 509 * Description: Update Tx Statistic Counter and copy Tx buffer
 510 *
 511 * Parameters:
 512 *  In:
 513 *      pStatistic      - Pointer to Statistic Counter Data Structure
 514 *      pbyBuffer       - Tx Buffer
 515 *      cbFrameLength   - Tx Length
 516 *  Out:
 517 *      none
 518 *
 519 * Return Value: none
 520 *
 521 */
 522void
 523STAvUpdateTDStatCounterEx (
 524    PSStatCounter   pStatistic,
 525    unsigned char *pbyBuffer,
 526    unsigned long cbFrameLength
 527    )
 528{
 529    unsigned int uPktLength;
 530
 531    uPktLength = (unsigned int)cbFrameLength;
 532
 533    // tx length
 534    pStatistic->dwCntTxBufLength = uPktLength;
 535    // tx pattern, we just see 16 bytes for sample
 536    memcpy(pStatistic->abyCntTxPattern, pbyBuffer, 16);
 537}
 538
 539
 540/*
 541 * Description: Update 802.11 mib counter
 542 *
 543 * Parameters:
 544 *  In:
 545 *      p802_11Counter  - Pointer to 802.11 mib counter
 546 *      pStatistic      - Pointer to Statistic Counter Data Structure
 547 *      dwCounter       - hardware counter for 802.11 mib
 548 *  Out:
 549 *      none
 550 *
 551 * Return Value: none
 552 *
 553 */
 554void
 555STAvUpdate802_11Counter(
 556    PSDot11Counters         p802_11Counter,
 557    PSStatCounter           pStatistic,
 558    unsigned long dwCounter
 559    )
 560{
 561    //p802_11Counter->TransmittedFragmentCount
 562    p802_11Counter->MulticastTransmittedFrameCount = (unsigned long long) (pStatistic->dwTsrBroadcast[TYPE_AC0DMA] +
 563                                                                  pStatistic->dwTsrBroadcast[TYPE_TXDMA0] +
 564                                                                  pStatistic->dwTsrMulticast[TYPE_AC0DMA] +
 565                                                                  pStatistic->dwTsrMulticast[TYPE_TXDMA0]);
 566    p802_11Counter->FailedCount = (unsigned long long) (pStatistic->dwTsrErr[TYPE_AC0DMA] + pStatistic->dwTsrErr[TYPE_TXDMA0]);
 567    p802_11Counter->RetryCount = (unsigned long long) (pStatistic->dwTsrRetry[TYPE_AC0DMA] + pStatistic->dwTsrRetry[TYPE_TXDMA0]);
 568    p802_11Counter->MultipleRetryCount = (unsigned long long) (pStatistic->dwTsrMoreThanOnceRetry[TYPE_AC0DMA] +
 569                                                          pStatistic->dwTsrMoreThanOnceRetry[TYPE_TXDMA0]);
 570    //p802_11Counter->FrameDuplicateCount
 571    p802_11Counter->RTSSuccessCount += (unsigned long long)  (dwCounter & 0x000000ff);
 572    p802_11Counter->RTSFailureCount += (unsigned long long) ((dwCounter & 0x0000ff00) >> 8);
 573    p802_11Counter->ACKFailureCount += (unsigned long long) ((dwCounter & 0x00ff0000) >> 16);
 574    p802_11Counter->FCSErrorCount +=   (unsigned long long) ((dwCounter & 0xff000000) >> 24);
 575    //p802_11Counter->ReceivedFragmentCount
 576    p802_11Counter->MulticastReceivedFrameCount = (unsigned long long) (pStatistic->dwRsrBroadcast +
 577                                                               pStatistic->dwRsrMulticast);
 578}
 579
 580/*
 581 * Description: Clear 802.11 mib counter
 582 *
 583 * Parameters:
 584 *  In:
 585 *      p802_11Counter  - Pointer to 802.11 mib counter
 586 *  Out:
 587 *      none
 588 *
 589 * Return Value: none
 590 *
 591 */
 592void
 593STAvClear802_11Counter(PSDot11Counters p802_11Counter)
 594{
 595    // set memory to zero
 596        memset(p802_11Counter, 0, sizeof(SDot11Counters));
 597}
 598