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 {