net: macb: Add change_mtu callback with jumbo support
authorHarini Katakam <harini.katakam@xilinx.com>
Wed, 6 May 2015 16:57:18 +0000 (22:27 +0530)
committerDavid S. Miller <davem@davemloft.net>
Sat, 9 May 2015 21:41:54 +0000 (17:41 -0400)
Add macb_change_mtu callback; if jumbo frame support is present allow
mtu size changes upto (jumbo max length allowed - headers).

Signed-off-by: Harini Katakam <harinik@xilinx.com>
Reviewed-by: Punnaiah Choudary Kalluri <punnaia@xilinx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cadence/macb.c

index cb84587..97c6646 100644 (file)
@@ -54,6 +54,8 @@
 #define MACB_MAX_TX_LEN                ((unsigned int)((1 << MACB_TX_FRMLEN_SIZE) - 1))
 #define GEM_MAX_TX_LEN         ((unsigned int)((1 << GEM_TX_FRMLEN_SIZE) - 1))
 
+#define GEM_MTU_MIN_SIZE       68
+
 /*
  * Graceful stop timeouts in us. We should allow up to
  * 1 frame time (10 Mbits/s, full-duplex, ignoring collisions)
@@ -1855,6 +1857,26 @@ static int macb_close(struct net_device *dev)
        return 0;
 }
 
+static int macb_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct macb *bp = netdev_priv(dev);
+       u32 max_mtu;
+
+       if (netif_running(dev))
+               return -EBUSY;
+
+       max_mtu = ETH_DATA_LEN;
+       if (bp->caps | MACB_CAPS_JUMBO)
+               max_mtu = gem_readl(bp, JML) - ETH_HLEN - ETH_FCS_LEN;
+
+       if ((new_mtu > max_mtu) || (new_mtu < GEM_MTU_MIN_SIZE))
+               return -EINVAL;
+
+       dev->mtu = new_mtu;
+
+       return 0;
+}
+
 static void gem_update_stats(struct macb *bp)
 {
        int i;
@@ -2131,7 +2153,7 @@ static const struct net_device_ops macb_netdev_ops = {
        .ndo_get_stats          = macb_get_stats,
        .ndo_do_ioctl           = macb_ioctl,
        .ndo_validate_addr      = eth_validate_addr,
-       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_change_mtu         = macb_change_mtu,
        .ndo_set_mac_address    = eth_mac_addr,
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = macb_poll_controller,