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

📄 if_de.c

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
}static unsignedtulip_mii_get_phyaddr(    tulip_softc_t * const sc,    unsigned offset){    unsigned phyaddr;    for (phyaddr = 1; phyaddr < 32; phyaddr++) {	unsigned status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);	if (status == 0 || status == 0xFFFF || status < PHYSTS_10BASET)	    continue;	if (offset == 0)	    return phyaddr;	offset--;    }    if (offset == 0) {	unsigned status = tulip_mii_readreg(sc, 0, PHYREG_STATUS);	if (status == 0 || status == 0xFFFF || status < PHYSTS_10BASET)	    return TULIP_MII_NOPHY;	return 0;    }    return TULIP_MII_NOPHY;}static inttulip_mii_map_abilities(    tulip_softc_t * const sc,    unsigned abilities){    sc->tulip_abilities = abilities;    if (abilities & PHYSTS_100BASETX_FD) {	sc->tulip_probe_media = TULIP_MEDIA_100BASETX_FD;    } else if (abilities & PHYSTS_100BASET4) {	sc->tulip_probe_media = TULIP_MEDIA_100BASET4;    } else if (abilities & PHYSTS_100BASETX) {	sc->tulip_probe_media = TULIP_MEDIA_100BASETX;    } else if (abilities & PHYSTS_10BASET_FD) {	sc->tulip_probe_media = TULIP_MEDIA_10BASET_FD;    } else if (abilities & PHYSTS_10BASET) {	sc->tulip_probe_media = TULIP_MEDIA_10BASET;    } else {	sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;	return 0;    }    sc->tulip_probe_state = TULIP_PROBE_INACTIVE;    return 1;}static voidtulip_mii_autonegotiate(    tulip_softc_t * const sc,    const unsigned phyaddr){    switch (sc->tulip_probe_state) {        case TULIP_PROBE_MEDIATEST:        case TULIP_PROBE_INACTIVE: {	    sc->tulip_flags |= TULIP_DIDNWAY;	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_RESET);	    sc->tulip_probe_timeout = 3000;	    sc->tulip_intrmask |= TULIP_STS_ABNRMLINTR|TULIP_STS_NORMALINTR;	    sc->tulip_probe_state = TULIP_PROBE_PHYRESET;	    /* FALL THROUGH */	}        case TULIP_PROBE_PHYRESET: {	    u_int32_t status;	    u_int32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL);	    if (data & PHYCTL_RESET) {		if (sc->tulip_probe_timeout > 0) {		    tulip_timeout(sc);		    return;		}		printf(TULIP_PRINTF_FMT "(phy%d): error: reset of PHY never completed!\n",			   TULIP_PRINTF_ARGS, phyaddr);		sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE;		sc->tulip_probe_state = TULIP_PROBE_FAILED;		sc->tulip_if.if_flags &= ~(IFF_UP|IFF_RUNNING);		return;	    }	    data &= ~(PHYCTL_POWERDOWN | PHYCTL_ISOLATE);	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, data);	    status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);	    if ((status & PHYSTS_CAN_AUTONEG) == 0) {#if defined(TULIP_DEBUG)		loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation disabled\n",			   TULIP_PRINTF_ARGS, phyaddr);#endif		sc->tulip_flags &= ~TULIP_DIDNWAY;		sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;		return;	    }	    if (tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT) != ((status >> 6) | 0x01))		tulip_mii_writereg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT, (status >> 6) | 0x01);	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, data|PHYCTL_AUTONEG_RESTART|PHYCTL_AUTONEG_ENABLE);	    data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL);#if defined(TULIP_DEBUG)	    if ((data & PHYCTL_AUTONEG_ENABLE) == 0)		loudprintf(TULIP_PRINTF_FMT "(phy%d): oops: enable autonegotiation failed: 0x%04x\n",			   TULIP_PRINTF_ARGS, phyaddr, data);	    else		loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation restarted: 0x%04x\n",			   TULIP_PRINTF_ARGS, phyaddr, data);	    sc->tulip_dbg.dbg_nway_starts++;#endif	    sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG;	    sc->tulip_probe_timeout = 3000;	    /* FALL THROUGH */	}        case TULIP_PROBE_PHYAUTONEG: {	    u_int32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS);	    u_int32_t data;	    if ((status & PHYSTS_AUTONEG_DONE) == 0) {		if (sc->tulip_probe_timeout > 0) {		    tulip_timeout(sc);		    return;		}#if defined(TULIP_DEBUG)		loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation timeout: sts=0x%04x, ctl=0x%04x\n",			   TULIP_PRINTF_ARGS, phyaddr, status,			   tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL));#endif		sc->tulip_flags &= ~TULIP_DIDNWAY;		sc->tulip_probe_state = TULIP_PROBE_MEDIATEST;		return;	    }	    data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES);#if defined(TULIP_DEBUG)	    loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation complete: 0x%04x\n",		       TULIP_PRINTF_ARGS, phyaddr, data);#endif	    data = (data << 6) & status;	    if (!tulip_mii_map_abilities(sc, data))		sc->tulip_flags &= ~TULIP_DIDNWAY;	    return;	}	default: {#if defined(DIAGNOSTIC)	    printf("tulip_media_poll: botch at line %d\n", __LINE__);#endif	    break;	}    }#if defined(TULIP_DEBUG)    loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation failure: state = %d\n",	       TULIP_PRINTF_ARGS, phyaddr, sc->tulip_probe_state);	    sc->tulip_dbg.dbg_nway_failures++;#endif}static voidtulip_2114x_media_preset(    tulip_softc_t * const sc){    const tulip_media_info_t *mi = NULL;    tulip_media_t media = sc->tulip_media;    if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)	media = sc->tulip_media;    else	media = sc->tulip_probe_media;        sc->tulip_cmdmode &= ~TULIP_CMD_PORTSELECT;    sc->tulip_flags &= ~TULIP_SQETEST;    if (media != TULIP_MEDIA_UNKNOWN && media != TULIP_MEDIA_MAX) {#if defined(TULIP_DEBUG)	if (media < TULIP_MEDIA_MAX && sc->tulip_mediums[media] != NULL) {#endif	    mi = sc->tulip_mediums[media];	    if (mi->mi_type == TULIP_MEDIAINFO_MII) {		sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT;	    } else if (mi->mi_type == TULIP_MEDIAINFO_GPR		       || mi->mi_type == TULIP_MEDIAINFO_SYM) {		sc->tulip_cmdmode &= ~TULIP_GPR_CMDBITS;		sc->tulip_cmdmode |= mi->mi_cmdmode;	    } else if (mi->mi_type == TULIP_MEDIAINFO_SIA) {		TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET);	    }#if defined(TULIP_DEBUG)	} else {	    printf(TULIP_PRINTF_FMT ": preset: bad media %d!\n",		   TULIP_PRINTF_ARGS, media);	}#endif    }    switch (media) {	case TULIP_MEDIA_BNC:	case TULIP_MEDIA_AUI:	case TULIP_MEDIA_10BASET: {	    sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX;	    sc->tulip_cmdmode |= TULIP_CMD_TXTHRSHLDCTL;	    sc->tulip_if.if_baudrate = 10000000;	    sc->tulip_flags |= TULIP_SQETEST;	    break;	}	case TULIP_MEDIA_10BASET_FD: {	    sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX|TULIP_CMD_TXTHRSHLDCTL;	    sc->tulip_if.if_baudrate = 10000000;	    break;	}	case TULIP_MEDIA_100BASEFX:	case TULIP_MEDIA_100BASET4:	case TULIP_MEDIA_100BASETX: {	    sc->tulip_cmdmode &= ~(TULIP_CMD_FULLDUPLEX|TULIP_CMD_TXTHRSHLDCTL);	    sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT;	    sc->tulip_if.if_baudrate = 100000000;	    break;	}	case TULIP_MEDIA_100BASEFX_FD:	case TULIP_MEDIA_100BASETX_FD: {	    sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX|TULIP_CMD_PORTSELECT;	    sc->tulip_cmdmode &= ~TULIP_CMD_TXTHRSHLDCTL;	    sc->tulip_if.if_baudrate = 100000000;	    break;	}	default: {	    break;	}    }    TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode);}/* ******************************************************************** *  Start of 21140/21140A support which does not use the MII interface  */static voidtulip_null_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(DIAGNOSTIC)    printf(TULIP_PRINTF_FMT ": botch(media_poll) at line %d\n",	   TULIP_PRINTF_ARGS, __LINE__);#endif}__inline__ static voidtulip_21140_mediainit(    tulip_softc_t * const sc,    tulip_media_info_t * const mip,    tulip_media_t const media,    unsigned gpdata,    unsigned cmdmode){    sc->tulip_mediums[media] = mip;    mip->mi_type = TULIP_MEDIAINFO_GPR;    mip->mi_cmdmode = cmdmode;    mip->mi_gpdata = gpdata;}static voidtulip_21140_evalboard_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    sc->tulip_gpinit = TULIP_GP_EB_PINS;    sc->tulip_gpdata = TULIP_GP_EB_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);    DELAY(1000000);    if ((TULIP_CSR_READ(sc, csr_gp) & TULIP_GP_EB_OK100) != 0) {	sc->tulip_media = TULIP_MEDIA_10BASET;    } else {	sc->tulip_media = TULIP_MEDIA_100BASETX;    }    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_EB_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_EB_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_EB_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_EB_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);}static const tulip_boardsw_t tulip_21140_eb_boardsw = {    TULIP_21140_DEC_EB,    tulip_21140_evalboard_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_21140_accton_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    unsigned gpdata;    sc->tulip_gpinit = TULIP_GP_EB_PINS;    sc->tulip_gpdata = TULIP_GP_EB_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);    DELAY(1000000);    gpdata = TULIP_CSR_READ(sc, csr_gp);    if ((gpdata & TULIP_GP_EN1207_UTP_INIT) == 0) {	sc->tulip_media = TULIP_MEDIA_10BASET;    } else {	if ((gpdata & TULIP_GP_EN1207_BNC_INIT) == 0) {		sc->tulip_media = TULIP_MEDIA_BNC;        } else {		sc->tulip_media = TULIP_MEDIA_100BASETX;        }    }    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_BNC,			  TULIP_GP_EN1207_BNC_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_EN1207_UTP_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_EN1207_UTP_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_EN1207_100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_EN1207_100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);}static const tulip_boardsw_t tulip_21140_accton_boardsw = {    TULIP_21140_EN1207,    tulip_21140_accton_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_21140_smc9332_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    int idx, cnt = 0;    TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT|TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);    DELAY(10);	/* Wait 10 microseconds (actually 50 PCI cycles but at 		   33MHz that comes to two microseconds but wait a		   bit longer anyways) */    TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    sc->tulip_gpinit = TULIP_GP_SMC_9332_PINS;    sc->tulip_gpdata = TULIP_GP_SMC_9332_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_PINS|TULIP_GP_PINSET);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_INIT);    DELAY(200000);    for (idx = 1000; idx > 0; idx--) {	u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);	if ((csr & (TULIP_GP_SMC_9332_OK10|TULIP_GP_SMC_9332_OK100)) == (TULIP_GP_SMC_9332_OK10|TULIP_GP_SMC_9332_OK100)) {	    if (++cnt > 100)		break;	} else if ((csr & TULIP_GP_SMC_9332_OK10) == 0) {	    break;	} else {	    cnt = 0;	}	DELAY(1000);    }    sc->tulip_media = cnt > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);} static const tulip_boardsw_t tulip_21140_smc9332_boardsw = {    TULIP_21140_SMC_9332,    tulip_21140_smc9332_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_21140_cogent_em100_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    u_int32_t cmdmode = TULIP_CSR_READ(sc, csr_command);    sc->tulip_gpinit = TULIP_GP_EM100_PINS;    sc->tulip_gpdata = TULIP_GP_EM100_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_INIT);    cmdmode = TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION|TULIP_CMD_MUSTBEONE;    cmdmode &= ~(TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_SCRAMBLER);    if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100FX_ID) {	TULIP_CSR_WRITE(sc, csr_command, cmdmode);	sc->tulip_media = TULIP_MEDIA_100BASEFX;	tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX,			  TULIP_GP_EM100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION);	tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX_FD,

⌨️ 快捷键说明

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