e1000g_stat.c revision 080575042aba2197b425ebfd52061dea061a9aa1
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * This file is provided under a CDDLv1 license. When using or
080575042aba2197b425ebfd52061dea061a9aa1xy * redistributing this file, you may do so under this license.
080575042aba2197b425ebfd52061dea061a9aa1xy * In redistributing this file this license must be included
080575042aba2197b425ebfd52061dea061a9aa1xy * and no other modification of this header file is permitted.
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * CDDL LICENSE SUMMARY
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * Copyright(c) 1999 - 2007 Intel Corporation. All rights reserved.
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * The contents of this file are subject to the terms of Version
080575042aba2197b425ebfd52061dea061a9aa1xy * 1.0 of the Common Development and Distribution License (the "License").
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * You should have received a copy of the License with this software.
080575042aba2197b425ebfd52061dea061a9aa1xy * You can obtain a copy of the License at
080575042aba2197b425ebfd52061dea061a9aa1xy * http://www.opensolaris.org/os/licensing.
080575042aba2197b425ebfd52061dea061a9aa1xy * See the License for the specific language governing permissions
080575042aba2197b425ebfd52061dea061a9aa1xy * and limitations under the License.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
080575042aba2197b425ebfd52061dea061a9aa1xy * Use is subject to license terms of the CDDLv1.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy#pragma ident "%Z%%M% %I% %E% SMI"
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Module Name: e1000g_stat.c *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Abstract: Functions for displaying statistics *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy#include "e1000g_sw.h"
080575042aba2197b425ebfd52061dea061a9aa1xy#include "e1000g_debug.h"
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xystatic int UpdateStatsCounters(kstat_t *ksp, int rw);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Name: AdjustTbiAcceptedStats *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Description: Adjusts statistic counters when a frame is accepted *
080575042aba2197b425ebfd52061dea061a9aa1xy * under the TBI workaround. This function has been *
080575042aba2197b425ebfd52061dea061a9aa1xy * adapted for Solaris from shared code. *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Author: Bill Campbell *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Born on Date: 4/12/2001 *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Arguments: *
080575042aba2197b425ebfd52061dea061a9aa1xy * Adapter - Ptr to this card's adapter data structure. *
080575042aba2197b425ebfd52061dea061a9aa1xy * FrameLength - Length as reported from Hardware *
080575042aba2197b425ebfd52061dea061a9aa1xy * MacAddress - Pointer to MAC address field in frame. *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Returns: *
080575042aba2197b425ebfd52061dea061a9aa1xy * VOID *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xyvoid
080575042aba2197b425ebfd52061dea061a9aa1xyAdjustTbiAcceptedStats(struct e1000g *Adapter,
080575042aba2197b425ebfd52061dea061a9aa1xy UINT32 FrameLength, PUCHAR MacAddress)
080575042aba2197b425ebfd52061dea061a9aa1xy{
080575042aba2197b425ebfd52061dea061a9aa1xy UINT32 CarryBit;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000gstat *e1000g_ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp = (e1000gstat *)Adapter->e1000g_ksp->ks_data;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * First adjust the frame length.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy FrameLength--;
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * We need to adjust the statistics counters, since the hardware
080575042aba2197b425ebfd52061dea061a9aa1xy * counters overcount this packet as a CRC error and undercount
080575042aba2197b425ebfd52061dea061a9aa1xy * the packet as a good packet
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * This packet should not be counted as a CRC error.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Crcerrs.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * This packet does count as a Good Packet Received.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gprc.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Adjust the Good Octets received counters
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy CarryBit = 0x80000000 & e1000g_ksp->Gorl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gorl.value.ul += FrameLength;
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * If the high bit of Gorcl (the low 32 bits of the Good Octets
080575042aba2197b425ebfd52061dea061a9aa1xy * Received Count) was one before the addition,
080575042aba2197b425ebfd52061dea061a9aa1xy * AND it is zero after, then we lost the carry out,
080575042aba2197b425ebfd52061dea061a9aa1xy * need to add one to Gorch (Good Octets Received Count High).
080575042aba2197b425ebfd52061dea061a9aa1xy * This could be simplified if all environments supported
080575042aba2197b425ebfd52061dea061a9aa1xy * 64-bit integers.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy if (CarryBit && ((e1000g_ksp->Gorl.value.ul & 0x80000000) == 0)) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gorh.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Is this a broadcast or multicast? Check broadcast first,
080575042aba2197b425ebfd52061dea061a9aa1xy * since the test for a multicast frame will test positive on
080575042aba2197b425ebfd52061dea061a9aa1xy * a broadcast frame.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy if ((MacAddress[0] == (UCHAR) 0xff) &&
080575042aba2197b425ebfd52061dea061a9aa1xy (MacAddress[1] == (UCHAR) 0xff)) {
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Broadcast packet
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Bprc.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy } else if (*MacAddress & 0x01) {
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Multicast packet
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Mprc.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy if (FrameLength == Adapter->Shared.max_frame_size) {
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * In this case, the hardware has overcounted the number of
080575042aba2197b425ebfd52061dea061a9aa1xy * oversize frames.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy if (e1000g_ksp->Roc.value.ul > 0)
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Roc.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Adjust the bin counters when the extra byte put the frame in the
080575042aba2197b425ebfd52061dea061a9aa1xy * wrong bin. Remember that the FrameLength was adjusted above.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy if (FrameLength == 64) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc64.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc127.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy } else if (FrameLength == 127) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc127.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc255.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy } else if (FrameLength == 255) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc255.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc511.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy } else if (FrameLength == 511) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc511.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1023.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy } else if (FrameLength == 1023) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1023.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1522.value.ul--;
080575042aba2197b425ebfd52061dea061a9aa1xy } else if (FrameLength == 1522) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1522.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy * Name: UpdateStatsCounters *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Description: This routine will dump and reset the 1000's internal *
080575042aba2197b425ebfd52061dea061a9aa1xy * Statistics counters. The current stats dump values will *
080575042aba2197b425ebfd52061dea061a9aa1xy * be sent to the kernel status area. *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Author: Phil Cayton *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Born on Date: 7/13/98 *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Arguments: *
080575042aba2197b425ebfd52061dea061a9aa1xy * *ksp - A kernel stat pointer *
080575042aba2197b425ebfd52061dea061a9aa1xy * rw - Read/Write flag *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Returns: *
080575042aba2197b425ebfd52061dea061a9aa1xy * (EACCES) If an attempt is made to write stats to the hw *
080575042aba2197b425ebfd52061dea061a9aa1xy * (0) On successful read of statistics to kernel stats. *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * File: e1000g_stat.c *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Modification log: *
080575042aba2197b425ebfd52061dea061a9aa1xy * Date Who Description *
080575042aba2197b425ebfd52061dea061a9aa1xy * -------- --- ------------------------------------------------------*
080575042aba2197b425ebfd52061dea061a9aa1xy * Sept 10,99 Vinay New Counters for Livengood have been added. *
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xystatic int
080575042aba2197b425ebfd52061dea061a9aa1xyUpdateStatsCounters(IN kstat_t *ksp, int rw)
080575042aba2197b425ebfd52061dea061a9aa1xy{
080575042aba2197b425ebfd52061dea061a9aa1xy uint16_t LineSpeed, Duplex;
080575042aba2197b425ebfd52061dea061a9aa1xy struct e1000g *Adapter;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000gstat *e1000g_ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy uint64_t val;
080575042aba2197b425ebfd52061dea061a9aa1xy uint32_t low_val, high_val;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy if (rw == KSTAT_WRITE)
080575042aba2197b425ebfd52061dea061a9aa1xy return (EACCES);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy Adapter = (struct e1000g *)ksp->ks_private;
080575042aba2197b425ebfd52061dea061a9aa1xy ASSERT(Adapter != NULL);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp = (e1000gstat *)ksp->ks_data;
080575042aba2197b425ebfd52061dea061a9aa1xy ASSERT(e1000g_ksp != NULL);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->link_up.value.ul = Adapter->LinkIsActive;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->link_speed.value.ul = Adapter->link_speed;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_none.value.ul = Adapter->rx_none;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_error.value.ul = Adapter->rx_error;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_no_freepkt.value.ul = Adapter->rx_no_freepkt;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_esballoc_fail.value.ul = Adapter->rx_esballoc_fail;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_exceed_pkt.value.ul = Adapter->rx_exceed_pkt;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_multi_desc.value.ul = Adapter->rx_multi_desc;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_allocb_fail.value.ul = Adapter->rx_allocb_fail;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_avail_freepkt.value.ul = Adapter->rx_avail_freepkt;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->rx_seq_intr.value.ul = Adapter->rx_seq_intr;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_no_desc.value.ul = Adapter->tx_no_desc;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_no_swpkt.value.ul = Adapter->tx_no_swpkt;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_lack_desc.value.ul = Adapter->tx_lack_desc;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_send_fail.value.ul = Adapter->tx_send_fail;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_multi_cookie.value.ul = Adapter->tx_multi_cookie;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_over_size.value.ul = Adapter->tx_over_size;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_under_size.value.ul = Adapter->tx_under_size;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_copy.value.ul = Adapter->tx_copy;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_bind.value.ul = Adapter->tx_bind;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_multi_copy.value.ul = Adapter->tx_multi_copy;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_reschedule.value.ul = Adapter->tx_reschedule;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_empty_frags.value.ul = Adapter->tx_empty_frags;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_exceed_frags.value.ul = Adapter->tx_exceed_frags;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_recycle.value.ul = Adapter->tx_recycle;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_recycle_retry.value.ul = Adapter->tx_recycle_retry;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_recycle_intr.value.ul = Adapter->tx_recycle_intr;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->tx_recycle_none.value.ul = Adapter->tx_recycle_none;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->StallWatchdog.value.ul = Adapter->StallWatchdog;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->reset_count.value.ul = Adapter->reset_count;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->JumboTx_4K.value.ul = Adapter->JumboTx_4K;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->JumboRx_4K.value.ul = Adapter->JumboRx_4K;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->JumboTx_8K.value.ul = Adapter->JumboTx_8K;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->JumboRx_8K.value.ul = Adapter->JumboRx_8K;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->JumboTx_16K.value.ul = Adapter->JumboTx_16K;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->JumboRx_16K.value.ul = Adapter->JumboRx_16K;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->intr_type.value.ul = Adapter->intr_type;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Mutex required if in TBI mode
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy if (Adapter->Shared.tbi_compatibility_on == 1) {
080575042aba2197b425ebfd52061dea061a9aa1xy mutex_enter(&Adapter->TbiCntrMutex);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Standard Stats
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Mpc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, MPC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Symerrs.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, SYMERRS);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rlec.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RLEC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Xonrxc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, XONRXC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Xontxc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, XONTXC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Xoffrxc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, XOFFRXC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Xofftxc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, XOFFTXC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Fcruc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, FCRUC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc64.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PRC64);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc127.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PRC127);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc255.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PRC255);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc511.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PRC511);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1023.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PRC1023);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1522.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PRC1522);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gprc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, GPRC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gptc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, GPTC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * The 64-bit register will reset whenever the upper
080575042aba2197b425ebfd52061dea061a9aa1xy * 32 bits are read. So we need to read the lower
080575042aba2197b425ebfd52061dea061a9aa1xy * 32 bits first, then read the upper 32 bits.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy low_val = E1000_READ_REG(&Adapter->Shared, GORCL);
080575042aba2197b425ebfd52061dea061a9aa1xy high_val = E1000_READ_REG(&Adapter->Shared, GORCH);
080575042aba2197b425ebfd52061dea061a9aa1xy val = (uint64_t)e1000g_ksp->Gorh.value.ul << 32 |
080575042aba2197b425ebfd52061dea061a9aa1xy (uint64_t)e1000g_ksp->Gorl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy val += (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gorl.value.ul = (uint32_t)val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gorh.value.ul = (uint32_t)(val >> 32);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy low_val = E1000_READ_REG(&Adapter->Shared, GOTCL);
080575042aba2197b425ebfd52061dea061a9aa1xy high_val = E1000_READ_REG(&Adapter->Shared, GOTCH);
080575042aba2197b425ebfd52061dea061a9aa1xy val = (uint64_t)e1000g_ksp->Goth.value.ul << 32 |
080575042aba2197b425ebfd52061dea061a9aa1xy (uint64_t)e1000g_ksp->Gotl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy val += (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gotl.value.ul = (uint32_t)val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Goth.value.ul = (uint32_t)(val >> 32);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ruc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RUC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rfc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RFC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Roc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ROC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rjc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RJC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy low_val = E1000_READ_REG(&Adapter->Shared, TORL);
080575042aba2197b425ebfd52061dea061a9aa1xy high_val = E1000_READ_REG(&Adapter->Shared, TORH);
080575042aba2197b425ebfd52061dea061a9aa1xy val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
080575042aba2197b425ebfd52061dea061a9aa1xy (uint64_t)e1000g_ksp->Torl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy val += (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Torl.value.ul = (uint32_t)val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Torh.value.ul = (uint32_t)(val >> 32);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy low_val = E1000_READ_REG(&Adapter->Shared, TOTL);
080575042aba2197b425ebfd52061dea061a9aa1xy high_val = E1000_READ_REG(&Adapter->Shared, TOTH);
080575042aba2197b425ebfd52061dea061a9aa1xy val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 |
080575042aba2197b425ebfd52061dea061a9aa1xy (uint64_t)e1000g_ksp->Totl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy val += (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Totl.value.ul = (uint32_t)val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Toth.value.ul = (uint32_t)(val >> 32);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tpr.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TPR);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Adaptive Calculations
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy Adapter->Shared.tx_packet_delta =
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TPT);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tpt.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy Adapter->Shared.tx_packet_delta;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ptc64.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PTC64);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ptc127.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PTC127);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ptc255.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PTC255);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ptc511.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PTC511);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ptc1023.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PTC1023);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ptc1522.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, PTC1522);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Livengood Counters
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tncrs.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TNCRS);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tsctc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TSCTC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tsctfc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TSCTFC);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Mutex required if in TBI mode
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy if (Adapter->Shared.tbi_compatibility_on == 1) {
080575042aba2197b425ebfd52061dea061a9aa1xy mutex_exit(&Adapter->TbiCntrMutex);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xyint
080575042aba2197b425ebfd52061dea061a9aa1xye1000g_m_stat(void *arg, uint_t stat, uint64_t *val)
080575042aba2197b425ebfd52061dea061a9aa1xy{
080575042aba2197b425ebfd52061dea061a9aa1xy struct e1000g *Adapter = (struct e1000g *)arg;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000gstat *e1000g_ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy uint32_t low_val, high_val;
080575042aba2197b425ebfd52061dea061a9aa1xy uint16_t phy_reg, phy_reg_2;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp = (e1000gstat *)Adapter->e1000g_ksp->ks_data;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy switch (stat) {
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_IFSPEED:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = Adapter->link_speed * 1000000ull;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_MULTIRCV:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Mprc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, MPRC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Mprc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_BRDCSTRCV:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Bprc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, BPRC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Bprc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_MULTIXMT:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Mptc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, MPTC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Mptc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_BRDCSTXMT:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Bptc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, BPTC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Bptc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_NORCVBUF:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rnbc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RNBC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Rnbc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_IERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rxerrc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RXERRC);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Algnerrc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ALGNERRC);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rlec.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RLEC);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Crcerrs.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, CRCERRS);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Cexterr.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, CEXTERR);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Rxerrc.value.ul +
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Algnerrc.value.ul +
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rlec.value.ul +
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Crcerrs.value.ul +
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Cexterr.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_NOXMTBUF:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = Adapter->tx_no_desc;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_OERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ecol.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ECOL);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Ecol.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_COLLISIONS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Colc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, COLC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Colc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_RBYTES:
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * The 64-bit register will reset whenever the upper
080575042aba2197b425ebfd52061dea061a9aa1xy * 32 bits are read. So we need to read the lower
080575042aba2197b425ebfd52061dea061a9aa1xy * 32 bits first, then read the upper 32 bits.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy low_val = E1000_READ_REG(&Adapter->Shared, TORL);
080575042aba2197b425ebfd52061dea061a9aa1xy high_val = E1000_READ_REG(&Adapter->Shared, TORH);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
080575042aba2197b425ebfd52061dea061a9aa1xy (uint64_t)e1000g_ksp->Torl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy *val += (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Torl.value.ul = (uint32_t)*val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Torh.value.ul = (uint32_t)(*val >> 32);
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_IPACKETS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tpr.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TPR);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Tpr.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_OBYTES:
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * The 64-bit register will reset whenever the upper
080575042aba2197b425ebfd52061dea061a9aa1xy * 32 bits are read. So we need to read the lower
080575042aba2197b425ebfd52061dea061a9aa1xy * 32 bits first, then read the upper 32 bits.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy low_val = E1000_READ_REG(&Adapter->Shared, TOTL);
080575042aba2197b425ebfd52061dea061a9aa1xy high_val = E1000_READ_REG(&Adapter->Shared, TOTH);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 |
080575042aba2197b425ebfd52061dea061a9aa1xy (uint64_t)e1000g_ksp->Totl.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy *val += (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Totl.value.ul = (uint32_t)*val;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Toth.value.ul = (uint32_t)(*val >> 32);
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_OPACKETS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Tpt.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, TPT);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Tpt.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ALIGN_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Algnerrc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ALGNERRC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Algnerrc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_FCS_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Crcerrs.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, CRCERRS);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Crcerrs.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_SQE_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Sec.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, SEC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Sec.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CARRIER_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Cexterr.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, CEXTERR);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Cexterr.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_EX_COLLISIONS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ecol.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ECOL);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Ecol.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_TX_LATE_COLLISIONS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Latecol.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, LATECOL);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Latecol.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_DEFER_XMTS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Dc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, DC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Dc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_FIRST_COLLISIONS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Scc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, SCC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Scc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_MULTI_COLLISIONS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Mcc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, MCC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Mcc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_MACRCV_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rxerrc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, RXERRC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Rxerrc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_MACXMT_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Ecol.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ECOL);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Ecol.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_TOOLONG_ERRORS:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Roc.value.ul +=
080575042aba2197b425ebfd52061dea061a9aa1xy E1000_READ_REG(&Adapter->Shared, ROC);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = e1000g_ksp->Roc.value.ul;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_XCVR_ADDR:
080575042aba2197b425ebfd52061dea061a9aa1xy /* The Internal PHY's MDI address for each MAC is 1 */
080575042aba2197b425ebfd52061dea061a9aa1xy *val = 1;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_XCVR_ID:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_ID1, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_ID2, &phy_reg_2);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (uint32_t)((phy_reg << 16) | phy_reg_2);
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_XCVR_INUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy switch (Adapter->link_speed) {
080575042aba2197b425ebfd52061dea061a9aa1xy case SPEED_1000:
080575042aba2197b425ebfd52061dea061a9aa1xy *val =
080575042aba2197b425ebfd52061dea061a9aa1xy (Adapter->Shared.media_type ==
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_media_type_copper) ? XCVR_1000T :
080575042aba2197b425ebfd52061dea061a9aa1xy XCVR_1000X;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy case SPEED_100:
080575042aba2197b425ebfd52061dea061a9aa1xy *val =
080575042aba2197b425ebfd52061dea061a9aa1xy (Adapter->Shared.media_type ==
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_media_type_copper) ? (phy_reg &
080575042aba2197b425ebfd52061dea061a9aa1xy MII_SR_100T4_CAPS) ? XCVR_100T4 : XCVR_100T2 :
080575042aba2197b425ebfd52061dea061a9aa1xy XCVR_100X;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy case SPEED_10:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = XCVR_10;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy default:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = XCVR_NONE;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_1000FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_EXT_STATUS,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = ((phy_reg & IEEE_ESR_1000T_FD_CAPS) ||
080575042aba2197b425ebfd52061dea061a9aa1xy (phy_reg & IEEE_ESR_1000X_FD_CAPS)) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_1000HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_EXT_STATUS,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = ((phy_reg & IEEE_ESR_1000T_HD_CAPS) ||
080575042aba2197b425ebfd52061dea061a9aa1xy (phy_reg & IEEE_ESR_1000X_HD_CAPS)) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_100FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = ((phy_reg & MII_SR_100X_FD_CAPS) ||
080575042aba2197b425ebfd52061dea061a9aa1xy (phy_reg & MII_SR_100T2_FD_CAPS)) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_100HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = ((phy_reg & MII_SR_100X_HD_CAPS) ||
080575042aba2197b425ebfd52061dea061a9aa1xy (phy_reg & MII_SR_100T2_HD_CAPS)) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_10FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & MII_SR_10T_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_10HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & MII_SR_10T_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_ASMPAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_PAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_AUTONEG:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & MII_SR_AUTONEG_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_1000FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_CTRL,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & CR_1000T_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_1000HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_CTRL,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & CR_1000T_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_100FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_100TX_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_100HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_100TX_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_10FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_10T_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_10HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_10T_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_ASMPAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_PAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_AUTONEG:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = Adapter->Shared.autoneg;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_1000FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_STATUS,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & SR_1000T_LP_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_1000HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_STATUS,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & SR_1000T_LP_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_100FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_LPAR_100TX_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_100HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_LPAR_100TX_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_10FDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_LPAR_10T_FD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_10HDX:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_LPAR_10T_HD_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_ASMPAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_LPAR_ASM_DIR) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_PAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_LPAR_PAUSE) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_AUTONEG:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_EXP,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_ER_LP_NWAY_CAPS) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_ASMPAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_PAUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
080575042aba2197b425ebfd52061dea061a9aa1xy &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_AUTONEG:
080575042aba2197b425ebfd52061dea061a9aa1xy e1000_read_phy_reg(&Adapter->Shared, PHY_CTRL, &phy_reg);
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (phy_reg & MII_CR_AUTO_NEG_EN) ? 1 : 0;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_DUPLEX:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = (Adapter->link_duplex == FULL_DUPLEX) ?
080575042aba2197b425ebfd52061dea061a9aa1xy LINK_DUPLEX_FULL : LINK_DUPLEX_HALF;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy default:
080575042aba2197b425ebfd52061dea061a9aa1xy return (ENOTSUP);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy * Name: InitStatsCounters *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Description: This routine will create and initialize the kernel *
080575042aba2197b425ebfd52061dea061a9aa1xy * statistics counters. *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Author: Phil Cayton *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Born on Date: 7/13/98 *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Arguments: *
080575042aba2197b425ebfd52061dea061a9aa1xy * Adapter - A pointer to our context sensitive "Adapter" *
080575042aba2197b425ebfd52061dea061a9aa1xy * structure. *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Returns: *
080575042aba2197b425ebfd52061dea061a9aa1xy * '0' if unable to create kernel statistics structure. *
080575042aba2197b425ebfd52061dea061a9aa1xy * '1' if creation and initialization successful *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * File: e1000g_stat.c *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Modification log: *
080575042aba2197b425ebfd52061dea061a9aa1xy * Date Who Description *
080575042aba2197b425ebfd52061dea061a9aa1xy * -------- --- ------------------------------------------------------*
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xyint
080575042aba2197b425ebfd52061dea061a9aa1xyInitStatsCounters(IN struct e1000g *Adapter)
080575042aba2197b425ebfd52061dea061a9aa1xy{
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_t *ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000gstat *e1000g_ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Create and init kstat
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy ksp = kstat_create(WSNAME, ddi_get_instance(Adapter->dip),
080575042aba2197b425ebfd52061dea061a9aa1xy "statistics", "net", KSTAT_TYPE_NAMED,
080575042aba2197b425ebfd52061dea061a9aa1xy sizeof (e1000gstat) / sizeof (kstat_named_t), 0);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy if (ksp == NULL) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_log(Adapter, CE_WARN,
080575042aba2197b425ebfd52061dea061a9aa1xy "Could not create kernel statistics\n");
080575042aba2197b425ebfd52061dea061a9aa1xy return (DDI_FAILURE);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy Adapter->e1000g_ksp = ksp; /* Fill in the Adapters ksp */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp = (e1000gstat *) ksp->ks_data;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Initialize all the statistics
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->link_up, "link_up",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->link_speed, "link_speed",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_none, "Rx No Data",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_error, "Rx Error",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_no_freepkt, "Rx Freelist Empty",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_avail_freepkt, "Rx Freelist Avail",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_esballoc_fail, "Rx Desballoc Failure",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_exceed_pkt, "Rx Exceed Max Pkt Count",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_multi_desc, "Rx Span Multi Desc",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_allocb_fail, "Rx Allocb Failure",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_seq_intr, "Rx Seq Err Intr",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_no_desc, "Tx No Desc",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_no_swpkt, "Tx No Buffer",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_lack_desc, "Tx Desc Insufficient",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_send_fail,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Send Failure", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_multi_cookie,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Bind Multi Cookies", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_over_size, "Tx Pkt Over Size",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_under_size, "Tx Pkt Under Size",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_copy, "Tx Send Copy",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_bind, "Tx Send Bind",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_multi_copy, "Tx Copy Multi Frags",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_reschedule, "Tx Reschedule",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_empty_frags, "Tx Empty Frags",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_exceed_frags, "Tx Exceed Max Frags",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_recycle,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Desc Recycle", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_recycle_retry,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Desc Recycle Retry", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_recycle_intr,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Desc Recycle Intr", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_recycle_none,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Desc Recycled None", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->StallWatchdog,
080575042aba2197b425ebfd52061dea061a9aa1xy "Tx Stall Watchdog", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->reset_count,
080575042aba2197b425ebfd52061dea061a9aa1xy "Reset Count", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->intr_type,
080575042aba2197b425ebfd52061dea061a9aa1xy "Interrupt Type", KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Mpc, "Recv_Missed_Packets",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Symerrs, "Recv_Symbol_Errors",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Rlec, "Recv_Length_Errors",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xonrxc, "XONs_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xontxc, "XONs_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xoffrxc, "XOFFs_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xofftxc, "XOFFs_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Fcruc, "Recv_Unsupport_FC_Pkts",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc64, "Pkts_Recvd_( 64b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc127, "Pkts_Recvd_( 65- 127b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc255, "Pkts_Recvd_( 127- 255b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc511, "Pkts_Recvd_( 256- 511b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc1023, "Pkts_Recvd_( 511-1023b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc1522, "Pkts_Recvd_(1024-1522b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gprc, "Good_Pkts_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gptc, "Good_Pkts_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gorl, "Good_Octets_Recvd_Lo",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gorh, "Good_Octets_Recvd_Hi",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gotl, "Good_Octets_Xmitd_Lo",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Goth, "Good_Octets_Xmitd_Hi",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ruc, "Recv_Undersize",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Rfc, "Recv_Frag",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Roc, "Recv_Oversize",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Rjc, "Recv_Jabber",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Torl, "Total_Octets_Recvd_Lo",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Torh, "Total_Octets_Recvd_Hi",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Totl, "Total_Octets_Xmitd_Lo",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Toth, "Total_Octets_Xmitd_Hi",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tpr, "Total_Packets_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tpt, "Total_Packets_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc64, "Pkts_Xmitd_( 64b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc127, "Pkts_Xmitd_( 65- 127b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc255, "Pkts_Xmitd_( 128- 255b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc511, "Pkts_Xmitd_( 255- 511b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc1023, "Pkts_Xmitd_( 512-1023b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc1522, "Pkts_Xmitd_(1024-1522b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Livengood Initializations
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tncrs, "Xmit_with_No_CRS",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tsctc, "Xmit_TCP_Seg_Contexts",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tsctfc, "Xmit_TCP_Seg_Contexts_Fail",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Jumbo Frame Counters
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->JumboTx_4K, "Jumbo Tx Frame 4K",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->JumboRx_4K, "Jumbo Rx Frame 4K",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->JumboTx_8K, "Jumbo Tx Frame 8K",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->JumboRx_8K, "Jumbo Rx Frame 8K",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->JumboTx_16K, "Jumbo Tx Frame 16K",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->JumboRx_16K, "Jumbo Rx Frame 16K",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Function to provide kernel stat update on demand
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy ksp->ks_update = UpdateStatsCounters;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Pointer into provider's raw statistics
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy ksp->ks_private = (void *)Adapter;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Add kstat to systems kstat chain
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_install(ksp);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy return (DDI_SUCCESS);
080575042aba2197b425ebfd52061dea061a9aa1xy}