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;
 

Reply via email to