2005-09-06 02:19:29 +04:00
/*
* Network device driver for Cell Processor - Based Blade
*
* ( C ) Copyright IBM Corp . 2005
*
* Authors : Utz Bacher < utz . bacher @ de . ibm . com >
* Jens Osterkamp < Jens . Osterkamp @ de . ibm . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <linux/netdevice.h>
# include <linux/ethtool.h>
# include <linux/pci.h>
# include "spider_net.h"
2006-09-23 04:22:53 +04:00
static struct {
const char str [ ETH_GSTRING_LEN ] ;
} ethtool_stats_keys [ ] = {
{ " tx_packets " } ,
{ " tx_bytes " } ,
{ " rx_packets " } ,
{ " rx_bytes " } ,
{ " tx_errors " } ,
{ " tx_dropped " } ,
{ " rx_dropped " } ,
{ " rx_descriptor_error " } ,
{ " tx_timeouts " } ,
{ " alloc_rx_skb_error " } ,
{ " rx_iommu_map_error " } ,
{ " tx_iommu_map_error " } ,
{ " rx_desc_unk_state " } ,
} ;
2005-09-07 06:30:55 +04:00
static int
spider_net_ethtool_get_settings ( struct net_device * netdev ,
struct ethtool_cmd * cmd )
{
struct spider_net_card * card ;
card = netdev_priv ( netdev ) ;
cmd - > supported = ( SUPPORTED_1000baseT_Full |
SUPPORTED_FIBRE ) ;
cmd - > advertising = ( ADVERTISED_1000baseT_Full |
ADVERTISED_FIBRE ) ;
cmd - > port = PORT_FIBRE ;
cmd - > speed = card - > phy . speed ;
cmd - > duplex = DUPLEX_FULL ;
return 0 ;
}
2005-09-06 02:19:29 +04:00
static void
spider_net_ethtool_get_drvinfo ( struct net_device * netdev ,
struct ethtool_drvinfo * drvinfo )
{
struct spider_net_card * card ;
card = netdev_priv ( netdev ) ;
/* clear and fill out info */
memset ( drvinfo , 0 , sizeof ( struct ethtool_drvinfo ) ) ;
strncpy ( drvinfo - > driver , spider_net_driver_name , 32 ) ;
2006-10-11 00:56:04 +04:00
strncpy ( drvinfo - > version , VERSION , 32 ) ;
2005-09-06 02:19:29 +04:00
strcpy ( drvinfo - > fw_version , " no information " ) ;
strncpy ( drvinfo - > bus_info , pci_name ( card - > pdev ) , 32 ) ;
}
static void
spider_net_ethtool_get_wol ( struct net_device * netdev ,
struct ethtool_wolinfo * wolinfo )
{
/* no support for wol */
wolinfo - > supported = 0 ;
wolinfo - > wolopts = 0 ;
}
static u32
spider_net_ethtool_get_msglevel ( struct net_device * netdev )
{
struct spider_net_card * card ;
card = netdev_priv ( netdev ) ;
return card - > msg_enable ;
}
static void
spider_net_ethtool_set_msglevel ( struct net_device * netdev ,
u32 level )
{
struct spider_net_card * card ;
card = netdev_priv ( netdev ) ;
card - > msg_enable = level ;
}
static int
spider_net_ethtool_nway_reset ( struct net_device * netdev )
{
if ( netif_running ( netdev ) ) {
spider_net_stop ( netdev ) ;
spider_net_open ( netdev ) ;
}
return 0 ;
}
static u32
spider_net_ethtool_get_rx_csum ( struct net_device * netdev )
{
2008-11-13 10:38:36 +03:00
struct spider_net_card * card = netdev_priv ( netdev ) ;
2005-09-06 02:19:29 +04:00
return card - > options . rx_csum ;
}
static int
spider_net_ethtool_set_rx_csum ( struct net_device * netdev , u32 n )
{
2008-11-13 10:38:36 +03:00
struct spider_net_card * card = netdev_priv ( netdev ) ;
2005-09-06 02:19:29 +04:00
card - > options . rx_csum = n ;
return 0 ;
}
2006-01-13 01:16:44 +03:00
2006-08-15 10:00:23 +04:00
static void
spider_net_ethtool_get_ringparam ( struct net_device * netdev ,
struct ethtool_ringparam * ering )
{
2008-11-13 10:38:36 +03:00
struct spider_net_card * card = netdev_priv ( netdev ) ;
2006-08-15 10:00:23 +04:00
ering - > tx_max_pending = SPIDER_NET_TX_DESCRIPTORS_MAX ;
2006-12-14 00:06:59 +03:00
ering - > tx_pending = card - > tx_chain . num_desc ;
2006-08-15 10:00:23 +04:00
ering - > rx_max_pending = SPIDER_NET_RX_DESCRIPTORS_MAX ;
2006-12-14 00:06:59 +03:00
ering - > rx_pending = card - > rx_chain . num_desc ;
2006-08-15 10:00:23 +04:00
}
2007-10-04 05:07:32 +04:00
static int spider_net_get_sset_count ( struct net_device * netdev , int sset )
2006-09-23 04:22:53 +04:00
{
2007-10-04 05:07:32 +04:00
switch ( sset ) {
case ETH_SS_STATS :
2007-09-27 09:29:02 +04:00
return ARRAY_SIZE ( ethtool_stats_keys ) ;
2007-10-04 05:07:32 +04:00
default :
return - EOPNOTSUPP ;
}
2006-09-23 04:22:53 +04:00
}
static void spider_net_get_ethtool_stats ( struct net_device * netdev ,
struct ethtool_stats * stats , u64 * data )
{
2008-11-13 10:38:36 +03:00
struct spider_net_card * card = netdev_priv ( netdev ) ;
2006-09-23 04:22:53 +04:00
2007-09-27 09:29:02 +04:00
data [ 0 ] = netdev - > stats . tx_packets ;
data [ 1 ] = netdev - > stats . tx_bytes ;
data [ 2 ] = netdev - > stats . rx_packets ;
data [ 3 ] = netdev - > stats . rx_bytes ;
data [ 4 ] = netdev - > stats . tx_errors ;
data [ 5 ] = netdev - > stats . tx_dropped ;
data [ 6 ] = netdev - > stats . rx_dropped ;
2006-09-23 04:22:53 +04:00
data [ 7 ] = card - > spider_stats . rx_desc_error ;
data [ 8 ] = card - > spider_stats . tx_timeouts ;
data [ 9 ] = card - > spider_stats . alloc_rx_skb_error ;
data [ 10 ] = card - > spider_stats . rx_iommu_map_error ;
data [ 11 ] = card - > spider_stats . tx_iommu_map_error ;
data [ 12 ] = card - > spider_stats . rx_desc_unk_state ;
}
static void spider_net_get_strings ( struct net_device * netdev , u32 stringset ,
u8 * data )
{
memcpy ( data , ethtool_stats_keys , sizeof ( ethtool_stats_keys ) ) ;
}
2006-09-13 22:30:00 +04:00
const struct ethtool_ops spider_net_ethtool_ops = {
2005-09-07 06:30:55 +04:00
. get_settings = spider_net_ethtool_get_settings ,
2005-09-06 02:19:29 +04:00
. get_drvinfo = spider_net_ethtool_get_drvinfo ,
. get_wol = spider_net_ethtool_get_wol ,
. get_msglevel = spider_net_ethtool_get_msglevel ,
. set_msglevel = spider_net_ethtool_set_msglevel ,
2007-06-11 22:35:23 +04:00
. get_link = ethtool_op_get_link ,
2005-09-06 02:19:29 +04:00
. nway_reset = spider_net_ethtool_nway_reset ,
. get_rx_csum = spider_net_ethtool_get_rx_csum ,
. set_rx_csum = spider_net_ethtool_set_rx_csum ,
2007-06-11 22:35:23 +04:00
. set_tx_csum = ethtool_op_set_tx_csum ,
2006-08-15 10:00:23 +04:00
. get_ringparam = spider_net_ethtool_get_ringparam ,
2006-09-23 04:22:53 +04:00
. get_strings = spider_net_get_strings ,
2007-10-04 05:07:32 +04:00
. get_sset_count = spider_net_get_sset_count ,
2006-09-23 04:22:53 +04:00
. get_ethtool_stats = spider_net_get_ethtool_stats ,
2005-09-06 02:19:29 +04:00
} ;