diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-04-10 21:12:05 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2011-04-10 21:12:05 +0000 |
commit | 718f5aa78e12c2a40182e264cd17b64f09d4b6ee (patch) | |
tree | 72679aeb9e63857983b720d8b1e599b0001ba847 | |
parent | 8ab360f9b300eab5c31a38de43d216f6f50d2eb9 (diff) | |
download | upstream-718f5aa78e12c2a40182e264cd17b64f09d4b6ee.tar.gz upstream-718f5aa78e12c2a40182e264cd17b64f09d4b6ee.tar.bz2 upstream-718f5aa78e12c2a40182e264cd17b64f09d4b6ee.zip |
ath5k: fix mac address detection on dual-radio ar5312
SVN-Revision: 26583
-rw-r--r-- | package/mac80211/patches/472-ath_unshare_bus_ops.patch | 50 | ||||
-rw-r--r-- | package/mac80211/patches/473-ath5k_read_mac_addr.patch | 179 |
2 files changed, 229 insertions, 0 deletions
diff --git a/package/mac80211/patches/472-ath_unshare_bus_ops.patch b/package/mac80211/patches/472-ath_unshare_bus_ops.patch new file mode 100644 index 0000000000..b3b0eab1f1 --- /dev/null +++ b/package/mac80211/patches/472-ath_unshare_bus_ops.patch @@ -0,0 +1,50 @@ +--- a/drivers/net/wireless/ath/ath.h ++++ b/drivers/net/wireless/ath/ath.h +@@ -123,14 +123,7 @@ struct ath_ops { + }; + + struct ath_common; +- +-struct ath_bus_ops { +- enum ath_bus_type ath_bus_type; +- void (*read_cachesize)(struct ath_common *common, int *csz); +- bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data); +- void (*bt_coex_prep)(struct ath_common *common); +- void (*extn_synch_en)(struct ath_common *common); +-}; ++struct ath_bus_ops; + + struct ath_common { + void *ah; +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -847,6 +847,14 @@ struct ath_hw { + u32 ent_mode; + }; + ++struct ath_bus_ops { ++ enum ath_bus_type ath_bus_type; ++ void (*read_cachesize)(struct ath_common *common, int *csz); ++ bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data); ++ void (*bt_coex_prep)(struct ath_common *common); ++ void (*extn_synch_en)(struct ath_common *common); ++}; ++ + static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah) + { + return &ah->common; +--- a/drivers/net/wireless/ath/ath5k/ath5k.h ++++ b/drivers/net/wireless/ath/ath5k/ath5k.h +@@ -1155,6 +1155,12 @@ struct ath5k_hw { + struct ath5k_rx_status *); + }; + ++struct ath_bus_ops { ++ enum ath_bus_type ath_bus_type; ++ void (*read_cachesize)(struct ath_common *common, int *csz); ++ bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data); ++}; ++ + /* + * Prototypes + */ diff --git a/package/mac80211/patches/473-ath5k_read_mac_addr.patch b/package/mac80211/patches/473-ath5k_read_mac_addr.patch new file mode 100644 index 0000000000..83c951fdce --- /dev/null +++ b/package/mac80211/patches/473-ath5k_read_mac_addr.patch @@ -0,0 +1,179 @@ +--- a/drivers/net/wireless/ath/ath5k/ath5k.h ++++ b/drivers/net/wireless/ath/ath5k/ath5k.h +@@ -1159,6 +1159,7 @@ struct ath_bus_ops { + enum ath_bus_type ath_bus_type; + void (*read_cachesize)(struct ath_common *common, int *csz); + bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data); ++ int (*eeprom_read_mac)(struct ath5k_hw *ah, u8 *mac); + }; + + /* +@@ -1244,7 +1245,6 @@ int ath5k_hw_dma_stop(struct ath5k_hw *a + /* EEPROM access functions */ + int ath5k_eeprom_init(struct ath5k_hw *ah); + void ath5k_eeprom_detach(struct ath5k_hw *ah); +-int ath5k_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac); + + + /* Protocol Control Unit Functions */ +--- a/drivers/net/wireless/ath/ath5k/eeprom.c ++++ b/drivers/net/wireless/ath/ath5k/eeprom.c +@@ -1723,46 +1723,6 @@ ath5k_eeprom_read_spur_chans(struct ath5 + return ret; + } + +-/* +- * Read the MAC address from eeprom or platform_data +- */ +-int ath5k_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac) +-{ +- u8 mac_d[ETH_ALEN] = {}; +- u32 total, offset; +- u16 data; +- int octet; +- 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; +- } +- +- AR5K_EEPROM_READ(0x20, data); +- +- for (offset = 0x1f, octet = 0, total = 0; offset >= 0x1d; offset--) { +- AR5K_EEPROM_READ(offset, data); +- +- total += data; +- mac_d[octet + 1] = data & 0xff; +- mac_d[octet] = data >> 8; +- octet += 2; +- } +- +- if (!total || total == 3 * 0xffff) +- return -EINVAL; +- +- memcpy(mac, mac_d, ETH_ALEN); +- +- return 0; +-} +- +- + /***********************\ + * Init/Detach functions * + \***********************/ +--- a/drivers/net/wireless/ath/ath5k/pci.c ++++ b/drivers/net/wireless/ath/ath5k/pci.c +@@ -18,6 +18,7 @@ + #include <linux/pci.h> + #include <linux/pci-aspm.h> + #include <linux/ath5k_platform.h> ++#include <linux/etherdevice.h> + #include "../ath.h" + #include "ath5k.h" + #include "debug.h" +@@ -122,11 +123,52 @@ int ath5k_hw_read_srev(struct ath5k_hw * + return 0; + } + ++/* ++ * Read the MAC address from eeprom or platform_data ++ */ ++static int ath5k_pci_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac) ++{ ++ u8 mac_d[ETH_ALEN] = {}; ++ u32 total, offset; ++ u16 data; ++ int octet; ++ 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; ++ } ++ ++ AR5K_EEPROM_READ(0x20, data); ++ ++ for (offset = 0x1f, octet = 0, total = 0; offset >= 0x1d; offset--) { ++ AR5K_EEPROM_READ(offset, data); ++ ++ total += data; ++ mac_d[octet + 1] = data & 0xff; ++ mac_d[octet] = data >> 8; ++ octet += 2; ++ } ++ ++ if (!total || total == 3 * 0xffff) ++ return -EINVAL; ++ ++ memcpy(mac, mac_d, ETH_ALEN); ++ ++ return 0; ++} ++ ++ + /* Common ath_bus_opts structure */ + static const struct ath_bus_ops ath_pci_bus_ops = { + .ath_bus_type = ATH_PCI, + .read_cachesize = ath5k_pci_read_cachesize, + .eeprom_read = ath5k_pci_eeprom_read, ++ .eeprom_read_mac = ath5k_pci_eeprom_read_mac, + }; + + /********************\ +--- a/drivers/net/wireless/ath/ath5k/ahb.c ++++ b/drivers/net/wireless/ath/ath5k/ahb.c +@@ -18,6 +18,7 @@ + + #include <linux/nl80211.h> + #include <linux/platform_device.h> ++#include <linux/etherdevice.h> + #include <ar231x_platform.h> + #include "ath5k.h" + #include "debug.h" +@@ -62,10 +63,27 @@ int ath5k_hw_read_srev(struct ath5k_hw * + return 0; + } + ++static int ath5k_ahb_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac) ++{ ++ struct ath5k_softc *sc = ah->ah_sc; ++ struct platform_device *pdev = to_platform_device(sc->dev); ++ struct ar231x_board_config *bcfg = pdev->dev.platform_data; ++ u8 *cfg_mac; ++ ++ if (to_platform_device(sc->dev)->id == 0) ++ cfg_mac = bcfg->config->wlan0_mac; ++ else ++ cfg_mac = bcfg->config->wlan1_mac; ++ ++ memcpy(mac, cfg_mac, ETH_ALEN); ++ return 0; ++} ++ + static const struct ath_bus_ops ath_ahb_bus_ops = { + .ath_bus_type = ATH_AHB, + .read_cachesize = ath5k_ahb_read_cachesize, + .eeprom_read = ath5k_ahb_eeprom_read, ++ .eeprom_read_mac = ath5k_ahb_eeprom_read_mac, + }; + + /*Initialization*/ +--- a/drivers/net/wireless/ath/ath5k/base.c ++++ b/drivers/net/wireless/ath/ath5k/base.c +@@ -2880,7 +2880,7 @@ ath5k_init(struct ieee80211_hw *hw) + INIT_WORK(&sc->reset_work, ath5k_reset_work); + INIT_DELAYED_WORK(&sc->tx_complete_work, ath5k_tx_complete_poll_work); + +- ret = ath5k_eeprom_read_mac(ah, mac); ++ ret = ath5k_hw_common(ah)->bus_ops->eeprom_read_mac(ah, mac); + if (ret) { + ATH5K_ERR(sc, "unable to read address from EEPROM\n"); + goto err_queues; |