瀏覽代碼

madwifi: improve reliability of napi polling when fast framing is enabled

SVN-Revision: 14215
Felix Fietkau 17 年之前
父節點
當前提交
cf3beca4a2
共有 2 個文件被更改,包括 66 次插入1 次删除
  1. 65 0
      package/madwifi/patches/396-napi_ff_fix.patch
  2. 1 1
      package/madwifi/patches/450-new_hal.patch

+ 65 - 0
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 */

+ 1 - 1
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