madwifi: remove the 10HZ timer for updating rate control statistics
authorFelix Fietkau <nbd@openwrt.org>
Sat, 17 Oct 2009 04:56:09 +0000 (04:56 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 17 Oct 2009 04:56:09 +0000 (04:56 +0000)
SVN-Revision: 18053

package/madwifi/patches/452-minstrel_no_timer.patch [new file with mode: 0644]

diff --git a/package/madwifi/patches/452-minstrel_no_timer.patch b/package/madwifi/patches/452-minstrel_no_timer.patch
new file mode 100644 (file)
index 0000000..e7f2dea
--- /dev/null
@@ -0,0 +1,134 @@
+--- a/ath_rate/minstrel/minstrel.c
++++ b/ath_rate/minstrel/minstrel.c
+@@ -119,6 +119,7 @@
+ #include "minstrel.h"
+ #define ONE_SECOND (1000 * 1000)  /* 1 second, or 1000 milliseconds; eternity, in other words */
++#define TIMER_INTERVAL 100 /* msecs */
+ #include "release.h"
+@@ -128,9 +129,6 @@ static char *dev_info = "ath_rate_minstr
+ #define STALE_FAILURE_TIMEOUT_MS 10000
+ #define ENABLE_MRR 1
+-static int ath_timer_interval = (1000 / 10); /* every 1/10 second, timer runs */
+-static void ath_timer_function(unsigned long data);
+-
+ /* 10% of the time, send a packet at something other than the optimal rate, which fills
+  * the statistics tables nicely. This percentage is applied to the first packet of the
+  * multi rate retry chain. */
+@@ -142,7 +140,7 @@ static void ath_rate_ctl_reset(struct at
+ /* Calculate the throughput and probability of success for each node
+  * we are talking on, based on the statistics collected during the
+  * last timer period. */
+-static void ath_rate_statistics(void *arg, struct ieee80211_node *ni);
++static void ath_rate_statistics(struct ieee80211_node *ni);
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,52))
+@@ -204,6 +202,11 @@ ath_rate_findrate(struct ath_softc *sc, 
+               unsigned int ndx, offset;
+               int mrr;
++
++              if (sn->last_update + msecs_to_jiffies(TIMER_INTERVAL) < jiffies) {
++                      ath_rate_statistics(&an->an_node);
++                      sn->last_update = jiffies;
++              }
+               if (sn->num_rates <= 0) {
+                           printk(KERN_WARNING "%s: no rates for " MAC_FMT "?\n",
+                                  dev_info,
+@@ -640,54 +643,11 @@ ath_rate_newstate(struct ieee80211vap *v
+               }
+ }
+-static void
+-ath_timer_function(unsigned long data)
+-{
+-              struct minstrel_softc *ssc = (struct minstrel_softc *) data;
+-              struct ath_softc *sc = ssc->sc;
+-              struct ieee80211com *ic;
+-              struct net_device *dev = ssc->sc_dev;
+-              struct timer_list *timer;
+-              unsigned int interval = ath_timer_interval;
+-
+-              if (dev == NULL)
+-                      DPRINTF(sc, ATH_DEBUG_RATE, "%s: 'dev' is null in this timer \n", __func__);
+-
+-              if (sc == NULL)
+-                      DPRINTF(sc, ATH_DEBUG_RATE, "%s: 'sc' is null in this timer\n", __func__);
+-
+-              ic = &sc->sc_ic;
+-
+-              if (ssc->close_timer_now)
+-                      return;
+-
+-              if (dev->flags & IFF_RUNNING) {
+-                      sc->sc_stats.ast_rate_calls++;
+-
+-                      if (ic->ic_opmode == IEEE80211_M_STA) {
+-                              struct ieee80211vap *tmpvap;
+-                              TAILQ_FOREACH(tmpvap, &ic->ic_vaps, iv_next) {
+-                                      ath_rate_statistics(sc, tmpvap->iv_bss);/* NB: no reference */
+-                              }
+-                      } else
+-                                  ieee80211_iterate_nodes(&ic->ic_sta, ath_rate_statistics, sc);
+-              }
+-
+-              if (ic->ic_opmode == IEEE80211_M_STA)
+-                      interval = ath_timer_interval >> 1;
+-
+-              timer  = &(ssc->timer);
+-              if (timer == NULL)
+-                      DPRINTF(sc, ATH_DEBUG_RATE, "%s: timer is null - leave it\n", __func__);
+-
+-              timer->expires = jiffies + ((HZ * interval) / 1000);
+-              add_timer(timer);
+-}
+ static void
+-ath_rate_statistics(void *arg, struct ieee80211_node *ni)
++ath_rate_statistics(struct ieee80211_node *ni)
+ {
+-              struct ath_node *an = (struct ath_node *) ni;
++              struct ath_node *an = ATH_NODE(ni);
+               struct ieee80211_rateset *rs = &ni->ni_rates;
+               struct minstrel_node *rn = ATH_NODE_MINSTREL(an);
+               unsigned int i;
+@@ -786,15 +746,8 @@ ath_rate_attach(struct ath_softc *sc)
+               osc->arc.arc_space = sizeof(struct minstrel_node);
+               osc->arc.arc_vap_space = 0;
+-              osc->close_timer_now = 0;
+-              init_timer(&osc->timer);
+       osc->sc          = sc;
+               osc->sc_dev      = sc->sc_dev;
+-              osc->timer.function = ath_timer_function;
+-              osc->timer.data = (unsigned long)osc;
+-
+-              osc->timer.expires = jiffies + HZ;
+-              add_timer(&osc->timer);
+               return &osc->arc;
+ }
+@@ -803,8 +756,6 @@ static void
+ ath_rate_detach(struct ath_ratectrl *arc)
+ {
+       struct minstrel_softc *osc = (struct minstrel_softc *) arc;
+-              osc->close_timer_now = 1;
+-              del_timer(&osc->timer);
+               kfree(osc);
+               _MOD_DEC_USE(THIS_MODULE);
+ }
+--- a/ath_rate/minstrel/minstrel.h
++++ b/ath_rate/minstrel/minstrel.h
+@@ -167,6 +167,8 @@ struct minstrel_node {
+              packet, or a packet at an optimal rate.*/
+       int random_n;
+       int a, b;          /**Coefficients of the random thing */
++
++      unsigned long last_update;
+ };