Commit c6fbbf1e authored by Fei Qin's avatar Fei Qin Committed by Paolo Abeni

nfp: remove padding in nfp_nfdk_tx_desc

NFDK firmware supports 48-bit dma addressing and
parses 16 high bits of dma addresses.

In nfp_nfdk_tx_desc, dma related structure and tso
related structure are union. When "mss" be filled
with nonzero value due to enable tso, the memory used
by "padding" may be also filled. Then, firmware may
parse wrong dma addresses which causes TX watchdog
timeout problem.

This patch removes padding and unifies the dma_addr_hi
bits with the one in firmware. nfp_nfdk_tx_desc_set_dma_addr
is also added to match this change.

Fixes: c10d12e3 ("nfp: add support for NFDK data path")
Signed-off-by: default avatarFei Qin <fei.qin@corigine.com>
Signed-off-by: default avatarYinjun Zhang <yinjun.zhang@corigine.com>
Signed-off-by: default avatarLouis Peens <louis.peens@corigine.com>
Signed-off-by: default avatarSimon Horman <simon.horman@corigine.com>
Link: https://lore.kernel.org/r/20220601083449.50556-1-simon.horman@corigine.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 7d8a3a47
...@@ -314,7 +314,7 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev) ...@@ -314,7 +314,7 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev)
FIELD_PREP(NFDK_DESC_TX_TYPE_HEAD, type); FIELD_PREP(NFDK_DESC_TX_TYPE_HEAD, type);
txd->dma_len_type = cpu_to_le16(dlen_type); txd->dma_len_type = cpu_to_le16(dlen_type);
nfp_desc_set_dma_addr(txd, dma_addr); nfp_nfdk_tx_desc_set_dma_addr(txd, dma_addr);
/* starts at bit 0 */ /* starts at bit 0 */
BUILD_BUG_ON(!(NFDK_DESC_TX_DMA_LEN_HEAD & 1)); BUILD_BUG_ON(!(NFDK_DESC_TX_DMA_LEN_HEAD & 1));
...@@ -339,7 +339,7 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev) ...@@ -339,7 +339,7 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev)
dlen_type = FIELD_PREP(NFDK_DESC_TX_DMA_LEN, dma_len); dlen_type = FIELD_PREP(NFDK_DESC_TX_DMA_LEN, dma_len);
txd->dma_len_type = cpu_to_le16(dlen_type); txd->dma_len_type = cpu_to_le16(dlen_type);
nfp_desc_set_dma_addr(txd, dma_addr); nfp_nfdk_tx_desc_set_dma_addr(txd, dma_addr);
dma_len -= dlen_type; dma_len -= dlen_type;
dma_addr += dlen_type + 1; dma_addr += dlen_type + 1;
...@@ -929,7 +929,7 @@ nfp_nfdk_tx_xdp_buf(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring, ...@@ -929,7 +929,7 @@ nfp_nfdk_tx_xdp_buf(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring,
FIELD_PREP(NFDK_DESC_TX_TYPE_HEAD, type); FIELD_PREP(NFDK_DESC_TX_TYPE_HEAD, type);
txd->dma_len_type = cpu_to_le16(dlen_type); txd->dma_len_type = cpu_to_le16(dlen_type);
nfp_desc_set_dma_addr(txd, dma_addr); nfp_nfdk_tx_desc_set_dma_addr(txd, dma_addr);
tmp_dlen = dlen_type & NFDK_DESC_TX_DMA_LEN_HEAD; tmp_dlen = dlen_type & NFDK_DESC_TX_DMA_LEN_HEAD;
dma_len -= tmp_dlen; dma_len -= tmp_dlen;
...@@ -940,7 +940,7 @@ nfp_nfdk_tx_xdp_buf(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring, ...@@ -940,7 +940,7 @@ nfp_nfdk_tx_xdp_buf(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring,
dma_len -= 1; dma_len -= 1;
dlen_type = FIELD_PREP(NFDK_DESC_TX_DMA_LEN, dma_len); dlen_type = FIELD_PREP(NFDK_DESC_TX_DMA_LEN, dma_len);
txd->dma_len_type = cpu_to_le16(dlen_type); txd->dma_len_type = cpu_to_le16(dlen_type);
nfp_desc_set_dma_addr(txd, dma_addr); nfp_nfdk_tx_desc_set_dma_addr(txd, dma_addr);
dlen_type &= NFDK_DESC_TX_DMA_LEN; dlen_type &= NFDK_DESC_TX_DMA_LEN;
dma_len -= dlen_type; dma_len -= dlen_type;
...@@ -1332,7 +1332,7 @@ nfp_nfdk_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec, ...@@ -1332,7 +1332,7 @@ nfp_nfdk_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
FIELD_PREP(NFDK_DESC_TX_TYPE_HEAD, type); FIELD_PREP(NFDK_DESC_TX_TYPE_HEAD, type);
txd->dma_len_type = cpu_to_le16(dlen_type); txd->dma_len_type = cpu_to_le16(dlen_type);
nfp_desc_set_dma_addr(txd, dma_addr); nfp_nfdk_tx_desc_set_dma_addr(txd, dma_addr);
tmp_dlen = dlen_type & NFDK_DESC_TX_DMA_LEN_HEAD; tmp_dlen = dlen_type & NFDK_DESC_TX_DMA_LEN_HEAD;
dma_len -= tmp_dlen; dma_len -= tmp_dlen;
...@@ -1343,7 +1343,7 @@ nfp_nfdk_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec, ...@@ -1343,7 +1343,7 @@ nfp_nfdk_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
dma_len -= 1; dma_len -= 1;
dlen_type = FIELD_PREP(NFDK_DESC_TX_DMA_LEN, dma_len); dlen_type = FIELD_PREP(NFDK_DESC_TX_DMA_LEN, dma_len);
txd->dma_len_type = cpu_to_le16(dlen_type); txd->dma_len_type = cpu_to_le16(dlen_type);
nfp_desc_set_dma_addr(txd, dma_addr); nfp_nfdk_tx_desc_set_dma_addr(txd, dma_addr);
dlen_type &= NFDK_DESC_TX_DMA_LEN; dlen_type &= NFDK_DESC_TX_DMA_LEN;
dma_len -= dlen_type; dma_len -= dlen_type;
......
...@@ -46,8 +46,7 @@ ...@@ -46,8 +46,7 @@
struct nfp_nfdk_tx_desc { struct nfp_nfdk_tx_desc {
union { union {
struct { struct {
u8 dma_addr_hi; /* High bits of host buf address */ __le16 dma_addr_hi; /* High bits of host buf address */
u8 padding; /* Must be zero */
__le16 dma_len_type; /* Length to DMA for this desc */ __le16 dma_len_type; /* Length to DMA for this desc */
__le32 dma_addr_lo; /* Low 32bit of host buf addr */ __le32 dma_addr_lo; /* Low 32bit of host buf addr */
}; };
......
...@@ -117,13 +117,22 @@ struct nfp_nfdk_tx_buf; ...@@ -117,13 +117,22 @@ struct nfp_nfdk_tx_buf;
/* Convenience macro for writing dma address into RX/TX descriptors */ /* Convenience macro for writing dma address into RX/TX descriptors */
#define nfp_desc_set_dma_addr(desc, dma_addr) \ #define nfp_desc_set_dma_addr(desc, dma_addr) \
do { \ do { \
__typeof(desc) __d = (desc); \ __typeof__(desc) __d = (desc); \
dma_addr_t __addr = (dma_addr); \ dma_addr_t __addr = (dma_addr); \
\ \
__d->dma_addr_lo = cpu_to_le32(lower_32_bits(__addr)); \ __d->dma_addr_lo = cpu_to_le32(lower_32_bits(__addr)); \
__d->dma_addr_hi = upper_32_bits(__addr) & 0xff; \ __d->dma_addr_hi = upper_32_bits(__addr) & 0xff; \
} while (0) } while (0)
#define nfp_nfdk_tx_desc_set_dma_addr(desc, dma_addr) \
do { \
__typeof__(desc) __d = (desc); \
dma_addr_t __addr = (dma_addr); \
\
__d->dma_addr_hi = cpu_to_le16(upper_32_bits(__addr) & 0xff); \
__d->dma_addr_lo = cpu_to_le32(lower_32_bits(__addr)); \
} while (0)
/** /**
* struct nfp_net_tx_ring - TX ring structure * struct nfp_net_tx_ring - TX ring structure
* @r_vec: Back pointer to ring vector structure * @r_vec: Back pointer to ring vector structure
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment