/*
 * Copyright (c) 2004-2005 The Regents of The University of Michigan
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "dev/net/etherdevice.hh"

#include "sim/stats.hh"

namespace gem5
{

EtherDevice::EtherDeviceStats::EtherDeviceStats(statistics::Group *parent)
    : statistics::Group(parent, "EtherDevice"),
      ADD_STAT(postedInterrupts, statistics::units::Count::get(),
               "Number of posts to CPU"),
      ADD_STAT(txBytes, statistics::units::Byte::get(),
               "Bytes Transmitted"),
      ADD_STAT(rxBytes, statistics::units::Byte::get(), "Bytes Received"),
      ADD_STAT(txPackets, statistics::units::Count::get(),
               "Number of Packets Transmitted"),
      ADD_STAT(rxPackets, statistics::units::Count::get(),
               "Number of Packets Received"),
      ADD_STAT(txBandwidth, statistics::units::Rate<
                    statistics::units::Bit, statistics::units::Second>::get(),
               "Transmit Bandwidth",
               txBytes * statistics::constant(8) / simSeconds),
      ADD_STAT(rxBandwidth, statistics::units::Rate<
                    statistics::units::Bit, statistics::units::Second>::get(),
               "Receive Bandwidth",
               rxBytes * statistics::constant(8) / simSeconds),
      ADD_STAT(txIpChecksums, statistics::units::Count::get(),
               "Number of tx IP Checksums done by device"),
      ADD_STAT(rxIpChecksums, statistics::units::Count::get(),
               "Number of rx IP Checksums done by device"),
      ADD_STAT(txTcpChecksums, statistics::units::Count::get(),
               "Number of tx TCP Checksums done by device"),
      ADD_STAT(rxTcpChecksums, statistics::units::Count::get(),
               "Number of rx TCP Checksums done by device"),
      ADD_STAT(txUdpChecksums, statistics::units::Count::get(),
               "Number of tx UDP Checksums done by device"),
      ADD_STAT(rxUdpChecksums, statistics::units::Count::get(),
               "Number of rx UDP Checksums done by device"),
      ADD_STAT(descDmaReads, statistics::units::Count::get(),
               "Number of descriptors the device read w/ DMA"),
      ADD_STAT(descDmaWrites, statistics::units::Count::get(),
               "Number of descriptors the device wrote w/ DMA"),
      ADD_STAT(descDmaRdBytes, statistics::units::Count::get(),
               "Number of descriptor bytes read w/ DMA"),
      ADD_STAT(descDmaWrBytes, statistics::units::Count::get(),
               "Number of descriptor bytes write w/ DMA"),
      ADD_STAT(totBandwidth, statistics::units::Rate<
                    statistics::units::Bit, statistics::units::Second>::get(),
               "Total Bandwidth",
               txBandwidth + rxBandwidth),
      ADD_STAT(totPackets, statistics::units::Count::get(), "Total Packets",
               txPackets + rxPackets),
      ADD_STAT(totBytes, statistics::units::Byte::get(), "Total Bytes",
               txBytes + rxBytes),
      ADD_STAT(totPacketRate, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Second>::get(),
               "Total Packet Tranmission Rate",
               totPackets / simSeconds),
      ADD_STAT(txPacketRate, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Second>::get(),
               "Packet Tranmission Rate",
               txPackets / simSeconds),
      ADD_STAT(rxPacketRate, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Second>::get(),
               "Packet Reception Rate",
               rxPackets / simSeconds),
      ADD_STAT(postedSwi, statistics::units::Count::get(),
               "Number of software interrupts posted to CPU"),
      ADD_STAT(totalSwi, statistics::units::Count::get(),
               "Total number of Swi written to ISR"),
      ADD_STAT(coalescedSwi, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of Swi's coalesced into each post",
               totalSwi / postedInterrupts),
      ADD_STAT(postedRxIdle, statistics::units::Count::get(),
               "Number of rxIdle interrupts posted to CPU"),
      ADD_STAT(totalRxIdle, statistics::units::Count::get(),
               "Total number of RxIdle written to ISR"),
      ADD_STAT(coalescedRxIdle, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of RxIdle's coalesced into each post",
               totalRxIdle / postedInterrupts),
      ADD_STAT(postedRxOk, statistics::units::Count::get(),
               "Number of RxOk interrupts posted to CPU"),
      ADD_STAT(totalRxOk, statistics::units::Count::get(),
               "Total number of RxOk written to ISR"),
      ADD_STAT(coalescedRxOk, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of RxOk's coalesced into each post",
               totalRxOk / postedInterrupts),
      ADD_STAT(postedRxDesc, statistics::units::Count::get(),
               "Number of RxDesc interrupts posted to CPU"),
      ADD_STAT(totalRxDesc, statistics::units::Count::get(),
               "Total number of RxDesc written to ISR"),
      ADD_STAT(coalescedRxDesc, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of RxDesc's coalesced into each post",
               totalRxDesc / postedInterrupts),
      ADD_STAT(postedTxOk, statistics::units::Count::get(),
               "Number of TxOk interrupts posted to CPU"),
      ADD_STAT(totalTxOk, statistics::units::Count::get(),
               "Total number of TxOk written to ISR"),
      ADD_STAT(coalescedTxOk, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of TxOk's coalesced into each post",
               totalTxOk / postedInterrupts),
      ADD_STAT(postedTxIdle, statistics::units::Count::get(),
               "Number of TxIdle interrupts posted to CPU"),
      ADD_STAT(totalTxIdle, statistics::units::Count::get(),
               "Total number of TxIdle written to ISR"),
      ADD_STAT(coalescedTxIdle, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of TxIdle's coalesced into each post",
               totalTxIdle / postedInterrupts),
      ADD_STAT(postedTxDesc, statistics::units::Count::get(),
               "Number of TxDesc interrupts posted to CPU"),
      ADD_STAT(totalTxDesc, statistics::units::Count::get(),
               "Total number of TxDesc written to ISR"),
      ADD_STAT(coalescedTxDesc, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of TxDesc's coalesced into each post",
               totalTxDesc / postedInterrupts),
      ADD_STAT(postedRxOrn, statistics::units::Count::get(),
               "Number of RxOrn posted to CPU"),
      ADD_STAT(totalRxOrn, statistics::units::Count::get(),
               "Total number of RxOrn written to ISR"),
      ADD_STAT(coalescedRxOrn, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of RxOrn's coalesced into each post",
               totalRxOrn / postedInterrupts),
      ADD_STAT(coalescedTotal, statistics::units::Rate<
                    statistics::units::Count, statistics::units::Count>::get(),
               "Average number of interrupts coalesced into each post"),
      ADD_STAT(droppedPackets, statistics::units::Count::get(),
               "Number of packets dropped")
{

    postedInterrupts
        .precision(0);

    txBytes
        .prereq(txBytes);

    rxBytes
        .prereq(rxBytes);

    txPackets
        .prereq(txBytes);

    rxPackets
        .prereq(rxBytes);

    txIpChecksums
        .precision(0)
        .prereq(txBytes);

    rxIpChecksums
        .precision(0)
        .prereq(rxBytes);

    txTcpChecksums
        .precision(0)
        .prereq(txBytes);

    rxTcpChecksums
        .precision(0)
        .prereq(rxBytes);

    txUdpChecksums
        .precision(0)
        .prereq(txBytes);

    rxUdpChecksums
        .precision(0)
        .prereq(rxBytes);

    descDmaReads
        .precision(0);

    descDmaWrites
        .precision(0);

    descDmaRdBytes
        .precision(0);

    descDmaWrBytes
        .precision(0);

    txBandwidth
        .precision(0)
        .prereq(txBytes)
        ;

    rxBandwidth
        .precision(0)
        .prereq(rxBytes);

    totBandwidth
        .precision(0)
        .prereq(totBytes);

    totPackets
        .precision(0)
        .prereq(totBytes);

    totBytes
        .precision(0)
        .prereq(totBytes);

    totPacketRate
        .precision(0)
        .prereq(totBytes);

    txPacketRate
        .precision(0)
        .prereq(txBytes);

    rxPacketRate
        .precision(0)
        .prereq(rxBytes);

    postedSwi
        .precision(0);

    totalSwi
        .precision(0);

    coalescedSwi
        .precision(0);

    postedRxIdle
        .precision(0);

    totalRxIdle
        .precision(0);

    coalescedRxIdle
        .precision(0);

    postedRxOk
        .precision(0);

    totalRxOk
        .precision(0);

    coalescedRxOk
        .precision(0);

    postedRxDesc
        .precision(0);

    totalRxDesc
        .precision(0);

    coalescedRxDesc
        .precision(0);

    postedTxOk
        .precision(0);

    totalTxOk
        .precision(0);

    coalescedTxOk
        .precision(0);

    postedTxIdle
        .precision(0);

    totalTxIdle
        .precision(0);

    coalescedTxIdle
        .precision(0);

    postedTxDesc
        .precision(0);

    totalTxDesc
        .precision(0);

    coalescedTxDesc
        .precision(0);

    postedRxOrn
        .precision(0);

    totalRxOrn
        .precision(0);

    coalescedRxOrn
        .precision(0);

    coalescedTotal
        .precision(0);

    droppedPackets
        .precision(0);

    coalescedTotal = (totalSwi + totalRxIdle + totalRxOk + totalRxDesc +
                      totalTxOk + totalTxIdle + totalTxDesc +
                      totalRxOrn) / postedInterrupts;
}

} // namespace gem5
