stmmac: allow mtu bigger than 1500 in case of normal desc (V4)
authorGiuseppe CAVALLARO <peppe.cavallaro@st.com>
Tue, 18 Oct 2011 00:01:21 +0000 (00:01 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Oct 2011 23:24:17 +0000 (19:24 -0400)
This patch allows to set the mtu bigger than 1500
in case of normal descriptors.
This is helping some SPEAr customers.

Signed-off-by: Deepak SIKRI <deepak.sikri@st.com>
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/norm_desc.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 029c2a2cf5243aebaec8aba5d8d4eb9a7f3b72a7..e13226b80d47003df6124a48fa618fcec92dd55c 100644 (file)
@@ -126,6 +126,7 @@ static void ndesc_init_rx_desc(struct dma_desc *p, unsigned int ring_size,
        for (i = 0; i < ring_size; i++) {
                p->des01.rx.own = 1;
                p->des01.rx.buffer1_size = BUF_SIZE_2KiB - 1;
+               p->des01.rx.buffer2_size = BUF_SIZE_2KiB - 1;
                if (i == ring_size - 1)
                        p->des01.rx.end_ring = 1;
                if (disable_rx_ic)
@@ -183,7 +184,12 @@ static void ndesc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
                                  int csum_flag)
 {
        p->des01.tx.first_segment = is_fs;
-       p->des01.tx.buffer1_size = len;
+
+       if (unlikely(len > BUF_SIZE_2KiB)) {
+               p->des01.etx.buffer1_size = BUF_SIZE_2KiB - 1;
+               p->des01.etx.buffer2_size = len - p->des01.etx.buffer1_size;
+       } else
+               p->des01.tx.buffer1_size = len;
 }
 
 static void ndesc_clear_tx_ic(struct dma_desc *p)
index f80190d78f9038fa39d2ef25f01b4198ccf778f2..3c7ef7127d75ea354d4db932a6666a082bb89e2a 100644 (file)
@@ -1412,10 +1412,10 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu)
                return -EBUSY;
        }
 
-       if (priv->plat->has_gmac)
+       if (priv->plat->enh_desc)
                max_mtu = JUMBO_LEN;
        else
-               max_mtu = ETH_DATA_LEN;
+               max_mtu = BUF_SIZE_4KiB;
 
        if ((new_mtu < 46) || (new_mtu > max_mtu)) {
                pr_err("%s: invalid MTU, max MTU is: %d\n", dev->name, max_mtu);