From patchwork Sun Dec 30 01:19:26 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Flavio Leitner X-Patchwork-Id: 208691 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0D4702C00A7 for ; Sun, 30 Dec 2012 12:20:00 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753705Ab2L3BTt (ORCPT ); Sat, 29 Dec 2012 20:19:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:22328 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753587Ab2L3BTs (ORCPT ); Sat, 29 Dec 2012 20:19:48 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qBU1Jkgq010807 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 29 Dec 2012 20:19:47 -0500 Received: from localhost (ovpn-113-70.phx2.redhat.com [10.3.113.70]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qBU1JiAF011209; Sat, 29 Dec 2012 20:19:45 -0500 From: Flavio Leitner To: netdev Cc: Jiri Pirko , Flavio Leitner Subject: [PATCH net-next] team: add ethtool support Date: Sat, 29 Dec 2012 23:19:26 -0200 Message-Id: <1356830366-991-1-git-send-email-fbl@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds few ethtool operations to team driver. Signed-off-by: Flavio Leitner --- drivers/net/team/team.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index ad86660..f711039 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #define DRV_NAME "team" @@ -1731,6 +1732,75 @@ static const struct net_device_ops team_netdev_ops = { .ndo_fix_features = team_fix_features, }; +/*********************** + * ethtool interface + ***********************/ + +static const char ethtool_stats_keys[][ETH_GSTRING_LEN] = { + "rx_packets", + "rx_bytes", + "rx_dropped", + "tx_packets", + "tx_bytes", + "tx_dropped", + "multicast", +}; + +#define TEAM_NUM_STATS ARRAY_SIZE(ethtool_stats_keys) + +static int team_get_sset_count(struct net_device *netdev, int sset) +{ + switch (sset) { + case ETH_SS_STATS: + return TEAM_NUM_STATS; + default: + return -EOPNOTSUPP; + } +} + +static void team_get_strings(struct net_device *netdev, u32 stringset, u8 *data) +{ + switch (stringset) { + case ETH_SS_STATS: + memcpy(data, *ethtool_stats_keys, sizeof(ethtool_stats_keys)); + break; + } +} + +static void team_get_ethtool_stats(struct net_device *netdev, + struct ethtool_stats *stats, + u64 *data) +{ + struct rtnl_link_stats64 net_stats; + int i; + + memset(&net_stats, 0, sizeof(struct rtnl_link_stats64)); + team_get_stats64(netdev, &net_stats); + i = 0; + /* ordering based on ethtool_stats_keys */ + data[i++] = net_stats.rx_packets; + data[i++] = net_stats.rx_bytes; + data[i++] = net_stats.rx_dropped; + data[i++] = net_stats.tx_packets; + data[i++] = net_stats.tx_bytes; + data[i++] = net_stats.tx_dropped; + data[i++] = net_stats.multicast; +} + +static void team_ethtool_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *drvinfo) +{ + strncpy(drvinfo->driver, DRV_NAME, 32); + strncpy(drvinfo->version, UTS_RELEASE, 32); +} + +static const struct ethtool_ops team_ethtool_ops = { + .get_drvinfo = team_ethtool_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_strings = team_get_strings, + .get_ethtool_stats = team_get_ethtool_stats, + .get_sset_count = team_get_sset_count, +}; /*********************** * rt netlink interface @@ -1780,6 +1850,7 @@ static void team_setup(struct net_device *dev) ether_setup(dev); dev->netdev_ops = &team_netdev_ops; + dev->ethtool_ops = &team_ethtool_ops; dev->destructor = team_destructor; dev->tx_queue_len = 0; dev->flags |= IFF_MULTICAST;