mac80211: update to wireless-testing 2014-05-19

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 40800
This commit is contained in:
Felix Fietkau 2014-05-20 09:35:17 +00:00
parent 8f526ff530
commit 8513629e3e
77 changed files with 4782 additions and 1527 deletions

View file

@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mac80211 PKG_NAME:=mac80211
PKG_VERSION:=2014-03-31 PKG_VERSION:=2014-05-19
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
PKG_BACKPORT_VERSION:= PKG_BACKPORT_VERSION:=
PKG_MD5SUM:=8b5cf82d6defc5867511014af4afc0b6 PKG_MD5SUM:=ff5426bf85668c3c36c7f602adeb1e5b
PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2 PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@ -357,7 +357,7 @@ define KernelPackage/rtl8180
$(call KernelPackage/rtl818x/Default) $(call KernelPackage/rtl818x/Default)
DEPENDS+= @PCI_SUPPORT DEPENDS+= @PCI_SUPPORT
TITLE+= (RTL8180 PCI) TITLE+= (RTL8180 PCI)
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8180/rtl8180.ko FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8180/rtl818x_pci.ko
AUTOLOAD:=$(call AutoProbe,rtl8180) AUTOLOAD:=$(call AutoProbe,rtl8180)
endef endef

View file

@ -131,7 +131,7 @@
.PHONY: defconfig-help .PHONY: defconfig-help
--- a/Makefile.real --- a/Makefile.real
+++ b/Makefile.real +++ b/Makefile.real
@@ -54,7 +54,7 @@ defconfig-%:: @@ -59,7 +59,7 @@ defconfig-%::
backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel
@$(MAKE) oldconfig @$(MAKE) oldconfig
@ -140,7 +140,7 @@
@grep -f .local-symbols .config | ( \ @grep -f .local-symbols .config | ( \
echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\ echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\
echo "#define COMPAT_AUTOCONF_INCLUDED" ;\ echo "#define COMPAT_AUTOCONF_INCLUDED" ;\
@@ -75,7 +75,12 @@ backport-include/backport/autoconf.h: .c @@ -80,7 +80,12 @@ backport-include/backport/autoconf.h: .c
esac ;\ esac ;\
done ;\ done ;\
echo "#endif /* COMPAT_AUTOCONF_INCLUDED */" ;\ echo "#endif /* COMPAT_AUTOCONF_INCLUDED */" ;\

View file

@ -1,6 +1,6 @@
--- a/compat/main.c --- a/compat/main.c
+++ b/compat/main.c +++ b/compat/main.c
@@ -21,31 +21,6 @@ MODULE_LICENSE("GPL"); @@ -20,31 +20,6 @@ MODULE_LICENSE("GPL");
#error "You need a BACKPORTS_VERSION" #error "You need a BACKPORTS_VERSION"
#endif #endif

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/mwifiex/main.c --- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c
@@ -747,7 +747,7 @@ static struct net_device_stats *mwifiex_ @@ -745,7 +745,7 @@ static struct net_device_stats *mwifiex_
return &priv->stats; return &priv->stats;
} }
@ -9,23 +9,3 @@
static u16 static u16
mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb, mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb,
void *accel_priv, select_queue_fallback_t fallback) void *accel_priv, select_queue_fallback_t fallback)
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -1062,7 +1062,7 @@ static void ieee80211_uninit(struct net_
ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
static u16 ieee80211_netdev_select_queue(struct net_device *dev,
struct sk_buff *skb,
void *accel_priv,
@@ -1090,7 +1090,7 @@ static const struct net_device_ops ieee8
.ndo_select_queue = ieee80211_netdev_select_queue,
};
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
static u16 ieee80211_monitor_select_queue(struct net_device *dev,
struct sk_buff *skb,
void *accel_priv,

View file

@ -1,16 +0,0 @@
--- a/compat/compat-2.6.39.c
+++ b/compat/compat-2.6.39.c
@@ -13,6 +13,7 @@
#include <linux/sched.h>
#include <linux/module.h>
+#ifdef CONFIG_COMPAT_BLUETOOTH
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
#ifdef CONFIG_TTY
/*
@@ -114,4 +115,4 @@ int tty_set_termios(struct tty_struct *t
EXPORT_SYMBOL_GPL(tty_set_termios);
#endif /* CONFIG_TTY */
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) */
-
+#endif

View file

@ -1,6 +1,6 @@
--- a/net/wireless/Kconfig --- a/net/wireless/Kconfig
+++ b/net/wireless/Kconfig +++ b/net/wireless/Kconfig
@@ -123,7 +123,7 @@ config CFG80211_WEXT @@ -160,7 +160,7 @@ config CFG80211_WEXT
extensions with cfg80211-based drivers. extensions with cfg80211-based drivers.
config LIB80211 config LIB80211
@ -9,7 +9,7 @@
depends on m depends on m
default n default n
help help
@@ -133,15 +133,15 @@ config LIB80211 @@ -170,15 +170,15 @@ config LIB80211
Drivers should select this themselves if needed. Drivers should select this themselves if needed.
config LIB80211_CRYPT_WEP config LIB80211_CRYPT_WEP

View file

@ -1,6 +1,6 @@
--- a/.local-symbols --- a/.local-symbols
+++ b/.local-symbols +++ b/.local-symbols
@@ -402,42 +402,6 @@ USB_CDC_PHONET= @@ -403,42 +403,6 @@ USB_CDC_PHONET=
USB_IPHETH= USB_IPHETH=
USB_SIERRA_NET= USB_SIERRA_NET=
USB_VL600= USB_VL600=
@ -68,7 +68,7 @@
obj-$(CPTCFG_NFC) += net/nfc/ obj-$(CPTCFG_NFC) += net/nfc/
--- a/drivers/net/wireless/b43/main.c --- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c
@@ -2734,7 +2734,7 @@ static struct ssb_device *b43_ssb_gpio_d @@ -2723,7 +2723,7 @@ static struct ssb_device *b43_ssb_gpio_d
{ {
struct ssb_bus *bus = dev->dev->sdev->bus; struct ssb_bus *bus = dev->dev->sdev->bus;
@ -77,12 +77,12 @@
return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev); return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
#else #else
return bus->chipco.dev; return bus->chipco.dev;
@@ -4751,7 +4751,7 @@ static int b43_wireless_core_init(struct @@ -4688,7 +4688,7 @@ static int b43_wireless_core_init(struct
} }
if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW) if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */ hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
-#ifdef CPTCFG_SSB_DRIVER_PCICORE -#if defined(CPTCFG_B43_SSB) && defined(CPTCFG_SSB_DRIVER_PCICORE)
+#ifdef CONFIG_SSB_DRIVER_PCICORE +#if defined(CPTCFG_B43_SSB) && defined(CONFIG_SSB_DRIVER_PCICORE)
if (dev->dev->bus_type == B43_BUS_SSB && if (dev->dev->bus_type == B43_BUS_SSB &&
dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI && dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
dev->dev->sdev->bus->pcicore.dev->id.revision <= 10) dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)

View file

@ -1,10 +1,10 @@
--- a/compat/backport-3.15.c --- a/compat/backport-3.15.c
+++ b/compat/backport-3.15.c +++ b/compat/backport-3.15.c
@@ -11,6 +11,7 @@ @@ -12,6 +12,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/of.h> #include <linux/of.h>
+#include <linux/string.h> +#include <linux/string.h>
#include <net/net_namespace.h>
/** #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0))
* devm_kstrdup - Allocate resource managed space and

View file

@ -1,3 +1,249 @@
--- a/net/mac80211/Kconfig
+++ b/net/mac80211/Kconfig
@@ -5,7 +5,6 @@ config MAC80211
depends on CRYPTO
depends on CRYPTO_ARC4
depends on CRYPTO_AES
- select BACKPORT_CRYPTO_CCM
depends on CRC32
select BACKPORT_AVERAGE
---help---
--- a/net/mac80211/aes_ccm.c
+++ b/net/mac80211/aes_ccm.c
@@ -2,8 +2,6 @@
* Copyright 2003-2004, Instant802 Networks, Inc.
* Copyright 2005-2006, Devicescape Software, Inc.
*
- * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
@@ -19,76 +17,134 @@
#include "key.h"
#include "aes_ccm.h"
-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic)
+static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *scratch, u8 *a)
+{
+ int i;
+ u8 *b_0, *aad, *b, *s_0;
+
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
+ aad = scratch + 4 * AES_BLOCK_SIZE;
+ b = scratch;
+ s_0 = scratch + AES_BLOCK_SIZE;
+
+ crypto_cipher_encrypt_one(tfm, b, b_0);
+
+ /* Extra Authenticate-only data (always two AES blocks) */
+ for (i = 0; i < AES_BLOCK_SIZE; i++)
+ aad[i] ^= b[i];
+ crypto_cipher_encrypt_one(tfm, b, aad);
+
+ aad += AES_BLOCK_SIZE;
+
+ for (i = 0; i < AES_BLOCK_SIZE; i++)
+ aad[i] ^= b[i];
+ crypto_cipher_encrypt_one(tfm, a, aad);
+
+ /* Mask out bits from auth-only-b_0 */
+ b_0[0] &= 0x07;
+
+ /* S_0 is used to encrypt T (= MIC) */
+ b_0[14] = 0;
+ b_0[15] = 0;
+ crypto_cipher_encrypt_one(tfm, s_0, b_0);
+}
+
+
+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *data, size_t data_len,
+ u8 *cdata, u8 *mic)
{
- struct scatterlist assoc, pt, ct[2];
+ int i, j, last_len, num_blocks;
+ u8 *pos, *cpos, *b, *s_0, *e, *b_0;
- char aead_req_data[sizeof(struct aead_request) +
- crypto_aead_reqsize(tfm)]
- __aligned(__alignof__(struct aead_request));
- struct aead_request *aead_req = (void *) aead_req_data;
-
- memset(aead_req, 0, sizeof(aead_req_data));
-
- sg_init_one(&pt, data, data_len);
- sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
- sg_init_table(ct, 2);
- sg_set_buf(&ct[0], data, data_len);
- sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
-
- aead_request_set_tfm(aead_req, tfm);
- aead_request_set_assoc(aead_req, &assoc, assoc.length);
- aead_request_set_crypt(aead_req, &pt, ct, data_len, b_0);
+ b = scratch;
+ s_0 = scratch + AES_BLOCK_SIZE;
+ e = scratch + 2 * AES_BLOCK_SIZE;
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
+
+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
+ last_len = data_len % AES_BLOCK_SIZE;
+ aes_ccm_prepare(tfm, scratch, b);
+
+ /* Process payload blocks */
+ pos = data;
+ cpos = cdata;
+ for (j = 1; j <= num_blocks; j++) {
+ int blen = (j == num_blocks && last_len) ?
+ last_len : AES_BLOCK_SIZE;
+
+ /* Authentication followed by encryption */
+ for (i = 0; i < blen; i++)
+ b[i] ^= pos[i];
+ crypto_cipher_encrypt_one(tfm, b, b);
+
+ b_0[14] = (j >> 8) & 0xff;
+ b_0[15] = j & 0xff;
+ crypto_cipher_encrypt_one(tfm, e, b_0);
+ for (i = 0; i < blen; i++)
+ *cpos++ = *pos++ ^ e[i];
+ }
- crypto_aead_encrypt(aead_req);
+ for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++)
+ mic[i] = b[i] ^ s_0[i];
}
-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic)
+
+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *cdata, size_t data_len, u8 *mic, u8 *data)
{
- struct scatterlist assoc, pt, ct[2];
- char aead_req_data[sizeof(struct aead_request) +
- crypto_aead_reqsize(tfm)]
- __aligned(__alignof__(struct aead_request));
- struct aead_request *aead_req = (void *) aead_req_data;
-
- memset(aead_req, 0, sizeof(aead_req_data));
-
- sg_init_one(&pt, data, data_len);
- sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
- sg_init_table(ct, 2);
- sg_set_buf(&ct[0], data, data_len);
- sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
-
- aead_request_set_tfm(aead_req, tfm);
- aead_request_set_assoc(aead_req, &assoc, assoc.length);
- aead_request_set_crypt(aead_req, ct, &pt,
- data_len + IEEE80211_CCMP_MIC_LEN, b_0);
+ int i, j, last_len, num_blocks;
+ u8 *pos, *cpos, *b, *s_0, *a, *b_0;
+
+ b = scratch;
+ s_0 = scratch + AES_BLOCK_SIZE;
+ a = scratch + 2 * AES_BLOCK_SIZE;
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
+
+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
+ last_len = data_len % AES_BLOCK_SIZE;
+ aes_ccm_prepare(tfm, scratch, a);
+
+ /* Process payload blocks */
+ cpos = cdata;
+ pos = data;
+ for (j = 1; j <= num_blocks; j++) {
+ int blen = (j == num_blocks && last_len) ?
+ last_len : AES_BLOCK_SIZE;
+
+ /* Decryption followed by authentication */
+ b_0[14] = (j >> 8) & 0xff;
+ b_0[15] = j & 0xff;
+ crypto_cipher_encrypt_one(tfm, b, b_0);
+ for (i = 0; i < blen; i++) {
+ *pos = *cpos++ ^ b[i];
+ a[i] ^= *pos++;
+ }
+ crypto_cipher_encrypt_one(tfm, a, a);
+ }
+
+ for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) {
+ if ((mic[i] ^ s_0[i]) != a[i])
+ return -1;
+ }
- return crypto_aead_decrypt(aead_req);
+ return 0;
}
-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
+
+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
{
- struct crypto_aead *tfm;
- int err;
+ struct crypto_cipher *tfm;
- tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(tfm))
- return tfm;
-
- err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
- if (!err)
- err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
- if (!err)
- return tfm;
+ tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
+ if (!IS_ERR(tfm))
+ crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
- crypto_free_aead(tfm);
- return ERR_PTR(err);
+ return tfm;
}
-void ieee80211_aes_key_free(struct crypto_aead *tfm)
+
+void ieee80211_aes_key_free(struct crypto_cipher *tfm)
{
- crypto_free_aead(tfm);
+ crypto_free_cipher(tfm);
}
--- a/net/mac80211/aes_ccm.h
+++ b/net/mac80211/aes_ccm.h
@@ -12,11 +12,13 @@
#include <linux/crypto.h>
-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[]);
-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic);
-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic);
-void ieee80211_aes_key_free(struct crypto_aead *tfm);
+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[]);
+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *data, size_t data_len,
+ u8 *cdata, u8 *mic);
+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *cdata, size_t data_len,
+ u8 *mic, u8 *data);
+void ieee80211_aes_key_free(struct crypto_cipher *tfm);
#endif /* AES_CCM_H */
--- a/net/mac80211/key.h
+++ b/net/mac80211/key.h
@@ -84,7 +84,7 @@ struct ieee80211_key {
* Management frames.
*/
u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
- struct crypto_aead *tfm;
+ struct crypto_cipher *tfm;
u32 replays; /* dot11RSNAStatsCCMPReplays */
} ccmp;
struct {
--- a/net/mac80211/wpa.c --- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c
@@ -301,15 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee @@ -301,15 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
@ -64,7 +310,7 @@
if (info->control.hw_key && if (info->control.hw_key &&
!(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
@@ -455,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8 @@ -458,9 +463,9 @@ static int ccmp_encrypt_skb(struct ieee8
return 0; return 0;
pos += IEEE80211_CCMP_HDR_LEN; pos += IEEE80211_CCMP_HDR_LEN;
@ -77,7 +323,7 @@
return 0; return 0;
} }
@@ -520,16 +525,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee @@ -523,16 +528,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
} }
if (!(status->flag & RX_FLAG_DECRYPTED)) { if (!(status->flag & RX_FLAG_DECRYPTED)) {
@ -99,249 +345,3 @@
return RX_DROP_UNUSABLE; return RX_DROP_UNUSABLE;
} }
--- a/net/mac80211/Kconfig
+++ b/net/mac80211/Kconfig
@@ -5,7 +5,6 @@ config MAC80211
depends on CRYPTO
depends on CRYPTO_ARC4
depends on CRYPTO_AES
- depends on CRYPTO_CCM
depends on CRC32
select BACKPORT_AVERAGE
---help---
--- a/net/mac80211/aes_ccm.c
+++ b/net/mac80211/aes_ccm.c
@@ -2,8 +2,6 @@
* Copyright 2003-2004, Instant802 Networks, Inc.
* Copyright 2005-2006, Devicescape Software, Inc.
*
- * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
@@ -19,75 +17,134 @@
#include "key.h"
#include "aes_ccm.h"
-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic)
+static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *scratch, u8 *a)
{
- struct scatterlist assoc, pt, ct[2];
- struct {
- struct aead_request req;
- u8 priv[crypto_aead_reqsize(tfm)];
- } aead_req;
-
- memset(&aead_req, 0, sizeof(aead_req));
-
- sg_init_one(&pt, data, data_len);
- sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
- sg_init_table(ct, 2);
- sg_set_buf(&ct[0], data, data_len);
- sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
-
- aead_request_set_tfm(&aead_req.req, tfm);
- aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
- aead_request_set_crypt(&aead_req.req, &pt, ct, data_len, b_0);
+ int i;
+ u8 *b_0, *aad, *b, *s_0;
- crypto_aead_encrypt(&aead_req.req);
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
+ aad = scratch + 4 * AES_BLOCK_SIZE;
+ b = scratch;
+ s_0 = scratch + AES_BLOCK_SIZE;
+
+ crypto_cipher_encrypt_one(tfm, b, b_0);
+
+ /* Extra Authenticate-only data (always two AES blocks) */
+ for (i = 0; i < AES_BLOCK_SIZE; i++)
+ aad[i] ^= b[i];
+ crypto_cipher_encrypt_one(tfm, b, aad);
+
+ aad += AES_BLOCK_SIZE;
+
+ for (i = 0; i < AES_BLOCK_SIZE; i++)
+ aad[i] ^= b[i];
+ crypto_cipher_encrypt_one(tfm, a, aad);
+
+ /* Mask out bits from auth-only-b_0 */
+ b_0[0] &= 0x07;
+
+ /* S_0 is used to encrypt T (= MIC) */
+ b_0[14] = 0;
+ b_0[15] = 0;
+ crypto_cipher_encrypt_one(tfm, s_0, b_0);
}
-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic)
+
+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *data, size_t data_len,
+ u8 *cdata, u8 *mic)
{
- struct scatterlist assoc, pt, ct[2];
- struct {
- struct aead_request req;
- u8 priv[crypto_aead_reqsize(tfm)];
- } aead_req;
-
- memset(&aead_req, 0, sizeof(aead_req));
-
- sg_init_one(&pt, data, data_len);
- sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
- sg_init_table(ct, 2);
- sg_set_buf(&ct[0], data, data_len);
- sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
-
- aead_request_set_tfm(&aead_req.req, tfm);
- aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
- aead_request_set_crypt(&aead_req.req, ct, &pt,
- data_len + IEEE80211_CCMP_MIC_LEN, b_0);
+ int i, j, last_len, num_blocks;
+ u8 *pos, *cpos, *b, *s_0, *e, *b_0;
+
+ b = scratch;
+ s_0 = scratch + AES_BLOCK_SIZE;
+ e = scratch + 2 * AES_BLOCK_SIZE;
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
+
+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
+ last_len = data_len % AES_BLOCK_SIZE;
+ aes_ccm_prepare(tfm, scratch, b);
+
+ /* Process payload blocks */
+ pos = data;
+ cpos = cdata;
+ for (j = 1; j <= num_blocks; j++) {
+ int blen = (j == num_blocks && last_len) ?
+ last_len : AES_BLOCK_SIZE;
+
+ /* Authentication followed by encryption */
+ for (i = 0; i < blen; i++)
+ b[i] ^= pos[i];
+ crypto_cipher_encrypt_one(tfm, b, b);
+
+ b_0[14] = (j >> 8) & 0xff;
+ b_0[15] = j & 0xff;
+ crypto_cipher_encrypt_one(tfm, e, b_0);
+ for (i = 0; i < blen; i++)
+ *cpos++ = *pos++ ^ e[i];
+ }
- return crypto_aead_decrypt(&aead_req.req);
+ for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++)
+ mic[i] = b[i] ^ s_0[i];
}
-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
+
+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *cdata, size_t data_len, u8 *mic, u8 *data)
{
- struct crypto_aead *tfm;
- int err;
+ int i, j, last_len, num_blocks;
+ u8 *pos, *cpos, *b, *s_0, *a, *b_0;
- tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(tfm))
- return tfm;
-
- err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
- if (!err)
- err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
- if (!err)
- return tfm;
+ b = scratch;
+ s_0 = scratch + AES_BLOCK_SIZE;
+ a = scratch + 2 * AES_BLOCK_SIZE;
+ b_0 = scratch + 3 * AES_BLOCK_SIZE;
+
+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
+ last_len = data_len % AES_BLOCK_SIZE;
+ aes_ccm_prepare(tfm, scratch, a);
+
+ /* Process payload blocks */
+ cpos = cdata;
+ pos = data;
+ for (j = 1; j <= num_blocks; j++) {
+ int blen = (j == num_blocks && last_len) ?
+ last_len : AES_BLOCK_SIZE;
+
+ /* Decryption followed by authentication */
+ b_0[14] = (j >> 8) & 0xff;
+ b_0[15] = j & 0xff;
+ crypto_cipher_encrypt_one(tfm, b, b_0);
+ for (i = 0; i < blen; i++) {
+ *pos = *cpos++ ^ b[i];
+ a[i] ^= *pos++;
+ }
+ crypto_cipher_encrypt_one(tfm, a, a);
+ }
+
+ for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) {
+ if ((mic[i] ^ s_0[i]) != a[i])
+ return -1;
+ }
- crypto_free_aead(tfm);
- return ERR_PTR(err);
+ return 0;
}
-void ieee80211_aes_key_free(struct crypto_aead *tfm)
+
+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
+{
+ struct crypto_cipher *tfm;
+
+ tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
+ if (!IS_ERR(tfm))
+ crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
+
+ return tfm;
+}
+
+
+void ieee80211_aes_key_free(struct crypto_cipher *tfm)
{
- crypto_free_aead(tfm);
+ crypto_free_cipher(tfm);
}
--- a/net/mac80211/aes_ccm.h
+++ b/net/mac80211/aes_ccm.h
@@ -12,11 +12,13 @@
#include <linux/crypto.h>
-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[]);
-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic);
-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
- u8 *data, size_t data_len, u8 *mic);
-void ieee80211_aes_key_free(struct crypto_aead *tfm);
+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[]);
+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *data, size_t data_len,
+ u8 *cdata, u8 *mic);
+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
+ u8 *cdata, size_t data_len,
+ u8 *mic, u8 *data);
+void ieee80211_aes_key_free(struct crypto_cipher *tfm);
#endif /* AES_CCM_H */
--- a/net/mac80211/key.h
+++ b/net/mac80211/key.h
@@ -84,7 +84,7 @@ struct ieee80211_key {
* Management frames.
*/
u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
- struct crypto_aead *tfm;
+ struct crypto_cipher *tfm;
u32 replays; /* dot11RSNAStatsCCMPReplays */
} ccmp;
struct {

View file

@ -1,6 +1,6 @@
--- a/net/mac80211/main.c --- a/net/mac80211/main.c
+++ b/net/mac80211/main.c +++ b/net/mac80211/main.c
@@ -287,7 +287,7 @@ void ieee80211_restart_hw(struct ieee802 @@ -285,7 +285,7 @@ void ieee80211_restart_hw(struct ieee802
} }
EXPORT_SYMBOL(ieee80211_restart_hw); EXPORT_SYMBOL(ieee80211_restart_hw);
@ -9,7 +9,7 @@
static int ieee80211_ifa_changed(struct notifier_block *nb, static int ieee80211_ifa_changed(struct notifier_block *nb,
unsigned long data, void *arg) unsigned long data, void *arg)
{ {
@@ -346,7 +346,7 @@ static int ieee80211_ifa_changed(struct @@ -344,7 +344,7 @@ static int ieee80211_ifa_changed(struct
} }
#endif #endif
@ -18,7 +18,7 @@
static int ieee80211_ifa6_changed(struct notifier_block *nb, static int ieee80211_ifa6_changed(struct notifier_block *nb,
unsigned long data, void *arg) unsigned long data, void *arg)
{ {
@@ -1036,14 +1036,14 @@ int ieee80211_register_hw(struct ieee802 @@ -1034,14 +1034,14 @@ int ieee80211_register_hw(struct ieee802
goto fail_pm_qos; goto fail_pm_qos;
} }
@ -35,7 +35,7 @@
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed; local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
result = register_inet6addr_notifier(&local->ifa6_notifier); result = register_inet6addr_notifier(&local->ifa6_notifier);
if (result) if (result)
@@ -1052,13 +1052,13 @@ int ieee80211_register_hw(struct ieee802 @@ -1050,13 +1050,13 @@ int ieee80211_register_hw(struct ieee802
return 0; return 0;
@ -52,7 +52,7 @@
fail_ifa: fail_ifa:
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY, pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
&local->network_latency_notifier); &local->network_latency_notifier);
@@ -1103,10 +1103,10 @@ void ieee80211_unregister_hw(struct ieee @@ -1101,10 +1101,10 @@ void ieee80211_unregister_hw(struct ieee
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY, pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
&local->network_latency_notifier); &local->network_latency_notifier);

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
--- a/net/mac80211/cfg.c --- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c
@@ -2154,7 +2154,7 @@ static int ieee80211_scan(struct wiphy * @@ -2197,7 +2197,7 @@ static int ieee80211_scan(struct wiphy *
* the frames sent while scanning on other channel will be * the frames sent while scanning on other channel will be
* lost) * lost)
*/ */

View file

@ -8,7 +8,7 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include "hw.h" #include "hw.h"
@@ -448,8 +449,16 @@ static int ath9k_hw_init_macaddr(struct @@ -449,8 +450,16 @@ static int ath9k_hw_init_macaddr(struct
common->macaddr[2 * i] = eeval >> 8; common->macaddr[2 * i] = eeval >> 8;
common->macaddr[2 * i + 1] = eeval & 0xff; common->macaddr[2 * i + 1] = eeval & 0xff;
} }

View file

@ -58,7 +58,7 @@
---help--- ---help---
--- a/.local-symbols --- a/.local-symbols
+++ b/.local-symbols +++ b/.local-symbols
@@ -120,6 +120,7 @@ RTL8187_LEDS= @@ -116,6 +116,7 @@ RTL8187_LEDS=
ATH_COMMON= ATH_COMMON=
ATH_CARDS= ATH_CARDS=
ATH_DEBUG= ATH_DEBUG=

View file

@ -1,6 +1,6 @@
--- a/net/wireless/reg.c --- a/net/wireless/reg.c
+++ b/net/wireless/reg.c +++ b/net/wireless/reg.c
@@ -2000,6 +2000,8 @@ void regulatory_hint_country_ie(struct w @@ -2079,6 +2079,8 @@ void regulatory_hint_country_ie(struct w
enum environment_cap env = ENVIRON_ANY; enum environment_cap env = ENVIRON_ANY;
struct regulatory_request *request = NULL, *lr; struct regulatory_request *request = NULL, *lr;
@ -9,7 +9,7 @@
/* IE len must be evenly divisible by 2 */ /* IE len must be evenly divisible by 2 */
if (country_ie_len & 0x01) if (country_ie_len & 0x01)
return; return;
@@ -2194,6 +2196,7 @@ static void restore_regulatory_settings( @@ -2275,6 +2277,7 @@ static void restore_regulatory_settings(
void regulatory_hint_disconnect(void) void regulatory_hint_disconnect(void)
{ {

View file

@ -1,8 +1,8 @@
--- a/drivers/net/wireless/ath/ath9k/init.c --- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -652,6 +652,7 @@ static const struct ieee80211_iface_limi @@ -655,6 +655,7 @@ static const struct ieee80211_iface_limi
#endif BIT(NL80211_IFTYPE_AP) },
BIT(NL80211_IFTYPE_AP) | { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_P2P_GO) }, BIT(NL80211_IFTYPE_P2P_GO) },
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) }, + { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
}; };

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/debug.c --- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -1485,6 +1485,53 @@ void ath9k_deinit_debug(struct ath_softc @@ -1289,6 +1289,53 @@ void ath9k_deinit_debug(struct ath_softc
ath9k_spectral_deinit_debug(sc); ath9k_spectral_deinit_debug(sc);
} }
@ -54,7 +54,7 @@
int ath9k_init_debug(struct ath_hw *ah) int ath9k_init_debug(struct ath_hw *ah)
{ {
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
@@ -1504,6 +1551,8 @@ int ath9k_init_debug(struct ath_hw *ah) @@ -1308,6 +1355,8 @@ int ath9k_init_debug(struct ath_hw *ah)
ath9k_tx99_init_debug(sc); ath9k_tx99_init_debug(sc);
ath9k_spectral_init_debug(sc); ath9k_spectral_init_debug(sc);

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/init.c --- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -897,23 +897,23 @@ static int __init ath9k_init(void) @@ -904,23 +904,23 @@ static int __init ath9k_init(void)
{ {
int error; int error;

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -358,13 +358,8 @@ static void ath9k_hw_init_config(struct @@ -359,13 +359,8 @@ static void ath9k_hw_init_config(struct
ah->config.rx_intr_mitigation = true; ah->config.rx_intr_mitigation = true;

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/debug.c --- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -1532,6 +1532,52 @@ static const struct file_operations fops @@ -1336,6 +1336,52 @@ static const struct file_operations fops
.owner = THIS_MODULE .owner = THIS_MODULE
}; };
@ -53,7 +53,7 @@
int ath9k_init_debug(struct ath_hw *ah) int ath9k_init_debug(struct ath_hw *ah)
{ {
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
@@ -1553,6 +1599,8 @@ int ath9k_init_debug(struct ath_hw *ah) @@ -1357,6 +1403,8 @@ int ath9k_init_debug(struct ath_hw *ah)
debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
&fops_eeprom); &fops_eeprom);

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -613,6 +613,7 @@ int ath9k_hw_init(struct ath_hw *ah) @@ -614,6 +614,7 @@ int ath9k_hw_init(struct ath_hw *ah)
/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */ /* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
switch (ah->hw_version.devid) { switch (ah->hw_version.devid) {

View file

@ -1,6 +1,6 @@
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -1703,6 +1703,7 @@ struct ieee80211_hw { @@ -1718,6 +1718,7 @@ struct ieee80211_hw {
u8 max_tx_aggregation_subframes; u8 max_tx_aggregation_subframes;
u8 offchannel_tx_hw_queue; u8 offchannel_tx_hw_queue;
u8 radiotap_mcs_details; u8 radiotap_mcs_details;
@ -10,7 +10,7 @@
u8 uapsd_queues; u8 uapsd_queues;
--- a/net/mac80211/cfg.c --- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c
@@ -2335,7 +2335,9 @@ static int ieee80211_get_tx_power(struct @@ -2378,7 +2378,9 @@ static int ieee80211_get_tx_power(struct
struct ieee80211_local *local = wiphy_priv(wiphy); struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
@ -23,7 +23,7 @@
*dbm = sdata->vif.bss_conf.txpower; *dbm = sdata->vif.bss_conf.txpower;
--- a/net/mac80211/main.c --- a/net/mac80211/main.c
+++ b/net/mac80211/main.c +++ b/net/mac80211/main.c
@@ -160,6 +160,7 @@ static u32 ieee80211_hw_conf_chan(struct @@ -156,6 +156,7 @@ static u32 ieee80211_hw_conf_chan(struct
if (local->hw.conf.power_level != power) { if (local->hw.conf.power_level != power) {
changed |= IEEE80211_CONF_CHANGE_POWER; changed |= IEEE80211_CONF_CHANGE_POWER;

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/main.c --- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -308,8 +308,12 @@ static int ath_reset_internal(struct ath @@ -310,8 +310,12 @@ static int ath_reset_internal(struct ath
(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
ath9k_mci_set_txpower(sc, true, false); ath9k_mci_set_txpower(sc, true, false);
@ -14,7 +14,7 @@
out: out:
spin_unlock_bh(&sc->sc_pcu_lock); spin_unlock_bh(&sc->sc_pcu_lock);
@@ -1377,6 +1381,7 @@ static int ath9k_config(struct ieee80211 @@ -1411,6 +1415,7 @@ static int ath9k_config(struct ieee80211
sc->config.txpowlimit = 2 * conf->power_level; sc->config.txpowlimit = 2 * conf->power_level;
ath9k_cmn_update_txpow(ah, sc->curtxpow, ath9k_cmn_update_txpow(ah, sc->curtxpow,
sc->config.txpowlimit, &sc->curtxpow); sc->config.txpowlimit, &sc->curtxpow);

View file

@ -1,6 +1,6 @@
--- a/include/net/cfg80211.h --- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h +++ b/include/net/cfg80211.h
@@ -2167,6 +2167,7 @@ struct cfg80211_qos_map { @@ -2188,6 +2188,7 @@ struct cfg80211_qos_map {
* (as advertised by the nl80211 feature flag.) * (as advertised by the nl80211 feature flag.)
* @get_tx_power: store the current TX power into the dbm variable; * @get_tx_power: store the current TX power into the dbm variable;
* return 0 if successful * return 0 if successful
@ -8,7 +8,7 @@
* *
* @set_wds_peer: set the WDS peer for a WDS interface * @set_wds_peer: set the WDS peer for a WDS interface
* *
@@ -2396,6 +2397,7 @@ struct cfg80211_ops { @@ -2422,6 +2423,7 @@ struct cfg80211_ops {
enum nl80211_tx_power_setting type, int mbm); enum nl80211_tx_power_setting type, int mbm);
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
int *dbm); int *dbm);
@ -36,9 +36,9 @@
u8 ps_dtim_period; u8 ps_dtim_period;
--- a/include/uapi/linux/nl80211.h --- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h
@@ -1579,6 +1579,9 @@ enum nl80211_commands { @@ -1591,6 +1591,9 @@ enum nl80211_commands {
* @NL80211_ATTR_TDLS_PEER_CAPABILITY: flags for TDLS peer capabilities, u32. * creation then the new interface will be owned by the netlink socket
* As specified in the &enum nl80211_tdls_peer_capability. * that created it and will be destroyed when the socket is closed
* *
+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
+ * transmit power to stay within regulatory limits. u32, dBi. + * transmit power to stay within regulatory limits. u32, dBi.
@ -46,9 +46,9 @@
* @NL80211_ATTR_MAX: highest attribute number currently defined * @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use * @__NL80211_ATTR_AFTER_LAST: internal use
*/ */
@@ -1914,6 +1917,8 @@ enum nl80211_attrs { @@ -1931,6 +1934,8 @@ enum nl80211_attrs {
NL80211_ATTR_CSA_C_OFFSETS_TX,
NL80211_ATTR_TDLS_PEER_CAPABILITY, NL80211_ATTR_MAX_CSA_COUNTERS,
+ NL80211_ATTR_WIPHY_ANTENNA_GAIN, + NL80211_ATTR_WIPHY_ANTENNA_GAIN,
+ +
@ -57,7 +57,7 @@
__NL80211_ATTR_AFTER_LAST, __NL80211_ATTR_AFTER_LAST,
--- a/net/mac80211/cfg.c --- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c
@@ -2345,6 +2345,19 @@ static int ieee80211_get_tx_power(struct @@ -2388,6 +2388,19 @@ static int ieee80211_get_tx_power(struct
return 0; return 0;
} }
@ -77,7 +77,7 @@
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
const u8 *addr) const u8 *addr)
{ {
@@ -4000,6 +4013,7 @@ const struct cfg80211_ops mac80211_confi @@ -3820,6 +3833,7 @@ const struct cfg80211_ops mac80211_confi
.set_wiphy_params = ieee80211_set_wiphy_params, .set_wiphy_params = ieee80211_set_wiphy_params,
.set_tx_power = ieee80211_set_tx_power, .set_tx_power = ieee80211_set_tx_power,
.get_tx_power = ieee80211_get_tx_power, .get_tx_power = ieee80211_get_tx_power,
@ -87,7 +87,7 @@
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
--- a/net/mac80211/ieee80211_i.h --- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h
@@ -1225,6 +1225,7 @@ struct ieee80211_local { @@ -1233,6 +1233,7 @@ struct ieee80211_local {
int dynamic_ps_forced_timeout; int dynamic_ps_forced_timeout;
int user_power_level; /* in dBm, for all interfaces */ int user_power_level; /* in dBm, for all interfaces */
@ -97,7 +97,7 @@
--- a/net/mac80211/main.c --- a/net/mac80211/main.c
+++ b/net/mac80211/main.c +++ b/net/mac80211/main.c
@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct @@ -97,7 +97,7 @@ static u32 ieee80211_hw_conf_chan(struct
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct cfg80211_chan_def chandef = {}; struct cfg80211_chan_def chandef = {};
u32 changed = 0; u32 changed = 0;
@ -106,7 +106,7 @@
u32 offchannel_flag; u32 offchannel_flag;
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
@@ -158,6 +158,12 @@ static u32 ieee80211_hw_conf_chan(struct @@ -154,6 +154,12 @@ static u32 ieee80211_hw_conf_chan(struct
} }
rcu_read_unlock(); rcu_read_unlock();
@ -119,7 +119,7 @@
if (local->hw.conf.power_level != power) { if (local->hw.conf.power_level != power) {
changed |= IEEE80211_CONF_CHANGE_POWER; changed |= IEEE80211_CONF_CHANGE_POWER;
local->hw.cur_power_level = power; local->hw.cur_power_level = power;
@@ -586,6 +592,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( @@ -584,6 +590,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
IEEE80211_RADIOTAP_MCS_HAVE_BW; IEEE80211_RADIOTAP_MCS_HAVE_BW;
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
@ -129,15 +129,15 @@
local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
--- a/net/wireless/nl80211.c --- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c
@@ -385,6 +385,7 @@ static const struct nla_policy nl80211_p @@ -387,6 +387,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_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
[NL80211_ATTR_IFACE_SOCKET_OWNER] = { .type = NLA_FLAG },
[NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
+ [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
}; };
/* policy for the key attributes */ /* policy for the key attributes */
@@ -2116,6 +2117,20 @@ static int nl80211_set_wiphy(struct sk_b @@ -2162,6 +2163,20 @@ static int nl80211_set_wiphy(struct sk_b
return result; return result;
} }

View file

@ -10,7 +10,7 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -2720,7 +2720,7 @@ void ath9k_hw_apply_txpower(struct ath_h @@ -2721,7 +2721,7 @@ void ath9k_hw_apply_txpower(struct ath_h
channel = chan->chan; channel = chan->chan;
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
new_pwr = min_t(int, chan_pwr, reg->power_limit); new_pwr = min_t(int, chan_pwr, reg->power_limit);
@ -21,7 +21,7 @@
if (ant_gain > max_gain) if (ant_gain > max_gain)
--- a/drivers/net/wireless/ath/ath9k/main.c --- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1377,7 +1377,10 @@ static int ath9k_config(struct ieee80211 @@ -1411,7 +1411,10 @@ static int ath9k_config(struct ieee80211
} }
if (changed & IEEE80211_CONF_CHANGE_POWER) { if (changed & IEEE80211_CONF_CHANGE_POWER) {

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/ath9k.h --- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -554,6 +554,9 @@ static inline int ath9k_dump_btcoex(stru @@ -563,6 +563,9 @@ static inline int ath9k_dump_btcoex(stru
void ath_init_leds(struct ath_softc *sc); void ath_init_leds(struct ath_softc *sc);
void ath_deinit_leds(struct ath_softc *sc); void ath_deinit_leds(struct ath_softc *sc);
void ath_fill_led_pin(struct ath_softc *sc); void ath_fill_led_pin(struct ath_softc *sc);
@ -10,7 +10,7 @@
#else #else
static inline void ath_init_leds(struct ath_softc *sc) static inline void ath_init_leds(struct ath_softc *sc)
{ {
@@ -692,6 +695,13 @@ void ath_ant_comb_scan(struct ath_softc @@ -701,6 +704,13 @@ void ath_ant_comb_scan(struct ath_softc
#define PS_BEACON_SYNC BIT(4) #define PS_BEACON_SYNC BIT(4)
#define PS_WAIT_FOR_ANI BIT(5) #define PS_WAIT_FOR_ANI BIT(5)
@ -24,7 +24,7 @@
struct ath_softc { struct ath_softc {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct device *dev; struct device *dev;
@@ -731,9 +741,8 @@ struct ath_softc { @@ -743,9 +753,8 @@ struct ath_softc {
struct ath_beacon beacon; struct ath_beacon beacon;
#ifdef CPTCFG_MAC80211_LEDS #ifdef CPTCFG_MAC80211_LEDS
@ -162,7 +162,7 @@
void ath_fill_led_pin(struct ath_softc *sc) void ath_fill_led_pin(struct ath_softc *sc)
--- a/drivers/net/wireless/ath/ath9k/init.c --- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -811,7 +811,7 @@ int ath9k_init_device(u16 devid, struct @@ -815,7 +815,7 @@ int ath9k_init_device(u16 devid, struct
#ifdef CPTCFG_MAC80211_LEDS #ifdef CPTCFG_MAC80211_LEDS
/* must be initialized before ieee80211_register_hw */ /* must be initialized before ieee80211_register_hw */
@ -173,7 +173,7 @@
#endif #endif
--- a/drivers/net/wireless/ath/ath9k/debug.c --- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -1577,6 +1577,61 @@ static const struct file_operations fops @@ -1381,6 +1381,61 @@ static const struct file_operations fops
.llseek = default_llseek, .llseek = default_llseek,
}; };
@ -235,7 +235,7 @@
int ath9k_init_debug(struct ath_hw *ah) int ath9k_init_debug(struct ath_hw *ah)
{ {
@@ -1601,6 +1656,10 @@ int ath9k_init_debug(struct ath_hw *ah) @@ -1405,6 +1460,10 @@ int ath9k_init_debug(struct ath_hw *ah)
&fops_eeprom); &fops_eeprom);
debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
sc, &fops_chanbw); sc, &fops_chanbw);

View file

@ -1,9 +1,9 @@
--- a/include/linux/ath9k_platform.h --- a/include/linux/ath9k_platform.h
+++ b/include/linux/ath9k_platform.h +++ b/include/linux/ath9k_platform.h
@@ -37,6 +37,9 @@ struct ath9k_platform_data { @@ -39,6 +39,9 @@ struct ath9k_platform_data {
int (*get_mac_revision)(void);
int (*external_reset)(void); int (*external_reset)(void);
bool use_eeprom;
+ +
+ int num_leds; + int num_leds;
+ const struct gpio_led *leds; + const struct gpio_led *leds;

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/debug.c --- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -1633,6 +1633,50 @@ static const struct file_operations fops @@ -1437,6 +1437,50 @@ static const struct file_operations fops
#endif #endif
@ -51,7 +51,7 @@
int ath9k_init_debug(struct ath_hw *ah) int ath9k_init_debug(struct ath_hw *ah)
{ {
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
@@ -1660,6 +1704,8 @@ int ath9k_init_debug(struct ath_hw *ah) @@ -1464,6 +1508,8 @@ int ath9k_init_debug(struct ath_hw *ah)
debugfs_create_file("gpio_led", S_IWUSR, debugfs_create_file("gpio_led", S_IWUSR,
sc->debug.debugfs_phy, sc, &fops_gpio_led); sc->debug.debugfs_phy, sc, &fops_gpio_led);
#endif #endif
@ -94,7 +94,7 @@
struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1734,6 +1734,20 @@ fail: @@ -1735,6 +1735,20 @@ fail:
return -EINVAL; return -EINVAL;
} }
@ -115,7 +115,7 @@
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
struct ath9k_hw_cal_data *caldata, bool fastcc) struct ath9k_hw_cal_data *caldata, bool fastcc)
{ {
@@ -1939,6 +1953,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st @@ -1940,6 +1954,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
ar9003_hw_disable_phy_restart(ah); ar9003_hw_disable_phy_restart(ah);
ath9k_hw_apply_gpio_override(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); REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
--- a/drivers/net/wireless/ath/ath9k/main.c --- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -610,6 +610,11 @@ irqreturn_t ath_isr(int irq, void *dev) @@ -612,6 +612,11 @@ irqreturn_t ath_isr(int irq, void *dev)
ath9k_debug_sync_cause(sc, sync_cause); ath9k_debug_sync_cause(sc, sync_cause);
status &= ah->imask; /* discard unasked-for bits */ status &= ah->imask; /* discard unasked-for bits */

View file

@ -11,7 +11,7 @@
int (*external_reset)(void); int (*external_reset)(void);
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -2327,17 +2327,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw @@ -2328,17 +2328,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
} }
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE); eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);

View file

@ -55,7 +55,7 @@
ops->spectral_scan_config = ar9003_hw_spectral_scan_config; ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
--- a/drivers/net/wireless/ath/ath9k/init.c --- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -643,7 +643,8 @@ static void ath9k_init_txpower_limits(st @@ -646,7 +646,8 @@ static void ath9k_init_txpower_limits(st
if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ); ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
@ -65,7 +65,7 @@
} }
static const struct ieee80211_iface_limit if_limits[] = { static const struct ieee80211_iface_limit if_limits[] = {
@@ -770,6 +771,18 @@ static void ath9k_set_hw_capab(struct at @@ -774,6 +775,18 @@ static void ath9k_set_hw_capab(struct at
SET_IEEE80211_PERM_ADDR(hw, common->macaddr); SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
} }
@ -84,7 +84,7 @@
int ath9k_init_device(u16 devid, struct ath_softc *sc, int ath9k_init_device(u16 devid, struct ath_softc *sc,
const struct ath_bus_ops *bus_ops) const struct ath_bus_ops *bus_ops)
{ {
@@ -818,6 +831,8 @@ int ath9k_init_device(u16 devid, struct @@ -822,6 +835,8 @@ int ath9k_init_device(u16 devid, struct
ARRAY_SIZE(ath9k_tpt_blink)); ARRAY_SIZE(ath9k_tpt_blink));
#endif #endif

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -216,6 +216,19 @@ void ath9k_hw_get_channel_centers(struct @@ -215,6 +215,19 @@ void ath9k_hw_get_channel_centers(struct
centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT); centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
} }
@ -20,7 +20,7 @@
/******************/ /******************/
/* Chip Revisions */ /* Chip Revisions */
/******************/ /******************/
@@ -1336,6 +1349,9 @@ static bool ath9k_hw_set_reset(struct at @@ -1337,6 +1350,9 @@ static bool ath9k_hw_set_reset(struct at
if (AR_SREV_9100(ah)) if (AR_SREV_9100(ah))
udelay(50); udelay(50);
@ -30,7 +30,7 @@
return true; return true;
} }
@@ -1435,6 +1451,9 @@ static bool ath9k_hw_chip_reset(struct a @@ -1436,6 +1452,9 @@ static bool ath9k_hw_chip_reset(struct a
ar9003_hw_internal_regulator_apply(ah); ar9003_hw_internal_regulator_apply(ah);
ath9k_hw_init_pll(ah, chan); ath9k_hw_init_pll(ah, chan);
@ -40,7 +40,7 @@
return true; return true;
} }
@@ -1729,8 +1748,14 @@ static int ath9k_hw_do_fastcc(struct ath @@ -1730,8 +1749,14 @@ static int ath9k_hw_do_fastcc(struct ath
if (AR_SREV_9271(ah)) if (AR_SREV_9271(ah))
ar9002_hw_load_ani_reg(ah, chan); ar9002_hw_load_ani_reg(ah, chan);
@ -55,7 +55,7 @@
return -EINVAL; return -EINVAL;
} }
@@ -1958,6 +1983,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st @@ -1959,6 +1984,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
if (AR_SREV_9565(ah) && common->bt_ant_diversity) if (AR_SREV_9565(ah) && common->bt_ant_diversity)
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);

View file

@ -1,33 +0,0 @@
From c997a1da25fe7c717ed099888b8eb35d4e139e70 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Sun, 8 Dec 2013 08:52:52 +0100
Subject: [PATCH] ath9k: support only one P2P interface
Preparation for adding P2P powersave and multi-channel support.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/init.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -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) |
- BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_WDS) },
{ .max = 8, .types =
#ifdef CPTCFG_MAC80211_MESH
BIT(NL80211_IFTYPE_MESH_POINT) |
#endif
- BIT(NL80211_IFTYPE_AP) |
- BIT(NL80211_IFTYPE_P2P_GO) },
+ BIT(NL80211_IFTYPE_AP) },
{ .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
+ { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
+ BIT(NL80211_IFTYPE_P2P_GO) },
};
static const struct ieee80211_iface_limit if_dfs_limits[] = {

View file

@ -1,249 +0,0 @@
From 6744d0a7ea037c7d65e13ca906da93009b241d00 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 11 Feb 2014 11:16:24 +0100
Subject: [PATCH] ath9k: implement p2p client powersave support
Use generic TSF timers to trigger powersave state changes based
information from the P2P NoA attribute.
Opportunistic Powersave is not handled, because the driver does not
support powersave at the moment.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/ath9k.h | 12 ++++
drivers/net/wireless/ath/ath9k/init.c | 6 ++
drivers/net/wireless/ath/ath9k/main.c | 104 +++++++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath9k/recv.c | 3 +
4 files changed, 125 insertions(+)
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -261,6 +261,8 @@ static bool ath_complete_reset(struct at
sc->gtt_cnt = 0;
ieee80211_wake_queues(sc->hw);
+ ath9k_p2p_ps_timer(sc);
+
return true;
}
@@ -1135,6 +1137,8 @@ static int ath9k_add_interface(struct ie
if (ath9k_uses_beacons(vif->type))
ath9k_beacon_assign_slot(sc, vif);
+ avp->vif = vif;
+
an->sc = sc;
an->sta = NULL;
an->vif = vif;
@@ -1179,6 +1183,29 @@ static int ath9k_change_interface(struct
return 0;
}
+static void
+ath9k_update_p2p_ps_timer(struct ath_softc *sc, struct ath_vif *avp)
+{
+ struct ath_hw *ah = sc->sc_ah;
+ s32 tsf, target_tsf;
+
+ if (!avp || !avp->noa.has_next_tsf)
+ return;
+
+ ath9k_hw_gen_timer_stop(ah, sc->p2p_ps_timer);
+
+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
+
+ target_tsf = avp->noa.next_tsf;
+ if (!avp->noa.absent)
+ target_tsf -= ATH_P2P_PS_STOP_TIME;
+
+ if (target_tsf - tsf < ATH_P2P_PS_STOP_TIME)
+ target_tsf = tsf + ATH_P2P_PS_STOP_TIME;
+
+ ath9k_hw_gen_timer_start(ah, sc->p2p_ps_timer, (u32) target_tsf, 1000000);
+}
+
static void ath9k_remove_interface(struct ieee80211_hw *hw,
struct ieee80211_vif *vif)
{
@@ -1190,6 +1217,13 @@ static void ath9k_remove_interface(struc
mutex_lock(&sc->mutex);
+ spin_lock_bh(&sc->sc_pcu_lock);
+ if (avp == sc->p2p_ps_vif) {
+ sc->p2p_ps_vif = NULL;
+ ath9k_update_p2p_ps_timer(sc, NULL);
+ }
+ spin_unlock_bh(&sc->sc_pcu_lock);
+
sc->nvifs--;
sc->tx99_vif = NULL;
@@ -1656,6 +1690,72 @@ static void ath9k_bss_assoc_iter(void *d
ath9k_set_assoc_state(sc, vif);
}
+void ath9k_p2p_ps_timer(void *priv)
+{
+ struct ath_softc *sc = priv;
+ struct ath_vif *avp = sc->p2p_ps_vif;
+ struct ieee80211_vif *vif;
+ struct ieee80211_sta *sta;
+ struct ath_node *an;
+ u32 tsf;
+
+ if (!avp)
+ return;
+
+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
+ if (!avp->noa.absent)
+ tsf += ATH_P2P_PS_STOP_TIME;
+
+ if (!avp->noa.has_next_tsf ||
+ avp->noa.next_tsf - tsf > BIT(31))
+ ieee80211_update_p2p_noa(&avp->noa, tsf);
+
+ ath9k_update_p2p_ps_timer(sc, avp);
+
+ rcu_read_lock();
+
+ vif = avp->vif;
+ sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
+ if (!sta)
+ goto out;
+
+ an = (void *) sta->drv_priv;
+ if (an->sleeping == !!avp->noa.absent)
+ goto out;
+
+ an->sleeping = avp->noa.absent;
+ if (an->sleeping)
+ ath_tx_aggr_sleep(sta, sc, an);
+ else
+ ath_tx_aggr_wakeup(sc, an);
+
+out:
+ rcu_read_unlock();
+}
+
+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)
+ return;
+
+ if (vif->type != NL80211_IFTYPE_STATION || !vif->p2p)
+ return;
+
+ sc->p2p_ps_vif = 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,
@@ -1730,6 +1830,12 @@ static void ath9k_bss_info_changed(struc
}
}
+ if (changed & BSS_CHANGED_P2P_PS) {
+ spin_lock_bh(&sc->sc_pcu_lock);
+ ath9k_update_p2p_ps(sc, vif);
+ spin_unlock_bh(&sc->sc_pcu_lock);
+ }
+
if (changed & CHECK_ANI)
ath_check_ani(sc);
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -114,6 +114,9 @@ int ath_descdma_setup(struct ath_softc *
#define ATH_TXFIFO_DEPTH 8
#define ATH_TX_ERROR 0x01
+/* Stop tx traffic 1ms before the GO goes away */
+#define ATH_P2P_PS_STOP_TIME 1000
+
#define IEEE80211_SEQ_SEQ_SHIFT 4
#define IEEE80211_SEQ_MAX 4096
#define IEEE80211_WEP_IVLEN 3
@@ -366,11 +369,15 @@ void ath9k_release_buffered_frames(struc
/********/
struct ath_vif {
+ struct ieee80211_vif *vif;
struct ath_node mcast_node;
int av_bslot;
bool primary_sta_vif;
__le64 tsf_adjust; /* TSF adjustment for staggered beacons */
struct ath_buf *av_bcbuf;
+
+ /* P2P Client */
+ struct ieee80211_noa_data noa;
};
struct ath9k_vif_iter_data {
@@ -463,6 +470,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);
+void ath9k_p2p_ps_timer(void *priv);
+void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif);
/**********/
/* BTCOEX */
@@ -723,6 +732,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 driver_data;
u8 gtt_cnt;
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -593,6 +593,9 @@ static int ath9k_init_softc(u16 devid, s
if (ret)
goto err_btcoex;
+ sc->p2p_ps_timer = ath_gen_timer_alloc(sc->sc_ah, ath9k_p2p_ps_timer,
+ NULL, sc, AR_FIRST_NDP_TIMER);
+
ath9k_cmn_init_crypto(sc->sc_ah);
ath9k_init_misc(sc);
ath_fill_led_pin(sc);
@@ -875,6 +878,9 @@ static void ath9k_deinit_softc(struct at
{
int i = 0;
+ if (sc->p2p_ps_timer)
+ ath_gen_timer_free(sc->sc_ah, sc->p2p_ps_timer);
+
ath9k_deinit_btcoex(sc);
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -542,6 +542,9 @@ static void ath_rx_ps_beacon(struct ath_
ath_dbg(common, PS,
"Reconfigure beacon timers based on synchronized timestamp\n");
ath9k_set_beacon(sc);
+
+ if (sc->p2p_ps_vif)
+ ath9k_update_p2p_ps(sc, sc->p2p_ps_vif->vif);
}
if (ath_beacon_dtim_pending_cab(skb)) {

View file

@ -1,11 +0,0 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -260,6 +260,8 @@ static void ath9k_hw_read_revisions(stru
return;
case AR9300_DEVID_AR953X:
ah->hw_version.macVersion = AR_SREV_VERSION_9531;
+ if (ah->get_mac_revision)
+ ah->hw_version.macRev = ah->get_mac_revision();
return;
}

View file

@ -1,82 +0,0 @@
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -4321,6 +4321,7 @@ static const struct ieee80211_iface_comb
BIT(NL80211_CHAN_WIDTH_20) |
BIT(NL80211_CHAN_WIDTH_40) |
BIT(NL80211_CHAN_WIDTH_80),
+ .radar_detect_regions = BIT(NL80211_DFS_ETSI),
#endif
},
};
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -688,6 +688,7 @@ static const struct ieee80211_iface_comb
.beacon_int_infra_match = true,
.radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
BIT(NL80211_CHAN_WIDTH_20),
+ .radar_detect_regions = BIT(NL80211_DFS_ETSI),
}
#endif
};
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2620,6 +2620,7 @@ struct ieee80211_iface_limit {
* between infrastructure and AP types must match. This is required
* only in special cases.
* @radar_detect_widths: bitmap of channel widths supported for radar detection
+ * @radar_detect_regions: bitmap of regions supported for radar detection
*
* With this structure the driver can describe which interface
* combinations it supports concurrently.
@@ -2677,6 +2678,7 @@ struct ieee80211_iface_combination {
u8 n_limits;
bool beacon_int_infra_match;
u8 radar_detect_widths;
+ u8 radar_detect_regions;
};
struct ieee80211_txrx_stypes {
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1259,6 +1259,7 @@ int cfg80211_can_use_iftype_chan(struct
enum cfg80211_chan_mode chanmode,
u8 radar_detect)
{
+ const struct ieee80211_regdomain *regdom;
struct wireless_dev *wdev_iter;
u32 used_iftypes = BIT(iftype);
int num[NUM_NL80211_IFTYPES];
@@ -1267,6 +1268,7 @@ int cfg80211_can_use_iftype_chan(struct
struct ieee80211_channel *ch;
enum cfg80211_chan_mode chmode;
int num_different_channels = 0;
+ enum nl80211_dfs_regions region = 0;
int total = 1;
int i, j;
@@ -1285,6 +1287,14 @@ int cfg80211_can_use_iftype_chan(struct
return 0;
}
+ if (radar_detect) {
+ rcu_read_lock();
+ regdom = rcu_dereference(cfg80211_regdomain);
+ if (regdom)
+ region = regdom->dfs_region;
+ rcu_read_unlock();
+ }
+
memset(num, 0, sizeof(num));
memset(used_channels, 0, sizeof(used_channels));
@@ -1392,6 +1402,10 @@ int cfg80211_can_use_iftype_chan(struct
if (radar_detect && !(c->radar_detect_widths & radar_detect))
goto cont;
+ if (radar_detect && c->radar_detect_regions &&
+ !(c->radar_detect_regions & BIT(region)))
+ goto cont;
+
/*
* Finally check that all iftypes that we're currently
* using are actually part of this combination. If they

View file

@ -24,7 +24,7 @@ Changes since v1:
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7712,6 +7712,7 @@ static int rt2800_probe_rt(struct rt2x00 @@ -7711,6 +7711,7 @@ static int rt2800_probe_rt(struct rt2x00
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev) int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
{ {
@ -32,7 +32,7 @@ Changes since v1:
int retval; int retval;
u32 reg; u32 reg;
@@ -7719,6 +7720,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -7718,6 +7719,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r
if (retval) if (retval)
return retval; return retval;

View file

@ -79,8 +79,8 @@ Changes since v1: ---
+ rt2800_shared_mem_unlock(rt2x00dev); + rt2800_shared_mem_unlock(rt2x00dev);
/* /*
* Enable beaconing again. * Restore beaconing state.
@@ -1027,6 +1039,8 @@ static inline void rt2800_clear_beacon_r @@ -1026,6 +1038,8 @@ static inline void rt2800_clear_beacon_r
beacon_base = rt2800_hw_beacon_base(rt2x00dev, index); beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
@ -89,7 +89,7 @@ Changes since v1: ---
/* /*
* For the Beacon base registers we only need to clear * For the Beacon base registers we only need to clear
* the whole TXWI which (when set to 0) will invalidate * the whole TXWI which (when set to 0) will invalidate
@@ -1034,6 +1048,8 @@ static inline void rt2800_clear_beacon_r @@ -1033,6 +1047,8 @@ static inline void rt2800_clear_beacon_r
*/ */
for (i = 0; i < txwi_desc_size; i += sizeof(__le32)) for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
rt2800_register_write(rt2x00dev, beacon_base + i, 0); rt2800_register_write(rt2x00dev, beacon_base + i, 0);
@ -98,7 +98,7 @@ Changes since v1: ---
} }
void rt2800_clear_beacon(struct queue_entry *entry) void rt2800_clear_beacon(struct queue_entry *entry)
@@ -1217,7 +1233,9 @@ static void rt2800_delete_wcid_attr(stru @@ -1216,7 +1232,9 @@ static void rt2800_delete_wcid_attr(stru
{ {
u32 offset; u32 offset;
offset = MAC_WCID_ATTR_ENTRY(wcid); offset = MAC_WCID_ATTR_ENTRY(wcid);
@ -108,7 +108,7 @@ Changes since v1: ---
} }
static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev, static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev,
@@ -1230,11 +1248,13 @@ static void rt2800_config_wcid_attr_bssi @@ -1229,11 +1247,13 @@ static void rt2800_config_wcid_attr_bssi
* The BSS Idx numbers is split in a main value of 3 bits, * The BSS Idx numbers is split in a main value of 3 bits,
* and a extended field for adding one additional bit to the value. * and a extended field for adding one additional bit to the value.
*/ */
@ -122,7 +122,7 @@ Changes since v1: ---
} }
static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev, static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev,
@@ -1247,6 +1267,7 @@ static void rt2800_config_wcid_attr_ciph @@ -1246,6 +1266,7 @@ static void rt2800_config_wcid_attr_ciph
offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx); offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
@ -130,7 +130,7 @@ Changes since v1: ---
if (crypto->cmd == SET_KEY) { if (crypto->cmd == SET_KEY) {
rt2800_register_read(rt2x00dev, offset, &reg); rt2800_register_read(rt2x00dev, offset, &reg);
rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB, rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB,
@@ -1271,6 +1292,7 @@ static void rt2800_config_wcid_attr_ciph @@ -1270,6 +1291,7 @@ static void rt2800_config_wcid_attr_ciph
rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0); rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0);
rt2800_register_write(rt2x00dev, offset, reg); rt2800_register_write(rt2x00dev, offset, reg);
} }
@ -138,7 +138,7 @@ Changes since v1: ---
offset = MAC_IVEIV_ENTRY(key->hw_key_idx); offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
@@ -1280,8 +1302,11 @@ static void rt2800_config_wcid_attr_ciph @@ -1279,8 +1301,11 @@ static void rt2800_config_wcid_attr_ciph
(crypto->cipher == CIPHER_AES)) (crypto->cipher == CIPHER_AES))
iveiv_entry.iv[3] |= 0x20; iveiv_entry.iv[3] |= 0x20;
iveiv_entry.iv[3] |= key->keyidx << 6; iveiv_entry.iv[3] |= key->keyidx << 6;
@ -150,7 +150,7 @@ Changes since v1: ---
} }
int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev, int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
@@ -1304,8 +1329,11 @@ int rt2800_config_shared_key(struct rt2x @@ -1303,8 +1328,11 @@ int rt2800_config_shared_key(struct rt2x
sizeof(key_entry.rx_mic)); sizeof(key_entry.rx_mic));
offset = SHARED_KEY_ENTRY(key->hw_key_idx); offset = SHARED_KEY_ENTRY(key->hw_key_idx);
@ -162,7 +162,7 @@ Changes since v1: ---
} }
/* /*
@@ -1320,10 +1348,12 @@ int rt2800_config_shared_key(struct rt2x @@ -1319,10 +1347,12 @@ int rt2800_config_shared_key(struct rt2x
offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8); offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8);
@ -175,7 +175,7 @@ Changes since v1: ---
/* /*
* Update WCID information * Update WCID information
@@ -1393,8 +1423,11 @@ int rt2800_config_pairwise_key(struct rt @@ -1392,8 +1422,11 @@ int rt2800_config_pairwise_key(struct rt
sizeof(key_entry.rx_mic)); sizeof(key_entry.rx_mic));
offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx); offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
@ -187,7 +187,7 @@ Changes since v1: ---
} }
/* /*
@@ -4876,14 +4909,19 @@ static int rt2800_init_registers(struct @@ -4875,14 +4908,19 @@ static int rt2800_init_registers(struct
/* /*
* ASIC will keep garbage value after boot, clear encryption keys. * ASIC will keep garbage value after boot, clear encryption keys.
*/ */
@ -207,7 +207,7 @@ Changes since v1: ---
} }
/* /*
@@ -5009,8 +5047,10 @@ static int rt2800_wait_bbp_ready(struct @@ -5008,8 +5046,10 @@ static int rt2800_wait_bbp_ready(struct
* BBP was enabled after firmware was loaded, * BBP was enabled after firmware was loaded,
* but we need to reactivate it now. * but we need to reactivate it now.
*/ */
@ -218,7 +218,7 @@ Changes since v1: ---
msleep(1); msleep(1);
for (i = 0; i < REGISTER_BUSY_COUNT; i++) { for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
@@ -6706,11 +6746,19 @@ int rt2800_enable_radio(struct rt2x00_de @@ -6705,11 +6745,19 @@ int rt2800_enable_radio(struct rt2x00_de
/* /*
* Send signal during boot time to initialize firmware. * Send signal during boot time to initialize firmware.
*/ */
@ -239,7 +239,7 @@ Changes since v1: ---
msleep(1); msleep(1);
/* /*
@@ -7716,6 +7764,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -7715,6 +7763,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
int retval; int retval;
u32 reg; u32 reg;
@ -248,7 +248,7 @@ Changes since v1: ---
retval = rt2800_probe_rt(rt2x00dev); retval = rt2800_probe_rt(rt2x00dev);
if (retval) if (retval)
return retval; return retval;
@@ -7795,8 +7845,11 @@ void rt2800_get_tkip_seq(struct ieee8021 @@ -7794,8 +7844,11 @@ void rt2800_get_tkip_seq(struct ieee8021
u32 offset; u32 offset;
offset = MAC_IVEIV_ENTRY(hw_key_idx); offset = MAC_IVEIV_ENTRY(hw_key_idx);

View file

@ -111,7 +111,7 @@ Changes since v1: ---
rt2800_shared_mem_unlock(rt2x00dev); rt2800_shared_mem_unlock(rt2x00dev);
/* /*
@@ -1041,6 +1081,8 @@ static inline void rt2800_clear_beacon_r @@ -1040,6 +1080,8 @@ static inline void rt2800_clear_beacon_r
rt2800_shared_mem_lock(rt2x00dev); rt2800_shared_mem_lock(rt2x00dev);
@ -120,7 +120,7 @@ Changes since v1: ---
/* /*
* For the Beacon base registers we only need to clear * For the Beacon base registers we only need to clear
* the whole TXWI which (when set to 0) will invalidate * the whole TXWI which (when set to 0) will invalidate
@@ -1049,6 +1091,8 @@ static inline void rt2800_clear_beacon_r @@ -1048,6 +1090,8 @@ static inline void rt2800_clear_beacon_r
for (i = 0; i < txwi_desc_size; i += sizeof(__le32)) for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
rt2800_register_write(rt2x00dev, beacon_base + i, 0); rt2800_register_write(rt2x00dev, beacon_base + i, 0);

View file

@ -24,7 +24,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4584,6 +4584,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner); @@ -4583,6 +4583,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner);
*/ */
static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
{ {
@ -32,7 +32,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
u32 reg; u32 reg;
u16 eeprom; u16 eeprom;
unsigned int i; unsigned int i;
@@ -4971,7 +4972,7 @@ static int rt2800_init_registers(struct @@ -4970,7 +4971,7 @@ static int rt2800_init_registers(struct
/* /*
* Clear all beacons * Clear all beacons
*/ */
@ -41,7 +41,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
rt2800_clear_beacon_register(rt2x00dev, i); rt2800_clear_beacon_register(rt2x00dev, i);
if (rt2x00_is_usb(rt2x00dev)) { if (rt2x00_is_usb(rt2x00dev)) {
@@ -7817,6 +7818,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -7816,6 +7817,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
if (rt2x00_rt(rt2x00dev, RT3593)) if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);

View file

@ -34,7 +34,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
*/ */
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4618,6 +4618,30 @@ static int rt2800_init_registers(struct @@ -4617,6 +4617,30 @@ static int rt2800_init_registers(struct
rt2800_get_beacon_offset(rt2x00dev, 7)); rt2800_get_beacon_offset(rt2x00dev, 7));
rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg); rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7842,7 +7842,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -7841,7 +7841,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r
if (rt2x00_rt(rt2x00dev, RT3593)) if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7812,6 +7812,7 @@ static int rt2800_probe_rt(struct rt2x00 @@ -7811,6 +7811,7 @@ static int rt2800_probe_rt(struct rt2x00
case RT3390: case RT3390:
case RT3572: case RT3572:
case RT3593: case RT3593:

View file

@ -31,7 +31,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
#define RF5372 0x5372 #define RF5372 0x5372
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7432,6 +7432,66 @@ static const struct rf_channel rf_vals_3 @@ -7431,6 +7431,66 @@ static const struct rf_channel rf_vals_3
{173, 0x61, 0, 9}, {173, 0x61, 0, 9},
}; };
@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
static const struct rf_channel rf_vals_5592_xtal20[] = { static const struct rf_channel rf_vals_5592_xtal20[] = {
/* Channel, N, K, mod, R */ /* Channel, N, K, mod, R */
{1, 482, 4, 10, 3}, {1, 482, 4, 10, 3},
@@ -7660,6 +7720,11 @@ static int rt2800_probe_hw_mode(struct r @@ -7659,6 +7719,11 @@ static int rt2800_probe_hw_mode(struct r
spec->channels = rf_vals_3x; spec->channels = rf_vals_3x;
break; break;

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4349,6 +4349,7 @@ void rt2800_vco_calibration(struct rt2x0 @@ -4348,6 +4348,7 @@ void rt2800_vco_calibration(struct rt2x0
case RF3053: case RF3053:
case RF3070: case RF3070:
case RF3290: case RF3290:
@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
case RF5360: case RF5360:
case RF5370: case RF5370:
case RF5372: case RF5372:
@@ -7839,6 +7840,7 @@ static int rt2800_probe_hw_mode(struct r @@ -7838,6 +7839,7 @@ static int rt2800_probe_hw_mode(struct r
case RF3053: case RF3053:
case RF3070: case RF3070:
case RF3290: case RF3290:

View file

@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2605,6 +2605,211 @@ static void rt2800_config_channel_rf3053 @@ -2604,6 +2604,211 @@ static void rt2800_config_channel_rf3053
} }
} }
@ -223,7 +223,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
#define POWER_BOUND 0x27 #define POWER_BOUND 0x27
#define POWER_BOUND_5G 0x2b #define POWER_BOUND_5G 0x2b
@@ -3217,6 +3422,9 @@ static void rt2800_config_channel(struct @@ -3216,6 +3421,9 @@ static void rt2800_config_channel(struct
case RF3322: case RF3322:
rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info); rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
break; break;

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7398,6 +7398,7 @@ static int rt2800_init_eeprom(struct rt2 @@ -7397,6 +7397,7 @@ static int rt2800_init_eeprom(struct rt2
case RF3290: case RF3290:
case RF3320: case RF3320:
case RF3322: case RF3322:

View file

@ -35,7 +35,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
#define RX_FILTER_CFG 0x1400 #define RX_FILTER_CFG 0x1400
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4973,6 +4973,12 @@ static int rt2800_init_registers(struct @@ -4972,6 +4972,12 @@ static int rt2800_init_registers(struct
rt2800_register_write(rt2x00dev, TX_SW_CFG2, rt2800_register_write(rt2x00dev, TX_SW_CFG2,
0x00000000); 0x00000000);
} }
@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
} else if (rt2x00_rt(rt2x00dev, RT5390) || } else if (rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392) || rt2x00_rt(rt2x00dev, RT5392) ||
rt2x00_rt(rt2x00dev, RT5592)) { rt2x00_rt(rt2x00dev, RT5592)) {
@@ -5003,9 +5009,11 @@ static int rt2800_init_registers(struct @@ -5002,9 +5008,11 @@ static int rt2800_init_registers(struct
rt2800_register_read(rt2x00dev, MAX_LEN_CFG, &reg); rt2800_register_read(rt2x00dev, MAX_LEN_CFG, &reg);
rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE); rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
@ -63,7 +63,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 2); rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 2);
else else
rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 1); rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 1);
@@ -5158,6 +5166,11 @@ static int rt2800_init_registers(struct @@ -5157,6 +5165,11 @@ static int rt2800_init_registers(struct
reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002; reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002;
rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg); rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);

View file

@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -5776,6 +5776,47 @@ static void rt2800_init_bbp_3593(struct @@ -5775,6 +5775,47 @@ static void rt2800_init_bbp_3593(struct
rt2800_bbp_write(rt2x00dev, 103, 0xc0); rt2800_bbp_write(rt2x00dev, 103, 0xc0);
} }
@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
{ {
int ant, div_mode; int ant, div_mode;
@@ -5994,6 +6035,9 @@ static void rt2800_init_bbp(struct rt2x0 @@ -5993,6 +6034,9 @@ static void rt2800_init_bbp(struct rt2x0
case RT3593: case RT3593:
rt2800_init_bbp_3593(rt2x00dev); rt2800_init_bbp_3593(rt2x00dev);
return; return;

View file

@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
/* /*
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -6811,6 +6811,144 @@ static void rt2800_init_rfcsr_3593(struc @@ -6810,6 +6810,144 @@ static void rt2800_init_rfcsr_3593(struc
/* TODO: enable stream mode support */ /* TODO: enable stream mode support */
} }
@ -166,7 +166,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
{ {
rt2800_rf_init_calibration(rt2x00dev, 2); rt2800_rf_init_calibration(rt2x00dev, 2);
@@ -7042,6 +7180,9 @@ static void rt2800_init_rfcsr(struct rt2 @@ -7041,6 +7179,9 @@ static void rt2800_init_rfcsr(struct rt2
case RT3390: case RT3390:
rt2800_init_rfcsr_3390(rt2x00dev); rt2800_init_rfcsr_3390(rt2x00dev);
break; break;

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7579,6 +7579,8 @@ static int rt2800_init_eeprom(struct rt2 @@ -7578,6 +7578,8 @@ static int rt2800_init_eeprom(struct rt2
rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392)) rt2x00_rt(rt2x00dev, RT5392))
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -3385,6 +3385,36 @@ static char rt2800_txpower_to_dev(struct @@ -3384,6 +3384,36 @@ static char rt2800_txpower_to_dev(struct
return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER); return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
} }
@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
struct ieee80211_conf *conf, struct ieee80211_conf *conf,
struct rf_channel *rf, struct rf_channel *rf,
@@ -3403,6 +3433,12 @@ static void rt2800_config_channel(struct @@ -3402,6 +3432,12 @@ static void rt2800_config_channel(struct
rt2800_txpower_to_dev(rt2x00dev, rf->channel, rt2800_txpower_to_dev(rt2x00dev, rf->channel,
info->default_power3); info->default_power3);
@ -60,7 +60,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
switch (rt2x00dev->chip.rf) { switch (rt2x00dev->chip.rf) {
case RF2020: case RF2020:
case RF3020: case RF3020:
@@ -3484,6 +3520,15 @@ static void rt2800_config_channel(struct @@ -3483,6 +3519,15 @@ static void rt2800_config_channel(struct
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 77, 0x98); rt2800_bbp_write(rt2x00dev, 77, 0x98);
@ -76,7 +76,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
} else { } else {
rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
@@ -3496,6 +3541,7 @@ static void rt2800_config_channel(struct @@ -3495,6 +3540,7 @@ static void rt2800_config_channel(struct
!rt2x00_rt(rt2x00dev, RT5392)) { !rt2x00_rt(rt2x00dev, RT5392)) {
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
rt2800_bbp_write(rt2x00dev, 82, 0x62); rt2800_bbp_write(rt2x00dev, 82, 0x62);
@ -84,7 +84,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
rt2800_bbp_write(rt2x00dev, 75, 0x46); rt2800_bbp_write(rt2x00dev, 75, 0x46);
} else { } else {
if (rt2x00_rt(rt2x00dev, RT3593)) if (rt2x00_rt(rt2x00dev, RT3593))
@@ -3504,19 +3550,22 @@ static void rt2800_config_channel(struct @@ -3503,19 +3549,22 @@ static void rt2800_config_channel(struct
rt2800_bbp_write(rt2x00dev, 82, 0x84); rt2800_bbp_write(rt2x00dev, 82, 0x84);
rt2800_bbp_write(rt2x00dev, 75, 0x50); rt2800_bbp_write(rt2x00dev, 75, 0x50);
} }
@ -110,13 +110,10 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
rt2800_bbp_write(rt2x00dev, 83, 0x9a); rt2800_bbp_write(rt2x00dev, 83, 0x9a);
if (rt2x00_has_cap_external_lna_a(rt2x00dev)) if (rt2x00_has_cap_external_lna_a(rt2x00dev))
@@ -3638,6 +3687,23 @@ static void rt2800_config_channel(struct @@ -3640,6 +3689,23 @@ static void rt2800_config_channel(struct
usleep_range(1000, 1500);
}
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
+ usleep_range(1000, 1500);
+ }
+
+ if (rt2x00_rt(rt2x00dev, RT3883)) { + if (rt2x00_rt(rt2x00dev, RT3883)) {
+ if (!conf_is_ht40(conf)) + if (!conf_is_ht40(conf))
+ rt2800_bbp_write(rt2x00dev, 105, 0x34); + rt2800_bbp_write(rt2x00dev, 105, 0x34);
@ -131,6 +128,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ +
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
+ +
usleep_range(1000, 1500); + usleep_range(1000, 1500);
} + }
+
if (rt2x00_rt(rt2x00dev, RT5592)) {
rt2800_bbp_write(rt2x00dev, 195, 141);
rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -3372,13 +3372,15 @@ static char rt2800_txpower_to_dev(struct @@ -3371,13 +3371,15 @@ static char rt2800_txpower_to_dev(struct
unsigned int channel, unsigned int channel,
char txpower) char txpower)
{ {

View file

@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4582,7 +4582,8 @@ static void rt2800_config_txpower(struct @@ -4581,7 +4581,8 @@ static void rt2800_config_txpower(struct
struct ieee80211_channel *chan, struct ieee80211_channel *chan,
int power_level) int power_level)
{ {

View file

@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7461,7 +7461,8 @@ static u8 rt2800_get_txmixer_gain_24g(st @@ -7460,7 +7460,8 @@ static u8 rt2800_get_txmixer_gain_24g(st
{ {
u16 word; u16 word;
@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
return 0; return 0;
rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word); rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
@@ -7475,7 +7476,8 @@ static u8 rt2800_get_txmixer_gain_5g(str @@ -7474,7 +7475,8 @@ static u8 rt2800_get_txmixer_gain_5g(str
{ {
u16 word; u16 word;

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -8393,7 +8393,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -8392,7 +8392,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
if (rt2x00_rt(rt2x00dev, RT3593)) if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1917,7 +1917,8 @@ void rt2800_config_ant(struct rt2x00_dev @@ -1916,7 +1916,8 @@ void rt2800_config_ant(struct rt2x00_dev
rt2800_bbp_write(rt2x00dev, 3, r3); rt2800_bbp_write(rt2x00dev, 3, r3);
rt2800_bbp_write(rt2x00dev, 1, r1); rt2800_bbp_write(rt2x00dev, 1, r1);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1940,7 +1940,8 @@ static void rt2800_config_lna_gain(struc @@ -1939,7 +1939,8 @@ static void rt2800_config_lna_gain(struc
rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom); rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0); lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
} else if (libconf->rf.channel <= 128) { } else if (libconf->rf.channel <= 128) {
@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom); rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
lna_gain = rt2x00_get_field16(eeprom, lna_gain = rt2x00_get_field16(eeprom,
EEPROM_EXT_LNA2_A1); EEPROM_EXT_LNA2_A1);
@@ -1950,7 +1951,8 @@ static void rt2800_config_lna_gain(struc @@ -1949,7 +1950,8 @@ static void rt2800_config_lna_gain(struc
EEPROM_RSSI_BG2_LNA_A1); EEPROM_RSSI_BG2_LNA_A1);
} }
} else { } else {

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4781,7 +4781,8 @@ static u8 rt2800_get_default_vgc(struct @@ -4780,7 +4780,8 @@ static u8 rt2800_get_default_vgc(struct
else else
vgc = 0x2e + rt2x00dev->lna_gain; vgc = 0x2e + rt2x00dev->lna_gain;
} else { /* 5GHZ band */ } else { /* 5GHZ band */
@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3; vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
else if (rt2x00_rt(rt2x00dev, RT5592)) else if (rt2x00_rt(rt2x00dev, RT5592))
vgc = 0x24 + (2 * rt2x00dev->lna_gain); vgc = 0x24 + (2 * rt2x00dev->lna_gain);
@@ -4801,7 +4802,8 @@ static inline void rt2800_set_vgc(struct @@ -4800,7 +4801,8 @@ static inline void rt2800_set_vgc(struct
{ {
if (qual->vgc_level != vgc_level) { if (qual->vgc_level != vgc_level) {
if (rt2x00_rt(rt2x00dev, RT3572) || if (rt2x00_rt(rt2x00dev, RT3572) ||
@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
vgc_level); vgc_level);
} else if (rt2x00_rt(rt2x00dev, RT5592)) { } else if (rt2x00_rt(rt2x00dev, RT5592)) {
@@ -4848,6 +4850,11 @@ void rt2800_link_tuner(struct rt2x00_dev @@ -4847,6 +4849,11 @@ void rt2800_link_tuner(struct rt2x00_dev
} }
break; break;

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7598,7 +7598,8 @@ static int rt2800_validate_eeprom(struct @@ -7597,7 +7597,8 @@ static int rt2800_validate_eeprom(struct
rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word); rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10) if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0); rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 || if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff) rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1, rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
@@ -7618,7 +7619,8 @@ static int rt2800_validate_eeprom(struct @@ -7617,7 +7618,8 @@ static int rt2800_validate_eeprom(struct
rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word); rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10) if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0); rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 || if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff) rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2, rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
@@ -7626,7 +7628,8 @@ static int rt2800_validate_eeprom(struct @@ -7625,7 +7627,8 @@ static int rt2800_validate_eeprom(struct
} }
rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word); rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);

View file

@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -3959,6 +3959,9 @@ static u8 rt2800_compensate_txpower(stru @@ -3958,6 +3958,9 @@ static u8 rt2800_compensate_txpower(stru
if (rt2x00_rt(rt2x00dev, RT3593)) if (rt2x00_rt(rt2x00dev, RT3593))
return min_t(u8, txpower, 0xc); return min_t(u8, txpower, 0xc);

View file

@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -8406,7 +8406,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -8405,7 +8405,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
if (retval) if (retval)
return retval; return retval;

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -3506,11 +3506,18 @@ static void rt2800_config_channel(struct @@ -3505,11 +3505,18 @@ static void rt2800_config_channel(struct
/* /*
* Change BBP settings * Change BBP settings
*/ */
@ -19,7 +19,7 @@
} else if (rt2x00_rt(rt2x00dev, RT3593)) { } else if (rt2x00_rt(rt2x00dev, RT3593)) {
if (rf->channel > 14) { if (rf->channel > 14) {
/* Disable CCK Packet detection on 5GHz */ /* Disable CCK Packet detection on 5GHz */
@@ -6586,6 +6593,12 @@ static void rt2800_init_rfcsr_3290(struc @@ -6585,6 +6592,12 @@ static void rt2800_init_rfcsr_3290(struc
static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev) static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
{ {
@ -32,7 +32,7 @@
rt2800_rf_init_calibration(rt2x00dev, 30); rt2800_rf_init_calibration(rt2x00dev, 30);
rt2800_rfcsr_write(rt2x00dev, 0, 0xf0); rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
@@ -6621,15 +6634,30 @@ static void rt2800_init_rfcsr_3352(struc @@ -6620,15 +6633,30 @@ static void rt2800_init_rfcsr_3352(struc
rt2800_rfcsr_write(rt2x00dev, 31, 0x80); rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
rt2800_rfcsr_write(rt2x00dev, 32, 0x80); rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
rt2800_rfcsr_write(rt2x00dev, 33, 0x00); rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
@ -66,7 +66,7 @@
rt2800_rfcsr_write(rt2x00dev, 43, 0xdb); rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
rt2800_rfcsr_write(rt2x00dev, 44, 0xdb); rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
rt2800_rfcsr_write(rt2x00dev, 45, 0xdb); rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
@@ -6637,15 +6665,20 @@ static void rt2800_init_rfcsr_3352(struc @@ -6636,15 +6664,20 @@ static void rt2800_init_rfcsr_3352(struc
rt2800_rfcsr_write(rt2x00dev, 47, 0x0d); rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
rt2800_rfcsr_write(rt2x00dev, 48, 0x14); rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
rt2800_rfcsr_write(rt2x00dev, 49, 0x00); rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
@ -96,7 +96,7 @@
rt2800_rfcsr_write(rt2x00dev, 59, 0x00); rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
rt2800_rfcsr_write(rt2x00dev, 60, 0x00); rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
rt2800_rfcsr_write(rt2x00dev, 61, 0x00); rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
@@ -7666,6 +7699,7 @@ static int rt2800_init_eeprom(struct rt2 @@ -7665,6 +7698,7 @@ static int rt2800_init_eeprom(struct rt2
* RT53xx: defined in "EEPROM_CHIP_ID" field * RT53xx: defined in "EEPROM_CHIP_ID" field
*/ */
if (rt2x00_rt(rt2x00dev, RT3290) || if (rt2x00_rt(rt2x00dev, RT3290) ||
@ -104,7 +104,7 @@
rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392)) rt2x00_rt(rt2x00dev, RT5392))
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
@@ -7760,7 +7794,8 @@ static int rt2800_init_eeprom(struct rt2 @@ -7759,7 +7793,8 @@ static int rt2800_init_eeprom(struct rt2
/* /*
* Detect if this device has Bluetooth co-existence. * Detect if this device has Bluetooth co-existence.
*/ */
@ -114,7 +114,7 @@
__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags); __set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
/* /*
@@ -7789,6 +7824,22 @@ static int rt2800_init_eeprom(struct rt2 @@ -7788,6 +7823,22 @@ static int rt2800_init_eeprom(struct rt2
EIRP_MAX_TX_POWER_LIMIT) EIRP_MAX_TX_POWER_LIMIT)
__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags); __set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -8176,6 +8176,27 @@ static const struct rf_channel rf_vals_5 @@ -8175,6 +8175,27 @@ static const struct rf_channel rf_vals_5
{196, 83, 0, 12, 1}, {196, 83, 0, 12, 1},
}; };
@ -28,7 +28,7 @@
static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
{ {
struct hw_mode_spec *spec = &rt2x00dev->spec; struct hw_mode_spec *spec = &rt2x00dev->spec;
@@ -8263,7 +8284,10 @@ static int rt2800_probe_hw_mode(struct r @@ -8262,7 +8283,10 @@ static int rt2800_probe_hw_mode(struct r
case RF5390: case RF5390:
case RF5392: case RF5392:
spec->num_channels = 14; spec->num_channels = 14;
@ -40,7 +40,7 @@
break; break;
case RF3052: case RF3052:
@@ -8446,6 +8470,19 @@ static int rt2800_probe_rt(struct rt2x00 @@ -8445,6 +8469,19 @@ static int rt2800_probe_rt(struct rt2x00
return 0; return 0;
} }
@ -60,7 +60,7 @@
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev) int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
{ {
struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
@@ -8488,6 +8525,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r @@ -8487,6 +8524,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
/* /*

View file

@ -8,7 +8,7 @@
#include "rt2x00.h" #include "rt2x00.h"
#include "rt2800lib.h" #include "rt2800lib.h"
@@ -8472,13 +8473,14 @@ static int rt2800_probe_rt(struct rt2x00 @@ -8471,13 +8472,14 @@ static int rt2800_probe_rt(struct rt2x00
int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev) int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
{ {

View file

@ -10,7 +10,7 @@
#define RF5372 0x5372 #define RF5372 0x5372
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2994,6 +2994,13 @@ static void rt2800_config_channel_rf53xx @@ -2993,6 +2993,13 @@ static void rt2800_config_channel_rf53xx
rt2800_rfcsr_write(rt2x00dev, 59, rt2800_rfcsr_write(rt2x00dev, 59,
r59_non_bt[idx]); r59_non_bt[idx]);
@ -24,7 +24,7 @@
} }
} }
} }
@@ -3472,6 +3479,7 @@ static void rt2800_config_channel(struct @@ -3471,6 +3478,7 @@ static void rt2800_config_channel(struct
rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info); rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
break; break;
case RF3070: case RF3070:
@ -32,7 +32,7 @@
case RF5360: case RF5360:
case RF5370: case RF5370:
case RF5372: case RF5372:
@@ -3489,6 +3497,7 @@ static void rt2800_config_channel(struct @@ -3488,6 +3496,7 @@ static void rt2800_config_channel(struct
if (rt2x00_rf(rt2x00dev, RF3070) || if (rt2x00_rf(rt2x00dev, RF3070) ||
rt2x00_rf(rt2x00dev, RF3290) || rt2x00_rf(rt2x00dev, RF3290) ||
rt2x00_rf(rt2x00dev, RF3322) || rt2x00_rf(rt2x00dev, RF3322) ||
@ -40,7 +40,7 @@
rt2x00_rf(rt2x00dev, RF5360) || rt2x00_rf(rt2x00dev, RF5360) ||
rt2x00_rf(rt2x00dev, RF5370) || rt2x00_rf(rt2x00dev, RF5370) ||
rt2x00_rf(rt2x00dev, RF5372) || rt2x00_rf(rt2x00dev, RF5372) ||
@@ -3766,7 +3775,8 @@ static void rt2800_config_channel(struct @@ -3765,7 +3774,8 @@ static void rt2800_config_channel(struct
/* /*
* Clear update flag * Clear update flag
*/ */
@ -50,7 +50,7 @@
rt2800_bbp_read(rt2x00dev, 49, &bbp); rt2800_bbp_read(rt2x00dev, 49, &bbp);
rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0); rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
rt2800_bbp_write(rt2x00dev, 49, bbp); rt2800_bbp_write(rt2x00dev, 49, bbp);
@@ -4645,6 +4655,7 @@ void rt2800_vco_calibration(struct rt2x0 @@ -4644,6 +4654,7 @@ void rt2800_vco_calibration(struct rt2x0
case RF3070: case RF3070:
case RF3290: case RF3290:
case RF3853: case RF3853:
@ -58,7 +58,7 @@
case RF5360: case RF5360:
case RF5370: case RF5370:
case RF5372: case RF5372:
@@ -5079,6 +5090,8 @@ static int rt2800_init_registers(struct @@ -5078,6 +5089,8 @@ static int rt2800_init_registers(struct
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@ -67,7 +67,7 @@
} else { } else {
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000); rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
@@ -5734,9 +5747,13 @@ static void rt2800_init_bbp_3352(struct @@ -5733,9 +5746,13 @@ static void rt2800_init_bbp_3352(struct
rt2800_bbp_write(rt2x00dev, 82, 0x62); rt2800_bbp_write(rt2x00dev, 82, 0x62);
@ -84,7 +84,7 @@
rt2800_bbp_write(rt2x00dev, 86, 0x38); rt2800_bbp_write(rt2x00dev, 86, 0x38);
@@ -5750,9 +5767,13 @@ static void rt2800_init_bbp_3352(struct @@ -5749,9 +5766,13 @@ static void rt2800_init_bbp_3352(struct
rt2800_bbp_write(rt2x00dev, 104, 0x92); rt2800_bbp_write(rt2x00dev, 104, 0x92);
@ -101,7 +101,7 @@
rt2800_bbp_write(rt2x00dev, 120, 0x50); rt2800_bbp_write(rt2x00dev, 120, 0x50);
@@ -5777,6 +5798,13 @@ static void rt2800_init_bbp_3352(struct @@ -5776,6 +5797,13 @@ static void rt2800_init_bbp_3352(struct
rt2800_bbp_write(rt2x00dev, 143, 0xa2); rt2800_bbp_write(rt2x00dev, 143, 0xa2);
rt2800_bbp_write(rt2x00dev, 148, 0xc8); rt2800_bbp_write(rt2x00dev, 148, 0xc8);
@ -115,7 +115,7 @@
} }
static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev) static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
@@ -6118,6 +6146,7 @@ static void rt2800_init_bbp(struct rt2x0 @@ -6117,6 +6145,7 @@ static void rt2800_init_bbp(struct rt2x0
rt2800_init_bbp_3290(rt2x00dev); rt2800_init_bbp_3290(rt2x00dev);
break; break;
case RT3352: case RT3352:
@ -123,7 +123,7 @@
rt2800_init_bbp_3352(rt2x00dev); rt2800_init_bbp_3352(rt2x00dev);
break; break;
case RT3390: case RT3390:
@@ -7069,6 +7098,76 @@ static void rt2800_init_rfcsr_3883(struc @@ -7068,6 +7097,76 @@ static void rt2800_init_rfcsr_3883(struc
rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
} }
@ -200,7 +200,7 @@
static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
{ {
rt2800_rf_init_calibration(rt2x00dev, 2); rt2800_rf_init_calibration(rt2x00dev, 2);
@@ -7309,6 +7408,9 @@ static void rt2800_init_rfcsr(struct rt2 @@ -7308,6 +7407,9 @@ static void rt2800_init_rfcsr(struct rt2
case RT3593: case RT3593:
rt2800_init_rfcsr_3593(rt2x00dev); rt2800_init_rfcsr_3593(rt2x00dev);
break; break;
@ -210,7 +210,7 @@
case RT5390: case RT5390:
rt2800_init_rfcsr_5390(rt2x00dev); rt2800_init_rfcsr_5390(rt2x00dev);
break; break;
@@ -7568,6 +7670,12 @@ static int rt2800_validate_eeprom(struct @@ -7567,6 +7669,12 @@ static int rt2800_validate_eeprom(struct
rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820); rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word); rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word); rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
@ -223,7 +223,7 @@
} else if (rt2x00_rt(rt2x00dev, RT2860) || } else if (rt2x00_rt(rt2x00dev, RT2860) ||
rt2x00_rt(rt2x00dev, RT2872)) { rt2x00_rt(rt2x00dev, RT2872)) {
/* /*
@@ -7706,6 +7814,8 @@ static int rt2800_init_eeprom(struct rt2 @@ -7705,6 +7813,8 @@ static int rt2800_init_eeprom(struct rt2
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
else if (rt2x00_rt(rt2x00dev, RT3883)) else if (rt2x00_rt(rt2x00dev, RT3883))
rf = RF3853; rf = RF3853;
@ -232,7 +232,7 @@
else else
rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE); rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
@@ -7725,6 +7835,7 @@ static int rt2800_init_eeprom(struct rt2 @@ -7724,6 +7834,7 @@ static int rt2800_init_eeprom(struct rt2
case RF3320: case RF3320:
case RF3322: case RF3322:
case RF3853: case RF3853:
@ -240,7 +240,7 @@
case RF5360: case RF5360:
case RF5370: case RF5370:
case RF5372: case RF5372:
@@ -8279,6 +8390,7 @@ static int rt2800_probe_hw_mode(struct r @@ -8278,6 +8389,7 @@ static int rt2800_probe_hw_mode(struct r
case RF3290: case RF3290:
case RF3320: case RF3320:
case RF3322: case RF3322:
@ -248,7 +248,7 @@
case RF5360: case RF5360:
case RF5370: case RF5370:
case RF5372: case RF5372:
@@ -8417,6 +8529,7 @@ static int rt2800_probe_hw_mode(struct r @@ -8416,6 +8528,7 @@ static int rt2800_probe_hw_mode(struct r
case RF3070: case RF3070:
case RF3290: case RF3290:
case RF3853: case RF3853:
@ -256,7 +256,7 @@
case RF5360: case RF5360:
case RF5370: case RF5370:
case RF5372: case RF5372:
@@ -8456,6 +8569,7 @@ static int rt2800_probe_rt(struct rt2x00 @@ -8455,6 +8568,7 @@ static int rt2800_probe_rt(struct rt2x00
case RT3572: case RT3572:
case RT3593: case RT3593:
case RT3883: case RT3883:

View file

@ -8,7 +8,7 @@
#include "rt2x00.h" #include "rt2x00.h"
#include "rt2800lib.h" #include "rt2800lib.h"
@@ -7924,6 +7925,17 @@ static int rt2800_init_eeprom(struct rt2 @@ -7923,6 +7924,17 @@ static int rt2800_init_eeprom(struct rt2
rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC); rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY); rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/rt2x00/rt2800lib.c --- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7813,6 +7813,8 @@ static int rt2800_init_eeprom(struct rt2 @@ -7812,6 +7812,8 @@ static int rt2800_init_eeprom(struct rt2
rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392)) rt2x00_rt(rt2x00dev, RT5392))
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/mwl8k.c --- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c
@@ -5714,6 +5714,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") @@ -5682,6 +5682,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API)); MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = { static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {

View file

@ -22,7 +22,7 @@
static int modparam_bad_frames_preempt; static int modparam_bad_frames_preempt;
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
MODULE_PARM_DESC(bad_frames_preempt, MODULE_PARM_DESC(bad_frames_preempt,
@@ -2747,10 +2752,10 @@ static int b43_gpio_init(struct b43_wlde @@ -2739,10 +2744,10 @@ static int b43_gpio_init(struct b43_wlde
u32 mask, set; u32 mask, set;
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0); b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);

View file

@ -11,7 +11,7 @@
b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o
--- a/drivers/net/wireless/b43/main.c --- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c
@@ -1915,10 +1915,12 @@ static void b43_do_interrupt_thread(stru @@ -1899,10 +1899,12 @@ static void b43_do_interrupt_thread(stru
dma_reason[0], dma_reason[1], dma_reason[0], dma_reason[1],
dma_reason[2], dma_reason[3], dma_reason[2], dma_reason[3],
dma_reason[4], dma_reason[5]); dma_reason[4], dma_reason[5]);
@ -75,12 +75,12 @@
#endif /* B43_PIO_H_ */ #endif /* B43_PIO_H_ */
--- a/drivers/net/wireless/b43/Kconfig --- a/drivers/net/wireless/b43/Kconfig
+++ b/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig
@@ -98,7 +98,7 @@ config B43_BCMA_PIO @@ -118,7 +118,7 @@ config B43_BCMA_PIO
default y default y
config B43_PIO config B43_PIO
- bool - bool
+ bool "Broadcom 43xx PIO support" + bool "Broadcom 43xx PIO support"
depends on B43 depends on B43 && B43_SSB
select SSB_BLOCKIO select SSB_BLOCKIO
default y default y

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/b43/main.c --- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c
@@ -1562,7 +1562,7 @@ static void b43_write_beacon_template(st @@ -1546,7 +1546,7 @@ static void b43_write_beacon_template(st
len, ram_offset, shm_size_offset, rate); len, ram_offset, shm_size_offset, rate);
/* Write the PHY TX control parameters. */ /* Write the PHY TX control parameters. */
@ -9,7 +9,7 @@
antenna = b43_antenna_to_phyctl(antenna); antenna = b43_antenna_to_phyctl(antenna);
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
/* We can't send beacons with short preamble. Would get PHY errors. */ /* We can't send beacons with short preamble. Would get PHY errors. */
@@ -3105,8 +3105,8 @@ static int b43_chip_init(struct b43_wlde @@ -3103,8 +3103,8 @@ static int b43_chip_init(struct b43_wlde
/* Select the antennae */ /* Select the antennae */
if (phy->ops->set_rx_antenna) if (phy->ops->set_rx_antenna)
@ -20,7 +20,7 @@
if (phy->type == B43_PHYTYPE_B) { if (phy->type == B43_PHYTYPE_B) {
value16 = b43_read16(dev, 0x005E); value16 = b43_read16(dev, 0x005E);
@@ -3850,7 +3850,6 @@ static int b43_op_config(struct ieee8021 @@ -3796,7 +3796,6 @@ static int b43_op_config(struct ieee8021
struct b43_wldev *dev; struct b43_wldev *dev;
struct b43_phy *phy; struct b43_phy *phy;
struct ieee80211_conf *conf = &hw->conf; struct ieee80211_conf *conf = &hw->conf;
@ -28,7 +28,7 @@
int err = 0; int err = 0;
bool reload_bss = false; bool reload_bss = false;
@@ -3904,11 +3903,9 @@ static int b43_op_config(struct ieee8021 @@ -3850,11 +3849,9 @@ static int b43_op_config(struct ieee8021
} }
/* Antennas for RX and management frame TX. */ /* Antennas for RX and management frame TX. */
@ -42,7 +42,7 @@
if (wl->radio_enabled != phy->radio_on) { if (wl->radio_enabled != phy->radio_on) {
if (wl->radio_enabled) { if (wl->radio_enabled) {
@@ -5041,6 +5038,47 @@ static int b43_op_get_survey(struct ieee @@ -4978,6 +4975,47 @@ static int b43_op_get_survey(struct ieee
return 0; return 0;
} }
@ -90,7 +90,7 @@
static const struct ieee80211_ops b43_hw_ops = { static const struct ieee80211_ops b43_hw_ops = {
.tx = b43_op_tx, .tx = b43_op_tx,
.conf_tx = b43_op_conf_tx, .conf_tx = b43_op_conf_tx,
@@ -5062,6 +5100,8 @@ static const struct ieee80211_ops b43_hw @@ -4999,6 +5037,8 @@ static const struct ieee80211_ops b43_hw
.sw_scan_complete = b43_op_sw_scan_complete_notifier, .sw_scan_complete = b43_op_sw_scan_complete_notifier,
.get_survey = b43_op_get_survey, .get_survey = b43_op_get_survey,
.rfkill_poll = b43_rfkill_poll, .rfkill_poll = b43_rfkill_poll,
@ -99,7 +99,7 @@
}; };
/* Hard-reset the chip. Do not call this directly. /* Hard-reset the chip. Do not call this directly.
@@ -5308,6 +5348,8 @@ static int b43_one_core_attach(struct b4 @@ -5239,6 +5279,8 @@ static int b43_one_core_attach(struct b4
if (!wldev) if (!wldev)
goto out; goto out;
@ -108,7 +108,7 @@
wldev->use_pio = b43_modparam_pio; wldev->use_pio = b43_modparam_pio;
wldev->dev = dev; wldev->dev = dev;
wldev->wl = wl; wldev->wl = wl;
@@ -5398,6 +5440,9 @@ static struct b43_wl *b43_wireless_init( @@ -5329,6 +5371,9 @@ static struct b43_wl *b43_wireless_init(
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;

View file

@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
--- a/drivers/net/wireless/b43/b43.h --- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h
@@ -1061,6 +1061,31 @@ static inline bool b43_using_pio_transfe @@ -1054,6 +1054,31 @@ static inline bool b43_using_pio_transfe
return dev->__using_pio_transfers; return dev->__using_pio_transfers;
} }
@ -53,9 +53,9 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
__printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...); __printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...);
--- a/drivers/net/wireless/b43/bus.h --- a/drivers/net/wireless/b43/bus.h
+++ b/drivers/net/wireless/b43/bus.h +++ b/drivers/net/wireless/b43/bus.h
@@ -60,6 +60,16 @@ static inline bool b43_bus_host_is_sdio( @@ -70,6 +70,16 @@ static inline bool b43_bus_host_is_sdio(
return (dev->bus_type == B43_BUS_SSB && return false;
dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO); #endif
} }
+static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev) +static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
+{ +{
@ -72,7 +72,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev); struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
--- a/drivers/net/wireless/b43/main.c --- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c
@@ -4437,7 +4437,7 @@ static int b43_phy_versioning(struct b43 @@ -4370,7 +4370,7 @@ static int b43_phy_versioning(struct b43
u16 radio24[3]; u16 radio24[3];
for (tmp = 0; tmp < 3; tmp++) { for (tmp = 0; tmp < 3; tmp++) {
@ -81,7 +81,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA); radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA);
} }
@@ -4456,10 +4456,10 @@ static int b43_phy_versioning(struct b43 @@ -4389,10 +4389,10 @@ static int b43_phy_versioning(struct b43
else else
tmp = 0x5205017F; tmp = 0x5205017F;
} else { } else {
@ -96,7 +96,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
<< 16; << 16;
--- a/drivers/net/wireless/b43/phy_common.c --- a/drivers/net/wireless/b43/phy_common.c
+++ b/drivers/net/wireless/b43/phy_common.c +++ b/drivers/net/wireless/b43/phy_common.c
@@ -266,6 +266,12 @@ void b43_phy_write(struct b43_wldev *dev @@ -267,6 +267,12 @@ void b43_phy_write(struct b43_wldev *dev
{ {
assert_mac_suspended(dev); assert_mac_suspended(dev);
dev->phy.ops->phy_write(dev, reg, value); dev->phy.ops->phy_write(dev, reg, value);
@ -197,7 +197,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
--- a/drivers/net/wireless/b43/phy_n.c --- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c +++ b/drivers/net/wireless/b43/phy_n.c
@@ -5418,14 +5418,14 @@ static inline void check_phyreg(struct b @@ -5641,14 +5641,14 @@ static inline void check_phyreg(struct b
static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg) static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg)
{ {
check_phyreg(dev, reg); check_phyreg(dev, reg);
@ -214,7 +214,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
b43_write16(dev, B43_MMIO_PHY_DATA, value); b43_write16(dev, B43_MMIO_PHY_DATA, value);
} }
@@ -5433,7 +5433,7 @@ static void b43_nphy_op_maskset(struct b @@ -5656,7 +5656,7 @@ static void b43_nphy_op_maskset(struct b
u16 set) u16 set)
{ {
check_phyreg(dev, reg); check_phyreg(dev, reg);
@ -223,8 +223,8 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set); b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
} }
@@ -5444,7 +5444,7 @@ static u16 b43_nphy_op_radio_read(struct @@ -5670,7 +5670,7 @@ static u16 b43_nphy_op_radio_read(struct
/* N-PHY needs 0x100 for read access */ else
reg |= 0x100; reg |= 0x100;
- b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg); - b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
@ -232,7 +232,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW); return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
} }
@@ -5453,7 +5453,7 @@ static void b43_nphy_op_radio_write(stru @@ -5679,7 +5679,7 @@ static void b43_nphy_op_radio_write(stru
/* Register 1 is a 32-bit register. */ /* Register 1 is a 32-bit register. */
B43_WARN_ON(reg == 1); B43_WARN_ON(reg == 1);

View file

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/b43/main.c --- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c
@@ -2764,6 +2764,14 @@ static int b43_gpio_init(struct b43_wlde @@ -2756,6 +2756,14 @@ static int b43_gpio_init(struct b43_wlde
} else if (dev->dev->chip_id == 0x5354) { } else if (dev->dev->chip_id == 0x5354) {
/* Don't allow overtaking buttons GPIOs */ /* Don't allow overtaking buttons GPIOs */
set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */ set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */

View file

@ -88,22 +88,22 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
static int wl1271_probe(struct sdio_func *func, static int wl1271_probe(struct sdio_func *func,
const struct sdio_device_id *id) const struct sdio_device_id *id)
{ {
@@ -248,12 +304,9 @@ static int wl1271_probe(struct sdio_func @@ -245,10 +301,10 @@ static int wl1271_probe(struct sdio_func
/* Use block mode for transferring over one block size of data */ /* Use block mode for transferring over one block size of data */
func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
- pdev_data->pdata = wl12xx_get_platform_data(); - pdev_data.pdata = wl12xx_get_platform_data();
- if (IS_ERR(pdev_data->pdata)) { - if (IS_ERR(pdev_data.pdata)) {
- ret = PTR_ERR(pdev_data->pdata); - ret = PTR_ERR(pdev_data.pdata);
- dev_err(glue->dev, "missing wlan platform data: %d\n", ret); - dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
+ pdev_data->pdata = get_platform_data(&func->dev); + pdev_data.pdata = get_platform_data(&func->dev);
+ if (!(pdev_data->pdata)) + if (!pdev_data.pdata) {
+ ret = -EINVAL;
+ dev_err(glue->dev, "missing wlan platform data\n");
goto out_free_glue; goto out_free_glue;
- } }
/* if sdio can keep power while host is suspended, enable wow */ @@ -279,7 +335,7 @@ static int wl1271_probe(struct sdio_func
mmcflags = sdio_get_host_pm_caps(func);
@@ -282,7 +335,7 @@ static int wl1271_probe(struct sdio_func
if (!glue->core) { if (!glue->core) {
dev_err(glue->dev, "can't allocate platform_device"); dev_err(glue->dev, "can't allocate platform_device");
ret = -ENOMEM; ret = -ENOMEM;
@ -112,7 +112,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
} }
glue->core->dev.parent = &func->dev; glue->core->dev.parent = &func->dev;
@@ -316,6 +369,9 @@ static int wl1271_probe(struct sdio_func @@ -313,6 +369,9 @@ static int wl1271_probe(struct sdio_func
out_dev_put: out_dev_put:
platform_device_put(glue->core); platform_device_put(glue->core);
@ -122,7 +122,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
out_free_glue: out_free_glue:
kfree(glue); kfree(glue);
@@ -329,11 +385,14 @@ out: @@ -323,11 +382,14 @@ out:
static void wl1271_remove(struct sdio_func *func) static void wl1271_remove(struct sdio_func *func)
{ {
struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func); struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);

View file

@ -1,47 +0,0 @@
From fde3f0a7f3112527a18e06e32efdd9a354c91b02 Mon Sep 17 00:00:00 2001
From: Eliad Peller <eliad@wizery.com>
Date: Tue, 18 Mar 2014 13:19:48 +0200
Subject: [PATCH] wl18xx: align event mailbox with current fw
Some fields are missing from the event mailbox
struct definitions, which cause issues when
trying to handle some events.
Add the missing fields in order to align the
struct size (without adding actual support
for the new fields).
Signed-off-by: Eliad Peller <eliad@wizery.com>
---
drivers/net/wireless/ti/wl18xx/event.h | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
--- a/drivers/net/wireless/ti/wl18xx/event.h
+++ b/drivers/net/wireless/ti/wl18xx/event.h
@@ -68,6 +68,26 @@ struct wl18xx_event_mailbox {
/* bitmap of inactive stations (by HLID) */
__le32 inactive_sta_bitmap;
+
+ /* rx BA win size indicated by RX_BA_WIN_SIZE_CHANGE_EVENT_ID */
+ u8 rx_ba_role_id;
+ u8 rx_ba_link_id;
+ u8 rx_ba_win_size;
+ u8 padding;
+
+ /* smart config */
+ u8 sc_ssid_len;
+ u8 sc_pwd_len;
+ u8 sc_token_len;
+ u8 padding1;
+ u8 sc_ssid[32];
+ u8 sc_pwd[32];
+ u8 sc_token[32];
+
+ /* smart config sync channel */
+ u8 sc_sync_channel;
+ u8 sc_sync_band;
+ u8 padding2[2];
} __packed;
int wl18xx_wait_for_event(struct wl1271 *wl, enum wlcore_wait_event event,

View file

@ -13,7 +13,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
--- a/drivers/net/wireless/ti/wlcore/main.c --- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c +++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -5181,6 +5181,10 @@ static void wl12xx_op_channel_switch(str @@ -5148,6 +5148,10 @@ static void wl12xx_op_channel_switch(str
if (unlikely(wl->state == WLCORE_STATE_OFF)) { if (unlikely(wl->state == WLCORE_STATE_OFF)) {
wl12xx_for_each_wlvif_sta(wl, wlvif) { wl12xx_for_each_wlvif_sta(wl, wlvif) {
struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(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); ieee80211_chswitch_done(vif, false);
} }
goto out; goto out;
@@ -5196,6 +5200,9 @@ static void wl12xx_op_channel_switch(str @@ -5163,6 +5167,9 @@ static void wl12xx_op_channel_switch(str
wl12xx_for_each_wlvif_sta(wl, wlvif) { wl12xx_for_each_wlvif_sta(wl, wlvif) {
unsigned long delay_usec; unsigned long delay_usec;

View file

@ -40,6 +40,8 @@ struct ath9k_platform_data {
int (*get_mac_revision)(void); int (*get_mac_revision)(void);
int (*external_reset)(void); int (*external_reset)(void);
bool use_eeprom;
int num_leds; int num_leds;
const struct gpio_led *leds; const struct gpio_led *leds;
}; };