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

📄 if_de.c

📁 很好的一个嵌入式linux平台下的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
	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;#if defined(TULIP_MEGADEBUG)	printf ("tulip_reset: tulip_media_poll/txprobe\n");#endif	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){    if (sc->tulip_features & TULIP_HAVE_GPR) {	TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET|sc->tulip_gpinit);	DELAY(10);	TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_gpdata);    }    /*     * If this board has no media, just return     */    if (sc->tulip_features & TULIP_HAVE_NOMEDIA)	return;    if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) {	TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask);	(*sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_START);    } else {	tulip_media_set(sc, sc->tulip_media);    }}static voidtulip_21040_mediainfo_init(    tulip_softc_t * const sc,    tulip_media_t media){    sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_THRSHLD160	|TULIP_CMD_BACKOFFCTR;    sc->tulip_if.if_baudrate = 10000000;    if (media == TULIP_MEDIA_10BASET || media == TULIP_MEDIA_UNKNOWN) {	TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[0], 21040, 10BASET);	TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[1], 21040, 10BASET_FD);    }    if (media == TULIP_MEDIA_AUIBNC || media == TULIP_MEDIA_UNKNOWN) {	TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[2], 21040, AUIBNC);    }    if (media == TULIP_MEDIA_UNKNOWN) {	TULIP_MEDIAINFO_SIA_INIT(sc, &sc->tulip_mediainfo[3], 21040, EXTSIA);    }}static voidtulip_21040_media_probe(    tulip_softc_t * const sc){    tulip_21040_mediainfo_init(sc, TULIP_MEDIA_UNKNOWN);    return;}static voidtulip_21040_10baset_only_media_probe(    tulip_softc_t * const sc){    tulip_21040_mediainfo_init(sc, TULIP_MEDIA_10BASET);    tulip_media_set(sc, TULIP_MEDIA_10BASET);    sc->tulip_media = TULIP_MEDIA_10BASET;}static voidtulip_21040_10baset_only_media_select(    tulip_softc_t * const sc){    sc->tulip_flags |= TULIP_LINKUP;    if (sc->tulip_media == TULIP_MEDIA_10BASET_FD) {	sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;	sc->tulip_flags &= ~TULIP_SQETEST;    } else {	sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;	sc->tulip_flags |= TULIP_SQETEST;    }    tulip_media_set(sc, sc->tulip_media);}static voidtulip_21040_auibnc_only_media_probe(    tulip_softc_t * const sc){    tulip_21040_mediainfo_init(sc, TULIP_MEDIA_AUIBNC);    sc->tulip_flags |= TULIP_SQETEST|TULIP_LINKUP;    tulip_media_set(sc, TULIP_MEDIA_AUIBNC);    sc->tulip_media = TULIP_MEDIA_AUIBNC;}static voidtulip_21040_auibnc_only_media_select(    tulip_softc_t * const sc){    tulip_media_set(sc, TULIP_MEDIA_AUIBNC);    sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;}static const tulip_boardsw_t tulip_21040_boardsw = {    TULIP_21040_GENERIC,    tulip_21040_media_probe,    tulip_media_select,    tulip_media_poll,};static const tulip_boardsw_t tulip_21040_10baset_only_boardsw = {    TULIP_21040_GENERIC,    tulip_21040_10baset_only_media_probe,    tulip_21040_10baset_only_media_select,    NULL,};static const tulip_boardsw_t tulip_21040_auibnc_only_boardsw = {    TULIP_21040_GENERIC,    tulip_21040_auibnc_only_media_probe,    tulip_21040_auibnc_only_media_select,    NULL,};static voidtulip_21041_mediainfo_init(    tulip_softc_t * const sc){    tulip_media_info_t * const mi = sc->tulip_mediainfo;#ifdef notyet    if (sc->tulip_revinfo >= 0x20) {	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041P2, 10BASET);	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041P2, 10BASET_FD);	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041P2, AUI);	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041P2, BNC);	return;    }#endif    if (!(sc->tulip_features & TULIP_HAVE_ISVSROM)) {	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[0], 21041, 10BASET);	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[1], 21041, 10BASET_FD);	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[2], 21041, AUI);	TULIP_MEDIAINFO_SIA_INIT(sc, &mi[3], 21041, BNC);    }}static voidtulip_21041_media_probe(    tulip_softc_t * const sc){    sc->tulip_if.if_baudrate = 10000000;    sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_ENHCAPTEFFCT	|TULIP_CMD_THRSHLD160|TULIP_CMD_BACKOFFCTR;    sc->tulip_intrmask |= TULIP_STS_LINKPASS;    tulip_21041_mediainfo_init(sc);}static voidtulip_21041_media_poll(    tulip_softc_t * const sc,    const tulip_mediapoll_event_t event){    u_int32_t sia_status;#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"	};	printf ("21041_media_poll: event=%s state=%s timeout=%d\n", eventnames[event], statenames[sc->tulip_probe_state], sc->tulip_probe_timeout);    }#endif    if (event == TULIP_MEDIAPOLL_LINKFAIL) {	if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE		|| !TULIP_DO_AUTOSENSE(sc))	    return;	sc->tulip_media = TULIP_MEDIA_UNKNOWN;#if defined(TULIP_MEGADEBUG)	printf ("tulip_reset: tulip_21041_poll\n");#endif	tulip_reset(sc);	/* start probe */	return;    }    /*     * If we've been been asked to start a poll or link change interrupt     * restart the probe (and reset the tulip to a known state).     */    if (event == TULIP_MEDIAPOLL_START) {	sc->tulip_if.if_flags |= IFF_OACTIVE;	sc->tulip_cmdmode &= ~(TULIP_CMD_FULLDUPLEX|TULIP_CMD_RXRUN);#ifdef notyet	if (sc->tulip_revinfo >= 0x20) {	    sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX;	    sc->tulip_flags |= TULIP_DIDNWAY;	}#endif	TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);	sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;	if (sc->tulip_mediums[TULIP_MEDIA_10BASET]) {	    sc->tulip_probe_media = TULIP_MEDIA_10BASET;	    sc->tulip_probe_timeout = TULIP_21041_PROBE_10BASET_TIMEOUT;	}	else if (sc->tulip_mediums[TULIP_MEDIA_AUI]) {	    sc->tulip_probe_media = TULIP_MEDIA_AUI;	    sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;	}	else if (sc->tulip_mediums[TULIP_MEDIA_BNC]) {	    sc->tulip_probe_media = TULIP_MEDIA_BNC;	    sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;	}	tulip_media_set(sc, sc->tulip_probe_media);	tulip_timeout(sc);	return;    }    if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)	return;    if (event == TULIP_MEDIAPOLL_TXPROBE_OK) {#if defined(TULIP_DEBUG)	sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++;#endif	tulip_linkup(sc, sc->tulip_probe_media);	return;    }    sia_status = TULIP_CSR_READ(sc, csr_sia_status);    TULIP_CSR_WRITE(sc, csr_sia_status, sia_status);    if ((sia_status & TULIP_SIASTS_LINKFAIL) == 0) {	if (sc->tulip_revinfo >= 0x20) {	    if (sia_status & (PHYSTS_10BASET_FD << (16 - 6)))		sc->tulip_probe_media = TULIP_MEDIA_10BASET_FD;	}	/*	 * If the link has passed LinkPass, 10baseT is the	 * proper media to use.	 */	tulip_linkup(sc, sc->tulip_probe_media);	return;    }    /*     * wait for up to 2.4 seconds for the link to reach pass state.     * Only then start scanning the other media for activity.     * choose media with receive activity over those without.     */    if (sc->tulip_probe_media == TULIP_MEDIA_10BASET) {	if (event != TULIP_MEDIAPOLL_TIMER)	    return;	if (sc->tulip_probe_timeout > 0		&& (sia_status & TULIP_SIASTS_OTHERRXACTIVITY) == 0) {	    tulip_timeout(sc);	    return;	}	sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;	sc->tulip_flags |= TULIP_WANTRXACT;	/* This seems a bit bogus... */	if (sia_status & TULIP_SIASTS_OTHERRXACTIVITY) {	    sc->tulip_probe_media = TULIP_MEDIA_BNC;	} else {	    sc->tulip_probe_media = TULIP_MEDIA_AUI;	}#if 0	/* and we want to debug this anyway... */	sc->tulip_probe_media = TULIP_MEDIA_BNC;	/* but not just yet... */	sc->tulip_probe_media = TULIP_MEDIA_AUI;#endif	tulip_media_set(sc, sc->tulip_probe_media);	tulip_timeout(sc);	return;    }    /*

⌨️ 快捷键说明

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