mac80211: update to wireless-testing 2014-03-31
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 40393
This commit is contained in:
parent
c821836395
commit
4e155c80d3
57 changed files with 231 additions and 6494 deletions
|
@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2014-01-23.1
|
||||
PKG_RELEASE:=4
|
||||
PKG_VERSION:=2014-03-31
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_BACKPORT_VERSION:=
|
||||
PKG_MD5SUM:=8db16edbdaf4abc2e9c2f3b6c86736a6
|
||||
PKG_MD5SUM:=8b5cf82d6defc5867511014af4afc0b6
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||
|
|
|
@ -18,8 +18,8 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|||
|
||||
--- a/backport-include/backport/leds-disabled.h
|
||||
+++ b/backport-include/backport/leds-disabled.h
|
||||
@@ -163,6 +163,19 @@ static inline void led_trigger_event(str
|
||||
enum led_brightness event)
|
||||
@@ -176,6 +176,19 @@ static inline void led_trigger_blink_one
|
||||
int invert)
|
||||
{
|
||||
}
|
||||
+
|
||||
|
|
|
@ -32,10 +32,10 @@ Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
|
|||
+ units = $7
|
||||
sub(/\)/, "", units)
|
||||
sub(/,/, "", units)
|
||||
if (units == "mW") {
|
||||
@@ -80,7 +77,7 @@ function parse_reg_rule()
|
||||
}
|
||||
}
|
||||
dfs_cac = $9
|
||||
@@ -86,7 +83,7 @@ function parse_reg_rule()
|
||||
sub(/\(/, "", dfs_cac)
|
||||
sub(/\)/, "", dfs_cac)
|
||||
flagstr = ""
|
||||
- for (i=8; i<=NF; i++)
|
||||
+ for (i=7; i<=NF; i++)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -379,42 +379,6 @@ USB_CDC_PHONET=
|
||||
@@ -402,42 +402,6 @@ USB_CDC_PHONET=
|
||||
USB_IPHETH=
|
||||
USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
|
|
|
@ -1,3 +1,104 @@
|
|||
--- a/net/mac80211/wpa.c
|
||||
+++ b/net/mac80211/wpa.c
|
||||
@@ -301,15 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
|
||||
}
|
||||
|
||||
|
||||
-static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad)
|
||||
+static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
|
||||
+ int encrypted)
|
||||
{
|
||||
__le16 mask_fc;
|
||||
int a4_included, mgmt;
|
||||
u8 qos_tid;
|
||||
- u16 len_a;
|
||||
+ u8 *b_0, *aad;
|
||||
+ u16 data_len, len_a;
|
||||
unsigned int hdrlen;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
+ memset(scratch, 0, 6 * AES_BLOCK_SIZE);
|
||||
+
|
||||
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
|
||||
+ aad = scratch + 4 * AES_BLOCK_SIZE;
|
||||
+
|
||||
/*
|
||||
* Mask FC: zero subtype b4 b5 b6 (if not mgmt)
|
||||
* Retry, PwrMgt, MoreData; set Protected
|
||||
@@ -331,21 +338,20 @@ static void ccmp_special_blocks(struct s
|
||||
else
|
||||
qos_tid = 0;
|
||||
|
||||
- /* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
|
||||
- * mode authentication are not allowed to collide, yet both are derived
|
||||
- * from this vector b_0. We only set L := 1 here to indicate that the
|
||||
- * data size can be represented in (L+1) bytes. The CCM layer will take
|
||||
- * care of storing the data length in the top (L+1) bytes and setting
|
||||
- * and clearing the other bits as is required to derive the two IVs.
|
||||
- */
|
||||
- b_0[0] = 0x1;
|
||||
+ data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN;
|
||||
+ if (encrypted)
|
||||
+ data_len -= IEEE80211_CCMP_MIC_LEN;
|
||||
|
||||
+ /* First block, b_0 */
|
||||
+ b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
|
||||
/* Nonce: Nonce Flags | A2 | PN
|
||||
* Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
|
||||
*/
|
||||
b_0[1] = qos_tid | (mgmt << 4);
|
||||
memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
|
||||
memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
|
||||
+ /* l(m) */
|
||||
+ put_unaligned_be16(data_len, &b_0[14]);
|
||||
|
||||
/* AAD (extra authenticate-only data) / masked 802.11 header
|
||||
* FC | A1 | A2 | A3 | SC | [A4] | [QC] */
|
||||
@@ -401,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8
|
||||
u8 *pos;
|
||||
u8 pn[6];
|
||||
u64 pn64;
|
||||
- u8 aad[2 * AES_BLOCK_SIZE];
|
||||
- u8 b_0[AES_BLOCK_SIZE];
|
||||
+ u8 scratch[6 * AES_BLOCK_SIZE];
|
||||
|
||||
if (info->control.hw_key &&
|
||||
!(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
|
||||
@@ -455,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8
|
||||
return 0;
|
||||
|
||||
pos += IEEE80211_CCMP_HDR_LEN;
|
||||
- ccmp_special_blocks(skb, pn, b_0, aad);
|
||||
- ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
|
||||
- skb_put(skb, IEEE80211_CCMP_MIC_LEN));
|
||||
+ ccmp_special_blocks(skb, pn, scratch, 0);
|
||||
+ ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len,
|
||||
+ pos, skb_put(skb, IEEE80211_CCMP_MIC_LEN));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -520,16 +525,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
|
||||
}
|
||||
|
||||
if (!(status->flag & RX_FLAG_DECRYPTED)) {
|
||||
- u8 aad[2 * AES_BLOCK_SIZE];
|
||||
- u8 b_0[AES_BLOCK_SIZE];
|
||||
+ u8 scratch[6 * AES_BLOCK_SIZE];
|
||||
/* hardware didn't decrypt/verify MIC */
|
||||
- ccmp_special_blocks(skb, pn, b_0, aad);
|
||||
+ ccmp_special_blocks(skb, pn, scratch, 1);
|
||||
|
||||
if (ieee80211_aes_ccm_decrypt(
|
||||
- key->u.ccmp.tfm, b_0, aad,
|
||||
+ key->u.ccmp.tfm, scratch,
|
||||
skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
|
||||
data_len,
|
||||
- skb->data + skb->len - IEEE80211_CCMP_MIC_LEN))
|
||||
+ skb->data + skb->len - IEEE80211_CCMP_MIC_LEN,
|
||||
+ skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN))
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
||||
--- a/net/mac80211/Kconfig
|
||||
+++ b/net/mac80211/Kconfig
|
||||
@@ -5,7 +5,6 @@ config MAC80211
|
||||
|
@ -244,104 +345,3 @@
|
|||
u32 replays; /* dot11RSNAStatsCCMPReplays */
|
||||
} ccmp;
|
||||
struct {
|
||||
--- a/net/mac80211/wpa.c
|
||||
+++ b/net/mac80211/wpa.c
|
||||
@@ -301,16 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
|
||||
}
|
||||
|
||||
|
||||
-static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
|
||||
+static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
|
||||
int encrypted)
|
||||
{
|
||||
__le16 mask_fc;
|
||||
int a4_included, mgmt;
|
||||
u8 qos_tid;
|
||||
- u16 len_a;
|
||||
+ u8 *b_0, *aad;
|
||||
+ u16 data_len, len_a;
|
||||
unsigned int hdrlen;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
+ memset(scratch, 0, 6 * AES_BLOCK_SIZE);
|
||||
+
|
||||
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
|
||||
+ aad = scratch + 4 * AES_BLOCK_SIZE;
|
||||
+
|
||||
/*
|
||||
* Mask FC: zero subtype b4 b5 b6 (if not mgmt)
|
||||
* Retry, PwrMgt, MoreData; set Protected
|
||||
@@ -332,21 +338,20 @@ static void ccmp_special_blocks(struct s
|
||||
else
|
||||
qos_tid = 0;
|
||||
|
||||
- /* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
|
||||
- * mode authentication are not allowed to collide, yet both are derived
|
||||
- * from this vector b_0. We only set L := 1 here to indicate that the
|
||||
- * data size can be represented in (L+1) bytes. The CCM layer will take
|
||||
- * care of storing the data length in the top (L+1) bytes and setting
|
||||
- * and clearing the other bits as is required to derive the two IVs.
|
||||
- */
|
||||
- b_0[0] = 0x1;
|
||||
+ data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN;
|
||||
+ if (encrypted)
|
||||
+ data_len -= IEEE80211_CCMP_MIC_LEN;
|
||||
|
||||
+ /* First block, b_0 */
|
||||
+ b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
|
||||
/* Nonce: Nonce Flags | A2 | PN
|
||||
* Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
|
||||
*/
|
||||
b_0[1] = qos_tid | (mgmt << 4);
|
||||
memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
|
||||
memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
|
||||
+ /* l(m) */
|
||||
+ put_unaligned_be16(data_len, &b_0[14]);
|
||||
|
||||
/* AAD (extra authenticate-only data) / masked 802.11 header
|
||||
* FC | A1 | A2 | A3 | SC | [A4] | [QC] */
|
||||
@@ -402,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8
|
||||
u8 *pos;
|
||||
u8 pn[6];
|
||||
u64 pn64;
|
||||
- u8 aad[2 * AES_BLOCK_SIZE];
|
||||
- u8 b_0[AES_BLOCK_SIZE];
|
||||
+ u8 scratch[6 * AES_BLOCK_SIZE];
|
||||
|
||||
if (info->control.hw_key &&
|
||||
!(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
|
||||
@@ -456,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8
|
||||
return 0;
|
||||
|
||||
pos += IEEE80211_CCMP_HDR_LEN;
|
||||
- ccmp_special_blocks(skb, pn, b_0, aad, 0);
|
||||
- ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
|
||||
- skb_put(skb, IEEE80211_CCMP_MIC_LEN));
|
||||
+ ccmp_special_blocks(skb, pn, scratch, 0);
|
||||
+ ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len,
|
||||
+ pos, skb_put(skb, IEEE80211_CCMP_MIC_LEN));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -521,16 +525,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
|
||||
}
|
||||
|
||||
if (!(status->flag & RX_FLAG_DECRYPTED)) {
|
||||
- u8 aad[2 * AES_BLOCK_SIZE];
|
||||
- u8 b_0[AES_BLOCK_SIZE];
|
||||
+ u8 scratch[6 * AES_BLOCK_SIZE];
|
||||
/* hardware didn't decrypt/verify MIC */
|
||||
- ccmp_special_blocks(skb, pn, b_0, aad, 1);
|
||||
+ ccmp_special_blocks(skb, pn, scratch, 1);
|
||||
|
||||
if (ieee80211_aes_ccm_decrypt(
|
||||
- key->u.ccmp.tfm, b_0, aad,
|
||||
+ key->u.ccmp.tfm, scratch,
|
||||
skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
|
||||
data_len,
|
||||
- skb->data + skb->len - IEEE80211_CCMP_MIC_LEN))
|
||||
+ skb->data + skb->len - IEEE80211_CCMP_MIC_LEN,
|
||||
+ skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN))
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
static int ieee80211_ifa6_changed(struct notifier_block *nb,
|
||||
unsigned long data, void *arg)
|
||||
{
|
||||
@@ -1031,14 +1031,14 @@ int ieee80211_register_hw(struct ieee802
|
||||
@@ -1036,14 +1036,14 @@ int ieee80211_register_hw(struct ieee802
|
||||
goto fail_pm_qos;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
|
||||
result = register_inet6addr_notifier(&local->ifa6_notifier);
|
||||
if (result)
|
||||
@@ -1047,13 +1047,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
@@ -1052,13 +1052,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -52,7 +52,7 @@
|
|||
fail_ifa:
|
||||
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
@@ -1086,10 +1086,10 @@ void ieee80211_unregister_hw(struct ieee
|
||||
@@ -1103,10 +1103,10 @@ void ieee80211_unregister_hw(struct ieee
|
||||
|
||||
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2148,7 +2148,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
@@ -2154,7 +2154,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
* the frames sent while scanning on other channel will be
|
||||
* lost)
|
||||
*/
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
ccflags-y += -D__CHECK_ENDIAN__
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -282,13 +282,6 @@ void _ath_dbg(struct ath_common *common,
|
||||
@@ -295,13 +295,6 @@ void _ath_dbg(struct ath_common *common,
|
||||
#endif /* CPTCFG_ATH_DEBUG */
|
||||
|
||||
/** Returns string describing opmode, or NULL if unknown mode. */
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <asm/unaligned.h>
|
||||
|
||||
#include "hw.h"
|
||||
@@ -449,8 +450,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||
@@ -448,8 +449,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||
common->macaddr[2 * i] = eeval >> 8;
|
||||
common->macaddr[2 * i + 1] = eeval & 0xff;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
---help---
|
||||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -119,6 +119,7 @@ RTL8187_LEDS=
|
||||
@@ -120,6 +120,7 @@ RTL8187_LEDS=
|
||||
ATH_COMMON=
|
||||
ATH_CARDS=
|
||||
ATH_DEBUG=
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -1878,6 +1878,8 @@ void regulatory_hint_country_ie(struct w
|
||||
@@ -2000,6 +2000,8 @@ void regulatory_hint_country_ie(struct w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -2072,6 +2074,7 @@ static void restore_regulatory_settings(
|
||||
@@ -2194,6 +2196,7 @@ static void restore_regulatory_settings(
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -866,6 +866,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -652,6 +652,7 @@ static const struct ieee80211_iface_limi
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
goto end;
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -1934,7 +1934,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
@@ -1937,7 +1937,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
|
||||
|
@ -27,7 +27,7 @@
|
|||
ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||
u32 tsftu = TSF_TO_TU(tsf);
|
||||
@@ -2020,7 +2020,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
@@ -2023,7 +2023,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
|
||||
intval = ah->bintval & AR5K_BEACON_PERIOD;
|
||||
if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
|
||||
|
@ -36,7 +36,7 @@
|
|||
intval /= ATH_BCBUF; /* staggered multi-bss beacons */
|
||||
if (intval < 15)
|
||||
ATH5K_WARN(ah, "intval %u is too low, min 15\n",
|
||||
@@ -2487,6 +2487,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -2490,6 +2490,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1481,6 +1481,53 @@ void ath9k_deinit_debug(struct ath_softc
|
||||
@@ -1485,6 +1485,53 @@ void ath9k_deinit_debug(struct ath_softc
|
||||
ath9k_spectral_deinit_debug(sc);
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1500,6 +1547,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1504,6 +1551,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
ath9k_tx99_init_debug(sc);
|
||||
ath9k_spectral_init_debug(sc);
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
struct ath_ops reg_ops;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -722,6 +722,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -518,6 +518,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
ah->external_reset = pdata->external_reset;
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1112,23 +1112,23 @@ static int __init ath9k_init(void)
|
||||
goto err_out;
|
||||
}
|
||||
@@ -892,23 +892,23 @@ static int __init ath9k_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
- error = ath_pci_init();
|
||||
+ error = ath_ahb_init();
|
||||
if (error < 0) {
|
||||
- pr_err("No PCI devices found, driver not installed\n");
|
||||
error = -ENODEV;
|
||||
goto err_rate_unregister;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
- error = ath_ahb_init();
|
||||
|
@ -27,6 +27,6 @@
|
|||
- ath_pci_exit();
|
||||
+ err_ahb_exit:
|
||||
+ ath_ahb_exit();
|
||||
|
||||
err_rate_unregister:
|
||||
ath_rate_control_unregister();
|
||||
err_out:
|
||||
return error;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -359,13 +359,8 @@ static void ath9k_hw_init_config(struct
|
||||
@@ -358,13 +358,8 @@ static void ath9k_hw_init_config(struct
|
||||
|
||||
ah->config.rx_intr_mitigation = true;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -90,7 +90,7 @@ int ath_descdma_setup(struct ath_softc *
|
||||
@@ -89,7 +89,7 @@ int ath_descdma_setup(struct ath_softc *
|
||||
(_l) &= ((_sz) - 1); \
|
||||
} while (0)
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1528,6 +1528,52 @@ static const struct file_operations fops
|
||||
@@ -1532,6 +1532,52 @@ static const struct file_operations fops
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
+ return -EINVAL;
|
||||
+
|
||||
+ common->chan_bw = chan_bw;
|
||||
+ if (!test_bit(SC_OP_INVALID, &sc->sc_flags))
|
||||
+ if (!test_bit(ATH_OP_INVALID, &common->op_flags))
|
||||
+ ath9k_ops.config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
+
|
||||
+ return count;
|
||||
|
@ -53,7 +53,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1549,6 +1595,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1553,6 +1599,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
|
||||
debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_eeprom);
|
||||
|
@ -64,17 +64,17 @@
|
|||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -130,6 +130,7 @@ struct ath_common {
|
||||
struct ieee80211_hw *hw;
|
||||
@@ -140,6 +140,7 @@ struct ath_common {
|
||||
int debug_mask;
|
||||
enum ath_device_state state;
|
||||
unsigned long op_flags;
|
||||
+ u32 chan_bw;
|
||||
|
||||
struct ath_ani ani;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/common.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common.c
|
||||
@@ -52,11 +52,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke
|
||||
@@ -296,11 +296,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke
|
||||
/*
|
||||
* Update internal channel flags.
|
||||
*/
|
||||
|
@ -89,7 +89,7 @@
|
|||
|
||||
ichan->channel = chan->center_freq;
|
||||
ichan->chan = chan;
|
||||
@@ -64,7 +66,19 @@ static void ath9k_cmn_update_ichannel(st
|
||||
@@ -308,7 +310,19 @@ static void ath9k_cmn_update_ichannel(st
|
||||
if (chan->band == IEEE80211_BAND_5GHZ)
|
||||
flags |= CHANNEL_5GHZ;
|
||||
|
||||
|
@ -110,7 +110,7 @@
|
|||
case NL80211_CHAN_WIDTH_5:
|
||||
flags |= CHANNEL_QUARTER;
|
||||
break;
|
||||
@@ -97,10 +111,11 @@ struct ath9k_channel *ath9k_cmn_get_chan
|
||||
@@ -341,10 +355,11 @@ struct ath9k_channel *ath9k_cmn_get_chan
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct ieee80211_channel *curchan = chandef->chan;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -614,6 +614,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
@@ -613,6 +613,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
|
||||
/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
|
||||
switch (ah->hw_version.devid) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1711,6 +1711,7 @@ struct ieee80211_hw {
|
||||
@@ -1703,6 +1703,7 @@ struct ieee80211_hw {
|
||||
u8 max_tx_aggregation_subframes;
|
||||
u8 offchannel_tx_hw_queue;
|
||||
u8 radiotap_mcs_details;
|
||||
|
@ -10,7 +10,7 @@
|
|||
u8 uapsd_queues;
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2329,7 +2329,9 @@ static int ieee80211_get_tx_power(struct
|
||||
@@ -2335,7 +2335,9 @@ static int ieee80211_get_tx_power(struct
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
out:
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
@@ -1371,6 +1375,7 @@ static int ath9k_config(struct ieee80211
|
||||
@@ -1370,6 +1374,7 @@ static int ath9k_config(struct ieee80211
|
||||
sc->config.txpowlimit = 2 * conf->power_level;
|
||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||
sc->config.txpowlimit, &sc->curtxpow);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -2156,6 +2156,7 @@ struct cfg80211_qos_map {
|
||||
@@ -2167,6 +2167,7 @@ struct cfg80211_qos_map {
|
||||
* (as advertised by the nl80211 feature flag.)
|
||||
* @get_tx_power: store the current TX power into the dbm variable;
|
||||
* return 0 if successful
|
||||
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
* @set_wds_peer: set the WDS peer for a WDS interface
|
||||
*
|
||||
@@ -2380,6 +2381,7 @@ struct cfg80211_ops {
|
||||
@@ -2396,6 +2397,7 @@ struct cfg80211_ops {
|
||||
enum nl80211_tx_power_setting type, int mbm);
|
||||
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int *dbm);
|
||||
|
@ -18,7 +18,7 @@
|
|||
const u8 *addr);
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1033,6 +1033,7 @@ enum ieee80211_smps_mode {
|
||||
@@ -1032,6 +1032,7 @@ enum ieee80211_smps_mode {
|
||||
*
|
||||
* @power_level: requested transmit power (in dBm), backward compatibility
|
||||
* value only that is set to the minimum of all interfaces
|
||||
|
@ -26,7 +26,7 @@
|
|||
*
|
||||
* @chandef: the channel definition to tune to
|
||||
* @radar_enabled: whether radar detection is enabled
|
||||
@@ -1054,6 +1055,7 @@ struct ieee80211_conf {
|
||||
@@ -1053,6 +1054,7 @@ struct ieee80211_conf {
|
||||
u32 flags;
|
||||
int power_level, dynamic_ps_timeout;
|
||||
int max_sleep_period;
|
||||
|
@ -36,9 +36,9 @@
|
|||
u8 ps_dtim_period;
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -1555,6 +1555,9 @@ enum nl80211_commands {
|
||||
* data is in the format defined for the payload of the QoS Map Set element
|
||||
* in IEEE Std 802.11-2012, 8.4.2.97.
|
||||
@@ -1579,6 +1579,9 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_TDLS_PEER_CAPABILITY: flags for TDLS peer capabilities, u32.
|
||||
* As specified in the &enum nl80211_tdls_peer_capability.
|
||||
*
|
||||
+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
|
||||
+ * transmit power to stay within regulatory limits. u32, dBi.
|
||||
|
@ -46,9 +46,9 @@
|
|||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1883,6 +1886,8 @@ enum nl80211_attrs {
|
||||
@@ -1914,6 +1917,8 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_QOS_MAP,
|
||||
NL80211_ATTR_TDLS_PEER_CAPABILITY,
|
||||
|
||||
+ NL80211_ATTR_WIPHY_ANTENNA_GAIN,
|
||||
+
|
||||
|
@ -57,7 +57,7 @@
|
|||
__NL80211_ATTR_AFTER_LAST,
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2339,6 +2339,19 @@ static int ieee80211_get_tx_power(struct
|
||||
@@ -2345,6 +2345,19 @@ static int ieee80211_get_tx_power(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@
|
|||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
@@ -3924,6 +3937,7 @@ struct cfg80211_ops mac80211_config_ops
|
||||
@@ -4000,6 +4013,7 @@ const struct cfg80211_ops mac80211_confi
|
||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||
.set_tx_power = ieee80211_set_tx_power,
|
||||
.get_tx_power = ieee80211_get_tx_power,
|
||||
|
@ -87,7 +87,7 @@
|
|||
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -1221,6 +1221,7 @@ struct ieee80211_local {
|
||||
@@ -1225,6 +1225,7 @@ struct ieee80211_local {
|
||||
int dynamic_ps_forced_timeout;
|
||||
|
||||
int user_power_level; /* in dBm, for all interfaces */
|
||||
|
@ -139,34 +139,32 @@
|
|||
local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -384,6 +384,7 @@ static const struct nla_policy nl80211_p
|
||||
[NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
|
||||
[NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
|
||||
.len = IEEE80211_QOS_MAP_LEN_MAX },
|
||||
@@ -385,6 +385,7 @@ static const struct nla_policy nl80211_p
|
||||
[NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
|
||||
[NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
|
||||
+ [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -2104,6 +2105,22 @@ static int nl80211_set_wiphy(struct sk_b
|
||||
if (result)
|
||||
goto bad_res;
|
||||
@@ -2116,6 +2117,20 @@ static int nl80211_set_wiphy(struct sk_b
|
||||
return result;
|
||||
}
|
||||
+
|
||||
|
||||
+ if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
|
||||
+ int idx, dbi = 0;
|
||||
+
|
||||
+ if (!rdev->ops->set_antenna_gain) {
|
||||
+ result = -EOPNOTSUPP;
|
||||
+ goto bad_res;
|
||||
+ }
|
||||
+ if (!rdev->ops->set_antenna_gain)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN;
|
||||
+ dbi = nla_get_u32(info->attrs[idx]);
|
||||
+
|
||||
+ result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi);
|
||||
+ if (result)
|
||||
+ goto bad_res;
|
||||
+ return result;
|
||||
+ }
|
||||
|
||||
+
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
|
||||
info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
|
||||
u32 tx_ant, rx_ant;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -74,6 +74,7 @@ struct ath_regulatory {
|
||||
@@ -83,6 +83,7 @@ struct ath_regulatory {
|
||||
u16 max_power_level;
|
||||
u16 current_rd;
|
||||
int16_t power_limit;
|
||||
|
@ -10,7 +10,7 @@
|
|||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2721,7 +2721,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2720,7 +2720,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
channel = chan->chan;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
|
@ -21,7 +21,7 @@
|
|||
if (ant_gain > max_gain)
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1371,7 +1371,10 @@ static int ath9k_config(struct ieee80211
|
||||
@@ -1370,7 +1370,10 @@ static int ath9k_config(struct ieee80211
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -563,6 +563,9 @@ static inline int ath9k_dump_btcoex(stru
|
||||
@@ -555,6 +555,9 @@ static inline int ath9k_dump_btcoex(stru
|
||||
void ath_init_leds(struct ath_softc *sc);
|
||||
void ath_deinit_leds(struct ath_softc *sc);
|
||||
void ath_fill_led_pin(struct ath_softc *sc);
|
||||
|
@ -10,7 +10,7 @@
|
|||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -710,6 +713,13 @@ enum sc_op_flags {
|
||||
@@ -693,6 +696,13 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
#define PS_BEACON_SYNC BIT(4)
|
||||
#define PS_WAIT_FOR_ANI BIT(5)
|
||||
|
||||
|
@ -24,8 +24,8 @@
|
|||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -751,9 +761,8 @@ struct ath_softc {
|
||||
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
||||
@@ -732,9 +742,8 @@ struct ath_softc {
|
||||
struct ath_beacon beacon;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
- bool led_registered;
|
||||
|
@ -162,7 +162,7 @@
|
|||
void ath_fill_led_pin(struct ath_softc *sc)
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1018,7 +1018,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -806,7 +806,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
/* must be initialized before ieee80211_register_hw */
|
||||
|
@ -173,7 +173,7 @@
|
|||
#endif
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1573,6 +1573,61 @@ static const struct file_operations fops
|
||||
@@ -1577,6 +1577,61 @@ static const struct file_operations fops
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
|
@ -235,7 +235,7 @@
|
|||
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
@@ -1597,6 +1652,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1601,6 +1656,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
&fops_eeprom);
|
||||
debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
sc, &fops_chanbw);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1629,6 +1629,50 @@ static const struct file_operations fops
|
||||
@@ -1633,6 +1633,50 @@ static const struct file_operations fops
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -51,7 +51,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1656,6 +1700,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1660,6 +1704,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
debugfs_create_file("gpio_led", S_IWUSR,
|
||||
sc->debug.debugfs_phy, sc, &fops_gpio_led);
|
||||
#endif
|
||||
|
@ -94,7 +94,7 @@
|
|||
struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1735,6 +1735,20 @@ fail:
|
||||
@@ -1734,6 +1734,20 @@ fail:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@
|
|||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -1940,6 +1954,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -1939,6 +1953,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ar9003_hw_disable_phy_restart(ah);
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
|
@ -125,7 +125,7 @@
|
|||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -602,6 +602,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
@@ -603,6 +603,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
ath9k_debug_sync_cause(sc, sync_cause);
|
||||
status &= ah->imask; /* discard unasked-for bits */
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
int (*external_reset)(void);
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2328,17 +2328,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||
@@ -2327,17 +2327,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||
}
|
||||
|
||||
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
|
||||
|
@ -58,7 +58,7 @@
|
|||
};
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -722,6 +722,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -518,6 +518,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
ah->external_reset = pdata->external_reset;
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -846,7 +846,8 @@ static void ath9k_init_txpower_limits(st
|
||||
@@ -643,7 +643,8 @@ static void ath9k_init_txpower_limits(st
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
|
||||
ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
|
||||
|
||||
|
@ -64,8 +64,8 @@
|
|||
+ ah->curchan = curchan;
|
||||
}
|
||||
|
||||
void ath9k_reload_chainmask_settings(struct ath_softc *sc)
|
||||
@@ -980,6 +981,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
static const struct ieee80211_iface_limit if_limits[] = {
|
||||
@@ -768,6 +769,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
|
||||
}
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
|||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -1025,6 +1038,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -813,6 +826,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
|
||||
|
@ -110,7 +110,7 @@
|
|||
static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
|
||||
--- a/drivers/net/wireless/ath/ath9k/link.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/link.c
|
||||
@@ -307,6 +307,11 @@ void ath_ani_calibrate(unsigned long dat
|
||||
@@ -308,6 +308,11 @@ void ath_ani_calibrate(unsigned long dat
|
||||
unsigned int timestamp = jiffies_to_msecs(jiffies);
|
||||
u32 cal_interval, short_cal_interval, long_cal_interval;
|
||||
unsigned long flags;
|
||||
|
|
|
@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -863,15 +863,15 @@ void ath9k_reload_chainmask_settings(str
|
||||
@@ -649,15 +649,15 @@ static void ath9k_init_txpower_limits(st
|
||||
|
||||
static const struct ieee80211_iface_limit if_limits[] = {
|
||||
{ .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) |
|
||||
|
|
|
@ -27,7 +27,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
return true;
|
||||
}
|
||||
|
||||
@@ -1126,6 +1128,8 @@ static int ath9k_add_interface(struct ie
|
||||
@@ -1128,6 +1130,8 @@ static int ath9k_add_interface(struct ie
|
||||
if (ath9k_uses_beacons(vif->type))
|
||||
ath9k_beacon_assign_slot(sc, vif);
|
||||
|
||||
|
@ -36,7 +36,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
an->sc = sc;
|
||||
an->sta = NULL;
|
||||
an->vif = vif;
|
||||
@@ -1170,6 +1174,29 @@ static int ath9k_change_interface(struct
|
||||
@@ -1172,6 +1176,29 @@ static int ath9k_change_interface(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -66,7 +66,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
static void ath9k_remove_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
@@ -1181,6 +1208,13 @@ static void ath9k_remove_interface(struc
|
||||
@@ -1183,6 +1210,13 @@ static void ath9k_remove_interface(struc
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
|
||||
|
@ -80,7 +80,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
sc->nvifs--;
|
||||
sc->tx99_vif = NULL;
|
||||
|
||||
@@ -1649,6 +1683,70 @@ static void ath9k_bss_assoc_iter(void *d
|
||||
@@ -1649,6 +1683,72 @@ static void ath9k_bss_assoc_iter(void *d
|
||||
ath9k_set_assoc_state(sc, vif);
|
||||
}
|
||||
|
||||
|
@ -130,6 +130,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
+void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif)
|
||||
+{
|
||||
+ struct ath_vif *avp = (void *)vif->drv_priv;
|
||||
+ unsigned long flags;
|
||||
+ u32 tsf;
|
||||
+
|
||||
+ if (!sc->p2p_ps_timer)
|
||||
|
@ -140,18 +141,19 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
+
|
||||
+ sc->p2p_ps_vif = avp;
|
||||
+
|
||||
+ if (sc->ps_flags & PS_BEACON_SYNC)
|
||||
+ return;
|
||||
+
|
||||
+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
|
||||
+ ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
|
||||
+ ath9k_update_p2p_ps_timer(sc, avp);
|
||||
+ spin_lock_irqsave(&sc->sc_pm_lock, flags);
|
||||
+ if (!(sc->ps_flags & PS_BEACON_SYNC)) {
|
||||
+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
|
||||
+ ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
|
||||
+ ath9k_update_p2p_ps_timer(sc, avp);
|
||||
+ }
|
||||
+ spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
|
||||
+}
|
||||
+
|
||||
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
@@ -1723,6 +1821,12 @@ static void ath9k_bss_info_changed(struc
|
||||
@@ -1723,6 +1823,12 @@ static void ath9k_bss_info_changed(struc
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,7 +168,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -115,6 +115,9 @@ int ath_descdma_setup(struct ath_softc *
|
||||
@@ -114,6 +114,9 @@ int ath_descdma_setup(struct ath_softc *
|
||||
#define ATH_TXFIFO_DEPTH 8
|
||||
#define ATH_TX_ERROR 0x01
|
||||
|
||||
|
@ -176,7 +178,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
#define IEEE80211_SEQ_SEQ_SHIFT 4
|
||||
#define IEEE80211_SEQ_MAX 4096
|
||||
#define IEEE80211_WEP_IVLEN 3
|
||||
@@ -363,11 +366,15 @@ void ath9k_release_buffered_frames(struc
|
||||
@@ -367,11 +370,15 @@ void ath9k_release_buffered_frames(struc
|
||||
/********/
|
||||
|
||||
struct ath_vif {
|
||||
|
@ -192,7 +194,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
};
|
||||
|
||||
struct ath9k_vif_iter_data {
|
||||
@@ -472,6 +479,8 @@ int ath_update_survey_stats(struct ath_s
|
||||
@@ -464,6 +471,8 @@ int ath_update_survey_stats(struct ath_s
|
||||
void ath_update_survey_nf(struct ath_softc *sc, int channel);
|
||||
void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
|
||||
void ath_ps_full_sleep(unsigned long data);
|
||||
|
@ -201,19 +203,19 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
|
||||
/**********/
|
||||
/* BTCOEX */
|
||||
@@ -741,6 +750,9 @@ struct ath_softc {
|
||||
@@ -724,6 +733,9 @@ struct ath_softc {
|
||||
struct completion paprd_complete;
|
||||
wait_queue_head_t tx_wait;
|
||||
|
||||
+ struct ath_gen_timer *p2p_ps_timer;
|
||||
+ struct ath_vif *p2p_ps_vif;
|
||||
+
|
||||
unsigned long sc_flags;
|
||||
unsigned long driver_data;
|
||||
|
||||
u8 gtt_cnt;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -797,6 +797,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -593,6 +593,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (ret)
|
||||
goto err_btcoex;
|
||||
|
||||
|
@ -223,7 +225,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||
ath9k_cmn_init_crypto(sc->sc_ah);
|
||||
ath9k_init_misc(sc);
|
||||
ath_fill_led_pin(sc);
|
||||
@@ -1082,6 +1085,9 @@ static void ath9k_deinit_softc(struct at
|
||||
@@ -870,6 +873,9 @@ static void ath9k_deinit_softc(struct at
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -217,6 +217,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
@@ -216,6 +216,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
|||
/******************/
|
||||
/* Chip Revisions */
|
||||
/******************/
|
||||
@@ -1337,6 +1350,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1336,6 +1349,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
if (AR_SREV_9100(ah))
|
||||
udelay(50);
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
|||
return true;
|
||||
}
|
||||
|
||||
@@ -1436,6 +1452,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
@@ -1435,6 +1451,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
ar9003_hw_internal_regulator_apply(ah);
|
||||
ath9k_hw_init_pll(ah, chan);
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
|||
return true;
|
||||
}
|
||||
|
||||
@@ -1730,8 +1749,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
@@ -1729,8 +1748,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
if (AR_SREV_9271(ah))
|
||||
ar9002_hw_load_ani_reg(ah, chan);
|
||||
|
||||
|
@ -55,7 +55,7 @@
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1959,6 +1984,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -1958,6 +1983,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
if (AR_SREV_9565(ah) && common->bt_ant_diversity)
|
||||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -279,6 +279,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
@@ -280,6 +280,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
@@ -7579,7 +7600,10 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -7578,7 +7599,10 @@ static int rt2800_probe_hw_mode(struct r
|
||||
case RF5390:
|
||||
case RF5392:
|
||||
spec->num_channels = 14;
|
||||
|
@ -40,7 +40,7 @@
|
|||
break;
|
||||
|
||||
case RF3052:
|
||||
@@ -7755,6 +7779,19 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
@@ -7754,6 +7778,19 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -60,7 +60,7 @@
|
|||
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
int retval;
|
||||
@@ -7784,6 +7821,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
|
||||
@@ -7783,6 +7820,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
|
||||
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
|
||||
|
||||
/*
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -7781,13 +7782,14 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
@@ -7780,13 +7781,14 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
|
||||
int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
|
|
|
@ -240,7 +240,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -7595,6 +7706,7 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -7594,6 +7705,7 @@ static int rt2800_probe_hw_mode(struct r
|
||||
case RF3290:
|
||||
case RF3320:
|
||||
case RF3322:
|
||||
|
@ -248,7 +248,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -7727,6 +7839,7 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -7726,6 +7838,7 @@ static int rt2800_probe_hw_mode(struct r
|
||||
case RF3053:
|
||||
case RF3070:
|
||||
case RF3290:
|
||||
|
@ -256,7 +256,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -7765,6 +7878,7 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
@@ -7764,6 +7877,7 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
case RT3390:
|
||||
case RT3572:
|
||||
case RT3593:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/mwl8k.c
|
||||
+++ b/drivers/net/wireless/mwl8k.c
|
||||
@@ -5529,6 +5529,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
@@ -5714,6 +5714,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
|
||||
|
|
|
@ -16,8 +16,6 @@ Signed-off-by: Eliad Peller <eliad@wizery.com>
|
|||
drivers/net/wireless/ti/wl18xx/event.h | 20 ++++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/ti/wl18xx/event.h b/drivers/net/wireless/ti/wl18xx/event.h
|
||||
index 398f3d2..a76e98e 100644
|
||||
--- a/drivers/net/wireless/ti/wl18xx/event.h
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/event.h
|
||||
@@ -68,6 +68,26 @@ struct wl18xx_event_mailbox {
|
||||
|
@ -47,6 +45,3 @@ index 398f3d2..a76e98e 100644
|
|||
} __packed;
|
||||
|
||||
int wl18xx_wait_for_event(struct wl1271 *wl, enum wlcore_wait_event event,
|
||||
--
|
||||
1.8.5.2.229.g4448466.dirty
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
zero rx_filter_enabled array after recovery to avoid
|
||||
cases were the driver will keep trying to clear a
|
||||
filter which is not configured in FW.
|
||||
|
||||
Such case will cause consecutive recoveries due to
|
||||
command execution failures.
|
||||
|
||||
While on it, convert rx_filter_enabled to bitmap,
|
||||
to save some memory and make sparse happy (it
|
||||
doesn't like sizeof(bool array)).
|
||||
|
||||
Signed-off-by: Nadim Zubidat <nadimz@ti.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/main.c | 1 +
|
||||
drivers/net/wireless/ti/wlcore/rx.c | 9 ++++++---
|
||||
drivers/net/wireless/ti/wlcore/wlcore.h | 2 +-
|
||||
3 files changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -1914,6 +1914,7 @@ static void wlcore_op_stop_locked(struct
|
||||
memset(wl->links_map, 0, sizeof(wl->links_map));
|
||||
memset(wl->roc_map, 0, sizeof(wl->roc_map));
|
||||
memset(wl->session_ids, 0, sizeof(wl->session_ids));
|
||||
+ memset(wl->rx_filter_enabled, 0, sizeof(wl->rx_filter_enabled));
|
||||
wl->active_sta_count = 0;
|
||||
wl->active_link_count = 0;
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/rx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/rx.c
|
||||
@@ -302,7 +302,7 @@ int wl1271_rx_filter_enable(struct wl127
|
||||
{
|
||||
int ret;
|
||||
|
||||
- if (wl->rx_filter_enabled[index] == enable) {
|
||||
+ if (!!test_bit(index, wl->rx_filter_enabled) == enable) {
|
||||
wl1271_warning("Request to enable an already "
|
||||
"enabled rx filter %d", index);
|
||||
return 0;
|
||||
@@ -316,7 +316,10 @@ int wl1271_rx_filter_enable(struct wl127
|
||||
return ret;
|
||||
}
|
||||
|
||||
- wl->rx_filter_enabled[index] = enable;
|
||||
+ if (enable)
|
||||
+ __set_bit(index, wl->rx_filter_enabled);
|
||||
+ else
|
||||
+ __clear_bit(index, wl->rx_filter_enabled);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -326,7 +329,7 @@ int wl1271_rx_filter_clear_all(struct wl
|
||||
int i, ret = 0;
|
||||
|
||||
for (i = 0; i < WL1271_MAX_RX_FILTERS; i++) {
|
||||
- if (!wl->rx_filter_enabled[i])
|
||||
+ if (!test_bit(i, wl->rx_filter_enabled))
|
||||
continue;
|
||||
ret = wl1271_rx_filter_enable(wl, i, 0, NULL);
|
||||
if (ret)
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
@@ -453,7 +453,7 @@ struct wl1271 {
|
||||
size_t fw_status_priv_len;
|
||||
|
||||
/* RX Data filter rule state - enabled/disabled */
|
||||
- bool rx_filter_enabled[WL1271_MAX_RX_FILTERS];
|
||||
+ unsigned long rx_filter_enabled[BITS_TO_LONGS(WL1271_MAX_RX_FILTERS)];
|
||||
|
||||
/* size of the private static data */
|
||||
size_t static_data_priv_len;
|
|
@ -1,73 +0,0 @@
|
|||
Sometimes a tx_flush during suspend fails, but the FW manages to flush
|
||||
out the packets during the time when the host is supsended. Cancel
|
||||
the Tx-watchdog on suspend to not cause a spurious recovery on resume
|
||||
for that case. Set a flag to reinit the watchdog on the first Tx after
|
||||
resume, so we'll still recover if the FW is not empty and there's
|
||||
indeed a problem.
|
||||
|
||||
Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/main.c | 13 +++++++++++++
|
||||
drivers/net/wireless/ti/wlcore/tx.c | 9 +++++++--
|
||||
drivers/net/wireless/ti/wlcore/wlcore_i.h | 1 +
|
||||
3 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -1767,6 +1767,12 @@ static int wl1271_op_suspend(struct ieee
|
||||
flush_work(&wl->tx_work);
|
||||
flush_delayed_work(&wl->elp_work);
|
||||
|
||||
+ /*
|
||||
+ * Cancel the watchdog even if above tx_flush failed. We will detect
|
||||
+ * it on resume anyway.
|
||||
+ */
|
||||
+ cancel_delayed_work(&wl->tx_watchdog_work);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1824,6 +1830,13 @@ static int wl1271_op_resume(struct ieee8
|
||||
|
||||
out:
|
||||
wl->wow_enabled = false;
|
||||
+
|
||||
+ /*
|
||||
+ * Set a flag to re-init the watchdog on the first Tx after resume.
|
||||
+ * That way we avoid possible conditions where Tx-complete interrupts
|
||||
+ * fail to arrive and we perform a spurious recovery.
|
||||
+ */
|
||||
+ set_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags);
|
||||
mutex_unlock(&wl->mutex);
|
||||
|
||||
return 0;
|
||||
--- a/drivers/net/wireless/ti/wlcore/tx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/tx.c
|
||||
@@ -234,8 +234,13 @@ static int wl1271_tx_allocate(struct wl1
|
||||
wl->tx_blocks_available -= total_blocks;
|
||||
wl->tx_allocated_blocks += total_blocks;
|
||||
|
||||
- /* If the FW was empty before, arm the Tx watchdog */
|
||||
- if (wl->tx_allocated_blocks == total_blocks)
|
||||
+ /*
|
||||
+ * If the FW was empty before, arm the Tx watchdog. Also do
|
||||
+ * this on the first Tx after resume, as we always cancel the
|
||||
+ * watchdog on suspend.
|
||||
+ */
|
||||
+ if (wl->tx_allocated_blocks == total_blocks ||
|
||||
+ test_and_clear_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags))
|
||||
wl12xx_rearm_tx_watchdog_locked(wl);
|
||||
|
||||
ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
@@ -240,6 +240,7 @@ enum wl12xx_flags {
|
||||
WL1271_FLAG_VIF_CHANGE_IN_PROGRESS,
|
||||
WL1271_FLAG_INTENDED_FW_RECOVERY,
|
||||
WL1271_FLAG_IO_FAILED,
|
||||
+ WL1271_FLAG_REINIT_TX_WDOG,
|
||||
};
|
||||
|
||||
enum wl12xx_vif_flags {
|
|
@ -13,7 +13,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -5179,6 +5179,10 @@ static void wl12xx_op_channel_switch(str
|
||||
@@ -5181,6 +5181,10 @@ static void wl12xx_op_channel_switch(str
|
||||
if (unlikely(wl->state == WLCORE_STATE_OFF)) {
|
||||
wl12xx_for_each_wlvif_sta(wl, wlvif) {
|
||||
struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
|
||||
|
@ -24,7 +24,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
ieee80211_chswitch_done(vif, false);
|
||||
}
|
||||
goto out;
|
||||
@@ -5194,6 +5198,9 @@ static void wl12xx_op_channel_switch(str
|
||||
@@ -5196,6 +5200,9 @@ static void wl12xx_op_channel_switch(str
|
||||
wl12xx_for_each_wlvif_sta(wl, wlvif) {
|
||||
unsigned long delay_usec;
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
When the chip is in ELP mode read/write to FW is invalid and may cause
|
||||
the lower layers to get stuck. The reads/writes concerning ELP wakeup
|
||||
are the exception here and are checked for. In addition to blocking the
|
||||
IO, produce a warning.
|
||||
|
||||
Signed-off-by: Barak Bercovitz <barak@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/io.h | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/io.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/io.h
|
||||
@@ -60,7 +60,9 @@ static inline int __must_check wlcore_ra
|
||||
{
|
||||
int ret;
|
||||
|
||||
- if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags))
|
||||
+ if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags) ||
|
||||
+ WARN_ON((test_bit(WL1271_FLAG_IN_ELP, &wl->flags) &&
|
||||
+ addr != HW_ACCESS_ELP_CTRL_REG)))
|
||||
return -EIO;
|
||||
|
||||
ret = wl->if_ops->write(wl->dev, addr, buf, len, fixed);
|
||||
@@ -76,7 +78,9 @@ static inline int __must_check wlcore_ra
|
||||
{
|
||||
int ret;
|
||||
|
||||
- if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags))
|
||||
+ if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags) ||
|
||||
+ WARN_ON((test_bit(WL1271_FLAG_IN_ELP, &wl->flags) &&
|
||||
+ addr != HW_ACCESS_ELP_CTRL_REG)))
|
||||
return -EIO;
|
||||
|
||||
ret = wl->if_ops->read(wl->dev, addr, buf, len, fixed);
|
|
@ -1,28 +0,0 @@
|
|||
It seems the wl18xx FW sometimes sends spurious changes on the PSM state
|
||||
of the broadcast HLID. This causes us to search for a station on a
|
||||
non-peer link and fail, causing warnings in our log.
|
||||
|
||||
Prevent the driver from considering PSM changes for any non-peer HLIDs.
|
||||
|
||||
Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/ps.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/ps.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/ps.c
|
||||
@@ -280,7 +280,11 @@ void wl12xx_ps_link_start(struct wl1271
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
|
||||
|
||||
- if (test_bit(hlid, &wl->ap_ps_map))
|
||||
+ if (WARN_ON_ONCE(wlvif->bss_type != BSS_TYPE_AP_BSS))
|
||||
+ return;
|
||||
+
|
||||
+ if (!test_bit(hlid, wlvif->ap.sta_hlid_map) ||
|
||||
+ test_bit(hlid, &wl->ap_ps_map))
|
||||
return;
|
||||
|
||||
wl1271_debug(DEBUG_PSM, "start mac80211 PSM on hlid %d pkts %d "
|
|
@ -1,731 +0,0 @@
|
|||
Instead of splitting the fw_status into 2 and using some
|
||||
complex calculations, read the fw status and let each low-level
|
||||
driver (wl12xx/wl18xx) convert it into a common struct.
|
||||
|
||||
This is required for the upcoming fw api changes, which
|
||||
break the current logic anyway.
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wl12xx/main.c | 35 ++++++++++-
|
||||
drivers/net/wireless/ti/wl12xx/wl12xx.h | 50 ++++++++++++++++
|
||||
drivers/net/wireless/ti/wl18xx/main.c | 39 ++++++++++++-
|
||||
drivers/net/wireless/ti/wl18xx/tx.c | 4 +-
|
||||
drivers/net/wireless/ti/wl18xx/wl18xx.h | 53 +++++++++++++++++
|
||||
drivers/net/wireless/ti/wlcore/cmd.c | 11 +++-
|
||||
drivers/net/wireless/ti/wlcore/hw_ops.h | 9 +++
|
||||
drivers/net/wireless/ti/wlcore/main.c | 96 +++++++++++++++----------------
|
||||
drivers/net/wireless/ti/wlcore/rx.c | 2 +-
|
||||
drivers/net/wireless/ti/wlcore/rx.h | 2 +-
|
||||
drivers/net/wireless/ti/wlcore/wlcore.h | 7 ++-
|
||||
drivers/net/wireless/ti/wlcore/wlcore_i.h | 72 ++++++++++-------------
|
||||
12 files changed, 277 insertions(+), 103 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
||||
@@ -1378,7 +1378,7 @@ static u32 wl12xx_get_rx_packet_len(stru
|
||||
|
||||
static int wl12xx_tx_delayed_compl(struct wl1271 *wl)
|
||||
{
|
||||
- if (wl->fw_status_1->tx_results_counter ==
|
||||
+ if (wl->fw_status->tx_results_counter ==
|
||||
(wl->tx_results_count & 0xff))
|
||||
return 0;
|
||||
|
||||
@@ -1438,6 +1438,37 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void wl12xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
|
||||
+ struct wl_fw_status *fw_status)
|
||||
+{
|
||||
+ struct wl12xx_fw_status *int_fw_status = raw_fw_status;
|
||||
+
|
||||
+ fw_status->intr = le32_to_cpu(int_fw_status->intr);
|
||||
+ fw_status->fw_rx_counter = int_fw_status->fw_rx_counter;
|
||||
+ fw_status->drv_rx_counter = int_fw_status->drv_rx_counter;
|
||||
+ fw_status->tx_results_counter = int_fw_status->tx_results_counter;
|
||||
+ fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs;
|
||||
+
|
||||
+ fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime);
|
||||
+ fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap);
|
||||
+ fw_status->link_fast_bitmap =
|
||||
+ le32_to_cpu(int_fw_status->link_fast_bitmap);
|
||||
+ fw_status->total_released_blks =
|
||||
+ le32_to_cpu(int_fw_status->total_released_blks);
|
||||
+ fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total);
|
||||
+
|
||||
+ fw_status->counters.tx_released_pkts =
|
||||
+ int_fw_status->counters.tx_released_pkts;
|
||||
+ fw_status->counters.tx_lnk_free_pkts =
|
||||
+ int_fw_status->counters.tx_lnk_free_pkts;
|
||||
+ fw_status->counters.tx_voice_released_blks =
|
||||
+ int_fw_status->counters.tx_voice_released_blks;
|
||||
+ fw_status->counters.tx_last_rate =
|
||||
+ int_fw_status->counters.tx_last_rate;
|
||||
+
|
||||
+ fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
|
||||
+}
|
||||
+
|
||||
static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl,
|
||||
struct wl12xx_vif *wlvif)
|
||||
{
|
||||
@@ -1677,6 +1708,7 @@ static struct wlcore_ops wl12xx_ops = {
|
||||
.tx_delayed_compl = wl12xx_tx_delayed_compl,
|
||||
.hw_init = wl12xx_hw_init,
|
||||
.init_vif = NULL,
|
||||
+ .convert_fw_status = wl12xx_convert_fw_status,
|
||||
.sta_get_ap_rate_mask = wl12xx_sta_get_ap_rate_mask,
|
||||
.get_pg_ver = wl12xx_get_pg_ver,
|
||||
.get_mac = wl12xx_get_mac,
|
||||
@@ -1725,6 +1757,7 @@ static int wl12xx_setup(struct wl1271 *w
|
||||
wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
|
||||
wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
|
||||
wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
|
||||
+ wl->fw_status_len = sizeof(struct wl12xx_fw_status);
|
||||
wl->fw_status_priv_len = 0;
|
||||
wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
|
||||
wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ, &wl12xx_ht_cap);
|
||||
--- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||||
@@ -79,4 +79,54 @@ struct wl12xx_priv {
|
||||
struct wl127x_rx_mem_pool_addr *rx_mem_addr;
|
||||
};
|
||||
|
||||
+struct wl12xx_fw_packet_counters {
|
||||
+ /* Cumulative counter of released packets per AC */
|
||||
+ u8 tx_released_pkts[NUM_TX_QUEUES];
|
||||
+
|
||||
+ /* Cumulative counter of freed packets per HLID */
|
||||
+ u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
|
||||
+
|
||||
+ /* Cumulative counter of released Voice memory blocks */
|
||||
+ u8 tx_voice_released_blks;
|
||||
+
|
||||
+ /* Tx rate of the last transmitted packet */
|
||||
+ u8 tx_last_rate;
|
||||
+
|
||||
+ u8 padding[2];
|
||||
+} __packed;
|
||||
+
|
||||
+/* FW status registers */
|
||||
+struct wl12xx_fw_status {
|
||||
+ __le32 intr;
|
||||
+ u8 fw_rx_counter;
|
||||
+ u8 drv_rx_counter;
|
||||
+ u8 reserved;
|
||||
+ u8 tx_results_counter;
|
||||
+ __le32 rx_pkt_descs[WL12XX_NUM_RX_DESCRIPTORS];
|
||||
+
|
||||
+ __le32 fw_localtime;
|
||||
+
|
||||
+ /*
|
||||
+ * A bitmap (where each bit represents a single HLID)
|
||||
+ * to indicate if the station is in PS mode.
|
||||
+ */
|
||||
+ __le32 link_ps_bitmap;
|
||||
+
|
||||
+ /*
|
||||
+ * A bitmap (where each bit represents a single HLID) to indicate
|
||||
+ * if the station is in Fast mode
|
||||
+ */
|
||||
+ __le32 link_fast_bitmap;
|
||||
+
|
||||
+ /* Cumulative counter of total released mem blocks since FW-reset */
|
||||
+ __le32 total_released_blks;
|
||||
+
|
||||
+ /* Size (in Memory Blocks) of TX pool */
|
||||
+ __le32 tx_total;
|
||||
+
|
||||
+ struct wl12xx_fw_packet_counters counters;
|
||||
+
|
||||
+ __le32 log_start_addr;
|
||||
+} __packed;
|
||||
+
|
||||
#endif /* __WL12XX_PRIV_H__ */
|
||||
--- a/drivers/net/wireless/ti/wl18xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/main.c
|
||||
@@ -1133,6 +1133,39 @@ static int wl18xx_hw_init(struct wl1271
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void wl18xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
|
||||
+ struct wl_fw_status *fw_status)
|
||||
+{
|
||||
+ struct wl18xx_fw_status *int_fw_status = raw_fw_status;
|
||||
+
|
||||
+ fw_status->intr = le32_to_cpu(int_fw_status->intr);
|
||||
+ fw_status->fw_rx_counter = int_fw_status->fw_rx_counter;
|
||||
+ fw_status->drv_rx_counter = int_fw_status->drv_rx_counter;
|
||||
+ fw_status->tx_results_counter = int_fw_status->tx_results_counter;
|
||||
+ fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs;
|
||||
+
|
||||
+ fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime);
|
||||
+ fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap);
|
||||
+ fw_status->link_fast_bitmap =
|
||||
+ le32_to_cpu(int_fw_status->link_fast_bitmap);
|
||||
+ fw_status->total_released_blks =
|
||||
+ le32_to_cpu(int_fw_status->total_released_blks);
|
||||
+ fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total);
|
||||
+
|
||||
+ fw_status->counters.tx_released_pkts =
|
||||
+ int_fw_status->counters.tx_released_pkts;
|
||||
+ fw_status->counters.tx_lnk_free_pkts =
|
||||
+ int_fw_status->counters.tx_lnk_free_pkts;
|
||||
+ fw_status->counters.tx_voice_released_blks =
|
||||
+ int_fw_status->counters.tx_voice_released_blks;
|
||||
+ fw_status->counters.tx_last_rate =
|
||||
+ int_fw_status->counters.tx_last_rate;
|
||||
+
|
||||
+ fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
|
||||
+
|
||||
+ fw_status->priv = &int_fw_status->priv;
|
||||
+}
|
||||
+
|
||||
static void wl18xx_set_tx_desc_csum(struct wl1271 *wl,
|
||||
struct wl1271_tx_hw_descr *desc,
|
||||
struct sk_buff *skb)
|
||||
@@ -1572,7 +1605,7 @@ static bool wl18xx_lnk_high_prio(struct
|
||||
{
|
||||
u8 thold;
|
||||
struct wl18xx_fw_status_priv *status_priv =
|
||||
- (struct wl18xx_fw_status_priv *)wl->fw_status_2->priv;
|
||||
+ (struct wl18xx_fw_status_priv *)wl->fw_status->priv;
|
||||
u32 suspend_bitmap = le32_to_cpu(status_priv->link_suspend_bitmap);
|
||||
|
||||
/* suspended links are never high priority */
|
||||
@@ -1594,7 +1627,7 @@ static bool wl18xx_lnk_low_prio(struct w
|
||||
{
|
||||
u8 thold;
|
||||
struct wl18xx_fw_status_priv *status_priv =
|
||||
- (struct wl18xx_fw_status_priv *)wl->fw_status_2->priv;
|
||||
+ (struct wl18xx_fw_status_priv *)wl->fw_status->priv;
|
||||
u32 suspend_bitmap = le32_to_cpu(status_priv->link_suspend_bitmap);
|
||||
|
||||
if (test_bit(hlid, (unsigned long *)&suspend_bitmap))
|
||||
@@ -1632,6 +1665,7 @@ static struct wlcore_ops wl18xx_ops = {
|
||||
.tx_immediate_compl = wl18xx_tx_immediate_completion,
|
||||
.tx_delayed_compl = NULL,
|
||||
.hw_init = wl18xx_hw_init,
|
||||
+ .convert_fw_status = wl18xx_convert_fw_status,
|
||||
.set_tx_desc_csum = wl18xx_set_tx_desc_csum,
|
||||
.get_pg_ver = wl18xx_get_pg_ver,
|
||||
.set_rx_csum = wl18xx_set_rx_csum,
|
||||
@@ -1726,6 +1760,7 @@ static int wl18xx_setup(struct wl1271 *w
|
||||
wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
|
||||
wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX;
|
||||
wl->hw_min_ht_rate = WL18XX_CONF_HW_RXTX_RATE_MCS0;
|
||||
+ wl->fw_status_len = sizeof(struct wl18xx_fw_status);
|
||||
wl->fw_status_priv_len = sizeof(struct wl18xx_fw_status_priv);
|
||||
wl->stats.fw_stats_len = sizeof(struct wl18xx_acx_statistics);
|
||||
wl->static_data_priv_len = sizeof(struct wl18xx_static_data_priv);
|
||||
--- a/drivers/net/wireless/ti/wl18xx/tx.c
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/tx.c
|
||||
@@ -32,7 +32,7 @@ static
|
||||
void wl18xx_get_last_tx_rate(struct wl1271 *wl, struct ieee80211_vif *vif,
|
||||
struct ieee80211_tx_rate *rate)
|
||||
{
|
||||
- u8 fw_rate = wl->fw_status_2->counters.tx_last_rate;
|
||||
+ u8 fw_rate = wl->fw_status->counters.tx_last_rate;
|
||||
|
||||
if (fw_rate > CONF_HW_RATE_INDEX_MAX) {
|
||||
wl1271_error("last Tx rate invalid: %d", fw_rate);
|
||||
@@ -139,7 +139,7 @@ static void wl18xx_tx_complete_packet(st
|
||||
void wl18xx_tx_immediate_complete(struct wl1271 *wl)
|
||||
{
|
||||
struct wl18xx_fw_status_priv *status_priv =
|
||||
- (struct wl18xx_fw_status_priv *)wl->fw_status_2->priv;
|
||||
+ (struct wl18xx_fw_status_priv *)wl->fw_status->priv;
|
||||
struct wl18xx_priv *priv = wl->priv;
|
||||
u8 i;
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
@@ -109,6 +109,59 @@ struct wl18xx_fw_status_priv {
|
||||
u8 padding[3];
|
||||
};
|
||||
|
||||
+struct wl18xx_fw_packet_counters {
|
||||
+ /* Cumulative counter of released packets per AC */
|
||||
+ u8 tx_released_pkts[NUM_TX_QUEUES];
|
||||
+
|
||||
+ /* Cumulative counter of freed packets per HLID */
|
||||
+ u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
|
||||
+
|
||||
+ /* Cumulative counter of released Voice memory blocks */
|
||||
+ u8 tx_voice_released_blks;
|
||||
+
|
||||
+ /* Tx rate of the last transmitted packet */
|
||||
+ u8 tx_last_rate;
|
||||
+
|
||||
+ u8 padding[2];
|
||||
+} __packed;
|
||||
+
|
||||
+/* FW status registers */
|
||||
+struct wl18xx_fw_status {
|
||||
+ __le32 intr;
|
||||
+ u8 fw_rx_counter;
|
||||
+ u8 drv_rx_counter;
|
||||
+ u8 reserved;
|
||||
+ u8 tx_results_counter;
|
||||
+ __le32 rx_pkt_descs[WL18XX_NUM_RX_DESCRIPTORS];
|
||||
+
|
||||
+ __le32 fw_localtime;
|
||||
+
|
||||
+ /*
|
||||
+ * A bitmap (where each bit represents a single HLID)
|
||||
+ * to indicate if the station is in PS mode.
|
||||
+ */
|
||||
+ __le32 link_ps_bitmap;
|
||||
+
|
||||
+ /*
|
||||
+ * A bitmap (where each bit represents a single HLID) to indicate
|
||||
+ * if the station is in Fast mode
|
||||
+ */
|
||||
+ __le32 link_fast_bitmap;
|
||||
+
|
||||
+ /* Cumulative counter of total released mem blocks since FW-reset */
|
||||
+ __le32 total_released_blks;
|
||||
+
|
||||
+ /* Size (in Memory Blocks) of TX pool */
|
||||
+ __le32 tx_total;
|
||||
+
|
||||
+ struct wl18xx_fw_packet_counters counters;
|
||||
+
|
||||
+ __le32 log_start_addr;
|
||||
+
|
||||
+ /* Private status to be used by the lower drivers */
|
||||
+ struct wl18xx_fw_status_priv priv;
|
||||
+} __packed;
|
||||
+
|
||||
#define WL18XX_PHY_VERSION_MAX_LEN 20
|
||||
|
||||
struct wl18xx_static_data_priv {
|
||||
--- a/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
@@ -324,9 +324,14 @@ int wl12xx_allocate_link(struct wl1271 *
|
||||
__set_bit(link, wlvif->links_map);
|
||||
spin_unlock_irqrestore(&wl->wl_lock, flags);
|
||||
|
||||
- /* take the last "freed packets" value from the current FW status */
|
||||
- wl->links[link].prev_freed_pkts =
|
||||
- wl->fw_status_2->counters.tx_lnk_free_pkts[link];
|
||||
+ /*
|
||||
+ * take the last "freed packets" value from the current FW status.
|
||||
+ * on recovery, we might not have fw_status yet, and
|
||||
+ * tx_lnk_free_pkts will be NULL. check for it.
|
||||
+ */
|
||||
+ if (wl->fw_status->counters.tx_lnk_free_pkts)
|
||||
+ wl->links[link].prev_freed_pkts =
|
||||
+ wl->fw_status->counters.tx_lnk_free_pkts[link];
|
||||
wl->links[link].wlvif = wlvif;
|
||||
|
||||
/*
|
||||
--- a/drivers/net/wireless/ti/wlcore/hw_ops.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/hw_ops.h
|
||||
@@ -106,6 +106,15 @@ wlcore_hw_init_vif(struct wl1271 *wl, st
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static inline void
|
||||
+wlcore_hw_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
|
||||
+ struct wl_fw_status *fw_status)
|
||||
+{
|
||||
+ BUG_ON(!wl->ops->convert_fw_status);
|
||||
+
|
||||
+ wl->ops->convert_fw_status(wl, raw_fw_status, fw_status);
|
||||
+}
|
||||
+
|
||||
static inline u32
|
||||
wlcore_hw_sta_get_ap_rate_mask(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
||||
{
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -357,12 +357,12 @@ static void wl12xx_irq_ps_regulate_link(
|
||||
|
||||
static void wl12xx_irq_update_links_status(struct wl1271 *wl,
|
||||
struct wl12xx_vif *wlvif,
|
||||
- struct wl_fw_status_2 *status)
|
||||
+ struct wl_fw_status *status)
|
||||
{
|
||||
u32 cur_fw_ps_map;
|
||||
u8 hlid;
|
||||
|
||||
- cur_fw_ps_map = le32_to_cpu(status->link_ps_bitmap);
|
||||
+ cur_fw_ps_map = status->link_ps_bitmap;
|
||||
if (wl->ap_fw_ps_map != cur_fw_ps_map) {
|
||||
wl1271_debug(DEBUG_PSM,
|
||||
"link ps prev 0x%x cur 0x%x changed 0x%x",
|
||||
@@ -377,41 +377,38 @@ static void wl12xx_irq_update_links_stat
|
||||
wl->links[hlid].allocated_pkts);
|
||||
}
|
||||
|
||||
-static int wlcore_fw_status(struct wl1271 *wl,
|
||||
- struct wl_fw_status_1 *status_1,
|
||||
- struct wl_fw_status_2 *status_2)
|
||||
+static int wlcore_fw_status(struct wl1271 *wl, struct wl_fw_status *status)
|
||||
{
|
||||
struct wl12xx_vif *wlvif;
|
||||
struct timespec ts;
|
||||
u32 old_tx_blk_count = wl->tx_blocks_available;
|
||||
int avail, freed_blocks;
|
||||
int i;
|
||||
- size_t status_len;
|
||||
int ret;
|
||||
struct wl1271_link *lnk;
|
||||
|
||||
- status_len = WLCORE_FW_STATUS_1_LEN(wl->num_rx_desc) +
|
||||
- sizeof(*status_2) + wl->fw_status_priv_len;
|
||||
-
|
||||
- ret = wlcore_raw_read_data(wl, REG_RAW_FW_STATUS_ADDR, status_1,
|
||||
- status_len, false);
|
||||
+ ret = wlcore_raw_read_data(wl, REG_RAW_FW_STATUS_ADDR,
|
||||
+ wl->raw_fw_status,
|
||||
+ wl->fw_status_len, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
+ wlcore_hw_convert_fw_status(wl, wl->raw_fw_status, wl->fw_status);
|
||||
+
|
||||
wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
|
||||
"drv_rx_counter = %d, tx_results_counter = %d)",
|
||||
- status_1->intr,
|
||||
- status_1->fw_rx_counter,
|
||||
- status_1->drv_rx_counter,
|
||||
- status_1->tx_results_counter);
|
||||
+ status->intr,
|
||||
+ status->fw_rx_counter,
|
||||
+ status->drv_rx_counter,
|
||||
+ status->tx_results_counter);
|
||||
|
||||
for (i = 0; i < NUM_TX_QUEUES; i++) {
|
||||
/* prevent wrap-around in freed-packets counter */
|
||||
wl->tx_allocated_pkts[i] -=
|
||||
- (status_2->counters.tx_released_pkts[i] -
|
||||
+ (status->counters.tx_released_pkts[i] -
|
||||
wl->tx_pkts_freed[i]) & 0xff;
|
||||
|
||||
- wl->tx_pkts_freed[i] = status_2->counters.tx_released_pkts[i];
|
||||
+ wl->tx_pkts_freed[i] = status->counters.tx_released_pkts[i];
|
||||
}
|
||||
|
||||
|
||||
@@ -420,29 +417,28 @@ static int wlcore_fw_status(struct wl127
|
||||
lnk = &wl->links[i];
|
||||
|
||||
/* prevent wrap-around in freed-packets counter */
|
||||
- diff = (status_2->counters.tx_lnk_free_pkts[i] -
|
||||
+ diff = (status->counters.tx_lnk_free_pkts[i] -
|
||||
lnk->prev_freed_pkts) & 0xff;
|
||||
|
||||
if (diff == 0)
|
||||
continue;
|
||||
|
||||
lnk->allocated_pkts -= diff;
|
||||
- lnk->prev_freed_pkts = status_2->counters.tx_lnk_free_pkts[i];
|
||||
+ lnk->prev_freed_pkts = status->counters.tx_lnk_free_pkts[i];
|
||||
|
||||
/* accumulate the prev_freed_pkts counter */
|
||||
lnk->total_freed_pkts += diff;
|
||||
}
|
||||
|
||||
/* prevent wrap-around in total blocks counter */
|
||||
- if (likely(wl->tx_blocks_freed <=
|
||||
- le32_to_cpu(status_2->total_released_blks)))
|
||||
- freed_blocks = le32_to_cpu(status_2->total_released_blks) -
|
||||
+ if (likely(wl->tx_blocks_freed <= status->total_released_blks))
|
||||
+ freed_blocks = status->total_released_blks -
|
||||
wl->tx_blocks_freed;
|
||||
else
|
||||
freed_blocks = 0x100000000LL - wl->tx_blocks_freed +
|
||||
- le32_to_cpu(status_2->total_released_blks);
|
||||
+ status->total_released_blks;
|
||||
|
||||
- wl->tx_blocks_freed = le32_to_cpu(status_2->total_released_blks);
|
||||
+ wl->tx_blocks_freed = status->total_released_blks;
|
||||
|
||||
wl->tx_allocated_blocks -= freed_blocks;
|
||||
|
||||
@@ -458,7 +454,7 @@ static int wlcore_fw_status(struct wl127
|
||||
cancel_delayed_work(&wl->tx_watchdog_work);
|
||||
}
|
||||
|
||||
- avail = le32_to_cpu(status_2->tx_total) - wl->tx_allocated_blocks;
|
||||
+ avail = status->tx_total - wl->tx_allocated_blocks;
|
||||
|
||||
/*
|
||||
* The FW might change the total number of TX memblocks before
|
||||
@@ -477,15 +473,15 @@ static int wlcore_fw_status(struct wl127
|
||||
|
||||
/* for AP update num of allocated TX blocks per link and ps status */
|
||||
wl12xx_for_each_wlvif_ap(wl, wlvif) {
|
||||
- wl12xx_irq_update_links_status(wl, wlvif, status_2);
|
||||
+ wl12xx_irq_update_links_status(wl, wlvif, status);
|
||||
}
|
||||
|
||||
/* update the host-chipset time offset */
|
||||
getnstimeofday(&ts);
|
||||
wl->time_offset = (timespec_to_ns(&ts) >> 10) -
|
||||
- (s64)le32_to_cpu(status_2->fw_localtime);
|
||||
+ (s64)(status->fw_localtime);
|
||||
|
||||
- wl->fw_fast_lnk_map = le32_to_cpu(status_2->link_fast_bitmap);
|
||||
+ wl->fw_fast_lnk_map = status->link_fast_bitmap;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -549,13 +545,13 @@ static int wlcore_irq_locked(struct wl12
|
||||
clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
|
||||
smp_mb__after_clear_bit();
|
||||
|
||||
- ret = wlcore_fw_status(wl, wl->fw_status_1, wl->fw_status_2);
|
||||
+ ret = wlcore_fw_status(wl, wl->fw_status);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
wlcore_hw_tx_immediate_compl(wl);
|
||||
|
||||
- intr = le32_to_cpu(wl->fw_status_1->intr);
|
||||
+ intr = wl->fw_status->intr;
|
||||
intr &= WLCORE_ALL_INTR_MASK;
|
||||
if (!intr) {
|
||||
done = true;
|
||||
@@ -584,7 +580,7 @@ static int wlcore_irq_locked(struct wl12
|
||||
if (likely(intr & WL1271_ACX_INTR_DATA)) {
|
||||
wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
|
||||
|
||||
- ret = wlcore_rx(wl, wl->fw_status_1);
|
||||
+ ret = wlcore_rx(wl, wl->fw_status);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@@ -843,11 +839,11 @@ static void wl12xx_read_fwlog_panic(stru
|
||||
wl12xx_cmd_stop_fwlog(wl);
|
||||
|
||||
/* Read the first memory block address */
|
||||
- ret = wlcore_fw_status(wl, wl->fw_status_1, wl->fw_status_2);
|
||||
+ ret = wlcore_fw_status(wl, wl->fw_status);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
- addr = le32_to_cpu(wl->fw_status_2->log_start_addr);
|
||||
+ addr = wl->fw_status->log_start_addr;
|
||||
if (!addr)
|
||||
goto out;
|
||||
|
||||
@@ -990,23 +986,23 @@ static int wlcore_fw_wakeup(struct wl127
|
||||
|
||||
static int wl1271_setup(struct wl1271 *wl)
|
||||
{
|
||||
- wl->fw_status_1 = kzalloc(WLCORE_FW_STATUS_1_LEN(wl->num_rx_desc) +
|
||||
- sizeof(*wl->fw_status_2) +
|
||||
- wl->fw_status_priv_len, GFP_KERNEL);
|
||||
- if (!wl->fw_status_1)
|
||||
- return -ENOMEM;
|
||||
+ wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL);
|
||||
+ if (!wl->raw_fw_status)
|
||||
+ goto err;
|
||||
|
||||
- wl->fw_status_2 = (struct wl_fw_status_2 *)
|
||||
- (((u8 *) wl->fw_status_1) +
|
||||
- WLCORE_FW_STATUS_1_LEN(wl->num_rx_desc));
|
||||
+ wl->fw_status = kzalloc(sizeof(*wl->fw_status), GFP_KERNEL);
|
||||
+ if (!wl->fw_status)
|
||||
+ goto err;
|
||||
|
||||
wl->tx_res_if = kzalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
|
||||
- if (!wl->tx_res_if) {
|
||||
- kfree(wl->fw_status_1);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
+ if (!wl->tx_res_if)
|
||||
+ goto err;
|
||||
|
||||
return 0;
|
||||
+err:
|
||||
+ kfree(wl->fw_status);
|
||||
+ kfree(wl->raw_fw_status);
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
static int wl12xx_set_power_on(struct wl1271 *wl)
|
||||
@@ -1952,9 +1948,10 @@ static void wlcore_op_stop_locked(struct
|
||||
|
||||
wl1271_debugfs_reset(wl);
|
||||
|
||||
- kfree(wl->fw_status_1);
|
||||
- wl->fw_status_1 = NULL;
|
||||
- wl->fw_status_2 = NULL;
|
||||
+ kfree(wl->raw_fw_status);
|
||||
+ wl->raw_fw_status = NULL;
|
||||
+ kfree(wl->fw_status);
|
||||
+ wl->fw_status = NULL;
|
||||
kfree(wl->tx_res_if);
|
||||
wl->tx_res_if = NULL;
|
||||
kfree(wl->target_mem_map);
|
||||
@@ -6058,7 +6055,8 @@ int wlcore_free_hw(struct wl1271 *wl)
|
||||
kfree(wl->nvs);
|
||||
wl->nvs = NULL;
|
||||
|
||||
- kfree(wl->fw_status_1);
|
||||
+ kfree(wl->raw_fw_status);
|
||||
+ kfree(wl->fw_status);
|
||||
kfree(wl->tx_res_if);
|
||||
destroy_workqueue(wl->freezable_wq);
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/rx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/rx.c
|
||||
@@ -203,7 +203,7 @@ static int wl1271_rx_handle_data(struct
|
||||
return is_data;
|
||||
}
|
||||
|
||||
-int wlcore_rx(struct wl1271 *wl, struct wl_fw_status_1 *status)
|
||||
+int wlcore_rx(struct wl1271 *wl, struct wl_fw_status *status)
|
||||
{
|
||||
unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
|
||||
u32 buf_size;
|
||||
--- a/drivers/net/wireless/ti/wlcore/rx.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/rx.h
|
||||
@@ -142,7 +142,7 @@ struct wl1271_rx_descriptor {
|
||||
u8 reserved;
|
||||
} __packed;
|
||||
|
||||
-int wlcore_rx(struct wl1271 *wl, struct wl_fw_status_1 *status);
|
||||
+int wlcore_rx(struct wl1271 *wl, struct wl_fw_status *status);
|
||||
u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
|
||||
int wl1271_rx_filter_enable(struct wl1271 *wl,
|
||||
int index, bool enable,
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
@@ -73,6 +73,8 @@ struct wlcore_ops {
|
||||
void (*tx_immediate_compl)(struct wl1271 *wl);
|
||||
int (*hw_init)(struct wl1271 *wl);
|
||||
int (*init_vif)(struct wl1271 *wl, struct wl12xx_vif *wlvif);
|
||||
+ void (*convert_fw_status)(struct wl1271 *wl, void *raw_fw_status,
|
||||
+ struct wl_fw_status *fw_status);
|
||||
u32 (*sta_get_ap_rate_mask)(struct wl1271 *wl,
|
||||
struct wl12xx_vif *wlvif);
|
||||
int (*get_pg_ver)(struct wl1271 *wl, s8 *ver);
|
||||
@@ -348,8 +350,8 @@ struct wl1271 {
|
||||
u32 buffer_cmd;
|
||||
u32 buffer_busyword[WL1271_BUSY_WORD_CNT];
|
||||
|
||||
- struct wl_fw_status_1 *fw_status_1;
|
||||
- struct wl_fw_status_2 *fw_status_2;
|
||||
+ void *raw_fw_status;
|
||||
+ struct wl_fw_status *fw_status;
|
||||
struct wl1271_tx_hw_res_if *tx_res_if;
|
||||
|
||||
/* Current chipset configuration */
|
||||
@@ -450,6 +452,7 @@ struct wl1271 {
|
||||
struct ieee80211_sta_ht_cap ht_cap[WLCORE_NUM_BANDS];
|
||||
|
||||
/* size of the private FW status data */
|
||||
+ size_t fw_status_len;
|
||||
size_t fw_status_priv_len;
|
||||
|
||||
/* RX Data filter rule state - enabled/disabled */
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
@@ -120,70 +120,58 @@ struct wl1271_chip {
|
||||
|
||||
#define AP_MAX_STATIONS 8
|
||||
|
||||
-struct wl_fw_packet_counters {
|
||||
- /* Cumulative counter of released packets per AC */
|
||||
- u8 tx_released_pkts[NUM_TX_QUEUES];
|
||||
-
|
||||
- /* Cumulative counter of freed packets per HLID */
|
||||
- u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
|
||||
-
|
||||
- /* Cumulative counter of released Voice memory blocks */
|
||||
- u8 tx_voice_released_blks;
|
||||
-
|
||||
- /* Tx rate of the last transmitted packet */
|
||||
- u8 tx_last_rate;
|
||||
-
|
||||
- u8 padding[2];
|
||||
-} __packed;
|
||||
-
|
||||
-/* FW status registers */
|
||||
-struct wl_fw_status_1 {
|
||||
- __le32 intr;
|
||||
+struct wl_fw_status {
|
||||
+ u32 intr;
|
||||
u8 fw_rx_counter;
|
||||
u8 drv_rx_counter;
|
||||
- u8 reserved;
|
||||
u8 tx_results_counter;
|
||||
- __le32 rx_pkt_descs[0];
|
||||
-} __packed;
|
||||
-
|
||||
-/*
|
||||
- * Each HW arch has a different number of Rx descriptors.
|
||||
- * The length of the status depends on it, since it holds an array
|
||||
- * of descriptors.
|
||||
- */
|
||||
-#define WLCORE_FW_STATUS_1_LEN(num_rx_desc) \
|
||||
- (sizeof(struct wl_fw_status_1) + \
|
||||
- (sizeof(((struct wl_fw_status_1 *)0)->rx_pkt_descs[0])) * \
|
||||
- num_rx_desc)
|
||||
+ __le32 *rx_pkt_descs;
|
||||
|
||||
-struct wl_fw_status_2 {
|
||||
- __le32 fw_localtime;
|
||||
+ u32 fw_localtime;
|
||||
|
||||
/*
|
||||
* A bitmap (where each bit represents a single HLID)
|
||||
* to indicate if the station is in PS mode.
|
||||
*/
|
||||
- __le32 link_ps_bitmap;
|
||||
+ u32 link_ps_bitmap;
|
||||
|
||||
/*
|
||||
* A bitmap (where each bit represents a single HLID) to indicate
|
||||
* if the station is in Fast mode
|
||||
*/
|
||||
- __le32 link_fast_bitmap;
|
||||
+ u32 link_fast_bitmap;
|
||||
|
||||
/* Cumulative counter of total released mem blocks since FW-reset */
|
||||
- __le32 total_released_blks;
|
||||
+ u32 total_released_blks;
|
||||
|
||||
/* Size (in Memory Blocks) of TX pool */
|
||||
- __le32 tx_total;
|
||||
+ u32 tx_total;
|
||||
|
||||
- struct wl_fw_packet_counters counters;
|
||||
+ struct {
|
||||
+ /*
|
||||
+ * Cumulative counter of released packets per AC
|
||||
+ * (length of the array is NUM_TX_QUEUES)
|
||||
+ */
|
||||
+ u8 *tx_released_pkts;
|
||||
+
|
||||
+ /*
|
||||
+ * Cumulative counter of freed packets per HLID
|
||||
+ * (length of the array is WL12XX_MAX_LINKS)
|
||||
+ */
|
||||
+ u8 *tx_lnk_free_pkts;
|
||||
+
|
||||
+ /* Cumulative counter of released Voice memory blocks */
|
||||
+ u8 tx_voice_released_blks;
|
||||
+
|
||||
+ /* Tx rate of the last transmitted packet */
|
||||
+ u8 tx_last_rate;
|
||||
+ } counters;
|
||||
|
||||
- __le32 log_start_addr;
|
||||
+ u32 log_start_addr;
|
||||
|
||||
/* Private status to be used by the lower drivers */
|
||||
- u8 priv[0];
|
||||
-} __packed;
|
||||
+ void *priv;
|
||||
+};
|
||||
|
||||
#define WL1271_MAX_CHANNELS 64
|
||||
struct wl1271_scan {
|
|
@ -1,345 +0,0 @@
|
|||
Upcoming fw versions will have different max links support
|
||||
(according to the hw). Get ready for it by configuring
|
||||
wl->num_links per-hw, instead of using the const WL12XX_MAX_LINKS.
|
||||
|
||||
However, continue using WLCORE_MAX_LINKS in order to simplify
|
||||
structs declarations (we use it in multiple bitmaps, and converting
|
||||
them to dynamic arrays is just cumbersome).
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wl12xx/main.c | 3 +++
|
||||
drivers/net/wireless/ti/wl12xx/wl12xx.h | 2 ++
|
||||
drivers/net/wireless/ti/wl18xx/main.c | 3 +++
|
||||
drivers/net/wireless/ti/wl18xx/wl18xx.h | 4 +++-
|
||||
drivers/net/wireless/ti/wlcore/cmd.c | 4 ++--
|
||||
drivers/net/wireless/ti/wlcore/event.c | 4 ++--
|
||||
drivers/net/wireless/ti/wlcore/main.c | 12 ++++++++----
|
||||
drivers/net/wireless/ti/wlcore/rx.c | 8 ++++----
|
||||
drivers/net/wireless/ti/wlcore/tx.c | 20 ++++++++++----------
|
||||
drivers/net/wireless/ti/wlcore/wlcore.h | 8 +++++---
|
||||
drivers/net/wireless/ti/wlcore/wlcore_i.h | 13 +++++++++----
|
||||
11 files changed, 51 insertions(+), 30 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
||||
@@ -1749,9 +1749,12 @@ static int wl12xx_setup(struct wl1271 *w
|
||||
struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
|
||||
struct wl12xx_platform_data *pdata = pdev_data->pdata;
|
||||
|
||||
+ BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
|
||||
+
|
||||
wl->rtable = wl12xx_rtable;
|
||||
wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
|
||||
wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
|
||||
+ wl->num_links = WL12XX_MAX_LINKS;
|
||||
wl->num_channels = 1;
|
||||
wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
|
||||
wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
|
||||
--- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||||
@@ -65,6 +65,8 @@
|
||||
|
||||
#define WL12XX_RX_BA_MAX_SESSIONS 3
|
||||
|
||||
+#define WL12XX_MAX_LINKS 12
|
||||
+
|
||||
struct wl127x_rx_mem_pool_addr {
|
||||
u32 addr;
|
||||
u32 addr_extra;
|
||||
--- a/drivers/net/wireless/ti/wl18xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/main.c
|
||||
@@ -1752,9 +1752,12 @@ static int wl18xx_setup(struct wl1271 *w
|
||||
struct wl18xx_priv *priv = wl->priv;
|
||||
int ret;
|
||||
|
||||
+ BUILD_BUG_ON(WL18XX_MAX_LINKS > WLCORE_MAX_LINKS);
|
||||
+
|
||||
wl->rtable = wl18xx_rtable;
|
||||
wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS;
|
||||
wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
|
||||
+ wl->num_links = WL18XX_MAX_LINKS;
|
||||
wl->num_channels = 2;
|
||||
wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
|
||||
wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
|
||||
--- a/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
@@ -42,6 +42,8 @@
|
||||
|
||||
#define WL18XX_RX_BA_MAX_SESSIONS 5
|
||||
|
||||
+#define WL18XX_MAX_LINKS 12
|
||||
+
|
||||
struct wl18xx_priv {
|
||||
/* buffer for sending commands to FW */
|
||||
u8 cmd_buf[WL18XX_CMD_MAX_SIZE];
|
||||
@@ -114,7 +116,7 @@ struct wl18xx_fw_packet_counters {
|
||||
u8 tx_released_pkts[NUM_TX_QUEUES];
|
||||
|
||||
/* Cumulative counter of freed packets per HLID */
|
||||
- u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
|
||||
+ u8 tx_lnk_free_pkts[WL18XX_MAX_LINKS];
|
||||
|
||||
/* Cumulative counter of released Voice memory blocks */
|
||||
u8 tx_voice_released_blks;
|
||||
--- a/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
@@ -312,8 +312,8 @@ static int wlcore_get_new_session_id(str
|
||||
int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
|
||||
{
|
||||
unsigned long flags;
|
||||
- u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS);
|
||||
- if (link >= WL12XX_MAX_LINKS)
|
||||
+ u8 link = find_first_zero_bit(wl->links_map, wl->num_links);
|
||||
+ if (link >= wl->num_links)
|
||||
return -EBUSY;
|
||||
|
||||
wl->session_ids[link] = wlcore_get_new_session_id(wl, link);
|
||||
--- a/drivers/net/wireless/ti/wlcore/event.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/event.c
|
||||
@@ -68,7 +68,7 @@ static void wl1271_stop_ba_event(struct
|
||||
u8 hlid;
|
||||
struct wl1271_link *lnk;
|
||||
for_each_set_bit(hlid, wlvif->ap.sta_hlid_map,
|
||||
- WL12XX_MAX_LINKS) {
|
||||
+ wl->num_links) {
|
||||
lnk = &wl->links[hlid];
|
||||
if (!lnk->ba_bitmap)
|
||||
continue;
|
||||
@@ -173,7 +173,7 @@ static void wlcore_disconnect_sta(struct
|
||||
const u8 *addr;
|
||||
int h;
|
||||
|
||||
- for_each_set_bit(h, &sta_bitmap, WL12XX_MAX_LINKS) {
|
||||
+ for_each_set_bit(h, &sta_bitmap, wl->num_links) {
|
||||
bool found = false;
|
||||
/* find the ap vif connected to this sta */
|
||||
wl12xx_for_each_wlvif_ap(wl, wlvif) {
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -372,7 +372,7 @@ static void wl12xx_irq_update_links_stat
|
||||
wl->ap_fw_ps_map = cur_fw_ps_map;
|
||||
}
|
||||
|
||||
- for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, WL12XX_MAX_LINKS)
|
||||
+ for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links)
|
||||
wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
|
||||
wl->links[hlid].allocated_pkts);
|
||||
}
|
||||
@@ -412,7 +412,7 @@ static int wlcore_fw_status(struct wl127
|
||||
}
|
||||
|
||||
|
||||
- for_each_set_bit(i, wl->links_map, WL12XX_MAX_LINKS) {
|
||||
+ for_each_set_bit(i, wl->links_map, wl->num_links) {
|
||||
u8 diff;
|
||||
lnk = &wl->links[i];
|
||||
|
||||
@@ -5888,7 +5888,7 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
|
||||
int i, j, ret;
|
||||
unsigned int order;
|
||||
|
||||
- BUILD_BUG_ON(AP_MAX_STATIONS > WL12XX_MAX_LINKS);
|
||||
+ BUILD_BUG_ON(AP_MAX_STATIONS > WLCORE_MAX_LINKS);
|
||||
|
||||
hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
|
||||
if (!hw) {
|
||||
@@ -5911,8 +5911,12 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
|
||||
|
||||
wl->hw = hw;
|
||||
|
||||
+ /*
|
||||
+ * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
|
||||
+ * we don't allocate any additional resource here, so that's fine.
|
||||
+ */
|
||||
for (i = 0; i < NUM_TX_QUEUES; i++)
|
||||
- for (j = 0; j < WL12XX_MAX_LINKS; j++)
|
||||
+ for (j = 0; j < WLCORE_MAX_LINKS; j++)
|
||||
skb_queue_head_init(&wl->links[j].tx_queue[i]);
|
||||
|
||||
skb_queue_head_init(&wl->deferred_rx_queue);
|
||||
--- a/drivers/net/wireless/ti/wlcore/rx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/rx.c
|
||||
@@ -205,7 +205,7 @@ static int wl1271_rx_handle_data(struct
|
||||
|
||||
int wlcore_rx(struct wl1271 *wl, struct wl_fw_status *status)
|
||||
{
|
||||
- unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
|
||||
+ unsigned long active_hlids[BITS_TO_LONGS(WLCORE_MAX_LINKS)] = {0};
|
||||
u32 buf_size;
|
||||
u32 fw_rx_counter = status->fw_rx_counter % wl->num_rx_desc;
|
||||
u32 drv_rx_counter = wl->rx_counter % wl->num_rx_desc;
|
||||
@@ -263,12 +263,12 @@ int wlcore_rx(struct wl1271 *wl, struct
|
||||
wl->aggr_buf + pkt_offset,
|
||||
pkt_len, rx_align,
|
||||
&hlid) == 1) {
|
||||
- if (hlid < WL12XX_MAX_LINKS)
|
||||
+ if (hlid < wl->num_links)
|
||||
__set_bit(hlid, active_hlids);
|
||||
else
|
||||
WARN(1,
|
||||
- "hlid exceeded WL12XX_MAX_LINKS "
|
||||
- "(%d)\n", hlid);
|
||||
+ "hlid (%d) exceeded MAX_LINKS\n",
|
||||
+ hlid);
|
||||
}
|
||||
|
||||
wl->rx_counter++;
|
||||
--- a/drivers/net/wireless/ti/wlcore/tx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/tx.c
|
||||
@@ -565,11 +565,11 @@ static struct sk_buff *wlcore_vif_dequeu
|
||||
int i, h, start_hlid;
|
||||
|
||||
/* start from the link after the last one */
|
||||
- start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
|
||||
+ start_hlid = (wlvif->last_tx_hlid + 1) % wl->num_links;
|
||||
|
||||
/* dequeue according to AC, round robin on each link */
|
||||
- for (i = 0; i < WL12XX_MAX_LINKS; i++) {
|
||||
- h = (start_hlid + i) % WL12XX_MAX_LINKS;
|
||||
+ for (i = 0; i < wl->num_links; i++) {
|
||||
+ h = (start_hlid + i) % wl->num_links;
|
||||
|
||||
/* only consider connected stations */
|
||||
if (!test_bit(h, wlvif->links_map))
|
||||
@@ -693,8 +693,8 @@ static void wl1271_skb_queue_head(struct
|
||||
skb_queue_head(&wl->links[hlid].tx_queue[q], skb);
|
||||
|
||||
/* make sure we dequeue the same packet next time */
|
||||
- wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
|
||||
- WL12XX_MAX_LINKS;
|
||||
+ wlvif->last_tx_hlid = (hlid + wl->num_links - 1) %
|
||||
+ wl->num_links;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&wl->wl_lock, flags);
|
||||
@@ -727,7 +727,7 @@ void wl12xx_rearm_rx_streaming(struct wl
|
||||
timeout = wl->conf.rx_streaming.duration;
|
||||
wl12xx_for_each_wlvif_sta(wl, wlvif) {
|
||||
bool found = false;
|
||||
- for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
|
||||
+ for_each_set_bit(hlid, active_hlids, wl->num_links) {
|
||||
if (test_bit(hlid, wlvif->links_map)) {
|
||||
found = true;
|
||||
break;
|
||||
@@ -764,7 +764,7 @@ int wlcore_tx_work_locked(struct wl1271
|
||||
struct wl1271_tx_hw_descr *desc;
|
||||
u32 buf_offset = 0, last_len = 0;
|
||||
bool sent_packets = false;
|
||||
- unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
|
||||
+ unsigned long active_hlids[BITS_TO_LONGS(WLCORE_MAX_LINKS)] = {0};
|
||||
int ret = 0;
|
||||
int bus_ret = 0;
|
||||
u8 hlid;
|
||||
@@ -1066,7 +1066,7 @@ void wl12xx_tx_reset_wlvif(struct wl1271
|
||||
int i;
|
||||
|
||||
/* TX failure */
|
||||
- for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
|
||||
+ for_each_set_bit(i, wlvif->links_map, wl->num_links) {
|
||||
if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
|
||||
i != wlvif->ap.bcast_hlid && i != wlvif->ap.global_hlid) {
|
||||
/* this calls wl12xx_free_link */
|
||||
@@ -1090,7 +1090,7 @@ void wl12xx_tx_reset(struct wl1271 *wl)
|
||||
|
||||
/* only reset the queues if something bad happened */
|
||||
if (wl1271_tx_total_queue_count(wl) != 0) {
|
||||
- for (i = 0; i < WL12XX_MAX_LINKS; i++)
|
||||
+ for (i = 0; i < wl->num_links; i++)
|
||||
wl1271_tx_reset_link_queues(wl, i);
|
||||
|
||||
for (i = 0; i < NUM_TX_QUEUES; i++)
|
||||
@@ -1183,7 +1183,7 @@ void wl1271_tx_flush(struct wl1271 *wl)
|
||||
WL1271_TX_FLUSH_TIMEOUT / 1000);
|
||||
|
||||
/* forcibly flush all Tx buffers on our queues */
|
||||
- for (i = 0; i < WL12XX_MAX_LINKS; i++)
|
||||
+ for (i = 0; i < wl->num_links; i++)
|
||||
wl1271_tx_reset_link_queues(wl, i);
|
||||
|
||||
out_wake:
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
@@ -224,7 +224,7 @@ struct wl1271 {
|
||||
int channel;
|
||||
u8 system_hlid;
|
||||
|
||||
- unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
|
||||
+ unsigned long links_map[BITS_TO_LONGS(WLCORE_MAX_LINKS)];
|
||||
unsigned long roles_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
||||
unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
||||
unsigned long rate_policies_map[
|
||||
@@ -232,7 +232,7 @@ struct wl1271 {
|
||||
unsigned long klv_templates_map[
|
||||
BITS_TO_LONGS(WLCORE_MAX_KLV_TEMPLATES)];
|
||||
|
||||
- u8 session_ids[WL12XX_MAX_LINKS];
|
||||
+ u8 session_ids[WLCORE_MAX_LINKS];
|
||||
|
||||
struct list_head wlvif_list;
|
||||
|
||||
@@ -380,7 +380,7 @@ struct wl1271 {
|
||||
* AP-mode - links indexed by HLID. The global and broadcast links
|
||||
* are always active.
|
||||
*/
|
||||
- struct wl1271_link links[WL12XX_MAX_LINKS];
|
||||
+ struct wl1271_link links[WLCORE_MAX_LINKS];
|
||||
|
||||
/* number of currently active links */
|
||||
int active_link_count;
|
||||
@@ -438,6 +438,8 @@ struct wl1271 {
|
||||
u32 num_tx_desc;
|
||||
/* number of RX descriptors the HW supports. */
|
||||
u32 num_rx_desc;
|
||||
+ /* number of links the HW supports */
|
||||
+ u8 num_links;
|
||||
|
||||
/* translate HW Tx rates to standard rate-indices */
|
||||
const u8 **band_rate_to_idx;
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
@@ -58,10 +58,15 @@
|
||||
#define WL1271_DEFAULT_DTIM_PERIOD 1
|
||||
|
||||
#define WL12XX_MAX_ROLES 4
|
||||
-#define WL12XX_MAX_LINKS 12
|
||||
#define WL12XX_INVALID_ROLE_ID 0xff
|
||||
#define WL12XX_INVALID_LINK_ID 0xff
|
||||
|
||||
+/*
|
||||
+ * max number of links allowed by all HWs.
|
||||
+ * this is NOT the actual max links supported by the current hw.
|
||||
+ */
|
||||
+#define WLCORE_MAX_LINKS 12
|
||||
+
|
||||
/* the driver supports the 2.4Ghz and 5Ghz bands */
|
||||
#define WLCORE_NUM_BANDS 2
|
||||
|
||||
@@ -156,7 +161,7 @@ struct wl_fw_status {
|
||||
|
||||
/*
|
||||
* Cumulative counter of freed packets per HLID
|
||||
- * (length of the array is WL12XX_MAX_LINKS)
|
||||
+ * (length of the array is wl->num_links)
|
||||
*/
|
||||
u8 *tx_lnk_free_pkts;
|
||||
|
||||
@@ -357,7 +362,7 @@ struct wl12xx_vif {
|
||||
|
||||
/* HLIDs bitmap of associated stations */
|
||||
unsigned long sta_hlid_map[BITS_TO_LONGS(
|
||||
- WL12XX_MAX_LINKS)];
|
||||
+ WLCORE_MAX_LINKS)];
|
||||
|
||||
/* recoreded keys - set here before AP startup */
|
||||
struct wl1271_ap_key *recorded_keys[MAX_NUM_KEYS];
|
||||
@@ -374,7 +379,7 @@ struct wl12xx_vif {
|
||||
/* counters of packets per AC, across all links in the vif */
|
||||
int tx_queue_count[NUM_TX_QUEUES];
|
||||
|
||||
- unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
|
||||
+ unsigned long links_map[BITS_TO_LONGS(WLCORE_MAX_LINKS)];
|
||||
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
|
||||
u8 ssid_len;
|
|
@ -1,110 +0,0 @@
|
|||
Each hw supports a different max stations (connected to the
|
||||
same ap). add a new wl->max_ap_stations and use it instead
|
||||
of the current common AP_MAX_STATIONS.
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wl12xx/main.c | 2 ++
|
||||
drivers/net/wireless/ti/wl12xx/wl12xx.h | 1 +
|
||||
drivers/net/wireless/ti/wl18xx/main.c | 2 ++
|
||||
drivers/net/wireless/ti/wl18xx/wl18xx.h | 1 +
|
||||
drivers/net/wireless/ti/wlcore/main.c | 4 +---
|
||||
drivers/net/wireless/ti/wlcore/wlcore.h | 2 ++
|
||||
drivers/net/wireless/ti/wlcore/wlcore_i.h | 2 --
|
||||
7 files changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
||||
@@ -1750,11 +1750,13 @@ static int wl12xx_setup(struct wl1271 *w
|
||||
struct wl12xx_platform_data *pdata = pdev_data->pdata;
|
||||
|
||||
BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
|
||||
+ BUILD_BUG_ON(WL12XX_MAX_AP_STATIONS > WL12XX_MAX_LINKS);
|
||||
|
||||
wl->rtable = wl12xx_rtable;
|
||||
wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
|
||||
wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
|
||||
wl->num_links = WL12XX_MAX_LINKS;
|
||||
+ wl->max_ap_stations = WL12XX_MAX_AP_STATIONS;
|
||||
wl->num_channels = 1;
|
||||
wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
|
||||
wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
|
||||
--- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||||
@@ -65,6 +65,7 @@
|
||||
|
||||
#define WL12XX_RX_BA_MAX_SESSIONS 3
|
||||
|
||||
+#define WL12XX_MAX_AP_STATIONS 8
|
||||
#define WL12XX_MAX_LINKS 12
|
||||
|
||||
struct wl127x_rx_mem_pool_addr {
|
||||
--- a/drivers/net/wireless/ti/wl18xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/main.c
|
||||
@@ -1753,11 +1753,13 @@ static int wl18xx_setup(struct wl1271 *w
|
||||
int ret;
|
||||
|
||||
BUILD_BUG_ON(WL18XX_MAX_LINKS > WLCORE_MAX_LINKS);
|
||||
+ BUILD_BUG_ON(WL18XX_MAX_AP_STATIONS > WL18XX_MAX_LINKS);
|
||||
|
||||
wl->rtable = wl18xx_rtable;
|
||||
wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS;
|
||||
wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
|
||||
wl->num_links = WL18XX_MAX_LINKS;
|
||||
+ wl->max_ap_stations = WL18XX_MAX_AP_STATIONS;
|
||||
wl->num_channels = 2;
|
||||
wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
|
||||
wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
|
||||
--- a/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
@@ -42,6 +42,7 @@
|
||||
|
||||
#define WL18XX_RX_BA_MAX_SESSIONS 5
|
||||
|
||||
+#define WL18XX_MAX_AP_STATIONS 8
|
||||
#define WL18XX_MAX_LINKS 12
|
||||
|
||||
struct wl18xx_priv {
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -4695,7 +4695,7 @@ static int wl1271_allocate_sta(struct wl
|
||||
int ret;
|
||||
|
||||
|
||||
- if (wl->active_sta_count >= AP_MAX_STATIONS) {
|
||||
+ if (wl->active_sta_count >= wl->max_ap_stations) {
|
||||
wl1271_warning("could not allocate HLID - too much stations");
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -5888,8 +5888,6 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
|
||||
int i, j, ret;
|
||||
unsigned int order;
|
||||
|
||||
- BUILD_BUG_ON(AP_MAX_STATIONS > WLCORE_MAX_LINKS);
|
||||
-
|
||||
hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
|
||||
if (!hw) {
|
||||
wl1271_error("could not alloc ieee80211_hw");
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
@@ -440,6 +440,8 @@ struct wl1271 {
|
||||
u32 num_rx_desc;
|
||||
/* number of links the HW supports */
|
||||
u8 num_links;
|
||||
+ /* max stations a single AP can support */
|
||||
+ u8 max_ap_stations;
|
||||
|
||||
/* translate HW Tx rates to standard rate-indices */
|
||||
const u8 **band_rate_to_idx;
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
@@ -123,8 +123,6 @@ struct wl1271_chip {
|
||||
|
||||
#define NUM_TX_QUEUES 4
|
||||
|
||||
-#define AP_MAX_STATIONS 8
|
||||
-
|
||||
struct wl_fw_status {
|
||||
u32 intr;
|
||||
u8 fw_rx_counter;
|
|
@ -1,176 +0,0 @@
|
|||
Each hw supports a different iface combinations.
|
||||
Define the supported combinations in each driver,
|
||||
and save it in wl->iface_combinations.
|
||||
|
||||
Since each driver defines its own combinations now,
|
||||
it can also define its max supported channels, so
|
||||
we no longer need to save and set it explicitly
|
||||
in wlcore.
|
||||
|
||||
Update wl18xx interface combinations to allow
|
||||
multiple APs.
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wl12xx/main.c | 26 +++++++++++++++++++++-
|
||||
drivers/net/wireless/ti/wl18xx/main.c | 39 ++++++++++++++++++++++++++++++++-
|
||||
drivers/net/wireless/ti/wlcore/main.c | 28 ++---------------------
|
||||
drivers/net/wireless/ti/wlcore/wlcore.h | 5 +++--
|
||||
4 files changed, 68 insertions(+), 30 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
||||
@@ -1743,6 +1743,29 @@ static struct ieee80211_sta_ht_cap wl12x
|
||||
},
|
||||
};
|
||||
|
||||
+static const struct ieee80211_iface_limit wl12xx_iface_limits[] = {
|
||||
+ {
|
||||
+ .max = 3,
|
||||
+ .types = BIT(NL80211_IFTYPE_STATION),
|
||||
+ },
|
||||
+ {
|
||||
+ .max = 1,
|
||||
+ .types = BIT(NL80211_IFTYPE_AP) |
|
||||
+ BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
+ BIT(NL80211_IFTYPE_P2P_CLIENT),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct ieee80211_iface_combination
|
||||
+wl12xx_iface_combinations[] = {
|
||||
+ {
|
||||
+ .max_interfaces = 3,
|
||||
+ .limits = wl12xx_iface_limits,
|
||||
+ .n_limits = ARRAY_SIZE(wl12xx_iface_limits),
|
||||
+ .num_different_channels = 1,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static int wl12xx_setup(struct wl1271 *wl)
|
||||
{
|
||||
struct wl12xx_priv *priv = wl->priv;
|
||||
@@ -1757,7 +1780,8 @@ static int wl12xx_setup(struct wl1271 *w
|
||||
wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
|
||||
wl->num_links = WL12XX_MAX_LINKS;
|
||||
wl->max_ap_stations = WL12XX_MAX_AP_STATIONS;
|
||||
- wl->num_channels = 1;
|
||||
+ wl->iface_combinations = wl12xx_iface_combinations;
|
||||
+ wl->n_iface_combinations = ARRAY_SIZE(wl12xx_iface_combinations);
|
||||
wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
|
||||
wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
|
||||
wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
|
||||
--- a/drivers/net/wireless/ti/wl18xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/main.c
|
||||
@@ -1747,6 +1747,42 @@ static struct ieee80211_sta_ht_cap wl18x
|
||||
},
|
||||
};
|
||||
|
||||
+static const struct ieee80211_iface_limit wl18xx_iface_limits[] = {
|
||||
+ {
|
||||
+ .max = 3,
|
||||
+ .types = BIT(NL80211_IFTYPE_STATION),
|
||||
+ },
|
||||
+ {
|
||||
+ .max = 1,
|
||||
+ .types = BIT(NL80211_IFTYPE_AP) |
|
||||
+ BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
+ BIT(NL80211_IFTYPE_P2P_CLIENT),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct ieee80211_iface_limit wl18xx_iface_ap_limits[] = {
|
||||
+ {
|
||||
+ .max = 2,
|
||||
+ .types = BIT(NL80211_IFTYPE_AP),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct ieee80211_iface_combination
|
||||
+wl18xx_iface_combinations[] = {
|
||||
+ {
|
||||
+ .max_interfaces = 3,
|
||||
+ .limits = wl18xx_iface_limits,
|
||||
+ .n_limits = ARRAY_SIZE(wl18xx_iface_limits),
|
||||
+ .num_different_channels = 2,
|
||||
+ },
|
||||
+ {
|
||||
+ .max_interfaces = 2,
|
||||
+ .limits = wl18xx_iface_ap_limits,
|
||||
+ .n_limits = ARRAY_SIZE(wl18xx_iface_ap_limits),
|
||||
+ .num_different_channels = 1,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
static int wl18xx_setup(struct wl1271 *wl)
|
||||
{
|
||||
struct wl18xx_priv *priv = wl->priv;
|
||||
@@ -1760,7 +1796,8 @@ static int wl18xx_setup(struct wl1271 *w
|
||||
wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
|
||||
wl->num_links = WL18XX_MAX_LINKS;
|
||||
wl->max_ap_stations = WL18XX_MAX_AP_STATIONS;
|
||||
- wl->num_channels = 2;
|
||||
+ wl->iface_combinations = wl18xx_iface_combinations;
|
||||
+ wl->n_iface_combinations = ARRAY_SIZE(wl18xx_iface_combinations);
|
||||
wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
|
||||
wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
|
||||
wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX;
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -5723,28 +5723,6 @@ static void wl1271_unregister_hw(struct
|
||||
|
||||
}
|
||||
|
||||
-static const struct ieee80211_iface_limit wlcore_iface_limits[] = {
|
||||
- {
|
||||
- .max = 3,
|
||||
- .types = BIT(NL80211_IFTYPE_STATION),
|
||||
- },
|
||||
- {
|
||||
- .max = 1,
|
||||
- .types = BIT(NL80211_IFTYPE_AP) |
|
||||
- BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
- BIT(NL80211_IFTYPE_P2P_CLIENT),
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static struct ieee80211_iface_combination
|
||||
-wlcore_iface_combinations[] = {
|
||||
- {
|
||||
- .max_interfaces = 3,
|
||||
- .limits = wlcore_iface_limits,
|
||||
- .n_limits = ARRAY_SIZE(wlcore_iface_limits),
|
||||
- },
|
||||
-};
|
||||
-
|
||||
static int wl1271_init_ieee80211(struct wl1271 *wl)
|
||||
{
|
||||
int i;
|
||||
@@ -5865,10 +5843,8 @@ static int wl1271_init_ieee80211(struct
|
||||
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
|
||||
|
||||
/* allowed interface combinations */
|
||||
- wlcore_iface_combinations[0].num_different_channels = wl->num_channels;
|
||||
- wl->hw->wiphy->iface_combinations = wlcore_iface_combinations;
|
||||
- wl->hw->wiphy->n_iface_combinations =
|
||||
- ARRAY_SIZE(wlcore_iface_combinations);
|
||||
+ wl->hw->wiphy->iface_combinations = wl->iface_combinations;
|
||||
+ wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations;
|
||||
|
||||
SET_IEEE80211_DEV(wl->hw, wl->dev);
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
@@ -485,8 +485,9 @@ struct wl1271 {
|
||||
|
||||
struct completion nvs_loading_complete;
|
||||
|
||||
- /* number of concurrent channels the HW supports */
|
||||
- u32 num_channels;
|
||||
+ /* interface combinations supported by the hw */
|
||||
+ const struct ieee80211_iface_combination *iface_combinations;
|
||||
+ u8 n_iface_combinations;
|
||||
};
|
||||
|
||||
int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);
|
|
@ -1,200 +0,0 @@
|
|||
Bump the min wl18xx fw version to 8.8.0.0.13
|
||||
|
||||
This fw is not backward compatible with older
|
||||
firmware (due to api changes), so use bump
|
||||
the firmware name as well.
|
||||
|
||||
Some modifications were done to the driver-fw api
|
||||
in order to support multiple APs.
|
||||
|
||||
Additionally, some of the consts (such as max stations,
|
||||
max links and max RX BA sessions) were changed.
|
||||
|
||||
Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wl18xx/main.c | 2 +-
|
||||
drivers/net/wireless/ti/wl18xx/wl18xx.h | 10 +++++-----
|
||||
drivers/net/wireless/ti/wlcore/acx.c | 4 +++-
|
||||
drivers/net/wireless/ti/wlcore/acx.h | 6 ++++--
|
||||
drivers/net/wireless/ti/wlcore/cmd.c | 5 ++++-
|
||||
drivers/net/wireless/ti/wlcore/cmd.h | 7 +++++--
|
||||
drivers/net/wireless/ti/wlcore/main.c | 2 +-
|
||||
drivers/net/wireless/ti/wlcore/tx.c | 2 +-
|
||||
drivers/net/wireless/ti/wlcore/wlcore_i.h | 2 +-
|
||||
9 files changed, 25 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl18xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/main.c
|
||||
@@ -648,7 +648,7 @@ static const struct wl18xx_clk_cfg wl18x
|
||||
};
|
||||
|
||||
/* TODO: maybe move to a new header file? */
|
||||
-#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-2.bin"
|
||||
+#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-3.bin"
|
||||
|
||||
static int wl18xx_identify_chip(struct wl1271 *wl)
|
||||
{
|
||||
--- a/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
+++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||||
@@ -26,10 +26,10 @@
|
||||
|
||||
/* minimum FW required for driver */
|
||||
#define WL18XX_CHIP_VER 8
|
||||
-#define WL18XX_IFTYPE_VER 5
|
||||
+#define WL18XX_IFTYPE_VER 8
|
||||
#define WL18XX_MAJOR_VER WLCORE_FW_VER_IGNORE
|
||||
#define WL18XX_SUBTYPE_VER WLCORE_FW_VER_IGNORE
|
||||
-#define WL18XX_MINOR_VER 39
|
||||
+#define WL18XX_MINOR_VER 13
|
||||
|
||||
#define WL18XX_CMD_MAX_SIZE 740
|
||||
|
||||
@@ -40,10 +40,10 @@
|
||||
|
||||
#define WL18XX_NUM_MAC_ADDRESSES 3
|
||||
|
||||
-#define WL18XX_RX_BA_MAX_SESSIONS 5
|
||||
+#define WL18XX_RX_BA_MAX_SESSIONS 13
|
||||
|
||||
-#define WL18XX_MAX_AP_STATIONS 8
|
||||
-#define WL18XX_MAX_LINKS 12
|
||||
+#define WL18XX_MAX_AP_STATIONS 10
|
||||
+#define WL18XX_MAX_LINKS 16
|
||||
|
||||
struct wl18xx_priv {
|
||||
/* buffer for sending commands to FW */
|
||||
--- a/drivers/net/wireless/ti/wlcore/acx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/acx.c
|
||||
@@ -1591,7 +1591,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr)
|
||||
+int wl1271_acx_set_inconnection_sta(struct wl1271 *wl,
|
||||
+ struct wl12xx_vif *wlvif, u8 *addr)
|
||||
{
|
||||
struct wl1271_acx_inconnection_sta *acx = NULL;
|
||||
int ret;
|
||||
@@ -1603,6 +1604,7 @@ int wl1271_acx_set_inconnection_sta(stru
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(acx->addr, addr, ETH_ALEN);
|
||||
+ acx->role_id = wlvif->role_id;
|
||||
|
||||
ret = wl1271_cmd_configure(wl, ACX_UPDATE_INCONNECTION_STA_LIST,
|
||||
acx, sizeof(*acx));
|
||||
--- a/drivers/net/wireless/ti/wlcore/acx.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/acx.h
|
||||
@@ -824,7 +824,8 @@ struct wl1271_acx_inconnection_sta {
|
||||
struct acx_header header;
|
||||
|
||||
u8 addr[ETH_ALEN];
|
||||
- u8 padding1[2];
|
||||
+ u8 role_id;
|
||||
+ u8 padding;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
@@ -1118,7 +1119,8 @@ int wl1271_acx_ps_rx_streaming(struct wl
|
||||
bool enable);
|
||||
int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif);
|
||||
int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif);
|
||||
-int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr);
|
||||
+int wl1271_acx_set_inconnection_sta(struct wl1271 *wl,
|
||||
+ struct wl12xx_vif *wlvif, u8 *addr);
|
||||
int wl1271_acx_fm_coex(struct wl1271 *wl);
|
||||
int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl);
|
||||
int wl12xx_acx_config_hangover(struct wl1271 *wl);
|
||||
--- a/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
@@ -1532,6 +1532,7 @@ int wl12xx_cmd_add_peer(struct wl1271 *w
|
||||
cmd->sp_len = sta->max_sp;
|
||||
cmd->wmm = sta->wme ? 1 : 0;
|
||||
cmd->session_id = wl->session_ids[hlid];
|
||||
+ cmd->role_id = wlvif->role_id;
|
||||
|
||||
for (i = 0; i < NUM_ACCESS_CATEGORIES_COPY; i++)
|
||||
if (sta->wme && (sta->uapsd_queues & BIT(i)))
|
||||
@@ -1568,7 +1569,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid)
|
||||
+int wl12xx_cmd_remove_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
||||
+ u8 hlid)
|
||||
{
|
||||
struct wl12xx_cmd_remove_peer *cmd;
|
||||
int ret;
|
||||
@@ -1586,6 +1588,7 @@ int wl12xx_cmd_remove_peer(struct wl1271
|
||||
/* We never send a deauth, mac80211 is in charge of this */
|
||||
cmd->reason_opcode = 0;
|
||||
cmd->send_deauth_flag = 0;
|
||||
+ cmd->role_id = wlvif->role_id;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_REMOVE_PEER, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
--- a/drivers/net/wireless/ti/wlcore/cmd.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/cmd.h
|
||||
@@ -88,7 +88,8 @@ int wl12xx_roc(struct wl1271 *wl, struct
|
||||
int wl12xx_croc(struct wl1271 *wl, u8 role_id);
|
||||
int wl12xx_cmd_add_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
||||
struct ieee80211_sta *sta, u8 hlid);
|
||||
-int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid);
|
||||
+int wl12xx_cmd_remove_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
||||
+ u8 hlid);
|
||||
void wlcore_set_pending_regdomain_ch(struct wl1271 *wl, u16 channel,
|
||||
enum ieee80211_band band);
|
||||
int wlcore_cmd_regdomain_config_locked(struct wl1271 *wl);
|
||||
@@ -594,6 +595,8 @@ struct wl12xx_cmd_add_peer {
|
||||
u8 sp_len;
|
||||
u8 wmm;
|
||||
u8 session_id;
|
||||
+ u8 role_id;
|
||||
+ u8 padding[3];
|
||||
} __packed;
|
||||
|
||||
struct wl12xx_cmd_remove_peer {
|
||||
@@ -602,7 +605,7 @@ struct wl12xx_cmd_remove_peer {
|
||||
u8 hlid;
|
||||
u8 reason_opcode;
|
||||
u8 send_deauth_flag;
|
||||
- u8 padding1;
|
||||
+ u8 role_id;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -4798,7 +4798,7 @@ static int wl12xx_sta_remove(struct wl12
|
||||
if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map)))
|
||||
return -EINVAL;
|
||||
|
||||
- ret = wl12xx_cmd_remove_peer(wl, wl_sta->hlid);
|
||||
+ ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/tx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/tx.c
|
||||
@@ -101,7 +101,7 @@ static void wl1271_tx_ap_update_inconnec
|
||||
* authentication response. this way it won't get de-authed by FW
|
||||
* when transmitting too soon.
|
||||
*/
|
||||
- wl1271_acx_set_inconnection_sta(wl, hdr->addr1);
|
||||
+ wl1271_acx_set_inconnection_sta(wl, wlvif, hdr->addr1);
|
||||
|
||||
/*
|
||||
* ROC for 1 second on the AP channel for completing the connection.
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||||
@@ -65,7 +65,7 @@
|
||||
* max number of links allowed by all HWs.
|
||||
* this is NOT the actual max links supported by the current hw.
|
||||
*/
|
||||
-#define WLCORE_MAX_LINKS 12
|
||||
+#define WLCORE_MAX_LINKS 16
|
||||
|
||||
/* the driver supports the 2.4Ghz and 5Ghz bands */
|
||||
#define WLCORE_NUM_BANDS 2
|
|
@ -1,37 +0,0 @@
|
|||
Send EAPOL frames with voice priority by setting (the new)
|
||||
TX_HW_ATTR_EAPOL_FRAME bit in tx attribute.
|
||||
|
||||
Sending EAPOL with voice priority fixes re-key
|
||||
timeout issues during heavy traffic.
|
||||
|
||||
Signed-off-by: Igal Chernobelsky <igalc@ti.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/tx.c | 4 ++++
|
||||
drivers/net/wireless/ti/wlcore/tx.h | 1 +
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/tx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/tx.c
|
||||
@@ -362,6 +362,10 @@ static void wl1271_tx_fill_hdr(struct wl
|
||||
ieee80211_has_protected(frame_control))
|
||||
tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;
|
||||
|
||||
+ /* send EAPOL frames as voice */
|
||||
+ if (control->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO)
|
||||
+ tx_attr |= TX_HW_ATTR_EAPOL_FRAME;
|
||||
+
|
||||
desc->tx_attr = cpu_to_le16(tx_attr);
|
||||
|
||||
wlcore_hw_set_tx_desc_csum(wl, desc, skb);
|
||||
--- a/drivers/net/wireless/ti/wlcore/tx.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/tx.h
|
||||
@@ -37,6 +37,7 @@
|
||||
#define TX_HW_ATTR_TX_CMPLT_REQ BIT(12)
|
||||
#define TX_HW_ATTR_TX_DUMMY_REQ BIT(13)
|
||||
#define TX_HW_ATTR_HOST_ENCRYPT BIT(14)
|
||||
+#define TX_HW_ATTR_EAPOL_FRAME BIT(15)
|
||||
|
||||
#define TX_HW_ATTR_OFST_SAVE_RETRIES 0
|
||||
#define TX_HW_ATTR_OFST_HEADER_PAD 1
|
|
@ -1,25 +0,0 @@
|
|||
Stopping sched scan on interface removal (during recovery)
|
||||
is no longer needed, as sched scanning is automatically
|
||||
restarted by mac80211.
|
||||
|
||||
Signed-off-by: Barak Bercovitz <barak@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/main.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -2582,10 +2582,8 @@ static void __wl1271_op_remove_interface
|
||||
ieee80211_scan_completed(wl->hw, true);
|
||||
}
|
||||
|
||||
- if (wl->sched_vif == wlvif) {
|
||||
- ieee80211_sched_scan_stopped(wl->hw);
|
||||
+ if (wl->sched_vif == wlvif)
|
||||
wl->sched_vif = NULL;
|
||||
- }
|
||||
|
||||
if (wl->roc_vif == vif) {
|
||||
wl->roc_vif = NULL;
|
|
@ -1,47 +0,0 @@
|
|||
12xx chips allow only OFDM rates in AP mode for BT-Coex purposes. This
|
||||
is no longer required in 18xx chips, starting with FW 8.6.0.0.8.
|
||||
|
||||
Update the min allowed FW version in 18xx to support this functionality.
|
||||
|
||||
Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wl12xx/main.c | 1 +
|
||||
drivers/net/wireless/ti/wlcore/init.c | 2 +-
|
||||
drivers/net/wireless/ti/wlcore/wlcore.h | 3 +++
|
||||
3 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
||||
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
||||
@@ -1789,6 +1789,7 @@ static int wl12xx_setup(struct wl1271 *w
|
||||
wl->fw_status_len = sizeof(struct wl12xx_fw_status);
|
||||
wl->fw_status_priv_len = 0;
|
||||
wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
|
||||
+ wl->ofdm_only_ap = true;
|
||||
wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ, &wl12xx_ht_cap);
|
||||
wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap);
|
||||
wl12xx_conf_init(wl);
|
||||
--- a/drivers/net/wireless/ti/wlcore/init.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/init.c
|
||||
@@ -462,7 +462,7 @@ int wl1271_init_ap_rates(struct wl1271 *
|
||||
* If the basic rates contain OFDM rates, use OFDM only
|
||||
* rates for unicast TX as well. Else use all supported rates.
|
||||
*/
|
||||
- if ((wlvif->basic_rate_set & CONF_TX_OFDM_RATES))
|
||||
+ if (wl->ofdm_only_ap && (wlvif->basic_rate_set & CONF_TX_OFDM_RATES))
|
||||
supported_rates = CONF_TX_OFDM_RATES;
|
||||
else
|
||||
supported_rates = CONF_TX_ENABLED_RATES;
|
||||
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||||
@@ -409,6 +409,9 @@ struct wl1271 {
|
||||
/* AP-mode - number of currently connected stations */
|
||||
int active_sta_count;
|
||||
|
||||
+ /* Flag determining whether AP should broadcast OFDM-only rates */
|
||||
+ bool ofdm_only_ap;
|
||||
+
|
||||
/* last wlvif we transmitted from */
|
||||
struct wl12xx_vif *last_wlvif;
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
mac80211 unsets the default wep key on disassoc.
|
||||
The fw doesn't support this notification, so simply
|
||||
ignore it.
|
||||
|
||||
The actual flow actually triggers fw recovery in some
|
||||
cases, as mac80211 unsets the default key only after
|
||||
disassoc, when wlvif->sta.hlid, resulting in invalid
|
||||
hlid being passed to the fw.
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/main.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -3505,6 +3505,10 @@ static void wl1271_op_set_default_key_id
|
||||
wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d",
|
||||
key_idx);
|
||||
|
||||
+ /* we don't handle unsetting of default key */
|
||||
+ if (key_idx == -1)
|
||||
+ return;
|
||||
+
|
||||
mutex_lock(&wl->mutex);
|
||||
|
||||
if (unlikely(wl->state != WLCORE_STATE_ON)) {
|
|
@ -1,51 +0,0 @@
|
|||
Each AP has its own global and broadcast links, so when
|
||||
checking for active sta count (according to the active_link_count)
|
||||
we must take them all into account.
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/main.c | 10 +++++-----
|
||||
drivers/net/wireless/ti/wlcore/tx.c | 10 +++++-----
|
||||
2 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -345,12 +345,12 @@ static void wl12xx_irq_ps_regulate_link(
|
||||
* Start high-level PS if the STA is asleep with enough blocks in FW.
|
||||
* Make an exception if this is the only connected link. In this
|
||||
* case FW-memory congestion is less of a problem.
|
||||
- * Note that a single connected STA means 3 active links, since we must
|
||||
- * account for the global and broadcast AP links. The "fw_ps" check
|
||||
- * assures us the third link is a STA connected to the AP. Otherwise
|
||||
- * the FW would not set the PSM bit.
|
||||
+ * Note that a single connected STA means 2*ap_count + 1 active links,
|
||||
+ * since we must account for the global and broadcast AP links
|
||||
+ * for each AP. The "fw_ps" check assures us the other link is a STA
|
||||
+ * connected to the AP. Otherwise the FW would not set the PSM bit.
|
||||
*/
|
||||
- else if (wl->active_link_count > 3 && fw_ps &&
|
||||
+ else if (wl->active_link_count > (wl->ap_count*2 + 1) && fw_ps &&
|
||||
tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
|
||||
wl12xx_ps_link_start(wl, wlvif, hlid, true);
|
||||
}
|
||||
--- a/drivers/net/wireless/ti/wlcore/tx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/tx.c
|
||||
@@ -134,12 +134,12 @@ static void wl1271_tx_regulate_link(stru
|
||||
* into high-level PS and clean out its TX queues.
|
||||
* Make an exception if this is the only connected link. In this
|
||||
* case FW-memory congestion is less of a problem.
|
||||
- * Note that a single connected STA means 3 active links, since we must
|
||||
- * account for the global and broadcast AP links. The "fw_ps" check
|
||||
- * assures us the third link is a STA connected to the AP. Otherwise
|
||||
- * the FW would not set the PSM bit.
|
||||
+ * Note that a single connected STA means 2*ap_count + 1 active links,
|
||||
+ * since we must account for the global and broadcast AP links
|
||||
+ * for each AP. The "fw_ps" check assures us the other link is a STA
|
||||
+ * connected to the AP. Otherwise the FW would not set the PSM bit.
|
||||
*/
|
||||
- if (wl->active_link_count > 3 && fw_ps &&
|
||||
+ if (wl->active_link_count > (wl->ap_count*2 + 1) && fw_ps &&
|
||||
tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
|
||||
wl12xx_ps_link_start(wl, wlvif, hlid, true);
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
Silently ignore repetitive scheduling of recovery work and commands
|
||||
being passed to the bus when the HW is not available. This can happen
|
||||
many times during recovery and slow it down. It also spams the kernel
|
||||
logs.
|
||||
|
||||
Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/cmd.c | 4 ++--
|
||||
drivers/net/wireless/ti/wlcore/main.c | 5 +++--
|
||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
|
||||
@@ -60,8 +60,8 @@ static int __wlcore_cmd_send(struct wl12
|
||||
u16 status;
|
||||
u16 poll_count = 0;
|
||||
|
||||
- if (WARN_ON(wl->state == WLCORE_STATE_RESTARTING &&
|
||||
- id != CMD_STOP_FWLOGGER))
|
||||
+ if (unlikely(wl->state == WLCORE_STATE_RESTARTING &&
|
||||
+ id != CMD_STOP_FWLOGGER))
|
||||
return -EIO;
|
||||
|
||||
cmd = buf;
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -782,10 +782,11 @@ out:
|
||||
|
||||
void wl12xx_queue_recovery_work(struct wl1271 *wl)
|
||||
{
|
||||
- WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
|
||||
-
|
||||
/* Avoid a recursive recovery */
|
||||
if (wl->state == WLCORE_STATE_ON) {
|
||||
+ WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY,
|
||||
+ &wl->flags));
|
||||
+
|
||||
wl->state = WLCORE_STATE_RESTARTING;
|
||||
set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
|
||||
wl1271_ps_elp_wakeup(wl);
|
|
@ -1,21 +0,0 @@
|
|||
dfs configuration command might take longer than
|
||||
the current timeout. increase it to 5 seconds.
|
||||
|
||||
Signed-off-by: Yaniv Machani <yanivma@ti.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/cmd.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/cmd.h
|
||||
+++ b/drivers/net/wireless/ti/wlcore/cmd.h
|
||||
@@ -207,7 +207,7 @@ enum cmd_templ {
|
||||
#define WL1271_COMMAND_TIMEOUT 2000
|
||||
#define WL1271_CMD_TEMPL_DFLT_SIZE 252
|
||||
#define WL1271_CMD_TEMPL_MAX_SIZE 512
|
||||
-#define WL1271_EVENT_TIMEOUT 1500
|
||||
+#define WL1271_EVENT_TIMEOUT 5000
|
||||
|
||||
struct wl1271_cmd_header {
|
||||
__le16 id;
|
|
@ -1,71 +0,0 @@
|
|||
Enabling beacon filtering before receving a beacon
|
||||
might result in not having a beacon at all for the
|
||||
current connected AP, which prevents the station
|
||||
from entering power-save.
|
||||
|
||||
Replace the current approach (of starting beacon
|
||||
filtering on init) and configure beacon filering
|
||||
only after bss_conf->dtimper is set (which means
|
||||
mac80211 already parsed a beacon).
|
||||
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/acx.c | 3 ++-
|
||||
drivers/net/wireless/ti/wlcore/init.c | 4 ++--
|
||||
drivers/net/wireless/ti/wlcore/main.c | 12 ++++++++++++
|
||||
3 files changed, 16 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/acx.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/acx.c
|
||||
@@ -358,7 +358,8 @@ int wl1271_acx_beacon_filter_opt(struct
|
||||
struct acx_beacon_filter_option *beacon_filter = NULL;
|
||||
int ret = 0;
|
||||
|
||||
- wl1271_debug(DEBUG_ACX, "acx beacon filter opt");
|
||||
+ wl1271_debug(DEBUG_ACX, "acx beacon filter opt enable=%d",
|
||||
+ enable_filter);
|
||||
|
||||
if (enable_filter &&
|
||||
wl->conf.conn.bcn_filt_mode == CONF_BCN_FILT_MODE_DISABLED)
|
||||
--- a/drivers/net/wireless/ti/wlcore/init.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/init.c
|
||||
@@ -287,8 +287,8 @@ static int wl1271_init_sta_beacon_filter
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
- /* enable beacon filtering */
|
||||
- ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
|
||||
+ /* disable beacon filtering until we get the first beacon */
|
||||
+ ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -2941,6 +2941,11 @@ static int wlcore_unset_assoc(struct wl1
|
||||
ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
+
|
||||
+ /* disable beacon filtering */
|
||||
+ ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
|
||||
@@ -4345,6 +4350,13 @@ static void wl1271_bss_info_changed_sta(
|
||||
}
|
||||
}
|
||||
|
||||
+ if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) {
|
||||
+ /* enable beacon filtering */
|
||||
+ ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
|
||||
+ if (ret < 0)
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
|
||||
if (ret < 0)
|
||||
goto out;
|
|
@ -1,22 +0,0 @@
|
|||
TI wl12xx/wl18xx cards support channel switch via a driver specific
|
||||
switch_channel op while operating with channel contexts.
|
||||
|
||||
Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
||||
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||||
|
||||
---
|
||||
drivers/net/wireless/ti/wlcore/main.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -5770,7 +5770,8 @@ static int wl1271_init_ieee80211(struct
|
||||
IEEE80211_HW_AP_LINK_PS |
|
||||
IEEE80211_HW_AMPDU_AGGREGATION |
|
||||
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW |
|
||||
- IEEE80211_HW_QUEUE_CONTROL;
|
||||
+ IEEE80211_HW_QUEUE_CONTROL |
|
||||
+ IEEE80211_HW_CHANCTX_STA_CSA;
|
||||
|
||||
wl->hw->wiphy->cipher_suites = cipher_suites;
|
||||
wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
Loading…
Reference in a new issue