aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSujith Manoharan <c_manoha@qca.qualcomm.com>2013-12-06 05:58:45 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-12-09 15:37:58 -0500
commit0f978bfaf2600040f9826f394eb12e023bef3068 (patch)
tree57d58a226a986fc7cf0ed4db0c9d041d0f68884e
parent492f478d89b28c97166e4540aa13ac0e7abaa29f (diff)
ath9k: Use a separate TX gain table for WZR-HP-G450H
The Buffalo device WZR-HP-G450H uses the index 3 for TX gain, which is set to the high_power table currently. Later variants of the router use the same index, but instead refer to the low_ob_db gain table. This is not handled in the driver since there is no way to distinguish board revisions and the high_power table is used (incorrectly) for the newer variants. By default, devices based on AR9300 using the TX gain index 3 have to use the high_power table. To make sure that WZR-HP-G450H is not broken when the high_power table is updated, use a separate array based on information obtained from the platform data. The current situation where only the original variant of WZR-HP-G450H works properly stays unchanged. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h126
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_hw.c12
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/init.c36
-rw-r--r--include/linux/ath9k_platform.h2
5 files changed, 165 insertions, 12 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h
new file mode 100644
index 000000000000..59cf738f70df
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h
@@ -0,0 +1,126 @@
1/*
2 * Copyright (c) 2013 Qualcomm Atheros Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef INITVALS_9003_BUFFALO_H
18#define INITVALS_9003_BUFFALO_H
19
20static const u32 ar9300Modes_high_power_tx_gain_table_buffalo[][5] = {
21 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
22 {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
23 {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
24 {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
25 {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
26 {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
27 {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
28 {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
29 {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004},
30 {0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200},
31 {0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202},
32 {0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400},
33 {0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402},
34 {0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404},
35 {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603},
36 {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02},
37 {0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04},
38 {0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20},
39 {0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20},
40 {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22},
41 {0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24},
42 {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640},
43 {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
44 {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
45 {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
46 {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
47 {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
48 {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
49 {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
50 {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9},
51 {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb},
52 {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
53 {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
54 {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
55 {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
56 {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
57 {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
58 {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
59 {0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000},
60 {0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002},
61 {0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004},
62 {0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200},
63 {0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202},
64 {0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400},
65 {0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402},
66 {0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404},
67 {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603},
68 {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02},
69 {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04},
70 {0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20},
71 {0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20},
72 {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22},
73 {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24},
74 {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640},
75 {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660},
76 {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861},
77 {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81},
78 {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83},
79 {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84},
80 {0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3},
81 {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5},
82 {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9},
83 {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb},
84 {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
85 {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
86 {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
87 {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
88 {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
89 {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
90 {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
91 {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
92 {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
93 {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
94 {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
95 {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
96 {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
97 {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
98 {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
99 {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
100 {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
101 {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
102 {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
103 {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
104 {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
105 {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
106 {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
107 {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
108 {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
109 {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
110 {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
111 {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
112 {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
113 {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
114 {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
115 {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
116 {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
117 {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
118 {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
119 {0x00016448, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
120 {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
121 {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
122 {0x00016848, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
123 {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
124};
125
126#endif /* INITVALS_9003_BUFFALO_H */
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
index 4e8ae4a79dc0..29613ebbc5d7 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
@@ -17,6 +17,7 @@
17#include "hw.h" 17#include "hw.h"
18#include "ar9003_mac.h" 18#include "ar9003_mac.h"
19#include "ar9003_2p2_initvals.h" 19#include "ar9003_2p2_initvals.h"
20#include "ar9003_buffalo_initvals.h"
20#include "ar9485_initvals.h" 21#include "ar9485_initvals.h"
21#include "ar9340_initvals.h" 22#include "ar9340_initvals.h"
22#include "ar9330_1p1_initvals.h" 23#include "ar9330_1p1_initvals.h"
@@ -592,9 +593,14 @@ static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)
592 else if (AR_SREV_9565(ah)) 593 else if (AR_SREV_9565(ah))
593 INIT_INI_ARRAY(&ah->iniModesTxGain, 594 INIT_INI_ARRAY(&ah->iniModesTxGain,
594 ar9565_1p0_modes_high_power_tx_gain_table); 595 ar9565_1p0_modes_high_power_tx_gain_table);
595 else 596 else {
596 INIT_INI_ARRAY(&ah->iniModesTxGain, 597 if (ah->config.tx_gain_buffalo)
597 ar9300Modes_high_power_tx_gain_table_2p2); 598 INIT_INI_ARRAY(&ah->iniModesTxGain,
599 ar9300Modes_high_power_tx_gain_table_buffalo);
600 else
601 INIT_INI_ARRAY(&ah->iniModesTxGain,
602 ar9300Modes_high_power_tx_gain_table_2p2);
603 }
598} 604}
599 605
600static void ar9003_tx_gain_table_mode4(struct ath_hw *ah) 606static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 7490047acd11..b1ff54631dca 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -316,6 +316,7 @@ struct ath9k_ops_config {
316 bool xatten_margin_cfg; 316 bool xatten_margin_cfg;
317 bool alt_mingainidx; 317 bool alt_mingainidx;
318 bool no_pll_pwrsave; 318 bool no_pll_pwrsave;
319 bool tx_gain_buffalo;
319}; 320};
320 321
321enum ath9k_int { 322enum ath9k_int {
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index 5a0b7e82c85f..609b7e13f3f0 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -554,7 +554,7 @@ static void ath9k_init_misc(struct ath_softc *sc)
554 sc->spec_config.fft_period = 0xF; 554 sc->spec_config.fft_period = 0xF;
555} 555}
556 556
557static void ath9k_init_platform(struct ath_softc *sc) 557static void ath9k_init_pcoem_platform(struct ath_softc *sc)
558{ 558{
559 struct ath_hw *ah = sc->sc_ah; 559 struct ath_hw *ah = sc->sc_ah;
560 struct ath9k_hw_capabilities *pCap = &ah->caps; 560 struct ath9k_hw_capabilities *pCap = &ah->caps;
@@ -664,6 +664,27 @@ static void ath9k_eeprom_release(struct ath_softc *sc)
664 release_firmware(sc->sc_ah->eeprom_blob); 664 release_firmware(sc->sc_ah->eeprom_blob);
665} 665}
666 666
667static int ath9k_init_soc_platform(struct ath_softc *sc)
668{
669 struct ath9k_platform_data *pdata = sc->dev->platform_data;
670 struct ath_hw *ah = sc->sc_ah;
671 int ret = 0;
672
673 if (!pdata)
674 return 0;
675
676 if (pdata->eeprom_name) {
677 ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
678 if (ret)
679 return ret;
680 }
681
682 if (pdata->tx_gain_buffalo)
683 ah->config.tx_gain_buffalo = true;
684
685 return ret;
686}
687
667static int ath9k_init_softc(u16 devid, struct ath_softc *sc, 688static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
668 const struct ath_bus_ops *bus_ops) 689 const struct ath_bus_ops *bus_ops)
669{ 690{
@@ -717,7 +738,11 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
717 /* 738 /*
718 * Platform quirks. 739 * Platform quirks.
719 */ 740 */
720 ath9k_init_platform(sc); 741 ath9k_init_pcoem_platform(sc);
742
743 ret = ath9k_init_soc_platform(sc);
744 if (ret)
745 return ret;
721 746
722 /* 747 /*
723 * Enable WLAN/BT RX Antenna diversity only when: 748 * Enable WLAN/BT RX Antenna diversity only when:
@@ -731,7 +756,6 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
731 common->bt_ant_diversity = 1; 756 common->bt_ant_diversity = 1;
732 757
733 spin_lock_init(&common->cc_lock); 758 spin_lock_init(&common->cc_lock);
734
735 spin_lock_init(&sc->sc_serial_rw); 759 spin_lock_init(&sc->sc_serial_rw);
736 spin_lock_init(&sc->sc_pm_lock); 760 spin_lock_init(&sc->sc_pm_lock);
737 mutex_init(&sc->mutex); 761 mutex_init(&sc->mutex);
@@ -753,12 +777,6 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
753 ath_read_cachesize(common, &csz); 777 ath_read_cachesize(common, &csz);
754 common->cachelsz = csz << 2; /* convert to bytes */ 778 common->cachelsz = csz << 2; /* convert to bytes */
755 779
756 if (pdata && pdata->eeprom_name) {
757 ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
758 if (ret)
759 return ret;
760 }
761
762 /* Initializes the hardware for all supported chipsets */ 780 /* Initializes the hardware for all supported chipsets */
763 ret = ath9k_hw_init(ah); 781 ret = ath9k_hw_init(ah);
764 if (ret) 782 if (ret)
diff --git a/include/linux/ath9k_platform.h b/include/linux/ath9k_platform.h
index fcdd81bd5314..8598f8eacb20 100644
--- a/include/linux/ath9k_platform.h
+++ b/include/linux/ath9k_platform.h
@@ -32,6 +32,8 @@ struct ath9k_platform_data {
32 u32 gpio_val; 32 u32 gpio_val;
33 33
34 bool is_clk_25mhz; 34 bool is_clk_25mhz;
35 bool tx_gain_buffalo;
36
35 int (*get_mac_revision)(void); 37 int (*get_mac_revision)(void);
36 int (*external_reset)(void); 38 int (*external_reset)(void);
37}; 39};