summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorCamelia Groza <camelia.groza@nxp.com>2017-09-04 11:03:01 (GMT)
committerXie Xiaobo <xiaobo.xie@nxp.com>2017-09-25 07:25:49 (GMT)
commit0181f24ddf06f6d33a9307f35fa90cb529060210 (patch)
tree9860a71692347dadd7caf68394b93f47efdb7f6c /drivers/net/ethernet
parent47637e3fead6620fd4076c211898092fd0ab2e67 (diff)
downloadlinux-0181f24ddf06f6d33a9307f35fa90cb529060210.tar.xz
sdk_dpaa: ls1043a errata: do not recycle the realigned buffers
Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h10
-rw-r--r--drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c9
2 files changed, 15 insertions, 4 deletions
diff --git a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h
index 84d0afe..d2ce6e6 100644
--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h
@@ -680,15 +680,17 @@ static inline void _dpa_bp_free_pf(void *addr)
put_page(virt_to_head_page(addr));
}
-/* TODO: LS1043A SoC has a HW issue regarding FMan DMA transactions; The issue
- * manifests itself at high traffic rates when frames exceed 4K memory
- * boundaries; For the moment, we use a SW workaround to avoid frames larger
- * than 4K or that exceed 4K alignments.
+/* LS1043A SoC has a HW issue regarding FMan DMA transactions; The issue
+ * manifests itself at high traffic rates when frames cross 4K memory
+ * boundaries or when they are not aligned to 16 bytes; For the moment, we
+ * use a SW workaround to avoid frames larger than 4K or that exceed 4K
+ * alignments and to realign the frames to 16 bytes.
*/
#ifndef CONFIG_PPC
extern bool dpaa_errata_a010022; /* SoC affected by A010022 errata */
+#define NONREC_MARK 0x01
#define HAS_DMA_ISSUE(start, size) \
(((u64)(start) + (size)) > (((u64)(start) + 0x1000) & ~0xFFF))
#define BOUNDARY_4K(start, size) (((u64)(start) + (u64)(size)) & ~0xFFF)
diff --git a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c
index 047dc4b..4dd8bf1 100644
--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c
@@ -306,6 +306,12 @@ EXPORT_SYMBOL(_dpa_cleanup_tx_fd);
#ifndef CONFIG_FSL_DPAA_TS
bool dpa_skb_is_recyclable(struct sk_buff *skb)
{
+#ifndef CONFIG_PPC
+ /* Do no recycle skbs realigned by the errata workaround */
+ if (unlikely(dpaa_errata_a010022) && skb->mark == NONREC_MARK)
+ return false;
+#endif
+
/* No recycling possible if skb buffer is kmalloc'ed */
if (skb->head_frag == 0)
return false;
@@ -842,6 +848,9 @@ static struct sk_buff *a010022_realign_skb(struct sk_buff *skb,
skb_set_network_header(nskb, net_offset);
skb_set_transport_header(nskb, trans_offset);
+ /* We don't want the buffer to be recycled so we mark it accordingly */
+ nskb->mark = NONREC_MARK;
+
dev_kfree_skb(skb);
return nskb;