[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/17] imx_fec: Emulate SHIFT16 in ENETx_RACC
From: |
Andrey Smirnov |
Subject: |
[Qemu-devel] [PATCH 07/17] imx_fec: Emulate SHIFT16 in ENETx_RACC |
Date: |
Mon, 18 Sep 2017 12:50:50 -0700 |
Needed to support latest Linux kernel driver which relies on that
functionality.
Cc: Peter Maydell <address@hidden>
Cc: Jason Wang <address@hidden>
Cc: address@hidden
Cc: address@hidden
Cc: address@hidden
Signed-off-by: Andrey Smirnov <address@hidden>
---
hw/net/imx_fec.c | 23 +++++++++++++++++++++++
include/hw/net/imx_fec.h | 2 ++
2 files changed, 25 insertions(+)
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index 8a77136d38..bd62d7a75f 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -1037,6 +1037,7 @@ static ssize_t imx_enet_receive(NetClientState *nc, const
uint8_t *buf,
uint32_t buf_addr;
unsigned int buf_len;
size_t size = len;
+ bool shift16 = s->regs[ENET_RACC] & ENET_RACC_SHIFT16;
FEC_PRINTF("len %d\n", (int)size);
@@ -1049,6 +1050,10 @@ static ssize_t imx_enet_receive(NetClientState *nc,
const uint8_t *buf,
/* 4 bytes for the CRC. */
size += 4;
+ if (shift16) {
+ size += 2;
+ }
+
/* Huge frames are truncted. */
if (size > s->regs[ENET_FTRL]) {
size = s->regs[ENET_FTRL];
@@ -1085,6 +1090,24 @@ static ssize_t imx_enet_receive(NetClientState *nc,
const uint8_t *buf,
buf_len += size - 4;
}
buf_addr = bd.data;
+
+ if (shift16) {
+ /*
+ * If SHIFT16 bit of ENETx_RACC register is set we need to
+ * align the payload to 4-byte boundary.
+ */
+ const uint8_t zeros[2] = { 0 };
+
+ dma_memory_write(&address_space_memory, buf_addr,
+ zeros, sizeof(zeros));
+
+ buf_addr += sizeof(zeros);
+ buf_len -= sizeof(zeros);
+
+ shift16 = false; /* We only do this once per Ethernet
+ * frame */
+ }
+
dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
buf += buf_len;
if (size < 4) {
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
index 4bc8f03ec2..20a6aa98b4 100644
--- a/include/hw/net/imx_fec.h
+++ b/include/hw/net/imx_fec.h
@@ -169,6 +169,8 @@
#define ENET_TWFR_TFWR_LENGTH (6)
#define ENET_TWFR_STRFWD (1 << 8)
+#define ENET_RACC_SHIFT16 BIT(7)
+
/* Buffer Descriptor. */
typedef struct {
uint16_t length;
--
2.13.5
- [Qemu-devel] [PATCH 04/17] imx_fec: Change queue flushing heuristics, (continued)
- [Qemu-devel] [PATCH 04/17] imx_fec: Change queue flushing heuristics, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 02/17] imx_fec: Do not calculate FEC, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 06/17] imx_fec: Use MIN instead of explicit ternary operator, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 05/17] imx_fec: Use ENET_FTRL to determine truncation length, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 09/17] imx_fec: Use correct length for packet size, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 08/17] imx_fec: Add support for multiple Tx DMA rings, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 07/17] imx_fec: Emulate SHIFT16 in ENETx_RACC,
Andrey Smirnov <=
- [Qemu-devel] [PATCH 11/17] sdhci: Implement write method of ACMD12ERRSTS register, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 10/17] sdhci: Add i.MX specific subtype of SDHCI, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 13/17] i.MX: Add code to emulate i.MX2 watchdog IP block, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 14/17] i.MX7: Add code to emulate SNVS IP-block, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 12/17] i.MX: Add i.MX7 CCM, PMU and ANALOG device, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 15/17] include/qemu: Add sizes.h from Linux, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 17/17] Implement support for i.MX7 Sabre board, Andrey Smirnov, 2017/09/18
- [Qemu-devel] [PATCH 16/17] i.MX: Add i.MX7 SOC implementation., Andrey Smirnov, 2017/09/18
- Re: [Qemu-devel] [PATCH 00/17] Initial i.MX7 support, no-reply, 2017/09/18