mac80211: update to wireless-testing 2010-12-16
SVN-Revision: 24655
This commit is contained in:
parent
29379780a6
commit
b51a9f9248
28 changed files with 209 additions and 2904 deletions
|
@ -10,12 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2010-12-09
|
||||
PKG_VERSION:=2010-12-16
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
# http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \
|
||||
# http://wireless.kernel.org/download/compat-wireless-2.6
|
||||
PKG_MD5SUM:=94b6eaaa2c8245d1b5d6b6f16b75a701
|
||||
PKG_MD5SUM:=39196307aa67c1f19f498b570b994112
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
-CONFIG_B43_LEDS=y
|
||||
+# CONFIG_B43_LEDS=y
|
||||
CONFIG_B43_PHY_LP=y
|
||||
CONFIG_B43_NPHY=y
|
||||
CONFIG_B43_PHY_N=y
|
||||
# CONFIG_B43_FORCE_PIO=y
|
||||
@@ -251,7 +251,7 @@ CONFIG_B43_NPHY=y
|
||||
@@ -251,7 +251,7 @@ CONFIG_B43_PHY_N=y
|
||||
CONFIG_B43LEGACY=m
|
||||
CONFIG_B43LEGACY_HWRNG=y
|
||||
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
endif #CONFIG_PCMCIA
|
||||
# CONFIG_B43_LEDS=y
|
||||
CONFIG_B43_PHY_LP=y
|
||||
-CONFIG_B43_NPHY=y
|
||||
+# CONFIG_B43_NPHY is not set
|
||||
-CONFIG_B43_PHY_N=y
|
||||
+# CONFIG_B43_PHY_N=y
|
||||
# CONFIG_B43_FORCE_PIO=y
|
||||
# CONFIG_B43_DEBUG=y
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
err:
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -795,6 +795,8 @@ struct ath_hw {
|
||||
@@ -788,6 +788,8 @@ struct ath_hw {
|
||||
int initPDADC;
|
||||
int PDADCdelta;
|
||||
u8 led_pin;
|
||||
|
@ -47,7 +47,7 @@
|
|||
bool ath9k_hw_check_alive(struct ath_hw *ah)
|
||||
{
|
||||
int count = 50;
|
||||
@@ -1457,6 +1471,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -1459,6 +1473,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
if (AR_SREV_9300_20_OR_LATER(ah))
|
||||
ar9003_hw_bb_watchdog_config(ah);
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
priv_ops->do_getnf = ar5008_hw_do_getnf;
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -748,28 +748,6 @@ static void ar9003_hw_rfbus_done(struct
|
||||
@@ -745,28 +745,6 @@ static void ar9003_hw_rfbus_done(struct
|
||||
REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);
|
||||
}
|
||||
|
||||
|
@ -58,7 +58,7 @@
|
|||
static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value)
|
||||
{
|
||||
u32 v = REG_READ(ah, AR_PHY_CCK_DETECT);
|
||||
@@ -1206,7 +1184,6 @@ void ar9003_hw_attach_phy_ops(struct ath
|
||||
@@ -1203,7 +1181,6 @@ void ar9003_hw_attach_phy_ops(struct ath
|
||||
priv_ops->set_delta_slope = ar9003_hw_set_delta_slope;
|
||||
priv_ops->rfbus_req = ar9003_hw_rfbus_req;
|
||||
priv_ops->rfbus_done = ar9003_hw_rfbus_done;
|
||||
|
@ -66,6 +66,16 @@
|
|||
priv_ops->set_diversity = ar9003_hw_set_diversity;
|
||||
priv_ops->ani_control = ar9003_hw_ani_control;
|
||||
priv_ops->do_getnf = ar9003_hw_do_getnf;
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -189,6 +189,7 @@ struct ath_txq {
|
||||
struct list_head axq_q;
|
||||
spinlock_t axq_lock;
|
||||
u32 axq_depth;
|
||||
+ u32 axq_ampdu_depth;
|
||||
bool stopped;
|
||||
bool axq_tx_inprogress;
|
||||
struct list_head axq_acq;
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw-ops.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
|
||||
@@ -223,11 +223,6 @@ static inline void ath9k_hw_rfbus_done(s
|
||||
|
@ -82,7 +92,7 @@
|
|||
if (!ath9k_hw_private_ops(ah)->restore_chainmask)
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1406,7 +1406,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -1399,7 +1399,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ath9k_hw_init_qos(ah);
|
||||
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
|
||||
|
@ -101,3 +111,82 @@
|
|||
void (*restore_chainmask)(struct ath_hw *ah);
|
||||
void (*set_diversity)(struct ath_hw *ah, bool value);
|
||||
u32 (*compute_pll_control)(struct ath_hw *ah,
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -838,7 +838,7 @@ static void ath_tx_sched_aggr(struct ath
|
||||
ath_tx_txqaddbuf(sc, txq, &bf_q);
|
||||
TX_STAT_INC(txq->axq_qnum, a_aggr);
|
||||
|
||||
- } while (txq->axq_depth < ATH_AGGR_MIN_QDEPTH &&
|
||||
+ } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH &&
|
||||
status != ATH_AGGR_BAW_CLOSED);
|
||||
}
|
||||
|
||||
@@ -999,6 +999,7 @@ struct ath_txq *ath_txq_setup(struct ath
|
||||
INIT_LIST_HEAD(&txq->axq_acq);
|
||||
spin_lock_init(&txq->axq_lock);
|
||||
txq->axq_depth = 0;
|
||||
+ txq->axq_ampdu_depth = 0;
|
||||
txq->axq_tx_inprogress = false;
|
||||
sc->tx.txqsetup |= 1<<qnum;
|
||||
|
||||
@@ -1068,6 +1069,12 @@ int ath_cabq_update(struct ath_softc *sc
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
|
||||
+{
|
||||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
||||
+ return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Drain a given TX queue (could be Beacon or Data)
|
||||
*
|
||||
@@ -1126,7 +1133,8 @@ void ath_draintxq(struct ath_softc *sc,
|
||||
}
|
||||
|
||||
txq->axq_depth--;
|
||||
-
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth--;
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
if (bf_isampdu(bf))
|
||||
@@ -1316,6 +1324,8 @@ static void ath_tx_txqaddbuf(struct ath_
|
||||
ath9k_hw_txstart(ah, txq->axq_qnum);
|
||||
}
|
||||
txq->axq_depth++;
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth++;
|
||||
}
|
||||
|
||||
static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid,
|
||||
@@ -1336,7 +1346,7 @@ static void ath_tx_send_ampdu(struct ath
|
||||
*/
|
||||
if (!list_empty(&tid->buf_q) || tid->paused ||
|
||||
!BAW_WITHIN(tid->seq_start, tid->baw_size, fi->seqno) ||
|
||||
- txctl->txq->axq_depth >= ATH_AGGR_MIN_QDEPTH) {
|
||||
+ txctl->txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) {
|
||||
/*
|
||||
* Add this frame to software queue for scheduling later
|
||||
* for aggregation.
|
||||
@@ -2040,6 +2050,9 @@ static void ath_tx_processq(struct ath_s
|
||||
txq->axq_tx_inprogress = false;
|
||||
if (bf_held)
|
||||
list_del(&bf_held->list);
|
||||
+
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth--;
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
if (bf_held)
|
||||
@@ -2168,6 +2181,8 @@ void ath_tx_edma_tasklet(struct ath_soft
|
||||
INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH);
|
||||
txq->axq_depth--;
|
||||
txq->axq_tx_inprogress = false;
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth--;
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
txok = !(txs.ts_status & ATH9K_TXERR_MASK);
|
|
@ -1,470 +0,0 @@
|
|||
--- a/net/mac80211/led.c
|
||||
+++ b/net/mac80211/led.c
|
||||
@@ -54,12 +54,22 @@ void ieee80211_led_radio(struct ieee8021
|
||||
led_trigger_event(local->radio_led, LED_OFF);
|
||||
}
|
||||
|
||||
+void ieee80211_led_names(struct ieee80211_local *local)
|
||||
+{
|
||||
+ snprintf(local->rx_led_name, sizeof(local->rx_led_name),
|
||||
+ "%srx", wiphy_name(local->hw.wiphy));
|
||||
+ snprintf(local->tx_led_name, sizeof(local->tx_led_name),
|
||||
+ "%stx", wiphy_name(local->hw.wiphy));
|
||||
+ snprintf(local->assoc_led_name, sizeof(local->assoc_led_name),
|
||||
+ "%sassoc", wiphy_name(local->hw.wiphy));
|
||||
+ snprintf(local->radio_led_name, sizeof(local->radio_led_name),
|
||||
+ "%sradio", wiphy_name(local->hw.wiphy));
|
||||
+}
|
||||
+
|
||||
void ieee80211_led_init(struct ieee80211_local *local)
|
||||
{
|
||||
local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
|
||||
if (local->rx_led) {
|
||||
- snprintf(local->rx_led_name, sizeof(local->rx_led_name),
|
||||
- "%srx", wiphy_name(local->hw.wiphy));
|
||||
local->rx_led->name = local->rx_led_name;
|
||||
if (led_trigger_register(local->rx_led)) {
|
||||
kfree(local->rx_led);
|
||||
@@ -69,8 +79,6 @@ void ieee80211_led_init(struct ieee80211
|
||||
|
||||
local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
|
||||
if (local->tx_led) {
|
||||
- snprintf(local->tx_led_name, sizeof(local->tx_led_name),
|
||||
- "%stx", wiphy_name(local->hw.wiphy));
|
||||
local->tx_led->name = local->tx_led_name;
|
||||
if (led_trigger_register(local->tx_led)) {
|
||||
kfree(local->tx_led);
|
||||
@@ -80,8 +88,6 @@ void ieee80211_led_init(struct ieee80211
|
||||
|
||||
local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
|
||||
if (local->assoc_led) {
|
||||
- snprintf(local->assoc_led_name, sizeof(local->assoc_led_name),
|
||||
- "%sassoc", wiphy_name(local->hw.wiphy));
|
||||
local->assoc_led->name = local->assoc_led_name;
|
||||
if (led_trigger_register(local->assoc_led)) {
|
||||
kfree(local->assoc_led);
|
||||
@@ -91,14 +97,19 @@ void ieee80211_led_init(struct ieee80211
|
||||
|
||||
local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
|
||||
if (local->radio_led) {
|
||||
- snprintf(local->radio_led_name, sizeof(local->radio_led_name),
|
||||
- "%sradio", wiphy_name(local->hw.wiphy));
|
||||
local->radio_led->name = local->radio_led_name;
|
||||
if (led_trigger_register(local->radio_led)) {
|
||||
kfree(local->radio_led);
|
||||
local->radio_led = NULL;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (local->tpt_led_trigger) {
|
||||
+ if (led_trigger_register(&local->tpt_led_trigger->trig)) {
|
||||
+ kfree(local->tpt_led_trigger);
|
||||
+ local->tpt_led_trigger = NULL;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
void ieee80211_led_exit(struct ieee80211_local *local)
|
||||
@@ -119,15 +130,18 @@ void ieee80211_led_exit(struct ieee80211
|
||||
led_trigger_unregister(local->rx_led);
|
||||
kfree(local->rx_led);
|
||||
}
|
||||
+
|
||||
+ if (local->tpt_led_trigger) {
|
||||
+ led_trigger_unregister(&local->tpt_led_trigger->trig);
|
||||
+ kfree(local->tpt_led_trigger);
|
||||
+ }
|
||||
}
|
||||
|
||||
char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
- if (local->radio_led)
|
||||
- return local->radio_led_name;
|
||||
- return NULL;
|
||||
+ return local->radio_led_name;
|
||||
}
|
||||
EXPORT_SYMBOL(__ieee80211_get_radio_led_name);
|
||||
|
||||
@@ -135,9 +149,7 @@ char *__ieee80211_get_assoc_led_name(str
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
- if (local->assoc_led)
|
||||
- return local->assoc_led_name;
|
||||
- return NULL;
|
||||
+ return local->assoc_led_name;
|
||||
}
|
||||
EXPORT_SYMBOL(__ieee80211_get_assoc_led_name);
|
||||
|
||||
@@ -145,9 +157,7 @@ char *__ieee80211_get_tx_led_name(struct
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
- if (local->tx_led)
|
||||
- return local->tx_led_name;
|
||||
- return NULL;
|
||||
+ return local->tx_led_name;
|
||||
}
|
||||
EXPORT_SYMBOL(__ieee80211_get_tx_led_name);
|
||||
|
||||
@@ -155,8 +165,115 @@ char *__ieee80211_get_rx_led_name(struct
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
- if (local->rx_led)
|
||||
- return local->rx_led_name;
|
||||
- return NULL;
|
||||
+ return local->rx_led_name;
|
||||
}
|
||||
EXPORT_SYMBOL(__ieee80211_get_rx_led_name);
|
||||
+
|
||||
+static unsigned long tpt_trig_traffic(struct ieee80211_local *local,
|
||||
+ struct tpt_led_trigger *tpt_trig)
|
||||
+{
|
||||
+ unsigned long traffic, delta;
|
||||
+
|
||||
+ traffic = tpt_trig->tx_bytes + tpt_trig->rx_bytes;
|
||||
+
|
||||
+ delta = traffic - tpt_trig->prev_traffic;
|
||||
+ tpt_trig->prev_traffic = traffic;
|
||||
+ return DIV_ROUND_UP(delta, 1024 / 8);
|
||||
+}
|
||||
+
|
||||
+static void tpt_trig_timer(unsigned long data)
|
||||
+{
|
||||
+ struct ieee80211_local *local = (void *)data;
|
||||
+ struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
|
||||
+ struct led_classdev *led_cdev;
|
||||
+ unsigned long on, off, tpt;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!tpt_trig->running)
|
||||
+ return;
|
||||
+
|
||||
+ mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ));
|
||||
+
|
||||
+ tpt = tpt_trig_traffic(local, tpt_trig);
|
||||
+
|
||||
+ /* default to just solid on */
|
||||
+ on = 1;
|
||||
+ off = 0;
|
||||
+
|
||||
+ for (i = tpt_trig->blink_table_len - 1; i >= 0; i--) {
|
||||
+ if (tpt_trig->blink_table[i].throughput < 0 ||
|
||||
+ tpt > tpt_trig->blink_table[i].throughput) {
|
||||
+ off = tpt_trig->blink_table[i].blink_time / 2;
|
||||
+ on = tpt_trig->blink_table[i].blink_time - off;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ read_lock(&tpt_trig->trig.leddev_list_lock);
|
||||
+ list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list)
|
||||
+ led_blink_set(led_cdev, &on, &off);
|
||||
+ read_unlock(&tpt_trig->trig.leddev_list_lock);
|
||||
+}
|
||||
+
|
||||
+extern char *__ieee80211_create_tpt_led_trigger(
|
||||
+ struct ieee80211_hw *hw,
|
||||
+ const struct ieee80211_tpt_blink *blink_table,
|
||||
+ unsigned int blink_table_len)
|
||||
+{
|
||||
+ struct ieee80211_local *local = hw_to_local(hw);
|
||||
+ struct tpt_led_trigger *tpt_trig;
|
||||
+
|
||||
+ if (WARN_ON(local->tpt_led_trigger))
|
||||
+ return NULL;
|
||||
+
|
||||
+ tpt_trig = kzalloc(sizeof(struct tpt_led_trigger), GFP_KERNEL);
|
||||
+ if (!tpt_trig)
|
||||
+ return NULL;
|
||||
+
|
||||
+ snprintf(tpt_trig->name, sizeof(tpt_trig->name),
|
||||
+ "%stpt", wiphy_name(local->hw.wiphy));
|
||||
+
|
||||
+ tpt_trig->trig.name = tpt_trig->name;
|
||||
+
|
||||
+ tpt_trig->blink_table = blink_table;
|
||||
+ tpt_trig->blink_table_len = blink_table_len;
|
||||
+
|
||||
+ setup_timer(&tpt_trig->timer, tpt_trig_timer, (unsigned long)local);
|
||||
+
|
||||
+ local->tpt_led_trigger = tpt_trig;
|
||||
+
|
||||
+ return tpt_trig->name;
|
||||
+}
|
||||
+EXPORT_SYMBOL(__ieee80211_create_tpt_led_trigger);
|
||||
+
|
||||
+void ieee80211_start_tpt_led_trig(struct ieee80211_local *local)
|
||||
+{
|
||||
+ struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
|
||||
+
|
||||
+ if (!tpt_trig)
|
||||
+ return;
|
||||
+
|
||||
+ /* reset traffic */
|
||||
+ tpt_trig_traffic(local, tpt_trig);
|
||||
+ tpt_trig->running = true;
|
||||
+
|
||||
+ tpt_trig_timer((unsigned long)local);
|
||||
+ mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ));
|
||||
+}
|
||||
+
|
||||
+void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local)
|
||||
+{
|
||||
+ struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
|
||||
+ struct led_classdev *led_cdev;
|
||||
+
|
||||
+ if (!tpt_trig)
|
||||
+ return;
|
||||
+
|
||||
+ tpt_trig->running = false;
|
||||
+ del_timer_sync(&tpt_trig->timer);
|
||||
+
|
||||
+ read_lock(&tpt_trig->trig.leddev_list_lock);
|
||||
+ list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list)
|
||||
+ led_brightness_set(led_cdev, LED_OFF);
|
||||
+ read_unlock(&tpt_trig->trig.leddev_list_lock);
|
||||
+}
|
||||
--- a/net/mac80211/led.h
|
||||
+++ b/net/mac80211/led.h
|
||||
@@ -12,14 +12,17 @@
|
||||
#include "ieee80211_i.h"
|
||||
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
-extern void ieee80211_led_rx(struct ieee80211_local *local);
|
||||
-extern void ieee80211_led_tx(struct ieee80211_local *local, int q);
|
||||
-extern void ieee80211_led_assoc(struct ieee80211_local *local,
|
||||
- bool associated);
|
||||
-extern void ieee80211_led_radio(struct ieee80211_local *local,
|
||||
- bool enabled);
|
||||
-extern void ieee80211_led_init(struct ieee80211_local *local);
|
||||
-extern void ieee80211_led_exit(struct ieee80211_local *local);
|
||||
+void ieee80211_led_rx(struct ieee80211_local *local);
|
||||
+void ieee80211_led_tx(struct ieee80211_local *local, int q);
|
||||
+void ieee80211_led_assoc(struct ieee80211_local *local,
|
||||
+ bool associated);
|
||||
+void ieee80211_led_radio(struct ieee80211_local *local,
|
||||
+ bool enabled);
|
||||
+void ieee80211_led_names(struct ieee80211_local *local);
|
||||
+void ieee80211_led_init(struct ieee80211_local *local);
|
||||
+void ieee80211_led_exit(struct ieee80211_local *local);
|
||||
+void ieee80211_start_tpt_led_trig(struct ieee80211_local *local);
|
||||
+void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local);
|
||||
#else
|
||||
static inline void ieee80211_led_rx(struct ieee80211_local *local)
|
||||
{
|
||||
@@ -35,10 +38,37 @@ static inline void ieee80211_led_radio(s
|
||||
bool enabled)
|
||||
{
|
||||
}
|
||||
+static inline void ieee80211_led_names(struct ieee80211_local *local)
|
||||
+{
|
||||
+}
|
||||
static inline void ieee80211_led_init(struct ieee80211_local *local)
|
||||
{
|
||||
}
|
||||
static inline void ieee80211_led_exit(struct ieee80211_local *local)
|
||||
{
|
||||
}
|
||||
+static inline void ieee80211_start_tpt_led_trig(struct ieee80211_local *local)
|
||||
+{
|
||||
+}
|
||||
+static inline void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local)
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static inline void
|
||||
+ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, __le16 fc, int bytes)
|
||||
+{
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+ if (local->tpt_led_trigger && ieee80211_is_data(fc))
|
||||
+ local->tpt_led_trigger->tx_bytes += bytes;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static inline void
|
||||
+ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, __le16 fc, int bytes)
|
||||
+{
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+ if (local->tpt_led_trigger && ieee80211_is_data(fc))
|
||||
+ local->tpt_led_trigger->rx_bytes += bytes;
|
||||
#endif
|
||||
+}
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -602,6 +602,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(
|
||||
/* init dummy netdev for use w/ NAPI */
|
||||
init_dummy_netdev(&local->napi_dev);
|
||||
|
||||
+ ieee80211_led_names(local);
|
||||
+
|
||||
return local_to_hw(local);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_alloc_hw);
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1856,11 +1856,26 @@ struct ieee80211_hw *ieee80211_alloc_hw(
|
||||
*/
|
||||
int ieee80211_register_hw(struct ieee80211_hw *hw);
|
||||
|
||||
+/**
|
||||
+ * struct ieee80211_tpt_blink - throughput blink description
|
||||
+ * @throughput: throughput in Kbit/sec
|
||||
+ * @blink_time: blink time in milliseconds
|
||||
+ * (full cycle, ie. one off + one on period)
|
||||
+ */
|
||||
+struct ieee80211_tpt_blink {
|
||||
+ int throughput;
|
||||
+ int blink_time;
|
||||
+};
|
||||
+
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw);
|
||||
extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw);
|
||||
extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw);
|
||||
extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw);
|
||||
+extern char *__ieee80211_create_tpt_led_trigger(
|
||||
+ struct ieee80211_hw *hw,
|
||||
+ const struct ieee80211_tpt_blink *blink_table,
|
||||
+ unsigned int blink_table_len);
|
||||
#endif
|
||||
/**
|
||||
* ieee80211_get_tx_led_name - get name of TX LED
|
||||
@@ -1939,6 +1954,29 @@ static inline char *ieee80211_get_radio_
|
||||
}
|
||||
|
||||
/**
|
||||
+ * ieee80211_create_tpt_led_trigger - create throughput LED trigger
|
||||
+ * @hw: the hardware to create the trigger for
|
||||
+ * @blink_table: the blink table -- needs to be ordered by throughput
|
||||
+ * @blink_table_len: size of the blink table
|
||||
+ *
|
||||
+ * This function returns %NULL (in case of error, or if no LED
|
||||
+ * triggers are configured) or the name of the new trigger.
|
||||
+ * This function must be called before ieee80211_register_hw().
|
||||
+ */
|
||||
+static inline char *
|
||||
+ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw,
|
||||
+ const struct ieee80211_tpt_blink *blink_table,
|
||||
+ unsigned int blink_table_len)
|
||||
+{
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+ return __ieee80211_create_tpt_led_trigger(hw, blink_table,
|
||||
+ blink_table_len);
|
||||
+#else
|
||||
+ return NULL;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* ieee80211_unregister_hw - Unregister a hardware device
|
||||
*
|
||||
* This function instructs mac80211 to free allocated resources
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/etherdevice.h>
|
||||
+#include <linux/leds.h>
|
||||
#include <net/ieee80211_radiotap.h>
|
||||
#include <net/cfg80211.h>
|
||||
#include <net/mac80211.h>
|
||||
@@ -629,6 +630,19 @@ enum queue_stop_reason {
|
||||
IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+struct tpt_led_trigger {
|
||||
+ struct led_trigger trig;
|
||||
+ char name[32];
|
||||
+ const struct ieee80211_tpt_blink *blink_table;
|
||||
+ unsigned int blink_table_len;
|
||||
+ struct timer_list timer;
|
||||
+ bool running;
|
||||
+ unsigned long prev_traffic;
|
||||
+ unsigned long tx_bytes, rx_bytes;
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
/**
|
||||
* mac80211 scan flags - currently active scan mode
|
||||
*
|
||||
@@ -842,6 +856,7 @@ struct ieee80211_local {
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
int tx_led_counter, rx_led_counter;
|
||||
struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led;
|
||||
+ struct tpt_led_trigger *tpt_led_trigger;
|
||||
char tx_led_name[32], rx_led_name[32],
|
||||
assoc_led_name[32], radio_led_name[32];
|
||||
#endif
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -220,6 +220,7 @@ static int ieee80211_do_open(struct net_
|
||||
/* we're brought up, everything changes */
|
||||
hw_reconf_flags = ~0;
|
||||
ieee80211_led_radio(local, true);
|
||||
+ ieee80211_start_tpt_led_trig(local);
|
||||
}
|
||||
|
||||
/*
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -2888,6 +2888,9 @@ void ieee80211_rx(struct ieee80211_hw *h
|
||||
return;
|
||||
}
|
||||
|
||||
+ ieee80211_tpt_led_trig_rx(local,
|
||||
+ ((struct ieee80211_hdr *)skb->data)->frame_control,
|
||||
+ skb->len);
|
||||
__ieee80211_rx_handle_packet(hw, skb);
|
||||
|
||||
rcu_read_unlock();
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -1293,6 +1293,7 @@ static int __ieee80211_tx(struct ieee802
|
||||
|
||||
while (skb) {
|
||||
int q = skb_get_queue_mapping(skb);
|
||||
+ __le16 fc;
|
||||
|
||||
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
||||
ret = IEEE80211_TX_OK;
|
||||
@@ -1335,6 +1336,7 @@ static int __ieee80211_tx(struct ieee802
|
||||
else
|
||||
info->control.sta = NULL;
|
||||
|
||||
+ fc = ((struct ieee80211_hdr *)skb->data)->frame_control;
|
||||
ret = drv_tx(local, skb);
|
||||
if (WARN_ON(ret != NETDEV_TX_OK && skb->len != len)) {
|
||||
dev_kfree_skb(skb);
|
||||
@@ -1345,6 +1347,7 @@ static int __ieee80211_tx(struct ieee802
|
||||
return IEEE80211_TX_AGAIN;
|
||||
}
|
||||
|
||||
+ ieee80211_tpt_led_trig_tx(local, fc, len);
|
||||
*skbp = skb = next;
|
||||
ieee80211_led_tx(local, 1);
|
||||
fragm = true;
|
||||
--- a/net/mac80211/util.c
|
||||
+++ b/net/mac80211/util.c
|
||||
@@ -1141,6 +1141,7 @@ u32 ieee80211_sta_get_rates(struct ieee8
|
||||
void ieee80211_stop_device(struct ieee80211_local *local)
|
||||
{
|
||||
ieee80211_led_radio(local, false);
|
||||
+ ieee80211_stop_tpt_led_trig(local);
|
||||
|
||||
cancel_work_sync(&local->reconfig_filter);
|
||||
|
||||
@@ -1175,6 +1176,7 @@ int ieee80211_reconfig(struct ieee80211_
|
||||
}
|
||||
|
||||
ieee80211_led_radio(local, true);
|
||||
+ ieee80211_start_tpt_led_trig(local);
|
||||
}
|
||||
|
||||
/* add interfaces */
|
|
@ -1,80 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -1685,17 +1685,20 @@ static void ath_tx_start_dma(struct ath_
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
struct list_head bf_head;
|
||||
- struct ath_atx_tid *tid;
|
||||
+ struct ath_atx_tid *tid = NULL;
|
||||
u8 tidno;
|
||||
|
||||
spin_lock_bh(&txctl->txq->axq_lock);
|
||||
|
||||
- if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && txctl->an) {
|
||||
+ if (ieee80211_is_data_qos(hdr->frame_control) && txctl->an) {
|
||||
tidno = ieee80211_get_qos_ctl(hdr)[0] &
|
||||
IEEE80211_QOS_CTL_TID_MASK;
|
||||
tid = ATH_AN_2_TID(txctl->an, tidno);
|
||||
|
||||
WARN_ON(tid->ac->txq != txctl->txq);
|
||||
+ }
|
||||
+
|
||||
+ if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) {
|
||||
/*
|
||||
* Try aggregation if it's a unicast data frame
|
||||
* and the destination is HT capable.
|
||||
@@ -1712,7 +1715,7 @@ static void ath_tx_start_dma(struct ath_
|
||||
ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc,
|
||||
bf->bf_state.bfs_paprd);
|
||||
|
||||
- ath_tx_send_normal(sc, txctl->txq, NULL, &bf_head);
|
||||
+ ath_tx_send_normal(sc, txctl->txq, tid, &bf_head);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&txctl->txq->axq_lock);
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -284,11 +284,9 @@ static void ath9k_hw_read_revisions(stru
|
||||
|
||||
static void ath9k_hw_disablepcie(struct ath_hw *ah)
|
||||
{
|
||||
- if (AR_SREV_9100(ah))
|
||||
+ if (!AR_SREV_5416(ah))
|
||||
return;
|
||||
|
||||
- ENABLE_REGWRITE_BUFFER(ah);
|
||||
-
|
||||
REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
|
||||
REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
|
||||
REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029);
|
||||
@@ -300,8 +298,6 @@ static void ath9k_hw_disablepcie(struct
|
||||
REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007);
|
||||
|
||||
REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
|
||||
-
|
||||
- REGWRITE_BUFFER_FLUSH(ah);
|
||||
}
|
||||
|
||||
/* This should work for all families including legacy */
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1940,7 +1940,9 @@ static u64 ath9k_get_tsf(struct ieee8021
|
||||
struct ath_softc *sc = aphy->sc;
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
+ ath9k_ps_wakeup(sc);
|
||||
tsf = ath9k_hw_gettsf64(sc->sc_ah);
|
||||
+ ath9k_ps_restore(sc);
|
||||
mutex_unlock(&sc->mutex);
|
||||
|
||||
return tsf;
|
||||
@@ -1952,7 +1954,9 @@ static void ath9k_set_tsf(struct ieee802
|
||||
struct ath_softc *sc = aphy->sc;
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
+ ath9k_ps_wakeup(sc);
|
||||
ath9k_hw_settsf64(sc->sc_ah, tsf);
|
||||
+ ath9k_ps_restore(sc);
|
||||
mutex_unlock(&sc->mutex);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,11 +0,0 @@
|
|||
--- a/net/mac80211/driver-ops.h
|
||||
+++ b/net/mac80211/driver-ops.h
|
||||
@@ -381,7 +381,7 @@ static inline void drv_reset_tsf(struct
|
||||
|
||||
static inline int drv_tx_last_beacon(struct ieee80211_local *local)
|
||||
{
|
||||
- int ret = 1;
|
||||
+ int ret = 0; /* default unsuported op for less congestion */
|
||||
|
||||
might_sleep();
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
if (!wiphy->bands[IEEE80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
@@ -449,6 +461,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
@@ -457,6 +469,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
{
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include "ath9k.h"
|
||||
|
||||
@@ -522,6 +523,7 @@ static void ath9k_init_misc(struct ath_s
|
||||
@@ -526,6 +527,7 @@ static void ath9k_init_misc(struct ath_s
|
||||
static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
|
@ -26,7 +26,7 @@
|
|||
struct ath_hw *ah = NULL;
|
||||
struct ath_common *common;
|
||||
int ret = 0, i;
|
||||
@@ -535,7 +537,7 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -539,7 +541,7 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->hw_version.subsysid = subsysid;
|
||||
sc->sc_ah = ah;
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
ah->ah_flags |= AH_USE_EEPROM;
|
||||
|
||||
common = ath9k_hw_common(ah);
|
||||
@@ -568,6 +570,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -572,6 +574,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (ret)
|
||||
goto err_hw;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -537,8 +537,14 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -541,8 +541,14 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->hw_version.subsysid = subsysid;
|
||||
sc->sc_ah = ah;
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
|||
common->ops = &ath9k_common_ops;
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -787,7 +787,7 @@ struct ath_hw {
|
||||
@@ -786,7 +786,7 @@ struct ath_hw {
|
||||
u32 originalGain[22];
|
||||
int initPDADC;
|
||||
int PDADCdelta;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -438,26 +438,20 @@ void ath9k_btcoex_timer_pause(struct ath
|
||||
@@ -441,26 +441,20 @@ void ath9k_btcoex_timer_pause(struct ath
|
||||
|
||||
#define ATH_LED_PIN_DEF 1
|
||||
#define ATH_LED_PIN_9287 8
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
/* Antenna diversity/combining */
|
||||
#define ATH_ANT_RX_CURRENT_SHIFT 4
|
||||
@@ -608,15 +602,11 @@ struct ath_softc {
|
||||
@@ -611,15 +605,11 @@ struct ath_softc {
|
||||
struct ath_beacon beacon;
|
||||
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
||||
|
||||
|
@ -253,7 +253,7 @@
|
|||
/* Rfkill */
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1275,9 +1275,6 @@ static void ath9k_stop(struct ieee80211_
|
||||
@@ -1295,9 +1295,6 @@ static void ath9k_stop(struct ieee80211_
|
||||
|
||||
aphy->state = ATH_WIPHY_INACTIVE;
|
||||
|
||||
|
@ -265,7 +265,7 @@
|
|||
cancel_work_sync(&sc->hw_check_work);
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -139,6 +139,21 @@ static struct ieee80211_rate ath9k_legac
|
||||
@@ -143,6 +143,21 @@ static struct ieee80211_rate ath9k_legac
|
||||
RATE(540, 0x0c, 0),
|
||||
};
|
||||
|
||||
|
@ -287,14 +287,15 @@
|
|||
static void ath9k_deinit_softc(struct ath_softc *sc);
|
||||
|
||||
/*
|
||||
@@ -742,6 +757,12 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -746,6 +761,13 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
ath9k_init_txpower_limits(sc);
|
||||
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+ /* must be initialized before ieee80211_register_hw */
|
||||
+ sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
|
||||
+ ath9k_tpt_blink, ARRAY_SIZE(ath9k_tpt_blink));
|
||||
+ IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink,
|
||||
+ ARRAY_SIZE(ath9k_tpt_blink));
|
||||
+#endif
|
||||
+
|
||||
/* Register with mac80211 */
|
||||
|
|
57
package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch
Normal file
57
package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch
Normal file
|
@ -0,0 +1,57 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -4762,6 +4762,7 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||||
+ struct ar9300_modal_eep_header *modal_hdr;
|
||||
u8 targetPowerValT2[ar9300RateSize];
|
||||
u8 target_power_val_t2_eep[ar9300RateSize];
|
||||
unsigned int i = 0, paprd_scale_factor = 0;
|
||||
@@ -4771,15 +4772,17 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||
|
||||
if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) {
|
||||
if (IS_CHAN_2GHZ(chan))
|
||||
- ah->paprd_ratemask = (IS_CHAN_HT40(chan) ?
|
||||
- le32_to_cpu(eep->modalHeader2G.papdRateMaskHt40) :
|
||||
- le32_to_cpu(eep->modalHeader2G.papdRateMaskHt20))
|
||||
- & AR9300_PAPRD_RATE_MASK;
|
||||
+ modal_hdr = &eep->modalHeader2G;
|
||||
else
|
||||
- ah->paprd_ratemask = (IS_CHAN_HT40(chan) ?
|
||||
- le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40) :
|
||||
- le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20))
|
||||
- & AR9300_PAPRD_RATE_MASK;
|
||||
+ modal_hdr = &eep->modalHeader5G;
|
||||
+
|
||||
+ ah->paprd_ratemask =
|
||||
+ le32_to_cpu(modal_hdr->papdRateMaskHt20) &
|
||||
+ AR9300_PAPRD_RATE_MASK;
|
||||
+
|
||||
+ ah->paprd_ratemask_ht40 =
|
||||
+ le32_to_cpu(modal_hdr->papdRateMaskHt40) &
|
||||
+ AR9300_PAPRD_RATE_MASK;
|
||||
|
||||
paprd_scale_factor = ar9003_get_paprd_scale_factor(ah, chan);
|
||||
min_pwridx = IS_CHAN_HT40(chan) ? ALL_TARGET_HT40_0_8_16 :
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
@@ -134,7 +134,7 @@ static int ar9003_paprd_setup_single_tab
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK,
|
||||
ah->paprd_ratemask);
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK,
|
||||
- AR_PHY_PAPRD_HT40_MASK);
|
||||
+ ah->paprd_ratemask_ht40);
|
||||
|
||||
for (i = 0; i < ah->caps.max_txchains; i++) {
|
||||
REG_RMW_FIELD(ah, ctrl0[i],
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -837,6 +837,7 @@ struct ath_hw {
|
||||
unsigned int paprd_target_power;
|
||||
unsigned int paprd_training_power;
|
||||
unsigned int paprd_ratemask;
|
||||
+ unsigned int paprd_ratemask_ht40;
|
||||
bool paprd_table_write_done;
|
||||
u32 paprd_gain_table_entries[PAPRD_GAIN_TABLE_ENTRIES];
|
||||
u8 paprd_gain_table_index[PAPRD_GAIN_TABLE_ENTRIES];
|
|
@ -1,11 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -409,7 +409,7 @@ static void ath9k_hw_init_defaults(struc
|
||||
AR_STA_ID1_CRPT_MIC_ENABLE |
|
||||
AR_STA_ID1_MCAST_KSRCH;
|
||||
ah->enable_32kHz_clock = DONT_USE_32KHZ;
|
||||
- ah->slottime = (u32) -1;
|
||||
+ ah->slottime = 9;
|
||||
ah->globaltxtimeout = (u32) -1;
|
||||
ah->power_mode = ATH9K_PM_UNDEFINED;
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -817,7 +817,7 @@ void ath9k_hw_init_global_settings(struc
|
||||
if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ)
|
||||
acktimeout += 64 - sifstime - ah->slottime;
|
||||
|
||||
- ath9k_hw_setslottime(ah, slottime);
|
||||
+ ath9k_hw_setslottime(ah, ah->slottime);
|
||||
ath9k_hw_set_ack_timeout(ah, acktimeout);
|
||||
ath9k_hw_set_cts_timeout(ah, acktimeout);
|
||||
if (ah->globaltxtimeout != (u32) -1)
|
28
package/mac80211/patches/530-ath9k_chainmask_read_fix.patch
Normal file
28
package/mac80211/patches/530-ath9k_chainmask_read_fix.patch
Normal file
|
@ -0,0 +1,28 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -81,11 +81,10 @@ static ssize_t read_file_tx_chainmask(st
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
char buf[32];
|
||||
unsigned int len;
|
||||
|
||||
- len = sprintf(buf, "0x%08x\n", common->tx_chainmask);
|
||||
+ len = sprintf(buf, "0x%08x\n", sc->sc_ah->caps.tx_chainmask);
|
||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
}
|
||||
|
||||
@@ -124,11 +123,10 @@ static ssize_t read_file_rx_chainmask(st
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
char buf[32];
|
||||
unsigned int len;
|
||||
|
||||
- len = sprintf(buf, "0x%08x\n", common->rx_chainmask);
|
||||
+ len = sprintf(buf, "0x%08x\n", sc->sc_ah->caps.rx_chainmask);
|
||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
}
|
||||
|
|
@ -1,122 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -320,6 +320,42 @@ static void ath_paprd_activate(struct at
|
||||
ath9k_ps_restore(sc);
|
||||
}
|
||||
|
||||
+static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int chain)
|
||||
+{
|
||||
+ struct ieee80211_hw *hw = sc->hw;
|
||||
+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
+ struct ath_tx_control txctl;
|
||||
+ int time_left;
|
||||
+
|
||||
+ memset(&txctl, 0, sizeof(txctl));
|
||||
+ txctl.txq = sc->tx.txq_map[WME_AC_BE];
|
||||
+
|
||||
+ memset(tx_info, 0, sizeof(*tx_info));
|
||||
+ tx_info->band = hw->conf.channel->band;
|
||||
+ tx_info->flags |= IEEE80211_TX_CTL_NO_ACK;
|
||||
+ tx_info->control.rates[0].idx = 0;
|
||||
+ tx_info->control.rates[0].count = 1;
|
||||
+ tx_info->control.rates[0].flags = IEEE80211_TX_RC_MCS;
|
||||
+ tx_info->control.rates[1].idx = -1;
|
||||
+
|
||||
+ init_completion(&sc->paprd_complete);
|
||||
+ sc->paprd_pending = true;
|
||||
+ txctl.paprd = BIT(chain);
|
||||
+ if (ath_tx_start(hw, skb, &txctl) != 0)
|
||||
+ return false;
|
||||
+
|
||||
+ time_left = wait_for_completion_timeout(&sc->paprd_complete,
|
||||
+ msecs_to_jiffies(ATH_PAPRD_TIMEOUT));
|
||||
+ sc->paprd_pending = false;
|
||||
+
|
||||
+ if (!time_left)
|
||||
+ ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_CALIBRATE,
|
||||
+ "Timeout waiting for paprd training on TX chain %d\n",
|
||||
+ chain);
|
||||
+
|
||||
+ return !!time_left;
|
||||
+}
|
||||
+
|
||||
void ath_paprd_calibrate(struct work_struct *work)
|
||||
{
|
||||
struct ath_softc *sc = container_of(work, struct ath_softc, paprd_work);
|
||||
@@ -327,18 +363,12 @@ void ath_paprd_calibrate(struct work_str
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct sk_buff *skb = NULL;
|
||||
- struct ieee80211_tx_info *tx_info;
|
||||
- int band = hw->conf.channel->band;
|
||||
- struct ieee80211_supported_band *sband = &sc->sbands[band];
|
||||
- struct ath_tx_control txctl;
|
||||
struct ath9k_hw_cal_data *caldata = ah->caldata;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
int ftype;
|
||||
int chain_ok = 0;
|
||||
int chain;
|
||||
int len = 1800;
|
||||
- int time_left;
|
||||
- int i;
|
||||
|
||||
if (!caldata)
|
||||
return;
|
||||
@@ -347,8 +377,6 @@ void ath_paprd_calibrate(struct work_str
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
- tx_info = IEEE80211_SKB_CB(skb);
|
||||
-
|
||||
skb_put(skb, len);
|
||||
memset(skb->data, 0, len);
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
@@ -359,9 +387,6 @@ void ath_paprd_calibrate(struct work_str
|
||||
memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
|
||||
memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
|
||||
|
||||
- memset(&txctl, 0, sizeof(txctl));
|
||||
- txctl.txq = sc->tx.txq_map[WME_AC_BE];
|
||||
-
|
||||
ath9k_ps_wakeup(sc);
|
||||
ar9003_paprd_init_table(ah);
|
||||
for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
|
||||
@@ -369,30 +394,19 @@ void ath_paprd_calibrate(struct work_str
|
||||
continue;
|
||||
|
||||
chain_ok = 0;
|
||||
- memset(tx_info, 0, sizeof(*tx_info));
|
||||
- tx_info->band = band;
|
||||
|
||||
- for (i = 0; i < 4; i++) {
|
||||
- tx_info->control.rates[i].idx = sband->n_bitrates - 1;
|
||||
- tx_info->control.rates[i].count = 6;
|
||||
- }
|
||||
+ ath_dbg(common, ATH_DBG_CALIBRATE,
|
||||
+ "Sending PAPRD frame for thermal measurement "
|
||||
+ "on chain %d\n", chain);
|
||||
+ if (!ath_paprd_send_frame(sc, skb, chain))
|
||||
+ goto fail_paprd;
|
||||
|
||||
- init_completion(&sc->paprd_complete);
|
||||
- sc->paprd_pending = true;
|
||||
ar9003_paprd_setup_gain_table(ah, chain);
|
||||
- txctl.paprd = BIT(chain);
|
||||
- if (ath_tx_start(hw, skb, &txctl) != 0)
|
||||
- break;
|
||||
|
||||
- time_left = wait_for_completion_timeout(&sc->paprd_complete,
|
||||
- msecs_to_jiffies(ATH_PAPRD_TIMEOUT));
|
||||
- sc->paprd_pending = false;
|
||||
- if (!time_left) {
|
||||
- ath_dbg(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
|
||||
- "Timeout waiting for paprd training on TX chain %d\n",
|
||||
- chain);
|
||||
+ ath_dbg(common, ATH_DBG_CALIBRATE,
|
||||
+ "Sending PAPRD training frame on chain %d\n", chain);
|
||||
+ if (!ath_paprd_send_frame(sc, skb, chain))
|
||||
goto fail_paprd;
|
||||
- }
|
||||
|
||||
if (!ar9003_paprd_is_done(ah))
|
||||
break;
|
|
@ -1,28 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
|
||||
@@ -31,6 +31,12 @@
|
||||
#define AR9300_ANT_16S 25
|
||||
#define AR9300_FUTURE_MODAL_SZ 6
|
||||
|
||||
+#define AR9300_PAPRD_RATE_MASK 0x01ffffff
|
||||
+#define AR9300_PAPRD_SCALE_1 0x0e000000
|
||||
+#define AR9300_PAPRD_SCALE_1_S 25
|
||||
+#define AR9300_PAPRD_SCALE_2 0x70000000
|
||||
+#define AR9300_PAPRD_SCALE_2_S 28
|
||||
+
|
||||
/* Delta from which to start power to pdadc table */
|
||||
/* This offset is used in both open loop and closed loop power control
|
||||
* schemes. In open loop power control, it is not really needed, but for
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
@@ -52,8 +52,8 @@ static void ar9003_paprd_setup_single_ta
|
||||
else
|
||||
hdr = &eep->modalHeader2G;
|
||||
|
||||
- am_mask = le32_to_cpu(hdr->papdRateMaskHt20);
|
||||
- ht40_mask = le32_to_cpu(hdr->papdRateMaskHt40);
|
||||
+ am_mask = le32_to_cpu(hdr->papdRateMaskHt20) & AR9300_PAPRD_RATE_MASK;
|
||||
+ ht40_mask = le32_to_cpu(hdr->papdRateMaskHt40) & AR9300_PAPRD_RATE_MASK;
|
||||
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, am_mask);
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, am_mask);
|
|
@ -1,233 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
@@ -30,9 +30,69 @@ void ar9003_paprd_enable(struct ath_hw *
|
||||
}
|
||||
EXPORT_SYMBOL(ar9003_paprd_enable);
|
||||
|
||||
-static void ar9003_paprd_setup_single_table(struct ath_hw *ah)
|
||||
+static int ar9003_get_training_power_2g(struct ath_hw *ah)
|
||||
{
|
||||
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||||
+ struct ar9300_modal_eep_header *hdr = &eep->modalHeader2G;
|
||||
+ unsigned int power, scale, delta;
|
||||
+
|
||||
+ scale = MS(le32_to_cpu(hdr->papdRateMaskHt20), AR9300_PAPRD_SCALE_1);
|
||||
+ power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE5,
|
||||
+ AR_PHY_POWERTX_RATE5_POWERTXHT20_0);
|
||||
+
|
||||
+ delta = abs((int) ah->paprd_target_power - (int) power);
|
||||
+ if (delta > scale)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (delta < 4)
|
||||
+ power -= 4 - delta;
|
||||
+
|
||||
+ return power;
|
||||
+}
|
||||
+
|
||||
+static int get_streams(int mask)
|
||||
+{
|
||||
+ return !!(mask & BIT(0)) + !!(mask & BIT(1)) + !!(mask & BIT(2));
|
||||
+}
|
||||
+
|
||||
+static int ar9003_get_training_power_5g(struct ath_hw *ah)
|
||||
+{
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
+ struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||||
+ struct ar9300_modal_eep_header *hdr = &eep->modalHeader5G;
|
||||
+ struct ath9k_channel *chan = ah->curchan;
|
||||
+ unsigned int power, scale, delta;
|
||||
+
|
||||
+ if (chan->channel >= 5700)
|
||||
+ scale = MS(le32_to_cpu(hdr->papdRateMaskHt20),
|
||||
+ AR9300_PAPRD_SCALE_1);
|
||||
+ else if (chan->channel >= 5400)
|
||||
+ scale = MS(le32_to_cpu(hdr->papdRateMaskHt40),
|
||||
+ AR9300_PAPRD_SCALE_2);
|
||||
+ else
|
||||
+ scale = MS(le32_to_cpu(hdr->papdRateMaskHt40),
|
||||
+ AR9300_PAPRD_SCALE_1);
|
||||
+
|
||||
+ if (IS_CHAN_HT40(chan))
|
||||
+ power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE8,
|
||||
+ AR_PHY_POWERTX_RATE8_POWERTXHT40_5);
|
||||
+ else
|
||||
+ power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE6,
|
||||
+ AR_PHY_POWERTX_RATE6_POWERTXHT20_5);
|
||||
+
|
||||
+ power += scale;
|
||||
+ delta = abs((int) ah->paprd_target_power - (int) power);
|
||||
+ if (delta > scale)
|
||||
+ return -1;
|
||||
+
|
||||
+ power += 2 * get_streams(common->tx_chainmask);
|
||||
+ return power;
|
||||
+}
|
||||
+
|
||||
+static int ar9003_paprd_setup_single_table(struct ath_hw *ah)
|
||||
+{
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
+ struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||||
struct ar9300_modal_eep_header *hdr;
|
||||
static const u32 ctrl0[3] = {
|
||||
AR_PHY_PAPRD_CTRL0_B0,
|
||||
@@ -45,6 +105,7 @@ static void ar9003_paprd_setup_single_ta
|
||||
AR_PHY_PAPRD_CTRL1_B2
|
||||
};
|
||||
u32 am_mask, ht40_mask;
|
||||
+ int training_power;
|
||||
int i;
|
||||
|
||||
if (ah->curchan && IS_CHAN_5GHZ(ah->curchan))
|
||||
@@ -55,11 +116,25 @@ static void ar9003_paprd_setup_single_ta
|
||||
am_mask = le32_to_cpu(hdr->papdRateMaskHt20) & AR9300_PAPRD_RATE_MASK;
|
||||
ht40_mask = le32_to_cpu(hdr->papdRateMaskHt40) & AR9300_PAPRD_RATE_MASK;
|
||||
|
||||
+ if (IS_CHAN_2GHZ(ah->curchan))
|
||||
+ training_power = ar9003_get_training_power_2g(ah);
|
||||
+ else
|
||||
+ training_power = ar9003_get_training_power_5g(ah);
|
||||
+
|
||||
+ if (training_power < 0) {
|
||||
+ ath_dbg(common, ATH_DBG_CALIBRATE,
|
||||
+ "PAPRD target power delta out of range");
|
||||
+ return -ERANGE;
|
||||
+ }
|
||||
+ ah->paprd_training_power = training_power;
|
||||
+ ath_dbg(common, ATH_DBG_CALIBRATE,
|
||||
+ "Training power: %d, Target power: %d\n",
|
||||
+ ah->paprd_training_power, ah->paprd_target_power);
|
||||
+
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, am_mask);
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, am_mask);
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, ht40_mask);
|
||||
|
||||
-
|
||||
for (i = 0; i < ah->caps.max_txchains; i++) {
|
||||
REG_RMW_FIELD(ah, ctrl0[i],
|
||||
AR_PHY_PAPRD_CTRL0_USE_SINGLE_TABLE_MASK, 1);
|
||||
@@ -141,6 +216,7 @@ static void ar9003_paprd_setup_single_ta
|
||||
AR_PHY_PAPRD_PRE_POST_SCALING, 185706);
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_PRE_POST_SCALE_7_B0,
|
||||
AR_PHY_PAPRD_PRE_POST_SCALING, 175487);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void ar9003_paprd_get_gain_table(struct ath_hw *ah)
|
||||
@@ -595,15 +671,10 @@ void ar9003_paprd_populate_single_table(
|
||||
{
|
||||
u32 *paprd_table_val = caldata->pa_table[chain];
|
||||
u32 small_signal_gain = caldata->small_signal_gain[chain];
|
||||
- u32 training_power;
|
||||
+ u32 training_power = ah->paprd_training_power;
|
||||
u32 reg = 0;
|
||||
int i;
|
||||
|
||||
- training_power =
|
||||
- REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE5,
|
||||
- AR_PHY_POWERTX_RATE5_POWERTXHT20_0);
|
||||
- training_power -= 4;
|
||||
-
|
||||
if (chain == 0)
|
||||
reg = AR_PHY_PAPRD_MEM_TAB_B0;
|
||||
else if (chain == 1)
|
||||
@@ -643,14 +714,8 @@ EXPORT_SYMBOL(ar9003_paprd_populate_sing
|
||||
|
||||
int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain)
|
||||
{
|
||||
-
|
||||
unsigned int i, desired_gain, gain_index;
|
||||
- unsigned int train_power;
|
||||
-
|
||||
- train_power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE5,
|
||||
- AR_PHY_POWERTX_RATE5_POWERTXHT20_0);
|
||||
-
|
||||
- train_power = train_power - 4;
|
||||
+ unsigned int train_power = ah->paprd_training_power;
|
||||
|
||||
desired_gain = ar9003_get_desired_gain(ah, chain, train_power);
|
||||
|
||||
@@ -716,7 +781,12 @@ EXPORT_SYMBOL(ar9003_paprd_create_curve)
|
||||
|
||||
int ar9003_paprd_init_table(struct ath_hw *ah)
|
||||
{
|
||||
- ar9003_paprd_setup_single_table(ah);
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ar9003_paprd_setup_single_table(ah);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
ar9003_paprd_get_gain_table(ah);
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -835,6 +835,8 @@ struct ath_hw {
|
||||
u32 bb_watchdog_last_status;
|
||||
u32 bb_watchdog_timeout_ms; /* in ms, 0 to disable */
|
||||
|
||||
+ unsigned int paprd_target_power;
|
||||
+ unsigned int paprd_training_power;
|
||||
u32 paprd_gain_table_entries[PAPRD_GAIN_TABLE_ENTRIES];
|
||||
u8 paprd_gain_table_index[PAPRD_GAIN_TABLE_ENTRIES];
|
||||
/*
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
@@ -1090,6 +1090,14 @@
|
||||
#define AR_PHY_POWERTX_RATE5_POWERTXHT20_0 0x3F
|
||||
#define AR_PHY_POWERTX_RATE5_POWERTXHT20_0_S 0
|
||||
|
||||
+#define AR_PHY_POWERTX_RATE6 (AR_SM_BASE + 0x1d4)
|
||||
+#define AR_PHY_POWERTX_RATE6_POWERTXHT20_5 0x3F00
|
||||
+#define AR_PHY_POWERTX_RATE6_POWERTXHT20_5_S 8
|
||||
+
|
||||
+#define AR_PHY_POWERTX_RATE8 (AR_SM_BASE + 0x1dc)
|
||||
+#define AR_PHY_POWERTX_RATE8_POWERTXHT40_5 0x3F00
|
||||
+#define AR_PHY_POWERTX_RATE8_POWERTXHT40_5_S 8
|
||||
+
|
||||
void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx);
|
||||
|
||||
#endif /* AR9003_PHY_H */
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -4798,6 +4798,19 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||
/* Write target power array to registers */
|
||||
ar9003_hw_tx_power_regwrite(ah, targetPowerValT2);
|
||||
ar9003_hw_calibration_apply(ah, chan->channel);
|
||||
+
|
||||
+ if (IS_CHAN_2GHZ(chan)) {
|
||||
+ if (IS_CHAN_HT40(chan))
|
||||
+ i = ALL_TARGET_HT40_0_8_16;
|
||||
+ else
|
||||
+ i = ALL_TARGET_HT20_0_8_16;
|
||||
+ } else {
|
||||
+ if (IS_CHAN_HT40(chan))
|
||||
+ i = ALL_TARGET_HT40_7;
|
||||
+ else
|
||||
+ i = ALL_TARGET_HT20_7;
|
||||
+ }
|
||||
+ ah->paprd_target_power = targetPowerValT2[i];
|
||||
}
|
||||
|
||||
static u16 ath9k_hw_ar9300_get_spur_channel(struct ath_hw *ah,
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -373,6 +373,9 @@ void ath_paprd_calibrate(struct work_str
|
||||
if (!caldata)
|
||||
return;
|
||||
|
||||
+ if (ar9003_paprd_init_table(ah) < 0)
|
||||
+ return;
|
||||
+
|
||||
skb = alloc_skb(len, GFP_KERNEL);
|
||||
if (!skb)
|
||||
return;
|
||||
@@ -388,7 +391,6 @@ void ath_paprd_calibrate(struct work_str
|
||||
memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
- ar9003_paprd_init_table(ah);
|
||||
for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
|
||||
if (!(common->tx_chainmask & BIT(chain)))
|
||||
continue;
|
|
@ -1,27 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
|
||||
@@ -638,6 +638,7 @@ static const u32 ar9300_2p2_baseband_pos
|
||||
{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
|
||||
{0x0000a204, 0x000037c0, 0x000037c4, 0x000037c4, 0x000037c0},
|
||||
{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
|
||||
+ {0x0000a22c, 0x01026a2f, 0x01026a2f, 0x01026a2f, 0x01026a2f},
|
||||
{0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b},
|
||||
{0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff},
|
||||
{0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},
|
||||
@@ -680,7 +681,7 @@ static const u32 ar9300_2p2_baseband_cor
|
||||
{0x0000981c, 0x00020028},
|
||||
{0x00009834, 0x6400a290},
|
||||
{0x00009838, 0x0108ecff},
|
||||
- {0x0000983c, 0x14750600},
|
||||
+ {0x0000983c, 0x0d000600},
|
||||
{0x00009880, 0x201fff00},
|
||||
{0x00009884, 0x00001042},
|
||||
{0x000098a4, 0x00200400},
|
||||
@@ -722,7 +723,6 @@ static const u32 ar9300_2p2_baseband_cor
|
||||
{0x0000a220, 0x00000000},
|
||||
{0x0000a224, 0x00000000},
|
||||
{0x0000a228, 0x10002310},
|
||||
- {0x0000a22c, 0x01036a27},
|
||||
{0x0000a23c, 0x00000000},
|
||||
{0x0000a244, 0x0c000000},
|
||||
{0x0000a2a0, 0x00000001},
|
|
@ -1,129 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
|
||||
@@ -34,9 +34,9 @@ static const u32 ar9300_2p2_radio_postam
|
||||
|
||||
static const u32 ar9300Modes_lowest_ob_db_tx_gain_table_2p2[][5] = {
|
||||
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
|
||||
- {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
|
||||
- {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
|
||||
- {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
|
||||
+ {0x0000a2dc, 0x00033800, 0x00033800, 0x00637800, 0x00637800},
|
||||
+ {0x0000a2e0, 0x0003c000, 0x0003c000, 0x03838000, 0x03838000},
|
||||
+ {0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03fc0000, 0x03fc0000},
|
||||
{0x0000a2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
|
||||
{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
@@ -56,21 +56,21 @@ static const u32 ar9300Modes_lowest_ob_d
|
||||
{0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24},
|
||||
{0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640},
|
||||
{0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
|
||||
- {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
|
||||
- {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
|
||||
- {0x0000a54c, 0x5c02486b, 0x5c02486b, 0x47001a83, 0x47001a83},
|
||||
- {0x0000a550, 0x61024a6c, 0x61024a6c, 0x4a001c84, 0x4a001c84},
|
||||
- {0x0000a554, 0x66026a6c, 0x66026a6c, 0x4e001ce3, 0x4e001ce3},
|
||||
- {0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x52001ce5, 0x52001ce5},
|
||||
- {0x0000a55c, 0x7002708c, 0x7002708c, 0x56001ce9, 0x56001ce9},
|
||||
- {0x0000a560, 0x7302b08a, 0x7302b08a, 0x5a001ceb, 0x5a001ceb},
|
||||
- {0x0000a564, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
- {0x0000a568, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
- {0x0000a56c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
- {0x0000a570, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
- {0x0000a574, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
- {0x0000a578, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
- {0x0000a57c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a544, 0x52022470, 0x52022470, 0x3f001861, 0x3f001861},
|
||||
+ {0x0000a548, 0x55022490, 0x55022490, 0x43001a81, 0x43001a81},
|
||||
+ {0x0000a54c, 0x59022492, 0x59022492, 0x47001a83, 0x47001a83},
|
||||
+ {0x0000a550, 0x5d022692, 0x5d022692, 0x4a001c84, 0x4a001c84},
|
||||
+ {0x0000a554, 0x61022892, 0x61022892, 0x4e001ce3, 0x4e001ce3},
|
||||
+ {0x0000a558, 0x65024890, 0x65024890, 0x52001ce5, 0x52001ce5},
|
||||
+ {0x0000a55c, 0x69024892, 0x69024892, 0x56001ce9, 0x56001ce9},
|
||||
+ {0x0000a560, 0x6e024c92, 0x6e024c92, 0x5a001ceb, 0x5a001ceb},
|
||||
+ {0x0000a564, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a568, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a56c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a570, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a574, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a578, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
+ {0x0000a57c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
|
||||
{0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
|
||||
{0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
|
||||
@@ -88,44 +88,44 @@ static const u32 ar9300Modes_lowest_ob_d
|
||||
{0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24},
|
||||
{0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640},
|
||||
{0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660},
|
||||
- {0x0000a5c4, 0x5382266c, 0x5382266c, 0x3f801861, 0x3f801861},
|
||||
- {0x0000a5c8, 0x5782286c, 0x5782286c, 0x43801a81, 0x43801a81},
|
||||
- {0x0000a5cc, 0x5c82486b, 0x5c82486b, 0x47801a83, 0x47801a83},
|
||||
- {0x0000a5d0, 0x61824a6c, 0x61824a6c, 0x4a801c84, 0x4a801c84},
|
||||
- {0x0000a5d4, 0x66826a6c, 0x66826a6c, 0x4e801ce3, 0x4e801ce3},
|
||||
- {0x0000a5d8, 0x6b826e6c, 0x6b826e6c, 0x52801ce5, 0x52801ce5},
|
||||
- {0x0000a5dc, 0x7082708c, 0x7082708c, 0x56801ce9, 0x56801ce9},
|
||||
- {0x0000a5e0, 0x7382b08a, 0x7382b08a, 0x5a801ceb, 0x5a801ceb},
|
||||
- {0x0000a5e4, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
- {0x0000a5e8, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
- {0x0000a5ec, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
- {0x0000a5f0, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
- {0x0000a5f4, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
- {0x0000a5f8, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
- {0x0000a5fc, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5c4, 0x52822470, 0x52822470, 0x3f801861, 0x3f801861},
|
||||
+ {0x0000a5c8, 0x55822490, 0x55822490, 0x43801a81, 0x43801a81},
|
||||
+ {0x0000a5cc, 0x59822492, 0x59822492, 0x47801a83, 0x47801a83},
|
||||
+ {0x0000a5d0, 0x5d822692, 0x5d822692, 0x4a801c84, 0x4a801c84},
|
||||
+ {0x0000a5d4, 0x61822892, 0x61822892, 0x4e801ce3, 0x4e801ce3},
|
||||
+ {0x0000a5d8, 0x65824890, 0x65824890, 0x52801ce5, 0x52801ce5},
|
||||
+ {0x0000a5dc, 0x69824892, 0x69824892, 0x56801ce9, 0x56801ce9},
|
||||
+ {0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x5a801ceb, 0x5a801ceb},
|
||||
+ {0x0000a5e4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5e8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5ec, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5f0, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5f4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5f8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
+ {0x0000a5fc, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},
|
||||
{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
- {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
|
||||
- {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
|
||||
- {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
|
||||
- {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
|
||||
- {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
|
||||
- {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
|
||||
- {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
|
||||
- {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
|
||||
- {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
|
||||
- {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
|
||||
- {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
|
||||
- {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
|
||||
- {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
|
||||
- {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
|
||||
+ {0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000},
|
||||
+ {0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501},
|
||||
+ {0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501},
|
||||
+ {0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03},
|
||||
+ {0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04},
|
||||
+ {0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04},
|
||||
+ {0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
|
||||
+ {0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
|
||||
+ {0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
|
||||
+ {0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
|
||||
+ {0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
|
||||
+ {0x0000b2dc, 0x00033800, 0x00033800, 0x00637800, 0x00637800},
|
||||
+ {0x0000b2e0, 0x0003c000, 0x0003c000, 0x03838000, 0x03838000},
|
||||
+ {0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03fc0000, 0x03fc0000},
|
||||
{0x0000b2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
- {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
|
||||
- {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
|
||||
- {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
|
||||
+ {0x0000c2dc, 0x00033800, 0x00033800, 0x00637800, 0x00637800},
|
||||
+ {0x0000c2e0, 0x0003c000, 0x0003c000, 0x03838000, 0x03838000},
|
||||
+ {0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03fc0000, 0x03fc0000},
|
||||
{0x0000c2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
|
||||
{0x00016048, 0x62480001, 0x62480001, 0x62480001, 0x62480001},
|
|
@ -1,89 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -838,7 +838,7 @@ static void ath_tx_sched_aggr(struct ath
|
||||
ath_tx_txqaddbuf(sc, txq, &bf_q);
|
||||
TX_STAT_INC(txq->axq_qnum, a_aggr);
|
||||
|
||||
- } while (txq->axq_depth < ATH_AGGR_MIN_QDEPTH &&
|
||||
+ } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH &&
|
||||
status != ATH_AGGR_BAW_CLOSED);
|
||||
}
|
||||
|
||||
@@ -999,6 +999,7 @@ struct ath_txq *ath_txq_setup(struct ath
|
||||
INIT_LIST_HEAD(&txq->axq_acq);
|
||||
spin_lock_init(&txq->axq_lock);
|
||||
txq->axq_depth = 0;
|
||||
+ txq->axq_ampdu_depth = 0;
|
||||
txq->axq_tx_inprogress = false;
|
||||
sc->tx.txqsetup |= 1<<qnum;
|
||||
|
||||
@@ -1068,6 +1069,12 @@ int ath_cabq_update(struct ath_softc *sc
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
|
||||
+{
|
||||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
||||
+ return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Drain a given TX queue (could be Beacon or Data)
|
||||
*
|
||||
@@ -1126,7 +1133,8 @@ void ath_draintxq(struct ath_softc *sc,
|
||||
}
|
||||
|
||||
txq->axq_depth--;
|
||||
-
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth--;
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
if (bf_isampdu(bf))
|
||||
@@ -1316,6 +1324,8 @@ static void ath_tx_txqaddbuf(struct ath_
|
||||
ath9k_hw_txstart(ah, txq->axq_qnum);
|
||||
}
|
||||
txq->axq_depth++;
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth++;
|
||||
}
|
||||
|
||||
static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid,
|
||||
@@ -1336,7 +1346,7 @@ static void ath_tx_send_ampdu(struct ath
|
||||
*/
|
||||
if (!list_empty(&tid->buf_q) || tid->paused ||
|
||||
!BAW_WITHIN(tid->seq_start, tid->baw_size, fi->seqno) ||
|
||||
- txctl->txq->axq_depth >= ATH_AGGR_MIN_QDEPTH) {
|
||||
+ txctl->txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) {
|
||||
/*
|
||||
* Add this frame to software queue for scheduling later
|
||||
* for aggregation.
|
||||
@@ -2040,6 +2050,9 @@ static void ath_tx_processq(struct ath_s
|
||||
txq->axq_tx_inprogress = false;
|
||||
if (bf_held)
|
||||
list_del(&bf_held->list);
|
||||
+
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth--;
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
if (bf_held)
|
||||
@@ -2168,6 +2181,8 @@ void ath_tx_edma_tasklet(struct ath_soft
|
||||
INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH);
|
||||
txq->axq_depth--;
|
||||
txq->axq_tx_inprogress = false;
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth--;
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
txok = !(txs.ts_status & ATH9K_TXERR_MASK);
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -187,6 +187,7 @@ struct ath_txq {
|
||||
struct list_head axq_q;
|
||||
spinlock_t axq_lock;
|
||||
u32 axq_depth;
|
||||
+ u32 axq_ampdu_depth;
|
||||
bool stopped;
|
||||
bool axq_tx_inprogress;
|
||||
struct list_head axq_acq;
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
@@ -202,6 +202,7 @@ void rt2x00pci_uninitialize(struct rt2x0
|
||||
@@ -209,6 +209,7 @@ void rt2x00pci_uninitialize(struct rt2x0
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize);
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
|||
/*
|
||||
* PCI driver handlers.
|
||||
*/
|
||||
@@ -381,6 +382,7 @@ int rt2x00pci_resume(struct pci_dev *pci
|
||||
@@ -388,6 +389,7 @@ int rt2x00pci_resume(struct pci_dev *pci
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_resume);
|
||||
#endif /* CONFIG_PM */
|
||||
|
|
|
@ -16,14 +16,14 @@ Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
|
|||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -592,6 +592,10 @@ static void rt2800pci_kill_tx_queue(stru
|
||||
return;
|
||||
}
|
||||
@@ -481,6 +481,10 @@ static void rt2800pci_disable_radio(stru
|
||||
|
||||
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001280);
|
||||
|
||||
+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
||||
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
|
||||
+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
||||
+
|
||||
rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, ®);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, (queue->qid == QID_AC_BE));
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, (queue->qid == QID_AC_BK));
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, 1);
|
||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, 1);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
@@ -270,8 +270,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
|
||||
@@ -277,8 +277,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
|
||||
|
||||
pci_set_master(pci_dev);
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -2540,10 +2545,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
@@ -2536,10 +2541,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
& ~B43_MACCTL_GPOUTSMSK);
|
||||
|
||||
b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK)
|
||||
|
@ -35,7 +35,7 @@
|
|||
if (dev->dev->bus->chip_id == 0x4301) {
|
||||
mask |= 0x0060;
|
||||
set |= 0x0060;
|
||||
@@ -5100,10 +5105,10 @@ static void b43_print_driverinfo(void)
|
||||
@@ -5096,10 +5101,10 @@ static void b43_print_driverinfo(void)
|
||||
feat_sdio = "S";
|
||||
#endif
|
||||
printk(KERN_INFO "Broadcom 43xx driver loaded "
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
b43-$(CONFIG_B43_PCMCIA) += pcmcia.o
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -1816,9 +1816,11 @@ static void b43_do_interrupt_thread(stru
|
||||
@@ -1812,9 +1812,11 @@ static void b43_do_interrupt_thread(stru
|
||||
dma_reason[4], dma_reason[5]);
|
||||
b43err(dev->wl, "This device does not support DMA "
|
||||
"on your system. It will now be switched to PIO.\n");
|
||||
|
|
Loading…
Reference in a new issue