mac80211: upgrade to latest compat-wireless, fix ad-hoc interface setup

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@18023 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
Felix Fietkau 2009-10-11 00:36:23 +00:00
parent 089ce4376d
commit 3a81e25e02
14 changed files with 82 additions and 291 deletions

View File

@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mac80211 PKG_NAME:=mac80211
PKG_VERSION:=2009-08-20 PKG_VERSION:=2009-10-09
PKG_RELEASE:=2 PKG_RELEASE:=1
PKG_SOURCE_URL:= \ PKG_SOURCE_URL:= \
http://www.orbit-lab.org/kernel/compat-wireless-2.6/2009/08 \ http://www.orbit-lab.org/kernel/compat-wireless-2.6/2009/09 \
http://wireless.kernel.org/download/compat-wireless-2.6 http://wireless.kernel.org/download/compat-wireless-2.6
PKG_MD5SUM:=0b3919adf847a59478cc4fb58e1cb6ec PKG_MD5SUM:=15c310560765cbc35ed930fb0e815284
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@ -315,8 +315,10 @@ define KernelPackage/ath9k
TITLE:=Atheros 802.11n wireless cards support TITLE:=Atheros 802.11n wireless cards support
URL:=http://linuxwireless.org/en/users/Drivers/ath9k URL:=http://linuxwireless.org/en/users/Drivers/ath9k
DEPENDS+= +kmod-ath DEPENDS+= +kmod-ath
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.$(LINUX_KMOD_SUFFIX) FILES:= \
AUTOLOAD:=$(call AutoLoad,27,ath9k) $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.$(LINUX_KMOD_SUFFIX) \
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.$(LINUX_KMOD_SUFFIX)
AUTOLOAD:=$(call AutoLoad,27,ath9k_hw ath9k)
endef endef
define KernelPackage/ath9k/description define KernelPackage/ath9k/description
@ -450,6 +452,8 @@ define KernelPackage/b43-common
$(call KernelPackage/mac80211/Default) $(call KernelPackage/mac80211/Default)
TITLE:=Generic stuff for Broadcom wireless devices TITLE:=Generic stuff for Broadcom wireless devices
URL:=http://linuxwireless.org/en/users/Drivers/b43 URL:=http://linuxwireless.org/en/users/Drivers/b43
KCONFIG:= \
CONFIG_HW_RANDOM=y
DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb
endef endef
@ -486,7 +490,7 @@ BUILDFLAGS:= \
$(if $(CONFIG_PCI),-DCONFIG_SSB_PCIHOST_POSSIBLE -DCONFIG_SSB_PCIHOST) \ $(if $(CONFIG_PCI),-DCONFIG_SSB_PCIHOST_POSSIBLE -DCONFIG_SSB_PCIHOST) \
$(if $(CONFIG_PCI),-DCONFIG_SSB_SPROM) \ $(if $(CONFIG_PCI),-DCONFIG_SSB_SPROM) \
$(if $(CONFIG_LEDS_TRIGGERS), -DCONFIG_MAC80211_LEDS -DCONFIG_LEDS_TRIGGERS -DCONFIG_B43_LEDS -DCONFIG_B43LEGACY_LEDS -DCONFIG_AR9170_LEDS) \ $(if $(CONFIG_LEDS_TRIGGERS), -DCONFIG_MAC80211_LEDS -DCONFIG_LEDS_TRIGGERS -DCONFIG_B43_LEDS -DCONFIG_B43LEGACY_LEDS -DCONFIG_AR9170_LEDS) \
$(if $(CONFIG_HW_RANDOM),-DCONFIG_B43_HWRNG -DCONFIG_B43LEGACY_HWRNG) \ -DCONFIG_B43_HWRNG -DCONFIG_B43LEGACY_HWRNG \
$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),-DCONFIG_MAC80211_DEBUGFS) \ $(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),-DCONFIG_MAC80211_DEBUGFS) \
$(if $(CONFIG_PACKAGE_ATH9K_DEBUG),-DCONFIG_ATH9K_DEBUG) \ $(if $(CONFIG_PACKAGE_ATH9K_DEBUG),-DCONFIG_ATH9K_DEBUG) \
-D__CONFIG_MAC80211_RC_DEFAULT=minstrel \ -D__CONFIG_MAC80211_RC_DEFAULT=minstrel \

View File

@ -66,7 +66,11 @@ disable_mac80211() (
return 0 return 0
) )
get_freq() {
local phy="$1"
local channel="$2"
iw "$phy" info | grep -E -m1 "(\* ${channel:-....} MHz${channel:+|\\[$channel\\]})" | grep MHz | awk '{print $2}'
}
enable_mac80211() { enable_mac80211() {
local device="$1" local device="$1"
config_get channel "$device" channel config_get channel "$device" channel
@ -76,6 +80,9 @@ enable_mac80211() {
config_get phy "$device" phy config_get phy "$device" phy
local i=0 local i=0
# convert channel to frequency
local freq="$(get_freq "$phy" "$channel")"
wifi_fixup_hwmode "$device" "g" wifi_fixup_hwmode "$device" "g"
for vif in $vifs; do for vif in $vifs; do
while [ -d "/sys/class/net/wlan$i" ]; do while [ -d "/sys/class/net/wlan$i" ]; do
@ -134,7 +141,7 @@ enable_mac80211() {
# We attempt to set teh channel for all interfaces, although # We attempt to set teh channel for all interfaces, although
# mac80211 may not support it or the driver might not yet # mac80211 may not support it or the driver might not yet
iw dev "$ifname" set channel "$channel" [ -z "$channel" ] || iw dev "$ifname" set channel "$channel"
local key keystring local key keystring
@ -213,7 +220,11 @@ enable_mac80211() {
} }
fi fi
;; ;;
sta|mesh|adhoc) adhoc)
config_get bssid "$vif" bssid
iw dev "$ifname" ibss join "$ssid" ${freq:+$freq fixed-freq} $bssid
;;
sta|mesh)
# Fixup... sometimes you have to scan to get beaconing going # Fixup... sometimes you have to scan to get beaconing going
iw dev "$ifname" scan &> /dev/null iw dev "$ifname" scan &> /dev/null
case "$enc" in case "$enc" in

View File

@ -1,155 +0,0 @@
--- a/config.mk
+++ b/config.mk
@@ -17,15 +17,19 @@ ifeq ($(CONFIG_MAC80211),y)
$(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular")
endif
+
# We will warn when you don't have MQ support or NET_SCHED enabled.
#
# We could consider just quiting if MQ and NET_SCHED is disabled
# as I suspect all users of this package want 802.11e (WME) and
# 802.11n (HT) support.
-ifeq ($(shell test -e $(KLIB_BUILD)/Makefile && echo yes),yes)
-KERNEL_SUBLEVEL = $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^2\.6\.\([0-9]\+\).*/\1/p')
+ifneq ($(wildcard $(KLIB_BUILD)/Makefile),)
+COMPAT_LATEST_VERSION = 32
+KERNEL_SUBLEVEL := $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^2\.6\.\([0-9]\+\).*/\1/p')
+COMPAT_VERSIONS := $(shell I=$(COMPAT_LATEST_VERSION); while [ "$$I" -gt $(KERNEL_SUBLEVEL) ]; do echo $$I; I=$$(($$I - 1)); done)
+$(foreach ver,$(COMPAT_VERSIONS),$(eval CONFIG_COMPAT_WIRELESS_$(ver)=y))
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -lt 25 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_25
$(error "ERROR: You should use compat-wireless-2.6-old for older kernels, this one is for kernels >= 2.6.25")
endif
@@ -34,56 +38,10 @@ $(error "ERROR: your kernel has CONFIG_C
endif
-# Compat wireless compat-2.6.2x.c files gets selected here
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 21 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_22=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 22 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_23=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 23 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_24=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 24 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_25=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 25 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_26=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 26 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_27=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 27 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_28=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 28 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_29=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 29 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_30=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 30 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_31=y
-endif
-
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 31 && echo yes),yes)
-CONFIG_COMPAT_WIRELESS_32=y
-endif
-
# 2.6.27 has FTRACE_DYNAMIC borked, so we will complain if
# you have it enabled, otherwise you will very likely run into
# a kernel panic.
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -eq 27 && echo yes),yes)
+ifeq ($(KERNEL_SUBLEVEL),27)
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
$(error "ERROR: Your 2.6.27 kernel has CONFIG_DYNAMIC_FTRACE, please upgrade your distribution kernel as newer ones should not have this enabled (and if so report a bug) or remove this warning if you know what you are doing")
endif
@@ -291,7 +249,7 @@ endif
ifneq ($(CONFIG_PCMCIA),)
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 26 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_27
CONFIG_LIBERTAS=n
CONFIG_LIBERTAS_CS=n
else
@@ -327,7 +285,7 @@ CONFIG_RTL8187=m
CONFIG_AT76C50X_USB=m
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -ge 28 && echo yes),yes)
+ifndef CONFIG_COMPAT_WIRELESS_28
CONFIG_AR9170_USB=m
CONFIG_AR9170_LEDS=y
endif
@@ -343,7 +301,7 @@ CONFIG_RT73USB=m
NEED_RT2X00_FIRMWARE=y
endif
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 26 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_27
CONFIG_LIBERTAS_THINFIRM_USB=n
CONFIG_LIBERTAS_USB=n
NEED_LIBERTAS=n
@@ -360,7 +318,7 @@ ifneq ($(CONFIG_SPI_MASTER),)
CONFIG_WL1251=m
CONFIG_P54_SPI=m
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 26 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_27
CONFIG_LIBERTAS_SPI=n
NEED_LIBERTAS=n
else
@@ -372,7 +330,7 @@ endif # end of SPI driver list
ifneq ($(CONFIG_MMC),)
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 26 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_27
CONFIG_LIBERTAS_SDIO=n
NEED_LIBERTAS=n
else
@@ -382,7 +340,7 @@ endif
# Activate iwmc3200wifi support only on kernel >= 2.6.29.
# iwmc3200wifi uses new netdev_ops api no supported by old kernel.
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -ge 29 && echo yes),yes)
+ifndef CONFIG_COMPAT_WIRELESS_29
CONFIG_IWM=m
# CONFIG_IWM_DEBUG=y
endif
@@ -425,7 +383,7 @@ CONFIG_SSB=m
CONFIG_SSB_SPROM=y
# CONFIG_SSB_DEBUG=y
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 26 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_27
CONFIG_LIBERTAS=n
else
ifeq ($(NEED_LIBERTAS),y)
@@ -437,7 +395,7 @@ endif
# We need the backported rfkill module on kernel < 2.6.31.
# In more recent kernel versions use the in kernel rfkill module.
-ifeq ($(shell test $(KERNEL_SUBLEVEL) -le 30 && echo yes),yes)
+ifdef CONFIG_COMPAT_WIRELESS_31
CONFIG_RFKILL_BACKPORT=m
CONFIG_RFKILL_BACKPORT_LEDS=y
CONFIG_RFKILL_BACKPORT_INPUT=y

View File

@ -1,14 +1,15 @@
--- a/config.mk --- a/config.mk
+++ b/config.mk +++ b/config.mk
@@ -127,14 +127,14 @@ ifneq ($(CONFIG_PCI),) @@ -145,7 +145,7 @@ ifneq ($(CONFIG_PCI),)
CONFIG_ATH5K=m CONFIG_ATH5K=m
# CONFIG_ATH5K_DEBUG=y # CONFIG_ATH5K_DEBUG=y
-CONFIG_ATH5K_RFKILL=y -CONFIG_ATH5K_RFKILL=y
+# CONFIG_ATH5K_RFKILL=y +# CONFIG_ATH5K_RFKILL=y
CONFIG_ATH9K_HW=m
CONFIG_ATH9K=m CONFIG_ATH9K=m
# CONFIG_ATH9K_DEBUG=y # CONFIG_ATH9K_DEBUG=y
@@ -153,7 +153,7 @@ CONFIG_ATH9K=m
CONFIG_IWLWIFI=m CONFIG_IWLWIFI=m
CONFIG_IWLWIFI_LEDS=y CONFIG_IWLWIFI_LEDS=y
@ -17,7 +18,7 @@
CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT=y CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT=y
# CONFIG_IWLWIFI_DEBUG=y # CONFIG_IWLWIFI_DEBUG=y
# CONFIG_IWLWIFI_DEBUGFS=y # CONFIG_IWLWIFI_DEBUGFS=y
@@ -154,7 +154,7 @@ CONFIG_B43_PCMCIA=y @@ -173,7 +173,7 @@ CONFIG_B43_PCMCIA=y
endif endif
CONFIG_B43_PIO=y CONFIG_B43_PIO=y
CONFIG_B43_LEDS=y CONFIG_B43_LEDS=y
@ -26,7 +27,7 @@
CONFIG_B43_PHY_LP=y CONFIG_B43_PHY_LP=y
# CONFIG_B43_DEBUG=y # CONFIG_B43_DEBUG=y
# CONFIG_B43_FORCE_PIO=y # CONFIG_B43_FORCE_PIO=y
@@ -164,7 +164,7 @@ CONFIG_B43LEGACY_HWRNG=y @@ -183,7 +183,7 @@ CONFIG_B43LEGACY_HWRNG=y
CONFIG_B43LEGACY_PCI_AUTOSELECT=y CONFIG_B43LEGACY_PCI_AUTOSELECT=y
CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
CONFIG_B43LEGACY_LEDS=y CONFIG_B43LEGACY_LEDS=y
@ -35,7 +36,7 @@
# CONFIG_B43LEGACY_DEBUG=y # CONFIG_B43LEGACY_DEBUG=y
CONFIG_B43LEGACY_DMA=y CONFIG_B43LEGACY_DMA=y
CONFIG_B43LEGACY_PIO=y CONFIG_B43LEGACY_PIO=y
@@ -354,7 +354,7 @@ CONFIG_RT2X00_LIB=m @@ -373,7 +373,7 @@ CONFIG_RT2X00_LIB=m
CONFIG_RT2X00_LIB_HT=y CONFIG_RT2X00_LIB_HT=y
CONFIG_RT2X00_LIB_FIRMWARE=y CONFIG_RT2X00_LIB_FIRMWARE=y
CONFIG_RT2X00_LIB_CRYPTO=y CONFIG_RT2X00_LIB_CRYPTO=y
@ -44,7 +45,7 @@
CONFIG_RT2X00_LIB_LEDS=y CONFIG_RT2X00_LIB_LEDS=y
# CONFIG_RT2X00_LIB_DEBUGFS=y # CONFIG_RT2X00_LIB_DEBUGFS=y
# CONFIG_RT2X00_DEBUG=y # CONFIG_RT2X00_DEBUG=y
@@ -396,8 +396,8 @@ endif @@ -415,8 +415,8 @@ endif
# We need the backported rfkill module on kernel < 2.6.31. # We need the backported rfkill module on kernel < 2.6.31.
# In more recent kernel versions use the in kernel rfkill module. # In more recent kernel versions use the in kernel rfkill module.
ifdef CONFIG_COMPAT_WIRELESS_31 ifdef CONFIG_COMPAT_WIRELESS_31

View File

@ -6,5 +6,5 @@
obj-m += \ obj-m += \
- drivers/ssb/ \ - drivers/ssb/ \
drivers/misc/eeprom/ \ drivers/misc/eeprom/ \
drivers/net/ \
drivers/net/usb/ \ drivers/net/usb/ \
drivers/net/wireless/

View File

@ -1,6 +1,6 @@
--- a/config.mk --- a/config.mk
+++ b/config.mk +++ b/config.mk
@@ -135,12 +135,12 @@ CONFIG_B43_HWRNG=y @@ -154,12 +154,12 @@ CONFIG_B43_HWRNG=y
CONFIG_B43_PCI_AUTOSELECT=y CONFIG_B43_PCI_AUTOSELECT=y
CONFIG_B43_PCICORE_AUTOSELECT=y CONFIG_B43_PCICORE_AUTOSELECT=y
ifneq ($(CONFIG_PCMCIA),) ifneq ($(CONFIG_PCMCIA),)
@ -16,7 +16,7 @@
# CONFIG_B43_DEBUG=y # CONFIG_B43_DEBUG=y
# CONFIG_B43_FORCE_PIO=y # CONFIG_B43_FORCE_PIO=y
@@ -189,8 +189,8 @@ CONFIG_SSB_PCIHOST_POSSIBLE=y @@ -208,8 +208,8 @@ CONFIG_SSB_PCIHOST_POSSIBLE=y
CONFIG_SSB_PCIHOST=y CONFIG_SSB_PCIHOST=y
CONFIG_SSB_B43_PCI_BRIDGE=y CONFIG_SSB_B43_PCI_BRIDGE=y
ifneq ($(CONFIG_PCMCIA),) ifneq ($(CONFIG_PCMCIA),)

View File

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ar9170/usb.c --- a/drivers/net/wireless/ath/ar9170/usb.c
+++ b/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c
@@ -96,6 +96,225 @@ static struct usb_device_id ar9170_usb_i @@ -98,6 +98,225 @@ static struct usb_device_id ar9170_usb_i
}; };
MODULE_DEVICE_TABLE(usb, ar9170_usb_ids); MODULE_DEVICE_TABLE(usb, ar9170_usb_ids);
@ -510,6 +510,6 @@
-extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor); -extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor);
- -
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)) */ #define DIV_ROUND_CLOSEST(x, divisor)( \
{ \
#endif /* LINUX_26_29_COMPAT_H */ typeof(divisor) __divisor = divisor; \

View File

@ -22,7 +22,7 @@
#include <linux/rfkill_backport.h> #include <linux/rfkill_backport.h>
--- a/include/linux/rfkill_backport.h --- a/include/linux/rfkill_backport.h
+++ b/include/linux/rfkill_backport.h +++ b/include/linux/rfkill_backport.h
@@ -149,7 +149,7 @@ struct rfkill_ops { @@ -146,7 +146,7 @@ struct rfkill_ops {
int (*set_block)(void *data, bool blocked); int (*set_block)(void *data, bool blocked);
}; };

View File

@ -1,98 +0,0 @@
Subject: cfg80211: check lost scans later, fix bug
When we lose a scan, cfg80211 tries to clean up after
the driver. However, it currently does this too early,
it does this in GOING_DOWN already instead of DOWN, so
it may happen with mac80211. Besides fixing this, also
make it more robust by leaking the scan request so if
the driver later actually finishes the scan, it won't
crash. Also check in ___cfg80211_scan_done whether a
scan request is still pending and exit if not.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
net/wireless/core.c | 4 +++-
net/wireless/core.h | 2 +-
net/wireless/scan.c | 19 ++++++++++++++++---
3 files changed, 20 insertions(+), 5 deletions(-)
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -664,7 +664,7 @@ static void wdev_cleanup_work(struct wor
if (WARN_ON(rdev->scan_req && rdev->scan_req->dev == wdev->netdev)) {
rdev->scan_req->aborted = true;
- ___cfg80211_scan_done(rdev);
+ ___cfg80211_scan_done(rdev, true);
}
cfg80211_unlock_rdev(rdev);
@@ -755,6 +755,8 @@ static int cfg80211_netdev_notifier_call
default:
break;
}
+ break;
+ case NETDEV_DOWN:
dev_hold(dev);
schedule_work(&wdev->cleanup_work);
break;
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -374,7 +374,7 @@ void cfg80211_sme_scan_done(struct net_d
void cfg80211_sme_rx_auth(struct net_device *dev, const u8 *buf, size_t len);
void cfg80211_sme_disassoc(struct net_device *dev, int idx);
void __cfg80211_scan_done(struct work_struct *wk);
-void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev);
+void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak);
void cfg80211_upload_connect_keys(struct wireless_dev *wdev);
struct ieee80211_channel *
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -18,7 +18,7 @@
#define IEEE80211_SCAN_RESULT_EXPIRE (15 * HZ)
-void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev)
+void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak)
{
struct cfg80211_scan_request *request;
struct net_device *dev;
@@ -28,6 +28,9 @@ void ___cfg80211_scan_done(struct cfg802
request = rdev->scan_req;
+ if (!request)
+ return;
+
dev = request->dev;
/*
@@ -53,7 +56,17 @@ void ___cfg80211_scan_done(struct cfg802
dev_put(dev);
rdev->scan_req = NULL;
- kfree(request);
+
+ /*
+ * OK. If this is invoked with "leak" then we can't
+ * free this ... but we've cleaned it up anyway. The
+ * driver failed to call the scan_done callback, so
+ * all bets are off, it might still be trying to use
+ * the scan request or not ... if it accesses the dev
+ * in there (it shouldn't anyway) then it may crash.
+ */
+ if (!leak)
+ kfree(request);
}
void __cfg80211_scan_done(struct work_struct *wk)
@@ -64,7 +77,7 @@ void __cfg80211_scan_done(struct work_st
scan_done_wk);
cfg80211_lock_rdev(rdev);
- ___cfg80211_scan_done(rdev);
+ ___cfg80211_scan_done(rdev, false);
cfg80211_unlock_rdev(rdev);
}

View File

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath5k/reset.c --- a/drivers/net/wireless/ath/ath5k/reset.c
+++ b/drivers/net/wireless/ath/ath5k/reset.c +++ b/drivers/net/wireless/ath/ath5k/reset.c
@@ -1368,10 +1368,18 @@ int ath5k_hw_reset(struct ath5k_hw *ah, @@ -1372,10 +1372,18 @@ int ath5k_hw_reset(struct ath5k_hw *ah,
* guess we can tweak it and see how it goes ;-) * guess we can tweak it and see how it goes ;-)
*/ */
if (ah->ah_version != AR5K_AR5210) { if (ah->ah_version != AR5K_AR5210) {

View File

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/main.c --- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1054,6 +1054,9 @@ static void ath_unregister_led(struct at @@ -1135,6 +1135,9 @@ static void ath_unregister_led(struct at
static void ath_deinit_leds(struct ath_softc *sc) static void ath_deinit_leds(struct ath_softc *sc)
{ {
@ -10,7 +10,7 @@
ath_unregister_led(&sc->assoc_led); ath_unregister_led(&sc->assoc_led);
sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
ath_unregister_led(&sc->tx_led); ath_unregister_led(&sc->tx_led);
@@ -1072,6 +1075,9 @@ static void ath_init_leds(struct ath_sof @@ -1153,6 +1156,9 @@ static void ath_init_leds(struct ath_sof
else else
sc->sc_ah->led_pin = ATH_LED_PIN_DEF; sc->sc_ah->led_pin = ATH_LED_PIN_DEF;

View File

@ -1,22 +1,30 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -524,8 +524,18 @@ static int ath9k_hw_init_macaddr(struct @@ -15,6 +15,7 @@
ah->macaddr[2 * i] = eeval >> 8; */
ah->macaddr[2 * i + 1] = eeval & 0xff;
#include <linux/io.h>
+#include <linux/etherdevice.h>
#include <asm/unaligned.h>
#include "hw.h"
@@ -511,8 +512,18 @@ static int ath9k_hw_init_macaddr(struct
common->macaddr[2 * i] = eeval >> 8;
common->macaddr[2 * i + 1] = eeval & 0xff;
} }
- if (sum == 0 || sum == 0xffff * 3) - if (sum == 0 || sum == 0xffff * 3)
- return -EADDRNOTAVAIL; - return -EADDRNOTAVAIL;
+ if (!is_valid_ether_addr(ah->macaddr)) { + if (!is_valid_ether_addr(common->macaddr)) {
+ DECLARE_MAC_BUF(macbuf); + DECLARE_MAC_BUF(macbuf);
+ +
+ DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, + ath_print(common, ATH_DBG_EEPROM,
+ "eeprom contains invalid mac address: %s\n", + "eeprom contains invalid mac address: %s\n",
+ print_mac(macbuf, ah->macaddr)); + print_mac(macbuf, common->macaddr));
+ +
+ random_ether_addr(ah->macaddr); + random_ether_addr(common->macaddr);
+ DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, + ath_print(common, ATH_DBG_EEPROM,
+ "random mac address will be used: %s\n", + "random mac address will be used: %s\n",
+ print_mac(macbuf, ah->macaddr)); + print_mac(macbuf, common->macaddr));
+ } + }
return 0; return 0;

View File

@ -18,7 +18,7 @@
+#endif +#endif
--- a/drivers/net/wireless/ath/regd.h --- a/drivers/net/wireless/ath/regd.h
+++ b/drivers/net/wireless/ath/regd.h +++ b/drivers/net/wireless/ath/regd.h
@@ -236,6 +236,41 @@ enum CountryCode { @@ -242,6 +242,41 @@ enum CountryCode {
CTRY_BELGIUM2 = 5002 CTRY_BELGIUM2 = 5002
}; };
@ -60,7 +60,7 @@
bool ath_is_world_regd(struct ath_regulatory *reg); bool ath_is_world_regd(struct ath_regulatory *reg);
int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy, int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy,
int (*reg_notifier)(struct wiphy *wiphy, int (*reg_notifier)(struct wiphy *wiphy,
@@ -247,3 +282,5 @@ int ath_reg_notifier_apply(struct wiphy @@ -253,3 +288,5 @@ int ath_reg_notifier_apply(struct wiphy
struct ath_regulatory *reg); struct ath_regulatory *reg);
#endif #endif

View File

@ -0,0 +1,20 @@
--- a/drivers/net/wireless/ath/ath9k/ahb.c
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
@@ -29,15 +29,13 @@ static void ath_ahb_read_cachesize(struc
static void ath_ahb_cleanup(struct ath_common *common)
{
- struct ath_hw *ah = (struct ath_hw *) common->ah;
- struct ath_softc *sc = ah->ah_sc;
+ struct ath_softc *sc = (struct ath_softc *) common->priv;
iounmap(sc->mem);
}
static bool ath_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
{
- struct ath_hw *ah = (struct ath_hw *) common->ah;
- struct ath_softc *sc = ah->ah_sc;
+ struct ath_softc *sc = (struct ath_softc *) common->priv;
struct platform_device *pdev = to_platform_device(sc->dev);
struct ath9k_platform_data *pdata;