| 1446 | } |
| 1447 | |
| 1448 | static void |
| 1449 | arge_init_locked(struct arge_softc *sc) |
| 1450 | { |
| 1451 | struct ifnet *ifp = sc->arge_ifp; |
| 1452 | struct mii_data *mii; |
| 1453 | |
| 1454 | ARGE_LOCK_ASSERT(sc); |
| 1455 | |
| 1456 | ARGEDEBUG(sc, ARGE_DBG_RESET, "%s: called\n", __func__); |
| 1457 | |
| 1458 | if ((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) |
| 1459 | return; |
| 1460 | |
| 1461 | ARGEDEBUG(sc, ARGE_DBG_RESET, "%s: init'ing\n", __func__); |
| 1462 | |
| 1463 | /* Init circular RX list. */ |
| 1464 | if (arge_rx_ring_init(sc) != 0) { |
| 1465 | device_printf(sc->arge_dev, |
| 1466 | "initialization failed: no memory for rx buffers\n"); |
| 1467 | arge_stop(sc); |
| 1468 | return; |
| 1469 | } |
| 1470 | |
| 1471 | /* Init tx descriptors. */ |
| 1472 | arge_tx_ring_init(sc); |
| 1473 | |
| 1474 | /* Restart DMA */ |
| 1475 | arge_reset_dma(sc); |
| 1476 | |
| 1477 | if (sc->arge_miibus) { |
| 1478 | mii = device_get_softc(sc->arge_miibus); |
| 1479 | mii_mediachg(mii); |
| 1480 | } |
| 1481 | else { |
| 1482 | /* |
| 1483 | * Sun always shines over multiPHY interface |
| 1484 | */ |
| 1485 | sc->arge_link_status = 1; |
| 1486 | } |
| 1487 | |
| 1488 | ifp->if_drv_flags |= IFF_DRV_RUNNING; |
| 1489 | ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; |
| 1490 | |
| 1491 | if (sc->arge_miibus) { |
| 1492 | callout_reset(&sc->arge_stat_callout, hz, arge_tick, sc); |
| 1493 | arge_update_link_locked(sc); |
| 1494 | } |
| 1495 | |
| 1496 | ARGEDEBUG(sc, ARGE_DBG_RESET, "%s: desc ring; TX=0x%x, RX=0x%x\n", |
| 1497 | __func__, |
| 1498 | ARGE_TX_RING_ADDR(sc, 0), |
| 1499 | ARGE_RX_RING_ADDR(sc, 0)); |
| 1500 | |
| 1501 | ARGE_WRITE(sc, AR71XX_DMA_TX_DESC, ARGE_TX_RING_ADDR(sc, 0)); |
| 1502 | ARGE_WRITE(sc, AR71XX_DMA_RX_DESC, ARGE_RX_RING_ADDR(sc, 0)); |
| 1503 | |
| 1504 | /* Start listening */ |
| 1505 | ARGE_WRITE(sc, AR71XX_DMA_RX_CONTROL, DMA_RX_CONTROL_EN); |
no test coverage detected