From 250cb956cb396c0b945009c5fcceeb17bc724881 Mon Sep 17 00:00:00 2001 From: nbd Date: Mon, 26 Jul 2010 21:59:27 +0000 Subject: [PATCH] mac80211: backport latest version from trunk into backfire git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@22391 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/Makefile | 4 +- .../mac80211/patches/120-pm_qos_params.patch | 61 +++ .../408-ath9k_tweak_rx_intr_mitigation.patch | 2 +- .../patches/450-add-ath5k-platform.patch | 35 ++ ...add-platform-eeprom-support-to-ath5k.patch | 57 +++ .../patches/510-ath9k_aggr_buffer_leak.patch | 68 --- ...s.patch => 510-ath9k_handle_keymiss.patch} | 2 +- .../511-ath9k_completion_buffer_leak.patch | 21 - .../520-ath9k_ar9285_diversity_fix.patch | 77 ---- .../mac80211/patches/520-ath9k_leak_fix.patch | 32 ++ .../patches/521-ath9k_iqcal_fix.patch | 11 - .../patches/522-ath9k_pwrcal_fix.patch | 11 - .../523-ath9k_channel_change_fix.patch | 15 - .../524-ath9k_aggr_status_validate.patch | 51 --- .../patches/526-ath9k_improve_nf_cal.patch | 399 ------------------ .../mac80211/patches/530-ath9k_aggr_fix.patch | 35 -- .../mac80211/patches/530-ath9k_nf_fix.patch | 46 ++ .../patches/531-ath9k_nf_cleanup.patch | 30 ++ ...e-pci-code-if-CONFIG_PCI-not-defined.patch | 4 +- .../601-rt2x00-fix-hang-on-ifdown.patch | 29 -- ...et_pci_mwi.patch => 610-set_pci_mwi.patch} | 2 +- .../patches/800-mac80211_aggr_fix.patch | 20 + 22 files changed, 288 insertions(+), 724 deletions(-) create mode 100644 package/mac80211/patches/120-pm_qos_params.patch create mode 100644 package/mac80211/patches/450-add-ath5k-platform.patch create mode 100644 package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch delete mode 100644 package/mac80211/patches/510-ath9k_aggr_buffer_leak.patch rename package/mac80211/patches/{525-ath9k_handle_keymiss.patch => 510-ath9k_handle_keymiss.patch} (92%) delete mode 100644 package/mac80211/patches/511-ath9k_completion_buffer_leak.patch delete mode 100644 package/mac80211/patches/520-ath9k_ar9285_diversity_fix.patch create mode 100644 package/mac80211/patches/520-ath9k_leak_fix.patch delete mode 100644 package/mac80211/patches/521-ath9k_iqcal_fix.patch delete mode 100644 package/mac80211/patches/522-ath9k_pwrcal_fix.patch delete mode 100644 package/mac80211/patches/523-ath9k_channel_change_fix.patch delete mode 100644 package/mac80211/patches/524-ath9k_aggr_status_validate.patch delete mode 100644 package/mac80211/patches/526-ath9k_improve_nf_cal.patch delete mode 100644 package/mac80211/patches/530-ath9k_aggr_fix.patch create mode 100644 package/mac80211/patches/530-ath9k_nf_fix.patch create mode 100644 package/mac80211/patches/531-ath9k_nf_cleanup.patch delete mode 100644 package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch rename package/mac80211/patches/{750-set_pci_mwi.patch => 610-set_pci_mwi.patch} (84%) create mode 100644 package/mac80211/patches/800-mac80211_aggr_fix.patch diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index c8c6998ce..7dd953882 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2010-07-06 +PKG_VERSION:=2010-07-16 PKG_RELEASE:=1 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources # http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \ # http://wireless.kernel.org/download/compat-wireless-2.6 -PKG_MD5SUM:=e669e4c2ed4f0cc9a6a28e941d766eac +PKG_MD5SUM:=f0eb07a207d1f3675787a466c838b777 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) diff --git a/package/mac80211/patches/120-pm_qos_params.patch b/package/mac80211/patches/120-pm_qos_params.patch new file mode 100644 index 000000000..8562992a5 --- /dev/null +++ b/package/mac80211/patches/120-pm_qos_params.patch @@ -0,0 +1,61 @@ +--- a/drivers/net/wireless/ipw2x00/ipw2100.c ++++ b/drivers/net/wireless/ipw2x00/ipw2100.c +@@ -174,7 +174,9 @@ that only one external action is invoked + #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver" + #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + struct pm_qos_request_list *ipw2100_pm_qos_req; ++#endif + + /* Debugging stuff */ + #ifdef CONFIG_IPW2100_DEBUG +@@ -1741,7 +1743,11 @@ static int ipw2100_up(struct ipw2100_pri + /* the ipw2100 hardware really doesn't want power management delays + * longer than 175usec + */ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + pm_qos_update_request(ipw2100_pm_qos_req, 175); ++#else ++ pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", 175); ++#endif + + /* If the interrupt is enabled, turn it off... */ + spin_lock_irqsave(&priv->low_lock, flags); +@@ -1889,7 +1895,12 @@ static void ipw2100_down(struct ipw2100_ + ipw2100_disable_interrupts(priv); + spin_unlock_irqrestore(&priv->low_lock, flags); + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + pm_qos_update_request(ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE); ++#else ++ pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", ++ PM_QOS_DEFAULT_VALUE); ++#endif + + /* We have to signal any supplicant if we are disassociating */ + if (associated) +@@ -6669,7 +6680,11 @@ static int __init ipw2100_init(void) + if (ret) + goto out; + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + ipw2100_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY, ++#else ++ pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", ++#endif + PM_QOS_DEFAULT_VALUE); + #ifdef CONFIG_IPW2100_DEBUG + ipw2100_debug_level = debug; +@@ -6692,7 +6707,11 @@ static void __exit ipw2100_exit(void) + &driver_attr_debug_level); + #endif + pci_unregister_driver(&ipw2100_pci_driver); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + pm_qos_remove_request(ipw2100_pm_qos_req); ++#else ++ pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100"); ++#endif + } + + module_init(ipw2100_init); diff --git a/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch b/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch index c9add27c9..f987e8a54 100644 --- a/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch +++ b/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1416,7 +1416,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1418,7 +1418,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st if (ah->config.rx_intr_mitigation) { REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500); diff --git a/package/mac80211/patches/450-add-ath5k-platform.patch b/package/mac80211/patches/450-add-ath5k-platform.patch new file mode 100644 index 000000000..77717b993 --- /dev/null +++ b/package/mac80211/patches/450-add-ath5k-platform.patch @@ -0,0 +1,35 @@ +diff -Nur a/include/linux/ath5k_platform.h b/include/linux/ath5k_platform.h +--- a/include/linux/ath5k_platform.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/include/linux/ath5k_platform.h 2010-06-21 00:19:52.000000000 +0200 +@@ -0,0 +1,30 @@ ++/* ++ * Copyright (c) 2008 Atheros Communications Inc. ++ * Copyright (c) 2009 Gabor Juhos ++ * Copyright (c) 2009 Imre Kaloz ++ * Copyright (c) 2010 Daniel Golle ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#ifndef _LINUX_ATH5K_PLATFORM_H ++#define _LINUX_ATH5K_PLATFORM_H ++ ++#define ATH5K_PLAT_EEP_MAX_WORDS 2048 ++ ++struct ath5k_platform_data { ++ u16 *eeprom_data; ++ u8 *macaddr; ++}; ++ ++#endif /* _LINUX_ATH5K_PLATFORM_H */ + diff --git a/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch b/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch new file mode 100644 index 000000000..717acd234 --- /dev/null +++ b/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch @@ -0,0 +1,57 @@ +--- a/drivers/net/wireless/ath/ath5k/eeprom.c 2010-06-23 03:08:32.000000000 +0200 ++++ b/drivers/net/wireless/ath/ath5k/eeprom.c 2010-06-23 05:59:30.000000000 +0200 +@@ -22,6 +23,8 @@ + \*************************************/ + + #include ++#include ++#include + + #include "ath5k.h" + #include "reg.h" +@@ -34,6 +37,18 @@ + static int ath5k_hw_eeprom_read(struct ath5k_hw *ah, u32 offset, u16 *data) + { + u32 status, timeout; ++ struct ath5k_platform_data *pdata = NULL; ++ ++ if (ah->ah_sc->pdev) ++ pdata = ah->ah_sc->pdev->dev.platform_data; ++ ++ if (pdata && pdata->eeprom_data && pdata->eeprom_data[0] == AR5K_EEPROM_MAGIC_VALUE) ++ { ++ ATH5K_INFO(ah->ah_sc, "using eeprom-content from platform_data\n"); ++ if (offset >= ATH5K_PLAT_EEP_MAX_WORDS) return -EIO; ++ *data = pdata->eeprom_data[offset]; ++ return 0; ++ } + + /* + * Initialize EEPROM access +@@ -1788,7 +1802,7 @@ + } + + /* +- * Read the MAC address from eeprom ++ * Read the MAC address from eeprom or platform_data + */ + int ath5k_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac) + { +@@ -1796,6 +1810,16 @@ + u32 total, offset; + u16 data; + int octet, ret; ++ struct ath5k_platform_data *pdata = NULL; ++ ++ if (ah->ah_sc->pdev) ++ pdata = ah->ah_sc->pdev->dev.platform_data; ++ ++ if (pdata && pdata->macaddr) ++ { ++ memcpy(mac, pdata->macaddr, ETH_ALEN); ++ return 0; ++ } + + ret = ath5k_hw_eeprom_read(ah, 0x20, &data); + if (ret) + diff --git a/package/mac80211/patches/510-ath9k_aggr_buffer_leak.patch b/package/mac80211/patches/510-ath9k_aggr_buffer_leak.patch deleted file mode 100644 index aa1f033fa..000000000 --- a/package/mac80211/patches/510-ath9k_aggr_buffer_leak.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -2430,37 +2430,37 @@ void ath_tx_node_init(struct ath_softc * - - void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) - { -- int i; -- struct ath_atx_ac *ac, *ac_tmp; -- struct ath_atx_tid *tid, *tid_tmp; -+ struct ath_atx_ac *ac; -+ struct ath_atx_tid *tid; - struct ath_txq *txq; -+ int i, tidno; - -- for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { -- if (ATH_TXQ_SETUP(sc, i)) { -- txq = &sc->tx.txq[i]; -- -- spin_lock_bh(&txq->axq_lock); -- -- list_for_each_entry_safe(ac, -- ac_tmp, &txq->axq_acq, list) { -- tid = list_first_entry(&ac->tid_q, -- struct ath_atx_tid, list); -- if (tid && tid->an != an) -- continue; -- list_del(&ac->list); -- ac->sched = false; -- -- list_for_each_entry_safe(tid, -- tid_tmp, &ac->tid_q, list) { -- list_del(&tid->list); -- tid->sched = false; -- ath_tid_drain(sc, txq, tid); -- tid->state &= ~AGGR_ADDBA_COMPLETE; -- tid->state &= ~AGGR_CLEANUP; -- } -- } -+ for (tidno = 0, tid = &an->tid[tidno]; -+ tidno < WME_NUM_TID; tidno++, tid++) { -+ i = tid->ac->qnum; - -- spin_unlock_bh(&txq->axq_lock); -+ if (!ATH_TXQ_SETUP(sc, i)) -+ continue; -+ -+ txq = &sc->tx.txq[i]; -+ ac = tid->ac; -+ -+ spin_lock_bh(&txq->axq_lock); -+ -+ if (tid->sched) { -+ list_del(&tid->list); -+ tid->sched = false; - } -+ -+ if (ac->sched) { -+ list_del(&ac->list); -+ tid->ac->sched = false; -+ } -+ -+ ath_tid_drain(sc, txq, tid); -+ tid->state &= ~AGGR_ADDBA_COMPLETE; -+ tid->state &= ~AGGR_CLEANUP; -+ -+ spin_unlock_bh(&txq->axq_lock); - } - } diff --git a/package/mac80211/patches/525-ath9k_handle_keymiss.patch b/package/mac80211/patches/510-ath9k_handle_keymiss.patch similarity index 92% rename from package/mac80211/patches/525-ath9k_handle_keymiss.patch rename to package/mac80211/patches/510-ath9k_handle_keymiss.patch index bbdd17761..f4ff69b16 100644 --- a/package/mac80211/patches/525-ath9k_handle_keymiss.patch +++ b/package/mac80211/patches/510-ath9k_handle_keymiss.patch @@ -11,7 +11,7 @@ return 0; --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c -@@ -589,7 +589,8 @@ int ath9k_hw_process_rxdesc_edma(struct +@@ -616,7 +616,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; diff --git a/package/mac80211/patches/511-ath9k_completion_buffer_leak.patch b/package/mac80211/patches/511-ath9k_completion_buffer_leak.patch deleted file mode 100644 index 709e2846c..000000000 --- a/package/mac80211/patches/511-ath9k_completion_buffer_leak.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -329,6 +329,7 @@ static void ath_tx_complete_aggr(struct - int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; - bool rc_update = true; - struct ieee80211_tx_rate rates[4]; -+ unsigned long flags; - - skb = bf->bf_mpdu; - hdr = (struct ieee80211_hdr *)skb->data; -@@ -344,6 +345,10 @@ static void ath_tx_complete_aggr(struct - sta = ieee80211_find_sta_by_hw(hw, hdr->addr1); - if (!sta) { - rcu_read_unlock(); -+ -+ spin_lock_irqsave(&sc->tx.txbuflock, flags); -+ list_splice_tail_init(bf_q, &sc->tx.txbuf); -+ spin_unlock_irqrestore(&sc->tx.txbuflock, flags); - return; - } - diff --git a/package/mac80211/patches/520-ath9k_ar9285_diversity_fix.patch b/package/mac80211/patches/520-ath9k_ar9285_diversity_fix.patch deleted file mode 100644 index a79667421..000000000 --- a/package/mac80211/patches/520-ath9k_ar9285_diversity_fix.patch +++ /dev/null @@ -1,77 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/eeprom.h -+++ b/drivers/net/wireless/ath/ath9k/eeprom.h -@@ -670,7 +670,7 @@ struct eeprom_ops { - int (*get_eeprom_ver)(struct ath_hw *hw); - int (*get_eeprom_rev)(struct ath_hw *hw); - u8 (*get_num_ant_config)(struct ath_hw *hw, enum ieee80211_band band); -- u16 (*get_eeprom_antenna_cfg)(struct ath_hw *hw, -+ u32 (*get_eeprom_antenna_cfg)(struct ath_hw *hw, - struct ath9k_channel *chan); - void (*set_board_values)(struct ath_hw *hw, struct ath9k_channel *chan); - void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan); ---- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c -@@ -1130,13 +1130,13 @@ static u8 ath9k_hw_ar9287_get_num_ant_co - return 1; - } - --static u16 ath9k_hw_ar9287_get_eeprom_antenna_cfg(struct ath_hw *ah, -+static u32 ath9k_hw_ar9287_get_eeprom_antenna_cfg(struct ath_hw *ah, - struct ath9k_channel *chan) - { - struct ar9287_eeprom *eep = &ah->eeprom.map9287; - struct modal_eep_ar9287_header *pModal = &eep->modalHeader; - -- return pModal->antCtrlCommon & 0xFFFF; -+ return pModal->antCtrlCommon; - } - - static u16 ath9k_hw_ar9287_get_spur_channel(struct ath_hw *ah, ---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c -@@ -1438,14 +1438,14 @@ static u8 ath9k_hw_def_get_num_ant_confi - return num_ant_config; - } - --static u16 ath9k_hw_def_get_eeprom_antenna_cfg(struct ath_hw *ah, -+static u32 ath9k_hw_def_get_eeprom_antenna_cfg(struct ath_hw *ah, - struct ath9k_channel *chan) - { - struct ar5416_eeprom_def *eep = &ah->eeprom.def; - struct modal_eep_header *pModal = - &(eep->modalHeader[IS_CHAN_2GHZ(chan)]); - -- return pModal->antCtrlCommon & 0xFFFF; -+ return pModal->antCtrlCommon; - } - - static u16 ath9k_hw_def_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz) ---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c -@@ -1150,13 +1150,13 @@ static void ath9k_hw_4k_set_board_values - } - } - --static u16 ath9k_hw_4k_get_eeprom_antenna_cfg(struct ath_hw *ah, -+static u32 ath9k_hw_4k_get_eeprom_antenna_cfg(struct ath_hw *ah, - struct ath9k_channel *chan) - { - struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k; - struct modal_eep_4k_header *pModal = &eep->modalHeader; - -- return pModal->antCtrlCommon & 0xFFFF; -+ return pModal->antCtrlCommon; - } - - static u8 ath9k_hw_4k_get_num_ant_config(struct ath_hw *ah, ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -@@ -951,7 +951,7 @@ static u8 ath9k_hw_ar9300_get_num_ant_co - return 1; - } - --static u16 ath9k_hw_ar9300_get_eeprom_antenna_cfg(struct ath_hw *ah, -+static u32 ath9k_hw_ar9300_get_eeprom_antenna_cfg(struct ath_hw *ah, - struct ath9k_channel *chan) - { - return -EINVAL; diff --git a/package/mac80211/patches/520-ath9k_leak_fix.patch b/package/mac80211/patches/520-ath9k_leak_fix.patch new file mode 100644 index 000000000..acf7efd87 --- /dev/null +++ b/package/mac80211/patches/520-ath9k_leak_fix.patch @@ -0,0 +1,32 @@ +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -518,6 +518,14 @@ static void ath_tx_complete_aggr(struct + bf = bf_next; + } + ++ /* prepend un-acked frames to the beginning of the pending frame queue */ ++ if (!list_empty(&bf_pending)) { ++ spin_lock_bh(&txq->axq_lock); ++ list_splice(&bf_pending, &tid->buf_q); ++ ath_tx_queue_tid(txq, tid); ++ spin_unlock_bh(&txq->axq_lock); ++ } ++ + if (tid->state & AGGR_CLEANUP) { + if (tid->baw_head == tid->baw_tail) { + tid->state &= ~AGGR_ADDBA_COMPLETE; +@@ -530,14 +538,6 @@ static void ath_tx_complete_aggr(struct + return; + } + +- /* prepend un-acked frames to the beginning of the pending frame queue */ +- if (!list_empty(&bf_pending)) { +- spin_lock_bh(&txq->axq_lock); +- list_splice(&bf_pending, &tid->buf_q); +- ath_tx_queue_tid(txq, tid); +- spin_unlock_bh(&txq->axq_lock); +- } +- + rcu_read_unlock(); + + if (needreset) diff --git a/package/mac80211/patches/521-ath9k_iqcal_fix.patch b/package/mac80211/patches/521-ath9k_iqcal_fix.patch deleted file mode 100644 index 1efd6cccc..000000000 --- a/package/mac80211/patches/521-ath9k_iqcal_fix.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c -+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c -@@ -239,7 +239,7 @@ static void ar9002_hw_iqcalibrate(struct - if (qCoff > 15) - qCoff = 15; - else if (qCoff <= -16) -- qCoff = 16; -+ qCoff = -16; - - ath_print(common, ATH_DBG_CALIBRATE, - "Chn %d : iCoff = 0x%x qCoff = 0x%x\n", diff --git a/package/mac80211/patches/522-ath9k_pwrcal_fix.patch b/package/mac80211/patches/522-ath9k_pwrcal_fix.patch deleted file mode 100644 index 6a41c9f88..000000000 --- a/package/mac80211/patches/522-ath9k_pwrcal_fix.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c -@@ -730,7 +730,7 @@ static void ath9k_hw_get_def_gain_bounda - vpdTableI[i][sizeCurrVpdTable - 2]); - vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); - -- if (tgtIndex > maxIndex) { -+ if (tgtIndex >= maxIndex) { - while ((ss <= tgtIndex) && - (k < (AR5416_NUM_PDADC_VALUES - 1))) { - tmpVal = (int16_t)((vpdTableI[i][sizeCurrVpdTable - 1] + diff --git a/package/mac80211/patches/523-ath9k_channel_change_fix.patch b/package/mac80211/patches/523-ath9k_channel_change_fix.patch deleted file mode 100644 index 0f10cb38d..000000000 --- a/package/mac80211/patches/523-ath9k_channel_change_fix.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1244,9 +1244,11 @@ int ath9k_hw_reset(struct ath_hw *ah, st - - if (!ah->chip_fullsleep) { - ath9k_hw_abortpcurecv(ah); -- if (!ath9k_hw_stopdmarecv(ah)) -+ if (!ath9k_hw_stopdmarecv(ah)) { - ath_print(common, ATH_DBG_XMIT, - "Failed to stop receive dma\n"); -+ bChannelChange = false; -+ } - } - - if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) diff --git a/package/mac80211/patches/524-ath9k_aggr_status_validate.patch b/package/mac80211/patches/524-ath9k_aggr_status_validate.patch deleted file mode 100644 index e6ea97e97..000000000 --- a/package/mac80211/patches/524-ath9k_aggr_status_validate.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c -+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c -@@ -287,6 +287,7 @@ static int ar9002_hw_proc_txdesc(struct - ts->ts_shortretry = MS(ads->ds_txstatus1, AR_RTSFailCnt); - ts->ts_longretry = MS(ads->ds_txstatus1, AR_DataFailCnt); - ts->ts_virtcol = MS(ads->ds_txstatus1, AR_VirtRetryCnt); -+ ts->tid = MS(ads->ds_txstatus9, AR_TxTid); - ts->ts_antenna = 0; - - return 0; ---- a/drivers/net/wireless/ath/ath9k/ar9003_mac.h -+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.h -@@ -33,9 +33,6 @@ - #define AR_TxDescId_S 16 - #define AR_TxPtrChkSum 0x0000ffff - --#define AR_TxTid 0xf0000000 --#define AR_TxTid_S 28 -- - #define AR_LowRxChain 0x00004000 - - #define AR_Not_Sounding 0x20000000 ---- a/drivers/net/wireless/ath/ath9k/mac.h -+++ b/drivers/net/wireless/ath/ath9k/mac.h -@@ -485,6 +485,9 @@ struct ar5416_desc { - #define AR_TxRSSICombined 0xff000000 - #define AR_TxRSSICombined_S 24 - -+#define AR_TxTid 0xf0000000 -+#define AR_TxTid_S 28 -+ - #define AR_TxEVM0 ds_txstatus5 - #define AR_TxEVM1 ds_txstatus6 - #define AR_TxEVM2 ds_txstatus7 ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -355,6 +355,14 @@ static void ath_tx_complete_aggr(struct - an = (struct ath_node *)sta->drv_priv; - tid = ATH_AN_2_TID(an, bf->bf_tidno); - -+ /* -+ * The hardware occasionally sends a tx status for the wrong TID. -+ * In this case, the BA status cannot be considered valid and all -+ * subframes need to be retransmitted -+ */ -+ if (bf->bf_tidno != ts->tid) -+ txok = false; -+ - isaggr = bf_isaggr(bf); - memset(ba, 0, WME_BA_BMP_SIZE >> 3); - diff --git a/package/mac80211/patches/526-ath9k_improve_nf_cal.patch b/package/mac80211/patches/526-ath9k_improve_nf_cal.patch deleted file mode 100644 index 2bc11a1d2..000000000 --- a/package/mac80211/patches/526-ath9k_improve_nf_cal.patch +++ /dev/null @@ -1,399 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c -+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c -@@ -1518,77 +1518,6 @@ static void ar5008_hw_do_getnf(struct at - nfarray[5] = sign_extend(nf, 9); - } - --static void ar5008_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) --{ -- struct ath9k_nfcal_hist *h; -- int i, j; -- int32_t val; -- const u32 ar5416_cca_regs[6] = { -- AR_PHY_CCA, -- AR_PHY_CH1_CCA, -- AR_PHY_CH2_CCA, -- AR_PHY_EXT_CCA, -- AR_PHY_CH1_EXT_CCA, -- AR_PHY_CH2_EXT_CCA -- }; -- u8 chainmask, rx_chain_status; -- -- rx_chain_status = REG_READ(ah, AR_PHY_RX_CHAINMASK); -- if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) -- chainmask = 0x9; -- else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { -- if ((rx_chain_status & 0x2) || (rx_chain_status & 0x4)) -- chainmask = 0x1B; -- else -- chainmask = 0x09; -- } else { -- if (rx_chain_status & 0x4) -- chainmask = 0x3F; -- else if (rx_chain_status & 0x2) -- chainmask = 0x1B; -- else -- chainmask = 0x09; -- } -- -- h = ah->nfCalHist; -- -- for (i = 0; i < NUM_NF_READINGS; i++) { -- if (chainmask & (1 << i)) { -- val = REG_READ(ah, ar5416_cca_regs[i]); -- val &= 0xFFFFFE00; -- val |= (((u32) (h[i].privNF) << 1) & 0x1ff); -- REG_WRITE(ah, ar5416_cca_regs[i], val); -- } -- } -- -- REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, -- AR_PHY_AGC_CONTROL_ENABLE_NF); -- REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, -- AR_PHY_AGC_CONTROL_NO_UPDATE_NF); -- REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); -- -- for (j = 0; j < 5; j++) { -- if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & -- AR_PHY_AGC_CONTROL_NF) == 0) -- break; -- udelay(50); -- } -- -- ENABLE_REGWRITE_BUFFER(ah); -- -- for (i = 0; i < NUM_NF_READINGS; i++) { -- if (chainmask & (1 << i)) { -- val = REG_READ(ah, ar5416_cca_regs[i]); -- val &= 0xFFFFFE00; -- val |= (((u32) (-50) << 1) & 0x1ff); -- REG_WRITE(ah, ar5416_cca_regs[i], val); -- } -- } -- -- REGWRITE_BUFFER_FLUSH(ah); -- DISABLE_REGWRITE_BUFFER(ah); --} -- - /* - * Initialize the ANI register values with default (ini) values. - * This routine is called during a (full) hardware reset after -@@ -1666,6 +1595,14 @@ static void ar5008_hw_set_nf_limits(stru - void ar5008_hw_attach_phy_ops(struct ath_hw *ah) - { - struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -+ const u32 ar5416_cca_regs[6] = { -+ AR_PHY_CCA, -+ AR_PHY_CH1_CCA, -+ AR_PHY_CH2_CCA, -+ AR_PHY_EXT_CCA, -+ AR_PHY_CH1_EXT_CCA, -+ AR_PHY_CH2_EXT_CCA -+ }; - - priv_ops->rf_set_freq = ar5008_hw_set_channel; - priv_ops->spur_mitigate_freq = ar5008_hw_spur_mitigate; -@@ -1685,7 +1622,6 @@ void ar5008_hw_attach_phy_ops(struct ath - priv_ops->restore_chainmask = ar5008_restore_chainmask; - priv_ops->set_diversity = ar5008_set_diversity; - priv_ops->do_getnf = ar5008_hw_do_getnf; -- priv_ops->loadnf = ar5008_hw_loadnf; - - if (modparam_force_new_ani) { - priv_ops->ani_control = ar5008_hw_ani_control_new; -@@ -1701,4 +1637,5 @@ void ar5008_hw_attach_phy_ops(struct ath - priv_ops->compute_pll_control = ar5008_hw_compute_pll_control; - - ar5008_hw_set_nf_limits(ah); -+ memcpy(ah->nf_regs, ar5416_cca_regs, sizeof(ah->nf_regs)); - } ---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -1050,106 +1050,6 @@ static void ar9003_hw_set_nf_limits(stru - } - - /* -- * Find out which of the RX chains are enabled -- */ --static u32 ar9003_hw_get_rx_chainmask(struct ath_hw *ah) --{ -- u32 chain = REG_READ(ah, AR_PHY_RX_CHAINMASK); -- /* -- * The bits [2:0] indicate the rx chain mask and are to be -- * interpreted as follows: -- * 00x => Only chain 0 is enabled -- * 01x => Chain 1 and 0 enabled -- * 1xx => Chain 2,1 and 0 enabled -- */ -- return chain & 0x7; --} -- --static void ar9003_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) --{ -- struct ath9k_nfcal_hist *h; -- unsigned i, j; -- int32_t val; -- const u32 ar9300_cca_regs[6] = { -- AR_PHY_CCA_0, -- AR_PHY_CCA_1, -- AR_PHY_CCA_2, -- AR_PHY_EXT_CCA, -- AR_PHY_EXT_CCA_1, -- AR_PHY_EXT_CCA_2, -- }; -- u8 chainmask, rx_chain_status; -- struct ath_common *common = ath9k_hw_common(ah); -- -- rx_chain_status = ar9003_hw_get_rx_chainmask(ah); -- -- chainmask = 0x3F; -- h = ah->nfCalHist; -- -- for (i = 0; i < NUM_NF_READINGS; i++) { -- if (chainmask & (1 << i)) { -- val = REG_READ(ah, ar9300_cca_regs[i]); -- val &= 0xFFFFFE00; -- val |= (((u32) (h[i].privNF) << 1) & 0x1ff); -- REG_WRITE(ah, ar9300_cca_regs[i], val); -- } -- } -- -- /* -- * Load software filtered NF value into baseband internal minCCApwr -- * variable. -- */ -- REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, -- AR_PHY_AGC_CONTROL_ENABLE_NF); -- REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, -- AR_PHY_AGC_CONTROL_NO_UPDATE_NF); -- REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); -- -- /* -- * Wait for load to complete, should be fast, a few 10s of us. -- * The max delay was changed from an original 250us to 10000us -- * since 250us often results in NF load timeout and causes deaf -- * condition during stress testing 12/12/2009 -- */ -- for (j = 0; j < 1000; j++) { -- if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & -- AR_PHY_AGC_CONTROL_NF) == 0) -- break; -- udelay(10); -- } -- -- /* -- * We timed out waiting for the noisefloor to load, probably due to an -- * in-progress rx. Simply return here and allow the load plenty of time -- * to complete before the next calibration interval. We need to avoid -- * trying to load -50 (which happens below) while the previous load is -- * still in progress as this can cause rx deafness. Instead by returning -- * here, the baseband nf cal will just be capped by our present -- * noisefloor until the next calibration timer. -- */ -- if (j == 1000) { -- ath_print(common, ATH_DBG_ANY, "Timeout while waiting for nf " -- "to load: AR_PHY_AGC_CONTROL=0x%x\n", -- REG_READ(ah, AR_PHY_AGC_CONTROL)); -- return; -- } -- -- /* -- * Restore maxCCAPower register parameter again so that we're not capped -- * by the median we just loaded. This will be initial (and max) value -- * of next noise floor calibration the baseband does. -- */ -- for (i = 0; i < NUM_NF_READINGS; i++) { -- if (chainmask & (1 << i)) { -- val = REG_READ(ah, ar9300_cca_regs[i]); -- val &= 0xFFFFFE00; -- val |= (((u32) (-50) << 1) & 0x1ff); -- REG_WRITE(ah, ar9300_cca_regs[i], val); -- } -- } --} -- --/* - * Initialize the ANI register values with default (ini) values. - * This routine is called during a (full) hardware reset after - * all the registers are initialised from the INI. -@@ -1216,6 +1116,14 @@ static void ar9003_hw_ani_cache_ini_regs - void ar9003_hw_attach_phy_ops(struct ath_hw *ah) - { - struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -+ const u32 ar9300_cca_regs[6] = { -+ AR_PHY_CCA_0, -+ AR_PHY_CCA_1, -+ AR_PHY_CCA_2, -+ AR_PHY_EXT_CCA, -+ AR_PHY_EXT_CCA_1, -+ AR_PHY_EXT_CCA_2, -+ }; - - priv_ops->rf_set_freq = ar9003_hw_set_channel; - priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate; -@@ -1232,10 +1140,10 @@ void ar9003_hw_attach_phy_ops(struct ath - priv_ops->set_diversity = ar9003_hw_set_diversity; - priv_ops->ani_control = ar9003_hw_ani_control; - priv_ops->do_getnf = ar9003_hw_do_getnf; -- priv_ops->loadnf = ar9003_hw_loadnf; - priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; - - ar9003_hw_set_nf_limits(ah); -+ memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs)); - } - - void ar9003_hw_bb_watchdog_config(struct ath_hw *ah) ---- a/drivers/net/wireless/ath/ath9k/calib.c -+++ b/drivers/net/wireless/ath/ath9k/calib.c -@@ -167,6 +167,100 @@ void ath9k_hw_start_nfcal(struct ath_hw - REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); - } - -+void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) -+{ -+ struct ath9k_nfcal_hist *h; -+ unsigned i, j; -+ int32_t val; -+ u8 chainmask; -+ struct ath_common *common = ath9k_hw_common(ah); -+ -+ if (AR_SREV_9300_20_OR_LATER(ah)) -+ chainmask = 0x3F; -+ else if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) -+ chainmask = 0x9; -+ else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { -+ if ((ah->rxchainmask & 0x2) || (ah->rxchainmask & 0x4)) -+ chainmask = 0x1B; -+ else -+ chainmask = 0x09; -+ } else { -+ if (ah->rxchainmask & 0x4) -+ chainmask = 0x3F; -+ else if (ah->rxchainmask & 0x2) -+ chainmask = 0x1B; -+ else -+ chainmask = 0x09; -+ } -+ h = ah->nfCalHist; -+ -+ for (i = 0; i < NUM_NF_READINGS; i++) { -+ if (chainmask & (1 << i)) { -+ val = REG_READ(ah, ah->nf_regs[i]); -+ val &= 0xFFFFFE00; -+ val |= (((u32) (h[i].privNF) << 1) & 0x1ff); -+ REG_WRITE(ah, ah->nf_regs[i], val); -+ } -+ } -+ -+ /* -+ * Load software filtered NF value into baseband internal minCCApwr -+ * variable. -+ */ -+ REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, -+ AR_PHY_AGC_CONTROL_ENABLE_NF); -+ REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, -+ AR_PHY_AGC_CONTROL_NO_UPDATE_NF); -+ REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); -+ -+ /* -+ * Wait for load to complete, should be fast, a few 10s of us. -+ * The max delay was changed from an original 250us to 10000us -+ * since 250us often results in NF load timeout and causes deaf -+ * condition during stress testing 12/12/2009 -+ */ -+ for (j = 0; j < 1000; j++) { -+ if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & -+ AR_PHY_AGC_CONTROL_NF) == 0) -+ break; -+ udelay(10); -+ } -+ -+ /* -+ * We timed out waiting for the noisefloor to load, probably due to an -+ * in-progress rx. Simply return here and allow the load plenty of time -+ * to complete before the next calibration interval. We need to avoid -+ * trying to load -50 (which happens below) while the previous load is -+ * still in progress as this can cause rx deafness. Instead by returning -+ * here, the baseband nf cal will just be capped by our present -+ * noisefloor until the next calibration timer. -+ */ -+ if (j == 1000) { -+ ath_print(common, ATH_DBG_ANY, "Timeout while waiting for nf " -+ "to load: AR_PHY_AGC_CONTROL=0x%x\n", -+ REG_READ(ah, AR_PHY_AGC_CONTROL)); -+ return; -+ } -+ -+ /* -+ * Restore maxCCAPower register parameter again so that we're not capped -+ * by the median we just loaded. This will be initial (and max) value -+ * of next noise floor calibration the baseband does. -+ */ -+ ENABLE_REGWRITE_BUFFER(ah); -+ for (i = 0; i < NUM_NF_READINGS; i++) { -+ if (chainmask & (1 << i)) { -+ val = REG_READ(ah, ah->nf_regs[i]); -+ val &= 0xFFFFFE00; -+ val |= (((u32) (-50) << 1) & 0x1ff); -+ REG_WRITE(ah, ah->nf_regs[i], val); -+ } -+ } -+ REGWRITE_BUFFER_FLUSH(ah); -+ DISABLE_REGWRITE_BUFFER(ah); -+} -+ -+ - static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf) - { - struct ath_common *common = ath9k_hw_common(ah); ---- a/drivers/net/wireless/ath/ath9k/calib.h -+++ b/drivers/net/wireless/ath/ath9k/calib.h -@@ -109,6 +109,7 @@ struct ath9k_pacal_info{ - - bool ath9k_hw_reset_calvalid(struct ath_hw *ah); - void ath9k_hw_start_nfcal(struct ath_hw *ah); -+void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); - int16_t ath9k_hw_getnf(struct ath_hw *ah, - struct ath9k_channel *chan); - void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah); ---- a/drivers/net/wireless/ath/ath9k/hw-ops.h -+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h -@@ -264,12 +264,6 @@ static inline void ath9k_hw_do_getnf(str - ath9k_hw_private_ops(ah)->do_getnf(ah, nfarray); - } - --static inline void ath9k_hw_loadnf(struct ath_hw *ah, -- struct ath9k_channel *chan) --{ -- ath9k_hw_private_ops(ah)->loadnf(ah, chan); --} -- - static inline bool ath9k_hw_init_cal(struct ath_hw *ah, - struct ath9k_channel *chan) - { ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -510,7 +510,6 @@ struct ath_gen_timer_table { - * AR_RTC_PLL_CONTROL for a given channel - * @setup_calibration: set up calibration - * @iscal_supported: used to query if a type of calibration is supported -- * @loadnf: load noise floor read from each chain on the CCA registers - * - * @ani_reset: reset ANI parameters to default values - * @ani_lower_immunity: lower the noise immunity level. The level controls -@@ -564,7 +563,6 @@ struct ath_hw_private_ops { - bool (*ani_control)(struct ath_hw *ah, enum ath9k_ani_cmd cmd, - int param); - void (*do_getnf)(struct ath_hw *ah, int16_t nfarray[NUM_NF_READINGS]); -- void (*loadnf)(struct ath_hw *ah, struct ath9k_channel *chan); - - /* ANI */ - void (*ani_reset)(struct ath_hw *ah, bool is_scanning); -@@ -658,6 +656,7 @@ struct ath_hw { - bool need_an_top2_fixup; - u16 tx_trig_level; - -+ u32 nf_regs[6]; - struct ath_nf_limits nf_2g; - struct ath_nf_limits nf_5g; - u16 rfsilent; diff --git a/package/mac80211/patches/530-ath9k_aggr_fix.patch b/package/mac80211/patches/530-ath9k_aggr_fix.patch deleted file mode 100644 index 0c9d887ac..000000000 --- a/package/mac80211/patches/530-ath9k_aggr_fix.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -329,7 +329,6 @@ static void ath_tx_complete_aggr(struct - int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; - bool rc_update = true; - struct ieee80211_tx_rate rates[4]; -- unsigned long flags; - - skb = bf->bf_mpdu; - hdr = (struct ieee80211_hdr *)skb->data; -@@ -346,9 +345,21 @@ static void ath_tx_complete_aggr(struct - if (!sta) { - rcu_read_unlock(); - -- spin_lock_irqsave(&sc->tx.txbuflock, flags); -- list_splice_tail_init(bf_q, &sc->tx.txbuf); -- spin_unlock_irqrestore(&sc->tx.txbuflock, flags); -+ INIT_LIST_HEAD(&bf_head); -+ while (bf) { -+ bf_next = bf->bf_next; -+ -+ bf->bf_state.bf_type |= BUF_XRETRY; -+ if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) || -+ !bf->bf_stale || bf_next != NULL) -+ list_move_tail(&bf->list, &bf_head); -+ -+ ath_tx_rc_status(bf, ts, 0, 0, false); -+ ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, -+ 0, 0); -+ -+ bf = bf_next; -+ } - return; - } - diff --git a/package/mac80211/patches/530-ath9k_nf_fix.patch b/package/mac80211/patches/530-ath9k_nf_fix.patch new file mode 100644 index 000000000..081c2ab74 --- /dev/null +++ b/package/mac80211/patches/530-ath9k_nf_fix.patch @@ -0,0 +1,46 @@ +--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c +@@ -1508,6 +1508,9 @@ static void ar5008_hw_do_getnf(struct at + nf = MS(REG_READ(ah, AR_PHY_CH2_CCA), AR_PHY_CH2_MINCCA_PWR); + nfarray[2] = sign_extend(nf, 9); + ++ if (!IS_CHAN_HT40(ah->curchan)) ++ return; ++ + nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); + nfarray[3] = sign_extend(nf, 9); + +--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c +@@ -477,7 +477,8 @@ static void ar9002_hw_do_getnf(struct at + nfarray[0] = sign_extend(nf, 9); + + nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR9280_PHY_EXT_MINCCA_PWR); +- nfarray[3] = sign_extend(nf, 9); ++ if (IS_CHAN_HT40(ah->curchan)) ++ nfarray[3] = sign_extend(nf, 9); + + if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) + return; +@@ -486,7 +487,8 @@ static void ar9002_hw_do_getnf(struct at + nfarray[1] = sign_extend(nf, 9); + + nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), AR9280_PHY_CH1_EXT_MINCCA_PWR); +- nfarray[4] = sign_extend(nf, 9); ++ if (IS_CHAN_HT40(ah->curchan)) ++ nfarray[4] = sign_extend(nf, 9); + } + + static void ar9002_hw_set_nf_limits(struct ath_hw *ah) +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c +@@ -1029,6 +1029,9 @@ static void ar9003_hw_do_getnf(struct at + nf = MS(REG_READ(ah, AR_PHY_CCA_2), AR_PHY_CH2_MINCCA_PWR); + nfarray[2] = sign_extend(nf, 9); + ++ if (!IS_CHAN_HT40(ah->curchan)) ++ return; ++ + nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); + nfarray[3] = sign_extend(nf, 9); + diff --git a/package/mac80211/patches/531-ath9k_nf_cleanup.patch b/package/mac80211/patches/531-ath9k_nf_cleanup.patch new file mode 100644 index 000000000..f038559a4 --- /dev/null +++ b/package/mac80211/patches/531-ath9k_nf_cleanup.patch @@ -0,0 +1,30 @@ +--- a/drivers/net/wireless/ath/ath9k/calib.c ++++ b/drivers/net/wireless/ath/ath9k/calib.c +@@ -172,26 +172,9 @@ void ath9k_hw_loadnf(struct ath_hw *ah, + struct ath9k_nfcal_hist *h; + unsigned i, j; + int32_t val; +- u8 chainmask; ++ u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; + struct ath_common *common = ath9k_hw_common(ah); + +- if (AR_SREV_9300_20_OR_LATER(ah)) +- chainmask = 0x3F; +- else if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) +- chainmask = 0x9; +- else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { +- if ((ah->rxchainmask & 0x2) || (ah->rxchainmask & 0x4)) +- chainmask = 0x1B; +- else +- chainmask = 0x09; +- } else { +- if (ah->rxchainmask & 0x4) +- chainmask = 0x3F; +- else if (ah->rxchainmask & 0x2) +- chainmask = 0x1B; +- else +- chainmask = 0x09; +- } + h = ah->nfCalHist; + + for (i = 0; i < NUM_NF_READINGS; i++) { diff --git a/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch b/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch index 37d7b847a..3364b8bcc 100644 --- a/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch +++ b/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c -@@ -188,6 +188,7 @@ void rt2x00pci_uninitialize(struct rt2x0 +@@ -202,6 +202,7 @@ void rt2x00pci_uninitialize(struct rt2x0 } EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize); @@ -8,7 +8,7 @@ /* * PCI driver handlers. */ -@@ -365,6 +366,7 @@ int rt2x00pci_resume(struct pci_dev *pci +@@ -382,6 +383,7 @@ int rt2x00pci_resume(struct pci_dev *pci } EXPORT_SYMBOL_GPL(rt2x00pci_resume); #endif /* CONFIG_PM */ diff --git a/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch b/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch deleted file mode 100644 index 5b1ae415a..000000000 --- a/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 27ed5ec6924c17b76d65b697a162bafee7bd8e4e Mon Sep 17 00:00:00 2001 -From: Helmut Schaa -Date: Mon, 21 Jun 2010 10:03:05 +0200 -Subject: [PATCH] rt2x00: fix rt2800pci hang on ifdown - -rt2800pci hangs the system on rt305x SoC devices on ifdown. Work around -this issue by disabling TX DMA prior to restting the TX queue indices. - -This patch is not suitable for upstream inclusion but is just meant as -a workaround until a proper solution is implemented. - -Signed-off-by: Helmut Schaa ---- - drivers/net/wireless/rt2x00/rt2800pci.c | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - ---- a/drivers/net/wireless/rt2x00/rt2800pci.c -+++ b/drivers/net/wireless/rt2x00/rt2800pci.c -@@ -749,6 +749,10 @@ static void rt2800pci_kill_tx_queue(stru - rt2800_register_write(rt2x00dev, BCN_TIME_CFG, 0); - return; - } -+ -+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); -+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0); -+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); - - rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, ®); - rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, (qid == QID_AC_BE)); diff --git a/package/mac80211/patches/750-set_pci_mwi.patch b/package/mac80211/patches/610-set_pci_mwi.patch similarity index 84% rename from package/mac80211/patches/750-set_pci_mwi.patch rename to package/mac80211/patches/610-set_pci_mwi.patch index 3cc5bdb62..06933e571 100644 --- a/package/mac80211/patches/750-set_pci_mwi.patch +++ b/package/mac80211/patches/610-set_pci_mwi.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c -@@ -253,8 +253,10 @@ int rt2x00pci_probe(struct pci_dev *pci_ +@@ -270,8 +270,10 @@ int rt2x00pci_probe(struct pci_dev *pci_ pci_set_master(pci_dev); diff --git a/package/mac80211/patches/800-mac80211_aggr_fix.patch b/package/mac80211/patches/800-mac80211_aggr_fix.patch new file mode 100644 index 000000000..564bfac06 --- /dev/null +++ b/package/mac80211/patches/800-mac80211_aggr_fix.patch @@ -0,0 +1,20 @@ +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -756,7 +756,7 @@ static void ieee80211_iface_work(struct + int len = skb->len; + + mutex_lock(&local->sta_mtx); +- sta = sta_info_get(sdata, mgmt->sa); ++ sta = sta_info_get_bss(sdata, mgmt->sa); + if (sta) { + switch (mgmt->u.action.u.addba_req.action_code) { + case WLAN_ACTION_ADDBA_REQ: +@@ -797,7 +797,7 @@ static void ieee80211_iface_work(struct + * right, so terminate the session. + */ + mutex_lock(&local->sta_mtx); +- sta = sta_info_get(sdata, mgmt->sa); ++ sta = sta_info_get_bss(sdata, mgmt->sa); + if (sta) { + u16 tid = *ieee80211_get_qos_ctl(hdr) & + IEEE80211_QOS_CTL_TID_MASK;