From 12d38e69b99678c48ddb26b853dbf8759aaa8f73 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 27 Jan 2009 06:13:57 +0000 Subject: madwifi: improve reliability of napi polling when fast framing is enabled git-svn-id: svn://svn.openwrt.org/openwrt/trunk@14215 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/madwifi/patches/396-napi_ff_fix.patch | 65 +++++++++++++++++++++++++++ package/madwifi/patches/450-new_hal.patch | 2 +- 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 package/madwifi/patches/396-napi_ff_fix.patch (limited to 'package/madwifi/patches') diff --git a/package/madwifi/patches/396-napi_ff_fix.patch b/package/madwifi/patches/396-napi_ff_fix.patch new file mode 100644 index 0000000000..6a019ce9b0 --- /dev/null +++ b/package/madwifi/patches/396-napi_ff_fix.patch @@ -0,0 +1,65 @@ +--- a/ath/if_ath.c ++++ b/ath/if_ath.c +@@ -6723,10 +6723,10 @@ ath_rx_poll(struct net_device *dev, int + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + struct ath_softc *sc = container_of(napi, struct ath_softc, sc_napi); + struct net_device *dev = sc->sc_dev; +- u_int rx_limit = budget; ++ int rx_limit = budget; + #else + struct ath_softc *sc = dev->priv; +- u_int rx_limit = min(dev->quota, *budget); ++ int rx_limit = min(dev->quota, *budget); + #endif + struct ath_buf *bf; + struct ieee80211com *ic = &sc->sc_ic; +@@ -6769,13 +6769,15 @@ process_rx_again: + break; + } + +- if (rx_limit-- < 2) { ++ processed += ic->ic_recv; ++ rx_limit -= ic->ic_recv; ++ ic->ic_recv = 0; ++ ++ /* keep a reserve for napi */ ++ if (rx_limit < 4) { + early_stop = 1; + break; + } +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +- processed++; +-#endif + + skb = bf->bf_skb; + if (skb == NULL) { +@@ -7059,8 +7061,8 @@ rx_next: + if (sc->sc_isr & HAL_INT_RX) { + u_int64_t hw_tsf = ath_hal_gettsf64(ah); + sc->sc_isr &= ~HAL_INT_RX; +- local_irq_restore(flags); + ath_uapsd_processtriggers(sc, hw_tsf); ++ local_irq_restore(flags); + goto process_rx_again; + } + local_irq_restore(flags); +--- a/net80211/ieee80211_input.c ++++ b/net80211/ieee80211_input.c +@@ -1203,6 +1203,7 @@ ieee80211_deliver_data(struct ieee80211_ + } + } + ++ vap->iv_ic->ic_recv++; + if (skb != NULL) { + skb->dev = dev; + +--- a/net80211/ieee80211_var.h ++++ b/net80211/ieee80211_var.h +@@ -323,6 +323,7 @@ struct ieee80211com { + struct ifmedia ic_media; /* interface media config */ + u_int8_t ic_myaddr[IEEE80211_ADDR_LEN]; + struct timer_list ic_inact; /* mgmt/inactivity timer */ ++ u_int ic_recv; /* frame received counter */ + + unsigned int ic_subifs; + u_int32_t ic_flags; /* state flags */ diff --git a/package/madwifi/patches/450-new_hal.patch b/package/madwifi/patches/450-new_hal.patch index 625fd7640b..0243b80787 100644 --- a/package/madwifi/patches/450-new_hal.patch +++ b/package/madwifi/patches/450-new_hal.patch @@ -108,7 +108,7 @@ /* * Check if the MAC has multi-rate retry support. * We do this by trying to setup a fake extended -@@ -7553,7 +7561,7 @@ ath_txq_setup(struct ath_softc *sc, int +@@ -7555,7 +7563,7 @@ ath_txq_setup(struct ath_softc *sc, int if (qtype == HAL_TX_QUEUE_UAPSD) qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE; else -- cgit v1.2.3