mac80211: update to wireless-testing 2014-05-19
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 40800
This commit is contained in:
parent
8f526ff530
commit
8513629e3e
77 changed files with 4782 additions and 1527 deletions
|
@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2014-03-31
|
||||
PKG_VERSION:=2014-05-19
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_BACKPORT_VERSION:=
|
||||
PKG_MD5SUM:=8b5cf82d6defc5867511014af4afc0b6
|
||||
PKG_MD5SUM:=ff5426bf85668c3c36c7f602adeb1e5b
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||
|
@ -357,7 +357,7 @@ define KernelPackage/rtl8180
|
|||
$(call KernelPackage/rtl818x/Default)
|
||||
DEPENDS+= @PCI_SUPPORT
|
||||
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)
|
||||
endef
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@
|
|||
.PHONY: defconfig-help
|
||||
--- a/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
|
||||
@$(MAKE) oldconfig
|
||||
|
@ -140,7 +140,7 @@
|
|||
@grep -f .local-symbols .config | ( \
|
||||
echo "#ifndef 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 ;\
|
||||
done ;\
|
||||
echo "#endif /* COMPAT_AUTOCONF_INCLUDED */" ;\
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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"
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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;
|
||||
}
|
||||
|
||||
|
@ -9,23 +9,3 @@
|
|||
static u16
|
||||
mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
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,
|
||||
|
|
|
@ -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
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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.
|
||||
|
||||
config LIB80211
|
||||
|
@ -9,7 +9,7 @@
|
|||
depends on m
|
||||
default n
|
||||
help
|
||||
@@ -133,15 +133,15 @@ config LIB80211
|
||||
@@ -170,15 +170,15 @@ config LIB80211
|
||||
Drivers should select this themselves if needed.
|
||||
|
||||
config LIB80211_CRYPT_WEP
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -402,42 +402,6 @@ USB_CDC_PHONET=
|
||||
@@ -403,42 +403,6 @@ USB_CDC_PHONET=
|
||||
USB_IPHETH=
|
||||
USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
|
@ -68,7 +68,7 @@
|
|||
obj-$(CPTCFG_NFC) += net/nfc/
|
||||
--- a/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;
|
||||
|
||||
|
@ -77,12 +77,12 @@
|
|||
return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
|
||||
#else
|
||||
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)
|
||||
hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
|
||||
-#ifdef CPTCFG_SSB_DRIVER_PCICORE
|
||||
+#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
-#if defined(CPTCFG_B43_SSB) && defined(CPTCFG_SSB_DRIVER_PCICORE)
|
||||
+#if defined(CPTCFG_B43_SSB) && defined(CONFIG_SSB_DRIVER_PCICORE)
|
||||
if (dev->dev->bus_type == B43_BUS_SSB &&
|
||||
dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
|
||||
dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
--- a/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/device.h>
|
||||
#include <linux/of.h>
|
||||
+#include <linux/string.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
/**
|
||||
* devm_kstrdup - Allocate resource managed space and
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0))
|
||||
|
|
|
@ -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
|
||||
+++ b/net/mac80211/wpa.c
|
||||
@@ -301,15 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
|
||||
|
@ -64,7 +310,7 @@
|
|||
|
||||
if (info->control.hw_key &&
|
||||
!(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
|
||||
@@ -455,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8
|
||||
@@ -458,9 +463,9 @@ static int ccmp_encrypt_skb(struct ieee8
|
||||
return 0;
|
||||
|
||||
pos += IEEE80211_CCMP_HDR_LEN;
|
||||
|
@ -77,7 +323,7 @@
|
|||
|
||||
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)) {
|
||||
|
@ -99,249 +345,3 @@
|
|||
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 {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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);
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
static int ieee80211_ifa_changed(struct notifier_block *nb,
|
||||
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
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
|||
static int ieee80211_ifa6_changed(struct notifier_block *nb,
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
|
||||
result = register_inet6addr_notifier(&local->ifa6_notifier);
|
||||
if (result)
|
||||
@@ -1052,13 +1052,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
@@ -1050,13 +1050,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -52,7 +52,7 @@
|
|||
fail_ifa:
|
||||
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
@@ -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,
|
||||
&local->network_latency_notifier);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -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
|
||||
* lost)
|
||||
*/
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <asm/unaligned.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 + 1] = eeval & 0xff;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
---help---
|
||||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -120,6 +120,7 @@ RTL8187_LEDS=
|
||||
@@ -116,6 +116,7 @@ RTL8187_LEDS=
|
||||
ATH_COMMON=
|
||||
ATH_CARDS=
|
||||
ATH_DEBUG=
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -2194,6 +2196,7 @@ static void restore_regulatory_settings(
|
||||
@@ -2275,6 +2277,7 @@ static void restore_regulatory_settings(
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
--- a/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
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
@@ -655,6 +655,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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);
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *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_spectral_init_debug(sc);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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
|
||||
};
|
||||
|
||||
|
@ -53,7 +53,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *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,
|
||||
&fops_eeprom);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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 */
|
||||
switch (ah->hw_version.devid) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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 offchannel_tx_hw_queue;
|
||||
u8 radiotap_mcs_details;
|
||||
|
@ -10,7 +10,7 @@
|
|||
u8 uapsd_queues;
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -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_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
|||
*dbm = sdata->vif.bss_conf.txpower;
|
||||
--- a/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) {
|
||||
changed |= IEEE80211_CONF_CHANGE_POWER;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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))
|
||||
ath9k_mci_set_txpower(sc, true, false);
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
|||
|
||||
out:
|
||||
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;
|
||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||
sc->config.txpowlimit, &sc->curtxpow);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -2167,6 +2167,7 @@ struct cfg80211_qos_map {
|
||||
@@ -2188,6 +2188,7 @@ struct cfg80211_qos_map {
|
||||
* (as advertised by the nl80211 feature flag.)
|
||||
* @get_tx_power: store the current TX power into the dbm variable;
|
||||
* return 0 if successful
|
||||
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
* @set_wds_peer: set the WDS peer for a WDS interface
|
||||
*
|
||||
@@ -2396,6 +2397,7 @@ struct cfg80211_ops {
|
||||
@@ -2422,6 +2423,7 @@ struct cfg80211_ops {
|
||||
enum nl80211_tx_power_setting type, int mbm);
|
||||
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int *dbm);
|
||||
|
@ -36,9 +36,9 @@
|
|||
u8 ps_dtim_period;
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -1579,6 +1579,9 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_TDLS_PEER_CAPABILITY: flags for TDLS peer capabilities, u32.
|
||||
* As specified in the &enum nl80211_tdls_peer_capability.
|
||||
@@ -1591,6 +1591,9 @@ enum nl80211_commands {
|
||||
* creation then the new interface will be owned by the netlink socket
|
||||
* that created it and will be destroyed when the socket is closed
|
||||
*
|
||||
+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
|
||||
+ * transmit power to stay within regulatory limits. u32, dBi.
|
||||
|
@ -46,9 +46,9 @@
|
|||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1914,6 +1917,8 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_TDLS_PEER_CAPABILITY,
|
||||
@@ -1931,6 +1934,8 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_CSA_C_OFFSETS_TX,
|
||||
NL80211_ATTR_MAX_CSA_COUNTERS,
|
||||
|
||||
+ NL80211_ATTR_WIPHY_ANTENNA_GAIN,
|
||||
+
|
||||
|
@ -57,7 +57,7 @@
|
|||
__NL80211_ATTR_AFTER_LAST,
|
||||
--- a/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;
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@
|
|||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||
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_tx_power = ieee80211_set_tx_power,
|
||||
.get_tx_power = ieee80211_get_tx_power,
|
||||
|
@ -87,7 +87,7 @@
|
|||
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -1225,6 +1225,7 @@ struct ieee80211_local {
|
||||
@@ -1233,6 +1233,7 @@ struct ieee80211_local {
|
||||
int dynamic_ps_forced_timeout;
|
||||
|
||||
int user_power_level; /* in dBm, for all interfaces */
|
||||
|
@ -97,7 +97,7 @@
|
|||
|
||||
--- a/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 cfg80211_chan_def chandef = {};
|
||||
u32 changed = 0;
|
||||
|
@ -106,7 +106,7 @@
|
|||
u32 offchannel_flag;
|
||||
|
||||
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();
|
||||
|
||||
|
@ -119,7 +119,7 @@
|
|||
if (local->hw.conf.power_level != power) {
|
||||
changed |= IEEE80211_CONF_CHANGE_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;
|
||||
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
|
||||
|
@ -129,15 +129,15 @@
|
|||
local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -385,6 +385,7 @@ static const struct nla_policy nl80211_p
|
||||
[NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
|
||||
[NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
|
||||
@@ -387,6 +387,7 @@ static const struct nla_policy nl80211_p
|
||||
[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 },
|
||||
};
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
--- a/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;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
|
@ -21,7 +21,7 @@
|
|||
if (ant_gain > max_gain)
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -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) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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_deinit_leds(struct ath_softc *sc);
|
||||
void ath_fill_led_pin(struct ath_softc *sc);
|
||||
|
@ -10,7 +10,7 @@
|
|||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -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_WAIT_FOR_ANI BIT(5)
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
|||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -731,9 +741,8 @@ struct ath_softc {
|
||||
@@ -743,9 +753,8 @@ struct ath_softc {
|
||||
struct ath_beacon beacon;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
|
@ -162,7 +162,7 @@
|
|||
void ath_fill_led_pin(struct ath_softc *sc)
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -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
|
||||
/* must be initialized before ieee80211_register_hw */
|
||||
|
@ -173,7 +173,7 @@
|
|||
#endif
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1577,6 +1577,61 @@ static const struct file_operations fops
|
||||
@@ -1381,6 +1381,61 @@ static const struct file_operations fops
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
|
@ -235,7 +235,7 @@
|
|||
|
||||
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);
|
||||
debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
sc, &fops_chanbw);
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -37,6 +37,9 @@ struct ath9k_platform_data {
|
||||
|
||||
int (*get_mac_revision)(void);
|
||||
@@ -39,6 +39,9 @@ struct ath9k_platform_data {
|
||||
int (*external_reset)(void);
|
||||
|
||||
bool use_eeprom;
|
||||
+
|
||||
+ int num_leds;
|
||||
+ const struct gpio_led *leds;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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
|
||||
|
||||
|
||||
|
@ -51,7 +51,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *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,
|
||||
sc->debug.debugfs_phy, sc, &fops_gpio_led);
|
||||
#endif
|
||||
|
@ -94,7 +94,7 @@
|
|||
struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1734,6 +1734,20 @@ fail:
|
||||
@@ -1735,6 +1735,20 @@ fail:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@
|
|||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -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);
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
|
@ -125,7 +125,7 @@
|
|||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -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);
|
||||
status &= ah->imask; /* discard unasked-for bits */
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
int (*external_reset)(void);
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -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);
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -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)
|
||||
ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
|
||||
|
||||
|
@ -65,7 +65,7 @@
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
|||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
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));
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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);
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
|||
/******************/
|
||||
/* 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))
|
||||
udelay(50);
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
|||
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);
|
||||
ath9k_hw_init_pll(ah, chan);
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
|||
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))
|
||||
ar9002_hw_load_ani_reg(ah, chan);
|
||||
|
||||
|
@ -55,7 +55,7 @@
|
|||
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)
|
||||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
|
|
@ -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[] = {
|
|
@ -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)) {
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
|
@ -24,7 +24,7 @@ Changes since v1:
|
|||
|
||||
--- a/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)
|
||||
{
|
||||
|
@ -32,7 +32,7 @@ Changes since v1:
|
|||
int retval;
|
||||
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)
|
||||
return retval;
|
||||
|
||||
|
|
|
@ -79,8 +79,8 @@ Changes since v1: ---
|
|||
+ rt2800_shared_mem_unlock(rt2x00dev);
|
||||
|
||||
/*
|
||||
* Enable beaconing again.
|
||||
@@ -1027,6 +1039,8 @@ static inline void rt2800_clear_beacon_r
|
||||
* Restore beaconing state.
|
||||
@@ -1026,6 +1038,8 @@ static inline void rt2800_clear_beacon_r
|
||||
|
||||
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
|
||||
* 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))
|
||||
rt2800_register_write(rt2x00dev, beacon_base + i, 0);
|
||||
|
@ -98,7 +98,7 @@ Changes since v1: ---
|
|||
}
|
||||
|
||||
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;
|
||||
offset = MAC_WCID_ATTR_ENTRY(wcid);
|
||||
|
@ -108,7 +108,7 @@ Changes since v1: ---
|
|||
}
|
||||
|
||||
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,
|
||||
* 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,
|
||||
@@ -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);
|
||||
|
||||
|
@ -130,7 +130,7 @@ Changes since v1: ---
|
|||
if (crypto->cmd == SET_KEY) {
|
||||
rt2800_register_read(rt2x00dev, offset, ®);
|
||||
rt2x00_set_field32(®, 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(®, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0);
|
||||
rt2800_register_write(rt2x00dev, offset, reg);
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ Changes since v1: ---
|
|||
|
||||
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))
|
||||
iveiv_entry.iv[3] |= 0x20;
|
||||
iveiv_entry.iv[3] |= key->keyidx << 6;
|
||||
|
@ -150,7 +150,7 @@ Changes since v1: ---
|
|||
}
|
||||
|
||||
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));
|
||||
|
||||
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);
|
||||
|
||||
|
@ -175,7 +175,7 @@ Changes since v1: ---
|
|||
|
||||
/*
|
||||
* 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));
|
||||
|
||||
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.
|
||||
*/
|
||||
|
@ -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,
|
||||
* but we need to reactivate it now.
|
||||
*/
|
||||
|
@ -218,7 +218,7 @@ Changes since v1: ---
|
|||
msleep(1);
|
||||
|
||||
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.
|
||||
*/
|
||||
|
@ -239,7 +239,7 @@ Changes since v1: ---
|
|||
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;
|
||||
u32 reg;
|
||||
|
||||
|
@ -248,7 +248,7 @@ Changes since v1: ---
|
|||
retval = rt2800_probe_rt(rt2x00dev);
|
||||
if (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;
|
||||
|
||||
offset = MAC_IVEIV_ENTRY(hw_key_idx);
|
||||
|
@ -372,7 +372,7 @@ Changes since v1: ---
|
|||
#endif /* RT2800MMIO_H */
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -69,7 +69,9 @@ static void rt2800pci_mcu_status(struct
|
||||
@@ -69,7 +69,9 @@ static void rt2800pci_mcu_status(struct
|
||||
return;
|
||||
|
||||
for (i = 0; i < 200; i++) {
|
||||
|
@ -382,7 +382,7 @@ Changes since v1: ---
|
|||
|
||||
if ((rt2x00_get_field32(reg, H2M_MAILBOX_CID_CMD0) == token) ||
|
||||
(rt2x00_get_field32(reg, H2M_MAILBOX_CID_CMD1) == token) ||
|
||||
@@ -83,8 +85,10 @@ static void rt2800pci_mcu_status(struct
|
||||
@@ -83,8 +85,10 @@ static void rt2800pci_mcu_status(struct
|
||||
if (i == 200)
|
||||
rt2x00_err(rt2x00dev, "MCU request failed, no response from hardware\n");
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ Changes since v1: ---
|
|||
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);
|
||||
|
||||
|
@ -120,7 +120,7 @@ Changes since v1: ---
|
|||
/*
|
||||
* For the Beacon base registers we only need to clear
|
||||
* 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))
|
||||
rt2800_register_write(rt2x00dev, beacon_base + i, 0);
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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)
|
||||
{
|
||||
|
@ -32,7 +32,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
u32 reg;
|
||||
u16 eeprom;
|
||||
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
|
||||
*/
|
||||
|
@ -41,7 +41,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
rt2800_clear_beacon_register(rt2x00dev, i);
|
||||
|
||||
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))
|
||||
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
*/
|
||||
--- a/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_register_write(rt2x00dev, BCN_OFFSET1, reg);
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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))
|
||||
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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 RT3572:
|
||||
case RT3593:
|
||||
|
|
|
@ -31,7 +31,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
#define RF5372 0x5372
|
||||
--- a/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},
|
||||
};
|
||||
|
||||
|
@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
static const struct rf_channel rf_vals_5592_xtal20[] = {
|
||||
/* Channel, N, K, mod, R */
|
||||
{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;
|
||||
break;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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 RF3070:
|
||||
case RF3290:
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
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 RF3070:
|
||||
case RF3290:
|
||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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_5G 0x2b
|
||||
|
||||
@@ -3217,6 +3422,9 @@ static void rt2800_config_channel(struct
|
||||
@@ -3216,6 +3421,9 @@ static void rt2800_config_channel(struct
|
||||
case RF3322:
|
||||
rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
|
||||
break;
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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 RF3320:
|
||||
case RF3322:
|
||||
|
|
|
@ -35,7 +35,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
#define RX_FILTER_CFG 0x1400
|
||||
--- a/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,
|
||||
0x00000000);
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
} else if (rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392) ||
|
||||
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, ®);
|
||||
rt2x00_set_field32(®, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
|
||||
|
@ -63,7 +63,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
rt2x00_set_field32(®, MAX_LEN_CFG_MAX_PSDU, 2);
|
||||
else
|
||||
rt2x00_set_field32(®, 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;
|
||||
rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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);
|
||||
}
|
||||
|
||||
|
@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
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:
|
||||
rt2800_init_bbp_3593(rt2x00dev);
|
||||
return;
|
||||
|
|
|
@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
/*
|
||||
--- a/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 */
|
||||
}
|
||||
|
||||
|
@ -166,7 +166,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
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:
|
||||
rt2800_init_rfcsr_3390(rt2x00dev);
|
||||
break;
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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, RT5392))
|
||||
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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);
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
|
||||
struct ieee80211_conf *conf,
|
||||
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,
|
||||
info->default_power3);
|
||||
|
||||
|
@ -60,7 +60,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
switch (rt2x00dev->chip.rf) {
|
||||
case RF2020:
|
||||
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, 64, 0x37 - rt2x00dev->lna_gain);
|
||||
rt2800_bbp_write(rt2x00dev, 77, 0x98);
|
||||
|
@ -76,7 +76,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
} else {
|
||||
rt2800_bbp_write(rt2x00dev, 62, 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)) {
|
||||
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
rt2800_bbp_write(rt2x00dev, 82, 0x62);
|
||||
|
@ -84,7 +84,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
rt2800_bbp_write(rt2x00dev, 75, 0x46);
|
||||
} else {
|
||||
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, 75, 0x50);
|
||||
}
|
||||
|
@ -110,13 +110,10 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
rt2800_bbp_write(rt2x00dev, 83, 0x9a);
|
||||
|
||||
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 (!conf_is_ht40(conf))
|
||||
+ 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);
|
||||
+
|
||||
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);
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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,
|
||||
char txpower)
|
||||
{
|
||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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,
|
||||
int power_level)
|
||||
{
|
||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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;
|
||||
|
||||
|
@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
return 0;
|
||||
|
||||
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;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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))
|
||||
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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, 1, r1);
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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);
|
||||
lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
|
||||
} 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);
|
||||
lna_gain = rt2x00_get_field16(eeprom,
|
||||
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);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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
|
||||
vgc = 0x2e + rt2x00dev->lna_gain;
|
||||
} else { /* 5GHZ band */
|
||||
|
@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
|
||||
else if (rt2x00_rt(rt2x00dev, RT5592))
|
||||
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 (rt2x00_rt(rt2x00dev, RT3572) ||
|
||||
|
@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
|
||||
vgc_level);
|
||||
} 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;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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);
|
||||
if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
|
||||
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 ||
|
||||
rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
|
||||
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);
|
||||
if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
|
||||
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 ||
|
||||
rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
|
||||
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);
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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))
|
||||
return min_t(u8, txpower, 0xc);
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|||
|
||||
--- a/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)
|
||||
return retval;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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
|
||||
*/
|
||||
|
@ -19,7 +19,7 @@
|
|||
} else if (rt2x00_rt(rt2x00dev, RT3593)) {
|
||||
if (rf->channel > 14) {
|
||||
/* 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)
|
||||
{
|
||||
|
@ -32,7 +32,7 @@
|
|||
rt2800_rf_init_calibration(rt2x00dev, 30);
|
||||
|
||||
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, 32, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
|
||||
|
@ -66,7 +66,7 @@
|
|||
rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 44, 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, 48, 0x14);
|
||||
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
|
||||
|
@ -96,7 +96,7 @@
|
|||
rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 60, 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
|
||||
*/
|
||||
if (rt2x00_rt(rt2x00dev, RT3290) ||
|
||||
|
@ -104,7 +104,7 @@
|
|||
rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392))
|
||||
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.
|
||||
*/
|
||||
|
@ -114,7 +114,7 @@
|
|||
__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)
|
||||
__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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},
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
|||
static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
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 RF5392:
|
||||
spec->num_channels = 14;
|
||||
|
@ -40,7 +40,7 @@
|
|||
break;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -60,7 +60,7 @@
|
|||
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
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);
|
||||
|
||||
/*
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#include "rt2x00.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)
|
||||
{
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#define RF5372 0x5372
|
||||
--- a/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,
|
||||
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);
|
||||
break;
|
||||
case RF3070:
|
||||
|
@ -32,7 +32,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
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) ||
|
||||
rt2x00_rf(rt2x00dev, RF3290) ||
|
||||
rt2x00_rf(rt2x00dev, RF3322) ||
|
||||
|
@ -40,7 +40,7 @@
|
|||
rt2x00_rf(rt2x00dev, RF5360) ||
|
||||
rt2x00_rf(rt2x00dev, RF5370) ||
|
||||
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
|
||||
*/
|
||||
|
@ -50,7 +50,7 @@
|
|||
rt2800_bbp_read(rt2x00dev, 49, &bbp);
|
||||
rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
|
||||
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 RF3290:
|
||||
case RF3853:
|
||||
|
@ -58,7 +58,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
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_CFG1, 0x00080606);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
|
||||
|
@ -67,7 +67,7 @@
|
|||
} else {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
|
||||
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);
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
|||
|
||||
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);
|
||||
|
||||
|
@ -101,7 +101,7 @@
|
|||
|
||||
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, 148, 0xc8);
|
||||
|
@ -115,7 +115,7 @@
|
|||
}
|
||||
|
||||
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);
|
||||
break;
|
||||
case RT3352:
|
||||
|
@ -123,7 +123,7 @@
|
|||
rt2800_init_bbp_3352(rt2x00dev);
|
||||
break;
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -200,7 +200,7 @@
|
|||
static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
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:
|
||||
rt2800_init_rfcsr_3593(rt2x00dev);
|
||||
break;
|
||||
|
@ -210,7 +210,7 @@
|
|||
case RT5390:
|
||||
rt2800_init_rfcsr_5390(rt2x00dev);
|
||||
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);
|
||||
rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
|
@ -223,7 +223,7 @@
|
|||
} else if (rt2x00_rt(rt2x00dev, RT2860) ||
|
||||
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);
|
||||
else if (rt2x00_rt(rt2x00dev, RT3883))
|
||||
rf = RF3853;
|
||||
|
@ -232,7 +232,7 @@
|
|||
else
|
||||
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 RF3322:
|
||||
case RF3853:
|
||||
|
@ -240,7 +240,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
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 RF3320:
|
||||
case RF3322:
|
||||
|
@ -248,7 +248,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
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 RF3290:
|
||||
case RF3853:
|
||||
|
@ -256,7 +256,7 @@
|
|||
case RF5360:
|
||||
case RF5370:
|
||||
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 RT3593:
|
||||
case RT3883:
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#include "rt2x00.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_qual, LED_TYPE_QUALITY);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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, RT5392))
|
||||
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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));
|
||||
|
||||
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -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;
|
||||
|
||||
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o
|
||||
--- a/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[2], dma_reason[3],
|
||||
dma_reason[4], dma_reason[5]);
|
||||
|
@ -75,12 +75,12 @@
|
|||
#endif /* B43_PIO_H_ */
|
||||
--- a/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
|
||||
|
||||
config B43_PIO
|
||||
- bool
|
||||
+ bool "Broadcom 43xx PIO support"
|
||||
depends on B43
|
||||
depends on B43 && B43_SSB
|
||||
select SSB_BLOCKIO
|
||||
default y
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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);
|
||||
|
||||
/* Write the PHY TX control parameters. */
|
||||
|
@ -9,7 +9,7 @@
|
|||
antenna = b43_antenna_to_phyctl(antenna);
|
||||
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
|
||||
/* 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 */
|
||||
if (phy->ops->set_rx_antenna)
|
||||
|
@ -20,7 +20,7 @@
|
|||
|
||||
if (phy->type == B43_PHYTYPE_B) {
|
||||
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_phy *phy;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
|
@ -28,7 +28,7 @@
|
|||
int err = 0;
|
||||
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. */
|
||||
|
@ -42,7 +42,7 @@
|
|||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,7 @@
|
|||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_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,
|
||||
.get_survey = b43_op_get_survey,
|
||||
.rfkill_poll = b43_rfkill_poll,
|
||||
|
@ -99,7 +99,7 @@
|
|||
};
|
||||
|
||||
/* 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)
|
||||
goto out;
|
||||
|
||||
|
@ -108,7 +108,7 @@
|
|||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
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;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|||
|
||||
--- a/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;
|
||||
}
|
||||
|
||||
|
@ -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, ...);
|
||||
--- a/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(
|
||||
return (dev->bus_type == B43_BUS_SSB &&
|
||||
dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO);
|
||||
@@ -70,6 +70,16 @@ static inline bool b43_bus_host_is_sdio(
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
+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);
|
||||
--- a/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];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -4456,10 +4456,10 @@ static int b43_phy_versioning(struct b43
|
||||
@@ -4389,10 +4389,10 @@ static int b43_phy_versioning(struct b43
|
||||
else
|
||||
tmp = 0x5205017F;
|
||||
} else {
|
||||
|
@ -96,7 +96,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|||
<< 16;
|
||||
--- a/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);
|
||||
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
|
||||
+++ 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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
check_phyreg(dev, reg);
|
||||
|
@ -223,16 +223,16 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|||
b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
|
||||
}
|
||||
|
||||
@@ -5444,7 +5444,7 @@ static u16 b43_nphy_op_radio_read(struct
|
||||
/* N-PHY needs 0x100 for read access */
|
||||
reg |= 0x100;
|
||||
@@ -5670,7 +5670,7 @@ static u16 b43_nphy_op_radio_read(struct
|
||||
else
|
||||
reg |= 0x100;
|
||||
|
||||
- b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
|
||||
+ b43_wflush16(dev, B43_MMIO_RADIO_CONTROL, reg);
|
||||
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. */
|
||||
B43_WARN_ON(reg == 1);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/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) {
|
||||
/* Don't allow overtaking buttons GPIOs */
|
||||
set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
|
||||
|
|
|
@ -88,22 +88,22 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
static int wl1271_probe(struct sdio_func *func,
|
||||
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 */
|
||||
func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
|
||||
|
||||
- pdev_data->pdata = wl12xx_get_platform_data();
|
||||
- if (IS_ERR(pdev_data->pdata)) {
|
||||
- ret = PTR_ERR(pdev_data->pdata);
|
||||
- pdev_data.pdata = wl12xx_get_platform_data();
|
||||
- if (IS_ERR(pdev_data.pdata)) {
|
||||
- ret = PTR_ERR(pdev_data.pdata);
|
||||
- dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
|
||||
+ pdev_data->pdata = get_platform_data(&func->dev);
|
||||
+ if (!(pdev_data->pdata))
|
||||
+ pdev_data.pdata = get_platform_data(&func->dev);
|
||||
+ if (!pdev_data.pdata) {
|
||||
+ ret = -EINVAL;
|
||||
+ dev_err(glue->dev, "missing wlan platform data\n");
|
||||
goto out_free_glue;
|
||||
- }
|
||||
}
|
||||
|
||||
/* if sdio can keep power while host is suspended, enable wow */
|
||||
mmcflags = sdio_get_host_pm_caps(func);
|
||||
@@ -282,7 +335,7 @@ static int wl1271_probe(struct sdio_func
|
||||
@@ -279,7 +335,7 @@ static int wl1271_probe(struct sdio_func
|
||||
if (!glue->core) {
|
||||
dev_err(glue->dev, "can't allocate platform_device");
|
||||
ret = -ENOMEM;
|
||||
|
@ -112,7 +112,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
}
|
||||
|
||||
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:
|
||||
platform_device_put(glue->core);
|
||||
|
||||
|
@ -122,7 +122,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
out_free_glue:
|
||||
kfree(glue);
|
||||
|
||||
@@ -329,11 +385,14 @@ out:
|
||||
@@ -323,11 +382,14 @@ out:
|
||||
static void wl1271_remove(struct sdio_func *func)
|
||||
{
|
||||
struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
|
||||
|
|
|
@ -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,
|
|
@ -13,7 +13,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
|
||||
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||||
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||||
@@ -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)) {
|
||||
wl12xx_for_each_wlvif_sta(wl, wlvif) {
|
||||
struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
|
||||
|
@ -24,7 +24,7 @@ Signed-off-by: Arik Nemtsov <arik@wizery.com>
|
|||
ieee80211_chswitch_done(vif, false);
|
||||
}
|
||||
goto out;
|
||||
@@ -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) {
|
||||
unsigned long delay_usec;
|
||||
|
|
@ -40,6 +40,8 @@ struct ath9k_platform_data {
|
|||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
|
||||
bool use_eeprom;
|
||||
|
||||
int num_leds;
|
||||
const struct gpio_led *leds;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue