⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 if_de.c

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	 * No activity mask?  Can't see if it is active if there's no mask.	 */	if (mi->mi_actmask == 0)	    continue;	/*	 * Does the activity data match?	 */	if ((TULIP_CSR_READ(sc, csr_gp) & mi->mi_actmask) != mi->mi_actdata)	    continue;#if defined(TULIP_DEBUG)	printf(TULIP_PRINTF_FMT ": gpr_media_sense: %s: 0x%02x & 0x%02x == 0x%02x\n",	       TULIP_PRINTF_ARGS, tulip_mediums[media],	       TULIP_CSR_READ(sc, csr_gp) & 0xFF,	       mi->mi_actmask, mi->mi_actdata);#endif	/*	 * It does!  If this is the first media we detected, then 	 * remember this media.  If isn't the first, then there were	 * multiple matches which we equate to no match (since we don't	 * which to select (if any).	 */	if (last_media == TULIP_MEDIA_UNKNOWN) {	    last_media = media;	} else if (last_media != media) {	    last_media = TULIP_MEDIA_UNKNOWN;	}    }    return (last_media != TULIP_MEDIA_UNKNOWN) ? last_media : maybe_media;}#endif /* TULIP_DO_GPR_SENSE */static tulip_link_status_ttulip_media_link_monitor(    tulip_softc_t * const sc){    const tulip_media_info_t * const mi = sc->tulip_mediums[sc->tulip_media];    tulip_link_status_t linkup = TULIP_LINK_DOWN;    if (mi == NULL) {#if defined(DIAGNOSTIC) || defined(TULIP_DEBUG)	printf("tulip_media_link_monitor: %s: botch at line %d\n",	      tulip_mediums[sc->tulip_media],__LINE__);#endif	return TULIP_LINK_UNKNOWN;    }    /*     * Have we seen some packets?  If so, the link must be good.     */    if ((sc->tulip_flags & (TULIP_RXACT|TULIP_LINKUP)) == (TULIP_RXACT|TULIP_LINKUP)) {	sc->tulip_flags &= ~TULIP_RXACT;	sc->tulip_probe_timeout = 3000;	return TULIP_LINK_UP;    }    sc->tulip_flags &= ~TULIP_RXACT;    if (mi->mi_type == TULIP_MEDIAINFO_MII) {	u_int32_t status;	/*	 * Read the PHY status register.	 */	status = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS);	if (status & PHYSTS_AUTONEG_DONE) {	    /*	     * If the PHY has completed autonegotiation, see the if the	     * remote systems abilities have changed.  If so, upgrade or	     * downgrade as appropriate.	     */	    u_int32_t abilities = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_AUTONEG_ABILITIES);	    abilities = (abilities << 6) & status;	    if (abilities != sc->tulip_abilities) {#if defined(TULIP_DEBUG)		loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation changed: 0x%04x -> 0x%04x\n",			   TULIP_PRINTF_ARGS, sc->tulip_phyaddr,			   sc->tulip_abilities, abilities);#endif		if (tulip_mii_map_abilities(sc, abilities)) {		    tulip_linkup(sc, sc->tulip_probe_media);		    return TULIP_LINK_UP;		}		/*		 * if we had selected media because of autonegotiation,		 * we need to probe for the new media.		 */		sc->tulip_probe_state = TULIP_PROBE_INACTIVE;		if (sc->tulip_flags & TULIP_DIDNWAY)		    return TULIP_LINK_DOWN;	    }	}	/*	 * The link is now up.  If was down, say its back up.	 */	if ((status & (PHYSTS_LINK_UP|PHYSTS_REMOTE_FAULT)) == PHYSTS_LINK_UP)	    linkup = TULIP_LINK_UP;    } else if (mi->mi_type == TULIP_MEDIAINFO_GPR) {	/*	 * No activity sensor?  Assume all's well.	 */	if (mi->mi_actmask == 0)	    return TULIP_LINK_UNKNOWN;	/*	 * Does the activity data match?	 */	if ((TULIP_CSR_READ(sc, csr_gp) & mi->mi_actmask) == mi->mi_actdata)	    linkup = TULIP_LINK_UP;    } else if (mi->mi_type == TULIP_MEDIAINFO_SIA) {	/*	 * Assume non TP ok for now.	 */	if (!TULIP_IS_MEDIA_TP(sc->tulip_media))	    return TULIP_LINK_UNKNOWN;	if ((TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL) == 0)	    linkup = TULIP_LINK_UP;#if defined(TULIP_DEBUG)	if (sc->tulip_probe_timeout <= 0)	    printf(TULIP_PRINTF_FMT ": sia status = 0x%08x\n", TULIP_PRINTF_ARGS, TULIP_CSR_READ(sc, csr_sia_status));#endif    } else if (mi->mi_type == TULIP_MEDIAINFO_SYM) {	return TULIP_LINK_UNKNOWN;    }    /*     * We will wait for 3 seconds until the link goes into suspect mode.     */    if (sc->tulip_flags & TULIP_LINKUP) {	if (linkup == TULIP_LINK_UP)	    sc->tulip_probe_timeout = 3000;	if (sc->tulip_probe_timeout > 0)	    return TULIP_LINK_UP;	sc->tulip_flags &= ~TULIP_LINKUP;	printf(TULIP_PRINTF_FMT ": link down: cable problem?\n", TULIP_PRINTF_ARGS);    }#if defined(TULIP_DEBUG)    sc->tulip_dbg.dbg_link_downed++;#endif    return TULIP_LINK_DOWN;}static voidtulip_media_poll(    tulip_softc_t * const sc,    tulip_mediapoll_event_t event){#if defined(TULIP_DEBUG)    sc->tulip_dbg.dbg_events[event]++;#endif    if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE	    && event == TULIP_MEDIAPOLL_TIMER) {	switch (tulip_media_link_monitor(sc)) {	    case TULIP_LINK_DOWN: {		/*		 * Link Monitor failed.  Probe for new media.		 */		event = TULIP_MEDIAPOLL_LINKFAIL;		break;	    }	    case TULIP_LINK_UP: {		/*		 * Check again soon.		 */		tulip_timeout(sc);		return;	    }	    case TULIP_LINK_UNKNOWN: {		/*		 * We can't tell so don't bother.		 */		return;	    }	}    }    if (event == TULIP_MEDIAPOLL_LINKFAIL) {	if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE) {	    if (TULIP_DO_AUTOSENSE(sc)) {#if defined(TULIP_DEBUG)		sc->tulip_dbg.dbg_link_failures++;#endif		sc->tulip_media = TULIP_MEDIA_UNKNOWN;		if (sc->tulip_if.if_flags & IFF_UP)		    tulip_reset(sc);	/* restart probe */	    }	    return;	}#if defined(TULIP_DEBUG)	sc->tulip_dbg.dbg_link_pollintrs++;#endif    }    if (event == TULIP_MEDIAPOLL_START) {	sc->tulip_if.if_flags |= IFF_OACTIVE;	if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE)	    return;	sc->tulip_probe_mediamask = 0;	sc->tulip_probe_passes = 0;#if defined(TULIP_DEBUG)	sc->tulip_dbg.dbg_media_probes++;#endif	/*	 * If the SROM contained an explicit media to use, use it.	 */	sc->tulip_cmdmode &= ~(TULIP_CMD_RXRUN|TULIP_CMD_FULLDUPLEX);	sc->tulip_flags |= TULIP_TRYNWAY|TULIP_PROBE1STPASS;	sc->tulip_flags &= ~(TULIP_DIDNWAY|TULIP_PRINTMEDIA|TULIP_PRINTLINKUP);	/*	 * connidx is defaulted to a media_unknown type.	 */	sc->tulip_probe_media = tulip_srom_conninfo[sc->tulip_connidx].sc_media;	if (sc->tulip_probe_media != TULIP_MEDIA_UNKNOWN) {	    tulip_linkup(sc, sc->tulip_probe_media);	    tulip_timeout(sc);	    return;	}	if (sc->tulip_features & TULIP_HAVE_GPR) {	    sc->tulip_probe_state = TULIP_PROBE_GPRTEST;	    sc->tulip_probe_timeout = 2000;	} else {	    sc->tulip_probe_media = TULIP_MEDIA_MAX;	    sc->tulip_probe_timeout = 0;	    sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;	}    }    /*     * Ignore txprobe failures or spurious callbacks.     */    if (event == TULIP_MEDIAPOLL_TXPROBE_FAILED	    && sc->tulip_probe_state != TULIP_PROBE_MEDIATEST) {	sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;	return;    }    /*     * If we really transmitted a packet, then that's the media we'll use.     */    if (event == TULIP_MEDIAPOLL_TXPROBE_OK || event == TULIP_MEDIAPOLL_LINKPASS) {	if (event == TULIP_MEDIAPOLL_LINKPASS) {	    /* XXX check media status just to be sure */	    sc->tulip_probe_media = TULIP_MEDIA_10BASET;#if defined(TULIP_DEBUG)	} else {	    sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++;#endif	}	tulip_linkup(sc, sc->tulip_probe_media);	tulip_timeout(sc);	return;    }    if (sc->tulip_probe_state == TULIP_PROBE_GPRTEST) {#if defined(TULIP_DO_GPR_SENSE)	/*	 * Check for media via the general purpose register.	 *	 * Try to sense the media via the GPR.  If the same value	 * occurs 3 times in a row then just use that.	 */	if (sc->tulip_probe_timeout > 0) {	    tulip_media_t new_probe_media = tulip_21140_gpr_media_sense(sc);#if defined(TULIP_DEBUG)	    printf(TULIP_PRINTF_FMT ": media_poll: gpr sensing = %s\n",		   TULIP_PRINTF_ARGS, tulip_mediums[new_probe_media]);#endif	    if (new_probe_media != TULIP_MEDIA_UNKNOWN) {		if (new_probe_media == sc->tulip_probe_media) {		    if (--sc->tulip_probe_count == 0)			tulip_linkup(sc, sc->tulip_probe_media);		} else {		    sc->tulip_probe_count = 10;		}	    }	    sc->tulip_probe_media = new_probe_media;	    tulip_timeout(sc);	    return;	}#endif /* TULIP_DO_GPR_SENSE */	/*	 * Brute force.  We cycle through each of the media types	 * and try to transmit a packet.	 */	sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;	sc->tulip_probe_media = TULIP_MEDIA_MAX;	sc->tulip_probe_timeout = 0;	tulip_timeout(sc);	return;    }    if (sc->tulip_probe_state != TULIP_PROBE_MEDIATEST	   && (sc->tulip_features & TULIP_HAVE_MII)) {	tulip_media_t old_media = sc->tulip_probe_media;	tulip_mii_autonegotiate(sc, sc->tulip_phyaddr);	switch (sc->tulip_probe_state) {	    case TULIP_PROBE_FAILED:	    case TULIP_PROBE_MEDIATEST: {		/*		 * Try the next media.		 */		sc->tulip_probe_mediamask |= sc->tulip_mediums[sc->tulip_probe_media]->mi_mediamask;		sc->tulip_probe_timeout = 0;#ifdef notyet		if (sc->tulip_probe_state == TULIP_PROBE_FAILED)		    break;		if (sc->tulip_probe_media != tulip_mii_phy_readspecific(sc))		    break;		sc->tulip_probe_timeout = TULIP_IS_MEDIA_TP(sc->tulip_probe_media) ? 2500 : 300;#endif		break;	    }	    case TULIP_PROBE_PHYAUTONEG: {		return;	    }	    case TULIP_PROBE_INACTIVE: {		/*		 * Only probe if we autonegotiated a media that hasn't failed.		 */		sc->tulip_probe_timeout = 0;		if (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media)) {		    sc->tulip_probe_media = old_media;		    break;		}		tulip_linkup(sc, sc->tulip_probe_media);		tulip_timeout(sc);		return;	    }	    default: {#if defined(DIAGNOSTIC) || defined(TULIP_DEBUG)		printf("tulip_media_poll: botch at line %d\n", __LINE__);#endif		break;	    }	}    }    if (event == TULIP_MEDIAPOLL_TXPROBE_FAILED) {#if defined(TULIP_DEBUG)	sc->tulip_dbg.dbg_txprobes_failed[sc->tulip_probe_media]++;#endif	sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;	return;    }    /*     * switch to another media if we tried this one enough.     */    if (/* event == TULIP_MEDIAPOLL_TXPROBE_FAILED || */ sc->tulip_probe_timeout <= 0) {#if defined(TULIP_DEBUG)	if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) {	    printf(TULIP_PRINTF_FMT ": poll media unknown!\n",		   TULIP_PRINTF_ARGS);	    sc->tulip_probe_media = TULIP_MEDIA_MAX;	}#endif	/*	 * Find the next media type to check for.  Full Duplex	 * types are not allowed.	 */	do {	    sc->tulip_probe_media -= 1;	    if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) {		if (++sc->tulip_probe_passes == 3) {		    printf(TULIP_PRINTF_FMT ": autosense failed: cable problem?\n",			   TULIP_PRINTF_ARGS);		    if ((sc->tulip_if.if_flags & IFF_UP) == 0) {			sc->tulip_if.if_flags &= ~IFF_RUNNING;			sc->tulip_probe_state = TULIP_PROBE_INACTIVE;			return;		    }		}		sc->tulip_flags ^= TULIP_TRYNWAY;	/* XXX */		sc->tulip_probe_mediamask = 0;		sc->tulip_probe_media = TULIP_MEDIA_MAX - 1;	    }	} while (sc->tulip_mediums[sc->tulip_probe_media] == NULL		 || (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media))		 || TULIP_IS_MEDIA_FD(sc->tulip_probe_media));#if defined(TULIP_DEBUG)	printf(TULIP_PRINTF_FMT ": %s: probing %s\n", TULIP_PRINTF_ARGS,	       event == TULIP_MEDIAPOLL_TXPROBE_FAILED ? "txprobe failed" : "timeout",	       tulip_mediums[sc->tulip_probe_media]);#endif	sc->tulip_probe_timeout = TULIP_IS_MEDIA_TP(sc->tulip_probe_media) ? 2500 : 1000;	sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;	sc->tulip_probe.probe_txprobes = 0;	tulip_reset(sc);	tulip_media_set(sc, sc->tulip_probe_media);	sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;    }    tulip_timeout(sc);    /*     * If this is hanging off a phy, we know are doing NWAY and we have     * forced the phy to a specific speed.  Wait for link up before     * before sending a packet.     */    switch (sc->tulip_mediums[sc->tulip_probe_media]->mi_type) {	case TULIP_MEDIAINFO_MII: {	    if (sc->tulip_probe_media != tulip_mii_phy_readspecific(sc))		return;	    break;	}	case TULIP_MEDIAINFO_SIA: {	    if (TULIP_IS_MEDIA_TP(sc->tulip_probe_media)) {		if (TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL)		    return;		tulip_linkup(sc, sc->tulip_probe_media);#ifdef notyet		if (sc->tulip_features & TULIP_HAVE_MII)		    tulip_timeout(sc);#endif		return;	    }	    break;	}	case TULIP_MEDIAINFO_RESET:	case TULIP_MEDIAINFO_SYM:	case TULIP_MEDIAINFO_NONE:	case TULIP_MEDIAINFO_GPR: {	    break;	}    }    /*     * Try to send a packet.     */    tulip_txprobe(sc);}static voidtulip_media_select(    tulip_softc_t * const sc)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -