Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Sujith Manoharan and committed by
John W. Linville
0f978bfa 492f478d

+165 -12
+126
drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h
··· 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 + 20 + static 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 */
+9 -3
drivers/net/wireless/ath/ath9k/ar9003_hw.c
··· 17 17 #include "hw.h" 18 18 #include "ar9003_mac.h" 19 19 #include "ar9003_2p2_initvals.h" 20 + #include "ar9003_buffalo_initvals.h" 20 21 #include "ar9485_initvals.h" 21 22 #include "ar9340_initvals.h" 22 23 #include "ar9330_1p1_initvals.h" ··· 593 592 else if (AR_SREV_9565(ah)) 594 593 INIT_INI_ARRAY(&ah->iniModesTxGain, 595 594 ar9565_1p0_modes_high_power_tx_gain_table); 596 - else 597 - INIT_INI_ARRAY(&ah->iniModesTxGain, 598 - ar9300Modes_high_power_tx_gain_table_2p2); 595 + else { 596 + if (ah->config.tx_gain_buffalo) 597 + INIT_INI_ARRAY(&ah->iniModesTxGain, 598 + ar9300Modes_high_power_tx_gain_table_buffalo); 599 + else 600 + INIT_INI_ARRAY(&ah->iniModesTxGain, 601 + ar9300Modes_high_power_tx_gain_table_2p2); 602 + } 599 603 } 600 604 601 605 static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
+1
drivers/net/wireless/ath/ath9k/hw.h
··· 316 316 bool xatten_margin_cfg; 317 317 bool alt_mingainidx; 318 318 bool no_pll_pwrsave; 319 + bool tx_gain_buffalo; 319 320 }; 320 321 321 322 enum ath9k_int {
+27 -9
drivers/net/wireless/ath/ath9k/init.c
··· 554 554 sc->spec_config.fft_period = 0xF; 555 555 } 556 556 557 - static void ath9k_init_platform(struct ath_softc *sc) 557 + static void ath9k_init_pcoem_platform(struct ath_softc *sc) 558 558 { 559 559 struct ath_hw *ah = sc->sc_ah; 560 560 struct ath9k_hw_capabilities *pCap = &ah->caps; ··· 664 664 release_firmware(sc->sc_ah->eeprom_blob); 665 665 } 666 666 667 + static 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 + 667 688 static int ath9k_init_softc(u16 devid, struct ath_softc *sc, 668 689 const struct ath_bus_ops *bus_ops) 669 690 { ··· 738 717 /* 739 718 * Platform quirks. 740 719 */ 741 - ath9k_init_platform(sc); 720 + ath9k_init_pcoem_platform(sc); 721 + 722 + ret = ath9k_init_soc_platform(sc); 723 + if (ret) 724 + return ret; 742 725 743 726 /* 744 727 * Enable WLAN/BT RX Antenna diversity only when: ··· 756 731 common->bt_ant_diversity = 1; 757 732 758 733 spin_lock_init(&common->cc_lock); 759 - 760 734 spin_lock_init(&sc->sc_serial_rw); 761 735 spin_lock_init(&sc->sc_pm_lock); 762 736 mutex_init(&sc->mutex); ··· 776 752 */ 777 753 ath_read_cachesize(common, &csz); 778 754 common->cachelsz = csz << 2; /* convert to bytes */ 779 - 780 - if (pdata && pdata->eeprom_name) { 781 - ret = ath9k_eeprom_request(sc, pdata->eeprom_name); 782 - if (ret) 783 - return ret; 784 - } 785 755 786 756 /* Initializes the hardware for all supported chipsets */ 787 757 ret = ath9k_hw_init(ah);
+2
include/linux/ath9k_platform.h
··· 32 32 u32 gpio_val; 33 33 34 34 bool is_clk_25mhz; 35 + bool tx_gain_buffalo; 36 + 35 37 int (*get_mac_revision)(void); 36 38 int (*external_reset)(void); 37 39 };