Add patch for ath5k to fix "no txbuf available".
authorArne Fitzenreiter <arne_f@ipfire.org>
Tue, 23 Feb 2010 22:33:47 +0000 (23:33 +0100)
committerArne Fitzenreiter <arne_f@ipfire.org>
Tue, 23 Feb 2010 22:33:47 +0000 (23:33 +0100)
config/rootfiles/core/37/filelists/files
lfs/compat-wireless
src/patches/compat-wireless-ath5k_fix_setup_for_CAB_queue.patch [new file with mode: 0644]

index 2ad19ec..3b1e88b 100644 (file)
@@ -9,6 +9,8 @@ lib/modules/2.6.27.42-ipfire-xen/kernel/drivers/hwmon/coretemp.ko
 lib/modules/2.6.27.42-ipfire/kernel/drivers/net/et131x.ko
 lib/modules/2.6.27.42-ipfire-xen/kernel/drivers/net/et131x.ko
 lib/modules/2.6.27.42-ipfire/kernel/arch/x86/kernel/cpu/cpufreq/p4-clockmod.ko
+lib/modules/2.6.27.42-ipfire/kernel/drivers/net/wireless/ath/ath5k/ath5k.ko
+lib/modules/2.6.27.42-ipfire-xen/kernel/drivers/net/wireless/ath/ath5k/ath5k.ko
 srv/web/ipfire/cgi-bin/urlfilter.cgi
 srv/web/ipfire/cgi-bin/outgoingfw.cgi
 srv/web/ipfire/cgi-bin/remote.cgi
index 4ac81d2..ede3764 100644 (file)
@@ -77,6 +77,8 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar xjf $(DIR_DL)/$(DL_FILE)
 
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/compat-wireless-ath5k_fix_setup_for_CAB_queue.patch
+
        cd $(DIR_APP) && make KLIB=/lib/modules/$(KVER)-$(VERSUFIX) KMODDIR=kernel install-modules
 
        # The makefile put the modules to a wrong place move back...
diff --git a/src/patches/compat-wireless-ath5k_fix_setup_for_CAB_queue.patch b/src/patches/compat-wireless-ath5k_fix_setup_for_CAB_queue.patch
new file mode 100644 (file)
index 0000000..fbe3098
--- /dev/null
@@ -0,0 +1,75 @@
+diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
+index 66bcb50..ad4d446 100644
+--- a/drivers/net/wireless/ath/ath5k/ath5k.h
++++ b/drivers/net/wireless/ath/ath5k/ath5k.h
+@@ -535,7 +535,7 @@  struct ath5k_txq_info {
+       u32     tqi_cbr_period; /* Constant bit rate period */
+       u32     tqi_cbr_overflow_limit;
+       u32     tqi_burst_time;
+-      u32     tqi_ready_time; /* Not used */
++      u32     tqi_ready_time; /* Time queue waits after an event */
+ };
+ /*
+diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
+index b501537..535a6af 100644
+--- a/drivers/net/wireless/ath/ath5k/base.c
++++ b/drivers/net/wireless/ath/ath5k/base.c
+@@ -1516,7 +1516,8 @@  ath5k_beaconq_config(struct ath5k_softc *sc)
+       ret = ath5k_hw_get_tx_queueprops(ah, sc->bhalq, &qi);
+       if (ret)
+-              return ret;
++              goto err;
++
+       if (sc->opmode == NL80211_IFTYPE_AP ||
+               sc->opmode == NL80211_IFTYPE_MESH_POINT) {
+               /*
+@@ -1543,10 +1544,25 @@  ath5k_beaconq_config(struct ath5k_softc *sc)
+       if (ret) {
+               ATH5K_ERR(sc, "%s: unable to update parameters for beacon "
+                       "hardware queue!\n", __func__);
+-              return ret;
++              goto err;
+       }
++      ret = ath5k_hw_reset_tx_queue(ah, sc->bhalq); /* push to h/w */
++      if (ret)
++              goto err;
+-      return ath5k_hw_reset_tx_queue(ah, sc->bhalq); /* push to h/w */;
++      /* reconfigure cabq with ready time to 80% of beacon_interval */
++      ret = ath5k_hw_get_tx_queueprops(ah, AR5K_TX_QUEUE_ID_CAB, &qi);
++      if (ret)
++              goto err;
++
++      qi.tqi_ready_time = (sc->bintval * 80) / 100;
++      ret = ath5k_hw_set_tx_queueprops(ah, AR5K_TX_QUEUE_ID_CAB, &qi);
++      if (ret)
++              goto err;
++
++      ret = ath5k_hw_reset_tx_queue(ah, AR5K_TX_QUEUE_ID_CAB);
++err:
++      return ret;
+ }
+ static void
+diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c
+index abe36c0..9122a85 100644
+--- a/drivers/net/wireless/ath/ath5k/qcu.c
++++ b/drivers/net/wireless/ath/ath5k/qcu.c
+@@ -408,12 +408,13 @@  int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
+                       break;
+               case AR5K_TX_QUEUE_CAB:
++                      /* XXX: use BCN_SENT_GT, if we can figure out how */
+                       AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
+-                              AR5K_QCU_MISC_FRSHED_BCN_SENT_GT |
++                              AR5K_QCU_MISC_FRSHED_DBA_GT |
+                               AR5K_QCU_MISC_CBREXP_DIS |
+                               AR5K_QCU_MISC_CBREXP_BCN_DIS);
+-                      ath5k_hw_reg_write(ah, ((AR5K_TUNE_BEACON_INTERVAL -
++                      ath5k_hw_reg_write(ah, ((tq->tqi_ready_time -
+                               (AR5K_TUNE_SW_BEACON_RESP -
+                               AR5K_TUNE_DMA_BEACON_RESP) -
+                               AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF) * 1024) |