aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGertjan van Wingerde <gwingerde@gmail.com>2011-05-18 14:25:31 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-06-01 15:10:59 -0400
commit872834dfb38edc6f72cfc783a5ce78f2a9f36ec5 (patch)
treea2351915013cf3ce8a9c8f54a98e2e5297efc73d
parent8f96e91fa53761fd63dceedac6bbe4b39e5c5072 (diff)
rt2x00: Add support for RT3572/RT3592/RT3592+Bluetooth combo card
(based on an earlier patch submitted by Shiang) Add support for RT3572/RT3592/RT3592+Bluetooth combo card Signed-off-by: Shiang Tu <shiang_tu@ralinktech.com> Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/rt2x00/rt2800.h16
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c282
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.c4
3 files changed, 295 insertions, 7 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index f67bc9b31b28..c69a7d71f4ca 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -1740,6 +1740,7 @@ struct mac_iveiv_entry {
1740/* 1740/*
1741 * BBP 3: RX Antenna 1741 * BBP 3: RX Antenna
1742 */ 1742 */
1743#define BBP3_RX_ADC FIELD8(0x03)
1743#define BBP3_RX_ANTENNA FIELD8(0x18) 1744#define BBP3_RX_ANTENNA FIELD8(0x18)
1744#define BBP3_HT40_MINUS FIELD8(0x20) 1745#define BBP3_HT40_MINUS FIELD8(0x20)
1745 1746
@@ -1783,6 +1784,8 @@ struct mac_iveiv_entry {
1783#define RFCSR1_TX0_PD FIELD8(0x08) 1784#define RFCSR1_TX0_PD FIELD8(0x08)
1784#define RFCSR1_RX1_PD FIELD8(0x10) 1785#define RFCSR1_RX1_PD FIELD8(0x10)
1785#define RFCSR1_TX1_PD FIELD8(0x20) 1786#define RFCSR1_TX1_PD FIELD8(0x20)
1787#define RFCSR1_RX2_PD FIELD8(0x40)
1788#define RFCSR1_TX2_PD FIELD8(0x80)
1786 1789
1787/* 1790/*
1788 * RFCSR 2: 1791 * RFCSR 2:
@@ -1790,15 +1793,25 @@ struct mac_iveiv_entry {
1790#define RFCSR2_RESCAL_EN FIELD8(0x80) 1793#define RFCSR2_RESCAL_EN FIELD8(0x80)
1791 1794
1792/* 1795/*
1796 * FRCSR 5:
1797 */
1798#define RFCSR5_R1 FIELD8(0x0c)
1799
1800/*
1793 * RFCSR 6: 1801 * RFCSR 6:
1794 */ 1802 */
1795#define RFCSR6_R1 FIELD8(0x03) 1803#define RFCSR6_R1 FIELD8(0x03)
1796#define RFCSR6_R2 FIELD8(0x40) 1804#define RFCSR6_R2 FIELD8(0x40)
1805#define RFCSR6_TXDIV FIELD8(0x0c)
1797 1806
1798/* 1807/*
1799 * RFCSR 7: 1808 * RFCSR 7:
1800 */ 1809 */
1801#define RFCSR7_RF_TUNING FIELD8(0x01) 1810#define RFCSR7_RF_TUNING FIELD8(0x01)
1811#define RFCSR7_R02 FIELD8(0x07)
1812#define RFCSR7_R3 FIELD8(0x08)
1813#define RFCSR7_R45 FIELD8(0x30)
1814#define RFCSR7_R67 FIELD8(0xc0)
1802 1815
1803/* 1816/*
1804 * RFCSR 11: 1817 * RFCSR 11:
@@ -1809,11 +1822,13 @@ struct mac_iveiv_entry {
1809 * RFCSR 12: 1822 * RFCSR 12:
1810 */ 1823 */
1811#define RFCSR12_TX_POWER FIELD8(0x1f) 1824#define RFCSR12_TX_POWER FIELD8(0x1f)
1825#define RFCSR12_DR0 FIELD8(0xe0)
1812 1826
1813/* 1827/*
1814 * RFCSR 13: 1828 * RFCSR 13:
1815 */ 1829 */
1816#define RFCSR13_TX_POWER FIELD8(0x1f) 1830#define RFCSR13_TX_POWER FIELD8(0x1f)
1831#define RFCSR13_DR0 FIELD8(0xe0)
1817 1832
1818/* 1833/*
1819 * RFCSR 15: 1834 * RFCSR 15:
@@ -2256,6 +2271,7 @@ struct mac_iveiv_entry {
2256#define MCU_ANT_SELECT 0X73 2271#define MCU_ANT_SELECT 0X73
2257#define MCU_BBP_SIGNAL 0x80 2272#define MCU_BBP_SIGNAL 0x80
2258#define MCU_POWER_SAVE 0x83 2273#define MCU_POWER_SAVE 0x83
2274#define MCU_BAND_SELECT 0x91
2259 2275
2260/* 2276/*
2261 * MCU mailbox tokens 2277 * MCU mailbox tokens
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 2ed3fe0d6208..f0988d8736c3 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -401,7 +401,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
401 return -EBUSY; 401 return -EBUSY;
402 402
403 if (rt2x00_is_pci(rt2x00dev)) { 403 if (rt2x00_is_pci(rt2x00dev)) {
404 if (rt2x00_rt(rt2x00dev, RT5390)) { 404 if (rt2x00_rt(rt2x00dev, RT3572) ||
405 rt2x00_rt(rt2x00dev, RT5390)) {
405 rt2800_register_read(rt2x00dev, AUX_CTRL, &reg); 406 rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
406 rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1); 407 rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
407 rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1); 408 rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -1433,6 +1434,40 @@ void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
1433} 1434}
1434EXPORT_SYMBOL_GPL(rt2800_config_erp); 1435EXPORT_SYMBOL_GPL(rt2800_config_erp);
1435 1436
1437static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev)
1438{
1439 u32 reg;
1440 u16 eeprom;
1441 u8 led_ctrl, led_g_mode, led_r_mode;
1442
1443 rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
1444 if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
1445 rt2x00_set_field32(&reg, GPIO_SWITCH_0, 1);
1446 rt2x00_set_field32(&reg, GPIO_SWITCH_1, 1);
1447 } else {
1448 rt2x00_set_field32(&reg, GPIO_SWITCH_0, 0);
1449 rt2x00_set_field32(&reg, GPIO_SWITCH_1, 0);
1450 }
1451 rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
1452
1453 rt2800_register_read(rt2x00dev, LED_CFG, &reg);
1454 led_g_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 3 : 0;
1455 led_r_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 0 : 3;
1456 if (led_g_mode != rt2x00_get_field32(reg, LED_CFG_G_LED_MODE) ||
1457 led_r_mode != rt2x00_get_field32(reg, LED_CFG_R_LED_MODE)) {
1458 rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
1459 led_ctrl = rt2x00_get_field16(eeprom, EEPROM_FREQ_LED_MODE);
1460 if (led_ctrl == 0 || led_ctrl > 0x40) {
1461 rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, led_g_mode);
1462 rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, led_r_mode);
1463 rt2800_register_write(rt2x00dev, LED_CFG, reg);
1464 } else {
1465 rt2800_mcu_request(rt2x00dev, MCU_BAND_SELECT, 0xff,
1466 (led_g_mode << 2) | led_r_mode, 1);
1467 }
1468 }
1469}
1470
1436static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev, 1471static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev,
1437 enum antenna ant) 1472 enum antenna ant)
1438{ 1473{
@@ -1463,6 +1498,10 @@ void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant)
1463 rt2800_bbp_read(rt2x00dev, 1, &r1); 1498 rt2800_bbp_read(rt2x00dev, 1, &r1);
1464 rt2800_bbp_read(rt2x00dev, 3, &r3); 1499 rt2800_bbp_read(rt2x00dev, 3, &r3);
1465 1500
1501 if (rt2x00_rt(rt2x00dev, RT3572) &&
1502 test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags))
1503 rt2800_config_3572bt_ant(rt2x00dev);
1504
1466 /* 1505 /*
1467 * Configure the TX antenna. 1506 * Configure the TX antenna.
1468 */ 1507 */
@@ -1471,7 +1510,11 @@ void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant)
1471 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0); 1510 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
1472 break; 1511 break;
1473 case 2: 1512 case 2:
1474 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2); 1513 if (rt2x00_rt(rt2x00dev, RT3572) &&
1514 test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags))
1515 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 1);
1516 else
1517 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
1475 break; 1518 break;
1476 case 3: 1519 case 3:
1477 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0); 1520 rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
@@ -1496,7 +1539,15 @@ void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant)
1496 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0); 1539 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
1497 break; 1540 break;
1498 case 2: 1541 case 2:
1499 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1); 1542 if (rt2x00_rt(rt2x00dev, RT3572) &&
1543 test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
1544 rt2x00_set_field8(&r3, BBP3_RX_ADC, 1);
1545 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA,
1546 rt2x00dev->curr_band == IEEE80211_BAND_5GHZ);
1547 rt2800_set_ant_diversity(rt2x00dev, ANTENNA_B);
1548 } else {
1549 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
1550 }
1500 break; 1551 break;
1501 case 3: 1552 case 3:
1502 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2); 1553 rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2);
@@ -1630,6 +1681,161 @@ static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev,
1630 rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); 1681 rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
1631} 1682}
1632 1683
1684static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
1685 struct ieee80211_conf *conf,
1686 struct rf_channel *rf,
1687 struct channel_info *info)
1688{
1689 u8 rfcsr;
1690 u32 reg;
1691
1692 if (rf->channel <= 14) {
1693 rt2800_bbp_write(rt2x00dev, 25, 0x15);
1694 rt2800_bbp_write(rt2x00dev, 26, 0x85);
1695 } else {
1696 rt2800_bbp_write(rt2x00dev, 25, 0x09);
1697 rt2800_bbp_write(rt2x00dev, 26, 0xff);
1698 }
1699
1700 rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
1701 rt2800_rfcsr_write(rt2x00dev, 3, rf->rf3);
1702
1703 rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
1704 rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
1705 if (rf->channel <= 14)
1706 rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 2);
1707 else
1708 rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 1);
1709 rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
1710
1711 rt2800_rfcsr_read(rt2x00dev, 5, &rfcsr);
1712 if (rf->channel <= 14)
1713 rt2x00_set_field8(&rfcsr, RFCSR5_R1, 1);
1714 else
1715 rt2x00_set_field8(&rfcsr, RFCSR5_R1, 2);
1716 rt2800_rfcsr_write(rt2x00dev, 5, rfcsr);
1717
1718 rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
1719 if (rf->channel <= 14) {
1720 rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 3);
1721 rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
1722 (info->default_power1 & 0x3) |
1723 ((info->default_power1 & 0xC) << 1));
1724 } else {
1725 rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 7);
1726 rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
1727 (info->default_power1 & 0x3) |
1728 ((info->default_power1 & 0xC) << 1));
1729 }
1730 rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
1731
1732 rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr);
1733 if (rf->channel <= 14) {
1734 rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 3);
1735 rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
1736 (info->default_power2 & 0x3) |
1737 ((info->default_power2 & 0xC) << 1));
1738 } else {
1739 rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 7);
1740 rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
1741 (info->default_power2 & 0x3) |
1742 ((info->default_power2 & 0xC) << 1));
1743 }
1744 rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
1745
1746 rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
1747 rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
1748 rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
1749 rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
1750 rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
1751 rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
1752 if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
1753 if (rf->channel <= 14) {
1754 rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
1755 rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
1756 }
1757 rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
1758 rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
1759 } else {
1760 switch (rt2x00dev->default_ant.tx_chain_num) {
1761 case 1:
1762 rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
1763 case 2:
1764 rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
1765 break;
1766 }
1767
1768 switch (rt2x00dev->default_ant.rx_chain_num) {
1769 case 1:
1770 rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
1771 case 2:
1772 rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
1773 break;
1774 }
1775 }
1776 rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
1777
1778 rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
1779 rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
1780 rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
1781
1782 rt2800_rfcsr_write(rt2x00dev, 24,
1783 rt2x00dev->calibration[conf_is_ht40(conf)]);
1784 rt2800_rfcsr_write(rt2x00dev, 31,
1785 rt2x00dev->calibration[conf_is_ht40(conf)]);
1786
1787 if (rf->channel <= 14) {
1788 rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
1789 rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
1790 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
1791 rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
1792 rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
1793 rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
1794 rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
1795 rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
1796 rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
1797 rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
1798 rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
1799 rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
1800 rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
1801 } else {
1802 rt2800_rfcsr_write(rt2x00dev, 7, 0x14);
1803 rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
1804 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
1805 rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
1806 rt2800_rfcsr_write(rt2x00dev, 15, 0x43);
1807 rt2800_rfcsr_write(rt2x00dev, 16, 0x7a);
1808 rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
1809 if (rf->channel <= 64) {
1810 rt2800_rfcsr_write(rt2x00dev, 19, 0xb7);
1811 rt2800_rfcsr_write(rt2x00dev, 20, 0xf6);
1812 rt2800_rfcsr_write(rt2x00dev, 25, 0x3d);
1813 } else if (rf->channel <= 128) {
1814 rt2800_rfcsr_write(rt2x00dev, 19, 0x74);
1815 rt2800_rfcsr_write(rt2x00dev, 20, 0xf4);
1816 rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
1817 } else {
1818 rt2800_rfcsr_write(rt2x00dev, 19, 0x72);
1819 rt2800_rfcsr_write(rt2x00dev, 20, 0xf3);
1820 rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
1821 }
1822 rt2800_rfcsr_write(rt2x00dev, 26, 0x87);
1823 rt2800_rfcsr_write(rt2x00dev, 27, 0x01);
1824 rt2800_rfcsr_write(rt2x00dev, 29, 0x9f);
1825 }
1826
1827 rt2800_register_read(rt2x00dev, GPIO_CTRL_CFG, &reg);
1828 rt2x00_set_field32(&reg, GPIO_CTRL_CFG_GPIOD_BIT7, 0);
1829 if (rf->channel <= 14)
1830 rt2x00_set_field32(&reg, GPIO_CTRL_CFG_BIT7, 1);
1831 else
1832 rt2x00_set_field32(&reg, GPIO_CTRL_CFG_BIT7, 0);
1833 rt2800_register_write(rt2x00dev, GPIO_CTRL_CFG, reg);
1834
1835 rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
1836 rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
1837 rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
1838}
1633 1839
1634#define RT5390_POWER_BOUND 0x27 1840#define RT5390_POWER_BOUND 0x27
1635#define RT5390_FREQ_OFFSET_BOUND 0x5f 1841#define RT5390_FREQ_OFFSET_BOUND 0x5f
@@ -1748,9 +1954,10 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
1748 rt2x00_rf(rt2x00dev, RF3020) || 1954 rt2x00_rf(rt2x00dev, RF3020) ||
1749 rt2x00_rf(rt2x00dev, RF3021) || 1955 rt2x00_rf(rt2x00dev, RF3021) ||
1750 rt2x00_rf(rt2x00dev, RF3022) || 1956 rt2x00_rf(rt2x00dev, RF3022) ||
1751 rt2x00_rf(rt2x00dev, RF3052) ||
1752 rt2x00_rf(rt2x00dev, RF3320)) 1957 rt2x00_rf(rt2x00dev, RF3320))
1753 rt2800_config_channel_rf3xxx(rt2x00dev, conf, rf, info); 1958 rt2800_config_channel_rf3xxx(rt2x00dev, conf, rf, info);
1959 else if (rt2x00_rf(rt2x00dev, RF3052))
1960 rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
1754 else if (rt2x00_rf(rt2x00dev, RF5370) || 1961 else if (rt2x00_rf(rt2x00dev, RF5370) ||
1755 rt2x00_rf(rt2x00dev, RF5390)) 1962 rt2x00_rf(rt2x00dev, RF5390))
1756 rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info); 1963 rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
@@ -1777,7 +1984,10 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
1777 } 1984 }
1778 } 1985 }
1779 } else { 1986 } else {
1780 rt2800_bbp_write(rt2x00dev, 82, 0xf2); 1987 if (rt2x00_rt(rt2x00dev, RT3572))
1988 rt2800_bbp_write(rt2x00dev, 82, 0x94);
1989 else
1990 rt2800_bbp_write(rt2x00dev, 82, 0xf2);
1781 1991
1782 if (test_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags)) 1992 if (test_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags))
1783 rt2800_bbp_write(rt2x00dev, 75, 0x46); 1993 rt2800_bbp_write(rt2x00dev, 75, 0x46);
@@ -1791,6 +2001,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
1791 rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14); 2001 rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14);
1792 rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg); 2002 rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg);
1793 2003
2004 if (rt2x00_rt(rt2x00dev, RT3572))
2005 rt2800_rfcsr_write(rt2x00dev, 8, 0);
2006
1794 tx_pin = 0; 2007 tx_pin = 0;
1795 2008
1796 /* Turn on unused PA or LNA when not using 1T or 1R */ 2009 /* Turn on unused PA or LNA when not using 1T or 1R */
@@ -1820,6 +2033,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
1820 2033
1821 rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); 2034 rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
1822 2035
2036 if (rt2x00_rt(rt2x00dev, RT3572))
2037 rt2800_rfcsr_write(rt2x00dev, 8, 0x80);
2038
1823 rt2800_bbp_read(rt2x00dev, 4, &bbp); 2039 rt2800_bbp_read(rt2x00dev, 4, &bbp);
1824 rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf)); 2040 rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
1825 rt2800_bbp_write(rt2x00dev, 4, bbp); 2041 rt2800_bbp_write(rt2x00dev, 4, bbp);
@@ -2419,6 +2635,9 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
2419 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); 2635 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
2420 rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); 2636 rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
2421 rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030); 2637 rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030);
2638 } else if (rt2x00_rt(rt2x00dev, RT3572)) {
2639 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
2640 rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
2422 } else if (rt2x00_rt(rt2x00dev, RT5390)) { 2641 } else if (rt2x00_rt(rt2x00dev, RT5390)) {
2423 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); 2642 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
2424 rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); 2643 rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
@@ -2805,6 +3024,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
2805 } 3024 }
2806 3025
2807 if (rt2800_is_305x_soc(rt2x00dev) || 3026 if (rt2800_is_305x_soc(rt2x00dev) ||
3027 rt2x00_rt(rt2x00dev, RT3572) ||
2808 rt2x00_rt(rt2x00dev, RT5390)) 3028 rt2x00_rt(rt2x00dev, RT5390))
2809 rt2800_bbp_write(rt2x00dev, 31, 0x08); 3029 rt2800_bbp_write(rt2x00dev, 31, 0x08);
2810 3030
@@ -2834,6 +3054,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
2834 rt2x00_rt(rt2x00dev, RT3071) || 3054 rt2x00_rt(rt2x00dev, RT3071) ||
2835 rt2x00_rt(rt2x00dev, RT3090) || 3055 rt2x00_rt(rt2x00dev, RT3090) ||
2836 rt2x00_rt(rt2x00dev, RT3390) || 3056 rt2x00_rt(rt2x00dev, RT3390) ||
3057 rt2x00_rt(rt2x00dev, RT3572) ||
2837 rt2x00_rt(rt2x00dev, RT5390)) { 3058 rt2x00_rt(rt2x00dev, RT5390)) {
2838 rt2800_bbp_write(rt2x00dev, 79, 0x13); 3059 rt2800_bbp_write(rt2x00dev, 79, 0x13);
2839 rt2800_bbp_write(rt2x00dev, 80, 0x05); 3060 rt2800_bbp_write(rt2x00dev, 80, 0x05);
@@ -2874,6 +3095,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
2874 rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) || 3095 rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
2875 rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) || 3096 rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
2876 rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) || 3097 rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
3098 rt2x00_rt(rt2x00dev, RT3572) ||
2877 rt2x00_rt(rt2x00dev, RT5390) || 3099 rt2x00_rt(rt2x00dev, RT5390) ||
2878 rt2800_is_305x_soc(rt2x00dev)) 3100 rt2800_is_305x_soc(rt2x00dev))
2879 rt2800_bbp_write(rt2x00dev, 103, 0xc0); 3101 rt2800_bbp_write(rt2x00dev, 103, 0xc0);
@@ -2901,6 +3123,7 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
2901 if (rt2x00_rt(rt2x00dev, RT3071) || 3123 if (rt2x00_rt(rt2x00dev, RT3071) ||
2902 rt2x00_rt(rt2x00dev, RT3090) || 3124 rt2x00_rt(rt2x00dev, RT3090) ||
2903 rt2x00_rt(rt2x00dev, RT3390) || 3125 rt2x00_rt(rt2x00dev, RT3390) ||
3126 rt2x00_rt(rt2x00dev, RT3572) ||
2904 rt2x00_rt(rt2x00dev, RT5390)) { 3127 rt2x00_rt(rt2x00dev, RT5390)) {
2905 rt2800_bbp_read(rt2x00dev, 138, &value); 3128 rt2800_bbp_read(rt2x00dev, 138, &value);
2906 3129
@@ -3037,6 +3260,7 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
3037 !rt2x00_rt(rt2x00dev, RT3071) && 3260 !rt2x00_rt(rt2x00dev, RT3071) &&
3038 !rt2x00_rt(rt2x00dev, RT3090) && 3261 !rt2x00_rt(rt2x00dev, RT3090) &&
3039 !rt2x00_rt(rt2x00dev, RT3390) && 3262 !rt2x00_rt(rt2x00dev, RT3390) &&
3263 !rt2x00_rt(rt2x00dev, RT3572) &&
3040 !rt2x00_rt(rt2x00dev, RT5390) && 3264 !rt2x00_rt(rt2x00dev, RT5390) &&
3041 !rt2800_is_305x_soc(rt2x00dev)) 3265 !rt2800_is_305x_soc(rt2x00dev))
3042 return 0; 3266 return 0;
@@ -3115,6 +3339,38 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
3115 rt2800_rfcsr_write(rt2x00dev, 29, 0x8f); 3339 rt2800_rfcsr_write(rt2x00dev, 29, 0x8f);
3116 rt2800_rfcsr_write(rt2x00dev, 30, 0x20); 3340 rt2800_rfcsr_write(rt2x00dev, 30, 0x20);
3117 rt2800_rfcsr_write(rt2x00dev, 31, 0x0f); 3341 rt2800_rfcsr_write(rt2x00dev, 31, 0x0f);
3342 } else if (rt2x00_rt(rt2x00dev, RT3572)) {
3343 rt2800_rfcsr_write(rt2x00dev, 0, 0x70);
3344 rt2800_rfcsr_write(rt2x00dev, 1, 0x81);
3345 rt2800_rfcsr_write(rt2x00dev, 2, 0xf1);
3346 rt2800_rfcsr_write(rt2x00dev, 3, 0x02);
3347 rt2800_rfcsr_write(rt2x00dev, 4, 0x4c);
3348 rt2800_rfcsr_write(rt2x00dev, 5, 0x05);
3349 rt2800_rfcsr_write(rt2x00dev, 6, 0x4a);
3350 rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
3351 rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
3352 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
3353 rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
3354 rt2800_rfcsr_write(rt2x00dev, 12, 0x70);
3355 rt2800_rfcsr_write(rt2x00dev, 13, 0x65);
3356 rt2800_rfcsr_write(rt2x00dev, 14, 0xa0);
3357 rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
3358 rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
3359 rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
3360 rt2800_rfcsr_write(rt2x00dev, 18, 0xac);
3361 rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
3362 rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
3363 rt2800_rfcsr_write(rt2x00dev, 21, 0xd0);
3364 rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
3365 rt2800_rfcsr_write(rt2x00dev, 23, 0x3c);
3366 rt2800_rfcsr_write(rt2x00dev, 24, 0x16);
3367 rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
3368 rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
3369 rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
3370 rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
3371 rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
3372 rt2800_rfcsr_write(rt2x00dev, 30, 0x09);
3373 rt2800_rfcsr_write(rt2x00dev, 31, 0x10);
3118 } else if (rt2800_is_305x_soc(rt2x00dev)) { 3374 } else if (rt2800_is_305x_soc(rt2x00dev)) {
3119 rt2800_rfcsr_write(rt2x00dev, 0, 0x50); 3375 rt2800_rfcsr_write(rt2x00dev, 0, 0x50);
3120 rt2800_rfcsr_write(rt2x00dev, 1, 0x01); 3376 rt2800_rfcsr_write(rt2x00dev, 1, 0x01);
@@ -3264,6 +3520,19 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
3264 rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg); 3520 rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
3265 rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0); 3521 rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0);
3266 rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg); 3522 rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
3523 } else if (rt2x00_rt(rt2x00dev, RT3572)) {
3524 rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
3525 rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1);
3526 rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
3527
3528 rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
3529 rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
3530 rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
3531 rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
3532 msleep(1);
3533 rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
3534 rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
3535 rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
3267 } 3536 }
3268 3537
3269 /* 3538 /*
@@ -3276,7 +3545,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
3276 rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x19); 3545 rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x19);
3277 } else if (rt2x00_rt(rt2x00dev, RT3071) || 3546 } else if (rt2x00_rt(rt2x00dev, RT3071) ||
3278 rt2x00_rt(rt2x00dev, RT3090) || 3547 rt2x00_rt(rt2x00dev, RT3090) ||
3279 rt2x00_rt(rt2x00dev, RT3390)) { 3548 rt2x00_rt(rt2x00dev, RT3390) ||
3549 rt2x00_rt(rt2x00dev, RT3572)) {
3280 rt2x00dev->calibration[0] = 3550 rt2x00dev->calibration[0] =
3281 rt2800_init_rx_filter(rt2x00dev, false, 0x07, 0x13); 3551 rt2800_init_rx_filter(rt2x00dev, false, 0x07, 0x13);
3282 rt2x00dev->calibration[1] = 3552 rt2x00dev->calibration[1] =
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index cc4a54f571b8..5513edfa952a 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -501,7 +501,9 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
501 rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f); 501 rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
502 rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00); 502 rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
503 503
504 if (rt2x00_rt(rt2x00dev, RT5390)) { 504 if (rt2x00_is_pcie(rt2x00dev) &&
505 (rt2x00_rt(rt2x00dev, RT3572) ||
506 rt2x00_rt(rt2x00dev, RT5390))) {
505 rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg); 507 rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
506 rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1); 508 rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
507 rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1); 509 rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);