Lines Matching full:sc

83 #define	SMC_LOCK(sc)		mtx_lock(&(sc)->smc_mtx)  argument
84 #define SMC_UNLOCK(sc) mtx_unlock(&(sc)->smc_mtx) argument
85 #define SMC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->smc_mtx, MA_OWNED) argument
147 smc_select_bank(struct smc_softc *sc, uint16_t bank) in smc_select_bank() argument
150 bus_barrier(sc->smc_reg, BSR, 2, in smc_select_bank()
152 bus_write_2(sc->smc_reg, BSR, bank & BSR_BANK_MASK); in smc_select_bank()
153 bus_barrier(sc->smc_reg, BSR, 2, in smc_select_bank()
159 smc_mmu_wait(struct smc_softc *sc) in smc_mmu_wait() argument
162 KASSERT((bus_read_2(sc->smc_reg, BSR) & in smc_mmu_wait()
164 device_get_nameunit(sc->smc_dev))); in smc_mmu_wait()
165 while (bus_read_2(sc->smc_reg, MMUCR) & MMUCR_BUSY) in smc_mmu_wait()
170 smc_read_1(struct smc_softc *sc, bus_size_t offset) in smc_read_1() argument
173 return (bus_read_1(sc->smc_reg, offset)); in smc_read_1()
177 smc_write_1(struct smc_softc *sc, bus_size_t offset, uint8_t val) in smc_write_1() argument
180 bus_write_1(sc->smc_reg, offset, val); in smc_write_1()
184 smc_read_2(struct smc_softc *sc, bus_size_t offset) in smc_read_2() argument
187 return (bus_read_2(sc->smc_reg, offset)); in smc_read_2()
191 smc_write_2(struct smc_softc *sc, bus_size_t offset, uint16_t val) in smc_write_2() argument
194 bus_write_2(sc->smc_reg, offset, val); in smc_write_2()
198 smc_read_multi_2(struct smc_softc *sc, bus_size_t offset, uint16_t *datap, in smc_read_multi_2() argument
202 bus_read_multi_2(sc->smc_reg, offset, datap, count); in smc_read_multi_2()
206 smc_write_multi_2(struct smc_softc *sc, bus_size_t offset, uint16_t *datap, in smc_write_multi_2() argument
210 bus_write_multi_2(sc->smc_reg, offset, datap, count); in smc_write_multi_2()
214 smc_barrier(struct smc_softc *sc, bus_size_t offset, bus_size_t length, in smc_barrier() argument
218 bus_barrier(sc->smc_reg, offset, length, flags); in smc_barrier()
226 struct smc_softc *sc; in smc_probe() local
229 sc = device_get_softc(dev); in smc_probe()
234 if (sc->smc_usemem) in smc_probe()
307 struct smc_softc *sc; in smc_attach() local
310 sc = device_get_softc(dev); in smc_attach()
313 sc->smc_dev = dev; in smc_attach()
315 ifp = sc->smc_ifp = if_alloc(IFT_ETHER); in smc_attach()
317 mtx_init(&sc->smc_mtx, device_get_nameunit(dev), NULL, MTX_DEF); in smc_attach()
320 callout_init_mtx(&sc->smc_watchdog, &sc->smc_mtx, 0); in smc_attach()
323 if (sc->smc_usemem) in smc_attach()
326 sc->smc_reg_rid = 0; in smc_attach()
327 sc->smc_reg = bus_alloc_resource_anywhere(dev, type, &sc->smc_reg_rid, in smc_attach()
329 if (sc->smc_reg == NULL) { in smc_attach()
334 sc->smc_irq = bus_alloc_resource_anywhere(dev, SYS_RES_IRQ, in smc_attach()
335 &sc->smc_irq_rid, 1, RF_ACTIVE | RF_SHAREABLE); in smc_attach()
336 if (sc->smc_irq == NULL) { in smc_attach()
341 SMC_LOCK(sc); in smc_attach()
342 smc_reset(sc); in smc_attach()
343 SMC_UNLOCK(sc); in smc_attach()
345 smc_select_bank(sc, 3); in smc_attach()
346 val = smc_read_2(sc, REV); in smc_attach()
347 sc->smc_chip = (val & REV_CHIP_MASK) >> REV_CHIP_SHIFT; in smc_attach()
348 sc->smc_rev = (val * REV_REV_MASK) >> REV_REV_SHIFT; in smc_attach()
350 device_printf(dev, "revision %x\n", sc->smc_rev); in smc_attach()
352 callout_init_mtx(&sc->smc_mii_tick_ch, &sc->smc_mtx, in smc_attach()
354 if (sc->smc_chip >= REV_CHIP_91110FD) { in smc_attach()
355 (void)mii_attach(dev, &sc->smc_miibus, ifp, in smc_attach()
358 if (sc->smc_miibus != NULL) { in smc_attach()
359 sc->smc_mii_tick = smc_mii_tick; in smc_attach()
360 sc->smc_mii_mediachg = smc_mii_mediachg; in smc_attach()
361 sc->smc_mii_mediaioctl = smc_mii_mediaioctl; in smc_attach()
365 smc_select_bank(sc, 1); in smc_attach()
366 eaddr[0] = smc_read_1(sc, IAR0); in smc_attach()
367 eaddr[1] = smc_read_1(sc, IAR1); in smc_attach()
368 eaddr[2] = smc_read_1(sc, IAR2); in smc_attach()
369 eaddr[3] = smc_read_1(sc, IAR3); in smc_attach()
370 eaddr[4] = smc_read_1(sc, IAR4); in smc_attach()
371 eaddr[5] = smc_read_1(sc, IAR5); in smc_attach()
374 if_setsoftc(ifp, sc); in smc_attach()
391 TASK_INIT(&sc->smc_intr, SMC_INTR_PRIORITY, smc_task_intr, ifp); in smc_attach()
392 NET_TASK_INIT(&sc->smc_rx, SMC_RX_PRIORITY, smc_task_rx, ifp); in smc_attach()
393 TASK_INIT(&sc->smc_tx, SMC_TX_PRIORITY, smc_task_tx, ifp); in smc_attach()
394 sc->smc_tq = taskqueue_create_fast("smc_taskq", M_NOWAIT, in smc_attach()
395 taskqueue_thread_enqueue, &sc->smc_tq); in smc_attach()
396 taskqueue_start_threads(&sc->smc_tq, 1, PI_NET, "%s taskq", in smc_attach()
397 device_get_nameunit(sc->smc_dev)); in smc_attach()
400 sc->smc_mask = 0; in smc_attach()
401 smc_write_1(sc, MSK, 0); in smc_attach()
404 error = bus_setup_intr(dev, sc->smc_irq, in smc_attach()
405 INTR_TYPE_NET|INTR_MPSAFE, smc_intr, NULL, sc, &sc->smc_ih); in smc_attach()
419 struct smc_softc *sc; in smc_detach() local
421 sc = device_get_softc(dev); in smc_detach()
422 SMC_LOCK(sc); in smc_detach()
423 smc_stop(sc); in smc_detach()
424 SMC_UNLOCK(sc); in smc_detach()
426 if (sc->smc_ifp != NULL) { in smc_detach()
427 ether_ifdetach(sc->smc_ifp); in smc_detach()
430 callout_drain(&sc->smc_watchdog); in smc_detach()
431 callout_drain(&sc->smc_mii_tick_ch); in smc_detach()
434 if (sc->smc_if_getcapenable(ifp) & IFCAP_POLLING) in smc_detach()
435 ether_poll_deregister(sc->smc_ifp); in smc_detach()
438 if (sc->smc_ih != NULL) in smc_detach()
439 bus_teardown_intr(sc->smc_dev, sc->smc_irq, sc->smc_ih); in smc_detach()
441 if (sc->smc_tq != NULL) { in smc_detach()
442 taskqueue_drain(sc->smc_tq, &sc->smc_intr); in smc_detach()
443 taskqueue_drain(sc->smc_tq, &sc->smc_rx); in smc_detach()
444 taskqueue_drain(sc->smc_tq, &sc->smc_tx); in smc_detach()
445 taskqueue_free(sc->smc_tq); in smc_detach()
446 sc->smc_tq = NULL; in smc_detach()
449 if (sc->smc_ifp != NULL) { in smc_detach()
450 if_free(sc->smc_ifp); in smc_detach()
453 bus_generic_detach(sc->smc_dev); in smc_detach()
455 if (sc->smc_reg != NULL) { in smc_detach()
457 if (sc->smc_usemem) in smc_detach()
460 bus_release_resource(sc->smc_dev, type, sc->smc_reg_rid, in smc_detach()
461 sc->smc_reg); in smc_detach()
464 if (sc->smc_irq != NULL) in smc_detach()
465 bus_release_resource(sc->smc_dev, SYS_RES_IRQ, sc->smc_irq_rid, in smc_detach()
466 sc->smc_irq); in smc_detach()
468 if (mtx_initialized(&sc->smc_mtx)) in smc_detach()
469 mtx_destroy(&sc->smc_mtx); in smc_detach()
497 struct smc_softc *sc; in smc_start() local
499 sc = if_getsoftc(ifp); in smc_start()
500 SMC_LOCK(sc); in smc_start()
502 SMC_UNLOCK(sc); in smc_start()
508 struct smc_softc *sc; in smc_start_locked() local
512 sc = if_getsoftc(ifp); in smc_start_locked()
513 SMC_ASSERT_LOCKED(sc); in smc_start_locked()
537 sc->smc_pending = m; in smc_start_locked()
550 smc_select_bank(sc, 2); in smc_start_locked()
551 smc_mmu_wait(sc); in smc_start_locked()
552 smc_write_2(sc, MMUCR, MMUCR_CMD_TX_ALLOC | npages); in smc_start_locked()
559 if (smc_read_1(sc, IST) & ALLOC_INT) { in smc_start_locked()
560 smc_write_1(sc, ACK, ALLOC_INT); in smc_start_locked()
570 sc->smc_mask |= ALLOC_INT; in smc_start_locked()
572 smc_write_1(sc, MSK, sc->smc_mask); in smc_start_locked()
576 taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); in smc_start_locked()
583 struct smc_softc *sc; in smc_task_tx() local
591 sc = if_getsoftc(ifp); in smc_task_tx()
593 SMC_LOCK(sc); in smc_task_tx()
595 if (sc->smc_pending == NULL) { in smc_task_tx()
596 SMC_UNLOCK(sc); in smc_task_tx()
600 m = m0 = sc->smc_pending; in smc_task_tx()
601 sc->smc_pending = NULL; in smc_task_tx()
602 smc_select_bank(sc, 2); in smc_task_tx()
607 packet = smc_read_1(sc, ARR); in smc_task_tx()
617 SMC_UNLOCK(sc); in smc_task_tx()
624 smc_write_1(sc, PNR, packet); in smc_task_tx()
625 smc_write_2(sc, PTR, 0 | PTR_AUTO_INCR); in smc_task_tx()
632 smc_write_2(sc, DATA0, 0); in smc_task_tx()
633 smc_write_2(sc, DATA0, len); in smc_task_tx()
642 smc_write_multi_2(sc, DATA0, (uint16_t *)data, m->m_len / 2); in smc_task_tx()
650 smc_write_2(sc, DATA0, (CTRL_ODD << 8) | data[last_len - 1]); in smc_task_tx()
652 smc_write_2(sc, DATA0, 0); in smc_task_tx()
657 sc->smc_mask |= TX_EMPTY_INT; in smc_task_tx()
659 smc_write_1(sc, MSK, sc->smc_mask); in smc_task_tx()
664 smc_mmu_wait(sc); in smc_task_tx()
665 smc_write_2(sc, MMUCR, MMUCR_CMD_ENQUEUE); in smc_task_tx()
666 callout_reset(&sc->smc_watchdog, hz * 2, smc_watchdog, sc); in smc_task_tx()
673 SMC_UNLOCK(sc); in smc_task_tx()
690 struct smc_softc *sc; in smc_task_rx() local
695 sc = if_getsoftc(ifp); in smc_task_rx()
698 SMC_LOCK(sc); in smc_task_rx()
700 packet = smc_read_1(sc, FIFO_RX); in smc_task_rx()
717 smc_select_bank(sc, 2); in smc_task_rx()
718 smc_write_1(sc, PNR, packet); in smc_task_rx()
719 smc_write_2(sc, PTR, 0 | PTR_READ | PTR_RCV | PTR_AUTO_INCR); in smc_task_rx()
724 status = smc_read_2(sc, DATA0); in smc_task_rx()
725 len = smc_read_2(sc, DATA0) & RX_LEN_MASK; in smc_task_rx()
734 smc_mmu_wait(sc); in smc_task_rx()
735 smc_write_2(sc, MMUCR, MMUCR_CMD_RELEASE); in smc_task_rx()
753 smc_select_bank(sc, 2); in smc_task_rx()
754 smc_write_1(sc, PNR, packet); in smc_task_rx()
755 smc_write_2(sc, PTR, 4 | PTR_READ | PTR_RCV | PTR_AUTO_INCR); in smc_task_rx()
757 smc_read_multi_2(sc, DATA0, (uint16_t *)data, len >> 1); in smc_task_rx()
760 *data = smc_read_1(sc, DATA0); in smc_task_rx()
766 smc_mmu_wait(sc); in smc_task_rx()
767 smc_write_2(sc, MMUCR, MMUCR_CMD_RELEASE); in smc_task_rx()
779 packet = smc_read_1(sc, FIFO_RX); in smc_task_rx()
782 sc->smc_mask |= RCV_INT; in smc_task_rx()
784 smc_write_1(sc, MSK, sc->smc_mask); in smc_task_rx()
786 SMC_UNLOCK(sc); in smc_task_rx()
801 struct smc_softc *sc; in smc_poll() local
803 sc = if_getsoftc(ifp); in smc_poll()
805 SMC_LOCK(sc); in smc_poll()
807 SMC_UNLOCK(sc); in smc_poll()
810 SMC_UNLOCK(sc); in smc_poll()
813 taskqueue_enqueue(sc->smc_tq, &sc->smc_intr); in smc_poll()
821 struct smc_softc *sc; in smc_intr() local
824 sc = (struct smc_softc *)context; in smc_intr()
829 curbank = (smc_read_2(sc, BSR) & BSR_BANK_MASK); in smc_intr()
834 smc_select_bank(sc, 2); in smc_intr()
835 smc_write_1(sc, MSK, 0); in smc_intr()
838 smc_select_bank(sc, curbank); in smc_intr()
840 taskqueue_enqueue(sc->smc_tq, &sc->smc_intr); in smc_intr()
847 struct smc_softc *sc; in smc_task_intr() local
853 sc = if_getsoftc(ifp); in smc_task_intr()
855 SMC_LOCK(sc); in smc_task_intr()
857 smc_select_bank(sc, 2); in smc_task_intr()
862 status = smc_read_1(sc, IST) & sc->smc_mask; in smc_task_intr()
871 packet = smc_read_1(sc, FIFO_TX); in smc_task_intr()
873 callout_stop(&sc->smc_watchdog); in smc_task_intr()
874 smc_select_bank(sc, 2); in smc_task_intr()
875 smc_write_1(sc, PNR, packet); in smc_task_intr()
876 smc_write_2(sc, PTR, 0 | PTR_READ | in smc_task_intr()
878 smc_select_bank(sc, 0); in smc_task_intr()
879 tcr = smc_read_2(sc, EPHSR); in smc_task_intr()
882 device_printf(sc->smc_dev, in smc_task_intr()
885 smc_select_bank(sc, 2); in smc_task_intr()
886 smc_mmu_wait(sc); in smc_task_intr()
887 smc_write_2(sc, MMUCR, MMUCR_CMD_RELEASE_PKT); in smc_task_intr()
889 smc_select_bank(sc, 0); in smc_task_intr()
890 tcr = smc_read_2(sc, TCR); in smc_task_intr()
892 smc_write_2(sc, TCR, tcr); in smc_task_intr()
893 smc_select_bank(sc, 2); in smc_task_intr()
894 taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); in smc_task_intr()
900 smc_write_1(sc, ACK, TX_INT); in smc_task_intr()
907 smc_write_1(sc, ACK, RCV_INT); in smc_task_intr()
908 sc->smc_mask &= ~RCV_INT; in smc_task_intr()
909 taskqueue_enqueue(sc->smc_tq, &sc->smc_rx); in smc_task_intr()
916 smc_write_1(sc, ACK, ALLOC_INT); in smc_task_intr()
917 sc->smc_mask &= ~ALLOC_INT; in smc_task_intr()
918 taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); in smc_task_intr()
925 smc_write_1(sc, ACK, RX_OVRN_INT); in smc_task_intr()
933 smc_write_1(sc, ACK, TX_EMPTY_INT); in smc_task_intr()
934 sc->smc_mask &= ~TX_EMPTY_INT; in smc_task_intr()
935 callout_stop(&sc->smc_watchdog); in smc_task_intr()
940 smc_select_bank(sc, 0); in smc_task_intr()
941 counter = smc_read_2(sc, ECR); in smc_task_intr()
942 smc_select_bank(sc, 2); in smc_task_intr()
950 taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); in smc_task_intr()
956 smc_select_bank(sc, 2); in smc_task_intr()
958 smc_write_1(sc, MSK, sc->smc_mask); in smc_task_intr()
960 SMC_UNLOCK(sc); in smc_task_intr()
966 struct smc_softc *sc; in smc_mii_bitbang_read() local
969 sc = device_get_softc(dev); in smc_mii_bitbang_read()
971 SMC_ASSERT_LOCKED(sc); in smc_mii_bitbang_read()
972 KASSERT((smc_read_2(sc, BSR) & BSR_BANK_MASK) == 3, in smc_mii_bitbang_read()
974 device_get_nameunit(sc->smc_dev), in smc_mii_bitbang_read()
975 smc_read_2(sc, BSR) & BSR_BANK_MASK)); in smc_mii_bitbang_read()
977 val = smc_read_2(sc, MGMT); in smc_mii_bitbang_read()
978 smc_barrier(sc, MGMT, 2, in smc_mii_bitbang_read()
987 struct smc_softc *sc; in smc_mii_bitbang_write() local
989 sc = device_get_softc(dev); in smc_mii_bitbang_write()
991 SMC_ASSERT_LOCKED(sc); in smc_mii_bitbang_write()
992 KASSERT((smc_read_2(sc, BSR) & BSR_BANK_MASK) == 3, in smc_mii_bitbang_write()
994 device_get_nameunit(sc->smc_dev), in smc_mii_bitbang_write()
995 smc_read_2(sc, BSR) & BSR_BANK_MASK)); in smc_mii_bitbang_write()
997 smc_write_2(sc, MGMT, val); in smc_mii_bitbang_write()
998 smc_barrier(sc, MGMT, 2, in smc_mii_bitbang_write()
1005 struct smc_softc *sc; in smc_miibus_readreg() local
1008 sc = device_get_softc(dev); in smc_miibus_readreg()
1010 SMC_LOCK(sc); in smc_miibus_readreg()
1012 smc_select_bank(sc, 3); in smc_miibus_readreg()
1016 SMC_UNLOCK(sc); in smc_miibus_readreg()
1023 struct smc_softc *sc; in smc_miibus_writereg() local
1025 sc = device_get_softc(dev); in smc_miibus_writereg()
1027 SMC_LOCK(sc); in smc_miibus_writereg()
1029 smc_select_bank(sc, 3); in smc_miibus_writereg()
1033 SMC_UNLOCK(sc); in smc_miibus_writereg()
1040 struct smc_softc *sc; in smc_miibus_statchg() local
1044 sc = device_get_softc(dev); in smc_miibus_statchg()
1045 mii = device_get_softc(sc->smc_miibus); in smc_miibus_statchg()
1047 SMC_LOCK(sc); in smc_miibus_statchg()
1049 smc_select_bank(sc, 0); in smc_miibus_statchg()
1050 tcr = smc_read_2(sc, TCR); in smc_miibus_statchg()
1057 smc_write_2(sc, TCR, tcr); in smc_miibus_statchg()
1059 SMC_UNLOCK(sc); in smc_miibus_statchg()
1065 struct smc_softc *sc; in smc_mii_ifmedia_upd() local
1068 sc = if_getsoftc(ifp); in smc_mii_ifmedia_upd()
1069 if (sc->smc_miibus == NULL) in smc_mii_ifmedia_upd()
1072 mii = device_get_softc(sc->smc_miibus); in smc_mii_ifmedia_upd()
1079 struct smc_softc *sc; in smc_mii_ifmedia_sts() local
1082 sc = if_getsoftc(ifp); in smc_mii_ifmedia_sts()
1083 if (sc->smc_miibus == NULL) in smc_mii_ifmedia_sts()
1086 mii = device_get_softc(sc->smc_miibus); in smc_mii_ifmedia_sts()
1095 struct smc_softc *sc; in smc_mii_tick() local
1097 sc = (struct smc_softc *)context; in smc_mii_tick()
1099 if (sc->smc_miibus == NULL) in smc_mii_tick()
1102 SMC_UNLOCK(sc); in smc_mii_tick()
1104 mii_tick(device_get_softc(sc->smc_miibus)); in smc_mii_tick()
1105 callout_reset(&sc->smc_mii_tick_ch, hz, smc_mii_tick, sc); in smc_mii_tick()
1109 smc_mii_mediachg(struct smc_softc *sc) in smc_mii_mediachg() argument
1112 if (sc->smc_miibus == NULL) in smc_mii_mediachg()
1114 mii_mediachg(device_get_softc(sc->smc_miibus)); in smc_mii_mediachg()
1118 smc_mii_mediaioctl(struct smc_softc *sc, struct ifreq *ifr, u_long command) in smc_mii_mediaioctl() argument
1122 if (sc->smc_miibus == NULL) in smc_mii_mediaioctl()
1125 mii = device_get_softc(sc->smc_miibus); in smc_mii_mediaioctl()
1126 return (ifmedia_ioctl(sc->smc_ifp, ifr, &mii->mii_media, command)); in smc_mii_mediaioctl()
1130 smc_reset(struct smc_softc *sc) in smc_reset() argument
1134 SMC_ASSERT_LOCKED(sc); in smc_reset()
1136 smc_select_bank(sc, 2); in smc_reset()
1141 smc_write_1(sc, MSK, 0); in smc_reset()
1146 smc_select_bank(sc, 0); in smc_reset()
1147 smc_write_2(sc, RCR, RCR_SOFT_RST); in smc_reset()
1152 smc_select_bank(sc, 1); in smc_reset()
1153 smc_write_2(sc, CR, CR_EPH_POWER_EN); in smc_reset()
1159 smc_select_bank(sc, 0); in smc_reset()
1160 smc_write_2(sc, TCR, 0); in smc_reset()
1161 smc_write_2(sc, RCR, 0); in smc_reset()
1166 smc_select_bank(sc, 1); in smc_reset()
1167 ctr = smc_read_2(sc, CTRL); in smc_reset()
1169 smc_write_2(sc, CTRL, ctr); in smc_reset()
1174 smc_select_bank(sc, 2); in smc_reset()
1175 smc_mmu_wait(sc); in smc_reset()
1176 smc_write_2(sc, MMUCR, MMUCR_CMD_MMU_RESET); in smc_reset()
1180 smc_enable(struct smc_softc *sc) in smc_enable() argument
1184 SMC_ASSERT_LOCKED(sc); in smc_enable()
1185 ifp = sc->smc_ifp; in smc_enable()
1190 smc_select_bank(sc, 0); in smc_enable()
1191 smc_write_2(sc, RPCR, RPCR_ANEG | (RPCR_LED_LINK_ANY << RPCR_LSA_SHIFT) in smc_enable()
1197 smc_write_2(sc, TCR, TCR_TXENA | TCR_PAD_EN); in smc_enable()
1198 smc_write_2(sc, RCR, RCR_RXEN | RCR_STRIP_CRC); in smc_enable()
1203 smc_select_bank(sc, 2); in smc_enable()
1204 sc->smc_mask = EPH_INT | RX_OVRN_INT | RCV_INT | TX_INT; in smc_enable()
1206 smc_write_1(sc, MSK, sc->smc_mask); in smc_enable()
1210 smc_stop(struct smc_softc *sc) in smc_stop() argument
1213 SMC_ASSERT_LOCKED(sc); in smc_stop()
1218 callout_stop(&sc->smc_watchdog); in smc_stop()
1219 callout_stop(&sc->smc_mii_tick_ch); in smc_stop()
1224 smc_select_bank(sc, 2); in smc_stop()
1225 sc->smc_mask = 0; in smc_stop()
1226 smc_write_1(sc, MSK, 0); in smc_stop()
1228 ether_poll_deregister(sc->smc_ifp); in smc_stop()
1235 smc_select_bank(sc, 0); in smc_stop()
1236 smc_write_2(sc, TCR, 0); in smc_stop()
1237 smc_write_2(sc, RCR, 0); in smc_stop()
1239 if_setdrvflagbits(sc->smc_ifp, 0, IFF_DRV_RUNNING); in smc_stop()
1245 struct smc_softc *sc; in smc_watchdog() local
1247 sc = (struct smc_softc *)arg; in smc_watchdog()
1248 device_printf(sc->smc_dev, "watchdog timeout\n"); in smc_watchdog()
1249 taskqueue_enqueue(sc->smc_tq, &sc->smc_intr); in smc_watchdog()
1255 struct smc_softc *sc; in smc_init() local
1257 sc = (struct smc_softc *)context; in smc_init()
1258 SMC_LOCK(sc); in smc_init()
1259 smc_init_locked(sc); in smc_init()
1260 SMC_UNLOCK(sc); in smc_init()
1264 smc_init_locked(struct smc_softc *sc) in smc_init_locked() argument
1268 SMC_ASSERT_LOCKED(sc); in smc_init_locked()
1269 ifp = sc->smc_ifp; in smc_init_locked()
1273 smc_reset(sc); in smc_init_locked()
1274 smc_enable(sc); in smc_init_locked()
1281 if (sc->smc_mii_tick != NULL) in smc_init_locked()
1282 callout_reset(&sc->smc_mii_tick_ch, hz, sc->smc_mii_tick, sc); in smc_init_locked()
1285 SMC_UNLOCK(sc); in smc_init_locked()
1287 SMC_LOCK(sc); in smc_init_locked()
1295 struct smc_softc *sc; in smc_ioctl() local
1298 sc = if_getsoftc(ifp); in smc_ioctl()
1305 SMC_LOCK(sc); in smc_ioctl()
1306 smc_stop(sc); in smc_ioctl()
1307 SMC_UNLOCK(sc); in smc_ioctl()
1309 smc_init(sc); in smc_ioctl()
1310 if (sc->smc_mii_mediachg != NULL) in smc_ioctl()
1311 sc->smc_mii_mediachg(sc); in smc_ioctl()
1318 SMC_LOCK(sc); in smc_ioctl()
1319 smc_setmcast(sc); in smc_ioctl()
1320 SMC_UNLOCK(sc); in smc_ioctl()
1327 if (sc->smc_mii_mediaioctl == NULL) { in smc_ioctl()
1331 sc->smc_mii_mediaioctl(sc, (struct ifreq *)data, cmd); in smc_ioctl()