Lines Matching defs:sc
81 #define EMIT do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); tulip_delay_300ns(sc); } while (0)
82 #define MII_EMIT do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); tulip_delay_300ns(sc); } while (0)
106 #define PCI_GETBUSDEVINFO(sc) do { \
107 (sc)->tulip_pci_busno = parent; \
108 (sc)->tulip_pci_devno = pa->pa_device; \
130 void tulip_timeout(tulip_softc_t * const sc);
131 int tulip_txprobe(tulip_softc_t * const sc);
132 void tulip_media_set(tulip_softc_t * const sc, tulip_media_t media);
133 void tulip_linkup(tulip_softc_t * const sc, tulip_media_t media);
134 void tulip_media_print(tulip_softc_t * const sc);
135 tulip_link_status_t tulip_media_link_monitor(tulip_softc_t * const sc);
136 void tulip_media_poll(tulip_softc_t * const sc, tulip_mediapoll_event_t event);
137 void tulip_media_select(tulip_softc_t * const sc);
139 void tulip_21040_mediainfo_init(tulip_softc_t * const sc, tulip_media_t media);
140 void tulip_21040_media_probe(tulip_softc_t * const sc);
141 void tulip_21040_10baset_only_media_probe(tulip_softc_t * const sc);
142 void tulip_21040_10baset_only_media_select(tulip_softc_t * const sc);
143 void tulip_21040_auibnc_only_media_probe(tulip_softc_t * const sc);
144 void tulip_21040_auibnc_only_media_select(tulip_softc_t * const sc);
146 void tulip_21041_mediainfo_init(tulip_softc_t * const sc);
147 void tulip_21041_media_probe(tulip_softc_t * const sc);
148 void tulip_21041_media_poll(tulip_softc_t * const sc, const tulip_mediapoll_event_t event);
150 tulip_media_t tulip_mii_phy_readspecific(tulip_softc_t * const sc);
151 unsigned tulip_mii_get_phyaddr(tulip_softc_t * const sc, unsigned offset);
152 int tulip_mii_map_abilities(tulip_softc_t * const sc, unsigned abilities);
153 void tulip_mii_autonegotiate(tulip_softc_t * const sc, const unsigned phyaddr);
155 void tulip_2114x_media_preset(tulip_softc_t * const sc);
157 void tulip_null_media_poll(tulip_softc_t * const sc, tulip_mediapoll_event_t event);
159 void tulip_21140_mediainit(tulip_softc_t * const sc, tulip_media_info_t * const mip,
161 void tulip_21140_evalboard_media_probe(tulip_softc_t * const sc);
162 void tulip_21140_accton_media_probe(tulip_softc_t * const sc);
163 void tulip_21140_smc9332_media_probe(tulip_softc_t * const sc);
164 void tulip_21140_cogent_em100_media_probe(tulip_softc_t * const sc);
165 void tulip_21140_znyx_zx34x_media_probe(tulip_softc_t * const sc);
167 void tulip_2114x_media_probe(tulip_softc_t * const sc);
169 void tulip_delay_300ns(tulip_softc_t * const sc);
170 void tulip_srom_idle(tulip_softc_t * const sc);
171 void tulip_srom_read(tulip_softc_t * const sc);
172 void tulip_mii_writebits(tulip_softc_t * const sc, unsigned data, unsigned bits);
173 void tulip_mii_turnaround(tulip_softc_t * const sc, unsigned cmd);
174 unsigned tulip_mii_readbits(tulip_softc_t * const sc);
175 unsigned tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno);
176 void tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno,
179 void tulip_identify_dec_nic(tulip_softc_t * const sc);
180 void tulip_identify_znyx_nic(tulip_softc_t * const sc);
181 void tulip_identify_smc_nic(tulip_softc_t * const sc);
182 void tulip_identify_cogent_nic(tulip_softc_t * const sc);
183 void tulip_identify_accton_nic(tulip_softc_t * const sc);
184 void tulip_identify_asante_nic(tulip_softc_t * const sc);
185 void tulip_identify_compex_nic(tulip_softc_t * const sc);
187 int tulip_srom_decode(tulip_softc_t * const sc);
188 int tulip_read_macaddr(tulip_softc_t * const sc);
189 void tulip_ifmedia_add(tulip_softc_t * const sc);
192 void tulip_addr_filter(tulip_softc_t * const sc);
193 void tulip_reset(tulip_softc_t * const sc);
194 void tulip_init(tulip_softc_t * const sc);
195 void tulip_rx_intr(tulip_softc_t * const sc);
196 int tulip_tx_intr(tulip_softc_t * const sc);
197 void tulip_print_abnormal_interrupt(tulip_softc_t * const sc, u_int32_t csr);
198 void tulip_intr_handler(tulip_softc_t * const sc, int *progress_p);
201 struct mbuf *tulip_txput(tulip_softc_t * const sc, struct mbuf *m, int);
202 void tulip_txput_setup(tulip_softc_t * const sc);
206 int tulip_busdma_allocmem(tulip_softc_t * const sc, size_t size,
208 int tulip_busdma_init(tulip_softc_t * const sc);
209 void tulip_initcsrs(tulip_softc_t * const sc, bus_addr_t csr_base, size_t csr_size);
210 void tulip_initring(tulip_softc_t * const sc, tulip_ringinfo_t * const ri,
221 tulip_softc_t * const sc = arg;
228 sc->tulip_flags &= ~TULIP_TIMEOUTPENDING;
229 sc->tulip_probe_timeout -= 1000 / TULIP_HZ;
230 (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_TIMER);
237 tulip_timeout(tulip_softc_t * const sc)
239 if (sc->tulip_flags & TULIP_TIMEOUTPENDING)
241 sc->tulip_flags |= TULIP_TIMEOUTPENDING;
242 timeout_add(&sc->tulip_stmo, (hz + TULIP_HZ / 2) / TULIP_HZ);
246 tulip_txprobe(tulip_softc_t * const sc)
263 bcopy(sc->tulip_enaddr, mtod(m, struct ether_header *)->ether_dhost,
265 bcopy(sc->tulip_enaddr, mtod(m, struct ether_header *)->ether_shost,
275 sc->tulip_cmdmode |= TULIP_CMD_TXRUN;
276 sc->tulip_intrmask |= TULIP_STS_TXINTR;
277 sc->tulip_flags |= TULIP_TXPROBE_ACTIVE;
278 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
279 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
280 if ((m = tulip_txput(sc, m, 1)) != NULL)
282 sc->tulip_probe.probe_txprobes++;
287 tulip_media_set(tulip_softc_t * const sc, tulip_media_t media)
289 const tulip_media_info_t *mi = sc->tulip_mediums[media];
296 if (mi->mi_type == TULIP_MEDIAINFO_SIA || (sc->tulip_features & TULIP_HAVE_SIANWAY))
297 TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET);
301 if (sc->tulip_flags & TULIP_FULLDUPLEX) {
303 if (TULIP_CSR_READ(sc, csr_command) & (TULIP_CMD_RXRUN|TULIP_CMD_TXRUN))
305 if ((TULIP_CSR_READ(sc, csr_command) & TULIP_CMD_FULLDUPLEX) == 0)
308 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;
309 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode & ~(TULIP_CMD_RXRUN|TULIP_CMD_TXRUN));
317 sc->tulip_flags &= ~TULIP_RXACT;
319 TULIP_CSR_WRITE(sc, csr_sia_tx_rx, mi->mi_sia_tx_rx);
320 if (sc->tulip_features & TULIP_HAVE_SIAGP) {
321 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_gp_control|mi->mi_sia_general|TULIP_SIAGEN_WATCHDOG);
323 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_gp_data|mi->mi_sia_general|TULIP_SIAGEN_WATCHDOG);
325 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_general|TULIP_SIAGEN_WATCHDOG);
326 TULIP_CSR_WRITE(sc, csr_sia_connectivity, mi->mi_sia_connectivity);
332 if (((mi->mi_cmdmode ^ TULIP_CSR_READ(sc, csr_command)) & TULIP_GPR_CMDBITS) != 0) {
333 sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;
334 sc->tulip_cmdmode |= mi->mi_cmdmode;
335 tulip_reset(sc);
337 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET|sc->tulip_gpinit);
339 TULIP_CSR_WRITE(sc, csr_gp, (u_int8_t) mi->mi_gpdata);
345 if (((mi->mi_cmdmode ^ TULIP_CSR_READ(sc, csr_command)) & TULIP_GPR_CMDBITS) != 0) {
346 sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;
347 sc->tulip_cmdmode |= mi->mi_cmdmode;
348 tulip_reset(sc);
350 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_gpcontrol);
351 TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_gpdata);
353 && sc->tulip_probe_state != TULIP_PROBE_INACTIVE) {
355 if (sc->tulip_features & TULIP_HAVE_SIAGP) {
357 dp = &sc->tulip_rombuf[mi->mi_reset_offset];
360 TULIP_CSR_WRITE(sc, csr_sia_general, (dp[0] + 256 * dp[1]) << 16);
362 sc->tulip_phyaddr = mi->mi_phyaddr;
363 dp = &sc->tulip_rombuf[mi->mi_gpr_offset];
366 TULIP_CSR_WRITE(sc, csr_sia_general, (dp[0] + 256 * dp[1]) << 16);
371 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_reset_offset + idx]);
373 sc->tulip_phyaddr = mi->mi_phyaddr;
376 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_gpr_offset + idx]);
380 if (sc->tulip_features & TULIP_HAVE_SIANWAY) {
382 TULIP_CSR_WRITE(sc, csr_sia_general, 1);
383 TULIP_CSR_WRITE(sc, csr_sia_tx_rx, 0);
384 TULIP_CSR_WRITE(sc, csr_sia_status, 0);
387 if (sc->tulip_flags & TULIP_TRYNWAY)
388 tulip_mii_autonegotiate(sc, sc->tulip_phyaddr);
389 else if ((sc->tulip_flags & TULIP_DIDNWAY) == 0) {
390 u_int32_t data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_CONTROL);
392 sc->tulip_flags &= ~TULIP_DIDNWAY;
397 tulip_mii_writereg(sc, sc->tulip_phyaddr, PHYREG_CONTROL, data);
403 tulip_linkup(tulip_softc_t * const sc, tulip_media_t media)
405 if ((sc->tulip_flags & TULIP_LINKUP) == 0)
406 sc->tulip_flags |= TULIP_PRINTLINKUP;
407 sc->tulip_flags |= TULIP_LINKUP;
408 ifq_clr_oactive(&sc->tulip_if.if_snd);
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_flags |= TULIP_FULLDUPLEX;
417 else if (sc->tulip_chipid != TULIP_21041 || (sc->tulip_flags & TULIP_DIDNWAY) == 0)
418 sc->tulip_flags &= ~TULIP_FULLDUPLEX;
426 sc->tulip_probe_timeout = 3000;
427 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
428 sc->tulip_flags &= ~(TULIP_TXPROBE_ACTIVE|TULIP_TRYNWAY);
429 if (sc->tulip_flags & TULIP_INRESET)
430 tulip_media_set(sc, sc->tulip_media);
431 else if (sc->tulip_probe_media != sc->tulip_media) {
435 tulip_reset(sc);
437 tulip_init(sc);
441 tulip_media_print(tulip_softc_t * const sc)
443 if ((sc->tulip_flags & TULIP_LINKUP) == 0)
445 if (sc->tulip_flags & TULIP_PRINTMEDIA) {
449 tulip_mediums[sc->tulip_media]);
451 sc->tulip_flags &= ~(TULIP_PRINTMEDIA|TULIP_PRINTLINKUP);
452 } else if (sc->tulip_flags & TULIP_PRINTLINKUP) {
456 sc->tulip_flags &= ~TULIP_PRINTLINKUP;
461 tulip_media_link_monitor(tulip_softc_t * const sc)
463 const tulip_media_info_t * const mi = sc->tulip_mediums[sc->tulip_media];
469 tulip_mediums[sc->tulip_media],__LINE__);
478 if ((sc->tulip_flags & (TULIP_RXACT|TULIP_LINKUP)) == (TULIP_RXACT|TULIP_LINKUP)) {
479 sc->tulip_flags &= ~TULIP_RXACT;
480 sc->tulip_probe_timeout = 3000;
484 sc->tulip_flags &= ~TULIP_RXACT;
490 status = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS)
491 | tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS);
498 u_int32_t abilities = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_AUTONEG_ABILITIES);
500 if (abilities != sc->tulip_abilities) {
503 TULIP_PRINTF_ARGS, sc->tulip_phyaddr,
504 sc->tulip_abilities, abilities);
506 if (tulip_mii_map_abilities(sc, abilities)) {
507 tulip_linkup(sc, sc->tulip_probe_media);
514 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
515 if (sc->tulip_flags & TULIP_DIDNWAY)
533 if ((TULIP_CSR_READ(sc, csr_gp) & mi->mi_actmask) == mi->mi_actdata)
539 if (!TULIP_IS_MEDIA_TP(sc->tulip_media))
541 if ((TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL) == 0)
544 if (sc->tulip_probe_timeout <= 0)
545 printf(TULIP_PRINTF_FMT ": sia status = 0x%08x\n", TULIP_PRINTF_ARGS, TULIP_CSR_READ(sc, csr_sia_status));
552 if (sc->tulip_flags & TULIP_LINKUP) {
554 sc->tulip_probe_timeout = 3000;
555 if (sc->tulip_probe_timeout > 0)
558 sc->tulip_flags &= ~TULIP_LINKUP;
561 sc->tulip_dbg.dbg_link_downed++;
567 tulip_media_poll(tulip_softc_t * const sc, tulip_mediapoll_event_t event)
570 sc->tulip_dbg.dbg_events[event]++;
572 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE
574 switch (tulip_media_link_monitor(sc)) {
586 tulip_timeout(sc);
599 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE) {
600 if (TULIP_DO_AUTOSENSE(sc)) {
602 sc->tulip_dbg.dbg_link_failures++;
604 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
605 if (sc->tulip_if.if_flags & IFF_UP)
606 tulip_reset(sc); /* restart probe */
611 sc->tulip_dbg.dbg_link_pollintrs++;
616 ifq_set_oactive(&sc->tulip_if.if_snd);
617 if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE)
619 sc->tulip_probe_mediamask = 0;
620 sc->tulip_probe_passes = 0;
622 sc->tulip_dbg.dbg_media_probes++;
627 sc->tulip_cmdmode &= ~(TULIP_CMD_RXRUN|TULIP_CMD_FULLDUPLEX);
628 sc->tulip_flags |= TULIP_TRYNWAY|TULIP_PROBE1STPASS;
629 sc->tulip_flags &= ~(TULIP_DIDNWAY|TULIP_PRINTMEDIA|TULIP_PRINTLINKUP);
633 sc->tulip_probe_media = tulip_srom_conninfo[sc->tulip_connidx].sc_media;
634 if (sc->tulip_probe_media != TULIP_MEDIA_UNKNOWN) {
635 tulip_linkup(sc, sc->tulip_probe_media);
636 tulip_timeout(sc);
640 if (sc->tulip_features & TULIP_HAVE_GPR) {
641 sc->tulip_probe_state = TULIP_PROBE_GPRTEST;
642 sc->tulip_probe_timeout = 2000;
644 sc->tulip_probe_media = TULIP_MEDIA_MAX;
645 sc->tulip_probe_timeout = 0;
646 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
654 && sc->tulip_probe_state != TULIP_PROBE_MEDIATEST) {
655 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
665 sc->tulip_probe_media = TULIP_MEDIA_10BASET;
668 sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++;
671 tulip_linkup(sc, sc->tulip_probe_media);
672 tulip_timeout(sc);
676 if (sc->tulip_probe_state == TULIP_PROBE_GPRTEST) {
681 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
682 sc->tulip_probe_media = TULIP_MEDIA_MAX;
683 sc->tulip_probe_timeout = 0;
684 tulip_timeout(sc);
688 if (sc->tulip_probe_state != TULIP_PROBE_MEDIATEST
689 && (sc->tulip_features & TULIP_HAVE_MII)) {
690 tulip_media_t old_media = sc->tulip_probe_media;
691 tulip_mii_autonegotiate(sc, sc->tulip_phyaddr);
692 switch (sc->tulip_probe_state) {
698 sc->tulip_probe_mediamask |= sc->tulip_mediums[sc->tulip_probe_media]->mi_mediamask;
699 sc->tulip_probe_timeout = 0;
709 sc->tulip_probe_timeout = 0;
710 if (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media)) {
711 sc->tulip_probe_media = old_media;
714 tulip_linkup(sc, sc->tulip_probe_media);
715 tulip_timeout(sc);
729 sc->tulip_dbg.dbg_txprobes_failed[sc->tulip_probe_media]++;
731 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
738 if (/* event == TULIP_MEDIAPOLL_TXPROBE_FAILED || */ sc->tulip_probe_timeout <= 0) {
740 if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) {
743 sc->tulip_probe_media = TULIP_MEDIA_MAX;
751 sc->tulip_probe_media -= 1;
752 if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) {
753 if (++sc->tulip_probe_passes == 3) {
754 if ((sc->tulip_if.if_flags & IFF_UP) == 0) {
755 sc->tulip_if.if_flags &= ~IFF_RUNNING;
756 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
760 sc->tulip_flags ^= TULIP_TRYNWAY; /* XXX */
761 sc->tulip_probe_mediamask = 0;
762 sc->tulip_probe_media = TULIP_MEDIA_MAX - 1;
764 } while (sc->tulip_mediums[sc->tulip_probe_media] == NULL
765 || (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media))
766 || TULIP_IS_MEDIA_FD(sc->tulip_probe_media));
771 tulip_mediums[sc->tulip_probe_media]);
773 sc->tulip_probe_timeout = TULIP_IS_MEDIA_TP(sc->tulip_probe_media) ? 2500 : 1000;
774 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
775 sc->tulip_probe.probe_txprobes = 0;
776 tulip_reset(sc);
777 tulip_media_set(sc, sc->tulip_probe_media);
778 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
780 tulip_timeout(sc);
787 switch (sc->tulip_mediums[sc->tulip_probe_media]->mi_type) {
789 if (sc->tulip_probe_media != tulip_mii_phy_readspecific(sc))
794 if (TULIP_IS_MEDIA_TP(sc->tulip_probe_media)) {
795 if (TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL)
797 tulip_linkup(sc, sc->tulip_probe_media);
812 tulip_txprobe(sc);
816 tulip_media_select(tulip_softc_t * const sc)
818 if (sc->tulip_features & TULIP_HAVE_GPR) {
819 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET|sc->tulip_gpinit);
821 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_gpdata);
826 if (sc->tulip_features & TULIP_HAVE_NOMEDIA)
829 if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) {
830 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
831 (*sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_START);
833 tulip_media_set(sc, sc->tulip_media);
837 tulip_21040_mediainfo_init(tulip_softc_t * const sc, tulip_media_t media)
839 sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_THRSHLD160
841 sc->tulip_if.if_baudrate = 10000000;
844 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[0], 21040, 10BASET);
845 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[1], 21040, 10BASET_FD);
846 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
850 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[2], 21040, AUIBNC);
853 TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[3], 21040, EXTSIA);
857 tulip_21040_media_probe(tulip_softc_t * const sc)
859 tulip_21040_mediainfo_init(sc, TULIP_MEDIA_UNKNOWN);
863 tulip_21040_10baset_only_media_probe(tulip_softc_t * const sc)
865 tulip_21040_mediainfo_init(sc, TULIP_MEDIA_10BASET);
866 tulip_media_set(sc, TULIP_MEDIA_10BASET);
867 sc->tulip_media = TULIP_MEDIA_10BASET;
871 tulip_21040_10baset_only_media_select(tulip_softc_t * const sc)
873 sc->tulip_flags |= TULIP_LINKUP;
874 if (sc->tulip_media == TULIP_MEDIA_10BASET_FD) {
875 sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;
876 sc->tulip_flags &= ~TULIP_SQETEST;
878 sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;
879 sc->tulip_flags |= TULIP_SQETEST;
881 tulip_media_set(sc, sc->tulip_media);
885 tulip_21040_auibnc_only_media_probe(tulip_softc_t * const sc)
887 tulip_21040_mediainfo_init(sc, TULIP_MEDIA_AUIBNC);
888 sc->tulip_flags |= TULIP_SQETEST|TULIP_LINKUP;
889 tulip_media_set(sc, TULIP_MEDIA_AUIBNC);
890 sc->tulip_media = TULIP_MEDIA_AUIBNC;
894 tulip_21040_auibnc_only_media_select(tulip_softc_t * const sc)
896 tulip_media_set(sc, TULIP_MEDIA_AUIBNC);
897 sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;
922 tulip_21041_mediainfo_init(tulip_softc_t * const sc)
924 tulip_media_info_t * const mi = sc->tulip_mediainfo;
926 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041, 10BASET);
927 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041, 10BASET_FD);
928 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[2], 21041, AUI);
929 TULIP_MEDIAINFO_SIA_INIT(sc, &mi[3], 21041, BNC);
933 tulip_21041_media_probe(tulip_softc_t * const sc)
935 sc->tulip_if.if_baudrate = 10000000;
936 sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_ENHCAPTEFFCT
938 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
939 tulip_21041_mediainfo_init(sc);
943 tulip_21041_media_poll(tulip_softc_t * const sc, const tulip_mediapoll_event_t event)
948 sc->tulip_dbg.dbg_events[event]++;
952 if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE
953 || !TULIP_DO_AUTOSENSE(sc))
955 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
956 tulip_reset(sc); /* start probe */
965 ifq_set_oactive(&sc->tulip_if.if_snd);
966 sc->tulip_cmdmode &= ~(TULIP_CMD_FULLDUPLEX|TULIP_CMD_RXRUN);
967 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
968 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
969 sc->tulip_probe_media = TULIP_MEDIA_10BASET;
970 sc->tulip_probe_timeout = TULIP_21041_PROBE_10BASET_TIMEOUT;
971 tulip_media_set(sc, TULIP_MEDIA_10BASET);
972 tulip_timeout(sc);
976 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)
981 sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++;
983 tulip_linkup(sc, sc->tulip_probe_media);
987 sia_status = TULIP_CSR_READ(sc, csr_sia_status);
988 TULIP_CSR_WRITE(sc, csr_sia_status, sia_status);
990 if (sc->tulip_revinfo >= 0x20) {
992 sc->tulip_probe_media = TULIP_MEDIA_10BASET_FD;
998 tulip_linkup(sc, sc->tulip_probe_media);
1007 if (sc->tulip_probe_media == TULIP_MEDIA_10BASET) {
1010 if (sc->tulip_probe_timeout > 0
1012 tulip_timeout(sc);
1015 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1016 sc->tulip_flags |= TULIP_WANTRXACT;
1018 sc->tulip_probe_media = TULIP_MEDIA_BNC;
1020 sc->tulip_probe_media = TULIP_MEDIA_AUI;
1021 tulip_media_set(sc, sc->tulip_probe_media);
1022 tulip_timeout(sc);
1030 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
1037 if (sc->tulip_flags & TULIP_RXACT) {
1038 tulip_linkup(sc, sc->tulip_probe_media);
1044 if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0
1045 && ((sc->tulip_flags & TULIP_WANTRXACT) == 0
1047 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1048 tulip_txprobe(sc);
1049 tulip_timeout(sc);
1057 if (sc->tulip_probe_timeout <= 0) {
1058 if (sc->tulip_flags & TULIP_WANTRXACT) {
1059 sc->tulip_flags &= ~TULIP_WANTRXACT;
1060 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1062 if ((sc->tulip_if.if_flags & IFF_UP) == 0) {
1063 sc->tulip_if.if_flags &= ~IFF_RUNNING;
1064 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
1074 sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;
1075 if (sc->tulip_probe_media == TULIP_MEDIA_AUI)
1076 sc->tulip_probe_media = TULIP_MEDIA_BNC;
1078 sc->tulip_probe_media = TULIP_MEDIA_AUI;
1079 tulip_media_set(sc, sc->tulip_probe_media);
1080 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
1081 tulip_timeout(sc);
1149 tulip_mii_phy_readspecific(tulip_softc_t * const sc)
1169 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS)
1170 | tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS);
1174 id = (tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_IDLOW) << 16) |
1175 tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_IDHIGH);
1185 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1191 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1197 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1203 data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);
1210 tulip_mii_get_phyaddr(tulip_softc_t * const sc, unsigned offset)
1215 unsigned status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);
1223 unsigned status = tulip_mii_readreg(sc, 0, PHYREG_STATUS);
1232 tulip_mii_map_abilities(tulip_softc_t * const sc, unsigned abilities)
1234 sc->tulip_abilities = abilities;
1236 sc->tulip_probe_media = TULIP_MEDIA_100BASETX_FD;
1238 sc->tulip_probe_media = TULIP_MEDIA_100BASET4;
1240 sc->tulip_probe_media = TULIP_MEDIA_100BASETX;
1242 sc->tulip_probe_media = TULIP_MEDIA_10BASET_FD;
1244 sc->tulip_probe_media = TULIP_MEDIA_10BASET;
1246 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1249 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
1254 tulip_mii_autonegotiate(tulip_softc_t * const sc, const unsigned phyaddr)
1256 switch (sc->tulip_probe_state) {
1259 sc->tulip_flags |= TULIP_DIDNWAY;
1260 tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_RESET);
1261 sc->tulip_probe_timeout = 3000;
1262 sc->tulip_intrmask |= TULIP_STS_ABNRMLINTR|TULIP_STS_NORMALINTR;
1263 sc->tulip_probe_state = TULIP_PROBE_PHYRESET;
1268 u_int32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL);
1270 if (sc->tulip_probe_timeout > 0) {
1271 tulip_timeout(sc);
1278 sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;
1279 sc->tulip_probe_state = TULIP_PROBE_FAILED;
1280 sc->tulip_if.if_flags &= ~IFF_RUNNING;
1283 status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS)
1284 | tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);
1290 sc->tulip_flags &= ~TULIP_DIDNWAY;
1291 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1294 if (tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT) != ((status >> 6) | 0x01))
1295 tulip_mii_writereg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT, (status >> 6) | 0x01);
1296 tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, data|PHYCTL_AUTONEG_RESTART|PHYCTL_AUTONEG_ENABLE);
1297 data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL);
1305 tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT));
1306 sc->tulip_dbg.dbg_nway_starts++;
1308 sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG;
1309 sc->tulip_probe_timeout = 3000;
1313 u_int32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS)
1314 | tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);
1317 if (sc->tulip_probe_timeout > 0) {
1318 tulip_timeout(sc);
1324 tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL));
1326 sc->tulip_flags &= ~TULIP_DIDNWAY;
1327 sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;
1330 data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES)
1331 | tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES);
1337 if (!tulip_mii_map_abilities(sc, data))
1338 sc->tulip_flags &= ~TULIP_DIDNWAY;
1350 TULIP_PRINTF_ARGS, phyaddr, sc->tulip_probe_state);
1351 sc->tulip_dbg.dbg_nway_failures++;
1356 tulip_2114x_media_preset(tulip_softc_t * const sc)
1359 tulip_media_t media = sc->tulip_media;
1361 if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)
1362 media = sc->tulip_media;
1364 media = sc->tulip_probe_media;
1366 sc->tulip_cmdmode &= ~(TULIP_CMD_PORTSELECT|TULIP_CMD_NOHEARTBEAT
1368 sc->tulip_flags &= ~(TULIP_SQETEST|TULIP_FULLDUPLEX);
1371 if (media < TULIP_MEDIA_MAX && sc->tulip_mediums[media] != NULL) {
1373 mi = sc->tulip_mediums[media];
1375 sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT;
1378 sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;
1379 sc->tulip_cmdmode |= mi->mi_cmdmode;
1381 TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET);
1393 sc->tulip_cmdmode |= TULIP_CMD_TXTHRSHLDCTL;
1394 sc->tulip_if.if_baudrate = 10000000;
1395 sc->tulip_flags |= TULIP_SQETEST;
1399 sc->tulip_flags |= TULIP_FULLDUPLEX;
1400 sc->tulip_cmdmode |= TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX;
1401 sc->tulip_if.if_baudrate = 10000000;
1407 sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT;
1408 sc->tulip_if.if_baudrate = 100000000;
1411 sc->tulip_cmdmode |= TULIP_CMD_NOHEARTBEAT;
1417 sc->tulip_flags |= TULIP_FULLDUPLEX;
1418 sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT|TULIP_CMD_FULLDUPLEX;
1419 sc->tulip_if.if_baudrate = 100000000;
1422 sc->tulip_cmdmode |= TULIP_CMD_NOHEARTBEAT;
1430 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
1439 tulip_null_media_poll(tulip_softc_t * const sc, tulip_mediapoll_event_t event)
1442 sc->tulip_dbg.dbg_events[event]++;
1451 tulip_21140_mediainit(tulip_softc_t * const sc, tulip_media_info_t * const mip,
1454 sc->tulip_mediums[media] = mip;
1461 tulip_21140_evalboard_media_probe(tulip_softc_t * const sc)
1463 tulip_media_info_t *mip = sc->tulip_mediainfo;
1465 sc->tulip_gpinit = TULIP_GP_EB_PINS;
1466 sc->tulip_gpdata = TULIP_GP_EB_INIT;
1467 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);
1468 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);
1469 TULIP_CSR_WRITE(sc, csr_command,
1470 TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |
1472 TULIP_CSR_WRITE(sc, csr_command,
1473 TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);
1475 if ((TULIP_CSR_READ(sc, csr_gp) & TULIP_GP_EB_OK100) != 0)
1476 sc->tulip_media = TULIP_MEDIA_10BASET;
1478 sc->tulip_media = TULIP_MEDIA_100BASETX;
1479 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1482 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1485 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1489 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1504 tulip_21140_accton_media_probe(tulip_softc_t * const sc)
1506 tulip_media_info_t *mip = sc->tulip_mediainfo;
1509 sc->tulip_gpinit = TULIP_GP_EB_PINS;
1510 sc->tulip_gpdata = TULIP_GP_EB_INIT;
1511 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);
1512 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);
1513 TULIP_CSR_WRITE(sc, csr_command,
1514 TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |
1516 TULIP_CSR_WRITE(sc, csr_command,
1517 TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);
1519 gpdata = TULIP_CSR_READ(sc, csr_gp);
1521 sc->tulip_media = TULIP_MEDIA_10BASET;
1524 sc->tulip_media = TULIP_MEDIA_BNC;
1526 sc->tulip_media = TULIP_MEDIA_100BASETX;
1528 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_BNC,
1531 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1534 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1537 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1541 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1556 tulip_21140_smc9332_media_probe(tulip_softc_t * const sc)
1558 tulip_media_info_t *mip = sc->tulip_mediainfo;
1561 TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT|TULIP_CMD_MUSTBEONE);
1562 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
1566 TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT |
1568 sc->tulip_gpinit = TULIP_GP_SMC_9332_PINS;
1569 sc->tulip_gpdata = TULIP_GP_SMC_9332_INIT;
1570 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_PINS|TULIP_GP_PINSET);
1571 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_INIT);
1574 u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);
1584 sc->tulip_media = cnt > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;
1585 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1589 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1593 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1596 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1610 tulip_21140_cogent_em100_media_probe(tulip_softc_t * const sc)
1612 tulip_media_info_t *mip = sc->tulip_mediainfo;
1613 u_int32_t cmdmode = TULIP_CSR_READ(sc, csr_command);
1615 sc->tulip_gpinit = TULIP_GP_EM100_PINS;
1616 sc->tulip_gpdata = TULIP_GP_EM100_INIT;
1617 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_PINS);
1618 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_INIT);
1622 if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100FX_ID) {
1623 TULIP_CSR_WRITE(sc, csr_command, cmdmode);
1624 sc->tulip_media = TULIP_MEDIA_100BASEFX;
1626 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX,
1629 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX_FD,
1634 TULIP_CSR_WRITE(sc, csr_command, cmdmode|TULIP_CMD_SCRAMBLER);
1635 sc->tulip_media = TULIP_MEDIA_100BASETX;
1636 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1640 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1656 tulip_21140_znyx_zx34x_media_probe(tulip_softc_t * const sc)
1658 tulip_media_info_t *mip = sc->tulip_mediainfo;
1661 sc->tulip_gpinit = TULIP_GP_ZX34X_PINS;
1662 sc->tulip_gpdata = TULIP_GP_ZX34X_INIT;
1663 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ZX34X_PINS);
1664 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ZX34X_INIT);
1665 TULIP_CSR_WRITE(sc, csr_command,
1666 TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |
1668 TULIP_CSR_WRITE(sc, csr_command,
1669 TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);
1673 u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);
1686 sc->tulip_media = cnt100 > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;
1687 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,
1690 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,
1693 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,
1697 tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,
1712 tulip_2114x_media_probe(tulip_softc_t * const sc)
1714 sc->tulip_cmdmode |= TULIP_CMD_MUSTBEONE
1734 tulip_delay_300ns(tulip_softc_t * const sc)
1738 (void) TULIP_CSR_READ(sc, csr_busmode);
1742 tulip_srom_idle(tulip_softc_t * const sc)
1764 tulip_srom_read(tulip_softc_t * const sc)
1772 tulip_srom_idle(sc);
1798 data |= TULIP_CSR_READ(sc, csr_srom_mii) & SROMDIN ? 1 : 0;
1801 sc->tulip_rombuf[idx*2] = data & 0xFF;
1802 sc->tulip_rombuf[idx*2+1] = data >> 8;
1806 tulip_srom_idle(sc);
1810 tulip_mii_writebits(tulip_softc_t * const sc, unsigned data, unsigned bits)
1813 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1829 tulip_mii_turnaround(tulip_softc_t * const sc, unsigned cmd)
1831 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1845 tulip_mii_readbits(tulip_softc_t * const sc)
1848 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1854 if (TULIP_CSR_READ(sc, csr_srom_mii) & MII_DIN)
1864 tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno)
1866 unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1870 tulip_mii_writebits(sc, MII_PREAMBLE, 32);
1871 tulip_mii_writebits(sc, MII_RDCMD, 8);
1872 tulip_mii_writebits(sc, devaddr, 5);
1873 tulip_mii_writebits(sc, regno, 5);
1874 tulip_mii_turnaround(sc, MII_RDCMD);
1876 data = tulip_mii_readbits(sc);
1878 sc->tulip_dbg.dbg_phyregs[regno][0] = data;
1879 sc->tulip_dbg.dbg_phyregs[regno][1]++;
1885 tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr,
1890 csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK);
1892 tulip_mii_writebits(sc, MII_PREAMBLE, 32);
1893 tulip_mii_writebits(sc, MII_WRCMD, 8);
1894 tulip_mii_writebits(sc, devaddr, 5);
1895 tulip_mii_writebits(sc, regno, 5);
1896 tulip_mii_turnaround(sc, MII_WRCMD);
1897 tulip_mii_writebits(sc, data, 16);
1899 sc->tulip_dbg.dbg_phyregs[regno][2] = data;
1900 sc->tulip_dbg.dbg_phyregs[regno][3]++;
1905 tulip_identify_dec_nic(tulip_softc_t * const sc)
1907 strlcpy(sc->tulip_boardid, "DEC ", sizeof(sc->tulip_boardid));
1909 if (sc->tulip_chipid <= TULIP_DE425)
1911 if (bcmp(sc->tulip_rombuf + 29, "DE500", 5) == 0
1912 || bcmp(sc->tulip_rombuf + 29, "DE450", 5) == 0) {
1913 bcopy(sc->tulip_rombuf + 29, &sc->tulip_boardid[D0], 8);
1914 sc->tulip_boardid[D0+8] = ' ';
1920 tulip_identify_znyx_nic(tulip_softc_t * const sc)
1923 strlcpy(sc->tulip_boardid, "ZNYX ZX3XX ", sizeof(sc->tulip_boardid));
1924 if (sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) {
1926 sc->tulip_boardid[8] = '4';
1927 znyx_ptr = sc->tulip_rombuf[124] + 256 * sc->tulip_rombuf[125];
1929 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
1934 if (sc->tulip_rombuf[znyx_ptr] == 0x4A
1935 && sc->tulip_rombuf[znyx_ptr + 1] == 0x52
1936 && sc->tulip_rombuf[znyx_ptr + 2] == 0x01) {
1937 id = sc->tulip_rombuf[znyx_ptr + 5] + 256 * sc->tulip_rombuf[znyx_ptr + 4];
1939 sc->tulip_boardid[9] = '2';
1941 sc->tulip_boardid[10] = 'B';
1942 sc->tulip_boardid[11] = ' ';
1944 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
1946 sc->tulip_boardid[10] = '4';
1947 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
1949 sc->tulip_boardid[9] = (sc->tulip_rombuf[19] > 1) ? '8' : '5';
1951 sc->tulip_boardid[9] = '6';
1953 sc->tulip_boardid[8] = '5';
1954 sc->tulip_boardid[9] = '1';
1961 sc->tulip_boardsw = &tulip_21140_znyx_zx34x_boardsw;
1965 sc->tulip_boardid[8] = '1';
1966 if (sc->tulip_chipid == TULIP_21041) {
1967 sc->tulip_boardid[10] = '1';
1970 if (sc->tulip_rombuf[32] == 0x4A && sc->tulip_rombuf[33] == 0x52) {
1971 id = sc->tulip_rombuf[37] + 256 * sc->tulip_rombuf[36];
1973 sc->tulip_boardid[9] = '2';
1974 sc->tulip_boardid[10] = 'T';
1975 sc->tulip_boardid[11] = ' ';
1976 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
1978 sc->tulip_boardid[9] = '4';
1979 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
1980 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
1982 sc->tulip_boardid[9] = '4';
1983 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
1984 sc->tulip_features |= TULIP_HAVE_BASEROM;
1986 sc->tulip_boardid[9] = '5';
1987 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
1989 sc->tulip_boardid[9] = '5';
1990 sc->tulip_features |= TULIP_HAVE_BASEROM;
1995 if ((sc->tulip_enaddr[3] & ~3) == 0xF0 && (sc->tulip_enaddr[5] & 3) == 0) {
1996 sc->tulip_boardid[9] = '4';
1997 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
1998 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
1999 } else if ((sc->tulip_enaddr[3] & ~3) == 0xF4 && (sc->tulip_enaddr[5] & 1) == 0) {
2000 sc->tulip_boardid[9] = '5';
2001 sc->tulip_boardsw = &tulip_21040_boardsw;
2002 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2003 } else if ((sc->tulip_enaddr[3] & ~3) == 0xEC) {
2004 sc->tulip_boardid[9] = '2';
2005 sc->tulip_boardsw = &tulip_21040_boardsw;
2011 tulip_identify_smc_nic(tulip_softc_t * const sc)
2017 strlcpy(sc->tulip_boardid, "SMC ", sizeof(sc->tulip_boardid));
2018 if (sc->tulip_chipid == TULIP_21041)
2020 if (sc->tulip_chipid != TULIP_21040) {
2021 if (sc->tulip_boardsw != &tulip_2114x_isv_boardsw) {
2022 strlcat(sc->tulip_boardid, "9332DST ", sizeof(sc->tulip_boardid));
2023 sc->tulip_boardsw = &tulip_21140_smc9332_boardsw;
2024 } else if (sc->tulip_features & (TULIP_HAVE_BASEROM|TULIP_HAVE_SLAVEDROM))
2025 strlcat(sc->tulip_boardid, "9334BDT ", sizeof(sc->tulip_boardid));
2027 strlcat(sc->tulip_boardid, "9332BDT ", sizeof(sc->tulip_boardid));
2030 id1 = sc->tulip_rombuf[0x60] | (sc->tulip_rombuf[0x61] << 8);
2031 id2 = sc->tulip_rombuf[0x62] | (sc->tulip_rombuf[0x63] << 8);
2032 ei = sc->tulip_rombuf[0x66] | (sc->tulip_rombuf[0x67] << 8);
2034 strlcat(sc->tulip_boardid, "8432", sizeof(sc->tulip_boardid));
2035 cp = &sc->tulip_boardid[8];
2043 sc->tulip_boardid[7] = '4';
2052 sc->tulip_boardsw = &tulip_21040_10baset_only_boardsw;
2054 sc->tulip_boardsw = &tulip_21040_auibnc_only_boardsw;
2058 tulip_identify_cogent_nic(tulip_softc_t * const sc)
2060 strlcpy(sc->tulip_boardid, "Cogent ", sizeof(sc->tulip_boardid));
2061 if (sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) {
2062 if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100TX_ID) {
2063 strlcat(sc->tulip_boardid, "EM100TX ", sizeof(sc->tulip_boardid));
2064 sc->tulip_boardsw = &tulip_21140_cogent_em100_boardsw;
2066 } else if (sc->tulip_rombuf[32] == TULIP_COGENT_EM110TX_ID) {
2067 strlcat(sc->tulip_boardid, "EM110TX ", sizeof(sc->tulip_boardid));
2068 sc->tulip_boardsw = &tulip_21140_cogent_em100_boardsw;
2070 } else if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100FX_ID) {
2071 strlcat(sc->tulip_boardid, "EM100FX ", sizeof(sc->tulip_boardid));
2072 sc->tulip_boardsw = &tulip_21140_cogent_em100_boardsw;
2078 if (*(u_int32_t *) sc->tulip_rombuf == 0x24001109U
2079 && (sc->tulip_features & TULIP_HAVE_BASEROM)) {
2084 strlcat(sc->tulip_boardid, "EM440TX ", sizeof(sc->tulip_boardid));
2085 sc->tulip_features |= TULIP_HAVE_SHAREDINTR;
2087 } else if (sc->tulip_chipid == TULIP_21040)
2088 sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM;
2092 tulip_identify_accton_nic(tulip_softc_t * const sc)
2094 strlcpy(sc->tulip_boardid, "ACCTON ", sizeof(sc->tulip_boardid));
2095 switch (sc->tulip_chipid) {
2097 strlcat(sc->tulip_boardid, "EN1207 ", sizeof(sc->tulip_boardid));
2098 if (sc->tulip_boardsw != &tulip_2114x_isv_boardsw)
2099 sc->tulip_boardsw = &tulip_21140_accton_boardsw;
2102 strlcat(sc->tulip_boardid, "EN1207TX ", sizeof(sc->tulip_boardid));
2103 if (sc->tulip_boardsw != &tulip_2114x_isv_boardsw)
2104 sc->tulip_boardsw = &tulip_21140_eb_boardsw;
2107 strlcat(sc->tulip_boardid, "EN1203 ", sizeof(sc->tulip_boardid));
2108 sc->tulip_boardsw = &tulip_21040_boardsw;
2111 strlcat(sc->tulip_boardid, "EN1203 ", sizeof(sc->tulip_boardid));
2112 sc->tulip_boardsw = &tulip_21041_boardsw;
2115 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2121 tulip_identify_asante_nic(tulip_softc_t * const sc)
2123 strlcpy(sc->tulip_boardid, "Asante ", sizeof(sc->tulip_boardid));
2124 if ((sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A)
2125 && sc->tulip_boardsw != &tulip_2114x_isv_boardsw) {
2126 tulip_media_info_t *mi = sc->tulip_mediainfo;
2134 sc->tulip_gpinit = TULIP_GP_ASANTE_PINS;
2135 sc->tulip_gpdata = 0;
2137 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ASANTE_PINS|TULIP_GP_PINSET);
2138 TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ASANTE_PHYRESET);
2140 TULIP_CSR_WRITE(sc, csr_gp, 0);
2151 mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, 0);
2160 sc->tulip_features |= TULIP_HAVE_MII;
2165 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD);
2166 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX);
2167 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4);
2168 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD);
2169 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET);
2170 mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) |
2171 tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH);
2173 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2178 tulip_identify_compex_nic(tulip_softc_t * const sc)
2180 strlcpy(sc->tulip_boardid, "COMPEX ", sizeof(sc->tulip_boardid));
2181 if (sc->tulip_chipid == TULIP_21140A) {
2185 strlcat(sc->tulip_boardid, "400TX/PCI ", sizeof(sc->tulip_boardid));
2190 sc->tulip_features |= TULIP_HAVE_SHAREDINTR;
2191 for (root_unit = sc->tulip_unit - 1; root_unit >= 0; root_unit--) {
2199 && root_sc->tulip_chipid == sc->tulip_chipid
2200 && root_sc->tulip_pci_busno == sc->tulip_pci_busno) {
2201 sc->tulip_features |= TULIP_HAVE_SLAVEDINTR;
2202 sc->tulip_slaves = root_sc->tulip_slaves;
2203 root_sc->tulip_slaves = sc;
2204 } else if(sc->tulip_features & TULIP_HAVE_SLAVEDINTR)
2205 printf("\nCannot find master device for de%d interrupts", sc->tulip_unit);
2207 strlcat(sc->tulip_boardid, "unknown ", sizeof(sc->tulip_boardid));
2209 /* sc->tulip_boardsw = &tulip_21140_eb_boardsw; */
2213 tulip_srom_decode(tulip_softc_t * const sc)
2217 const tulip_srom_header_t *shp = (tulip_srom_header_t *) &sc->tulip_rombuf[0];
2220 tulip_media_info_t *mi = sc->tulip_mediainfo;
2227 if (saip->sai_device == sc->tulip_pci_devno)
2239 bcopy((caddr_t) shp->sh_ieee802_address, (caddr_t) sc->tulip_enaddr,
2246 sc->tulip_enaddr[5] += idx1;
2250 dp = sc->tulip_rombuf + leaf_offset;
2252 sc->tulip_conntype = (tulip_srom_connection_t) (dp[0] + dp[1] * 256); dp += 2;
2255 if (tulip_srom_conninfo[idx2].sc_type == sc->tulip_conntype
2259 sc->tulip_connidx = idx2;
2261 if (sc->tulip_chipid == TULIP_21041) {
2275 sc->tulip_mediums[media] = mi;
2283 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, BNC);
2288 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, AUI);
2293 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, 10BASET);
2298 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21041, 10BASET_FD);
2314 if (sc->tulip_features & TULIP_HAVE_GPR)
2315 sc->tulip_gpinit = *dp++;
2339 sc->tulip_mediums[media] = mi;
2342 sc->tulip_gpdata = mi->mi_gpdata;
2360 mi->mi_gpr_offset = dp - sc->tulip_rombuf;
2363 mi->mi_reset_offset = dp - sc->tulip_rombuf;
2370 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_gpinit|TULIP_GP_PINSET);
2373 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_reset_offset + idx3]);
2375 sc->tulip_phyaddr = mi->mi_phyaddr;
2378 TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_gpr_offset + idx3]);
2385 TULIP_CSR_WRITE(sc, csr_gp, 0);
2390 mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, phyno);
2399 sc->tulip_features |= TULIP_HAVE_MII;
2404 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD);
2405 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX);
2406 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4);
2407 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD);
2408 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET);
2409 mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) |
2410 tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH);
2425 sc->tulip_mediums[media] = mi;
2434 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, BNC);
2438 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, AUI);
2442 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, 10BASET);
2443 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
2447 TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, 10BASET_FD);
2448 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
2467 mi->mi_gpr_offset = dp - sc->tulip_rombuf;
2470 mi->mi_reset_offset = dp - sc->tulip_rombuf;
2473 dp0 = &sc->tulip_rombuf[mi->mi_reset_offset];
2476 TULIP_CSR_WRITE(sc, csr_sia_general, (dp0[0] + 256 * dp0[1]) << 16);
2478 sc->tulip_phyaddr = mi->mi_phyaddr;
2479 dp0 = &sc->tulip_rombuf[mi->mi_gpr_offset];
2482 TULIP_CSR_WRITE(sc, csr_sia_general, (dp0[0] + 256 * dp0[1]) << 16);
2486 TULIP_CSR_WRITE(sc, csr_sia_general, 0);
2491 mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, phyno);
2500 sc->tulip_features |= TULIP_HAVE_MII;
2506 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD);
2507 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX);
2508 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4);
2509 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD);
2510 TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET);
2511 mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) |
2512 tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH);
2527 sc->tulip_mediums[media] = mi;
2540 sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;
2550 return (mi - sc->tulip_mediainfo);
2554 void (*vendor_identify_nic)(tulip_softc_t * const sc);
2575 tulip_read_macaddr(tulip_softc_t * const sc)
2582 sc->tulip_connidx = TULIP_SROM_LASTCONNIDX;
2584 if (sc->tulip_chipid == TULIP_21040) {
2585 TULIP_CSR_WRITE(sc, csr_enetrom, 1);
2586 for (idx = 0; idx < sizeof(sc->tulip_rombuf); idx++) {
2588 while (((csr = TULIP_CSR_READ(sc, csr_enetrom)) & 0x80000000L) && cnt < 10000)
2590 sc->tulip_rombuf[idx] = csr & 0xFF;
2592 sc->tulip_boardsw = &tulip_21040_boardsw;
2594 if (sc->tulip_chipid == TULIP_21041) {
2598 sc->tulip_boardsw = &tulip_21041_boardsw;
2607 sc->tulip_boardsw = &tulip_21140_eb_boardsw;
2609 tulip_srom_read(sc);
2610 if (tulip_srom_crcok(sc->tulip_rombuf)) {
2615 sc->tulip_features |= TULIP_HAVE_ISVSROM|TULIP_HAVE_OKSROM;
2616 } else if (sc->tulip_rombuf[126] == 0xff && sc->tulip_rombuf[127] == 0xFF) {
2623 if (sc->tulip_rombuf[idx] != 0)
2626 if (idx == 18 && sc->tulip_rombuf[18] == 1 && sc->tulip_rombuf[19] != 0)
2627 sc->tulip_features |= TULIP_HAVE_ISVSROM;
2628 } else if (sc->tulip_chipid >= TULIP_21142) {
2629 sc->tulip_features |= TULIP_HAVE_ISVSROM;
2630 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2632 if ((sc->tulip_features & TULIP_HAVE_ISVSROM) && tulip_srom_decode(sc)) {
2633 if (sc->tulip_chipid != TULIP_21041)
2634 sc->tulip_boardsw = &tulip_2114x_isv_boardsw;
2640 if (sc->tulip_rombuf[19] > 1)
2641 sc->tulip_features |= TULIP_HAVE_BASEROM;
2642 if (sc->tulip_boardsw == NULL)
2648 if (bcmp(&sc->tulip_rombuf[0], &sc->tulip_rombuf[16], 8) != 0) {
2657 if (sc->tulip_rombuf[idx] != 0xFF)
2664 if ((sc->tulip_rombuf[0] & 3) != 0)
2666 if (sc->tulip_rombuf[0] == 0 && sc->tulip_rombuf[1] == 0
2667 && sc->tulip_rombuf[2] == 0)
2669 bcopy(sc->tulip_rombuf, sc->tulip_enaddr, ETHER_ADDR_LEN);
2670 sc->tulip_features |= TULIP_HAVE_OKROM;
2683 for (idx = 0; idx < sizeof(sc->tulip_rombuf); idx++) {
2684 if (sc->tulip_rombuf[idx] != 0 && sc->tulip_rombuf[idx] != 0xFF)
2687 if (idx == sizeof(sc->tulip_rombuf)) {
2690 for (root_unit = sc->tulip_unit - 1; root_unit >= 0; root_unit--) {
2697 && root_sc->tulip_chipid == sc->tulip_chipid
2698 && root_sc->tulip_pci_busno == sc->tulip_pci_busno) {
2699 sc->tulip_features |= TULIP_HAVE_SLAVEDROM;
2700 sc->tulip_boardsw = root_sc->tulip_boardsw;
2701 strlcpy(sc->tulip_boardid, root_sc->tulip_boardid,
2702 sizeof(sc->tulip_boardid));
2703 if (sc->tulip_boardsw->bd_type == TULIP_21140_ISV) {
2704 bcopy(root_sc->tulip_rombuf, sc->tulip_rombuf,
2705 sizeof(sc->tulip_rombuf));
2706 if (!tulip_srom_decode(sc))
2709 bcopy(root_sc->tulip_enaddr, sc->tulip_enaddr,
2711 sc->tulip_enaddr[5] += sc->tulip_unit - root_sc->tulip_unit;
2721 sc->tulip_slaves = root_sc->tulip_slaves;
2722 root_sc->tulip_slaves = sc;
2723 sc->tulip_features |= TULIP_HAVE_SLAVEDINTR;
2734 if (bcmp(&sc->tulip_rombuf[24], testpat, 8) != 0)
2737 tmpbuf[0] = sc->tulip_rombuf[15]; tmpbuf[1] = sc->tulip_rombuf[14];
2738 tmpbuf[2] = sc->tulip_rombuf[13]; tmpbuf[3] = sc->tulip_rombuf[12];
2739 tmpbuf[4] = sc->tulip_rombuf[11]; tmpbuf[5] = sc->tulip_rombuf[10];
2740 tmpbuf[6] = sc->tulip_rombuf[9]; tmpbuf[7] = sc->tulip_rombuf[8];
2741 if (bcmp(&sc->tulip_rombuf[0], tmpbuf, 8) != 0)
2744 bcopy(sc->tulip_rombuf, sc->tulip_enaddr, ETHER_ADDR_LEN);
2746 cksum = *(u_int16_t *) &sc->tulip_enaddr[0];
2749 cksum += *(u_int16_t *) &sc->tulip_enaddr[2];
2753 cksum += *(u_int16_t *) &sc->tulip_enaddr[4];
2756 rom_cksum = *(u_int16_t *) &sc->tulip_rombuf[6];
2766 if (bcmp((caddr_t) sc->tulip_enaddr,
2768 (*tulip_vendors[idx].vendor_identify_nic)(sc);
2773 sc->tulip_features |= TULIP_HAVE_OKROM;
2778 tulip_ifmedia_add(tulip_softc_t * const sc)
2784 if (sc->tulip_mediums[media] != NULL) {
2785 ifmedia_add(&sc->tulip_ifmedia, tulip_media_to_ifmedia[media],
2791 sc->tulip_features |= TULIP_HAVE_NOMEDIA;
2792 ifmedia_add(&sc->tulip_ifmedia, IFM_ETHER | IFM_NONE, 0, 0);
2793 ifmedia_set(&sc->tulip_ifmedia, IFM_ETHER | IFM_NONE);
2794 } else if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) {
2795 ifmedia_add(&sc->tulip_ifmedia, IFM_ETHER | IFM_AUTO, 0, 0);
2796 ifmedia_set(&sc->tulip_ifmedia, IFM_ETHER | IFM_AUTO);
2798 ifmedia_set(&sc->tulip_ifmedia, tulip_media_to_ifmedia[sc->tulip_media]);
2799 sc->tulip_flags |= TULIP_PRINTMEDIA;
2800 tulip_linkup(sc, sc->tulip_media);
2807 tulip_softc_t * const sc = TULIP_IFP_TO_SOFTC(ifp);
2809 sc->tulip_flags |= TULIP_NEEDRESET;
2810 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
2811 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
2812 if (IFM_SUBTYPE(sc->tulip_ifmedia.ifm_media) != IFM_AUTO) {
2815 if (sc->tulip_mediums[media] != NULL
2816 && sc->tulip_ifmedia.ifm_media == tulip_media_to_ifmedia[media]) {
2817 sc->tulip_flags |= TULIP_PRINTMEDIA;
2818 sc->tulip_flags &= ~TULIP_DIDNWAY;
2819 tulip_linkup(sc, media);
2824 sc->tulip_flags &= ~(TULIP_TXPROBE_ACTIVE|TULIP_WANTRXACT);
2825 tulip_reset(sc);
2826 tulip_init(sc);
2836 tulip_softc_t *sc = TULIP_IFP_TO_SOFTC(ifp);
2838 if (sc->tulip_media == TULIP_MEDIA_UNKNOWN)
2842 if (sc->tulip_flags & TULIP_LINKUP)
2845 req->ifm_active = tulip_media_to_ifmedia[sc->tulip_media];
2849 tulip_alloc_rxmap(tulip_softc_t *sc)
2851 return (sc->tulip_free_rxmaps[--sc->tulip_num_free_rxmaps]);
2855 tulip_free_rxmap(tulip_softc_t *sc, bus_dmamap_t map)
2857 sc->tulip_free_rxmaps[sc->tulip_num_free_rxmaps++] = map;
2861 tulip_alloc_txmap(tulip_softc_t *sc)
2863 return (sc->tulip_free_txmaps[--sc->tulip_num_free_txmaps]);
2867 tulip_free_txmap(tulip_softc_t *sc, bus_dmamap_t map)
2869 sc->tulip_free_txmaps[sc->tulip_num_free_txmaps++] = map;
2873 tulip_addr_filter(tulip_softc_t * const sc)
2875 struct arpcom *ac = &sc->tulip_ac;
2879 sc->tulip_flags &= ~(TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY|TULIP_ALLMULTI);
2880 sc->tulip_flags |= TULIP_WANTSETUP|TULIP_WANTTXSTART;
2881 sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN;
2882 sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED;
2883 sc->tulip_if.if_flags &= ~IFF_ALLMULTI;
2884 if (sc->tulip_multicnt > 14) {
2885 u_int32_t *sp = sc->tulip_setupdata;
2894 if (sc->tulip_features & TULIP_HAVE_BROKEN_HASH)
2895 sc->tulip_flags |= TULIP_WANTHASHONLY;
2897 sc->tulip_flags |= TULIP_WANTHASHPERFECT;
2903 bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata));
2905 sc->tulip_flags |= TULIP_ALLMULTI;
2906 sc->tulip_flags &= ~(TULIP_WANTHASHONLY|TULIP_WANTHASHPERFECT);
2923 if ((sc->tulip_flags & TULIP_ALLMULTI) == 0) {
2930 if (sc->tulip_flags & TULIP_WANTHASHONLY) {
2931 hash = tulip_mchash(sc->tulip_enaddr);
2939 sp[39] = ((u_int16_t *) sc->tulip_enaddr)[0] << 16;
2940 sp[40] = ((u_int16_t *) sc->tulip_enaddr)[1] << 16;
2941 sp[41] = ((u_int16_t *) sc->tulip_enaddr)[2] << 16;
2943 sp[39] = ((u_int16_t *) sc->tulip_enaddr)[0];
2944 sp[40] = ((u_int16_t *) sc->tulip_enaddr)[1];
2945 sp[41] = ((u_int16_t *) sc->tulip_enaddr)[2];
2950 if ((sc->tulip_flags & (TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY)) == 0) {
2951 u_int32_t *sp = sc->tulip_setupdata;
2954 sc->tulip_flags |= TULIP_ALLMULTI;
2956 if ((sc->tulip_flags & TULIP_ALLMULTI) == 0) {
2992 *sp++ = ((u_int16_t *) sc->tulip_enaddr)[0] << 16;
2993 *sp++ = ((u_int16_t *) sc->tulip_enaddr)[1] << 16;
2994 *sp++ = ((u_int16_t *) sc->tulip_enaddr)[2] << 16;
2996 *sp++ = ((u_int16_t *) sc->tulip_enaddr)[0];
2997 *sp++ = ((u_int16_t *) sc->tulip_enaddr)[1];
2998 *sp++ = ((u_int16_t *) sc->tulip_enaddr)[2];
3002 if (sc->tulip_flags & TULIP_ALLMULTI)
3003 sc->tulip_if.if_flags |= IFF_ALLMULTI;
3007 tulip_reset(tulip_softc_t * const sc)
3011 u_int32_t inreset = (sc->tulip_flags & TULIP_INRESET);
3020 if ((sc->tulip_flags & TULIP_DEVICEPROBE) == 0
3021 && sc->tulip_boardsw->bd_media_preset != NULL)
3022 (*sc->tulip_boardsw->bd_media_preset)(sc);
3024 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
3030 sc->tulip_flags |= TULIP_INRESET;
3031 sc->tulip_flags &= ~(TULIP_NEEDRESET|TULIP_RXBUFSLOW);
3032 ifq_clr_oactive(&sc->tulip_if.if_snd);
3035 TULIP_CSR_WRITE(sc, csr_txlist, sc->tulip_txdescmap->dm_segs[0].ds_addr);
3036 TULIP_CSR_WRITE(sc, csr_rxlist, sc->tulip_rxdescmap->dm_segs[0].ds_addr);
3037 TULIP_CSR_WRITE(sc, csr_busmode,
3038 (1 << (TULIP_BURSTSIZE(sc->tulip_unit) + 8))
3044 sc->tulip_txtimer = 0;
3051 m = ml_dequeue(&sc->tulip_txq);
3055 bus_dmamap_unload(sc->tulip_dmatag, map);
3056 tulip_free_txmap(sc, map);
3060 ri = &sc->tulip_txinfo;
3065 bus_dmamap_sync(sc->tulip_dmatag, sc->tulip_txdescmap,
3066 0, sc->tulip_txdescmap->dm_mapsize,
3075 ri = &sc->tulip_rxinfo;
3083 bus_dmamap_sync(sc->tulip_dmatag, sc->tulip_rxdescmap,
3084 0, sc->tulip_rxdescmap->dm_mapsize,
3089 m = ml_dequeue(&sc->tulip_rxq);
3093 bus_dmamap_unload(sc->tulip_dmatag, map);
3094 tulip_free_rxmap(sc, map);
3106 sc->tulip_intrmask |= TULIP_STS_NORMALINTR|TULIP_STS_RXINTR|TULIP_STS_TXINTR
3111 if ((sc->tulip_flags & TULIP_DEVICEPROBE) == 0)
3112 (*sc->tulip_boardsw->bd_media_select)(sc);
3114 if ((sc->tulip_flags & TULIP_NEEDRESET) == TULIP_NEEDRESET)
3118 tulip_media_print(sc);
3119 if (sc->tulip_features & TULIP_HAVE_DUALSENSE)
3120 TULIP_CSR_WRITE(sc, csr_sia_status, TULIP_CSR_READ(sc, csr_sia_status));
3122 sc->tulip_flags &= ~(TULIP_DOINGSETUP|TULIP_WANTSETUP|TULIP_INRESET
3124 tulip_addr_filter(sc);
3128 tulip_init(tulip_softc_t * const sc)
3130 if (sc->tulip_if.if_flags & IFF_UP) {
3131 if ((sc->tulip_if.if_flags & IFF_RUNNING) == 0) {
3133 tulip_reset(sc);
3135 sc->tulip_if.if_flags |= IFF_RUNNING;
3136 if (sc->tulip_if.if_flags & IFF_PROMISC) {
3137 sc->tulip_flags |= TULIP_PROMISC;
3138 sc->tulip_cmdmode |= TULIP_CMD_PROMISCUOUS;
3139 sc->tulip_intrmask |= TULIP_STS_TXINTR;
3141 sc->tulip_flags &= ~TULIP_PROMISC;
3142 sc->tulip_cmdmode &= ~TULIP_CMD_PROMISCUOUS;
3143 if (sc->tulip_flags & TULIP_ALLMULTI)
3144 sc->tulip_cmdmode |= TULIP_CMD_ALLMULTI;
3146 sc->tulip_cmdmode &= ~TULIP_CMD_ALLMULTI;
3148 sc->tulip_cmdmode |= TULIP_CMD_TXRUN;
3149 if ((sc->tulip_flags & (TULIP_TXPROBE_ACTIVE|TULIP_WANTSETUP)) == 0) {
3150 tulip_rx_intr(sc);
3151 sc->tulip_cmdmode |= TULIP_CMD_RXRUN;
3152 sc->tulip_intrmask |= TULIP_STS_RXSTOPPED;
3154 ifq_set_oactive(&sc->tulip_if.if_snd);
3155 sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN;
3156 sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED;
3158 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
3159 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3160 if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP)
3161 tulip_txput_setup(sc);
3163 sc->tulip_if.if_flags &= ~IFF_RUNNING;
3164 tulip_reset(sc);
3169 tulip_rx_intr(tulip_softc_t * const sc)
3172 tulip_ringinfo_t * const ri = &sc->tulip_rxinfo;
3173 struct ifnet * const ifp = &sc->tulip_if;
3189 if (fillok && ml_len(&sc->tulip_rxq) < TULIP_RXQ_TARGET)
3207 TULIP_RXDESC_POSTSYNC(sc, eop, sizeof(*eop));
3210 if (ml_empty(&sc->tulip_rxq))
3211 panic("%s: tulip_rxq empty", sc->tulip_if.if_xname);
3213 ms = ml_dequeue(&sc->tulip_rxq);
3229 TULIP_RXDESC_POSTSYNC(sc, eop, sizeof(*eop));
3247 ms = ml_dequeue(&sc->tulip_rxq);
3250 TULIP_RXMAP_POSTSYNC(sc, map);
3251 bus_dmamap_unload(sc->tulip_dmatag, map);
3252 tulip_free_rxmap(sc, map);
3255 me->m_next = ml_dequeue(&sc->tulip_rxq);
3264 if ((sc->tulip_flags & TULIP_RXIGNORE) == 0
3269 bus_dmamap_sync(sc->tulip_dmatag, map, 0, me->m_len,
3271 bus_dmamap_unload(sc->tulip_dmatag, map);
3272 tulip_free_rxmap(sc, map);
3273 sc->tulip_flags |= TULIP_RXACT;
3278 sc->tulip_dot3stats.dot3StatsInternalMacReceiveErrors++;
3283 sc->tulip_dot3stats.dot3StatsFrameTooLongs++;
3288 sc->tulip_dot3stats.dot3StatsAlignmentErrors++;
3291 sc->tulip_dot3stats.dot3StatsFCSErrors++;
3295 if (error != NULL && (sc->tulip_flags & TULIP_NOMESSAGES) == 0) {
3300 sc->tulip_flags |= TULIP_NOMESSAGES;
3306 bus_dmamap_unload(sc->tulip_dmatag, map);
3307 tulip_free_rxmap(sc, map);
3369 sc->tulip_flags |= TULIP_RXBUFSLOW;
3371 sc->tulip_dbg.dbg_rxlowbufs++;
3382 if (sc->tulip_num_free_rxmaps > 0) {
3383 map = tulip_alloc_rxmap(sc);
3386 sc->tulip_flags |= TULIP_RXBUFSLOW;
3388 sc->tulip_dbg.dbg_rxlowbufs++;
3393 error = bus_dmamap_load(sc->tulip_dmatag, map, mtod(ms, void *),
3409 TULIP_RXDESC_POSTSYNC(sc, nextout, sizeof(*nextout));
3411 TULIP_RXDESC_POSTSYNC(sc, nextout, sizeof(u_int32_t));
3416 ml_enqueue(&sc->tulip_rxq, ms);
3419 if (ml_len(&sc->tulip_rxq) >= TULIP_RXQ_TARGET)
3420 sc->tulip_flags &= ~TULIP_RXBUFSLOW;
3427 sc->tulip_dbg.dbg_rxintrs++;
3428 sc->tulip_dbg.dbg_rxpktsperintr[cnt]++;
3434 tulip_tx_intr(tulip_softc_t * const sc)
3437 tulip_ringinfo_t * const ri = &sc->tulip_txinfo;
3445 TULIP_TXDESC_POSTSYNC(sc, ri->ri_nextin, sizeof(*ri->ri_nextin));
3461 TULIP_TXMAP_POSTSYNC(sc, sc->tulip_setupmap);
3462 sc->tulip_flags &= ~(TULIP_DOINGSETUP|TULIP_HASHONLY);
3464 sc->tulip_flags |= TULIP_HASHONLY;
3465 if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == 0) {
3466 tulip_rx_intr(sc);
3467 sc->tulip_cmdmode |= TULIP_CMD_RXRUN;
3468 sc->tulip_intrmask |= TULIP_STS_RXSTOPPED;
3469 TULIP_CSR_WRITE(sc, csr_status, TULIP_STS_RXSTOPPED);
3470 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
3471 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3475 m = ml_dequeue(&sc->tulip_txq);
3478 TULIP_TXMAP_POSTSYNC(sc, map);
3479 tulip_free_txmap(sc, map);
3481 if (sc->tulip_bpf != NULL)
3482 bpf_mtap(sc->tulip_if.if_bpf, m, BPF_DIRECTION_OUT);
3486 if (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) {
3491 sc->tulip_dbg.dbg_txprobe_nocarr++;
3493 sc->tulip_dbg.dbg_txprobe_exccoll++;
3497 (*sc->tulip_boardsw->bd_media_poll)(sc, event);
3505 sc->tulip_if.if_oerrors++;
3507 sc->tulip_dot3stats.dot3StatsExcessiveCollisions++;
3509 sc->tulip_dot3stats.dot3StatsLateCollisions++;
3511 sc->tulip_dot3stats.dot3StatsCarrierSenseErrors++;
3513 sc->tulip_dot3stats.dot3StatsInternalMacTransmitErrors++;
3515 sc->tulip_dot3stats.dot3StatsInternalTransmitUnderflows++;
3517 sc->tulip_dot3stats.dot3StatsInternalTransmitBabbles++;
3522 sc->tulip_if.if_collisions += collisions;
3524 sc->tulip_dot3stats.dot3StatsSingleCollisionFrames++;
3526 sc->tulip_dot3stats.dot3StatsMultipleCollisionFrames++;
3528 sc->tulip_dot3stats.dot3StatsDeferredTransmissions++;
3535 if (d_status & TULIP_DSTS_TxNOHRTBT & sc->tulip_flags)
3536 sc->tulip_dot3stats.dot3StatsSQETestErrors++;
3545 if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0)
3546 ifq_clr_oactive(&sc->tulip_if.if_snd);
3552 if (ri->ri_free == ri->ri_max || (sc->tulip_flags & TULIP_TXPROBE_ACTIVE))
3553 sc->tulip_txtimer = 0;
3555 sc->tulip_txtimer = TULIP_TXTIMER;
3561 tulip_print_abnormal_interrupt(tulip_softc_t * const sc, u_int32_t csr)
3574 if (mask == TULIP_STS_TXUNDERFLOW && (sc->tulip_flags & TULIP_NEWTXTHRESH)) {
3575 sc->tulip_flags &= ~TULIP_NEWTXTHRESH;
3576 if (sc->tulip_cmdmode & TULIP_CMD_STOREFWD)
3580 &thrsh[9 * ((sc->tulip_cmdmode & TULIP_CMD_THRESHOLDCTL) >> 14)]);
3591 tulip_intr_handler(tulip_softc_t * const sc, int *progress_p)
3596 while ((csr = TULIP_CSR_READ(sc, csr_status)) & sc->tulip_intrmask) {
3598 TULIP_CSR_WRITE(sc, csr_status, csr);
3601 sc->tulip_last_system_error = (csr & TULIP_STS_ERRORMASK) >> TULIP_STS_ERR_SHIFT;
3602 if (sc->tulip_flags & TULIP_NOMESSAGES)
3603 sc->tulip_flags |= TULIP_SYSTEMERROR;
3608 tulip_system_errors[sc->tulip_last_system_error]);
3611 sc->tulip_flags |= TULIP_NEEDRESET;
3612 sc->tulip_system_errors++;
3615 if (csr & (TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL) & sc->tulip_intrmask) {
3617 sc->tulip_dbg.dbg_link_intrs++;
3619 if (sc->tulip_boardsw->bd_media_poll != NULL) {
3620 (*sc->tulip_boardsw->bd_media_poll)(sc, csr & TULIP_STS_LINKFAIL
3625 tulip_media_print(sc);
3628 u_int32_t misses = TULIP_CSR_READ(sc, csr_missed_frames);
3630 sc->tulip_dot3stats.dot3StatsMissedFrames += misses & 0xFFFF;
3635 if ((misses & 0x0FFE0000) && (sc->tulip_features & TULIP_HAVE_RXBADOVRFLW)) {
3636 sc->tulip_dot3stats.dot3StatsInternalMacReceiveErrors++;
3641 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode & ~TULIP_CMD_RXRUN);
3642 while ((TULIP_CSR_READ(sc, csr_status) & TULIP_STS_RXSTOPPED) == 0)
3644 TULIP_CSR_WRITE(sc, csr_status, TULIP_STS_RXSTOPPED);
3645 sc->tulip_flags |= TULIP_RXIGNORE;
3647 tulip_rx_intr(sc);
3648 if (sc->tulip_flags & TULIP_RXIGNORE) {
3652 sc->tulip_flags &= ~TULIP_RXIGNORE;
3653 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3657 u_int32_t tmp = csr & sc->tulip_intrmask
3663 if ((sc->tulip_cmdmode & TULIP_CMD_THRESHOLDCTL) != TULIP_CMD_THRSHLD160) {
3664 sc->tulip_cmdmode += TULIP_CMD_THRSHLD96;
3665 sc->tulip_flags |= TULIP_NEWTXTHRESH;
3666 } else if (sc->tulip_features & TULIP_HAVE_STOREFWD) {
3667 sc->tulip_cmdmode |= TULIP_CMD_STOREFWD;
3668 sc->tulip_flags |= TULIP_NEWTXTHRESH;
3671 if (sc->tulip_flags & TULIP_NOMESSAGES)
3672 sc->tulip_statusbits |= tmp;
3674 tulip_print_abnormal_interrupt(sc, tmp);
3675 sc->tulip_flags |= TULIP_NOMESSAGES;
3677 TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);
3679 if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_TXPROBE_ACTIVE|TULIP_DOINGSETUP|TULIP_PROMISC)) {
3680 tulip_tx_intr(sc);
3681 if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0)
3682 tulip_ifstart(&sc->tulip_if);
3685 if (sc->tulip_flags & TULIP_NEEDRESET) {
3686 tulip_reset(sc);
3687 tulip_init(sc);
3695 tulip_softc_t * sc = arg;
3698 for (; sc != NULL; sc = sc->tulip_slaves) {
3700 sc->tulip_dbg.dbg_intrs++;
3702 tulip_intr_handler(sc, &progress);
3710 tulip_softc_t * sc = (tulip_softc_t *) arg;
3714 sc->tulip_dbg.dbg_intrs++;
3716 tulip_intr_handler(sc, &progress);
3722 tulip_txput(tulip_softc_t * const sc, struct mbuf *m, int notonqueue)
3725 tulip_ringinfo_t * const ri = &sc->tulip_txinfo;
3730 struct ifnet *ifp = &sc->tulip_if;
3735 if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) {
3738 (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) ? "(probe)" : "");
3739 sc->tulip_flags |= TULIP_WANTTXSTART;
3740 sc->tulip_dbg.dbg_txput_finishes[0]++;
3770 if (sc->tulip_num_free_txmaps == 0) {
3772 sc->tulip_dbg.dbg_no_txmaps++;
3774 freedescs += tulip_tx_intr(sc);
3776 if (sc->tulip_num_free_txmaps > 0)
3777 map = tulip_alloc_txmap(sc);
3779 sc->tulip_flags |= TULIP_WANTTXSTART;
3781 sc->tulip_dbg.dbg_txput_finishes[1]++;
3785 switch (bus_dmamap_load_mbuf(sc->tulip_dmatag, map, m, BUS_DMA_NOWAIT)) {
3795 bus_dmamap_load_mbuf(sc->tulip_dmatag, map, m, BUS_DMA_NOWAIT) == 0)
3799 tulip_free_txmap(sc, map);
3807 && (freedescs += tulip_tx_intr(sc)) <= 0) {
3814 sc->tulip_flags |= TULIP_WANTTXSTART;
3816 sc->tulip_dbg.dbg_txput_finishes[4]++;
3818 bus_dmamap_unload(sc->tulip_dmatag, map);
3819 tulip_free_txmap(sc, map);
3845 TULIP_TXMAP_PRESYNC(sc, map);
3859 ml_enqueue(&sc->tulip_txq, m);
3868 TULIP_TXDESC_PRESYNC(sc, nextout, sizeof(u_int32_t));
3883 TULIP_TXDESC_PRESYNC(sc, ri->ri_nextout,
3885 TULIP_TXDESC_PRESYNC(sc, ri->ri_first,
3888 TULIP_TXDESC_PRESYNC(sc, ri->ri_nextout,
3892 TULIP_TXDESC_PRESYNC(sc, ri->ri_nextout, sizeof(u_int32_t));
3902 if (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) {
3903 TULIP_CSR_WRITE(sc, csr_txpoll, 1);
3904 (*set_oactive)(&sc->tulip_if.if_snd);
3912 sc->tulip_flags &= ~TULIP_WANTTXSTART;
3913 if (sc->tulip_txtimer == 0)
3914 sc->tulip_txtimer = TULIP_TXTIMER;
3916 sc->tulip_dbg.dbg_txput_finishes[5]++;
3930 sc->tulip_dbg.dbg_txput_finishes[6]++;
3932 if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_DOINGSETUP)) {
3933 (*set_oactive)(&sc->tulip_if.if_snd);
3934 if ((sc->tulip_intrmask & TULIP_STS_TXINTR) == 0) {
3935 sc->tulip_intrmask |= TULIP_STS_TXINTR;
3936 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
3938 } else if ((sc->tulip_flags & TULIP_PROMISC) == 0) {
3939 if (sc->tulip_intrmask & TULIP_STS_TXINTR) {
3940 sc->tulip_intrmask &= ~TULIP_STS_TXINTR;
3941 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
3944 TULIP_CSR_WRITE(sc, csr_txpoll, 1);
3950 tulip_txput_setup(tulip_softc_t * const sc)
3952 tulip_ringinfo_t * const ri = &sc->tulip_txinfo;
3960 if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) {
3963 sc->tulip_flags |= TULIP_WANTTXSTART;
3971 tulip_tx_intr(sc);
3972 if ((sc->tulip_flags & TULIP_DOINGSETUP) || ri->ri_free == 1) {
3973 sc->tulip_flags |= TULIP_WANTTXSTART;
3976 bcopy(sc->tulip_setupdata, sc->tulip_setupbuf,
3977 sizeof(sc->tulip_setupdata));
3982 sc->tulip_flags ^= TULIP_WANTSETUP|TULIP_DOINGSETUP;
3988 if (sc->tulip_flags & TULIP_WANTHASHPERFECT)
3990 else if (sc->tulip_flags & TULIP_WANTHASHONLY)
3995 nextout->d_length1 = sc->tulip_setupmap->dm_segs[0].ds_len;
3996 nextout->d_addr1 = sc->tulip_setupmap->dm_segs[0].ds_addr;
3997 if (sc->tulip_setupmap->dm_nsegs == 2) {
3998 nextout->d_length2 = sc->tulip_setupmap->dm_segs[1].ds_len;
3999 nextout->d_addr2 = sc->tulip_setupmap->dm_segs[1].ds_addr;
4001 TULIP_TXMAP_PRESYNC(sc, sc->tulip_setupmap);
4002 TULIP_TXDESC_PRESYNC(sc, nextout, sizeof(*nextout));
4016 TULIP_TXDESC_PRESYNC(sc, ri->ri_nextout, sizeof(u_int32_t));
4021 TULIP_TXDESC_PRESYNC(sc, nextout, sizeof(u_int32_t));
4022 TULIP_CSR_WRITE(sc, csr_txpoll, 1);
4023 if ((sc->tulip_intrmask & TULIP_STS_TXINTR) == 0) {
4024 sc->tulip_intrmask |= TULIP_STS_TXINTR;
4025 TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);
4036 tulip_softc_t * const sc = TULIP_IFP_TO_SOFTC(ifp);
4046 tulip_init(sc);
4051 tulip_init(sc);
4057 error = ifmedia_ioctl(ifp, ifr, &sc->tulip_ifmedia, cmd);
4062 error = ether_ioctl(ifp, &sc->tulip_ac, cmd, data);
4067 tulip_addr_filter(sc); /* reset multicast filtering */
4068 tulip_init(sc);
4089 tulip_softc_t * const sc = TULIP_IFP_TO_SOFTC(ifp);
4092 if (sc->tulip_if.if_flags & IFF_RUNNING) {
4094 if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP)
4095 tulip_txput_setup(sc);
4098 m = ifq_deq_begin(&sc->tulip_if.if_snd);
4101 m0 = tulip_txput(sc, m, 0);
4104 ifq_deq_rollback(&sc->tulip_if.if_snd, m);
4117 tulip_softc_t * const sc = TULIP_IFP_TO_SOFTC(ifp);
4120 u_int32_t rxintrs = sc->tulip_dbg.dbg_rxintrs - sc->tulip_dbg.dbg_last_rxintrs;
4121 if (rxintrs > sc->tulip_dbg.dbg_high_rxintrs_hz)
4122 sc->tulip_dbg.dbg_high_rxintrs_hz = rxintrs;
4123 sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs;
4126 sc->tulip_if.if_timer = 1;
4131 if (sc->tulip_flags & (TULIP_SYSTEMERROR|TULIP_RXBUFSLOW|TULIP_NOMESSAGES)) {
4135 if (sc->tulip_flags & TULIP_RXBUFSLOW)
4136 tulip_rx_intr(sc);
4139 if (sc->tulip_flags & TULIP_SYSTEMERROR) {
4141 TULIP_PRINTF_ARGS, sc->tulip_system_errors,
4142 tulip_system_errors[sc->tulip_last_system_error]);
4145 if (sc->tulip_statusbits) {
4146 tulip_print_abnormal_interrupt(sc, sc->tulip_statusbits);
4147 sc->tulip_statusbits = 0;
4150 sc->tulip_flags &= ~(TULIP_NOMESSAGES|TULIP_SYSTEMERROR);
4153 if (sc->tulip_txtimer)
4154 tulip_tx_intr(sc);
4155 if (sc->tulip_txtimer && --sc->tulip_txtimer == 0) {
4157 if (TULIP_DO_AUTOSENSE(sc)) {
4158 sc->tulip_media = TULIP_MEDIA_UNKNOWN;
4159 sc->tulip_probe_state = TULIP_PROBE_INACTIVE;
4160 sc->tulip_flags &= ~(TULIP_WANTRXACT|TULIP_LINKUP);
4162 tulip_reset(sc);
4163 tulip_init(sc);
4167 TULIP_PERFMERGE(sc, perf_intr_cycles);
4168 TULIP_PERFMERGE(sc, perf_ifstart_cycles);
4169 TULIP_PERFMERGE(sc, perf_ifioctl_cycles);
4170 TULIP_PERFMERGE(sc, perf_ifwatchdog_cycles);
4171 TULIP_PERFMERGE(sc, perf_timeout_cycles);
4172 TULIP_PERFMERGE(sc, perf_ifstart_one_cycles);
4173 TULIP_PERFMERGE(sc, perf_txput_cycles);
4174 TULIP_PERFMERGE(sc, perf_txintr_cycles);
4175 TULIP_PERFMERGE(sc, perf_rxintr_cycles);
4176 TULIP_PERFMERGE(sc, perf_rxget_cycles);
4177 TULIP_PERFMERGE(sc, perf_intr);
4178 TULIP_PERFMERGE(sc, perf_ifstart);
4179 TULIP_PERFMERGE(sc, perf_ifioctl);
4180 TULIP_PERFMERGE(sc, perf_ifwatchdog);
4181 TULIP_PERFMERGE(sc, perf_timeout);
4182 TULIP_PERFMERGE(sc, perf_ifstart_one);
4183 TULIP_PERFMERGE(sc, perf_txput);
4184 TULIP_PERFMERGE(sc, perf_txintr);
4185 TULIP_PERFMERGE(sc, perf_rxintr);
4186 TULIP_PERFMERGE(sc, perf_rxget);
4197 tulip_busdma_allocmem(tulip_softc_t * const sc, size_t size,
4202 error = bus_dmamem_alloc(sc->tulip_dmatag, size, 1, PAGE_SIZE,
4207 error = bus_dmamem_map(sc->tulip_dmatag, segs, nsegs, size,
4211 error = bus_dmamap_create(sc->tulip_dmatag, size, 1, size, 0,
4214 error = bus_dmamap_load(sc->tulip_dmatag, map, desc,
4217 bus_dmamap_destroy(sc->tulip_dmatag, map);
4222 bus_dmamem_unmap(sc->tulip_dmatag, desc, size);
4225 bus_dmamem_free(sc->tulip_dmatag, segs, nsegs);
4233 tulip_busdma_init(tulip_softc_t * const sc)
4240 error = tulip_busdma_allocmem(sc, sizeof(sc->tulip_setupdata),
4241 &sc->tulip_setupmap, &sc->tulip_setupbuf);
4247 error = tulip_busdma_allocmem(sc, sizeof(tulip_desc_t) * TULIP_TXDESCS,
4248 &sc->tulip_txdescmap,
4249 &sc->tulip_txdescs);
4257 while (error == 0 && sc->tulip_num_free_txmaps < TULIP_TXDESCS) {
4259 if ((error = TULIP_TXMAP_CREATE(sc, &map)) == 0)
4260 tulip_free_txmap(sc, map);
4263 while (sc->tulip_num_free_txmaps > 0)
4264 bus_dmamap_destroy(sc->tulip_dmatag, tulip_alloc_txmap(sc));
4272 error = tulip_busdma_allocmem(sc, sizeof(tulip_desc_t) * TULIP_RXDESCS,
4273 &sc->tulip_rxdescmap,
4274 &sc->tulip_rxdescs);
4282 while (error == 0 && sc->tulip_num_free_rxmaps < TULIP_RXDESCS) {
4284 if ((error = TULIP_RXMAP_CREATE(sc, &map)) == 0)
4285 tulip_free_rxmap(sc, map);
4288 while (sc->tulip_num_free_rxmaps > 0)
4289 bus_dmamap_destroy(sc->tulip_dmatag, tulip_alloc_rxmap(sc));
4296 tulip_initcsrs(tulip_softc_t * const sc, bus_addr_t csr_base, size_t csr_size)
4298 sc->tulip_csrs.csr_busmode = csr_base + 0 * csr_size;
4299 sc->tulip_csrs.csr_txpoll = csr_base + 1 * csr_size;
4300 sc->tulip_csrs.csr_rxpoll = csr_base + 2 * csr_size;
4301 sc->tulip_csrs.csr_rxlist = csr_base + 3 * csr_size;
4302 sc->tulip_csrs.csr_txlist = csr_base + 4 * csr_size;
4303 sc->tulip_csrs.csr_status = csr_base + 5 * csr_size;
4304 sc->tulip_csrs.csr_command = csr_base + 6 * csr_size;
4305 sc->tulip_csrs.csr_intr = csr_base + 7 * csr_size;
4306 sc->tulip_csrs.csr_missed_frames = csr_base + 8 * csr_size;
4307 sc->tulip_csrs.csr_9 = csr_base + 9 * csr_size;
4308 sc->tulip_csrs.csr_10 = csr_base + 10 * csr_size;
4309 sc->tulip_csrs.csr_11 = csr_base + 11 * csr_size;
4310 sc->tulip_csrs.csr_12 = csr_base + 12 * csr_size;
4311 sc->tulip_csrs.csr_13 = csr_base + 13 * csr_size;
4312 sc->tulip_csrs.csr_14 = csr_base + 14 * csr_size;
4313 sc->tulip_csrs.csr_15 = csr_base + 15 * csr_size;
4317 tulip_initring(tulip_softc_t * const sc, tulip_ringinfo_t * const ri,
4346 tulip_softc_t * const sc = (tulip_softc_t *) self;
4348 struct ifnet * const ifp = &sc->tulip_if;
4349 const int unit = sc->tulip_dev.dv_unit;
4363 ml_init(&sc->tulip_txq);
4364 ml_init(&sc->tulip_rxq);
4394 PCI_GETBUSDEVINFO(sc);
4395 sc->tulip_chipid = chipid;
4396 sc->tulip_flags |= TULIP_DEVICEPROBE;
4398 sc->tulip_features |= TULIP_HAVE_GPR|TULIP_HAVE_STOREFWD;
4400 sc->tulip_features |= TULIP_HAVE_RXBADOVRFLW;
4402 sc->tulip_features |= TULIP_HAVE_BROKEN_HASH;
4404 sc->tulip_features |= TULIP_HAVE_POWERMGMT;
4406 sc->tulip_features |= TULIP_HAVE_DUALSENSE;
4408 sc->tulip_features |= TULIP_HAVE_SIANWAY;
4410 sc->tulip_features |= TULIP_HAVE_SIAGP|TULIP_HAVE_RXBADOVRFLW|TULIP_HAVE_STOREFWD;
4412 sc->tulip_features |= TULIP_HAVE_SIA100;
4415 if (sc->tulip_features & TULIP_HAVE_POWERMGMT
4422 if (sc->tulip_features & TULIP_HAVE_STOREFWD)
4423 sc->tulip_cmdmode |= TULIP_CMD_STOREFWD;
4425 bcopy(self->dv_xname, sc->tulip_if.if_xname, IFNAMSIZ);
4426 sc->tulip_if.if_softc = sc;
4427 sc->tulip_pc = pa->pa_pc;
4428 sc->tulip_dmatag = pa->pa_dmat;
4429 sc->tulip_revinfo = revinfo;
4431 timeout_set(&sc->tulip_stmo, tulip_timeout_callback, sc);
4446 sc->tulip_bustag = memt;
4447 sc->tulip_bushandle = memh;
4449 sc->tulip_bustag = iot;
4450 sc->tulip_bushandle = ioh;
4457 tulip_initcsrs(sc, csr_base + csroffset, csrsize);
4459 if ((retval = tulip_busdma_init(sc)) != 0) {
4464 tulip_initring(sc, &sc->tulip_rxinfo, sc->tulip_rxdescs, TULIP_RXDESCS);
4465 tulip_initring(sc, &sc->tulip_txinfo, sc->tulip_txdescs, TULIP_TXDESCS);
4470 TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
4475 if ((retval = tulip_read_macaddr(sc)) < 0) {
4476 printf(", %s%s pass %d.%d", sc->tulip_boardid,
4477 tulip_chipdescs[sc->tulip_chipid],
4478 (sc->tulip_revinfo & 0xF0) >> 4, sc->tulip_revinfo & 0x0F);
4481 printf("%02x", sc->tulip_rombuf[idx]);
4486 if (sc->tulip_features & TULIP_HAVE_SHAREDINTR)
4489 if ((sc->tulip_features & TULIP_HAVE_SLAVEDINTR) == 0) {
4499 sc->tulip_ih = pci_intr_establish(pa->pa_pc, intrhandle, IPL_NET,
4500 intr_rtn, sc, self->dv_xname);
4501 if (sc->tulip_ih == NULL) {
4510 sc->tulip_boardid,
4511 tulip_chipdescs[sc->tulip_chipid],
4512 (sc->tulip_revinfo & 0xF0) >> 4,
4513 sc->tulip_revinfo & 0x0F,
4514 (sc->tulip_features & (TULIP_HAVE_ISVSROM|TULIP_HAVE_OKSROM))
4516 intrstr, ether_sprintf(sc->tulip_enaddr));
4525 (*sc->tulip_boardsw->bd_media_probe)(sc);
4526 ifmedia_init(&sc->tulip_ifmedia, 0,
4528 sc->tulip_flags &= ~TULIP_DEVICEPROBE;
4529 tulip_ifmedia_add(sc);
4531 tulip_reset(sc);