Lines Matching refs:sc
111 #define EP_FTST(sc, f) (sc->stat & (f)) argument
112 #define EP_FSET(sc, f) (sc->stat |= (f)) argument
113 #define EP_FRST(sc, f) (sc->stat &= ~(f)) argument
116 eeprom_rdy(struct ep_softc *sc) in eeprom_rdy() argument
120 for (i = 0; is_eeprom_busy(sc) && i < MAX_EEPROMBUSY; i++) in eeprom_rdy()
124 device_printf(sc->dev, "eeprom failed to come ready.\n"); in eeprom_rdy()
136 ep_get_e(struct ep_softc *sc, uint16_t offset, uint16_t *result) in ep_get_e() argument
139 if (eeprom_rdy(sc)) in ep_get_e()
142 CSR_WRITE_2(sc, EP_W0_EEPROM_COMMAND, in ep_get_e()
143 (EEPROM_CMD_RD << sc->epb.cmd_off) | offset); in ep_get_e()
145 if (eeprom_rdy(sc)) in ep_get_e()
148 (*result) = CSR_READ_2(sc, EP_W0_EEPROM_DATA); in ep_get_e()
154 ep_get_macaddr(struct ep_softc *sc, u_char *addr) in ep_get_macaddr() argument
163 GO_WINDOW(sc, 0); in ep_get_macaddr()
165 error = ep_get_e(sc, i, &result); in ep_get_macaddr()
176 struct ep_softc *sc = device_get_softc(dev); in ep_alloc() local
182 sc->iobase = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, in ep_alloc()
184 if (!sc->iobase) { in ep_alloc()
190 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); in ep_alloc()
191 if (!sc->irq) { in ep_alloc()
196 sc->dev = dev; in ep_alloc()
197 sc->stat = 0; /* 16 bit access */ in ep_alloc()
199 sc->bst = rman_get_bustag(sc->iobase); in ep_alloc()
200 sc->bsh = rman_get_bushandle(sc->iobase); in ep_alloc()
202 sc->ep_connectors = 0; in ep_alloc()
203 sc->ep_connector = 0; in ep_alloc()
205 GO_WINDOW(sc, 0); in ep_alloc()
207 error = ep_get_e(sc, EEPROM_PROD_ID, &result); in ep_alloc()
210 sc->epb.prod_id = result; in ep_alloc()
212 error = ep_get_e(sc, EEPROM_RESOURCE_CFG, &result); in ep_alloc()
215 sc->epb.res_cfg = result; in ep_alloc()
224 ep_get_media(struct ep_softc *sc) in ep_get_media() argument
228 GO_WINDOW(sc, 0); in ep_get_media()
229 config = CSR_READ_2(sc, EP_W0_CONFIG_CTRL); in ep_get_media()
231 sc->ep_connectors |= AUI; in ep_get_media()
233 sc->ep_connectors |= BNC; in ep_get_media()
235 sc->ep_connectors |= UTP; in ep_get_media()
237 if (!(sc->ep_connectors & 7)) in ep_get_media()
239 device_printf(sc->dev, "no connectors!\n"); in ep_get_media()
246 sc->ep_connector = CSR_READ_2(sc, EP_W0_ADDRESS_CFG) >> ACF_CONNECTOR_BITS; in ep_get_media()
252 struct ep_softc *sc = device_get_softc(dev); in ep_free() local
254 if (sc->ep_intrhand) in ep_free()
255 bus_teardown_intr(dev, sc->irq, sc->ep_intrhand); in ep_free()
256 if (sc->iobase) in ep_free()
257 bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->iobase); in ep_free()
258 if (sc->irq) in ep_free()
259 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq); in ep_free()
260 sc->ep_intrhand = 0; in ep_free()
261 sc->iobase = 0; in ep_free()
262 sc->irq = 0; in ep_free()
266 ep_setup_station(struct ep_softc *sc, u_char *enaddr) in ep_setup_station() argument
273 GO_WINDOW(sc, 2); in ep_setup_station()
275 CSR_WRITE_1(sc, EP_W2_ADDR_0 + i, enaddr[i]); in ep_setup_station()
279 ep_attach(struct ep_softc *sc) in ep_attach() argument
285 sc->gone = 0; in ep_attach()
286 EP_LOCK_INIT(sc); in ep_attach()
287 if (! (sc->stat & F_ENADDR_SKIP)) { in ep_attach()
288 error = ep_get_macaddr(sc, sc->eaddr); in ep_attach()
290 device_printf(sc->dev, "Unable to get MAC address!\n"); in ep_attach()
291 EP_LOCK_DESTROY(sc); in ep_attach()
295 ep_setup_station(sc, sc->eaddr); in ep_attach()
296 ifp = sc->ifp = if_alloc(IFT_ETHER); in ep_attach()
298 device_printf(sc->dev, "if_alloc() failed\n"); in ep_attach()
299 EP_LOCK_DESTROY(sc); in ep_attach()
303 ifp->if_softc = sc; in ep_attach()
304 if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); in ep_attach()
313 callout_init_mtx(&sc->watchdog_timer, &sc->sc_mtx, 0); in ep_attach()
314 if (!sc->epb.mii_trans) { in ep_attach()
315 ifmedia_init(&sc->ifmedia, 0, ep_ifmedia_upd, ep_ifmedia_sts); in ep_attach()
317 if (sc->ep_connectors & AUI) in ep_attach()
318 ifmedia_add(&sc->ifmedia, in ep_attach()
320 if (sc->ep_connectors & UTP) in ep_attach()
321 ifmedia_add(&sc->ifmedia, in ep_attach()
323 if (sc->ep_connectors & BNC) in ep_attach()
324 ifmedia_add(&sc->ifmedia, in ep_attach()
326 if (!sc->ep_connectors) in ep_attach()
327 ifmedia_add(&sc->ifmedia, in ep_attach()
330 ifmedia_set(&sc->ifmedia, in ep_attach()
331 IFM_ETHER | ep_media2if_media[sc->ep_connector]); in ep_attach()
333 ifm = &sc->ifmedia; in ep_attach()
337 ether_ifattach(ifp, sc->eaddr); in ep_attach()
340 sc->rx_no_first = sc->rx_no_mbuf = sc->rx_bpf_disc = in ep_attach()
341 sc->rx_overrunf = sc->rx_overrunl = sc->tx_underrun = 0; in ep_attach()
343 EP_FSET(sc, F_RX_FIRST); in ep_attach()
344 sc->top = sc->mcur = 0; in ep_attach()
346 EP_LOCK(sc); in ep_attach()
347 epstop(sc); in ep_attach()
348 EP_UNLOCK(sc); in ep_attach()
356 struct ep_softc *sc; in ep_detach() local
359 sc = device_get_softc(dev); in ep_detach()
360 ifp = sc->ifp; in ep_detach()
361 EP_ASSERT_UNLOCKED(sc); in ep_detach()
362 EP_LOCK(sc); in ep_detach()
364 epstop(sc); in ep_detach()
365 sc->gone = 1; in ep_detach()
367 EP_UNLOCK(sc); in ep_detach()
369 callout_drain(&sc->watchdog_timer); in ep_detach()
373 EP_LOCK_DESTROY(sc); in ep_detach()
381 struct ep_softc *sc = xsc; in epinit() local
382 EP_LOCK(sc); in epinit()
383 epinit_locked(sc); in epinit()
384 EP_UNLOCK(sc); in epinit()
392 epinit_locked(struct ep_softc *sc) in epinit_locked() argument
394 struct ifnet *ifp = sc->ifp; in epinit_locked()
397 if (sc->gone) in epinit_locked()
400 EP_ASSERT_LOCKED(sc); in epinit_locked()
401 EP_BUSY_WAIT(sc); in epinit_locked()
403 GO_WINDOW(sc, 0); in epinit_locked()
404 CSR_WRITE_2(sc, EP_COMMAND, STOP_TRANSCEIVER); in epinit_locked()
405 GO_WINDOW(sc, 4); in epinit_locked()
406 CSR_WRITE_2(sc, EP_W4_MEDIA_TYPE, DISABLE_UTP); in epinit_locked()
407 GO_WINDOW(sc, 0); in epinit_locked()
410 CSR_WRITE_2(sc, EP_W0_CONFIG_CTRL, 0); in epinit_locked()
413 CSR_WRITE_2(sc, EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ); in epinit_locked()
415 GO_WINDOW(sc, 2); in epinit_locked()
417 ep_setup_station(sc, IF_LLADDR(sc->ifp)); in epinit_locked()
419 CSR_WRITE_2(sc, EP_COMMAND, RX_RESET); in epinit_locked()
420 CSR_WRITE_2(sc, EP_COMMAND, TX_RESET); in epinit_locked()
421 EP_BUSY_WAIT(sc); in epinit_locked()
424 GO_WINDOW(sc, 1); in epinit_locked()
426 CSR_READ_1(sc, EP_W1_TX_STATUS); in epinit_locked()
429 CSR_WRITE_2(sc, EP_COMMAND, ACK_INTR | 0xff); in epinit_locked()
431 CSR_WRITE_2(sc, EP_COMMAND, SET_RD_0_MASK | S_5_INTS); in epinit_locked()
432 CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK | S_5_INTS); in epinit_locked()
435 CSR_WRITE_2(sc, EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | in epinit_locked()
438 CSR_WRITE_2(sc, EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | in epinit_locked()
441 if (!sc->epb.mii_trans) in epinit_locked()
444 if (sc->stat & F_HAS_TX_PLL) in epinit_locked()
445 CSR_WRITE_2(sc, EP_COMMAND, TX_PLL_ENABLE); in epinit_locked()
446 CSR_WRITE_2(sc, EP_COMMAND, RX_ENABLE); in epinit_locked()
447 CSR_WRITE_2(sc, EP_COMMAND, TX_ENABLE); in epinit_locked()
453 sc->rx_no_first = sc->rx_no_mbuf = in epinit_locked()
454 sc->rx_overrunf = sc->rx_overrunl = sc->tx_underrun = 0; in epinit_locked()
456 EP_FSET(sc, F_RX_FIRST); in epinit_locked()
457 if (sc->top) { in epinit_locked()
458 m_freem(sc->top); in epinit_locked()
459 sc->top = sc->mcur = 0; in epinit_locked()
461 CSR_WRITE_2(sc, EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); in epinit_locked()
462 CSR_WRITE_2(sc, EP_COMMAND, SET_TX_START_THRESH | 16); in epinit_locked()
464 GO_WINDOW(sc, 1); in epinit_locked()
466 callout_reset(&sc->watchdog_timer, hz, eptick, sc); in epinit_locked()
472 struct ep_softc *sc; in epstart() local
473 sc = ifp->if_softc; in epstart()
474 EP_LOCK(sc); in epstart()
476 EP_UNLOCK(sc); in epstart()
482 struct ep_softc *sc; in epstart_locked() local
487 sc = ifp->if_softc; in epstart_locked()
488 if (sc->gone) in epstart_locked()
490 EP_ASSERT_LOCKED(sc); in epstart_locked()
491 EP_BUSY_WAIT(sc); in epstart_locked()
500 if (!started && (sc->stat & F_HAS_TX_PLL)) in epstart_locked()
501 CSR_WRITE_2(sc, EP_COMMAND, TX_PLL_ENABLE); in epstart_locked()
519 if (CSR_READ_2(sc, EP_W1_FREE_TX) < len + pad + 4) { in epstart_locked()
521 CSR_WRITE_2(sc, EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); in epstart_locked()
523 if (CSR_READ_2(sc, EP_W1_FREE_TX) < len + pad + 4) { in epstart_locked()
529 CSR_WRITE_2(sc, EP_COMMAND, in epstart_locked()
534 CSR_WRITE_2(sc, EP_W1_TX_PIO_WR_1, len); in epstart_locked()
536 CSR_WRITE_2(sc, EP_W1_TX_PIO_WR_1, 0x0); in epstart_locked()
538 if (EP_FTST(sc, F_ACCESS_32_BITS)) { in epstart_locked()
541 CSR_WRITE_MULTI_4(sc, EP_W1_TX_PIO_WR_1, in epstart_locked()
544 CSR_WRITE_MULTI_1(sc, EP_W1_TX_PIO_WR_1, in epstart_locked()
551 CSR_WRITE_MULTI_2(sc, EP_W1_TX_PIO_WR_1, in epstart_locked()
554 CSR_WRITE_1(sc, EP_W1_TX_PIO_WR_1, in epstart_locked()
560 CSR_WRITE_1(sc, EP_W1_TX_PIO_WR_1, 0); /* Padding */ in epstart_locked()
566 sc->tx_timer = 2; in epstart_locked()
575 if (CSR_READ_2(sc, EP_W1_RX_STATUS) & RX_BYTES_MASK) { in epstart_locked()
581 CSR_WRITE_2(sc, EP_COMMAND, SET_TX_AVAIL_THRESH | 8); in epstart_locked()
592 struct ep_softc *sc; in ep_intr() local
594 sc = (struct ep_softc *) arg; in ep_intr()
595 EP_LOCK(sc); in ep_intr()
596 ep_intr_locked(sc); in ep_intr()
597 EP_UNLOCK(sc); in ep_intr()
601 ep_intr_locked(struct ep_softc *sc) in ep_intr_locked() argument
611 if (sc->gone || CSR_READ_2(sc, EP_STATUS) == 0xffff) in ep_intr_locked()
613 ifp = sc->ifp; in ep_intr_locked()
615 CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ in ep_intr_locked()
619 while ((status = CSR_READ_2(sc, EP_STATUS)) & S_5_INTS) { in ep_intr_locked()
622 CSR_WRITE_2(sc, EP_COMMAND, ACK_INTR | (status & S_MASK)); in ep_intr_locked()
625 epread(sc); in ep_intr_locked()
628 sc->tx_timer = 0; in ep_intr_locked()
630 GO_WINDOW(sc, 1); in ep_intr_locked()
631 CSR_READ_2(sc, EP_W1_FREE_TX); in ep_intr_locked()
635 sc->tx_timer = 0; in ep_intr_locked()
637 device_printf(sc->dev, "\n\tStatus: %x\n", status); in ep_intr_locked()
638 GO_WINDOW(sc, 4); in ep_intr_locked()
640 CSR_READ_2(sc, EP_W4_FIFO_DIAG)); in ep_intr_locked()
641 printf("\tStat: %x\n", sc->stat); in ep_intr_locked()
646 sc->rx_no_first, sc->rx_no_mbuf, sc->rx_overrunf, in ep_intr_locked()
647 sc->rx_overrunl, sc->tx_underrun); in ep_intr_locked()
651 device_printf(sc->dev, in ep_intr_locked()
658 epinit_locked(sc); in ep_intr_locked()
662 sc->tx_timer = 0; in ep_intr_locked()
669 while ((status = CSR_READ_1(sc, EP_W1_TX_STATUS)) & in ep_intr_locked()
676 CSR_WRITE_2(sc, EP_COMMAND, TX_RESET); in ep_intr_locked()
679 sc->tx_underrun++; in ep_intr_locked()
690 CSR_WRITE_2(sc, EP_COMMAND, TX_ENABLE); in ep_intr_locked()
696 CSR_WRITE_2(sc, EP_COMMAND, in ep_intr_locked()
700 CSR_WRITE_1(sc, EP_W1_TX_STATUS, 0x0); in ep_intr_locked()
703 GO_WINDOW(sc, 1); in ep_intr_locked()
704 CSR_READ_2(sc, EP_W1_FREE_TX); in ep_intr_locked()
709 CSR_WRITE_2(sc, EP_COMMAND, C_INTR_LATCH); /* ACK int Latch */ in ep_intr_locked()
711 if ((status = CSR_READ_2(sc, EP_STATUS)) & S_5_INTS) in ep_intr_locked()
715 CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK | S_5_INTS); in ep_intr_locked()
719 epread(struct ep_softc *sc) in epread() argument
729 ifp = sc->ifp; in epread()
730 status = CSR_READ_2(sc, EP_W1_RX_STATUS); in epread()
742 if (EP_FTST(sc, F_RX_FIRST)) in epread()
743 sc->rx_overrunf++; in epread()
745 sc->rx_overrunl++; in epread()
752 if (EP_FTST(sc, F_RX_FIRST)) { in epread()
758 sc->top = sc->mcur = top = m; in epread()
764 CSR_READ_MULTI_2(sc, EP_W1_RX_PIO_RD_1, in epread()
768 sc->cur_len = rx_fifo2; in epread()
771 top = sc->top; in epread()
772 m = sc->mcur; in epread()
773 sc->cur_len += rx_fifo2; in epread()
790 if (EP_FTST(sc, F_ACCESS_32_BITS)) { in epread()
792 CSR_READ_MULTI_4(sc, EP_W1_RX_PIO_RD_1, in epread()
797 CSR_READ_MULTI_1(sc, EP_W1_RX_PIO_RD_1, in epread()
801 CSR_READ_MULTI_2(sc, EP_W1_RX_PIO_RD_1, in epread()
807 CSR_READ_1(sc, EP_W1_RX_PIO_RD_1); in epread()
814 sc->mcur = m; in epread()
817 sc->rx_no_first++; in epread()
819 EP_FRST(sc, F_RX_FIRST); in epread()
820 status = CSR_READ_2(sc, EP_W1_RX_STATUS); in epread()
828 CSR_WRITE_2(sc, EP_COMMAND, in epread()
832 CSR_WRITE_2(sc, EP_COMMAND, RX_DISCARD_TOP_PACK); in epread()
834 EP_FSET(sc, F_RX_FIRST); in epread()
835 top->m_pkthdr.rcvif = sc->ifp; in epread()
836 top->m_pkthdr.len = sc->cur_len; in epread()
845 EP_UNLOCK(sc); in epread()
847 EP_LOCK(sc); in epread()
848 sc->top = 0; in epread()
849 EP_BUSY_WAIT(sc); in epread()
850 CSR_WRITE_2(sc, EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); in epread()
854 CSR_WRITE_2(sc, EP_COMMAND, RX_DISCARD_TOP_PACK); in epread()
855 if (sc->top) { in epread()
856 m_freem(sc->top); in epread()
857 sc->top = 0; in epread()
859 sc->rx_no_mbuf++; in epread()
862 EP_FSET(sc, F_RX_FIRST); in epread()
863 EP_BUSY_WAIT(sc); in epread()
864 CSR_WRITE_2(sc, EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); in epread()
870 struct ep_softc *sc = ifp->if_softc; in ep_ifmedia_upd() local
873 GO_WINDOW(sc, 0); in ep_ifmedia_upd()
874 CSR_WRITE_2(sc, EP_COMMAND, STOP_TRANSCEIVER); in ep_ifmedia_upd()
875 GO_WINDOW(sc, 4); in ep_ifmedia_upd()
876 CSR_WRITE_2(sc, EP_W4_MEDIA_TYPE, DISABLE_UTP); in ep_ifmedia_upd()
877 GO_WINDOW(sc, 0); in ep_ifmedia_upd()
879 switch (IFM_SUBTYPE(sc->ifmedia.ifm_media)) { in ep_ifmedia_upd()
881 if (sc->ep_connectors & UTP) { in ep_ifmedia_upd()
883 GO_WINDOW(sc, 4); in ep_ifmedia_upd()
884 CSR_WRITE_2(sc, EP_W4_MEDIA_TYPE, ENABLE_UTP); in ep_ifmedia_upd()
888 if (sc->ep_connectors & BNC) { in ep_ifmedia_upd()
890 CSR_WRITE_2(sc, EP_COMMAND, START_TRANSCEIVER); in ep_ifmedia_upd()
895 if (sc->ep_connectors & AUI) in ep_ifmedia_upd()
899 i = sc->ep_connector; in ep_ifmedia_upd()
900 device_printf(sc->dev, in ep_ifmedia_upd()
904 GO_WINDOW(sc, 0); in ep_ifmedia_upd()
905 j = CSR_READ_2(sc, EP_W0_ADDRESS_CFG) & 0x3fff; in ep_ifmedia_upd()
906 CSR_WRITE_2(sc, EP_W0_ADDRESS_CFG, j | (i << ACF_CONNECTOR_BITS)); in ep_ifmedia_upd()
914 struct ep_softc *sc = ifp->if_softc; in ep_ifmedia_sts() local
917 switch (IFM_SUBTYPE(sc->ifmedia.ifm_media)) { in ep_ifmedia_sts()
919 GO_WINDOW(sc, 4); in ep_ifmedia_sts()
920 ms = CSR_READ_2(sc, EP_W4_MEDIA_TYPE); in ep_ifmedia_sts()
921 GO_WINDOW(sc, 0); in ep_ifmedia_sts()
931 ifmr->ifm_active = sc->ifmedia.ifm_media; in ep_ifmedia_sts()
939 struct ep_softc *sc = ifp->if_softc; in epioctl() local
945 EP_LOCK(sc); in epioctl()
948 epstop(sc); in epioctl()
951 epinit_locked(sc); in epioctl()
952 EP_UNLOCK(sc); in epioctl()
967 if (!sc->epb.mii_trans) in epioctl()
968 error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, cmd); in epioctl()
982 struct ep_softc *sc; in eptick() local
984 sc = arg; in eptick()
985 if (sc->tx_timer != 0 && --sc->tx_timer == 0) in eptick()
986 epwatchdog(sc); in eptick()
987 callout_reset(&sc->watchdog_timer, hz, eptick, sc); in eptick()
991 epwatchdog(struct ep_softc *sc) in epwatchdog() argument
995 ifp = sc->ifp; in epwatchdog()
996 if (sc->gone) in epwatchdog()
1000 ep_intr_locked(sc); in epwatchdog()
1004 epstop(struct ep_softc *sc) in epstop() argument
1007 EP_ASSERT_LOCKED(sc); in epstop()
1009 CSR_WRITE_2(sc, EP_COMMAND, RX_DISABLE); in epstop()
1010 CSR_WRITE_2(sc, EP_COMMAND, RX_DISCARD_TOP_PACK); in epstop()
1011 EP_BUSY_WAIT(sc); in epstop()
1013 CSR_WRITE_2(sc, EP_COMMAND, TX_DISABLE); in epstop()
1014 CSR_WRITE_2(sc, EP_COMMAND, STOP_TRANSCEIVER); in epstop()
1017 CSR_WRITE_2(sc, EP_COMMAND, RX_RESET); in epstop()
1018 EP_BUSY_WAIT(sc); in epstop()
1019 CSR_WRITE_2(sc, EP_COMMAND, TX_RESET); in epstop()
1020 EP_BUSY_WAIT(sc); in epstop()
1022 CSR_WRITE_2(sc, EP_COMMAND, C_INTR_LATCH); in epstop()
1023 CSR_WRITE_2(sc, EP_COMMAND, SET_RD_0_MASK); in epstop()
1024 CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK); in epstop()
1025 CSR_WRITE_2(sc, EP_COMMAND, SET_RX_FILTER); in epstop()
1027 sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); in epstop()
1028 callout_stop(&sc->watchdog_timer); in epstop()