Commit 54ce8917 authored by Ioana Radulescu's avatar Ioana Radulescu Committed by Greg Kroah-Hartman

staging: fsl-dpaa2/eth: Fix access to FAS field

Commit 4b2d9fe8 ("staging: fsl-dpaa2/eth: Extra headroom in RX
buffers") removes the software annotation (SWA) area from the RX
buffer layout, as it's not used by anyone, but fails to update the
macros for accessing hardware annotation (HWA) fields, which is
right after the SWA in the buffer headroom.

This may lead to some frame annotation status fields (e.g. indication
if L3/L4 checksum is valid) to be read incorrectly.

Turn the accessor macros into inline functions and add a bool param
to specify if SWA is present or not.

Fixes: 4b2d9fe8 ("staging: fsl-dpaa2/eth: Extra headroom in RX buffers")
Signed-off-by: default avatarIoana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 038a5b4e
...@@ -249,7 +249,7 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv, ...@@ -249,7 +249,7 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr); vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr);
dma_unmap_single(dev, addr, DPAA2_ETH_RX_BUF_SIZE, DMA_FROM_DEVICE); dma_unmap_single(dev, addr, DPAA2_ETH_RX_BUF_SIZE, DMA_FROM_DEVICE);
fas = dpaa2_get_fas(vaddr); fas = dpaa2_get_fas(vaddr, false);
prefetch(fas); prefetch(fas);
buf_data = vaddr + dpaa2_fd_get_offset(fd); buf_data = vaddr + dpaa2_fd_get_offset(fd);
prefetch(buf_data); prefetch(buf_data);
...@@ -385,7 +385,7 @@ static int build_sg_fd(struct dpaa2_eth_priv *priv, ...@@ -385,7 +385,7 @@ static int build_sg_fd(struct dpaa2_eth_priv *priv,
* on TX confirmation. We are clearing FAS (Frame Annotation Status) * on TX confirmation. We are clearing FAS (Frame Annotation Status)
* field from the hardware annotation area * field from the hardware annotation area
*/ */
fas = dpaa2_get_fas(sgt_buf); fas = dpaa2_get_fas(sgt_buf, true);
memset(fas, 0, DPAA2_FAS_SIZE); memset(fas, 0, DPAA2_FAS_SIZE);
sgt = (struct dpaa2_sg_entry *)(sgt_buf + priv->tx_data_offset); sgt = (struct dpaa2_sg_entry *)(sgt_buf + priv->tx_data_offset);
...@@ -458,7 +458,7 @@ static int build_single_fd(struct dpaa2_eth_priv *priv, ...@@ -458,7 +458,7 @@ static int build_single_fd(struct dpaa2_eth_priv *priv,
* on TX confirmation. We are clearing FAS (Frame Annotation Status) * on TX confirmation. We are clearing FAS (Frame Annotation Status)
* field from the hardware annotation area * field from the hardware annotation area
*/ */
fas = dpaa2_get_fas(buffer_start); fas = dpaa2_get_fas(buffer_start, true);
memset(fas, 0, DPAA2_FAS_SIZE); memset(fas, 0, DPAA2_FAS_SIZE);
/* Store a backpointer to the skb at the beginning of the buffer /* Store a backpointer to the skb at the beginning of the buffer
...@@ -510,7 +510,7 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv, ...@@ -510,7 +510,7 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv,
fd_addr = dpaa2_fd_get_addr(fd); fd_addr = dpaa2_fd_get_addr(fd);
skbh = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr); skbh = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr);
fas = dpaa2_get_fas(skbh); fas = dpaa2_get_fas(skbh, true);
if (fd_format == dpaa2_fd_single) { if (fd_format == dpaa2_fd_single) {
skb = *skbh; skb = *skbh;
......
...@@ -153,10 +153,15 @@ struct dpaa2_fas { ...@@ -153,10 +153,15 @@ struct dpaa2_fas {
#define DPAA2_FAS_SIZE (sizeof(struct dpaa2_fas)) #define DPAA2_FAS_SIZE (sizeof(struct dpaa2_fas))
/* Accessors for the hardware annotation fields that we use */ /* Accessors for the hardware annotation fields that we use */
#define dpaa2_get_hwa(buf_addr) \ static inline void *dpaa2_get_hwa(void *buf_addr, bool swa)
((void *)(buf_addr) + DPAA2_ETH_SWA_SIZE) {
#define dpaa2_get_fas(buf_addr) \ return buf_addr + (swa ? DPAA2_ETH_SWA_SIZE : 0);
(struct dpaa2_fas *)(dpaa2_get_hwa(buf_addr) + DPAA2_FAS_OFFSET) }
static inline struct dpaa2_fas *dpaa2_get_fas(void *buf_addr, bool swa)
{
return dpaa2_get_hwa(buf_addr, swa) + DPAA2_FAS_OFFSET;
}
/* Error and status bits in the frame annotation status word */ /* Error and status bits in the frame annotation status word */
/* Debug frame, otherwise supposed to be discarded */ /* Debug frame, otherwise supposed to be discarded */
......
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