Bug 197165 - Wrong linkup status register used for mge controller
Summary: Wrong linkup status register used for mge controller
Status: Closed DUPLICATE of bug 197177
Alias: None
Product: Base System
Classification: Unclassified
Component: arm (show other bugs)
Version: CURRENT
Hardware: arm Any
: --- Affects Only Me
Assignee: freebsd-arm (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-01-29 08:48 UTC by Alexander Zhigunov
Modified: 2015-01-29 16:29 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexander Zhigunov 2015-01-29 08:48:38 UTC
Hello!
I have a problem with mge driver on armada xp soc.
Board: RD-AXP-GP rev 1.0
SoC:   MV78460 B0
       running 4 CPUs
       Custom configuration
 
in file
sys/dev/mge/if_mge.c

	for (;;) {
		reg_val = MGE_READ(sc, MGE_PORT_STATUS);
		if (reg_val & MGE_STATUS_LINKUP)
			break;
		DELAY(100);
		if (--count == 0) {
			if_printf(sc->ifp, "Timeout on link-up\n");
			break;
		}
	}

#define MGE_PORT_STATUS			0x444
#define MGE_STATUS_LINKUP		(1 << 1)

For linkup status used bit 1 of MGE_PORT_STATUS, but according to marvel documentation the value of this bit in undefined. 
http://www.marvell.com/embedded-processors/armada-xp/assets/ARMADA-XP-Functional-SpecDatasheet.pdf
Serial Registers
Ethernet Port Status 0 (PS0) Register (i=0–3)
Offset: Port2: 0x00032444, Port3: 0x00036444, Port0: 0x00072444, Port1: 0x00076444 Offset Formula: 0x00072444+0x4000*(i%2)+floor((3-i) / 2)*0x40000 - 0x40000: where i (0-3) represents Port
Bit	Field		Type/InitVal	Description
31:17	Reserved	RO 
			0x0		Reserved

16	RxFIFOEmpty	RO 
			0x1		RX Fifo Empty
					When set to "1", indicates that the port Receive FIFO is empty.

15:9	Reserved	RO 
			0x0		Reserved

8	TxFIFOEmp	RO 
			0x0		TX Fifo Empty
					When set to "1", indicates that the port Transmit FIFO is empty.

7:1	Reserved	RO 
			0x0		Reserved

0	TxInProg	RO 
			0x0		Transmit in Progress
					When equal to "1", indicates that the port’s transmitter is in an active transmission state.

You need to use one of MAC Registers instead.
According to this documentation linkup status is bit 0 of Port Status Register.
Port Status Register0 (i=0–3)
Offset: Port2: 0x00032C10, Port3: 0x00036C10, Port0: 0x00072C10, Port1: 0x00076C10 Offset Formula: 0x00072C10+0x4000*(i%2)+floor((3-i) / 2)*0x40000 - 0x40000: where i (0-3) represents Port
Bit	Field	Type/InitVal	Description
0	LinkUp	RO 
		0x0		Indicates the port link status. 
				0 = False: Link is down.
				1 = True: Link is up.

It works in case of my board.

diff --git a/sys/dev/mge/if_mge.c b/sys/dev/mge/if_mge.c
--- a/sys/dev/mge/if_mge.c
+++ b/sys/dev/mge/if_mge.c
@@ -965,8 +965,8 @@ mge_init_locked(void *arg)
        MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL, reg_val);
        count = 0x100000;
        for (;;) {
-        reg_val = MGE_READ(sc, MGE_PORT_STATUS);
-        if (reg_val & MGE_STATUS_LINKUP)
+               reg_val = MGE_READ(sc, 0xc10);
+               if (reg_val & 1)
                        break;
                DELAY(100);
                if (--count == 0) {
Comment 1 Alexander Zhigunov 2015-01-29 16:29:33 UTC

*** This bug has been marked as a duplicate of bug 197177 ***