--- sys/dev/mge/if_mge.c.orig	2010-06-13 22:28:53.000000000 +0900
+++ sys/dev/mge/if_mge.c	2010-06-19 15:34:22.787728912 +0900
@@ -626,7 +626,6 @@
 mge_attach(device_t dev)
 {
 	struct mge_softc *sc;
-	struct mii_softc *miisc;
 	struct ifnet *ifp;
 	uint8_t hwaddr[ETHER_ADDR_LEN];
 	int i, error ;
@@ -643,7 +642,7 @@
 
 	/* Get phy address from fdt */
 	if (fdt_get_phyaddr(sc->node, &sc->phyaddr) != 0)
-		return (ENXIO);
+		sc->phyaddr = -1;
 
 	/* Initialize mutexes */
 	mtx_init(&sc->transmit_lock, device_get_nameunit(dev), "mge TX lock", MTX_DEF);
@@ -674,6 +673,9 @@
 	sc->tx_ic_time = 768;
 	mge_add_sysctls(sc);
 
+	if (sc->phyaddr == -1)
+		sc->phyaddr = MGE_READ(sc, MGE_REG_PHYDEV);
+
 	/* Allocate network interface */
 	ifp = sc->ifp = if_alloc(IFT_ETHER);
 	if (ifp == NULL) {
@@ -716,8 +718,7 @@
 	sc->mii = device_get_softc(sc->miibus);
 
 	/* Tell the MAC where to find the PHY so autoneg works */
-	miisc = LIST_FIRST(&sc->mii->mii_phys);
-	MGE_WRITE(sc, MGE_REG_PHYDEV, miisc->mii_phy);
+	MGE_WRITE(sc, MGE_REG_PHYDEV, sc->phyaddr);
 
 	/* Attach interrupt handlers */
 	for (i = 0; i < 2; ++i) {
@@ -867,8 +868,7 @@
 	struct mge_softc *sc = arg;
 	struct mge_desc_wrapper *dw;
 	volatile uint32_t reg_val;
-	int i, count;
-
+	int i;
 
 	MGE_GLOBAL_LOCK_ASSERT(sc);
 
@@ -948,17 +948,6 @@
 	reg_val = MGE_READ(sc, MGE_PORT_SERIAL_CTRL);
 	reg_val |= PORT_SERIAL_ENABLE;
 	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)
-			break;
-		DELAY(100);
-		if (--count == 0) {
-			if_printf(sc->ifp, "Timeout on link-up\n");
-			break;
-		}
-	}
 
 	/* Setup interrupts coalescing */
 	mge_set_rxic(sc);
@@ -1489,8 +1478,8 @@
 
 	MGE_TRANSMIT_LOCK_ASSERT(sc);
 
-	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
-	    IFF_DRV_RUNNING)
+	if (IFM_SUBTYPE(sc->mii->mii_media_active) == IFM_NONE ||
+	    (ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
 		return;
 
 	for (;;) {

