From: Andrey Smirnov <andrew.smirnov@gmail.com>
To: barebox@lists.infradead.org
Cc: Andrey Smirnov <andrew.smirnov@gmail.com>
Subject: [PATCH 7/7] net: fec_imx: Do not use DMA coherent memory for Rx buffers
Date: Mon, 17 Sep 2018 22:21:22 -0700 [thread overview]
Message-ID: <20180918052122.12248-8-andrew.smirnov@gmail.com> (raw)
In-Reply-To: <20180918052122.12248-1-andrew.smirnov@gmail.com>
Trying to do unaligned access of coherent memory on AArch64 will lead
to an abort and some parts of our IP stack will do exactly that with
received packet buffer by using memcpy() to extracts parts of it.
Convert the driver to use regular memory for received data buffers to
prevent the issue from happening.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
drivers/net/fec_imx.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 33f2da84a..d304b94c5 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -558,6 +558,14 @@ static int fec_recv(struct eth_device *dev)
if (data_length - 4 > 14) {
void *frame = phys_to_virt(readl(&rbd->data_pointer));
+ /*
+ * Sync the data for CPU so that endianness
+ * fixup and net_receive below would get
+ * proper data
+ */
+ dma_sync_single_for_cpu((unsigned long)frame,
+ data_length,
+ DMA_FROM_DEVICE);
if (fec_is_imx28(fec))
imx28_fix_endianess_rd(frame,
(data_length + 3) >> 2);
@@ -567,6 +575,9 @@ static int fec_recv(struct eth_device *dev)
*/
len = data_length - 4;
net_receive(dev, frame, len);
+ dma_sync_single_for_device((unsigned long)frame,
+ data_length,
+ DMA_FROM_DEVICE);
}
}
/*
@@ -585,13 +596,23 @@ static int fec_alloc_receive_packets(struct fec_priv *fec, int count, int size)
void *p;
int i;
- /* reserve data memory and consider alignment */
- p = dma_alloc_coherent(size * count, DMA_ADDRESS_BROKEN);
+
+ p = dma_alloc(size * count);
if (!p)
return -ENOMEM;
for (i = 0; i < count; i++) {
- writel(virt_to_phys(p), &fec->rbd_base[i].data_pointer);
+ dma_addr_t dma;
+ /*
+ * Make sure there are no outstanding writes to the
+ * region of memory we are going to use as receive
+ * buffers as well as check that DMA mapping is valid
+ */
+ dma = dma_map_single(fec->dev, p, size, DMA_FROM_DEVICE);
+ if (dma_mapping_error(fec->dev, dma))
+ return -EFAULT;
+
+ writel(dma, &fec->rbd_base[i].data_pointer);
p += size;
}
@@ -601,7 +622,7 @@ static int fec_alloc_receive_packets(struct fec_priv *fec, int count, int size)
static void fec_free_receive_packets(struct fec_priv *fec, int count, int size)
{
void *p = phys_to_virt(fec->rbd_base[0].data_pointer);
- dma_free_coherent(p, 0, size * count);
+ dma_free(p);
}
#ifdef CONFIG_OFDEVICE
--
2.17.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2018-09-18 5:22 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-18 5:21 [PATCH 0/7] non-coherent Rx buffers in FEC and some small fixes Andrey Smirnov
2018-09-18 5:21 ` [PATCH 1/7] net: fec_imx: Drop extra indentation level by exiting early Andrey Smirnov
2018-09-18 5:21 ` [PATCH 2/7] net: fec_imx: Don't check bd_status & FEC_RBD_ERR twice Andrey Smirnov
2018-09-18 5:21 ` [PATCH 3/7] net: fec_imx: Read data_length only once Andrey Smirnov
2018-09-18 5:21 ` [PATCH 4/7] net: fec_imx: Drop struct fec_frame Andrey Smirnov
2018-09-18 5:21 ` [PATCH 5/7] net: fec_imx: Drop frame_length Andrey Smirnov
2018-09-18 5:21 ` [PATCH 6/7] net: fec_imx: Make use of readx_poll_timeout() macros Andrey Smirnov
2018-09-18 5:21 ` Andrey Smirnov [this message]
2019-01-14 12:21 ` [PATCH 7/7] net: fec_imx: Do not use DMA coherent memory for Rx buffers Uwe Kleine-König
2019-01-14 14:17 ` Uwe Kleine-König
2018-09-19 7:41 ` [PATCH 0/7] non-coherent Rx buffers in FEC and some small fixes Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180918052122.12248-8-andrew.smirnov@gmail.com \
--to=andrew.smirnov@gmail.com \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox