/*
 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * File: mib.c
 *
 * Purpose: Implement MIB Data Structure
 *
 * Author: Tevin Chen
 *
 * Date: May 21, 1996
 *
 * Functions:
 *      STAvUpdateIstStatCounter - Update ISR statistic counter
 *      STAvUpdate802_11Counter - Update 802.11 mib counter
 *
 * Revision History:
 *
 */

#include "mac.h"
#include "mib.h"

/*---------------------  Static Classes  ----------------------------*/

/*---------------------  Static Variables  --------------------------*/

/*---------------------  Static Functions  --------------------------*/

/*---------------------  Export Variables  --------------------------*/

/*---------------------  Export Functions  --------------------------*/

/*
 * Description: Update Isr Statistic Counter
 *
 * Parameters:
 *  In:
 *      pStatistic  - Pointer to Statistic Counter Data Structure
 *      wisr        - Interrupt status
 *  Out:
 *      none
 *
 * Return Value: none
 *
 */
void STAvUpdateIsrStatCounter(PSStatCounter pStatistic, unsigned long dwIsr)
{
	/**********************/
	/* ABNORMAL interrupt */
	/**********************/
	// not any IMR bit invoke irq

	if (dwIsr == 0) {
		pStatistic->ISRStat.dwIsrUnknown++;
		return;
	}

//Added by Kyle
	if (dwIsr & ISR_TXDMA0)               // ISR, bit0
		pStatistic->ISRStat.dwIsrTx0OK++;             // TXDMA0 successful

	if (dwIsr & ISR_AC0DMA)               // ISR, bit1
		pStatistic->ISRStat.dwIsrAC0TxOK++;           // AC0DMA successful

	if (dwIsr & ISR_BNTX)                 // ISR, bit2
		pStatistic->ISRStat.dwIsrBeaconTxOK++;        // BeaconTx successful

	if (dwIsr & ISR_RXDMA0)               // ISR, bit3
		pStatistic->ISRStat.dwIsrRx0OK++;             // Rx0 successful

	if (dwIsr & ISR_TBTT)                 // ISR, bit4
		pStatistic->ISRStat.dwIsrTBTTInt++;           // TBTT successful

	if (dwIsr & ISR_SOFTTIMER)            // ISR, bit6
		pStatistic->ISRStat.dwIsrSTIMERInt++;

	if (dwIsr & ISR_WATCHDOG)             // ISR, bit7
		pStatistic->ISRStat.dwIsrWatchDog++;

	if (dwIsr & ISR_FETALERR)             // ISR, bit8
		pStatistic->ISRStat.dwIsrUnrecoverableError++;

	if (dwIsr & ISR_SOFTINT)              // ISR, bit9
		pStatistic->ISRStat.dwIsrSoftInterrupt++;     // software interrupt

	if (dwIsr & ISR_MIBNEARFULL)          // ISR, bit10
		pStatistic->ISRStat.dwIsrMIBNearfull++;

	if (dwIsr & ISR_RXNOBUF)              // ISR, bit11
		pStatistic->ISRStat.dwIsrRxNoBuf++;           // Rx No Buff

	if (dwIsr & ISR_RXDMA1)               // ISR, bit12
		pStatistic->ISRStat.dwIsrRx1OK++;             // Rx1 successful

	if (dwIsr & ISR_SOFTTIMER1)           // ISR, bit21
		pStatistic->ISRStat.dwIsrSTIMER1Int++;
}

/*
 * Description: Update 802.11 mib counter
 *
 * Parameters:
 *  In:
 *      p802_11Counter  - Pointer to 802.11 mib counter
 *      pStatistic      - Pointer to Statistic Counter Data Structure
 *      dwCounter       - hardware counter for 802.11 mib
 *  Out:
 *      none
 *
 * Return Value: none
 *
 */
void
STAvUpdate802_11Counter(
	PSDot11Counters         p802_11Counter,
	PSStatCounter           pStatistic,
	unsigned long dwCounter
)
{
	p802_11Counter->RTSSuccessCount += (unsigned long long)  (dwCounter & 0x000000ff);
	p802_11Counter->RTSFailureCount += (unsigned long long) ((dwCounter & 0x0000ff00) >> 8);
	p802_11Counter->ACKFailureCount += (unsigned long long) ((dwCounter & 0x00ff0000) >> 16);
	p802_11Counter->FCSErrorCount +=   (unsigned long long) ((dwCounter & 0xff000000) >> 24);
}
