Module Name: src Committed By: knakahara Date: Tue Oct 13 07:47:45 UTC 2015
Modified Files: src/sys/dev/pci: if_wm.c Log Message: refactor: change some macros to functions change below macros to functions - WM_CDTXSYNC - WM_CDRXSYNC - WM_INIT_RXDESC To generate a diff of this commit: cvs rdiff -u -r1.351 -r1.352 src/sys/dev/pci/if_wm.c 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_wm.c diff -u src/sys/dev/pci/if_wm.c:1.351 src/sys/dev/pci/if_wm.c:1.352 --- src/sys/dev/pci/if_wm.c:1.351 Thu Oct 8 09:28:13 2015 +++ src/sys/dev/pci/if_wm.c Tue Oct 13 07:47:45 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.351 2015/10/08 09:28:13 msaitoh Exp $ */ +/* $NetBSD: if_wm.c,v 1.352 2015/10/13 07:47:45 knakahara Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -83,7 +83,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.351 2015/10/08 09:28:13 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.352 2015/10/13 07:47:45 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -506,67 +506,6 @@ do { \ (sizeof(bus_addr_t) == 8 ? \ (uint64_t)WM_CDRXADDR((sc), (x)) >> 32 : 0) -#define WM_CDTXSYNC(sc, x, n, ops) \ -do { \ - int __x, __n; \ - \ - __x = (x); \ - __n = (n); \ - \ - /* If it will wrap around, sync to the end of the ring. */ \ - if ((__x + __n) > WM_NTXDESC(sc)) { \ - bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ - WM_CDTXOFF(__x), sizeof(wiseman_txdesc_t) * \ - (WM_NTXDESC(sc) - __x), (ops)); \ - __n -= (WM_NTXDESC(sc) - __x); \ - __x = 0; \ - } \ - \ - /* Now sync whatever is left. */ \ - bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ - WM_CDTXOFF(__x), sizeof(wiseman_txdesc_t) * __n, (ops)); \ -} while (/*CONSTCOND*/0) - -#define WM_CDRXSYNC(sc, x, ops) \ -do { \ - bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ - WM_CDRXOFF((x)), sizeof(wiseman_rxdesc_t), (ops)); \ -} while (/*CONSTCOND*/0) - -#define WM_INIT_RXDESC(sc, x) \ -do { \ - struct wm_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)]; \ - wiseman_rxdesc_t *__rxd = &(sc)->sc_rxdescs[(x)]; \ - struct mbuf *__m = __rxs->rxs_mbuf; \ - \ - /* \ - * Note: We scoot the packet forward 2 bytes in the buffer \ - * so that the payload after the Ethernet header is aligned \ - * to a 4-byte boundary. \ - * \ - * XXX BRAINDAMAGE ALERT! \ - * The stupid chip uses the same size for every buffer, which \ - * is set in the Receive Control register. We are using the 2K \ - * size option, but what we REALLY want is (2K - 2)! For this \ - * reason, we can't "scoot" packets longer than the standard \ - * Ethernet MTU. On strict-alignment platforms, if the total \ - * size exceeds (2K - 2) we set align_tweak to 0 and let \ - * the upper layer copy the headers. \ - */ \ - __m->m_data = __m->m_ext.ext_buf + (sc)->sc_align_tweak; \ - \ - wm_set_dma_addr(&__rxd->wrx_addr, \ - __rxs->rxs_dmamap->dm_segs[0].ds_addr + (sc)->sc_align_tweak); \ - __rxd->wrx_len = 0; \ - __rxd->wrx_cksum = 0; \ - __rxd->wrx_status = 0; \ - __rxd->wrx_errors = 0; \ - __rxd->wrx_special = 0; \ - WM_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \ - \ - CSR_WRITE((sc), (sc)->sc_rdt_reg, (x)); \ -} while (/*CONSTCOND*/0) - /* * Register read/write functions. * Other than CSR_{READ|WRITE}(). @@ -580,6 +519,13 @@ static inline void wm_82575_write_8bit_c static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t); /* + * Descriptor sync/init functions. + */ +static inline void wm_cdtxsync(struct wm_softc *, int, int, int); +static inline void wm_cdrxsync(struct wm_softc *, int, int); +static inline void wm_init_rxdesc(struct wm_softc *, int); + +/* * Device driver interface functions and commonly used functions. * match, attach, detach, init, start, stop, ioctl, watchdog and so on. */ @@ -1383,6 +1329,70 @@ wm_set_dma_addr(volatile wiseman_addr_t } /* + * Descriptor sync/init functions. + */ +static inline void +wm_cdtxsync(struct wm_softc *sc, int start, int num, int ops) +{ + + /* If it will wrap around, sync to the end of the ring. */ + if ((start + num) > WM_NTXDESC(sc)) { + bus_dmamap_sync(sc->sc_dmat, sc->sc_cddmamap, + WM_CDTXOFF(start), sizeof(wiseman_txdesc_t) * + (WM_NTXDESC(sc) - start), ops); + num -= (WM_NTXDESC(sc) - start); + start = 0; + } + + /* Now sync whatever is left. */ + bus_dmamap_sync(sc->sc_dmat, sc->sc_cddmamap, + WM_CDTXOFF(start), sizeof(wiseman_txdesc_t) * num, ops); +} + +static inline void +wm_cdrxsync(struct wm_softc *sc, int start, int ops) +{ + + bus_dmamap_sync(sc->sc_dmat, sc->sc_cddmamap, + WM_CDRXOFF(start), sizeof(wiseman_rxdesc_t), ops); +} + +static inline void +wm_init_rxdesc(struct wm_softc *sc, int start) +{ + struct wm_rxsoft *rxs = &sc->sc_rxsoft[start]; + wiseman_rxdesc_t *rxd = &sc->sc_rxdescs[start]; + struct mbuf *m = rxs->rxs_mbuf; + + /* + * Note: We scoot the packet forward 2 bytes in the buffer + * so that the payload after the Ethernet header is aligned + * to a 4-byte boundary. + + * XXX BRAINDAMAGE ALERT! + * The stupid chip uses the same size for every buffer, which + * is set in the Receive Control register. We are using the 2K + * size option, but what we REALLY want is (2K - 2)! For this + * reason, we can't "scoot" packets longer than the standard + * Ethernet MTU. On strict-alignment platforms, if the total + * size exceeds (2K - 2) we set align_tweak to 0 and let + * the upper layer copy the headers. + */ + m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak; + + wm_set_dma_addr(&rxd->wrx_addr, + rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); + rxd->wrx_len = 0; + rxd->wrx_cksum = 0; + rxd->wrx_status = 0; + rxd->wrx_errors = 0; + rxd->wrx_special = 0; + wm_cdrxsync(sc, start, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); + + CSR_WRITE(sc, sc->sc_rdt_reg, start); +} + +/* * Device driver interface functions and commonly used functions. * match, attach, detach, init, start, stop, ioctl, watchdog and so on. */ @@ -4148,9 +4158,9 @@ wm_add_rxbuf(struct wm_softc *sc, int id if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { if ((sc->sc_rctl & RCTL_EN) != 0) - WM_INIT_RXDESC(sc, idx); + wm_init_rxdesc(sc, idx); } else - WM_INIT_RXDESC(sc, idx); + wm_init_rxdesc(sc, idx); return 0; } @@ -4290,7 +4300,7 @@ wm_init_locked(struct ifnet *ifp) /* Initialize the transmit descriptor ring. */ memset(sc->sc_txdescs, 0, WM_TXDESCSIZE(sc)); - WM_CDTXSYNC(sc, 0, WM_NTXDESC(sc), + wm_cdtxsync(sc, 0, WM_NTXDESC(sc), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); sc->sc_txfree = WM_NTXDESC(sc); sc->sc_txnext = 0; @@ -4395,7 +4405,7 @@ wm_init_locked(struct ifnet *ifp) } } else { if ((sc->sc_flags & WM_F_NEWQUEUE) == 0) - WM_INIT_RXDESC(sc, i); + wm_init_rxdesc(sc, i); /* * For 82575 and newer device, the RX descriptors * must be initialized after the setting of RCTL.EN in @@ -4770,7 +4780,7 @@ wm_init_locked(struct ifnet *ifp) /* On 575 and later set RDT only if RX enabled */ if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) for (i = 0; i < WM_NRXDESC; i++) - WM_INIT_RXDESC(sc, i); + wm_init_rxdesc(sc, i); sc->sc_stopping = false; @@ -5060,7 +5070,7 @@ wm_tx_offload(struct wm_softc *sc, struc t->tcpip_tucs = htole32(tucs); t->tcpip_cmdlen = htole32(cmdlen); t->tcpip_seg = htole32(seg); - WM_CDTXSYNC(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE); + wm_cdtxsync(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE); sc->sc_txnext = WM_NEXTTX(sc, sc->sc_txnext); txs->txs_ndesc++; @@ -5463,7 +5473,7 @@ wm_start_locked(struct ifnet *ifp) lasttx, le32toh(sc->sc_txdescs[lasttx].wtx_cmdlen))); /* Sync the descriptors we're using. */ - WM_CDTXSYNC(sc, sc->sc_txnext, txs->txs_ndesc, + wm_cdtxsync(sc, sc->sc_txnext, txs->txs_ndesc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); /* Give the packet to the chip. */ @@ -5693,7 +5703,7 @@ wm_nq_tx_offload(struct wm_softc *sc, st htole32(cmdc); sc->sc_nq_txdescs[sc->sc_txnext].nqrx_ctx.nqtxc_mssidx = htole32(mssidx); - WM_CDTXSYNC(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE); + wm_cdtxsync(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE); DPRINTF(WM_DEBUG_TX, ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev), sc->sc_txnext, 0, vl_len)); @@ -5950,7 +5960,7 @@ wm_nq_start_locked(struct ifnet *ifp) lasttx, le32toh(sc->sc_txdescs[lasttx].wtx_cmdlen))); /* Sync the descriptors we're using. */ - WM_CDTXSYNC(sc, sc->sc_txnext, txs->txs_ndesc, + wm_cdtxsync(sc, sc->sc_txnext, txs->txs_ndesc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); /* Give the packet to the chip. */ @@ -6026,13 +6036,13 @@ wm_txeof(struct wm_softc *sc) DPRINTF(WM_DEBUG_TX, ("%s: TX: checking job %d\n", device_xname(sc->sc_dev), i)); - WM_CDTXSYNC(sc, txs->txs_firstdesc, txs->txs_ndesc, + wm_cdtxsync(sc, txs->txs_firstdesc, txs->txs_ndesc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); status = sc->sc_txdescs[txs->txs_lastdesc].wtx_fields.wtxu_status; if ((status & WTX_ST_DD) == 0) { - WM_CDTXSYNC(sc, txs->txs_lastdesc, 1, + wm_cdtxsync(sc, txs->txs_lastdesc, 1, BUS_DMASYNC_PREREAD); break; } @@ -6117,7 +6127,7 @@ wm_rxeof(struct wm_softc *sc) ("%s: RX: checking descriptor %d\n", device_xname(sc->sc_dev), i)); - WM_CDRXSYNC(sc, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); + wm_cdrxsync(sc, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); status = sc->sc_rxdescs[i].wrx_status; errors = sc->sc_rxdescs[i].wrx_errors; @@ -6126,7 +6136,7 @@ wm_rxeof(struct wm_softc *sc) if ((status & WRX_ST_DD) == 0) { /* We have processed all of the receive descriptors. */ - WM_CDRXSYNC(sc, i, BUS_DMASYNC_PREREAD); + wm_cdrxsync(sc, i, BUS_DMASYNC_PREREAD); break; } @@ -6135,7 +6145,7 @@ wm_rxeof(struct wm_softc *sc) DPRINTF(WM_DEBUG_RX, ("%s: RX: discarding contents of descriptor %d\n", device_xname(sc->sc_dev), i)); - WM_INIT_RXDESC(sc, i); + wm_init_rxdesc(sc, i); if (status & WRX_ST_EOP) { /* Reset our state. */ DPRINTF(WM_DEBUG_RX, @@ -6164,7 +6174,7 @@ wm_rxeof(struct wm_softc *sc) ifp->if_ierrors++; bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); - WM_INIT_RXDESC(sc, i); + wm_init_rxdesc(sc, i); if ((status & WRX_ST_EOP) == 0) sc->sc_rxdiscard = 1; if (sc->sc_rxhead != NULL)