aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mlx4/en_ethtool.c
diff options
context:
space:
mode:
authorYevgeny Petrilin <yevgenyp@mellanox.co.il>2010-08-23 23:46:46 -0400
committerDavid S. Miller <davem@davemloft.net>2010-08-24 18:00:42 -0400
commitfa37a9586f92051de03a13e55e5ec3880bb6783e (patch)
treef87f49668aa13e65fba708b3cf30658332a54edf /drivers/net/mlx4/en_ethtool.c
parent0533943c5c45cce2e26432bf0a6b8e114757c897 (diff)
mlx4_en: Moving to work with GRO
Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/mlx4/en_ethtool.c')
-rw-r--r--drivers/net/mlx4/en_ethtool.c56
1 files changed, 2 insertions, 54 deletions
diff --git a/drivers/net/mlx4/en_ethtool.c b/drivers/net/mlx4/en_ethtool.c
index c5551f2cf260..01634a3efe85 100644
--- a/drivers/net/mlx4/en_ethtool.c
+++ b/drivers/net/mlx4/en_ethtool.c
@@ -39,21 +39,6 @@
39#include "en_port.h" 39#include "en_port.h"
40 40
41 41
42static void mlx4_en_update_lro_stats(struct mlx4_en_priv *priv)
43{
44 int i;
45
46 priv->port_stats.lro_aggregated = 0;
47 priv->port_stats.lro_flushed = 0;
48 priv->port_stats.lro_no_desc = 0;
49
50 for (i = 0; i < priv->rx_ring_num; i++) {
51 priv->port_stats.lro_aggregated += priv->rx_ring[i].lro.stats.aggregated;
52 priv->port_stats.lro_flushed += priv->rx_ring[i].lro.stats.flushed;
53 priv->port_stats.lro_no_desc += priv->rx_ring[i].lro.stats.no_desc;
54 }
55}
56
57static void 42static void
58mlx4_en_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) 43mlx4_en_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
59{ 44{
@@ -112,7 +97,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
112 "tx_heartbeat_errors", "tx_window_errors", 97 "tx_heartbeat_errors", "tx_window_errors",
113 98
114 /* port statistics */ 99 /* port statistics */
115 "lro_aggregated", "lro_flushed", "lro_no_desc", "tso_packets", 100 "tso_packets",
116 "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed", 101 "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed",
117 "rx_csum_good", "rx_csum_none", "tx_chksum_offload", 102 "rx_csum_good", "rx_csum_none", "tx_chksum_offload",
118 103
@@ -122,7 +107,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
122 "tx_prio_1", "tx_prio_2", "tx_prio_3", "tx_prio_4", "tx_prio_5", 107 "tx_prio_1", "tx_prio_2", "tx_prio_3", "tx_prio_4", "tx_prio_5",
123 "tx_prio_6", "tx_prio_7", 108 "tx_prio_6", "tx_prio_7",
124}; 109};
125#define NUM_MAIN_STATS 21 110#define NUM_MAIN_STATS 18
126#define NUM_ALL_STATS (NUM_MAIN_STATS + NUM_PORT_STATS + NUM_PKT_STATS + NUM_PERF_STATS) 111#define NUM_ALL_STATS (NUM_MAIN_STATS + NUM_PORT_STATS + NUM_PKT_STATS + NUM_PERF_STATS)
127 112
128static const char mlx4_en_test_names[][ETH_GSTRING_LEN]= { 113static const char mlx4_en_test_names[][ETH_GSTRING_LEN]= {
@@ -174,8 +159,6 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
174 159
175 spin_lock_bh(&priv->stats_lock); 160 spin_lock_bh(&priv->stats_lock);
176 161
177 mlx4_en_update_lro_stats(priv);
178
179 for (i = 0; i < NUM_MAIN_STATS; i++) 162 for (i = 0; i < NUM_MAIN_STATS; i++)
180 data[index++] = ((unsigned long *) &priv->stats)[i]; 163 data[index++] = ((unsigned long *) &priv->stats)[i];
181 for (i = 0; i < NUM_PORT_STATS; i++) 164 for (i = 0; i < NUM_PORT_STATS; i++)
@@ -439,40 +422,6 @@ static void mlx4_en_get_ringparam(struct net_device *dev,
439 param->tx_pending = priv->tx_ring[0].size; 422 param->tx_pending = priv->tx_ring[0].size;
440} 423}
441 424
442static int mlx4_ethtool_op_set_flags(struct net_device *dev, u32 data)
443{
444 struct mlx4_en_priv *priv = netdev_priv(dev);
445 struct mlx4_en_dev *mdev = priv->mdev;
446 int rc = 0;
447 int changed = 0;
448
449 if (data & ~ETH_FLAG_LRO)
450 return -EOPNOTSUPP;
451
452 if (data & ETH_FLAG_LRO) {
453 if (!(dev->features & NETIF_F_LRO))
454 changed = 1;
455 } else if (dev->features & NETIF_F_LRO) {
456 changed = 1;
457 }
458
459 if (changed) {
460 if (netif_running(dev)) {
461 mutex_lock(&mdev->state_lock);
462 mlx4_en_stop_port(dev);
463 }
464 dev->features ^= NETIF_F_LRO;
465 if (netif_running(dev)) {
466 rc = mlx4_en_start_port(dev);
467 if (rc)
468 en_err(priv, "Failed to restart port\n");
469 mutex_unlock(&mdev->state_lock);
470 }
471 }
472
473 return rc;
474}
475
476const struct ethtool_ops mlx4_en_ethtool_ops = { 425const struct ethtool_ops mlx4_en_ethtool_ops = {
477 .get_drvinfo = mlx4_en_get_drvinfo, 426 .get_drvinfo = mlx4_en_get_drvinfo,
478 .get_settings = mlx4_en_get_settings, 427 .get_settings = mlx4_en_get_settings,
@@ -502,7 +451,6 @@ const struct ethtool_ops mlx4_en_ethtool_ops = {
502 .get_ringparam = mlx4_en_get_ringparam, 451 .get_ringparam = mlx4_en_get_ringparam,
503 .set_ringparam = mlx4_en_set_ringparam, 452 .set_ringparam = mlx4_en_set_ringparam,
504 .get_flags = ethtool_op_get_flags, 453 .get_flags = ethtool_op_get_flags,
505 .set_flags = mlx4_ethtool_op_set_flags,
506}; 454};
507 455
508 456