Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci - Range-limit our DMA tag to 40-bit.



details:   https://anonhg.NetBSD.org/src/rev/ac3acdd5285e
branches:  trunk
changeset: 1007821:ac3acdd5285e
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Mar 01 15:43:58 2020 +0000

description:
- Range-limit our DMA tag to 40-bit.
- Eliminate __LP64__ ifdefs.

diffstat:

 sys/dev/pci/if_nfe.c    |  48 ++++++++++++++++++++++++------------------------
 sys/dev/pci/if_nfevar.h |   3 ++-
 2 files changed, 26 insertions(+), 25 deletions(-)

diffs (130 lines):

diff -r 4b81051271c8 -r ac3acdd5285e sys/dev/pci/if_nfe.c
--- a/sys/dev/pci/if_nfe.c      Sun Mar 01 15:22:55 2020 +0000
+++ b/sys/dev/pci/if_nfe.c      Sun Mar 01 15:43:58 2020 +0000
@@ -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 @@
 #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 @@
                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 @@
        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 @@
 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 @@
 
                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_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 @@
 
                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);
diff -r 4b81051271c8 -r ac3acdd5285e sys/dev/pci/if_nfevar.h
--- a/sys/dev/pci/if_nfevar.h   Sun Mar 01 15:22:55 2020 +0000
+++ b/sys/dev/pci/if_nfevar.h   Sun Mar 01 15:43:58 2020 +0000
@@ -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 @@
        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;
 



Home | Main Index | Thread Index | Old Index