[Midnightbsd-cvs] src [8413] trunk/sys/dev/ae: sync with freebsd stable (post 9.3)

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Sep 18 16:59:21 EDT 2016


Revision: 8413
          http://svnweb.midnightbsd.org/src/?rev=8413
Author:   laffer1
Date:     2016-09-18 16:59:21 -0400 (Sun, 18 Sep 2016)
Log Message:
-----------
sync with freebsd stable (post 9.3)

Modified Paths:
--------------
    trunk/sys/dev/ae/if_ae.c
    trunk/sys/dev/ae/if_aereg.h

Modified: trunk/sys/dev/ae/if_ae.c
===================================================================
--- trunk/sys/dev/ae/if_ae.c	2016-09-18 20:29:18 UTC (rev 8412)
+++ trunk/sys/dev/ae/if_ae.c	2016-09-18 20:59:21 UTC (rev 8413)
@@ -28,6 +28,7 @@
  */
 
 #include <sys/cdefs.h>
+/* $FreeBSD: stable/9/sys/dev/ae/if_ae.c 264445 2014-04-14 04:59:46Z yongari $ */
 __MBSDID("$MidnightBSD$");
 
 #include <sys/param.h>
@@ -132,7 +133,7 @@
 static int	ae_intr(void *arg);
 static void	ae_int_task(void *arg, int pending);
 static void	ae_tx_intr(ae_softc_t *sc);
-static int	ae_rxeof(ae_softc_t *sc, ae_rxd_t *rxd);
+static void	ae_rxeof(ae_softc_t *sc, ae_rxd_t *rxd);
 static void	ae_rx_intr(ae_softc_t *sc);
 static void	ae_watchdog(ae_softc_t *sc);
 static void	ae_tick(void *arg);
@@ -585,6 +586,9 @@
 	val = eaddr[0] << 8 | eaddr[1];
 	AE_WRITE_4(sc, AE_EADDR1_REG, val);
 
+	bzero(sc->rxd_base_dma, AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING);
+	bzero(sc->txd_base, AE_TXD_BUFSIZE_DEFAULT);
+	bzero(sc->txs_base, AE_TXS_COUNT_DEFAULT * 4);
 	/*
 	 * Set ring buffers base addresses.
 	 */
@@ -1115,7 +1119,7 @@
 	 * Create DMA tag for TxD.
 	 */
 	error = bus_dma_tag_create(sc->dma_parent_tag,
-	    4, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+	    8, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
 	    NULL, NULL, AE_TXD_BUFSIZE_DEFAULT, 1,
 	    AE_TXD_BUFSIZE_DEFAULT, 0, NULL, NULL,
 	    &sc->dma_txd_tag);
@@ -1128,7 +1132,7 @@
 	 * Create DMA tag for TxS.
 	 */
 	error = bus_dma_tag_create(sc->dma_parent_tag,
-	    4, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+	    8, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
 	    NULL, NULL, AE_TXS_COUNT_DEFAULT * 4, 1,
 	    AE_TXS_COUNT_DEFAULT * 4, 0, NULL, NULL,
 	    &sc->dma_txs_tag);
@@ -1142,8 +1146,8 @@
 	 */
 	error = bus_dma_tag_create(sc->dma_parent_tag,
 	    128, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
-	    NULL, NULL, AE_RXD_COUNT_DEFAULT * 1536 + 120, 1,
-	    AE_RXD_COUNT_DEFAULT * 1536 + 120, 0, NULL, NULL,
+	    NULL, NULL, AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING, 1,
+	    AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING, 0, NULL, NULL,
 	    &sc->dma_rxd_tag);
 	if (error != 0) {
 		device_printf(sc->dev, "could not creare TxS DMA tag.\n");
@@ -1202,15 +1206,15 @@
 		return (error);
 	}
 	error = bus_dmamap_load(sc->dma_rxd_tag, sc->dma_rxd_map,
-	    sc->rxd_base_dma, AE_RXD_COUNT_DEFAULT * 1536 + 120, ae_dmamap_cb,
-	    &busaddr, BUS_DMA_NOWAIT);
+	    sc->rxd_base_dma, AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING,
+	    ae_dmamap_cb, &busaddr, BUS_DMA_NOWAIT);
 	if (error != 0 || busaddr == 0) {
 		device_printf(sc->dev,
 		    "could not load DMA map for RxD ring.\n");
 		return (error);
 	}
-	sc->dma_rxd_busaddr = busaddr + 120;
-	sc->rxd_base = (ae_rxd_t *)(sc->rxd_base_dma + 120);
+	sc->dma_rxd_busaddr = busaddr + AE_RXD_PADDING;
+	sc->rxd_base = (ae_rxd_t *)(sc->rxd_base_dma + AE_RXD_PADDING);
 
 	return (0);
 }
@@ -1761,6 +1765,10 @@
 	ifp = sc->ifp;
 
 	val = AE_READ_4(sc, AE_ISR_REG);	/* Read interrupt status. */
+	if (val == 0) {
+		AE_UNLOCK(sc);
+		return;
+	}
 
 	/*
 	 * Clear interrupts and disable them.
@@ -1783,13 +1791,17 @@
 			ae_tx_intr(sc);
 		if ((val & AE_ISR_RX_EVENT) != 0)
 			ae_rx_intr(sc);
+		/*
+		 * Re-enable interrupts.
+		 */
+		AE_WRITE_4(sc, AE_ISR_REG, 0);
+
+		if ((sc->flags & AE_FLAG_TXAVAIL) != 0) {
+			if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+				ae_start_locked(ifp);
+		}
 	}
 
-	/*
-	 * Re-enable interrupts.
-	 */
-	AE_WRITE_4(sc, AE_ISR_REG, 0);
-
 	AE_UNLOCK(sc);
 }
 
@@ -1849,10 +1861,10 @@
 			ifp->if_oerrors++;
 
 		sc->tx_inproc--;
+	}
 
+	if ((sc->flags & AE_FLAG_TXAVAIL) != 0)
 		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-	}
-
 	if (sc->tx_inproc < 0) {
 		if_printf(ifp, "Received stray Tx interrupt(s).\n");
 		sc->tx_inproc = 0;
@@ -1860,11 +1872,6 @@
 
 	if (sc->tx_inproc == 0)
 		sc->wd_timer = 0;	/* Unarm watchdog. */
-	
-	if ((sc->flags & AE_FLAG_TXAVAIL) != 0) {
-		if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
-			ae_start_locked(ifp);
-	}
 
 	/*
 	 * Syncronize DMA buffers.
@@ -1875,7 +1882,7 @@
 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 }
 
-static int
+static void
 ae_rxeof(ae_softc_t *sc, ae_rxd_t *rxd)
 {
 	struct ifnet *ifp;
@@ -1894,12 +1901,15 @@
 	size = le16toh(rxd->len) - ETHER_CRC_LEN;
 	if (size < (ETHER_MIN_LEN - ETHER_CRC_LEN - ETHER_VLAN_ENCAP_LEN)) {
 		if_printf(ifp, "Runt frame received.");
-		return (EIO);
+		ifp->if_ierrors++;
+		return;
 	}
 
 	m = m_devget(&rxd->data[0], size, ETHER_ALIGN, ifp, NULL);
-	if (m == NULL)
-		return (ENOBUFS);
+	if (m == NULL) {
+		ifp->if_iqdrops++;
+		return;
+	}
 
 	if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
 	    (flags & AE_RXD_HAS_VLAN) != 0) {
@@ -1907,6 +1917,7 @@
 		m->m_flags |= M_VLANTAG;
 	}
 
+	ifp->if_ipackets++;
 	/*
 	 * Pass it through.
 	 */
@@ -1913,8 +1924,6 @@
 	AE_UNLOCK(sc);
 	(*ifp->if_input)(ifp, m);
 	AE_LOCK(sc);
-
-	return (0);
 }
 
 static void
@@ -1923,7 +1932,7 @@
 	ae_rxd_t *rxd;
 	struct ifnet *ifp;
 	uint16_t flags;
-	int error;
+	int count;
 
 	KASSERT(sc != NULL, ("[ae, %d]: sc is NULL!", __LINE__));
 
@@ -1937,7 +1946,7 @@
 	bus_dmamap_sync(sc->dma_rxd_tag, sc->dma_rxd_map,
 	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 
-	for (;;) {
+	for (count = 0;; count++) {
 		rxd = (ae_rxd_t *)(sc->rxd_base + sc->rxd_cur);
 		flags = le16toh(rxd->flags);
 		if ((flags & AE_RXD_UPDATE) == 0)
@@ -1951,23 +1960,20 @@
 		 */
 		sc->rxd_cur = (sc->rxd_cur + 1) % AE_RXD_COUNT_DEFAULT;
 
-		if ((flags & AE_RXD_SUCCESS) == 0) {
+		if ((flags & AE_RXD_SUCCESS) != 0)
+			ae_rxeof(sc, rxd);
+		else
 			ifp->if_ierrors++;
-			continue;
-		}
-		error = ae_rxeof(sc, rxd);
-		if (error != 0) {
-			ifp->if_ierrors++;
-			continue;
-		} else {
-			ifp->if_ipackets++;
-		}
 	}
 
-	/*
-	 * Update Rx index.
-	 */
-	AE_WRITE_2(sc, AE_MB_RXD_IDX_REG, sc->rxd_cur);
+	if (count > 0) {
+		bus_dmamap_sync(sc->dma_rxd_tag, sc->dma_rxd_map,
+		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+		/*
+		 * Update Rx index.
+		 */
+		AE_WRITE_2(sc, AE_MB_RXD_IDX_REG, sc->rxd_cur);
+	}
 }
 
 static void

Modified: trunk/sys/dev/ae/if_aereg.h
===================================================================
--- trunk/sys/dev/ae/if_aereg.h	2016-09-18 20:29:18 UTC (rev 8412)
+++ trunk/sys/dev/ae/if_aereg.h	2016-09-18 20:59:21 UTC (rev 8413)
@@ -23,6 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $MidnightBSD$
+ * $FreeBSD: stable/9/sys/dev/ae/if_aereg.h 258960 2013-12-05 07:16:24Z yongari $
  */
 
 /*
@@ -104,6 +105,8 @@
 #define	AE_RXD_COUNT_MIN	16
 #define	AE_RXD_COUNT_MAX	512
 #define	AE_RXD_COUNT_DEFAULT	64
+/* Padding to align frames on a 128-byte boundary. */
+#define	AE_RXD_PADDING		120
 
 #define	AE_TXD_BUFSIZE_MIN	4096
 #define	AE_TXD_BUFSIZE_MAX	65536



More information about the Midnightbsd-cvs mailing list