aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c')
-rw-r--r--target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c
index cbe5fadb1f..63356b1814 100644
--- a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c
+++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c
@@ -131,13 +131,36 @@ out_get_link:
return ethtool_op_get_link(dev);
}
+static int fe_set_ringparam(struct net_device *dev,
+ struct ethtool_ringparam *ring)
+{
+ struct fe_priv *priv = netdev_priv(dev);
+
+ if ((ring->tx_pending < 2) ||
+ (ring->rx_pending < 2) ||
+ (ring->rx_pending > MAX_DMA_DESC) ||
+ (ring->tx_pending > MAX_DMA_DESC))
+ return -EINVAL;
+
+ dev->netdev_ops->ndo_stop(dev);
+
+ priv->tx_ring_size = BIT(fls(ring->tx_pending) - 1);
+ priv->rx_ring_size = BIT(fls(ring->rx_pending) - 1);
+
+ dev->netdev_ops->ndo_open(dev);
+
+ return 0;
+}
+
static void fe_get_ringparam(struct net_device *dev,
struct ethtool_ringparam *ring)
{
+ struct fe_priv *priv = netdev_priv(dev);
+
ring->rx_max_pending = MAX_DMA_DESC;
ring->tx_max_pending = MAX_DMA_DESC;
- ring->rx_pending = NUM_DMA_DESC;
- ring->tx_pending = NUM_DMA_DESC;
+ ring->rx_pending = priv->rx_ring_size;
+ ring->tx_pending = priv->tx_ring_size;
}
static void fe_get_strings(struct net_device *dev, u32 stringset, u8 *data)
@@ -194,6 +217,7 @@ static struct ethtool_ops fe_ethtool_ops = {
.set_msglevel = fe_set_msglevel,
.nway_reset = fe_nway_reset,
.get_link = fe_get_link,
+ .set_ringparam = fe_set_ringparam,
.get_ringparam = fe_get_ringparam,
};