diff --git a/package/madwifi/patches/319-no_queue_stop.patch b/package/madwifi/patches/319-no_queue_stop.patch new file mode 100644 index 000000000..a8df8e3c0 --- /dev/null +++ b/package/madwifi/patches/319-no_queue_stop.patch @@ -0,0 +1,118 @@ +Index: madwifi-dfs-r3252/ath/if_ath.c +=================================================================== +--- madwifi-dfs-r3252.orig/ath/if_ath.c 2008-01-26 06:36:36.889082972 +0100 ++++ madwifi-dfs-r3252/ath/if_ath.c 2008-01-26 06:41:35.670109540 +0100 +@@ -3082,46 +3082,44 @@ + { + struct ath_buf* bf = NULL; + ATH_TXBUF_LOCK_ASSERT(sc); ++ + /* Reserve at least ATH_TXBUF_MGT_RESERVED buffers for management frames */ +- if (ath_get_buffers_available() <= ATH_TXBUF_MGT_RESERVED) { ++ if (!for_management && (ath_get_buffers_available() <= ATH_TXBUF_MGT_RESERVED)) { + /* Stop the queue, we are full */ + DPRINTF(sc, ATH_DEBUG_XMIT, "%s: stopping queuing of additional " + "frames. Insufficient free " + "buffers.\n", __func__); + sc->sc_stats.ast_tx_qstop++; +- netif_stop_queue(sc->sc_dev); +- sc->sc_devstopped = 1; + ATH_SCHEDULE_TQUEUE(&sc->sc_txtq, NULL); ++ return NULL; + } + + /* Only let us go further if management frame, or there are enough */ +- if (for_management || (ath_get_buffers_available() > ATH_TXBUF_MGT_RESERVED)) { +- bf = STAILQ_FIRST(&sc->sc_txbuf); +- if (bf) { +- STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list); +- /* This should be redundant, unless someone illegally +- * accessed the buffer after returning it. */ ++ bf = STAILQ_FIRST(&sc->sc_txbuf); ++ if (bf) { ++ STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list); ++ /* This should be redundant, unless someone illegally ++ * accessed the buffer after returning it. */ + #ifdef IEEE80211_DEBUG_REFCNT +- cleanup_ath_buf_debug(sc, bf, BUS_DMA_TODEVICE, func, line); ++ cleanup_ath_buf_debug(sc, bf, BUS_DMA_TODEVICE, func, line); + #else +- cleanup_ath_buf(sc, bf, BUS_DMA_TODEVICE); ++ cleanup_ath_buf(sc, bf, BUS_DMA_TODEVICE); + #endif +- atomic_inc(&ath_buf_counter); ++ atomic_inc(&ath_buf_counter); + #ifdef IEEE80211_DEBUG_REFCNT +- DPRINTF(sc, ATH_DEBUG_TXBUF, +- "[TXBUF=%03d/%03d] %s:%d -> %s:%d took txbuf %p.\n", +- ath_get_buffer_count(), ATH_TXBUF, +- func, line, __func__, __LINE__, +- bf); ++ DPRINTF(sc, ATH_DEBUG_TXBUF, ++ "[TXBUF=%03d/%03d] %s:%d -> %s:%d took txbuf %p.\n", ++ ath_get_buffer_count(), ATH_TXBUF, ++ func, line, __func__, __LINE__, ++ bf); + #endif +- } +- else { +- DPRINTF(sc, ATH_DEBUG_ANY, +- "%s: discard %s, no xmit buffers available.\n", +- __func__, +- for_management ? "management frame" : "frame"); +- sc->sc_stats.ast_tx_nobuf++; +- } ++ } ++ else { ++ DPRINTF(sc, ATH_DEBUG_ANY, ++ "%s: discard %s, no xmit buffers available.\n", ++ __func__, ++ for_management ? "management frame" : "frame"); ++ sc->sc_stats.ast_tx_nobuf++; + } + + return bf; +@@ -3503,9 +3501,6 @@ + /* Pass control of the skb to the caller (i.e., resources are their + * problem). */ + if (requeue) { +- /* queue is full, let the kernel backlog the skb */ +- netif_stop_queue(dev); +- sc->sc_devstopped = 1; + /* Stop tracking again we are giving it back*/ + ieee80211_skb_untrack(skb); + return NETDEV_TX_BUSY; +@@ -12871,21 +12866,6 @@ + ath_get_buffer_count(), ATH_TXBUF, + func, line, __func__, __LINE__, bfaddr); + #endif /* #ifdef IEEE80211_DEBUG_REFCNT */ +- if (sc->sc_devstopped) { +- ++sc->sc_reapcount; +- if (sc->sc_reapcount > ATH_TXBUF_FREE_THRESHOLD) { +- if (!ath_radio_silence_required_for_dfs(sc)) { +- netif_start_queue(sc->sc_dev); +- DPRINTF(sc, ATH_DEBUG_ANY, +- "%s: restarting queue.\n", +- __func__); +- } +- sc->sc_reapcount = 0; +- sc->sc_devstopped = 0; +- } +- else if (!ath_radio_silence_required_for_dfs(sc)) +- ATH_SCHEDULE_TQUEUE(&sc->sc_txtq, NULL); +- } + + *bf = NULL; + } +Index: madwifi-dfs-r3252/ath/if_athvar.h +=================================================================== +--- madwifi-dfs-r3252.orig/ath/if_athvar.h 2008-01-26 06:41:42.206482027 +0100 ++++ madwifi-dfs-r3252/ath/if_athvar.h 2008-01-26 06:41:46.646735062 +0100 +@@ -667,7 +667,6 @@ + unsigned int sc_xrgrppoll:1; /* xr group polls are active */ + unsigned int sc_syncbeacon:1; /* sync/resync beacon timers */ + unsigned int sc_hasclrkey:1; /* CLR key supported */ +- unsigned int sc_devstopped:1; /* stopped due to of no tx bufs */ + unsigned int sc_stagbeacons:1; /* use staggered beacons */ + unsigned int sc_dfswait:1; /* waiting on channel for radar detect */ + unsigned int sc_ackrate:1; /* send acks at high bitrate */