162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2006-2008 PA Semi, Inc 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Ethtool hooks for the PA Semi PWRficient onchip 1G/10G Ethernet MACs 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/netdevice.h> 1062306a36Sopenharmony_ci#include <linux/ethtool.h> 1162306a36Sopenharmony_ci#include <linux/pci.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm/pasemi_dma.h> 1462306a36Sopenharmony_ci#include "pasemi_mac.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic struct { 1762306a36Sopenharmony_ci const char str[ETH_GSTRING_LEN]; 1862306a36Sopenharmony_ci} ethtool_stats_keys[] = { 1962306a36Sopenharmony_ci { "rx-drops" }, 2062306a36Sopenharmony_ci { "rx-bytes" }, 2162306a36Sopenharmony_ci { "rx-packets" }, 2262306a36Sopenharmony_ci { "rx-broadcast-packets" }, 2362306a36Sopenharmony_ci { "rx-multicast-packets" }, 2462306a36Sopenharmony_ci { "rx-crc-errors" }, 2562306a36Sopenharmony_ci { "rx-undersize-errors" }, 2662306a36Sopenharmony_ci { "rx-oversize-errors" }, 2762306a36Sopenharmony_ci { "rx-short-fragment-errors" }, 2862306a36Sopenharmony_ci { "rx-jabber-errors" }, 2962306a36Sopenharmony_ci { "rx-64-byte-packets" }, 3062306a36Sopenharmony_ci { "rx-65-127-byte-packets" }, 3162306a36Sopenharmony_ci { "rx-128-255-byte-packets" }, 3262306a36Sopenharmony_ci { "rx-256-511-byte-packets" }, 3362306a36Sopenharmony_ci { "rx-512-1023-byte-packets" }, 3462306a36Sopenharmony_ci { "rx-1024-1518-byte-packets" }, 3562306a36Sopenharmony_ci { "rx-pause-frames" }, 3662306a36Sopenharmony_ci { "tx-bytes" }, 3762306a36Sopenharmony_ci { "tx-packets" }, 3862306a36Sopenharmony_ci { "tx-broadcast-packets" }, 3962306a36Sopenharmony_ci { "tx-multicast-packets" }, 4062306a36Sopenharmony_ci { "tx-collisions" }, 4162306a36Sopenharmony_ci { "tx-late-collisions" }, 4262306a36Sopenharmony_ci { "tx-excessive-collisions" }, 4362306a36Sopenharmony_ci { "tx-crc-errors" }, 4462306a36Sopenharmony_ci { "tx-undersize-errors" }, 4562306a36Sopenharmony_ci { "tx-oversize-errors" }, 4662306a36Sopenharmony_ci { "tx-64-byte-packets" }, 4762306a36Sopenharmony_ci { "tx-65-127-byte-packets" }, 4862306a36Sopenharmony_ci { "tx-128-255-byte-packets" }, 4962306a36Sopenharmony_ci { "tx-256-511-byte-packets" }, 5062306a36Sopenharmony_ci { "tx-512-1023-byte-packets" }, 5162306a36Sopenharmony_ci { "tx-1024-1518-byte-packets" }, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic u32 5562306a36Sopenharmony_cipasemi_mac_ethtool_get_msglevel(struct net_device *netdev) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci struct pasemi_mac *mac = netdev_priv(netdev); 5862306a36Sopenharmony_ci return mac->msg_enable; 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic void 6262306a36Sopenharmony_cipasemi_mac_ethtool_set_msglevel(struct net_device *netdev, 6362306a36Sopenharmony_ci u32 level) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci struct pasemi_mac *mac = netdev_priv(netdev); 6662306a36Sopenharmony_ci mac->msg_enable = level; 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic void 7162306a36Sopenharmony_cipasemi_mac_ethtool_get_ringparam(struct net_device *netdev, 7262306a36Sopenharmony_ci struct ethtool_ringparam *ering, 7362306a36Sopenharmony_ci struct kernel_ethtool_ringparam *kernel_ering, 7462306a36Sopenharmony_ci struct netlink_ext_ack *extack) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci struct pasemi_mac *mac = netdev_priv(netdev); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci ering->tx_max_pending = TX_RING_SIZE/2; 7962306a36Sopenharmony_ci ering->tx_pending = RING_USED(mac->tx)/2; 8062306a36Sopenharmony_ci ering->rx_max_pending = RX_RING_SIZE/4; 8162306a36Sopenharmony_ci ering->rx_pending = RING_USED(mac->rx)/4; 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic int pasemi_mac_get_sset_count(struct net_device *netdev, int sset) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci switch (sset) { 8762306a36Sopenharmony_ci case ETH_SS_STATS: 8862306a36Sopenharmony_ci return ARRAY_SIZE(ethtool_stats_keys); 8962306a36Sopenharmony_ci default: 9062306a36Sopenharmony_ci return -EOPNOTSUPP; 9162306a36Sopenharmony_ci } 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic void pasemi_mac_get_ethtool_stats(struct net_device *netdev, 9562306a36Sopenharmony_ci struct ethtool_stats *stats, u64 *data) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci struct pasemi_mac *mac = netdev_priv(netdev); 9862306a36Sopenharmony_ci int i; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci data[0] = pasemi_read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if)) 10162306a36Sopenharmony_ci >> PAS_DMA_RXINT_RCMDSTA_DROPS_S; 10262306a36Sopenharmony_ci for (i = 0; i < 32; i++) 10362306a36Sopenharmony_ci data[1+i] = pasemi_read_mac_reg(mac->dma_if, PAS_MAC_RMON(i)); 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistatic void pasemi_mac_get_strings(struct net_device *netdev, u32 stringset, 10762306a36Sopenharmony_ci u8 *data) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys)); 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ciconst struct ethtool_ops pasemi_mac_ethtool_ops = { 11362306a36Sopenharmony_ci .get_msglevel = pasemi_mac_ethtool_get_msglevel, 11462306a36Sopenharmony_ci .set_msglevel = pasemi_mac_ethtool_set_msglevel, 11562306a36Sopenharmony_ci .get_link = ethtool_op_get_link, 11662306a36Sopenharmony_ci .get_ringparam = pasemi_mac_ethtool_get_ringparam, 11762306a36Sopenharmony_ci .get_strings = pasemi_mac_get_strings, 11862306a36Sopenharmony_ci .get_sset_count = pasemi_mac_get_sset_count, 11962306a36Sopenharmony_ci .get_ethtool_stats = pasemi_mac_get_ethtool_stats, 12062306a36Sopenharmony_ci .get_link_ksettings = phy_ethtool_get_link_ksettings, 12162306a36Sopenharmony_ci .set_link_ksettings = phy_ethtool_set_link_ksettings, 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 124