/** * cvm_oct_common_get_stats - get the low level ethernet statistics * @dev: Device to get the statistics from * * Returns Pointer to the statistics */ static struct net_device_stats *cvm_oct_common_get_stats(struct net_device *dev) { cvmx_pip_port_status_t rx_status; cvmx_pko_port_status_t tx_status; struct octeon_ethernet *priv = netdev_priv(dev); if (priv->port < CVMX_PIP_NUM_INPUT_PORTS) { if (octeon_is_simulation()) { /* The simulator doesn't support statistics */ memset(&rx_status, 0, sizeof(rx_status)); memset(&tx_status, 0, sizeof(tx_status)); } else { cvmx_pip_get_port_status(priv->port, 1, &rx_status); cvmx_pko_get_port_status(priv->port, 1, &tx_status); } priv->stats.rx_packets += rx_status.inb_packets; priv->stats.tx_packets += tx_status.packets; priv->stats.rx_bytes += rx_status.inb_octets; priv->stats.tx_bytes += tx_status.octets; priv->stats.multicast += rx_status.multicast_packets; priv->stats.rx_crc_errors += rx_status.inb_errors; priv->stats.rx_frame_errors += rx_status.fcs_align_err_packets; priv->stats.rx_dropped += rx_status.dropped_packets; } return &priv->stats; }
static struct ifnet_stats *cvm_oct_common_get_stats(struct ifnet *ifp) { cvmx_pip_port_status_t rx_status; cvmx_pko_port_status_t tx_status; cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; if (priv->port < CVMX_PIP_NUM_INPUT_PORTS) { if (octeon_is_simulation()) { /* The simulator doesn't support statistics */ memset(&rx_status, 0, sizeof(rx_status)); memset(&tx_status, 0, sizeof(tx_status)); } else { cvmx_pip_get_port_status(priv->port, 1, &rx_status); cvmx_pko_get_port_status(priv->port, 1, &tx_status); } priv->stats.rx_packets += rx_status.inb_packets; priv->stats.tx_packets += tx_status.packets; priv->stats.rx_bytes += rx_status.inb_octets; priv->stats.tx_bytes += tx_status.octets; priv->stats.multicast += rx_status.multicast_packets; priv->stats.rx_crc_errors += rx_status.inb_errors; priv->stats.rx_frame_errors += rx_status.fcs_align_err_packets; /* The drop counter must be incremented atomically since the RX tasklet also increments it */ #ifdef CONFIG_64BIT cvmx_atomic_add64_nosync(&priv->stats.rx_dropped, rx_status.dropped_packets); #else cvmx_atomic_add32_nosync((int32_t *)&priv->stats.rx_dropped, rx_status.dropped_packets); #endif } return &priv->stats; }
/** * cvm_oct_common_get_stats - get the low level ethernet statistics * @dev: Device to get the statistics from * * Returns Pointer to the statistics */ static struct net_device_stats *cvm_oct_common_get_stats(struct net_device *dev) { cvmx_pip_port_status_t rx_status; cvmx_pko_port_status_t tx_status; struct octeon_ethernet *priv = netdev_priv(dev); if (priv->port < CVMX_PIP_NUM_INPUT_PORTS) { if (octeon_is_simulation()) { /* The simulator doesn't support statistics */ memset(&rx_status, 0, sizeof(rx_status)); memset(&tx_status, 0, sizeof(tx_status)); } else { cvmx_pip_get_port_status(priv->port, 1, &rx_status); cvmx_pko_get_port_status(priv->port, 1, &tx_status); } priv->stats.rx_packets += rx_status.inb_packets; priv->stats.tx_packets += tx_status.packets; priv->stats.rx_bytes += rx_status.inb_octets; priv->stats.tx_bytes += tx_status.octets; priv->stats.multicast += rx_status.multicast_packets; priv->stats.rx_crc_errors += rx_status.inb_errors; priv->stats.rx_frame_errors += rx_status.fcs_align_err_packets; /* * The drop counter must be incremented atomically * since the RX tasklet also increments it. */ #ifdef CONFIG_64BIT atomic64_add(rx_status.dropped_packets, (atomic64_t *)&priv->stats.rx_dropped); #else atomic_add(rx_status.dropped_packets, (atomic_t *)&priv->stats.rx_dropped); #endif } return &priv->stats; }