summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index e8a241754a46..7f6e5a5654fd 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1990,6 +1990,51 @@ static int fec_enet_get_ts_info(struct net_device *ndev,
}
}
+static void fec_enet_get_ringparam(struct net_device *ndev,
+ struct ethtool_ringparam *ring)
+{
+ struct fec_enet_private *fep = netdev_priv(ndev);
+
+ ring->rx_max_pending = RX_RING_SIZE;
+ ring->tx_max_pending = TX_RING_SIZE;
+ ring->rx_pending = fep->rx_ring_size;
+ ring->tx_pending = fep->tx_ring_size;
+}
+
+static int fec_enet_set_ringparam(struct net_device *ndev,
+ struct ethtool_ringparam *ring)
+{
+ struct fec_enet_private *fep = netdev_priv(ndev);
+ unsigned rx, tx, tx_min;
+
+ tx_min = ndev->features & NETIF_F_SG ? TX_RING_SIZE_MIN_SG : 16;
+
+ rx = clamp_t(u32, ring->rx_pending, 16, RX_RING_SIZE);
+ tx = clamp_t(u32, ring->tx_pending, tx_min, TX_RING_SIZE);
+
+ if (tx == fep->tx_ring_size && rx == fep->rx_ring_size)
+ return 0;
+
+ /* Setting the ring size while the interface is down is easy */
+ if (!netif_running(ndev)) {
+ fep->tx_ring_size = tx;
+ fep->rx_ring_size = rx;
+ } else {
+ return -EINVAL;
+
+ napi_disable(&fep->napi);
+ netif_tx_lock_bh(ndev);
+ fec_stop(ndev);
+ /* reallocate ring */
+ fec_restart(ndev);
+ netif_wake_queue(ndev);
+ netif_tx_unlock_bh(ndev);
+ napi_enable(&fep->napi);
+ }
+
+ return 0;
+}
+
#if !defined(CONFIG_M5272)
static void fec_enet_get_pauseparam(struct net_device *ndev,
@@ -2194,6 +2239,8 @@ static const struct ethtool_ops fec_enet_ethtool_ops = {
.get_drvinfo = fec_enet_get_drvinfo,
.nway_reset = fec_enet_nway_reset,
.get_link = ethtool_op_get_link,
+ .get_ringparam = fec_enet_get_ringparam,
+ .set_ringparam = fec_enet_set_ringparam,
#ifndef CONFIG_M5272
.get_pauseparam = fec_enet_get_pauseparam,
.set_pauseparam = fec_enet_set_pauseparam,