diff options
-rw-r--r-- | sys/dev/pci/if_de.c | 168 | ||||
-rw-r--r-- | sys/dev/pci/if_devar.h | 10 |
2 files changed, 111 insertions, 67 deletions
diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c index bff8d5d255a..f546bebcb45 100644 --- a/sys/dev/pci/if_de.c +++ b/sys/dev/pci/if_de.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_de.c,v 1.63 2005/01/15 05:24:11 brad Exp $ */ +/* $OpenBSD: if_de.c,v 1.64 2005/03/29 00:37:50 martin Exp $ */ /* $NetBSD: if_de.c,v 1.45 1997/06/09 00:34:18 thorpej Exp $ */ /*- @@ -268,8 +268,10 @@ tulip_txprobe( /* * Construct a LLC TEST message which will point to ourselves. */ - bcopy(sc->tulip_enaddr, mtod(m, struct ether_header *)->ether_dhost, 6); - bcopy(sc->tulip_enaddr, mtod(m, struct ether_header *)->ether_shost, 6); + bcopy(sc->tulip_enaddr, mtod(m, struct ether_header *)->ether_dhost, + ETHER_ADDR_LEN); + bcopy(sc->tulip_enaddr, mtod(m, struct ether_header *)->ether_shost, + ETHER_ADDR_LEN); mtod(m, struct ether_header *)->ether_type = htons(3); mtod(m, unsigned char *)[14] = 0; mtod(m, unsigned char *)[15] = 0; @@ -305,13 +307,36 @@ tulip_media_set( if (mi == NULL) return; - /* + /* Reset the SIA first + */ + if (mi->mi_type == TULIP_MEDIAINFO_SIA || (sc->tulip_features & TULIP_HAVE_SIANWAY)) { + TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET); + } + + /* Next, set full duplex if needed. + */ + if (sc->tulip_flags & TULIP_FULLDUPLEX) { +#ifdef TULIP_DEBUG + if (TULIP_CSR_READ(sc, csr_command) & (TULIP_CMD_RXRUN|TULIP_CMD_TXRUN)) { + printf(TULIP_PRINTF_FMT ": warning: board is running (FD).\n", + TULIP_PRINTF_ARGS); + } + if ((TULIP_CSR_READ(sc, csr_command) & TULIP_CMD_FULLDUPLEX) == 0) { + loudprintf(TULIP_PRINTF_FMT ": setting full duplex.\n", + TULIP_PRINTF_ARGS); + } +#endif + sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX; + TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode & ~(TULIP_CMD_RXRUN|TULIP_CMD_TXRUN)); + } + + /* Now setup the media. + * * If we are switching media, make sure we don't think there's * any stale RX activity */ sc->tulip_flags &= ~TULIP_RXACT; if (mi->mi_type == TULIP_MEDIAINFO_SIA) { - TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET); TULIP_CSR_WRITE(sc, csr_sia_tx_rx, mi->mi_sia_tx_rx); if (sc->tulip_features & TULIP_HAVE_SIAGP) { TULIP_CSR_WRITE(sc, csr_sia_general, mi->mi_sia_gp_control|mi->mi_sia_general|TULIP_SIAGEN_WATCHDOG); @@ -374,6 +399,14 @@ tulip_media_set( TULIP_CSR_WRITE(sc, csr_gp, sc->tulip_rombuf[mi->mi_gpr_offset + idx]); } } + + if (sc->tulip_features & TULIP_HAVE_SIANWAY) { + /* Set the SIA port into MII mode */ + TULIP_CSR_WRITE(sc, csr_sia_general, 1); + TULIP_CSR_WRITE(sc, csr_sia_tx_rx, 0); + TULIP_CSR_WRITE(sc, csr_sia_status, 0); + } + if (sc->tulip_flags & TULIP_TRYNWAY) { tulip_mii_autonegotiate(sc, sc->tulip_phyaddr); } else if ((sc->tulip_flags & TULIP_DIDNWAY) == 0) { @@ -418,9 +451,9 @@ tulip_linkup( sc->tulip_media = media; sc->tulip_flags |= TULIP_PRINTMEDIA; if (TULIP_IS_MEDIA_FD(sc->tulip_media)) { - sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX; + sc->tulip_flags |= TULIP_FULLDUPLEX; } else if (sc->tulip_chipid != TULIP_21041 || (sc->tulip_flags & TULIP_DIDNWAY) == 0) { - sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX; + sc->tulip_flags &= ~TULIP_FULLDUPLEX; } } /* @@ -558,7 +591,8 @@ tulip_media_link_monitor( /* * Read the PHY status register. */ - status = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS); + status = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_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 @@ -1270,6 +1304,17 @@ static const tulip_phy_attr_t tulip_mii_phy_attrlist[] = { "Seeq 80C240" #endif }, + { 0x0281F400, 3, /* 00-A0-7D */ + { + { 0x12, 0x0080, 0x0000 }, /* 10T */ + { 0x12, 0x0080, 0x0080 }, /* 100TX */ + { }, /* 100T4 */ + { 0x12, 0x0040, 0x0040 }, /* FULL_DUPLEX */ + }, +#if defined(TULIP_DEBUG) + "Seeq 80225" +#endif + }, #if 0 { 0x0015F420, 0, /* 00-A0-7D */ { @@ -1330,7 +1375,8 @@ tulip_mii_phy_readspecific( /* * Don't read phy specific registers if link is not up. */ - data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS); + data = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_STATUS) + | 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; @@ -1449,7 +1495,8 @@ tulip_mii_autonegotiate( sc->tulip_if.if_flags &= ~(IFF_UP|IFF_RUNNING); return; } - status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); + status = tulip_mii_readreg(sc, phyaddr, PHYREG_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", @@ -1468,8 +1515,9 @@ tulip_mii_autonegotiate( 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); + loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation restarted: 0x%04x (ad=0x%04x)\n", + TULIP_PRINTF_ARGS, phyaddr, data, + tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT)); sc->tulip_dbg.dbg_nway_starts++; #endif sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG; @@ -1477,7 +1525,8 @@ tulip_mii_autonegotiate( /* FALL THROUGH */ } case TULIP_PROBE_PHYAUTONEG: { - u_int32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); + u_int32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS) + | tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); u_int32_t data; if ((status & PHYSTS_AUTONEG_DONE) == 0) { if (sc->tulip_probe_timeout > 0) { @@ -1493,10 +1542,11 @@ tulip_mii_autonegotiate( sc->tulip_probe_state = TULIP_PROBE_MEDIATEST; return; } - data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES); + data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES) + | 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); + loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation complete: 0x%04x (sts=0x%04x)\n", + TULIP_PRINTF_ARGS, phyaddr, data, status); #endif data = (data << 6) & status; if (!tulip_mii_map_abilities(sc, data)) @@ -1529,8 +1579,9 @@ tulip_2114x_media_preset( else media = sc->tulip_probe_media; - sc->tulip_cmdmode &= ~TULIP_CMD_PORTSELECT; - sc->tulip_flags &= ~TULIP_SQETEST; + sc->tulip_cmdmode &= ~(TULIP_CMD_PORTSELECT|TULIP_CMD_NOHEARTBEAT + |TULIP_CMD_FULLDUPLEX|TULIP_CMD_TXTHRSHLDCTL); + sc->tulip_flags &= ~(TULIP_SQETEST|TULIP_FULLDUPLEX); if (media != TULIP_MEDIA_UNKNOWN && media != TULIP_MEDIA_MAX) { #if defined(TULIP_DEBUG) if (media < TULIP_MEDIA_MAX && sc->tulip_mediums[media] != NULL) { @@ -1556,7 +1607,6 @@ tulip_2114x_media_preset( 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; @@ -1564,22 +1614,31 @@ tulip_2114x_media_preset( } case TULIP_MEDIA_10BASET_FD: { sc->tulip_cmdmode |= TULIP_CMD_FULLDUPLEX|TULIP_CMD_TXTHRSHLDCTL; + sc->tulip_flags |= TULIP_FULLDUPLEX; + sc->tulip_cmdmode |= TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX; 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; + if (mi->mi_type == TULIP_MEDIAINFO_SYM + || mi->mi_type == TULIP_MEDIAINFO_MII) { + sc->tulip_cmdmode |= TULIP_CMD_NOHEARTBEAT; + } 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_flags |= TULIP_FULLDUPLEX; + sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT|TULIP_CMD_FULLDUPLEX; sc->tulip_if.if_baudrate = 100000000; + if (mi->mi_type == TULIP_MEDIAINFO_SYM + || mi->mi_type == TULIP_MEDIAINFO_MII) { + sc->tulip_cmdmode |= TULIP_CMD_NOHEARTBEAT; + } break; } default: { @@ -2412,7 +2471,8 @@ tulip_srom_decode( /* * Save the hardware address. */ - bcopy((caddr_t) shp->sh_ieee802_address, (caddr_t) sc->tulip_enaddr, 6); + bcopy((caddr_t) shp->sh_ieee802_address, (caddr_t) sc->tulip_enaddr, + ETHER_ADDR_LEN); /* * If this is a multiple port card, add the adapter index to the last * byte of the hardware address. (if it isn't multiport, adding 0 @@ -2888,7 +2948,7 @@ tulip_read_macaddr( if (sc->tulip_rombuf[0] == 0 && sc->tulip_rombuf[1] == 0 && sc->tulip_rombuf[2] == 0) return -4; - bcopy(sc->tulip_rombuf, sc->tulip_enaddr, 6); + bcopy(sc->tulip_rombuf, sc->tulip_enaddr, ETHER_ADDR_LEN); sc->tulip_features |= TULIP_HAVE_OKROM; goto check_oui; } else { @@ -2928,7 +2988,8 @@ tulip_read_macaddr( if (!tulip_srom_decode(sc)) return -5; } else { - bcopy(root_sc->tulip_enaddr, sc->tulip_enaddr, 6); + bcopy(root_sc->tulip_enaddr, sc->tulip_enaddr, + ETHER_ADDR_LEN); sc->tulip_enaddr[5] += sc->tulip_unit - root_sc->tulip_unit; } /* @@ -2962,7 +3023,7 @@ tulip_read_macaddr( if (bcmp(&sc->tulip_rombuf[0], tmpbuf, 8) != 0) return -2; - bcopy(sc->tulip_rombuf, sc->tulip_enaddr, 6); + bcopy(sc->tulip_rombuf, sc->tulip_enaddr, ETHER_ADDR_LEN); cksum = *(u_int16_t *) &sc->tulip_enaddr[0]; cksum *= 2; @@ -4507,7 +4568,7 @@ tulip_ifioctl( case SIOCGIFADDR: { bcopy((caddr_t) sc->tulip_enaddr, (caddr_t) ((struct sockaddr *)&ifr->ifr_data)->sa_data, - 6); + ETHER_ADDR_LEN); break; } @@ -5273,16 +5334,11 @@ tulip_pci_attach( tulip_softc_t * const sc = (tulip_softc_t *) self; struct pci_attach_args * const pa = (struct pci_attach_args *) aux; const int unit = sc->tulip_dev.dv_unit; - bus_space_tag_t iot, memt; - bus_space_handle_t ioh, memh; - int ioh_valid, memh_valid; #define PCI_CONF_WRITE(r, v) pci_conf_write(pa->pa_pc, pa->pa_tag, (r), (v)) #define PCI_CONF_READ(r) pci_conf_read(pa->pa_pc, pa->pa_tag, (r)) #define PCI_GETBUSDEVINFO(sc) do { \ - int busno, devno, funcno; \ - pci_decompose_tag(pa->pa_pc, pa->pa_tag, &busno, &devno, &funcno); \ - (sc)->tulip_pci_busno = busno; \ - (sc)->tulip_pci_devno = devno; \ + (sc)->tulip_pci_busno = parent; \ + (sc)->tulip_pci_devno = pa->pa_device; \ } while (0) #endif /* __NetBSD__ */ @@ -5453,35 +5509,27 @@ tulip_pci_attach( #if defined(__NetBSD__) || defined(__OpenBSD__) csr_base = 0; + { + bus_space_tag_t iot, memt; + bus_space_handle_t ioh, memh; + int ioh_valid, memh_valid; - ioh_valid = (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, + ioh_valid = (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, &iot, &ioh, NULL, NULL, 0) == 0); - memh_valid = (pci_mapreg_map(pa, PCI_CBMA, + memh_valid = (pci_mapreg_map(pa, PCI_CBMA, PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0, &memt, &memh, NULL, NULL, 0) == 0); -#endif -#if defined(__OpenBSD__) || defined(__NetBSD__) -#if defined(TULIP_IOMAPPED) - if (ioh_valid) { - sc->tulip_bustag = iot; - sc->tulip_bushandle = ioh; - } else if (memh_valid) { - sc->tulip_bustag = memt; - sc->tulip_bushandle = memh; - } -#else /* defined(TULIP_IOMAPPED) */ - if (memh_valid) { - sc->tulip_bustag = memt; - sc->tulip_bushandle = memh; - } else if (ioh_valid) { - sc->tulip_bustag = iot; - sc->tulip_bushandle = ioh; - } -#endif /* TULIP_IOMAPPED */ - else { - printf(": unable to map device registers\n"); - return; + if (memh_valid) { + sc->tulip_bustag = memt; + sc->tulip_bushandle = memh; + } else if (ioh_valid) { + sc->tulip_bustag = iot; + sc->tulip_bushandle = ioh; + } else { + printf(": unable to map device registers\n"); + return; + } } #endif /* __NetBSD__ */ @@ -5576,10 +5624,6 @@ tulip_pci_attach( s = TULIP_RAISESPL(); tulip_reset(sc); tulip_attach(sc); -#if defined(__alpha__) && defined(__NetBSD__) - if (media != TULIP_MEDIA_UNKNOWN) - tulip_linkup(sc, media); -#endif TULIP_RESTORESPL(s); } } diff --git a/sys/dev/pci/if_devar.h b/sys/dev/pci/if_devar.h index 57cbb8f6c49..a8eefff9d68 100644 --- a/sys/dev/pci/if_devar.h +++ b/sys/dev/pci/if_devar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_devar.h,v 1.15 2004/11/08 21:16:47 deraadt Exp $ */ +/* $OpenBSD: if_devar.h,v 1.16 2005/03/29 00:37:50 martin Exp $ */ /* $NetBSD: if_devar.h,v 1.13 1997/06/08 18:46:36 thorpej Exp $ */ /*- @@ -550,7 +550,7 @@ struct _tulip_softc_t { #define TULIP_INRESET 0x00000200 #define TULIP_NEEDRESET 0x00000400 #define TULIP_SQETEST 0x00000800 -#define TULIP_xxxxxx0 0x00001000 +#define TULIP_FULLDUPLEX 0x00001000 #define TULIP_xxxxxx1 0x00002000 #define TULIP_WANTTXSTART 0x00004000 #define TULIP_NEWTXTHRESH 0x00008000 @@ -697,10 +697,10 @@ struct _tulip_softc_t { u_int32_t tulip_setupdata[192/sizeof(u_int32_t)]; char tulip_boardid[16]; /* buffer for board ID */ u_int8_t tulip_rombuf[128]; -#if defined(__NetBSD__) - struct device *tulip_pci_busno; /* needed for multiport boards */ -#else +#ifndef __OpenBSD__ u_int8_t tulip_pci_busno; /* needed for multiport boards */ +#else + struct device *tulip_pci_busno; /* needed for multiport boards */ #endif u_int8_t tulip_pci_devno; /* needed for multiport boards */ u_int8_t tulip_connidx; |