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

📄 if_de.c

📁 很好的一个嵌入式linux平台下的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
     * 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     },    { 0x15F420, 0,		/* 00-05-7D */      {	{ 0x11, 0x8000, 0x0000 },	/* 10T */	{ 0x11, 0x8000, 0x8000 },	/* 100TX */	{ },				/* 100T4 */	{ 0x11, 0x4000, 0x4000 },	/* FULL_DUPLEX */      },#if defined(TULIP_DEBUG)      "ICS 1890"#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];}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;    }#if defined(TULIP_MEGADEBUG)    printf ("tulip_mii_map_abilities: probe inactive\n");#endif    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;#if defined(NEC5074)	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, 			       PHYCTL_RESET | PHYCTL_ISOLATE);#else	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_RESET);#endif#if defined(NEC5074) && defined(TULIP_DEBUG)	    loudprintf(TULIP_PRINTF_FMT "(phy%d): reset: ctl=0x%04x stat=0x%04x\n",		       TULIP_PRINTF_ARGS, 		       phyaddr,		       tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL),		       tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS));#endif	    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 defined(NEC5074) && defined(TULIP_DEBUG)	    loudprintf(TULIP_PRINTF_FMT "(phy%d): endrst: ctl=0x%04x stat=0x%04x\n",		       TULIP_PRINTF_ARGS, 		       phyaddr,		       data,		       tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS));#endif	    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);#if 0	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, data|PHYCTL_AUTONEG_RESTART|PHYCTL_AUTONEG_ENABLE);#else	    tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_AUTONEG_RESTART|PHYCTL_AUTONEG_ENABLE);#endif	    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 started: 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 defined(NEC5074) && defined(TULIP_DEBUG)	    loudprintf(TULIP_PRINTF_FMT "(phy%d): autoneg stat=0x%04x qpoll=0x%04x\n",		       TULIP_PRINTF_ARGS, 		       phyaddr, status,		       tulip_mii_readreg(sc, phyaddr, 0x11));#endif	    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);}

⌨️ 快捷键说明

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