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) {
*** This bug has been marked as a duplicate of bug 197177 ***