FAILED: patch "[PATCH] net: stmmac: fix wrongly set buffer2 valid when sph unsupport" failed to apply to 5.4-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 396e13e11577b614db77db0bbb6fca935b94eb1b Mon Sep 17 00:00:00 2001
From: Joakim Zhang <[email protected]>
Date: Thu, 25 Feb 2021 17:01:13 +0800
Subject: [PATCH] net: stmmac: fix wrongly set buffer2 valid when sph unsupport
In current driver, buffer2 available only when hardware supports split header. Wrongly set buffer2 valid in stmmac_rx_refill when refill buffer address. You can see that desc3 is 0x81000000 after initialization, but turn out to be 0x83000000 after refill.
drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c +7 -2
@@ -533,10 +533,15 @@ static void dwmac4_get_rx_header_len(struct dma_desc *p, unsigned int *len) *len =le32_to_cpu (p->des2) &RDES2_HL ; } -static void dwmac4_set_sec_addr (struct dma_desc *p,dma_addr_t addr) +static void dwmac4_set_sec_addr (struct dma_desc *p,dma_addr_t addr,bool buf2_valid) { p->des2 =cpu_to_le32 (lower_32_bits (addr)); - p->des3 =cpu_to_le32 (upper_32_bits (addr) |RDES3_BUFFER2_VALID_ADDR ); + p->des3 =cpu_to_le32 (upper_32_bits (addr)); + +if (buf2_valid) + p->des3 |=cpu_to_le32 (RDES3_BUFFER2_VALID_ADDR ); +else + p->des3 &=cpu_to_le32 (~RDES3_BUFFER2_VALID_ADDR ); }static void dwmac4_set_tbs (struct dma_edesc *p,u32 sec,u32 nsec)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +1 -1
@@ -292,7 +292,7 @@ static void dwxgmac2_get_rx_header_len(struct dma_desc *p, unsigned int *len) *len =le32_to_cpu (p->des2) &XGMAC_RDES2_HL ; } -static void dwxgmac2_set_sec_addr (struct dma_desc *p,dma_addr_t addr) +static void dwxgmac2_set_sec_addr (struct dma_desc *p,dma_addr_t addr,bool is_valid) { p->des2 =cpu_to_le32 (lower_32_bits (addr)); p->des3 =cpu_to_le32 (upper_32_bits (addr));
drivers/net/ethernet/stmicro/stmmac/hwif.h +1 -1
@@ -92,7 +92,7 @@ struct stmmac_desc_ops {int (*get_rx_hash)(struct dma_desc *p,u32 *hash,enum pkt_hash_types *type);void (*get_rx_header_len)(struct dma_desc *p,unsigned int *len); -void (*set_sec_addr)(struct dma_desc *p,dma_addr_t addr); +void (*set_sec_addr)(struct dma_desc *p,dma_addr_t addr,bool buf2_valid);void (*set_sarc)(struct dma_desc *p,u32 sarc_type);void (*set_vlan_tag)(struct dma_desc *p,u16 tag,u16 inner_tag,u32 inner_type);
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +6 -2
@@ -1314,9 +1314,10 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,return -ENOMEM ; buf->sec_addr =page_pool_get_dma_addr (buf->sec_page); -stmmac_set_desc_sec_addr (priv, p, buf->sec_addr); +stmmac_set_desc_sec_addr (priv, p, buf->sec_addr, true); }else { buf->sec_page =NULL ; +stmmac_set_desc_sec_addr (priv, p, buf->sec_addr, false); } buf->addr =page_pool_get_dma_addr (buf->page);
@@ -3659,7 +3660,10 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue) DMA_FROM_DEVICE);stmmac_set_desc_addr (priv, p, buf->addr); -stmmac_set_desc_sec_addr (priv, p, buf->sec_addr); +if (priv->sph) +stmmac_set_desc_sec_addr (priv, p, buf->sec_addr, true); +else +stmmac_set_desc_sec_addr (priv, p, buf->sec_addr, false);stmmac_refill_desc3 (priv, rx_q, p); rx_q->rx_count_frames++;