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

📄 if_de.c

📁 很好的一个嵌入式linux平台下的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
    tulip_media_t media){#if defined(TULIP_MEGADEBUG)    printf ("tulip_linkup\n");#endif    if ((sc->tulip_flags & TULIP_LINKUP) == 0)	sc->tulip_flags |= TULIP_PRINTLINKUP;    sc->tulip_flags |= TULIP_LINKUP;    sc->tulip_if.if_flags &= ~IFF_OACTIVE;#if 0 /* XXX how does with work with ifmedia? */    if ((sc->tulip_flags & TULIP_DIDNWAY) == 0) {	if (sc->tulip_if.if_flags & IFF_FULLDUPLEX) {	    if (TULIP_CAN_MEDIA_FD(media)		    && sc->tulip_mediums[TULIP_FD_MEDIA_OF(media)] != NULL)		media = TULIP_FD_MEDIA_OF(media);	} else {	    if (TULIP_IS_MEDIA_FD(media)		    && sc->tulip_mediums[TULIP_HD_MEDIA_OF(media)] != NULL)		media = TULIP_HD_MEDIA_OF(media);	}    }#endif    if (sc->tulip_media != media) {#ifdef TULIP_DEBUG	sc->tulip_dbg.dbg_last_media = sc->tulip_media;#endif	sc->tulip_media = media;	sc->tulip_flags |= TULIP_PRINTMEDIA;	if (TULIP_IS_MEDIA_FD(sc->tulip_media)) {	    sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;	} else if (sc->tulip_chipid != TULIP_21041 || (sc->tulip_flags & TULIP_DIDNWAY) == 0) {	    sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;	}    }    /*     * We could set probe_timeout to 0 but setting to 3000 puts this     * in one central place and the only matters is tulip_link is     * followed by a tulip_timeout.  Therefore setting it should not     * result in aberrant behavour.     */    sc->tulip_probe_timeout = 3000;#if defined(TULIP_MEGADEBUG)    printf ("tulip_linkup: probe inactive\n");#endif    sc->tulip_probe_state = TULIP_PROBE_INACTIVE;    sc->tulip_flags &= ~(TULIP_TXPROBE_ACTIVE|TULIP_TRYNWAY);    if (sc->tulip_flags & TULIP_INRESET) {	tulip_media_set(sc, sc->tulip_media);    } else {	if (sc->tulip_probe_media != sc->tulip_media) {	    /*	     * No reason to change media if we have the right media.	     */#if defined(TULIP_MEGADEBUG)	    printf ("tulip_reset: tulip_linkup\n");#endif	    tulip_reset(sc);	}	tulip_init(sc);    }}static voidtulip_media_print(    tulip_softc_t * const sc){    if ((sc->tulip_if.if_flags & IFF_UP) == 0)	return;    if ((sc->tulip_flags & TULIP_LINKUP) == 0)	return;    if (sc->tulip_flags & TULIP_PRINTMEDIA) {	printf(TULIP_PRINTF_FMT ": enabling %s port\n",	       TULIP_PRINTF_ARGS,	       tulip_mediums[sc->tulip_media]);	sc->tulip_flags &= ~(TULIP_PRINTMEDIA|TULIP_PRINTLINKUP);    } else if (sc->tulip_flags & TULIP_PRINTLINKUP) {	printf(TULIP_PRINTF_FMT ": link up\n", TULIP_PRINTF_ARGS);	sc->tulip_flags &= ~TULIP_PRINTLINKUP;    }}#if defined(TULIP_DO_GPR_SENSE)static tulip_media_ttulip_21140_gpr_media_sense(    tulip_softc_t * const sc){    tulip_media_t maybe_media = TULIP_MEDIA_UNKNOWN;    tulip_media_t last_media = TULIP_MEDIA_UNKNOWN;    tulip_media_t media;    /*     * If one of the media blocks contained a default media flag,     * use that.     */    for (media = TULIP_MEDIA_UNKNOWN; media < TULIP_MEDIA_MAX; media++) {	const tulip_media_info_t *mi;	/*	 * Media is not supported (or is full-duplex).	 */	if ((mi = sc->tulip_mediums[media]) == NULL || TULIP_IS_MEDIA_FD(media))	    continue;	if (mi->mi_type != TULIP_MEDIAINFO_GPR)	    continue;	/*	 * Remember the media is this is the "default" media.	 */	if (mi->mi_default && maybe_media == TULIP_MEDIA_UNKNOWN)	    maybe_media = media;	/*	 * 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.		 */#if defined(TULIP_MEGADEBUG)    printf ("tulip_media_link_monitor: probe inactive\n");#endif		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;	if (sc->tulip_if.if_flags & IFF_UP)	    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 defined(TULIP_MEGADEBUG)    {	static char *eventnames[] = {	    "timer",		/* 100ms timer fired */	    "fasttimer",	/* <100ms timer fired */	    "linkfail",		/* called from interrupt routine */	    "linkpass",		/* called from interrupt routine */	    "start",		/* start a media probe (called from reset) */	    "txprobe_ok",	/* txprobe succeeded */	    "txprobe_failed"	/* txprobe failed */	};	static char *statenames[] = {	    "inactive",	    "phyreset",	    "phyautoneg",	    "gprtest",	    "mediatest",	    "failed"	};	static int lasttimeout = -1;	int interesting = 1;;	if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE && 	    event == TULIP_MEDIAPOLL_TIMER) {	    /* This is boring if we last printed one with the same timeout */	    if (lasttimeout == sc->tulip_probe_timeout)		interesting = 0;	    lasttimeout = sc->tulip_probe_timeout;	}	else	    lasttimeout = -1;	if (interesting)	    printf ("media_poll: event %s state %s timeout %d\n", eventnames[event], statenames[sc->tulip_probe_state], sc->tulip_probe_timeout);    }#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 defined(TULIP_MEGADEBUG)		printf ("tulip_reset: tulip_media_poll\n");#endif		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)	    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.	 */

⌨️ 快捷键说明

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