Module Name:    src
Committed By:   jakllsch
Date:           Wed Apr 29 20:03:52 UTC 2020

Modified Files:
        src/sys/dev/pci: if_msk.c if_mskvar.h

Log Message:
msk(4): Simply keep a ring of (tx) dmamaps, rather than a linked list


To generate a diff of this commit:
cvs rdiff -u -r1.104 -r1.105 src/sys/dev/pci/if_msk.c
cvs rdiff -u -r1.24 -r1.25 src/sys/dev/pci/if_mskvar.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_msk.c
diff -u src/sys/dev/pci/if_msk.c:1.104 src/sys/dev/pci/if_msk.c:1.105
--- src/sys/dev/pci/if_msk.c:1.104	Wed Apr 29 18:52:03 2020
+++ src/sys/dev/pci/if_msk.c	Wed Apr 29 20:03:52 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_msk.c,v 1.104 2020/04/29 18:52:03 jakllsch Exp $ */
+/* $NetBSD: if_msk.c,v 1.105 2020/04/29 20:03:52 jakllsch Exp $ */
 /*	$OpenBSD: if_msk.c,v 1.79 2009/10/15 17:54:56 deraadt Exp $	*/
 
 /*
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.104 2020/04/29 18:52:03 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.105 2020/04/29 20:03:52 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1099,7 +1099,6 @@ msk_attach(device_t parent, device_t sel
 	struct sk_softc *sc = device_private(parent);
 	struct skc_attach_args *sa = aux;
 	bus_dmamap_t dmamap;
-	struct sk_txmap_entry *entry;
 	struct ifnet *ifp;
 	struct mii_data * const mii = &sc_if->sk_mii;
 	void *kva;
@@ -1177,7 +1176,6 @@ msk_attach(device_t parent, device_t sel
 		goto fail_3;
 	}
 
-	SIMPLEQ_INIT(&sc_if->sk_txmap_head);
 	for (i = 0; i < MSK_TX_RING_CNT; i++) {
 		sc_if->sk_cdata.sk_tx_chain[i].sk_mbuf = NULL;
 
@@ -1188,9 +1186,7 @@ msk_attach(device_t parent, device_t sel
 			goto fail_3;
 		}
 
-		entry = malloc(sizeof(*entry), M_DEVBUF, M_WAITOK);
-		entry->dmamap = dmamap;
-		SIMPLEQ_INSERT_HEAD(&sc_if->sk_txmap_head, entry, link);
+		sc_if->sk_cdata.sk_tx_chain[i].sk_dmamap = dmamap;
 	}
 
 	sc_if->sk_rdata = (struct msk_ring_data *)kva;
@@ -1294,18 +1290,17 @@ msk_detach(device_t self, int flags)
 {
 	struct sk_if_softc *sc_if = device_private(self);
 	struct sk_softc *sc = sc_if->sk_softc;
-	struct sk_txmap_entry *entry;
 	struct ifnet *ifp = &sc_if->sk_ethercom.ec_if;
+	int i;
 
 	if (sc->sk_if[sc_if->sk_port] == NULL)
 		return 0;
 
 	msk_stop(ifp, 1);
 
-	while ((entry = SIMPLEQ_FIRST(&sc_if->sk_txmap_head))) {
-		SIMPLEQ_REMOVE_HEAD(&sc_if->sk_txmap_head, link);
-		bus_dmamap_destroy(sc->sc_dmatag, entry->dmamap);
-		free(entry, M_DEVBUF);
+	for (i = 0; i < MSK_TX_RING_CNT; i++) {
+		bus_dmamap_destroy(sc->sc_dmatag,
+		    sc_if->sk_cdata.sk_tx_chain[i].sk_dmamap);
 	}
 
 	if (--sc->rnd_attached == 0)
@@ -1786,18 +1781,12 @@ msk_encap(struct sk_if_softc *sc_if, str
 	uint32_t		frag, cur, hiaddr, old_hiaddr, total;
 	uint32_t		entries = 0;
 	size_t			i;
-	struct sk_txmap_entry	*entry;
 	bus_dmamap_t		txmap;
 	bus_addr_t		addr;
 
 	DPRINTFN(2, ("msk_encap\n"));
 
-	entry = SIMPLEQ_FIRST(&sc_if->sk_txmap_head);
-	if (entry == NULL) {
-		DPRINTFN(2, ("msk_encap: no txmap available\n"));
-		return ENOBUFS;
-	}
-	txmap = entry->dmamap;
+	txmap = sc_if->sk_cdata.sk_tx_chain[*txidx].sk_dmamap;
 
 	cur = frag = *txidx;
 
@@ -1880,10 +1869,11 @@ msk_encap(struct sk_if_softc *sc_if, str
 	}
 	KASSERTMSG(entries == total, "entries %u total %u", entries, total);
 
+	sc_if->sk_cdata.sk_tx_chain[*txidx].sk_dmamap =
+		sc_if->sk_cdata.sk_tx_chain[cur].sk_dmamap;
 	sc_if->sk_cdata.sk_tx_chain[cur].sk_mbuf = m_head;
-	SIMPLEQ_REMOVE_HEAD(&sc_if->sk_txmap_head, link);
+	sc_if->sk_cdata.sk_tx_chain[cur].sk_dmamap = txmap;
 
-	sc_if->sk_cdata.sk_tx_map[cur] = entry;
 	sc_if->sk_rdata->sk_tx_ring[cur].sk_ctl |= SK_Y2_TXCTL_LASTFRAG;
 
 	/* Sync descriptors before handing to chip */
@@ -2087,7 +2077,7 @@ msk_txeof(struct sk_if_softc *sc_if)
 	struct msk_tx_desc	*cur_tx;
 	struct ifnet		*ifp = &sc_if->sk_ethercom.ec_if;
 	uint32_t		idx, reg, sk_ctl;
-	struct sk_txmap_entry	*entry;
+	bus_dmamap_t		dmamap;
 
 	DPRINTFN(2, ("msk_txeof\n"));
 
@@ -2114,15 +2104,12 @@ msk_txeof(struct sk_if_softc *sc_if)
 		if (sk_ctl & SK_Y2_TXCTL_LASTFRAG)
 			if_statinc(ifp, if_opackets);
 		if (sc_if->sk_cdata.sk_tx_chain[idx].sk_mbuf != NULL) {
-			entry = sc_if->sk_cdata.sk_tx_map[idx];
+			dmamap = sc_if->sk_cdata.sk_tx_chain[idx].sk_dmamap;
 
-			bus_dmamap_sync(sc->sc_dmatag, entry->dmamap, 0,
-			    entry->dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
+			bus_dmamap_sync(sc->sc_dmatag, dmamap, 0,
+			    dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
 
-			bus_dmamap_unload(sc->sc_dmatag, entry->dmamap);
-			SIMPLEQ_INSERT_TAIL(&sc_if->sk_txmap_head, entry,
-					  link);
-			sc_if->sk_cdata.sk_tx_map[idx] = NULL;
+			bus_dmamap_unload(sc->sc_dmatag, dmamap);
 			m_freem(sc_if->sk_cdata.sk_tx_chain[idx].sk_mbuf);
 			sc_if->sk_cdata.sk_tx_chain[idx].sk_mbuf = NULL;
 		}
@@ -2611,7 +2598,7 @@ msk_stop(struct ifnet *ifp, int disable)
 {
 	struct sk_if_softc	*sc_if = ifp->if_softc;
 	struct sk_softc		*sc = sc_if->sk_softc;
-	struct sk_txmap_entry	*dma;
+	bus_dmamap_t		dmamap;
 	int			i;
 
 	DPRINTFN(2, ("msk_stop\n"));
@@ -2664,16 +2651,12 @@ msk_stop(struct ifnet *ifp, int disable)
 
 	for (i = 0; i < MSK_TX_RING_CNT; i++) {
 		if (sc_if->sk_cdata.sk_tx_chain[i].sk_mbuf != NULL) {
-			dma = sc_if->sk_cdata.sk_tx_map[i];
-
-			bus_dmamap_sync(sc->sc_dmatag, dma->dmamap, 0,
-			    dma->dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
+			dmamap = sc_if->sk_cdata.sk_tx_chain[i].sk_dmamap;
 
-			bus_dmamap_unload(sc->sc_dmatag, dma->dmamap);
+			bus_dmamap_sync(sc->sc_dmatag, dmamap, 0,
+			    dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
 
-			SIMPLEQ_INSERT_HEAD(&sc_if->sk_txmap_head,
-			    sc_if->sk_cdata.sk_tx_map[i], link);
-			sc_if->sk_cdata.sk_tx_map[i] = 0;
+			bus_dmamap_unload(sc->sc_dmatag, dmamap);
 
 			m_freem(sc_if->sk_cdata.sk_tx_chain[i].sk_mbuf);
 			sc_if->sk_cdata.sk_tx_chain[i].sk_mbuf = NULL;

Index: src/sys/dev/pci/if_mskvar.h
diff -u src/sys/dev/pci/if_mskvar.h:1.24 src/sys/dev/pci/if_mskvar.h:1.25
--- src/sys/dev/pci/if_mskvar.h:1.24	Wed Apr 29 18:52:03 2020
+++ src/sys/dev/pci/if_mskvar.h	Wed Apr 29 20:03:52 2020
@@ -1,5 +1,5 @@
 /*	$OpenBSD: if_mskvar.h,v 1.3 2006/12/28 16:34:42 kettenis Exp $	*/
-/*	$NetBSD: if_mskvar.h,v 1.24 2020/04/29 18:52:03 jakllsch Exp $	*/
+/*	$NetBSD: if_mskvar.h,v 1.25 2020/04/29 20:03:52 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -90,6 +90,7 @@ struct sk_jpool_entry {
 
 struct sk_chain {
 	struct mbuf		*sk_mbuf;
+	bus_dmamap_t		sk_dmamap;
 };
 
 /*
@@ -101,16 +102,9 @@ struct sk_chain {
  */
 #define SK_NTXSEG      30
 
-struct sk_txmap_entry {
-	bus_dmamap_t			dmamap;
-	SIMPLEQ_ENTRY(sk_txmap_entry)	link;
-};
-
 struct msk_chain_data {
 	struct sk_chain		sk_tx_chain[MSK_TX_RING_CNT];
 	struct sk_chain		sk_rx_chain[MSK_RX_RING_CNT];
-	struct sk_txmap_entry	*sk_tx_map[MSK_TX_RING_CNT];
-	bus_dmamap_t		sk_rx_map[MSK_RX_RING_CNT];
 	bus_dmamap_t		sk_rx_jumbo_map;
 	unsigned		sk_tx_prod;
 	unsigned		sk_tx_cons;
@@ -241,7 +235,6 @@ struct sk_if_softc {
 	kmutex_t		sk_jpool_mtx;
 	LIST_HEAD(__sk_jfreehead, sk_jpool_entry)	sk_jfree_listhead;
 	LIST_HEAD(__sk_jinusehead, sk_jpool_entry)	sk_jinuse_listhead;
-	SIMPLEQ_HEAD(__sk_txmaphead, sk_txmap_entry)	sk_txmap_head;
 };
 
 struct skc_attach_args {

Reply via email to