oce_stat.c revision 4d0e50075058332ce0cd62bc2669a8a4dea45da0
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Copyright 2009 Emulex. All rights reserved.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Use is subject to license terms.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Source file containing the implementation of the driver statistics
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and related helper functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_impl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_stat.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_buf.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function called by kstat to update the stats counters
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * ksp - pointer to the kstats structure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * rw - flags defining read/write
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return DDI_SUCCESS => success, failure otherwise
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_update_stats(kstat_t *ksp, int rw)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_dev *dev;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_stat *stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct rx_port_stats *port_stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t new;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan boolean_t is_update_stats = B_FALSE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (rw == KSTAT_WRITE) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EACCES);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev = ksp->ks_private;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats = (struct oce_stat *)ksp->ks_data;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats = &dev->hw_stats->params.rsp.rx.port[dev->port_id];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->suspended) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * allow stats update only if enough
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * time has elapsed since last update
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan new = ddi_get_lbolt();
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if ((new - dev->stat_ticks) >= drv_usectohz(STAT_TIMEOUT)) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->stat_ticks = new;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan is_update_stats = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fetch the latest stats from the adapter */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (is_update_stats) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->in_stats) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan atomic_add_32(&dev->in_stats, 1);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_get_hw_stats(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan atomic_add_32(&dev->in_stats, -1);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to get stats:%d", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* update the stats */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_bytes_lo.value.ul = port_stats->rx_bytes_lsd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_bytes_hi.value.ul = port_stats->rx_bytes_msd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_frames.value.ul = port_stats->rx_total_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_errors.value.ul = port_stats->rx_crc_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_alignment_symbol_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_in_range_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_out_range_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_frame_too_long +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_ip_checksum_errs +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_tcp_checksum_errs +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_udp_checksum_errs;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_drops.value.ul = port_stats->rx_dropped_too_small +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_dropped_too_short +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_dropped_header_too_small +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_dropped_tcp_length +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_dropped_runt;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_bytes_lo.value.ul = port_stats->tx_bytes_lsd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_bytes_hi.value.ul = port_stats->tx_bytes_msd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_frames.value.ul = port_stats->tx_unicast_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_multicast_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_broadcast_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_pause_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_control_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_errors.value.ul = dev->tx_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_unicast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_unicast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_multicast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_multicast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_broadcast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_broadcast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_crc_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_crc_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_alignment_symbol_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_alignment_symbol_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_in_range_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_in_range_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_out_range_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_out_range_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_frame_too_long.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_frame_too_long;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_address_match_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_address_match_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_pause_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_pause_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_control_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_control_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_ip_checksum_errs.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_ip_checksum_errs;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_tcp_checksum_errs.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_tcp_checksum_errs;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_udp_checksum_errs.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_udp_checksum_errs;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_fifo_overflow.value.ul = port_stats->rx_fifo_overflow;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_input_fifo_overflow.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_input_fifo_overflow;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_unicast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_unicast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_multicast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_multicast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_broadcast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_broadcast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_pause_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_pause_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_control_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_control_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_update_stats */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to setup the kstat_t structure for the device and install it
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return DDI_SUCCESS => success, failure otherwise
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_stat_init(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_stat *stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t num_stats = sizeof (struct oce_stat) /
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (kstat_named_t);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the kstat */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->oce_kstats = kstat_create(OCE_MOD_NAME, dev->dev_id, "stats",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "net", KSTAT_TYPE_NAMED,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan num_stats, 0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->oce_kstats == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "kstat creation failed: 0x%p",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void *)dev->oce_kstats);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the device copy of the stats */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->stats_dbuf = oce_alloc_dma_buffer(dev,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan sizeof (struct mbx_get_nic_stats),
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_CONSISTENT);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->stats_dbuf == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Could not allocate stats_dbuf: %p",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void *)dev->stats_dbuf);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_delete(dev->oce_kstats);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->hw_stats = (struct mbx_get_nic_stats *)DBUF_VA(dev->stats_dbuf);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize the counters */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats = (struct oce_stat *)dev->oce_kstats->ks_data;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_bytes_hi, "rx bytes msd", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_bytes_lo, "rx bytes lsd", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_frames, "rx frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_errors, "rx errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_drops, "rx drops", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_bytes_hi, "tx bytes msd", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_bytes_lo, "tx bytes lsd", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_frames, "tx frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_errors, "tx errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_unicast_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx unicast frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_multicast_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx multicast frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_broadcast_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx broadcast frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_crc_errors,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx crc errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_alignment_symbol_errors,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx alignment symbol errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_in_range_errors,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx in range errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_out_range_errors,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx out range errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_frame_too_long,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx frame too long", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_address_match_errors,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx address match errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_pause_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx pause frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_control_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx control frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_ip_checksum_errs,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx ip checksum errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_tcp_checksum_errs,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx tcp checksum errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_udp_checksum_errs,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx udp checksum errors", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_fifo_overflow,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx fifo overflow", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->rx_input_fifo_overflow,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "rx input fifo overflow", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_unicast_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "tx unicast frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_multicast_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "tx multicast frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_broadcast_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "tx broadcast frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_pause_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "tx pause frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_named_init(&stats->tx_control_frames,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "tx control frames", KSTAT_DATA_ULONG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->oce_kstats->ks_update = oce_update_stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->oce_kstats->ks_private = (void *)dev;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_install(dev->oce_kstats);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_stat_init */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to undo initialization done in oce_stat_init
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return none
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_stat_fini(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_free_dma_buffer(dev, dev->stats_dbuf);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->hw_stats = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->stats_dbuf = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kstat_delete(dev->oce_kstats);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->oce_kstats = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_stat_fini */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * GLDv3 entry for statistic query
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_m_stat(void *arg, uint_t stat, uint64_t *val)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_dev *dev = arg;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_stat *stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct rx_port_stats *port_stats;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan boolean_t is_update_stats = B_FALSE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t new;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats = (struct oce_stat *)dev->oce_kstats->ks_data;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats = &dev->hw_stats->params.rsp.rx.port[dev->port_id];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->suspended ||
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (dev->state & STATE_MAC_STOPPING) ||
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan !(dev->state & STATE_MAC_STARTED)) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (EIO);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * allow stats update only if enough
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * time has elapsed since last update
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan new = ddi_get_lbolt();
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if ((new - dev->stat_ticks) >= drv_usectohz(STAT_TIMEOUT)) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->stat_ticks = new;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan is_update_stats = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* update hw stats. Required for netstat */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (is_update_stats) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->in_stats == 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan atomic_add_32(&dev->in_stats, 1);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) oce_get_hw_stats(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan atomic_add_32(&dev->in_stats, -1);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan switch (stat) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_IFSPEED:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->state & STATE_MAC_STARTED)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = 10000000000ull;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_RBYTES:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_bytes_lo.value.ul = port_stats->rx_bytes_lsd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_bytes_hi.value.ul = port_stats->rx_bytes_msd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = (uint64_t)stats->rx_bytes_hi.value.ul << 32 |
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (uint64_t)stats->rx_bytes_lo.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_IPACKETS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_frames.value.ul = port_stats->rx_total_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->rx_frames.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_OBYTES:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_bytes_lo.value.ul = port_stats->tx_bytes_lsd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_bytes_hi.value.ul = port_stats->tx_bytes_msd;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = (uint64_t)stats->tx_bytes_hi.value.ul << 32 |
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (uint64_t)stats->tx_bytes_lo.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_OPACKETS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_frames.value.ul = port_stats->tx_unicast_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_multicast_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_broadcast_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_pause_frames +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_control_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->tx_frames.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_BRDCSTRCV:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_broadcast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_broadcast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->rx_broadcast_frames.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_MULTIRCV:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_multicast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_multicast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->rx_multicast_frames.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_MULTIXMT:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_multicast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_multicast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->tx_multicast_frames.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_BRDCSTXMT:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->tx_broadcast_frames.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->tx_broadcast_frames;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->tx_broadcast_frames.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_NORCVBUF:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_fifo_overflow.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_fifo_overflow;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->rx_fifo_overflow.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_IERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_errors.value.ul = port_stats->rx_crc_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_alignment_symbol_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_in_range_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_out_range_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_frame_too_long +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_ip_checksum_errs +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_tcp_checksum_errs +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_udp_checksum_errs;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->rx_errors.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_NOXMTBUF:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = dev->tx_noxmtbuf;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case MAC_STAT_OERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->tx_errors.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_LINK_DUPLEX:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->state & STATE_MAC_STARTED)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = LINK_DUPLEX_FULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = LINK_DUPLEX_UNKNOWN;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_ALIGN_ERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_alignment_symbol_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_alignment_symbol_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = port_stats->rx_alignment_symbol_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_FCS_ERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_crc_errors.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_crc_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = port_stats->rx_crc_errors;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_MACRCV_ERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_errors.value.ul = port_stats->rx_crc_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_alignment_symbol_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_in_range_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_out_range_errors +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_frame_too_long +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_ip_checksum_errs +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_tcp_checksum_errs +
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_udp_checksum_errs;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->rx_errors.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_MACXMT_ERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = stats->tx_errors.value.ul;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_TOOLONG_ERRORS:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan stats->rx_frame_too_long.value.ul =
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan port_stats->rx_frame_too_long;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = port_stats->rx_frame_too_long;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_CAP_PAUSE:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case ETHER_STAT_LINK_PAUSE:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->flow_control & OCE_FC_TX &&
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->flow_control & OCE_FC_RX)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = LINK_FLOWCTRL_BI;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else if (dev->flow_control == OCE_FC_TX)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = LINK_FLOWCTRL_TX;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else if (dev->flow_control == OCE_FC_RX)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = LINK_FLOWCTRL_RX;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else if (dev->flow_control == 0)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *val = LINK_FLOWCTRL_NONE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan default:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ENOTSUP);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_m_stat */