Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Jan 2015 16:23:39 +0000
From:      bugzilla-noreply@freebsd.org
To:        freebsd-arm@FreeBSD.org
Subject:   [Bug 197177] Wrong registers used for linkup status and tx fifo empty status in mge driver on ramada 370 and armada xp socs
Message-ID:  <bug-197177-7@https.bugs.freebsd.org/bugzilla/>

next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=197177

            Bug ID: 197177
           Summary: Wrong registers used for linkup status and tx fifo
                    empty status in mge driver on ramada 370 and armada xp
                    socs
           Product: Base System
           Version: 11.0-CURRENT
          Hardware: arm
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: arm
          Assignee: freebsd-arm@FreeBSD.org
          Reporter: callthethunder@gmail.com

Registers used in mge driver are valid for marvell kirkwood family soc, but
they are not valid for armada xp and armada 370 socs.
As you can see in marvell documentation - registers are changed on armada 370
and armada xp.
kirkwood:
http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf
armada xp (same for armada 370):
http://www.marvell.com/embedded-processors/armada-xp/assets/ARMADA-XP-Functional-SpecDatasheet.pdf

So mge driver doesn't work in current distribution on armada xp and armada 370
SoCs.

So here is my diff.

diff --git a/sys/dev/mge/if_mge.c b/sys/dev/mge/if_mge.c
index c35dd04..e2305b8 100644
--- a/sys/dev/mge/if_mge.c
+++ b/sys/dev/mge/if_mge.c
@@ -1654,11 +1654,11 @@ mge_stop(struct mge_softc *sc)
        }

        /* Wait for end of transmission */
-       count = 0x100000;
-       while (count--) {
-               reg_val = MGE_READ(sc, MGE_PORT_STATUS);
-               if ( !(reg_val & MGE_STATUS_TX_IN_PROG) &&
-                   (reg_val & MGE_STATUS_TX_FIFO_EMPTY))
+       count = 0x100001;
+       while (--count) {
+               reg_val = MGE_READ(sc, MGE_ETH_PORT_STATUS);
+               if ( !(reg_val & MGE_ETH_STATUS_TX_IN_PROG) && 
+                    (reg_val & MGE_ETH_STATUS_TX_FIFO_EMPTY))
                        break;
                DELAY(100);
        }
diff --git a/sys/dev/mge/if_mgevar.h b/sys/dev/mge/if_mgevar.h
index 0ab28bf..7cfd20e 100644
--- a/sys/dev/mge/if_mgevar.h
+++ b/sys/dev/mge/if_mgevar.h
@@ -228,14 +228,21 @@ struct mge_softc {
 #define PORT_SERIAL_GMII_SPEED_1000    (1 << 23)
 #define PORT_SERIAL_MII_SPEED_100      (1 << 24)

-#define MGE_PORT_STATUS                        0x444
-#define MGE_STATUS_LINKUP              (1 << 1)
-#define MGE_STATUS_FULL_DUPLEX         (1 << 2)
-#define MGE_STATUS_FLOW_CONTROL                (1 << 3)
-#define MGE_STATUS_1000MB              (1 << 4)
-#define MGE_STATUS_100MB               (1 << 5)
-#define MGE_STATUS_TX_IN_PROG          (1 << 7)
-#define MGE_STATUS_TX_FIFO_EMPTY       (1 << 10)
+#define MGE_ETH_PORT_STATUS            0x444
+#define MGE_ETH_STATUS_RX_FIFO_EMPTY    (1 << 16)
+#define MGE_ETH_STATUS_TX_IN_PROG      (1 << 0)
+#define MGE_ETH_STATUS_TX_FIFO_EMPTY    (1 << 8)
+
+#define MGE_PORT_STATUS                        0xc10
+#define MGE_STATUS_LINKUP              (1 << 0)
+#define MGE_STATUS_GMII_SPEED          (1 << 1) /* 0 = 10/100 Mbps: Port speed
is 10 Mbps or 100 Mbps according to <MIISpeed>. 1 = 1000 Mbps: Port speed is
1000 Mbps. */
+#define MGE_STATUS_MII_SPEED           (1 << 2) /* 0 = 10: Port speed is 10
Mbps. 1 = 100: Port speed is 100 Mbps. */
+#define MGE_STATUS_FULL_DUPLEX         (1 << 3) /* 0 = half-duplex: Port is in
half-duplex mode. 1 = full-duplex: Port is in full-duplex mode. */
+#define MGE_STATUS_RX_FLOW_CONTROL     (1 << 4)
+#define MGE_STATUS_TX_FLOW_CONTROL     (1 << 5)
+#define MGE_STATUS_RX_PAUSE            (1 << 6)
+#define MGE_STATUS_TX_PAUSE            (1 << 7)
+#define MGE_STATUS_AUTONEG_DONE                (1 << 11)

 #define MGE_TX_QUEUE_CMD       0x448
 #define MGE_ENABLE_TXQ         (1 << 0)


Maybe we need to check soc id in header file and alter definition for
registers? 
Can you add my changes to make possible usage of onchip ethernet controller on
armada xp soc?

-- 
You are receiving this mail because:
You are the assignee for the bug.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-197177-7>