summaryrefslogtreecommitdiff
path: root/package/mac80211/patches/310-pending_work.patch
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-11-20 02:26:41 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-11-20 02:26:41 +0000
commit27c672d4b0d460875b9c10e00ffd4927da97f52b (patch)
treede4b615994ff60c42e04d992b31774cac8c5b0d2 /package/mac80211/patches/310-pending_work.patch
parenta30e2b06afc845e73f993829d53bcc6391643373 (diff)
mac80211: update to latest wireless-testing + more stability work
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@24044 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/patches/310-pending_work.patch')
-rw-r--r--package/mac80211/patches/310-pending_work.patch305
1 files changed, 0 insertions, 305 deletions
diff --git a/package/mac80211/patches/310-pending_work.patch b/package/mac80211/patches/310-pending_work.patch
deleted file mode 100644
index 96918888d3..0000000000
--- a/package/mac80211/patches/310-pending_work.patch
+++ /dev/null
@@ -1,305 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-@@ -3271,6 +3271,18 @@ static bool ar9300_check_eeprom_header(s
- return ar9300_check_header(header);
- }
-
-+static int ar9300_eeprom_restore_flash(struct ath_hw *ah, u8 *mptr,
-+ int mdata_size)
-+{
-+ struct ath_common *common = ath9k_hw_common(ah);
-+ u16 *data = (u16 *) mptr;
-+ int i;
-+
-+ for (i = 0; i < mdata_size / 2; i++, data++)
-+ ath9k_hw_nvram_read(common, i, data);
-+
-+ return 0;
-+}
- /*
- * Read the configuration data from the eeprom.
- * The data can be put in any specified memory buffer.
-@@ -3293,6 +3305,9 @@ static int ar9300_eeprom_restore_interna
- struct ath_common *common = ath9k_hw_common(ah);
- eeprom_read_op read;
-
-+ if (ath9k_hw_use_flash(ah))
-+ return ar9300_eeprom_restore_flash(ah, mptr, mdata_size);
-+
- word = kzalloc(2048, GFP_KERNEL);
- if (!word)
- return -1;
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -419,10 +419,6 @@ static void ath9k_hw_init_defaults(struc
- ah->hw_version.magic = AR5416_MAGIC;
- ah->hw_version.subvendorid = 0;
-
-- ah->ah_flags = 0;
-- if (!AR_SREV_9100(ah))
-- ah->ah_flags = AH_USE_EEPROM;
--
- ah->atim_window = 0;
- ah->sta_id1_defaults =
- AR_STA_ID1_CRPT_MIC_ENABLE |
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -533,6 +533,9 @@ static int ath9k_init_softc(u16 devid, s
- ah->hw_version.subsysid = subsysid;
- sc->sc_ah = ah;
-
-+ if (!sc->dev->platform_data)
-+ ah->ah_flags |= AH_USE_EEPROM;
-+
- common = ath9k_hw_common(ah);
- common->ops = &ath9k_common_ops;
- common->bus_ops = bus_ops;
---- a/drivers/net/wireless/ath/ath9k/pci.c
-+++ b/drivers/net/wireless/ath/ath9k/pci.c
-@@ -16,6 +16,7 @@
-
- #include <linux/nl80211.h>
- #include <linux/pci.h>
-+#include <linux/ath9k_platform.h>
- #include "ath9k.h"
-
- static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
-@@ -53,21 +54,36 @@ static void ath_pci_read_cachesize(struc
-
- static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
- {
-- struct ath_hw *ah = (struct ath_hw *) common->ah;
-+ struct ath_softc *sc = (struct ath_softc *) common->priv;
-+ struct ath9k_platform_data *pdata = sc->dev->platform_data;
-
-- common->ops->read(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
-+ if (pdata) {
-+ if (off >= (ARRAY_SIZE(pdata->eeprom_data))) {
-+ ath_print(common, ATH_DBG_FATAL,
-+ "%s: eeprom read failed, offset %08x "
-+ "is out of range\n",
-+ __func__, off);
-+ }
-+
-+ *data = pdata->eeprom_data[off];
-+ } else {
-+ struct ath_hw *ah = (struct ath_hw *) common->ah;
-+
-+ common->ops->read(ah, AR5416_EEPROM_OFFSET +
-+ (off << AR5416_EEPROM_S));
-+
-+ if (!ath9k_hw_wait(ah,
-+ AR_EEPROM_STATUS_DATA,
-+ AR_EEPROM_STATUS_DATA_BUSY |
-+ AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
-+ AH_WAIT_TIMEOUT)) {
-+ return false;
-+ }
-
-- if (!ath9k_hw_wait(ah,
-- AR_EEPROM_STATUS_DATA,
-- AR_EEPROM_STATUS_DATA_BUSY |
-- AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
-- AH_WAIT_TIMEOUT)) {
-- return false;
-+ *data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA),
-+ AR_EEPROM_STATUS_DATA_VAL);
- }
-
-- *data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA),
-- AR_EEPROM_STATUS_DATA_VAL);
--
- return true;
- }
-
---- a/include/net/regulatory.h
-+++ b/include/net/regulatory.h
-@@ -43,6 +43,12 @@ enum environment_cap {
- * @intersect: indicates whether the wireless core should intersect
- * the requested regulatory domain with the presently set regulatory
- * domain.
-+ * @processed: indicates whether or not this requests has already been
-+ * processed. When the last request is processed it means that the
-+ * currently regulatory domain set on cfg80211 is updated from
-+ * CRDA and can be used by other regulatory requests. When a
-+ * the last request is not yet processed we must yield until it
-+ * is processed before processing any new requests.
- * @country_ie_checksum: checksum of the last processed and accepted
- * country IE
- * @country_ie_env: lets us know if the AP is telling us we are outdoor,
-@@ -54,6 +60,7 @@ struct regulatory_request {
- enum nl80211_reg_initiator initiator;
- char alpha2[2];
- bool intersect;
-+ bool processed;
- enum environment_cap country_ie_env;
- struct list_head list;
- };
---- a/net/wireless/reg.c
-+++ b/net/wireless/reg.c
-@@ -96,6 +96,9 @@ struct reg_beacon {
- struct ieee80211_channel chan;
- };
-
-+static void reg_todo(struct work_struct *work);
-+static DECLARE_WORK(reg_work, reg_todo);
-+
- /* We keep a static world regulatory domain in case of the absence of CRDA */
- static const struct ieee80211_regdomain world_regdom = {
- .n_reg_rules = 5,
-@@ -1317,6 +1320,21 @@ static int ignore_request(struct wiphy *
- return -EINVAL;
- }
-
-+static void reg_set_request_processed(void)
-+{
-+ bool need_more_processing = false;
-+
-+ last_request->processed = true;
-+
-+ spin_lock(&reg_requests_lock);
-+ if (!list_empty(&reg_requests_list))
-+ need_more_processing = true;
-+ spin_unlock(&reg_requests_lock);
-+
-+ if (need_more_processing)
-+ schedule_work(&reg_work);
-+}
-+
- /**
- * __regulatory_hint - hint to the wireless core a regulatory domain
- * @wiphy: if the hint comes from country information from an AP, this
-@@ -1392,8 +1410,10 @@ new_request:
- * have applied the requested regulatory domain before we just
- * inform userspace we have processed the request
- */
-- if (r == -EALREADY)
-+ if (r == -EALREADY) {
- nl80211_send_reg_change_event(last_request);
-+ reg_set_request_processed();
-+ }
- return r;
- }
-
-@@ -1409,16 +1429,13 @@ static void reg_process_hint(struct regu
-
- BUG_ON(!reg_request->alpha2);
-
-- mutex_lock(&cfg80211_mutex);
-- mutex_lock(&reg_mutex);
--
- if (wiphy_idx_valid(reg_request->wiphy_idx))
- wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
-
- if (reg_request->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
- !wiphy) {
- kfree(reg_request);
-- goto out;
-+ return;
- }
-
- r = __regulatory_hint(wiphy, reg_request);
-@@ -1426,28 +1443,46 @@ static void reg_process_hint(struct regu
- if (r == -EALREADY && wiphy &&
- wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY)
- wiphy_update_regulatory(wiphy, initiator);
--out:
-- mutex_unlock(&reg_mutex);
-- mutex_unlock(&cfg80211_mutex);
- }
-
--/* Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_* */
-+/*
-+ * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_*
-+ * Regulatory hints come on a first come first serve basis and we
-+ * must process each one atomically.
-+ */
- static void reg_process_pending_hints(void)
-- {
-+{
- struct regulatory_request *reg_request;
-
-+ mutex_lock(&cfg80211_mutex);
-+ mutex_lock(&reg_mutex);
-+
-+ /* When last_request->processed becomes true this will be rescheduled */
-+ if (last_request && !last_request->processed) {
-+ REG_DBG_PRINT("Pending regulatory request, waiting "
-+ "for it to be processed...");
-+ goto out;
-+ }
-+
- spin_lock(&reg_requests_lock);
-- while (!list_empty(&reg_requests_list)) {
-- reg_request = list_first_entry(&reg_requests_list,
-- struct regulatory_request,
-- list);
-- list_del_init(&reg_request->list);
-
-+ if (list_empty(&reg_requests_list)) {
- spin_unlock(&reg_requests_lock);
-- reg_process_hint(reg_request);
-- spin_lock(&reg_requests_lock);
-+ goto out;
- }
-+
-+ reg_request = list_first_entry(&reg_requests_list,
-+ struct regulatory_request,
-+ list);
-+ list_del_init(&reg_request->list);
-+
- spin_unlock(&reg_requests_lock);
-+
-+ reg_process_hint(reg_request);
-+
-+out:
-+ mutex_unlock(&reg_mutex);
-+ mutex_unlock(&cfg80211_mutex);
- }
-
- /* Processes beacon hints -- this has nothing to do with country IEs */
-@@ -1494,8 +1529,6 @@ static void reg_todo(struct work_struct
- reg_process_pending_beacon_hints();
- }
-
--static DECLARE_WORK(reg_work, reg_todo);
--
- static void queue_regulatory_request(struct regulatory_request *request)
- {
- if (isalpha(request->alpha2[0]))
-@@ -1530,12 +1563,7 @@ static int regulatory_hint_core(const ch
- request->alpha2[1] = alpha2[1];
- request->initiator = NL80211_REGDOM_SET_BY_CORE;
-
-- /*
-- * This ensures last_request is populated once modules
-- * come swinging in and calling regulatory hints and
-- * wiphy_apply_custom_regulatory().
-- */
-- reg_process_hint(request);
-+ queue_regulatory_request(request);
-
- return 0;
- }
-@@ -2061,6 +2089,8 @@ int set_regdom(const struct ieee80211_re
-
- nl80211_send_reg_change_event(last_request);
-
-+ reg_set_request_processed();
-+
- mutex_unlock(&reg_mutex);
-
- return r;
---- a/net/wireless/chan.c
-+++ b/net/wireless/chan.c
-@@ -54,8 +54,10 @@ static bool can_beacon_sec_chan(struct w
- switch (channel_type) {
- case NL80211_CHAN_HT40PLUS:
- diff = 20;
-+ break;
- case NL80211_CHAN_HT40MINUS:
- diff = -20;
-+ break;
- default:
- return false;
- }