On 28.06.2018 01:23, Laurent Vivier wrote: > This is needed by Quadra 800, this card can run on little-endian > or big-endian bus. > > Signed-off-by: Laurent Vivier <laur...@vivier.eu> > Tested-by: Hervé Poussineau <hpous...@reactos.org> > --- > hw/net/dp8393x.c | 88 > ++++++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 57 insertions(+), 31 deletions(-) > > diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c > index f2d2ce344c..62adff9ba3 100644 > --- a/hw/net/dp8393x.c > +++ b/hw/net/dp8393x.c > @@ -150,6 +150,7 @@ typedef struct dp8393xState { > > /* Hardware */ > uint8_t it_shift; > + bool big_endian; > qemu_irq irq; > #ifdef DEBUG_SONIC > int irq_level; > @@ -220,6 +221,29 @@ static uint32_t dp8393x_wt(dp8393xState *s) > return s->regs[SONIC_WT1] << 16 | s->regs[SONIC_WT0]; > } > > +static uint16_t dp8393x_get(dp8393xState *s, int width, uint16_t *base, > + int offset) > +{ > + uint16_t val; > + > + if (s->big_endian) { > + val = be16_to_cpu(base[offset * width + width - 1]); > + } else { > + val = le16_to_cpu(base[offset * width]); > + } > + return val; > +} > + > +static void dp8393x_put(dp8393xState *s, int width, uint16_t *base, int > offset, > + uint16_t val) > +{ > + if (s->big_endian) { > + base[offset * width + width - 1] = cpu_to_be16(val); > + } else { > + base[offset * width] = cpu_to_le16(val); > + } > +} > + > static void dp8393x_update_irq(dp8393xState *s) > { > int level = (s->regs[SONIC_IMR] & s->regs[SONIC_ISR]) ? 1 : 0; > @@ -251,12 +275,12 @@ static void dp8393x_do_load_cam(dp8393xState *s) > /* Fill current entry */ > address_space_rw(&s->as, dp8393x_cdp(s), > MEMTXATTRS_UNSPECIFIED, (uint8_t *)data, size, 0); > - s->cam[index][0] = data[1 * width] & 0xff; > - s->cam[index][1] = data[1 * width] >> 8; > - s->cam[index][2] = data[2 * width] & 0xff; > - s->cam[index][3] = data[2 * width] >> 8; > - s->cam[index][4] = data[3 * width] & 0xff; > - s->cam[index][5] = data[3 * width] >> 8; > + s->cam[index][0] = dp8393x_get(s, width, data, 1) & 0xff; > + s->cam[index][1] = dp8393x_get(s, width, data, 1) >> 8; > + s->cam[index][2] = dp8393x_get(s, width, data, 2) & 0xff; > + s->cam[index][3] = dp8393x_get(s, width, data, 2) >> 8; > + s->cam[index][4] = dp8393x_get(s, width, data, 3) & 0xff; > + s->cam[index][5] = dp8393x_get(s, width, data, 3) >> 8;
So if the device is used with a little endian bus, but on a big endian host, there is now an additional byte swap operation for all the values now, right? Was this a bug in the previous implementation? If so, it might be worth to mention that in the patch description? Thomas