diff options
Diffstat (limited to 'package/mac80211/patches/310-pending_work.patch')
-rw-r--r-- | package/mac80211/patches/310-pending_work.patch | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/package/mac80211/patches/310-pending_work.patch b/package/mac80211/patches/310-pending_work.patch new file mode 100644 index 0000000..b693b0a --- /dev/null +++ b/package/mac80211/patches/310-pending_work.patch @@ -0,0 +1,114 @@ +--- 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; + } + |