Lines Matching refs:sc

132 static void	tulip_addr_filter(tulip_softc_t * const sc);
137 static void tulip_init_locked(tulip_softc_t * const sc);
140 static void tulip_mii_autonegotiate(tulip_softc_t * const sc,
142 static int tulip_mii_map_abilities(tulip_softc_t * const sc,
145 tulip_mii_phy_readspecific(tulip_softc_t * const sc);
146 static unsigned tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr,
148 static void tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr,
150 static void tulip_reset(tulip_softc_t * const sc);
151 static void tulip_rx_intr(tulip_softc_t * const sc);
152 static int tulip_srom_decode(tulip_softc_t * const sc);
154 static void tulip_start_locked(tulip_softc_t * const sc);
156 tulip_txput(tulip_softc_t * const sc, struct mbuf *m);
157 static void tulip_txput_setup(tulip_softc_t * const sc);
227 tulip_softc_t * const sc = arg;
230 TULIP_LOCK_ASSERT(sc);
232 sc->tulip_flags &= ~TULIP_TIMEOUTPENDING;
233 sc->tulip_probe_timeout -= 1000 / TULIP_HZ;
234 (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_TIMER);
240 tulip_timeout(tulip_softc_t * const sc)
242 TULIP_LOCK_ASSERT(sc);
243 if (sc->tulip_flags & TULIP_TIMEOUTPENDING)
245 sc->tulip_flags |= TULIP_TIMEOUTPENDING;
246 callout_reset(&sc->tulip_callout, (hz + TULIP_HZ / 2) / TULIP_HZ,
247 tulip_timeout_callback, sc);
251 tulip_txprobe(tulip_softc_t * const sc)
263 TULIP_LOCK_ASSERT(sc);
270 if (sc->tulip_ifp->if_input != NULL)
271 enaddr = IF_LLADDR(sc->tulip_ifp);
273 enaddr = sc->tulip_enaddr;
284 sc->tulip_cmdmode |= TULIP_CMD_TXRUN;
285 sc->tulip_intrmask |= TULIP_STS_TXINTR;
286 sc->tulip_flags |= TULIP_TXPROBE_ACTIVE;
287 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
288 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
289 if ((m = tulip_txput(sc, m)) != NULL)
291 sc->tulip_probe.probe_txprobes++;
296 tulip_media_set(tulip_softc_t * const sc, tulip_media_t media)
298 const tulip_media_info_t *mi = sc->tulip_mediums[media];
300 TULIP_LOCK_ASSERT(sc);
308 sc->tulip_flags &= ~TULIP_RXACT;
310 TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET);
311 TULIP_CSR_WRITE(sc, csr_sia_tx_rx, mi->mi_sia_tx_rx);
312 if (sc->tulip_features & TULIP_HAVE_SIAGP) {
313 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_gp_control|mi->mi_sia_general);
315 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_gp_data|mi->mi_sia_general);
317 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_general);
319 TULIP_CSR_WRITE(sc, csr_sia_connectivity, mi->mi_sia_connectivity);
326 if (((mi->mi_cmdmode ^ TULIP_CSR_READ(sc, csr_command)) & TULIP_GPR_CMDBITS) != 0) {
327 sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;
328 sc->tulip_cmdmode |= mi->mi_cmdmode;
329 tulip_reset(sc);
331 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET|sc->tulip_gpinit);
333 TULIP_CSR_WRITE(sc, csr_gp, (u_int8_t) mi->mi_gpdata);
339 if (((mi->mi_cmdmode ^ TULIP_CSR_READ(sc, csr_command)) & TULIP_GPR_CMDBITS) != 0) {
340 sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;
341 sc->tulip_cmdmode |= mi->mi_cmdmode;
342 tulip_reset(sc);
344 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_gpcontrol);
345 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_gpdata);
347 && sc->tulip_probe_state != TULIP_PROBE_INACTIVE) {
349 if (sc->tulip_features & TULIP_HAVE_SIAGP) {
351 dp = &sc->tulip_rombuf[mi->mi_reset_offset];
354 TULIP_CSR_WRITE(sc, csr_sia_general, (dp[0] + 256 * dp[1]) << 16);
356 sc->tulip_phyaddr = mi->mi_phyaddr;
357 dp = &sc->tulip_rombuf[mi->mi_gpr_offset];
360 TULIP_CSR_WRITE(sc, csr_sia_general, (dp[0] + 256 * dp[1]) << 16);
365 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_reset_offset + idx]);
367 sc->tulip_phyaddr = mi->mi_phyaddr;
370 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_gpr_offset + idx]);
373 if (sc->tulip_flags & TULIP_TRYNWAY) {
374 tulip_mii_autonegotiate(sc, sc->tulip_phyaddr);
375 } else if ((sc->tulip_flags & TULIP_DIDNWAY) == 0) {
376 u_int32_t data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_CONTROL);
378 sc->tulip_flags &= ~TULIP_DIDNWAY;
383 tulip_mii_writereg(sc, sc->tulip_phyaddr, PHYREG_CONTROL, data);
389 tulip_linkup(tulip_softc_t * const sc, tulip_media_t media)
391 TULIP_LOCK_ASSERT(sc);
392 if ((sc->tulip_flags & TULIP_LINKUP) == 0)
393 sc->tulip_flags |= TULIP_PRINTLINKUP;
394 sc->tulip_flags |= TULIP_LINKUP;
395 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
397 if ((sc->tulip_flags & TULIP_DIDNWAY) == 0) {
398 if (sc->tulip_ifp->if_flags & IFF_FULLDUPLEX) {
400 && sc->tulip_mediums[TULIP_FD_MEDIA_OF(media)] != NULL)
404 && sc->tulip_mediums[TULIP_HD_MEDIA_OF(media)] != NULL)
409 if (sc->tulip_media != media) {
411 sc->tulip_dbg.dbg_last_media = sc->tulip_media;
413 sc->tulip_media = media;
414 sc->tulip_flags |= TULIP_PRINTMEDIA;
415 if (TULIP_IS_MEDIA_FD(sc->tulip_media)) {
416 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;
417 } else if (sc->tulip_chipid != TULIP_21041 || (sc->tulip_flags & TULIP_DIDNWAY) == 0) {
418 sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;
427 sc->tulip_probe_timeout = 3000;
428 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
429 sc->tulip_flags &= ~(TULIP_TXPROBE_ACTIVE|TULIP_TRYNWAY);
430 if (sc->tulip_flags & TULIP_INRESET) {
431 tulip_media_set(sc, sc->tulip_media);
432 } else if (sc->tulip_probe_media != sc->tulip_media) {
436 tulip_reset(sc);
438 tulip_init_locked(sc);
442 tulip_media_print(tulip_softc_t * const sc)
445 TULIP_LOCK_ASSERT(sc);
446 if ((sc->tulip_flags & TULIP_LINKUP) == 0)
448 if (sc->tulip_flags & TULIP_PRINTMEDIA) {
449 device_printf(sc->tulip_dev, "enabling %s port\n",
450 tulip_mediums[sc->tulip_media]);
451 sc->tulip_flags &= ~(TULIP_PRINTMEDIA|TULIP_PRINTLINKUP);
452 } else if (sc->tulip_flags & TULIP_PRINTLINKUP) {
453 device_printf(sc->tulip_dev, "link up\n");
454 sc->tulip_flags &= ~TULIP_PRINTLINKUP;
460 tulip_21140_gpr_media_sense(tulip_softc_t * const sc)
462 struct ifnet *ifp sc->tulip_ifp;
467 TULIP_LOCK_ASSERT(sc);
478 if ((mi = sc->tulip_mediums[media]) == NULL || TULIP_IS_MEDIA_FD(media))
498 if ((TULIP_CSR_READ(sc, csr_gp) & mi->mi_actmask) != mi->mi_actdata)
502 device_printf(sc->tulip_dev, "%s: %s: 0x%02x & 0x%02x == 0x%02x\n",
503 __func__, tulip_mediums[media], TULIP_CSR_READ(sc, csr_gp) & 0xFF,
523 tulip_media_link_monitor(tulip_softc_t * const sc)
525 const tulip_media_info_t * const mi = sc->tulip_mediums[sc->tulip_media];
528 TULIP_LOCK_ASSERT(sc);
532 tulip_mediums[sc->tulip_media],__LINE__);
542 if ((sc->tulip_flags & (TULIP_RXACT|TULIP_LINKUP)) == (TULIP_RXACT|TULIP_LINKUP)) {
543 sc->tulip_flags &= ~TULIP_RXACT;
544 sc->tulip_probe_timeout = 3000;
548 sc->tulip_flags &= ~TULIP_RXACT;
554 status = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS);
561 u_int32_t abilities = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_AUTONEG_ABILITIES);
563 if (abilities != sc->tulip_abilities) {
566 ifp->if_xname, sc->tulip_phyaddr,
567 sc->tulip_abilities, abilities);
569 if (tulip_mii_map_abilities(sc, abilities)) {
570 tulip_linkup(sc, sc->tulip_probe_media);
577 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
578 if (sc->tulip_flags & TULIP_DIDNWAY)
596 if ((TULIP_CSR_READ(sc, csr_gp) & mi->mi_actmask) == mi->mi_actdata)
602 if (!TULIP_IS_MEDIA_TP(sc->tulip_media))
604 if ((TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL) == 0)
607 if (sc->tulip_probe_timeout <= 0)
608 device_printf(sc->tulip_dev, "sia status = 0x%08x\n",
609 TULIP_CSR_READ(sc, csr_sia_status));
617 if (sc->tulip_flags & TULIP_LINKUP) {
619 sc->tulip_probe_timeout = 3000;
620 if (sc->tulip_probe_timeout > 0)
623 sc->tulip_flags &= ~TULIP_LINKUP;
624 device_printf(sc->tulip_dev, "link down: cable problem?\n");
627 sc->tulip_dbg.dbg_link_downed++;
633 tulip_media_poll(tulip_softc_t * const sc, tulip_mediapoll_event_t event)
636 TULIP_LOCK_ASSERT(sc);
638 sc->tulip_dbg.dbg_events[event]++;
640 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE
642 switch (tulip_media_link_monitor(sc)) {
654 tulip_timeout(sc);
667 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE) {
668 if (TULIP_DO_AUTOSENSE(sc)) {
670 sc->tulip_dbg.dbg_link_failures++;
672 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
673 if (sc->tulip_ifp->if_flags & IFF_UP)
674 tulip_reset(sc); /* restart probe */
679 sc->tulip_dbg.dbg_link_pollintrs++;
684 sc->tulip_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
685 if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE)
687 sc->tulip_probe_mediamask = 0;
688 sc->tulip_probe_passes = 0;
690 sc->tulip_dbg.dbg_media_probes++;
695 sc->tulip_cmdmode &= ~(TULIP_CMD_RXRUN|TULIP_CMD_FULLDUPLEX);
696 sc->tulip_flags |= TULIP_TRYNWAY|TULIP_PROBE1STPASS;
697 sc->tulip_flags &= ~(TULIP_DIDNWAY|TULIP_PRINTMEDIA|TULIP_PRINTLINKUP);
701 sc->tulip_probe_media = tulip_srom_conninfo[sc->tulip_connidx].sc_media;
702 if (sc->tulip_probe_media != TULIP_MEDIA_UNKNOWN) {
703 tulip_linkup(sc, sc->tulip_probe_media);
704 tulip_timeout(sc);
708 if (sc->tulip_features & TULIP_HAVE_GPR) {
709 sc->tulip_probe_state = TULIP_PROBE_GPRTEST;
710 sc->tulip_probe_timeout = 2000;
712 sc->tulip_probe_media = TULIP_MEDIA_MAX;
713 sc->tulip_probe_timeout = 0;
714 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
722 && sc->tulip_probe_state != TULIP_PROBE_MEDIATEST) {
723 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
733 sc->tulip_probe_media = TULIP_MEDIA_10BASET;
736 sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++;
739 tulip_linkup(sc, sc->tulip_probe_media);
740 tulip_timeout(sc);
744 if (sc->tulip_probe_state == TULIP_PROBE_GPRTEST) {
752 if (sc->tulip_probe_timeout > 0) {
753 tulip_media_t new_probe_media = tulip_21140_gpr_media_sense(sc);
755 device_printf(sc->tulip_dev, "%s: gpr sensing = %s\n", __func__,
759 if (new_probe_media == sc->tulip_probe_media) {
760 if (--sc->tulip_probe_count == 0)
761 tulip_linkup(sc, sc->tulip_probe_media);
763 sc->tulip_probe_count = 10;
766 sc->tulip_probe_media = new_probe_media;
767 tulip_timeout(sc);
775 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
776 sc->tulip_probe_media = TULIP_MEDIA_MAX;
777 sc->tulip_probe_timeout = 0;
778 tulip_timeout(sc);
782 if (sc->tulip_probe_state != TULIP_PROBE_MEDIATEST
783 && (sc->tulip_features & TULIP_HAVE_MII)) {
784 tulip_media_t old_media = sc->tulip_probe_media;
785 tulip_mii_autonegotiate(sc, sc->tulip_phyaddr);
786 switch (sc->tulip_probe_state) {
792 sc->tulip_probe_mediamask |= sc->tulip_mediums[sc->tulip_probe_media]->mi_mediamask;
793 sc->tulip_probe_timeout = 0;
795 if (sc->tulip_probe_state == TULIP_PROBE_FAILED)
797 if (sc->tulip_probe_media != tulip_mii_phy_readspecific(sc))
799 sc->tulip_probe_timeout = TULIP_IS_MEDIA_TP(sc->tulip_probe_media) ? 2500 : 300;
810 sc->tulip_probe_timeout = 0;
811 if (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media)) {
812 sc->tulip_probe_media = old_media;
815 tulip_linkup(sc, sc->tulip_probe_media);
816 tulip_timeout(sc);
830 sc->tulip_dbg.dbg_txprobes_failed[sc->tulip_probe_media]++;
832 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
839 if (/* event == TULIP_MEDIAPOLL_TXPROBE_FAILED || */ sc->tulip_probe_timeout <= 0) {
841 if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) {
842 device_printf(sc->tulip_dev, "poll media unknown!\n");
843 sc->tulip_probe_media = TULIP_MEDIA_MAX;
851 sc->tulip_probe_media -= 1;
852 if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) {
853 if (++sc->tulip_probe_passes == 3) {
854 device_printf(sc->tulip_dev,
856 if ((sc->tulip_ifp->if_flags & IFF_UP) == 0) {
857 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
858 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
862 sc->tulip_flags ^= TULIP_TRYNWAY; /* XXX */
863 sc->tulip_probe_mediamask = 0;
864 sc->tulip_probe_media = TULIP_MEDIA_MAX - 1;
866 } while (sc->tulip_mediums[sc->tulip_probe_media] == NULL
867 || (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media))
868 || TULIP_IS_MEDIA_FD(sc->tulip_probe_media));
871 device_printf(sc->tulip_dev, "%s: probing %s\n",
873 tulip_mediums[sc->tulip_probe_media]);
875 sc->tulip_probe_timeout = TULIP_IS_MEDIA_TP(sc->tulip_probe_media) ? 2500 : 1000;
876 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
877 sc->tulip_probe.probe_txprobes = 0;
878 tulip_reset(sc);
879 tulip_media_set(sc, sc->tulip_probe_media);
880 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
882 tulip_timeout(sc);
889 switch (sc->tulip_mediums[sc->tulip_probe_media]->mi_type) {
891 if (sc->tulip_probe_media != tulip_mii_phy_readspecific(sc))
896 if (TULIP_IS_MEDIA_TP(sc->tulip_probe_media)) {
897 if (TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL)
899 tulip_linkup(sc, sc->tulip_probe_media);
901 if (sc->tulip_features & TULIP_HAVE_MII)
902 tulip_timeout(sc);
918 tulip_txprobe(sc);
922 tulip_media_select(tulip_softc_t * const sc)
924 TULIP_LOCK_ASSERT(sc);
925 if (sc->tulip_features & TULIP_HAVE_GPR) {
926 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET|sc->tulip_gpinit);
928 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_gpdata);
933 if (sc->tulip_features & TULIP_HAVE_NOMEDIA)
936 if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) {
937 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
938 (*sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_START);
940 tulip_media_set(sc, sc->tulip_media);
945 tulip_21040_mediainfo_init(tulip_softc_t * const sc, tulip_media_t media)
947 TULIP_LOCK_ASSERT(sc);
948 sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_THRSHLD160
950 sc->tulip_ifp->if_baudrate = 10000000;
953 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[0], 21040, 10BASET);
954 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[1], 21040, 10BASET_FD);
955 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
959 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[2], 21040, AUIBNC);
963 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[3], 21040, EXTSIA);
968 tulip_21040_media_probe(tulip_softc_t * const sc)
970 TULIP_LOCK_ASSERT(sc);
971 tulip_21040_mediainfo_init(sc, TULIP_MEDIA_UNKNOWN);
976 tulip_21040_10baset_only_media_probe(tulip_softc_t * const sc)
978 TULIP_LOCK_ASSERT(sc);
979 tulip_21040_mediainfo_init(sc, TULIP_MEDIA_10BASET);
980 tulip_media_set(sc, TULIP_MEDIA_10BASET);
981 sc->tulip_media = TULIP_MEDIA_10BASET;
985 tulip_21040_10baset_only_media_select(tulip_softc_t * const sc)
987 TULIP_LOCK_ASSERT(sc);
988 sc->tulip_flags |= TULIP_LINKUP;
989 if (sc->tulip_media == TULIP_MEDIA_10BASET_FD) {
990 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;
991 sc->tulip_flags &= ~TULIP_SQETEST;
993 sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;
994 sc->tulip_flags |= TULIP_SQETEST;
996 tulip_media_set(sc, sc->tulip_media);
1000 tulip_21040_auibnc_only_media_probe(tulip_softc_t * const sc)
1002 TULIP_LOCK_ASSERT(sc);
1003 tulip_21040_mediainfo_init(sc, TULIP_MEDIA_AUIBNC);
1004 sc->tulip_flags |= TULIP_SQETEST|TULIP_LINKUP;
1005 tulip_media_set(sc, TULIP_MEDIA_AUIBNC);
1006 sc->tulip_media = TULIP_MEDIA_AUIBNC;
1010 tulip_21040_auibnc_only_media_select(tulip_softc_t * const sc)
1012 TULIP_LOCK_ASSERT(sc);
1013 tulip_media_set(sc, TULIP_MEDIA_AUIBNC);
1014 sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;
1039 tulip_21041_mediainfo_init(tulip_softc_t * const sc)
1041 tulip_media_info_t * const mi = sc->tulip_mediainfo;
1043 TULIP_LOCK_ASSERT(sc);
1045 if (sc->tulip_revinfo >= 0x20) {
1046 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041P2, 10BASET);
1047 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041P2, 10BASET_FD);
1048 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041P2, AUI);
1049 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041P2, BNC);
1053 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041, 10BASET);
1054 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041, 10BASET_FD);
1055 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[2], 21041, AUI);
1056 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[3], 21041, BNC);
1060 tulip_21041_media_probe(tulip_softc_t * const sc)
1062 TULIP_LOCK_ASSERT(sc);
1063 sc->tulip_ifp->if_baudrate = 10000000;
1064 sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_ENHCAPTEFFCT
1066 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
1067 tulip_21041_mediainfo_init(sc);
1071 tulip_21041_media_poll(tulip_softc_t * const sc,
1076 TULIP_LOCK_ASSERT(sc);
1078 sc->tulip_dbg.dbg_events[event]++;
1082 if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE
1083 || !TULIP_DO_AUTOSENSE(sc))
1085 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
1086 tulip_reset(sc); /* start probe */
1095 sc->tulip_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1096 sc->tulip_cmdmode &= ~(TULIP_CMD_FULLDUPLEX|TULIP_CMD_RXRUN);
1098 if (sc->tulip_revinfo >= 0x20) {
1099 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;
1100 sc->tulip_flags |= TULIP_DIDNWAY;
1103 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
1104 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1105 sc->tulip_probe_media = TULIP_MEDIA_10BASET;
1106 sc->tulip_probe_timeout = TULIP_21041_PROBE_10BASET_TIMEOUT;
1107 tulip_media_set(sc, TULIP_MEDIA_10BASET);
1108 tulip_timeout(sc);
1112 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)
1117 sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++;
1119 tulip_linkup(sc, sc->tulip_probe_media);
1123 sia_status = TULIP_CSR_READ(sc, csr_sia_status);
1124 TULIP_CSR_WRITE(sc, csr_sia_status, sia_status);
1126 if (sc->tulip_revinfo >= 0x20) {
1128 sc->tulip_probe_media = TULIP_MEDIA_10BASET_FD;
1134 tulip_linkup(sc, sc->tulip_probe_media);
1143 if (sc->tulip_probe_media == TULIP_MEDIA_10BASET) {
1146 if (sc->tulip_probe_timeout > 0
1148 tulip_timeout(sc);
1151 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1152 sc->tulip_flags |= TULIP_WANTRXACT;
1154 sc->tulip_probe_media = TULIP_MEDIA_BNC;
1156 sc->tulip_probe_media = TULIP_MEDIA_AUI;
1158 tulip_media_set(sc, sc->tulip_probe_media);
1159 tulip_timeout(sc);
1167 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
1174 if (sc->tulip_flags & TULIP_RXACT) {
1175 tulip_linkup(sc, sc->tulip_probe_media);
1181 if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0
1182 && ((sc->tulip_flags & TULIP_WANTRXACT) == 0
1184 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1185 tulip_txprobe(sc);
1186 tulip_timeout(sc);
1194 if (sc->tulip_probe_timeout <= 0) {
1195 if (sc->tulip_flags & TULIP_WANTRXACT) {
1196 sc->tulip_flags &= ~TULIP_WANTRXACT;
1197 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1199 device_printf(sc->tulip_dev,
1201 if ((sc->tulip_ifp->if_flags & IFF_UP) == 0) {
1202 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1203 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
1213 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1214 if (sc->tulip_probe_media == TULIP_MEDIA_AUI) {
1215 sc->tulip_probe_media = TULIP_MEDIA_BNC;
1217 sc->tulip_probe_media = TULIP_MEDIA_AUI;
1219 tulip_media_set(sc, sc->tulip_probe_media);
1220 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
1221 tulip_timeout(sc);
1280 tulip_mii_phy_readspecific(tulip_softc_t * const sc)
1297 TULIP_LOCK_ASSERT(sc);
1302 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS);
1306 id = (tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_IDLOW) << 16) |
1307 tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_IDHIGH);
1317 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1323 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1329 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1335 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1342 tulip_mii_get_phyaddr(tulip_softc_t * const sc, unsigned offset)
1346 TULIP_LOCK_ASSERT(sc);
1348 unsigned status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);
1356 unsigned status = tulip_mii_readreg(sc, 0, PHYREG_STATUS);
1365 tulip_mii_map_abilities(tulip_softc_t * const sc, unsigned abilities)
1367 TULIP_LOCK_ASSERT(sc);
1368 sc->tulip_abilities = abilities;
1370 sc->tulip_probe_media = TULIP_MEDIA_100BASETX_FD;
1372 sc->tulip_probe_media = TULIP_MEDIA_100BASET4;
1374 sc->tulip_probe_media = TULIP_MEDIA_100BASETX;
1376 sc->tulip_probe_media = TULIP_MEDIA_10BASET_FD;
1378 sc->tulip_probe_media = TULIP_MEDIA_10BASET;
1380 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1383 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
1388 tulip_mii_autonegotiate(tulip_softc_t * const sc, const unsigned phyaddr)
1390 struct ifnet *ifp = sc->tulip_ifp;
1392 TULIP_LOCK_ASSERT(sc);
1393 switch (sc->tulip_probe_state) {
1396 sc->tulip_flags |= TULIP_DIDNWAY;
1397 tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_RESET);
1398 sc->tulip_probe_timeout = 3000;
1399 sc->tulip_intrmask |= TULIP_STS_ABNRMLINTR|TULIP_STS_NORMALINTR;
1400 sc->tulip_probe_state = TULIP_PROBE_PHYRESET;
1405 u_int32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL);
1407 if (sc->tulip_probe_timeout > 0) {
1408 tulip_timeout(sc);
1413 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
1414 sc->tulip_probe_state = TULIP_PROBE_FAILED;
1415 sc->tulip_ifp->if_flags &= ~IFF_UP;
1416 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1419 status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);
1425 sc->tulip_flags &= ~TULIP_DIDNWAY;
1426 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1429 if (tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT) != ((status >> 6) | 0x01))
1430 tulip_mii_writereg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT, (status >> 6) | 0x01);
1431 tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, data|PHYCTL_AUTONEG_RESTART|PHYCTL_AUTONEG_ENABLE);
1432 data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL);
1440 sc->tulip_dbg.dbg_nway_starts++;
1442 sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG;
1443 sc->tulip_probe_timeout = 3000;
1447 u_int32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);
1450 if (sc->tulip_probe_timeout > 0) {
1451 tulip_timeout(sc);
1457 tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL));
1459 sc->tulip_flags &= ~TULIP_DIDNWAY;
1460 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1463 data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES);
1469 if (!tulip_mii_map_abilities(sc, data))
1470 sc->tulip_flags &= ~TULIP_DIDNWAY;
1482 ifp->if_xname, phyaddr, sc->tulip_probe_state);
1483 sc->tulip_dbg.dbg_nway_failures++;
1488 tulip_2114x_media_preset(tulip_softc_t * const sc)
1491 tulip_media_t media = sc->tulip_media;
1493 TULIP_LOCK_ASSERT(sc);
1494 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)
1495 media = sc->tulip_media;
1497 media = sc->tulip_probe_media;
1499 sc->tulip_cmdmode &= ~TULIP_CMD_PORTSELECT;
1500 sc->tulip_flags &= ~TULIP_SQETEST;
1503 if (media < TULIP_MEDIA_MAX && sc->tulip_mediums[media] != NULL) {
1505 mi = sc->tulip_mediums[media];
1507 sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT;
1510 sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;
1511 sc->tulip_cmdmode |= mi->mi_cmdmode;
1513 TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET);
1517 device_printf(sc->tulip_dev, "preset: bad media %d!\n", media);
1525 sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;
1526 sc->tulip_cmdmode |= TULIP_CMD_TXTHRSHLDCTL;
1527 sc->tulip_ifp->if_baudrate = 10000000;
1528 sc->tulip_flags |= TULIP_SQETEST;
1532 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX|TULIP_CMD_TXTHRSHLDCTL;
1533 sc->tulip_ifp->if_baudrate = 10000000;
1539 sc->tulip_cmdmode &= ~(TULIP_CMD_FULLDUPLEX|TULIP_CMD_TXTHRSHLDCTL);
1540 sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT;
1541 sc->tulip_ifp->if_baudrate = 100000000;
1546 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX|TULIP_CMD_PORTSELECT;
1547 sc->tulip_cmdmode &= ~TULIP_CMD_TXTHRSHLDCTL;
1548 sc->tulip_ifp->if_baudrate = 100000000;
1555 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
1564 tulip_null_media_poll(tulip_softc_t * const sc, tulip_mediapoll_event_t event)
1567 sc->tulip_dbg.dbg_events[event]++;
1570 device_printf(sc->tulip_dev, "botch(media_poll) at line %d\n", __LINE__);
1575 tulip_21140_mediainit(tulip_softc_t * const sc, tulip_media_info_t * const mip,
1578 TULIP_LOCK_ASSERT(sc);
1579 sc->tulip_mediums[media] = mip;
1586 tulip_21140_evalboard_media_probe(tulip_softc_t * const sc)
1588 tulip_media_info_t *mip = sc->tulip_mediainfo;
1590 TULIP_LOCK_ASSERT(sc);
1591 sc->tulip_gpinit = TULIP_GP_EB_PINS;
1592 sc->tulip_gpdata = TULIP_GP_EB_INIT;
1593 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);
1594 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);
1595 TULIP_CSR_WRITE(sc, csr_command,
1596 TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |
1598 TULIP_CSR_WRITE(sc, csr_command,
1599 TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);
1601 if ((TULIP_CSR_READ(sc, csr_gp) & TULIP_GP_EB_OK100) != 0) {
1602 sc->tulip_media = TULIP_MEDIA_10BASET;
1604 sc->tulip_media = TULIP_MEDIA_100BASETX;
1606 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1609 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1612 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1616 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1631 tulip_21140_accton_media_probe(tulip_softc_t * const sc)
1633 tulip_media_info_t *mip = sc->tulip_mediainfo;
1636 TULIP_LOCK_ASSERT(sc);
1637 sc->tulip_gpinit = TULIP_GP_EB_PINS;
1638 sc->tulip_gpdata = TULIP_GP_EB_INIT;
1639 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);
1640 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);
1641 TULIP_CSR_WRITE(sc, csr_command,
1642 TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |
1644 TULIP_CSR_WRITE(sc, csr_command,
1645 TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);
1647 gpdata = TULIP_CSR_READ(sc, csr_gp);
1649 sc->tulip_media = TULIP_MEDIA_10BASET;
1652 sc->tulip_media = TULIP_MEDIA_BNC;
1654 sc->tulip_media = TULIP_MEDIA_100BASETX;
1657 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_BNC,
1660 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1663 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1666 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1670 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1685 tulip_21140_smc9332_media_probe(tulip_softc_t * const sc)
1687 tulip_media_info_t *mip = sc->tulip_mediainfo;
1690 TULIP_LOCK_ASSERT(sc);
1691 TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT|TULIP_CMD_MUSTBEONE);
1692 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
1696 TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT |
1698 sc->tulip_gpinit = TULIP_GP_SMC_9332_PINS;
1699 sc->tulip_gpdata = TULIP_GP_SMC_9332_INIT;
1700 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_PINS|TULIP_GP_PINSET);
1701 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_INIT);
1704 u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);
1715 sc->tulip_media = cnt > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;
1716 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1720 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1724 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1727 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1741 tulip_21140_cogent_em100_media_probe(tulip_softc_t * const sc)
1743 tulip_media_info_t *mip = sc->tulip_mediainfo;
1744 u_int32_t cmdmode = TULIP_CSR_READ(sc, csr_command);
1746 TULIP_LOCK_ASSERT(sc);
1747 sc->tulip_gpinit = TULIP_GP_EM100_PINS;
1748 sc->tulip_gpdata = TULIP_GP_EM100_INIT;
1749 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_PINS);
1750 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_INIT);
1754 if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100FX_ID) {
1755 TULIP_CSR_WRITE(sc, csr_command, cmdmode);
1756 sc->tulip_media = TULIP_MEDIA_100BASEFX;
1758 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX,
1761 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX_FD,
1766 TULIP_CSR_WRITE(sc, csr_command, cmdmode|TULIP_CMD_SCRAMBLER);
1767 sc->tulip_media = TULIP_MEDIA_100BASETX;
1768 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1772 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1788 tulip_21140_znyx_zx34x_media_probe(tulip_softc_t * const sc)
1790 tulip_media_info_t *mip = sc->tulip_mediainfo;
1793 TULIP_LOCK_ASSERT(sc);
1794 sc->tulip_gpinit = TULIP_GP_ZX34X_PINS;
1795 sc->tulip_gpdata = TULIP_GP_ZX34X_INIT;
1796 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ZX34X_PINS);
1797 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ZX34X_INIT);
1798 TULIP_CSR_WRITE(sc, csr_command,
1799 TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |
1801 TULIP_CSR_WRITE(sc, csr_command,
1802 TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);
1806 u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);
1819 sc->tulip_media = cnt100 > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;
1820 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1823 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1826 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1830 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1845 tulip_2114x_media_probe(tulip_softc_t * const sc)
1847 TULIP_LOCK_ASSERT(sc);
1848 sc->tulip_cmdmode |= TULIP_CMD_MUSTBEONE
1867 #define EMIT do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); DELAY(1); } while (0)
1870 tulip_srom_idle(tulip_softc_t * const sc)
1892 tulip_srom_read(tulip_softc_t * const sc)
1900 tulip_srom_idle(sc);
1926 data |= TULIP_CSR_READ(sc, csr_srom_mii) & SROMDIN ? 1 : 0;
1929 sc->tulip_rombuf[idx*2] = data & 0xFF;
1930 sc->tulip_rombuf[idx*2+1] = data >> 8;
1934 tulip_srom_idle(sc);
1937 #define MII_EMIT do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); DELAY(1); } while (0)
1940 tulip_mii_writebits(tulip_softc_t * const sc, unsigned data, unsigned bits)
1943 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1946 TULIP_LOCK_ASSERT(sc);
1961 tulip_mii_turnaround(tulip_softc_t * const sc, unsigned cmd)
1963 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1965 TULIP_LOCK_ASSERT(sc);
1979 tulip_mii_readbits(tulip_softc_t * const sc)
1982 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1985 TULIP_LOCK_ASSERT(sc);
1989 if (TULIP_CSR_READ(sc, csr_srom_mii) & MII_DIN)
1999 tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno)
2001 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
2004 TULIP_LOCK_ASSERT(sc);
2006 tulip_mii_writebits(sc, MII_PREAMBLE, 32);
2007 tulip_mii_writebits(sc, MII_RDCMD, 8);
2008 tulip_mii_writebits(sc, devaddr, 5);
2009 tulip_mii_writebits(sc, regno, 5);
2010 tulip_mii_turnaround(sc, MII_RDCMD);
2012 data = tulip_mii_readbits(sc);
2014 sc->tulip_dbg.dbg_phyregs[regno][0] = data;
2015 sc->tulip_dbg.dbg_phyregs[regno][1]++;
2021 tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno,
2024 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
2026 TULIP_LOCK_ASSERT(sc);
2028 tulip_mii_writebits(sc, MII_PREAMBLE, 32);
2029 tulip_mii_writebits(sc, MII_WRCMD, 8);
2030 tulip_mii_writebits(sc, devaddr, 5);
2031 tulip_mii_writebits(sc, regno, 5);
2032 tulip_mii_turnaround(sc, MII_WRCMD);
2033 tulip_mii_writebits(sc, data, 16);
2035 sc->tulip_dbg.dbg_phyregs[regno][2] = data;
2036 sc->tulip_dbg.dbg_phyregs[regno][3]++;
2046 tulip_identify_dec_nic(tulip_softc_t * const sc)
2048 TULIP_LOCK_ASSERT(sc);
2049 strcpy(sc->tulip_boardid, "DEC ");
2051 if (sc->tulip_chipid <= TULIP_21040)
2053 if (bcmp(sc->tulip_rombuf + 29, "DE500", 5) == 0
2054 || bcmp(sc->tulip_rombuf + 29, "DE450", 5) == 0) {
2055 bcopy(sc->tulip_rombuf + 29, &sc->tulip_boardid[D0], 8);
2056 sc->tulip_boardid[D0+8] = ' ';
2062 tulip_identify_znyx_nic(tulip_softc_t * const sc)
2066 TULIP_LOCK_ASSERT(sc);
2067 strcpy(sc->tulip_boardid, "ZNYX ZX3XX ");
2068 if (sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) {
2070 sc->tulip_boardid[8] = '4';
2071 znyx_ptr = sc->tulip_rombuf[124] + 256 * sc->tulip_rombuf[125];
2073 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
2078 if (sc->tulip_rombuf[znyx_ptr] == 0x4A
2079 && sc->tulip_rombuf[znyx_ptr + 1] == 0x52
2080 && sc->tulip_rombuf[znyx_ptr + 2] == 0x01) {
2081 id = sc->tulip_rombuf[znyx_ptr + 5] + 256 * sc->tulip_rombuf[znyx_ptr + 4];
2083 sc->tulip_boardid[9] = '2';
2085 sc->tulip_boardid[10] = 'B';
2086 sc->tulip_boardid[11] = ' ';
2088 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
2090 sc->tulip_boardid[10] = '4';
2091 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
2093 sc->tulip_boardid[9] = (sc->tulip_rombuf[19] > 1) ? '8' : '5';
2095 sc->tulip_boardid[9] = '6';
2097 sc->tulip_boardid[8] = '5';
2098 sc->tulip_boardid[9] = '1';
2105 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
2109 sc->tulip_boardid[8] = '1';
2110 if (sc->tulip_chipid == TULIP_21041) {
2111 sc->tulip_boardid[10] = '1';
2114 if (sc->tulip_rombuf[32] == 0x4A && sc->tulip_rombuf[33] == 0x52) {
2115 id = sc->tulip_rombuf[37] + 256 * sc->tulip_rombuf[36];
2117 sc->tulip_boardid[9] = '2';
2118 sc->tulip_boardid[10] = 'T';
2119 sc->tulip_boardid[11] = ' ';
2120 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
2122 sc->tulip_boardid[9] = '4';
2123 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
2124 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2126 sc->tulip_boardid[9] = '4';
2127 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
2128 sc->tulip_features |= TULIP_HAVE_BASEROM;
2130 sc->tulip_boardid[9] = '5';
2131 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2133 sc->tulip_boardid[9] = '5';
2134 sc->tulip_features |= TULIP_HAVE_BASEROM;
2140 if ((sc->tulip_enaddr[3] & ~3) == 0xF0 && (sc->tulip_enaddr[5] & 2) == 0) {
2141 sc->tulip_boardid[9] = '4';
2142 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
2143 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2144 } else if ((sc->tulip_enaddr[3] & ~3) == 0xF4 && (sc->tulip_enaddr[5] & 1) == 0) {
2145 sc->tulip_boardid[9] = '5';
2146 sc->tulip_boardsw = &tulip_21040_boardsw;
2147 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2148 } else if ((sc->tulip_enaddr[3] & ~3) == 0xEC) {
2149 sc->tulip_boardid[9] = '2';
2150 sc->tulip_boardsw = &tulip_21040_boardsw;
2156 tulip_identify_smc_nic(tulip_softc_t * const sc)
2162 TULIP_LOCK_ASSERT(sc);
2163 strcpy(sc->tulip_boardid, "SMC ");
2164 if (sc->tulip_chipid == TULIP_21041)
2166 if (sc->tulip_chipid != TULIP_21040) {
2167 if (sc->tulip_boardsw != &tulip_2114x_isv_boardsw) {
2168 strcpy(&sc->tulip_boardid[4], "9332DST ");
2169 sc->tulip_boardsw = &tulip_21140_smc9332_boardsw;
2170 } else if (sc->tulip_features & (TULIP_HAVE_BASEROM|TULIP_HAVE_SLAVEDROM)) {
2171 strcpy(&sc->tulip_boardid[4], "9334BDT ");
2173 strcpy(&sc->tulip_boardid[4], "9332BDT ");
2177 id1 = sc->tulip_rombuf[0x60] | (sc->tulip_rombuf[0x61] << 8);
2178 id2 = sc->tulip_rombuf[0x62] | (sc->tulip_rombuf[0x63] << 8);
2179 ei = sc->tulip_rombuf[0x66] | (sc->tulip_rombuf[0x67] << 8);
2181 strcpy(&sc->tulip_boardid[4], "8432");
2182 cp = &sc->tulip_boardid[8];
2190 sc->tulip_boardid[7] = '4';
2199 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
2201 sc->tulip_boardsw = &tulip_21040_auibnc_only_boardsw;
2205 tulip_identify_cogent_nic(tulip_softc_t * const sc)
2207 TULIP_LOCK_ASSERT(sc);
2208 strcpy(sc->tulip_boardid, "Cogent ");
2209 if (sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) {
2210 if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100TX_ID) {
2211 strcat(sc->tulip_boardid, "EM100TX ");
2212 sc->tulip_boardsw = &tulip_21140_cogent_em100_boardsw;
2214 } else if (sc->tulip_rombuf[32] == TULIP_COGENT_EM110TX_ID) {
2215 strcat(sc->tulip_boardid, "EM110TX ");
2216 sc->tulip_boardsw = &tulip_21140_cogent_em100_boardsw;
2218 } else if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100FX_ID) {
2219 strcat(sc->tulip_boardid, "EM100FX ");
2220 sc->tulip_boardsw = &tulip_21140_cogent_em100_boardsw;
2226 if (*(u_int32_t *) sc->tulip_rombuf == 0x24001109U
2227 && (sc->tulip_features & TULIP_HAVE_BASEROM)) {
2232 strcat(sc->tulip_boardid, "EM440TX ");
2233 sc->tulip_features |= TULIP_HAVE_SHAREDINTR;
2235 } else if (sc->tulip_chipid == TULIP_21040) {
2236 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2241 tulip_identify_accton_nic(tulip_softc_t * const sc)
2243 TULIP_LOCK_ASSERT(sc);
2244 strcpy(sc->tulip_boardid, "ACCTON ");
2245 switch (sc->tulip_chipid) {
2247 strcat(sc->tulip_boardid, "EN1207 ");
2248 if (sc->tulip_boardsw != &tulip_2114x_isv_boardsw)
2249 sc->tulip_boardsw = &tulip_21140_accton_boardsw;
2252 strcat(sc->tulip_boardid, "EN1207TX ");
2253 if (sc->tulip_boardsw != &tulip_2114x_isv_boardsw)
2254 sc->tulip_boardsw = &tulip_21140_eb_boardsw;
2257 strcat(sc->tulip_boardid, "EN1203 ");
2258 sc->tulip_boardsw = &tulip_21040_boardsw;
2261 strcat(sc->tulip_boardid, "EN1203 ");
2262 sc->tulip_boardsw = &tulip_21041_boardsw;
2265 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2271 tulip_identify_asante_nic(tulip_softc_t * const sc)
2273 TULIP_LOCK_ASSERT(sc);
2274 strcpy(sc->tulip_boardid, "Asante ");
2275 if ((sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A)
2276 && sc->tulip_boardsw != &tulip_2114x_isv_boardsw) {
2277 tulip_media_info_t *mi = sc->tulip_mediainfo;
2285 sc->tulip_gpinit = TULIP_GP_ASANTE_PINS;
2286 sc->tulip_gpdata = 0;
2288 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ASANTE_PINS|TULIP_GP_PINSET);
2289 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ASANTE_PHYRESET);
2291 TULIP_CSR_WRITE(sc, csr_gp, 0);
2302 mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, 0);
2305 device_printf(sc->tulip_dev, "can't find phy 0\n");
2309 sc->tulip_features |= TULIP_HAVE_MII;
2314 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD);
2315 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX);
2316 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4);
2317 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD);
2318 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET);
2319 mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) |
2320 tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH);
2322 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2327 tulip_identify_compex_nic(tulip_softc_t * const sc)
2329 TULIP_LOCK_ASSERT(sc);
2330 strcpy(sc->tulip_boardid, "COMPEX ");
2331 if (sc->tulip_chipid == TULIP_21140A) {
2335 strcat(sc->tulip_boardid, "400TX/PCI ");
2340 sc->tulip_features |= TULIP_HAVE_SHAREDINTR;
2341 for (root_unit = sc->tulip_unit - 1; root_unit >= 0; root_unit--) {
2349 && root_sc->tulip_chipid == sc->tulip_chipid
2350 && root_sc->tulip_pci_busno == sc->tulip_pci_busno) {
2351 sc->tulip_features |= TULIP_HAVE_SLAVEDINTR;
2352 sc->tulip_slaves = root_sc->tulip_slaves;
2353 root_sc->tulip_slaves = sc;
2354 } else if(sc->tulip_features & TULIP_HAVE_SLAVEDINTR) {
2356 sc->tulip_ifp->if_xname);
2359 strcat(sc->tulip_boardid, "unknown ");
2361 /* sc->tulip_boardsw = &tulip_21140_eb_boardsw; */
2366 tulip_srom_decode(tulip_softc_t * const sc)
2370 const tulip_srom_header_t *shp = (const tulip_srom_header_t *) &sc->tulip_rombuf[0];
2373 tulip_media_info_t *mi = sc->tulip_mediainfo;
2377 TULIP_LOCK_ASSERT(sc);
2381 if (saip->sai_device == sc->tulip_pci_devno)
2393 bcopy(shp->sh_ieee802_address, sc->tulip_enaddr, 6);
2399 sc->tulip_enaddr[5] += idx1;
2403 dp = sc->tulip_rombuf + leaf_offset;
2405 sc->tulip_conntype = (tulip_srom_connection_t) (dp[0] + dp[1] * 256); dp += 2;
2408 if (tulip_srom_conninfo[idx2].sc_type == sc->tulip_conntype
2412 sc->tulip_connidx = idx2;
2414 if (sc->tulip_chipid == TULIP_21041) {
2428 sc->tulip_mediums[media] = mi;
2436 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, BNC);
2441 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, AUI);
2446 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, 10BASET);
2451 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, 10BASET_FD);
2466 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, BNC); mi++;
2467 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, AUI); mi++;
2468 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, 10BASET); mi++;
2469 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, 10BASET_FD); mi++;
2475 if (sc->tulip_features & TULIP_HAVE_GPR)
2476 sc->tulip_gpinit = *dp++;
2500 sc->tulip_mediums[media] = mi;
2503 sc->tulip_gpdata = mi->mi_gpdata;
2524 mi->mi_gpr_offset = dp - sc->tulip_rombuf;
2527 mi->mi_reset_offset = dp - sc->tulip_rombuf;
2534 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_gpinit|TULIP_GP_PINSET);
2537 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_reset_offset + idx3]);
2539 sc->tulip_phyaddr = mi->mi_phyaddr;
2542 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_gpr_offset + idx3]);
2549 TULIP_CSR_WRITE(sc, csr_gp, 0);
2554 mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, phyno);
2558 device_printf(sc->tulip_dev, "can't find phy %d\n",
2563 sc->tulip_features |= TULIP_HAVE_MII;
2568 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD);
2569 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX);
2570 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4);
2571 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD);
2572 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET);
2573 mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) |
2574 tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH);
2589 sc->tulip_mediums[media] = mi;
2598 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, BNC);
2602 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, AUI);
2606 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, 10BASET);
2607 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
2611 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, 10BASET_FD);
2612 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
2631 mi->mi_gpr_offset = dp - sc->tulip_rombuf;
2634 mi->mi_reset_offset = dp - sc->tulip_rombuf;
2637 dp0 = &sc->tulip_rombuf[mi->mi_reset_offset];
2640 TULIP_CSR_WRITE(sc, csr_sia_general, (dp0[0] + 256 * dp0[1]) << 16);
2642 sc->tulip_phyaddr = mi->mi_phyaddr;
2643 dp0 = &sc->tulip_rombuf[mi->mi_gpr_offset];
2646 TULIP_CSR_WRITE(sc, csr_sia_general, (dp0[0] + 256 * dp0[1]) << 16);
2650 TULIP_CSR_WRITE(sc, csr_sia_general, 0);
2655 mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, phyno);
2659 device_printf(sc->tulip_dev, "can't find phy %d\n",
2664 sc->tulip_features |= TULIP_HAVE_MII;
2670 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD);
2671 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX);
2672 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4);
2673 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD);
2674 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET);
2675 mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) |
2676 tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH);
2691 sc->tulip_mediums[media] = mi;
2704 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
2712 mi->mi_reset_offset = dp - sc->tulip_rombuf;
2724 return mi - sc->tulip_mediainfo;
2728 void (*vendor_identify_nic)(tulip_softc_t * const sc);
2749 tulip_read_macaddr(tulip_softc_t * const sc)
2756 sc->tulip_connidx = TULIP_SROM_LASTCONNIDX;
2758 if (sc->tulip_chipid == TULIP_21040) {
2759 TULIP_CSR_WRITE(sc, csr_enetrom, 1);
2760 for (idx = 0; idx < sizeof(sc->tulip_rombuf); idx++) {
2762 while (((csr = TULIP_CSR_READ(sc, csr_enetrom)) & 0x80000000L) && cnt < 10000)
2764 sc->tulip_rombuf[idx] = csr & 0xFF;
2766 sc->tulip_boardsw = &tulip_21040_boardsw;
2768 if (sc->tulip_chipid == TULIP_21041) {
2772 sc->tulip_boardsw = &tulip_21041_boardsw;
2781 sc->tulip_boardsw = &tulip_21140_eb_boardsw;
2783 tulip_srom_read(sc);
2784 if (tulip_srom_crcok(sc->tulip_rombuf)) {
2789 sc->tulip_features |= TULIP_HAVE_ISVSROM|TULIP_HAVE_OKSROM;
2790 } else if (sc->tulip_rombuf[126] == 0xff && sc->tulip_rombuf[127] == 0xFF) {
2797 if (sc->tulip_rombuf[idx] != 0)
2800 if (idx == 18 && sc->tulip_rombuf[18] == 1 && sc->tulip_rombuf[19] != 0)
2801 sc->tulip_features |= TULIP_HAVE_ISVSROM;
2802 } else if (sc->tulip_chipid >= TULIP_21142) {
2803 sc->tulip_features |= TULIP_HAVE_ISVSROM;
2804 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2806 if ((sc->tulip_features & TULIP_HAVE_ISVSROM) && tulip_srom_decode(sc)) {
2807 if (sc->tulip_chipid != TULIP_21041)
2808 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2814 if (sc->tulip_rombuf[19] > 1)
2815 sc->tulip_features |= TULIP_HAVE_BASEROM;
2816 if (sc->tulip_boardsw == NULL)
2823 if (bcmp(&sc->tulip_rombuf[0], &sc->tulip_rombuf[16], 8) != 0) {
2832 if (sc->tulip_rombuf[idx] != 0xFF)
2839 if ((sc->tulip_rombuf[0] & 3) != 0)
2841 if (sc->tulip_rombuf[0] == 0 && sc->tulip_rombuf[1] == 0
2842 && sc->tulip_rombuf[2] == 0)
2844 bcopy(sc->tulip_rombuf, sc->tulip_enaddr, 6);
2845 sc->tulip_features |= TULIP_HAVE_OKROM;
2858 for (idx = 0; idx < sizeof(sc->tulip_rombuf); idx++) {
2859 if (sc->tulip_rombuf[idx] != 0 && sc->tulip_rombuf[idx] != 0xFF)
2862 if (idx == sizeof(sc->tulip_rombuf)) {
2865 for (root_unit = sc->tulip_unit - 1; root_unit >= 0; root_unit--) {
2872 && root_sc->tulip_chipid == sc->tulip_chipid
2873 && root_sc->tulip_pci_busno == sc->tulip_pci_busno) {
2874 sc->tulip_features |= TULIP_HAVE_SLAVEDROM;
2875 sc->tulip_boardsw = root_sc->tulip_boardsw;
2876 strcpy(sc->tulip_boardid, root_sc->tulip_boardid);
2877 if (sc->tulip_boardsw->bd_type == TULIP_21140_ISV) {
2878 bcopy(root_sc->tulip_rombuf, sc->tulip_rombuf,
2879 sizeof(sc->tulip_rombuf));
2880 if (!tulip_srom_decode(sc))
2883 bcopy(root_sc->tulip_enaddr, sc->tulip_enaddr, 6);
2884 sc->tulip_enaddr[5] += sc->tulip_unit - root_sc->tulip_unit;
2894 sc->tulip_slaves = root_sc->tulip_slaves;
2895 root_sc->tulip_slaves = sc;
2896 sc->tulip_features |= TULIP_HAVE_SLAVEDINTR;
2907 if (bcmp(&sc->tulip_rombuf[24], testpat, 8) != 0)
2910 tmpbuf[0] = sc->tulip_rombuf[15]; tmpbuf[1] = sc->tulip_rombuf[14];
2911 tmpbuf[2] = sc->tulip_rombuf[13]; tmpbuf[3] = sc->tulip_rombuf[12];
2912 tmpbuf[4] = sc->tulip_rombuf[11]; tmpbuf[5] = sc->tulip_rombuf[10];
2913 tmpbuf[6] = sc->tulip_rombuf[9]; tmpbuf[7] = sc->tulip_rombuf[8];
2914 if (bcmp(&sc->tulip_rombuf[0], tmpbuf, 8) != 0)
2917 bcopy(sc->tulip_rombuf, sc->tulip_enaddr, 6);
2919 cksum = *(u_int16_t *) &sc->tulip_enaddr[0];
2922 cksum += *(u_int16_t *) &sc->tulip_enaddr[2];
2926 cksum += *(u_int16_t *) &sc->tulip_enaddr[4];
2929 rom_cksum = *(u_int16_t *) &sc->tulip_rombuf[6];
2939 if (bcmp(sc->tulip_enaddr, tulip_vendors[idx].vendor_oui, 3) == 0) {
2940 (*tulip_vendors[idx].vendor_identify_nic)(sc);
2945 sc->tulip_features |= TULIP_HAVE_OKROM;
2950 tulip_ifmedia_add(tulip_softc_t * const sc)
2955 TULIP_LOCK_ASSERT(sc);
2957 if (sc->tulip_mediums[media] != NULL) {
2958 ifmedia_add(&sc->tulip_ifmedia, tulip_media_to_ifmedia[media],
2964 sc->tulip_features |= TULIP_HAVE_NOMEDIA;
2965 ifmedia_add(&sc->tulip_ifmedia, IFM_ETHER | IFM_NONE, 0, 0);
2966 ifmedia_set(&sc->tulip_ifmedia, IFM_ETHER | IFM_NONE);
2967 } else if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) {
2968 ifmedia_add(&sc->tulip_ifmedia, IFM_ETHER | IFM_AUTO, 0, 0);
2969 ifmedia_set(&sc->tulip_ifmedia, IFM_ETHER | IFM_AUTO);
2971 ifmedia_set(&sc->tulip_ifmedia, tulip_media_to_ifmedia[sc->tulip_media]);
2972 sc->tulip_flags |= TULIP_PRINTMEDIA;
2973 tulip_linkup(sc, sc->tulip_media);
2980 tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc;
2982 TULIP_LOCK(sc);
2983 sc->tulip_flags |= TULIP_NEEDRESET;
2984 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
2985 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
2986 if (IFM_SUBTYPE(sc->tulip_ifmedia.ifm_media) != IFM_AUTO) {
2989 if (sc->tulip_mediums[media] != NULL
2990 && sc->tulip_ifmedia.ifm_media == tulip_media_to_ifmedia[media]) {
2991 sc->tulip_flags |= TULIP_PRINTMEDIA;
2992 sc->tulip_flags &= ~TULIP_DIDNWAY;
2993 tulip_linkup(sc, media);
2994 TULIP_UNLOCK(sc);
2999 sc->tulip_flags &= ~(TULIP_TXPROBE_ACTIVE|TULIP_WANTRXACT);
3000 tulip_reset(sc);
3001 tulip_init_locked(sc);
3002 TULIP_UNLOCK(sc);
3012 tulip_softc_t *sc = (tulip_softc_t *)ifp->if_softc;
3014 TULIP_LOCK(sc);
3015 if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) {
3016 TULIP_UNLOCK(sc);
3021 if (sc->tulip_flags & TULIP_LINKUP)
3024 req->ifm_active = tulip_media_to_ifmedia[sc->tulip_media];
3025 TULIP_UNLOCK(sc);
3029 tulip_addr_filter(tulip_softc_t * const sc)
3037 TULIP_LOCK_ASSERT(sc);
3038 sc->tulip_flags &= ~(TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY|TULIP_ALLMULTI);
3039 sc->tulip_flags |= TULIP_WANTSETUP|TULIP_WANTTXSTART;
3040 sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN;
3041 sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED;
3043 if (sc->tulip_ifp->if_flags & IFF_ALLMULTI)
3044 sc->tulip_flags |= TULIP_ALLMULTI ;
3048 ifp = sc->tulip_ifp;
3055 bcopy(sc->tulip_enaddr, eaddr, ETHER_ADDR_LEN);
3064 u_int32_t *sp = sc->tulip_setupdata;
3073 if (sc->tulip_features & TULIP_HAVE_BROKEN_HASH)
3074 sc->tulip_flags |= TULIP_WANTHASHONLY;
3076 sc->tulip_flags |= TULIP_WANTHASHPERFECT;
3082 bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata));
3096 if ((sc->tulip_flags & TULIP_ALLMULTI) == 0) {
3099 if (sc->tulip_flags & TULIP_WANTHASHONLY) {
3109 if ((sc->tulip_flags & (TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY)) == 0) {
3110 u_int32_t *sp = sc->tulip_setupdata;
3112 if ((sc->tulip_flags & TULIP_ALLMULTI) == 0) {
3146 tulip_reset(tulip_softc_t * const sc)
3151 u_int32_t inreset = (sc->tulip_flags & TULIP_INRESET);
3153 TULIP_LOCK_ASSERT(sc);
3164 if ((sc->tulip_flags & TULIP_DEVICEPROBE) == 0
3165 && sc->tulip_boardsw->bd_media_preset != NULL)
3166 (*sc->tulip_boardsw->bd_media_preset)(sc);
3168 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
3174 sc->tulip_flags |= TULIP_INRESET;
3175 sc->tulip_flags &= ~(TULIP_NEEDRESET|TULIP_RXBUFSLOW);
3176 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3179 TULIP_CSR_WRITE(sc, csr_txlist, sc->tulip_txinfo.ri_dma_addr & 0xffffffff);
3180 TULIP_CSR_WRITE(sc, csr_rxlist, sc->tulip_rxinfo.ri_dma_addr & 0xffffffff);
3181 TULIP_CSR_WRITE(sc, csr_busmode,
3188 sc->tulip_txtimer = 0;
3193 ri = &sc->tulip_txinfo;
3212 ri = &sc->tulip_rxinfo;
3235 sc->tulip_intrmask |= TULIP_STS_NORMALINTR|TULIP_STS_RXINTR|TULIP_STS_TXINTR
3240 if ((sc->tulip_flags & TULIP_DEVICEPROBE) == 0)
3241 (*sc->tulip_boardsw->bd_media_select)(sc);
3243 if ((sc->tulip_flags & TULIP_NEEDRESET) == TULIP_NEEDRESET)
3244 device_printf(sc->tulip_dev,
3248 tulip_media_print(sc);
3249 if (sc->tulip_features & TULIP_HAVE_DUALSENSE)
3250 TULIP_CSR_WRITE(sc, csr_sia_status, TULIP_CSR_READ(sc, csr_sia_status));
3252 sc->tulip_flags &= ~(TULIP_DOINGSETUP|TULIP_WANTSETUP|TULIP_INRESET
3260 tulip_softc_t *sc = (tulip_softc_t *)arg;
3262 TULIP_LOCK(sc);
3263 tulip_init_locked(sc);
3264 TULIP_UNLOCK(sc);
3268 tulip_init_locked(tulip_softc_t * const sc)
3271 if (sc->tulip_ifp->if_flags & IFF_UP) {
3272 if ((sc->tulip_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
3275 tulip_reset(sc);
3277 tulip_addr_filter(sc);
3278 sc->tulip_ifp->if_drv_flags |= IFF_DRV_RUNNING;
3279 if (sc->tulip_ifp->if_flags & IFF_PROMISC) {
3280 sc->tulip_flags |= TULIP_PROMISC;
3281 sc->tulip_cmdmode |= TULIP_CMD_PROMISCUOUS;
3282 sc->tulip_intrmask |= TULIP_STS_TXINTR;
3284 sc->tulip_flags &= ~TULIP_PROMISC;
3285 sc->tulip_cmdmode &= ~TULIP_CMD_PROMISCUOUS;
3286 if (sc->tulip_flags & TULIP_ALLMULTI) {
3287 sc->tulip_cmdmode |= TULIP_CMD_ALLMULTI;
3289 sc->tulip_cmdmode &= ~TULIP_CMD_ALLMULTI;
3292 sc->tulip_cmdmode |= TULIP_CMD_TXRUN;
3293 if ((sc->tulip_flags & (TULIP_TXPROBE_ACTIVE|TULIP_WANTSETUP)) == 0) {
3294 tulip_rx_intr(sc);
3295 sc->tulip_cmdmode |= TULIP_CMD_RXRUN;
3296 sc->tulip_intrmask |= TULIP_STS_RXSTOPPED;
3298 sc->tulip_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3299 sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN;
3300 sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED;
3303 sc->tulip_intrmask, sc->tulip_cmdmode);
3304 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
3305 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3307 TULIP_CSR_READ(sc, csr_status));
3308 if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP)
3309 tulip_txput_setup(sc);
3310 callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc);
3313 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
3314 tulip_reset(sc);
3315 tulip_addr_filter(sc);
3316 callout_stop(&sc->tulip_stat_timer);
3324 tulip_rx_intr(tulip_softc_t * const sc)
3327 tulip_ringinfo_t * const ri = &sc->tulip_rxinfo;
3328 struct ifnet * const ifp = sc->tulip_ifp;
3334 TULIP_LOCK_ASSERT(sc);
3391 sc->tulip_dbg.dbg_rxintrs++;
3392 sc->tulip_dbg.dbg_rxpktsperintr[cnt]++;
3435 if ((sc->tulip_flags & TULIP_RXIGNORE) == 0
3438 sc->tulip_flags |= TULIP_RXACT;
3447 sc->tulip_dot3stats.dot3StatsInternalMacReceiveErrors++;
3453 sc->tulip_dot3stats.dot3StatsFrameTooLongs++;
3460 sc->tulip_dot3stats.dot3StatsAlignmentErrors++;
3465 sc->tulip_dot3stats.dot3StatsFCSErrors++;
3472 if (error != NULL && (sc->tulip_flags & TULIP_NOMESSAGES) == 0) {
3473 device_printf(sc->tulip_dev, "receive: %6D: %s\n",
3476 sc->tulip_flags |= TULIP_NOMESSAGES;
3526 TULIP_UNLOCK(sc);
3529 TULIP_LOCK(sc);
3546 sc->tulip_flags |= TULIP_RXBUFSLOW;
3548 sc->tulip_dbg.dbg_rxlowbufs++;
3567 device_printf(sc->tulip_dev,
3585 sc->tulip_flags &= ~TULIP_RXBUFSLOW;
3590 sc->tulip_dbg.dbg_rxintrs++;
3591 sc->tulip_dbg.dbg_rxpktsperintr[cnt]++;
3597 tulip_tx_intr(tulip_softc_t * const sc)
3600 tulip_ringinfo_t * const ri = &sc->tulip_txinfo;
3606 TULIP_LOCK_ASSERT(sc);
3629 bus_dmamap_sync(sc->tulip_setup_tag, sc->tulip_setup_map,
3631 sc->tulip_flags &= ~(TULIP_DOINGSETUP|TULIP_HASHONLY);
3633 sc->tulip_flags |= TULIP_HASHONLY;
3634 if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == 0) {
3635 tulip_rx_intr(sc);
3636 sc->tulip_cmdmode |= TULIP_CMD_RXRUN;
3637 sc->tulip_intrmask |= TULIP_STS_RXSTOPPED;
3640 sc->tulip_intrmask, sc->tulip_cmdmode);
3641 TULIP_CSR_WRITE(sc, csr_status, TULIP_STS_RXSTOPPED);
3642 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
3643 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3656 device_printf(sc->tulip_dev,
3660 if (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) {
3665 sc->tulip_dbg.dbg_txprobe_nocarr++;
3667 sc->tulip_dbg.dbg_txprobe_exccoll++;
3671 (*sc->tulip_boardsw->bd_media_poll)(sc, event);
3681 sc->tulip_ifp->if_oerrors++;
3683 sc->tulip_dot3stats.dot3StatsExcessiveCollisions++;
3685 sc->tulip_dot3stats.dot3StatsLateCollisions++;
3687 sc->tulip_dot3stats.dot3StatsCarrierSenseErrors++;
3689 sc->tulip_dot3stats.dot3StatsInternalMacTransmitErrors++;
3691 sc->tulip_dot3stats.dot3StatsInternalTransmitUnderflows++;
3693 sc->tulip_dot3stats.dot3StatsInternalTransmitBabbles++;
3702 sc->tulip_ifp->if_collisions += collisions;
3704 sc->tulip_dot3stats.dot3StatsSingleCollisionFrames++;
3706 sc->tulip_dot3stats.dot3StatsMultipleCollisionFrames++;
3708 sc->tulip_dot3stats.dot3StatsDeferredTransmissions++;
3715 if (d_status & TULIP_DSTS_TxNOHRTBT & sc->tulip_flags)
3716 sc->tulip_dot3stats.dot3StatsSQETestErrors++;
3725 if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0)
3726 sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3732 if (ri->ri_free == ri->ri_max || (sc->tulip_flags & TULIP_TXPROBE_ACTIVE))
3733 sc->tulip_txtimer = 0;
3735 sc->tulip_txtimer = TULIP_TXTIMER;
3736 sc->tulip_ifp->if_opackets += xmits;
3742 tulip_print_abnormal_interrupt(tulip_softc_t * const sc, u_int32_t csr)
3749 TULIP_LOCK_ASSERT(sc);
3751 device_printf(sc->tulip_dev, "abnormal interrupt:");
3755 if (mask == TULIP_STS_TXUNDERFLOW && (sc->tulip_flags & TULIP_NEWTXTHRESH)) {
3756 sc->tulip_flags &= ~TULIP_NEWTXTHRESH;
3757 if (sc->tulip_cmdmode & TULIP_CMD_STOREFWD) {
3761 &thrsh[9 * ((sc->tulip_cmdmode & TULIP_CMD_THRESHOLDCTL) >> 14)]);
3771 tulip_intr_handler(tulip_softc_t * const sc)
3777 TULIP_LOCK_ASSERT(sc);
3778 while ((csr = TULIP_CSR_READ(sc, csr_status)) & sc->tulip_intrmask) {
3779 TULIP_CSR_WRITE(sc, csr_status, csr);
3782 sc->tulip_last_system_error = (csr & TULIP_STS_ERRORMASK) >> TULIP_STS_ERR_SHIFT;
3783 if (sc->tulip_flags & TULIP_NOMESSAGES) {
3784 sc->tulip_flags |= TULIP_SYSTEMERROR;
3786 device_printf(sc->tulip_dev, "system error: %s\n",
3787 tulip_system_errors[sc->tulip_last_system_error]);
3789 sc->tulip_flags |= TULIP_NEEDRESET;
3790 sc->tulip_system_errors++;
3793 if (csr & (TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL) & sc->tulip_intrmask) {
3795 sc->tulip_dbg.dbg_link_intrs++;
3797 if (sc->tulip_boardsw->bd_media_poll != NULL) {
3798 (*sc->tulip_boardsw->bd_media_poll)(sc, csr & TULIP_STS_LINKFAIL
3803 tulip_media_print(sc);
3806 u_int32_t misses = TULIP_CSR_READ(sc, csr_missed_frames);
3808 sc->tulip_dot3stats.dot3StatsMissedFrames += misses & 0xFFFF;
3813 if ((misses & 0x0FFE0000) && (sc->tulip_features & TULIP_HAVE_RXBADOVRFLW)) {
3814 sc->tulip_dot3stats.dot3StatsInternalMacReceiveErrors++;
3819 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode & ~TULIP_CMD_RXRUN);
3820 while ((TULIP_CSR_READ(sc, csr_status) & TULIP_STS_RXSTOPPED) == 0)
3822 TULIP_CSR_WRITE(sc, csr_status, TULIP_STS_RXSTOPPED);
3823 sc->tulip_flags |= TULIP_RXIGNORE;
3825 tulip_rx_intr(sc);
3826 if (sc->tulip_flags & TULIP_RXIGNORE) {
3830 sc->tulip_flags &= ~TULIP_RXIGNORE;
3831 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3835 u_int32_t tmp = csr & sc->tulip_intrmask
3838 if ((sc->tulip_cmdmode & TULIP_CMD_THRESHOLDCTL) != TULIP_CMD_THRSHLD160) {
3839 sc->tulip_cmdmode += TULIP_CMD_THRSHLD96;
3840 sc->tulip_flags |= TULIP_NEWTXTHRESH;
3841 } else if (sc->tulip_features & TULIP_HAVE_STOREFWD) {
3842 sc->tulip_cmdmode |= TULIP_CMD_STOREFWD;
3843 sc->tulip_flags |= TULIP_NEWTXTHRESH;
3846 if (sc->tulip_flags & TULIP_NOMESSAGES) {
3847 sc->tulip_statusbits |= tmp;
3849 tulip_print_abnormal_interrupt(sc, tmp);
3850 sc->tulip_flags |= TULIP_NOMESSAGES;
3852 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3854 if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_TXPROBE_ACTIVE|TULIP_DOINGSETUP|TULIP_PROMISC)) {
3855 tulip_tx_intr(sc);
3856 if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0)
3857 tulip_start_locked(sc);
3860 if (sc->tulip_flags & TULIP_NEEDRESET) {
3861 tulip_reset(sc);
3862 tulip_init_locked(sc);
3870 tulip_softc_t * sc = arg;
3872 for (; sc != NULL; sc = sc->tulip_slaves) {
3873 TULIP_LOCK(sc);
3875 sc->tulip_dbg.dbg_intrs++;
3877 tulip_intr_handler(sc);
3878 TULIP_UNLOCK(sc);
3885 tulip_softc_t * sc = (tulip_softc_t *) arg;
3887 TULIP_LOCK(sc);
3889 sc->tulip_dbg.dbg_intrs++;
3891 tulip_intr_handler(sc);
3892 TULIP_UNLOCK(sc);
3896 tulip_txput(tulip_softc_t * const sc, struct mbuf *m)
3899 tulip_ringinfo_t * const ri = &sc->tulip_txinfo;
3908 TULIP_LOCK_ASSERT(sc);
3910 if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) {
3911 device_printf(sc->tulip_dev, "txput%s: tx not running\n",
3912 (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) ? "(probe)" : "");
3913 sc->tulip_flags |= TULIP_WANTTXSTART;
3914 sc->tulip_dbg.dbg_txput_finishes[0]++;
3956 sc->tulip_dbg.dbg_no_txmaps++;
3958 free += tulip_tx_intr(sc);
3961 sc->tulip_flags |= TULIP_WANTTXSTART;
3963 sc->tulip_dbg.dbg_txput_finishes[1]++;
3979 sc->tulip_flags |= TULIP_WANTTXSTART;
3981 sc->tulip_dbg.dbg_txput_finishes[2]++;
3990 device_printf(sc->tulip_dev,
3993 sc->tulip_dbg.dbg_txput_finishes[3]++;
4008 && (free += tulip_tx_intr(sc)) <= 0) {
4015 sc->tulip_flags |= TULIP_WANTTXSTART;
4017 sc->tulip_dbg.dbg_txput_finishes[4]++;
4063 if (!(sc->tulip_flags & TULIP_DEVICEPROBE))
4064 BPF_MTAP(sc->tulip_ifp, m);
4109 if (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) {
4110 TULIP_CSR_WRITE(sc, csr_txpoll, 1);
4111 sc->tulip_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
4119 sc->tulip_flags &= ~TULIP_WANTTXSTART;
4120 if (sc->tulip_txtimer == 0)
4121 sc->tulip_txtimer = TULIP_TXTIMER;
4123 sc->tulip_dbg.dbg_txput_finishes[5]++;
4137 sc->tulip_dbg.dbg_txput_finishes[6]++;
4139 if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_DOINGSETUP)) {
4140 sc->tulip_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
4141 if ((sc->tulip_intrmask & TULIP_STS_TXINTR) == 0) {
4142 sc->tulip_intrmask |= TULIP_STS_TXINTR;
4143 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
4145 } else if ((sc->tulip_flags & TULIP_PROMISC) == 0) {
4146 if (sc->tulip_intrmask & TULIP_STS_TXINTR) {
4147 sc->tulip_intrmask &= ~TULIP_STS_TXINTR;
4148 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
4151 TULIP_CSR_WRITE(sc, csr_txpoll, 1);
4157 tulip_txput_setup(tulip_softc_t * const sc)
4159 tulip_ringinfo_t * const ri = &sc->tulip_txinfo;
4162 TULIP_LOCK_ASSERT(sc);
4169 if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) {
4170 device_printf(sc->tulip_dev, "txput_setup: tx not running\n");
4171 sc->tulip_flags |= TULIP_WANTTXSTART;
4179 tulip_tx_intr(sc);
4180 if ((sc->tulip_flags & TULIP_DOINGSETUP) || ri->ri_free == 1) {
4181 sc->tulip_flags |= TULIP_WANTTXSTART;
4184 bcopy(sc->tulip_setupdata, sc->tulip_setupbuf,
4185 sizeof(sc->tulip_setupdata));
4190 sc->tulip_flags ^= TULIP_WANTSETUP|TULIP_DOINGSETUP;
4196 if (sc->tulip_flags & TULIP_WANTHASHPERFECT)
4198 else if (sc->tulip_flags & TULIP_WANTHASHONLY)
4203 nextout->d_length1 = sizeof(sc->tulip_setupdata);
4204 nextout->d_addr1 = sc->tulip_setup_dma_addr & 0xffffffff;
4205 bus_dmamap_sync(sc->tulip_setup_tag, sc->tulip_setup_map,
4229 TULIP_CSR_WRITE(sc, csr_txpoll, 1);
4230 if ((sc->tulip_intrmask & TULIP_STS_TXINTR) == 0) {
4231 sc->tulip_intrmask |= TULIP_STS_TXINTR;
4232 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
4240 tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc;
4246 TULIP_LOCK(sc);
4247 tulip_init_locked(sc);
4248 TULIP_UNLOCK(sc);
4254 error = ifmedia_ioctl(ifp, ifr, &sc->tulip_ifmedia, cmd);
4263 TULIP_LOCK(sc);
4264 tulip_init_locked(sc);
4265 TULIP_UNLOCK(sc);
4272 error = copyout(sc->tulip_rombuf, ifr->ifr_data, sizeof(sc->tulip_rombuf));
4278 ifr->ifr_metric = (int) sc->tulip_chipid;
4296 tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc;
4298 TULIP_LOCK(sc);
4299 tulip_start_locked(sc);
4300 TULIP_UNLOCK(sc);
4306 tulip_start_locked(tulip_softc_t * const sc)
4310 TULIP_LOCK_ASSERT(sc);
4313 if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP)
4314 tulip_txput_setup(sc);
4317 sc->tulip_ifp->if_snd.ifq_len);
4318 while (!IFQ_DRV_IS_EMPTY(&sc->tulip_ifp->if_snd)) {
4319 IFQ_DRV_DEQUEUE(&sc->tulip_ifp->if_snd, m);
4322 if ((m = tulip_txput(sc, m)) != NULL) {
4323 IFQ_DRV_PREPEND(&sc->tulip_ifp->if_snd, m);
4333 tulip_softc_t *sc = arg;
4338 TULIP_LOCK_ASSERT(sc);
4339 callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc);
4341 rxintrs = sc->tulip_dbg.dbg_rxintrs - sc->tulip_dbg.dbg_last_rxintrs;
4342 if (rxintrs > sc->tulip_dbg.dbg_high_rxintrs_hz)
4343 sc->tulip_dbg.dbg_high_rxintrs_hz = rxintrs;
4344 sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs;
4351 if (sc->tulip_flags & (TULIP_SYSTEMERROR|TULIP_RXBUFSLOW|TULIP_NOMESSAGES)) {
4355 if (sc->tulip_flags & TULIP_RXBUFSLOW)
4356 tulip_rx_intr(sc);
4358 if (sc->tulip_flags & TULIP_SYSTEMERROR) {
4359 if_printf(sc->tulip_ifp, "%d system errors: last was %s\n",
4360 sc->tulip_system_errors,
4361 tulip_system_errors[sc->tulip_last_system_error]);
4363 if (sc->tulip_statusbits) {
4364 tulip_print_abnormal_interrupt(sc, sc->tulip_statusbits);
4365 sc->tulip_statusbits = 0;
4368 sc->tulip_flags &= ~(TULIP_NOMESSAGES|TULIP_SYSTEMERROR);
4371 if (sc->tulip_txtimer)
4372 tulip_tx_intr(sc);
4373 if (sc->tulip_txtimer && --sc->tulip_txtimer == 0) {
4374 if_printf(sc->tulip_ifp, "transmission timeout\n");
4375 if (TULIP_DO_AUTOSENSE(sc)) {
4376 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
4377 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
4378 sc->tulip_flags &= ~(TULIP_WANTRXACT|TULIP_LINKUP);
4380 tulip_reset(sc);
4381 tulip_init_locked(sc);
4385 TULIP_PERFMERGE(sc, perf_intr_cycles);
4386 TULIP_PERFMERGE(sc, perf_ifstart_cycles);
4387 TULIP_PERFMERGE(sc, perf_ifioctl_cycles);
4388 TULIP_PERFMERGE(sc, perf_stat_cycles);
4389 TULIP_PERFMERGE(sc, perf_timeout_cycles);
4390 TULIP_PERFMERGE(sc, perf_ifstart_one_cycles);
4391 TULIP_PERFMERGE(sc, perf_txput_cycles);
4392 TULIP_PERFMERGE(sc, perf_txintr_cycles);
4393 TULIP_PERFMERGE(sc, perf_rxintr_cycles);
4394 TULIP_PERFMERGE(sc, perf_rxget_cycles);
4395 TULIP_PERFMERGE(sc, perf_intr);
4396 TULIP_PERFMERGE(sc, perf_ifstart);
4397 TULIP_PERFMERGE(sc, perf_ifioctl);
4398 TULIP_PERFMERGE(sc, perf_stat);
4399 TULIP_PERFMERGE(sc, perf_timeout);
4400 TULIP_PERFMERGE(sc, perf_ifstart_one);
4401 TULIP_PERFMERGE(sc, perf_txput);
4402 TULIP_PERFMERGE(sc, perf_txintr);
4403 TULIP_PERFMERGE(sc, perf_rxintr);
4404 TULIP_PERFMERGE(sc, perf_rxget);
4408 tulip_attach(tulip_softc_t * const sc)
4412 ifp = sc->tulip_ifp = if_alloc(IFT_ETHER);
4415 if_initname(ifp, "de", sc->tulip_unit);
4416 ifp->if_softc = sc;
4425 device_printf(sc->tulip_dev, "%s%s pass %d.%d%s\n",
4426 sc->tulip_boardid,
4427 tulip_chipdescs[sc->tulip_chipid],
4428 (sc->tulip_revinfo & 0xF0) >> 4,
4429 sc->tulip_revinfo & 0x0F,
4430 (sc->tulip_features & (TULIP_HAVE_ISVSROM|TULIP_HAVE_OKSROM))
4433 TULIP_LOCK(sc);
4434 (*sc->tulip_boardsw->bd_media_probe)(sc);
4435 ifmedia_init(&sc->tulip_ifmedia, 0,
4438 tulip_ifmedia_add(sc);
4440 tulip_reset(sc);
4441 TULIP_UNLOCK(sc);
4443 ether_ifattach(sc->tulip_ifp, sc->tulip_enaddr);
4445 TULIP_LOCK(sc);
4446 sc->tulip_flags &= ~TULIP_DEVICEPROBE;
4447 TULIP_UNLOCK(sc);
4490 tulip_busdma_allocring(device_t dev, tulip_softc_t * const sc, size_t count,
4553 tulip_busdma_cleanup(tulip_softc_t * const sc)
4557 if (sc->tulip_setup_dma_addr != 0) {
4558 bus_dmamap_unload(sc->tulip_setup_tag, sc->tulip_setup_map);
4559 sc->tulip_setup_dma_addr = 0;
4561 if (sc->tulip_setupbuf != NULL) {
4562 bus_dmamem_free(sc->tulip_setup_tag, sc->tulip_setupbuf,
4563 sc->tulip_setup_map);
4564 bus_dmamap_destroy(sc->tulip_setup_tag, sc->tulip_setup_map);
4565 sc->tulip_setup_map = NULL;
4566 sc->tulip_setupbuf = NULL;
4568 if (sc->tulip_setup_tag != NULL) {
4569 bus_dma_tag_destroy(sc->tulip_setup_tag);
4570 sc->tulip_setup_tag = NULL;
4574 tulip_busdma_freering(&sc->tulip_txinfo);
4577 tulip_busdma_freering(&sc->tulip_rxinfo);
4581 tulip_busdma_init(device_t dev, tulip_softc_t * const sc)
4588 error = tulip_busdma_allocring(dev, sc, TULIP_TXDESCS, 1, TULIP_MAX_TXSEG,
4589 &sc->tulip_txinfo, "transmit");
4600 error = tulip_busdma_allocring(dev, sc, TULIP_RXDESCS, 4, 1,
4601 &sc->tulip_rxinfo, "receive");
4610 sizeof(sc->tulip_setupdata), 1, sizeof(sc->tulip_setupdata), 0,
4611 NULL, NULL, &sc->tulip_setup_tag);
4616 error = bus_dmamem_alloc(sc->tulip_setup_tag, (void **)&sc->tulip_setupbuf,
4617 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &sc->tulip_setup_map);
4622 error = bus_dmamap_load(sc->tulip_setup_tag, sc->tulip_setup_map,
4623 sc->tulip_setupbuf, sizeof(sc->tulip_setupdata),
4624 tulip_dma_map_addr, &sc->tulip_setup_dma_addr, BUS_DMA_NOWAIT);
4634 tulip_initcsrs(tulip_softc_t * const sc, tulip_csrptr_t csr_base,
4637 sc->tulip_csrs.csr_busmode = csr_base + 0 * csr_size;
4638 sc->tulip_csrs.csr_txpoll = csr_base + 1 * csr_size;
4639 sc->tulip_csrs.csr_rxpoll = csr_base + 2 * csr_size;
4640 sc->tulip_csrs.csr_rxlist = csr_base + 3 * csr_size;
4641 sc->tulip_csrs.csr_txlist = csr_base + 4 * csr_size;
4642 sc->tulip_csrs.csr_status = csr_base + 5 * csr_size;
4643 sc->tulip_csrs.csr_command = csr_base + 6 * csr_size;
4644 sc->tulip_csrs.csr_intr = csr_base + 7 * csr_size;
4645 sc->tulip_csrs.csr_missed_frames = csr_base + 8 * csr_size;
4646 sc->tulip_csrs.csr_9 = csr_base + 9 * csr_size;
4647 sc->tulip_csrs.csr_10 = csr_base + 10 * csr_size;
4648 sc->tulip_csrs.csr_11 = csr_base + 11 * csr_size;
4649 sc->tulip_csrs.csr_12 = csr_base + 12 * csr_size;
4650 sc->tulip_csrs.csr_13 = csr_base + 13 * csr_size;
4651 sc->tulip_csrs.csr_14 = csr_base + 14 * csr_size;
4652 sc->tulip_csrs.csr_15 = csr_base + 15 * csr_size;
4658 tulip_softc_t * const sc,
4737 tulip_softc_t * const sc = device_get_softc(dev);
4738 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
4748 tulip_softc_t *sc;
4797 sc = device_get_softc(dev);
4798 sc->tulip_dev = dev;
4799 sc->tulip_pci_busno = pci_get_bus(dev);
4800 sc->tulip_pci_devno = pci_get_slot(dev);
4801 sc->tulip_chipid = chipid;
4802 sc->tulip_flags |= TULIP_DEVICEPROBE;
4804 sc->tulip_features |= TULIP_HAVE_GPR|TULIP_HAVE_STOREFWD;
4806 sc->tulip_features |= TULIP_HAVE_RXBADOVRFLW;
4808 sc->tulip_features |= TULIP_HAVE_BROKEN_HASH;
4810 sc->tulip_features |= TULIP_HAVE_POWERMGMT;
4812 sc->tulip_features |= TULIP_HAVE_DUALSENSE;
4814 sc->tulip_features |= TULIP_HAVE_SIANWAY;
4816 sc->tulip_features |= TULIP_HAVE_SIAGP|TULIP_HAVE_RXBADOVRFLW|TULIP_HAVE_STOREFWD;
4818 sc->tulip_features |= TULIP_HAVE_SIA100;
4821 if (sc->tulip_features & TULIP_HAVE_POWERMGMT
4828 sc->tulip_unit = unit;
4829 sc->tulip_revinfo = revinfo;
4839 sc->tulip_csrs_bst = rman_get_bustag(res);
4840 sc->tulip_csrs_bsh = rman_get_bushandle(res);
4843 mtx_init(TULIP_MUTEX(sc), MTX_NETWORK_LOCK, device_get_nameunit(dev),
4845 callout_init_mtx(&sc->tulip_callout, TULIP_MUTEX(sc), 0);
4846 callout_init_mtx(&sc->tulip_stat_timer, TULIP_MUTEX(sc), 0);
4847 tulips[unit] = sc;
4849 tulip_initcsrs(sc, csr_base + csroffset, csrsize);
4851 if ((retval = tulip_busdma_init(dev, sc)) != 0) {
4853 tulip_busdma_cleanup(sc);
4854 mtx_destroy(TULIP_MUTEX(sc));
4858 retval = tulip_initring(dev, sc, &sc->tulip_rxinfo, TULIP_RXDESCS);
4860 retval = tulip_initring(dev, sc, &sc->tulip_txinfo, TULIP_TXDESCS);
4862 tulip_busdma_cleanup(sc);
4863 mtx_destroy(TULIP_MUTEX(sc));
4870 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
4875 TULIP_LOCK(sc);
4876 retval = tulip_read_macaddr(sc);
4877 TULIP_UNLOCK(sc);
4881 printf("%02x", sc->tulip_rombuf[idx]);
4884 sc->tulip_boardid, tulip_chipdescs[sc->tulip_chipid],
4885 (sc->tulip_revinfo & 0xF0) >> 4, sc->tulip_revinfo & 0x0F);
4890 if (sc->tulip_features & TULIP_HAVE_SHAREDINTR)
4893 tulip_attach(sc);
4896 if ((sc->tulip_features & TULIP_HAVE_SLAVEDINTR) == 0) {
4903 INTR_MPSAFE, NULL, intr_rtn, sc, &ih)) {
4905 tulip_busdma_cleanup(sc);
4906 ether_ifdetach(sc->tulip_ifp);
4907 if_free(sc->tulip_ifp);
4908 mtx_destroy(TULIP_MUTEX(sc));
4942 tulip_softc_t *sc;
4950 sc = tulips[unit];
4951 if (sc == NULL) {
4959 ri = &sc->tulip_rxinfo;
4963 ri = &sc->tulip_txinfo;
4985 tulip_softc_t *sc;
4994 sc = tulips[unit];
4995 if (sc == NULL) {
5003 ri = &sc->tulip_rxinfo;
5007 ri = &sc->tulip_txinfo;