From b67bf73e7ff6a5b44a62733c720ed138634d48af Mon Sep 17 00:00:00 2001 From: brad Date: Tue, 31 Dec 2013 21:09:34 +0000 Subject: [PATCH] tedu the diagnostic code to detect the presence of the defective Xterasys XN-152 32-bit PCI NIC in a 64-bit PCI slot. The code has never been enabled, never will be and is unused / unmaintained. Update the man page to not indicate there is a possibility of the driver detecting this hardware issue. Input about the man page and Ok chris@ --- share/man/man4/re.4 | 7 +- sys/dev/ic/re.c | 207 +------------------------------------------- 2 files changed, 4 insertions(+), 210 deletions(-) diff --git a/share/man/man4/re.4 b/share/man/man4/re.4 index 42eaa6d67c9..beabca7642b 100644 --- a/share/man/man4/re.4 +++ b/share/man/man4/re.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: re.4,v 1.50 2013/07/16 16:05:49 schwarze Exp $ +.\" $OpenBSD: re.4,v 1.51 2013/12/31 21:09:34 brad Exp $ .\" Copyright (c) 2003 .\" Bill Paul . All rights reserved. .\" @@ -31,7 +31,7 @@ .\" .\" $FreeBSD: /repoman/r/ncvs/src/share/man/man4/re.4,v 1.4 2004/03/04 06:42:46 sanpei Exp $ .\" -.Dd $Mdocdate: July 16 2013 $ +.Dd $Mdocdate: December 31 2013 $ .Dt RE 4 .Os .Sh NAME @@ -221,8 +221,7 @@ The result is that the 8169 chip is tricked into performing 64-bit DMA transfers even though a 64-bit data path between the NIC and the bus does not actually exist. .Pp -Unfortunately, it is not possible to correct this problem in software, -however it is possible to detect it. +Unfortunately, it is not possible to correct this problem in software. The user should ensure the NIC is installed in a 32-bit PCI slot to avoid this problem. .Pp diff --git a/sys/dev/ic/re.c b/sys/dev/ic/re.c index 47552d3e7f9..4330d96c865 100644 --- a/sys/dev/ic/re.c +++ b/sys/dev/ic/re.c @@ -1,4 +1,4 @@ -/* $OpenBSD: re.c,v 1.146 2013/10/25 22:48:10 brad Exp $ */ +/* $OpenBSD: re.c,v 1.147 2013/12/31 21:09:34 brad Exp $ */ /* $FreeBSD: if_re.c,v 1.31 2004/09/04 07:54:05 ru Exp $ */ /* * Copyright (c) 1997, 1998-2003 @@ -197,10 +197,6 @@ void re_setup_intr(struct rl_softc *, int, int); int re_wol(struct ifnet*, int); #endif -#ifdef RE_DIAG -int re_diag(struct rl_softc *); -#endif - struct cfdriver re_cd = { 0, "re", DV_IFNET }; @@ -615,190 +611,6 @@ re_reset(struct rl_softc *sc) CSR_WRITE_1(sc, RL_LDPS, 1); } -#ifdef RE_DIAG - -/* - * The following routine is designed to test for a defect on some - * 32-bit 8169 cards. Some of these NICs have the REQ64# and ACK64# - * lines connected to the bus, however for a 32-bit only card, they - * should be pulled high. The result of this defect is that the - * NIC will not work right if you plug it into a 64-bit slot: DMA - * operations will be done with 64-bit transfers, which will fail - * because the 64-bit data lines aren't connected. - * - * There's no way to work around this (short of talking a soldering - * iron to the board), however we can detect it. The method we use - * here is to put the NIC into digital loopback mode, set the receiver - * to promiscuous mode, and then try to send a frame. We then compare - * the frame data we sent to what was received. If the data matches, - * then the NIC is working correctly, otherwise we know the user has - * a defective NIC which has been mistakenly plugged into a 64-bit PCI - * slot. In the latter case, there's no way the NIC can work correctly, - * so we print out a message on the console and abort the device attach. - */ - -int -re_diag(struct rl_softc *sc) -{ - struct ifnet *ifp = &sc->sc_arpcom.ac_if; - struct mbuf *m0; - struct ether_header *eh; - struct rl_rxsoft *rxs; - struct rl_desc *cur_rx; - bus_dmamap_t dmamap; - u_int16_t status; - u_int32_t rxstat; - int total_len, i, s, error = 0, phyaddr; - u_int8_t dst[] = { 0x00, 'h', 'e', 'l', 'l', 'o' }; - u_int8_t src[] = { 0x00, 'w', 'o', 'r', 'l', 'd' }; - - DPRINTF(("inside re_diag\n")); - /* Allocate a single mbuf */ - - MGETHDR(m0, M_DONTWAIT, MT_DATA); - if (m0 == NULL) - return (ENOBUFS); - - /* - * Initialize the NIC in test mode. This sets the chip up - * so that it can send and receive frames, but performs the - * following special functions: - * - Puts receiver in promiscuous mode - * - Enables digital loopback mode - * - Leaves interrupts turned off - */ - - ifp->if_flags |= IFF_PROMISC; - sc->rl_testmode = 1; - re_reset(sc); - re_init(ifp); - sc->rl_flags |= RL_FLAG_LINK; - if (sc->sc_hwrev == RL_HWREV_8139CPLUS) - phyaddr = 0; - else - phyaddr = 1; - - re_miibus_writereg((struct device *)sc, phyaddr, MII_BMCR, - BMCR_RESET); - for (i = 0; i < RL_TIMEOUT; i++) { - status = re_miibus_readreg((struct device *)sc, - phyaddr, MII_BMCR); - if (!(status & BMCR_RESET)) - break; - } - - re_miibus_writereg((struct device *)sc, phyaddr, MII_BMCR, - BMCR_LOOP); - CSR_WRITE_2(sc, RL_ISR, RL_INTRS); - - DELAY(100000); - - /* Put some data in the mbuf */ - - eh = mtod(m0, struct ether_header *); - bcopy ((char *)&dst, eh->ether_dhost, ETHER_ADDR_LEN); - bcopy ((char *)&src, eh->ether_shost, ETHER_ADDR_LEN); - eh->ether_type = htons(ETHERTYPE_IP); - m0->m_pkthdr.len = m0->m_len = ETHER_MIN_LEN - ETHER_CRC_LEN; - - /* - * Queue the packet, start transmission. - */ - - CSR_WRITE_2(sc, RL_ISR, 0xFFFF); - s = splnet(); - IFQ_ENQUEUE(&ifp->if_snd, m0, NULL, error); - re_start(ifp); - splx(s); - m0 = NULL; - - DPRINTF(("re_diag: transmission started\n")); - - /* Wait for it to propagate through the chip */ - - DELAY(100000); - for (i = 0; i < RL_TIMEOUT; i++) { - status = CSR_READ_2(sc, RL_ISR); - CSR_WRITE_2(sc, RL_ISR, status); - if ((status & (RL_ISR_TIMEOUT_EXPIRED|RL_ISR_RX_OK)) == - (RL_ISR_TIMEOUT_EXPIRED|RL_ISR_RX_OK)) - break; - DELAY(10); - } - if (i == RL_TIMEOUT) { - printf("%s: diagnostic failed, failed to receive packet " - "in loopback mode\n", sc->sc_dev.dv_xname); - error = EIO; - goto done; - } - - /* - * The packet should have been dumped into the first - * entry in the RX DMA ring. Grab it from there. - */ - - rxs = &sc->rl_ldata.rl_rxsoft[0]; - dmamap = rxs->rxs_dmamap; - bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->sc_dmat, dmamap); - - m0 = rxs->rxs_mbuf; - rxs->rxs_mbuf = NULL; - eh = mtod(m0, struct ether_header *); - - RL_RXDESCSYNC(sc, 0, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - cur_rx = &sc->rl_ldata.rl_rx_list[0]; - rxstat = letoh32(cur_rx->rl_cmdstat); - total_len = rxstat & sc->rl_rxlenmask; - - if (total_len != ETHER_MIN_LEN) { - printf("%s: diagnostic failed, received short packet\n", - sc->sc_dev.dv_xname); - error = EIO; - goto done; - } - - DPRINTF(("re_diag: packet received\n")); - - /* Test that the received packet data matches what we sent. */ - - if (bcmp((char *)&eh->ether_dhost, (char *)&dst, ETHER_ADDR_LEN) || - bcmp((char *)&eh->ether_shost, (char *)&src, ETHER_ADDR_LEN) || - ntohs(eh->ether_type) != ETHERTYPE_IP) { - printf("%s: WARNING, DMA FAILURE!\n", sc->sc_dev.dv_xname); - printf("%s: expected TX data: %s", - sc->sc_dev.dv_xname, ether_sprintf(dst)); - printf("/%s/0x%x\n", ether_sprintf(src), ETHERTYPE_IP); - printf("%s: received RX data: %s", - sc->sc_dev.dv_xname, - ether_sprintf(eh->ether_dhost)); - printf("/%s/0x%x\n", ether_sprintf(eh->ether_shost), - ntohs(eh->ether_type)); - printf("%s: You may have a defective 32-bit NIC plugged " - "into a 64-bit PCI slot.\n", sc->sc_dev.dv_xname); - printf("%s: Please re-install the NIC in a 32-bit slot " - "for proper operation.\n", sc->sc_dev.dv_xname); - printf("%s: Read the re(4) man page for more details.\n", - sc->sc_dev.dv_xname); - error = EIO; - } - -done: - /* Turn interface off, release resources */ - sc->rl_testmode = 0; - sc->rl_flags &= ~RL_FLAG_LINK; - ifp->if_flags &= ~IFF_PROMISC; - re_stop(ifp); - if (m0 != NULL) - m_freem(m0); - DPRINTF(("leaving re_diag\n")); - - return (error); -} - -#endif - #ifdef __armish__ /* * Thecus N2100 doesn't store the full mac address in eeprom @@ -1217,23 +1029,6 @@ re_attach(struct rl_softc *sc, const char *intrstr) if_attach(ifp); ether_ifattach(ifp); -#ifdef RE_DIAG - /* - * Perform hardware diagnostic on the original RTL8169. - * Some 32-bit cards were incorrectly wired and would - * malfunction if plugged into a 64-bit slot. - */ - if (sc->sc_hwrev == RL_HWREV_8169) { - error = re_diag(sc); - if (error) { - printf("%s: attach aborted due to hardware diag failure\n", - sc->sc_dev.dv_xname); - ether_ifdetach(ifp); - goto fail_8; - } - } -#endif - return (0); fail_8: -- 2.20.1