mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-30 18:14:04 +02:00
merge mac80211, iw, hostapd from trunk to backfire
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@23733 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
9ed3e7f75f
commit
b1b81f3461
@ -20,3 +20,8 @@ config WPA_SUPPLICANT_OPENSSL
|
|||||||
select PACKAGE_libopenssl
|
select PACKAGE_libopenssl
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config WPA_RFKILL_SUPPORT
|
||||||
|
bool "Add rfkill support"
|
||||||
|
depends PACKAGE_wpa-supplicant || PACKAGE_wpa-supplicant-mini || PACKAGE_wpad || PACKAGE_wpad-mini
|
||||||
|
default n
|
||||||
|
@ -8,9 +8,9 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=hostapd
|
PKG_NAME:=hostapd
|
||||||
PKG_VERSION:=20100418
|
PKG_VERSION:=20100705
|
||||||
PKG_RELEASE:=2
|
PKG_RELEASE:=1
|
||||||
PKG_REV:=0b86f67a2970403d1b1b6d34ce49f5485ef5dbb3
|
PKG_REV:=2f1ce78bf78cecd7021385b04a4f55f22e76ab97
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||||
PKG_SOURCE_URL:=git://w1.fi/srv/git/hostap.git
|
PKG_SOURCE_URL:=git://w1.fi/srv/git/hostap.git
|
||||||
@ -30,7 +30,8 @@ PKG_CONFIG_DEPENDS:= \
|
|||||||
CONFIG_PACKAGE_kmod-madwifi \
|
CONFIG_PACKAGE_kmod-madwifi \
|
||||||
CONFIG_PACKAGE_hostapd \
|
CONFIG_PACKAGE_hostapd \
|
||||||
CONFIG_PACKAGE_hostapd-mini \
|
CONFIG_PACKAGE_hostapd-mini \
|
||||||
CONFIG_PACKAGE_kmod-hostap
|
CONFIG_PACKAGE_kmod-hostap \
|
||||||
|
CONFIG_WPA_RFKILL_SUPPORT
|
||||||
|
|
||||||
LOCAL_TYPE=$(strip \
|
LOCAL_TYPE=$(strip \
|
||||||
$(if $(findstring wpad,$(BUILD_VARIANT)),wpad, \
|
$(if $(findstring wpad,$(BUILD_VARIANT)),wpad, \
|
||||||
@ -64,7 +65,8 @@ DRIVER_MAKEOPTS= \
|
|||||||
CONFIG_DRIVER_MADWIFI=$(CONFIG_PACKAGE_kmod-madwifi) \
|
CONFIG_DRIVER_MADWIFI=$(CONFIG_PACKAGE_kmod-madwifi) \
|
||||||
CONFIG_DRIVER_HOSTAP=$(CONFIG_PACKAGE_kmod-hostap) \
|
CONFIG_DRIVER_HOSTAP=$(CONFIG_PACKAGE_kmod-hostap) \
|
||||||
CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
|
CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
|
||||||
CONFIG_IEEE80211W=$(CONFIG_PACKAGE_kmod-ath9k)
|
CONFIG_IEEE80211W=$(CONFIG_PACKAGE_kmod-ath9k) \
|
||||||
|
$(if $(CONFIG_WPA_RFKILL_SUPPORT),NEED_RFKILL=y)
|
||||||
|
|
||||||
ifneq ($(LOCAL_TYPE),hostapd)
|
ifneq ($(LOCAL_TYPE),hostapd)
|
||||||
ifdef CONFIG_WPA_SUPPLICANT_OPENSSL
|
ifdef CONFIG_WPA_SUPPLICANT_OPENSSL
|
||||||
@ -80,7 +82,7 @@ ifneq ($(LOCAL_TYPE),hostapd)
|
|||||||
CONFIG_DRIVER_ROBOSWITCH=$(CONFIG_PACKAGE_kmod-switch)
|
CONFIG_DRIVER_ROBOSWITCH=$(CONFIG_PACKAGE_kmod-switch)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DRV_DEPENDS:=+PACKAGE_kmod-mac80211:libnl-tiny +PACKAGE_kmod-mac80211:crda @(!(TARGET_avr32||TARGET_etrax)||BROKEN)
|
DRV_DEPENDS:=+PACKAGE_kmod-mac80211:libnl-tiny @(!(TARGET_avr32||TARGET_etrax)||BROKEN)
|
||||||
|
|
||||||
define Package/hostapd/Default
|
define Package/hostapd/Default
|
||||||
SECTION:=net
|
SECTION:=net
|
||||||
@ -115,7 +117,7 @@ endef
|
|||||||
define Package/hostapd-utils
|
define Package/hostapd-utils
|
||||||
$(call Package/hostapd/Default)
|
$(call Package/hostapd/Default)
|
||||||
TITLE+= (utils)
|
TITLE+= (utils)
|
||||||
DEPENDS:=@PACKAGE_hostapd||PACKAGE_hostapd-mini
|
DEPENDS:=@PACKAGE_hostapd||PACKAGE_hostapd-mini||PACKAGE_wpad||PACKAGE_wpad-mini
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/hostapd-utils/description
|
define Package/hostapd-utils/description
|
||||||
@ -186,7 +188,7 @@ endef
|
|||||||
define Package/wpa-cli
|
define Package/wpa-cli
|
||||||
SECTION:=net
|
SECTION:=net
|
||||||
CATEGORY:=Network
|
CATEGORY:=Network
|
||||||
DEPENDS:=wpa-supplicant
|
DEPENDS:=@PACKAGE_wpa-supplicant||PACKAGE_wpad-mini||PACKAGE_wpad
|
||||||
TITLE:=WPA Supplicant command line interface
|
TITLE:=WPA Supplicant command line interface
|
||||||
MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
|
MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
|
||||||
endef
|
endef
|
||||||
@ -237,7 +239,7 @@ endef
|
|||||||
define Build/Compile/wpad
|
define Build/Compile/wpad
|
||||||
echo ` \
|
echo ` \
|
||||||
$(call Build/RunMake,hostapd,-s MULTICALL=1 dump_cflags); \
|
$(call Build/RunMake,hostapd,-s MULTICALL=1 dump_cflags); \
|
||||||
$(call Build/RunMake,wpa_supplicant,-s dump_cflags) | \
|
$(call Build/RunMake,wpa_supplicant,-s MULTICALL=1 dump_cflags) | \
|
||||||
sed -e 's,-n ,,g' -e 's,$(TARGET_CFLAGS),,' \
|
sed -e 's,-n ,,g' -e 's,$(TARGET_CFLAGS),,' \
|
||||||
` > $(PKG_BUILD_DIR)/.cflags
|
` > $(PKG_BUILD_DIR)/.cflags
|
||||||
$(call Build/RunMake,hostapd, \
|
$(call Build/RunMake,hostapd, \
|
||||||
@ -294,8 +296,9 @@ Package/hostapd-mini/install = $(Package/hostapd/install)
|
|||||||
|
|
||||||
ifneq ($(LOCAL_TYPE),supplicant)
|
ifneq ($(LOCAL_TYPE),supplicant)
|
||||||
define Package/hostapd-utils/install
|
define Package/hostapd-utils/install
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/hotplug.d/button
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_cli $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_cli $(1)/usr/sbin/
|
||||||
|
$(INSTALL_DATA) ./files/wps-hotplug.sh $(1)/etc/hotplug.d/button/50-wps
|
||||||
endef
|
endef
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -156,3 +156,5 @@ CONFIG_TLS=internal
|
|||||||
CONFIG_INTERNAL_LIBTOMMATH=y
|
CONFIG_INTERNAL_LIBTOMMATH=y
|
||||||
CONFIG_INTERNAL_AES=y
|
CONFIG_INTERNAL_AES=y
|
||||||
NEED_AES_DEC=y
|
NEED_AES_DEC=y
|
||||||
|
|
||||||
|
CONFIG_WPS=y
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
hostapd_set_bss_options() {
|
hostapd_set_bss_options() {
|
||||||
local var="$1"
|
local var="$1"
|
||||||
local vif="$2"
|
local vif="$2"
|
||||||
local enc wpa_group_rekey
|
local enc wpa_group_rekey wps_possible
|
||||||
|
|
||||||
config_get enc "$vif" encryption
|
config_get enc "$vif" encryption
|
||||||
config_get wpa_group_rekey "$vif" wpa_group_rekey
|
config_get wpa_group_rekey "$vif" wpa_group_rekey
|
||||||
@ -60,6 +60,7 @@ hostapd_set_bss_options() {
|
|||||||
else
|
else
|
||||||
append "$var" "wpa_passphrase=$psk" "$N"
|
append "$var" "wpa_passphrase=$psk" "$N"
|
||||||
fi
|
fi
|
||||||
|
wps_possible=1
|
||||||
;;
|
;;
|
||||||
*wpa*)
|
*wpa*)
|
||||||
# required fields? formats?
|
# required fields? formats?
|
||||||
@ -123,10 +124,20 @@ hostapd_set_bss_options() {
|
|||||||
config_get ssid "$vif" ssid
|
config_get ssid "$vif" ssid
|
||||||
config_get bridge "$vif" bridge
|
config_get bridge "$vif" bridge
|
||||||
config_get ieee80211d "$vif" ieee80211d
|
config_get ieee80211d "$vif" ieee80211d
|
||||||
|
config_get iapp_interface "$vif" iapp_interface
|
||||||
|
|
||||||
|
config_get_bool wps_pbc "$vif" wps_pushbutton 0
|
||||||
|
[ -n "$wps_possible" -a "$wps_pbc" -gt 0 ] && {
|
||||||
|
append "$var" "eap_server=1" "$N"
|
||||||
|
append "$var" "wps_state=2" "$N"
|
||||||
|
append "$var" "ap_setup_locked=1" "$N"
|
||||||
|
append "$var" "config_methods=push_button" "$N"
|
||||||
|
}
|
||||||
|
|
||||||
append "$var" "ssid=$ssid" "$N"
|
append "$var" "ssid=$ssid" "$N"
|
||||||
[ -n "$bridge" ] && append "$var" "bridge=$bridge" "$N"
|
[ -n "$bridge" ] && append "$var" "bridge=$bridge" "$N"
|
||||||
[ -n "$ieee80211d" ] && append "$var" "ieee80211d=$ieee80211d" "$N"
|
[ -n "$ieee80211d" ] && append "$var" "ieee80211d=$ieee80211d" "$N"
|
||||||
|
[ -n "$iapp_interface" ] && append "$var" $(uci_get_state network "$iapp_interface" ifname "$iapp_interface") "$N"
|
||||||
|
|
||||||
[ "$wpa" -ge "2" ] && config_get ieee80211w "$vif" ieee80211w
|
[ "$wpa" -ge "2" ] && config_get ieee80211w "$vif" ieee80211w
|
||||||
case "$ieee80211w" in
|
case "$ieee80211w" in
|
||||||
|
@ -189,7 +189,7 @@ CONFIG_EAP_LEAP=y
|
|||||||
#CONFIG_EAP_TNC=y
|
#CONFIG_EAP_TNC=y
|
||||||
|
|
||||||
# Wi-Fi Protected Setup (WPS)
|
# Wi-Fi Protected Setup (WPS)
|
||||||
#CONFIG_WPS=y
|
CONFIG_WPS=y
|
||||||
|
|
||||||
# EAP-IKEv2
|
# EAP-IKEv2
|
||||||
#CONFIG_EAP_IKEV2=y
|
#CONFIG_EAP_IKEV2=y
|
||||||
|
@ -2,6 +2,7 @@ wpa_supplicant_setup_vif() {
|
|||||||
local vif="$1"
|
local vif="$1"
|
||||||
local driver="$2"
|
local driver="$2"
|
||||||
local key="$key"
|
local key="$key"
|
||||||
|
local options="$3"
|
||||||
|
|
||||||
# wpa_supplicant should use wext for mac80211 cards
|
# wpa_supplicant should use wext for mac80211 cards
|
||||||
[ "$driver" = "mac80211" ] && driver='wext'
|
[ "$driver" = "mac80211" ] && driver='wext'
|
||||||
@ -133,5 +134,5 @@ network={
|
|||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
[ -z "$proto" -a "$key_mgmt" != "NONE" ] || \
|
[ -z "$proto" -a "$key_mgmt" != "NONE" ] || \
|
||||||
wpa_supplicant ${bridge:+ -b $bridge} -B -P "/var/run/wifi-${ifname}.pid" -D ${driver:-wext} -i "$ifname" -c /var/run/wpa_supplicant-$ifname.conf
|
wpa_supplicant ${bridge:+ -b $bridge} -B -P "/var/run/wifi-${ifname}.pid" -D ${driver:-wext} -i "$ifname" -c /var/run/wpa_supplicant-$ifname.conf $options
|
||||||
}
|
}
|
||||||
|
6
package/hostapd/files/wps-hotplug.sh
Normal file
6
package/hostapd/files/wps-hotplug.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
if [ "$ACTION" = "pressed" -a "$BUTTON" = "wps" ]; then
|
||||||
|
for dir in /var/run/hostapd-*; do
|
||||||
|
[ -d "$dir" ] || continue
|
||||||
|
hostapd_cli -p "$dir" wps_pbc
|
||||||
|
done
|
||||||
|
fi
|
@ -1,6 +1,6 @@
|
|||||||
--- a/src/ap/hostapd.c
|
--- a/src/ap/hostapd.c
|
||||||
+++ b/src/ap/hostapd.c
|
+++ b/src/ap/hostapd.c
|
||||||
@@ -659,7 +659,6 @@ static int setup_interface(struct hostap
|
@@ -660,7 +660,6 @@ static int setup_interface(struct hostap
|
||||||
country[3] = '\0';
|
country[3] = '\0';
|
||||||
if (hostapd_set_country(hapd, country) < 0) {
|
if (hostapd_set_country(hapd, country) < 0) {
|
||||||
wpa_printf(MSG_ERROR, "Failed to set country code");
|
wpa_printf(MSG_ERROR, "Failed to set country code");
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
/* hostapd.c */
|
/* hostapd.c */
|
||||||
--- a/src/ap/hostapd.c
|
--- a/src/ap/hostapd.c
|
||||||
+++ b/src/ap/hostapd.c
|
+++ b/src/ap/hostapd.c
|
||||||
@@ -754,6 +754,9 @@ int hostapd_setup_interface_complete(str
|
@@ -755,6 +755,9 @@ int hostapd_setup_interface_complete(str
|
||||||
wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
|
wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
|
||||||
iface->bss[0]->conf->iface);
|
iface->bss[0]->conf->iface);
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
ifndef CONFIG_OS
|
ifndef CONFIG_OS
|
||||||
ifdef CONFIG_NATIVE_WINDOWS
|
ifdef CONFIG_NATIVE_WINDOWS
|
||||||
@@ -579,6 +580,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
|
@@ -581,6 +582,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
|
||||||
CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS
|
CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS
|
||||||
LIBS += -ldl -rdynamic
|
LIBS += -ldl -rdynamic
|
||||||
endif
|
endif
|
||||||
@ -73,7 +73,7 @@
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_AP
|
ifdef CONFIG_AP
|
||||||
@@ -631,6 +636,12 @@ CFLAGS += -DEAP_SERVER_WSC
|
@@ -635,6 +640,12 @@ CFLAGS += -DEAP_SERVER_WSC
|
||||||
OBJS += ../src/ap/wps_hostapd.o
|
OBJS += ../src/ap/wps_hostapd.o
|
||||||
OBJS += ../src/eap_server/eap_server_wsc.o
|
OBJS += ../src/eap_server/eap_server_wsc.o
|
||||||
endif
|
endif
|
||||||
@ -86,7 +86,7 @@
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef NEED_RSN_AUTHENTICATOR
|
ifdef NEED_RSN_AUTHENTICATOR
|
||||||
@@ -1262,6 +1273,12 @@ BCHECK=../src/drivers/build.wpa_supplica
|
@@ -1270,6 +1281,12 @@ BCHECK=../src/drivers/build.wpa_supplica
|
||||||
wpa_priv: $(BCHECK) $(OBJS_priv)
|
wpa_priv: $(BCHECK) $(OBJS_priv)
|
||||||
$(LDO) $(LDFLAGS) -o wpa_priv $(OBJS_priv) $(LIBS)
|
$(LDO) $(LDFLAGS) -o wpa_priv $(OBJS_priv) $(LIBS)
|
||||||
|
|
||||||
@ -99,7 +99,7 @@
|
|||||||
wpa_supplicant: .config $(BCHECK) $(OBJS) $(EXTRA_progs)
|
wpa_supplicant: .config $(BCHECK) $(OBJS) $(EXTRA_progs)
|
||||||
$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
|
$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
|
||||||
|
|
||||||
@@ -1321,6 +1338,12 @@ endif
|
@@ -1329,6 +1346,12 @@ endif
|
||||||
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
|
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
|
||||||
@$(E) " CC " $<
|
@$(E) " CC " $<
|
||||||
|
|
||||||
@ -114,7 +114,7 @@
|
|||||||
wpa_cli.exe: wpa_cli
|
wpa_cli.exe: wpa_cli
|
||||||
--- a/src/drivers/driver.h
|
--- a/src/drivers/driver.h
|
||||||
+++ b/src/drivers/driver.h
|
+++ b/src/drivers/driver.h
|
||||||
@@ -2449,8 +2449,8 @@ union wpa_event_data {
|
@@ -2465,8 +2465,8 @@ union wpa_event_data {
|
||||||
* Driver wrapper code should call this function whenever an event is received
|
* Driver wrapper code should call this function whenever an event is received
|
||||||
* from the driver.
|
* from the driver.
|
||||||
*/
|
*/
|
||||||
@ -169,7 +169,7 @@
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
--- a/wpa_supplicant/events.c
|
--- a/wpa_supplicant/events.c
|
||||||
+++ b/wpa_supplicant/events.c
|
+++ b/wpa_supplicant/events.c
|
||||||
@@ -1577,8 +1577,8 @@ static void ft_rx_action(struct wpa_supp
|
@@ -1582,8 +1582,8 @@ static void ft_rx_action(struct wpa_supp
|
||||||
#endif /* CONFIG_IEEE80211R */
|
#endif /* CONFIG_IEEE80211R */
|
||||||
|
|
||||||
|
|
||||||
@ -182,7 +182,7 @@
|
|||||||
u16 reason_code = 0;
|
u16 reason_code = 0;
|
||||||
--- a/wpa_supplicant/wpa_supplicant.c
|
--- a/wpa_supplicant/wpa_supplicant.c
|
||||||
+++ b/wpa_supplicant/wpa_supplicant.c
|
+++ b/wpa_supplicant/wpa_supplicant.c
|
||||||
@@ -2223,6 +2223,9 @@ struct wpa_supplicant * wpa_supplicant_g
|
@@ -2228,6 +2228,9 @@ struct wpa_supplicant * wpa_supplicant_g
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,7 +192,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* wpa_supplicant_init - Initialize %wpa_supplicant
|
* wpa_supplicant_init - Initialize %wpa_supplicant
|
||||||
@@ -2241,6 +2244,7 @@ struct wpa_global * wpa_supplicant_init(
|
@@ -2246,6 +2249,7 @@ struct wpa_global * wpa_supplicant_init(
|
||||||
if (params == NULL)
|
if (params == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/src/tls/x509v3.c
|
--- a/src/tls/x509v3.c
|
||||||
+++ b/src/tls/x509v3.c
|
+++ b/src/tls/x509v3.c
|
||||||
@@ -1832,8 +1832,11 @@ int x509_certificate_chain_validate(stru
|
@@ -1854,8 +1854,11 @@ int x509_certificate_chain_validate(stru
|
||||||
if (chain_trusted)
|
if (chain_trusted)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
size_t max_ssids;
|
size_t max_ssids;
|
||||||
enum wpa_states prev_state;
|
enum wpa_states prev_state;
|
||||||
|
|
||||||
@@ -311,6 +312,16 @@ static void wpa_supplicant_scan(void *el
|
@@ -316,6 +317,16 @@ static void wpa_supplicant_scan(void *el
|
||||||
wpa_s->wpa_state == WPA_INACTIVE)
|
wpa_s->wpa_state == WPA_INACTIVE)
|
||||||
wpa_supplicant_set_state(wpa_s, WPA_SCANNING);
|
wpa_supplicant_set_state(wpa_s, WPA_SCANNING);
|
||||||
|
|
||||||
@ -25,7 +25,7 @@
|
|||||||
/* Find the starting point from which to continue scanning */
|
/* Find the starting point from which to continue scanning */
|
||||||
ssid = wpa_s->conf->ssid;
|
ssid = wpa_s->conf->ssid;
|
||||||
if (wpa_s->prev_scan_ssid != WILDCARD_SSID_SCAN) {
|
if (wpa_s->prev_scan_ssid != WILDCARD_SSID_SCAN) {
|
||||||
@@ -374,6 +385,9 @@ static void wpa_supplicant_scan(void *el
|
@@ -379,6 +390,9 @@ static void wpa_supplicant_scan(void *el
|
||||||
int_array_sort_unique(params.freqs);
|
int_array_sort_unique(params.freqs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/wpa_supplicant/events.c
|
--- a/wpa_supplicant/events.c
|
||||||
+++ b/wpa_supplicant/events.c
|
+++ b/wpa_supplicant/events.c
|
||||||
@@ -958,7 +958,7 @@ static void wpa_supplicant_event_scan_re
|
@@ -963,7 +963,7 @@ static void wpa_supplicant_event_scan_re
|
||||||
wpa_printf(MSG_DEBUG, "Setup a new network");
|
wpa_printf(MSG_DEBUG, "Setup a new network");
|
||||||
wpa_supplicant_associate(wpa_s, NULL, ssid);
|
wpa_supplicant_associate(wpa_s, NULL, ssid);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/src/drivers/driver_nl80211.c
|
--- a/src/drivers/driver_nl80211.c
|
||||||
+++ b/src/drivers/driver_nl80211.c
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
@@ -4576,9 +4576,11 @@ static int i802_set_wds_sta(void *priv,
|
@@ -4652,9 +4652,11 @@ static int i802_set_wds_sta(void *priv,
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Set WDS STA addr=" MACSTR
|
wpa_printf(MSG_DEBUG, "nl80211: Set WDS STA addr=" MACSTR
|
||||||
" aid=%d val=%d name=%s", MAC2STR(addr), aid, val, name);
|
" aid=%d val=%d name=%s", MAC2STR(addr), aid, val, name);
|
||||||
if (val) {
|
if (val) {
|
||||||
@ -16,7 +16,7 @@
|
|||||||
} else {
|
} else {
|
||||||
--- a/src/ap/ieee802_11.c
|
--- a/src/ap/ieee802_11.c
|
||||||
+++ b/src/ap/ieee802_11.c
|
+++ b/src/ap/ieee802_11.c
|
||||||
@@ -1614,6 +1614,9 @@ static void handle_assoc_cb(struct hosta
|
@@ -1627,6 +1627,9 @@ static void handle_assoc_cb(struct hosta
|
||||||
"Could not add STA to kernel driver");
|
"Could not add STA to kernel driver");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
/* clear to get error below if setting is invalid */
|
/* clear to get error below if setting is invalid */
|
||||||
--- a/src/drivers/driver_nl80211.c
|
--- a/src/drivers/driver_nl80211.c
|
||||||
+++ b/src/drivers/driver_nl80211.c
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
@@ -4566,7 +4566,8 @@ static int i802_set_sta_vlan(void *priv,
|
@@ -4642,7 +4642,8 @@ static int i802_set_sta_vlan(void *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -31,7 +31,7 @@
|
|||||||
{
|
{
|
||||||
struct i802_bss *bss = priv;
|
struct i802_bss *bss = priv;
|
||||||
struct wpa_driver_nl80211_data *drv = bss->drv;
|
struct wpa_driver_nl80211_data *drv = bss->drv;
|
||||||
@@ -4580,6 +4581,10 @@ static int i802_set_wds_sta(void *priv,
|
@@ -4656,6 +4657,10 @@ static int i802_set_wds_sta(void *priv,
|
||||||
if (nl80211_create_iface(drv, name, NL80211_IFTYPE_AP_VLAN,
|
if (nl80211_create_iface(drv, name, NL80211_IFTYPE_AP_VLAN,
|
||||||
NULL, 1) < 0)
|
NULL, 1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/src/ap/hostapd.c
|
--- a/src/ap/hostapd.c
|
||||||
+++ b/src/ap/hostapd.c
|
+++ b/src/ap/hostapd.c
|
||||||
@@ -715,6 +715,16 @@ int hostapd_setup_interface_complete(str
|
@@ -716,6 +716,16 @@ int hostapd_setup_interface_complete(str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
* @freq: Frequency (in MHz) of the channel
|
* @freq: Frequency (in MHz) of the channel
|
||||||
--- a/src/drivers/driver_nl80211.c
|
--- a/src/drivers/driver_nl80211.c
|
||||||
+++ b/src/drivers/driver_nl80211.c
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
@@ -4263,6 +4263,29 @@ static int i802_set_rate_sets(void *priv
|
@@ -4339,6 +4339,29 @@ static int i802_set_rate_sets(void *priv
|
||||||
return -ENOBUFS;
|
return -ENOBUFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +68,7 @@
|
|||||||
#endif /* HOSTAPD */
|
#endif /* HOSTAPD */
|
||||||
|
|
||||||
|
|
||||||
@@ -5372,6 +5395,7 @@ const struct wpa_driver_ops wpa_driver_n
|
@@ -5448,6 +5471,7 @@ const struct wpa_driver_ops wpa_driver_n
|
||||||
.set_tx_queue_params = i802_set_tx_queue_params,
|
.set_tx_queue_params = i802_set_tx_queue_params,
|
||||||
.set_sta_vlan = i802_set_sta_vlan,
|
.set_sta_vlan = i802_set_sta_vlan,
|
||||||
.set_wds_sta = i802_set_wds_sta,
|
.set_wds_sta = i802_set_wds_sta,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/src/drivers/driver_nl80211.c
|
--- a/src/drivers/driver_nl80211.c
|
||||||
+++ b/src/drivers/driver_nl80211.c
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
@@ -1119,7 +1119,6 @@ nla_put_failure:
|
@@ -1135,7 +1135,6 @@ nla_put_failure:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -8,7 +8,7 @@
|
|||||||
struct wiphy_info_data {
|
struct wiphy_info_data {
|
||||||
int max_scan_ssids;
|
int max_scan_ssids;
|
||||||
int ap_supported;
|
int ap_supported;
|
||||||
@@ -1231,7 +1230,6 @@ static int wpa_driver_nl80211_capa(struc
|
@@ -1247,7 +1246,6 @@ static int wpa_driver_nl80211_capa(struc
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
|
|
||||||
static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv,
|
static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv,
|
||||||
@@ -1371,6 +1369,7 @@ static void * wpa_driver_nl80211_init(vo
|
@@ -1411,6 +1409,7 @@ static void * wpa_driver_nl80211_init(vo
|
||||||
drv->monitor_ifidx = -1;
|
drv->monitor_ifidx = -1;
|
||||||
drv->monitor_sock = -1;
|
drv->monitor_sock = -1;
|
||||||
drv->ioctl_sock = -1;
|
drv->ioctl_sock = -1;
|
||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
if (wpa_driver_nl80211_init_nl(drv, ctx)) {
|
if (wpa_driver_nl80211_init_nl(drv, ctx)) {
|
||||||
os_free(drv);
|
os_free(drv);
|
||||||
@@ -1468,24 +1467,23 @@ wpa_driver_nl80211_finish_drv_init(struc
|
@@ -1530,32 +1529,32 @@ wpa_driver_nl80211_finish_drv_init(struc
|
||||||
drv->ifindex = if_nametoindex(bss->ifname);
|
drv->ifindex = if_nametoindex(bss->ifname);
|
||||||
drv->first_bss.ifindex = drv->ifindex;
|
drv->first_bss.ifindex = drv->ifindex;
|
||||||
|
|
||||||
@ -33,22 +33,37 @@
|
|||||||
- wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
|
- wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
|
||||||
- "use managed mode");
|
- "use managed mode");
|
||||||
- }
|
- }
|
||||||
-
|
|
||||||
- if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
|
|
||||||
- wpa_printf(MSG_ERROR, "Could not set interface '%s' UP",
|
|
||||||
- bss->ifname);
|
|
||||||
- return -1;
|
|
||||||
- }
|
|
||||||
+ if (drv->nlmode == NL80211_IFTYPE_STATION) {
|
+ if (drv->nlmode == NL80211_IFTYPE_STATION) {
|
||||||
+ if (wpa_driver_nl80211_set_mode(bss, IEEE80211_MODE_INFRA) < 0)
|
+ if (wpa_driver_nl80211_set_mode(bss, IEEE80211_MODE_INFRA) < 0) {
|
||||||
+ wpa_printf(MSG_DEBUG, "nl80211: Could not configure "
|
+ wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
|
||||||
+ "driver to use managed mode");
|
+ "use managed mode");
|
||||||
+
|
+ }
|
||||||
|
|
||||||
|
- if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
|
||||||
|
- if (rfkill_is_blocked(drv->rfkill)) {
|
||||||
|
- wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
|
||||||
|
- "interface '%s' due to rfkill",
|
||||||
|
- bss->ifname);
|
||||||
|
- drv->if_disabled = 1;
|
||||||
|
- send_rfkill_event = 1;
|
||||||
|
- } else {
|
||||||
|
- wpa_printf(MSG_ERROR, "nl80211: Could not set "
|
||||||
|
- "interface '%s' UP", bss->ifname);
|
||||||
|
- return -1;
|
||||||
+ if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
|
+ if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
|
||||||
+ wpa_printf(MSG_ERROR, "Could not set interface '%s' UP",
|
+ if (rfkill_is_blocked(drv->rfkill)) {
|
||||||
|
+ wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
|
||||||
|
+ "interface '%s' due to rfkill",
|
||||||
+ bss->ifname);
|
+ bss->ifname);
|
||||||
|
+ drv->if_disabled = 1;
|
||||||
|
+ send_rfkill_event = 1;
|
||||||
|
+ } else {
|
||||||
|
+ wpa_printf(MSG_ERROR, "nl80211: Could not set "
|
||||||
|
+ "interface '%s' UP", bss->ifname);
|
||||||
+ return -1;
|
+ return -1;
|
||||||
+ }
|
+ }
|
||||||
|
}
|
||||||
|
- }
|
||||||
|
|
||||||
- if (wpa_driver_nl80211_capa(drv))
|
- if (wpa_driver_nl80211_capa(drv))
|
||||||
- return -1;
|
- return -1;
|
||||||
@ -64,7 +79,7 @@
|
|||||||
|
|
||||||
if (nl80211_register_action_frames(drv) < 0) {
|
if (nl80211_register_action_frames(drv) < 0) {
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Failed to register Action "
|
wpa_printf(MSG_DEBUG, "nl80211: Failed to register Action "
|
||||||
@@ -2143,13 +2141,9 @@ static int wpa_driver_nl80211_set_key(co
|
@@ -2219,13 +2218,9 @@ static int wpa_driver_nl80211_set_key(co
|
||||||
*/
|
*/
|
||||||
if (ret || !set_tx || alg == WPA_ALG_NONE)
|
if (ret || !set_tx || alg == WPA_ALG_NONE)
|
||||||
return ret;
|
return ret;
|
||||||
@ -79,7 +94,7 @@
|
|||||||
|
|
||||||
msg = nlmsg_alloc();
|
msg = nlmsg_alloc();
|
||||||
if (!msg)
|
if (!msg)
|
||||||
@@ -2990,7 +2984,8 @@ static void nl80211_remove_iface(struct
|
@@ -3066,7 +3061,8 @@ static void nl80211_remove_iface(struct
|
||||||
|
|
||||||
#ifdef HOSTAPD
|
#ifdef HOSTAPD
|
||||||
/* stop listening for EAPOL on this interface */
|
/* stop listening for EAPOL on this interface */
|
||||||
@ -89,7 +104,7 @@
|
|||||||
#endif /* HOSTAPD */
|
#endif /* HOSTAPD */
|
||||||
|
|
||||||
msg = nlmsg_alloc();
|
msg = nlmsg_alloc();
|
||||||
@@ -3063,7 +3058,8 @@ static int nl80211_create_iface_once(str
|
@@ -3139,7 +3135,8 @@ static int nl80211_create_iface_once(str
|
||||||
|
|
||||||
#ifdef HOSTAPD
|
#ifdef HOSTAPD
|
||||||
/* start listening for EAPOL on this interface */
|
/* start listening for EAPOL on this interface */
|
||||||
@ -99,7 +114,7 @@
|
|||||||
#endif /* HOSTAPD */
|
#endif /* HOSTAPD */
|
||||||
|
|
||||||
if (addr && iftype != NL80211_IFTYPE_MONITOR &&
|
if (addr && iftype != NL80211_IFTYPE_MONITOR &&
|
||||||
@@ -4766,6 +4762,7 @@ static void *i802_init(struct hostapd_da
|
@@ -4842,6 +4839,7 @@ static void *i802_init(struct hostapd_da
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
drv = bss->drv;
|
drv = bss->drv;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/wpa_supplicant/wpa_supplicant.c
|
--- a/wpa_supplicant/wpa_supplicant.c
|
||||||
+++ b/wpa_supplicant/wpa_supplicant.c
|
+++ b/wpa_supplicant/wpa_supplicant.c
|
||||||
@@ -543,10 +543,16 @@ void wpa_supplicant_set_state(struct wpa
|
@@ -545,10 +545,16 @@ void wpa_supplicant_set_state(struct wpa
|
||||||
wpa_s->reassociated_connection = 1;
|
wpa_s->reassociated_connection = 1;
|
||||||
wpa_drv_set_operstate(wpa_s, 1);
|
wpa_drv_set_operstate(wpa_s, 1);
|
||||||
wpa_s->after_wps = 0;
|
wpa_s->after_wps = 0;
|
||||||
|
263
package/hostapd/patches/410-no_rfkill.patch
Normal file
263
package/hostapd/patches/410-no_rfkill.patch
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
--- a/src/drivers/driver_nl80211.c
|
||||||
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
|
@@ -75,7 +75,9 @@ struct wpa_driver_nl80211_data {
|
||||||
|
int ifindex;
|
||||||
|
int if_removed;
|
||||||
|
int if_disabled;
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
struct rfkill_data *rfkill;
|
||||||
|
+#endif
|
||||||
|
struct wpa_driver_capa capa;
|
||||||
|
int has_capability;
|
||||||
|
|
||||||
|
@@ -1361,7 +1363,7 @@ err1:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
static void wpa_driver_nl80211_rfkill_blocked(void *ctx)
|
||||||
|
{
|
||||||
|
wpa_printf(MSG_DEBUG, "nl80211: RFKILL blocked");
|
||||||
|
@@ -1383,6 +1385,7 @@ static void wpa_driver_nl80211_rfkill_un
|
||||||
|
}
|
||||||
|
/* rtnetlink ifup handler will report interface as enabled */
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_RFKILL */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -1396,7 +1399,9 @@ static void * wpa_driver_nl80211_init(vo
|
||||||
|
{
|
||||||
|
struct wpa_driver_nl80211_data *drv;
|
||||||
|
struct netlink_config *cfg;
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
struct rfkill_config *rcfg;
|
||||||
|
+#endif
|
||||||
|
struct i802_bss *bss;
|
||||||
|
|
||||||
|
drv = os_zalloc(sizeof(*drv));
|
||||||
|
@@ -1434,6 +1439,7 @@ static void * wpa_driver_nl80211_init(vo
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
rcfg = os_zalloc(sizeof(*rcfg));
|
||||||
|
if (rcfg == NULL)
|
||||||
|
goto failed;
|
||||||
|
@@ -1446,6 +1452,7 @@ static void * wpa_driver_nl80211_init(vo
|
||||||
|
wpa_printf(MSG_DEBUG, "nl80211: RFKILL status not available");
|
||||||
|
os_free(rcfg);
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_RFKILL */
|
||||||
|
|
||||||
|
if (wpa_driver_nl80211_finish_drv_init(drv))
|
||||||
|
goto failed;
|
||||||
|
@@ -1453,7 +1460,9 @@ static void * wpa_driver_nl80211_init(vo
|
||||||
|
return bss;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
rfkill_deinit(drv->rfkill);
|
||||||
|
+#endif
|
||||||
|
netlink_deinit(drv->netlink);
|
||||||
|
if (drv->ioctl_sock >= 0)
|
||||||
|
close(drv->ioctl_sock);
|
||||||
|
@@ -1514,10 +1523,12 @@ static int nl80211_register_action_frame
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
static void wpa_driver_nl80211_send_rfkill(void *eloop_ctx, void *timeout_ctx)
|
||||||
|
{
|
||||||
|
wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_RFKILL */
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -1536,13 +1547,16 @@ wpa_driver_nl80211_finish_drv_init(struc
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
if (rfkill_is_blocked(drv->rfkill)) {
|
||||||
|
wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
|
||||||
|
"interface '%s' due to rfkill",
|
||||||
|
bss->ifname);
|
||||||
|
drv->if_disabled = 1;
|
||||||
|
send_rfkill_event = 1;
|
||||||
|
- } else {
|
||||||
|
+ } else
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
wpa_printf(MSG_ERROR, "nl80211: Could not set "
|
||||||
|
"interface '%s' UP", bss->ifname);
|
||||||
|
return -1;
|
||||||
|
@@ -1567,8 +1581,10 @@ wpa_driver_nl80211_finish_drv_init(struc
|
||||||
|
}
|
||||||
|
|
||||||
|
if (send_rfkill_event) {
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
eloop_register_timeout(0, 0, wpa_driver_nl80211_send_rfkill,
|
||||||
|
drv, drv->ctx);
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1647,7 +1663,9 @@ static void wpa_driver_nl80211_deinit(vo
|
||||||
|
|
||||||
|
netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
|
||||||
|
netlink_deinit(drv->netlink);
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
rfkill_deinit(drv->rfkill);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
|
||||||
|
|
||||||
|
--- a/src/drivers/driver_wext.c
|
||||||
|
+++ b/src/drivers/driver_wext.c
|
||||||
|
@@ -700,7 +700,7 @@ static void wpa_driver_wext_event_rtm_de
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
static void wpa_driver_wext_rfkill_blocked(void *ctx)
|
||||||
|
{
|
||||||
|
wpa_printf(MSG_DEBUG, "WEXT: RFKILL blocked");
|
||||||
|
@@ -722,7 +722,7 @@ static void wpa_driver_wext_rfkill_unblo
|
||||||
|
}
|
||||||
|
/* rtnetlink ifup handler will report interface as enabled */
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+#endif /* CONFIG_RFKILL */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wpa_driver_wext_init - Initialize WE driver interface
|
||||||
|
@@ -735,7 +735,9 @@ void * wpa_driver_wext_init(void *ctx, c
|
||||||
|
{
|
||||||
|
struct wpa_driver_wext_data *drv;
|
||||||
|
struct netlink_config *cfg;
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
struct rfkill_config *rcfg;
|
||||||
|
+#endif
|
||||||
|
char path[128];
|
||||||
|
struct stat buf;
|
||||||
|
|
||||||
|
@@ -769,6 +771,7 @@ void * wpa_driver_wext_init(void *ctx, c
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
rcfg = os_zalloc(sizeof(*rcfg));
|
||||||
|
if (rcfg == NULL)
|
||||||
|
goto err3;
|
||||||
|
@@ -781,6 +784,7 @@ void * wpa_driver_wext_init(void *ctx, c
|
||||||
|
wpa_printf(MSG_DEBUG, "WEXT: RFKILL status not available");
|
||||||
|
os_free(rcfg);
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_RFKILL */
|
||||||
|
|
||||||
|
drv->mlme_sock = -1;
|
||||||
|
|
||||||
|
@@ -792,7 +796,9 @@ void * wpa_driver_wext_init(void *ctx, c
|
||||||
|
return drv;
|
||||||
|
|
||||||
|
err3:
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
rfkill_deinit(drv->rfkill);
|
||||||
|
+#endif
|
||||||
|
netlink_deinit(drv->netlink);
|
||||||
|
err2:
|
||||||
|
close(drv->ioctl_sock);
|
||||||
|
@@ -802,10 +808,12 @@ err1:
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
static void wpa_driver_wext_send_rfkill(void *eloop_ctx, void *timeout_ctx)
|
||||||
|
{
|
||||||
|
wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_RFKILL */
|
||||||
|
|
||||||
|
|
||||||
|
static int wpa_driver_wext_finish_drv_init(struct wpa_driver_wext_data *drv)
|
||||||
|
@@ -813,13 +821,16 @@ static int wpa_driver_wext_finish_drv_in
|
||||||
|
int send_rfkill_event = 0;
|
||||||
|
|
||||||
|
if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1) < 0) {
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
if (rfkill_is_blocked(drv->rfkill)) {
|
||||||
|
wpa_printf(MSG_DEBUG, "WEXT: Could not yet enable "
|
||||||
|
"interface '%s' due to rfkill",
|
||||||
|
drv->ifname);
|
||||||
|
drv->if_disabled = 1;
|
||||||
|
send_rfkill_event = 1;
|
||||||
|
- } else {
|
||||||
|
+ } else
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
wpa_printf(MSG_ERROR, "WEXT: Could not set "
|
||||||
|
"interface '%s' UP", drv->ifname);
|
||||||
|
return -1;
|
||||||
|
@@ -867,8 +878,10 @@ static int wpa_driver_wext_finish_drv_in
|
||||||
|
1, IF_OPER_DORMANT);
|
||||||
|
|
||||||
|
if (send_rfkill_event) {
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
eloop_register_timeout(0, 0, wpa_driver_wext_send_rfkill,
|
||||||
|
drv, drv->ctx);
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -898,7 +911,9 @@ void wpa_driver_wext_deinit(void *priv)
|
||||||
|
|
||||||
|
netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
|
||||||
|
netlink_deinit(drv->netlink);
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
rfkill_deinit(drv->rfkill);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
if (drv->mlme_sock >= 0)
|
||||||
|
eloop_unregister_read_sock(drv->mlme_sock);
|
||||||
|
--- a/src/drivers/drivers.mak
|
||||||
|
+++ b/src/drivers/drivers.mak
|
||||||
|
@@ -31,7 +31,6 @@ NEED_SME=y
|
||||||
|
NEED_AP_MLME=y
|
||||||
|
NEED_NETLINK=y
|
||||||
|
NEED_LINUX_IOCTL=y
|
||||||
|
-NEED_RFKILL=y
|
||||||
|
DRV_LIBS += -lnl
|
||||||
|
|
||||||
|
ifdef CONFIG_LIBNL20
|
||||||
|
@@ -78,7 +77,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT
|
||||||
|
CONFIG_WIRELESS_EXTENSION=y
|
||||||
|
NEED_NETLINK=y
|
||||||
|
NEED_LINUX_IOCTL=y
|
||||||
|
-NEED_RFKILL=y
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_DRIVER_HERMES
|
||||||
|
@@ -166,6 +164,7 @@ endif
|
||||||
|
|
||||||
|
ifdef NEED_RFKILL
|
||||||
|
DRV_OBJS += ../src/drivers/rfkill.o
|
||||||
|
+DRV_WPA_CFLAGS += -DCONFIG_RFKILL
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
--- a/src/drivers/driver_wext.h
|
||||||
|
+++ b/src/drivers/driver_wext.h
|
||||||
|
@@ -27,7 +27,9 @@ struct wpa_driver_wext_data {
|
||||||
|
int ifindex2;
|
||||||
|
int if_removed;
|
||||||
|
int if_disabled;
|
||||||
|
+#ifdef CONFIG_RFKILL
|
||||||
|
struct rfkill_data *rfkill;
|
||||||
|
+#endif
|
||||||
|
u8 *assoc_req_ies;
|
||||||
|
size_t assoc_req_ies_len;
|
||||||
|
u8 *assoc_resp_ies;
|
45
package/hostapd/patches/430-supplicant_bridge_fix.patch
Normal file
45
package/hostapd/patches/430-supplicant_bridge_fix.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
--- a/src/drivers/driver_nl80211.c
|
||||||
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
|
@@ -410,6 +410,10 @@ static void wpa_driver_nl80211_event_rtm
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (ifi->ifi_family == AF_BRIDGE &&
|
||||||
|
+ drv->nlmode != NL80211_IFTYPE_AP)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
|
||||||
|
"(%s%s%s%s)",
|
||||||
|
drv->operstate, ifi->ifi_flags,
|
||||||
|
@@ -481,6 +485,10 @@ static void wpa_driver_nl80211_event_rtm
|
||||||
|
attrlen = len;
|
||||||
|
attr = (struct rtattr *) buf;
|
||||||
|
|
||||||
|
+ if (ifi->ifi_family == AF_BRIDGE &&
|
||||||
|
+ drv->nlmode != NL80211_IFTYPE_AP)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
rta_len = RTA_ALIGN(sizeof(struct rtattr));
|
||||||
|
while (RTA_OK(attr, attrlen)) {
|
||||||
|
if (attr->rta_type == IFLA_IFNAME) {
|
||||||
|
@@ -1347,6 +1355,11 @@ static int wpa_driver_nl80211_init_nl(st
|
||||||
|
eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event),
|
||||||
|
wpa_driver_nl80211_event_receive, drv, ctx);
|
||||||
|
|
||||||
|
+#ifdef HOSTAPD
|
||||||
|
+ drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
|
||||||
|
+ drv->if_indices = drv->default_if_indices;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err4:
|
||||||
|
@@ -4867,8 +4880,6 @@ static void *i802_init(struct hostapd_da
|
||||||
|
br_ifindex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
|
||||||
|
- drv->if_indices = drv->default_if_indices;
|
||||||
|
for (i = 0; i < params->num_bridge; i++) {
|
||||||
|
if (params->bridge[i]) {
|
||||||
|
ifindex = if_nametoindex(params->bridge[i]);
|
89
package/hostapd/patches/440-mbss_reload_fix.patch
Normal file
89
package/hostapd/patches/440-mbss_reload_fix.patch
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
--- a/src/ap/hostapd.c
|
||||||
|
+++ b/src/ap/hostapd.c
|
||||||
|
@@ -42,37 +42,8 @@ static int hostapd_setup_encryption(char
|
||||||
|
|
||||||
|
extern int wpa_debug_level;
|
||||||
|
|
||||||
|
-
|
||||||
|
-int hostapd_reload_config(struct hostapd_iface *iface)
|
||||||
|
+static int hostapd_reload_bss(struct hostapd_data *hapd)
|
||||||
|
{
|
||||||
|
- struct hostapd_data *hapd = iface->bss[0];
|
||||||
|
- struct hostapd_config *newconf, *oldconf;
|
||||||
|
- size_t j;
|
||||||
|
-
|
||||||
|
- if (iface->config_read_cb == NULL)
|
||||||
|
- return -1;
|
||||||
|
- newconf = iface->config_read_cb(iface->config_fname);
|
||||||
|
- if (newconf == NULL)
|
||||||
|
- return -1;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Deauthenticate all stations since the new configuration may not
|
||||||
|
- * allow them to use the BSS anymore.
|
||||||
|
- */
|
||||||
|
- for (j = 0; j < iface->num_bss; j++)
|
||||||
|
- hostapd_flush_old_stations(iface->bss[j]);
|
||||||
|
-
|
||||||
|
-#ifndef CONFIG_NO_RADIUS
|
||||||
|
- /* TODO: update dynamic data based on changed configuration
|
||||||
|
- * items (e.g., open/close sockets, etc.) */
|
||||||
|
- radius_client_flush(hapd->radius, 0);
|
||||||
|
-#endif /* CONFIG_NO_RADIUS */
|
||||||
|
-
|
||||||
|
- oldconf = hapd->iconf;
|
||||||
|
- hapd->iconf = newconf;
|
||||||
|
- hapd->conf = &newconf->bss[0];
|
||||||
|
- iface->conf = newconf;
|
||||||
|
-
|
||||||
|
if (hostapd_setup_wpa_psk(hapd->conf)) {
|
||||||
|
wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
|
||||||
|
"after reloading configuration");
|
||||||
|
@@ -110,10 +81,46 @@ int hostapd_reload_config(struct hostapd
|
||||||
|
wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver");
|
||||||
|
/* try to continue */
|
||||||
|
}
|
||||||
|
+ wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int hostapd_reload_config(struct hostapd_iface *iface)
|
||||||
|
+{
|
||||||
|
+ struct hostapd_data *hapd = iface->bss[0];
|
||||||
|
+ struct hostapd_config *newconf, *oldconf;
|
||||||
|
+ size_t j;
|
||||||
|
+
|
||||||
|
+ if (iface->config_read_cb == NULL)
|
||||||
|
+ return -1;
|
||||||
|
+ newconf = iface->config_read_cb(iface->config_fname);
|
||||||
|
+ if (newconf == NULL)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Deauthenticate all stations since the new configuration may not
|
||||||
|
+ * allow them to use the BSS anymore.
|
||||||
|
+ */
|
||||||
|
+ for (j = 0; j < iface->num_bss; j++)
|
||||||
|
+ hostapd_flush_old_stations(iface->bss[j]);
|
||||||
|
+
|
||||||
|
+#ifndef CONFIG_NO_RADIUS
|
||||||
|
+ /* TODO: update dynamic data based on changed configuration
|
||||||
|
+ * items (e.g., open/close sockets, etc.) */
|
||||||
|
+ radius_client_flush(hapd->radius, 0);
|
||||||
|
+#endif /* CONFIG_NO_RADIUS */
|
||||||
|
+
|
||||||
|
+ oldconf = hapd->iconf;
|
||||||
|
+ iface->conf = newconf;
|
||||||
|
+
|
||||||
|
+ for (j = 0; j < iface->num_bss; j++) {
|
||||||
|
+ hapd = iface->bss[j];
|
||||||
|
+ hapd->iconf = newconf;
|
||||||
|
+ hapd->conf = &newconf->bss[j];
|
||||||
|
+ hostapd_reload_bss(hapd);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
hostapd_config_free(oldconf);
|
||||||
|
|
||||||
|
- wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
13
package/hostapd/patches/450-reload_settings.patch
Normal file
13
package/hostapd/patches/450-reload_settings.patch
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
--- a/src/ap/hostapd.c
|
||||||
|
+++ b/src/ap/hostapd.c
|
||||||
|
@@ -112,6 +112,10 @@ int hostapd_reload_config(struct hostapd
|
||||||
|
oldconf = hapd->iconf;
|
||||||
|
iface->conf = newconf;
|
||||||
|
|
||||||
|
+ iface->freq = hostapd_hw_get_freq(hapd, hapd->iconf->channel);
|
||||||
|
+ if (iface->current_mode)
|
||||||
|
+ hostapd_prepare_rates(hapd, iface->current_mode);
|
||||||
|
+
|
||||||
|
for (j = 0; j < iface->num_bss; j++) {
|
||||||
|
hapd = iface->bss[j];
|
||||||
|
hapd->iconf = newconf;
|
63
package/hostapd/patches/451-nl80211_del_beacon_bss.patch
Normal file
63
package/hostapd/patches/451-nl80211_del_beacon_bss.patch
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
--- a/src/drivers/driver_nl80211.c
|
||||||
|
+++ b/src/drivers/driver_nl80211.c
|
||||||
|
@@ -1604,23 +1604,41 @@ wpa_driver_nl80211_finish_drv_init(struc
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
|
||||||
|
+static int wpa_driver_nl80211_del_bss_beacon(struct i802_bss *bss)
|
||||||
|
{
|
||||||
|
+ struct wpa_driver_nl80211_data *drv = bss->drv;
|
||||||
|
struct nl_msg *msg;
|
||||||
|
|
||||||
|
+ bss->beacon_set = 0;
|
||||||
|
+
|
||||||
|
msg = nlmsg_alloc();
|
||||||
|
if (!msg)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
|
||||||
|
0, NL80211_CMD_DEL_BEACON, 0);
|
||||||
|
- NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
|
||||||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
|
||||||
|
|
||||||
|
return send_and_recv_msgs(drv, msg, NULL, NULL);
|
||||||
|
nla_put_failure:
|
||||||
|
+ nlmsg_free(msg);
|
||||||
|
return -ENOBUFS;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
|
||||||
|
+{
|
||||||
|
+ struct i802_bss *bss;
|
||||||
|
+
|
||||||
|
+ for (bss = &drv->first_bss; bss; bss = bss->next)
|
||||||
|
+ wpa_driver_nl80211_del_bss_beacon(bss);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int wpa_driver_nl80211_stop_ap(void *priv)
|
||||||
|
+{
|
||||||
|
+ struct i802_bss *bss = priv;
|
||||||
|
+
|
||||||
|
+ wpa_driver_nl80211_del_beacon(bss->drv);
|
||||||
|
+}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
|
||||||
|
@@ -5512,4 +5530,5 @@ const struct wpa_driver_ops wpa_driver_n
|
||||||
|
.send_ft_action = nl80211_send_ft_action,
|
||||||
|
.signal_monitor = nl80211_signal_monitor,
|
||||||
|
.send_frame = nl80211_send_frame,
|
||||||
|
+ .stop_ap = wpa_driver_nl80211_stop_ap,
|
||||||
|
};
|
||||||
|
--- a/src/drivers/driver.h
|
||||||
|
+++ b/src/drivers/driver.h
|
||||||
|
@@ -1774,6 +1774,8 @@ struct wpa_driver_ops {
|
||||||
|
*/
|
||||||
|
int (*send_frame)(void *priv, const u8 *data, size_t data_len,
|
||||||
|
int encrypt);
|
||||||
|
+
|
||||||
|
+ int (*stop_ap)(void *priv);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
96
package/hostapd/patches/452-ctrl_iface_reload.patch
Normal file
96
package/hostapd/patches/452-ctrl_iface_reload.patch
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
--- a/hostapd/ctrl_iface.c
|
||||||
|
+++ b/hostapd/ctrl_iface.c
|
||||||
|
@@ -35,6 +35,7 @@
|
||||||
|
#include "ap/wps_hostapd.h"
|
||||||
|
#include "ap/ctrl_iface_ap.h"
|
||||||
|
#include "ctrl_iface.h"
|
||||||
|
+#include "config_file.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct wpa_ctrl_dst {
|
||||||
|
@@ -45,6 +46,7 @@ struct wpa_ctrl_dst {
|
||||||
|
int errors;
|
||||||
|
};
|
||||||
|
|
||||||
|
+static char *reload_opts = NULL;
|
||||||
|
|
||||||
|
static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
|
||||||
|
const char *buf, size_t len);
|
||||||
|
@@ -315,6 +317,66 @@ static int hostapd_ctrl_iface_wps_oob(st
|
||||||
|
#endif /* CONFIG_WPS_OOB */
|
||||||
|
#endif /* CONFIG_WPS */
|
||||||
|
|
||||||
|
+static int hostapd_ctrl_iface_set_down(struct hostapd_data *hapd)
|
||||||
|
+{
|
||||||
|
+ if (hapd->driver->stop_ap)
|
||||||
|
+ hapd->driver->stop_ap(hapd->drv_priv);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static char *get_option(char *opt, char *str)
|
||||||
|
+{
|
||||||
|
+ int len = strlen(str);
|
||||||
|
+
|
||||||
|
+ if (!strncmp(opt, str, len))
|
||||||
|
+ return opt + len;
|
||||||
|
+ else
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct hostapd_config *hostapd_ctrl_iface_config_read(const char *fname)
|
||||||
|
+{
|
||||||
|
+ struct hostapd_config *conf;
|
||||||
|
+ char *opt, *val;
|
||||||
|
+
|
||||||
|
+ conf = hostapd_config_read(fname);
|
||||||
|
+ if (!conf)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ for (opt = strtok(reload_opts, " ");
|
||||||
|
+ opt;
|
||||||
|
+ opt = strtok(NULL, " ")) {
|
||||||
|
+
|
||||||
|
+ if ((val = get_option(opt, "channel=")))
|
||||||
|
+ conf->channel = atoi(val);
|
||||||
|
+ else if ((val = get_option(opt, "ht_capab=")))
|
||||||
|
+ conf->ht_capab = atoi(val);
|
||||||
|
+ else if ((val = get_option(opt, "ht_capab_mask=")))
|
||||||
|
+ conf->ht_capab &= atoi(val);
|
||||||
|
+ else if ((val = get_option(opt, "sec_chan=")))
|
||||||
|
+ conf->secondary_channel = atoi(val);
|
||||||
|
+ else if ((val = get_option(opt, "hwmode=")))
|
||||||
|
+ conf->hw_mode = atoi(val);
|
||||||
|
+ else if ((val = get_option(opt, "ieee80211n=")))
|
||||||
|
+ conf->ieee80211n = atoi(val);
|
||||||
|
+ else
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return conf;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int hostapd_ctrl_iface_reload(struct hostapd_data *hapd, char *txt)
|
||||||
|
+{
|
||||||
|
+ struct hostapd_iface *iface = hapd->iface;
|
||||||
|
+
|
||||||
|
+ iface->config_read_cb = hostapd_ctrl_iface_config_read;
|
||||||
|
+ reload_opts = txt;
|
||||||
|
+
|
||||||
|
+ hostapd_reload_config(iface);
|
||||||
|
+
|
||||||
|
+ iface->config_read_cb = hostapd_config_read;
|
||||||
|
+}
|
||||||
|
|
||||||
|
static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
|
||||||
|
void *sock_ctx)
|
||||||
|
@@ -379,6 +441,10 @@ static void hostapd_ctrl_iface_receive(i
|
||||||
|
reply_len += res;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_NO_RADIUS */
|
||||||
|
+ } else if (os_strcmp(buf, "DOWN") == 0) {
|
||||||
|
+ hostapd_ctrl_iface_set_down(hapd);
|
||||||
|
+ } else if (os_strncmp(buf, "RELOAD ", 7) == 0) {
|
||||||
|
+ hostapd_ctrl_iface_reload(hapd, buf + 7);
|
||||||
|
} else if (os_strcmp(buf, "STA-FIRST") == 0) {
|
||||||
|
reply_len = hostapd_ctrl_iface_sta_first(hapd, reply,
|
||||||
|
reply_size);
|
211
package/hostapd/patches/453-ap_sta_support.patch
Normal file
211
package/hostapd/patches/453-ap_sta_support.patch
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
--- a/wpa_supplicant/wpa_supplicant_i.h
|
||||||
|
+++ b/wpa_supplicant/wpa_supplicant_i.h
|
||||||
|
@@ -98,6 +98,8 @@ struct wpa_interface {
|
||||||
|
* receiving of EAPOL frames from an additional interface.
|
||||||
|
*/
|
||||||
|
const char *bridge_ifname;
|
||||||
|
+
|
||||||
|
+ const char *hostapd_ctrl;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -316,6 +318,8 @@ struct wpa_supplicant {
|
||||||
|
#endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
|
||||||
|
char bridge_ifname[16];
|
||||||
|
|
||||||
|
+ struct wpa_ctrl *hostapd;
|
||||||
|
+
|
||||||
|
char *confname;
|
||||||
|
struct wpa_config *conf;
|
||||||
|
int countermeasures;
|
||||||
|
--- a/wpa_supplicant/Makefile
|
||||||
|
+++ b/wpa_supplicant/Makefile
|
||||||
|
@@ -51,6 +51,11 @@ OBJS_p += ../src/utils/wpa_debug.o
|
||||||
|
OBJS_p += ../src/utils/wpabuf.o
|
||||||
|
OBJS_c = wpa_cli.o ../src/common/wpa_ctrl.o
|
||||||
|
|
||||||
|
+ifdef MULTICALL
|
||||||
|
+OBJS += ../src/common/wpa_ctrl.o
|
||||||
|
+CFLAGS += -DMULTICALL
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
-include .config
|
||||||
|
-include $(if $(MULTICALL),../hostapd/.config)
|
||||||
|
|
||||||
|
--- a/wpa_supplicant/wpa_supplicant.c
|
||||||
|
+++ b/wpa_supplicant/wpa_supplicant.c
|
||||||
|
@@ -120,6 +120,55 @@ extern int wpa_debug_show_keys;
|
||||||
|
extern int wpa_debug_timestamp;
|
||||||
|
extern struct wpa_driver_ops *wpa_drivers[];
|
||||||
|
|
||||||
|
+#ifdef MULTICALL
|
||||||
|
+static int hostapd_stop(struct wpa_supplicant *wpa_s)
|
||||||
|
+{
|
||||||
|
+ const char *cmd = "DOWN";
|
||||||
|
+ char buf[256];
|
||||||
|
+ int len = sizeof(buf);
|
||||||
|
+
|
||||||
|
+ if (wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL) < 0) {
|
||||||
|
+ wpa_printf(MSG_ERROR, "\nFailed to stop hostapd AP interfaces\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int hostapd_reload(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
|
||||||
|
+{
|
||||||
|
+ char *cmd = NULL;
|
||||||
|
+ char buf[256];
|
||||||
|
+ int len = sizeof(buf);
|
||||||
|
+ int channel, hw_mode;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ if (!bss)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (bss->freq < 4000) {
|
||||||
|
+ hw_mode = HOSTAPD_MODE_IEEE80211G;
|
||||||
|
+ channel = (bss->freq - 2407) / 5;
|
||||||
|
+ } else {
|
||||||
|
+ hw_mode = HOSTAPD_MODE_IEEE80211A;
|
||||||
|
+ channel = (bss->freq - 5000) / 5;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (asprintf(&cmd, "RELOAD channel=%d sec_chan=0 hw_mode=%d ieee80211n=%d",
|
||||||
|
+ channel, hw_mode, !!bss->ht_capab) < 0) {
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL);
|
||||||
|
+ free(cmd);
|
||||||
|
+
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ wpa_printf(MSG_ERROR, "\nFailed to reload hostapd AP interfaces\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* Configure default/group WEP keys for static WEP */
|
||||||
|
int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
|
||||||
|
{
|
||||||
|
@@ -548,8 +597,16 @@ void wpa_supplicant_set_state(struct wpa
|
||||||
|
#ifndef IEEE8021X_EAPOL
|
||||||
|
wpa_drv_set_supp_port(wpa_s, 1);
|
||||||
|
#endif
|
||||||
|
+#ifdef MULTICALL
|
||||||
|
+ if (wpa_s->hostapd)
|
||||||
|
+ hostapd_reload(wpa_s, wpa_s->current_bss);
|
||||||
|
+#endif
|
||||||
|
} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
|
||||||
|
state == WPA_ASSOCIATED) {
|
||||||
|
+#ifdef MULTICALL
|
||||||
|
+ if (wpa_s->hostapd)
|
||||||
|
+ hostapd_stop(wpa_s);
|
||||||
|
+#endif
|
||||||
|
wpa_s->new_connection = 1;
|
||||||
|
wpa_drv_set_operstate(wpa_s, 0);
|
||||||
|
#ifndef IEEE8021X_EAPOL
|
||||||
|
@@ -1957,6 +2014,21 @@ static int wpa_supplicant_init_iface(str
|
||||||
|
os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
|
||||||
|
sizeof(wpa_s->bridge_ifname));
|
||||||
|
}
|
||||||
|
+#ifdef MULTICALL
|
||||||
|
+ if (iface->hostapd_ctrl) {
|
||||||
|
+ char *cmd = "DOWN";
|
||||||
|
+ char buf[256];
|
||||||
|
+ int len = sizeof(buf);
|
||||||
|
+
|
||||||
|
+ wpa_s->hostapd = wpa_ctrl_open(iface->hostapd_ctrl);
|
||||||
|
+ if (!wpa_s->hostapd) {
|
||||||
|
+ wpa_printf(MSG_ERROR, "\nFailed to connect to hostapd\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ if (hostapd_stop(wpa_s) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* RSNA Supplicant Key Management - INITIALIZE */
|
||||||
|
eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
|
||||||
|
--- a/wpa_supplicant/bss.c
|
||||||
|
+++ b/wpa_supplicant/bss.c
|
||||||
|
@@ -17,6 +17,7 @@
|
||||||
|
#include "utils/common.h"
|
||||||
|
#include "utils/eloop.h"
|
||||||
|
#include "common/ieee802_11_defs.h"
|
||||||
|
+#include "common/ieee802_11_common.h"
|
||||||
|
#include "drivers/driver.h"
|
||||||
|
#include "wpa_supplicant_i.h"
|
||||||
|
#include "config.h"
|
||||||
|
@@ -89,6 +90,8 @@ struct wpa_bss * wpa_bss_get(struct wpa_
|
||||||
|
|
||||||
|
static void wpa_bss_copy_res(struct wpa_bss *dst, struct wpa_scan_res *src)
|
||||||
|
{
|
||||||
|
+ struct ieee80211_ht_capabilities *capab;
|
||||||
|
+ struct ieee802_11_elems elems;
|
||||||
|
os_time_t usec;
|
||||||
|
|
||||||
|
dst->flags = src->flags;
|
||||||
|
@@ -101,6 +104,12 @@ static void wpa_bss_copy_res(struct wpa_
|
||||||
|
dst->level = src->level;
|
||||||
|
dst->tsf = src->tsf;
|
||||||
|
|
||||||
|
+ memset(&elems, 0, sizeof(elems));
|
||||||
|
+ ieee802_11_parse_elems((u8 *) (src + 1), src->ie_len, &elems, 0);
|
||||||
|
+ capab = (struct ieee80211_ht_capabilities *) elems.ht_capabilities;
|
||||||
|
+ if (capab)
|
||||||
|
+ dst->ht_capab = le_to_host16(capab->ht_capabilities_info);
|
||||||
|
+
|
||||||
|
os_get_time(&dst->last_update);
|
||||||
|
dst->last_update.sec -= src->age / 1000;
|
||||||
|
usec = (src->age % 1000) * 1000;
|
||||||
|
--- a/wpa_supplicant/bss.h
|
||||||
|
+++ b/wpa_supplicant/bss.h
|
||||||
|
@@ -56,6 +56,7 @@ struct wpa_bss {
|
||||||
|
unsigned int flags;
|
||||||
|
u8 bssid[ETH_ALEN];
|
||||||
|
u8 ssid[32];
|
||||||
|
+ u16 ht_capab;
|
||||||
|
size_t ssid_len;
|
||||||
|
int freq;
|
||||||
|
u16 beacon_int;
|
||||||
|
--- a/wpa_supplicant/main.c
|
||||||
|
+++ b/wpa_supplicant/main.c
|
||||||
|
@@ -31,7 +31,7 @@ static void usage(void)
|
||||||
|
"usage:\n"
|
||||||
|
" wpa_supplicant [-BddhKLqqstuvW] [-P<pid file>] "
|
||||||
|
"[-g<global ctrl>] \\\n"
|
||||||
|
- " -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] "
|
||||||
|
+ " -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-H<hostapd path>]"
|
||||||
|
"[-p<driver_param>] \\\n"
|
||||||
|
" [-b<br_ifname>] [-f<debug file>] \\\n"
|
||||||
|
" [-o<override driver>] [-O<override ctrl>] \\\n"
|
||||||
|
@@ -67,6 +67,7 @@ static void usage(void)
|
||||||
|
#endif /* CONFIG_DEBUG_SYSLOG */
|
||||||
|
printf(" -t = include timestamp in debug messages\n"
|
||||||
|
" -h = show this help text\n"
|
||||||
|
+ " -H = connect to a hostapd instance to manage state changes\n"
|
||||||
|
" -L = show license (GPL and BSD)\n"
|
||||||
|
" -o = override driver parameter for new interfaces\n"
|
||||||
|
" -O = override ctrl_interface parameter for new interfaces\n"
|
||||||
|
@@ -143,7 +144,7 @@ int main(int argc, char *argv[])
|
||||||
|
wpa_supplicant_fd_workaround();
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
- c = getopt(argc, argv, "b:Bc:C:D:df:g:hi:KLNo:O:p:P:qstuvW");
|
||||||
|
+ c = getopt(argc, argv, "b:Bc:C:D:df:g:hH:i:KLNo:O:p:P:qstuvW");
|
||||||
|
if (c < 0)
|
||||||
|
break;
|
||||||
|
switch (c) {
|
||||||
|
@@ -184,6 +185,9 @@ int main(int argc, char *argv[])
|
||||||
|
usage();
|
||||||
|
exitcode = 0;
|
||||||
|
goto out;
|
||||||
|
+ case 'H':
|
||||||
|
+ iface->hostapd_ctrl = optarg;
|
||||||
|
+ break;
|
||||||
|
case 'i':
|
||||||
|
iface->ifname = optarg;
|
||||||
|
break;
|
@ -8,12 +8,12 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=iw
|
PKG_NAME:=iw
|
||||||
PKG_VERSION:=0.9.19
|
PKG_VERSION:=0.9.21
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||||
PKG_SOURCE_URL:=http://wireless.kernel.org/download/iw/
|
PKG_SOURCE_URL:=http://wireless.kernel.org/download/iw/
|
||||||
PKG_MD5SUM:=3b88743f9c6ce8a7e2f5fd7d18fdea42
|
PKG_MD5SUM:=726db5f1fd6bc316434414770513ef81
|
||||||
PKG_BUILD_DEPENDS:=mac80211
|
PKG_BUILD_DEPENDS:=mac80211
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
@ -48,11 +48,9 @@ MAKE_FLAGS += \
|
|||||||
LIBS="-lm -lnl-tiny" \
|
LIBS="-lm -lnl-tiny" \
|
||||||
V=1
|
V=1
|
||||||
|
|
||||||
ifneq ($(CONFIG_LINUX_2_6),)
|
define Package/iw/install
|
||||||
define Package/iw/install
|
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/iw $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/iw $(1)/usr/sbin/
|
||||||
endef
|
endef
|
||||||
endif
|
|
||||||
|
|
||||||
$(eval $(call BuildPackage,iw))
|
$(eval $(call BuildPackage,iw))
|
||||||
|
183
package/iw/patches/001-nl80211_sync.patch
Normal file
183
package/iw/patches/001-nl80211_sync.patch
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
--- a/nl80211.h
|
||||||
|
+++ b/nl80211.h
|
||||||
|
@@ -295,7 +295,9 @@
|
||||||
|
* auth and assoc steps. For this, you need to specify the SSID in a
|
||||||
|
* %NL80211_ATTR_SSID attribute, and can optionally specify the association
|
||||||
|
* IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC,
|
||||||
|
- * %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_CONTROL_PORT.
|
||||||
|
+ * %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT,
|
||||||
|
+ * %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and
|
||||||
|
+ * %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT.
|
||||||
|
* It is also sent as an event, with the BSSID and response IEs when the
|
||||||
|
* connection is established or failed to be established. This can be
|
||||||
|
* determined by the STATUS_CODE attribute.
|
||||||
|
@@ -313,8 +315,8 @@
|
||||||
|
* channel for the specified amount of time. This can be used to do
|
||||||
|
* off-channel operations like transmit a Public Action frame and wait for
|
||||||
|
* a response while being associated to an AP on another channel.
|
||||||
|
- * %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify which
|
||||||
|
- * radio is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the
|
||||||
|
+ * %NL80211_ATTR_IFINDEX is used to specify which interface (and thus
|
||||||
|
+ * radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the
|
||||||
|
* frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be
|
||||||
|
* optionally used to specify additional channel parameters.
|
||||||
|
* %NL80211_ATTR_DURATION is used to specify the duration in milliseconds
|
||||||
|
@@ -385,6 +387,8 @@
|
||||||
|
* of any other interfaces, and other interfaces will again take
|
||||||
|
* precedence when they are used.
|
||||||
|
*
|
||||||
|
+ * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface.
|
||||||
|
+ *
|
||||||
|
* @NL80211_CMD_MAX: highest used command number
|
||||||
|
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||||
|
*/
|
||||||
|
@@ -487,6 +491,7 @@ enum nl80211_commands {
|
||||||
|
NL80211_CMD_NOTIFY_CQM,
|
||||||
|
|
||||||
|
NL80211_CMD_SET_CHANNEL,
|
||||||
|
+ NL80211_CMD_SET_WDS_PEER,
|
||||||
|
|
||||||
|
/* add new commands above here */
|
||||||
|
|
||||||
|
@@ -686,6 +691,15 @@ enum nl80211_commands {
|
||||||
|
* request, the driver will assume that the port is unauthorized until
|
||||||
|
* authorized by user space. Otherwise, port is marked authorized by
|
||||||
|
* default in station mode.
|
||||||
|
+ * @NL80211_ATTR_CONTROL_PORT_ETHERTYPE: A 16-bit value indicating the
|
||||||
|
+ * ethertype that will be used for key negotiation. It can be
|
||||||
|
+ * specified with the associate and connect commands. If it is not
|
||||||
|
+ * specified, the value defaults to 0x888E (PAE, 802.1X). This
|
||||||
|
+ * attribute is also used as a flag in the wiphy information to
|
||||||
|
+ * indicate that protocols other than PAE are supported.
|
||||||
|
+ * @NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT: When included along with
|
||||||
|
+ * %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom
|
||||||
|
+ * ethertype frames used for key negotiation must not be encrypted.
|
||||||
|
*
|
||||||
|
* @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver.
|
||||||
|
* We recommend using nested, driver-specific attributes within this.
|
||||||
|
@@ -787,6 +801,11 @@ enum nl80211_commands {
|
||||||
|
* This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING
|
||||||
|
* for non-automatic settings.
|
||||||
|
*
|
||||||
|
+ * @NL80211_ATTR_SUPPORT_IBSS_RSN: The device supports IBSS RSN, which mostly
|
||||||
|
+ * means support for per-station GTKs.
|
||||||
|
+ *
|
||||||
|
+ * @NL80211_ATTR_MCAST_RATE: Multicast tx rate (in 100 kbps) for IBSS
|
||||||
|
+ *
|
||||||
|
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||||
|
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||||
|
*/
|
||||||
|
@@ -951,6 +970,13 @@ enum nl80211_attrs {
|
||||||
|
NL80211_ATTR_RX_FRAME_TYPES,
|
||||||
|
NL80211_ATTR_FRAME_TYPE,
|
||||||
|
|
||||||
|
+ NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
|
||||||
|
+ NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,
|
||||||
|
+
|
||||||
|
+ NL80211_ATTR_SUPPORT_IBSS_RSN,
|
||||||
|
+
|
||||||
|
+ NL80211_ATTR_MCAST_RATE,
|
||||||
|
+
|
||||||
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
|
@@ -1006,6 +1032,8 @@ enum nl80211_attrs {
|
||||||
|
* @NL80211_IFTYPE_WDS: wireless distribution interface
|
||||||
|
* @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames
|
||||||
|
* @NL80211_IFTYPE_MESH_POINT: mesh point
|
||||||
|
+ * @NL80211_IFTYPE_P2P_CLIENT: P2P client
|
||||||
|
+ * @NL80211_IFTYPE_P2P_GO: P2P group owner
|
||||||
|
* @NL80211_IFTYPE_MAX: highest interface type number currently defined
|
||||||
|
* @NUM_NL80211_IFTYPES: number of defined interface types
|
||||||
|
*
|
||||||
|
@@ -1022,6 +1050,8 @@ enum nl80211_iftype {
|
||||||
|
NL80211_IFTYPE_WDS,
|
||||||
|
NL80211_IFTYPE_MONITOR,
|
||||||
|
NL80211_IFTYPE_MESH_POINT,
|
||||||
|
+ NL80211_IFTYPE_P2P_CLIENT,
|
||||||
|
+ NL80211_IFTYPE_P2P_GO,
|
||||||
|
|
||||||
|
/* keep last */
|
||||||
|
NUM_NL80211_IFTYPES,
|
||||||
|
@@ -1111,6 +1141,8 @@ enum nl80211_rate_info {
|
||||||
|
* @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station)
|
||||||
|
* @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this
|
||||||
|
* station)
|
||||||
|
+ * @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station)
|
||||||
|
+ * @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station)
|
||||||
|
*/
|
||||||
|
enum nl80211_sta_info {
|
||||||
|
__NL80211_STA_INFO_INVALID,
|
||||||
|
@@ -1124,6 +1156,8 @@ enum nl80211_sta_info {
|
||||||
|
NL80211_STA_INFO_TX_BITRATE,
|
||||||
|
NL80211_STA_INFO_RX_PACKETS,
|
||||||
|
NL80211_STA_INFO_TX_PACKETS,
|
||||||
|
+ NL80211_STA_INFO_TX_RETRIES,
|
||||||
|
+ NL80211_STA_INFO_TX_FAILED,
|
||||||
|
|
||||||
|
/* keep last */
|
||||||
|
__NL80211_STA_INFO_AFTER_LAST,
|
||||||
|
@@ -1382,6 +1416,17 @@ enum nl80211_reg_rule_flags {
|
||||||
|
* @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved
|
||||||
|
* @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel
|
||||||
|
* @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm)
|
||||||
|
+ * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used
|
||||||
|
+ * @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio
|
||||||
|
+ * spent on this channel
|
||||||
|
+ * @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary
|
||||||
|
+ * channel was sensed busy (either due to activity or energy detect)
|
||||||
|
+ * @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension
|
||||||
|
+ * channel was sensed busy
|
||||||
|
+ * @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent
|
||||||
|
+ * receiving data
|
||||||
|
+ * @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent
|
||||||
|
+ * transmitting data
|
||||||
|
* @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
|
||||||
|
* currently defined
|
||||||
|
* @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
|
||||||
|
@@ -1390,6 +1435,12 @@ enum nl80211_survey_info {
|
||||||
|
__NL80211_SURVEY_INFO_INVALID,
|
||||||
|
NL80211_SURVEY_INFO_FREQUENCY,
|
||||||
|
NL80211_SURVEY_INFO_NOISE,
|
||||||
|
+ NL80211_SURVEY_INFO_IN_USE,
|
||||||
|
+ NL80211_SURVEY_INFO_CHANNEL_TIME,
|
||||||
|
+ NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
|
||||||
|
+ NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
|
||||||
|
+ NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
|
||||||
|
+ NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
|
||||||
|
|
||||||
|
/* keep last */
|
||||||
|
__NL80211_SURVEY_INFO_AFTER_LAST,
|
||||||
|
@@ -1636,11 +1687,14 @@ enum nl80211_auth_type {
|
||||||
|
* @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key
|
||||||
|
* @NL80211_KEYTYPE_PAIRWISE: Pairwise (unicast/individual) key
|
||||||
|
* @NL80211_KEYTYPE_PEERKEY: PeerKey (DLS)
|
||||||
|
+ * @NUM_NL80211_KEYTYPES: number of defined key types
|
||||||
|
*/
|
||||||
|
enum nl80211_key_type {
|
||||||
|
NL80211_KEYTYPE_GROUP,
|
||||||
|
NL80211_KEYTYPE_PAIRWISE,
|
||||||
|
NL80211_KEYTYPE_PEERKEY,
|
||||||
|
+
|
||||||
|
+ NUM_NL80211_KEYTYPES
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -1671,6 +1725,9 @@ enum nl80211_wpa_versions {
|
||||||
|
* CCMP keys, each six bytes in little endian
|
||||||
|
* @NL80211_KEY_DEFAULT: flag indicating default key
|
||||||
|
* @NL80211_KEY_DEFAULT_MGMT: flag indicating default management key
|
||||||
|
+ * @NL80211_KEY_TYPE: the key type from enum nl80211_key_type, if not
|
||||||
|
+ * specified the default depends on whether a MAC address was
|
||||||
|
+ * given with the command using the key or not (u32)
|
||||||
|
* @__NL80211_KEY_AFTER_LAST: internal
|
||||||
|
* @NL80211_KEY_MAX: highest key attribute
|
||||||
|
*/
|
||||||
|
@@ -1682,6 +1739,7 @@ enum nl80211_key_attributes {
|
||||||
|
NL80211_KEY_SEQ,
|
||||||
|
NL80211_KEY_DEFAULT,
|
||||||
|
NL80211_KEY_DEFAULT_MGMT,
|
||||||
|
+ NL80211_KEY_TYPE,
|
||||||
|
|
||||||
|
/* keep last */
|
||||||
|
__NL80211_KEY_AFTER_LAST,
|
@ -1,167 +0,0 @@
|
|||||||
--- a/nl80211.h
|
|
||||||
+++ b/nl80211.h
|
|
||||||
@@ -270,6 +270,35 @@
|
|
||||||
* @NL80211_CMD_SET_WIPHY_NETNS: Set a wiphy's netns. Note that all devices
|
|
||||||
* associated with this wiphy must be down and will follow.
|
|
||||||
*
|
|
||||||
+ * @NL80211_CMD_REMAIN_ON_CHANNEL: Request to remain awake on the specified
|
|
||||||
+ * channel for the specified amount of time. This can be used to do
|
|
||||||
+ * off-channel operations like transmit a Public Action frame and wait for
|
|
||||||
+ * a response while being associated to an AP on another channel.
|
|
||||||
+ * %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify which
|
|
||||||
+ * radio is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the
|
|
||||||
+ * frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be
|
|
||||||
+ * optionally used to specify additional channel parameters.
|
|
||||||
+ * %NL80211_ATTR_DURATION is used to specify the duration in milliseconds
|
|
||||||
+ * to remain on the channel. This command is also used as an event to
|
|
||||||
+ * notify when the requested duration starts (it may take a while for the
|
|
||||||
+ * driver to schedule this time due to other concurrent needs for the
|
|
||||||
+ * radio).
|
|
||||||
+ * When called, this operation returns a cookie (%NL80211_ATTR_COOKIE)
|
|
||||||
+ * that will be included with any events pertaining to this request;
|
|
||||||
+ * the cookie is also used to cancel the request.
|
|
||||||
+ * @NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL: This command can be used to cancel a
|
|
||||||
+ * pending remain-on-channel duration if the desired operation has been
|
|
||||||
+ * completed prior to expiration of the originally requested duration.
|
|
||||||
+ * %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the
|
|
||||||
+ * radio. The %NL80211_ATTR_COOKIE attribute must be given as well to
|
|
||||||
+ * uniquely identify the request.
|
|
||||||
+ * This command is also used as an event to notify when a requested
|
|
||||||
+ * remain-on-channel duration has expired.
|
|
||||||
+ *
|
|
||||||
+ * @NL80211_CMD_SET_TX_BITRATE_MASK: Set the mask of rates to be used in TX
|
|
||||||
+ * rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface
|
|
||||||
+ * and @NL80211_ATTR_TX_RATES the set of allowed rates.
|
|
||||||
+ *
|
|
||||||
* @NL80211_CMD_MAX: highest used command number
|
|
||||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
|
||||||
*/
|
|
||||||
@@ -349,6 +378,15 @@ enum nl80211_commands {
|
|
||||||
NL80211_CMD_GET_SURVEY,
|
|
||||||
NL80211_CMD_NEW_SURVEY_RESULTS,
|
|
||||||
|
|
||||||
+ NL80211_CMD_SET_PMKSA,
|
|
||||||
+ NL80211_CMD_DEL_PMKSA,
|
|
||||||
+ NL80211_CMD_FLUSH_PMKSA,
|
|
||||||
+
|
|
||||||
+ NL80211_CMD_REMAIN_ON_CHANNEL,
|
|
||||||
+ NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
|
|
||||||
+
|
|
||||||
+ NL80211_CMD_SET_TX_BITRATE_MASK,
|
|
||||||
+
|
|
||||||
/* add new commands above here */
|
|
||||||
|
|
||||||
/* used to define NL80211_CMD_MAX below */
|
|
||||||
@@ -398,6 +436,8 @@ enum nl80211_commands {
|
|
||||||
* @NL80211_ATTR_WIPHY_RTS_THRESHOLD: RTS threshold (TX frames with length
|
|
||||||
* larger than or equal to this use RTS/CTS handshake); allowed range:
|
|
||||||
* 0..65536, disable with (u32)-1; dot11RTSThreshold; u32
|
|
||||||
+ * @NL80211_ATTR_WIPHY_COVERAGE_CLASS: Coverage Class as defined by IEEE 802.11
|
|
||||||
+ * section 7.3.2.9; dot11CoverageClass; u8
|
|
||||||
*
|
|
||||||
* @NL80211_ATTR_IFINDEX: network interface index of the device to operate on
|
|
||||||
* @NL80211_ATTR_IFNAME: network interface name
|
|
||||||
@@ -598,6 +638,21 @@ enum nl80211_commands {
|
|
||||||
* the survey response for %NL80211_CMD_GET_SURVEY, nested attribute
|
|
||||||
* containing info as possible, see &enum survey_info.
|
|
||||||
*
|
|
||||||
+ * @NL80211_ATTR_PMKID: PMK material for PMKSA caching.
|
|
||||||
+ * @NL80211_ATTR_MAX_NUM_PMKIDS: maximum number of PMKIDs a firmware can
|
|
||||||
+ * cache, a wiphy attribute.
|
|
||||||
+ *
|
|
||||||
+ * @NL80211_ATTR_DURATION: Duration of an operation in milliseconds, u32.
|
|
||||||
+ *
|
|
||||||
+ * @NL80211_ATTR_COOKIE: Generic 64-bit cookie to identify objects.
|
|
||||||
+ *
|
|
||||||
+ * @NL80211_ATTR_TX_RATES: Nested set of attributes
|
|
||||||
+ * (enum nl80211_tx_rate_attributes) describing TX rates per band. The
|
|
||||||
+ * enum nl80211_band value is used as the index (nla_type() of the nested
|
|
||||||
+ * data. If a band is not included, it will be configured to allow all
|
|
||||||
+ * rates based on negotiated supported rates information. This attribute
|
|
||||||
+ * is used with %NL80211_CMD_SET_TX_BITRATE_MASK.
|
|
||||||
+ *
|
|
||||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
|
||||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
|
||||||
*/
|
|
||||||
@@ -732,6 +787,17 @@ enum nl80211_attrs {
|
|
||||||
|
|
||||||
NL80211_ATTR_SURVEY_INFO,
|
|
||||||
|
|
||||||
+ NL80211_ATTR_PMKID,
|
|
||||||
+ NL80211_ATTR_MAX_NUM_PMKIDS,
|
|
||||||
+
|
|
||||||
+ NL80211_ATTR_DURATION,
|
|
||||||
+
|
|
||||||
+ NL80211_ATTR_COOKIE,
|
|
||||||
+
|
|
||||||
+ NL80211_ATTR_WIPHY_COVERAGE_CLASS,
|
|
||||||
+
|
|
||||||
+ NL80211_ATTR_TX_RATES,
|
|
||||||
+
|
|
||||||
/* add attributes here, update the policy in nl80211.c */
|
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
|
||||||
@@ -1312,13 +1378,20 @@ enum nl80211_channel_type {
|
|
||||||
* @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16)
|
|
||||||
* @NL80211_BSS_CAPABILITY: capability field (CPU order, u16)
|
|
||||||
* @NL80211_BSS_INFORMATION_ELEMENTS: binary attribute containing the
|
|
||||||
- * raw information elements from the probe response/beacon (bin)
|
|
||||||
+ * raw information elements from the probe response/beacon (bin);
|
|
||||||
+ * if the %NL80211_BSS_BEACON_IES attribute is present, the IEs here are
|
|
||||||
+ * from a Probe Response frame; otherwise they are from a Beacon frame.
|
|
||||||
+ * However, if the driver does not indicate the source of the IEs, these
|
|
||||||
+ * IEs may be from either frame subtype.
|
|
||||||
* @NL80211_BSS_SIGNAL_MBM: signal strength of probe response/beacon
|
|
||||||
* in mBm (100 * dBm) (s32)
|
|
||||||
* @NL80211_BSS_SIGNAL_UNSPEC: signal strength of the probe response/beacon
|
|
||||||
* in unspecified units, scaled to 0..100 (u8)
|
|
||||||
* @NL80211_BSS_STATUS: status, if this BSS is "used"
|
|
||||||
* @NL80211_BSS_SEEN_MS_AGO: age of this BSS entry in ms
|
|
||||||
+ * @NL80211_BSS_BEACON_IES: binary attribute containing the raw information
|
|
||||||
+ * elements from a Beacon frame (bin); not present if no Beacon frame has
|
|
||||||
+ * yet been received
|
|
||||||
* @__NL80211_BSS_AFTER_LAST: internal
|
|
||||||
* @NL80211_BSS_MAX: highest BSS attribute
|
|
||||||
*/
|
|
||||||
@@ -1334,6 +1407,7 @@ enum nl80211_bss {
|
|
||||||
NL80211_BSS_SIGNAL_UNSPEC,
|
|
||||||
NL80211_BSS_STATUS,
|
|
||||||
NL80211_BSS_SEEN_MS_AGO,
|
|
||||||
+ NL80211_BSS_BEACON_IES,
|
|
||||||
|
|
||||||
/* keep last */
|
|
||||||
__NL80211_BSS_AFTER_LAST,
|
|
||||||
@@ -1431,4 +1505,33 @@ enum nl80211_key_attributes {
|
|
||||||
NL80211_KEY_MAX = __NL80211_KEY_AFTER_LAST - 1
|
|
||||||
};
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * enum nl80211_tx_rate_attributes - TX rate set attributes
|
|
||||||
+ * @__NL80211_TXRATE_INVALID: invalid
|
|
||||||
+ * @NL80211_TXRATE_LEGACY: Legacy (non-MCS) rates allowed for TX rate selection
|
|
||||||
+ * in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with
|
|
||||||
+ * 1 = 500 kbps) but without the IE length restriction (at most
|
|
||||||
+ * %NL80211_MAX_SUPP_RATES in a single array).
|
|
||||||
+ * @__NL80211_TXRATE_AFTER_LAST: internal
|
|
||||||
+ * @NL80211_TXRATE_MAX: highest TX rate attribute
|
|
||||||
+ */
|
|
||||||
+enum nl80211_tx_rate_attributes {
|
|
||||||
+ __NL80211_TXRATE_INVALID,
|
|
||||||
+ NL80211_TXRATE_LEGACY,
|
|
||||||
+
|
|
||||||
+ /* keep last */
|
|
||||||
+ __NL80211_TXRATE_AFTER_LAST,
|
|
||||||
+ NL80211_TXRATE_MAX = __NL80211_TXRATE_AFTER_LAST - 1
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * enum nl80211_band - Frequency band
|
|
||||||
+ * @NL80211_BAND_2GHZ - 2.4 GHz ISM band
|
|
||||||
+ * @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz)
|
|
||||||
+ */
|
|
||||||
+enum nl80211_band {
|
|
||||||
+ NL80211_BAND_2GHZ,
|
|
||||||
+ NL80211_BAND_5GHZ,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
#endif /* __LINUX_NL80211_H */
|
|
@ -1,81 +0,0 @@
|
|||||||
--- a/info.c
|
|
||||||
+++ b/info.c
|
|
||||||
@@ -156,6 +156,14 @@ static int print_phy_handler(struct nl_m
|
|
||||||
printf("\tRTS threshold: %d\n", rts);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (tb_msg[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
|
|
||||||
+ unsigned char coverage;
|
|
||||||
+
|
|
||||||
+ coverage = nla_get_u8(tb_msg[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
|
|
||||||
+ /* See handle_distance() for an explanation where the '450' comes from */
|
|
||||||
+ printf("\tCoverage class: %d (up to %dm)\n", coverage, 450 * coverage);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (!tb_msg[NL80211_ATTR_SUPPORTED_IFTYPES])
|
|
||||||
goto commands;
|
|
||||||
|
|
||||||
--- a/phy.c
|
|
||||||
+++ b/phy.c
|
|
||||||
@@ -164,3 +164,61 @@ static int handle_netns(struct nl80211_s
|
|
||||||
COMMAND(set, netns, "<pid>",
|
|
||||||
NL80211_CMD_SET_WIPHY_NETNS, 0, CIB_PHY, handle_netns,
|
|
||||||
"Put this wireless device into a different network namespace");
|
|
||||||
+
|
|
||||||
+static int handle_coverage(struct nl80211_state *state,
|
|
||||||
+ struct nl_cb *cb,
|
|
||||||
+ struct nl_msg *msg,
|
|
||||||
+ int argc, char **argv)
|
|
||||||
+{
|
|
||||||
+ unsigned int coverage;
|
|
||||||
+
|
|
||||||
+ if (argc != 1)
|
|
||||||
+ return 1;
|
|
||||||
+
|
|
||||||
+ coverage = strtoul(argv[0], NULL, 10);
|
|
||||||
+ if (coverage > 255)
|
|
||||||
+ return 1;
|
|
||||||
+
|
|
||||||
+ NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, coverage);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+ nla_put_failure:
|
|
||||||
+ return -ENOBUFS;
|
|
||||||
+}
|
|
||||||
+COMMAND(set, coverage, "<coverage class>",
|
|
||||||
+ NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_coverage,
|
|
||||||
+ "Set coverage class (1 for every 3 usec of air propagation time).\n"
|
|
||||||
+ "Valid values: 0 - 255.");
|
|
||||||
+
|
|
||||||
+static int handle_distance(struct nl80211_state *state,
|
|
||||||
+ struct nl_cb *cb,
|
|
||||||
+ struct nl_msg *msg,
|
|
||||||
+ int argc, char **argv)
|
|
||||||
+{
|
|
||||||
+ unsigned int distance, coverage;
|
|
||||||
+
|
|
||||||
+ if (argc != 1)
|
|
||||||
+ return 1;
|
|
||||||
+
|
|
||||||
+ distance = strtoul(argv[0], NULL, 10);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * Divide double the distance by the speed of light in m/usec (300) to
|
|
||||||
+ * get round-trip time in microseconds and then divide the result by
|
|
||||||
+ * three to get coverage class as specified in IEEE 802.11-2007 table
|
|
||||||
+ * 7-27. Values are rounded upwards.
|
|
||||||
+ */
|
|
||||||
+ coverage = (distance + 449) / 450;
|
|
||||||
+ if (coverage > 255)
|
|
||||||
+ return 1;
|
|
||||||
+
|
|
||||||
+ NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, coverage);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+ nla_put_failure:
|
|
||||||
+ return -ENOBUFS;
|
|
||||||
+}
|
|
||||||
+COMMAND(set, distance, "<distance>",
|
|
||||||
+ NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_distance,
|
|
||||||
+ "Set appropriate coverage class for given link distance in meters.\n"
|
|
||||||
+ "Valid values: 0 - 114750");
|
|
14
package/iw/patches/100-survey_freq_in_use.patch
Normal file
14
package/iw/patches/100-survey_freq_in_use.patch
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
--- a/survey.c
|
||||||
|
+++ b/survey.c
|
||||||
|
@@ -44,8 +44,9 @@ static int print_survey_handler(struct n
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sinfo[NL80211_SURVEY_INFO_FREQUENCY])
|
||||||
|
- printf("\tfrequency:\t%u MHz\n",
|
||||||
|
- nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]));
|
||||||
|
+ printf("\tfrequency:\t%u MHz%s\n",
|
||||||
|
+ nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]),
|
||||||
|
+ sinfo[NL80211_SURVEY_INFO_IN_USE] ? " [in use]" : "");
|
||||||
|
if (sinfo[NL80211_SURVEY_INFO_NOISE])
|
||||||
|
printf("\tnoise:\t\t%d dBm\n",
|
||||||
|
(int8_t)nla_get_u8(sinfo[NL80211_SURVEY_INFO_NOISE]));
|
@ -1,30 +0,0 @@
|
|||||||
--- a/interface.c
|
|
||||||
+++ b/interface.c
|
|
||||||
@@ -260,6 +260,27 @@ static int print_iface_handler(struct nl
|
|
||||||
printf("%s\tifindex %d\n", indent, nla_get_u32(tb_msg[NL80211_ATTR_IFINDEX]));
|
|
||||||
if (tb_msg[NL80211_ATTR_IFTYPE])
|
|
||||||
printf("%s\ttype %s\n", indent, iftype_name(nla_get_u32(tb_msg[NL80211_ATTR_IFTYPE])));
|
|
||||||
+ if (tb_msg[NL80211_ATTR_WIPHY_FREQ]) {
|
|
||||||
+ const char *mode;
|
|
||||||
+
|
|
||||||
+ if (tb_msg[NL80211_ATTR_WIPHY_CHANNEL_TYPE])
|
|
||||||
+ switch(nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_CHANNEL_TYPE])) {
|
|
||||||
+ case NL80211_CHAN_HT20:
|
|
||||||
+ mode = "HT20";
|
|
||||||
+ break;
|
|
||||||
+ case NL80211_CHAN_HT40PLUS:
|
|
||||||
+ mode = "HT40+";
|
|
||||||
+ break;
|
|
||||||
+ case NL80211_CHAN_HT40MINUS:
|
|
||||||
+ mode = "HT40-";
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ mode = "";
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ printf("%s\tfrequency %d MHz %s\n", indent, nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_FREQ]), mode);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
|
|
||||||
return NL_SKIP;
|
|
||||||
}
|
|
32
package/iw/patches/110-survey_phy_stats.patch
Normal file
32
package/iw/patches/110-survey_phy_stats.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
--- a/survey.c
|
||||||
|
+++ b/survey.c
|
||||||
|
@@ -44,12 +44,27 @@ static int print_survey_handler(struct n
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sinfo[NL80211_SURVEY_INFO_FREQUENCY])
|
||||||
|
- printf("\tfrequency:\t%u MHz%s\n",
|
||||||
|
+ printf("\tfrequency:\t\t\t%u MHz%s\n",
|
||||||
|
nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]),
|
||||||
|
sinfo[NL80211_SURVEY_INFO_IN_USE] ? " [in use]" : "");
|
||||||
|
if (sinfo[NL80211_SURVEY_INFO_NOISE])
|
||||||
|
- printf("\tnoise:\t\t%d dBm\n",
|
||||||
|
+ printf("\tnoise:\t\t\t\t%d dBm\n",
|
||||||
|
(int8_t)nla_get_u8(sinfo[NL80211_SURVEY_INFO_NOISE]));
|
||||||
|
+ if (sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME])
|
||||||
|
+ printf("\tchannel active time:\t\t%lld ms\n",
|
||||||
|
+ (int64_t)nla_get_u64(sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME]));
|
||||||
|
+ if (sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY])
|
||||||
|
+ printf("\tchannel busy time:\t\t%lld ms\n",
|
||||||
|
+ (int64_t)nla_get_u64(sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY]));
|
||||||
|
+ if (sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY])
|
||||||
|
+ printf("\textension channel busy time:\t%lld ms\n",
|
||||||
|
+ (int64_t)nla_get_u64(sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY]));
|
||||||
|
+ if (sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_RX])
|
||||||
|
+ printf("\tchannel receive time:\t\t%lld ms\n",
|
||||||
|
+ (int64_t)nla_get_u64(sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_RX]));
|
||||||
|
+ if (sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_TX])
|
||||||
|
+ printf("\tchannel transmit time:\t\t%lld ms\n",
|
||||||
|
+ (int64_t)nla_get_u64(sinfo[NL80211_SURVEY_INFO_CHANNEL_TIME_TX]));
|
||||||
|
return NL_SKIP;
|
||||||
|
}
|
||||||
|
|
32
package/iw/patches/120-ibss_mcast_rate.patch
Normal file
32
package/iw/patches/120-ibss_mcast_rate.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
--- a/ibss.c
|
||||||
|
+++ b/ibss.c
|
||||||
|
@@ -83,6 +83,20 @@ static int join_ibss(struct nl80211_stat
|
||||||
|
argc--;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* multicast rate */
|
||||||
|
+ if (argc > 1 && strcmp(argv[0], "mcast-rate") == 0) {
|
||||||
|
+ argv++;
|
||||||
|
+ argc--;
|
||||||
|
+
|
||||||
|
+ rate = strtod(argv[0], &end);
|
||||||
|
+ if (*end != '\0')
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, (int) rate * 10);
|
||||||
|
+ argv++;
|
||||||
|
+ argc--;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!argc)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
@@ -109,7 +123,7 @@ COMMAND(ibss, leave, NULL,
|
||||||
|
"Leave the current IBSS cell.");
|
||||||
|
COMMAND(ibss, join,
|
||||||
|
"<SSID> <freq in MHz> [fixed-freq] [<fixed bssid>] "
|
||||||
|
- "[basic-rates <rate in Mbps,rate2,...>] [key d:0:abcde]",
|
||||||
|
+ "[basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] [key d:0:abcde]",
|
||||||
|
NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
|
||||||
|
"Join the IBSS cell with the given SSID, if it doesn't exist create\n"
|
||||||
|
"it on the given frequency. When fixed frequency is requested, don't\n"
|
@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||||||
|
|
||||||
PKG_NAME:=mac80211
|
PKG_NAME:=mac80211
|
||||||
|
|
||||||
PKG_VERSION:=2010-09-14
|
PKG_VERSION:=2010-10-19
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||||
# http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \
|
# http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \
|
||||||
# http://wireless.kernel.org/download/compat-wireless-2.6
|
# http://wireless.kernel.org/download/compat-wireless-2.6
|
||||||
PKG_MD5SUM:=88511287e013ff0f2843b3679f52f335
|
PKG_MD5SUM:=3bad1752f0154baa57a4d94774bd2ccf
|
||||||
|
|
||||||
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)
|
||||||
@ -24,7 +24,6 @@ PKG_BUILD_PARALLEL:=1
|
|||||||
PKG_CONFIG_DEPENDS:= \
|
PKG_CONFIG_DEPENDS:= \
|
||||||
CONFIG_PACKAGE_kmod-mac80211 \
|
CONFIG_PACKAGE_kmod-mac80211 \
|
||||||
CONFIG_PACKAGE_MAC80211_DEBUGFS \
|
CONFIG_PACKAGE_MAC80211_DEBUGFS \
|
||||||
CONFIG_PACKAGE_ATH9K_USE_MINSTREL \
|
|
||||||
CONFIG_PACKAGE_ATH_DEBUG \
|
CONFIG_PACKAGE_ATH_DEBUG \
|
||||||
CONFIG_ATH_USER_REGD \
|
CONFIG_ATH_USER_REGD \
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ endef
|
|||||||
define KernelPackage/cfg80211
|
define KernelPackage/cfg80211
|
||||||
$(call KernelPackage/mac80211/Default)
|
$(call KernelPackage/mac80211/Default)
|
||||||
TITLE:=cfg80211 - wireless configuration API
|
TITLE:=cfg80211 - wireless configuration API
|
||||||
DEPENDS+= +wireless-tools +iw @!LINUX_2_6_25 +crda
|
DEPENDS+= +wireless-tools +iw @!LINUX_2_6_25 @!LINUX_2_4 +crda
|
||||||
ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
|
ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1)
|
||||||
FILES:= \
|
FILES:= \
|
||||||
$(PKG_BUILD_DIR)/compat/compat.ko \
|
$(PKG_BUILD_DIR)/compat/compat.ko \
|
||||||
@ -137,7 +136,7 @@ endef
|
|||||||
|
|
||||||
define KernelPackage/p54-common
|
define KernelPackage/p54-common
|
||||||
$(call KernelPackage/p54/Default)
|
$(call KernelPackage/p54/Default)
|
||||||
DEPENDS+= @PCI_SUPPORT||@USB_SUPPORT||@TARGET_omap24xx +kmod-mac80211
|
DEPENDS+= @PCI_SUPPORT||@USB_SUPPORT||@TARGET_omap24xx +kmod-mac80211 +kmod-crc-ccitt
|
||||||
TITLE+= (COMMON)
|
TITLE+= (COMMON)
|
||||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54common.ko
|
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54common.ko
|
||||||
AUTOLOAD:=$(call AutoLoad,30,p54common)
|
AUTOLOAD:=$(call AutoLoad,30,p54common)
|
||||||
@ -446,17 +445,6 @@ This module adds support for wireless adapters based on
|
|||||||
Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
|
Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define KernelPackage/ath9k/config
|
|
||||||
menu "Configuration"
|
|
||||||
depends PACKAGE_kmod-ath9k
|
|
||||||
|
|
||||||
config PACKAGE_ATH9K_USE_MINSTREL
|
|
||||||
bool "use the new minstrel_ht rate control for ath9k"
|
|
||||||
default y
|
|
||||||
|
|
||||||
endmenu
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/carl9170
|
define KernelPackage/carl9170
|
||||||
$(call KernelPackage/mac80211/Default)
|
$(call KernelPackage/mac80211/Default)
|
||||||
TITLE:=Driver for Atheros AR9170 USB sticks
|
TITLE:=Driver for Atheros AR9170 USB sticks
|
||||||
@ -837,7 +825,6 @@ BUILDFLAGS:= \
|
|||||||
-D__CONFIG_MAC80211_RC_DEFAULT=minstrel \
|
-D__CONFIG_MAC80211_RC_DEFAULT=minstrel \
|
||||||
-DCONFIG_MAC80211_RC_MINSTREL_HT \
|
-DCONFIG_MAC80211_RC_MINSTREL_HT \
|
||||||
$(if $(CONFIG_ATH_USER_REGD),-DATH_USER_REGD=1) \
|
$(if $(CONFIG_ATH_USER_REGD),-DATH_USER_REGD=1) \
|
||||||
$(if $(CONFIG_PACKAGE_ATH9K_USE_MINSTREL),-DATH9K_USE_MINSTREL) \
|
|
||||||
$(if $(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS),-DCONFIG_RT2X00_LIB_DEBUGFS) \
|
$(if $(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS),-DCONFIG_RT2X00_LIB_DEBUGFS) \
|
||||||
$(if $(CONFIG_PACKAGE_RT2X00_DEBUG),-DCONFIG_RT2X00_DEBUG) \
|
$(if $(CONFIG_PACKAGE_RT2X00_DEBUG),-DCONFIG_RT2X00_DEBUG) \
|
||||||
$(if $(NEED_RT2X00_LIB_HT),-DCONFIG_RT2X00_LIB_HT) \
|
$(if $(NEED_RT2X00_LIB_HT),-DCONFIG_RT2X00_LIB_HT) \
|
||||||
|
@ -165,6 +165,14 @@ scan_mac80211() {
|
|||||||
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${monitor:+$monitor }${mesh:+$mesh}"
|
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${monitor:+$monitor }${mesh:+$mesh}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_phy_interfaces() {
|
||||||
|
local phy="$1"
|
||||||
|
if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then
|
||||||
|
ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null;
|
||||||
|
else
|
||||||
|
ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
disable_mac80211() (
|
disable_mac80211() (
|
||||||
local device="$1"
|
local device="$1"
|
||||||
@ -181,7 +189,7 @@ disable_mac80211() (
|
|||||||
done
|
done
|
||||||
|
|
||||||
include /lib/network
|
include /lib/network
|
||||||
for wdev in $(ls /sys/class/ieee80211/${phy}/device/net 2>/dev/null); do
|
for wdev in $(list_phy_interfaces "$phy"); do
|
||||||
[ -f "/var/run/$wdev.pid" ] && kill $(cat /var/run/$wdev.pid) >&/dev/null 2>&1
|
[ -f "/var/run/$wdev.pid" ] && kill $(cat /var/run/$wdev.pid) >&/dev/null 2>&1
|
||||||
for pid in `pidof wpa_supplicant`; do
|
for pid in `pidof wpa_supplicant`; do
|
||||||
grep "$wdev" /proc/$pid/cmdline >/dev/null && \
|
grep "$wdev" /proc/$pid/cmdline >/dev/null && \
|
||||||
@ -214,6 +222,7 @@ enable_mac80211() {
|
|||||||
local macidx=0
|
local macidx=0
|
||||||
local apidx=0
|
local apidx=0
|
||||||
fixed=""
|
fixed=""
|
||||||
|
local hostapd_ctrl=""
|
||||||
|
|
||||||
[ -n "$country" ] && iw reg set "$country"
|
[ -n "$country" ] && iw reg set "$country"
|
||||||
[ "$channel" = "auto" -o "$channel" = "0" ] || {
|
[ "$channel" = "auto" -o "$channel" = "0" ] || {
|
||||||
@ -336,6 +345,7 @@ enable_mac80211() {
|
|||||||
config_get mode "$vif" mode
|
config_get mode "$vif" mode
|
||||||
config_get ifname "$vif" ifname
|
config_get ifname "$vif" ifname
|
||||||
[ "$mode" = "ap" ] || continue
|
[ "$mode" = "ap" ] || continue
|
||||||
|
hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd-$phy/$ifname}"
|
||||||
mac80211_start_vif "$vif" "$ifname"
|
mac80211_start_vif "$vif" "$ifname"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@ -352,11 +362,18 @@ enable_mac80211() {
|
|||||||
adhoc)
|
adhoc)
|
||||||
config_get bssid "$vif" bssid
|
config_get bssid "$vif" bssid
|
||||||
config_get ssid "$vif" ssid
|
config_get ssid "$vif" ssid
|
||||||
iw dev "$ifname" ibss join "$ssid" $freq ${fixed:+fixed-freq} $bssid
|
config_get mcast_rate "$vif" mcast_rate
|
||||||
|
local mcval=""
|
||||||
|
[ -n "$mcast_rate" ] && {
|
||||||
|
mcval="$(($mcast_rate / 1000))"
|
||||||
|
mcsub="$(( ($mcast_rate / 100) % 10 ))"
|
||||||
|
[ "$mcsub" -gt 0 ] && mcval="$mcval.$mcsub"
|
||||||
|
}
|
||||||
|
iw dev "$ifname" ibss join "$ssid" $freq ${fixed:+fixed-freq} $bssid ${mcval:+mcast-rate $mcval}
|
||||||
;;
|
;;
|
||||||
sta)
|
sta)
|
||||||
if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
|
if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
|
||||||
wpa_supplicant_setup_vif "$vif" wext || {
|
wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" || {
|
||||||
echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
|
echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
|
||||||
# make sure this wifi interface won't accidentally stay open without encryption
|
# make sure this wifi interface won't accidentally stay open without encryption
|
||||||
ifconfig "$ifname" down
|
ifconfig "$ifname" down
|
||||||
@ -408,6 +425,7 @@ detect_mac80211() {
|
|||||||
|
|
||||||
list=" list ht_capab"
|
list=" list ht_capab"
|
||||||
[ "$(($ht_cap & 1))" -eq 1 ] && append ht_capab "$list LDPC" "$N"
|
[ "$(($ht_cap & 1))" -eq 1 ] && append ht_capab "$list LDPC" "$N"
|
||||||
|
[ "$(($ht_cap & 16))" -eq 16 ] && append ht_capab "$list GF" "$N"
|
||||||
[ "$(($ht_cap & 32))" -eq 32 ] && append ht_capab "$list SHORT-GI-20" "$N"
|
[ "$(($ht_cap & 32))" -eq 32 ] && append ht_capab "$list SHORT-GI-20" "$N"
|
||||||
[ "$(($ht_cap & 64))" -eq 64 ] && append ht_capab "$list SHORT-GI-40" "$N"
|
[ "$(($ht_cap & 64))" -eq 64 ] && append ht_capab "$list SHORT-GI-40" "$N"
|
||||||
[ "$(($ht_cap & 128))" -eq 128 ] && append ht_capab "$list TX-STBC" "$N"
|
[ "$(($ht_cap & 128))" -eq 128 ] && append ht_capab "$list TX-STBC" "$N"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/config.mk
|
--- a/config.mk
|
||||||
+++ b/config.mk
|
+++ b/config.mk
|
||||||
@@ -297,8 +297,8 @@ endif #CONFIG_SSB
|
@@ -300,8 +300,8 @@ endif #CONFIG_SSB
|
||||||
|
|
||||||
CONFIG_P54_PCI=m
|
CONFIG_P54_PCI=m
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
ifeq ($(CONFIG_MAC80211),y)
|
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")
|
$(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")
|
||||||
@@ -572,8 +572,8 @@ endif #CONFIG_COMPAT_KERNEL_27
|
@@ -585,8 +585,8 @@ endif #CONFIG_COMPAT_KERNEL_27
|
||||||
# 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_KERNEL_31
|
ifdef CONFIG_COMPAT_KERNEL_31
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
obj-$(CONFIG_COMPAT_NETWORK_MODULES) += drivers/net/
|
obj-$(CONFIG_COMPAT_NETWORK_MODULES) += drivers/net/
|
||||||
-obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/ssb/ drivers/misc/eeprom/
|
-obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/ssb/ drivers/misc/eeprom/
|
||||||
+obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/misc/eeprom/
|
+obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/misc/eeprom/
|
||||||
endif
|
|
||||||
|
|
||||||
obj-$(CONFIG_COMPAT_BLUETOOTH) += net/bluetooth/
|
ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),)
|
||||||
|
obj-$(CONFIG_COMPAT_STAGING) += drivers/staging/ath6kl/
|
||||||
--- a/config.mk
|
--- a/config.mk
|
||||||
+++ b/config.mk
|
+++ b/config.mk
|
||||||
@@ -9,7 +9,6 @@ ifeq ($(wildcard $(KLIB_BUILD)/.config),
|
@@ -9,7 +9,6 @@ ifeq ($(wildcard $(KLIB_BUILD)/.config),
|
||||||
@ -19,8 +19,8 @@
|
|||||||
else
|
else
|
||||||
include $(KLIB_BUILD)/.config
|
include $(KLIB_BUILD)/.config
|
||||||
endif
|
endif
|
||||||
@@ -280,21 +279,6 @@ endif #CONFIG_WEXT_PRIV
|
@@ -283,21 +282,6 @@ CONFIG_IPW2200_QOS=y
|
||||||
endif #CONFIG_WEXT_SPY
|
# % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
|
||||||
endif #CONFIG_WIRELESS_EXT
|
endif #CONFIG_WIRELESS_EXT
|
||||||
|
|
||||||
-ifdef CONFIG_SSB
|
-ifdef CONFIG_SSB
|
||||||
@ -41,7 +41,7 @@
|
|||||||
CONFIG_P54_PCI=m
|
CONFIG_P54_PCI=m
|
||||||
|
|
||||||
# CONFIG_B44=m
|
# CONFIG_B44=m
|
||||||
@@ -474,7 +458,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
@@ -485,7 +469,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
||||||
|
|
||||||
ifdef CONFIG_MMC
|
ifdef CONFIG_MMC
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# mac80211 test driver
|
# mac80211 test driver
|
||||||
@@ -311,13 +311,13 @@ endif #CONFIG_CRC_ITU_T
|
@@ -314,13 +314,13 @@ endif #CONFIG_CRC_ITU_T
|
||||||
CONFIG_MWL8K=m
|
CONFIG_MWL8K=m
|
||||||
|
|
||||||
# Ethernet drivers go here
|
# Ethernet drivers go here
|
||||||
@ -28,7 +28,7 @@
|
|||||||
endif #CONFIG_COMPAT_KERNEL_27
|
endif #CONFIG_COMPAT_KERNEL_27
|
||||||
|
|
||||||
ifdef CONFIG_WIRELESS_EXT
|
ifdef CONFIG_WIRELESS_EXT
|
||||||
@@ -372,17 +372,17 @@ CONFIG_ZD1211RW=m
|
@@ -371,17 +371,17 @@ CONFIG_ZD1211RW=m
|
||||||
# Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER
|
# 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
|
# it also requires new RNDIS_HOST and CDC_ETHER modules which we add
|
||||||
ifdef CONFIG_COMPAT_KERNEL_29
|
ifdef CONFIG_COMPAT_KERNEL_29
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
# enable mesh networking too
|
# enable mesh networking too
|
||||||
CONFIG_MAC80211_MESH=y
|
CONFIG_MAC80211_MESH=y
|
||||||
@@ -233,7 +233,7 @@ CONFIG_B43_PCI_AUTOSELECT=y
|
@@ -240,7 +240,7 @@ CONFIG_B43_PCI_AUTOSELECT=y
|
||||||
ifdef CONFIG_PCMCIA
|
ifdef CONFIG_PCMCIA
|
||||||
CONFIG_B43_PCMCIA=y
|
CONFIG_B43_PCMCIA=y
|
||||||
endif #CONFIG_PCMCIA
|
endif #CONFIG_PCMCIA
|
||||||
@ -18,7 +18,7 @@
|
|||||||
CONFIG_B43_PHY_LP=y
|
CONFIG_B43_PHY_LP=y
|
||||||
CONFIG_B43_NPHY=y
|
CONFIG_B43_NPHY=y
|
||||||
# CONFIG_B43_FORCE_PIO=y
|
# CONFIG_B43_FORCE_PIO=y
|
||||||
@@ -242,7 +242,7 @@ CONFIG_B43_NPHY=y
|
@@ -249,7 +249,7 @@ CONFIG_B43_NPHY=y
|
||||||
CONFIG_B43LEGACY=m
|
CONFIG_B43LEGACY=m
|
||||||
CONFIG_B43LEGACY_HWRNG=y
|
CONFIG_B43LEGACY_HWRNG=y
|
||||||
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
|
||||||
@ -27,7 +27,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
|
||||||
@@ -529,7 +529,7 @@ endif
|
@@ -542,7 +542,7 @@ endif
|
||||||
|
|
||||||
# p54
|
# p54
|
||||||
CONFIG_P54_COMMON=m
|
CONFIG_P54_COMMON=m
|
||||||
@ -81,7 +81,7 @@
|
|||||||
void ath_deinit_leds(struct ath_softc *sc)
|
void ath_deinit_leds(struct ath_softc *sc)
|
||||||
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||||
@@ -871,6 +871,7 @@ static void ath9k_led_brightness_work(st
|
@@ -860,6 +860,7 @@ static void ath9k_led_brightness_work(st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +89,7 @@
|
|||||||
static void ath9k_led_brightness(struct led_classdev *led_cdev,
|
static void ath9k_led_brightness(struct led_classdev *led_cdev,
|
||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
@@ -882,6 +883,7 @@ static void ath9k_led_brightness(struct
|
@@ -871,6 +872,7 @@ static void ath9k_led_brightness(struct
|
||||||
ieee80211_queue_delayed_work(priv->hw,
|
ieee80211_queue_delayed_work(priv->hw,
|
||||||
&led->brightness_work, 0);
|
&led->brightness_work, 0);
|
||||||
}
|
}
|
||||||
@ -97,7 +97,7 @@
|
|||||||
|
|
||||||
static void ath9k_led_stop_brightness(struct ath9k_htc_priv *priv)
|
static void ath9k_led_stop_brightness(struct ath9k_htc_priv *priv)
|
||||||
{
|
{
|
||||||
@@ -894,6 +896,7 @@ static void ath9k_led_stop_brightness(st
|
@@ -883,6 +885,7 @@ static void ath9k_led_stop_brightness(st
|
||||||
static int ath9k_register_led(struct ath9k_htc_priv *priv, struct ath_led *led,
|
static int ath9k_register_led(struct ath9k_htc_priv *priv, struct ath_led *led,
|
||||||
char *trigger)
|
char *trigger)
|
||||||
{
|
{
|
||||||
@ -105,7 +105,7 @@
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
led->priv = priv;
|
led->priv = priv;
|
||||||
@@ -911,14 +914,19 @@ static int ath9k_register_led(struct ath
|
@@ -900,14 +903,19 @@ static int ath9k_register_led(struct ath
|
||||||
INIT_DELAYED_WORK(&led->brightness_work, ath9k_led_brightness_work);
|
INIT_DELAYED_WORK(&led->brightness_work, ath9k_led_brightness_work);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
else
|
else
|
||||||
include $(KLIB_BUILD)/.config
|
include $(KLIB_BUILD)/.config
|
||||||
endif
|
endif
|
||||||
@@ -214,7 +214,7 @@ CONFIG_B43=m
|
@@ -221,7 +221,7 @@ CONFIG_B43=m
|
||||||
CONFIG_B43_HWRNG=y
|
CONFIG_B43_HWRNG=y
|
||||||
CONFIG_B43_PCI_AUTOSELECT=y
|
CONFIG_B43_PCI_AUTOSELECT=y
|
||||||
ifdef CONFIG_PCMCIA
|
ifdef CONFIG_PCMCIA
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/config.mk
|
--- a/config.mk
|
||||||
+++ b/config.mk
|
+++ b/config.mk
|
||||||
@@ -441,7 +441,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
@@ -452,7 +452,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
||||||
|
|
||||||
ifdef CONFIG_MMC
|
ifdef CONFIG_MMC
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/config.mk
|
--- a/config.mk
|
||||||
+++ b/config.mk
|
+++ b/config.mk
|
||||||
@@ -218,7 +218,7 @@ ifdef CONFIG_PCMCIA
|
@@ -225,7 +225,7 @@ ifdef CONFIG_PCMCIA
|
||||||
endif #CONFIG_PCMCIA
|
endif #CONFIG_PCMCIA
|
||||||
# CONFIG_B43_LEDS=y
|
# CONFIG_B43_LEDS=y
|
||||||
CONFIG_B43_PHY_LP=y
|
CONFIG_B43_PHY_LP=y
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/config.mk
|
--- a/config.mk
|
||||||
+++ b/config.mk
|
+++ b/config.mk
|
||||||
@@ -271,12 +271,12 @@ CONFIG_RTL8180=m
|
@@ -274,12 +274,12 @@ CONFIG_RTL8180=m
|
||||||
|
|
||||||
CONFIG_ADM8211=m
|
CONFIG_ADM8211=m
|
||||||
|
|
||||||
@ -15,7 +15,7 @@
|
|||||||
# CONFIG_RT2800PCI_RT30XX=y
|
# CONFIG_RT2800PCI_RT30XX=y
|
||||||
# CONFIG_RT2800PCI_RT35XX=y
|
# CONFIG_RT2800PCI_RT35XX=y
|
||||||
# CONFIG_RT2800PCI_SOC=y
|
# CONFIG_RT2800PCI_SOC=y
|
||||||
@@ -391,7 +391,7 @@ CONFIG_RT2800USB_RT30XX=y
|
@@ -402,7 +402,7 @@ CONFIG_RT2800USB_RT30XX=y
|
||||||
CONFIG_RT2800USB_RT35XX=y
|
CONFIG_RT2800USB_RT35XX=y
|
||||||
CONFIG_RT2800USB_UNKNOWN=y
|
CONFIG_RT2800USB_UNKNOWN=y
|
||||||
endif #CONFIG_CRC_CCITT
|
endif #CONFIG_CRC_CCITT
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
@@ -112,7 +112,7 @@ CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
|
@@ -112,7 +112,7 @@ CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
|
||||||
# This is the one used by our compat-wireless net/mac80211/rate.c
|
# This is the one used by our compat-wireless net/mac80211/rate.c
|
||||||
# in case you have and old kernel which is overriding this to pid.
|
# in case you have and old kernel which is overriding this to pid.
|
||||||
CONFIG_COMPAT_MAC80211_RC_DEFAULT=minstrel
|
CONFIG_COMPAT_MAC80211_RC_DEFAULT=minstrel_ht
|
||||||
-CONFIG_MAC80211_RC_PID=y
|
-CONFIG_MAC80211_RC_PID=y
|
||||||
+# CONFIG_MAC80211_RC_PID=y
|
+# CONFIG_MAC80211_RC_PID=y
|
||||||
CONFIG_MAC80211_RC_MINSTREL=y
|
CONFIG_MAC80211_RC_MINSTREL=y
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/carl9170/main.c
|
|
||||||
+++ b/drivers/net/wireless/ath/carl9170/main.c
|
|
||||||
@@ -811,16 +811,34 @@ out:
|
|
||||||
}
|
|
||||||
|
|
||||||
static u64 carl9170_op_prepare_multicast(struct ieee80211_hw *hw,
|
|
||||||
- struct netdev_hw_addr_list *mc_list)
|
|
||||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
||||||
+ struct netdev_hw_addr_list *mc_list)
|
|
||||||
+#else
|
|
||||||
+ int mc_count, struct dev_addr_list *ha)
|
|
||||||
+#endif
|
|
||||||
{
|
|
||||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
||||||
struct netdev_hw_addr *ha;
|
|
||||||
+#else
|
|
||||||
+ int i;
|
|
||||||
+#endif
|
|
||||||
u64 mchash;
|
|
||||||
|
|
||||||
/* always get broadcast frames */
|
|
||||||
mchash = 1ULL << (0xff >> 2);
|
|
||||||
|
|
||||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
||||||
netdev_hw_addr_list_for_each(ha, mc_list)
|
|
||||||
mchash |= 1ULL << (ha->addr[5] >> 2);
|
|
||||||
+#else
|
|
||||||
+ for (i = 0; i < mc_count; i++) {
|
|
||||||
+ if (!ha)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ mchash |= 1ULL << (ha->dmi_addr[5] >> 2);
|
|
||||||
+ ha = ha->next;
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
return mchash;
|
|
||||||
}
|
|
11
package/mac80211/patches/017-remove_ath9k_rc.patch
Normal file
11
package/mac80211/patches/017-remove_ath9k_rc.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- a/config.mk
|
||||||
|
+++ b/config.mk
|
||||||
|
@@ -204,7 +204,7 @@ CONFIG_ATH9K_COMMON=m
|
||||||
|
# as default once we get minstrel properly tested and blessed by
|
||||||
|
# our systems engineering team. CCK rates also need to be used
|
||||||
|
# for long range considerations.
|
||||||
|
-CONFIG_ATH9K_RATE_CONTROL=y
|
||||||
|
+# CONFIG_ATH9K_RATE_CONTROL=y
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_COMPAT_IWLWIFI=m
|
@ -1,15 +0,0 @@
|
|||||||
--- a/include/linux/compat-2.6.33.h
|
|
||||||
+++ b/include/linux/compat-2.6.33.h
|
|
||||||
@@ -98,6 +98,12 @@ int pccard_loop_tuple(struct pcmcia_sock
|
|
||||||
#define kfifo_out(a, b, c) __kfifo_get(*a, b, c)
|
|
||||||
#define kfifo_len(a) __kfifo_len(*a)
|
|
||||||
|
|
||||||
+#define list_for_each_entry_continue_rcu(pos, head, member) \
|
|
||||||
+ for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \
|
|
||||||
+ prefetch(pos->member.next), &pos->member != (head); \
|
|
||||||
+ pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) */
|
|
||||||
|
|
||||||
#endif /* LINUX_26_33_COMPAT_H */
|
|
@ -1,8 +1,8 @@
|
|||||||
--- a/include/linux/compat-2.6.36.h
|
--- a/include/linux/compat-2.6.36.h
|
||||||
+++ b/include/linux/compat-2.6.36.h
|
+++ b/include/linux/compat-2.6.36.h
|
||||||
@@ -15,6 +15,8 @@ struct va_format {
|
@@ -56,6 +56,8 @@ static inline int pcmcia_write_config_by
|
||||||
|
return pcmcia_access_configuration_register(p_dev, ®);
|
||||||
#define device_rename(dev, new_name) device_rename(dev, (char *)new_name)
|
}
|
||||||
|
|
||||||
+#define PCI_EEPROM_WIDTH_93C86 8
|
+#define PCI_EEPROM_WIDTH_93C86 8
|
||||||
+
|
+
|
||||||
|
@ -31,3 +31,14 @@
|
|||||||
#if 0
|
#if 0
|
||||||
extern void usb_poison_urb(struct urb *urb);
|
extern void usb_poison_urb(struct urb *urb);
|
||||||
#endif
|
#endif
|
||||||
|
--- a/config.mk
|
||||||
|
+++ b/config.mk
|
||||||
|
@@ -389,7 +389,7 @@ endif #CONFIG_COMPAT_KERNEL_29
|
||||||
|
# This activates a threading fix for usb urb.
|
||||||
|
# this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351
|
||||||
|
# This fix will be included in some stable releases.
|
||||||
|
-CONFIG_COMPAT_USB_URB_THREAD_FIX=y
|
||||||
|
+# CONFIG_COMPAT_USB_URB_THREAD_FIX=y
|
||||||
|
|
||||||
|
CONFIG_ATH9K_HTC=m
|
||||||
|
# CONFIG_ATH9K_HTC_DEBUGFS=y
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
--- a/include/net/cfg80211.h
|
|
||||||
+++ b/include/net/cfg80211.h
|
|
||||||
@@ -2574,9 +2574,8 @@ void cfg80211_cqm_rssi_notify(struct net
|
|
||||||
wiphy_printk(KERN_NOTICE, wiphy, format, ##args)
|
|
||||||
#define wiphy_info(wiphy, format, args...) \
|
|
||||||
wiphy_printk(KERN_INFO, wiphy, format, ##args)
|
|
||||||
-
|
|
||||||
-int wiphy_debug(const struct wiphy *wiphy, const char *format, ...)
|
|
||||||
- __attribute__ ((format (printf, 2, 3)));
|
|
||||||
+#define wiphy_debug(wiphy, format, args...) \
|
|
||||||
+ wiphy_printk(KERN_DEBUG, wiphy, format, ##args)
|
|
||||||
|
|
||||||
#if defined(DEBUG)
|
|
||||||
#define wiphy_dbg(wiphy, format, args...) \
|
|
||||||
--- a/net/wireless/core.c
|
|
||||||
+++ b/net/wireless/core.c
|
|
||||||
@@ -936,52 +936,3 @@ static void __exit cfg80211_exit(void)
|
|
||||||
destroy_workqueue(cfg80211_wq);
|
|
||||||
}
|
|
||||||
module_exit(cfg80211_exit);
|
|
||||||
-
|
|
||||||
-static int ___wiphy_printk(const char *level, const struct wiphy *wiphy,
|
|
||||||
- struct va_format *vaf)
|
|
||||||
-{
|
|
||||||
- if (!wiphy)
|
|
||||||
- return printk("%s(NULL wiphy *): %pV", level, vaf);
|
|
||||||
-
|
|
||||||
- return printk("%s%s: %pV", level, wiphy_name(wiphy), vaf);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-int __wiphy_printk(const char *level, const struct wiphy *wiphy,
|
|
||||||
- const char *fmt, ...)
|
|
||||||
-{
|
|
||||||
- struct va_format vaf;
|
|
||||||
- va_list args;
|
|
||||||
- int r;
|
|
||||||
-
|
|
||||||
- va_start(args, fmt);
|
|
||||||
-
|
|
||||||
- vaf.fmt = fmt;
|
|
||||||
- vaf.va = &args;
|
|
||||||
-
|
|
||||||
- r = ___wiphy_printk(level, wiphy, &vaf);
|
|
||||||
- va_end(args);
|
|
||||||
-
|
|
||||||
- return r;
|
|
||||||
-}
|
|
||||||
-EXPORT_SYMBOL(__wiphy_printk);
|
|
||||||
-
|
|
||||||
-#define define_wiphy_printk_level(func, kern_level) \
|
|
||||||
-int func(const struct wiphy *wiphy, const char *fmt, ...) \
|
|
||||||
-{ \
|
|
||||||
- struct va_format vaf; \
|
|
||||||
- va_list args; \
|
|
||||||
- int r; \
|
|
||||||
- \
|
|
||||||
- va_start(args, fmt); \
|
|
||||||
- \
|
|
||||||
- vaf.fmt = fmt; \
|
|
||||||
- vaf.va = &args; \
|
|
||||||
- \
|
|
||||||
- r = ___wiphy_printk(kern_level, wiphy, &vaf); \
|
|
||||||
- va_end(args); \
|
|
||||||
- \
|
|
||||||
- return r; \
|
|
||||||
-} \
|
|
||||||
-EXPORT_SYMBOL(func);
|
|
||||||
-
|
|
||||||
-define_wiphy_printk_level(wiphy_debug, KERN_DEBUG);
|
|
@ -1,25 +0,0 @@
|
|||||||
[PATCH] mac80211: hoist sta->lock from reorder release timer
|
|
||||||
|
|
||||||
The patch "mac80211: AMPDU rx reorder timeout timer" clashes
|
|
||||||
with "mac80211: use netif_receive_skb in ieee80211_rx callpath"
|
|
||||||
|
|
||||||
The timer itself is part of the station's private struct and
|
|
||||||
it gets killed whenever the station is removed. Therefore
|
|
||||||
the extra sta->lock protection (that can interferes with the
|
|
||||||
tx path) is not necessary.
|
|
||||||
|
|
||||||
Reported-by: Ming Lei <tom.leiming@gmail.com>
|
|
||||||
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
|
|
||||||
---
|
|
||||||
--- a/net/mac80211/agg-rx.c
|
|
||||||
+++ b/net/mac80211/agg-rx.c
|
|
||||||
@@ -129,9 +129,7 @@ static void sta_rx_agg_reorder_timer_exp
|
|
||||||
timer_to_tid[0]);
|
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
- spin_lock(&sta->lock);
|
|
||||||
ieee80211_release_reorder_timeout(sta, *ptid);
|
|
||||||
- spin_unlock(&sta->lock);
|
|
||||||
rcu_read_unlock();
|
|
||||||
}
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
|||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
@@ -451,8 +452,16 @@ static int ath9k_hw_init_macaddr(struct
|
@@ -449,8 +450,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||||
common->macaddr[2 * i] = eeval >> 8;
|
common->macaddr[2 * i] = eeval >> 8;
|
||||||
common->macaddr[2 * i + 1] = eeval & 0xff;
|
common->macaddr[2 * i + 1] = eeval & 0xff;
|
||||||
}
|
}
|
||||||
|
@ -1,68 +1,46 @@
|
|||||||
--- a/drivers/net/wireless/ath/regd.c
|
--- a/drivers/net/wireless/ath/regd.c
|
||||||
+++ b/drivers/net/wireless/ath/regd.c
|
+++ b/drivers/net/wireless/ath/regd.c
|
||||||
@@ -18,6 +18,9 @@
|
@@ -185,6 +185,10 @@ ath_reg_apply_beaconing_flags(struct wip
|
||||||
#include <net/cfg80211.h>
|
u32 bandwidth = 0;
|
||||||
#include <net/mac80211.h>
|
int r;
|
||||||
#include "regd.h"
|
|
||||||
+
|
|
||||||
+#ifndef ATH_USER_REGD
|
|
||||||
+
|
|
||||||
#include "regd_common.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -587,3 +590,5 @@ u32 ath_regd_get_band_ctl(struct ath_reg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ath_regd_get_band_ctl);
|
|
||||||
+
|
|
||||||
+#endif
|
|
||||||
--- a/drivers/net/wireless/ath/regd.h
|
|
||||||
+++ b/drivers/net/wireless/ath/regd.h
|
|
||||||
@@ -249,6 +249,41 @@ enum CountryCode {
|
|
||||||
CTRY_BELGIUM2 = 5002
|
|
||||||
};
|
|
||||||
|
|
||||||
+#ifdef ATH_USER_REGD
|
+#ifdef ATH_USER_REGD
|
||||||
+
|
+ return;
|
||||||
+static inline bool
|
|
||||||
+ath_is_world_regd(struct ath_regulatory *reg)
|
|
||||||
+{
|
|
||||||
+ return true;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline int
|
|
||||||
+ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy,
|
|
||||||
+ int (*reg_notifier)(struct wiphy *wiphy,
|
|
||||||
+ struct regulatory_request *request))
|
|
||||||
+{
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+static inline u32
|
|
||||||
+ath_regd_get_band_ctl(struct ath_regulatory *reg,
|
|
||||||
+ enum ieee80211_band band)
|
|
||||||
+{
|
|
||||||
+ return SD_NO_CTL;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline int
|
|
||||||
+ath_reg_notifier_apply(struct wiphy *wiphy,
|
|
||||||
+ struct regulatory_request *request,
|
|
||||||
+ struct ath_regulatory *reg)
|
|
||||||
+{
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#else
|
|
||||||
+
|
|
||||||
bool ath_is_world_regd(struct ath_regulatory *reg);
|
|
||||||
int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy,
|
|
||||||
int (*reg_notifier)(struct wiphy *wiphy,
|
|
||||||
@@ -260,3 +295,5 @@ int ath_reg_notifier_apply(struct wiphy
|
|
||||||
struct ath_regulatory *reg);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+
|
|
||||||
+#endif
|
+#endif
|
||||||
|
+
|
||||||
|
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||||
|
|
||||||
|
if (!wiphy->bands[band])
|
||||||
|
@@ -244,6 +248,10 @@ ath_reg_apply_active_scan_flags(struct w
|
||||||
|
u32 bandwidth = 0;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
+#ifdef ATH_USER_REGD
|
||||||
|
+ return;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
sband = wiphy->bands[IEEE80211_BAND_2GHZ];
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -291,6 +299,10 @@ static void ath_reg_apply_radar_flags(st
|
||||||
|
struct ieee80211_channel *ch;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
+#ifdef ATH_USER_REGD
|
||||||
|
+ return;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
if (!wiphy->bands[IEEE80211_BAND_5GHZ])
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -449,6 +461,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||||
|
{
|
||||||
|
const struct ieee80211_regdomain *regd;
|
||||||
|
|
||||||
|
+#ifdef ATH_USER_REGD
|
||||||
|
+ return 0;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
wiphy->reg_notifier = reg_notifier;
|
||||||
|
wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -540,6 +540,7 @@ static int ath9k_init_softc(u16 devid, s
|
@@ -559,6 +559,7 @@ static int ath9k_init_softc(u16 devid, s
|
||||||
{
|
{
|
||||||
struct ath_hw *ah = NULL;
|
struct ath_hw *ah = NULL;
|
||||||
struct ath_common *common;
|
struct ath_common *common;
|
||||||
@ -18,7 +18,7 @@
|
|||||||
int ret = 0, i;
|
int ret = 0, i;
|
||||||
int csz = 0;
|
int csz = 0;
|
||||||
|
|
||||||
@@ -551,6 +552,10 @@ static int ath9k_init_softc(u16 devid, s
|
@@ -570,6 +571,10 @@ static int ath9k_init_softc(u16 devid, s
|
||||||
ah->hw_version.subsysid = subsysid;
|
ah->hw_version.subsysid = subsysid;
|
||||||
sc->sc_ah = ah;
|
sc->sc_ah = ah;
|
||||||
|
|
||||||
@ -31,7 +31,7 @@
|
|||||||
common->bus_ops = bus_ops;
|
common->bus_ops = bus_ops;
|
||||||
--- 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
|
||||||
@@ -422,10 +422,6 @@ static void ath9k_hw_init_defaults(struc
|
@@ -420,10 +420,6 @@ static void ath9k_hw_init_defaults(struc
|
||||||
ah->hw_version.magic = AR5416_MAGIC;
|
ah->hw_version.magic = AR5416_MAGIC;
|
||||||
ah->hw_version.subvendorid = 0;
|
ah->hw_version.subvendorid = 0;
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
#include "hw-ops.h"
|
#include "hw-ops.h"
|
||||||
#include "rc.h"
|
#include "rc.h"
|
||||||
@@ -436,18 +438,23 @@ static void ath9k_hw_init_defaults(struc
|
@@ -434,18 +436,23 @@ static void ath9k_hw_init_defaults(struc
|
||||||
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
|
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
@@ -1427,7 +1427,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
@@ -1420,7 +1420,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||||
|
|
||||||
if (ah->config.rx_intr_mitigation) {
|
if (ah->config.rx_intr_mitigation) {
|
||||||
REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
|
REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "ath9k.h"
|
#include "ath9k.h"
|
||||||
|
|
||||||
static char *dev_info = "ath9k";
|
static char *dev_info = "ath9k";
|
||||||
@@ -555,6 +556,8 @@ static int ath9k_init_softc(u16 devid, s
|
@@ -574,6 +575,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||||
pdata = (struct ath9k_platform_data *) sc->dev->platform_data;
|
pdata = (struct ath9k_platform_data *) sc->dev->platform_data;
|
||||||
if (!pdata)
|
if (!pdata)
|
||||||
ah->ah_flags |= AH_USE_EEPROM;
|
ah->ah_flags |= AH_USE_EEPROM;
|
||||||
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
common = ath9k_hw_common(ah);
|
common = ath9k_hw_common(ah);
|
||||||
common->ops = &ath9k_common_ops;
|
common->ops = &ath9k_common_ops;
|
||||||
@@ -677,6 +680,24 @@ void ath9k_set_hw_capab(struct ath_softc
|
@@ -704,6 +707,24 @@ void ath9k_set_hw_capab(struct ath_softc
|
||||||
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
|
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +42,7 @@
|
|||||||
int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
|
int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
|
||||||
const struct ath_bus_ops *bus_ops)
|
const struct ath_bus_ops *bus_ops)
|
||||||
{
|
{
|
||||||
@@ -695,6 +716,9 @@ int ath9k_init_device(u16 devid, struct
|
@@ -723,6 +744,9 @@ int ath9k_init_device(u16 devid, struct
|
||||||
common = ath9k_hw_common(ah);
|
common = ath9k_hw_common(ah);
|
||||||
ath9k_set_hw_capab(sc, hw);
|
ath9k_set_hw_capab(sc, hw);
|
||||||
|
|
||||||
@ -54,7 +54,7 @@
|
|||||||
ath9k_reg_notifier);
|
ath9k_reg_notifier);
|
||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
@@ -643,6 +643,8 @@ struct ath_softc {
|
@@ -635,6 +635,8 @@ struct ath_softc {
|
||||||
|
|
||||||
int beacon_interval;
|
int beacon_interval;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
sc->sc_ah->led_pin = ATH_LED_PIN_DEF;
|
sc->sc_ah->led_pin = ATH_LED_PIN_DEF;
|
||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
@@ -460,6 +460,7 @@ void ath9k_btcoex_timer_pause(struct ath
|
@@ -455,6 +455,7 @@ void ath9k_btcoex_timer_pause(struct ath
|
||||||
|
|
||||||
#define ATH_LED_PIN_DEF 1
|
#define ATH_LED_PIN_DEF 1
|
||||||
#define ATH_LED_PIN_9287 8
|
#define ATH_LED_PIN_9287 8
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||||
@@ -897,6 +897,53 @@ static const struct file_operations fops
|
@@ -861,6 +861,53 @@ static const struct file_operations fops
|
||||||
.owner = THIS_MODULE
|
.owner = THIS_MODULE
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -54,7 +54,7 @@
|
|||||||
int ath9k_init_debug(struct ath_hw *ah)
|
int ath9k_init_debug(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
@@ -960,6 +1007,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
@@ -920,6 +967,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||||
sc->debug.debugfs_phy, &ah->config.cwm_ignore_extcca))
|
sc->debug.debugfs_phy, &ah->config.cwm_ignore_extcca))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
|
||||||
@@ -661,7 +661,11 @@ void ath9k_set_hw_capab(struct ath_softc
|
|
||||||
hw->sta_data_size = sizeof(struct ath_node);
|
|
||||||
hw->vif_data_size = sizeof(struct ath_vif);
|
|
||||||
|
|
||||||
+#ifdef ATH9K_USE_MINSTREL
|
|
||||||
+ hw->rate_control_algorithm = "minstrel_ht";
|
|
||||||
+#else
|
|
||||||
hw->rate_control_algorithm = "ath9k_rate_control";
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes))
|
|
||||||
hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
|
|
13
package/mac80211/patches/510-ath9k_aggr_delim_fix.patch
Normal file
13
package/mac80211/patches/510-ath9k_aggr_delim_fix.patch
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
|
@@ -177,8 +177,8 @@ void ath_descdma_cleanup(struct ath_soft
|
||||||
|
|
||||||
|
/* returns delimiter padding required given the packet length */
|
||||||
|
#define ATH_AGGR_GET_NDELIM(_len) \
|
||||||
|
- (((((_len) + ATH_AGGR_DELIM_SZ) < ATH_AGGR_MINPLEN) ? \
|
||||||
|
- (ATH_AGGR_MINPLEN - (_len) - ATH_AGGR_DELIM_SZ) : 0) >> 2)
|
||||||
|
+ (((_len) >= ATH_AGGR_MINPLEN) ? 0 : \
|
||||||
|
+ DIV_ROUND_UP(ATH_AGGR_MINPLEN - (_len), ATH_AGGR_DELIM_SZ))
|
||||||
|
|
||||||
|
#define BAW_WITHIN(_start, _bawsz, _seqno) \
|
||||||
|
((((_seqno) - (_start)) & 4095) < (_bawsz))
|
@ -1,36 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
|
||||||
@@ -254,7 +254,7 @@ struct ath_atx_tid {
|
|
||||||
struct list_head buf_q;
|
|
||||||
struct ath_node *an;
|
|
||||||
struct ath_atx_ac *ac;
|
|
||||||
- struct ath_buf *tx_buf[ATH_TID_MAX_BUFS];
|
|
||||||
+ unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)];
|
|
||||||
u16 seq_start;
|
|
||||||
u16 seq_next;
|
|
||||||
u16 baw_size;
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
@@ -168,9 +168,9 @@ static void ath_tx_update_baw(struct ath
|
|
||||||
index = ATH_BA_INDEX(tid->seq_start, seqno);
|
|
||||||
cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
|
|
||||||
|
|
||||||
- tid->tx_buf[cindex] = NULL;
|
|
||||||
+ __clear_bit(cindex, tid->tx_buf);
|
|
||||||
|
|
||||||
- while (tid->baw_head != tid->baw_tail && !tid->tx_buf[tid->baw_head]) {
|
|
||||||
+ while (tid->baw_head != tid->baw_tail && !test_bit(tid->baw_head, tid->tx_buf)) {
|
|
||||||
INCR(tid->seq_start, IEEE80211_SEQ_MAX);
|
|
||||||
INCR(tid->baw_head, ATH_TID_MAX_BUFS);
|
|
||||||
}
|
|
||||||
@@ -186,9 +186,7 @@ static void ath_tx_addto_baw(struct ath_
|
|
||||||
|
|
||||||
index = ATH_BA_INDEX(tid->seq_start, bf->bf_seqno);
|
|
||||||
cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
|
|
||||||
-
|
|
||||||
- BUG_ON(tid->tx_buf[cindex] != NULL);
|
|
||||||
- tid->tx_buf[cindex] = bf;
|
|
||||||
+ __set_bit(cindex, tid->tx_buf);
|
|
||||||
|
|
||||||
if (index >= ((tid->baw_tail - tid->baw_head) &
|
|
||||||
(ATH_TID_MAX_BUFS - 1))) {
|
|
@ -1,12 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
@@ -124,7 +124,8 @@ static void ath_tx_resume_tid(struct ath
|
|
||||||
{
|
|
||||||
struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum];
|
|
||||||
|
|
||||||
- WARN_ON(!tid->paused);
|
|
||||||
+ if (!tid->paused)
|
|
||||||
+ return;
|
|
||||||
|
|
||||||
spin_lock_bh(&txq->axq_lock);
|
|
||||||
tid->paused = false;
|
|
@ -0,0 +1,18 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||||
|
@@ -2133,6 +2133,7 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||||
|
u8 twiceMaxRegulatoryPower,
|
||||||
|
u8 powerLimit)
|
||||||
|
{
|
||||||
|
+ struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
u8 targetPowerValT2[ar9300RateSize];
|
||||||
|
unsigned int i = 0;
|
||||||
|
@@ -2180,6 +2181,7 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||||
|
i = ALL_TARGET_HT20_0_8_16; /* ht20 */
|
||||||
|
|
||||||
|
ah->txpower_limit = targetPowerValT2[i];
|
||||||
|
+ regulatory->max_power_level = ratesArray[i];
|
||||||
|
|
||||||
|
ar9003_hw_calibration_apply(ah, chan->channel);
|
||||||
|
}
|
@ -1,55 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
@@ -784,17 +784,23 @@ static void ath_tx_sched_aggr(struct ath
|
|
||||||
status != ATH_AGGR_BAW_CLOSED);
|
|
||||||
}
|
|
||||||
|
|
||||||
-void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
|
||||||
- u16 tid, u16 *ssn)
|
|
||||||
+int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
|
||||||
+ u16 tid, u16 *ssn)
|
|
||||||
{
|
|
||||||
struct ath_atx_tid *txtid;
|
|
||||||
struct ath_node *an;
|
|
||||||
|
|
||||||
an = (struct ath_node *)sta->drv_priv;
|
|
||||||
txtid = ATH_AN_2_TID(an, tid);
|
|
||||||
+
|
|
||||||
+ if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))
|
|
||||||
+ return -EAGAIN;
|
|
||||||
+
|
|
||||||
txtid->state |= AGGR_ADDBA_PROGRESS;
|
|
||||||
txtid->paused = true;
|
|
||||||
*ssn = txtid->seq_start;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
|
||||||
@@ -346,8 +346,8 @@ void ath_tx_tasklet(struct ath_softc *sc
|
|
||||||
void ath_tx_edma_tasklet(struct ath_softc *sc);
|
|
||||||
void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb);
|
|
||||||
bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
|
|
||||||
-void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
|
||||||
- u16 tid, u16 *ssn);
|
|
||||||
+int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
|
||||||
+ u16 tid, u16 *ssn);
|
|
||||||
void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
|
|
||||||
void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
|
|
||||||
void ath9k_enable_ps(struct ath_softc *sc);
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
|
||||||
@@ -1968,8 +1968,9 @@ static int ath9k_ampdu_action(struct iee
|
|
||||||
break;
|
|
||||||
case IEEE80211_AMPDU_TX_START:
|
|
||||||
ath9k_ps_wakeup(sc);
|
|
||||||
- ath_tx_aggr_start(sc, sta, tid, ssn);
|
|
||||||
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
|
|
||||||
+ ret = ath_tx_aggr_start(sc, sta, tid, ssn);
|
|
||||||
+ if (!ret)
|
|
||||||
+ ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
|
|
||||||
ath9k_ps_restore(sc);
|
|
||||||
break;
|
|
||||||
case IEEE80211_AMPDU_TX_STOP:
|
|
327
package/mac80211/patches/521-ath9k_hw_tx_power.patch
Normal file
327
package/mac80211/patches/521-ath9k_hw_tx_power.patch
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||||
|
@@ -680,7 +680,8 @@ struct eeprom_ops {
|
||||||
|
void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan);
|
||||||
|
void (*set_txpower)(struct ath_hw *hw, struct ath9k_channel *chan,
|
||||||
|
u16 cfgCtl, u8 twiceAntennaReduction,
|
||||||
|
- u8 twiceMaxRegulatoryPower, u8 powerLimit);
|
||||||
|
+ u8 twiceMaxRegulatoryPower, u8 powerLimit,
|
||||||
|
+ bool test);
|
||||||
|
u16 (*get_spur_channel)(struct ath_hw *ah, u16 i, bool is2GHz);
|
||||||
|
};
|
||||||
|
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||||
|
@@ -726,7 +726,7 @@ static void ath9k_hw_4k_set_txpower(stru
|
||||||
|
u16 cfgCtl,
|
||||||
|
u8 twiceAntennaReduction,
|
||||||
|
u8 twiceMaxRegulatoryPower,
|
||||||
|
- u8 powerLimit)
|
||||||
|
+ u8 powerLimit, bool test)
|
||||||
|
{
|
||||||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
struct ar5416_eeprom_4k *pEepData = &ah->eeprom.map4k;
|
||||||
|
@@ -751,15 +751,20 @@ static void ath9k_hw_4k_set_txpower(stru
|
||||||
|
|
||||||
|
ath9k_hw_set_4k_power_cal_table(ah, chan, &txPowerIndexOffset);
|
||||||
|
|
||||||
|
+ regulatory->max_power_level = 0;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(ratesArray); i++) {
|
||||||
|
ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]);
|
||||||
|
if (ratesArray[i] > AR5416_MAX_RATE_POWER)
|
||||||
|
ratesArray[i] = AR5416_MAX_RATE_POWER;
|
||||||
|
+
|
||||||
|
+ if (ratesArray[i] > regulatory->max_power_level)
|
||||||
|
+ regulatory->max_power_level = ratesArray[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (test)
|
||||||
|
+ return;
|
||||||
|
|
||||||
|
/* Update regulatory */
|
||||||
|
-
|
||||||
|
i = rate6mb;
|
||||||
|
if (IS_CHAN_HT40(chan))
|
||||||
|
i = rateHt40_0;
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||||
|
@@ -853,7 +853,7 @@ static void ath9k_hw_ar9287_set_txpower(
|
||||||
|
struct ath9k_channel *chan, u16 cfgCtl,
|
||||||
|
u8 twiceAntennaReduction,
|
||||||
|
u8 twiceMaxRegulatoryPower,
|
||||||
|
- u8 powerLimit)
|
||||||
|
+ u8 powerLimit, bool test)
|
||||||
|
{
|
||||||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
struct ar9287_eeprom *pEepData = &ah->eeprom.map9287;
|
||||||
|
@@ -877,12 +877,26 @@ static void ath9k_hw_ar9287_set_txpower(
|
||||||
|
|
||||||
|
ath9k_hw_set_ar9287_power_cal_table(ah, chan, &txPowerIndexOffset);
|
||||||
|
|
||||||
|
+ regulatory->max_power_level = 0;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(ratesArray); i++) {
|
||||||
|
ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]);
|
||||||
|
if (ratesArray[i] > AR9287_MAX_RATE_POWER)
|
||||||
|
ratesArray[i] = AR9287_MAX_RATE_POWER;
|
||||||
|
+
|
||||||
|
+ if (ratesArray[i] > regulatory->max_power_level)
|
||||||
|
+ regulatory->max_power_level = ratesArray[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (test)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (IS_CHAN_2GHZ(chan))
|
||||||
|
+ i = rate1l;
|
||||||
|
+ else
|
||||||
|
+ i = rate6mb;
|
||||||
|
+
|
||||||
|
+ regulatory->max_power_level = ratesArray[i];
|
||||||
|
+
|
||||||
|
if (AR_SREV_9280_20_OR_LATER(ah)) {
|
||||||
|
for (i = 0; i < Ar5416RateSize; i++)
|
||||||
|
ratesArray[i] -= AR9287_PWR_TABLE_OFFSET_DB * 2;
|
||||||
|
@@ -971,17 +985,6 @@ static void ath9k_hw_ar9287_set_txpower(
|
||||||
|
| ATH9K_POW_SM(ratesArray[rateDupOfdm], 8)
|
||||||
|
| ATH9K_POW_SM(ratesArray[rateDupCck], 0));
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if (IS_CHAN_2GHZ(chan))
|
||||||
|
- i = rate1l;
|
||||||
|
- else
|
||||||
|
- i = rate6mb;
|
||||||
|
-
|
||||||
|
- if (AR_SREV_9280_20_OR_LATER(ah))
|
||||||
|
- regulatory->max_power_level =
|
||||||
|
- ratesArray[i] + AR9287_PWR_TABLE_OFFSET_DB * 2;
|
||||||
|
- else
|
||||||
|
- regulatory->max_power_level = ratesArray[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ath9k_hw_ar9287_set_addac(struct ath_hw *ah,
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||||
|
@@ -1258,7 +1258,7 @@ static void ath9k_hw_def_set_txpower(str
|
||||||
|
u16 cfgCtl,
|
||||||
|
u8 twiceAntennaReduction,
|
||||||
|
u8 twiceMaxRegulatoryPower,
|
||||||
|
- u8 powerLimit)
|
||||||
|
+ u8 powerLimit, bool test)
|
||||||
|
{
|
||||||
|
#define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta)
|
||||||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
@@ -1285,12 +1285,44 @@ static void ath9k_hw_def_set_txpower(str
|
||||||
|
|
||||||
|
ath9k_hw_set_def_power_cal_table(ah, chan, &txPowerIndexOffset);
|
||||||
|
|
||||||
|
+ regulatory->max_power_level = 0;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(ratesArray); i++) {
|
||||||
|
ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]);
|
||||||
|
if (ratesArray[i] > AR5416_MAX_RATE_POWER)
|
||||||
|
ratesArray[i] = AR5416_MAX_RATE_POWER;
|
||||||
|
+ if (ratesArray[i] > regulatory->max_power_level)
|
||||||
|
+ regulatory->max_power_level = ratesArray[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (!test) {
|
||||||
|
+ i = rate6mb;
|
||||||
|
+
|
||||||
|
+ if (IS_CHAN_HT40(chan))
|
||||||
|
+ i = rateHt40_0;
|
||||||
|
+ else if (IS_CHAN_HT20(chan))
|
||||||
|
+ i = rateHt20_0;
|
||||||
|
+
|
||||||
|
+ regulatory->max_power_level = ratesArray[i];
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ switch(ar5416_get_ntxchains(ah->txchainmask)) {
|
||||||
|
+ case 1:
|
||||||
|
+ break;
|
||||||
|
+ case 2:
|
||||||
|
+ regulatory->max_power_level += INCREASE_MAXPOW_BY_TWO_CHAIN;
|
||||||
|
+ break;
|
||||||
|
+ case 3:
|
||||||
|
+ regulatory->max_power_level += INCREASE_MAXPOW_BY_THREE_CHAIN;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ ath_print(ath9k_hw_common(ah), ATH_DBG_EEPROM,
|
||||||
|
+ "Invalid chainmask configuration\n");
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (test)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if (AR_SREV_9280_20_OR_LATER(ah)) {
|
||||||
|
for (i = 0; i < Ar5416RateSize; i++) {
|
||||||
|
int8_t pwr_table_offset;
|
||||||
|
@@ -1387,34 +1419,6 @@ static void ath9k_hw_def_set_txpower(str
|
||||||
|
REG_WRITE(ah, AR_PHY_POWER_TX_SUB,
|
||||||
|
ATH9K_POW_SM(pModal->pwrDecreaseFor3Chain, 6)
|
||||||
|
| ATH9K_POW_SM(pModal->pwrDecreaseFor2Chain, 0));
|
||||||
|
-
|
||||||
|
- i = rate6mb;
|
||||||
|
-
|
||||||
|
- if (IS_CHAN_HT40(chan))
|
||||||
|
- i = rateHt40_0;
|
||||||
|
- else if (IS_CHAN_HT20(chan))
|
||||||
|
- i = rateHt20_0;
|
||||||
|
-
|
||||||
|
- if (AR_SREV_9280_20_OR_LATER(ah))
|
||||||
|
- regulatory->max_power_level =
|
||||||
|
- ratesArray[i] + AR5416_PWR_TABLE_OFFSET_DB * 2;
|
||||||
|
- else
|
||||||
|
- regulatory->max_power_level = ratesArray[i];
|
||||||
|
-
|
||||||
|
- switch(ar5416_get_ntxchains(ah->txchainmask)) {
|
||||||
|
- case 1:
|
||||||
|
- break;
|
||||||
|
- case 2:
|
||||||
|
- regulatory->max_power_level += INCREASE_MAXPOW_BY_TWO_CHAIN;
|
||||||
|
- break;
|
||||||
|
- case 3:
|
||||||
|
- regulatory->max_power_level += INCREASE_MAXPOW_BY_THREE_CHAIN;
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- ath_print(ath9k_hw_common(ah), ATH_DBG_EEPROM,
|
||||||
|
- "Invalid chainmask configuration\n");
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 ath9k_hw_def_get_num_ant_config(struct ath_hw *ah,
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||||
|
@@ -2131,7 +2131,7 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||||
|
struct ath9k_channel *chan, u16 cfgCtl,
|
||||||
|
u8 twiceAntennaReduction,
|
||||||
|
u8 twiceMaxRegulatoryPower,
|
||||||
|
- u8 powerLimit)
|
||||||
|
+ u8 powerLimit, bool test)
|
||||||
|
{
|
||||||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
@@ -2145,7 +2145,16 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||||
|
twiceMaxRegulatoryPower,
|
||||||
|
powerLimit);
|
||||||
|
|
||||||
|
- while (i < ar9300RateSize) {
|
||||||
|
+ regulatory->max_power_level = 0;
|
||||||
|
+ for (i = 0; i < ar9300RateSize; i++) {
|
||||||
|
+ if (targetPowerValT2[i] > regulatory->max_power_level)
|
||||||
|
+ regulatory->max_power_level = targetPowerValT2[i];
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (test)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < ar9300RateSize; i++) {
|
||||||
|
ath_print(common, ATH_DBG_EEPROM,
|
||||||
|
"TPC[%02d] 0x%08x ", i, targetPowerValT2[i]);
|
||||||
|
i++;
|
||||||
|
@@ -2160,9 +2169,6 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Write target power array to registers */
|
||||||
|
- ar9003_hw_tx_power_regwrite(ah, targetPowerValT2);
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* This is the TX power we send back to driver core,
|
||||||
|
* and it can use to pass to userspace to display our
|
||||||
|
@@ -2181,8 +2187,10 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||||
|
i = ALL_TARGET_HT20_0_8_16; /* ht20 */
|
||||||
|
|
||||||
|
ah->txpower_limit = targetPowerValT2[i];
|
||||||
|
- regulatory->max_power_level = ratesArray[i];
|
||||||
|
+ regulatory->max_power_level = targetPowerValT2[i];
|
||||||
|
|
||||||
|
+ /* Write target power array to registers */
|
||||||
|
+ ar9003_hw_tx_power_regwrite(ah, targetPowerValT2);
|
||||||
|
ar9003_hw_calibration_apply(ah, chan->channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
|
@@ -1178,7 +1178,7 @@ static bool ath9k_hw_channel_change(stru
|
||||||
|
channel->max_antenna_gain * 2,
|
||||||
|
channel->max_power * 2,
|
||||||
|
min((u32) MAX_RATE_POWER,
|
||||||
|
- (u32) regulatory->power_limit));
|
||||||
|
+ (u32) regulatory->power_limit), false);
|
||||||
|
|
||||||
|
ath9k_hw_rfbus_done(ah);
|
||||||
|
|
||||||
|
@@ -2177,7 +2177,7 @@ bool ath9k_hw_disable(struct ath_hw *ah)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ath9k_hw_disable);
|
||||||
|
|
||||||
|
-void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit)
|
||||||
|
+void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
|
||||||
|
{
|
||||||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
struct ath9k_channel *chan = ah->curchan;
|
||||||
|
@@ -2190,7 +2190,7 @@ void ath9k_hw_set_txpowerlimit(struct at
|
||||||
|
channel->max_antenna_gain * 2,
|
||||||
|
channel->max_power * 2,
|
||||||
|
min((u32) MAX_RATE_POWER,
|
||||||
|
- (u32) regulatory->power_limit));
|
||||||
|
+ (u32) regulatory->power_limit), test);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
|
||||||
|
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
|
@@ -860,7 +860,7 @@ u32 ath9k_hw_getrxfilter(struct ath_hw *
|
||||||
|
void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits);
|
||||||
|
bool ath9k_hw_phy_disable(struct ath_hw *ah);
|
||||||
|
bool ath9k_hw_disable(struct ath_hw *ah);
|
||||||
|
-void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit);
|
||||||
|
+void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test);
|
||||||
|
void ath9k_hw_setopmode(struct ath_hw *ah);
|
||||||
|
void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1);
|
||||||
|
void ath9k_hw_setbssidmask(struct ath_hw *ah);
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
@@ -24,7 +24,7 @@ static void ath_update_txpow(struct ath_
|
||||||
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
|
|
||||||
|
if (sc->curtxpow != sc->config.txpowlimit) {
|
||||||
|
- ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit);
|
||||||
|
+ ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit, false);
|
||||||
|
/* read back in case value is clamped */
|
||||||
|
sc->curtxpow = ath9k_hw_regulatory(ah)->power_limit;
|
||||||
|
}
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||||
|
@@ -614,7 +614,7 @@ static int ar9003_hw_process_ini(struct
|
||||||
|
channel->max_antenna_gain * 2,
|
||||||
|
channel->max_power * 2,
|
||||||
|
min((u32) MAX_RATE_POWER,
|
||||||
|
- (u32) regulatory->power_limit));
|
||||||
|
+ (u32) regulatory->power_limit), false);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||||
|
@@ -875,7 +875,7 @@ static int ar5008_hw_process_ini(struct
|
||||||
|
channel->max_antenna_gain * 2,
|
||||||
|
channel->max_power * 2,
|
||||||
|
min((u32) MAX_RATE_POWER,
|
||||||
|
- (u32) regulatory->power_limit));
|
||||||
|
+ (u32) regulatory->power_limit), false);
|
||||||
|
|
||||||
|
/* Write analog registers */
|
||||||
|
if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) {
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||||
|
@@ -29,7 +29,7 @@ static void ath_update_txpow(struct ath9
|
||||||
|
struct ath_hw *ah = priv->ah;
|
||||||
|
|
||||||
|
if (priv->curtxpow != priv->txpowlimit) {
|
||||||
|
- ath9k_hw_set_txpowerlimit(ah, priv->txpowlimit);
|
||||||
|
+ ath9k_hw_set_txpowerlimit(ah, priv->txpowlimit, false);
|
||||||
|
/* read back in case value is clamped */
|
||||||
|
priv->curtxpow = ath9k_hw_regulatory(ah)->power_limit;
|
||||||
|
}
|
@ -1,131 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
|
||||||
@@ -61,6 +61,8 @@ static int ath_tx_num_badfrms(struct ath
|
|
||||||
struct ath_tx_status *ts, int txok);
|
|
||||||
static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
|
|
||||||
int nbad, int txok, bool update_rc);
|
|
||||||
+static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
|
|
||||||
+ int seqno);
|
|
||||||
|
|
||||||
enum {
|
|
||||||
MCS_HT20,
|
|
||||||
@@ -144,18 +146,23 @@ static void ath_tx_flush_tid(struct ath_
|
|
||||||
struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum];
|
|
||||||
struct ath_buf *bf;
|
|
||||||
struct list_head bf_head;
|
|
||||||
- INIT_LIST_HEAD(&bf_head);
|
|
||||||
+ struct ath_tx_status ts;
|
|
||||||
|
|
||||||
- WARN_ON(!tid->paused);
|
|
||||||
+ INIT_LIST_HEAD(&bf_head);
|
|
||||||
|
|
||||||
+ memset(&ts, 0, sizeof(ts));
|
|
||||||
spin_lock_bh(&txq->axq_lock);
|
|
||||||
- tid->paused = false;
|
|
||||||
|
|
||||||
while (!list_empty(&tid->buf_q)) {
|
|
||||||
bf = list_first_entry(&tid->buf_q, struct ath_buf, list);
|
|
||||||
- BUG_ON(bf_isretried(bf));
|
|
||||||
list_move_tail(&bf->list, &bf_head);
|
|
||||||
- ath_tx_send_ht_normal(sc, txq, tid, &bf_head);
|
|
||||||
+
|
|
||||||
+ if (bf_isretried(bf)) {
|
|
||||||
+ ath_tx_update_baw(sc, tid, bf->bf_seqno);
|
|
||||||
+ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
|
|
||||||
+ } else {
|
|
||||||
+ ath_tx_send_ht_normal(sc, txq, tid, &bf_head);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_bh(&txq->axq_lock);
|
|
||||||
@@ -430,7 +437,7 @@ static void ath_tx_complete_aggr(struct
|
|
||||||
list_move_tail(&bf->list, &bf_head);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!txpending) {
|
|
||||||
+ if (!txpending || (tid->state & AGGR_CLEANUP)) {
|
|
||||||
/*
|
|
||||||
* complete the acked-ones/xretried ones; update
|
|
||||||
* block-ack window
|
|
||||||
@@ -451,6 +458,7 @@ static void ath_tx_complete_aggr(struct
|
|
||||||
!txfail, sendbar);
|
|
||||||
} else {
|
|
||||||
/* retry the un-acked ones */
|
|
||||||
+
|
|
||||||
if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) {
|
|
||||||
if (bf->bf_next == NULL && bf_last->bf_stale) {
|
|
||||||
struct ath_buf *tbf;
|
|
||||||
@@ -509,15 +517,12 @@ static void ath_tx_complete_aggr(struct
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tid->state & AGGR_CLEANUP) {
|
|
||||||
+ ath_tx_flush_tid(sc, tid);
|
|
||||||
+
|
|
||||||
if (tid->baw_head == tid->baw_tail) {
|
|
||||||
tid->state &= ~AGGR_ADDBA_COMPLETE;
|
|
||||||
tid->state &= ~AGGR_CLEANUP;
|
|
||||||
-
|
|
||||||
- /* send buffered frames as singles */
|
|
||||||
- ath_tx_flush_tid(sc, tid);
|
|
||||||
}
|
|
||||||
- rcu_read_unlock();
|
|
||||||
- return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rcu_read_unlock();
|
|
||||||
@@ -808,12 +813,6 @@ void ath_tx_aggr_stop(struct ath_softc *
|
|
||||||
struct ath_node *an = (struct ath_node *)sta->drv_priv;
|
|
||||||
struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid);
|
|
||||||
struct ath_txq *txq = &sc->tx.txq[txtid->ac->qnum];
|
|
||||||
- struct ath_tx_status ts;
|
|
||||||
- struct ath_buf *bf;
|
|
||||||
- struct list_head bf_head;
|
|
||||||
-
|
|
||||||
- memset(&ts, 0, sizeof(ts));
|
|
||||||
- INIT_LIST_HEAD(&bf_head);
|
|
||||||
|
|
||||||
if (txtid->state & AGGR_CLEANUP)
|
|
||||||
return;
|
|
||||||
@@ -823,31 +822,22 @@ void ath_tx_aggr_stop(struct ath_softc *
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* drop all software retried frames and mark this TID */
|
|
||||||
spin_lock_bh(&txq->axq_lock);
|
|
||||||
txtid->paused = true;
|
|
||||||
- while (!list_empty(&txtid->buf_q)) {
|
|
||||||
- bf = list_first_entry(&txtid->buf_q, struct ath_buf, list);
|
|
||||||
- if (!bf_isretried(bf)) {
|
|
||||||
- /*
|
|
||||||
- * NB: it's based on the assumption that
|
|
||||||
- * software retried frame will always stay
|
|
||||||
- * at the head of software queue.
|
|
||||||
- */
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- list_move_tail(&bf->list, &bf_head);
|
|
||||||
- ath_tx_update_baw(sc, txtid, bf->bf_seqno);
|
|
||||||
- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
|
|
||||||
- }
|
|
||||||
- spin_unlock_bh(&txq->axq_lock);
|
|
||||||
|
|
||||||
- if (txtid->baw_head != txtid->baw_tail) {
|
|
||||||
+ /*
|
|
||||||
+ * If frames are still being transmitted for this TID, they will be
|
|
||||||
+ * cleaned up during tx completion. To prevent race conditions, this
|
|
||||||
+ * TID can only be reused after all in-progress subframes have been
|
|
||||||
+ * completed.
|
|
||||||
+ */
|
|
||||||
+ if (txtid->baw_head != txtid->baw_tail)
|
|
||||||
txtid->state |= AGGR_CLEANUP;
|
|
||||||
- } else {
|
|
||||||
+ else
|
|
||||||
txtid->state &= ~AGGR_ADDBA_COMPLETE;
|
|
||||||
- ath_tx_flush_tid(sc, txtid);
|
|
||||||
- }
|
|
||||||
+ spin_unlock_bh(&txq->axq_lock);
|
|
||||||
+
|
|
||||||
+ ath_tx_flush_tid(sc, txtid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
|
|
115
package/mac80211/patches/522-ath9k_tx_power_init.patch
Normal file
115
package/mac80211/patches/522-ath9k_tx_power_init.patch
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
|
@@ -650,6 +650,37 @@ err_hw:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void ath9k_init_band_txpower(struct ath_softc *sc, int band)
|
||||||
|
+{
|
||||||
|
+ struct ieee80211_supported_band *sband;
|
||||||
|
+ struct ieee80211_channel *chan;
|
||||||
|
+ struct ath_hw *ah = sc->sc_ah;
|
||||||
|
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ sband = &sc->sbands[band];
|
||||||
|
+ for (i = 0; i < sband->n_channels; i++) {
|
||||||
|
+ chan = &sband->channels[i];
|
||||||
|
+ ah->curchan = &ah->channels[chan->hw_value];
|
||||||
|
+ ath9k_cmn_update_ichannel(ah->curchan, chan, NL80211_CHAN_HT20);
|
||||||
|
+ ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true);
|
||||||
|
+ chan->max_power = reg->max_power_level / 2;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void ath9k_init_txpower_limits(struct ath_softc *sc)
|
||||||
|
+{
|
||||||
|
+ struct ath_hw *ah = sc->sc_ah;
|
||||||
|
+ struct ath9k_channel *curchan = ah->curchan;
|
||||||
|
+
|
||||||
|
+ if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
|
||||||
|
+ ath9k_init_band_txpower(sc, IEEE80211_BAND_2GHZ);
|
||||||
|
+ if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
|
||||||
|
+ ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
|
||||||
|
+
|
||||||
|
+ ah->curchan = curchan;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||||
|
{
|
||||||
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
|
@@ -765,6 +796,8 @@ int ath9k_init_device(u16 devid, struct
|
||||||
|
if (error != 0)
|
||||||
|
goto error_rx;
|
||||||
|
|
||||||
|
+ ath9k_init_txpower_limits(sc);
|
||||||
|
+
|
||||||
|
/* Register with mac80211 */
|
||||||
|
error = ieee80211_register_hw(hw);
|
||||||
|
if (error)
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/common.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/common.c
|
||||||
|
@@ -107,12 +107,10 @@ static u32 ath9k_get_extchanmode(struct
|
||||||
|
/*
|
||||||
|
* Update internal channel flags.
|
||||||
|
*/
|
||||||
|
-void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
|
||||||
|
- struct ath9k_channel *ichan)
|
||||||
|
+void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
|
||||||
|
+ struct ieee80211_channel *chan,
|
||||||
|
+ enum nl80211_channel_type channel_type)
|
||||||
|
{
|
||||||
|
- struct ieee80211_channel *chan = hw->conf.channel;
|
||||||
|
- struct ieee80211_conf *conf = &hw->conf;
|
||||||
|
-
|
||||||
|
ichan->channel = chan->center_freq;
|
||||||
|
ichan->chan = chan;
|
||||||
|
|
||||||
|
@@ -124,9 +122,8 @@ void ath9k_cmn_update_ichannel(struct ie
|
||||||
|
ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (conf_is_ht(conf))
|
||||||
|
- ichan->chanmode = ath9k_get_extchanmode(chan,
|
||||||
|
- conf->channel_type);
|
||||||
|
+ if (channel_type != NL80211_CHAN_NO_HT)
|
||||||
|
+ ichan->chanmode = ath9k_get_extchanmode(chan, channel_type);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ath9k_cmn_update_ichannel);
|
||||||
|
|
||||||
|
@@ -142,7 +139,7 @@ struct ath9k_channel *ath9k_cmn_get_curc
|
||||||
|
|
||||||
|
chan_idx = curchan->hw_value;
|
||||||
|
channel = &ah->channels[chan_idx];
|
||||||
|
- ath9k_cmn_update_ichannel(hw, channel);
|
||||||
|
+ ath9k_cmn_update_ichannel(channel, curchan, hw->conf.channel_type);
|
||||||
|
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/common.h
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/common.h
|
||||||
|
@@ -62,8 +62,9 @@ enum ath_stomp_type {
|
||||||
|
|
||||||
|
int ath9k_cmn_padpos(__le16 frame_control);
|
||||||
|
int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
|
||||||
|
-void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
|
||||||
|
- struct ath9k_channel *ichan);
|
||||||
|
+void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
|
||||||
|
+ struct ieee80211_channel *chan,
|
||||||
|
+ enum nl80211_channel_type channel_type);
|
||||||
|
struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw,
|
||||||
|
struct ath_hw *ah);
|
||||||
|
int ath9k_cmn_count_streams(unsigned int chainmask, int max);
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||||
|
@@ -1405,7 +1405,9 @@ static int ath9k_htc_config(struct ieee8
|
||||||
|
ath_print(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
|
||||||
|
curchan->center_freq);
|
||||||
|
|
||||||
|
- ath9k_cmn_update_ichannel(hw, &priv->ah->channels[pos]);
|
||||||
|
+ ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
|
||||||
|
+ hw->conf.channel,
|
||||||
|
+ hw->conf.channel_type);
|
||||||
|
|
||||||
|
if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
363
package/mac80211/patches/530-ath9k_locking_fix.patch
Normal file
363
package/mac80211/patches/530-ath9k_locking_fix.patch
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||||
|
@@ -309,7 +309,6 @@ struct ath_rx {
|
||||||
|
u8 rxotherant;
|
||||||
|
u32 *rxlink;
|
||||||
|
unsigned int rxfilter;
|
||||||
|
- spinlock_t rxflushlock;
|
||||||
|
spinlock_t rxbuflock;
|
||||||
|
struct list_head rxbuf;
|
||||||
|
struct ath_descdma rxdma;
|
||||||
|
@@ -600,9 +599,9 @@ struct ath_softc {
|
||||||
|
struct ath_hw *sc_ah;
|
||||||
|
void __iomem *mem;
|
||||||
|
int irq;
|
||||||
|
- spinlock_t sc_resetlock;
|
||||||
|
spinlock_t sc_serial_rw;
|
||||||
|
spinlock_t sc_pm_lock;
|
||||||
|
+ spinlock_t sc_pcu_lock;
|
||||||
|
struct mutex mutex;
|
||||||
|
struct work_struct paprd_work;
|
||||||
|
struct work_struct hw_check_work;
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
@@ -228,6 +228,8 @@ int ath_set_channel(struct ath_softc *sc
|
||||||
|
|
||||||
|
ath9k_ps_wakeup(sc);
|
||||||
|
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* This is only performed if the channel settings have
|
||||||
|
* actually changed.
|
||||||
|
@@ -239,6 +241,7 @@ int ath_set_channel(struct ath_softc *sc
|
||||||
|
*/
|
||||||
|
ath9k_hw_disable_interrupts(ah);
|
||||||
|
ath_drain_all_txq(sc, false);
|
||||||
|
+
|
||||||
|
stopped = ath_stoprecv(sc);
|
||||||
|
|
||||||
|
/* XXX: do not flush receive queue here. We don't want
|
||||||
|
@@ -257,18 +260,14 @@ int ath_set_channel(struct ath_softc *sc
|
||||||
|
channel->center_freq, conf_is_ht40(conf),
|
||||||
|
fastcc);
|
||||||
|
|
||||||
|
- spin_lock_bh(&sc->sc_resetlock);
|
||||||
|
-
|
||||||
|
r = ath9k_hw_reset(ah, hchan, caldata, fastcc);
|
||||||
|
if (r) {
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Unable to reset channel (%u MHz), "
|
||||||
|
"reset status %d\n",
|
||||||
|
channel->center_freq, r);
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
goto ps_restore;
|
||||||
|
}
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
|
||||||
|
if (ath_startrecv(sc) != 0) {
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
@@ -287,6 +286,8 @@ int ath_set_channel(struct ath_softc *sc
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_restore:
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
@@ -600,6 +601,8 @@ void ath9k_tasklet(unsigned long data)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
if (!ath9k_hw_check_alive(ah))
|
||||||
|
ieee80211_queue_work(sc->hw, &sc->hw_check_work);
|
||||||
|
|
||||||
|
@@ -610,15 +613,12 @@ void ath9k_tasklet(unsigned long data)
|
||||||
|
rxmask = (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
|
||||||
|
|
||||||
|
if (status & rxmask) {
|
||||||
|
- spin_lock_bh(&sc->rx.rxflushlock);
|
||||||
|
-
|
||||||
|
/* Check for high priority Rx first */
|
||||||
|
if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
|
||||||
|
(status & ATH9K_INT_RXHP))
|
||||||
|
ath_rx_tasklet(sc, 0, true);
|
||||||
|
|
||||||
|
ath_rx_tasklet(sc, 0, false);
|
||||||
|
- spin_unlock_bh(&sc->rx.rxflushlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status & ATH9K_INT_TX) {
|
||||||
|
@@ -644,6 +644,8 @@ void ath9k_tasklet(unsigned long data)
|
||||||
|
|
||||||
|
/* re-enable hardware interrupt */
|
||||||
|
ath9k_hw_enable_interrupts(ah);
|
||||||
|
+
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -871,12 +873,13 @@ void ath_radio_enable(struct ath_softc *
|
||||||
|
int r;
|
||||||
|
|
||||||
|
ath9k_ps_wakeup(sc);
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
ath9k_hw_configpcipowersave(ah, 0, 0);
|
||||||
|
|
||||||
|
if (!ah->curchan)
|
||||||
|
ah->curchan = ath_get_curchannel(sc, sc->hw);
|
||||||
|
|
||||||
|
- spin_lock_bh(&sc->sc_resetlock);
|
||||||
|
r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
|
||||||
|
if (r) {
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
@@ -884,15 +887,14 @@ void ath_radio_enable(struct ath_softc *
|
||||||
|
"reset status %d\n",
|
||||||
|
channel->center_freq, r);
|
||||||
|
}
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
|
||||||
|
ath_update_txpow(sc);
|
||||||
|
if (ath_startrecv(sc) != 0) {
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Unable to restart recv logic\n");
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
if (sc->sc_flags & SC_OP_BEACONS)
|
||||||
|
ath_beacon_config(sc, NULL); /* restart beacons */
|
||||||
|
|
||||||
|
@@ -905,6 +907,8 @@ void ath_radio_enable(struct ath_softc *
|
||||||
|
ath9k_hw_set_gpio(ah, ah->led_pin, 0);
|
||||||
|
|
||||||
|
ieee80211_wake_queues(hw);
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -915,6 +919,8 @@ void ath_radio_disable(struct ath_softc
|
||||||
|
int r;
|
||||||
|
|
||||||
|
ath9k_ps_wakeup(sc);
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
ieee80211_stop_queues(hw);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -930,13 +936,13 @@ void ath_radio_disable(struct ath_softc
|
||||||
|
ath9k_hw_disable_interrupts(ah);
|
||||||
|
|
||||||
|
ath_drain_all_txq(sc, false); /* clear pending tx frames */
|
||||||
|
+
|
||||||
|
ath_stoprecv(sc); /* turn off frame recv */
|
||||||
|
ath_flushrecv(sc); /* flush recv queue */
|
||||||
|
|
||||||
|
if (!ah->curchan)
|
||||||
|
ah->curchan = ath_get_curchannel(sc, hw);
|
||||||
|
|
||||||
|
- spin_lock_bh(&sc->sc_resetlock);
|
||||||
|
r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
|
||||||
|
if (r) {
|
||||||
|
ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
|
||||||
|
@@ -944,11 +950,14 @@ void ath_radio_disable(struct ath_softc
|
||||||
|
"reset status %d\n",
|
||||||
|
channel->center_freq, r);
|
||||||
|
}
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
|
||||||
|
ath9k_hw_phy_disable(ah);
|
||||||
|
+
|
||||||
|
ath9k_hw_configpcipowersave(ah, 1, 1);
|
||||||
|
+
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
+
|
||||||
|
ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -962,19 +971,20 @@ int ath_reset(struct ath_softc *sc, bool
|
||||||
|
/* Stop ANI */
|
||||||
|
del_timer_sync(&common->ani.timer);
|
||||||
|
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
ieee80211_stop_queues(hw);
|
||||||
|
|
||||||
|
ath9k_hw_disable_interrupts(ah);
|
||||||
|
ath_drain_all_txq(sc, retry_tx);
|
||||||
|
+
|
||||||
|
ath_stoprecv(sc);
|
||||||
|
ath_flushrecv(sc);
|
||||||
|
|
||||||
|
- spin_lock_bh(&sc->sc_resetlock);
|
||||||
|
r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
|
||||||
|
if (r)
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Unable to reset hardware; reset status %d\n", r);
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
|
||||||
|
if (ath_startrecv(sc) != 0)
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
@@ -1004,6 +1014,7 @@ int ath_reset(struct ath_softc *sc, bool
|
||||||
|
}
|
||||||
|
|
||||||
|
ieee80211_wake_queues(hw);
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
|
||||||
|
/* Start ANI */
|
||||||
|
ath_start_ani(common);
|
||||||
|
@@ -1142,17 +1153,16 @@ static int ath9k_start(struct ieee80211_
|
||||||
|
* be followed by initialization of the appropriate bits
|
||||||
|
* and then setup of the interrupt mask.
|
||||||
|
*/
|
||||||
|
- spin_lock_bh(&sc->sc_resetlock);
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
|
||||||
|
if (r) {
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Unable to reset hardware; reset status %d "
|
||||||
|
"(freq %u MHz)\n", r,
|
||||||
|
curchan->center_freq);
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
goto mutex_unlock;
|
||||||
|
}
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is needed only to setup initial state
|
||||||
|
@@ -1171,8 +1181,10 @@ static int ath9k_start(struct ieee80211_
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Unable to start recv logic\n");
|
||||||
|
r = -EIO;
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
goto mutex_unlock;
|
||||||
|
}
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
|
||||||
|
/* Setup our intr mask. */
|
||||||
|
ah->imask = ATH9K_INT_TX | ATH9K_INT_RXEOL |
|
||||||
|
@@ -1367,6 +1379,8 @@ static void ath9k_stop(struct ieee80211_
|
||||||
|
ath9k_btcoex_timer_pause(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
/* make sure h/w will not generate any interrupt
|
||||||
|
* before setting the invalid flag. */
|
||||||
|
ath9k_hw_disable_interrupts(ah);
|
||||||
|
@@ -1381,6 +1395,9 @@ static void ath9k_stop(struct ieee80211_
|
||||||
|
/* disable HAL and put h/w to sleep */
|
||||||
|
ath9k_hw_disable(ah);
|
||||||
|
ath9k_hw_configpcipowersave(ah, 1, 1);
|
||||||
|
+
|
||||||
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
|
+
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
|
||||||
|
/* Finally, put the chip in FULL SLEEP mode */
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||||
|
@@ -297,19 +297,17 @@ static void ath_edma_start_recv(struct a
|
||||||
|
ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_LP,
|
||||||
|
sc->rx.rx_edma[ATH9K_RX_QUEUE_LP].rx_fifo_hwsize);
|
||||||
|
|
||||||
|
- spin_unlock_bh(&sc->rx.rxbuflock);
|
||||||
|
-
|
||||||
|
ath_opmode_init(sc);
|
||||||
|
|
||||||
|
ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
|
||||||
|
+
|
||||||
|
+ spin_unlock_bh(&sc->rx.rxbuflock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ath_edma_stop_recv(struct ath_softc *sc)
|
||||||
|
{
|
||||||
|
- spin_lock_bh(&sc->rx.rxbuflock);
|
||||||
|
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP);
|
||||||
|
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP);
|
||||||
|
- spin_unlock_bh(&sc->rx.rxbuflock);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ath_rx_init(struct ath_softc *sc, int nbufs)
|
||||||
|
@@ -319,7 +317,7 @@ int ath_rx_init(struct ath_softc *sc, in
|
||||||
|
struct ath_buf *bf;
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
|
- spin_lock_init(&sc->rx.rxflushlock);
|
||||||
|
+ spin_lock_init(&sc->sc_pcu_lock);
|
||||||
|
sc->sc_flags &= ~SC_OP_RXFLUSH;
|
||||||
|
spin_lock_init(&sc->rx.rxbuflock);
|
||||||
|
|
||||||
|
@@ -506,9 +504,9 @@ int ath_startrecv(struct ath_softc *sc)
|
||||||
|
ath9k_hw_rxena(ah);
|
||||||
|
|
||||||
|
start_recv:
|
||||||
|
- spin_unlock_bh(&sc->rx.rxbuflock);
|
||||||
|
ath_opmode_init(sc);
|
||||||
|
ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
|
||||||
|
+ spin_unlock_bh(&sc->rx.rxbuflock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -518,6 +516,7 @@ bool ath_stoprecv(struct ath_softc *sc)
|
||||||
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
|
bool stopped;
|
||||||
|
|
||||||
|
+ spin_lock_bh(&sc->rx.rxbuflock);
|
||||||
|
ath9k_hw_stoppcurecv(ah);
|
||||||
|
ath9k_hw_setrxfilter(ah, 0);
|
||||||
|
stopped = ath9k_hw_stopdmarecv(ah);
|
||||||
|
@@ -526,19 +525,18 @@ bool ath_stoprecv(struct ath_softc *sc)
|
||||||
|
ath_edma_stop_recv(sc);
|
||||||
|
else
|
||||||
|
sc->rx.rxlink = NULL;
|
||||||
|
+ spin_unlock_bh(&sc->rx.rxbuflock);
|
||||||
|
|
||||||
|
return stopped;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ath_flushrecv(struct ath_softc *sc)
|
||||||
|
{
|
||||||
|
- spin_lock_bh(&sc->rx.rxflushlock);
|
||||||
|
sc->sc_flags |= SC_OP_RXFLUSH;
|
||||||
|
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
|
||||||
|
ath_rx_tasklet(sc, 1, true);
|
||||||
|
ath_rx_tasklet(sc, 1, false);
|
||||||
|
sc->sc_flags &= ~SC_OP_RXFLUSH;
|
||||||
|
- spin_unlock_bh(&sc->rx.rxflushlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
|
@@ -588,7 +588,6 @@ static int ath9k_init_softc(u16 devid, s
|
||||||
|
spin_lock_init(&common->cc_lock);
|
||||||
|
|
||||||
|
spin_lock_init(&sc->wiphy_lock);
|
||||||
|
- spin_lock_init(&sc->sc_resetlock);
|
||||||
|
spin_lock_init(&sc->sc_serial_rw);
|
||||||
|
spin_lock_init(&sc->sc_pm_lock);
|
||||||
|
mutex_init(&sc->mutex);
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
@@ -1142,13 +1142,11 @@ void ath_drain_all_txq(struct ath_softc
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Failed to stop TX DMA. Resetting hardware!\n");
|
||||||
|
|
||||||
|
- spin_lock_bh(&sc->sc_resetlock);
|
||||||
|
r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
|
||||||
|
if (r)
|
||||||
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
|
"Unable to reset hardware; reset status %d\n",
|
||||||
|
r);
|
||||||
|
- spin_unlock_bh(&sc->sc_resetlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
12
package/mac80211/patches/540-ath9k_fix_survey_crash.patch
Normal file
12
package/mac80211/patches/540-ath9k_fix_survey_crash.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
@@ -183,6 +183,9 @@ static void ath_update_survey_stats(stru
|
||||||
|
struct ath_cycle_counters *cc = &common->cc_survey;
|
||||||
|
unsigned int div = common->clockrate * 1000;
|
||||||
|
|
||||||
|
+ if (!ah->curchan)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if (ah->power_mode == ATH9K_PM_AWAKE)
|
||||||
|
ath_hw_cycle_counters_update(common);
|
||||||
|
|
@ -1,91 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
|
||||||
@@ -57,7 +57,7 @@ MODULE_PARM_DESC(blink, "Enable LED blin
|
|
||||||
* on 5 MHz steps, we support the channels which we know
|
|
||||||
* we have calibration data for all cards though to make
|
|
||||||
* this static */
|
|
||||||
-static struct ieee80211_channel ath9k_2ghz_chantable[] = {
|
|
||||||
+static const struct ieee80211_channel ath9k_2ghz_chantable[] = {
|
|
||||||
CHAN2G(2412, 0), /* Channel 1 */
|
|
||||||
CHAN2G(2417, 1), /* Channel 2 */
|
|
||||||
CHAN2G(2422, 2), /* Channel 3 */
|
|
||||||
@@ -78,7 +78,7 @@ static struct ieee80211_channel ath9k_2g
|
|
||||||
* on 5 MHz steps, we support the channels which we know
|
|
||||||
* we have calibration data for all cards though to make
|
|
||||||
* this static */
|
|
||||||
-static struct ieee80211_channel ath9k_5ghz_chantable[] = {
|
|
||||||
+static const struct ieee80211_channel ath9k_5ghz_chantable[] = {
|
|
||||||
/* _We_ call this UNII 1 */
|
|
||||||
CHAN5G(5180, 14), /* Channel 36 */
|
|
||||||
CHAN5G(5200, 15), /* Channel 40 */
|
|
||||||
@@ -478,10 +478,17 @@ err:
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void ath9k_init_channels_rates(struct ath_softc *sc)
|
|
||||||
+static int ath9k_init_channels_rates(struct ath_softc *sc)
|
|
||||||
{
|
|
||||||
+ void *channels;
|
|
||||||
+
|
|
||||||
if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) {
|
|
||||||
- sc->sbands[IEEE80211_BAND_2GHZ].channels = ath9k_2ghz_chantable;
|
|
||||||
+ channels = kmemdup(ath9k_2ghz_chantable,
|
|
||||||
+ sizeof(ath9k_2ghz_chantable), GFP_KERNEL);
|
|
||||||
+ if (!channels)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ sc->sbands[IEEE80211_BAND_2GHZ].channels = channels;
|
|
||||||
sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
|
|
||||||
sc->sbands[IEEE80211_BAND_2GHZ].n_channels =
|
|
||||||
ARRAY_SIZE(ath9k_2ghz_chantable);
|
|
||||||
@@ -491,7 +498,15 @@ static void ath9k_init_channels_rates(st
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) {
|
|
||||||
- sc->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_chantable;
|
|
||||||
+ channels = kmemdup(ath9k_5ghz_chantable,
|
|
||||||
+ sizeof(ath9k_5ghz_chantable), GFP_KERNEL);
|
|
||||||
+ if (!channels) {
|
|
||||||
+ if (sc->sbands[IEEE80211_BAND_2GHZ].channels)
|
|
||||||
+ kfree(sc->sbands[IEEE80211_BAND_2GHZ].channels);
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ sc->sbands[IEEE80211_BAND_5GHZ].channels = channels;
|
|
||||||
sc->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
|
|
||||||
sc->sbands[IEEE80211_BAND_5GHZ].n_channels =
|
|
||||||
ARRAY_SIZE(ath9k_5ghz_chantable);
|
|
||||||
@@ -500,6 +515,7 @@ static void ath9k_init_channels_rates(st
|
|
||||||
sc->sbands[IEEE80211_BAND_5GHZ].n_bitrates =
|
|
||||||
ARRAY_SIZE(ath9k_legacy_rates) - 4;
|
|
||||||
}
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ath9k_init_misc(struct ath_softc *sc)
|
|
||||||
@@ -603,8 +619,11 @@ static int ath9k_init_softc(u16 devid, s
|
|
||||||
if (ret)
|
|
||||||
goto err_btcoex;
|
|
||||||
|
|
||||||
+ ret = ath9k_init_channels_rates(sc);
|
|
||||||
+ if (ret)
|
|
||||||
+ goto err_btcoex;
|
|
||||||
+
|
|
||||||
ath9k_init_crypto(sc);
|
|
||||||
- ath9k_init_channels_rates(sc);
|
|
||||||
ath9k_init_misc(sc);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
@@ -786,6 +805,12 @@ static void ath9k_deinit_softc(struct at
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
+ if (sc->sbands[IEEE80211_BAND_2GHZ].channels)
|
|
||||||
+ kfree(sc->sbands[IEEE80211_BAND_2GHZ].channels);
|
|
||||||
+
|
|
||||||
+ if (sc->sbands[IEEE80211_BAND_5GHZ].channels)
|
|
||||||
+ kfree(sc->sbands[IEEE80211_BAND_5GHZ].channels);
|
|
||||||
+
|
|
||||||
if ((sc->btcoex.no_stomp_timer) &&
|
|
||||||
sc->sc_ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
|
|
||||||
ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
|
|
@ -1,11 +0,0 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/ani.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/ani.c
|
|
||||||
@@ -544,7 +544,7 @@ static u8 ath9k_hw_chan_2_clockrate_mhz(
|
|
||||||
if (conf_is_ht40(conf))
|
|
||||||
return clockrate * 2;
|
|
||||||
|
|
||||||
- return clockrate * 2;
|
|
||||||
+ return clockrate;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t ath9k_hw_ani_get_listen_time(struct ath_hw *ah)
|
|
25
package/mac80211/patches/550-ath9k_xretry_fix.patch
Normal file
25
package/mac80211/patches/550-ath9k_xretry_fix.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
||||||
|
@@ -237,13 +237,15 @@ static int ar9002_hw_proc_txdesc(struct
|
||||||
|
status = ACCESS_ONCE(ads->ds_txstatus1);
|
||||||
|
if (status & AR_FrmXmitOK)
|
||||||
|
ts->ts_status |= ATH9K_TX_ACKED;
|
||||||
|
- if (status & AR_ExcessiveRetries)
|
||||||
|
- ts->ts_status |= ATH9K_TXERR_XRETRY;
|
||||||
|
- if (status & AR_Filtered)
|
||||||
|
- ts->ts_status |= ATH9K_TXERR_FILT;
|
||||||
|
- if (status & AR_FIFOUnderrun) {
|
||||||
|
- ts->ts_status |= ATH9K_TXERR_FIFO;
|
||||||
|
- ath9k_hw_updatetxtriglevel(ah, true);
|
||||||
|
+ else {
|
||||||
|
+ if (status & AR_ExcessiveRetries)
|
||||||
|
+ ts->ts_status |= ATH9K_TXERR_XRETRY;
|
||||||
|
+ if (status & AR_Filtered)
|
||||||
|
+ ts->ts_status |= ATH9K_TXERR_FILT;
|
||||||
|
+ if (status & AR_FIFOUnderrun) {
|
||||||
|
+ ts->ts_status |= ATH9K_TXERR_FIFO;
|
||||||
|
+ ath9k_hw_updatetxtriglevel(ah, true);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
if (status & AR_TxTimerExpired)
|
||||||
|
ts->ts_status |= ATH9K_TXERR_TIMER_EXPIRED;
|
22
package/mac80211/patches/560-ath9k_aggr_sampling_fix.patch
Normal file
22
package/mac80211/patches/560-ath9k_aggr_sampling_fix.patch
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
@@ -673,6 +673,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_
|
||||||
|
u16 aggr_limit = 0, al = 0, bpad = 0,
|
||||||
|
al_delta, h_baw = tid->baw_size / 2;
|
||||||
|
enum ATH_AGGR_STATUS status = ATH_AGGR_DONE;
|
||||||
|
+ struct ieee80211_tx_info *tx_info;
|
||||||
|
|
||||||
|
bf_first = list_first_entry(&tid->buf_q, struct ath_buf, list);
|
||||||
|
|
||||||
|
@@ -699,6 +700,11 @@ static enum ATH_AGGR_STATUS ath_tx_form_
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
||||||
|
+ if (nframes && ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) ||
|
||||||
|
+ !(tx_info->control.rates[0].flags & IEEE80211_TX_RC_MCS)))
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
/* do not exceed subframe limit */
|
||||||
|
if (nframes >= min((int)h_baw, ATH_AMPDU_SUBFRAME_DEFAULT)) {
|
||||||
|
status = ATH_AGGR_LIMITED;
|
@ -0,0 +1,13 @@
|
|||||||
|
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||||
|
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||||
|
@@ -506,7 +506,9 @@ minstrel_ht_set_rate(struct minstrel_pri
|
||||||
|
if (!mr->retry_updated)
|
||||||
|
minstrel_calc_retransmit(mp, mi, index);
|
||||||
|
|
||||||
|
- if (mr->probability < MINSTREL_FRAC(20, 100))
|
||||||
|
+ if (sample)
|
||||||
|
+ rate->count = 1;
|
||||||
|
+ else if (mr->probability < MINSTREL_FRAC(20, 100))
|
||||||
|
rate->count = 2;
|
||||||
|
else if (rtscts)
|
||||||
|
rate->count = mr->retry_count_rtscts;
|
@ -0,0 +1,52 @@
|
|||||||
|
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||||
|
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||||
|
@@ -407,8 +407,8 @@ minstrel_ht_tx_status(void *priv, struct
|
||||||
|
mi->ampdu_len += info->status.ampdu_len;
|
||||||
|
|
||||||
|
if (!mi->sample_wait && !mi->sample_tries && mi->sample_count > 0) {
|
||||||
|
- mi->sample_wait = 4 + 2 * MINSTREL_TRUNC(mi->avg_ampdu_len);
|
||||||
|
- mi->sample_tries = 3;
|
||||||
|
+ mi->sample_wait = 16 + 2 * MINSTREL_TRUNC(mi->avg_ampdu_len);
|
||||||
|
+ mi->sample_tries = 2;
|
||||||
|
mi->sample_count--;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -564,7 +564,7 @@ minstrel_get_sample_rate(struct minstrel
|
||||||
|
*/
|
||||||
|
if (minstrel_get_duration(sample_idx) >
|
||||||
|
minstrel_get_duration(mi->max_tp_rate)) {
|
||||||
|
- if (mr->sample_skipped < 10)
|
||||||
|
+ if (mr->sample_skipped < 20)
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
if (mi->sample_slow++ > 2)
|
||||||
|
@@ -588,6 +588,7 @@ minstrel_ht_get_rate(void *priv, struct
|
||||||
|
struct minstrel_ht_sta *mi = &msp->ht;
|
||||||
|
struct minstrel_priv *mp = priv;
|
||||||
|
int sample_idx;
|
||||||
|
+ bool sample = false;
|
||||||
|
|
||||||
|
if (rate_control_send_low(sta, priv_sta, txrc))
|
||||||
|
return;
|
||||||
|
@@ -598,10 +599,11 @@ minstrel_ht_get_rate(void *priv, struct
|
||||||
|
info->flags |= mi->tx_flags;
|
||||||
|
sample_idx = minstrel_get_sample_rate(mp, mi);
|
||||||
|
if (sample_idx >= 0) {
|
||||||
|
+ sample = true;
|
||||||
|
minstrel_ht_set_rate(mp, mi, &ar[0], sample_idx,
|
||||||
|
txrc, true, false);
|
||||||
|
minstrel_ht_set_rate(mp, mi, &ar[1], mi->max_tp_rate,
|
||||||
|
- txrc, false, true);
|
||||||
|
+ txrc, false, false);
|
||||||
|
info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
|
||||||
|
} else {
|
||||||
|
minstrel_ht_set_rate(mp, mi, &ar[0], mi->max_tp_rate,
|
||||||
|
@@ -609,7 +611,7 @@ minstrel_ht_get_rate(void *priv, struct
|
||||||
|
minstrel_ht_set_rate(mp, mi, &ar[1], mi->max_tp_rate2,
|
||||||
|
txrc, false, true);
|
||||||
|
}
|
||||||
|
- minstrel_ht_set_rate(mp, mi, &ar[2], mi->max_prob_rate, txrc, false, true);
|
||||||
|
+ minstrel_ht_set_rate(mp, mi, &ar[2], mi->max_prob_rate, txrc, false, !sample);
|
||||||
|
|
||||||
|
ar[3].count = 0;
|
||||||
|
ar[3].idx = -1;
|
42
package/mac80211/patches/570-ath9k_reset_aggr_fix.patch
Normal file
42
package/mac80211/patches/570-ath9k_reset_aggr_fix.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
|
@@ -581,7 +581,7 @@ void ath_hw_check(struct work_struct *wo
|
||||||
|
|
||||||
|
msleep(1);
|
||||||
|
}
|
||||||
|
- ath_reset(sc, false);
|
||||||
|
+ ath_reset(sc, true);
|
||||||
|
|
||||||
|
out:
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
@@ -599,7 +599,7 @@ void ath9k_tasklet(unsigned long data)
|
||||||
|
ath9k_ps_wakeup(sc);
|
||||||
|
|
||||||
|
if (status & ATH9K_INT_FATAL) {
|
||||||
|
- ath_reset(sc, false);
|
||||||
|
+ ath_reset(sc, true);
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
@@ -2161,7 +2161,7 @@ static void ath_tx_complete_poll_work(st
|
||||||
|
ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
|
||||||
|
"tx hung, resetting the chip\n");
|
||||||
|
ath9k_ps_wakeup(sc);
|
||||||
|
- ath_reset(sc, false);
|
||||||
|
+ ath_reset(sc, true);
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/beacon.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
|
||||||
|
@@ -370,7 +370,7 @@ void ath_beacon_tasklet(unsigned long da
|
||||||
|
ath_print(common, ATH_DBG_BSTUCK,
|
||||||
|
"beacon is officially stuck\n");
|
||||||
|
sc->sc_flags |= SC_OP_TSF_RESET;
|
||||||
|
- ath_reset(sc, false);
|
||||||
|
+ ath_reset(sc, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
34
package/mac80211/patches/571-ath9k_ar9300_aggr_flush.patch
Normal file
34
package/mac80211/patches/571-ath9k_ar9300_aggr_flush.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
@@ -1089,15 +1089,6 @@ void ath_draintxq(struct ath_softc *sc,
|
||||||
|
txq->axq_tx_inprogress = false;
|
||||||
|
spin_unlock_bh(&txq->axq_lock);
|
||||||
|
|
||||||
|
- /* flush any pending frames if aggregation is enabled */
|
||||||
|
- if (sc->sc_flags & SC_OP_TXAGGR) {
|
||||||
|
- if (!retry_tx) {
|
||||||
|
- spin_lock_bh(&txq->axq_lock);
|
||||||
|
- ath_txq_drain_pending_buffers(sc, txq);
|
||||||
|
- spin_unlock_bh(&txq->axq_lock);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
|
||||||
|
spin_lock_bh(&txq->axq_lock);
|
||||||
|
while (!list_empty(&txq->txq_fifo_pending)) {
|
||||||
|
@@ -1118,6 +1109,15 @@ void ath_draintxq(struct ath_softc *sc,
|
||||||
|
}
|
||||||
|
spin_unlock_bh(&txq->axq_lock);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* flush any pending frames if aggregation is enabled */
|
||||||
|
+ if (sc->sc_flags & SC_OP_TXAGGR) {
|
||||||
|
+ if (!retry_tx) {
|
||||||
|
+ spin_lock_bh(&txq->axq_lock);
|
||||||
|
+ ath_txq_drain_pending_buffers(sc, txq);
|
||||||
|
+ spin_unlock_bh(&txq->axq_lock);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
|
58
package/mac80211/patches/580-cfg80211_ibss_mcast_rate.patch
Normal file
58
package/mac80211/patches/580-cfg80211_ibss_mcast_rate.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
--- a/include/linux/nl80211.h
|
||||||
|
+++ b/include/linux/nl80211.h
|
||||||
|
@@ -804,6 +804,8 @@ enum nl80211_commands {
|
||||||
|
* @NL80211_ATTR_SUPPORT_IBSS_RSN: The device supports IBSS RSN, which mostly
|
||||||
|
* means support for per-station GTKs.
|
||||||
|
*
|
||||||
|
+ * @NL80211_ATTR_MCAST_RATE: Multicast tx rate (in 100 kbps) for IBSS
|
||||||
|
+ *
|
||||||
|
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||||
|
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||||
|
*/
|
||||||
|
@@ -973,6 +975,8 @@ enum nl80211_attrs {
|
||||||
|
|
||||||
|
NL80211_ATTR_SUPPORT_IBSS_RSN,
|
||||||
|
|
||||||
|
+ NL80211_ATTR_MCAST_RATE,
|
||||||
|
+
|
||||||
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
|
--- a/include/net/cfg80211.h
|
||||||
|
+++ b/include/net/cfg80211.h
|
||||||
|
@@ -924,6 +924,7 @@ struct cfg80211_disassoc_request {
|
||||||
|
* @privacy: this is a protected network, keys will be configured
|
||||||
|
* after joining
|
||||||
|
* @basic_rates: bitmap of basic rates to use when creating the IBSS
|
||||||
|
+ * @mcast_rate: multicast tx rate (in 100 kbps)
|
||||||
|
*/
|
||||||
|
struct cfg80211_ibss_params {
|
||||||
|
u8 *ssid;
|
||||||
|
@@ -935,6 +936,7 @@ struct cfg80211_ibss_params {
|
||||||
|
u32 basic_rates;
|
||||||
|
bool channel_fixed;
|
||||||
|
bool privacy;
|
||||||
|
+ int mcast_rate;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
--- a/net/wireless/nl80211.c
|
||||||
|
+++ b/net/wireless/nl80211.c
|
||||||
|
@@ -167,6 +167,7 @@ static const struct nla_policy nl80211_p
|
||||||
|
[NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
|
||||||
|
[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
|
||||||
|
[NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
|
||||||
|
+ [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* policy for the key attributes */
|
||||||
|
@@ -3652,6 +3653,9 @@ static int nl80211_join_ibss(struct sk_b
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ if (info->attrs[NL80211_ATTR_MCAST_RATE])
|
||||||
|
+ ibss.mcast_rate =
|
||||||
|
+ nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
|
||||||
|
|
||||||
|
if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
|
||||||
|
connkeys = nl80211_parse_connkeys(rdev,
|
106
package/mac80211/patches/581-mac80211_ibss_mcast_rate.patch
Normal file
106
package/mac80211/patches/581-mac80211_ibss_mcast_rate.patch
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
--- a/net/mac80211/ibss.c
|
||||||
|
+++ b/net/mac80211/ibss.c
|
||||||
|
@@ -914,6 +914,7 @@ int ieee80211_ibss_join(struct ieee80211
|
||||||
|
|
||||||
|
sdata->u.ibss.privacy = params->privacy;
|
||||||
|
sdata->u.ibss.basic_rates = params->basic_rates;
|
||||||
|
+ sdata->vif.bss_conf.mcast_rate = params->mcast_rate;
|
||||||
|
|
||||||
|
sdata->vif.bss_conf.beacon_int = params->beacon_interval;
|
||||||
|
|
||||||
|
--- a/include/net/mac80211.h
|
||||||
|
+++ b/include/net/mac80211.h
|
||||||
|
@@ -244,6 +244,7 @@ struct ieee80211_bss_conf {
|
||||||
|
u16 assoc_capability;
|
||||||
|
u64 timestamp;
|
||||||
|
u32 basic_rates;
|
||||||
|
+ u32 mcast_rate;
|
||||||
|
u16 ht_operation_mode;
|
||||||
|
s32 cqm_rssi_thold;
|
||||||
|
u32 cqm_rssi_hyst;
|
||||||
|
@@ -2644,7 +2645,7 @@ enum rate_control_changed {
|
||||||
|
* @rate_idx_mask: user-requested rate mask (not MCS for now)
|
||||||
|
* @skb: the skb that will be transmitted, the control information in it needs
|
||||||
|
* to be filled in
|
||||||
|
- * @ap: whether this frame is sent out in AP mode
|
||||||
|
+ * @bss: whether this frame is sent out in AP or IBSS mode
|
||||||
|
*/
|
||||||
|
struct ieee80211_tx_rate_control {
|
||||||
|
struct ieee80211_hw *hw;
|
||||||
|
@@ -2655,7 +2656,7 @@ struct ieee80211_tx_rate_control {
|
||||||
|
bool rts, short_preamble;
|
||||||
|
u8 max_rate_idx;
|
||||||
|
u32 rate_idx_mask;
|
||||||
|
- bool ap;
|
||||||
|
+ bool bss;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rate_control_ops {
|
||||||
|
--- a/net/mac80211/rate.c
|
||||||
|
+++ b/net/mac80211/rate.c
|
||||||
|
@@ -210,10 +210,20 @@ static bool rc_no_data_or_no_ack(struct
|
||||||
|
return ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc));
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u8 max_rate_idx)
|
||||||
|
+static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u32 mcast_rate,
|
||||||
|
+ struct ieee80211_supported_band *sband)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
|
||||||
|
+ if (mcast_rate) {
|
||||||
|
+ for (i = 0; i < sband->n_bitrates; i++) {
|
||||||
|
+ if (sband->bitrates[i].bitrate == mcast_rate) {
|
||||||
|
+ *idx = i;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (basic_rates == 0)
|
||||||
|
return; /* assume basic rates unknown and accept rate */
|
||||||
|
if (*idx < 0)
|
||||||
|
@@ -221,7 +231,7 @@ static void rc_send_low_broadcast(s8 *id
|
||||||
|
if (basic_rates & (1 << *idx))
|
||||||
|
return; /* selected rate is a basic rate */
|
||||||
|
|
||||||
|
- for (i = *idx + 1; i <= max_rate_idx; i++) {
|
||||||
|
+ for (i = *idx + 1; i <= sband->n_bitrates; i++) {
|
||||||
|
if (basic_rates & (1 << i)) {
|
||||||
|
*idx = i;
|
||||||
|
return;
|
||||||
|
@@ -242,10 +252,11 @@ bool rate_control_send_low(struct ieee80
|
||||||
|
info->control.rates[0].count =
|
||||||
|
(info->flags & IEEE80211_TX_CTL_NO_ACK) ?
|
||||||
|
1 : txrc->hw->max_rate_tries;
|
||||||
|
- if (!sta && txrc->ap)
|
||||||
|
+ if (!sta && txrc->bss)
|
||||||
|
rc_send_low_broadcast(&info->control.rates[0].idx,
|
||||||
|
txrc->bss_conf->basic_rates,
|
||||||
|
- txrc->sband->n_bitrates);
|
||||||
|
+ txrc->bss_conf->mcast_rate,
|
||||||
|
+ txrc->sband);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
--- a/net/mac80211/tx.c
|
||||||
|
+++ b/net/mac80211/tx.c
|
||||||
|
@@ -622,7 +622,8 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
|
||||||
|
txrc.max_rate_idx = -1;
|
||||||
|
else
|
||||||
|
txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
|
||||||
|
- txrc.ap = tx->sdata->vif.type == NL80211_IFTYPE_AP;
|
||||||
|
+ txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||||
|
+ tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
|
||||||
|
|
||||||
|
/* set up RTS protection if desired */
|
||||||
|
if (len > tx->local->hw.wiphy->rts_threshold) {
|
||||||
|
@@ -2312,7 +2313,7 @@ struct sk_buff *ieee80211_beacon_get_tim
|
||||||
|
txrc.max_rate_idx = -1;
|
||||||
|
else
|
||||||
|
txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
|
||||||
|
- txrc.ap = true;
|
||||||
|
+ txrc.bss = true;
|
||||||
|
rate_control_get_rate(sdata, NULL, &txrc);
|
||||||
|
|
||||||
|
info->control.vif = vif;
|
@ -16,7 +16,7 @@ Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||||
@@ -585,6 +585,10 @@ static void rt2800pci_kill_tx_queue(stru
|
@@ -593,6 +593,10 @@ static void rt2800pci_kill_tx_queue(stru
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/b43/b43.h
|
--- a/drivers/net/wireless/b43/b43.h
|
||||||
+++ b/drivers/net/wireless/b43/b43.h
|
+++ b/drivers/net/wireless/b43/b43.h
|
||||||
@@ -704,6 +704,7 @@ struct b43_wldev {
|
@@ -705,6 +705,7 @@ struct b43_wldev {
|
||||||
bool qos_enabled; /* TRUE, if QoS is used. */
|
bool qos_enabled; /* TRUE, if QoS is used. */
|
||||||
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||||
bool use_pio; /* TRUE if next init should use PIO */
|
bool use_pio; /* TRUE if next init should use PIO */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/b43/Makefile
|
--- a/drivers/net/wireless/b43/Makefile
|
||||||
+++ b/drivers/net/wireless/b43/Makefile
|
+++ b/drivers/net/wireless/b43/Makefile
|
||||||
@@ -12,7 +12,7 @@ b43-y += xmit.o
|
@@ -14,7 +14,7 @@ b43-y += xmit.o
|
||||||
b43-y += lo.o
|
b43-y += lo.o
|
||||||
b43-y += wa.o
|
b43-y += wa.o
|
||||||
b43-y += dma.o
|
b43-y += dma.o
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
diff --git a/include/linux/compat-2.6.31.h b/include/linux/compat-2.6.31.h
|
|
||||||
index 54ddefd..6c454cb 100644
|
|
||||||
--- a/include/linux/compat-2.6.31.h
|
|
||||||
+++ b/include/linux/compat-2.6.31.h
|
|
||||||
@@ -191,6 +191,17 @@ void compat_synchronize_threaded_irq(struct compat_threaded_irq *comp)
|
|
||||||
cancel_work_sync(&comp->work);
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * list_entry_rcu - get the struct for this entry
|
|
||||||
+ * @ptr: the &struct list_head pointer.
|
|
||||||
+ * @type: the type of the struct this is embedded in.
|
|
||||||
+ * @member: the name of the list_struct within the struct.
|
|
||||||
+ *
|
|
||||||
+ * This primitive may safely run concurrently with the _rcu list-mutation
|
|
||||||
+ * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
|
|
||||||
+ */
|
|
||||||
+#define list_entry_rcu(ptr, type, member) \
|
|
||||||
+ container_of(rcu_dereference(ptr), type, member)
|
|
||||||
|
|
||||||
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)) */
|
|
||||||
|
|
||||||
diff --git a/include/linux/compat-2.6.33.h b/include/linux/compat-2.6.33.h
|
|
||||||
index e4dff72..e7e20d9 100644
|
|
||||||
--- a/include/linux/compat-2.6.33.h
|
|
||||||
+++ b/include/linux/compat-2.6.33.h
|
|
||||||
@@ -98,6 +98,20 @@ int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
|
|
||||||
#define kfifo_out(a, b, c) __kfifo_get(*a, b, c)
|
|
||||||
#define kfifo_len(a) __kfifo_len(*a)
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * list_for_each_entry_continue_rcu - continue iteration over list of given type
|
|
||||||
+ * @pos: the type * to use as a loop cursor.
|
|
||||||
+ * @head: the head for your list.
|
|
||||||
+ * @member: the name of the list_struct within the struct.
|
|
||||||
+ *
|
|
||||||
+ * Continue to iterate over list of given type, continuing after
|
|
||||||
+ * the current position.
|
|
||||||
+ */
|
|
||||||
+#define list_for_each_entry_continue_rcu(pos, head, member) \
|
|
||||||
+ for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \
|
|
||||||
+ prefetch(pos->member.next), &pos->member != (head); \
|
|
||||||
+ pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
|
|
||||||
+
|
|
||||||
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) */
|
|
||||||
|
|
||||||
#endif /* LINUX_26_33_COMPAT_H */
|
|
189
package/mac80211/patches/900-bash-location.patch
Normal file
189
package/mac80211/patches/900-bash-location.patch
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
--- a/scripts/admin-clean.sh
|
||||||
|
+++ b/scripts/admin-clean.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
if [ -d net ] ; then
|
||||||
|
make clean
|
||||||
|
fi
|
||||||
|
--- a/scripts/admin-refresh.sh
|
||||||
|
+++ b/scripts/admin-refresh.sh
|
||||||
|
@@ -1,3 +1,3 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
./scripts/admin-clean.sh $@
|
||||||
|
./scripts/admin-update.sh $@
|
||||||
|
--- a/scripts/admin-update.sh
|
||||||
|
+++ b/scripts/admin-update.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Copyright 2007, 2008, 2010 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
--- a/scripts/athenable
|
||||||
|
+++ b/scripts/athenable
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
--- a/scripts/athload
|
||||||
|
+++ b/scripts/athload
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
# Loads ath5k or madwifi
|
||||||
|
--- a/scripts/b43enable
|
||||||
|
+++ b/scripts/b43enable
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
--- a/scripts/b43load
|
||||||
|
+++ b/scripts/b43load
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
# Loads new broadcom drivers (b43 and b43legacy) or the old ones (bcm43xx)
|
||||||
|
--- a/scripts/btload.sh
|
||||||
|
+++ b/scripts/btload.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
MODULES="bluetooth btusb l2cap sco hidp rfcomm bnep"
|
||||||
|
for i in $MODULES; do
|
||||||
|
echo Loading $i...
|
||||||
|
--- a/scripts/btunload.sh
|
||||||
|
+++ b/scripts/btunload.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
MODULES="hidp rfcomm bnep l2cap sco btusb bluetooth"
|
||||||
|
echo Stoping bluetooth service..
|
||||||
|
/etc/init.d/bluetooth stop
|
||||||
|
--- a/scripts/check_config.sh
|
||||||
|
+++ b/scripts/check_config.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# This script checks the compat-wireless configuration file and if changes were made
|
||||||
|
# regenerates the compat_autoconf header.
|
||||||
|
|
||||||
|
--- a/scripts/check_depmod
|
||||||
|
+++ b/scripts/check_depmod
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2009 Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
#
|
||||||
|
# Ensures your distribution likes to prefer updates/ over the kernel/
|
||||||
|
--- a/scripts/compress_modules
|
||||||
|
+++ b/scripts/compress_modules
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# To be used by distributions using compressed modules
|
||||||
|
|
||||||
|
COMPRESSION_FOUND="n"
|
||||||
|
--- a/scripts/driver-select
|
||||||
|
+++ b/scripts/driver-select
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2009 Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
#
|
||||||
|
# This script allows you to select your compat-wireless driver and
|
||||||
|
--- a/scripts/gen-compat-autoconf.sh
|
||||||
|
+++ b/scripts/gen-compat-autoconf.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
--- a/scripts/gen-stable-release.sh
|
||||||
|
+++ b/scripts/gen-stable-release.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2009 Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
#
|
||||||
|
# You can use this to make stable compat-wireless releases
|
||||||
|
--- a/scripts/iwl-enable
|
||||||
|
+++ b/scripts/iwl-enable
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||||
|
#
|
||||||
|
--- a/scripts/iwl-load
|
||||||
|
+++ b/scripts/iwl-load
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2008 Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||||
|
#
|
||||||
|
# Loads new Intel iwl (iwlagn) or the old ones (iwl4965)
|
||||||
|
--- a/scripts/load.sh
|
||||||
|
+++ b/scripts/load.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
MODULES="ipw2100 ipw2200 libertas_cs usb8xxx"
|
||||||
|
MODULES="$MODULES p54pci p54usb"
|
||||||
|
MODULES="$MODULES adm8211 zd1211rw"
|
||||||
|
--- a/scripts/modlib.sh
|
||||||
|
+++ b/scripts/modlib.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Copyright 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
|
||||||
|
#
|
||||||
|
--- a/scripts/skip-colors
|
||||||
|
+++ b/scripts/skip-colors
|
||||||
|
@@ -1,2 +1,2 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
perl -pe 's|(\e)\[(\d+)(;*)(\d*)(\w)||g'
|
||||||
|
--- a/scripts/unload.sh
|
||||||
|
+++ b/scripts/unload.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# The old stack drivers and the mac80211 rc80211_simple modules
|
||||||
|
# which is no longer on recent kernels (its internal)
|
||||||
|
--- a/scripts/update-initramfs
|
||||||
|
+++ b/scripts/update-initramfs
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
# Copyright 2009 Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
#
|
||||||
|
# Since we provide ssb, the Ethernet module b44 some people may
|
||||||
|
--- a/scripts/wlload.sh
|
||||||
|
+++ b/scripts/wlload.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
MODULES="ipw2100 ipw2200 libertas_cs usb8xxx"
|
||||||
|
MODULES="$MODULES p54pci p54usb"
|
||||||
|
MODULES="$MODULES adm8211 zd1211rw"
|
||||||
|
--- a/scripts/wlunload.sh
|
||||||
|
+++ b/scripts/wlunload.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/bin/bash
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# The old stack drivers and the mac80211 rc80211_simple modules
|
||||||
|
# which is no longer on recent kernels (its internal)
|
Loading…
Reference in New Issue
Block a user