76 lines
2.5 KiB
Diff
76 lines
2.5 KiB
Diff
|
|
From cf11e02156e202db1be5e9c85b67d5dfaa56ce48 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Luo Yifan <luoyifan_yewu@cmss.chinamobile.com>
|
||
|
|
Date: Mon, 4 Dec 2023 10:28:53 +0800
|
||
|
|
Subject: [PATCH] hw/net: npcm7xx_emc fix missing queue_flush
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
cherry picked from commit 530cd6c26df47c4f294c6335c9829e6c968fe7a8
|
||
|
|
|
||
|
|
The rx_active boolean change to true should always trigger a try_read
|
||
|
|
call that flushes the queue.
|
||
|
|
|
||
|
|
Signed-off-by: Patrick Venture <venture@google.com>
|
||
|
|
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||
|
|
Message-id: 20211203221002.1719306-1-venture@google.com
|
||
|
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||
|
|
Signed-off-by: Luo Yifan <luoyifan_yewu@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
hw/net/npcm7xx_emc.c | 18 ++++++++----------
|
||
|
|
1 file changed, 8 insertions(+), 10 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/net/npcm7xx_emc.c b/hw/net/npcm7xx_emc.c
|
||
|
|
index df2efe1bf8..9a2328935c 100644
|
||
|
|
--- a/hw/net/npcm7xx_emc.c
|
||
|
|
+++ b/hw/net/npcm7xx_emc.c
|
||
|
|
@@ -286,6 +286,12 @@ static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag)
|
||
|
|
emc_set_mista(emc, mista_flag);
|
||
|
|
}
|
||
|
|
|
||
|
|
+static void emc_enable_rx_and_flush(NPCM7xxEMCState *emc)
|
||
|
|
+{
|
||
|
|
+ emc->rx_active = true;
|
||
|
|
+ qemu_flush_queued_packets(qemu_get_queue(emc->nic));
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static void emc_set_next_tx_descriptor(NPCM7xxEMCState *emc,
|
||
|
|
const NPCM7xxEMCTxDesc *tx_desc,
|
||
|
|
uint32_t desc_addr)
|
||
|
|
@@ -585,13 +591,6 @@ static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1)
|
||
|
|
return len;
|
||
|
|
}
|
||
|
|
|
||
|
|
-static void emc_try_receive_next_packet(NPCM7xxEMCState *emc)
|
||
|
|
-{
|
||
|
|
- if (emc_can_receive(qemu_get_queue(emc->nic))) {
|
||
|
|
- qemu_flush_queued_packets(qemu_get_queue(emc->nic));
|
||
|
|
- }
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
static uint64_t npcm7xx_emc_read(void *opaque, hwaddr offset, unsigned size)
|
||
|
|
{
|
||
|
|
NPCM7xxEMCState *emc = opaque;
|
||
|
|
@@ -707,7 +706,7 @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
|
||
|
|
emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA;
|
||
|
|
}
|
||
|
|
if (value & REG_MCMDR_RXON) {
|
||
|
|
- emc->rx_active = true;
|
||
|
|
+ emc_enable_rx_and_flush(emc);
|
||
|
|
} else {
|
||
|
|
emc_halt_rx(emc, 0);
|
||
|
|
}
|
||
|
|
@@ -743,8 +742,7 @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
|
||
|
|
break;
|
||
|
|
case REG_RSDR:
|
||
|
|
if (emc->regs[REG_MCMDR] & REG_MCMDR_RXON) {
|
||
|
|
- emc->rx_active = true;
|
||
|
|
- emc_try_receive_next_packet(emc);
|
||
|
|
+ emc_enable_rx_and_flush(emc);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case REG_MIIDA:
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|