[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 07/13] dp8393x: Don't stop reception upon RBE interrupt assert
From: |
Finn Thain |
Subject: |
[PATCH v2 07/13] dp8393x: Don't stop reception upon RBE interrupt assertion |
Date: |
Fri, 20 Dec 2019 15:17:46 +1100 |
Section 5.4.7 of the datasheet explains that the RBE interrupt is an
"early warning". It indicates that the last RBA is still available to
receive a packet. It doesn't imply actual receive buffer exhaustion.
This is an important distinction because Linux will not check and clear
the RBE interrupt until it receives another packet. But that won't
happen if can_receive returns false. So the SONIC becomes deaf (until
reset).
Fix this with a new flag to indicate actual receive buffer exhaustion.
Signed-off-by: Finn Thain <address@hidden>
---
hw/net/dp8393x.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 9d2c205dce..46b92ebf65 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -158,6 +158,7 @@ typedef struct dp8393xState {
/* Hardware */
uint8_t it_shift;
bool big_endian;
+ bool last_rba_is_full;
qemu_irq irq;
#ifdef DEBUG_SONIC
int irq_level;
@@ -314,6 +315,12 @@ static void dp8393x_do_read_rra(dp8393xState *s)
{
int width, size;
+ /* Already on the last RBA? */
+ s->last_rba_is_full = s->regs[SONIC_ISR] & SONIC_ISR_RBE;
+ if (s->last_rba_is_full) {
+ return;
+ }
+
/* Read memory */
width = (s->regs[SONIC_DCR] & SONIC_DCR_DW) ? 2 : 1;
size = sizeof(uint16_t) * 4 * width;
@@ -337,7 +344,7 @@ static void dp8393x_do_read_rra(dp8393xState *s)
s->regs[SONIC_RRP] = s->regs[SONIC_RSA];
}
- /* Check resource exhaustion */
+ /* Warn the host if this entry is the last one */
if (s->regs[SONIC_RRP] == s->regs[SONIC_RWP])
{
s->regs[SONIC_ISR] |= SONIC_ISR_RBE;
@@ -706,8 +713,9 @@ static int dp8393x_can_receive(NetClientState *nc)
if (!(s->regs[SONIC_CR] & SONIC_CR_RXEN))
return 0;
- if (s->regs[SONIC_ISR] & SONIC_ISR_RBE)
+ if (s->last_rba_is_full) {
return 0;
+ }
return 1;
}
--
2.23.0
- [PATCH v2 00/13] Fixes for DP8393X SONIC device emulation, Finn Thain, 2019/12/19
- [PATCH v2 02/13] dp8393x: Clean up endianness hacks, Finn Thain, 2019/12/19
- [PATCH v2 04/13] dp8393x: Update LLFA and CRDA registers from rx descriptor, Finn Thain, 2019/12/19
- [PATCH v2 05/13] dp8393x: Clear RRRA command register bit only when appropriate, Finn Thain, 2019/12/19
- [PATCH v2 08/13] dp8393x: Don't clobber packet checksum, Finn Thain, 2019/12/19
- [PATCH v2 09/13] dp8393x: Use long-word-aligned RRA pointers in 32-bit mode, Finn Thain, 2019/12/19
- [PATCH v2 03/13] dp8393x: Have dp8393x_receive() return the packet size, Finn Thain, 2019/12/19
- [PATCH v2 06/13] dp8393x: Implement packet size limit and RBAE interrupt, Finn Thain, 2019/12/19
- [PATCH v2 10/13] dp8393x: Pad frames to word or long word boundary, Finn Thain, 2019/12/19
- [PATCH v2 07/13] dp8393x: Don't stop reception upon RBE interrupt assertion,
Finn Thain <=
- [PATCH v2 11/13] dp8393x: Clear descriptor in_use field when necessary, Finn Thain, 2019/12/19
- [PATCH v2 12/13] dp8393x: Always update RRA pointers and sequence numbers, Finn Thain, 2019/12/19
- [PATCH v2 01/13] dp8393x: Mask EOL bit from descriptor addresses, Finn Thain, 2019/12/19
- [PATCH v2 13/13] dp8393x: Correctly advance RRP, Finn Thain, 2019/12/19
- Re: [PATCH v2 00/13] Fixes for DP8393X SONIC device emulation, Laurent Vivier, 2019/12/20