2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: Implement MIB Data Structure
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
46 /*--------------------- Static Definitions -------------------------*/
47 static int msglevel =MSG_LEVEL_INFO;
48 /*--------------------- Static Classes ----------------------------*/
50 /*--------------------- Static Variables --------------------------*/
52 /*--------------------- Static Functions --------------------------*/
54 /*--------------------- Export Variables --------------------------*/
56 /*--------------------- Export Functions --------------------------*/
61 * Description: Clear All Statistic Counter
65 * pStatistic - Pointer to Statistic Counter Data Structure
72 void STAvClearAllCounter (PSStatCounter pStatistic)
75 memset(pStatistic, 0, sizeof(SStatCounter));
80 * Description: Update Isr Statistic Counter
84 * pStatistic - Pointer to Statistic Counter Data Structure
85 * wisr - Interrupt status
92 void STAvUpdateIsrStatCounter (PSStatCounter pStatistic, BYTE byIsr0, BYTE byIsr1)
94 /**********************/
95 /* ABNORMAL interrupt */
96 /**********************/
97 // not any IMR bit invoke irq
99 pStatistic->ISRStat.dwIsrUnknown++;
104 if (byIsr0 & ISR_ACTX) // ISR, bit0
105 pStatistic->ISRStat.dwIsrTx0OK++; // TXDMA0 successful
107 if (byIsr0 & ISR_BNTX) // ISR, bit2
108 pStatistic->ISRStat.dwIsrBeaconTxOK++; // BeaconTx successful
110 if (byIsr0 & ISR_RXDMA0) // ISR, bit3
111 pStatistic->ISRStat.dwIsrRx0OK++; // Rx0 successful
113 if (byIsr0 & ISR_TBTT) // ISR, bit4
114 pStatistic->ISRStat.dwIsrTBTTInt++; // TBTT successful
116 if (byIsr0 & ISR_SOFTTIMER) // ISR, bit6
117 pStatistic->ISRStat.dwIsrSTIMERInt++;
119 if (byIsr0 & ISR_WATCHDOG) // ISR, bit7
120 pStatistic->ISRStat.dwIsrWatchDog++;
123 if (byIsr1 & ISR_FETALERR) // ISR, bit8
124 pStatistic->ISRStat.dwIsrUnrecoverableError++;
126 if (byIsr1 & ISR_SOFTINT) // ISR, bit9
127 pStatistic->ISRStat.dwIsrSoftInterrupt++; // software interrupt
129 if (byIsr1 & ISR_MIBNEARFULL) // ISR, bit10
130 pStatistic->ISRStat.dwIsrMIBNearfull++;
132 if (byIsr1 & ISR_RXNOBUF) // ISR, bit11
133 pStatistic->ISRStat.dwIsrRxNoBuf++; // Rx No Buff
139 * Description: Update Rx Statistic Counter
143 * pStatistic - Pointer to Statistic Counter Data Structure
145 * byNewRSR - Rx Status
146 * pbyBuffer - Rx Buffer
147 * cbFrameLength - Rx Length
154 void STAvUpdateRDStatCounter(PSStatCounter pStatistic,
155 BYTE byRSR, BYTE byNewRSR,
156 BYTE byRxSts, BYTE byRxRate,
157 PBYTE pbyBuffer, unsigned int cbFrameLength)
160 PS802_11Header pHeader = (PS802_11Header)pbyBuffer;
162 if (byRSR & RSR_ADDROK)
163 pStatistic->dwRsrADDROk++;
164 if (byRSR & RSR_CRCOK) {
165 pStatistic->dwRsrCRCOk++;
166 pStatistic->ullRsrOK++;
168 if (cbFrameLength >= ETH_ALEN) {
169 /* update counters in case of successful transmission */
170 if (byRSR & RSR_ADDRBROAD) {
171 pStatistic->ullRxBroadcastFrames++;
172 pStatistic->ullRxBroadcastBytes +=
173 (unsigned long long) cbFrameLength;
175 else if (byRSR & RSR_ADDRMULTI) {
176 pStatistic->ullRxMulticastFrames++;
177 pStatistic->ullRxMulticastBytes +=
178 (unsigned long long) cbFrameLength;
181 pStatistic->ullRxDirectedFrames++;
182 pStatistic->ullRxDirectedBytes +=
183 (unsigned long long) cbFrameLength;
189 pStatistic->CustomStat.ullRsr11M++;
190 if(byRSR & RSR_CRCOK) {
191 pStatistic->CustomStat.ullRsr11MCRCOk++;
193 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "11M: ALL[%d], OK[%d]:[%02x]\n",
194 (signed int) pStatistic->CustomStat.ullRsr11M,
195 (signed int) pStatistic->CustomStat.ullRsr11MCRCOk, byRSR);
197 else if(byRxRate==11) {
198 pStatistic->CustomStat.ullRsr5M++;
199 if(byRSR & RSR_CRCOK) {
200 pStatistic->CustomStat.ullRsr5MCRCOk++;
202 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 5M: ALL[%d], OK[%d]:[%02x]\n",
203 (signed int) pStatistic->CustomStat.ullRsr5M,
204 (signed int) pStatistic->CustomStat.ullRsr5MCRCOk, byRSR);
206 else if(byRxRate==4) {
207 pStatistic->CustomStat.ullRsr2M++;
208 if(byRSR & RSR_CRCOK) {
209 pStatistic->CustomStat.ullRsr2MCRCOk++;
211 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 2M: ALL[%d], OK[%d]:[%02x]\n",
212 (signed int) pStatistic->CustomStat.ullRsr2M,
213 (signed int) pStatistic->CustomStat.ullRsr2MCRCOk, byRSR);
215 else if(byRxRate==2){
216 pStatistic->CustomStat.ullRsr1M++;
217 if(byRSR & RSR_CRCOK) {
218 pStatistic->CustomStat.ullRsr1MCRCOk++;
220 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 1M: ALL[%d], OK[%d]:[%02x]\n",
221 (signed int) pStatistic->CustomStat.ullRsr1M,
222 (signed int) pStatistic->CustomStat.ullRsr1MCRCOk, byRSR);
224 else if(byRxRate==12){
225 pStatistic->CustomStat.ullRsr6M++;
226 if(byRSR & RSR_CRCOK) {
227 pStatistic->CustomStat.ullRsr6MCRCOk++;
229 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 6M: ALL[%d], OK[%d]\n",
230 (signed int) pStatistic->CustomStat.ullRsr6M,
231 (signed int) pStatistic->CustomStat.ullRsr6MCRCOk);
233 else if(byRxRate==18){
234 pStatistic->CustomStat.ullRsr9M++;
235 if(byRSR & RSR_CRCOK) {
236 pStatistic->CustomStat.ullRsr9MCRCOk++;
238 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " 9M: ALL[%d], OK[%d]\n",
239 (signed int) pStatistic->CustomStat.ullRsr9M,
240 (signed int) pStatistic->CustomStat.ullRsr9MCRCOk);
242 else if(byRxRate==24){
243 pStatistic->CustomStat.ullRsr12M++;
244 if(byRSR & RSR_CRCOK) {
245 pStatistic->CustomStat.ullRsr12MCRCOk++;
247 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "12M: ALL[%d], OK[%d]\n",
248 (signed int) pStatistic->CustomStat.ullRsr12M,
249 (signed int) pStatistic->CustomStat.ullRsr12MCRCOk);
251 else if(byRxRate==36){
252 pStatistic->CustomStat.ullRsr18M++;
253 if(byRSR & RSR_CRCOK) {
254 pStatistic->CustomStat.ullRsr18MCRCOk++;
256 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "18M: ALL[%d], OK[%d]\n",
257 (signed int) pStatistic->CustomStat.ullRsr18M,
258 (signed int) pStatistic->CustomStat.ullRsr18MCRCOk);
260 else if(byRxRate==48){
261 pStatistic->CustomStat.ullRsr24M++;
262 if(byRSR & RSR_CRCOK) {
263 pStatistic->CustomStat.ullRsr24MCRCOk++;
265 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "24M: ALL[%d], OK[%d]\n",
266 (signed int) pStatistic->CustomStat.ullRsr24M,
267 (signed int) pStatistic->CustomStat.ullRsr24MCRCOk);
269 else if(byRxRate==72){
270 pStatistic->CustomStat.ullRsr36M++;
271 if(byRSR & RSR_CRCOK) {
272 pStatistic->CustomStat.ullRsr36MCRCOk++;
274 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "36M: ALL[%d], OK[%d]\n",
275 (signed int) pStatistic->CustomStat.ullRsr36M,
276 (signed int) pStatistic->CustomStat.ullRsr36MCRCOk);
278 else if(byRxRate==96){
279 pStatistic->CustomStat.ullRsr48M++;
280 if(byRSR & RSR_CRCOK) {
281 pStatistic->CustomStat.ullRsr48MCRCOk++;
283 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "48M: ALL[%d], OK[%d]\n",
284 (signed int) pStatistic->CustomStat.ullRsr48M,
285 (signed int) pStatistic->CustomStat.ullRsr48MCRCOk);
287 else if(byRxRate==108){
288 pStatistic->CustomStat.ullRsr54M++;
289 if(byRSR & RSR_CRCOK) {
290 pStatistic->CustomStat.ullRsr54MCRCOk++;
292 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "54M: ALL[%d], OK[%d]\n",
293 (signed int) pStatistic->CustomStat.ullRsr54M,
294 (signed int) pStatistic->CustomStat.ullRsr54MCRCOk);
297 DBG_PRT(MSG_LEVEL_DEBUG,
298 KERN_INFO "Unknown: Total[%d], CRCOK[%d]\n",
299 (signed int) pStatistic->dwRsrRxPacket+1,
300 (signed int)pStatistic->dwRsrCRCOk);
303 if (byRSR & RSR_BSSIDOK)
304 pStatistic->dwRsrBSSIDOk++;
306 if (byRSR & RSR_BCNSSIDOK)
307 pStatistic->dwRsrBCNSSIDOk++;
308 if (byRSR & RSR_IVLDLEN) //invalid len (> 2312 byte)
309 pStatistic->dwRsrLENErr++;
310 if (byRSR & RSR_IVLDTYP) //invalid packet type
311 pStatistic->dwRsrTYPErr++;
312 if ((byRSR & (RSR_IVLDTYP | RSR_IVLDLEN)) || !(byRSR & RSR_CRCOK))
313 pStatistic->dwRsrErr++;
315 if (byNewRSR & NEWRSR_DECRYPTOK)
316 pStatistic->dwNewRsrDECRYPTOK++;
317 if (byNewRSR & NEWRSR_CFPIND)
318 pStatistic->dwNewRsrCFP++;
319 if (byNewRSR & NEWRSR_HWUTSF)
320 pStatistic->dwNewRsrUTSF++;
321 if (byNewRSR & NEWRSR_BCNHITAID)
322 pStatistic->dwNewRsrHITAID++;
323 if (byNewRSR & NEWRSR_BCNHITAID0)
324 pStatistic->dwNewRsrHITAID0++;
326 // increase rx packet count
327 pStatistic->dwRsrRxPacket++;
328 pStatistic->dwRsrRxOctet += cbFrameLength;
331 if (IS_TYPE_DATA(pbyBuffer)) {
332 pStatistic->dwRsrRxData++;
333 } else if (IS_TYPE_MGMT(pbyBuffer)){
334 pStatistic->dwRsrRxManage++;
335 } else if (IS_TYPE_CONTROL(pbyBuffer)){
336 pStatistic->dwRsrRxControl++;
339 if (byRSR & RSR_ADDRBROAD)
340 pStatistic->dwRsrBroadcast++;
341 else if (byRSR & RSR_ADDRMULTI)
342 pStatistic->dwRsrMulticast++;
344 pStatistic->dwRsrDirected++;
346 if (WLAN_GET_FC_MOREFRAG(pHeader->wFrameCtl))
347 pStatistic->dwRsrRxFragment++;
349 if (cbFrameLength < ETH_ZLEN + 4) {
350 pStatistic->dwRsrRunt++;
351 } else if (cbFrameLength == ETH_ZLEN + 4) {
352 pStatistic->dwRsrRxFrmLen64++;
354 else if ((65 <= cbFrameLength) && (cbFrameLength <= 127)) {
355 pStatistic->dwRsrRxFrmLen65_127++;
357 else if ((128 <= cbFrameLength) && (cbFrameLength <= 255)) {
358 pStatistic->dwRsrRxFrmLen128_255++;
360 else if ((256 <= cbFrameLength) && (cbFrameLength <= 511)) {
361 pStatistic->dwRsrRxFrmLen256_511++;
363 else if ((512 <= cbFrameLength) && (cbFrameLength <= 1023)) {
364 pStatistic->dwRsrRxFrmLen512_1023++;
365 } else if ((1024 <= cbFrameLength) &&
366 (cbFrameLength <= ETH_FRAME_LEN + 4)) {
367 pStatistic->dwRsrRxFrmLen1024_1518++;
368 } else if (cbFrameLength > ETH_FRAME_LEN + 4) {
369 pStatistic->dwRsrLong++;
374 * Description: Update Rx Statistic Counter and copy Rx buffer
378 * pStatistic - Pointer to Statistic Counter Data Structure
380 * byNewRSR - Rx Status
381 * pbyBuffer - Rx Buffer
382 * cbFrameLength - Rx Length
391 STAvUpdateRDStatCounterEx (
392 PSStatCounter pStatistic,
398 unsigned int cbFrameLength
401 STAvUpdateRDStatCounter(
412 pStatistic->dwCntRxFrmLength = cbFrameLength;
413 // rx pattern, we just see 10 bytes for sample
414 memcpy(pStatistic->abyCntRxPattern, (PBYTE)pbyBuffer, 10);
419 * Description: Update Tx Statistic Counter
423 * pStatistic - Pointer to Statistic Counter Data Structure
426 * pbyBuffer - Tx Buffer
427 * cbFrameLength - Tx Length
428 * uIdx - Index of Tx DMA
436 STAvUpdateTDStatCounter (
437 PSStatCounter pStatistic,
444 // increase tx packet count
445 pStatistic->dwTsrTxPacket++;
447 byRetyCnt = (byTSR & 0xF0) >> 4;
448 if (byRetyCnt != 0) {
449 pStatistic->dwTsrRetry++;
450 pStatistic->dwTsrTotalRetry += byRetyCnt;
451 pStatistic->dwTxFail[byRate]+= byRetyCnt;
452 pStatistic->dwTxFail[MAX_RATE] += byRetyCnt;
454 if ( byRetyCnt == 0x1)
455 pStatistic->dwTsrOnceRetry++;
457 pStatistic->dwTsrMoreThanOnceRetry++;
460 pStatistic->dwTxRetryCount[byRetyCnt-1]++;
463 if ( !(byTSR & (TSR_TMO | TSR_RETRYTMO))) {
466 pStatistic->TxNoRetryOkCount ++;
468 pStatistic->TxRetryOkCount ++;
470 pStatistic->ullTsrOK++;
471 pStatistic->CustomStat.ullTsrAllOK++;
472 // update counters in case that successful transmit
473 pStatistic->dwTxOk[byRate]++;
474 pStatistic->dwTxOk[MAX_RATE]++;
476 if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_BROAD ) {
477 pStatistic->ullTxBroadcastFrames++;
478 pStatistic->ullTxBroadcastBytes += pStatistic->abyTxPktInfo[byPktNum].wLength;
479 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_MULTI ) {
480 pStatistic->ullTxMulticastFrames++;
481 pStatistic->ullTxMulticastBytes += pStatistic->abyTxPktInfo[byPktNum].wLength;
482 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_UNI ) {
483 pStatistic->ullTxDirectedFrames++;
484 pStatistic->ullTxDirectedBytes += pStatistic->abyTxPktInfo[byPktNum].wLength;
489 pStatistic->TxFailCount ++;
491 pStatistic->dwTsrErr++;
492 if (byTSR & TSR_RETRYTMO)
493 pStatistic->dwTsrRetryTimeout++;
495 pStatistic->dwTsrTransmitTimeout++;
498 if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_BROAD ) {
499 pStatistic->dwTsrBroadcast++;
500 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_MULTI ) {
501 pStatistic->dwTsrMulticast++;
502 } else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_UNI ) {
503 pStatistic->dwTsrDirected++;
510 * Description: Update 802.11 mib counter
514 * p802_11Counter - Pointer to 802.11 mib counter
515 * pStatistic - Pointer to Statistic Counter Data Structure
516 * dwCounter - hardware counter for 802.11 mib
524 STAvUpdate802_11Counter(
525 PSDot11Counters p802_11Counter,
526 PSStatCounter pStatistic,
533 //p802_11Counter->TransmittedFragmentCount
534 p802_11Counter->MulticastTransmittedFrameCount =
535 (unsigned long long) (pStatistic->dwTsrBroadcast +
536 pStatistic->dwTsrMulticast);
537 p802_11Counter->FailedCount = (unsigned long long) (pStatistic->dwTsrErr);
538 p802_11Counter->RetryCount = (unsigned long long) (pStatistic->dwTsrRetry);
539 p802_11Counter->MultipleRetryCount =
540 (unsigned long long) (pStatistic->dwTsrMoreThanOnceRetry);
541 //p802_11Counter->FrameDuplicateCount
542 p802_11Counter->RTSSuccessCount += (unsigned long long) byRTSSuccess;
543 p802_11Counter->RTSFailureCount += (unsigned long long) byRTSFail;
544 p802_11Counter->ACKFailureCount += (unsigned long long) byACKFail;
545 p802_11Counter->FCSErrorCount += (unsigned long long) byFCSErr;
546 //p802_11Counter->ReceivedFragmentCount
547 p802_11Counter->MulticastReceivedFrameCount =
548 (unsigned long long) (pStatistic->dwRsrBroadcast +
549 pStatistic->dwRsrMulticast);
553 * Description: Clear 802.11 mib counter
557 * p802_11Counter - Pointer to 802.11 mib counter
565 STAvClear802_11Counter(PSDot11Counters p802_11Counter)
567 // set memory to zero
568 memset(p802_11Counter, 0, sizeof(SDot11Counters));
572 * Description: Clear 802.11 mib counter
576 * pUsbCounter - Pointer to USB mib counter
577 * ntStatus - URB status
585 void STAvUpdateUSBCounter(PSUSBCounter pUsbCounter, int ntStatus)
588 // if ( ntStatus == USBD_STATUS_CRC ) {
589 pUsbCounter->dwCrc++;