summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ath/if_ath_rx.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/sys/dev/ath/if_ath_rx.c b/sys/dev/ath/if_ath_rx.c
index c8d9536..139e894 100644
--- a/sys/dev/ath/if_ath_rx.c
+++ b/sys/dev/ath/if_ath_rx.c
@@ -954,17 +954,32 @@ rx_proc_next:
* need to be handled, kick the PCU if there's
* been an RXEOL condition.
*/
- ATH_PCU_LOCK(sc);
- if (resched && sc->sc_kickpcu) {
+ if (resched && kickpcu) {
+ ATH_PCU_LOCK(sc);
ATH_KTR(sc, ATH_KTR_ERROR, 0, "ath_rx_proc: kickpcu");
device_printf(sc->sc_dev, "%s: kickpcu; handled %d packets\n",
__func__, npkts);
- /* XXX rxslink? */
-#if 0
+ /*
+ * Go through the process of fully tearing down
+ * the RX buffers and reinitialising them.
+ *
+ * There's a hardware bug that causes the RX FIFO
+ * to get confused under certain conditions and
+ * constantly write over the same frame, leading
+ * the RX driver code here to get heavily confused.
+ */
+#if 1
ath_startrecv(sc);
#else
/*
+ * Disabled for now - it'd be nice to be able to do
+ * this in order to limit the amount of CPU time spent
+ * reinitialising the RX side (and thus minimise RX
+ * drops) however there's a hardware issue that
+ * causes things to get too far out of whack.
+ */
+ /*
* XXX can we hold the PCU lock here?
* Are there any net80211 buffer calls involved?
*/
@@ -977,8 +992,8 @@ rx_proc_next:
ath_hal_intrset(ah, sc->sc_imask);
sc->sc_kickpcu = 0;
+ ATH_PCU_UNLOCK(sc);
}
- ATH_PCU_UNLOCK(sc);
/* XXX check this inside of IF_LOCK? */
if (resched && (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
OpenPOWER on IntegriCloud