spider_net_ethtool.c revision b9f2c0440d806e01968c3ed4def930a43be248ad
1aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp/* 2aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * Network device driver for Cell Processor-Based Blade 3aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * 4aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * (C) Copyright IBM Corp. 2005 5aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * 6aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * Authors : Utz Bacher <utz.bacher@de.ibm.com> 7aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * Jens Osterkamp <Jens.Osterkamp@de.ibm.com> 8aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * 9aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * This program is free software; you can redistribute it and/or modify 10aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * it under the terms of the GNU General Public License as published by 11aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * the Free Software Foundation; either version 2, or (at your option) 12aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * any later version. 13aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * 14aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * This program is distributed in the hope that it will be useful, 15aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * but WITHOUT ANY WARRANTY; without even the implied warranty of 16aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * GNU General Public License for more details. 18aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * 19aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * You should have received a copy of the GNU General Public License 20aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * along with this program; if not, write to the Free Software 21aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp */ 23aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 24aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp#include <linux/netdevice.h> 25aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp#include <linux/ethtool.h> 26aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp#include <linux/pci.h> 27aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 28aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp#include "spider_net.h" 29aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 309b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 319b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis#define SPIDER_NET_NUM_STATS 13 329b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 339b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewisstatic struct { 349b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis const char str[ETH_GSTRING_LEN]; 359b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} ethtool_stats_keys[] = { 369b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_packets" }, 379b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_bytes" }, 389b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_packets" }, 399b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_bytes" }, 409b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_errors" }, 419b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_dropped" }, 429b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_dropped" }, 439b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_descriptor_error" }, 449b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_timeouts" }, 459b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "alloc_rx_skb_error" }, 469b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_iommu_map_error" }, 479b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_iommu_map_error" }, 489b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_desc_unk_state" }, 499b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis}; 509b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 51054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkampstatic int 52054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkampspider_net_ethtool_get_settings(struct net_device *netdev, 53054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp struct ethtool_cmd *cmd) 54054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp{ 55054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp struct spider_net_card *card; 56054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp card = netdev_priv(netdev); 57054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp 58054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->supported = (SUPPORTED_1000baseT_Full | 59054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp SUPPORTED_FIBRE); 60054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->advertising = (ADVERTISED_1000baseT_Full | 61054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp ADVERTISED_FIBRE); 62054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->port = PORT_FIBRE; 63054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->speed = card->phy.speed; 64054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->duplex = DUPLEX_FULL; 65054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp 66054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp return 0; 67054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp} 68054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp 69aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic void 70aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_drvinfo(struct net_device *netdev, 71aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct ethtool_drvinfo *drvinfo) 72aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 73aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card; 74aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card = netdev_priv(netdev); 75aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 76aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp /* clear and fill out info */ 77aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp memset(drvinfo, 0, sizeof(struct ethtool_drvinfo)); 78aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp strncpy(drvinfo->driver, spider_net_driver_name, 32); 7990f10841180e9b7938f63db69e90dacb7d21bbe5Linas Vepstas strncpy(drvinfo->version, VERSION, 32); 80aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp strcpy(drvinfo->fw_version, "no information"); 81aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp strncpy(drvinfo->bus_info, pci_name(card->pdev), 32); 82aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 83aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 84aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic void 85aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_wol(struct net_device *netdev, 86aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct ethtool_wolinfo *wolinfo) 87aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 88aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp /* no support for wol */ 89aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp wolinfo->supported = 0; 90aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp wolinfo->wolopts = 0; 91aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 92aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 93aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic u32 94aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_msglevel(struct net_device *netdev) 95aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 96aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card; 97aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card = netdev_priv(netdev); 98aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp return card->msg_enable; 99aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 100aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 101aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic void 102aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_set_msglevel(struct net_device *netdev, 103aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp u32 level) 104aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 105aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card; 106aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card = netdev_priv(netdev); 107aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card->msg_enable = level; 108aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 109aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 110aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic int 111aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_nway_reset(struct net_device *netdev) 112aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 113aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp if (netif_running(netdev)) { 114aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp spider_net_stop(netdev); 115aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp spider_net_open(netdev); 116aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp } 117aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp return 0; 118aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 119aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 120aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic u32 121aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_rx_csum(struct net_device *netdev) 122aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 123aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card = netdev->priv; 124aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 125aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp return card->options.rx_csum; 126aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 127aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 128aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic int 129aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_set_rx_csum(struct net_device *netdev, u32 n) 130aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 131aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card = netdev->priv; 132aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 133aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card->options.rx_csum = n; 134aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp return 0; 135aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 136aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 13711f1a52b87eaf830bd03d4e01d563437c30f7728Arnd Bergmann 138b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewisstatic void 139b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewisspider_net_ethtool_get_ringparam(struct net_device *netdev, 140b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis struct ethtool_ringparam *ering) 141b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis{ 142b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis struct spider_net_card *card = netdev->priv; 143b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis 144b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis ering->tx_max_pending = SPIDER_NET_TX_DESCRIPTORS_MAX; 145d4ed8f8d1fb7d59eb63d2eada9a32c2f8c3795e2Linas Vepstas ering->tx_pending = card->tx_chain.num_desc; 146b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis ering->rx_max_pending = SPIDER_NET_RX_DESCRIPTORS_MAX; 147d4ed8f8d1fb7d59eb63d2eada9a32c2f8c3795e2Linas Vepstas ering->rx_pending = card->rx_chain.num_desc; 148b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis} 149b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis 150b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzikstatic int spider_net_get_sset_count(struct net_device *netdev, int sset) 1519b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis{ 152b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik switch (sset) { 153b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik case ETH_SS_STATS: 154b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik return SPIDER_NET_NUM_STATS; 155b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik default: 156b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik return -EOPNOTSUPP; 157b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik } 1589b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} 1599b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1609b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewisstatic void spider_net_get_ethtool_stats(struct net_device *netdev, 1619b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis struct ethtool_stats *stats, u64 *data) 1629b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis{ 1639b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis struct spider_net_card *card = netdev->priv; 1649b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1659b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[0] = card->netdev_stats.tx_packets; 1669b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[1] = card->netdev_stats.tx_bytes; 1679b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[2] = card->netdev_stats.rx_packets; 1689b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[3] = card->netdev_stats.rx_bytes; 1699b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[4] = card->netdev_stats.tx_errors; 1709b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[5] = card->netdev_stats.tx_dropped; 1719b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[6] = card->netdev_stats.rx_dropped; 1729b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[7] = card->spider_stats.rx_desc_error; 1739b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[8] = card->spider_stats.tx_timeouts; 1749b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[9] = card->spider_stats.alloc_rx_skb_error; 1759b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[10] = card->spider_stats.rx_iommu_map_error; 1769b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[11] = card->spider_stats.tx_iommu_map_error; 1779b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[12] = card->spider_stats.rx_desc_unk_state; 1789b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} 1799b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1809b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewisstatic void spider_net_get_strings(struct net_device *netdev, u32 stringset, 1819b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis u8 *data) 1829b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis{ 1839b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys)); 1849b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} 1859b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1867282d491ecaee9883233a0e27283c4c79486279aJeff Garzikconst struct ethtool_ops spider_net_ethtool_ops = { 187054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp .get_settings = spider_net_ethtool_get_settings, 188aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_drvinfo = spider_net_ethtool_get_drvinfo, 189aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_wol = spider_net_ethtool_get_wol, 190aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_msglevel = spider_net_ethtool_get_msglevel, 191aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .set_msglevel = spider_net_ethtool_set_msglevel, 1923a2c892daaf54b31a70785c2821771e8094188edStephen Hemminger .get_link = ethtool_op_get_link, 193aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .nway_reset = spider_net_ethtool_nway_reset, 194aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_rx_csum = spider_net_ethtool_get_rx_csum, 195aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .set_rx_csum = spider_net_ethtool_set_rx_csum, 1963a2c892daaf54b31a70785c2821771e8094188edStephen Hemminger .set_tx_csum = ethtool_op_set_tx_csum, 197b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis .get_ringparam = spider_net_ethtool_get_ringparam, 1989b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis .get_strings = spider_net_get_strings, 199b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik .get_sset_count = spider_net_get_sset_count, 2009b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis .get_ethtool_stats = spider_net_get_ethtool_stats, 201aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp}; 202aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 203