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 Lewisstatic struct { 329b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis const char str[ETH_GSTRING_LEN]; 339b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} ethtool_stats_keys[] = { 349b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_packets" }, 359b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_bytes" }, 369b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_packets" }, 379b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_bytes" }, 389b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_errors" }, 399b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_dropped" }, 409b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_dropped" }, 419b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_descriptor_error" }, 429b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_timeouts" }, 439b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "alloc_rx_skb_error" }, 449b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_iommu_map_error" }, 459b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "tx_iommu_map_error" }, 469b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis { "rx_desc_unk_state" }, 479b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis}; 489b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 49054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkampstatic int 50054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkampspider_net_ethtool_get_settings(struct net_device *netdev, 51054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp struct ethtool_cmd *cmd) 52054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp{ 53054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp struct spider_net_card *card; 54054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp card = netdev_priv(netdev); 55054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp 56054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->supported = (SUPPORTED_1000baseT_Full | 57054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp SUPPORTED_FIBRE); 58054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->advertising = (ADVERTISED_1000baseT_Full | 59054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp ADVERTISED_FIBRE); 60054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->port = PORT_FIBRE; 61707394972093e2056e1e8cc39be19cf9bcb3e7b3David Decotigny ethtool_cmd_speed_set(cmd, card->phy.speed); 62054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp cmd->duplex = DUPLEX_FULL; 63054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp 64054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp return 0; 65054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp} 66054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp 67aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic void 68aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_drvinfo(struct net_device *netdev, 69aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct ethtool_drvinfo *drvinfo) 70aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 71aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card; 72aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card = netdev_priv(netdev); 73aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 74aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp /* clear and fill out info */ 75aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp memset(drvinfo, 0, sizeof(struct ethtool_drvinfo)); 76aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp strncpy(drvinfo->driver, spider_net_driver_name, 32); 7790f10841180e9b7938f63db69e90dacb7d21bbe5Linas Vepstas strncpy(drvinfo->version, VERSION, 32); 78aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp strcpy(drvinfo->fw_version, "no information"); 79aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp strncpy(drvinfo->bus_info, pci_name(card->pdev), 32); 80aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 81aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 82aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic void 83aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_wol(struct net_device *netdev, 84aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct ethtool_wolinfo *wolinfo) 85aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 86aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp /* no support for wol */ 87aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp wolinfo->supported = 0; 88aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp wolinfo->wolopts = 0; 89aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 90aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 91aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic u32 92aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_get_msglevel(struct net_device *netdev) 93aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 94aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card; 95aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card = netdev_priv(netdev); 96aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp return card->msg_enable; 97aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 98aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 99aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic void 100aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_set_msglevel(struct net_device *netdev, 101aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp u32 level) 102aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 103aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp struct spider_net_card *card; 104aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card = netdev_priv(netdev); 105aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp card->msg_enable = level; 106aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 107aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 108aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampstatic int 109aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkampspider_net_ethtool_nway_reset(struct net_device *netdev) 110aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp{ 111aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp if (netif_running(netdev)) { 112aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp spider_net_stop(netdev); 113aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp spider_net_open(netdev); 114aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp } 115aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp return 0; 116aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp} 117aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 118b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewisstatic void 119b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewisspider_net_ethtool_get_ringparam(struct net_device *netdev, 120b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis struct ethtool_ringparam *ering) 121b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis{ 1228f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct spider_net_card *card = netdev_priv(netdev); 123b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis 124b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis ering->tx_max_pending = SPIDER_NET_TX_DESCRIPTORS_MAX; 125d4ed8f8d1fb7d59eb63d2eada9a32c2f8c3795e2Linas Vepstas ering->tx_pending = card->tx_chain.num_desc; 126b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis ering->rx_max_pending = SPIDER_NET_RX_DESCRIPTORS_MAX; 127d4ed8f8d1fb7d59eb63d2eada9a32c2f8c3795e2Linas Vepstas ering->rx_pending = card->rx_chain.num_desc; 128b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis} 129b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis 130b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzikstatic int spider_net_get_sset_count(struct net_device *netdev, int sset) 1319b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis{ 132b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik switch (sset) { 133b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik case ETH_SS_STATS: 1347a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma return ARRAY_SIZE(ethtool_stats_keys); 135b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik default: 136b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik return -EOPNOTSUPP; 137b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik } 1389b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} 1399b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1409b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewisstatic void spider_net_get_ethtool_stats(struct net_device *netdev, 1419b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis struct ethtool_stats *stats, u64 *data) 1429b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis{ 1438f15ea42b64941001a401cf855a0869e24f3a845Wang Chen struct spider_net_card *card = netdev_priv(netdev); 1449b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1457a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[0] = netdev->stats.tx_packets; 1467a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[1] = netdev->stats.tx_bytes; 1477a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[2] = netdev->stats.rx_packets; 1487a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[3] = netdev->stats.rx_bytes; 1497a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[4] = netdev->stats.tx_errors; 1507a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[5] = netdev->stats.tx_dropped; 1517a876fae9da2b1417246a3eac0ac83889f12fa27Satyam Sharma data[6] = netdev->stats.rx_dropped; 1529b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[7] = card->spider_stats.rx_desc_error; 1539b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[8] = card->spider_stats.tx_timeouts; 1549b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[9] = card->spider_stats.alloc_rx_skb_error; 1559b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[10] = card->spider_stats.rx_iommu_map_error; 1569b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[11] = card->spider_stats.tx_iommu_map_error; 1579b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis data[12] = card->spider_stats.rx_desc_unk_state; 1589b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} 1599b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1609b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewisstatic void spider_net_get_strings(struct net_device *netdev, u32 stringset, 1619b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis u8 *data) 1629b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis{ 1639b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys)); 1649b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis} 1659b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis 1667282d491ecaee9883233a0e27283c4c79486279aJeff Garzikconst struct ethtool_ops spider_net_ethtool_ops = { 167054034dbf5b1a6aef800af4eb22d421d1c7d4b6dJens Osterkamp .get_settings = spider_net_ethtool_get_settings, 168aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_drvinfo = spider_net_ethtool_get_drvinfo, 169aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_wol = spider_net_ethtool_get_wol, 170aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .get_msglevel = spider_net_ethtool_get_msglevel, 171aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .set_msglevel = spider_net_ethtool_set_msglevel, 1723a2c892daaf54b31a70785c2821771e8094188edStephen Hemminger .get_link = ethtool_op_get_link, 173aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp .nway_reset = spider_net_ethtool_nway_reset, 174b68a60e598c0d1e738c807c47cb181e8cc52a0d8Jim Lewis .get_ringparam = spider_net_ethtool_get_ringparam, 1759b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis .get_strings = spider_net_get_strings, 176b9f2c0440d806e01968c3ed4def930a43be248adJeff Garzik .get_sset_count = spider_net_get_sset_count, 1779b6b0b81f0de6a17ce57c818d1f403253c200e1fJim Lewis .get_ethtool_stats = spider_net_get_ethtool_stats, 178aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp}; 179aaec0fab5f8809fe1509fdc204e769bb35ebe41aJens Osterkamp 180