From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: "Aurelien Jarno" <aurelien@aurel32.net>,
qemu-block@nongnu.org, "Gerd Hoffmann" <kraxel@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Andreas Färber" <afaerber@suse.de>,
"Jason Wang" <jasowang@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Yongbok Kim" <yongbok.kim@mips.com>,
"Fam Zheng" <famz@redhat.com>, "Max Reitz" <mreitz@redhat.com>,
"Kevin Wolf" <kwolf@redhat.com>,
"Hervé Poussineau" <hpoussin@reactos.org>,
"Laurent Vivier" <laurent@vivier.eu>
Subject: [Qemu-devel] [RFC 13/13] dp8393x: fix receiving buffer exhaustion
Date: Fri, 8 Jun 2018 22:05:58 +0200 [thread overview]
Message-ID: <20180608200558.386-14-laurent@vivier.eu> (raw)
In-Reply-To: <20180608200558.386-1-laurent@vivier.eu>
The card is not able to exit from exhaustion state, because
while the drive consumes the buffers, the RRP is incremented
(when the driver clears the ISR RBE bit), so it stays equal
to RWP, and while RRP == RWP, the card thinks it is always
in exhaustion state. So the driver consumes all the buffers,
but the card cannot receive new ones.
This patch fixes the problem by not incrementing RRP when
the driver clears the ISR RBE bit.
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
hw/net/dp8393x.c | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 40e5f8257b..fd0f6cf2a0 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -314,7 +314,7 @@ static void dp8393x_do_load_cam(dp8393xState *s)
dp8393x_update_irq(s);
}
-static void dp8393x_do_read_rra(dp8393xState *s)
+static void dp8393x_do_read_rra(dp8393xState *s, int next)
{
int width, size;
@@ -333,19 +333,20 @@ static void dp8393x_do_read_rra(dp8393xState *s)
s->regs[SONIC_CRBA0], s->regs[SONIC_CRBA1],
s->regs[SONIC_RBWC0], s->regs[SONIC_RBWC1]);
- /* Go to next entry */
- s->regs[SONIC_RRP] += size;
+ if (next) {
+ /* Go to next entry */
+ s->regs[SONIC_RRP] += size;
- /* Handle wrap */
- if (s->regs[SONIC_RRP] == s->regs[SONIC_REA]) {
- s->regs[SONIC_RRP] = s->regs[SONIC_RSA];
- }
+ /* Handle wrap */
+ if (s->regs[SONIC_RRP] == s->regs[SONIC_REA]) {
+ s->regs[SONIC_RRP] = s->regs[SONIC_RSA];
+ }
- /* Check resource exhaustion */
- if (s->regs[SONIC_RRP] == s->regs[SONIC_RWP])
- {
- s->regs[SONIC_ISR] |= SONIC_ISR_RBE;
- dp8393x_update_irq(s);
+ /* Check resource exhaustion */
+ if (s->regs[SONIC_RRP] == s->regs[SONIC_RWP]) {
+ s->regs[SONIC_ISR] |= SONIC_ISR_RBE;
+ dp8393x_update_irq(s);
+ }
}
/* Done */
@@ -559,7 +560,7 @@ static void dp8393x_do_command(dp8393xState *s, uint16_t command)
if (command & SONIC_CR_RST)
dp8393x_do_software_reset(s);
if (command & SONIC_CR_RRRA)
- dp8393x_do_read_rra(s);
+ dp8393x_do_read_rra(s, 1);
if (command & SONIC_CR_LCAM)
dp8393x_do_load_cam(s);
}
@@ -650,7 +651,7 @@ static void dp8393x_write(void *opaque, hwaddr addr, uint64_t data,
data &= s->regs[reg];
s->regs[reg] &= ~data;
if (data & SONIC_ISR_RBE) {
- dp8393x_do_read_rra(s);
+ dp8393x_do_read_rra(s, 0);
}
dp8393x_update_irq(s);
if (dp8393x_can_receive(s->nic->ncs)) {
@@ -852,7 +853,7 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf,
if (s->regs[SONIC_RCR] & SONIC_RCR_LPKT) {
/* Read next RRA */
- dp8393x_do_read_rra(s);
+ dp8393x_do_read_rra(s, 1);
}
}
--
2.14.4
next prev parent reply other threads:[~2018-06-08 20:07 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-08 20:05 [Qemu-devel] [RFC 00/13] hw/m68k: add Apple Machintosh Quadra 800 machine Laurent Vivier
2018-06-08 20:05 ` [Qemu-devel] [RFC 01/13] hw/m68k: add via support Laurent Vivier
2018-06-09 10:01 ` Mark Cave-Ayland
2018-06-09 15:48 ` Mark Cave-Ayland
2018-06-10 8:22 ` Laurent Vivier
2018-06-08 20:05 ` [Qemu-devel] [RFC 02/13] ADB: VIA probes ADB bus when it is idle Laurent Vivier
2018-06-08 20:05 ` [Qemu-devel] [RFC 03/13] escc: introduce a selector for the register bit Laurent Vivier
2018-06-09 10:05 ` Mark Cave-Ayland
2018-06-08 20:05 ` [Qemu-devel] [RFC 04/13] hw/m68k: add video card Laurent Vivier
2018-06-09 10:14 ` Mark Cave-Ayland
2018-06-08 20:05 ` [Qemu-devel] [RFC 05/13] hw/m68k: Apple Sound Chip (ASC) emulation Laurent Vivier
2018-06-08 20:05 ` [Qemu-devel] [RFC 06/13] ESP: add pseudo-DMA as used by Macintosh Laurent Vivier
2018-06-09 8:57 ` Hervé Poussineau
2018-06-09 10:19 ` Mark Cave-Ayland
2018-06-08 20:05 ` [Qemu-devel] [RFC 07/13] hw/m68k: add Nubus support Laurent Vivier
2018-06-08 20:05 ` [Qemu-devel] [RFC 08/13] hw/m68k: add a dummy SWIM floppy controller Laurent Vivier
2018-06-08 20:05 ` [Qemu-devel] [RFC 09/13] hw/m68k: define Macintosh Quadra 800 Laurent Vivier
2018-06-09 10:24 ` Mark Cave-Ayland
2018-06-08 20:05 ` [Qemu-devel] [RFC 10/13] dp8393x: fix dp8393x_receive Laurent Vivier
2018-06-09 8:47 ` Hervé Poussineau
2018-06-08 20:05 ` [Qemu-devel] [RFC 11/13] dp8393x: manage big endian bus Laurent Vivier
2018-06-09 8:55 ` Hervé Poussineau
2018-06-09 18:25 ` Thomas Huth
2018-06-08 20:05 ` [Qemu-devel] [RFC 12/13] dp8393x: put DMA temp buffer in the state, not in the stack Laurent Vivier
2018-06-09 8:55 ` Hervé Poussineau
2018-06-09 18:36 ` Thomas Huth
2018-06-08 20:05 ` Laurent Vivier [this message]
2018-06-09 8:55 ` [Qemu-devel] [RFC 13/13] dp8393x: fix receiving buffer exhaustion Hervé Poussineau
2018-06-08 20:34 ` [Qemu-devel] [RFC 00/13] hw/m68k: add Apple Machintosh Quadra 800 machine no-reply
2018-06-09 3:26 ` Philippe Mathieu-Daudé
2018-06-09 8:34 ` Laurent Vivier
2018-06-09 14:25 ` Philippe Mathieu-Daudé
2018-06-09 18:14 ` Thomas Huth
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=20180608200558.386-14-laurent@vivier.eu \
--to=laurent@vivier.eu \
--cc=afaerber@suse.de \
--cc=aurelien@aurel32.net \
--cc=dgilbert@redhat.com \
--cc=famz@redhat.com \
--cc=hpoussin@reactos.org \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=yongbok.kim@mips.com \
/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).