ar71xx: build ALFA AP96 images with default profile as well
[openwrt/openwrt.git] / target / linux / ar71xx / files / drivers / net / ag71xx / ag71xx_ethtool.c
index f6a282c27a4a75078bb673771555bf0857dd73b6..498fbed1ff1d234b95eb32c7d5efcf6521f70318 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  Atheros AR71xx built-in ethernet mac driver
  *
- *  Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  *
  *  Based on Atheros' AG7100 driver
@@ -44,7 +44,7 @@ static void ag71xx_ethtool_get_drvinfo(struct net_device *dev,
 
        strcpy(info->driver, ag->pdev->dev.driver->name);
        strcpy(info->version, AG71XX_DRV_VERSION);
-       strcpy(info->bus_info, ag->pdev->dev.bus_id);
+       strcpy(info->bus_info, dev_name(&ag->pdev->dev));
 }
 
 static u32 ag71xx_ethtool_get_msglevel(struct net_device *dev)
@@ -61,11 +61,64 @@ static void ag71xx_ethtool_set_msglevel(struct net_device *dev, u32 msg_level)
        ag->msg_enable = msg_level;
 }
 
+static void ag71xx_ethtool_get_ringparam(struct net_device *dev,
+                                        struct ethtool_ringparam *er)
+{
+       struct ag71xx *ag = netdev_priv(dev);
+
+       er->tx_max_pending = AG71XX_TX_RING_SIZE_MAX;
+       er->rx_max_pending = AG71XX_RX_RING_SIZE_MAX;
+       er->rx_mini_max_pending = 0;
+       er->rx_jumbo_max_pending = 0;
+
+       er->tx_pending = ag->tx_ring.size;
+       er->rx_pending = ag->rx_ring.size;
+       er->rx_mini_pending = 0;
+       er->rx_jumbo_pending = 0;
+}
+
+static int ag71xx_ethtool_set_ringparam(struct net_device *dev,
+                                       struct ethtool_ringparam *er)
+{
+       struct ag71xx *ag = netdev_priv(dev);
+       unsigned tx_size;
+       unsigned rx_size;
+       int err;
+
+       if (er->rx_mini_pending != 0||
+           er->rx_jumbo_pending != 0 ||
+           er->rx_pending == 0 ||
+           er->tx_pending == 0)
+               return -EINVAL;
+
+       tx_size = er->tx_pending < AG71XX_TX_RING_SIZE_MAX ?
+                 er->tx_pending : AG71XX_TX_RING_SIZE_MAX;
+
+       rx_size = er->rx_pending < AG71XX_RX_RING_SIZE_MAX ?
+                 er->rx_pending : AG71XX_RX_RING_SIZE_MAX;
+
+       if (netif_running(dev)) {
+               err = dev->netdev_ops->ndo_stop(dev);
+               if (err)
+                       return err;
+       }
+
+       ag->tx_ring.size = tx_size;
+       ag->rx_ring.size = rx_size;
+
+       if (netif_running(dev))
+               err = dev->netdev_ops->ndo_open(dev);
+
+       return err;
+}
+
 struct ethtool_ops ag71xx_ethtool_ops = {
        .set_settings   = ag71xx_ethtool_set_settings,
        .get_settings   = ag71xx_ethtool_get_settings,
        .get_drvinfo    = ag71xx_ethtool_get_drvinfo,
        .get_msglevel   = ag71xx_ethtool_get_msglevel,
        .set_msglevel   = ag71xx_ethtool_set_msglevel,
+       .get_ringparam  = ag71xx_ethtool_get_ringparam,
+       .set_ringparam  = ag71xx_ethtool_set_ringparam,
        .get_link       = ethtool_op_get_link,
 };