Lines Matching refs:sc
128 dme_read_reg(struct dme_softc *sc, uint8_t reg) in dme_read_reg() argument
132 bus_space_write_1(sc->dme_tag, sc->dme_handle, CMD_ADDR, reg); in dme_read_reg()
133 bus_space_barrier(sc->dme_tag, sc->dme_handle, CMD_ADDR, 1, in dme_read_reg()
137 return bus_space_read_1(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_read_reg()
141 dme_write_reg(struct dme_softc *sc, uint8_t reg, uint8_t value) in dme_write_reg() argument
145 bus_space_write_1(sc->dme_tag, sc->dme_handle, CMD_ADDR, reg); in dme_write_reg()
146 bus_space_barrier(sc->dme_tag, sc->dme_handle, CMD_ADDR, 1, in dme_write_reg()
150 bus_space_write_1(sc->dme_tag, sc->dme_handle, DATA_ADDR, value); in dme_write_reg()
151 bus_space_barrier(sc->dme_tag, sc->dme_handle, DATA_ADDR, 1, in dme_write_reg()
156 dme_reset(struct dme_softc *sc) in dme_reset() argument
161 dme_write_reg(sc, DME_NCR, NCR_RST | NCR_LBK_MAC); in dme_reset()
163 ncr = dme_read_reg(sc, DME_NCR); in dme_reset()
165 device_printf(sc->dme_dev, "device did not complete first reset\n"); in dme_reset()
168 dme_write_reg(sc, DME_NCR, 0); in dme_reset()
169 dme_write_reg(sc, DME_NCR, NCR_RST | NCR_LBK_MAC); in dme_reset()
171 ncr = dme_read_reg(sc, DME_NCR); in dme_reset()
173 device_printf(sc->dme_dev, "device did not complete second reset\n"); in dme_reset()
176 sc->dme_txbusy = 0; in dme_reset()
177 sc->dme_txready = 0; in dme_reset()
180 sc->dme_ifp ? sc->dme_ifp->if_drv_flags : 0, in dme_reset()
181 sc->dme_txbusy, sc->dme_txready); in dme_reset()
212 dme_get_macaddr(struct dme_softc *sc) in dme_get_macaddr() argument
220 device_get_name(sc->dme_dev), in dme_get_macaddr()
221 device_get_unit(sc->dme_dev)); in dme_get_macaddr()
225 if (!dme_parse_macaddr(var, sc->dme_macaddr)) { in dme_get_macaddr()
226 device_printf(sc->dme_dev, "MAC address: %s (hints)\n", var); in dme_get_macaddr()
236 sc->dme_macaddr[i] = dme_read_reg(sc, DME_PAR(i)); in dme_get_macaddr()
238 device_printf(sc->dme_dev, "MAC address %6D (existing)\n", in dme_get_macaddr()
239 sc->dme_macaddr, ":"); in dme_get_macaddr()
243 dme_config(struct dme_softc *sc) in dme_config() argument
248 dme_write_reg(sc, DME_IMR, IMR_PAR); in dme_config()
251 dme_write_reg(sc, DME_GPCR, 1); in dme_config()
252 dme_write_reg(sc, DME_GPR, 0); in dme_config()
259 if (sc->dme_rev == DME_CHIP_DM9000B) { in dme_config()
260 dme_miibus_writereg(sc->dme_dev, DME_INT_PHY, MII_BMCR, in dme_config()
262 dme_miibus_writereg(sc->dme_dev, DME_INT_PHY, MII_DME_DSPCR, in dme_config()
268 reg = dme_miibus_readreg(sc->dme_dev, DME_INT_PHY, MII_BMCR); in dme_config()
277 dme_write_reg(sc, DME_NCR, NCR_LBK_NORMAL); in dme_config()
279 dme_write_reg(sc, DME_TCR, 0); in dme_config()
281 dme_write_reg(sc, DME_BPTR, BPTR_BPHW(3) | BPTR_JPT(0x0f)); in dme_config()
283 dme_write_reg(sc, DME_FCTR, FCTR_HWOT(0x3) | FCTR_LWOT(0x08)); in dme_config()
285 dme_write_reg(sc, DME_FCR, 0xff); in dme_config()
287 dme_write_reg(sc, DME_SMCR, 0); in dme_config()
289 dme_write_reg(sc, DME_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END); in dme_config()
291 dme_write_reg(sc, DME_ISR, 0xff); in dme_config()
294 dme_write_reg(sc, DME_MAR(i), 0xff); in dme_config()
297 dme_write_reg(sc, DME_PAR(i), sc->dme_macaddr[i]); in dme_config()
299 dme_write_reg(sc, DME_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN); in dme_config()
302 dme_write_reg(sc, DME_IMR, IMR_PAR | IMR_PRI | IMR_PTI); in dme_config()
306 dme_prepare(struct dme_softc *sc) in dme_prepare() argument
312 DME_ASSERT_LOCKED(sc); in dme_prepare()
314 KASSERT(sc->dme_txready == 0, in dme_prepare()
317 ifp = sc->dme_ifp; in dme_prepare()
322 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, sc->dme_txready); in dme_prepare()
330 bus_space_write_1(sc->dme_tag, sc->dme_handle, CMD_ADDR, DME_MWCMD); in dme_prepare()
347 bus_space_write_multi_2(sc->dme_tag, sc->dme_handle, in dme_prepare()
350 bus_space_write_multi_1(sc->dme_tag, sc->dme_handle, in dme_prepare()
355 if (total_len % (sc->dme_bits >> 3) != 0) in dme_prepare()
358 sc->dme_txlen = total_len; in dme_prepare()
359 sc->dme_txready = 1; in dme_prepare()
361 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, sc->dme_txready); in dme_prepare()
367 dme_transmit(struct dme_softc *sc) in dme_transmit() argument
370 DME_ASSERT_LOCKED(sc); in dme_transmit()
371 KASSERT(sc->dme_txready, ("transmit without txready")); in dme_transmit()
373 dme_write_reg(sc, DME_TXPLL, sc->dme_txlen & 0xff); in dme_transmit()
374 dme_write_reg(sc, DME_TXPLH, (sc->dme_txlen >> 8) & 0xff ); in dme_transmit()
377 dme_read_reg(sc, DME_ISR); in dme_transmit()
379 dme_write_reg(sc, DME_TCR, TCR_TXREQ); in dme_transmit()
381 sc->dme_txready = 0; in dme_transmit()
382 sc->dme_txbusy = 1; in dme_transmit()
384 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, sc->dme_txready); in dme_transmit()
391 struct dme_softc *sc; in dme_start_locked() local
393 sc = ifp->if_softc; in dme_start_locked()
394 DME_ASSERT_LOCKED(sc); in dme_start_locked()
401 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, sc->dme_txready); in dme_start_locked()
402 KASSERT(sc->dme_txbusy == 0 || sc->dme_txready == 0, in dme_start_locked()
405 dme_prepare(sc); in dme_start_locked()
407 if (sc->dme_txbusy == 0) { in dme_start_locked()
409 dme_transmit(sc); in dme_start_locked()
410 dme_prepare(sc); /* Prepare next one */ in dme_start_locked()
416 if (sc->dme_txready != 0) in dme_start_locked()
423 struct dme_softc *sc; in dme_start() local
425 sc = ifp->if_softc; in dme_start()
426 DME_LOCK(sc); in dme_start()
428 DME_UNLOCK(sc); in dme_start()
432 dme_stop(struct dme_softc *sc) in dme_stop() argument
436 DME_ASSERT_LOCKED(sc); in dme_stop()
438 dme_write_reg(sc, DME_RCR, 0x00); in dme_stop()
440 dme_write_reg(sc, DME_IMR, 0x00); in dme_stop()
442 callout_stop(&sc->dme_tick_ch); in dme_stop()
444 ifp = sc->dme_ifp; in dme_stop()
448 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, sc->dme_txready); in dme_stop()
449 sc->dme_txbusy = 0; in dme_stop()
450 sc->dme_txready = 0; in dme_stop()
454 dme_rxeof(struct dme_softc *sc) in dme_rxeof() argument
460 DME_ASSERT_LOCKED(sc); in dme_rxeof()
462 ifp = sc->dme_ifp; in dme_rxeof()
465 (void)dme_read_reg(sc, DME_MRCMDX); in dme_rxeof()
466 i = bus_space_read_1(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
467 switch(bus_space_read_1(sc->dme_tag, sc->dme_handle, DATA_ADDR)) { in dme_rxeof()
478 i = dme_read_reg(sc, DME_MRRL); in dme_rxeof()
479 i |= dme_read_reg(sc, DME_MRRH) << 8; in dme_rxeof()
481 len = dme_read_reg(sc, DME_ROCR); in dme_rxeof()
483 bus_space_write_1(sc->dme_tag, sc->dme_handle, CMD_ADDR, DME_MRCMD); in dme_rxeof()
485 switch(sc->dme_bits) { in dme_rxeof()
487 i = bus_space_read_1(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
489 i |= bus_space_read_1(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
491 len = bus_space_read_1(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
492 len |= bus_space_read_1(sc->dme_tag, sc->dme_handle, in dme_rxeof()
496 bus_space_read_2(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
497 len = bus_space_read_2(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
503 reg = bus_space_read_4(sc->dme_tag, sc->dme_handle, DATA_ADDR); in dme_rxeof()
527 bus_space_read_multi_2(sc->dme_tag, sc->dme_handle, DATA_ADDR, in dme_rxeof()
530 bus_space_read_multi_1(sc->dme_tag, sc->dme_handle, DATA_ADDR, in dme_rxeof()
534 DME_UNLOCK(sc); in dme_rxeof()
536 DME_LOCK(sc); in dme_rxeof()
544 struct dme_softc *sc; in dme_tick() local
547 sc = (struct dme_softc *)arg; in dme_tick()
550 mii = device_get_softc(sc->dme_miibus); in dme_tick()
553 callout_reset(&sc->dme_tick_ch, hz, dme_tick, sc); in dme_tick()
559 struct dme_softc *sc; in dme_intr() local
562 sc = (struct dme_softc *)arg; in dme_intr()
564 DME_LOCK(sc); in dme_intr()
566 intr_status = dme_read_reg(sc, DME_ISR); in dme_intr()
567 dme_write_reg(sc, DME_ISR, intr_status); in dme_intr()
570 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, in dme_intr()
571 sc->dme_txready, intr_status); in dme_intr()
576 sc->dme_txbusy = 0; in dme_intr()
578 nsr = dme_read_reg(sc, DME_NSR); in dme_intr()
581 tx_status = dme_read_reg(sc, DME_TSR1); in dme_intr()
583 tx_status = dme_read_reg(sc, DME_TSR2); in dme_intr()
588 sc->dme_ifp->if_drv_flags, sc->dme_txbusy, in dme_intr()
589 sc->dme_txready, nsr); in dme_intr()
592 if (sc->dme_txready == 0) in dme_intr()
593 dme_prepare(sc); in dme_intr()
595 if (sc->dme_txready != 0) { in dme_intr()
597 dme_transmit(sc); in dme_intr()
599 dme_prepare(sc); in dme_intr()
604 if (sc->dme_txready != 0) in dme_intr()
605 sc->dme_ifp->if_drv_flags |= IFF_DRV_OACTIVE; in dme_intr()
611 while (dme_rxeof(sc) == 0) in dme_intr()
614 DME_UNLOCK(sc); in dme_intr()
618 dme_setmode(struct dme_softc *sc) in dme_setmode() argument
625 struct dme_softc *sc; in dme_ioctl() local
630 sc = ifp->if_softc; in dme_ioctl()
639 DME_LOCK(sc); in dme_ioctl()
642 dme_init_locked(sc); in dme_ioctl()
646 dme_stop(sc); in dme_ioctl()
649 dme_setmode(sc); in dme_ioctl()
650 DME_UNLOCK(sc); in dme_ioctl()
654 mii = device_get_softc(sc->dme_miibus); in dme_ioctl()
664 static void dme_init_locked(struct dme_softc *sc) in dme_init_locked() argument
666 struct ifnet *ifp = sc->dme_ifp; in dme_init_locked()
668 DME_ASSERT_LOCKED(sc); in dme_init_locked()
673 dme_reset(sc); in dme_init_locked()
674 dme_config(sc); in dme_init_locked()
679 callout_reset(&sc->dme_tick_ch, hz, dme_tick, sc); in dme_init_locked()
685 struct dme_softc *sc = xcs; in dme_init() local
687 DME_LOCK(sc); in dme_init()
688 dme_init_locked(sc); in dme_init()
689 DME_UNLOCK(sc); in dme_init()
695 struct dme_softc *sc; in dme_ifmedia_upd() local
698 sc = ifp->if_softc; in dme_ifmedia_upd()
699 mii = device_get_softc(sc->dme_miibus); in dme_ifmedia_upd()
701 DME_LOCK(sc); in dme_ifmedia_upd()
703 DME_UNLOCK(sc); in dme_ifmedia_upd()
711 struct dme_softc *sc; in dme_ifmedia_sts() local
714 sc = ifp->if_softc; in dme_ifmedia_sts()
715 mii = device_get_softc(sc->dme_miibus); in dme_ifmedia_sts()
717 DME_LOCK(sc); in dme_ifmedia_sts()
721 DME_UNLOCK(sc); in dme_ifmedia_sts()
741 struct dme_softc *sc; in dme_attach() local
746 sc = device_get_softc(dev); in dme_attach()
747 sc->dme_dev = dev; in dme_attach()
751 mtx_init(&sc->dme_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in dme_attach()
753 callout_init_mtx(&sc->dme_tick_ch, &sc->dme_mtx, 0); in dme_attach()
756 sc->dme_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in dme_attach()
758 if (sc->dme_res == NULL) { in dme_attach()
765 sc->dme_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in dme_attach()
767 if (sc->dme_irq == NULL) { in dme_attach()
775 error = regulator_get_by_ofw_property(dev, 0, "vcc-supply", &sc->dme_vcc_regulator); in dme_attach()
777 error = regulator_enable(sc->dme_vcc_regulator); in dme_attach()
791 error = ofw_gpiobus_parse_gpios(dev, "reset-gpios", &sc->gpio_rset); in dme_attach()
794 sc->gpio_rset = NULL; in dme_attach()
799 if (sc->gpio_rset != NULL) { in dme_attach()
800 error = GPIO_PIN_SET(sc->gpio_rset->dev, sc->gpio_rset->pin, 0); in dme_attach()
803 sc->gpio_rset->pin, device_get_nameunit(sc->gpio_rset->dev)); in dme_attach()
807 error = GPIO_PIN_SETFLAGS(sc->gpio_rset->dev, sc->gpio_rset->pin, in dme_attach()
811 sc->gpio_rset->pin, device_get_nameunit(sc->gpio_rset->dev)); in dme_attach()
817 error = GPIO_PIN_SET(sc->gpio_rset->dev, sc->gpio_rset->pin, 1); in dme_attach()
820 sc->gpio_rset->pin, device_get_nameunit(sc->gpio_rset->dev)); in dme_attach()
828 sc->dme_tag = rman_get_bustag(sc->dme_res); in dme_attach()
829 sc->dme_handle = rman_get_bushandle(sc->dme_res); in dme_attach()
832 dme_reset(sc); in dme_attach()
835 switch((dme_read_reg(sc, DME_ISR) >> 6) & 0x03) { in dme_attach()
838 sc->dme_bits = 16; in dme_attach()
842 sc->dme_bits = 32; in dme_attach()
846 sc->dme_bits = 8; in dme_attach()
858 data = dme_read_reg(sc, DME_VIDH) << 8; in dme_attach()
859 data |= dme_read_reg(sc, DME_VIDL); in dme_attach()
863 data = dme_read_reg(sc, DME_PIDH) << 8; in dme_attach()
864 data |= dme_read_reg(sc, DME_PIDL); in dme_attach()
868 data = dme_read_reg(sc, DME_CHIPR); in dme_attach()
872 sc->dme_rev = data; in dme_attach()
874 device_printf(dev, "using %d-bit IO mode\n", sc->dme_bits); in dme_attach()
875 KASSERT(sc->dme_bits == 8, ("wrong io mode")); in dme_attach()
878 dme_get_macaddr(sc); in dme_attach()
881 dme_config(sc); in dme_attach()
883 ifp = sc->dme_ifp = if_alloc(IFT_ETHER); in dme_attach()
889 ifp->if_softc = sc; in dme_attach()
892 error = mii_attach(dev, &sc->dme_miibus, ifp, dme_ifmedia_upd, in dme_attach()
907 ether_ifattach(ifp, sc->dme_macaddr); in dme_attach()
909 error = bus_setup_intr(dev, sc->dme_irq, INTR_TYPE_NET | INTR_MPSAFE, in dme_attach()
910 NULL, dme_intr, sc, &sc->dme_intrhand); in dme_attach()
926 struct dme_softc *sc; in dme_detach() local
929 sc = device_get_softc(dev); in dme_detach()
930 KASSERT(mtx_initialized(&sc->dme_mtx), ("dme mutex not initialized")); in dme_detach()
932 ifp = sc->dme_ifp; in dme_detach()
935 DME_LOCK(sc); in dme_detach()
936 dme_stop(sc); in dme_detach()
937 DME_UNLOCK(sc); in dme_detach()
939 callout_drain(&sc->dme_tick_ch); in dme_detach()
942 if (sc->dme_miibus) in dme_detach()
943 device_delete_child(dev, sc->dme_miibus); in dme_detach()
946 if (sc->dme_vcc_regulator != 0) in dme_detach()
947 regulator_release(sc->dme_vcc_regulator); in dme_detach()
948 if (sc->dme_intrhand) in dme_detach()
949 bus_teardown_intr(dev, sc->dme_irq, sc->dme_intrhand); in dme_detach()
950 if (sc->dme_irq) in dme_detach()
951 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dme_irq); in dme_detach()
952 if (sc->dme_res) in dme_detach()
953 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->dme_res); in dme_detach()
958 mtx_destroy(&sc->dme_mtx); in dme_detach()
969 struct dme_softc *sc; in dme_miibus_readreg() local
976 sc = device_get_softc(dev); in dme_miibus_readreg()
979 dme_write_reg(sc, DME_EPAR, (phy << 6) | reg); in dme_miibus_readreg()
980 dme_write_reg(sc, DME_EPCR, EPCR_EPOS | EPCR_ERPRR); in dme_miibus_readreg()
984 if ((dme_read_reg(sc, DME_EPCR) & EPCR_ERRE) == 0) in dme_miibus_readreg()
990 dme_write_reg(sc, DME_EPCR, 0); in dme_miibus_readreg()
995 rval = (dme_read_reg(sc, DME_EPDRH) << 8) | dme_read_reg(sc, DME_EPDRL); in dme_miibus_readreg()
1002 struct dme_softc *sc; in dme_miibus_writereg() local
1009 sc = device_get_softc(dev); in dme_miibus_writereg()
1012 dme_write_reg(sc, DME_EPAR, (phy << 6) | reg); in dme_miibus_writereg()
1013 dme_write_reg(sc, DME_EPDRL, data & 0xFF); in dme_miibus_writereg()
1014 dme_write_reg(sc, DME_EPDRH, (data >> 8) & 0xFF); in dme_miibus_writereg()
1016 dme_write_reg(sc, DME_EPCR, EPCR_EPOS | EPCR_ERPRW); in dme_miibus_writereg()
1020 if ((dme_read_reg(sc, DME_EPCR) & EPCR_ERRE) == 0) in dme_miibus_writereg()
1026 dme_write_reg(sc, DME_EPCR, 0); in dme_miibus_writereg()