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, BYTE byIsr0, BYTE byIsr1) 94{ 95 /**********************/ 96 /* ABNORMAL interrupt */ 97 /**********************/ 98 // not any IMR bit invoke irq 99 if (byIsr0 == 0) { 100 pStatistic->ISRStat.dwIsrUnknown++; 101 return; 102 } 103 104 105 if (byIsr0 & ISR_ACTX) // ISR, bit0 106 pStatistic->ISRStat.dwIsrTx0OK++; // TXDMA0 successful 107 108 if (byIsr0 & ISR_BNTX) // ISR, bit2 109 pStatistic->ISRStat.dwIsrBeaconTxOK++; // BeaconTx successful 110 111 if (byIsr0 & ISR_RXDMA0) // ISR, bit3 112 pStatistic->ISRStat.dwIsrRx0OK++; // Rx0 successful 113 114 if (byIsr0 & ISR_TBTT) // ISR, bit4 115 pStatistic->ISRStat.dwIsrTBTTInt++; // TBTT successful 116 117 if (byIsr0 & ISR_SOFTTIMER) // ISR, bit6 118 pStatistic->ISRStat.dwIsrSTIMERInt++; 119 120 if (byIsr0 & ISR_WATCHDOG) // ISR, bit7 121 pStatistic->ISRStat.dwIsrWatchDog++; 122 123 124 if (byIsr1 & ISR_FETALERR) // ISR, bit8 125 pStatistic->ISRStat.dwIsrUnrecoverableError++; 126 127 if (byIsr1 & ISR_SOFTINT) // ISR, bit9 128 pStatistic->ISRStat.dwIsrSoftInterrupt++; // software interrupt 129 130 if (byIsr1 & ISR_MIBNEARFULL) // ISR, bit10 131 pStatistic->ISRStat.dwIsrMIBNearfull++; 132 133 if (byIsr1 & ISR_RXNOBUF) // ISR, bit11 134 pStatistic->ISRStat.dwIsrRxNoBuf++; // Rx No Buff 135 136} 137 138 139/* 140 * Description: Update Rx Statistic Counter 141 * 142 * Parameters: 143 * In: 144 * pStatistic - Pointer to Statistic Counter Data Structure 145 * byRSR - Rx Status 146 * byNewRSR - Rx Status 147 * pbyBuffer - Rx Buffer 148 * cbFrameLength - Rx Length 149 * Out: 150 * none 151 * 152 * Return Value: none 153 * 154 */ 155void STAvUpdateRDStatCounter(PSStatCounter pStatistic, 156 BYTE byRSR, BYTE byNewRSR, 157 BYTE byRxSts, BYTE byRxRate, 158 PBYTE pbyBuffer, unsigned int cbFrameLength) 159{ 160 /* need change */ 161 PS802_11Header pHeader = (PS802_11Header)pbyBuffer; 162 163 if (byRSR & RSR_ADDROK) 164 pStatistic->dwRsrADDROk++; 165 if (byRSR & RSR_CRCOK) { 166 pStatistic->dwRsrCRCOk++; 167 pStatistic->ullRsrOK++; 168 169 if (cbFrameLength >= ETH_ALEN) { 170 /* update counters in case of successful transmission */ 171 if (byRSR & RSR_ADDRBROAD) { 172 pStatistic->ullRxBroadcastFrames++; 173 pStatistic->ullRxBroadcastBytes += 174 (unsigned long long) cbFrameLength; 175 } 176 else if (byRSR & RSR_ADDRMULTI) { 177 pStatistic->ullRxMulticastFrames++; 178 pStatistic->ullRxMulticastBytes += 179 (unsigned long long) cbFrameLength; 180 } 181 else { 182 pStatistic->ullRxDirectedFrames++; 183 pStatistic->ullRxDirectedBytes += 184 (unsigned long long) cbFrameLength; 185 } 186 } 187 } 188 189 if(byRxRate==22) { 190 pStatistic->CustomStat.ullRsr11M++; 191 if(byRSR & RSR_CRCOK) { 192 pStatistic->CustomStat.ullRsr11MCRCOk++; 193 } 194 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "11M: ALL[%d], OK[%d]:[%02x]\n", 195 (signed int) pStatistic->CustomStat.ullRsr11M, 196 (signed int) pStatistic->CustomStat.ullRsr11MCRCOk, byRSR); 197 } 198 else if(byRxRate==11) { 199 pStatistic->CustomStat.ullRsr5M++; 200 if(byRSR & RSR_CRCOK) { 201 pStatistic->CustomStat.ullRsr5MCRCOk++; 202 } 203 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 5M: ALL[%d], OK[%d]:[%02x]\n", 204 (signed int) pStatistic->CustomStat.ullRsr5M, 205 (signed int) pStatistic->CustomStat.ullRsr5MCRCOk, byRSR); 206 } 207 else if(byRxRate==4) { 208 pStatistic->CustomStat.ullRsr2M++; 209 if(byRSR & RSR_CRCOK) { 210 pStatistic->CustomStat.ullRsr2MCRCOk++; 211 } 212 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 2M: ALL[%d], OK[%d]:[%02x]\n", 213 (signed int) pStatistic->CustomStat.ullRsr2M, 214 (signed int) pStatistic->CustomStat.ullRsr2MCRCOk, byRSR); 215 } 216 else if(byRxRate==2){ 217 pStatistic->CustomStat.ullRsr1M++; 218 if(byRSR & RSR_CRCOK) { 219 pStatistic->CustomStat.ullRsr1MCRCOk++; 220 } 221 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 1M: ALL[%d], OK[%d]:[%02x]\n", 222 (signed int) pStatistic->CustomStat.ullRsr1M, 223 (signed int) pStatistic->CustomStat.ullRsr1MCRCOk, byRSR); 224 } 225 else if(byRxRate==12){ 226 pStatistic->CustomStat.ullRsr6M++; 227 if(byRSR & RSR_CRCOK) { 228 pStatistic->CustomStat.ullRsr6MCRCOk++; 229 } 230 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 6M: ALL[%d], OK[%d]\n", 231 (signed int) pStatistic->CustomStat.ullRsr6M, 232 (signed int) pStatistic->CustomStat.ullRsr6MCRCOk); 233 } 234 else if(byRxRate==18){ 235 pStatistic->CustomStat.ullRsr9M++; 236 if(byRSR & RSR_CRCOK) { 237 pStatistic->CustomStat.ullRsr9MCRCOk++; 238 } 239 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 9M: ALL[%d], OK[%d]\n", 240 (signed int) pStatistic->CustomStat.ullRsr9M, 241 (signed int) pStatistic->CustomStat.ullRsr9MCRCOk); 242 } 243 else if(byRxRate==24){ 244 pStatistic->CustomStat.ullRsr12M++; 245 if(byRSR & RSR_CRCOK) { 246 pStatistic->CustomStat.ullRsr12MCRCOk++; 247 } 248 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "12M: ALL[%d], OK[%d]\n", 249 (signed int) pStatistic->CustomStat.ullRsr12M, 250 (signed int) pStatistic->CustomStat.ullRsr12MCRCOk); 251 } 252 else if(byRxRate==36){ 253 pStatistic->CustomStat.ullRsr18M++; 254 if(byRSR & RSR_CRCOK) { 255 pStatistic->CustomStat.ullRsr18MCRCOk++; 256 } 257 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "18M: ALL[%d], OK[%d]\n", 258 (signed int) pStatistic->CustomStat.ullRsr18M, 259 (signed int) pStatistic->CustomStat.ullRsr18MCRCOk); 260 } 261 else if(byRxRate==48){ 262 pStatistic->CustomStat.ullRsr24M++; 263 if(byRSR & RSR_CRCOK) { 264 pStatistic->CustomStat.ullRsr24MCRCOk++; 265 } 266 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "24M: ALL[%d], OK[%d]\n", 267 (signed int) pStatistic->CustomStat.ullRsr24M, 268 (signed int) pStatistic->CustomStat.ullRsr24MCRCOk); 269 } 270 else if(byRxRate==72){ 271 pStatistic->CustomStat.ullRsr36M++; 272 if(byRSR & RSR_CRCOK) { 273 pStatistic->CustomStat.ullRsr36MCRCOk++; 274 } 275 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "36M: ALL[%d], OK[%d]\n", 276 (signed int) pStatistic->CustomStat.ullRsr36M, 277 (signed int) pStatistic->CustomStat.ullRsr36MCRCOk); 278 } 279 else if(byRxRate==96){ 280 pStatistic->CustomStat.ullRsr48M++; 281 if(byRSR & RSR_CRCOK) { 282 pStatistic->CustomStat.ullRsr48MCRCOk++; 283 } 284 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "48M: ALL[%d], OK[%d]\n", 285 (signed int) pStatistic->CustomStat.ullRsr48M, 286 (signed int) pStatistic->CustomStat.ullRsr48MCRCOk); 287 } 288 else if(byRxRate==108){ 289 pStatistic->CustomStat.ullRsr54M++; 290 if(byRSR & RSR_CRCOK) { 291 pStatistic->CustomStat.ullRsr54MCRCOk++; 292 } 293 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "54M: ALL[%d], OK[%d]\n", 294 (signed int) pStatistic->CustomStat.ullRsr54M, 295 (signed int) pStatistic->CustomStat.ullRsr54MCRCOk); 296 } 297 else { 298 DBG_PRT(MSG_LEVEL_DEBUG, 299 KERN_INFO "Unknown: Total[%d], CRCOK[%d]\n", 300 (signed int) pStatistic->dwRsrRxPacket+1, 301 (signed int)pStatistic->dwRsrCRCOk); 302 } 303 304 if (byRSR & RSR_BSSIDOK) 305 pStatistic->dwRsrBSSIDOk++; 306 307 if (byRSR & RSR_BCNSSIDOK) 308 pStatistic->dwRsrBCNSSIDOk++; 309 if (byRSR & RSR_IVLDLEN) //invalid len (> 2312 byte) 310 pStatistic->dwRsrLENErr++; 311 if (byRSR & RSR_IVLDTYP) //invalid packet type 312 pStatistic->dwRsrTYPErr++; 313 if ((byRSR & (RSR_IVLDTYP | RSR_IVLDLEN)) || !(byRSR & RSR_CRCOK)) 314 pStatistic->dwRsrErr++; 315 316 if (byNewRSR & NEWRSR_DECRYPTOK) 317 pStatistic->dwNewRsrDECRYPTOK++; 318 if (byNewRSR & NEWRSR_CFPIND) 319 pStatistic->dwNewRsrCFP++; 320 if (byNewRSR & NEWRSR_HWUTSF) 321 pStatistic->dwNewRsrUTSF++; 322 if (byNewRSR & NEWRSR_BCNHITAID) 323 pStatistic->dwNewRsrHITAID++; 324 if (byNewRSR & NEWRSR_BCNHITAID0) 325 pStatistic->dwNewRsrHITAID0++; 326 327 // increase rx packet count 328 pStatistic->dwRsrRxPacket++; 329 pStatistic->dwRsrRxOctet += cbFrameLength; 330 331 332 if (IS_TYPE_DATA(pbyBuffer)) { 333 pStatistic->dwRsrRxData++; 334 } else if (IS_TYPE_MGMT(pbyBuffer)){ 335 pStatistic->dwRsrRxManage++; 336 } else if (IS_TYPE_CONTROL(pbyBuffer)){ 337 pStatistic->dwRsrRxControl++; 338 } 339 340 if (byRSR & RSR_ADDRBROAD) 341 pStatistic->dwRsrBroadcast++; 342 else if (byRSR & RSR_ADDRMULTI) 343 pStatistic->dwRsrMulticast++; 344 else 345 pStatistic->dwRsrDirected++; 346 347 if (WLAN_GET_FC_MOREFRAG(pHeader->wFrameCtl)) 348 pStatistic->dwRsrRxFragment++; 349 350 if (cbFrameLength < ETH_ZLEN + 4) { 351 pStatistic->dwRsrRunt++; 352 } else if (cbFrameLength == ETH_ZLEN + 4) { 353 pStatistic->dwRsrRxFrmLen64++; 354 } 355 else if ((65 <= cbFrameLength) && (cbFrameLength <= 127)) { 356 pStatistic->dwRsrRxFrmLen65_127++; 357 } 358 else if ((128 <= cbFrameLength) && (cbFrameLength <= 255)) { 359 pStatistic->dwRsrRxFrmLen128_255++; 360 } 361 else if ((256 <= cbFrameLength) && (cbFrameLength <= 511)) { 362 pStatistic->dwRsrRxFrmLen256_511++; 363 } 364 else if ((512 <= cbFrameLength) && (cbFrameLength <= 1023)) { 365 pStatistic->dwRsrRxFrmLen512_1023++; 366 } else if ((1024 <= cbFrameLength) && 367 (cbFrameLength <= ETH_FRAME_LEN + 4)) { 368 pStatistic->dwRsrRxFrmLen1024_1518++; 369 } else if (cbFrameLength > ETH_FRAME_LEN + 4) { 370 pStatistic->dwRsrLong++; 371 } 372} 373 374/* 375 * Description: Update Rx Statistic Counter and copy Rx buffer 376 * 377 * Parameters: 378 * In: 379 * pStatistic - Pointer to Statistic Counter Data Structure 380 * byRSR - Rx Status 381 * byNewRSR - Rx Status 382 * pbyBuffer - Rx Buffer 383 * cbFrameLength - Rx Length 384 * Out: 385 * none 386 * 387 * Return Value: none 388 * 389 */ 390 391void 392STAvUpdateRDStatCounterEx ( 393 PSStatCounter pStatistic, 394 BYTE byRSR, 395 BYTE byNewRSR, 396 BYTE byRxSts, 397 BYTE byRxRate, 398 PBYTE pbyBuffer, 399 unsigned int cbFrameLength 400 ) 401{ 402 STAvUpdateRDStatCounter( 403 pStatistic, 404 byRSR, 405 byNewRSR, 406 byRxSts, 407 byRxRate, 408 pbyBuffer, 409 cbFrameLength 410 ); 411 412 // rx length 413 pStatistic->dwCntRxFrmLength = cbFrameLength; 414 // rx pattern, we just see 10 bytes for sample 415 memcpy(pStatistic->abyCntRxPattern, (PBYTE)pbyBuffer, 10); 416} 417 418 419/* 420 * Description: Update Tx Statistic Counter 421 * 422 * Parameters: 423 * In: 424 * pStatistic - Pointer to Statistic Counter Data Structure 425 * byTSR0 - Tx Status 426 * byTSR1 - Tx Status 427 * pbyBuffer - Tx Buffer 428 * cbFrameLength - Tx Length 429 * uIdx - Index of Tx DMA 430 * Out: 431 * none 432 * 433 * Return Value: none 434 * 435 */ 436void 437STAvUpdateTDStatCounter ( 438 PSStatCounter pStatistic, 439 BYTE byPktNum, 440 BYTE byRate, 441 BYTE byTSR 442 ) 443{ 444 BYTE byRetyCnt; 445 // increase tx packet count 446 pStatistic->dwTsrTxPacket++; 447 448 byRetyCnt = (byTSR & 0xF0) >> 4; 449 if (byRetyCnt != 0) { 450 pStatistic->dwTsrRetry++; 451 pStatistic->dwTsrTotalRetry += byRetyCnt; 452 pStatistic->dwTxFail[byRate]+= byRetyCnt; 453 pStatistic->dwTxFail[MAX_RATE] += byRetyCnt; 454 455 if ( byRetyCnt == 0x1) 456 pStatistic->dwTsrOnceRetry++; 457 else 458 pStatistic->dwTsrMoreThanOnceRetry++; 459 460 if (byRetyCnt <= 8) 461 pStatistic->dwTxRetryCount[byRetyCnt-1]++; 462 463 } 464 if ( !(byTSR & (TSR_TMO | TSR_RETRYTMO))) { 465 466 if (byRetyCnt < 2) 467 pStatistic->TxNoRetryOkCount ++; 468 else 469 pStatistic->TxRetryOkCount ++; 470 471 pStatistic->ullTsrOK++; 472 pStatistic->CustomStat.ullTsrAllOK++; 473 // update counters in case that successful transmit 474 pStatistic->dwTxOk[byRate]++; 475 pStatistic->dwTxOk[MAX_RATE]++; 476 477 if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_BROAD ) { 478 pStatistic->ullTxBroadcastFrames++; 479 pStatistic->ullTxBroadcastBytes += pStatistic->abyTxPktInfo[byPktNum].wLength; 480 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_MULTI ) { 481 pStatistic->ullTxMulticastFrames++; 482 pStatistic->ullTxMulticastBytes += pStatistic->abyTxPktInfo[byPktNum].wLength; 483 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_UNI ) { 484 pStatistic->ullTxDirectedFrames++; 485 pStatistic->ullTxDirectedBytes += pStatistic->abyTxPktInfo[byPktNum].wLength; 486 } 487 } 488 else { 489 490 pStatistic->TxFailCount ++; 491 492 pStatistic->dwTsrErr++; 493 if (byTSR & TSR_RETRYTMO) 494 pStatistic->dwTsrRetryTimeout++; 495 if (byTSR & TSR_TMO) 496 pStatistic->dwTsrTransmitTimeout++; 497 } 498 499 if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_BROAD ) { 500 pStatistic->dwTsrBroadcast++; 501 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_MULTI ) { 502 pStatistic->dwTsrMulticast++; 503 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_UNI ) { 504 pStatistic->dwTsrDirected++; 505 } 506} 507 508 509 510/* 511 * Description: Update 802.11 mib counter 512 * 513 * Parameters: 514 * In: 515 * p802_11Counter - Pointer to 802.11 mib counter 516 * pStatistic - Pointer to Statistic Counter Data Structure 517 * dwCounter - hardware counter for 802.11 mib 518 * Out: 519 * none 520 * 521 * Return Value: none 522 * 523 */ 524void 525STAvUpdate802_11Counter( 526 PSDot11Counters p802_11Counter, 527 PSStatCounter pStatistic, 528 BYTE byRTSSuccess, 529 BYTE byRTSFail, 530 BYTE byACKFail, 531 BYTE byFCSErr 532 ) 533{ 534 //p802_11Counter->TransmittedFragmentCount 535 p802_11Counter->MulticastTransmittedFrameCount = 536 (unsigned long long) (pStatistic->dwTsrBroadcast + 537 pStatistic->dwTsrMulticast); 538 p802_11Counter->FailedCount = (unsigned long long) (pStatistic->dwTsrErr); 539 p802_11Counter->RetryCount = (unsigned long long) (pStatistic->dwTsrRetry); 540 p802_11Counter->MultipleRetryCount = 541 (unsigned long long) (pStatistic->dwTsrMoreThanOnceRetry); 542 //p802_11Counter->FrameDuplicateCount 543 p802_11Counter->RTSSuccessCount += (unsigned long long) byRTSSuccess; 544 p802_11Counter->RTSFailureCount += (unsigned long long) byRTSFail; 545 p802_11Counter->ACKFailureCount += (unsigned long long) byACKFail; 546 p802_11Counter->FCSErrorCount += (unsigned long long) byFCSErr; 547 //p802_11Counter->ReceivedFragmentCount 548 p802_11Counter->MulticastReceivedFrameCount = 549 (unsigned long long) (pStatistic->dwRsrBroadcast + 550 pStatistic->dwRsrMulticast); 551} 552 553/* 554 * Description: Clear 802.11 mib counter 555 * 556 * Parameters: 557 * In: 558 * p802_11Counter - Pointer to 802.11 mib counter 559 * Out: 560 * none 561 * 562 * Return Value: none 563 * 564 */ 565void 566STAvClear802_11Counter(PSDot11Counters p802_11Counter) 567{ 568 // set memory to zero 569 memset(p802_11Counter, 0, sizeof(SDot11Counters)); 570} 571 572/* 573 * Description: Clear 802.11 mib counter 574 * 575 * Parameters: 576 * In: 577 * pUsbCounter - Pointer to USB mib counter 578 * ntStatus - URB status 579 * Out: 580 * none 581 * 582 * Return Value: none 583 * 584 */ 585 586void STAvUpdateUSBCounter(PSUSBCounter pUsbCounter, int ntStatus) 587{ 588 589// if ( ntStatus == USBD_STATUS_CRC ) { 590 pUsbCounter->dwCrc++; 591// } 592 593} 594