Module Name:    src
Committed By:   thorpej
Date:           Sat Feb 29 18:49:53 UTC 2020

Modified Files:
        src/sys/dev/pci: if_ti.c if_tireg.h

Log Message:
- Change the definition and usage of TI_HOSTADDR() to allow for 64-bit
  DMA addresses.  Modeled after similar usage in the bge(4) driver (the
  chips supported by bge(4) are descendants of those supported by ti(4)).
- Use the 64-bit PCI DMA tag if available, otherwise we're allocating (and
  using) bounce buffers needlessly.


To generate a diff of this commit:
cvs rdiff -u -r1.114 -r1.115 src/sys/dev/pci/if_ti.c
cvs rdiff -u -r1.23 -r1.24 src/sys/dev/pci/if_tireg.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_ti.c
diff -u src/sys/dev/pci/if_ti.c:1.114 src/sys/dev/pci/if_ti.c:1.115
--- src/sys/dev/pci/if_ti.c:1.114	Sat Feb  1 06:38:58 2020
+++ src/sys/dev/pci/if_ti.c	Sat Feb 29 18:49:53 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ti.c,v 1.114 2020/02/01 06:38:58 thorpej Exp $ */
+/* $NetBSD: if_ti.c,v 1.115 2020/02/29 18:49:53 thorpej Exp $ */
 
 /*
  * Copyright (c) 1997, 1998, 1999
@@ -81,7 +81,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.114 2020/02/01 06:38:58 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.115 2020/02/29 18:49:53 thorpej Exp $");
 
 #include "opt_inet.h"
 
@@ -123,6 +123,16 @@ __KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.
 #include <dev/microcode/tigon/ti_fw.h>
 #include <dev/microcode/tigon/ti_fw2.h>
 
+#define	TI_HOSTADDR(x, y)						\
+	do {								\
+		(x).ti_addr_lo = (uint32_t)(y);				\
+		if (sizeof(bus_addr_t) == 8)				\
+			(x).ti_addr_hi =				\
+			    (uint32_t)(((uint64_t)(y) >> 32));		\
+		else							\
+			(x).ti_addr_hi = 0;				\
+	} while (/*CONSTCOND*/0)
+
 /*
  * Various supported device vendors/types and their names.
  */
@@ -740,7 +750,7 @@ ti_newbuf_std(struct ti_softc *sc, int i
 
 	sc->ti_cdata.ti_rx_std_chain[i] = m_new;
 	r = &sc->ti_rdata->ti_rx_std_ring[i];
-	TI_HOSTADDR(r->ti_addr) = dmamap->dm_segs[0].ds_addr;
+	TI_HOSTADDR(r->ti_addr, dmamap->dm_segs[0].ds_addr);
 	r->ti_type = TI_BDTYPE_RECV_BD;
 	r->ti_flags = 0;
 	if (sc->ethercom.ec_if.if_capenable & IFCAP_CSUM_IPv4_Rx)
@@ -807,7 +817,7 @@ ti_newbuf_mini(struct ti_softc *sc, int 
 
 	r = &sc->ti_rdata->ti_rx_mini_ring[i];
 	sc->ti_cdata.ti_rx_mini_chain[i] = m_new;
-	TI_HOSTADDR(r->ti_addr) = dmamap->dm_segs[0].ds_addr;
+	TI_HOSTADDR(r->ti_addr, dmamap->dm_segs[0].ds_addr);
 	r->ti_type = TI_BDTYPE_RECV_BD;
 	r->ti_flags = TI_BDFLAG_MINI_RING;
 	if (sc->ethercom.ec_if.if_capenable & IFCAP_CSUM_IPv4_Rx)
@@ -866,8 +876,8 @@ ti_newbuf_jumbo(struct ti_softc *sc, int
 	/* Set up the descriptor. */
 	r = &sc->ti_rdata->ti_rx_jumbo_ring[i];
 	sc->ti_cdata.ti_rx_jumbo_chain[i] = m_new;
-	TI_HOSTADDR(r->ti_addr) = sc->jumbo_dmaaddr +
-		(mtod(m_new, char *) - (char *)sc->ti_cdata.ti_jumbo_buf);
+	TI_HOSTADDR(r->ti_addr, sc->jumbo_dmaaddr +
+	    (mtod(m_new, char *) - (char *)sc->ti_cdata.ti_jumbo_buf));
 	r->ti_type = TI_BDTYPE_RECV_JUMBO_BD;
 	r->ti_flags = TI_BDFLAG_JUMBO_RING;
 	if (sc->ethercom.ec_if.if_capenable & IFCAP_CSUM_IPv4_Rx)
@@ -1414,10 +1424,10 @@ ti_gibinit(struct ti_softc *sc)
 	/* Set up the event ring and producer pointer. */
 	rcb = &sc->ti_rdata->ti_info.ti_ev_rcb;
 
-	TI_HOSTADDR(rcb->ti_hostaddr) = TI_CDEVENTADDR(sc, 0);
+	TI_HOSTADDR(rcb->ti_hostaddr, TI_CDEVENTADDR(sc, 0));
 	rcb->ti_flags = 0;
-	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_ev_prodidx_ptr) =
-	    TI_CDEVPRODADDR(sc);
+	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_ev_prodidx_ptr,
+	    TI_CDEVPRODADDR(sc));
 
 	sc->ti_ev_prodidx.ti_idx = 0;
 	CSR_WRITE_4(sc, TI_GCR_EVENTCONS_IDX, 0);
@@ -1426,7 +1436,7 @@ ti_gibinit(struct ti_softc *sc)
 	/* Set up the command ring and producer mailbox. */
 	rcb = &sc->ti_rdata->ti_info.ti_cmd_rcb;
 
-	TI_HOSTADDR(rcb->ti_hostaddr) = TI_GCR_NIC_ADDR(TI_GCR_CMDRING);
+	TI_HOSTADDR(rcb->ti_hostaddr, TI_GCR_NIC_ADDR(TI_GCR_CMDRING));
 	rcb->ti_flags = 0;
 	rcb->ti_max_len = 0;
 	for (i = 0; i < TI_CMD_RING_CNT; i++) {
@@ -1441,12 +1451,12 @@ ti_gibinit(struct ti_softc *sc)
 	 * We re-use the current stats buffer for this to
 	 * conserve memory.
 	 */
-	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_refresh_stats_ptr) =
-	    TI_CDSTATSADDR(sc);
+	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_refresh_stats_ptr,
+	    TI_CDSTATSADDR(sc));
 
 	/* Set up the standard receive ring. */
 	rcb = &sc->ti_rdata->ti_info.ti_std_rx_rcb;
-	TI_HOSTADDR(rcb->ti_hostaddr) = TI_CDRXSTDADDR(sc, 0);
+	TI_HOSTADDR(rcb->ti_hostaddr, TI_CDRXSTDADDR(sc, 0));
 	rcb->ti_max_len = ETHER_MAX_LEN;
 	rcb->ti_flags = 0;
 	if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
@@ -1458,7 +1468,7 @@ ti_gibinit(struct ti_softc *sc)
 
 	/* Set up the jumbo receive ring. */
 	rcb = &sc->ti_rdata->ti_info.ti_jumbo_rx_rcb;
-	TI_HOSTADDR(rcb->ti_hostaddr) = TI_CDRXJUMBOADDR(sc, 0);
+	TI_HOSTADDR(rcb->ti_hostaddr, TI_CDRXJUMBOADDR(sc, 0));
 	rcb->ti_max_len = ETHER_MAX_LEN_JUMBO;
 	rcb->ti_flags = 0;
 	if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
@@ -1474,7 +1484,7 @@ ti_gibinit(struct ti_softc *sc)
 	 * still there on the Tigon 1.
 	 */
 	rcb = &sc->ti_rdata->ti_info.ti_mini_rx_rcb;
-	TI_HOSTADDR(rcb->ti_hostaddr) = TI_CDRXMINIADDR(sc, 0);
+	TI_HOSTADDR(rcb->ti_hostaddr, TI_CDRXMINIADDR(sc, 0));
 	rcb->ti_max_len = MHLEN - ETHER_ALIGN;
 	if (sc->ti_hwrev == TI_HWREV_TIGON)
 		rcb->ti_flags = TI_RCB_FLAG_RING_DISABLED;
@@ -1491,11 +1501,11 @@ ti_gibinit(struct ti_softc *sc)
 	 * Set up the receive return ring.
 	 */
 	rcb = &sc->ti_rdata->ti_info.ti_return_rcb;
-	TI_HOSTADDR(rcb->ti_hostaddr) = TI_CDRXRTNADDR(sc, 0);
+	TI_HOSTADDR(rcb->ti_hostaddr, TI_CDRXRTNADDR(sc, 0));
 	rcb->ti_flags = 0;
 	rcb->ti_max_len = TI_RETURN_RING_CNT;
-	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_return_prodidx_ptr) =
-	    TI_CDRTNPRODADDR(sc);
+	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_return_prodidx_ptr,
+	    TI_CDRTNPRODADDR(sc));
 
 	/*
 	 * Set up the tx ring. Note: for the Tigon 2, we have the option
@@ -1532,11 +1542,11 @@ ti_gibinit(struct ti_softc *sc)
 		rcb->ti_flags |= TI_RCB_FLAG_VLAN_ASSIST;
 	rcb->ti_max_len = TI_TX_RING_CNT;
 	if (sc->ti_hwrev == TI_HWREV_TIGON)
-		TI_HOSTADDR(rcb->ti_hostaddr) = TI_TX_RING_BASE;
+		TI_HOSTADDR(rcb->ti_hostaddr, TI_TX_RING_BASE);
 	else
-		TI_HOSTADDR(rcb->ti_hostaddr) = TI_CDTXADDR(sc, 0);
-	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_tx_considx_ptr) =
-	    TI_CDTXCONSADDR(sc);
+		TI_HOSTADDR(rcb->ti_hostaddr, TI_CDTXADDR(sc, 0));
+	TI_HOSTADDR(sc->ti_rdata->ti_info.ti_tx_considx_ptr,
+	    TI_CDTXCONSADDR(sc));
 
 	/*
 	 * We're done frobbing the General Information Block.  Sync
@@ -1728,7 +1738,10 @@ ti_attach(device_t parent, device_t self
 	 */
 	aprint_normal_dev(self, "Ethernet address %s\n", ether_sprintf(eaddr));
 
-	sc->sc_dmat = pa->pa_dmat;
+	if (pci_dma64_available(pa))
+		sc->sc_dmat = pa->pa_dmat64;
+	else
+		sc->sc_dmat = pa->pa_dmat;
 
 	/* Allocate the general information block and ring buffers. */
 	if ((error = bus_dmamem_alloc(sc->sc_dmat,
@@ -2260,7 +2273,7 @@ ti_encap_tigon1(struct ti_softc *sc, str
 		f = &sc->ti_tx_ring_nic[frag % 128];
 		if (sc->ti_cdata.ti_tx_chain[frag] != NULL)
 			break;
-		TI_HOSTADDR(f->ti_addr) = dmamap->dm_segs[i].ds_addr;
+		TI_HOSTADDR(f->ti_addr, dmamap->dm_segs[i].ds_addr);
 		f->ti_len = dmamap->dm_segs[i].ds_len;
 		f->ti_flags = csum_flags;
 		if (vlan_has_tag(m_head)) {
@@ -2351,7 +2364,7 @@ ti_encap_tigon2(struct ti_softc *sc, str
 		f = &sc->ti_rdata->ti_tx_ring[frag];
 		if (sc->ti_cdata.ti_tx_chain[frag] != NULL)
 			break;
-		TI_HOSTADDR(f->ti_addr) = dmamap->dm_segs[i].ds_addr;
+		TI_HOSTADDR(f->ti_addr, dmamap->dm_segs[i].ds_addr);
 		f->ti_len = dmamap->dm_segs[i].ds_len;
 		f->ti_flags = csum_flags;
 		if (vlan_has_tag(m_head)) {

Index: src/sys/dev/pci/if_tireg.h
diff -u src/sys/dev/pci/if_tireg.h:1.23 src/sys/dev/pci/if_tireg.h:1.24
--- src/sys/dev/pci/if_tireg.h:1.23	Sat Feb  1 06:38:58 2020
+++ src/sys/dev/pci/if_tireg.h	Sat Feb 29 18:49:53 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_tireg.h,v 1.23 2020/02/01 06:38:58 thorpej Exp $ */
+/* $NetBSD: if_tireg.h,v 1.24 2020/02/29 18:49:53 thorpej Exp $ */
 
 /*
  * Copyright (c) 1997, 1998, 1999
@@ -270,7 +270,7 @@
 #define TI_GCR_RXRETURNCONS_IDX		0x680
 #define TI_GCR_CMDRING			0x700
 
-#define TI_GCR_NIC_ADDR(x)		(x - TI_GCR_BASE);
+#define TI_GCR_NIC_ADDR(x)		(x - TI_GCR_BASE)
 
 /*
  * Local memory window. The local memory window is a 2K shared
@@ -373,21 +373,15 @@
  */
 #define TI_MEM_MAX		0x7FFFFF
 
-/*
- * Even on the alpha, pci addresses are 32-bit quantities
- */
-
 #ifdef __64_bit_pci_addressing__
 typedef struct {
 	u_int64_t		ti_addr;
 } ti_hostaddr;
-#define TI_HOSTADDR(x)	x.ti_addr
 #else
 typedef struct {
 	u_int32_t		ti_addr_hi;
 	u_int32_t		ti_addr_lo;
 } ti_hostaddr;
-#define TI_HOSTADDR(x)	x.ti_addr_lo
 #endif
 
 /*

Reply via email to