[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 09/14] dp8393x: Use long-word-aligned RRA pointers in 32-b

From: Philippe Mathieu-Daudé
Subject: Re: [PATCH v3 09/14] dp8393x: Use long-word-aligned RRA pointers in 32-bit mode
Date: Tue, 28 Jan 2020 12:13:34 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2

On 1/19/20 11:59 PM, Finn Thain wrote:
Section 3.4.1 of the datasheet says,

     The alignment of the RRA is confined to either word or long word
     boundaries, depending upon the data width mode. In 16-bit mode,
     the RRA must be aligned to a word boundary (A0 is always zero)
     and in 32-bit mode, the RRA is aligned to a long word boundary
     (A0 and A1 are always zero).

This constraint has been implemented for 16-bit mode; implement it
for 32-bit mode too.

Signed-off-by: Finn Thain <address@hidden>
Tested-by: Laurent Vivier <address@hidden>
  hw/net/dp8393x.c | 8 ++++++--
  1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 947ceef37c..b052e2c854 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -663,12 +663,16 @@ static void dp8393x_write(void *opaque, hwaddr addr, 
uint64_t data,
-        /* Ignore least significant bit */
+        /* The guest is required to store aligned pointers here */
          case SONIC_RSA:
          case SONIC_REA:
          case SONIC_RRP:
          case SONIC_RWP:
-            s->regs[reg] = val & 0xfffe;
+            if (s->regs[SONIC_DCR] & SONIC_DCR_DW) {
+                s->regs[reg] = val & 0xfffc;
+            } else {
+                s->regs[reg] = val & 0xfffe;
+            }
          /* Invert written value for some registers */
          case SONIC_CRCT:

Reviewed-by: Philippe Mathieu-Daudé <address@hidden>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]