From: Jim Shu <jim.shu@sifive.com>
To: qemu-devel@nongnu.org
Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
Alistair Francis <alistair@alistair23.me>,
Peter Maydell <peter.maydell@linaro.org>,
Jason Wang <jasowang@redhat.com>,
qemu-arm@nongnu.org (open list:Xilinx Zynq),
Jim Shu <jim.shu@sifive.com>
Subject: [PATCH 4/4] hw/net: xilinx_axienet: Fix DMA RX IRQ if ethernet disable RX
Date: Fri, 26 Jul 2024 13:59:33 +0800 [thread overview]
Message-ID: <20240726055933.817-5-jim.shu@sifive.com> (raw)
In-Reply-To: <20240726055933.817-1-jim.shu@sifive.com>
When AXI ethernet RX is disabled, it shouldn't send packets to AXI DMA,
which may let AXI DMA to send RX full IRQs. It is aligned with real AXI
DMA/ethernet IP behavior in the FPGA.
Also, now ethernet RX blocks the RX packets when it is disabled. It
should send and clear the remaining RX packets when enabling it.
Signed-off-by: Jim Shu <jim.shu@sifive.com>
---
hw/net/xilinx_axienet.c | 71 ++++++++++++++++++++++++-----------------
1 file changed, 42 insertions(+), 29 deletions(-)
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
index 05d41bd548..8428f10946 100644
--- a/hw/net/xilinx_axienet.c
+++ b/hw/net/xilinx_axienet.c
@@ -530,6 +530,40 @@ static uint64_t enet_read(void *opaque, hwaddr addr, unsigned size)
return r;
}
+static void axienet_eth_rx_notify(void *opaque)
+{
+ XilinxAXIEnet *s = XILINX_AXI_ENET(opaque);
+
+ /* If RX is disabled, don't trigger DMA to update RX desc and send IRQ */
+ if (!axienet_rx_enabled(s)) {
+ return;
+ }
+
+ while (s->rxappsize && stream_can_push(s->tx_control_dev,
+ axienet_eth_rx_notify, s)) {
+ size_t ret = stream_push(s->tx_control_dev,
+ (void *)s->rxapp + CONTROL_PAYLOAD_SIZE
+ - s->rxappsize, s->rxappsize, true);
+ s->rxappsize -= ret;
+ }
+
+ while (s->rxsize && stream_can_push(s->tx_data_dev,
+ axienet_eth_rx_notify, s)) {
+ size_t ret = stream_push(s->tx_data_dev, (void *)s->rxmem + s->rxpos,
+ s->rxsize, true);
+ s->rxsize -= ret;
+ s->rxpos += ret;
+ if (!s->rxsize) {
+ s->regs[R_IS] |= IS_RX_COMPLETE;
+ if (s->need_flush) {
+ s->need_flush = false;
+ qemu_flush_queued_packets(qemu_get_queue(s->nic));
+ }
+ }
+ }
+ enet_update_irq(s);
+}
+
static void enet_write(void *opaque, hwaddr addr,
uint64_t value, unsigned size)
{
@@ -546,6 +580,14 @@ static void enet_write(void *opaque, hwaddr addr,
} else {
qemu_flush_queued_packets(qemu_get_queue(s->nic));
}
+
+ /*
+ * When RX is enabled, check if any remaining data in rxmem
+ * and send them.
+ */
+ if ((addr & 1) && s->rcw[addr & 1] & RCW1_RX) {
+ axienet_eth_rx_notify(s);
+ }
break;
case R_TC:
@@ -666,35 +708,6 @@ static int enet_match_addr(const uint8_t *buf, uint32_t f0, uint32_t f1)
return match;
}
-static void axienet_eth_rx_notify(void *opaque)
-{
- XilinxAXIEnet *s = XILINX_AXI_ENET(opaque);
-
- while (s->rxappsize && stream_can_push(s->tx_control_dev,
- axienet_eth_rx_notify, s)) {
- size_t ret = stream_push(s->tx_control_dev,
- (void *)s->rxapp + CONTROL_PAYLOAD_SIZE
- - s->rxappsize, s->rxappsize, true);
- s->rxappsize -= ret;
- }
-
- while (s->rxsize && stream_can_push(s->tx_data_dev,
- axienet_eth_rx_notify, s)) {
- size_t ret = stream_push(s->tx_data_dev, (void *)s->rxmem + s->rxpos,
- s->rxsize, true);
- s->rxsize -= ret;
- s->rxpos += ret;
- if (!s->rxsize) {
- s->regs[R_IS] |= IS_RX_COMPLETE;
- if (s->need_flush) {
- s->need_flush = false;
- qemu_flush_queued_packets(qemu_get_queue(s->nic));
- }
- }
- }
- enet_update_irq(s);
-}
-
static ssize_t eth_rx(NetClientState *nc, const uint8_t *buf, size_t size)
{
XilinxAXIEnet *s = qemu_get_nic_opaque(nc);
--
2.17.1
next prev parent reply other threads:[~2024-07-26 6:01 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-26 5:59 [PATCH 0/4] Several fixes of AXI-ethernet/DMA Jim Shu
2024-07-26 5:59 ` [PATCH 1/4] hw/dma: xilinx_axidma: Correct the txlen value in the descriptor Jim Shu
2024-07-26 5:59 ` [PATCH 2/4] hw/dma: xilinx_axidma: Send DMA error IRQ if any memory access is failed Jim Shu
2024-07-26 5:59 ` [PATCH 3/4] hw/dma: xilinx_axidma: Reset qemu_irq when DMA/Stream is reset Jim Shu
2024-07-29 15:23 ` Peter Maydell
2024-08-01 13:55 ` Jim Shu
2024-07-26 5:59 ` Jim Shu [this message]
2024-07-29 15:31 ` [PATCH 4/4] hw/net: xilinx_axienet: Fix DMA RX IRQ if ethernet disable RX Peter Maydell
2024-08-01 13:34 ` Jim Shu
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=20240726055933.817-5-jim.shu@sifive.com \
--to=jim.shu@sifive.com \
--cc=alistair@alistair23.me \
--cc=edgar.iglesias@gmail.com \
--cc=jasowang@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.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;
as well as URLs for NNTP newsgroup(s).