#define STMMAC_CHAIN_MODE      0x1
 #define STMMAC_RING_MODE       0x2
 
+#define JUMBO_LEN              9000
+
 struct stmmac_desc_ops {
        /* DMA RX descriptor ring initialization */
        void (*init_rx_desc) (struct dma_desc *p, int disable_rx_ic, int mode,
 
 struct stmmac_ops {
        /* MAC core initialization */
-       void (*core_init) (void __iomem *ioaddr);
+       void (*core_init) (void __iomem *ioaddr, int mtu);
        /* Enable and verify that the IPC module is supported */
        int (*rx_ipc) (void __iomem *ioaddr);
        /* Dump MAC registers */
 
 #define GMAC_ANE_PSE           (3 << 7)
 #define GMAC_ANE_PSE_SHIFT     7
 
- /* GMAC Configuration defines */
-#define GMAC_CONTROL_TC        0x01000000      /* Transmit Conf. in RGMII/SGMII */
-#define GMAC_CONTROL_WD        0x00800000      /* Disable Watchdog on receive */
-
 /* GMAC Configuration defines */
+#define GMAC_CONTROL_2K 0x08000000     /* IEEE 802.3as 2K packets */
 #define GMAC_CONTROL_TC        0x01000000      /* Transmit Conf. in RGMII/SGMII */
 #define GMAC_CONTROL_WD        0x00800000      /* Disable Watchdog on receive */
 #define GMAC_CONTROL_JD        0x00400000      /* Jabber disable */
 #define GMAC_CONTROL_RE                0x00000004      /* Receiver Enable */
 
 #define GMAC_CORE_INIT (GMAC_CONTROL_JD | GMAC_CONTROL_PS | GMAC_CONTROL_ACS | \
-                       GMAC_CONTROL_JE | GMAC_CONTROL_BE)
+                       GMAC_CONTROL_BE)
 
 /* GMAC Frame Filter defines */
 #define GMAC_FRAME_FILTER_PR   0x00000001      /* Promiscuous Mode */
 
 #include <asm/io.h>
 #include "dwmac1000.h"
 
-static void dwmac1000_core_init(void __iomem *ioaddr)
+static void dwmac1000_core_init(void __iomem *ioaddr, int mtu)
 {
        u32 value = readl(ioaddr + GMAC_CONTROL);
        value |= GMAC_CORE_INIT;
+       if (mtu > 1500)
+               value |= GMAC_CONTROL_2K;
+       if (mtu > 2000)
+               value |= GMAC_CONTROL_JE;
+
        writel(value, ioaddr + GMAC_CONTROL);
 
        /* Mask GMAC interrupts */
 
 #include <asm/io.h>
 #include "dwmac100.h"
 
-static void dwmac100_core_init(void __iomem *ioaddr)
+static void dwmac100_core_init(void __iomem *ioaddr, int mtu)
 {
        u32 value = readl(ioaddr + MAC_CONTROL);
 
 
 #include <linux/reset.h>
 
 #define STMMAC_ALIGN(x)        L1_CACHE_ALIGN(x)
-#define JUMBO_LEN      9000
 
 /* Module parameters */
 #define TX_TIMEO       5000
 module_param(tc, int, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(tc, "DMA threshold control value");
 
-#define DMA_BUFFER_SIZE        BUF_SIZE_2KiB
+#define DMA_BUFFER_SIZE        BUF_SIZE_4KiB
 static int buf_sz = DMA_BUFFER_SIZE;
 module_param(buf_sz, int, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(buf_sz, "DMA buffer size");
        if (bfsize < BUF_SIZE_16KiB)
                bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz);
 
+       priv->dma_buf_sz = bfsize;
+
        if (netif_msg_probe(priv))
                pr_debug("%s: txsize %d, rxsize %d, bfsize %d\n", __func__,
                         txsize, rxsize, bfsize);
        }
        priv->cur_rx = 0;
        priv->dirty_rx = (unsigned int)(i - rxsize);
-       priv->dma_buf_sz = bfsize;
        buf_sz = bfsize;
 
        /* Setup the chained descriptor addresses */
                priv->plat->bus_setup(priv->ioaddr);
 
        /* Initialize the MAC Core */
-       priv->hw->mac->core_init(priv->ioaddr);
+       priv->hw->mac->core_init(priv->ioaddr, dev->mtu);
 
        /* Enable the MAC Rx/Tx */
        stmmac_set_mac(priv->ioaddr, true);
        else
                max_mtu = SKB_MAX_HEAD(NET_SKB_PAD + NET_IP_ALIGN);
 
+       if (priv->plat->maxmtu < max_mtu)
+               max_mtu = priv->plat->maxmtu;
+
        if ((new_mtu < 46) || (new_mtu > max_mtu)) {
                pr_err("%s: invalid MTU, max MTU is: %d\n", dev->name, max_mtu);
                return -EINVAL;
 
 
        plat->force_sf_dma_mode = of_property_read_bool(np, "snps,force_sf_dma_mode");
 
+       /* Set the maxmtu to a default of JUMBO_LEN in case the
+        * parameter is not present in the device tree.
+        */
+       plat->maxmtu = JUMBO_LEN;
+
        /*
         * Currently only the properties needed on SPEAr600
         * are provided. All other properties should be added
        if (of_device_is_compatible(np, "st,spear600-gmac") ||
                of_device_is_compatible(np, "snps,dwmac-3.70a") ||
                of_device_is_compatible(np, "snps,dwmac")) {
+               /* Note that the max-frame-size parameter as defined in the
+                * ePAPR v1.1 spec is defined as max-frame-size, it's
+                * actually used as the IEEE definition of MAC Client
+                * data, or MTU. The ePAPR specification is confusing as
+                * the definition is max-frame-size, but usage examples
+                * are clearly MTUs
+                */
+               of_property_read_u32(np, "max-frame-size", &plat->maxmtu);
                plat->has_gmac = 1;
                plat->pmt = 1;
        }
 
        int force_thresh_dma_mode;
        int riwt_off;
        int max_speed;
+       int maxmtu;
        void (*fix_mac_speed)(void *priv, unsigned int speed);
        void (*bus_setup)(void __iomem *ioaddr);
        void *(*setup)(struct platform_device *pdev);