mac80211: update to wireless-testing 2011-10-05 + pending patches
SVN-Revision: 28392
This commit is contained in:
parent
e80e75321f
commit
adfeb00e5a
47 changed files with 11113 additions and 4800 deletions
|
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2011-09-14
|
||||
PKG_VERSION:=2011-10-05
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_MD5SUM:=a5627e6079e8d0f0baf7045141503a3d
|
||||
PKG_MD5SUM:=328dd4c42fb5baa2d96c78009b11af7e
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||
|
@ -627,7 +627,7 @@ define KernelPackage/iwlagn
|
|||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 @PCI_SUPPORT
|
||||
TITLE:=Intel AGN Wireless support
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlagn.$(LINUX_KMOD_SUFFIX)
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlwifi.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoLoad,60,iwlagn)
|
||||
MENU:=1
|
||||
endef
|
||||
|
@ -1165,7 +1165,7 @@ MAKE_OPTS:= \
|
|||
CONFIG_LIB80211_CRYPT_WEP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
|
||||
CONFIG_LIB80211_CRYPT_CCMP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
|
||||
CONFIG_LIB80211_CRYPT_TKIP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
|
||||
CONFIG_IWLAGN=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \
|
||||
CONFIG_IWLWIFI=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \
|
||||
CONFIG_IWLWIFI_LEGACY=$(if $(CONFIG_PACKAGE_kmod-iwl-legacy),m) \
|
||||
CONFIG_COMPAT_IWL4965=$(if $(CONFIG_PACKAGE_kmod-iwl4965),m) \
|
||||
CONFIG_IWL3945=$(if $(CONFIG_PACKAGE_kmod-iwl3945),m) \
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -340,8 +340,8 @@ CONFIG_B43_BCMA_PIO=y
|
||||
@@ -339,8 +339,8 @@ CONFIG_B43_BCMA_PIO=y
|
||||
|
||||
CONFIG_P54_PCI=m
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
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")
|
||||
@@ -642,10 +642,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
|
||||
@@ -640,10 +640,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
|
||||
# We need the backported rfkill module on kernel < 2.6.31.
|
||||
# In more recent kernel versions use the in kernel rfkill module.
|
||||
ifdef CONFIG_COMPAT_KERNEL_2_6_31
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
else
|
||||
include $(KLIB_BUILD)/.config
|
||||
endif
|
||||
@@ -316,7 +315,8 @@ CONFIG_IPW2200_QOS=y
|
||||
@@ -315,7 +314,8 @@ CONFIG_IPW2200_QOS=y
|
||||
# % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
|
||||
endif #CONFIG_WIRELESS_EXT
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
|||
# Sonics Silicon Backplane
|
||||
CONFIG_SSB_SPROM=y
|
||||
|
||||
@@ -329,7 +329,7 @@ endif #CONFIG_PCMCIA
|
||||
@@ -328,7 +328,7 @@ endif #CONFIG_PCMCIA
|
||||
# CONFIG_SSB_DEBUG=y
|
||||
CONFIG_SSB_DRIVER_PCICORE=y
|
||||
CONFIG_B43_SSB=y
|
||||
|
@ -37,7 +37,7 @@
|
|||
|
||||
CONFIG_BCMA=m
|
||||
CONFIG_BCMA_BLOCKIO=y
|
||||
@@ -538,7 +538,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
||||
@@ -537,7 +537,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
||||
|
||||
ifdef CONFIG_MMC
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),)
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -331,12 +331,12 @@ CONFIG_SSB_DRIVER_PCICORE=y
|
||||
@@ -330,12 +330,12 @@ CONFIG_SSB_DRIVER_PCICORE=y
|
||||
CONFIG_B43_SSB=y
|
||||
endif #__CONFIG_SSB
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
endif #CONFIG_STAGING
|
||||
|
||||
# mac80211 test driver
|
||||
@@ -368,13 +368,13 @@ endif #CONFIG_CRC_ITU_T
|
||||
@@ -367,13 +367,13 @@ endif #CONFIG_CRC_ITU_T
|
||||
CONFIG_MWL8K=m
|
||||
|
||||
# Ethernet drivers go here
|
||||
|
@ -28,7 +28,7 @@
|
|||
endif #CONFIG_COMPAT_KERNEL_2_6_27
|
||||
|
||||
ifdef CONFIG_WIRELESS_EXT
|
||||
@@ -435,21 +435,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
|
||||
@@ -434,21 +434,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
|
||||
# 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
|
||||
ifdef CONFIG_COMPAT_KERNEL_2_6_29
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
else
|
||||
include $(KLIB_BUILD)/.config
|
||||
endif
|
||||
@@ -248,7 +248,7 @@ CONFIG_B43=m
|
||||
@@ -247,7 +247,7 @@ CONFIG_B43=m
|
||||
CONFIG_B43_HWRNG=y
|
||||
CONFIG_B43_PCI_AUTOSELECT=y
|
||||
ifdef CONFIG_PCMCIA
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -521,7 +521,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
||||
@@ -520,7 +520,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
|
||||
|
||||
ifdef CONFIG_MMC
|
||||
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -254,7 +254,7 @@ ifdef CONFIG_MAC80211_LEDS
|
||||
@@ -253,8 +253,8 @@ ifdef CONFIG_MAC80211_LEDS
|
||||
CONFIG_B43_LEDS=y
|
||||
endif #CONFIG_MAC80211_LEDS
|
||||
CONFIG_B43_PHY_LP=y
|
||||
-CONFIG_B43_PHY_N=y
|
||||
-CONFIG_B43_PHY_HT=y
|
||||
+# CONFIG_B43_PHY_N=y
|
||||
# CONFIG_B43_PHY_HT=y
|
||||
+# CONFIG_B43_PHY_HT=y
|
||||
# CONFIG_B43_PHY_LCN=y
|
||||
# CONFIG_B43_FORCE_PIO=y
|
||||
# CONFIG_B43_DEBUG=y
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -330,7 +330,7 @@ CONFIG_RTL8180=m
|
||||
@@ -329,7 +329,7 @@ CONFIG_RTL8180=m
|
||||
|
||||
CONFIG_ADM8211=m
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
CONFIG_RT2400PCI=m
|
||||
CONFIG_RT2500PCI=m
|
||||
ifdef CONFIG_CRC_CCITT
|
||||
@@ -470,7 +470,7 @@ CONFIG_RT2800USB_RT35XX=y
|
||||
@@ -469,7 +469,7 @@ CONFIG_RT2800USB_RT35XX=y
|
||||
# CONFIG_RT2800USB_RT53XX=y
|
||||
CONFIG_RT2800USB_UNKNOWN=y
|
||||
endif #CONFIG_CRC_CCITT
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#endif
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -456,7 +456,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
|
||||
@@ -455,7 +455,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
|
||||
# This activates a threading fix for usb urb.
|
||||
# this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351
|
||||
# This fix will be included in some stable releases.
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,720 +0,0 @@
|
|||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -1101,6 +1101,7 @@ struct cfg80211_ibss_params {
|
||||
u8 *ssid;
|
||||
u8 *bssid;
|
||||
struct ieee80211_channel *channel;
|
||||
+ enum nl80211_channel_type channel_type;
|
||||
u8 *ie;
|
||||
u8 ssid_len, ie_len;
|
||||
u16 beacon_interval;
|
||||
@@ -2612,6 +2613,12 @@ struct cfg80211_bss *cfg80211_get_bss(st
|
||||
const u8 *bssid,
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
u16 capa_mask, u16 capa_val);
|
||||
+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy,
|
||||
+ struct ieee80211_channel *channel,
|
||||
+ const u8 *bssid,
|
||||
+ const u8 *ssid, size_t ssid_len,
|
||||
+ u16 capa_mask, u16 capa_val,
|
||||
+ enum nl80211_channel_type channel_type);
|
||||
static inline struct cfg80211_bss *
|
||||
cfg80211_get_ibss(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *channel,
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -4539,13 +4539,41 @@ static int nl80211_join_ibss(struct sk_b
|
||||
ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
|
||||
}
|
||||
|
||||
- ibss.channel = ieee80211_get_channel(wiphy,
|
||||
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
|
||||
+ if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
|
||||
+ enum nl80211_channel_type channel_type;
|
||||
+
|
||||
+ channel_type = nla_get_u32(
|
||||
+ info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
|
||||
+ if (channel_type != NL80211_CHAN_NO_HT &&
|
||||
+ channel_type != NL80211_CHAN_HT20 &&
|
||||
+ channel_type != NL80211_CHAN_HT40PLUS &&
|
||||
+ channel_type != NL80211_CHAN_HT40MINUS)
|
||||
+ return -EINVAL;
|
||||
+ ibss.channel_type = channel_type;
|
||||
+ } else {
|
||||
+ ibss.channel_type = NL80211_CHAN_NO_HT;
|
||||
+ }
|
||||
+
|
||||
+ ibss.channel = rdev_freq_to_chan(rdev,
|
||||
+ nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
|
||||
+ ibss.channel_type);
|
||||
if (!ibss.channel ||
|
||||
+ ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
|
||||
ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
|
||||
- ibss.channel->flags & IEEE80211_CHAN_DISABLED)
|
||||
+ ibss.channel->flags & IEEE80211_CHAN_RADAR)
|
||||
return -EINVAL;
|
||||
|
||||
+ /* Both channels should be able to initiate communication */
|
||||
+ if ((ibss.channel_type == NL80211_CHAN_HT40PLUS ||
|
||||
+ ibss.channel_type == NL80211_CHAN_HT40MINUS) &&
|
||||
+ !can_beacon_sec_chan(&rdev->wiphy, ibss.channel,
|
||||
+ ibss.channel_type)) {
|
||||
+ printk(KERN_DEBUG
|
||||
+ "cfg80211: Secondary channel not "
|
||||
+ "allowed to initiate communication\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
|
||||
ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
|
||||
|
||||
--- a/net/wireless/chan.c
|
||||
+++ b/net/wireless/chan.c
|
||||
@@ -44,7 +44,7 @@ rdev_freq_to_chan(struct cfg80211_regist
|
||||
return chan;
|
||||
}
|
||||
|
||||
-static bool can_beacon_sec_chan(struct wiphy *wiphy,
|
||||
+bool can_beacon_sec_chan(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type)
|
||||
{
|
||||
@@ -75,6 +75,7 @@ static bool can_beacon_sec_chan(struct w
|
||||
|
||||
return true;
|
||||
}
|
||||
+EXPORT_SYMBOL(can_beacon_sec_chan);
|
||||
|
||||
int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
|
||||
struct wireless_dev *wdev, int freq,
|
||||
--- a/net/wireless/core.h
|
||||
+++ b/net/wireless/core.h
|
||||
@@ -439,6 +439,9 @@ cfg80211_can_add_interface(struct cfg802
|
||||
struct ieee80211_channel *
|
||||
rdev_freq_to_chan(struct cfg80211_registered_device *rdev,
|
||||
int freq, enum nl80211_channel_type channel_type);
|
||||
+bool can_beacon_sec_chan(struct wiphy *wiphy,
|
||||
+ struct ieee80211_channel *chan,
|
||||
+ enum nl80211_channel_type channel_type);
|
||||
int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
|
||||
struct wireless_dev *wdev, int freq,
|
||||
enum nl80211_channel_type channel_type);
|
||||
--- a/net/wireless/scan.c
|
||||
+++ b/net/wireless/scan.c
|
||||
@@ -365,6 +365,19 @@ struct cfg80211_bss *cfg80211_get_bss(st
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
u16 capa_mask, u16 capa_val)
|
||||
{
|
||||
+ /* call HT version with no HT requirements */
|
||||
+ return cfg80211_get_bss_ht(wiphy, channel, bssid, ssid, ssid_len,
|
||||
+ capa_mask, capa_val, NL80211_CHAN_NO_HT);
|
||||
+}
|
||||
+EXPORT_SYMBOL(cfg80211_get_bss);
|
||||
+
|
||||
+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy,
|
||||
+ struct ieee80211_channel *channel,
|
||||
+ const u8 *bssid,
|
||||
+ const u8 *ssid, size_t ssid_len,
|
||||
+ u16 capa_mask, u16 capa_val,
|
||||
+ enum nl80211_channel_type require_ht)
|
||||
+{
|
||||
struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy);
|
||||
struct cfg80211_internal_bss *bss, *res = NULL;
|
||||
unsigned long now = jiffies;
|
||||
@@ -374,8 +387,26 @@ struct cfg80211_bss *cfg80211_get_bss(st
|
||||
list_for_each_entry(bss, &dev->bss_list, list) {
|
||||
if ((bss->pub.capability & capa_mask) != capa_val)
|
||||
continue;
|
||||
- if (channel && bss->pub.channel != channel)
|
||||
- continue;
|
||||
+ if (channel) {
|
||||
+ if (bss->pub.channel != channel)
|
||||
+ continue;
|
||||
+ if (require_ht != NL80211_CHAN_NO_HT) {
|
||||
+ struct ieee80211_ht_info *ht_info;
|
||||
+ ht_info = (struct ieee80211_ht_info *)
|
||||
+ ieee80211_bss_get_ie(&bss->pub,
|
||||
+ WLAN_EID_HT_INFORMATION);
|
||||
+ if (!ht_info)
|
||||
+ continue;
|
||||
+ if (require_ht == NL80211_CHAN_HT40MINUS &&
|
||||
+ !(ht_info->ht_param &
|
||||
+ IEEE80211_HT_PARAM_CHA_SEC_BELOW))
|
||||
+ continue;
|
||||
+ if (require_ht == NL80211_CHAN_HT40PLUS &&
|
||||
+ !(ht_info->ht_param &
|
||||
+ IEEE80211_HT_PARAM_CHA_SEC_ABOVE))
|
||||
+ continue;
|
||||
+ }
|
||||
+ }
|
||||
/* Don't get expired BSS structs */
|
||||
if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
|
||||
!atomic_read(&bss->hold))
|
||||
@@ -392,7 +423,7 @@ struct cfg80211_bss *cfg80211_get_bss(st
|
||||
return NULL;
|
||||
return &res->pub;
|
||||
}
|
||||
-EXPORT_SYMBOL(cfg80211_get_bss);
|
||||
+EXPORT_SYMBOL(cfg80211_get_bss_ht);
|
||||
|
||||
struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *channel,
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -465,6 +465,7 @@ struct ieee80211_if_ibss {
|
||||
u8 ssid_len, ie_len;
|
||||
u8 *ie;
|
||||
struct ieee80211_channel *channel;
|
||||
+ enum nl80211_channel_type channel_type;
|
||||
|
||||
unsigned long ibss_join_req;
|
||||
/* probe response/beacon for IBSS */
|
||||
@@ -1090,6 +1091,7 @@ void ieee80211_ibss_notify_scan_complete
|
||||
void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata);
|
||||
struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
||||
u8 *bssid, u8 *addr, u32 supp_rates,
|
||||
+ struct ieee80211_ht_cap *ht_cap,
|
||||
gfp_t gfp);
|
||||
int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_ibss_params *params);
|
||||
@@ -1343,6 +1345,12 @@ void ieee80211_recalc_smps(struct ieee80
|
||||
size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
||||
const u8 *ids, int n_ids, size_t offset);
|
||||
size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
|
||||
+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband,
|
||||
+ u16 cap);
|
||||
+u8 *ieee80211_ie_build_ht_info(u8 *pos,
|
||||
+ struct ieee80211_sta_ht_cap *ht_cap,
|
||||
+ struct ieee80211_channel *channel,
|
||||
+ enum nl80211_channel_type channel_type);
|
||||
|
||||
/* internal work items */
|
||||
void ieee80211_work_init(struct ieee80211_local *local);
|
||||
@@ -1371,6 +1379,8 @@ ieee80211_get_channel_mode(struct ieee80
|
||||
bool ieee80211_set_channel_type(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
enum nl80211_channel_type chantype);
|
||||
+enum nl80211_channel_type ieee80211_ht_info_to_channel_type(
|
||||
+ struct ieee80211_ht_info *ht_info);
|
||||
|
||||
#ifdef CONFIG_MAC80211_NOINLINE
|
||||
#define debug_noinline noinline
|
||||
--- a/net/mac80211/util.c
|
||||
+++ b/net/mac80211/util.c
|
||||
@@ -839,23 +839,8 @@ int ieee80211_build_preq_ies(struct ieee
|
||||
offset = noffset;
|
||||
}
|
||||
|
||||
- if (sband->ht_cap.ht_supported) {
|
||||
- u16 cap = sband->ht_cap.cap;
|
||||
- __le16 tmp;
|
||||
-
|
||||
- *pos++ = WLAN_EID_HT_CAPABILITY;
|
||||
- *pos++ = sizeof(struct ieee80211_ht_cap);
|
||||
- memset(pos, 0, sizeof(struct ieee80211_ht_cap));
|
||||
- tmp = cpu_to_le16(cap);
|
||||
- memcpy(pos, &tmp, sizeof(u16));
|
||||
- pos += sizeof(u16);
|
||||
- *pos++ = sband->ht_cap.ampdu_factor |
|
||||
- (sband->ht_cap.ampdu_density <<
|
||||
- IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
|
||||
- memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
|
||||
- pos += sizeof(sband->ht_cap.mcs);
|
||||
- pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
|
||||
- }
|
||||
+ if (sband->ht_cap.ht_supported)
|
||||
+ pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap);
|
||||
|
||||
/*
|
||||
* If adding more here, adjust code in main.c
|
||||
@@ -1378,3 +1363,100 @@ void ieee80211_disable_rssi_reports(stru
|
||||
_ieee80211_enable_rssi_reports(sdata, 0, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
|
||||
+
|
||||
+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband,
|
||||
+ u16 cap)
|
||||
+{
|
||||
+ __le16 tmp;
|
||||
+
|
||||
+ *pos++ = WLAN_EID_HT_CAPABILITY;
|
||||
+ *pos++ = sizeof(struct ieee80211_ht_cap);
|
||||
+ memset(pos, 0, sizeof(struct ieee80211_ht_cap));
|
||||
+
|
||||
+ /* capability flags */
|
||||
+ tmp = cpu_to_le16(cap);
|
||||
+ memcpy(pos, &tmp, sizeof(u16));
|
||||
+ pos += sizeof(u16);
|
||||
+
|
||||
+ /* AMPDU parameters */
|
||||
+ *pos++ = sband->ht_cap.ampdu_factor |
|
||||
+ (sband->ht_cap.ampdu_density <<
|
||||
+ IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
|
||||
+
|
||||
+ /* MCS set */
|
||||
+ memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
|
||||
+ pos += sizeof(sband->ht_cap.mcs);
|
||||
+
|
||||
+ /* extended capabilities */
|
||||
+ pos += sizeof(__le16);
|
||||
+
|
||||
+ /* BF capabilities */
|
||||
+ pos += sizeof(__le32);
|
||||
+
|
||||
+ /* antenna selection */
|
||||
+ pos += sizeof(u8);
|
||||
+
|
||||
+ return pos;
|
||||
+}
|
||||
+
|
||||
+u8 *ieee80211_ie_build_ht_info(u8 *pos,
|
||||
+ struct ieee80211_sta_ht_cap *ht_cap,
|
||||
+ struct ieee80211_channel *channel,
|
||||
+ enum nl80211_channel_type channel_type)
|
||||
+{
|
||||
+ struct ieee80211_ht_info *ht_info;
|
||||
+ /* Build HT Information */
|
||||
+ *pos++ = WLAN_EID_HT_INFORMATION;
|
||||
+ *pos++ = sizeof(struct ieee80211_ht_info);
|
||||
+ ht_info = (struct ieee80211_ht_info *)pos;
|
||||
+ ht_info->control_chan =
|
||||
+ ieee80211_frequency_to_channel(channel->center_freq);
|
||||
+ switch (channel_type) {
|
||||
+ case NL80211_CHAN_HT40MINUS:
|
||||
+ ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
||||
+ break;
|
||||
+ case NL80211_CHAN_HT40PLUS:
|
||||
+ ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
||||
+ break;
|
||||
+ case NL80211_CHAN_HT20:
|
||||
+ default:
|
||||
+ ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
||||
+ break;
|
||||
+ }
|
||||
+ if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
+ ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
|
||||
+ ht_info->operation_mode = 0x0000;
|
||||
+ ht_info->stbc_param = 0x0000;
|
||||
+
|
||||
+ /* It seems that Basic MCS set and Supported MCS set
|
||||
+ are identical for the first 10 bytes */
|
||||
+ memset(&ht_info->basic_set, 0, 16);
|
||||
+ memcpy(&ht_info->basic_set, &ht_cap->mcs, 10);
|
||||
+
|
||||
+ return pos + sizeof(struct ieee80211_ht_info);
|
||||
+}
|
||||
+
|
||||
+enum nl80211_channel_type ieee80211_ht_info_to_channel_type(
|
||||
+ struct ieee80211_ht_info *ht_info)
|
||||
+{
|
||||
+ enum nl80211_channel_type channel_type;
|
||||
+
|
||||
+ if (!ht_info)
|
||||
+ return NL80211_CHAN_NO_HT;
|
||||
+
|
||||
+ switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
|
||||
+ case IEEE80211_HT_PARAM_CHA_SEC_NONE:
|
||||
+ channel_type = NL80211_CHAN_HT20;
|
||||
+ break;
|
||||
+ case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
|
||||
+ channel_type = NL80211_CHAN_HT40PLUS;
|
||||
+ break;
|
||||
+ case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
|
||||
+ channel_type = NL80211_CHAN_HT40MINUS;
|
||||
+ break;
|
||||
+ default:
|
||||
+ channel_type = NL80211_CHAN_NO_HT;
|
||||
+ }
|
||||
+
|
||||
+ return channel_type;
|
||||
+}
|
||||
--- a/net/mac80211/work.c
|
||||
+++ b/net/mac80211/work.c
|
||||
@@ -118,7 +118,6 @@ static void ieee80211_add_ht_ie(struct s
|
||||
u8 *pos;
|
||||
u32 flags = channel->flags;
|
||||
u16 cap = sband->ht_cap.cap;
|
||||
- __le16 tmp;
|
||||
|
||||
if (!sband->ht_cap.ht_supported)
|
||||
return;
|
||||
@@ -169,34 +168,8 @@ static void ieee80211_add_ht_ie(struct s
|
||||
}
|
||||
|
||||
/* reserve and fill IE */
|
||||
-
|
||||
pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
|
||||
- *pos++ = WLAN_EID_HT_CAPABILITY;
|
||||
- *pos++ = sizeof(struct ieee80211_ht_cap);
|
||||
- memset(pos, 0, sizeof(struct ieee80211_ht_cap));
|
||||
-
|
||||
- /* capability flags */
|
||||
- tmp = cpu_to_le16(cap);
|
||||
- memcpy(pos, &tmp, sizeof(u16));
|
||||
- pos += sizeof(u16);
|
||||
-
|
||||
- /* AMPDU parameters */
|
||||
- *pos++ = sband->ht_cap.ampdu_factor |
|
||||
- (sband->ht_cap.ampdu_density <<
|
||||
- IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
|
||||
-
|
||||
- /* MCS set */
|
||||
- memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
|
||||
- pos += sizeof(sband->ht_cap.mcs);
|
||||
-
|
||||
- /* extended capabilities */
|
||||
- pos += sizeof(__le16);
|
||||
-
|
||||
- /* BF capabilities */
|
||||
- pos += sizeof(__le32);
|
||||
-
|
||||
- /* antenna selection */
|
||||
- pos += sizeof(u8);
|
||||
+ ieee80211_ie_build_ht_cap(pos, sband, cap);
|
||||
}
|
||||
|
||||
static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
--- a/net/mac80211/agg-tx.c
|
||||
+++ b/net/mac80211/agg-tx.c
|
||||
@@ -82,6 +82,8 @@ static void ieee80211_send_addba_request
|
||||
memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
|
||||
else if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
+ else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
|
||||
+ memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
|
||||
|
||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||
IEEE80211_STYPE_ACTION);
|
||||
@@ -399,7 +401,8 @@ int ieee80211_start_tx_ba_session(struct
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP &&
|
||||
- sdata->vif.type != NL80211_IFTYPE_WDS)
|
||||
+ sdata->vif.type != NL80211_IFTYPE_WDS &&
|
||||
+ sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
||||
return -EINVAL;
|
||||
|
||||
if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) {
|
||||
--- a/net/mac80211/ht.c
|
||||
+++ b/net/mac80211/ht.c
|
||||
@@ -199,6 +199,8 @@ void ieee80211_send_delba(struct ieee802
|
||||
memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
|
||||
else if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
+ else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
|
||||
+ memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
|
||||
|
||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||
IEEE80211_STYPE_ACTION);
|
||||
--- a/net/mac80211/ibss.c
|
||||
+++ b/net/mac80211/ibss.c
|
||||
@@ -35,6 +35,76 @@
|
||||
|
||||
#define IEEE80211_IBSS_MAX_STA_ENTRIES 128
|
||||
|
||||
+static bool ieee80211_can_use_ext_chan(struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_channel *channel,
|
||||
+ enum nl80211_channel_type channel_type)
|
||||
+{
|
||||
+ /* check if we are legally allowed to use HT extension channel */
|
||||
+ if ((channel_type == NL80211_CHAN_HT40PLUS) ||
|
||||
+ (channel_type == NL80211_CHAN_HT40MINUS)) {
|
||||
+ int sec_freq = channel->center_freq +
|
||||
+ (channel_type == NL80211_CHAN_HT40PLUS ? 20 : -20);
|
||||
+ struct ieee80211_channel *sec_chan =
|
||||
+ ieee80211_get_channel(sdata->wdev.wiphy, sec_freq);
|
||||
+ if (!sec_chan || sec_chan->flags & (IEEE80211_CHAN_DISABLED |
|
||||
+ IEEE80211_CHAN_PASSIVE_SCAN |
|
||||
+ IEEE80211_CHAN_NO_IBSS |
|
||||
+ IEEE80211_CHAN_RADAR)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static void ieee80211_update_ht_elems(struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_mgmt *mgmt,
|
||||
+ struct ieee80211_ht_info *ht_info)
|
||||
+{
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+ struct ieee80211_supported_band *sband =
|
||||
+ local->hw.wiphy->bands[local->oper_channel->band];
|
||||
+ enum nl80211_channel_type channel_type =
|
||||
+ ieee80211_ht_info_to_channel_type(ht_info);
|
||||
+
|
||||
+ if (!ieee80211_can_use_ext_chan(sdata, local->oper_channel, channel_type))
|
||||
+ channel_type = NL80211_CHAN_HT20;
|
||||
+
|
||||
+ if (channel_type != local->_oper_channel_type) {
|
||||
+ struct sk_buff *skb = rcu_dereference_protected(
|
||||
+ sdata->u.ibss.presp,
|
||||
+ lockdep_is_held(&ifibss->mtx));
|
||||
+ struct sk_buff *nskb;
|
||||
+ u8 *ht_ie;
|
||||
+
|
||||
+ /* update HT IE. If not yet existing, create one */
|
||||
+ nskb = skb_copy(skb, GFP_ATOMIC);
|
||||
+ ht_ie = (u8 *)cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
|
||||
+ (const u8 *)(nskb->data + 24 +
|
||||
+ sizeof(mgmt->u.beacon)),
|
||||
+ nskb->len - 24 -
|
||||
+ sizeof(mgmt->u.beacon));
|
||||
+ if (!ht_ie)
|
||||
+ ht_ie = skb_put(nskb, 4 +
|
||||
+ sizeof(struct ieee80211_ht_cap) +
|
||||
+ sizeof(struct ieee80211_ht_info));
|
||||
+
|
||||
+ ht_ie = ieee80211_ie_build_ht_cap(ht_ie, sband,
|
||||
+ sband->ht_cap.cap);
|
||||
+ ht_ie = ieee80211_ie_build_ht_info(ht_ie, &sband->ht_cap,
|
||||
+ local->oper_channel, channel_type);
|
||||
+ rcu_assign_pointer(sdata->u.ibss.presp, nskb);
|
||||
+ kfree_skb(skb);
|
||||
+
|
||||
+ if(!ieee80211_set_channel_type(local, sdata, channel_type)) {
|
||||
+ channel_type = NL80211_CHAN_HT20;
|
||||
+ WARN_ON(!ieee80211_set_channel_type(local, sdata,
|
||||
+ channel_type));
|
||||
+ }
|
||||
+
|
||||
+ ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
|
||||
static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_mgmt *mgmt,
|
||||
@@ -64,6 +134,7 @@ static void ieee80211_rx_mgmt_auth_ibss(
|
||||
static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
const u8 *bssid, const int beacon_int,
|
||||
struct ieee80211_channel *chan,
|
||||
+ enum nl80211_channel_type channel_type,
|
||||
const u32 basic_rates,
|
||||
const u16 capability, u64 tsf)
|
||||
{
|
||||
@@ -104,8 +175,17 @@ static void __ieee80211_sta_join_ibss(st
|
||||
|
||||
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
|
||||
|
||||
+ /* entering a legacy IBSS. Use given HT configuration. */
|
||||
+ if (channel_type == NL80211_CHAN_NO_HT)
|
||||
+ channel_type = ifibss->channel_type;
|
||||
local->oper_channel = chan;
|
||||
- WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT));
|
||||
+
|
||||
+ /* if phy is on a different extension channel, setting ht40 will fail */
|
||||
+ if (!ieee80211_set_channel_type(local, sdata, channel_type)) {
|
||||
+ channel_type = NL80211_CHAN_HT20;
|
||||
+ WARN_ON(!ieee80211_set_channel_type(local, sdata,
|
||||
+ channel_type));
|
||||
+ }
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
|
||||
sband = local->hw.wiphy->bands[chan->band];
|
||||
@@ -171,6 +251,18 @@ static void __ieee80211_sta_join_ibss(st
|
||||
memcpy(skb_put(skb, ifibss->ie_len),
|
||||
ifibss->ie, ifibss->ie_len);
|
||||
|
||||
+ /* add HT capability and information IEs */
|
||||
+ if (channel_type != NL80211_CHAN_NO_HT && sband->ht_cap.ht_supported) {
|
||||
+ pos = skb_put(skb, 4 +
|
||||
+ sizeof(struct ieee80211_ht_cap) +
|
||||
+ sizeof(struct ieee80211_ht_info));
|
||||
+ pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap);
|
||||
+ pos = ieee80211_ie_build_ht_info(pos,
|
||||
+ &sband->ht_cap,
|
||||
+ chan,
|
||||
+ channel_type);
|
||||
+ }
|
||||
+
|
||||
if (local->hw.queues >= 4) {
|
||||
pos = skb_put(skb, 9);
|
||||
*pos++ = WLAN_EID_VENDOR_SPECIFIC;
|
||||
@@ -219,6 +311,8 @@ static void ieee80211_sta_join_ibss(stru
|
||||
u32 basic_rates;
|
||||
int i, j;
|
||||
u16 beacon_int = cbss->beacon_interval;
|
||||
+ const u8 *ht_info_ie;
|
||||
+ enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
|
||||
|
||||
lockdep_assert_held(&sdata->u.ibss.mtx);
|
||||
|
||||
@@ -242,9 +336,23 @@ static void ieee80211_sta_join_ibss(stru
|
||||
}
|
||||
}
|
||||
|
||||
+ ht_info_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_INFORMATION);
|
||||
+ if (ht_info_ie)
|
||||
+ channel_type = ieee80211_ht_info_to_channel_type(
|
||||
+ (struct ieee80211_ht_info *) (ht_info_ie + 2));
|
||||
+
|
||||
+ if (!ieee80211_can_use_ext_chan(sdata, cbss->channel, channel_type)) {
|
||||
+ channel_type = NL80211_CHAN_HT20;
|
||||
+#ifdef CONFIG_MAC80211_IBSS_DEBUG
|
||||
+ printk(KERN_DEBUG "%s: IBSS not allowed on secondary channel\n",
|
||||
+ sdata->name);
|
||||
+#endif
|
||||
+ }
|
||||
+
|
||||
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
|
||||
beacon_int,
|
||||
cbss->channel,
|
||||
+ channel_type,
|
||||
basic_rates,
|
||||
cbss->capability,
|
||||
cbss->tsf);
|
||||
@@ -310,11 +418,24 @@ static void ieee80211_rx_bss_info(struct
|
||||
} else
|
||||
sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
|
||||
mgmt->sa, supp_rates,
|
||||
- GFP_ATOMIC);
|
||||
+ elems->ht_cap_elem, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
- if (sta && elems->wmm_info)
|
||||
- set_sta_flags(sta, WLAN_STA_WME);
|
||||
+ if (sta) {
|
||||
+ if (elems->wmm_info)
|
||||
+ set_sta_flags(sta, WLAN_STA_WME);
|
||||
+
|
||||
+ /* remote station uses ht */
|
||||
+ if (elems->ht_info_elem) {
|
||||
+ ieee80211_update_ht_elems(sdata, mgmt,
|
||||
+ elems->ht_info_elem);
|
||||
+ ieee80211_ht_cap_ie_to_sta_ht_cap(
|
||||
+ local->hw.wiphy->bands[
|
||||
+ local->oper_channel->band],
|
||||
+ elems->ht_cap_elem,
|
||||
+ &sta->sta.ht_cap);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
@@ -404,7 +525,7 @@ static void ieee80211_rx_bss_info(struct
|
||||
ieee80211_sta_join_ibss(sdata, bss);
|
||||
supp_rates = ieee80211_sta_get_rates(local, elems, band);
|
||||
ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
|
||||
- supp_rates, GFP_KERNEL);
|
||||
+ supp_rates, elems->ht_cap_elem, GFP_KERNEL);
|
||||
}
|
||||
|
||||
put_bss:
|
||||
@@ -417,7 +538,8 @@ static void ieee80211_rx_bss_info(struct
|
||||
* must be callable in atomic context.
|
||||
*/
|
||||
struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
||||
- u8 *bssid,u8 *addr, u32 supp_rates,
|
||||
+ u8 *bssid, u8 *addr, u32 supp_rates,
|
||||
+ struct ieee80211_ht_cap *ht_cap,
|
||||
gfp_t gfp)
|
||||
{
|
||||
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
|
||||
@@ -458,6 +580,11 @@ struct sta_info *ieee80211_ibss_add_sta(
|
||||
sta->sta.supp_rates[band] = supp_rates |
|
||||
ieee80211_mandatory_rates(local, band);
|
||||
|
||||
+ /* fill in ht rates */
|
||||
+ if (ht_cap)
|
||||
+ ieee80211_ht_cap_ie_to_sta_ht_cap(local->hw.wiphy->bands[band],
|
||||
+ ht_cap, &sta->sta.ht_cap);
|
||||
+
|
||||
rate_control_rate_init(sta);
|
||||
|
||||
/* If it fails, maybe we raced another insertion? */
|
||||
@@ -556,8 +683,8 @@ static void ieee80211_sta_create_ibss(st
|
||||
sdata->drop_unencrypted = 0;
|
||||
|
||||
__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
|
||||
- ifibss->channel, ifibss->basic_rates,
|
||||
- capability, 0);
|
||||
+ ifibss->channel, ifibss->channel_type,
|
||||
+ ifibss->basic_rates, capability, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -594,10 +721,10 @@ static void ieee80211_sta_find_ibss(stru
|
||||
chan = ifibss->channel;
|
||||
if (!is_zero_ether_addr(ifibss->bssid))
|
||||
bssid = ifibss->bssid;
|
||||
- cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
|
||||
+ cbss = cfg80211_get_bss_ht(local->hw.wiphy, chan, bssid,
|
||||
ifibss->ssid, ifibss->ssid_len,
|
||||
WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
|
||||
- capability);
|
||||
+ capability, ifibss->channel_type);
|
||||
|
||||
if (cbss) {
|
||||
struct ieee80211_bss *bss;
|
||||
@@ -896,10 +1023,15 @@ int ieee80211_ibss_join(struct ieee80211
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
|
||||
- 36 /* bitrates */ +
|
||||
- 34 /* SSID */ +
|
||||
- 3 /* DS params */ +
|
||||
- 4 /* IBSS params */ +
|
||||
+ sizeof(struct ieee80211_hdr_3addr) +
|
||||
+ 12 /* struct ieee80211_mgmt.u.beacon */ +
|
||||
+ 2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
|
||||
+ 2 + 8 /* max Supported Rates */ +
|
||||
+ 3 /* max DS params */ +
|
||||
+ 4 /* IBSS params */ +
|
||||
+ 2 + (IEEE80211_MAX_SUPP_RATES - 8) +
|
||||
+ 2 + sizeof(struct ieee80211_ht_cap) +
|
||||
+ 2 + sizeof(struct ieee80211_ht_info) +
|
||||
params->ie_len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
@@ -920,13 +1052,15 @@ int ieee80211_ibss_join(struct ieee80211
|
||||
sdata->vif.bss_conf.beacon_int = params->beacon_interval;
|
||||
|
||||
sdata->u.ibss.channel = params->channel;
|
||||
+ sdata->u.ibss.channel_type = params->channel_type;
|
||||
sdata->u.ibss.fixed_channel = params->channel_fixed;
|
||||
|
||||
/* fix ourselves to that channel now already */
|
||||
if (params->channel_fixed) {
|
||||
sdata->local->oper_channel = params->channel;
|
||||
- WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata,
|
||||
- NL80211_CHAN_NO_HT));
|
||||
+ if(!ieee80211_set_channel_type(sdata->local, sdata,
|
||||
+ params->channel_type))
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
if (params->ie) {
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -2164,7 +2164,8 @@ ieee80211_rx_h_action(struct ieee80211_r
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP &&
|
||||
- sdata->vif.type != NL80211_IFTYPE_WDS)
|
||||
+ sdata->vif.type != NL80211_IFTYPE_WDS &&
|
||||
+ sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
||||
break;
|
||||
|
||||
/* verify action_code is present */
|
||||
@@ -2699,7 +2700,8 @@ static int prepare_for_handlers(struct i
|
||||
else
|
||||
rate_idx = status->rate_idx;
|
||||
rx->sta = ieee80211_ibss_add_sta(sdata, bssid,
|
||||
- hdr->addr2, BIT(rate_idx), GFP_ATOMIC);
|
||||
+ hdr->addr2, BIT(rate_idx), NULL,
|
||||
+ GFP_ATOMIC);
|
||||
}
|
||||
break;
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
--- a/net/mac80211/agg-rx.c
|
||||
+++ b/net/mac80211/agg-rx.c
|
||||
@@ -182,6 +182,8 @@ static void ieee80211_send_addba_resp(st
|
||||
memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
else if (sdata->vif.type == NL80211_IFTYPE_WDS)
|
||||
memcpy(mgmt->bssid, da, ETH_ALEN);
|
||||
+ else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
|
||||
+ memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
|
||||
|
||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||
IEEE80211_STYPE_ACTION);
|
|
@ -11,7 +11,7 @@
|
|||
+ debug.o
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -274,13 +274,6 @@ void ath_dbg(struct ath_common *common,
|
||||
@@ -272,13 +272,6 @@ void ath_dbg(struct ath_common *common,
|
||||
#endif /* CONFIG_ATH_DEBUG */
|
||||
|
||||
/** Returns string describing opmode, or NULL if unknown mode. */
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <asm/unaligned.h>
|
||||
|
||||
#include "hw.h"
|
||||
@@ -460,8 +461,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||
@@ -464,8 +465,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||
common->macaddr[2 * i] = eeval >> 8;
|
||||
common->macaddr[2 * i + 1] = eeval & 0xff;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -1653,6 +1653,8 @@ void regulatory_hint_11d(struct wiphy *w
|
||||
@@ -1654,6 +1654,8 @@ void regulatory_hint_11d(struct wiphy *w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request;
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
mutex_lock(®_mutex);
|
||||
|
||||
if (unlikely(!last_request))
|
||||
@@ -1859,6 +1861,8 @@ static void restore_regulatory_settings(
|
||||
@@ -1860,6 +1862,8 @@ static void restore_regulatory_settings(
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1473,15 +1473,6 @@ static int ath9k_add_interface(struct ie
|
||||
@@ -1486,15 +1486,6 @@ static int ath9k_add_interface(struct ie
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
|||
ath_dbg(common, ATH_DBG_CONFIG,
|
||||
"Attach a VIF of type: %d\n", vif->type);
|
||||
|
||||
@@ -1507,15 +1498,6 @@ static int ath9k_change_interface(struct
|
||||
@@ -1520,15 +1511,6 @@ static int ath9k_change_interface(struct
|
||||
mutex_lock(&sc->mutex);
|
||||
ath9k_ps_wakeup(sc);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1585,6 +1585,53 @@ static const struct file_operations fops
|
||||
@@ -1610,6 +1610,53 @@ static const struct file_operations fops
|
||||
};
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
|||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1643,6 +1690,9 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1668,6 +1715,9 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
|
||||
sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1674,8 +1674,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -1714,8 +1714,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
REG_WRITE(ah, AR_OBS, 8);
|
||||
|
||||
if (ah->config.rx_intr_mitigation) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -363,7 +363,7 @@ struct ath_vif {
|
||||
@@ -364,7 +364,7 @@ struct ath_vif {
|
||||
* number of beacon intervals, the game's up.
|
||||
*/
|
||||
#define BSTUCK_THRESH 9
|
||||
|
@ -11,7 +11,7 @@
|
|||
#define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024)
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -382,8 +382,8 @@ static void ath9k_hw_init_config(struct
|
||||
@@ -387,8 +387,8 @@ static void ath9k_hw_init_config(struct
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -585,6 +585,7 @@ struct ath_softc {
|
||||
@@ -587,6 +587,7 @@ struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
|||
struct survey_info *cur_survey;
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1693,6 +1693,9 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1718,6 +1718,9 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_eeprom);
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
|||
sc->debug.sampidx = 0;
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1636,9 +1636,10 @@ static int ath9k_config(struct ieee80211
|
||||
@@ -1649,9 +1649,10 @@ static int ath9k_config(struct ieee80211
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
||||
struct ieee80211_channel *curchan = hw->conf.channel;
|
||||
|
@ -34,7 +34,7 @@
|
|||
unsigned long flags;
|
||||
|
||||
if (ah->curchan)
|
||||
@@ -1691,7 +1692,23 @@ static int ath9k_config(struct ieee80211
|
||||
@@ -1704,7 +1705,23 @@ static int ath9k_config(struct ieee80211
|
||||
memset(&sc->survey[pos], 0, sizeof(struct survey_info));
|
||||
}
|
||||
|
||||
|
@ -61,9 +61,9 @@
|
|||
return -EINVAL;
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1509,6 +1509,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
(AR_SREV_9300_20_OR_LATER(ah) && IS_CHAN_5GHZ(chan)))
|
||||
bChannelChange = false;
|
||||
@@ -1548,6 +1548,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
caldata->rtt_hist.num_readings)
|
||||
allow_fbs = true;
|
||||
|
||||
+ if (!ah->curchan || ((ah->curchan->channelFlags ^ chan->channelFlags) &
|
||||
+ (CHANNEL_HALF | CHANNEL_QUARTER)))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -355,10 +355,12 @@ minstrel_downgrade_rate(struct minstrel_
|
||||
@@ -357,10 +357,12 @@ minstrel_downgrade_rate(struct minstrel_
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -14,7 +14,7 @@
|
|||
u16 tid;
|
||||
|
||||
if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
|
||||
@@ -374,6 +376,12 @@ minstrel_aggr_check(struct minstrel_priv
|
||||
@@ -376,6 +378,12 @@ minstrel_aggr_check(struct minstrel_priv
|
||||
if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
|
||||
return;
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
|||
ieee80211_start_tx_ba_session(pubsta, tid, 5000);
|
||||
}
|
||||
|
||||
@@ -453,7 +461,7 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
@@ -455,7 +463,7 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) {
|
||||
minstrel_ht_update_stats(mp, mi);
|
||||
if (!(info->flags & IEEE80211_TX_CTL_AMPDU))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -685,6 +685,7 @@ static const struct net_device_ops ieee8
|
||||
@@ -683,6 +683,7 @@ static const struct net_device_ops ieee8
|
||||
static void ieee80211_if_setup(struct net_device *dev)
|
||||
{
|
||||
ether_setup(dev);
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
/*
|
||||
* Update rate statistics and select new primary rates
|
||||
*
|
||||
@@ -292,6 +307,7 @@ minstrel_ht_update_stats(struct minstrel
|
||||
@@ -294,6 +309,7 @@ minstrel_ht_update_stats(struct minstrel
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@
|
|||
mi->stats_update = jiffies;
|
||||
}
|
||||
|
||||
@@ -330,8 +346,8 @@ minstrel_next_sample_idx(struct minstrel
|
||||
@@ -332,8 +348,8 @@ minstrel_next_sample_idx(struct minstrel
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -59,7 +59,7 @@
|
|||
{
|
||||
int group, orig_group;
|
||||
|
||||
@@ -350,6 +366,7 @@ minstrel_downgrade_rate(struct minstrel_
|
||||
@@ -352,6 +368,7 @@ minstrel_downgrade_rate(struct minstrel_
|
||||
*idx = mi->groups[group].max_tp_rate;
|
||||
else
|
||||
*idx = mi->groups[group].max_tp_rate2;
|
||||
|
@ -67,7 +67,7 @@
|
|||
break;
|
||||
}
|
||||
}
|
||||
@@ -450,13 +467,13 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
@@ -452,13 +469,13 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
if (rate->attempts > 30 &&
|
||||
MINSTREL_FRAC(rate->success, rate->attempts) <
|
||||
MINSTREL_FRAC(20, 100))
|
||||
|
@ -83,7 +83,7 @@
|
|||
|
||||
if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) {
|
||||
minstrel_ht_update_stats(mp, mi);
|
||||
@@ -521,7 +538,6 @@ minstrel_calc_retransmit(struct minstrel
|
||||
@@ -523,7 +540,6 @@ minstrel_calc_retransmit(struct minstrel
|
||||
static void
|
||||
minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
struct ieee80211_tx_rate *rate, int index,
|
||||
|
@ -91,7 +91,7 @@
|
|||
bool sample, bool rtscts)
|
||||
{
|
||||
const struct mcs_group *group = &minstrel_mcs_groups[index / MCS_GROUP_RATES];
|
||||
@@ -609,6 +625,7 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
@@ -611,6 +627,7 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
struct minstrel_priv *mp = priv;
|
||||
int sample_idx;
|
||||
bool sample = false;
|
||||
|
@ -99,7 +99,7 @@
|
|||
|
||||
if (rate_control_send_low(sta, priv_sta, txrc))
|
||||
return;
|
||||
@@ -634,11 +651,10 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
@@ -636,11 +653,10 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
if (sample_idx >= 0) {
|
||||
sample = true;
|
||||
minstrel_ht_set_rate(mp, mi, &ar[0], sample_idx,
|
||||
|
@ -113,7 +113,7 @@
|
|||
}
|
||||
|
||||
if (mp->hw->max_rates >= 3) {
|
||||
@@ -648,33 +664,27 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
@@ -650,33 +666,27 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
* max_tp_rate -> max_tp_rate2 -> max_prob_rate by default.
|
||||
*/
|
||||
if (sample_idx >= 0)
|
||||
|
@ -157,7 +157,7 @@
|
|||
|
||||
mi->total_packets++;
|
||||
|
||||
@@ -766,6 +776,7 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
@@ -768,6 +778,7 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
if (!n_supported)
|
||||
goto use_legacy;
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -798,7 +798,7 @@ enum ieee80211_smps_mode {
|
||||
@@ -813,7 +813,7 @@ enum ieee80211_smps_mode {
|
||||
*/
|
||||
struct ieee80211_conf {
|
||||
u32 flags;
|
||||
|
@ -11,7 +11,7 @@
|
|||
u16 listen_interval;
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -1568,7 +1568,7 @@ static int ieee80211_get_tx_power(struct
|
||||
@@ -1597,7 +1597,7 @@ static int ieee80211_get_tx_power(struct
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1714,6 +1714,8 @@ static int ath9k_config(struct ieee80211
|
||||
@@ -1727,6 +1727,8 @@ static int ath9k_config(struct ieee80211
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
|||
/*
|
||||
* The most recent snapshot of channel->noisefloor for the old
|
||||
* channel is only available after the hardware reset. Copy it to
|
||||
@@ -1731,6 +1733,7 @@ static int ath9k_config(struct ieee80211
|
||||
@@ -1744,6 +1746,7 @@ static int ath9k_config(struct ieee80211
|
||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||
sc->config.txpowlimit, &sc->curtxpow);
|
||||
ath9k_ps_restore(sc);
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
spinlock_t txbuflock;
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1654,6 +1654,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -1679,6 +1679,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
sc, &fops_wiphy);
|
||||
debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_xmit);
|
||||
|
@ -57,7 +57,7 @@
|
|||
while (bf) {
|
||||
u16 seqno = bf->bf_state.seqno;
|
||||
|
||||
@@ -816,6 +826,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_
|
||||
@@ -821,6 +831,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_
|
||||
ath_tx_addto_baw(sc, tid, seqno);
|
||||
bf->bf_state.ndelim = ndelim;
|
||||
|
||||
|
@ -65,7 +65,7 @@
|
|||
__skb_unlink(skb, &tid->buf_q);
|
||||
list_add_tail(&bf->list, bf_q);
|
||||
if (bf_prev)
|
||||
@@ -1693,6 +1704,8 @@ static void ath_tx_send_ampdu(struct ath
|
||||
@@ -1687,6 +1698,8 @@ static void ath_tx_send_ampdu(struct ath
|
||||
/* Add sub-frame to BAW */
|
||||
ath_tx_addto_baw(sc, tid, bf->bf_state.seqno);
|
||||
|
||||
|
@ -74,7 +74,7 @@
|
|||
/* Queue to h/w without aggregation */
|
||||
TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw);
|
||||
bf->bf_lastbf = bf;
|
||||
@@ -1821,23 +1834,13 @@ error:
|
||||
@@ -1815,23 +1828,13 @@ error:
|
||||
|
||||
/* FIXME: tx power */
|
||||
static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb,
|
||||
|
@ -100,7 +100,7 @@
|
|||
|
||||
if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) {
|
||||
/*
|
||||
@@ -1872,6 +1875,7 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
@@ -1866,6 +1869,7 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
struct ieee80211_vif *vif = info->control.vif;
|
||||
struct ath_softc *sc = hw->priv;
|
||||
struct ath_txq *txq = txctl->txq;
|
||||
|
@ -108,7 +108,7 @@
|
|||
int padpos, padsize;
|
||||
int frmlen = skb->len + FCS_LEN;
|
||||
int q;
|
||||
@@ -1916,6 +1920,24 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
@@ -1908,6 +1912,24 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
|
||||
setup_frame_info(hw, skb, frmlen);
|
||||
|
||||
|
@ -133,7 +133,7 @@
|
|||
/*
|
||||
* At this point, the vif, hw_key and sta pointers in the tx control
|
||||
* info are no longer valid (overwritten by the ath_frame_info data.
|
||||
@@ -1930,7 +1952,7 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
@@ -1922,7 +1944,7 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
}
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
@@ -382,6 +385,7 @@ static void ath_tx_complete_aggr(struct
|
||||
int nframes;
|
||||
u8 tidno;
|
||||
bool clear_filter;
|
||||
bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
|
||||
+ int i, retries;
|
||||
|
||||
skb = bf->bf_mpdu;
|
||||
|
@ -39,19 +39,19 @@
|
|||
rcu_read_lock();
|
||||
|
||||
sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2);
|
||||
@@ -475,7 +483,8 @@ static void ath_tx_complete_aggr(struct
|
||||
@@ -476,7 +484,8 @@ static void ath_tx_complete_aggr(struct
|
||||
txpending = 1;
|
||||
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
|
||||
if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
|
||||
!an->sleeping)
|
||||
if (txok || !an->sleeping)
|
||||
- ath_tx_set_retry(sc, txq, bf->bf_mpdu);
|
||||
+ ath_tx_set_retry(sc, txq, bf->bf_mpdu,
|
||||
+ retries);
|
||||
|
||||
clear_filter = true;
|
||||
txpending = 1;
|
||||
} else {
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -540,7 +540,7 @@ struct ath_ant_comb {
|
||||
@@ -542,7 +542,7 @@ struct ath_ant_comb {
|
||||
#define DEFAULT_CACHELINE 32
|
||||
#define ATH_REGCLASSIDS_MAX 10
|
||||
#define ATH_CABQ_READY_TIME 80 /* % of beacon interval */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1371,10 +1371,16 @@ static bool ath9k_hw_set_reset_reg(struc
|
||||
@@ -1381,10 +1381,16 @@ static bool ath9k_hw_set_reset_reg(struc
|
||||
static bool ath9k_hw_chip_reset(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -954,34 +954,6 @@ static ssize_t read_file_recv(struct fil
|
||||
@@ -963,34 +963,6 @@ static ssize_t read_file_recv(struct fil
|
||||
"%18s : %10u\n", "DECRYPT BUSY ERR",
|
||||
sc->debug.stats.rxstats.decrypt_busy_err);
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
PHY_ERR("UNDERRUN", ATH9K_PHYERR_UNDERRUN);
|
||||
PHY_ERR("TIMING", ATH9K_PHYERR_TIMING);
|
||||
PHY_ERR("PARITY", ATH9K_PHYERR_PARITY);
|
||||
@@ -1058,16 +1030,6 @@ void ath_debug_stat_rx(struct ath_softc
|
||||
@@ -1067,16 +1039,6 @@ void ath_debug_stat_rx(struct ath_softc
|
||||
RX_PHY_ERR_INC(phyerr);
|
||||
}
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
|
||||
@@ -525,8 +525,8 @@ int ath9k_hw_process_rxdesc_edma(struct
|
||||
rxs->rs_status |= ATH9K_RXERR_DECRYPT;
|
||||
else if (rxsp->status11 & AR_MichaelErr)
|
||||
rxs->rs_status |= ATH9K_RXERR_MIC;
|
||||
- else if (rxsp->status11 & AR_KeyMiss)
|
||||
- rxs->rs_status |= ATH9K_RXERR_DECRYPT;
|
||||
+ if (rxsp->status11 & AR_KeyMiss)
|
||||
+ rxs->rs_status |= ATH9K_RXERR_KEYMISS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.c
|
||||
@@ -620,8 +620,8 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
|
||||
rs->rs_status |= ATH9K_RXERR_DECRYPT;
|
||||
else if (ads.ds_rxstatus8 & AR_MichaelErr)
|
||||
rs->rs_status |= ATH9K_RXERR_MIC;
|
||||
- else if (ads.ds_rxstatus8 & AR_KeyMiss)
|
||||
- rs->rs_status |= ATH9K_RXERR_DECRYPT;
|
||||
+ if (ads.ds_rxstatus8 & AR_KeyMiss)
|
||||
+ rs->rs_status |= ATH9K_RXERR_KEYMISS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.h
|
||||
@@ -181,6 +181,7 @@ struct ath_htc_rx_status {
|
||||
#define ATH9K_RXERR_FIFO 0x04
|
||||
#define ATH9K_RXERR_DECRYPT 0x08
|
||||
#define ATH9K_RXERR_MIC 0x10
|
||||
+#define ATH9K_RXERR_KEYMISS 0x20
|
||||
|
||||
#define ATH9K_RX_MORE 0x01
|
||||
#define ATH9K_RX_MORE_AGGR 0x02
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -826,7 +826,8 @@ static bool ath9k_rx_accept(struct ath_c
|
||||
test_bit(rx_stats->rs_keyix, common->tkip_keymap);
|
||||
strip_mic = is_valid_tkip && ieee80211_is_data(fc) &&
|
||||
!(rx_stats->rs_status &
|
||||
- (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC));
|
||||
+ (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC |
|
||||
+ ATH9K_RXERR_KEYMISS));
|
||||
|
||||
if (!rx_stats->rs_datalen)
|
||||
return false;
|
||||
@@ -854,6 +855,8 @@ static bool ath9k_rx_accept(struct ath_c
|
||||
* descriptors.
|
||||
*/
|
||||
if (rx_stats->rs_status != 0) {
|
||||
+ u8 status_mask;
|
||||
+
|
||||
if (rx_stats->rs_status & ATH9K_RXERR_CRC) {
|
||||
rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
|
||||
mic_error = false;
|
||||
@@ -861,7 +864,8 @@ static bool ath9k_rx_accept(struct ath_c
|
||||
if (rx_stats->rs_status & ATH9K_RXERR_PHY)
|
||||
return false;
|
||||
|
||||
- if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
|
||||
+ if ((rx_stats->rs_status & ATH9K_RXERR_DECRYPT) ||
|
||||
+ (!is_mc && (rx_stats->rs_status & ATH9K_RXERR_KEYMISS))) {
|
||||
*decrypt_error = true;
|
||||
mic_error = false;
|
||||
}
|
||||
@@ -871,17 +875,14 @@ static bool ath9k_rx_accept(struct ath_c
|
||||
* decryption and MIC failures. For monitor mode,
|
||||
* we also ignore the CRC error.
|
||||
*/
|
||||
- if (ah->is_monitoring) {
|
||||
- if (rx_stats->rs_status &
|
||||
- ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
|
||||
- ATH9K_RXERR_CRC))
|
||||
- return false;
|
||||
- } else {
|
||||
- if (rx_stats->rs_status &
|
||||
- ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
+ status_mask = ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
|
||||
+ ATH9K_RXERR_KEYMISS;
|
||||
+
|
||||
+ if (ah->is_monitoring)
|
||||
+ status_mask |= ATH9K_RXERR_CRC;
|
||||
+
|
||||
+ if (rx_stats->rs_status & ~status_mask)
|
||||
+ return false;
|
||||
}
|
||||
|
||||
/*
|
|
@ -1,6 +1,6 @@
|
|||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -666,6 +666,9 @@ enum mac80211_rx_flags {
|
||||
@@ -681,6 +681,9 @@ enum mac80211_rx_flags {
|
||||
* @mactime: value in microseconds of the 64-bit Time Synchronization Function
|
||||
* (TSF) timer when the first data symbol (MPDU) arrived at the hardware.
|
||||
* @band: the active band when this frame was received
|
||||
|
@ -10,7 +10,7 @@
|
|||
* @freq: frequency the radio was tuned to when receiving this frame, in MHz
|
||||
* @signal: signal strength when receiving this frame, either in dBm, in dB or
|
||||
* unspecified depending on the hardware capabilities flags
|
||||
@@ -679,6 +682,10 @@ enum mac80211_rx_flags {
|
||||
@@ -694,6 +697,10 @@ enum mac80211_rx_flags {
|
||||
struct ieee80211_rx_status {
|
||||
u64 mactime;
|
||||
enum ieee80211_band band;
|
||||
|
@ -23,7 +23,7 @@
|
|||
int antenna;
|
||||
--- a/net/mac80211/sta_info.h
|
||||
+++ b/net/mac80211/sta_info.h
|
||||
@@ -292,6 +292,11 @@ struct sta_info {
|
||||
@@ -300,6 +300,11 @@ struct sta_info {
|
||||
unsigned long rx_dropped;
|
||||
int last_signal;
|
||||
struct ewma avg_signal;
|
||||
|
@ -37,7 +37,7 @@
|
|||
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -1169,6 +1169,7 @@ ieee80211_rx_h_sta_process(struct ieee80
|
||||
@@ -1244,6 +1244,7 @@ ieee80211_rx_h_sta_process(struct ieee80
|
||||
struct sk_buff *skb = rx->skb;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
@ -45,7 +45,7 @@
|
|||
|
||||
if (!sta)
|
||||
return RX_CONTINUE;
|
||||
@@ -1211,6 +1212,19 @@ ieee80211_rx_h_sta_process(struct ieee80
|
||||
@@ -1286,6 +1287,19 @@ ieee80211_rx_h_sta_process(struct ieee80
|
||||
sta->last_signal = status->signal;
|
||||
ewma_add(&sta->avg_signal, -status->signal);
|
||||
|
||||
|
@ -67,7 +67,7 @@
|
|||
* exchange sequence.
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -295,6 +295,8 @@ struct sta_info *sta_info_alloc(struct i
|
||||
@@ -304,6 +304,8 @@ struct sta_info *sta_info_alloc(struct i
|
||||
do_posix_clock_monotonic_gettime(&uptime);
|
||||
sta->last_connected = uptime.tv_sec;
|
||||
ewma_init(&sta->avg_signal, 1024, 8);
|
||||
|
@ -78,7 +78,7 @@
|
|||
kfree(sta);
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -481,6 +481,8 @@ struct station_parameters {
|
||||
@@ -497,6 +497,8 @@ struct station_parameters {
|
||||
* @STATION_INFO_BSS_PARAM: @bss_param filled
|
||||
* @STATION_INFO_CONNECTED_TIME: @connected_time filled
|
||||
* @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled
|
||||
|
@ -87,7 +87,7 @@
|
|||
*/
|
||||
enum station_info_flags {
|
||||
STATION_INFO_INACTIVE_TIME = 1<<0,
|
||||
@@ -500,7 +502,9 @@ enum station_info_flags {
|
||||
@@ -516,7 +518,9 @@ enum station_info_flags {
|
||||
STATION_INFO_RX_BITRATE = 1<<14,
|
||||
STATION_INFO_BSS_PARAM = 1<<15,
|
||||
STATION_INFO_CONNECTED_TIME = 1<<16,
|
||||
|
@ -98,7 +98,7 @@
|
|||
};
|
||||
|
||||
/**
|
||||
@@ -580,6 +584,9 @@ struct sta_bss_parameters {
|
||||
@@ -596,6 +600,9 @@ struct sta_bss_parameters {
|
||||
* @plink_state: mesh peer link state
|
||||
* @signal: signal strength of last received packet in dBm
|
||||
* @signal_avg: signal strength average in dBm
|
||||
|
@ -108,7 +108,7 @@
|
|||
* @txrate: current unicast bitrate from this station
|
||||
* @rxrate: current unicast bitrate to this station
|
||||
* @rx_packets: packets received from this station
|
||||
@@ -609,6 +616,11 @@ struct station_info {
|
||||
@@ -625,6 +632,11 @@ struct station_info {
|
||||
u8 plink_state;
|
||||
s8 signal;
|
||||
s8 signal_avg;
|
||||
|
@ -139,7 +139,7 @@
|
|||
u8 rs_num_delims;
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -983,6 +983,7 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
@@ -981,6 +981,7 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
bool *decrypt_error)
|
||||
{
|
||||
struct ath_hw *ah = common->ah;
|
||||
|
@ -147,7 +147,7 @@
|
|||
|
||||
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
|
||||
|
||||
@@ -1008,6 +1009,20 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
@@ -1006,6 +1007,20 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
rx_status->antenna = rx_stats->rs_antenna;
|
||||
rx_status->flag |= RX_FLAG_MACTIME_MPDU;
|
||||
|
||||
|
@ -168,7 +168,7 @@
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -1538,14 +1553,14 @@ static void ath_ant_comb_scan(struct ath
|
||||
@@ -1536,14 +1551,14 @@ static void ath_ant_comb_scan(struct ath
|
||||
struct ath_ant_comb *antcomb = &sc->ant_comb;
|
||||
int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
|
||||
int curr_main_set;
|
||||
|
@ -250,7 +250,7 @@
|
|||
if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1032,12 +1032,12 @@ void ath_debug_stat_rx(struct ath_softc
|
||||
@@ -1041,12 +1041,12 @@ void ath_debug_stat_rx(struct ath_softc
|
||||
|
||||
spin_lock(&sc->debug.samp_lock);
|
||||
RX_SAMP_DBG(jiffies) = jiffies;
|
||||
|
@ -271,7 +271,7 @@
|
|||
RX_SAMP_DBG(rate) = rs->rs_rate;
|
||||
--- a/include/linux/nl80211.h
|
||||
+++ b/include/linux/nl80211.h
|
||||
@@ -1497,6 +1497,8 @@ enum nl80211_sta_bss_param {
|
||||
@@ -1548,6 +1548,8 @@ enum nl80211_sta_bss_param {
|
||||
* @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute
|
||||
* containing info as possible, see &enum nl80211_sta_bss_param
|
||||
* @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected
|
||||
|
@ -280,7 +280,7 @@
|
|||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
||||
*/
|
||||
@@ -1518,6 +1520,8 @@ enum nl80211_sta_info {
|
||||
@@ -1569,6 +1571,8 @@ enum nl80211_sta_info {
|
||||
NL80211_STA_INFO_RX_BITRATE,
|
||||
NL80211_STA_INFO_BSS_PARAM,
|
||||
NL80211_STA_INFO_CONNECTED_TIME,
|
||||
|
@ -291,7 +291,7 @@
|
|||
__NL80211_STA_INFO_AFTER_LAST,
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -2238,6 +2238,33 @@ nla_put_failure:
|
||||
@@ -2257,6 +2257,33 @@ nla_put_failure:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -325,7 +325,7 @@
|
|||
static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
|
||||
int flags, struct net_device *dev,
|
||||
const u8 *mac_addr, struct station_info *sinfo)
|
||||
@@ -2284,6 +2311,18 @@ static int nl80211_send_station(struct s
|
||||
@@ -2303,6 +2330,18 @@ static int nl80211_send_station(struct s
|
||||
if (sinfo->filled & STATION_INFO_SIGNAL_AVG)
|
||||
NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG,
|
||||
sinfo->signal_avg);
|
||||
|
@ -346,7 +346,7 @@
|
|||
NL80211_STA_INFO_TX_BITRATE))
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -329,6 +329,7 @@ static void sta_set_sinfo(struct sta_inf
|
||||
@@ -330,6 +330,7 @@ static void sta_set_sinfo(struct sta_inf
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
struct timespec uptime;
|
||||
|
@ -354,7 +354,7 @@
|
|||
|
||||
sinfo->generation = sdata->local->sta_generation;
|
||||
|
||||
@@ -363,6 +364,17 @@ static void sta_set_sinfo(struct sta_inf
|
||||
@@ -364,6 +365,17 @@ static void sta_set_sinfo(struct sta_inf
|
||||
sinfo->signal = (s8)sta->last_signal;
|
||||
sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -425,12 +425,9 @@ void ath_rx_cleanup(struct ath_softc *sc
|
||||
|
||||
u32 ath_calcrxfilter(struct ath_softc *sc)
|
||||
{
|
||||
-#define RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR)
|
||||
-
|
||||
u32 rfilt;
|
||||
|
||||
- rfilt = (ath9k_hw_getrxfilter(sc->sc_ah) & RX_FILTER_PRESERVE)
|
||||
- | ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST
|
||||
+ rfilt = ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST
|
||||
| ATH9K_RX_FILTER_MCAST;
|
||||
|
||||
if (sc->rx.rxfilter & FIF_PROBE_REQ)
|
||||
--- a/drivers/net/wireless/ath/ath9k/ani.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ani.c
|
||||
@@ -502,9 +502,6 @@ static void ath9k_ani_reset_old(struct a
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR,
|
||||
ATH9K_ANI_CCK_WEAK_SIG_THR);
|
||||
|
||||
- ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) |
|
||||
- ATH9K_RX_FILTER_PHYERR);
|
||||
-
|
||||
ath9k_ani_restart(ah);
|
||||
return;
|
||||
}
|
||||
@@ -525,8 +522,6 @@ static void ath9k_ani_reset_old(struct a
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
|
||||
aniState->firstepLevel);
|
||||
|
||||
- ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) &
|
||||
- ~ATH9K_RX_FILTER_PHYERR);
|
||||
ath9k_ani_restart(ah);
|
||||
|
||||
ENABLE_REGWRITE_BUFFER(ah);
|
|
@ -1,96 +0,0 @@
|
|||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -2370,6 +2370,25 @@ static inline int ieee80211_sta_ps_trans
|
||||
void ieee80211_sta_set_tim(struct ieee80211_sta *sta);
|
||||
|
||||
/**
|
||||
+ * ieee80211_tx_status_sta - transmit status callback
|
||||
+ *
|
||||
+ * Call this function for all transmitted frames after they have been
|
||||
+ * transmitted. It is permissible to not call this function for
|
||||
+ * multicast frames but this can affect statistics.
|
||||
+ *
|
||||
+ * This function may not be called in IRQ context. Calls to this function
|
||||
+ * for a single hardware must be synchronized against each other. Calls
|
||||
+ * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
|
||||
+ * may not be mixed for a single hardware.
|
||||
+ *
|
||||
+ * @hw: the hardware the frame was transmitted by
|
||||
+ * @skb: the frame that was transmitted, owned by mac80211 after this call
|
||||
+ * @sta: station for which the tx status is provided
|
||||
+ */
|
||||
+void ieee80211_tx_status_sta(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
+ struct ieee80211_sta *sta);
|
||||
+
|
||||
+/**
|
||||
* ieee80211_tx_status - transmit status callback
|
||||
*
|
||||
* Call this function for all transmitted frames after they have been
|
||||
@@ -2384,8 +2403,11 @@ void ieee80211_sta_set_tim(struct ieee80
|
||||
* @hw: the hardware the frame was transmitted by
|
||||
* @skb: the frame that was transmitted, owned by mac80211 after this call
|
||||
*/
|
||||
-void ieee80211_tx_status(struct ieee80211_hw *hw,
|
||||
- struct sk_buff *skb);
|
||||
+static inline void ieee80211_tx_status(struct ieee80211_hw *hw,
|
||||
+ struct sk_buff *skb)
|
||||
+{
|
||||
+ ieee80211_tx_status_sta(hw, skb, NULL);
|
||||
+}
|
||||
|
||||
/**
|
||||
* ieee80211_tx_status_ni - transmit status callback (in process context)
|
||||
--- a/net/mac80211/status.c
|
||||
+++ b/net/mac80211/status.c
|
||||
@@ -202,7 +202,8 @@ static void ieee80211_set_bar_pending(st
|
||||
*/
|
||||
#define STA_LOST_PKT_THRESHOLD 50
|
||||
|
||||
-void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
+void ieee80211_tx_status_sta(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
+ struct ieee80211_sta *pubsta)
|
||||
{
|
||||
struct sk_buff *skb2;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
||||
@@ -214,7 +215,7 @@ void ieee80211_tx_status(struct ieee8021
|
||||
struct ieee80211_tx_status_rtap_hdr *rthdr;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct net_device *prev_dev = NULL;
|
||||
- struct sta_info *sta, *tmp;
|
||||
+ struct sta_info *sta = NULL, *tmp, *tmp2;
|
||||
int retry_count = -1, i;
|
||||
int rates_idx = -1;
|
||||
bool send_to_cooked;
|
||||
@@ -244,11 +245,19 @@ void ieee80211_tx_status(struct ieee8021
|
||||
sband = local->hw.wiphy->bands[info->band];
|
||||
fc = hdr->frame_control;
|
||||
|
||||
- for_each_sta_info(local, hdr->addr1, sta, tmp) {
|
||||
- /* skip wrong virtual interface */
|
||||
- if (memcmp(hdr->addr2, sta->sdata->vif.addr, ETH_ALEN))
|
||||
- continue;
|
||||
+ if (!pubsta) {
|
||||
+ for_each_sta_info(local, hdr->addr1, tmp, tmp2) {
|
||||
+ /* skip wrong virtual interface */
|
||||
+ if (memcmp(hdr->addr2, tmp->sdata->vif.addr, ETH_ALEN))
|
||||
+ continue;
|
||||
+
|
||||
+ sta = tmp;
|
||||
+ }
|
||||
+ } else {
|
||||
+ sta = container_of(pubsta, struct sta_info, sta);
|
||||
+ }
|
||||
|
||||
+ if (sta) {
|
||||
acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
|
||||
if (!acked && test_sta_flags(sta, WLAN_STA_PS_STA)) {
|
||||
/*
|
||||
@@ -497,7 +506,7 @@ void ieee80211_tx_status(struct ieee8021
|
||||
rcu_read_unlock();
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
-EXPORT_SYMBOL(ieee80211_tx_status);
|
||||
+EXPORT_SYMBOL(ieee80211_tx_status_sta);
|
||||
|
||||
void ieee80211_report_low_ack(struct ieee80211_sta *pubsta, u32 num_packets)
|
||||
{
|
|
@ -1,121 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -50,10 +50,12 @@ static u16 bits_per_symbol[][2] = {
|
||||
static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct ath_atx_tid *tid, struct sk_buff *skb);
|
||||
static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
|
||||
- int tx_flags, struct ath_txq *txq);
|
||||
+ int tx_flags, struct ath_txq *txq,
|
||||
+ struct ieee80211_sta *sta);
|
||||
static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
|
||||
struct ath_txq *txq, struct list_head *bf_q,
|
||||
- struct ath_tx_status *ts, int txok, int sendbar);
|
||||
+ struct ath_tx_status *ts, int txok, int sendbar,
|
||||
+ struct ieee80211_sta *sta);
|
||||
static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct list_head *head, bool internal);
|
||||
static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
||||
@@ -172,7 +174,8 @@ static void ath_tx_flush_tid(struct ath_
|
||||
if (bf && fi->retries) {
|
||||
list_add_tail(&bf->list, &bf_head);
|
||||
ath_tx_update_baw(sc, tid, bf->bf_state.seqno);
|
||||
- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 1);
|
||||
+ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0,
|
||||
+ 1, NULL);
|
||||
} else {
|
||||
ath_tx_send_normal(sc, txq, NULL, skb);
|
||||
}
|
||||
@@ -239,7 +242,7 @@ static void ath_tid_drain(struct ath_sof
|
||||
|
||||
if (!bf) {
|
||||
spin_unlock(&txq->axq_lock);
|
||||
- ath_tx_complete(sc, skb, ATH_TX_ERROR, txq);
|
||||
+ ath_tx_complete(sc, skb, ATH_TX_ERROR, txq, NULL);
|
||||
spin_lock(&txq->axq_lock);
|
||||
continue;
|
||||
}
|
||||
@@ -250,7 +253,7 @@ static void ath_tid_drain(struct ath_sof
|
||||
ath_tx_update_baw(sc, tid, bf->bf_state.seqno);
|
||||
|
||||
spin_unlock(&txq->axq_lock);
|
||||
- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
|
||||
+ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0, NULL);
|
||||
spin_lock(&txq->axq_lock);
|
||||
}
|
||||
|
||||
@@ -412,7 +415,7 @@ static void ath_tx_complete_aggr(struct
|
||||
list_move_tail(&bf->list, &bf_head);
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
|
||||
- 0, 0);
|
||||
+ 0, 0, NULL);
|
||||
|
||||
bf = bf_next;
|
||||
}
|
||||
@@ -520,7 +523,7 @@ static void ath_tx_complete_aggr(struct
|
||||
}
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
|
||||
- !txfail, sendbar);
|
||||
+ !txfail, sendbar, sta);
|
||||
} else {
|
||||
/* retry the un-acked ones */
|
||||
if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) {
|
||||
@@ -540,7 +543,8 @@ static void ath_tx_complete_aggr(struct
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq,
|
||||
&bf_head,
|
||||
- ts, 0, 1);
|
||||
+ ts, 0, 1,
|
||||
+ sta);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1465,7 +1469,8 @@ static void ath_drain_txq_list(struct at
|
||||
ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0,
|
||||
retry_tx);
|
||||
else
|
||||
- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
|
||||
+ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0,
|
||||
+ NULL);
|
||||
spin_lock_bh(&txq->axq_lock);
|
||||
}
|
||||
}
|
||||
@@ -1970,7 +1975,8 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
/*****************/
|
||||
|
||||
static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
|
||||
- int tx_flags, struct ath_txq *txq)
|
||||
+ int tx_flags, struct ath_txq *txq,
|
||||
+ struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_hw *hw = sc->hw;
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
@@ -2028,7 +2034,8 @@ static void ath_tx_complete(struct ath_s
|
||||
|
||||
static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
|
||||
struct ath_txq *txq, struct list_head *bf_q,
|
||||
- struct ath_tx_status *ts, int txok, int sendbar)
|
||||
+ struct ath_tx_status *ts, int txok, int sendbar,
|
||||
+ struct ieee80211_sta *sta)
|
||||
{
|
||||
struct sk_buff *skb = bf->bf_mpdu;
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
@@ -2056,7 +2063,7 @@ static void ath_tx_complete_buf(struct a
|
||||
complete(&sc->paprd_complete);
|
||||
} else {
|
||||
ath_debug_stat_tx(sc, bf, ts, txq, tx_flags);
|
||||
- ath_tx_complete(sc, skb, tx_flags, txq);
|
||||
+ ath_tx_complete(sc, skb, tx_flags, txq, sta);
|
||||
}
|
||||
/* At this point, skb (bf->bf_mpdu) is consumed...make sure we don't
|
||||
* accidentally reference it later.
|
||||
@@ -2145,7 +2152,7 @@ static void ath_tx_process_buffer(struct
|
||||
|
||||
if (!bf_isampdu(bf)) {
|
||||
ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
|
||||
- ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0);
|
||||
+ ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0, NULL);
|
||||
} else
|
||||
ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true);
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -1512,7 +1512,8 @@ bool ath_drain_all_txq(struct ath_softc
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ath_txq *txq;
|
||||
- int i, npend = 0;
|
||||
+ int i;
|
||||
+ u32 npend = 0;
|
||||
|
||||
if (sc->sc_flags & SC_OP_INVALID)
|
||||
return true;
|
||||
@@ -1524,11 +1525,12 @@ bool ath_drain_all_txq(struct ath_softc
|
||||
if (!ATH_TXQ_SETUP(sc, i))
|
||||
continue;
|
||||
|
||||
- npend += ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum);
|
||||
+ if (ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum))
|
||||
+ npend |= BIT(i);
|
||||
}
|
||||
|
||||
if (npend)
|
||||
- ath_err(common, "Failed to stop TX DMA!\n");
|
||||
+ ath_err(common, "Failed to stop TX DMA, queues=%08x!\n", npend);
|
||||
|
||||
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
||||
if (!ATH_TXQ_SETUP(sc, i))
|
|
@ -1,124 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/debug.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.h
|
||||
@@ -25,8 +25,10 @@ struct ath_buf;
|
||||
|
||||
#ifdef CONFIG_ATH9K_DEBUGFS
|
||||
#define TX_STAT_INC(q, c) sc->debug.stats.txstats[q].c++
|
||||
+#define RESET_STAT_INC(sc, type) sc->debug.stats.reset[type]++
|
||||
#else
|
||||
#define TX_STAT_INC(q, c) do { } while (0)
|
||||
+#define RESET_STAT_INC(sc, type) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ATH9K_DEBUGFS
|
||||
@@ -171,10 +173,21 @@ struct ath_rx_stats {
|
||||
u8 rs_antenna;
|
||||
};
|
||||
|
||||
+enum ath_reset_type {
|
||||
+ RESET_TYPE_BB_HANG,
|
||||
+ RESET_TYPE_BB_WATCHDOG,
|
||||
+ RESET_TYPE_FATAL_INT,
|
||||
+ RESET_TYPE_TX_ERROR,
|
||||
+ RESET_TYPE_TX_HANG,
|
||||
+ RESET_TYPE_PLL_HANG,
|
||||
+ __RESET_TYPE_MAX
|
||||
+};
|
||||
+
|
||||
struct ath_stats {
|
||||
struct ath_interrupt_stats istats;
|
||||
struct ath_tx_stats txstats[ATH9K_NUM_TX_QUEUES];
|
||||
struct ath_rx_stats rxstats;
|
||||
+ u32 reset[__RESET_TYPE_MAX];
|
||||
};
|
||||
|
||||
#define ATH_DBG_MAX_SAMPLES 10
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -679,6 +679,16 @@ void ath9k_tasklet(unsigned long data)
|
||||
|
||||
if ((status & ATH9K_INT_FATAL) ||
|
||||
(status & ATH9K_INT_BB_WATCHDOG)) {
|
||||
+#ifdef CONFIG_ATH9K_DEBUGFS
|
||||
+ enum ath_reset_type type;
|
||||
+
|
||||
+ if (status & ATH9K_INT_FATAL)
|
||||
+ type = RESET_TYPE_FATAL_INT;
|
||||
+ else
|
||||
+ type = RESET_TYPE_BB_WATCHDOG;
|
||||
+
|
||||
+ RESET_STAT_INC(sc, type);
|
||||
+#endif
|
||||
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
|
||||
goto out;
|
||||
}
|
||||
@@ -995,8 +1005,10 @@ void ath_hw_check(struct work_struct *wo
|
||||
ath_dbg(common, ATH_DBG_RESET, "Possible baseband hang, "
|
||||
"busy=%d (try %d)\n", busy, sc->hw_busy_count + 1);
|
||||
if (busy >= 99) {
|
||||
- if (++sc->hw_busy_count >= 3)
|
||||
+ if (++sc->hw_busy_count >= 3) {
|
||||
+ RESET_STAT_INC(sc, RESET_TYPE_BB_HANG);
|
||||
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
|
||||
+ }
|
||||
|
||||
} else if (busy >= 0)
|
||||
sc->hw_busy_count = 0;
|
||||
@@ -1016,6 +1028,7 @@ static void ath_hw_pll_rx_hang_check(str
|
||||
/* Rx is hung for more than 500ms. Reset it */
|
||||
ath_dbg(common, ATH_DBG_RESET,
|
||||
"Possible RX hang, resetting");
|
||||
+ RESET_STAT_INC(sc, RESET_TYPE_PLL_HANG);
|
||||
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
|
||||
count = 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -587,8 +587,10 @@ static void ath_tx_complete_aggr(struct
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
- if (needreset)
|
||||
+ if (needreset) {
|
||||
+ RESET_STAT_INC(sc, RESET_TYPE_TX_ERROR);
|
||||
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
|
||||
+ }
|
||||
}
|
||||
|
||||
static bool ath_lookup_legacy(struct ath_buf *bf)
|
||||
@@ -2270,6 +2272,7 @@ static void ath_tx_complete_poll_work(st
|
||||
if (needreset) {
|
||||
ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
|
||||
"tx hung, resetting the chip\n");
|
||||
+ RESET_STAT_INC(sc, RESET_TYPE_TX_HANG);
|
||||
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -523,9 +523,22 @@ static ssize_t read_file_wiphy(struct fi
|
||||
if (tmp & ATH9K_RX_FILTER_PHYRADAR)
|
||||
len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR");
|
||||
if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL)
|
||||
- len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL\n");
|
||||
- else
|
||||
- len += snprintf(buf + len, sizeof(buf) - len, "\n");
|
||||
+ len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL");
|
||||
+
|
||||
+ len += snprintf(buf + len, sizeof(buf) - len,
|
||||
+ "\n\nReset causes:\n"
|
||||
+ " baseband hang: %d\n"
|
||||
+ " baseband watchdog: %d\n"
|
||||
+ " fatal hardware error interrupt: %d\n"
|
||||
+ " tx hardware error: %d\n"
|
||||
+ " tx path hang: %d\n"
|
||||
+ " pll rx hang: %d\n",
|
||||
+ sc->debug.stats.reset[RESET_TYPE_BB_HANG],
|
||||
+ sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG],
|
||||
+ sc->debug.stats.reset[RESET_TYPE_FATAL_INT],
|
||||
+ sc->debug.stats.reset[RESET_TYPE_TX_ERROR],
|
||||
+ sc->debug.stats.reset[RESET_TYPE_TX_HANG],
|
||||
+ sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
|
||||
|
||||
if (len > sizeof(buf))
|
||||
len = sizeof(buf);
|
|
@ -1,41 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -387,7 +387,6 @@ static void ath_tx_complete_aggr(struct
|
||||
struct ath_frame_info *fi;
|
||||
int nframes;
|
||||
u8 tidno;
|
||||
- bool clear_filter;
|
||||
int i, retries;
|
||||
|
||||
skb = bf->bf_mpdu;
|
||||
@@ -484,12 +483,10 @@ static void ath_tx_complete_aggr(struct
|
||||
*/
|
||||
txfail = 1;
|
||||
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
|
||||
- if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
|
||||
- !an->sleeping)
|
||||
+ if (txok || !an->sleeping)
|
||||
ath_tx_set_retry(sc, txq, bf->bf_mpdu,
|
||||
retries);
|
||||
|
||||
- clear_filter = true;
|
||||
txpending = 1;
|
||||
} else {
|
||||
txfail = 1;
|
||||
@@ -568,11 +565,13 @@ static void ath_tx_complete_aggr(struct
|
||||
ieee80211_sta_set_tim(sta);
|
||||
|
||||
spin_lock_bh(&txq->axq_lock);
|
||||
- if (clear_filter)
|
||||
- tid->ac->clear_ps_filter = true;
|
||||
skb_queue_splice(&bf_pending, &tid->buf_q);
|
||||
- if (!an->sleeping)
|
||||
+ if (!an->sleeping) {
|
||||
ath_tx_queue_tid(txq, tid);
|
||||
+
|
||||
+ if (ts->ts_status & ATH9K_TXERR_FILT)
|
||||
+ tid->ac->clear_ps_filter = true;
|
||||
+ }
|
||||
spin_unlock_bh(&txq->axq_lock);
|
||||
}
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/mac.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.h
|
||||
@@ -75,9 +75,10 @@
|
||||
#define ATH9K_TXERR_XTXOP 0x08
|
||||
#define ATH9K_TXERR_TIMER_EXPIRED 0x10
|
||||
#define ATH9K_TX_ACKED 0x20
|
||||
+#define ATH9K_TX_FLUSH 0x40
|
||||
#define ATH9K_TXERR_MASK \
|
||||
(ATH9K_TXERR_XRETRY | ATH9K_TXERR_FILT | ATH9K_TXERR_FIFO | \
|
||||
- ATH9K_TXERR_XTXOP | ATH9K_TXERR_TIMER_EXPIRED)
|
||||
+ ATH9K_TXERR_XTXOP | ATH9K_TXERR_TIMER_EXPIRED | ATH9K_TX_FLUSH)
|
||||
|
||||
#define ATH9K_TX_BA 0x01
|
||||
#define ATH9K_TX_PWRMGMT 0x02
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -388,6 +388,7 @@ static void ath_tx_complete_aggr(struct
|
||||
int nframes;
|
||||
u8 tidno;
|
||||
int i, retries;
|
||||
+ bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
|
||||
|
||||
skb = bf->bf_mpdu;
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
@@ -482,6 +483,8 @@ static void ath_tx_complete_aggr(struct
|
||||
* the un-acked sub-frames
|
||||
*/
|
||||
txfail = 1;
|
||||
+ } else if (flush) {
|
||||
+ txpending = 1;
|
||||
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
|
||||
if (txok || !an->sleeping)
|
||||
ath_tx_set_retry(sc, txq, bf->bf_mpdu,
|
||||
@@ -540,7 +543,8 @@ static void ath_tx_complete_aggr(struct
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq,
|
||||
&bf_head,
|
||||
- ts, 0, 1,
|
||||
+ ts, 0,
|
||||
+ !flush,
|
||||
sta);
|
||||
break;
|
||||
}
|
||||
@@ -1446,6 +1450,7 @@ static void ath_drain_txq_list(struct at
|
||||
struct ath_tx_status ts;
|
||||
|
||||
memset(&ts, 0, sizeof(ts));
|
||||
+ ts.ts_status = ATH9K_TX_FLUSH;
|
||||
INIT_LIST_HEAD(&bf_head);
|
||||
|
||||
while (!list_empty(list)) {
|
|
@ -1,155 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/beacon.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
|
||||
@@ -515,7 +515,7 @@ static void ath_beacon_config_ap(struct
|
||||
sc->sc_flags |= SC_OP_TSF_RESET;
|
||||
ath9k_beacon_init(sc, nexttbtt, intval);
|
||||
sc->beacon.bmisscnt = 0;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
}
|
||||
|
||||
@@ -643,7 +643,7 @@ static void ath_beacon_config_sta(struct
|
||||
ath9k_hw_set_sta_beacon_timers(ah, &bs);
|
||||
ah->imask |= ATH9K_INT_BMISS;
|
||||
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
}
|
||||
|
||||
@@ -679,7 +679,7 @@ static void ath_beacon_config_adhoc(stru
|
||||
ath9k_beacon_init(sc, nexttbtt, intval);
|
||||
sc->beacon.bmisscnt = 0;
|
||||
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
}
|
||||
|
||||
@@ -821,11 +821,11 @@ void ath9k_set_beaconing_status(struct a
|
||||
if (status) {
|
||||
/* Re-enable beaconing */
|
||||
ah->imask |= ATH9K_INT_SWBA;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
} else {
|
||||
/* Disable SWBA interrupt */
|
||||
ah->imask &= ~ATH9K_INT_SWBA;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
tasklet_kill(&sc->bcon_tasklet);
|
||||
ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq);
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -151,7 +151,7 @@ static void ath9k_gen_timer_start(struct
|
||||
if ((ah->imask & ATH9K_INT_GENTIMER) == 0) {
|
||||
ath9k_hw_disable_interrupts(ah);
|
||||
ah->imask |= ATH9K_INT_GENTIMER;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
}
|
||||
}
|
||||
@@ -166,7 +166,7 @@ static void ath9k_gen_timer_stop(struct
|
||||
if (timer_table->timer_mask.val == 0) {
|
||||
ath9k_hw_disable_interrupts(ah);
|
||||
ah->imask &= ~ATH9K_INT_GENTIMER;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
}
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -273,7 +273,7 @@ static bool ath_complete_reset(struct at
|
||||
|
||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||
sc->config.txpowlimit, &sc->curtxpow);
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
|
||||
if (!(sc->sc_flags & (SC_OP_OFFCHANNEL)) && start) {
|
||||
@@ -833,7 +833,7 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
|
||||
if (status & ATH9K_INT_RXEOL) {
|
||||
ah->imask &= ~(ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
}
|
||||
|
||||
if (status & ATH9K_INT_MIB) {
|
||||
@@ -1409,7 +1409,7 @@ static void ath9k_calculate_summary_stat
|
||||
ah->imask &= ~ATH9K_INT_TSFOOR;
|
||||
}
|
||||
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
|
||||
/* Set up ANI */
|
||||
if (iter_data.naps > 0) {
|
||||
@@ -1566,7 +1566,7 @@ static void ath9k_enable_ps(struct ath_s
|
||||
if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
|
||||
if ((ah->imask & ATH9K_INT_TIM_TIMER) == 0) {
|
||||
ah->imask |= ATH9K_INT_TIM_TIMER;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
}
|
||||
ath9k_hw_setrxabort(ah, 1);
|
||||
}
|
||||
@@ -1586,7 +1586,7 @@ static void ath9k_disable_ps(struct ath_
|
||||
PS_WAIT_FOR_TX_ACK);
|
||||
if (ah->imask & ATH9K_INT_TIM_TIMER) {
|
||||
ah->imask &= ~ATH9K_INT_TIM_TIMER;
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
}
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -1974,7 +1974,7 @@ requeue:
|
||||
|
||||
if (!(ah->imask & ATH9K_INT_RXEOL)) {
|
||||
ah->imask |= (ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
|
||||
- ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
+ ath9k_hw_set_interrupts(ah);
|
||||
}
|
||||
|
||||
return 0;
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.c
|
||||
@@ -827,9 +827,9 @@ void ath9k_hw_enable_interrupts(struct a
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_enable_interrupts);
|
||||
|
||||
-void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
|
||||
+void ath9k_hw_set_interrupts(struct ath_hw *ah)
|
||||
{
|
||||
- enum ath9k_int omask = ah->imask;
|
||||
+ enum ath9k_int ints = ah->imask;
|
||||
u32 mask, mask2;
|
||||
struct ath9k_hw_capabilities *pCap = &ah->caps;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -837,7 +837,7 @@ void ath9k_hw_set_interrupts(struct ath_
|
||||
if (!(ints & ATH9K_INT_GLOBAL))
|
||||
ath9k_hw_disable_interrupts(ah);
|
||||
|
||||
- ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints);
|
||||
+ ath_dbg(common, ATH_DBG_INTERRUPT, "New interrupt mask 0x%x\n", ints);
|
||||
|
||||
mask = ints & ATH9K_INT_COMMON;
|
||||
mask2 = 0;
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.h
|
||||
@@ -735,7 +735,7 @@ int ath9k_hw_beaconq_setup(struct ath_hw
|
||||
|
||||
/* Interrupt Handling */
|
||||
bool ath9k_hw_intrpend(struct ath_hw *ah);
|
||||
-void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints);
|
||||
+void ath9k_hw_set_interrupts(struct ath_hw *ah);
|
||||
void ath9k_hw_enable_interrupts(struct ath_hw *ah);
|
||||
void ath9k_hw_disable_interrupts(struct ath_hw *ah);
|
||||
|
|
@ -1,627 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -71,7 +71,6 @@ struct ath_regulatory {
|
||||
char alpha2[2];
|
||||
u16 country_code;
|
||||
u16 max_power_level;
|
||||
- u32 tp_scale;
|
||||
u16 current_rd;
|
||||
u16 current_rd_ext;
|
||||
int16_t power_limit;
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3040,6 +3040,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(st
|
||||
return (pBase->miscConfiguration >> 0x3) & 0x1;
|
||||
case EEP_ANT_DIV_CTL1:
|
||||
return eep->base_ext1.ant_div_control;
|
||||
+ case EEP_ANTENNA_GAIN_5G:
|
||||
+ return eep->modalHeader5G.antennaGain;
|
||||
+ case EEP_ANTENNA_GAIN_2G:
|
||||
+ return eep->modalHeader2G.antennaGain;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -4727,20 +4731,14 @@ static u16 ar9003_hw_get_max_edge_power(
|
||||
static void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan,
|
||||
u8 *pPwrArray, u16 cfgCtl,
|
||||
- u8 twiceAntennaReduction,
|
||||
- u8 twiceMaxRegulatoryPower,
|
||||
+ u8 antenna_reduction,
|
||||
u16 powerLimit)
|
||||
{
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep;
|
||||
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||||
- static const u16 tpScaleReductionTable[5] = {
|
||||
- 0, 3, 6, 9, MAX_RATE_POWER
|
||||
- };
|
||||
int i;
|
||||
- int16_t twiceLargestAntenna;
|
||||
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||||
+ u16 scaledPower = 0, minCtlPower;
|
||||
static const u16 ctlModesFor11a[] = {
|
||||
CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
|
||||
};
|
||||
@@ -4758,28 +4756,7 @@ static void ar9003_hw_set_power_per_rate
|
||||
bool is2ghz = IS_CHAN_2GHZ(chan);
|
||||
|
||||
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||||
-
|
||||
- /* Compute TxPower reduction due to Antenna Gain */
|
||||
- if (is2ghz)
|
||||
- twiceLargestAntenna = pEepData->modalHeader2G.antennaGain;
|
||||
- else
|
||||
- twiceLargestAntenna = pEepData->modalHeader5G.antennaGain;
|
||||
-
|
||||
- twiceLargestAntenna = (int16_t)min((twiceAntennaReduction) -
|
||||
- twiceLargestAntenna, 0);
|
||||
-
|
||||
- /*
|
||||
- * scaledPower is the minimum of the user input power level
|
||||
- * and the regulatory allowed power level
|
||||
- */
|
||||
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||||
-
|
||||
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
|
||||
- maxRegAllowedPower -=
|
||||
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||||
- }
|
||||
-
|
||||
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||||
+ scaledPower = powerLimit - antenna_reduction;
|
||||
|
||||
/*
|
||||
* Reduce scaled Power by number of chains active to get
|
||||
@@ -4966,7 +4943,6 @@ static inline u8 mcsidx_to_tgtpwridx(uns
|
||||
static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan, u16 cfgCtl,
|
||||
u8 twiceAntennaReduction,
|
||||
- u8 twiceMaxRegulatoryPower,
|
||||
u8 powerLimit, bool test)
|
||||
{
|
||||
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
@@ -5019,7 +4995,6 @@ static void ath9k_hw_ar9300_set_txpower(
|
||||
ar9003_hw_set_power_per_rate_table(ah, chan,
|
||||
targetPowerValT2, cfgCtl,
|
||||
twiceAntennaReduction,
|
||||
- twiceMaxRegulatoryPower,
|
||||
powerLimit);
|
||||
|
||||
if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) {
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -429,7 +429,6 @@ static void ath9k_hw_init_defaults(struc
|
||||
|
||||
regulatory->country_code = CTRY_DEFAULT;
|
||||
regulatory->power_limit = MAX_RATE_POWER;
|
||||
- regulatory->tp_scale = ATH9K_TP_SCALE_MAX;
|
||||
|
||||
ah->hw_version.magic = AR5416_MAGIC;
|
||||
ah->hw_version.subvendorid = 0;
|
||||
@@ -1396,9 +1395,7 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
static bool ath9k_hw_channel_change(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
- struct ieee80211_channel *channel = chan->chan;
|
||||
u32 qnum;
|
||||
int r;
|
||||
|
||||
@@ -1423,14 +1420,7 @@ static bool ath9k_hw_channel_change(stru
|
||||
return false;
|
||||
}
|
||||
ath9k_hw_set_clockrate(ah);
|
||||
-
|
||||
- ah->eep_ops->set_txpower(ah, chan,
|
||||
- ath9k_regd_get_ctl(regulatory, chan),
|
||||
- channel->max_antenna_gain * 2,
|
||||
- channel->max_power * 2,
|
||||
- min((u32) MAX_RATE_POWER,
|
||||
- (u32) regulatory->power_limit), false);
|
||||
-
|
||||
+ ath9k_hw_apply_txpower(ah, chan);
|
||||
ath9k_hw_rfbus_done(ah);
|
||||
|
||||
if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
|
||||
@@ -2466,23 +2456,56 @@ bool ath9k_hw_disable(struct ath_hw *ah)
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_disable);
|
||||
|
||||
+static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
+{
|
||||
+ enum eeprom_param gain_param;
|
||||
+
|
||||
+ if (IS_CHAN_2GHZ(chan))
|
||||
+ gain_param = EEP_ANTENNA_GAIN_2G;
|
||||
+ else
|
||||
+ gain_param = EEP_ANTENNA_GAIN_5G;
|
||||
+
|
||||
+ return ah->eep_ops->get_eeprom(ah, gain_param);
|
||||
+}
|
||||
+
|
||||
+void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
+{
|
||||
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
+ struct ieee80211_channel *channel;
|
||||
+ int chan_pwr, new_pwr, max_gain;
|
||||
+ int ant_gain, ant_reduction = 0;
|
||||
+
|
||||
+ if (!chan)
|
||||
+ return;
|
||||
+
|
||||
+ channel = chan->chan;
|
||||
+ chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||||
+ new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
+ max_gain = chan_pwr - new_pwr + channel->max_antenna_gain * 2;
|
||||
+
|
||||
+ ant_gain = get_antenna_gain(ah, chan);
|
||||
+ if (ant_gain > max_gain)
|
||||
+ ant_reduction = ant_gain - max_gain;
|
||||
+
|
||||
+ ah->eep_ops->set_txpower(ah, chan,
|
||||
+ ath9k_regd_get_ctl(reg, chan),
|
||||
+ ant_reduction, new_pwr, false);
|
||||
+}
|
||||
+
|
||||
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
|
||||
{
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
struct ath9k_channel *chan = ah->curchan;
|
||||
struct ieee80211_channel *channel = chan->chan;
|
||||
- int reg_pwr = min_t(int, MAX_RATE_POWER, limit);
|
||||
- int chan_pwr = channel->max_power * 2;
|
||||
|
||||
+ reg->power_limit = min_t(int, limit, MAX_RATE_POWER);
|
||||
if (test)
|
||||
- reg_pwr = chan_pwr = MAX_RATE_POWER;
|
||||
+ channel->max_power = MAX_RATE_POWER / 2;
|
||||
|
||||
- regulatory->power_limit = reg_pwr;
|
||||
+ ath9k_hw_apply_txpower(ah, chan);
|
||||
|
||||
- ah->eep_ops->set_txpower(ah, chan,
|
||||
- ath9k_regd_get_ctl(regulatory, chan),
|
||||
- channel->max_antenna_gain * 2,
|
||||
- chan_pwr, reg_pwr, test);
|
||||
+ if (test)
|
||||
+ channel->max_power = DIV_ROUND_UP(reg->max_power_level, 2);
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -389,14 +389,6 @@ enum ath9k_power_mode {
|
||||
ATH9K_PM_UNDEFINED
|
||||
};
|
||||
|
||||
-enum ath9k_tp_scale {
|
||||
- ATH9K_TP_SCALE_MAX = 0,
|
||||
- ATH9K_TP_SCALE_50,
|
||||
- ATH9K_TP_SCALE_25,
|
||||
- ATH9K_TP_SCALE_12,
|
||||
- ATH9K_TP_SCALE_MIN
|
||||
-};
|
||||
-
|
||||
enum ser_reg_mode {
|
||||
SER_REG_MODE_OFF = 0,
|
||||
SER_REG_MODE_ON = 1,
|
||||
@@ -964,6 +956,7 @@ void ath9k_hw_htc_resetinit(struct ath_h
|
||||
/* PHY */
|
||||
void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
|
||||
u32 *coef_mantissa, u32 *coef_exponent);
|
||||
+void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan);
|
||||
|
||||
/*
|
||||
* Code Specific to AR5008, AR9001 or AR9002,
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
@@ -350,6 +350,8 @@ static u32 ath9k_hw_4k_get_eeprom(struct
|
||||
return pModal->antdiv_ctl1;
|
||||
case EEP_TXGAIN_TYPE:
|
||||
return pBase->txGainType;
|
||||
+ case EEP_ANTENNA_GAIN_2G:
|
||||
+ return pModal->antennaGainCh[0];
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -462,8 +464,7 @@ static void ath9k_hw_set_4k_power_per_ra
|
||||
struct ath9k_channel *chan,
|
||||
int16_t *ratesArray,
|
||||
u16 cfgCtl,
|
||||
- u16 AntennaReduction,
|
||||
- u16 twiceMaxRegulatoryPower,
|
||||
+ u16 antenna_reduction,
|
||||
u16 powerLimit)
|
||||
{
|
||||
#define CMP_TEST_GRP \
|
||||
@@ -472,20 +473,16 @@ static void ath9k_hw_set_4k_power_per_ra
|
||||
|| (((cfgCtl & ~CTL_MODE_M) | (pCtlMode[ctlMode] & CTL_MODE_M)) == \
|
||||
((pEepData->ctlIndex[i] & CTL_MODE_M) | SD_NO_CTL))
|
||||
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
int i;
|
||||
- int16_t twiceLargestAntenna;
|
||||
u16 twiceMinEdgePower;
|
||||
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||||
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||||
+ u16 scaledPower = 0, minCtlPower;
|
||||
u16 numCtlModes;
|
||||
const u16 *pCtlMode;
|
||||
u16 ctlMode, freq;
|
||||
struct chan_centers centers;
|
||||
struct cal_ctl_data_4k *rep;
|
||||
struct ar5416_eeprom_4k *pEepData = &ah->eeprom.map4k;
|
||||
- static const u16 tpScaleReductionTable[5] =
|
||||
- { 0, 3, 6, 9, MAX_RATE_POWER };
|
||||
struct cal_target_power_leg targetPowerOfdm, targetPowerCck = {
|
||||
0, { 0, 0, 0, 0}
|
||||
};
|
||||
@@ -503,19 +500,7 @@ static void ath9k_hw_set_4k_power_per_ra
|
||||
|
||||
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||||
|
||||
- twiceLargestAntenna = pEepData->modalHeader.antennaGainCh[0];
|
||||
- twiceLargestAntenna = (int16_t)min(AntennaReduction -
|
||||
- twiceLargestAntenna, 0);
|
||||
-
|
||||
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||||
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
|
||||
- maxRegAllowedPower -=
|
||||
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||||
- }
|
||||
-
|
||||
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||||
- scaledPower = max((u16)0, scaledPower);
|
||||
-
|
||||
+ scaledPower = powerLimit - antenna_reduction;
|
||||
numCtlModes = ARRAY_SIZE(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40;
|
||||
pCtlMode = ctlModesFor11g;
|
||||
|
||||
@@ -671,7 +656,6 @@ static void ath9k_hw_4k_set_txpower(stru
|
||||
struct ath9k_channel *chan,
|
||||
u16 cfgCtl,
|
||||
u8 twiceAntennaReduction,
|
||||
- u8 twiceMaxRegulatoryPower,
|
||||
u8 powerLimit, bool test)
|
||||
{
|
||||
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
@@ -691,7 +675,6 @@ static void ath9k_hw_4k_set_txpower(stru
|
||||
ath9k_hw_set_4k_power_per_rate_table(ah, chan,
|
||||
&ratesArray[0], cfgCtl,
|
||||
twiceAntennaReduction,
|
||||
- twiceMaxRegulatoryPower,
|
||||
powerLimit);
|
||||
|
||||
ath9k_hw_set_4k_power_cal_table(ah, chan);
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
@@ -336,6 +336,9 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
|
||||
return pBase->tempSensSlopePalOn;
|
||||
else
|
||||
return 0;
|
||||
+ case EEP_ANTENNA_GAIN_2G:
|
||||
+ return max_t(u8, pModal->antennaGainCh[0],
|
||||
+ pModal->antennaGainCh[1]);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -554,8 +557,7 @@ static void ath9k_hw_set_ar9287_power_pe
|
||||
struct ath9k_channel *chan,
|
||||
int16_t *ratesArray,
|
||||
u16 cfgCtl,
|
||||
- u16 AntennaReduction,
|
||||
- u16 twiceMaxRegulatoryPower,
|
||||
+ u16 antenna_reduction,
|
||||
u16 powerLimit)
|
||||
{
|
||||
#define CMP_CTL \
|
||||
@@ -569,12 +571,8 @@ static void ath9k_hw_set_ar9287_power_pe
|
||||
#define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6
|
||||
#define REDUCE_SCALED_POWER_BY_THREE_CHAIN 10
|
||||
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||||
- static const u16 tpScaleReductionTable[5] =
|
||||
- { 0, 3, 6, 9, MAX_RATE_POWER };
|
||||
int i;
|
||||
- int16_t twiceLargestAntenna;
|
||||
struct cal_ctl_data_ar9287 *rep;
|
||||
struct cal_target_power_leg targetPowerOfdm = {0, {0, 0, 0, 0} },
|
||||
targetPowerCck = {0, {0, 0, 0, 0} };
|
||||
@@ -582,7 +580,7 @@ static void ath9k_hw_set_ar9287_power_pe
|
||||
targetPowerCckExt = {0, {0, 0, 0, 0} };
|
||||
struct cal_target_power_ht targetPowerHt20,
|
||||
targetPowerHt40 = {0, {0, 0, 0, 0} };
|
||||
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||||
+ u16 scaledPower = 0, minCtlPower;
|
||||
static const u16 ctlModesFor11g[] = {
|
||||
CTL_11B, CTL_11G, CTL_2GHT20,
|
||||
CTL_11B_EXT, CTL_11G_EXT, CTL_2GHT40
|
||||
@@ -597,24 +595,7 @@ static void ath9k_hw_set_ar9287_power_pe
|
||||
tx_chainmask = ah->txchainmask;
|
||||
|
||||
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||||
-
|
||||
- /* Compute TxPower reduction due to Antenna Gain */
|
||||
- twiceLargestAntenna = max(pEepData->modalHeader.antennaGainCh[0],
|
||||
- pEepData->modalHeader.antennaGainCh[1]);
|
||||
- twiceLargestAntenna = (int16_t)min((AntennaReduction) -
|
||||
- twiceLargestAntenna, 0);
|
||||
-
|
||||
- /*
|
||||
- * scaledPower is the minimum of the user input power level
|
||||
- * and the regulatory allowed power level.
|
||||
- */
|
||||
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||||
-
|
||||
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX)
|
||||
- maxRegAllowedPower -=
|
||||
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||||
-
|
||||
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||||
+ scaledPower = powerLimit - antenna_reduction;
|
||||
|
||||
/*
|
||||
* Reduce scaled Power by number of chains active
|
||||
@@ -815,7 +796,6 @@ static void ath9k_hw_set_ar9287_power_pe
|
||||
static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan, u16 cfgCtl,
|
||||
u8 twiceAntennaReduction,
|
||||
- u8 twiceMaxRegulatoryPower,
|
||||
u8 powerLimit, bool test)
|
||||
{
|
||||
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
@@ -834,7 +814,6 @@ static void ath9k_hw_ar9287_set_txpower(
|
||||
ath9k_hw_set_ar9287_power_per_rate_table(ah, chan,
|
||||
&ratesArray[0], cfgCtl,
|
||||
twiceAntennaReduction,
|
||||
- twiceMaxRegulatoryPower,
|
||||
powerLimit);
|
||||
|
||||
ath9k_hw_set_ar9287_power_cal_table(ah, chan);
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
@@ -400,6 +400,7 @@ static u32 ath9k_hw_def_get_eeprom(struc
|
||||
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
||||
struct modal_eep_header *pModal = eep->modalHeader;
|
||||
struct base_eep_header *pBase = &eep->baseEepHeader;
|
||||
+ int band = 0;
|
||||
|
||||
switch (param) {
|
||||
case EEP_NFTHRESH_5:
|
||||
@@ -467,6 +468,14 @@ static u32 ath9k_hw_def_get_eeprom(struc
|
||||
return pBase->pwr_table_offset;
|
||||
else
|
||||
return AR5416_PWR_TABLE_OFFSET_DB;
|
||||
+ case EEP_ANTENNA_GAIN_2G:
|
||||
+ band = 1;
|
||||
+ /* fall through */
|
||||
+ case EEP_ANTENNA_GAIN_5G:
|
||||
+ return max_t(u8, max_t(u8,
|
||||
+ pModal[band].antennaGainCh[0],
|
||||
+ pModal[band].antennaGainCh[1]),
|
||||
+ pModal[band].antennaGainCh[2]);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -986,21 +995,15 @@ static void ath9k_hw_set_def_power_per_r
|
||||
struct ath9k_channel *chan,
|
||||
int16_t *ratesArray,
|
||||
u16 cfgCtl,
|
||||
- u16 AntennaReduction,
|
||||
- u16 twiceMaxRegulatoryPower,
|
||||
+ u16 antenna_reduction,
|
||||
u16 powerLimit)
|
||||
{
|
||||
#define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6 /* 10*log10(2)*2 */
|
||||
#define REDUCE_SCALED_POWER_BY_THREE_CHAIN 9 /* 10*log10(3)*2 */
|
||||
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
struct ar5416_eeprom_def *pEepData = &ah->eeprom.def;
|
||||
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||||
- static const u16 tpScaleReductionTable[5] =
|
||||
- { 0, 3, 6, 9, MAX_RATE_POWER };
|
||||
-
|
||||
int i;
|
||||
- int16_t twiceLargestAntenna;
|
||||
struct cal_ctl_data *rep;
|
||||
struct cal_target_power_leg targetPowerOfdm, targetPowerCck = {
|
||||
0, { 0, 0, 0, 0}
|
||||
@@ -1012,7 +1015,7 @@ static void ath9k_hw_set_def_power_per_r
|
||||
struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = {
|
||||
0, {0, 0, 0, 0}
|
||||
};
|
||||
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||||
+ u16 scaledPower = 0, minCtlPower;
|
||||
static const u16 ctlModesFor11a[] = {
|
||||
CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
|
||||
};
|
||||
@@ -1031,27 +1034,7 @@ static void ath9k_hw_set_def_power_per_r
|
||||
|
||||
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||||
|
||||
- twiceLargestAntenna = max(
|
||||
- pEepData->modalHeader
|
||||
- [IS_CHAN_2GHZ(chan)].antennaGainCh[0],
|
||||
- pEepData->modalHeader
|
||||
- [IS_CHAN_2GHZ(chan)].antennaGainCh[1]);
|
||||
-
|
||||
- twiceLargestAntenna = max((u8)twiceLargestAntenna,
|
||||
- pEepData->modalHeader
|
||||
- [IS_CHAN_2GHZ(chan)].antennaGainCh[2]);
|
||||
-
|
||||
- twiceLargestAntenna = (int16_t)min(AntennaReduction -
|
||||
- twiceLargestAntenna, 0);
|
||||
-
|
||||
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||||
-
|
||||
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
|
||||
- maxRegAllowedPower -=
|
||||
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||||
- }
|
||||
-
|
||||
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||||
+ scaledPower = powerLimit - antenna_reduction;
|
||||
|
||||
switch (ar5416_get_ntxchains(tx_chainmask)) {
|
||||
case 1:
|
||||
@@ -1256,7 +1239,6 @@ static void ath9k_hw_def_set_txpower(str
|
||||
struct ath9k_channel *chan,
|
||||
u16 cfgCtl,
|
||||
u8 twiceAntennaReduction,
|
||||
- u8 twiceMaxRegulatoryPower,
|
||||
u8 powerLimit, bool test)
|
||||
{
|
||||
#define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta)
|
||||
@@ -1278,7 +1260,6 @@ static void ath9k_hw_def_set_txpower(str
|
||||
ath9k_hw_set_def_power_per_rate_table(ah, chan,
|
||||
&ratesArray[0], cfgCtl,
|
||||
twiceAntennaReduction,
|
||||
- twiceMaxRegulatoryPower,
|
||||
powerLimit);
|
||||
|
||||
ath9k_hw_set_def_power_cal_table(ah, chan);
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
@@ -763,10 +763,8 @@ static void ar5008_hw_set_channel_regs(s
|
||||
static int ar5008_hw_process_ini(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
int i, regWrites = 0;
|
||||
- struct ieee80211_channel *channel = chan->chan;
|
||||
u32 modesIndex, freqIndex;
|
||||
|
||||
switch (chan->chanmode) {
|
||||
@@ -903,14 +901,7 @@ static int ar5008_hw_process_ini(struct
|
||||
ar5008_hw_set_channel_regs(ah, chan);
|
||||
ar5008_hw_init_chain_masks(ah);
|
||||
ath9k_olc_init(ah);
|
||||
-
|
||||
- /* Set TX power */
|
||||
- ah->eep_ops->set_txpower(ah, chan,
|
||||
- ath9k_regd_get_ctl(regulatory, chan),
|
||||
- channel->max_antenna_gain * 2,
|
||||
- channel->max_power * 2,
|
||||
- min((u32) MAX_RATE_POWER,
|
||||
- (u32) regulatory->power_limit), false);
|
||||
+ ath9k_hw_apply_txpower(ah, chan);
|
||||
|
||||
/* Write analog registers */
|
||||
if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) {
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||||
@@ -19,7 +19,6 @@
|
||||
|
||||
void ar9003_paprd_enable(struct ath_hw *ah, bool val)
|
||||
{
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
struct ath9k_channel *chan = ah->curchan;
|
||||
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||||
|
||||
@@ -54,13 +53,7 @@ void ar9003_paprd_enable(struct ath_hw *
|
||||
|
||||
if (val) {
|
||||
ah->paprd_table_write_done = true;
|
||||
-
|
||||
- ah->eep_ops->set_txpower(ah, chan,
|
||||
- ath9k_regd_get_ctl(regulatory, chan),
|
||||
- chan->chan->max_antenna_gain * 2,
|
||||
- chan->chan->max_power * 2,
|
||||
- min((u32) MAX_RATE_POWER,
|
||||
- (u32) regulatory->power_limit), false);
|
||||
+ ath9k_hw_apply_txpower(ah, chan);
|
||||
}
|
||||
|
||||
REG_RMW_FIELD(ah, AR_PHY_PAPRD_CTRL0_B0,
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -628,9 +628,7 @@ static void ar9003_hw_prog_ini(struct at
|
||||
static int ar9003_hw_process_ini(struct ath_hw *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||
unsigned int regWrites = 0, i;
|
||||
- struct ieee80211_channel *channel = chan->chan;
|
||||
u32 modesIndex;
|
||||
|
||||
switch (chan->chanmode) {
|
||||
@@ -683,14 +681,7 @@ static int ar9003_hw_process_ini(struct
|
||||
ar9003_hw_override_ini(ah);
|
||||
ar9003_hw_set_channel_regs(ah, chan);
|
||||
ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
|
||||
-
|
||||
- /* Set TX power */
|
||||
- ah->eep_ops->set_txpower(ah, chan,
|
||||
- ath9k_regd_get_ctl(regulatory, chan),
|
||||
- channel->max_antenna_gain * 2,
|
||||
- channel->max_power * 2,
|
||||
- min((u32) MAX_RATE_POWER,
|
||||
- (u32) regulatory->power_limit), false);
|
||||
+ ath9k_hw_apply_txpower(ah, chan);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/common.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common.c
|
||||
@@ -161,10 +161,12 @@ EXPORT_SYMBOL(ath9k_cmn_count_streams);
|
||||
void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow,
|
||||
u16 new_txpow, u16 *txpower)
|
||||
{
|
||||
- if (cur_txpow != new_txpow) {
|
||||
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
+
|
||||
+ if (reg->power_limit != new_txpow) {
|
||||
ath9k_hw_set_txpowerlimit(ah, new_txpow, false);
|
||||
/* read back in case value is clamped */
|
||||
- *txpower = ath9k_hw_regulatory(ah)->power_limit;
|
||||
+ *txpower = reg->max_power_level;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_cmn_update_txpow);
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||
@@ -253,7 +253,9 @@ enum eeprom_param {
|
||||
EEP_PAPRD,
|
||||
EEP_MODAL_VER,
|
||||
EEP_ANT_DIV_CTL1,
|
||||
- EEP_CHAIN_MASK_REDUCE
|
||||
+ EEP_CHAIN_MASK_REDUCE,
|
||||
+ EEP_ANTENNA_GAIN_2G,
|
||||
+ EEP_ANTENNA_GAIN_5G
|
||||
};
|
||||
|
||||
enum ar5416_rates {
|
||||
@@ -657,8 +659,7 @@ 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,
|
||||
- bool test);
|
||||
+ u8 powerLimit, bool test);
|
||||
u16 (*get_spur_channel)(struct ath_hw *ah, u16 i, bool is2GHz);
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -626,7 +626,6 @@ static void ath9k_init_band_txpower(stru
|
||||
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];
|
||||
@@ -635,7 +634,6 @@ static void ath9k_init_band_txpower(stru
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -72,7 +72,6 @@ struct ath_regulatory {
|
||||
u16 country_code;
|
||||
u16 max_power_level;
|
||||
u16 current_rd;
|
||||
- u16 current_rd_ext;
|
||||
int16_t power_limit;
|
||||
struct reg_dmn_pair_mapping *regpair;
|
||||
};
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2047,11 +2047,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||
eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
|
||||
regulatory->current_rd = eeval;
|
||||
|
||||
- eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_1);
|
||||
- if (AR_SREV_9285_12_OR_LATER(ah))
|
||||
- eeval |= AR9285_RDEXT_DEFAULT;
|
||||
- regulatory->current_rd_ext = eeval;
|
||||
-
|
||||
if (ah->opmode != NL80211_IFTYPE_AP &&
|
||||
ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
|
||||
if (regulatory->current_rd == 0x64 ||
|
||||
--- a/drivers/net/wireless/ath/carl9170/main.c
|
||||
+++ b/drivers/net/wireless/ath/carl9170/main.c
|
||||
@@ -1912,7 +1912,6 @@ static int carl9170_parse_eeprom(struct
|
||||
ar->hw->channel_change_time = 80 * 1000;
|
||||
|
||||
regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
|
||||
- regulatory->current_rd_ext = le16_to_cpu(ar->eeprom.reg_domain[1]);
|
||||
|
||||
/* second part of wiphy init */
|
||||
SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address);
|
|
@ -1,54 +0,0 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
@@ -415,8 +415,6 @@ static u32 ath9k_hw_def_get_eeprom(struc
|
||||
return get_unaligned_be16(pBase->macAddr + 4);
|
||||
case EEP_REG_0:
|
||||
return pBase->regDmn[0];
|
||||
- case EEP_REG_1:
|
||||
- return pBase->regDmn[1];
|
||||
case EEP_OP_CAP:
|
||||
return pBase->deviceCap;
|
||||
case EEP_OP_MODE:
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
@@ -322,8 +322,6 @@ static u32 ath9k_hw_4k_get_eeprom(struct
|
||||
return get_unaligned_be16(pBase->macAddr + 4);
|
||||
case EEP_REG_0:
|
||||
return pBase->regDmn[0];
|
||||
- case EEP_REG_1:
|
||||
- return pBase->regDmn[1];
|
||||
case EEP_OP_CAP:
|
||||
return pBase->deviceCap;
|
||||
case EEP_OP_MODE:
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
@@ -308,8 +308,6 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
|
||||
return get_unaligned_be16(pBase->macAddr + 4);
|
||||
case EEP_REG_0:
|
||||
return pBase->regDmn[0];
|
||||
- case EEP_REG_1:
|
||||
- return pBase->regDmn[1];
|
||||
case EEP_OP_CAP:
|
||||
return pBase->deviceCap;
|
||||
case EEP_OP_MODE:
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3014,8 +3014,6 @@ static u32 ath9k_hw_ar9300_get_eeprom(st
|
||||
return get_unaligned_be16(eep->macAddr + 4);
|
||||
case EEP_REG_0:
|
||||
return le16_to_cpu(pBase->regDmn[0]);
|
||||
- case EEP_REG_1:
|
||||
- return le16_to_cpu(pBase->regDmn[1]);
|
||||
case EEP_OP_CAP:
|
||||
return pBase->deviceCap;
|
||||
case EEP_OP_MODE:
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||
@@ -225,7 +225,6 @@ enum eeprom_param {
|
||||
EEP_MAC_MID,
|
||||
EEP_MAC_LSW,
|
||||
EEP_REG_0,
|
||||
- EEP_REG_1,
|
||||
EEP_OP_CAP,
|
||||
EEP_OP_MODE,
|
||||
EEP_RF_SILENT,
|
|
@ -1,6 +1,6 @@
|
|||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -574,6 +574,7 @@ CONFIG_RT2X00=y
|
||||
@@ -573,6 +573,7 @@ CONFIG_RT2X00=y
|
||||
CONFIG_RT2X00_LIB=m
|
||||
CONFIG_RT2800_LIB=m
|
||||
CONFIG_RT2X00_LIB_FIRMWARE=y
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/mwl8k.c
|
||||
+++ b/drivers/net/wireless/mwl8k.c
|
||||
@@ -5192,6 +5192,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
@@ -5193,6 +5193,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -753,6 +753,7 @@ struct b43_wldev {
|
||||
@@ -791,6 +791,7 @@ struct b43_wldev {
|
||||
bool qos_enabled; /* TRUE, if QoS is used. */
|
||||
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||
bool use_pio; /* TRUE if next init should use PIO */
|
||||
|
@ -22,7 +22,7 @@
|
|||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -2679,10 +2684,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
@@ -2686,10 +2691,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
& ~B43_MACCTL_GPOUTSMSK);
|
||||
|
||||
b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK)
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
b43-$(CONFIG_B43_PCMCIA) += pcmcia.o
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -1886,9 +1886,11 @@ static void b43_do_interrupt_thread(stru
|
||||
@@ -1893,9 +1893,11 @@ static void b43_do_interrupt_thread(stru
|
||||
dma_reason[4], dma_reason[5]);
|
||||
b43err(dev->wl, "This device does not support DMA "
|
||||
"on your system. It will now be switched to PIO.\n");
|
||||
|
|
Loading…
Reference in a new issue