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

📄 if_de.c

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
{    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);	sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL;    }    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 (event == TULIP_MEDIAPOLL_LINKFAIL) {	if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE		|| !TULIP_DO_AUTOSENSE(sc))	    return;	sc->tulip_media = TULIP_MEDIA_UNKNOWN;	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;	sc->tulip_probe_media = TULIP_MEDIA_10BASET;	sc->tulip_probe_timeout = TULIP_21041_PROBE_10BASET_TIMEOUT;	tulip_media_set(sc, TULIP_MEDIA_10BASET);	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;/*XXXX*/	/* 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;	}/*XXXX*/	/* and we want to debug this anyway... *//*XXXX*/	sc->tulip_probe_media = TULIP_MEDIA_BNC;/*XXXX*/	/* but not just yet... *//*XXXX*/	sc->tulip_probe_media = TULIP_MEDIA_AUI;	tulip_media_set(sc, sc->tulip_probe_media);	tulip_timeout(sc);	return;    }    /*     * If we failed, clear the txprobe active flag.     */    if (event == TULIP_MEDIAPOLL_TXPROBE_FAILED)	sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;    if (event == TULIP_MEDIAPOLL_TIMER) {	/*	 * If we've received something, then that's our link!	 */	if (sc->tulip_flags & TULIP_RXACT) {	    tulip_linkup(sc, sc->tulip_probe_media);	    return;	}	/*	 * if no txprobe active  	 */	if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0		&& ((sc->tulip_flags & TULIP_WANTRXACT) == 0		    || (sia_status & TULIP_SIASTS_RXACTIVITY))) {	    sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;	    tulip_txprobe(sc);	    tulip_timeout(sc);	    return;	}	/*	 * Take 2 passes through before deciding to not	 * wait for receive activity.  Then take another	 * two passes before spitting out a warning.	 */	if (sc->tulip_probe_timeout <= 0) {	    if (sc->tulip_flags & TULIP_WANTRXACT) {		sc->tulip_flags &= ~TULIP_WANTRXACT;		sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;	    } else {		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;		}	    }	}    }        /*     * Since this media failed to probe, try the other one.     */    sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT;    if (sc->tulip_probe_media == TULIP_MEDIA_AUI) {	sc->tulip_probe_media = TULIP_MEDIA_BNC;    } else {	sc->tulip_probe_media = TULIP_MEDIA_AUI;    }    tulip_media_set(sc, sc->tulip_probe_media);    sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;    tulip_timeout(sc);}static const tulip_boardsw_t tulip_21041_boardsw = {    TULIP_21041_GENERIC,    tulip_21041_media_probe,    tulip_media_select,    tulip_21041_media_poll};static const tulip_phy_attr_t tulip_mii_phy_attrlist[] = {    { 0x20005c00, 0,		/* 08-00-17 */      {	{ 0x19, 0x0040, 0x0040 },	/* 10TX */	{ 0x19, 0x0040, 0x0000 },	/* 100TX */      },#if defined(TULIP_DEBUG)      "NS DP83840",#endif    },    { 0x0281F400, 0,		/* 00-A0-7D */      {	{ 0x12, 0x0010, 0x0000 },	/* 10T */	{ },				/* 100TX */	{ 0x12, 0x0010, 0x0010 },	/* 100T4 */	{ 0x12, 0x0008, 0x0008 },	/* FULL_DUPLEX */      },#if defined(TULIP_DEBUG)      "Seeq 80C240"#endif    },#if 0    { 0x0015F420, 0,	/* 00-A0-7D */      {	{ 0x12, 0x0010, 0x0000 },	/* 10T */	{ },				/* 100TX */	{ 0x12, 0x0010, 0x0010 },	/* 100T4 */	{ 0x12, 0x0008, 0x0008 },	/* FULL_DUPLEX */      },#if defined(TULIP_DEBUG)      "Broadcom BCM5000"#endif    },#endif    { 0x0281F400, 0,		/* 00-A0-BE */      {	{ 0x11, 0x8000, 0x0000 },	/* 10T */	{ 0x11, 0x8000, 0x8000 },	/* 100TX */	{ },				/* 100T4 */	{ 0x11, 0x4000, 0x4000 },	/* FULL_DUPLEX */      },#if defined(TULIP_DEBUG)      "ICS 1890"#endif     },    { 0x78100000, 0,		/* 00-A0-CC */      {	{ 0x14, 0x0800, 0x0000 },	/* 10TX */	{ 0x14, 0x0800, 0x0800 },	/* 100TX */	{ },				/* 100T4 */	{ 0x14, 0x1000, 0x1000 },	/* FULL_DUPLEX */      },#if defined(TULIP_DEBUG)      "LEVEL1 LXT970"#endif     },    { 0 }};static tulip_media_ttulip_mii_phy_readspecific(    tulip_softc_t * const sc){    const tulip_phy_attr_t *attr;    u_int16_t data;    u_int32_t id;    unsigned idx = 0;    static const tulip_media_t table[] = {	TULIP_MEDIA_UNKNOWN,	TULIP_MEDIA_10BASET,	TULIP_MEDIA_100BASETX,	TULIP_MEDIA_100BASET4,	TULIP_MEDIA_UNKNOWN,	TULIP_MEDIA_10BASET_FD,	TULIP_MEDIA_100BASETX_FD,	TULIP_MEDIA_UNKNOWN    };    /*     * Don't read phy specific registers if link is not up.     */    data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS);    if ((data & (PHYSTS_LINK_UP|PHYSTS_EXTENDED_REGS)) != (PHYSTS_LINK_UP|PHYSTS_EXTENDED_REGS))	return TULIP_MEDIA_UNKNOWN;    id = (tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_IDLOW) << 16) |	tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_IDHIGH);    for (attr = tulip_mii_phy_attrlist;; attr++) {	if (attr->attr_id == 0)	    return TULIP_MEDIA_UNKNOWN;	if ((id & ~0x0F) == attr->attr_id)	    break;    }    if (attr->attr_modes[PHY_MODE_100TX].pm_regno) {	const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_100TX];	data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);	if ((data & pm->pm_mask) == pm->pm_value)	    idx = 2;    }    if (idx == 0 && attr->attr_modes[PHY_MODE_100T4].pm_regno) {	const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_100T4];	data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);	if ((data & pm->pm_mask) == pm->pm_value)	    idx = 3;    }    if (idx == 0 && attr->attr_modes[PHY_MODE_10T].pm_regno) {	const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_10T];	data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);	if ((data & pm->pm_mask) == pm->pm_value)	    idx = 1;    }     if (idx != 0 && attr->attr_modes[PHY_MODE_FULLDUPLEX].pm_regno) {	const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_FULLDUPLEX];	data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno);	idx += ((data & pm->pm_mask) == pm->pm_value ? 4 : 0);    }    return table[idx];

⌨️ 快捷键说明

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