Message ID | 9c3243048ebb89a2af674847c0570d0c84cc3e79.1579474761.git.fthain@telegraphics.com.au (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fixes for DP8393X SONIC device emulation | expand |
On 1/19/20 11:59 PM, Finn Thain wrote: > According to the datasheet, section 3.4.4, "in 32-bit mode ... the SONIC > always writes long words". > > Therefore, use the same technique for the 'in_use' field that is used > everywhere else, and write the full long word. > > Signed-off-by: Finn Thain <fthain@telegraphics.com.au> > Tested-by: Laurent Vivier <laurent@vivier.eu> > --- > Changed since v1: > - Use existing 'address' variable rather than declare a new one. > > Laurent tells me that a similar clean-up has been tried before. > He referred me to commit c744cf7879 ("dp8393x: fix dp8393x_receive()") > and commit 409b52bfe1 ("net/dp8393x: correctly reset in_use field"). > I believe the underlying issue has been fixed by the preceding patch, > as this no longer breaks NetBSD 5.1. > --- > hw/net/dp8393x.c | 17 ++++++----------- > 1 file changed, 6 insertions(+), 11 deletions(-) > > diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c > index b2fd44bc2f..2d2ace2549 100644 > --- a/hw/net/dp8393x.c > +++ b/hw/net/dp8393x.c > @@ -776,8 +776,6 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf, > return -1; > } > > - /* XXX: Check byte ordering */ > - > /* Check for EOL */ > if (s->regs[SONIC_LLFA] & SONIC_DESC_EOL) { > /* Are we still in resource exhaustion? */ > @@ -847,15 +845,12 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf, > /* EOL detected */ > s->regs[SONIC_ISR] |= SONIC_ISR_RDE; > } else { > - /* Clear in_use, but it is always 16bit wide */ > - int offset = dp8393x_crda(s) + sizeof(uint16_t) * 6 * width; > - if (s->big_endian && width == 2) { > - /* we need to adjust the offset of the 16bit field */ > - offset += sizeof(uint16_t); > - } > - s->data[0] = 0; > - address_space_rw(&s->as, offset, MEMTXATTRS_UNSPECIFIED, > - (uint8_t *)s->data, sizeof(uint16_t), 1); > + /* Clear in_use */ > + size = sizeof(uint16_t) * width; > + address = dp8393x_crda(s) + sizeof(uint16_t) * 6 * width; > + dp8393x_put(s, width, 0, 0); > + address_space_rw(&s->as, address, MEMTXATTRS_UNSPECIFIED, > + (uint8_t *)s->data, size, 1); > s->regs[SONIC_CRDA] = s->regs[SONIC_LLFA]; > s->regs[SONIC_ISR] |= SONIC_ISR_PKTRX; > s->regs[SONIC_RSC] = (s->regs[SONIC_RSC] & 0xff00) | (((s->regs[SONIC_RSC] & 0x00ff) + 1) & 0x00ff); > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c index b2fd44bc2f..2d2ace2549 100644 --- a/hw/net/dp8393x.c +++ b/hw/net/dp8393x.c @@ -776,8 +776,6 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf, return -1; } - /* XXX: Check byte ordering */ - /* Check for EOL */ if (s->regs[SONIC_LLFA] & SONIC_DESC_EOL) { /* Are we still in resource exhaustion? */ @@ -847,15 +845,12 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf, /* EOL detected */ s->regs[SONIC_ISR] |= SONIC_ISR_RDE; } else { - /* Clear in_use, but it is always 16bit wide */ - int offset = dp8393x_crda(s) + sizeof(uint16_t) * 6 * width; - if (s->big_endian && width == 2) { - /* we need to adjust the offset of the 16bit field */ - offset += sizeof(uint16_t); - } - s->data[0] = 0; - address_space_rw(&s->as, offset, MEMTXATTRS_UNSPECIFIED, - (uint8_t *)s->data, sizeof(uint16_t), 1); + /* Clear in_use */ + size = sizeof(uint16_t) * width; + address = dp8393x_crda(s) + sizeof(uint16_t) * 6 * width; + dp8393x_put(s, width, 0, 0); + address_space_rw(&s->as, address, MEMTXATTRS_UNSPECIFIED, + (uint8_t *)s->data, size, 1); s->regs[SONIC_CRDA] = s->regs[SONIC_LLFA]; s->regs[SONIC_ISR] |= SONIC_ISR_PKTRX; s->regs[SONIC_RSC] = (s->regs[SONIC_RSC] & 0xff00) | (((s->regs[SONIC_RSC] & 0x00ff) + 1) & 0x00ff);