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 *
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China * Copyright(c) 1999 - 2009 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/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner * Copyright 2012 David Höppner. All rights reserved.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Use is subject to license terms.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * Module Name: e1000g_stat.c *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Abstract: Functions for processing statistics *
080575042aba2197b425ebfd52061dea061a9aa1xy * *
080575042aba2197b425ebfd52061dea061a9aa1xy * **********************************************************************
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy#include "e1000g_sw.h"
080575042aba2197b425ebfd52061dea061a9aa1xy#include "e1000g_debug.h"
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xystatic int e1000g_update_stats(kstat_t *ksp, int rw);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystemsstatic uint32_t e1000g_read_phy_stat(struct e1000_hw *hw, int reg);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * e1000_tbi_adjust_stats
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Adjusts statistic counters when a frame is accepted
25f2d433de915875c8393f0b0dc14aa155997ad0xy * under the TBI workaround. This function has been
25f2d433de915875c8393f0b0dc14aa155997ad0xy * adapted for Solaris from shared code.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xyvoid
25f2d433de915875c8393f0b0dc14aa155997ad0xye1000_tbi_adjust_stats(struct e1000g *Adapter,
25f2d433de915875c8393f0b0dc14aa155997ad0xy uint32_t frame_len, uint8_t *mac_addr)
080575042aba2197b425ebfd52061dea061a9aa1xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy uint32_t carry_bit;
25f2d433de915875c8393f0b0dc14aa155997ad0xy p_e1000g_stat_t e1000g_ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp = (p_e1000g_stat_t)Adapter->e1000g_ksp->ks_data;
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* First adjust the frame length */
25f2d433de915875c8393f0b0dc14aa155997ad0xy frame_len--;
080575042aba2197b425ebfd52061dea061a9aa1xy
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 */
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* This packet should not be counted as a CRC error */
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->fcs_errors--;
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* This packet does count as a Good Packet Received */
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Gprc.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Adjust the Good Octets received counters
080575042aba2197b425ebfd52061dea061a9aa1xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xy carry_bit = 0x80000000 & e1000g_ksp->Gorl.value.ul;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Gorl.value.ul += frame_len;
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 */
25f2d433de915875c8393f0b0dc14aa155997ad0xy if (carry_bit && ((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 */
25f2d433de915875c8393f0b0dc14aa155997ad0xy if ((mac_addr[0] == (uint8_t)0xff) &&
25f2d433de915875c8393f0b0dc14aa155997ad0xy (mac_addr[1] == (uint8_t)0xff)) {
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Broadcast packet
080575042aba2197b425ebfd52061dea061a9aa1xy */
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->brdcstrcv++;
25f2d433de915875c8393f0b0dc14aa155997ad0xy } else if (*mac_addr & 0x01) {
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Multicast packet
080575042aba2197b425ebfd52061dea061a9aa1xy */
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->multircv++;
080575042aba2197b425ebfd52061dea061a9aa1xy }
25f2d433de915875c8393f0b0dc14aa155997ad0xy
592a4d85662412bade15f3d9e9e0cbcf8514348ccc if (frame_len == Adapter->max_frame_size) {
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * In this case, the hardware has overcounted the number of
080575042aba2197b425ebfd52061dea061a9aa1xy * oversize frames.
080575042aba2197b425ebfd52061dea061a9aa1xy */
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner if (Adapter->toolong_errors > 0)
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->toolong_errors--;
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#ifdef E1000G_DEBUG
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Adjust the bin counters when the extra byte put the frame in the
25f2d433de915875c8393f0b0dc14aa155997ad0xy * wrong bin. Remember that the frame_len was adjusted above.
080575042aba2197b425ebfd52061dea061a9aa1xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xy if (frame_len == 64) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc64.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc127.value.ul--;
25f2d433de915875c8393f0b0dc14aa155997ad0xy } else if (frame_len == 127) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc127.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc255.value.ul--;
25f2d433de915875c8393f0b0dc14aa155997ad0xy } else if (frame_len == 255) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc255.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc511.value.ul--;
25f2d433de915875c8393f0b0dc14aa155997ad0xy } else if (frame_len == 511) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc511.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1023.value.ul--;
25f2d433de915875c8393f0b0dc14aa155997ad0xy } else if (frame_len == 1023) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1023.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1522.value.ul--;
25f2d433de915875c8393f0b0dc14aa155997ad0xy } else if (frame_len == 1522) {
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Prc1522.value.ul++;
080575042aba2197b425ebfd52061dea061a9aa1xy }
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#endif
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * e1000g_update_stats - update driver private kstat counters
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * This routine will dump and reset the e1000's internal
25f2d433de915875c8393f0b0dc14aa155997ad0xy * statistics counters. The current stats dump values will
25f2d433de915875c8393f0b0dc14aa155997ad0xy * be sent to the kernel status area.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xystatic int
25f2d433de915875c8393f0b0dc14aa155997ad0xye1000g_update_stats(kstat_t *ksp, int rw)
080575042aba2197b425ebfd52061dea061a9aa1xy{
080575042aba2197b425ebfd52061dea061a9aa1xy struct e1000g *Adapter;
25f2d433de915875c8393f0b0dc14aa155997ad0xy struct e1000_hw *hw;
25f2d433de915875c8393f0b0dc14aa155997ad0xy p_e1000g_stat_t e1000g_ksp;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_tx_ring_t *tx_ring;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_rx_ring_t *rx_ring;
57ef6f696a98dddd9434e80a654341edd5316bf1guoqing zhu - Sun Microsystems - Beijing China#ifdef E1000G_DEBUG
54e0d7a5e8285a3f01a0db8db1246ac7cac94d81Miles Xu, Sun Microsystems e1000g_rx_data_t *rx_data;
57ef6f696a98dddd9434e80a654341edd5316bf1guoqing zhu - Sun Microsystems - Beijing China#endif
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);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp = (p_e1000g_stat_t)ksp->ks_data;
080575042aba2197b425ebfd52061dea061a9aa1xy ASSERT(e1000g_ksp != NULL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy hw = &Adapter->shared;
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy tx_ring = Adapter->tx_ring;
25f2d433de915875c8393f0b0dc14aa155997ad0xy rx_ring = Adapter->rx_ring;
57ef6f696a98dddd9434e80a654341edd5316bf1guoqing zhu - Sun Microsystems - Beijing China#ifdef E1000G_DEBUG
54e0d7a5e8285a3f01a0db8db1246ac7cac94d81Miles Xu, Sun Microsystems rx_data = rx_ring->rx_data;
57ef6f696a98dddd9434e80a654341edd5316bf1guoqing zhu - Sun Microsystems - Beijing China#endif
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy rw_enter(&Adapter->chip_lock, RW_WRITER);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->reset_count.value.ul = Adapter->reset_count;
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->rx_error.value.ul = rx_ring->stat_error;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->rx_allocb_fail.value.ul = rx_ring->stat_allocb_fail;
46ebaa55cce1df60528a191312d12199d38a4493Miles Xu, Sun Microsystems e1000g_ksp->rx_size_error.value.ul = rx_ring->stat_size_error;
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_no_swpkt.value.ul = tx_ring->stat_no_swpkt;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_no_desc.value.ul = tx_ring->stat_no_desc;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_send_fail.value.ul = tx_ring->stat_send_fail;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_reschedule.value.ul = tx_ring->stat_reschedule;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_over_size.value.ul = tx_ring->stat_over_size;
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy#ifdef E1000G_DEBUG
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->rx_none.value.ul = rx_ring->stat_none;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->rx_multi_desc.value.ul = rx_ring->stat_multi_desc;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->rx_no_freepkt.value.ul = rx_ring->stat_no_freepkt;
54e0d7a5e8285a3f01a0db8db1246ac7cac94d81Miles Xu, Sun Microsystems if (rx_data != NULL)
54e0d7a5e8285a3f01a0db8db1246ac7cac94d81Miles Xu, Sun Microsystems e1000g_ksp->rx_avail_freepkt.value.ul = rx_data->avail_freepkt;
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_under_size.value.ul = tx_ring->stat_under_size;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_exceed_frags.value.ul = tx_ring->stat_exceed_frags;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_empty_frags.value.ul = tx_ring->stat_empty_frags;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_recycle.value.ul = tx_ring->stat_recycle;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_recycle_intr.value.ul = tx_ring->stat_recycle_intr;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_recycle_retry.value.ul = tx_ring->stat_recycle_retry;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_recycle_none.value.ul = tx_ring->stat_recycle_none;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_copy.value.ul = tx_ring->stat_copy;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_bind.value.ul = tx_ring->stat_bind;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_multi_copy.value.ul = tx_ring->stat_multi_copy;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_multi_cookie.value.ul = tx_ring->stat_multi_cookie;
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->tx_lack_desc.value.ul = tx_ring->stat_lack_desc;
25f2d433de915875c8393f0b0dc14aa155997ad0xy#endif
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Standard Stats
080575042aba2197b425ebfd52061dea061a9aa1xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Mpc.value.ul += E1000_READ_REG(hw, E1000_MPC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Rlec.value.ul += E1000_READ_REG(hw, E1000_RLEC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Xonrxc.value.ul += E1000_READ_REG(hw, E1000_XONRXC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Xontxc.value.ul += E1000_READ_REG(hw, E1000_XONTXC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Xoffrxc.value.ul += E1000_READ_REG(hw, E1000_XOFFRXC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Xofftxc.value.ul += E1000_READ_REG(hw, E1000_XOFFTXC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Fcruc.value.ul += E1000_READ_REG(hw, E1000_FCRUC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy if ((hw->mac.type != e1000_ich8lan) &&
4d7379630d53d9992780329b674af8c85935e858xiangtao you - Sun Microsystems - Beijing China (hw->mac.type != e1000_ich9lan) &&
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (hw->mac.type != e1000_ich10lan) &&
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (hw->mac.type != e1000_pchlan)) {
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Symerrs.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_SYMERRS);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#ifdef E1000G_DEBUG
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Prc64.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PRC64);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Prc127.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PRC127);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Prc255.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PRC255);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Prc511.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PRC511);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Prc1023.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PRC1023);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Prc1522.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PRC1522);
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Ptc64.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PTC64);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Ptc127.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PTC127);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Ptc255.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PTC255);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Ptc511.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PTC511);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Ptc1023.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PTC1023);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Ptc1522.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_PTC1522);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#endif
25f2d433de915875c8393f0b0dc14aa155997ad0xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Gprc.value.ul += E1000_READ_REG(hw, E1000_GPRC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Gptc.value.ul += E1000_READ_REG(hw, E1000_GPTC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Rfc.value.ul += E1000_READ_REG(hw, E1000_RFC);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_ksp->Tncrs.value.ul += e1000g_read_phy_stat(hw, E1000_TNCRS);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Tsctc.value.ul += E1000_READ_REG(hw, E1000_TSCTC);
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp->Tsctfc.value.ul += E1000_READ_REG(hw, E1000_TSCTFC);
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy /*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Adaptive Calculations
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xy hw->mac.tx_packet_delta = E1000_READ_REG(hw, E1000_TPT);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->opackets += hw->mac.tx_packet_delta;
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 */
25f2d433de915875c8393f0b0dc14aa155997ad0xy low_val = E1000_READ_REG(hw, E1000_GORCL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy high_val = E1000_READ_REG(hw, E1000_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
25f2d433de915875c8393f0b0dc14aa155997ad0xy low_val = E1000_READ_REG(hw, E1000_GOTCL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy high_val = E1000_READ_REG(hw, E1000_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
25f2d433de915875c8393f0b0dc14aa155997ad0xy low_val = E1000_READ_REG(hw, E1000_TORL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy high_val = E1000_READ_REG(hw, E1000_TORH);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->rbytes +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy low_val = E1000_READ_REG(hw, E1000_TOTL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy high_val = E1000_READ_REG(hw, E1000_TOTH);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->obytes +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner (uint64_t)high_val << 32 | (uint64_t)low_val;
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy rw_exit(&Adapter->chip_lock);
080575042aba2197b425ebfd52061dea061a9aa1xy
ec39b9cf9a38586835b89f8cc2150710071adce3changqing li - Sun Microsystems - Beijing China if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
9b6541b318d01d0d83bfb98699a7f09e35f37951gl ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_UNAFFECTED);
ec39b9cf9a38586835b89f8cc2150710071adce3changqing li - Sun Microsystems - Beijing China return (EIO);
ec39b9cf9a38586835b89f8cc2150710071adce3changqing li - Sun Microsystems - Beijing China }
9b6541b318d01d0d83bfb98699a7f09e35f37951gl
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;
25f2d433de915875c8393f0b0dc14aa155997ad0xy struct e1000_hw *hw = &Adapter->shared;
25f2d433de915875c8393f0b0dc14aa155997ad0xy p_e1000g_stat_t e1000g_ksp;
080575042aba2197b425ebfd52061dea061a9aa1xy uint32_t low_val, high_val;
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp = (p_e1000g_stat_t)Adapter->e1000g_ksp->ks_data;
25f2d433de915875c8393f0b0dc14aa155997ad0xy
4914a7d0d1ee59f8cc21b19bfd7979cb65681eacyy rw_enter(&Adapter->chip_lock, RW_READER);
080575042aba2197b425ebfd52061dea061a9aa1xy
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China if (Adapter->e1000g_state & E1000G_SUSPENDED) {
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China rw_exit(&Adapter->chip_lock);
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China return (ECANCELED);
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China }
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China
080575042aba2197b425ebfd52061dea061a9aa1xy switch (stat) {
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_IFSPEED:
080575042aba2197b425ebfd52061dea061a9aa1xy *val = Adapter->link_speed * 1000000ull;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_MULTIRCV:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->multircv +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_MPRC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->multircv;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_BRDCSTRCV:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->brdcstrcv +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_BPRC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->brdcstrcv;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_MULTIXMT:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->multixmt +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_MPTC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->multixmt;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_BRDCSTXMT:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->brdcstxmt +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_BPTC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->brdcstxmt;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_NORCVBUF:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->norcvbuf +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_RNBC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->norcvbuf;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_IERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->macrcv_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_RXERRC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->align_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_ALGNERRC);
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rlec.value.ul +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_RLEC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->fcs_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_CRCERRS);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->carrier_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_CEXTERR);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->macrcv_errors +
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->align_errors +
080575042aba2197b425ebfd52061dea061a9aa1xy e1000g_ksp->Rlec.value.ul +
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->fcs_errors +
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->carrier_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_NOXMTBUF:
25f2d433de915875c8393f0b0dc14aa155997ad0xy *val = Adapter->tx_ring->stat_no_desc;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_OERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->oerrors +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_ECOL);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->oerrors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_COLLISIONS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->collisions +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_COLC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->collisions;
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 */
25f2d433de915875c8393f0b0dc14aa155997ad0xy low_val = E1000_READ_REG(hw, E1000_TORL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy high_val = E1000_READ_REG(hw, E1000_TORH);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->rbytes +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner (uint64_t)high_val << 32 | (uint64_t)low_val;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->rbytes;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_IPACKETS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->ipackets +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_TPR);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->ipackets;
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 */
25f2d433de915875c8393f0b0dc14aa155997ad0xy low_val = E1000_READ_REG(hw, E1000_TOTL);
25f2d433de915875c8393f0b0dc14aa155997ad0xy high_val = E1000_READ_REG(hw, E1000_TOTH);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->obytes +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner (uint64_t)high_val << 32 | (uint64_t)low_val;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->obytes;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case MAC_STAT_OPACKETS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->opackets +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_TPT);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->opackets;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ALIGN_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->align_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_ALGNERRC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->align_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_FCS_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->fcs_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_CRCERRS);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->fcs_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_SQE_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->sqe_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_SEC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->sqe_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CARRIER_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->carrier_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_CEXTERR);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->carrier_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_EX_COLLISIONS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->ex_collisions +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_ECOL);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->ex_collisions;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_TX_LATE_COLLISIONS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->tx_late_collisions +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_LATECOL);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->tx_late_collisions;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_DEFER_XMTS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->defer_xmts +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_DC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->defer_xmts;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_FIRST_COLLISIONS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->first_collisions +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_SCC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->first_collisions;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_MULTI_COLLISIONS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->multi_collisions +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_MCC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->multi_collisions;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_MACRCV_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->macrcv_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_RXERRC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->macrcv_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_MACXMT_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->macxmt_errors +=
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems e1000g_read_phy_stat(hw, E1000_ECOL);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->macxmt_errors;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_TOOLONG_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->toolong_errors +=
25f2d433de915875c8393f0b0dc14aa155997ad0xy E1000_READ_REG(hw, E1000_ROC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->toolong_errors;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner break;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner case ETHER_STAT_TOOSHORT_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->tooshort_errors +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner E1000_READ_REG(hw, E1000_RUC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->tooshort_errors;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner break;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner case ETHER_STAT_JABBER_ERRORS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->jabber_errors +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner E1000_READ_REG(hw, E1000_RJC);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->jabber_errors;
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:
4914a7d0d1ee59f8cc21b19bfd7979cb65681eacyy *val = hw->phy.id | hw->phy.revision;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_XCVR_INUSE:
080575042aba2197b425ebfd52061dea061a9aa1xy switch (Adapter->link_speed) {
080575042aba2197b425ebfd52061dea061a9aa1xy case SPEED_1000:
080575042aba2197b425ebfd52061dea061a9aa1xy *val =
592a4d85662412bade15f3d9e9e0cbcf8514348ccc (hw->phy.media_type == e1000_media_type_copper) ?
25f2d433de915875c8393f0b0dc14aa155997ad0xy XCVR_1000T : XCVR_1000X;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy case SPEED_100:
080575042aba2197b425ebfd52061dea061a9aa1xy *val =
592a4d85662412bade15f3d9e9e0cbcf8514348ccc (hw->phy.media_type == e1000_media_type_copper) ?
4914a7d0d1ee59f8cc21b19bfd7979cb65681eacyy (Adapter->phy_status & MII_SR_100T4_CAPS) ?
25f2d433de915875c8393f0b0dc14aa155997ad0xy XCVR_100T4 : XCVR_100T2 : 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:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_1000fdx_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_1000HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_1000hdx_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_100FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_100fdx_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_100HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_100hdx_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_10FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_10fdx_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_10HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_10hdx_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_ASMPAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_asym_pause_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_PAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_pause_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_CAP_AUTONEG:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_autoneg_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_1000FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_1000fdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_1000HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_1000hdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_100FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_100fdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_100HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_100hdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_10FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_10fdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_10HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_10hdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_ASMPAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_asym_pause;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_PAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_pause;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_ADV_CAP_AUTONEG:
25f2d433de915875c8393f0b0dc14aa155997ad0xy *val = hw->mac.autoneg;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_1000FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_1000fdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_1000HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_1000hdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_100FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_100fdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_100HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_100hdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_10FDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_10fdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_10HDX:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_10hdx;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_ASMPAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_asym_pause;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_PAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_pause;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LP_CAP_AUTONEG:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_autoneg;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_ASMPAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_asym_pause_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_PAUSE:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_pause_cap;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy case ETHER_STAT_LINK_AUTONEG:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = hw->mac.autoneg;
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
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc case ETHER_STAT_CAP_100T4:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_100t4_cap;
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc break;
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc case ETHER_STAT_ADV_CAP_100T4:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_adv_100t4;
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc break;
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc case ETHER_STAT_LP_CAP_100T4:
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc *val = Adapter->param_lp_100t4;
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc break;
9ce7e93c0e8e6d2b400f40e9c5742b1d6682611ecc
080575042aba2197b425ebfd52061dea061a9aa1xy default:
25f2d433de915875c8393f0b0dc14aa155997ad0xy rw_exit(&Adapter->chip_lock);
080575042aba2197b425ebfd52061dea061a9aa1xy return (ENOTSUP);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy rw_exit(&Adapter->chip_lock);
25f2d433de915875c8393f0b0dc14aa155997ad0xy
ec39b9cf9a38586835b89f8cc2150710071adce3changqing li - Sun Microsystems - Beijing China if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
9b6541b318d01d0d83bfb98699a7f09e35f37951gl ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_UNAFFECTED);
ec39b9cf9a38586835b89f8cc2150710071adce3changqing li - Sun Microsystems - Beijing China return (EIO);
ec39b9cf9a38586835b89f8cc2150710071adce3changqing li - Sun Microsystems - Beijing China }
9b6541b318d01d0d83bfb98699a7f09e35f37951gl
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * e1000g_init_stats - initialize kstat data structures
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * This routine will create and initialize the driver private
25f2d433de915875c8393f0b0dc14aa155997ad0xy * statistics counters.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xyint
25f2d433de915875c8393f0b0dc14aa155997ad0xye1000g_init_stats(struct e1000g *Adapter)
080575042aba2197b425ebfd52061dea061a9aa1xy{
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_t *ksp;
25f2d433de915875c8393f0b0dc14aa155997ad0xy p_e1000g_stat_t 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,
25f2d433de915875c8393f0b0dc14aa155997ad0xy sizeof (e1000g_stat_t) / 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
25f2d433de915875c8393f0b0dc14aa155997ad0xy e1000g_ksp = (p_e1000g_stat_t)ksp->ks_data;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Initialize all the statistics
080575042aba2197b425ebfd52061dea061a9aa1xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->reset_count, "Reset Count",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_error, "Rx Error",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->rx_allocb_fail, "Rx Allocb Failure",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
46ebaa55cce1df60528a191312d12199d38a4493Miles Xu, Sun Microsystems kstat_named_init(&e1000g_ksp->rx_size_error, "Rx Size Error",
46ebaa55cce1df60528a191312d12199d38a4493Miles Xu, Sun Microsystems KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_no_desc, "Tx No Desc",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_no_swpkt, "Tx No Buffer",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_send_fail, "Tx Send Failure",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_over_size, "Tx Pkt Over Size",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->tx_reschedule, "Tx Reschedule",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Mpc, "Recv_Missed_Packets",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Symerrs, "Recv_Symbol_Errors",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Rlec, "Recv_Length_Errors",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xonrxc, "XONs_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xontxc, "XONs_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xoffrxc, "XOFFs_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Xofftxc, "XOFFs_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Fcruc, "Recv_Unsupport_FC_Pkts",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#ifdef E1000G_DEBUG
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc64, "Pkts_Recvd_( 64b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc127, "Pkts_Recvd_( 65- 127b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc255, "Pkts_Recvd_( 127- 255b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc511, "Pkts_Recvd_( 256- 511b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc1023, "Pkts_Recvd_( 511-1023b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Prc1522, "Pkts_Recvd_(1024-1522b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#endif
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gprc, "Good_Pkts_Recvd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gptc, "Good_Pkts_Xmitd",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gorl, "Good_Octets_Recvd_Lo",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gorh, "Good_Octets_Recvd_Hi",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Gotl, "Good_Octets_Xmitd_Lo",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Goth, "Good_Octets_Xmitd_Hi",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Rfc, "Recv_Frag",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#ifdef E1000G_DEBUG
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc64, "Pkts_Xmitd_( 64b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc127, "Pkts_Xmitd_( 65- 127b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc255, "Pkts_Xmitd_( 128- 255b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc511, "Pkts_Xmitd_( 255- 511b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc1023, "Pkts_Xmitd_( 512-1023b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Ptc1522, "Pkts_Xmitd_(1024-1522b)",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy#endif
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tncrs, "Xmit_with_No_CRS",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tsctc, "Xmit_TCP_Seg_Contexts",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy kstat_named_init(&e1000g_ksp->Tsctfc, "Xmit_TCP_Seg_Contexts_Fail",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy#ifdef E1000G_DEBUG
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->rx_none, "Rx No Data",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->rx_multi_desc, "Rx Span Multi Desc",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->rx_no_freepkt, "Rx Freelist Empty",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->rx_avail_freepkt, "Rx Freelist Avail",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_under_size, "Tx Pkt Under Size",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_exceed_frags, "Tx Exceed Max Frags",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_empty_frags, "Tx Empty Frags",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_recycle, "Tx Recycle",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_recycle_intr, "Tx Recycle Intr",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_recycle_retry, "Tx Recycle Retry",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_recycle_none, "Tx Recycled None",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_copy, "Tx Send Copy",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_bind, "Tx Send Bind",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_multi_copy, "Tx Copy Multi Frags",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_multi_cookie, "Tx Bind Multi Cookies",
25f2d433de915875c8393f0b0dc14aa155997ad0xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy kstat_named_init(&e1000g_ksp->tx_lack_desc, "Tx Desc Insufficient",
080575042aba2197b425ebfd52061dea061a9aa1xy KSTAT_DATA_ULONG);
25f2d433de915875c8393f0b0dc14aa155997ad0xy#endif
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /*
080575042aba2197b425ebfd52061dea061a9aa1xy * Function to provide kernel stat update on demand
080575042aba2197b425ebfd52061dea061a9aa1xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xy ksp->ks_update = e1000g_update_stats;
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}
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems/*
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems * e1000g_read_phy_stat - read certain PHY statistics
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems *
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems * Certain statistics are read from MAC registers on some silicon types
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems * but are read from the PHY on other silicon types. This routine
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems * handles that difference as needed.
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems */
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystemsstatic uint32_t
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystemse1000g_read_phy_stat(struct e1000_hw *hw, int reg)
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems{
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems uint16_t phy_low, phy_high;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems uint32_t val;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems /* get statistic from PHY in these cases */
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems if ((hw->phy.type == e1000_phy_82578) ||
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (hw->phy.type == e1000_phy_82577)) {
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems switch (reg) {
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_SCC:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_SCC_UPPER, &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_SCC_LOWER, &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_MCC:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_MCC_UPPER, &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_MCC_LOWER, &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_ECOL:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_ECOL_UPPER, &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_ECOL_LOWER, &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_COLC:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_COLC_UPPER, &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_COLC_LOWER, &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_LATECOL:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_LATECOL_UPPER,
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_LATECOL_LOWER,
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_DC:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_DC_UPPER, &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_DC_LOWER, &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems case E1000_TNCRS:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_TNCRS_UPPER,
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems &phy_high);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems (void) e1000_read_phy_reg(hw, HV_TNCRS_LOWER,
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems &phy_low);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems default:
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems break;
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems }
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems /* get statistic from MAC otherwise */
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems } else {
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems val = E1000_READ_REG(hw, reg);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems }
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems return (val);
caf05df5c10c960028f122b1b02a3f7d8f892c31Miles Xu, Sun Microsystems}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Retrieve a value for one of the statistics for a particular rx ring
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerint
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyere1000g_rx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer e1000g_rx_ring_t *rx_ring = (e1000g_rx_ring_t *)rh;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct e1000g *Adapter = rx_ring->adapter;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct e1000_hw *hw = &Adapter->shared;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint32_t low_val, high_val;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer rw_enter(&Adapter->chip_lock, RW_READER);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (Adapter->e1000g_state & E1000G_SUSPENDED) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer rw_exit(&Adapter->chip_lock);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (ECANCELED);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (stat) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_STAT_RBYTES:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * The 64-bit register will reset whenever the upper
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * 32 bits are read. So we need to read the lower
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * 32 bits first, then read the upper 32 bits.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer low_val = E1000_READ_REG(hw, E1000_TORL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer high_val = E1000_READ_REG(hw, E1000_TORH);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->rbytes +=
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner (uint64_t)high_val << 32 | (uint64_t)low_val;
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->rbytes;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_STAT_IPACKETS:
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner Adapter->ipackets +=
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer E1000_READ_REG(hw, E1000_TPR);
29fd2c1627adafbe0a83726c224e60b5514c7736David Höppner *val = Adapter->ipackets;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *val = 0;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer rw_exit(&Adapter->chip_lock);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (ENOTSUP);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer rw_exit(&Adapter->chip_lock);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_UNAFFECTED);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}