mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-27 17:55:55 +02:00
[mac80211] Update to compat-wireless-2009-05-01
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15536 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
21dcc33bff
commit
80be62eefc
@ -17,12 +17,12 @@ ifneq ($(CONFIG_LINUX_2_6_21)$(CONFIG_LINUX_2_6_23)$(CONFIG_LINUX_2_6_24)$(CONFI
|
||||
PKG_MD5SUM:=9563ceeed86bca0859ad5f010623277c
|
||||
PATCH_DIR:=./patches-old
|
||||
else
|
||||
PKG_VERSION:=2009-03-31
|
||||
PKG_RELEASE:=2
|
||||
PKG_VERSION:=2009-05-01
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:= \
|
||||
http://www.orbit-lab.org/kernel/compat-wireless-2.6/2009/03 \
|
||||
http://www.orbit-lab.org/kernel/compat-wireless-2.6/2009/05 \
|
||||
http://wireless.kernel.org/download/compat-wireless-2.6
|
||||
PKG_MD5SUM:=b5b2159081c36dd6c318a28eddf7e646
|
||||
PKG_MD5SUM:=abc949ec3f7cc57302cca814d9b9c6cd
|
||||
endif
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
||||
@ -234,12 +234,25 @@ define KernelPackage/zd1211rw
|
||||
AUTOLOAD:=$(call AutoLoad,60,zd1211rw)
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/ath
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros common driver part
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-mac80211
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoLoad,26,ath)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath/description
|
||||
This module contains some common parts needed by Atheros Wireless drivers.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath5k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 5xxx wireless cards support
|
||||
URL:=http://linuxwireless.org/en/users/Drivers/ath5k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-mac80211
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath5k/ath5k.$(LINUX_KMOD_SUFFIX)
|
||||
DEPENDS+= +kmod-ath
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoLoad,27,ath5k)
|
||||
endef
|
||||
|
||||
@ -252,8 +265,8 @@ define KernelPackage/ath9k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n wireless cards support
|
||||
URL:=http://linuxwireless.org/en/users/Drivers/ath9k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-mac80211 @!LINUX_2_6_21||!LINUX_2_6_23||!LINUX_2_6_24||!LINUX_2_6_25||!LINUX_2_6_26
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath9k/ath9k.$(LINUX_KMOD_SUFFIX)
|
||||
DEPENDS+= +kmod-ath @!LINUX_2_6_21||!LINUX_2_6_23||!LINUX_2_6_24||!LINUX_2_6_25||!LINUX_2_6_26
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoLoad,27,ath9k)
|
||||
endef
|
||||
|
||||
@ -386,7 +399,7 @@ BUILDFLAGS:= \
|
||||
$(if $(CONFIG_PCI),-DCONFIG_SSB_SPROM) \
|
||||
$(if $(CONFIG_LEDS_TRIGGERS), -DCONFIG_MAC80211_LEDS -DCONFIG_LEDS_TRIGGERS -DCONFIG_B43_LEDS -DCONFIG_B43LEGACY_LEDS) \
|
||||
$(if $(CONFIG_RFKILL),-DCONFIG_B43_RFKILL -DCONFIG_B43LEGACY_RFKILL) \
|
||||
$(if $(CONFIG_HW_RANDOM),-DCONFIG_B43_HWRNG) \
|
||||
$(if $(CONFIG_HW_RANDOM),-DCONFIG_B43_HWRNG -DCONFIG_B43LEGACY_HWRNG) \
|
||||
$(if $(CONFIG_PCMCIA),-DCONFIG_SSB_PCMCIAHOST_POSSIBLE -DCONFIG_SSB_PCMCIAHOST -DCONFIG_B43_PCMCIA -DCONFIG_B43_PIO) \
|
||||
$(if $(CONFIG_DEBUG_FS), -DCONFIG_MAC80211_DEBUGFS) \
|
||||
-D__CONFIG_MAC80211_RC_DEFAULT=minstrel \
|
||||
@ -416,6 +429,7 @@ MAKE_OPTS:= \
|
||||
CONFIG_B43LEGACY_LEDS=$(CONFIG_LEDS_TRIGGERS) \
|
||||
CONFIG_B43_LEDS=$(CONFIG_LEDS_TRIGGERS) \
|
||||
$(if $(CONFIG_HW_RANDOM),CONFIG_B43_HWRNG=y,CONFIG_B43_HWRNG=n) \
|
||||
$(if $(CONFIG_HW_RANDOM),CONFIG_B43LEGACY_HWRNG=y,CONFIG_B43LEGACY_HWRNG=n) \
|
||||
$(if $(CONFIG_PACKAGE_kmod-b43),CONFIG_B43=m) \
|
||||
$(if $(CONFIG_PACKAGE_kmod-b43legacy),CONFIG_B43LEGACY=m) \
|
||||
KLIB_BUILD="$(LINUX_DIR)" \
|
||||
@ -549,5 +563,6 @@ $(eval $(call KernelPackage,rt2800-usb))
|
||||
$(eval $(call KernelPackage,zd1211rw))
|
||||
$(eval $(call KernelPackage,mac80211-hwsim))
|
||||
$(eval $(call KernelPackage,ath9k))
|
||||
$(eval $(call KernelPackage,ath))
|
||||
$(eval $(call KernelPackage,b43))
|
||||
$(eval $(call KernelPackage,b43legacy))
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -104,10 +104,10 @@ CONFIG_MAC80211_MESH=y
|
||||
@@ -107,10 +107,10 @@ CONFIG_MAC80211_MESH=y
|
||||
CONFIG_CFG80211=m
|
||||
# CONFIG_CFG80211_REG_DEBUG=y
|
||||
|
||||
@ -14,8 +14,8 @@
|
||||
+# CONFIG_LIB80211_CRYPT_TKIP=m
|
||||
# CONFIG_LIB80211_DEBUG=y
|
||||
|
||||
CONFIG_NL80211=y
|
||||
@@ -128,54 +128,54 @@ CONFIG_ATH9K=m
|
||||
CONFIG_WIRELESS_OLD_REGULATORY=n
|
||||
@@ -127,56 +127,56 @@ CONFIG_ATH9K=m
|
||||
# CONFIG_ATH9K_DEBUG=y
|
||||
|
||||
|
||||
@ -41,12 +41,14 @@
|
||||
|
||||
|
||||
-CONFIG_B43=m
|
||||
-CONFIG_B43_HWRNG=y
|
||||
-CONFIG_B43_PCI_AUTOSELECT=y
|
||||
-CONFIG_B43_PCICORE_AUTOSELECT=y
|
||||
-CONFIG_B43_PCMCIA=y
|
||||
-CONFIG_B43_PIO=y
|
||||
-CONFIG_B43_LEDS=y
|
||||
+# CONFIG_B43=m
|
||||
+# CONFIG_B43_HWRNG=y
|
||||
+# CONFIG_B43_PCI_AUTOSELECT=y
|
||||
+# CONFIG_B43_PCICORE_AUTOSELECT=y
|
||||
+# CONFIG_B43_PCMCIA=y
|
||||
@ -57,10 +59,12 @@
|
||||
# CONFIG_B43_FORCE_PIO=y
|
||||
|
||||
-CONFIG_B43LEGACY=m
|
||||
-CONFIG_B43LEGACY_HWRNG=y
|
||||
-CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
||||
-CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
|
||||
-CONFIG_B43LEGACY_LEDS=y
|
||||
+# CONFIG_B43LEGACY=m
|
||||
+# CONFIG_B43LEGACY_HWRNG=y
|
||||
+# CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
||||
+# CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
|
||||
+# CONFIG_B43LEGACY_LEDS=y
|
||||
@ -99,7 +103,7 @@
|
||||
# CONFIG_IPW2200_DEBUG=y
|
||||
# The above enables use a second interface prefixed 'rtap'.
|
||||
# Example usage:
|
||||
@@ -190,27 +190,27 @@ CONFIG_IPW2200_QOS=y
|
||||
@@ -191,27 +191,27 @@ CONFIG_IPW2200_QOS=y
|
||||
#
|
||||
# % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
|
||||
|
||||
@ -142,7 +146,7 @@
|
||||
|
||||
CONFIG_RT2X00_LIB_PCI=m
|
||||
CONFIG_RT2400PCI=m
|
||||
@@ -226,16 +226,16 @@ CONFIG_RT61PCI=m
|
||||
@@ -227,16 +227,16 @@ CONFIG_RT61PCI=m
|
||||
NEED_RT2X00_FIRMWARE=y
|
||||
endif
|
||||
|
||||
@ -163,7 +167,7 @@
|
||||
|
||||
# USB Drivers
|
||||
ifneq ($(CONFIG_USB),)
|
||||
@@ -249,21 +249,21 @@ CONFIG_ZD1211RW=m
|
||||
@@ -250,21 +250,21 @@ CONFIG_ZD1211RW=m
|
||||
# is only wireless RNDIS chip known to date.
|
||||
# Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER
|
||||
# it also requires new RNDIS_HOST and CDC_ETHER modules which we add
|
||||
@ -192,7 +196,7 @@
|
||||
endif
|
||||
|
||||
# RT2500USB does not require firmware
|
||||
@@ -301,20 +301,20 @@ CONFIG_P54_COMMON=m
|
||||
@@ -306,20 +306,20 @@ CONFIG_ATH_COMMON=m
|
||||
|
||||
|
||||
# Sonics Silicon Backplane
|
||||
|
@ -1,166 +0,0 @@
|
||||
From 9ed8a41a30916a79529552872e8d1a6175d37398 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:30:14 +0100
|
||||
Subject: [PATCH 1/9] rt2x00: Move Move pci_dev specific access to rt2x00pci
|
||||
|
||||
pci_dev->irq and pci_name(pci_dev) access should be limited
|
||||
to rt2x00pci only. This is more generic and allows a rt2x00 pci
|
||||
driver to be controlled as PCI device but also as platform driver
|
||||
(needed for rt2800pci SoC support).
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2400pci.c | 2 +-
|
||||
drivers/net/wireless/rt2x00/rt2500pci.c | 2 +-
|
||||
drivers/net/wireless/rt2x00/rt2x00.h | 18 ++++++++++++++++++
|
||||
drivers/net/wireless/rt2x00/rt2x00pci.c | 16 ++++++++++++----
|
||||
drivers/net/wireless/rt2x00/rt61pci.c | 7 +------
|
||||
drivers/net/wireless/rt2x00/rt61pci.h | 6 ------
|
||||
6 files changed, 33 insertions(+), 18 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
|
||||
@@ -1361,7 +1361,7 @@ static int rt2400pci_init_eeprom(struct
|
||||
*/
|
||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
|
||||
rt2x00pci_register_read(rt2x00dev, CSR0, ®);
|
||||
- rt2x00_set_chip(rt2x00dev, RT2460, value, reg);
|
||||
+ rt2x00_set_chip_rf(rt2x00dev, value, reg);
|
||||
|
||||
if (!rt2x00_rf(&rt2x00dev->chip, RF2420) &&
|
||||
!rt2x00_rf(&rt2x00dev->chip, RF2421)) {
|
||||
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
|
||||
@@ -1525,7 +1525,7 @@ static int rt2500pci_init_eeprom(struct
|
||||
*/
|
||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
|
||||
rt2x00pci_register_read(rt2x00dev, CSR0, ®);
|
||||
- rt2x00_set_chip(rt2x00dev, RT2560, value, reg);
|
||||
+ rt2x00_set_chip_rf(rt2x00dev, value, reg);
|
||||
|
||||
if (!rt2x00_rf(&rt2x00dev->chip, RF2522) &&
|
||||
!rt2x00_rf(&rt2x00dev->chip, RF2523) &&
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -672,6 +672,12 @@ struct rt2x00_dev {
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
+ * Device information, Bus IRQ and name (PCI, SoC)
|
||||
+ */
|
||||
+ int irq;
|
||||
+ const char *name;
|
||||
+
|
||||
+ /*
|
||||
* Chipset identification.
|
||||
*/
|
||||
struct rt2x00_chip chip;
|
||||
@@ -860,6 +866,18 @@ static inline void rt2x00_set_chip(struc
|
||||
rt2x00dev->chip.rev = rev;
|
||||
}
|
||||
|
||||
+static inline void rt2x00_set_chip_rt(struct rt2x00_dev *rt2x00dev,
|
||||
+ const u16 rt)
|
||||
+{
|
||||
+ rt2x00dev->chip.rt = rt;
|
||||
+}
|
||||
+
|
||||
+static inline void rt2x00_set_chip_rf(struct rt2x00_dev *rt2x00dev,
|
||||
+ const u16 rf, const u32 rev)
|
||||
+{
|
||||
+ rt2x00_set_chip(rt2x00dev, rt2x00dev->chip.rt, rf, rev);
|
||||
+}
|
||||
+
|
||||
static inline char rt2x00_rt(const struct rt2x00_chip *chipset, const u16 chip)
|
||||
{
|
||||
return (chipset->rt == chip);
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
@@ -170,7 +170,6 @@ static void rt2x00pci_free_queue_dma(str
|
||||
|
||||
int rt2x00pci_initialize(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
- struct pci_dev *pci_dev = to_pci_dev(rt2x00dev->dev);
|
||||
struct data_queue *queue;
|
||||
int status;
|
||||
|
||||
@@ -186,11 +185,11 @@ int rt2x00pci_initialize(struct rt2x00_d
|
||||
/*
|
||||
* Register interrupt handler.
|
||||
*/
|
||||
- status = request_irq(pci_dev->irq, rt2x00dev->ops->lib->irq_handler,
|
||||
- IRQF_SHARED, pci_name(pci_dev), rt2x00dev);
|
||||
+ status = request_irq(rt2x00dev->irq, rt2x00dev->ops->lib->irq_handler,
|
||||
+ IRQF_SHARED, rt2x00dev->name, rt2x00dev);
|
||||
if (status) {
|
||||
ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n",
|
||||
- pci_dev->irq, status);
|
||||
+ rt2x00dev->irq, status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -270,6 +269,7 @@ int rt2x00pci_probe(struct pci_dev *pci_
|
||||
struct ieee80211_hw *hw;
|
||||
struct rt2x00_dev *rt2x00dev;
|
||||
int retval;
|
||||
+ u16 chip;
|
||||
|
||||
retval = pci_request_regions(pci_dev, pci_name(pci_dev));
|
||||
if (retval) {
|
||||
@@ -307,6 +307,14 @@ int rt2x00pci_probe(struct pci_dev *pci_
|
||||
rt2x00dev->dev = &pci_dev->dev;
|
||||
rt2x00dev->ops = ops;
|
||||
rt2x00dev->hw = hw;
|
||||
+ rt2x00dev->irq = pci_dev->irq;
|
||||
+ rt2x00dev->name = pci_name(pci_dev);
|
||||
+
|
||||
+ /*
|
||||
+ * Determine RT chipset by reading PCI header.
|
||||
+ */
|
||||
+ pci_read_config_word(pci_dev, PCI_DEVICE_ID, &chip);
|
||||
+ rt2x00_set_chip_rt(rt2x00dev, chip);
|
||||
|
||||
retval = rt2x00pci_alloc_reg(rt2x00dev);
|
||||
if (retval)
|
||||
--- a/drivers/net/wireless/rt2x00/rt61pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
|
||||
@@ -2308,7 +2308,6 @@ static int rt61pci_init_eeprom(struct rt
|
||||
u32 reg;
|
||||
u16 value;
|
||||
u16 eeprom;
|
||||
- u16 device;
|
||||
|
||||
/*
|
||||
* Read EEPROM word for configuration.
|
||||
@@ -2317,14 +2316,10 @@ static int rt61pci_init_eeprom(struct rt
|
||||
|
||||
/*
|
||||
* Identify RF chipset.
|
||||
- * To determine the RT chip we have to read the
|
||||
- * PCI header of the device.
|
||||
*/
|
||||
- pci_read_config_word(to_pci_dev(rt2x00dev->dev),
|
||||
- PCI_CONFIG_HEADER_DEVICE, &device);
|
||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
|
||||
rt2x00pci_register_read(rt2x00dev, MAC_CSR0, ®);
|
||||
- rt2x00_set_chip(rt2x00dev, device, value, reg);
|
||||
+ rt2x00_set_chip_rf(rt2x00dev, value, reg);
|
||||
|
||||
if (!rt2x00_rf(&rt2x00dev->chip, RF5225) &&
|
||||
!rt2x00_rf(&rt2x00dev->chip, RF5325) &&
|
||||
--- a/drivers/net/wireless/rt2x00/rt61pci.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt61pci.h
|
||||
@@ -63,12 +63,6 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
- * PCI Configuration Header
|
||||
- */
|
||||
-#define PCI_CONFIG_HEADER_VENDOR 0x0000
|
||||
-#define PCI_CONFIG_HEADER_DEVICE 0x0002
|
||||
-
|
||||
-/*
|
||||
* HOST_CMD_CSR: For HOST to interrupt embedded processor
|
||||
*/
|
||||
#define HOST_CMD_CSR 0x0008
|
@ -1,12 +1,14 @@
|
||||
From 18b2be31a35dc8bd216e60e3c9d8d8e7b2179aed Mon Sep 17 00:00:00 2001
|
||||
From ff22aa7443c57f49f9fdaf703aa7035c1b13d7f4 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:38:40 +0100
|
||||
Subject: [PATCH 6/9] rt2x00: Add rt2x00soc bus module
|
||||
Date: Sun, 26 Apr 2009 15:49:55 +0200
|
||||
Subject: [PATCH 1/4] rt2x00: Add rt2x00soc bus module
|
||||
|
||||
Add new library module for SoC drivers.
|
||||
This is needed to fully support the platform
|
||||
driver part of rt2800pci.
|
||||
|
||||
Based on original patch from Felix.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
@ -1,25 +0,0 @@
|
||||
From 0a807e9fbd915d2c0cc30870403a571478a9191b Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:31:25 +0100
|
||||
Subject: [PATCH 2/9] rt2x00: Fix Sparse warning
|
||||
|
||||
rt2x00link_reset_qual() is not declared in a header,
|
||||
and is only internally used within rt2x00link.c.
|
||||
It should be declared as static.
|
||||
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2x00link.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00link.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00link.c
|
||||
@@ -387,7 +387,7 @@ void rt2x00link_reset_tuner(struct rt2x0
|
||||
rt2x00link_antenna_reset(rt2x00dev);
|
||||
}
|
||||
|
||||
-void rt2x00link_reset_qual(struct rt2x00_dev *rt2x00dev)
|
||||
+static void rt2x00link_reset_qual(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct link_qual *qual = &rt2x00dev->link.qual;
|
||||
|
@ -1,95 +0,0 @@
|
||||
From 76b0fa91af8ca33cd68f52f2d02a05c488777f58 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:32:07 +0100
|
||||
Subject: [PATCH 3/9] rt2x00: Don't free register information on suspend
|
||||
|
||||
After suspend & resume the rt2x00 devices won't wakeup
|
||||
anymore due to a broken register information setup.
|
||||
The most important problem is the release of the EEPROM
|
||||
buffer which is completely cleared and never read again
|
||||
after the suspend.
|
||||
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2x00pci.c | 18 +-----------------
|
||||
drivers/net/wireless/rt2x00/rt2x00usb.c | 18 +-----------------
|
||||
2 files changed, 2 insertions(+), 34 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
@@ -377,8 +377,6 @@ int rt2x00pci_suspend(struct pci_dev *pc
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
- rt2x00pci_free_reg(rt2x00dev);
|
||||
-
|
||||
pci_save_state(pci_dev);
|
||||
pci_disable_device(pci_dev);
|
||||
return pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
|
||||
@@ -389,7 +387,6 @@ int rt2x00pci_resume(struct pci_dev *pci
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pci_dev);
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
- int retval;
|
||||
|
||||
if (pci_set_power_state(pci_dev, PCI_D0) ||
|
||||
pci_enable_device(pci_dev) ||
|
||||
@@ -398,20 +395,7 @@ int rt2x00pci_resume(struct pci_dev *pci
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
- retval = rt2x00pci_alloc_reg(rt2x00dev);
|
||||
- if (retval)
|
||||
- return retval;
|
||||
-
|
||||
- retval = rt2x00lib_resume(rt2x00dev);
|
||||
- if (retval)
|
||||
- goto exit_free_reg;
|
||||
-
|
||||
- return 0;
|
||||
-
|
||||
-exit_free_reg:
|
||||
- rt2x00pci_free_reg(rt2x00dev);
|
||||
-
|
||||
- return retval;
|
||||
+ return rt2x00lib_resume(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_resume);
|
||||
#endif /* CONFIG_PM */
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
|
||||
@@ -702,8 +702,6 @@ int rt2x00usb_suspend(struct usb_interfa
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
- rt2x00usb_free_reg(rt2x00dev);
|
||||
-
|
||||
/*
|
||||
* Decrease usbdev refcount.
|
||||
*/
|
||||
@@ -717,24 +715,10 @@ int rt2x00usb_resume(struct usb_interfac
|
||||
{
|
||||
struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
- int retval;
|
||||
|
||||
usb_get_dev(interface_to_usbdev(usb_intf));
|
||||
|
||||
- retval = rt2x00usb_alloc_reg(rt2x00dev);
|
||||
- if (retval)
|
||||
- return retval;
|
||||
-
|
||||
- retval = rt2x00lib_resume(rt2x00dev);
|
||||
- if (retval)
|
||||
- goto exit_free_reg;
|
||||
-
|
||||
- return 0;
|
||||
-
|
||||
-exit_free_reg:
|
||||
- rt2x00usb_free_reg(rt2x00dev);
|
||||
-
|
||||
- return retval;
|
||||
+ return rt2x00lib_resume(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00usb_resume);
|
||||
#endif /* CONFIG_PM */
|
@ -1,7 +1,7 @@
|
||||
From b7dcb460c4c441ce52b3c5ce30d65e1ecfbb30ad Mon Sep 17 00:00:00 2001
|
||||
From 67432230daedc23f808b79173703e27675fd0659 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:46:46 +0100
|
||||
Subject: [PATCH 8/9] rt2x00: Implement support for rt2800pci
|
||||
Date: Sun, 26 Apr 2009 15:54:03 +0200
|
||||
Subject: [PATCH 2/4] rt2x00: Implement support for rt2800pci
|
||||
|
||||
Add support for the rt2800pci chipset.
|
||||
|
||||
@ -15,25 +15,26 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/Kconfig | 26 +
|
||||
drivers/net/wireless/rt2x00/Makefile | 1 +
|
||||
drivers/net/wireless/rt2x00/rt2800pci.c | 3244 +++++++++++++++++++++++++++++++
|
||||
drivers/net/wireless/rt2x00/rt2800pci.c | 3245 +++++++++++++++++++++++++++++++
|
||||
drivers/net/wireless/rt2x00/rt2800pci.h | 1927 ++++++++++++++++++
|
||||
drivers/net/wireless/rt2x00/rt2x00.h | 6 +
|
||||
5 files changed, 5204 insertions(+), 0 deletions(-)
|
||||
5 files changed, 5205 insertions(+), 0 deletions(-)
|
||||
create mode 100644 drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
create mode 100644 drivers/net/wireless/rt2x00/rt2800pci.h
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/Makefile
|
||||
+++ b/drivers/net/wireless/rt2x00/Makefile
|
||||
@@ -17,5 +17,6 @@ obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00u
|
||||
@@ -17,6 +17,7 @@ obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00u
|
||||
obj-$(CONFIG_RT2400PCI) += rt2400pci.o
|
||||
obj-$(CONFIG_RT2500PCI) += rt2500pci.o
|
||||
obj-$(CONFIG_RT61PCI) += rt61pci.o
|
||||
+obj-$(CONFIG_RT2800PCI) += rt2800pci.o
|
||||
obj-$(CONFIG_RT2500USB) += rt2500usb.o
|
||||
obj-$(CONFIG_RT73USB) += rt73usb.o
|
||||
obj-$(CONFIG_RT2800USB) += rt2800usb.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -0,0 +1,3244 @@
|
||||
@@ -0,0 +1,3245 @@
|
||||
+/*
|
||||
+ Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
|
||||
+ <http://rt2x00.serialmonkey.com>
|
||||
@ -759,23 +760,16 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+static void rt2800pci_config_ant(struct rt2x00_dev *rt2x00dev,
|
||||
+ struct antenna_setup *ant)
|
||||
+{
|
||||
+ u16 eeprom;
|
||||
+ u8 r1;
|
||||
+ u8 r3;
|
||||
+
|
||||
+ /*
|
||||
+ * FIXME: Use requested antenna configuration.
|
||||
+ */
|
||||
+
|
||||
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
|
||||
+
|
||||
+ rt2800pci_bbp_read(rt2x00dev, 1, &r1);
|
||||
+ rt2800pci_bbp_read(rt2x00dev, 3, &r3);
|
||||
+
|
||||
+ /*
|
||||
+ * Configure the TX antenna.
|
||||
+ */
|
||||
+ switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH)) {
|
||||
+ switch ((int)ant->tx) {
|
||||
+ case 1:
|
||||
+ rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
|
||||
+ rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
|
||||
@ -791,7 +785,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ /*
|
||||
+ * Configure the RX antenna.
|
||||
+ */
|
||||
+ switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH)) {
|
||||
+ switch ((int)ant->rx) {
|
||||
+ case 1:
|
||||
+ rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
|
||||
+ break;
|
||||
@ -835,22 +829,15 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ struct rf_channel *rf,
|
||||
+ struct channel_info *info)
|
||||
+{
|
||||
+ u16 eeprom;
|
||||
+
|
||||
+ rt2x00_set_field32(&rf->rf4, RF4_FREQ_OFFSET, rt2x00dev->freq_offset);
|
||||
+
|
||||
+ /*
|
||||
+ * Determine antenna settings from EEPROM
|
||||
+ */
|
||||
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
|
||||
+
|
||||
+ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) == 1)
|
||||
+ if (rt2x00dev->default_ant.tx == 1)
|
||||
+ rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1);
|
||||
+
|
||||
+ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) == 1) {
|
||||
+ if (rt2x00dev->default_ant.rx == 1) {
|
||||
+ rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX1, 1);
|
||||
+ rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
|
||||
+ } else if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) == 2)
|
||||
+ } else if (rt2x00dev->default_ant.rx == 2)
|
||||
+ rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
|
||||
+
|
||||
+ if (rf->channel > 14) {
|
||||
@ -929,12 +916,8 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
|
||||
+ rt2800pci_rfcsr_write(rt2x00dev, 23, rfcsr);
|
||||
+
|
||||
+ if (conf_is_ht40(conf))
|
||||
+ rt2800pci_rfcsr_write(rt2x00dev, 24,
|
||||
+ rt2x00dev->calibration_bw40);
|
||||
+ else
|
||||
+ rt2800pci_rfcsr_write(rt2x00dev, 24,
|
||||
+ rt2x00dev->calibration_bw20);
|
||||
+ rt2800pci_rfcsr_write(rt2x00dev, 24,
|
||||
+ rt2x00dev->calibration[conf_is_ht40(conf)]);
|
||||
+
|
||||
+ rt2800pci_rfcsr_read(rt2x00dev, 23, &rfcsr);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
|
||||
@ -948,14 +931,8 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+{
|
||||
+ u32 reg;
|
||||
+ unsigned int tx_pin;
|
||||
+ u16 eeprom;
|
||||
+ u8 bbp;
|
||||
+
|
||||
+ /*
|
||||
+ * Determine antenna settings from EEPROM
|
||||
+ */
|
||||
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
|
||||
+
|
||||
+ if (rt2x00_rev(&rt2x00dev->chip) != RT3070_VERSION)
|
||||
+ rt2800pci_config_channel_rt2x(rt2x00dev, conf, rf, info);
|
||||
+ else
|
||||
@ -995,13 +972,13 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ tx_pin = 0;
|
||||
+
|
||||
+ /* Turn on unused PA or LNA when not using 1T or 1R */
|
||||
+ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) != 1) {
|
||||
+ if (rt2x00dev->default_ant.tx != 1) {
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
|
||||
+ }
|
||||
+
|
||||
+ /* Turn on unused PA or LNA when not using 1T or 1R */
|
||||
+ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) != 1) {
|
||||
+ if (rt2x00dev->default_ant.rx != 1) {
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
|
||||
+ }
|
||||
@ -1930,9 +1907,9 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ /*
|
||||
+ * Set RX Filter calibration for 20MHz and 40MHz
|
||||
+ */
|
||||
+ rt2x00dev->calibration_bw20 =
|
||||
+ rt2x00dev->calibration[0] =
|
||||
+ rt2800pci_init_rx_filter(rt2x00dev, false, 0x07, 0x16);
|
||||
+ rt2x00dev->calibration_bw40 =
|
||||
+ rt2x00dev->calibration[1] =
|
||||
+ rt2800pci_init_rx_filter(rt2x00dev, true, 0x27, 0x19);
|
||||
+
|
||||
+ /*
|
||||
@ -2215,7 +2192,8 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID,
|
||||
+ test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags) ?
|
||||
+ txdesc->key_idx : 0xff);
|
||||
+ rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT, skb->len);
|
||||
+ rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT,
|
||||
+ skb->len - txdesc->l2pad);
|
||||
+ rt2x00_set_field32(&word, TXWI_W1_PACKETID,
|
||||
+ skbdesc->entry->queue->qid);
|
||||
+ rt2x00_desc_write(txwi, 1, word);
|
||||
@ -2403,6 +2381,9 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ if (rt2x00_get_field32(rxd3, RXD_W3_MY_BSS))
|
||||
+ rxdesc->dev_flags |= RXDONE_MY_BSS;
|
||||
+
|
||||
+ if (rt2x00_get_field32(rxd3, RXD_W3_L2PAD))
|
||||
+ rxdesc->dev_flags |= RXDONE_L2PAD;
|
||||
+
|
||||
+ if (rt2x00_get_field32(rxwi1, RXWI_W1_SHORT_GI))
|
||||
+ rxdesc->flags |= RX_FLAG_SHORT_GI;
|
||||
+
|
||||
@ -2712,6 +2693,14 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Identify default antenna configuration.
|
||||
+ */
|
||||
+ rt2x00dev->default_ant.tx =
|
||||
+ rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH);
|
||||
+ rt2x00dev->default_ant.rx =
|
||||
+ rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH);
|
||||
+
|
||||
+ /*
|
||||
+ * Read frequency offset and RF programming sequence.
|
||||
+ */
|
||||
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
|
||||
@ -2954,6 +2943,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ if (!rt2x00_rt(&rt2x00dev->chip, RT2880) &&
|
||||
+ !rt2x00_rt(&rt2x00dev->chip, RT3052))
|
||||
+ __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
|
||||
+ __set_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags);
|
||||
+ if (!modparam_nohwcrypt)
|
||||
+ __set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
|
||||
+
|
||||
@ -3192,13 +3182,25 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ * RT2800pci module information.
|
||||
+ */
|
||||
+static struct pci_device_id rt2800pci_device_table[] = {
|
||||
+ /* Edimax */
|
||||
+ { PCI_DEVICE(0x1432, 0x7708), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1432, 0x7727), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1432, 0x7728), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1432, 0x7738), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1432, 0x7748), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1432, 0x7758), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1432, 0x7768), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x0601), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x0681), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x0701), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x0781), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x3062), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x3090), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x3091), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x3092), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x3562), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { PCI_DEVICE(0x1814, 0x3592), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ /* Awt */
|
||||
+ { PCI_DEVICE(0x1a3b, 0x1059), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||
+ { 0, }
|
||||
+};
|
||||
@ -5210,7 +5212,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+#endif /* RT2800PCI_H */
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -138,6 +138,12 @@ struct rt2x00_chip {
|
||||
@@ -147,6 +147,12 @@ struct rt2x00_chip {
|
||||
#define RT2561 0x0302
|
||||
#define RT2661 0x0401
|
||||
#define RT2571 0x1300
|
||||
@ -5220,6 +5222,6 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+#define RT2890D 0x0781 /* 2.4GHz, 5GHz PCIe */
|
||||
+#define RT2880 0x2880 /* WSOC */
|
||||
+#define RT3052 0x3052 /* WSOC */
|
||||
#define RT2870 0x1600
|
||||
|
||||
u16 rf;
|
||||
u32 rev;
|
@ -1,21 +0,0 @@
|
||||
From b587a44d6cf038cac3ce194c49196f501fa4bb48 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:32:50 +0100
|
||||
Subject: [PATCH 4/9] rt2x00: Add rt73usb USB IDs
|
||||
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt73usb.c | 2 ++
|
||||
1 files changed, 2 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt73usb.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
|
||||
@@ -2369,6 +2369,8 @@ static struct usb_device_id rt73usb_devi
|
||||
/* Buffalo */
|
||||
{ USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
+ { USB_DEVICE(0x0411, 0x0116), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
+ { USB_DEVICE(0x0411, 0x0119), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
/* CNet */
|
||||
{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) },
|
@ -0,0 +1,21 @@
|
||||
From ff3453072abf45ccf05e83f69c69951f3d7f7160 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sun, 26 Apr 2009 17:35:38 +0200
|
||||
Subject: [PATCH 3/4] rt2x00: Allocate DMA (rt2800pci)
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2800pci.c | 1 +
|
||||
1 files changed, 1 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -2906,6 +2906,7 @@ static int rt2800pci_probe_hw(struct rt2
|
||||
if (!rt2x00_rt(&rt2x00dev->chip, RT2880) &&
|
||||
!rt2x00_rt(&rt2x00dev->chip, RT3052))
|
||||
__set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
|
||||
+ __set_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags);
|
||||
__set_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags);
|
||||
if (!modparam_nohwcrypt)
|
||||
__set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
|
@ -1,522 +0,0 @@
|
||||
From 0f4396e5a4351ccd48256407b4a606d6c33a94cb Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:37:26 +0100
|
||||
Subject: [PATCH 5/9] rt2x00: Implement support for 802.11n
|
||||
|
||||
Extend rt2x00lib capabilities to support 802.11n,
|
||||
it still lacks aggregation support, but that can
|
||||
be added in the future.
|
||||
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/Kconfig | 3 +
|
||||
drivers/net/wireless/rt2x00/Makefile | 1 +
|
||||
drivers/net/wireless/rt2x00/rt2x00.h | 4 +
|
||||
drivers/net/wireless/rt2x00/rt2x00config.c | 5 ++
|
||||
drivers/net/wireless/rt2x00/rt2x00dev.c | 91 ++++++++++++++++++++-------
|
||||
drivers/net/wireless/rt2x00/rt2x00ht.c | 69 +++++++++++++++++++++
|
||||
drivers/net/wireless/rt2x00/rt2x00lib.h | 24 +++++++
|
||||
drivers/net/wireless/rt2x00/rt2x00queue.c | 1 +
|
||||
drivers/net/wireless/rt2x00/rt2x00queue.h | 33 ++++++++--
|
||||
9 files changed, 201 insertions(+), 30 deletions(-)
|
||||
create mode 100644 drivers/net/wireless/rt2x00/rt2x00ht.c
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/Makefile
|
||||
+++ b/drivers/net/wireless/rt2x00/Makefile
|
||||
@@ -8,6 +8,7 @@ rt2x00lib-$(CONFIG_RT2X00_LIB_CRYPTO) +=
|
||||
rt2x00lib-$(CONFIG_RT2X00_LIB_RFKILL) += rt2x00rfkill.o
|
||||
rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o
|
||||
rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS) += rt2x00leds.o
|
||||
+rt2x00lib-$(CONFIG_RT2X00_LIB_HT) += rt2x00ht.o
|
||||
|
||||
obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
|
||||
obj-$(CONFIG_RT2X00_LIB_PCI) += rt2x00pci.o
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -357,6 +357,7 @@ static inline struct rt2x00_intf* vif_to
|
||||
* for @tx_power_a, @tx_power_bg and @channels.
|
||||
* @channels: Device/chipset specific channel values (See &struct rf_channel).
|
||||
* @channels_info: Additional information for channels (See &struct channel_info).
|
||||
+ * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
|
||||
*/
|
||||
struct hw_mode_spec {
|
||||
unsigned int supported_bands;
|
||||
@@ -370,6 +371,8 @@ struct hw_mode_spec {
|
||||
unsigned int num_channels;
|
||||
const struct rf_channel *channels;
|
||||
const struct channel_info *channels_info;
|
||||
+
|
||||
+ struct ieee80211_sta_ht_cap ht;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -606,6 +609,7 @@ enum rt2x00_flags {
|
||||
CONFIG_EXTERNAL_LNA_BG,
|
||||
CONFIG_DOUBLE_ANTENNA,
|
||||
CONFIG_DISABLE_LINK_TUNING,
|
||||
+ CONFIG_CHANNEL_HT40,
|
||||
};
|
||||
|
||||
/*
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
|
||||
@@ -173,6 +173,11 @@ void rt2x00lib_config(struct rt2x00_dev
|
||||
libconf.conf = conf;
|
||||
|
||||
if (ieee80211_flags & IEEE80211_CONF_CHANGE_CHANNEL) {
|
||||
+ if (conf_is_ht40(conf))
|
||||
+ __set_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
|
||||
+ else
|
||||
+ __clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
|
||||
+
|
||||
memcpy(&libconf.rf,
|
||||
&rt2x00dev->spec.channels[conf->channel->hw_value],
|
||||
sizeof(libconf.rf));
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
@@ -316,18 +316,54 @@ void rt2x00lib_txdone(struct queue_entry
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
|
||||
|
||||
+static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev,
|
||||
+ struct rxdone_entry_desc *rxdesc)
|
||||
+{
|
||||
+ struct ieee80211_supported_band *sband;
|
||||
+ const struct rt2x00_rate *rate;
|
||||
+ unsigned int i;
|
||||
+ int signal;
|
||||
+ int type;
|
||||
+
|
||||
+ /*
|
||||
+ * For non-HT rates the MCS value needs to contain the
|
||||
+ * actually used rate modulation (CCK or OFDM).
|
||||
+ */
|
||||
+ if (rxdesc->dev_flags & RXDONE_SIGNAL_MCS)
|
||||
+ signal = RATE_MCS(rxdesc->rate_mode, rxdesc->signal);
|
||||
+ else
|
||||
+ signal = rxdesc->signal;
|
||||
+
|
||||
+ type = (rxdesc->dev_flags & RXDONE_SIGNAL_MASK);
|
||||
+
|
||||
+ sband = &rt2x00dev->bands[rt2x00dev->curr_band];
|
||||
+ for (i = 0; i < sband->n_bitrates; i++) {
|
||||
+ rate = rt2x00_get_rate(sband->bitrates[i].hw_value);
|
||||
+
|
||||
+ if (((type == RXDONE_SIGNAL_PLCP) &&
|
||||
+ (rate->plcp == signal)) ||
|
||||
+ ((type == RXDONE_SIGNAL_BITRATE) &&
|
||||
+ (rate->bitrate == signal)) ||
|
||||
+ ((type == RXDONE_SIGNAL_MCS) &&
|
||||
+ (rate->mcs == signal))) {
|
||||
+ return i;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ WARNING(rt2x00dev, "Frame received with unrecognized signal, "
|
||||
+ "signal=0x%.4x, type=%d.\n", signal, type);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
|
||||
struct queue_entry *entry)
|
||||
{
|
||||
struct rxdone_entry_desc rxdesc;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
|
||||
- struct ieee80211_supported_band *sband;
|
||||
- const struct rt2x00_rate *rate;
|
||||
unsigned int header_length;
|
||||
unsigned int align;
|
||||
- unsigned int i;
|
||||
- int idx = -1;
|
||||
+ int rate_idx;
|
||||
|
||||
/*
|
||||
* Allocate a new sk_buffer. If no new buffer available, drop the
|
||||
@@ -376,26 +412,17 @@ void rt2x00lib_rxdone(struct rt2x00_dev
|
||||
skb_trim(entry->skb, rxdesc.size);
|
||||
|
||||
/*
|
||||
- * Update RX statistics.
|
||||
- */
|
||||
- sband = &rt2x00dev->bands[rt2x00dev->curr_band];
|
||||
- for (i = 0; i < sband->n_bitrates; i++) {
|
||||
- rate = rt2x00_get_rate(sband->bitrates[i].hw_value);
|
||||
-
|
||||
- if (((rxdesc.dev_flags & RXDONE_SIGNAL_PLCP) &&
|
||||
- (rate->plcp == rxdesc.signal)) ||
|
||||
- ((rxdesc.dev_flags & RXDONE_SIGNAL_BITRATE) &&
|
||||
- (rate->bitrate == rxdesc.signal))) {
|
||||
- idx = i;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (idx < 0) {
|
||||
- WARNING(rt2x00dev, "Frame received with unrecognized signal,"
|
||||
- "signal=0x%.2x, type=%d.\n", rxdesc.signal,
|
||||
- (rxdesc.dev_flags & RXDONE_SIGNAL_MASK));
|
||||
- idx = 0;
|
||||
+ * Check if the frame was received using HT. In that case,
|
||||
+ * the rate is the MCS index and should be passed to mac80211
|
||||
+ * directly. Otherwise we need to translate the signal to
|
||||
+ * the correct bitrate index.
|
||||
+ */
|
||||
+ if (rxdesc.rate_mode == RATE_MODE_CCK ||
|
||||
+ rxdesc.rate_mode == RATE_MODE_OFDM) {
|
||||
+ rate_idx = rt2x00lib_rxdone_read_signal(rt2x00dev, &rxdesc);
|
||||
+ } else {
|
||||
+ rxdesc.flags |= RX_FLAG_HT;
|
||||
+ rate_idx = rxdesc.signal;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -405,7 +432,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev
|
||||
rt2x00debug_update_crypto(rt2x00dev, &rxdesc);
|
||||
|
||||
rx_status->mactime = rxdesc.timestamp;
|
||||
- rx_status->rate_idx = idx;
|
||||
+ rx_status->rate_idx = rate_idx;
|
||||
rx_status->qual = rt2x00link_calculate_signal(rt2x00dev, rxdesc.rssi);
|
||||
rx_status->signal = rxdesc.rssi;
|
||||
rx_status->noise = rxdesc.noise;
|
||||
@@ -440,72 +467,84 @@ const struct rt2x00_rate rt2x00_supporte
|
||||
.bitrate = 10,
|
||||
.ratemask = BIT(0),
|
||||
.plcp = 0x00,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_CCK, 0),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
|
||||
.bitrate = 20,
|
||||
.ratemask = BIT(1),
|
||||
.plcp = 0x01,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_CCK, 1),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
|
||||
.bitrate = 55,
|
||||
.ratemask = BIT(2),
|
||||
.plcp = 0x02,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_CCK, 2),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
|
||||
.bitrate = 110,
|
||||
.ratemask = BIT(3),
|
||||
.plcp = 0x03,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_CCK, 3),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 60,
|
||||
.ratemask = BIT(4),
|
||||
.plcp = 0x0b,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 0),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 90,
|
||||
.ratemask = BIT(5),
|
||||
.plcp = 0x0f,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 1),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 120,
|
||||
.ratemask = BIT(6),
|
||||
.plcp = 0x0a,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 2),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 180,
|
||||
.ratemask = BIT(7),
|
||||
.plcp = 0x0e,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 3),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 240,
|
||||
.ratemask = BIT(8),
|
||||
.plcp = 0x09,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 4),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 360,
|
||||
.ratemask = BIT(9),
|
||||
.plcp = 0x0d,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 5),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 480,
|
||||
.ratemask = BIT(10),
|
||||
.plcp = 0x08,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 6),
|
||||
},
|
||||
{
|
||||
.flags = DEV_RATE_OFDM,
|
||||
.bitrate = 540,
|
||||
.ratemask = BIT(11),
|
||||
.plcp = 0x0c,
|
||||
+ .mcs = RATE_MCS(RATE_MODE_OFDM, 7),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -581,6 +620,8 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
rt2x00dev->bands[IEEE80211_BAND_2GHZ].bitrates = rates;
|
||||
hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
|
||||
&rt2x00dev->bands[IEEE80211_BAND_2GHZ];
|
||||
+ memcpy(&rt2x00dev->bands[IEEE80211_BAND_2GHZ].ht_cap,
|
||||
+ &spec->ht, sizeof(spec->ht));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -597,6 +638,8 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
rt2x00dev->bands[IEEE80211_BAND_5GHZ].bitrates = &rates[4];
|
||||
hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
|
||||
&rt2x00dev->bands[IEEE80211_BAND_5GHZ];
|
||||
+ memcpy(&rt2x00dev->bands[IEEE80211_BAND_5GHZ].ht_cap,
|
||||
+ &spec->ht, sizeof(spec->ht));
|
||||
}
|
||||
|
||||
return 0;
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00ht.c
|
||||
@@ -0,0 +1,69 @@
|
||||
+/*
|
||||
+ Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
|
||||
+ <http://rt2x00.serialmonkey.com>
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation; either version 2 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program; if not, write to the
|
||||
+ Free Software Foundation, Inc.,
|
||||
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ Module: rt2x00lib
|
||||
+ Abstract: rt2x00 HT specific routines.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "rt2x00.h"
|
||||
+#include "rt2x00lib.h"
|
||||
+
|
||||
+void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
|
||||
+ struct txentry_desc *txdesc,
|
||||
+ const struct rt2x00_rate *hwrate)
|
||||
+{
|
||||
+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
|
||||
+ struct ieee80211_tx_rate *txrate = &tx_info->control.rates[0];
|
||||
+
|
||||
+ if (tx_info->control.sta)
|
||||
+ txdesc->mpdu_density =
|
||||
+ tx_info->control.sta->ht_cap.ampdu_density;
|
||||
+ else
|
||||
+ txdesc->mpdu_density = 0;
|
||||
+
|
||||
+ txdesc->ba_size = 7; /* FIXME: What value is needed? */
|
||||
+ txdesc->stbc = 0; /* FIXME: What value is needed? */
|
||||
+
|
||||
+ txdesc->mcs = rt2x00_get_rate_mcs(hwrate->mcs);
|
||||
+ if (txrate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
|
||||
+ txdesc->mcs |= 0x08;
|
||||
+
|
||||
+ /*
|
||||
+ * Convert flags
|
||||
+ */
|
||||
+ if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
|
||||
+ __set_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags);
|
||||
+
|
||||
+ /*
|
||||
+ * Determine HT Mix/Greenfield rate mode
|
||||
+ */
|
||||
+ if (txrate->flags & IEEE80211_TX_RC_MCS)
|
||||
+ txdesc->rate_mode = RATE_MODE_HT_MIX;
|
||||
+ if (txrate->flags & IEEE80211_TX_RC_GREEN_FIELD)
|
||||
+ txdesc->rate_mode = RATE_MODE_HT_GREENFIELD;
|
||||
+ if (txrate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
||||
+ __set_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags);
|
||||
+ if (txrate->flags & IEEE80211_TX_RC_SHORT_GI)
|
||||
+ __set_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags);
|
||||
+}
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00lib.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
|
||||
@@ -48,6 +48,7 @@ struct rt2x00_rate {
|
||||
unsigned short ratemask;
|
||||
|
||||
unsigned short plcp;
|
||||
+ unsigned short mcs;
|
||||
};
|
||||
|
||||
extern const struct rt2x00_rate rt2x00_supported_rates[12];
|
||||
@@ -57,6 +58,14 @@ static inline const struct rt2x00_rate *
|
||||
return &rt2x00_supported_rates[hw_value & 0xff];
|
||||
}
|
||||
|
||||
+#define RATE_MCS(__mode, __mcs) \
|
||||
+ ( (((__mode) & 0x00ff) << 8) | ((__mcs) & 0x00ff) )
|
||||
+
|
||||
+static inline int rt2x00_get_rate_mcs(const u16 mcs_value)
|
||||
+{
|
||||
+ return (mcs_value & 0x00ff);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Radio control handlers.
|
||||
*/
|
||||
@@ -341,6 +350,21 @@ static inline void rt2x00crypto_rx_inser
|
||||
#endif /* CONFIG_RT2X00_LIB_CRYPTO */
|
||||
|
||||
/*
|
||||
+ * HT handlers.
|
||||
+ */
|
||||
+#ifdef CONFIG_RT2X00_LIB_HT
|
||||
+void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
|
||||
+ struct txentry_desc *txdesc,
|
||||
+ const struct rt2x00_rate *hwrate);
|
||||
+#else
|
||||
+static inline void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
|
||||
+ struct txentry_desc *txdesc,
|
||||
+ const struct rt2x00_rate *hwrate)
|
||||
+{
|
||||
+}
|
||||
+#endif /* CONFIG_RT2X00_LIB_HT */
|
||||
+
|
||||
+/*
|
||||
* RFkill handlers.
|
||||
*/
|
||||
#ifdef CONFIG_RT2X00_LIB_RFKILL
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
|
||||
@@ -326,6 +326,7 @@ static void rt2x00queue_create_tx_descri
|
||||
* Apply TX descriptor handling by components
|
||||
*/
|
||||
rt2x00crypto_create_tx_descriptor(entry, txdesc);
|
||||
+ rt2x00ht_create_tx_descriptor(entry, txdesc, hwrate);
|
||||
rt2x00queue_create_tx_descriptor_seq(entry, txdesc);
|
||||
rt2x00queue_create_tx_descriptor_plcp(entry, txdesc, hwrate);
|
||||
}
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
|
||||
@@ -35,9 +35,12 @@
|
||||
* for USB devices this restriction does not apply, but the value of
|
||||
* 2432 makes sense since it is big enough to contain the maximum fragment
|
||||
* size according to the ieee802.11 specs.
|
||||
+ * The aggregation size depends on support from the driver, but should
|
||||
+ * be something around 3840 bytes.
|
||||
*/
|
||||
-#define DATA_FRAME_SIZE 2432
|
||||
-#define MGMT_FRAME_SIZE 256
|
||||
+#define DATA_FRAME_SIZE 2432
|
||||
+#define MGMT_FRAME_SIZE 256
|
||||
+#define AGGREGATION_SIZE 3840
|
||||
|
||||
/**
|
||||
* DOC: Number of entries per queue
|
||||
@@ -145,6 +148,7 @@ static inline struct skb_frame_desc* get
|
||||
*
|
||||
* @RXDONE_SIGNAL_PLCP: Signal field contains the plcp value.
|
||||
* @RXDONE_SIGNAL_BITRATE: Signal field contains the bitrate value.
|
||||
+ * @RXDONE_SIGNAL_MCS: Signal field contains the mcs value.
|
||||
* @RXDONE_MY_BSS: Does this frame originate from device's BSS.
|
||||
* @RXDONE_CRYPTO_IV: Driver provided IV/EIV data.
|
||||
* @RXDONE_CRYPTO_ICV: Driver provided ICV data.
|
||||
@@ -152,9 +156,10 @@ static inline struct skb_frame_desc* get
|
||||
enum rxdone_entry_desc_flags {
|
||||
RXDONE_SIGNAL_PLCP = 1 << 0,
|
||||
RXDONE_SIGNAL_BITRATE = 1 << 1,
|
||||
- RXDONE_MY_BSS = 1 << 2,
|
||||
- RXDONE_CRYPTO_IV = 1 << 3,
|
||||
- RXDONE_CRYPTO_ICV = 1 << 4,
|
||||
+ RXDONE_SIGNAL_MCS = 1 << 2,
|
||||
+ RXDONE_MY_BSS = 1 << 3,
|
||||
+ RXDONE_CRYPTO_IV = 1 << 4,
|
||||
+ RXDONE_CRYPTO_ICV = 1 << 5,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -163,7 +168,7 @@ enum rxdone_entry_desc_flags {
|
||||
* from &rxdone_entry_desc to a signal value type.
|
||||
*/
|
||||
#define RXDONE_SIGNAL_MASK \
|
||||
- ( RXDONE_SIGNAL_PLCP | RXDONE_SIGNAL_BITRATE )
|
||||
+ ( RXDONE_SIGNAL_PLCP | RXDONE_SIGNAL_BITRATE | RXDONE_SIGNAL_MCS )
|
||||
|
||||
/**
|
||||
* struct rxdone_entry_desc: RX Entry descriptor
|
||||
@@ -177,6 +182,7 @@ enum rxdone_entry_desc_flags {
|
||||
* @size: Data size of the received frame.
|
||||
* @flags: MAC80211 receive flags (See &enum mac80211_rx_flags).
|
||||
* @dev_flags: Ralink receive flags (See &enum rxdone_entry_desc_flags).
|
||||
+ * @rate_mode: Rate mode (See @enum rate_modulation).
|
||||
* @cipher: Cipher type used during decryption.
|
||||
* @cipher_status: Decryption status.
|
||||
* @iv: IV/EIV data used during decryption.
|
||||
@@ -190,6 +196,7 @@ struct rxdone_entry_desc {
|
||||
int size;
|
||||
int flags;
|
||||
int dev_flags;
|
||||
+ u16 rate_mode;
|
||||
u8 cipher;
|
||||
u8 cipher_status;
|
||||
|
||||
@@ -243,6 +250,9 @@ struct txdone_entry_desc {
|
||||
* @ENTRY_TXD_ENCRYPT_PAIRWISE: Use pairwise key table (instead of shared).
|
||||
* @ENTRY_TXD_ENCRYPT_IV: Generate IV/EIV in hardware.
|
||||
* @ENTRY_TXD_ENCRYPT_MMIC: Generate MIC in hardware.
|
||||
+ * @ENTRY_TXD_HT_AMPDU: This frame is part of an AMPDU.
|
||||
+ * @ENTRY_TXD_HT_BW_40: Use 40MHz Bandwidth.
|
||||
+ * @ENTRY_TXD_HT_SHORT_GI: Use short GI.
|
||||
*/
|
||||
enum txentry_desc_flags {
|
||||
ENTRY_TXD_RTS_FRAME,
|
||||
@@ -258,6 +268,9 @@ enum txentry_desc_flags {
|
||||
ENTRY_TXD_ENCRYPT_PAIRWISE,
|
||||
ENTRY_TXD_ENCRYPT_IV,
|
||||
ENTRY_TXD_ENCRYPT_MMIC,
|
||||
+ ENTRY_TXD_HT_AMPDU,
|
||||
+ ENTRY_TXD_HT_BW_40,
|
||||
+ ENTRY_TXD_HT_SHORT_GI,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -271,7 +284,11 @@ enum txentry_desc_flags {
|
||||
* @length_low: PLCP length low word.
|
||||
* @signal: PLCP signal.
|
||||
* @service: PLCP service.
|
||||
+ * @msc: MCS.
|
||||
+ * @stbc: STBC.
|
||||
+ * @ba_size: BA size.
|
||||
* @rate_mode: Rate mode (See @enum rate_modulation).
|
||||
+ * @mpdu_density: MDPU density.
|
||||
* @retry_limit: Max number of retries.
|
||||
* @aifs: AIFS value.
|
||||
* @ifs: IFS value.
|
||||
@@ -291,7 +308,11 @@ struct txentry_desc {
|
||||
u16 signal;
|
||||
u16 service;
|
||||
|
||||
+ u16 mcs;
|
||||
+ u16 stbc;
|
||||
+ u16 ba_size;
|
||||
u16 rate_mode;
|
||||
+ u16 mpdu_density;
|
||||
|
||||
short retry_limit;
|
||||
short aifs;
|
@ -0,0 +1,52 @@
|
||||
From 690559385626e98e2a91c280a8bca195f071756c Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Tue, 28 Apr 2009 20:12:43 +0200
|
||||
Subject: [PATCH 4/4] rt2x00: Update from rt2860 driver (rt2800pci)
|
||||
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2800pci.c | 10 +++++++---
|
||||
drivers/net/wireless/rt2x00/rt2800pci.h | 2 ++
|
||||
2 files changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -2048,13 +2048,17 @@ static void rt2800pci_disable_radio(stru
|
||||
static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
enum dev_state state)
|
||||
{
|
||||
- rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0);
|
||||
+ /*
|
||||
+ * Always put the device to sleep (even when we intend to wakup!)
|
||||
+ * if the device is booting and wasn't asleep it will return
|
||||
+ * failure when attempting to wakup.
|
||||
+ */
|
||||
+ rt2800pci_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 2);
|
||||
|
||||
if (state == STATE_AWAKE) {
|
||||
rt2800pci_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0);
|
||||
rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKUP);
|
||||
- } else
|
||||
- rt2800pci_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 2);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.h
|
||||
@@ -1714,6 +1714,7 @@ struct mac_iveiv_entry {
|
||||
#define MCU_SLEEP 0x30
|
||||
#define MCU_WAKEUP 0x31
|
||||
#define MCU_RADIO_OFF 0x35
|
||||
+#define MCU_CURRENT 0x36
|
||||
#define MCU_LED 0x50
|
||||
#define MCU_LED_STRENGTH 0x51
|
||||
#define MCU_LED_1 0x52
|
||||
@@ -1722,6 +1723,7 @@ struct mac_iveiv_entry {
|
||||
#define MCU_RADAR 0x60
|
||||
#define MCU_BOOT_SIGNAL 0x72
|
||||
#define MCU_BBP_SIGNAL 0x80
|
||||
+#define MCU_POWER_SAVE 0x83
|
||||
|
||||
/*
|
||||
* MCU mailbox tokens
|
@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -3066,7 +3066,6 @@ static const struct ieee80211_ops rt2800
|
||||
.add_interface = rt2x00mac_add_interface,
|
||||
.remove_interface = rt2x00mac_remove_interface,
|
||||
.config = rt2x00mac_config,
|
||||
- .config_interface = rt2x00mac_config_interface,
|
||||
.configure_filter = rt2x00mac_configure_filter,
|
||||
.set_key = rt2x00mac_set_key,
|
||||
.get_stats = rt2x00mac_get_stats,
|
@ -1,25 +0,0 @@
|
||||
From 7f759a5e56f64fed24e5eb487003ce455786bc31 Mon Sep 17 00:00:00 2001
|
||||
From: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Date: Sat, 28 Mar 2009 20:44:18 +0100
|
||||
Subject: [PATCH 7/9] rt2x00: Add calibration fields to rt2x00dev (rt2x00ht)
|
||||
|
||||
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2x00.h | 6 ++++++
|
||||
1 files changed, 6 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -782,6 +782,12 @@ struct rt2x00_dev {
|
||||
u8 freq_offset;
|
||||
|
||||
/*
|
||||
+ * Calibration information (for rt2800usb).
|
||||
+ */
|
||||
+ u8 calibration_bw20;
|
||||
+ u8 calibration_bw40;
|
||||
+
|
||||
+ /*
|
||||
* Low level statistics which will have
|
||||
* to be kept up to date while device is running.
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath9k/main.c
|
||||
@@ -1031,6 +1031,9 @@ static void ath_unregister_led(struct at
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1020,6 +1020,9 @@ static void ath_unregister_led(struct at
|
||||
|
||||
static void ath_deinit_leds(struct ath_softc *sc)
|
||||
{
|
||||
@ -10,7 +10,7 @@
|
||||
cancel_delayed_work_sync(&sc->ath_led_blink_work);
|
||||
ath_unregister_led(&sc->assoc_led);
|
||||
sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
|
||||
@@ -1045,6 +1048,9 @@ static void ath_init_leds(struct ath_sof
|
||||
@@ -1034,6 +1037,9 @@ static void ath_init_leds(struct ath_sof
|
||||
char *trigger;
|
||||
int ret;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -125,7 +125,7 @@ ifneq ($(CONFIG_PCI),)
|
||||
@@ -124,7 +124,7 @@ ifneq ($(CONFIG_PCI),)
|
||||
CONFIG_ATH5K=m
|
||||
# CONFIG_ATH5K_DEBUG=y
|
||||
CONFIG_ATH9K=m
|
||||
|
@ -1,11 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath9k/hw.c
|
||||
@@ -513,11 +513,18 @@ static int ath9k_hw_init_macaddr(struct
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -534,8 +534,18 @@ static int ath9k_hw_init_macaddr(struct
|
||||
ah->macaddr[2 * i] = eeval >> 8;
|
||||
ah->macaddr[2 * i + 1] = eeval & 0xff;
|
||||
}
|
||||
- if (sum == 0 || sum == 0xffff * 3) {
|
||||
+
|
||||
- if (sum == 0 || sum == 0xffff * 3)
|
||||
- return -EADDRNOTAVAIL;
|
||||
+ if (!is_valid_ether_addr(ah->macaddr)) {
|
||||
+ DECLARE_MAC_BUF(macbuf);
|
||||
+
|
||||
@ -14,12 +14,10 @@
|
||||
+ print_mac(macbuf, ah->macaddr));
|
||||
+
|
||||
+ random_ether_addr(ah->macaddr);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
|
||||
- "mac address read failed: %pM\n",
|
||||
- ah->macaddr);
|
||||
- return -EADDRNOTAVAIL;
|
||||
+ DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
|
||||
+ "random mac address will be used: %s\n",
|
||||
+ print_mac(macbuf, ah->macaddr));
|
||||
}
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,104 +0,0 @@
|
||||
From dd51972ba5d11df434faf9171fe02c0cc48d35c1 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Wed, 29 Apr 2009 08:52:16 +0200
|
||||
Subject: [PATCH] ath9k: uninline ath9k_io{read,write}32 routines
|
||||
|
||||
The spin_lock handling uses lots of instructions on some archs.
|
||||
With this patch the size of the ath9k module will be significantly
|
||||
smaller.
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
Example results on different platforms:
|
||||
|
||||
xscale: 468344 -> 293022 (62.6%)
|
||||
mips32: 549847 -> 389421 (70.8%)
|
||||
mips32r2: 510520 -> 394020 (77.2%)
|
||||
ppc40x: 365153 -> 296928 (81.3%)
|
||||
|
||||
drivers/net/wireless/ath9k/ath9k.h | 33 +------------------------------
|
||||
drivers/net/wireless/ath9k/hw.c | 32 +++++++++++++++++++++++++++++++
|
||||
2 files changed, 34 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath9k/ath9k.h
|
||||
@@ -721,36 +721,7 @@ void ath9k_wiphy_pause_all_forced(struct
|
||||
bool ath9k_wiphy_scanning(struct ath_softc *sc);
|
||||
void ath9k_wiphy_work(struct work_struct *work);
|
||||
|
||||
-/*
|
||||
- * Read and write, they both share the same lock. We do this to serialize
|
||||
- * reads and writes on Atheros 802.11n PCI devices only. This is required
|
||||
- * as the FIFO on these devices can only accept sanely 2 requests. After
|
||||
- * that the device goes bananas. Serializing the reads/writes prevents this
|
||||
- * from happening.
|
||||
- */
|
||||
-
|
||||
-static inline void ath9k_iowrite32(struct ath_hw *ah, u32 reg_offset, u32 val)
|
||||
-{
|
||||
- if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
|
||||
- unsigned long flags;
|
||||
- spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
|
||||
- iowrite32(val, ah->ah_sc->mem + reg_offset);
|
||||
- spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
|
||||
- } else
|
||||
- iowrite32(val, ah->ah_sc->mem + reg_offset);
|
||||
-}
|
||||
-
|
||||
-static inline unsigned int ath9k_ioread32(struct ath_hw *ah, u32 reg_offset)
|
||||
-{
|
||||
- u32 val;
|
||||
- if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
|
||||
- unsigned long flags;
|
||||
- spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
|
||||
- val = ioread32(ah->ah_sc->mem + reg_offset);
|
||||
- spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
|
||||
- } else
|
||||
- val = ioread32(ah->ah_sc->mem + reg_offset);
|
||||
- return val;
|
||||
-}
|
||||
+void ath9k_iowrite32(struct ath_hw *ah, u32 reg_offset, u32 val);
|
||||
+unsigned int ath9k_ioread32(struct ath_hw *ah, u32 reg_offset);
|
||||
|
||||
#endif /* ATH9K_H */
|
||||
--- a/drivers/net/wireless/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath9k/hw.c
|
||||
@@ -84,6 +84,38 @@ static u32 ath9k_hw_mac_to_clks(struct a
|
||||
return ath9k_hw_mac_clks(ah, usecs);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Read and write, they both share the same lock. We do this to serialize
|
||||
+ * reads and writes on Atheros 802.11n PCI devices only. This is required
|
||||
+ * as the FIFO on these devices can only accept sanely 2 requests. After
|
||||
+ * that the device goes bananas. Serializing the reads/writes prevents this
|
||||
+ * from happening.
|
||||
+ */
|
||||
+
|
||||
+void ath9k_iowrite32(struct ath_hw *ah, u32 reg_offset, u32 val)
|
||||
+{
|
||||
+ if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
|
||||
+ unsigned long flags;
|
||||
+ spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
|
||||
+ iowrite32(val, ah->ah_sc->mem + reg_offset);
|
||||
+ spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
|
||||
+ } else
|
||||
+ iowrite32(val, ah->ah_sc->mem + reg_offset);
|
||||
+}
|
||||
+
|
||||
+unsigned int ath9k_ioread32(struct ath_hw *ah, u32 reg_offset)
|
||||
+{
|
||||
+ u32 val;
|
||||
+ if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
|
||||
+ unsigned long flags;
|
||||
+ spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
|
||||
+ val = ioread32(ah->ah_sc->mem + reg_offset);
|
||||
+ spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
|
||||
+ } else
|
||||
+ val = ioread32(ah->ah_sc->mem + reg_offset);
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
|
||||
{
|
||||
int i;
|
@ -1,103 +0,0 @@
|
||||
This patch adds poisoning and sanity checking to the RX DMA buffers.
|
||||
This is used for protection against buggy hardware/firmware that raises
|
||||
RX interrupts without doing an actual DMA transfer.
|
||||
|
||||
This mechanism protects against rare "bad packets" (due to uninitialized skb data)
|
||||
and rare kernel crashes due to uninitialized RX headers.
|
||||
|
||||
The poison is selected to not match on valid frames and to be cheap for checking.
|
||||
|
||||
The poison check mechanism _might_ trigger incorrectly, if we are voluntarily
|
||||
receiving frames with bad PLCP headers. However, this is nonfatal, because the
|
||||
chance of such a match is basically zero and in case it happens it just results
|
||||
in dropping the packet.
|
||||
Bad-PLCP RX defaults to off, and you should leave it off unless you want to listen
|
||||
to the latest news broadcasted by your microwave oven.
|
||||
|
||||
This patch also moves the initialization of the RX-header "length" field in front of
|
||||
the mapping of the DMA buffer. The CPU should not touch the buffer after we mapped it.
|
||||
|
||||
Cc: stable@kernel.org
|
||||
Reported-by: Francesco Gringoli <francesco.gringoli@ing.unibs.it>
|
||||
Signed-off-by: Michael Buesch <mb@bu3sch.de>
|
||||
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/b43/dma.c
|
||||
+++ b/drivers/net/wireless/b43/dma.c
|
||||
@@ -555,11 +555,32 @@ address_error:
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb)
|
||||
+{
|
||||
+ unsigned char *f = skb->data + ring->frameoffset;
|
||||
+
|
||||
+ return ((f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]) == 0xFF);
|
||||
+}
|
||||
+
|
||||
+static void b43_poison_rx_buffer(struct b43_dmaring *ring, struct sk_buff *skb)
|
||||
+{
|
||||
+ struct b43_rxhdr_fw4 *rxhdr;
|
||||
+ unsigned char *frame;
|
||||
+
|
||||
+ /* This poisons the RX buffer to detect DMA failures. */
|
||||
+
|
||||
+ rxhdr = (struct b43_rxhdr_fw4 *)(skb->data);
|
||||
+ rxhdr->frame_len = 0;
|
||||
+
|
||||
+ B43_WARN_ON(ring->rx_buffersize < ring->frameoffset + sizeof(struct b43_plcp_hdr6) + 2);
|
||||
+ frame = skb->data + ring->frameoffset;
|
||||
+ memset(frame, 0xFF, sizeof(struct b43_plcp_hdr6) + 2 /* padding */);
|
||||
+}
|
||||
+
|
||||
static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
||||
struct b43_dmadesc_generic *desc,
|
||||
struct b43_dmadesc_meta *meta, gfp_t gfp_flags)
|
||||
{
|
||||
- struct b43_rxhdr_fw4 *rxhdr;
|
||||
dma_addr_t dmaaddr;
|
||||
struct sk_buff *skb;
|
||||
|
||||
@@ -568,6 +589,7 @@ static int setup_rx_descbuffer(struct b4
|
||||
skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
|
||||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
+ b43_poison_rx_buffer(ring, skb);
|
||||
dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0);
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
|
||||
/* ugh. try to realloc in zone_dma */
|
||||
@@ -578,6 +600,7 @@ static int setup_rx_descbuffer(struct b4
|
||||
skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
|
||||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
+ b43_poison_rx_buffer(ring, skb);
|
||||
dmaaddr = map_descbuffer(ring, skb->data,
|
||||
ring->rx_buffersize, 0);
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
|
||||
@@ -592,9 +615,6 @@ static int setup_rx_descbuffer(struct b4
|
||||
ring->ops->fill_descriptor(ring, desc, dmaaddr,
|
||||
ring->rx_buffersize, 0, 0, 0);
|
||||
|
||||
- rxhdr = (struct b43_rxhdr_fw4 *)(skb->data);
|
||||
- rxhdr->frame_len = 0;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1489,6 +1509,15 @@ static void dma_rx(struct b43_dmaring *r
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
+ if (unlikely(b43_rx_buffer_is_poisoned(ring, skb))) {
|
||||
+ /* Something went wrong with the DMA.
|
||||
+ * The device did not touch the buffer and did not overwrite the poison. */
|
||||
+ b43dbg(ring->dev->wl, "DMA RX: Dropping poisoned buffer.\n");
|
||||
+ /* recycle the descriptor buffer. */
|
||||
+ sync_descbuffer_for_device(ring, meta->dmaaddr,
|
||||
+ ring->rx_buffersize);
|
||||
+ goto drop;
|
||||
+ }
|
||||
if (unlikely(len > ring->rx_buffersize)) {
|
||||
/* The data did not fit into one descriptor buffer
|
||||
* and is split over multiple buffers.
|
@ -1,66 +0,0 @@
|
||||
The RX buffer poison needs to be refreshed, if we recycle an RX buffer,
|
||||
because it might be (partially) overwritten by some DMA operations.
|
||||
|
||||
Cc: stable@kernel.org
|
||||
Cc: Francesco Gringoli <francesco.gringoli@ing.unibs.it>
|
||||
Signed-off-by: Michael Buesch <mb@bu3sch.de>
|
||||
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/b43/dma.c
|
||||
+++ b/drivers/net/wireless/b43/dma.c
|
||||
@@ -1503,20 +1503,16 @@ static void dma_rx(struct b43_dmaring *r
|
||||
len = le16_to_cpu(rxhdr->frame_len);
|
||||
} while (len == 0 && i++ < 5);
|
||||
if (unlikely(len == 0)) {
|
||||
- /* recycle the descriptor buffer. */
|
||||
- sync_descbuffer_for_device(ring, meta->dmaaddr,
|
||||
- ring->rx_buffersize);
|
||||
- goto drop;
|
||||
+ dmaaddr = meta->dmaaddr;
|
||||
+ goto drop_recycle_buffer;
|
||||
}
|
||||
}
|
||||
if (unlikely(b43_rx_buffer_is_poisoned(ring, skb))) {
|
||||
/* Something went wrong with the DMA.
|
||||
* The device did not touch the buffer and did not overwrite the poison. */
|
||||
b43dbg(ring->dev->wl, "DMA RX: Dropping poisoned buffer.\n");
|
||||
- /* recycle the descriptor buffer. */
|
||||
- sync_descbuffer_for_device(ring, meta->dmaaddr,
|
||||
- ring->rx_buffersize);
|
||||
- goto drop;
|
||||
+ dmaaddr = meta->dmaaddr;
|
||||
+ goto drop_recycle_buffer;
|
||||
}
|
||||
if (unlikely(len > ring->rx_buffersize)) {
|
||||
/* The data did not fit into one descriptor buffer
|
||||
@@ -1530,6 +1526,7 @@ static void dma_rx(struct b43_dmaring *r
|
||||
while (1) {
|
||||
desc = ops->idx2desc(ring, *slot, &meta);
|
||||
/* recycle the descriptor buffer. */
|
||||
+ b43_poison_rx_buffer(ring, meta->skb);
|
||||
sync_descbuffer_for_device(ring, meta->dmaaddr,
|
||||
ring->rx_buffersize);
|
||||
*slot = next_slot(ring, *slot);
|
||||
@@ -1548,8 +1545,7 @@ static void dma_rx(struct b43_dmaring *r
|
||||
err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC);
|
||||
if (unlikely(err)) {
|
||||
b43dbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer() failed\n");
|
||||
- sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
|
||||
- goto drop;
|
||||
+ goto drop_recycle_buffer;
|
||||
}
|
||||
|
||||
unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0);
|
||||
@@ -1559,6 +1555,11 @@ static void dma_rx(struct b43_dmaring *r
|
||||
b43_rx(ring->dev, skb, rxhdr);
|
||||
drop:
|
||||
return;
|
||||
+
|
||||
+drop_recycle_buffer:
|
||||
+ /* Poison and recycle the RX buffer. */
|
||||
+ b43_poison_rx_buffer(ring, skb);
|
||||
+ sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
|
||||
}
|
||||
|
||||
void b43_dma_rx(struct b43_dmaring *ring)
|
@ -1,72 +0,0 @@
|
||||
This patch is submitted upstream and can be removed when it hits compat-wireless.
|
||||
|
||||
--mb
|
||||
|
||||
|
||||
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -625,9 +625,11 @@ struct b43_wl {
|
||||
/* Stats about the wireless interface */
|
||||
struct ieee80211_low_level_stats ieee_stats;
|
||||
|
||||
+#ifdef CONFIG_B43_HWRNG
|
||||
struct hwrng rng;
|
||||
- u8 rng_initialized;
|
||||
+ bool rng_initialized;
|
||||
char rng_name[30 + 1];
|
||||
+#endif /* CONFIG_B43_HWRNG */
|
||||
|
||||
/* The RF-kill button */
|
||||
struct b43_rfkill rfkill;
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -2980,6 +2980,7 @@ static void b43_security_init(struct b43
|
||||
b43_clear_keys(dev);
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_B43_HWRNG
|
||||
static int b43_rng_read(struct hwrng *rng, u32 *data)
|
||||
{
|
||||
struct b43_wl *wl = (struct b43_wl *)rng->priv;
|
||||
@@ -2995,17 +2996,21 @@ static int b43_rng_read(struct hwrng *rn
|
||||
|
||||
return (sizeof(u16));
|
||||
}
|
||||
+#endif /* CONFIG_B43_HWRNG */
|
||||
|
||||
static void b43_rng_exit(struct b43_wl *wl)
|
||||
{
|
||||
+#ifdef CONFIG_B43_HWRNG
|
||||
if (wl->rng_initialized)
|
||||
hwrng_unregister(&wl->rng);
|
||||
+#endif /* CONFIG_B43_HWRNG */
|
||||
}
|
||||
|
||||
static int b43_rng_init(struct b43_wl *wl)
|
||||
{
|
||||
- int err;
|
||||
+ int err = 0;
|
||||
|
||||
+#ifdef CONFIG_B43_HWRNG
|
||||
snprintf(wl->rng_name, ARRAY_SIZE(wl->rng_name),
|
||||
"%s_%s", KBUILD_MODNAME, wiphy_name(wl->hw->wiphy));
|
||||
wl->rng.name = wl->rng_name;
|
||||
@@ -3018,6 +3023,7 @@ static int b43_rng_init(struct b43_wl *w
|
||||
b43err(wl, "Failed to register the random "
|
||||
"number generator (%d)\n", err);
|
||||
}
|
||||
+#endif /* CONFIG_B43_HWRNG */
|
||||
|
||||
return err;
|
||||
}
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -148,6 +148,7 @@ CONFIG_ATH9K_DEBUG=y
|
||||
# CONFIG_B43_PIO=y
|
||||
# CONFIG_B43_LEDS=y
|
||||
# CONFIG_B43_RFKILL=y
|
||||
+# CONFIG_B43_HWRNG=y
|
||||
# CONFIG_B43_DEBUG=y
|
||||
# CONFIG_B43_FORCE_PIO=y
|
||||
|
@ -1,173 +0,0 @@
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -778,8 +778,8 @@ struct b43_wldev {
|
||||
/* Reason code of the last interrupt. */
|
||||
u32 irq_reason;
|
||||
u32 dma_reason[6];
|
||||
- /* saved irq enable/disable state bitfield. */
|
||||
- u32 irq_savedstate;
|
||||
+ /* The currently active generic-interrupt mask. */
|
||||
+ u32 irq_mask;
|
||||
/* Link Quality calculation context. */
|
||||
struct b43_noise_calculation noisecalc;
|
||||
/* if > 0 MAC is suspended. if == 0 MAC is enabled. */
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -673,32 +673,6 @@ static void b43_short_slot_timing_disabl
|
||||
b43_set_slot_time(dev, 20);
|
||||
}
|
||||
|
||||
-/* Enable a Generic IRQ. "mask" is the mask of which IRQs to enable.
|
||||
- * Returns the _previously_ enabled IRQ mask.
|
||||
- */
|
||||
-static inline u32 b43_interrupt_enable(struct b43_wldev *dev, u32 mask)
|
||||
-{
|
||||
- u32 old_mask;
|
||||
-
|
||||
- old_mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
|
||||
- b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, old_mask | mask);
|
||||
-
|
||||
- return old_mask;
|
||||
-}
|
||||
-
|
||||
-/* Disable a Generic IRQ. "mask" is the mask of which IRQs to disable.
|
||||
- * Returns the _previously_ enabled IRQ mask.
|
||||
- */
|
||||
-static inline u32 b43_interrupt_disable(struct b43_wldev *dev, u32 mask)
|
||||
-{
|
||||
- u32 old_mask;
|
||||
-
|
||||
- old_mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
|
||||
- b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, old_mask & ~mask);
|
||||
-
|
||||
- return old_mask;
|
||||
-}
|
||||
-
|
||||
/* Synchronize IRQ top- and bottom-half.
|
||||
* IRQs must be masked before calling this.
|
||||
* This must not be called with the irq_lock held.
|
||||
@@ -1593,7 +1567,7 @@ static void handle_irq_beacon(struct b43
|
||||
/* This is the bottom half of the asynchronous beacon update. */
|
||||
|
||||
/* Ignore interrupt in the future. */
|
||||
- dev->irq_savedstate &= ~B43_IRQ_BEACON;
|
||||
+ dev->irq_mask &= ~B43_IRQ_BEACON;
|
||||
|
||||
cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
||||
beacon0_valid = (cmd & B43_MACCMD_BEACON0_VALID);
|
||||
@@ -1602,7 +1576,7 @@ static void handle_irq_beacon(struct b43
|
||||
/* Schedule interrupt manually, if busy. */
|
||||
if (beacon0_valid && beacon1_valid) {
|
||||
b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_BEACON);
|
||||
- dev->irq_savedstate |= B43_IRQ_BEACON;
|
||||
+ dev->irq_mask |= B43_IRQ_BEACON;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1641,11 +1615,9 @@ static void b43_beacon_update_trigger_wo
|
||||
if (likely(dev && (b43_status(dev) >= B43_STAT_INITIALIZED))) {
|
||||
spin_lock_irq(&wl->irq_lock);
|
||||
/* update beacon right away or defer to irq */
|
||||
- dev->irq_savedstate = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
|
||||
handle_irq_beacon(dev);
|
||||
/* The handler might have updated the IRQ mask. */
|
||||
- b43_write32(dev, B43_MMIO_GEN_IRQ_MASK,
|
||||
- dev->irq_savedstate);
|
||||
+ b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
|
||||
mmiowb();
|
||||
spin_unlock_irq(&wl->irq_lock);
|
||||
}
|
||||
@@ -1879,7 +1851,7 @@ static void b43_interrupt_tasklet(struct
|
||||
if (reason & B43_IRQ_TX_OK)
|
||||
handle_irq_transmit_status(dev);
|
||||
|
||||
- b43_interrupt_enable(dev, dev->irq_savedstate);
|
||||
+ b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
|
||||
mmiowb();
|
||||
spin_unlock_irqrestore(&dev->wl->irq_lock, flags);
|
||||
}
|
||||
@@ -1893,7 +1865,9 @@ static void b43_interrupt_ack(struct b43
|
||||
b43_write32(dev, B43_MMIO_DMA2_REASON, dev->dma_reason[2]);
|
||||
b43_write32(dev, B43_MMIO_DMA3_REASON, dev->dma_reason[3]);
|
||||
b43_write32(dev, B43_MMIO_DMA4_REASON, dev->dma_reason[4]);
|
||||
+/* Unused ring
|
||||
b43_write32(dev, B43_MMIO_DMA5_REASON, dev->dma_reason[5]);
|
||||
+*/
|
||||
}
|
||||
|
||||
/* Interrupt handler top-half */
|
||||
@@ -1903,18 +1877,19 @@ static irqreturn_t b43_interrupt_handler
|
||||
struct b43_wldev *dev = dev_id;
|
||||
u32 reason;
|
||||
|
||||
- if (!dev)
|
||||
- return IRQ_NONE;
|
||||
+ B43_WARN_ON(!dev);
|
||||
|
||||
spin_lock(&dev->wl->irq_lock);
|
||||
|
||||
- if (b43_status(dev) < B43_STAT_STARTED)
|
||||
+ if (unlikely(b43_status(dev) < B43_STAT_STARTED)) {
|
||||
+ /* This can only happen on shared IRQ lines. */
|
||||
goto out;
|
||||
+ }
|
||||
reason = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
|
||||
if (reason == 0xffffffff) /* shared IRQ */
|
||||
goto out;
|
||||
ret = IRQ_HANDLED;
|
||||
- reason &= b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
|
||||
+ reason &= dev->irq_mask;
|
||||
if (!reason)
|
||||
goto out;
|
||||
|
||||
@@ -1928,16 +1903,18 @@ static irqreturn_t b43_interrupt_handler
|
||||
& 0x0001DC00;
|
||||
dev->dma_reason[4] = b43_read32(dev, B43_MMIO_DMA4_REASON)
|
||||
& 0x0000DC00;
|
||||
+/* Unused ring
|
||||
dev->dma_reason[5] = b43_read32(dev, B43_MMIO_DMA5_REASON)
|
||||
& 0x0000DC00;
|
||||
+*/
|
||||
|
||||
b43_interrupt_ack(dev, reason);
|
||||
/* disable all IRQs. They are enabled again in the bottom half. */
|
||||
- dev->irq_savedstate = b43_interrupt_disable(dev, B43_IRQ_ALL);
|
||||
+ b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
|
||||
/* save the reason code and call our bottom half. */
|
||||
dev->irq_reason = reason;
|
||||
tasklet_schedule(&dev->isr_tasklet);
|
||||
- out:
|
||||
+out:
|
||||
mmiowb();
|
||||
spin_unlock(&dev->wl->irq_lock);
|
||||
|
||||
@@ -3799,7 +3776,7 @@ static void b43_wireless_core_stop(struc
|
||||
* setting the status to INITIALIZED, as the interrupt handler
|
||||
* won't care about IRQs then. */
|
||||
spin_lock_irqsave(&wl->irq_lock, flags);
|
||||
- dev->irq_savedstate = b43_interrupt_disable(dev, B43_IRQ_ALL);
|
||||
+ b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
|
||||
b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* flush */
|
||||
spin_unlock_irqrestore(&wl->irq_lock, flags);
|
||||
b43_synchronize_irq(dev);
|
||||
@@ -3840,7 +3817,7 @@ static int b43_wireless_core_start(struc
|
||||
|
||||
/* Start data flow (TX/RX). */
|
||||
b43_mac_enable(dev);
|
||||
- b43_interrupt_enable(dev, dev->irq_savedstate);
|
||||
+ b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
|
||||
|
||||
/* Start maintainance work */
|
||||
b43_periodic_tasks_setup(dev);
|
||||
@@ -3998,9 +3975,9 @@ static void setup_struct_wldev_for_init(
|
||||
/* IRQ related flags */
|
||||
dev->irq_reason = 0;
|
||||
memset(dev->dma_reason, 0, sizeof(dev->dma_reason));
|
||||
- dev->irq_savedstate = B43_IRQ_MASKTEMPLATE;
|
||||
+ dev->irq_mask = B43_IRQ_MASKTEMPLATE;
|
||||
if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
|
||||
- dev->irq_savedstate &= ~B43_IRQ_PHY_TXERR;
|
||||
+ dev->irq_mask &= ~B43_IRQ_PHY_TXERR;
|
||||
|
||||
dev->mac_suspended = 1;
|
||||
|
198
package/mac80211/patches/540-b43-Add-fw-capabilities.patch
Normal file
198
package/mac80211/patches/540-b43-Add-fw-capabilities.patch
Normal file
@ -0,0 +1,198 @@
|
||||
Completely untested patch to implement firmware capabilities
|
||||
and automagic QoS-disabling.
|
||||
|
||||
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -163,6 +163,7 @@ enum {
|
||||
#define B43_SHM_SH_WLCOREREV 0x0016 /* 802.11 core revision */
|
||||
#define B43_SHM_SH_PCTLWDPOS 0x0008
|
||||
#define B43_SHM_SH_RXPADOFF 0x0034 /* RX Padding data offset (PIO only) */
|
||||
+#define B43_SHM_SH_FWCAPA 0x0042 /* Firmware capabilities (Opensource firmware only) */
|
||||
#define B43_SHM_SH_PHYVER 0x0050 /* PHY version */
|
||||
#define B43_SHM_SH_PHYTYPE 0x0052 /* PHY type */
|
||||
#define B43_SHM_SH_ANTSWAP 0x005C /* Antenna swap threshold */
|
||||
@@ -297,6 +298,10 @@ enum {
|
||||
#define B43_HF_MLADVW 0x001000000000ULL /* N PHY ML ADV workaround (rev >= 13 only) */
|
||||
#define B43_HF_PR45960W 0x080000000000ULL /* PR 45960 workaround (rev >= 13 only) */
|
||||
|
||||
+/* Firmware capabilities field in SHM (Opensource firmware only) */
|
||||
+#define B43_FWCAPA_HWCRYPTO 0x0001
|
||||
+#define B43_FWCAPA_QOS 0x0002
|
||||
+
|
||||
/* MacFilter offsets. */
|
||||
#define B43_MACFILTER_SELF 0x0000
|
||||
#define B43_MACFILTER_BSSID 0x0003
|
||||
@@ -596,6 +601,13 @@ struct b43_wl {
|
||||
/* Pointer to the ieee80211 hardware data structure */
|
||||
struct ieee80211_hw *hw;
|
||||
|
||||
+ /* The number of queues that were registered with the mac80211 subsystem
|
||||
+ * initially. This is a backup copy of hw->queues in case hw->queues has
|
||||
+ * to be dynamically lowered at runtime (Firmware does not support QoS).
|
||||
+ * hw->queues has to be restored to the original value before unregistering
|
||||
+ * from the mac80211 subsystem. */
|
||||
+ u16 mac80211_initially_registered_queues;
|
||||
+
|
||||
struct mutex mutex;
|
||||
spinlock_t irq_lock;
|
||||
/* R/W lock for data transmission.
|
||||
@@ -752,6 +764,8 @@ struct b43_wldev {
|
||||
bool dfq_valid; /* Directed frame queue valid (IBSS PS mode, ATIM) */
|
||||
bool radio_hw_enable; /* saved state of radio hardware enabled state */
|
||||
bool suspend_in_progress; /* TRUE, if we are in a suspend/resume cycle */
|
||||
+ bool qos_enabled; /* TRUE, if QoS is used. */
|
||||
+ bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||
|
||||
/* PHY/Radio device. */
|
||||
struct b43_phy phy;
|
||||
--- a/drivers/net/wireless/b43/dma.c
|
||||
+++ b/drivers/net/wireless/b43/dma.c
|
||||
@@ -1285,7 +1285,7 @@ static struct b43_dmaring *select_ring_b
|
||||
{
|
||||
struct b43_dmaring *ring;
|
||||
|
||||
- if (b43_modparam_qos) {
|
||||
+ if (dev->qos_enabled) {
|
||||
/* 0 = highest priority */
|
||||
switch (queue_prio) {
|
||||
default:
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -80,8 +80,8 @@ static int modparam_nohwcrypt;
|
||||
module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
|
||||
|
||||
-int b43_modparam_qos = 1;
|
||||
-module_param_named(qos, b43_modparam_qos, int, 0444);
|
||||
+static int modparam_qos = 1;
|
||||
+module_param_named(qos, modparam_qos, int, 0444);
|
||||
MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
|
||||
|
||||
static int modparam_btcoex = 1;
|
||||
@@ -538,6 +538,13 @@ void b43_hf_write(struct b43_wldev *dev,
|
||||
b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFHI, hi);
|
||||
}
|
||||
|
||||
+/* Read the firmware capabilities bitmask (Opensource firmware only) */
|
||||
+static u16 b43_fwcapa_read(struct b43_wldev *dev)
|
||||
+{
|
||||
+ B43_WARN_ON(!dev->fw.opensource);
|
||||
+ return b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_FWCAPA);
|
||||
+}
|
||||
+
|
||||
void b43_tsf_read(struct b43_wldev *dev, u64 *tsf)
|
||||
{
|
||||
u32 low, high;
|
||||
@@ -2307,12 +2314,34 @@ static int b43_upload_microcode(struct b
|
||||
dev->fw.patch = fwpatch;
|
||||
dev->fw.opensource = (fwdate == 0xFFFF);
|
||||
|
||||
+ /* Default to use-all-queues. */
|
||||
+ dev->wl->hw->queues = dev->wl->mac80211_initially_registered_queues;
|
||||
+ dev->qos_enabled = !!modparam_qos;
|
||||
+ /* Default to firmware/hardware crypto acceleration. */
|
||||
+ dev->hwcrypto_enabled = 1;
|
||||
+
|
||||
if (dev->fw.opensource) {
|
||||
+ u16 fwcapa;
|
||||
+
|
||||
/* Patchlevel info is encoded in the "time" field. */
|
||||
dev->fw.patch = fwtime;
|
||||
- b43info(dev->wl, "Loading OpenSource firmware version %u.%u%s\n",
|
||||
- dev->fw.rev, dev->fw.patch,
|
||||
- dev->fw.pcm_request_failed ? " (Hardware crypto not supported)" : "");
|
||||
+ b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n",
|
||||
+ dev->fw.rev, dev->fw.patch);
|
||||
+
|
||||
+ fwcapa = b43_fwcapa_read(dev);
|
||||
+ if (!(fwcapa & B43_FWCAPA_HWCRYPTO) || dev->fw.pcm_request_failed) {
|
||||
+ b43info(dev->wl, "Hardware crypto acceleration not supported by firmware\n");
|
||||
+ /* Disable hardware crypto and fall back to software crypto. */
|
||||
+ dev->hwcrypto_enabled = 0;
|
||||
+ }
|
||||
+ if (!(fwcapa & B43_FWCAPA_QOS)) {
|
||||
+ b43info(dev->wl, "QoS not supported by firmware\n");
|
||||
+ /* Disable QoS. Tweak hw->queues to 1. It will be restored before
|
||||
+ * ieee80211_unregister to make sure the networking core can
|
||||
+ * properly free possible resources. */
|
||||
+ dev->wl->hw->queues = 1;
|
||||
+ dev->qos_enabled = 0;
|
||||
+ }
|
||||
} else {
|
||||
b43info(dev->wl, "Loading firmware version %u.%u "
|
||||
"(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
|
||||
@@ -3629,7 +3658,7 @@ static int b43_op_set_key(struct ieee802
|
||||
if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
|
||||
goto out_unlock;
|
||||
|
||||
- if (dev->fw.pcm_request_failed) {
|
||||
+ if (dev->fw.pcm_request_failed || !dev->hwcrypto_enabled) {
|
||||
/* We don't have firmware for the crypto engine.
|
||||
* Must use software-crypto. */
|
||||
err = -EOPNOTSUPP;
|
||||
@@ -4737,6 +4766,7 @@ static int b43_wireless_init(struct ssb_
|
||||
b43err(NULL, "Could not allocate ieee80211 device\n");
|
||||
goto out;
|
||||
}
|
||||
+ wl = hw_to_b43_wl(hw);
|
||||
|
||||
/* fill hw info */
|
||||
hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
|
||||
@@ -4750,7 +4780,8 @@ static int b43_wireless_init(struct ssb_
|
||||
BIT(NL80211_IFTYPE_WDS) |
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
|
||||
- hw->queues = b43_modparam_qos ? 4 : 1;
|
||||
+ hw->queues = modparam_qos ? 4 : 1;
|
||||
+ wl->mac80211_initially_registered_queues = hw->queues;
|
||||
hw->max_rates = 2;
|
||||
SET_IEEE80211_DEV(hw, dev->dev);
|
||||
if (is_valid_ether_addr(sprom->et1mac))
|
||||
@@ -4758,9 +4789,7 @@ static int b43_wireless_init(struct ssb_
|
||||
else
|
||||
SET_IEEE80211_PERM_ADDR(hw, sprom->il0mac);
|
||||
|
||||
- /* Get and initialize struct b43_wl */
|
||||
- wl = hw_to_b43_wl(hw);
|
||||
- memset(wl, 0, sizeof(*wl));
|
||||
+ /* Initialize struct b43_wl */
|
||||
wl->hw = hw;
|
||||
spin_lock_init(&wl->irq_lock);
|
||||
rwlock_init(&wl->tx_lock);
|
||||
@@ -4826,8 +4855,13 @@ static void b43_remove(struct ssb_device
|
||||
cancel_work_sync(&wldev->restart_work);
|
||||
|
||||
B43_WARN_ON(!wl);
|
||||
- if (wl->current_dev == wldev)
|
||||
+ if (wl->current_dev == wldev) {
|
||||
+ /* Restore the queues count before unregistering, because firmware detect
|
||||
+ * might have modified it. Restoring is important, so the networking
|
||||
+ * stack can properly free resources. */
|
||||
+ wl->hw->queues = wl->mac80211_initially_registered_queues;
|
||||
ieee80211_unregister_hw(wl->hw);
|
||||
+ }
|
||||
|
||||
b43_one_core_detach(dev);
|
||||
|
||||
--- a/drivers/net/wireless/b43/main.h
|
||||
+++ b/drivers/net/wireless/b43/main.h
|
||||
@@ -39,7 +39,6 @@
|
||||
#define PAD_BYTES(nr_bytes) P4D_BYTES( __LINE__ , (nr_bytes))
|
||||
|
||||
|
||||
-extern int b43_modparam_qos;
|
||||
extern int b43_modparam_verbose;
|
||||
|
||||
/* Logmessage verbosity levels. Update the b43_modparam_verbose helptext, if
|
||||
--- a/drivers/net/wireless/b43/pio.c
|
||||
+++ b/drivers/net/wireless/b43/pio.c
|
||||
@@ -313,7 +313,7 @@ static struct b43_pio_txqueue *select_qu
|
||||
{
|
||||
struct b43_pio_txqueue *q;
|
||||
|
||||
- if (b43_modparam_qos) {
|
||||
+ if (dev->qos_enabled) {
|
||||
/* 0 = highest priority */
|
||||
switch (queue_prio) {
|
||||
default:
|
16
package/mac80211/patches/600-p54usb_without_pm_support.patch
Normal file
16
package/mac80211/patches/600-p54usb_without_pm_support.patch
Normal file
@ -0,0 +1,16 @@
|
||||
Fixes compile error when CONFIG_PM=n is set
|
||||
|
||||
--- a/drivers/net/wireless/p54/p54usb.c
|
||||
+++ b/drivers/net/wireless/p54/p54usb.c
|
||||
@@ -919,9 +919,11 @@ static int __devinit p54u_probe(struct u
|
||||
priv->common.open = p54u_open;
|
||||
priv->common.stop = p54u_stop;
|
||||
if (recognized_pipes < P54U_PIPE_NUMBER) {
|
||||
+#ifdef CONFIG_PM
|
||||
/* ISL3887 needs a full reset on resume */
|
||||
udev->reset_resume = 1;
|
||||
err = p54u_device_reset(dev);
|
||||
+#endif
|
||||
|
||||
priv->hw_type = P54U_3887;
|
||||
dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
|
Loading…
Reference in New Issue
Block a user