mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-24 01:43:08 +02:00
mac80211: sync latest version from trunk - improves stability and performance
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@24678 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
6c4a15254a
commit
d250cd4ca7
@ -10,12 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||||||
|
|
||||||
PKG_NAME:=mac80211
|
PKG_NAME:=mac80211
|
||||||
|
|
||||||
PKG_VERSION:=2010-12-09
|
PKG_VERSION:=2010-12-16
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||||
# http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \
|
PKG_MD5SUM:=39196307aa67c1f19f498b570b994112
|
||||||
# http://wireless.kernel.org/download/compat-wireless-2.6
|
|
||||||
PKG_MD5SUM:=94b6eaaa2c8245d1b5d6b6f16b75a701
|
|
||||||
|
|
||||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
||||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||||
@ -43,7 +41,7 @@ endef
|
|||||||
define KernelPackage/cfg80211
|
define KernelPackage/cfg80211
|
||||||
$(call KernelPackage/mac80211/Default)
|
$(call KernelPackage/mac80211/Default)
|
||||||
TITLE:=cfg80211 - wireless configuration API
|
TITLE:=cfg80211 - wireless configuration API
|
||||||
DEPENDS+= +wireless-tools +iw @!LINUX_2_6_25 @!LINUX_2_4 +crda
|
DEPENDS+= +wireless-tools +iw +crda
|
||||||
ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
|
ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
|
||||||
FILES:= \
|
FILES:= \
|
||||||
$(PKG_BUILD_DIR)/compat/compat.ko \
|
$(PKG_BUILD_DIR)/compat/compat.ko \
|
||||||
@ -577,6 +575,55 @@ define KernelPackage/net-ipw2200/description
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes
|
||||||
|
$(call KernelPackage/mac80211/Default)
|
||||||
|
TITLE:=Hermes 802.11b chipset support
|
||||||
|
DEPENDS:=@PCI_SUPPORT||PCMCIA_SUPPORT +kmod-cfg80211
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco.ko
|
||||||
|
AUTOLOAD:=$(call AutoLoad,50,orinoco)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes/description
|
||||||
|
Kernel support for Hermes 802.11b chipsets
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes-pci
|
||||||
|
$(call KernelPackage/mac80211/Default)
|
||||||
|
TITLE:=Intersil Prism 2.5 PCI support
|
||||||
|
DEPENDS:=@PCI_SUPPORT +kmod-net-hermes +kmod-cfg80211
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_pci.ko
|
||||||
|
AUTOLOAD:=$(call AutoLoad,55,orinoco_pci)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes-pci/description
|
||||||
|
Kernel modules for Intersil Prism 2.5 PCI support
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes-plx
|
||||||
|
$(call KernelPackage/mac80211/Default)
|
||||||
|
TITLE:=PLX9052 based PCI adaptor
|
||||||
|
DEPENDS:=@PCI_SUPPORT +kmod-net-hermes +kmod-cfg80211
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_plx.ko
|
||||||
|
AUTOLOAD:=$(call AutoLoad,55,orinoco_plx)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes-plx/description
|
||||||
|
Kernel modules for Hermes in PLX9052 based PCI adaptors
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes-pcmcia
|
||||||
|
$(call KernelPackage/mac80211/Default)
|
||||||
|
TITLE:=Hermes based PCMCIA adaptors
|
||||||
|
DEPENDS:=@PCMCIA_SUPPORT +kmod-net-hermes +kmod-cfg80211 @BROKEN
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_cs.ko
|
||||||
|
AUTOLOAD:=$(call AutoLoad,55,orinoco_cs)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/net-hermes-pcmcia/description
|
||||||
|
Kernel modules for Hermes based PCMCIA adaptors
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
define KernelPackage/mwl8k
|
define KernelPackage/mwl8k
|
||||||
$(call KernelPackage/mac80211/Default)
|
$(call KernelPackage/mac80211/Default)
|
||||||
TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards
|
TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards
|
||||||
@ -924,7 +971,17 @@ MAKE_OPTS:= \
|
|||||||
CONFIG_AT76C50X_USB= \
|
CONFIG_AT76C50X_USB= \
|
||||||
CONFIG_WL12XX= \
|
CONFIG_WL12XX= \
|
||||||
CONFIG_EEPROM_93CX6= \
|
CONFIG_EEPROM_93CX6= \
|
||||||
CONFIG_HERMES= \
|
CONFIG_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes),m) \
|
||||||
|
CONFIG_HERMES_CACHE_FW_ON_INIT= \
|
||||||
|
CONFIG_PCI_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-pci),m) \
|
||||||
|
CONFIG_PLX_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-plx),m) \
|
||||||
|
CONFIG_PCMCIA_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-pcmcia),m) \
|
||||||
|
CONFIG_HERMES_PRISM= \
|
||||||
|
CONFIG_APPLE_AIRPORT= \
|
||||||
|
CONFIG_TMD_HERMES= \
|
||||||
|
CONFIG_NORTEL_HERMES= \
|
||||||
|
CONFIG_PCMCIA_SPECTRUM= \
|
||||||
|
CONFIG_ORINOCO_USB= \
|
||||||
CONFIG_AR9170_USB=$(if $(CONFIG_PACKAGE_kmod-ar9170),m) \
|
CONFIG_AR9170_USB=$(if $(CONFIG_PACKAGE_kmod-ar9170),m) \
|
||||||
CONFIG_AR9170_LEDS=$(CONFIG_LEDS_TRIGGERS) \
|
CONFIG_AR9170_LEDS=$(CONFIG_LEDS_TRIGGERS) \
|
||||||
CONFIG_IWM= \
|
CONFIG_IWM= \
|
||||||
@ -1129,3 +1186,7 @@ $(eval $(call KernelPackage,net-libipw))
|
|||||||
$(eval $(call KernelPackage,net-ipw2100))
|
$(eval $(call KernelPackage,net-ipw2100))
|
||||||
$(eval $(call KernelPackage,net-ipw2200))
|
$(eval $(call KernelPackage,net-ipw2200))
|
||||||
$(eval $(call KernelPackage,mwl8k))
|
$(eval $(call KernelPackage,mwl8k))
|
||||||
|
$(eval $(call KernelPackage,net-hermes))
|
||||||
|
$(eval $(call KernelPackage,net-hermes-pci))
|
||||||
|
$(eval $(call KernelPackage,net-hermes-plx))
|
||||||
|
$(eval $(call KernelPackage,net-hermes-pcmcia))
|
||||||
|
@ -16,9 +16,9 @@
|
|||||||
-CONFIG_B43_LEDS=y
|
-CONFIG_B43_LEDS=y
|
||||||
+# CONFIG_B43_LEDS=y
|
+# CONFIG_B43_LEDS=y
|
||||||
CONFIG_B43_PHY_LP=y
|
CONFIG_B43_PHY_LP=y
|
||||||
CONFIG_B43_NPHY=y
|
CONFIG_B43_PHY_N=y
|
||||||
# CONFIG_B43_FORCE_PIO=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=m
|
||||||
CONFIG_B43LEGACY_HWRNG=y
|
CONFIG_B43LEGACY_HWRNG=y
|
||||||
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
endif #CONFIG_PCMCIA
|
endif #CONFIG_PCMCIA
|
||||||
# CONFIG_B43_LEDS=y
|
# CONFIG_B43_LEDS=y
|
||||||
CONFIG_B43_PHY_LP=y
|
CONFIG_B43_PHY_LP=y
|
||||||
-CONFIG_B43_NPHY=y
|
-CONFIG_B43_PHY_N=y
|
||||||
+# CONFIG_B43_NPHY is not set
|
+# CONFIG_B43_PHY_N=y
|
||||||
# CONFIG_B43_FORCE_PIO=y
|
# CONFIG_B43_FORCE_PIO=y
|
||||||
# CONFIG_B43_DEBUG=y
|
# CONFIG_B43_DEBUG=y
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
err:
|
err:
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
+++ b/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 initPDADC;
|
||||||
int PDADCdelta;
|
int PDADCdelta;
|
||||||
u8 led_pin;
|
u8 led_pin;
|
||||||
@ -47,7 +47,7 @@
|
|||||||
bool ath9k_hw_check_alive(struct ath_hw *ah)
|
bool ath9k_hw_check_alive(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
int count = 50;
|
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))
|
if (AR_SREV_9300_20_OR_LATER(ah))
|
||||||
ar9003_hw_bb_watchdog_config(ah);
|
ar9003_hw_bb_watchdog_config(ah);
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
priv_ops->do_getnf = ar5008_hw_do_getnf;
|
priv_ops->do_getnf = ar5008_hw_do_getnf;
|
||||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||||
+++ b/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);
|
REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +58,7 @@
|
|||||||
static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value)
|
static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value)
|
||||||
{
|
{
|
||||||
u32 v = REG_READ(ah, AR_PHY_CCK_DETECT);
|
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->set_delta_slope = ar9003_hw_set_delta_slope;
|
||||||
priv_ops->rfbus_req = ar9003_hw_rfbus_req;
|
priv_ops->rfbus_req = ar9003_hw_rfbus_req;
|
||||||
priv_ops->rfbus_done = ar9003_hw_rfbus_done;
|
priv_ops->rfbus_done = ar9003_hw_rfbus_done;
|
||||||
@ -66,6 +66,16 @@
|
|||||||
priv_ops->set_diversity = ar9003_hw_set_diversity;
|
priv_ops->set_diversity = ar9003_hw_set_diversity;
|
||||||
priv_ops->ani_control = ar9003_hw_ani_control;
|
priv_ops->ani_control = ar9003_hw_ani_control;
|
||||||
priv_ops->do_getnf = ar9003_hw_do_getnf;
|
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
|
--- a/drivers/net/wireless/ath/ath9k/hw-ops.h
|
||||||
+++ b/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
|
@@ -223,11 +223,6 @@ static inline void ath9k_hw_rfbus_done(s
|
||||||
@ -82,7 +92,7 @@
|
|||||||
if (!ath9k_hw_private_ops(ah)->restore_chainmask)
|
if (!ath9k_hw_private_ops(ah)->restore_chainmask)
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
@@ -1402,7 +1402,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);
|
ath9k_hw_init_qos(ah);
|
||||||
|
|
||||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
|
if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
|
||||||
@ -93,7 +103,7 @@
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
@@ -581,7 +581,6 @@ struct ath_hw_private_ops {
|
@@ -576,7 +576,6 @@ struct ath_hw_private_ops {
|
||||||
void (*set_delta_slope)(struct ath_hw *ah, struct ath9k_channel *chan);
|
void (*set_delta_slope)(struct ath_hw *ah, struct ath9k_channel *chan);
|
||||||
bool (*rfbus_req)(struct ath_hw *ah);
|
bool (*rfbus_req)(struct ath_hw *ah);
|
||||||
void (*rfbus_done)(struct ath_hw *ah);
|
void (*rfbus_done)(struct ath_hw *ah);
|
||||||
@ -101,3 +111,82 @@
|
|||||||
void (*restore_chainmask)(struct ath_hw *ah);
|
void (*restore_chainmask)(struct ath_hw *ah);
|
||||||
void (*set_diversity)(struct ath_hw *ah, bool value);
|
void (*set_diversity)(struct ath_hw *ah, bool value);
|
||||||
u32 (*compute_pll_control)(struct ath_hw *ah,
|
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);
|
|
||||||
}
|
|
||||||
|
|
@ -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();
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/regd.c
|
|
||||||
+++ b/drivers/net/wireless/ath/regd.c
|
|
||||||
@@ -342,6 +342,14 @@ int ath_reg_notifier_apply(struct wiphy
|
|
||||||
/* We always apply this */
|
|
||||||
ath_reg_apply_radar_flags(wiphy);
|
|
||||||
|
|
||||||
+ /*
|
|
||||||
+ * This would happen when we have sent a custom regulatory request
|
|
||||||
+ * a world regulatory domain and the scheduler hasn't yet processed
|
|
||||||
+ * any pending requests in the queue.
|
|
||||||
+ */
|
|
||||||
+ if (!request)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
switch (request->initiator) {
|
|
||||||
case NL80211_REGDOM_SET_BY_DRIVER:
|
|
||||||
case NL80211_REGDOM_SET_BY_CORE:
|
|
||||||
--- a/include/net/cfg80211.h
|
|
||||||
+++ b/include/net/cfg80211.h
|
|
||||||
@@ -1417,7 +1417,9 @@ struct ieee80211_txrx_stypes {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct wiphy - wireless hardware description
|
|
||||||
- * @reg_notifier: the driver's regulatory notification callback
|
|
||||||
+ * @reg_notifier: the driver's regulatory notification callback,
|
|
||||||
+ * note that if your driver uses wiphy_apply_custom_regulatory()
|
|
||||||
+ * the reg_notifier's request can be passed as NULL
|
|
||||||
* @regd: the driver's regulatory domain, if one was requested via
|
|
||||||
* the regulatory_hint() API. This can be used by the driver
|
|
||||||
* on the reg_notifier() if it chooses to ignore future
|
|
||||||
--- a/net/wireless/reg.c
|
|
||||||
+++ b/net/wireless/reg.c
|
|
||||||
@@ -662,7 +662,8 @@ static int freq_reg_info_regd(struct wip
|
|
||||||
* Follow the driver's regulatory domain, if present, unless a country
|
|
||||||
* IE has been processed or a user wants to help complaince further
|
|
||||||
*/
|
|
||||||
- if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
|
|
||||||
+ if (!custom_regd &&
|
|
||||||
+ last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
|
|
||||||
last_request->initiator != NL80211_REGDOM_SET_BY_USER &&
|
|
||||||
wiphy->regd)
|
|
||||||
regd = wiphy->regd;
|
|
@ -8,7 +8,7 @@
|
|||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
@@ -436,8 +437,16 @@ static int ath9k_hw_init_macaddr(struct
|
@@ -428,8 +429,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||||
common->macaddr[2 * i] = eeval >> 8;
|
common->macaddr[2 * i] = eeval >> 8;
|
||||||
common->macaddr[2 * i + 1] = eeval & 0xff;
|
common->macaddr[2 * i + 1] = eeval & 0xff;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#include "ath9k.h"
|
#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,
|
static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
|
||||||
const struct ath_bus_ops *bus_ops)
|
const struct ath_bus_ops *bus_ops)
|
||||||
{
|
{
|
||||||
@ -26,7 +26,7 @@
|
|||||||
struct ath_hw *ah = NULL;
|
struct ath_hw *ah = NULL;
|
||||||
struct ath_common *common;
|
struct ath_common *common;
|
||||||
int ret = 0, i;
|
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;
|
ah->hw_version.subsysid = subsysid;
|
||||||
sc->sc_ah = ah;
|
sc->sc_ah = ah;
|
||||||
|
|
||||||
@ -35,7 +35,7 @@
|
|||||||
ah->ah_flags |= AH_USE_EEPROM;
|
ah->ah_flags |= AH_USE_EEPROM;
|
||||||
|
|
||||||
common = ath9k_hw_common(ah);
|
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)
|
if (ret)
|
||||||
goto err_hw;
|
goto err_hw;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/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;
|
ah->hw_version.subsysid = subsysid;
|
||||||
sc->sc_ah = ah;
|
sc->sc_ah = ah;
|
||||||
|
|
||||||
@ -18,7 +18,7 @@
|
|||||||
common->ops = &ath9k_common_ops;
|
common->ops = &ath9k_common_ops;
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
@@ -794,7 +794,7 @@ struct ath_hw {
|
@@ -786,7 +786,7 @@ struct ath_hw {
|
||||||
u32 originalGain[22];
|
u32 originalGain[22];
|
||||||
int initPDADC;
|
int initPDADC;
|
||||||
int PDADCdelta;
|
int PDADCdelta;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
+++ b/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_DEF 1
|
||||||
#define ATH_LED_PIN_9287 8
|
#define ATH_LED_PIN_9287 8
|
||||||
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
/* Antenna diversity/combining */
|
/* Antenna diversity/combining */
|
||||||
#define ATH_ANT_RX_CURRENT_SHIFT 4
|
#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 ath_beacon beacon;
|
||||||
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
||||||
|
|
||||||
@ -253,7 +253,7 @@
|
|||||||
/* Rfkill */
|
/* Rfkill */
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
+++ b/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;
|
aphy->state = ATH_WIPHY_INACTIVE;
|
||||||
|
|
||||||
@ -265,7 +265,7 @@
|
|||||||
cancel_work_sync(&sc->hw_check_work);
|
cancel_work_sync(&sc->hw_check_work);
|
||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/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),
|
RATE(540, 0x0c, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -287,14 +287,15 @@
|
|||||||
static void ath9k_deinit_softc(struct ath_softc *sc);
|
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);
|
ath9k_init_txpower_limits(sc);
|
||||||
|
|
||||||
+#ifdef CONFIG_MAC80211_LEDS
|
+#ifdef CONFIG_MAC80211_LEDS
|
||||||
+ /* must be initialized before ieee80211_register_hw */
|
+ /* must be initialized before ieee80211_register_hw */
|
||||||
+ sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->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
|
+#endif
|
||||||
+
|
+
|
||||||
/* Register with mac80211 */
|
/* 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
|
|
||||||
@@ -417,7 +417,7 @@ static void ath9k_hw_init_defaults(struc
|
|
||||||
AR_STA_ID1_MCAST_KSRCH;
|
|
||||||
ah->beacon_interval = 100;
|
|
||||||
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
|
|
||||||
@@ -813,7 +813,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)
|
|
@ -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/ath/ath9k/ath9k.h
|
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
@@ -662,7 +662,6 @@ void ath9k_deinit_device(struct ath_soft
|
@@ -665,7 +665,6 @@ void ath9k_deinit_device(struct ath_soft
|
||||||
void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw);
|
void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw);
|
||||||
void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
|
void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
|
||||||
struct ath9k_channel *ichan);
|
struct ath9k_channel *ichan);
|
||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
@@ -522,32 +522,6 @@ set_timer:
|
@@ -538,32 +538,6 @@ set_timer:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@
|
|||||||
static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta)
|
static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta)
|
||||||
{
|
{
|
||||||
struct ath_node *an;
|
struct ath_node *an;
|
||||||
@@ -1609,8 +1583,6 @@ static int ath9k_config(struct ieee80211
|
@@ -1676,8 +1650,6 @@ static int ath9k_config(struct ieee80211
|
||||||
/* XXX: remove me eventualy */
|
/* XXX: remove me eventualy */
|
||||||
ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
|
ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
|
||||||
|
|
||||||
@ -52,7 +52,7 @@
|
|||||||
/* update survey stats for the old channel before switching */
|
/* update survey stats for the old channel before switching */
|
||||||
spin_lock_irqsave(&common->cc_lock, flags);
|
spin_lock_irqsave(&common->cc_lock, flags);
|
||||||
ath_update_survey_stats(sc);
|
ath_update_survey_stats(sc);
|
||||||
@@ -1842,10 +1814,6 @@ static void ath9k_bss_info_changed(struc
|
@@ -1909,10 +1881,6 @@ static void ath9k_bss_info_changed(struc
|
||||||
/* Set aggregation protection mode parameters */
|
/* Set aggregation protection mode parameters */
|
||||||
sc->config.ath_aggr_prot = 0;
|
sc->config.ath_aggr_prot = 0;
|
||||||
|
|
14
package/mac80211/patches/540-mac80211_tx_optimization.patch
Normal file
14
package/mac80211/patches/540-mac80211_tx_optimization.patch
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
--- a/net/mac80211/tx.c
|
||||||
|
+++ b/net/mac80211/tx.c
|
||||||
|
@@ -1549,8 +1549,10 @@ static int ieee80211_skb_resize(struct i
|
||||||
|
|
||||||
|
if (skb_header_cloned(skb))
|
||||||
|
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
|
||||||
|
- else
|
||||||
|
+ else if (head_need || tail_need)
|
||||||
|
I802_DEBUG_INC(local->tx_expand_skb_head);
|
||||||
|
+ else
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
if (pskb_expand_head(skb, head_need, tail_need, GFP_ATOMIC)) {
|
||||||
|
wiphy_debug(local->hw.wiphy,
|
@ -0,0 +1,19 @@
|
|||||||
|
--- a/net/mac80211/tx.c
|
||||||
|
+++ b/net/mac80211/tx.c
|
||||||
|
@@ -1748,7 +1748,7 @@ netdev_tx_t ieee80211_subif_start_xmit(s
|
||||||
|
{
|
||||||
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
+ struct ieee80211_tx_info *info;
|
||||||
|
int ret = NETDEV_TX_BUSY, head_need;
|
||||||
|
u16 ethertype, hdrlen, meshhdrlen = 0;
|
||||||
|
__le16 fc;
|
||||||
|
@@ -2039,6 +2039,7 @@ netdev_tx_t ieee80211_subif_start_xmit(s
|
||||||
|
skb_set_network_header(skb, nh_pos);
|
||||||
|
skb_set_transport_header(skb, h_pos);
|
||||||
|
|
||||||
|
+ info = IEEE80211_SKB_CB(skb);
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
|
dev->trans_start = jiffies;
|
@ -0,0 +1,11 @@
|
|||||||
|
--- a/net/mac80211/tx.c
|
||||||
|
+++ b/net/mac80211/tx.c
|
||||||
|
@@ -1943,7 +1943,7 @@ netdev_tx_t ieee80211_subif_start_xmit(s
|
||||||
|
*/
|
||||||
|
if (skb_shared(skb)) {
|
||||||
|
tmp_skb = skb;
|
||||||
|
- skb = skb_copy(skb, GFP_ATOMIC);
|
||||||
|
+ skb = skb_clone(skb, GFP_ATOMIC);
|
||||||
|
kfree_skb(tmp_skb);
|
||||||
|
|
||||||
|
if (!skb) {
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||||
+++ b/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);
|
EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize);
|
||||||
|
|
||||||
@ -8,7 +8,7 @@
|
|||||||
/*
|
/*
|
||||||
* PCI driver handlers.
|
* 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);
|
EXPORT_SYMBOL_GPL(rt2x00pci_resume);
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
@ -16,14 +16,14 @@ Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||||
@@ -592,6 +592,10 @@ static void rt2800pci_kill_tx_queue(stru
|
@@ -481,6 +481,10 @@ static void rt2800pci_disable_radio(stru
|
||||||
return;
|
|
||||||
}
|
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001280);
|
||||||
|
|
||||||
+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
||||||
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
|
||||||
+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
||||||
+
|
+
|
||||||
rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, ®);
|
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_IDX0, 1);
|
||||||
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, (queue->qid == QID_AC_BK));
|
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, 1);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||||
+++ b/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);
|
pci_set_master(pci_dev);
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
static int modparam_bad_frames_preempt;
|
static int modparam_bad_frames_preempt;
|
||||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||||
MODULE_PARM_DESC(bad_frames_preempt,
|
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_MACCTL_GPOUTSMSK);
|
||||||
|
|
||||||
b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK)
|
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) {
|
if (dev->dev->bus->chip_id == 0x4301) {
|
||||||
mask |= 0x0060;
|
mask |= 0x0060;
|
||||||
set |= 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";
|
feat_sdio = "S";
|
||||||
#endif
|
#endif
|
||||||
printk(KERN_INFO "Broadcom 43xx driver loaded "
|
printk(KERN_INFO "Broadcom 43xx driver loaded "
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
b43-$(CONFIG_B43_PCMCIA) += pcmcia.o
|
b43-$(CONFIG_B43_PCMCIA) += pcmcia.o
|
||||||
--- a/drivers/net/wireless/b43/main.c
|
--- a/drivers/net/wireless/b43/main.c
|
||||||
+++ b/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]);
|
dma_reason[4], dma_reason[5]);
|
||||||
b43err(dev->wl, "This device does not support DMA "
|
b43err(dev->wl, "This device does not support DMA "
|
||||||
"on your system. It will now be switched to PIO.\n");
|
"on your system. It will now be switched to PIO.\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user