瀏覽代碼

stmmac: allow mtu bigger than 1500 in case of normal desc (V4)

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>
Giuseppe CAVALLARO 14 年之前
父節點
當前提交
48febf7e64
共有 2 個文件被更改,包括 9 次插入3 次删除
  1. 7 1
      drivers/net/ethernet/stmicro/stmmac/norm_desc.c
  2. 2 2
      drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

+ 7 - 1
drivers/net/ethernet/stmicro/stmmac/norm_desc.c

@@ -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++) {
 	for (i = 0; i < ring_size; i++) {
 		p->des01.rx.own = 1;
 		p->des01.rx.own = 1;
 		p->des01.rx.buffer1_size = BUF_SIZE_2KiB - 1;
 		p->des01.rx.buffer1_size = BUF_SIZE_2KiB - 1;
+		p->des01.rx.buffer2_size = BUF_SIZE_2KiB - 1;
 		if (i == ring_size - 1)
 		if (i == ring_size - 1)
 			p->des01.rx.end_ring = 1;
 			p->des01.rx.end_ring = 1;
 		if (disable_rx_ic)
 		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)
 				  int csum_flag)
 {
 {
 	p->des01.tx.first_segment = is_fs;
 	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)
 static void ndesc_clear_tx_ic(struct dma_desc *p)

+ 2 - 2
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

@@ -1412,10 +1412,10 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu)
 		return -EBUSY;
 		return -EBUSY;
 	}
 	}
 
 
-	if (priv->plat->has_gmac)
+	if (priv->plat->enh_desc)
 		max_mtu = JUMBO_LEN;
 		max_mtu = JUMBO_LEN;
 	else
 	else
-		max_mtu = ETH_DATA_LEN;
+		max_mtu = BUF_SIZE_4KiB;
 
 
 	if ((new_mtu < 46) || (new_mtu > max_mtu)) {
 	if ((new_mtu < 46) || (new_mtu > max_mtu)) {
 		pr_err("%s: invalid MTU, max MTU is: %d\n", dev->name, max_mtu);
 		pr_err("%s: invalid MTU, max MTU is: %d\n", dev->name, max_mtu);