[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