Module Name: src Committed By: thorpej Date: Sun Mar 1 15:43:59 UTC 2020
Modified Files: src/sys/dev/pci: if_nfe.c if_nfevar.h Log Message: - Range-limit our DMA tag to 40-bit. - Eliminate __LP64__ ifdefs. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/dev/pci/if_nfe.c cvs rdiff -u -r1.11 -r1.12 src/sys/dev/pci/if_nfevar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_nfe.c diff -u src/sys/dev/pci/if_nfe.c:1.74 src/sys/dev/pci/if_nfe.c:1.75 --- src/sys/dev/pci/if_nfe.c:1.74 Tue Feb 4 05:44:14 2020 +++ src/sys/dev/pci/if_nfe.c Sun Mar 1 15:43:58 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_nfe.c,v 1.74 2020/02/04 05:44:14 thorpej Exp $ */ +/* $NetBSD: if_nfe.c,v 1.75 2020/03/01 15:43:58 thorpej Exp $ */ /* $OpenBSD: if_nfe.c,v 1.77 2008/02/05 16:52:50 brad Exp $ */ /*- @@ -21,7 +21,7 @@ /* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.74 2020/02/04 05:44:14 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.75 2020/03/01 15:43:58 thorpej Exp $"); #include "opt_inet.h" #include "vlan.h" @@ -145,10 +145,6 @@ int nfedebug = 0; #define PCI_PRODUCT_NVIDIA_MCP51_LAN2 \ PCI_PRODUCT_NVIDIA_NFORCE430_LAN2 -#ifdef _LP64 -#define __LP64__ 1 -#endif - const struct nfe_product { pci_vendor_id_t vendor; pci_product_id_t product; @@ -325,9 +321,18 @@ nfe_attach(device_t parent, device_t sel break; } - if (pci_dma64_available(pa) && (sc->sc_flags & NFE_40BIT_ADDR) != 0) - sc->sc_dmat = pa->pa_dmat64; - else + if (pci_dma64_available(pa) && (sc->sc_flags & NFE_40BIT_ADDR) != 0) { + if (bus_dmatag_subregion(pa->pa_dmat64, + 0, + (1ULL << 40), + &sc->sc_dmat, + BUS_DMA_WAITOK) != 0) { + aprint_error_dev(self, + "unable to create 40-bit DMA tag\n"); + sc->sc_dmat = pa->pa_dmat64; + } else + sc->sc_dmat_needs_free = true; + } else sc->sc_dmat = pa->pa_dmat; nfe_poweron(self); @@ -458,6 +463,9 @@ nfe_detach(device_t self, int flags) mutex_destroy(&sc->rxq.mtx); nfe_free_tx_ring(sc, &sc->txq); + if (sc->sc_dmat_needs_free) + bus_dmatag_destroy(sc->sc_dmat); + if (sc->sc_ih != NULL) { pci_intr_disestablish(sc->sc_pc, sc->sc_ih); sc->sc_ih = NULL; @@ -958,9 +966,8 @@ mbufcopied: skip1: /* update mapping address in h/w descriptor */ if (sc->sc_flags & NFE_40BIT_ADDR) { -#if defined(__LP64__) - desc64->physaddr[0] = htole32(physaddr >> 32); -#endif + desc64->physaddr[0] = + htole32(((uint64_t)physaddr) >> 32); desc64->physaddr[1] = htole32(physaddr & 0xffffffff); } else { desc32->physaddr = htole32(physaddr); @@ -1123,10 +1130,8 @@ nfe_encap(struct nfe_softc *sc, struct m if (sc->sc_flags & NFE_40BIT_ADDR) { desc64 = &sc->txq.desc64[sc->txq.cur]; -#if defined(__LP64__) desc64->physaddr[0] = - htole32(map->dm_segs[i].ds_addr >> 32); -#endif + htole32(((uint64_t)map->dm_segs[i].ds_addr) >> 32); desc64->physaddr[1] = htole32(map->dm_segs[i].ds_addr & 0xffffffff); desc64->length = htole16(map->dm_segs[i].ds_len - 1); @@ -1291,13 +1296,9 @@ nfe_init(struct ifnet *ifp) nfe_set_macaddr(sc, sc->sc_enaddr); /* tell MAC where rings are in memory */ -#ifdef __LP64__ - NFE_WRITE(sc, NFE_RX_RING_ADDR_HI, sc->rxq.physaddr >> 32); -#endif + NFE_WRITE(sc, NFE_RX_RING_ADDR_HI, ((uint64_t)sc->rxq.physaddr) >> 32); NFE_WRITE(sc, NFE_RX_RING_ADDR_LO, sc->rxq.physaddr & 0xffffffff); -#ifdef __LP64__ - NFE_WRITE(sc, NFE_TX_RING_ADDR_HI, sc->txq.physaddr >> 32); -#endif + NFE_WRITE(sc, NFE_TX_RING_ADDR_HI, ((uint64_t)sc->txq.physaddr) >> 32); NFE_WRITE(sc, NFE_TX_RING_ADDR_LO, sc->txq.physaddr & 0xffffffff); NFE_WRITE(sc, NFE_RING_SIZE, @@ -1516,9 +1517,8 @@ nfe_alloc_rx_ring(struct nfe_softc *sc, if (sc->sc_flags & NFE_40BIT_ADDR) { desc64 = &sc->rxq.desc64[i]; -#if defined(__LP64__) - desc64->physaddr[0] = htole32(physaddr >> 32); -#endif + desc64->physaddr[0] = + htole32(((uint64_t)physaddr) >> 32); desc64->physaddr[1] = htole32(physaddr & 0xffffffff); desc64->length = htole16(sc->rxq.bufsz); desc64->flags = htole16(NFE_RX_READY); Index: src/sys/dev/pci/if_nfevar.h diff -u src/sys/dev/pci/if_nfevar.h:1.11 src/sys/dev/pci/if_nfevar.h:1.12 --- src/sys/dev/pci/if_nfevar.h:1.11 Fri Sep 13 07:55:07 2019 +++ src/sys/dev/pci/if_nfevar.h Sun Mar 1 15:43:58 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_nfevar.h,v 1.11 2019/09/13 07:55:07 msaitoh Exp $ */ +/* $NetBSD: if_nfevar.h,v 1.12 2020/03/01 15:43:58 thorpej Exp $ */ /* $OpenBSD: if_nfevar.h,v 1.13 2007/12/05 08:30:33 jsg Exp $ */ /*- @@ -77,6 +77,7 @@ struct nfe_softc { bus_size_t sc_mems; void *sc_ih; bus_dma_tag_t sc_dmat; + bool sc_dmat_needs_free; struct mii_data sc_mii; struct callout sc_tick_ch;