diff options
| author | Gertjan van Wingerde <gwingerde@gmail.com> | 2011-05-18 14:25:31 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2011-06-01 15:10:59 -0400 |
| commit | 872834dfb38edc6f72cfc783a5ce78f2a9f36ec5 (patch) | |
| tree | a2351915013cf3ce8a9c8f54a98e2e5297efc73d | |
| parent | 8f96e91fa53761fd63dceedac6bbe4b39e5c5072 (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.h | 16 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 282 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 4 |
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, ®); | 406 | rt2800_register_read(rt2x00dev, AUX_CTRL, ®); |
| 406 | rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1); | 407 | rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1); |
| 407 | rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); | 408 | rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); |
| @@ -1433,6 +1434,40 @@ void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp, | |||
| 1433 | } | 1434 | } |
| 1434 | EXPORT_SYMBOL_GPL(rt2800_config_erp); | 1435 | EXPORT_SYMBOL_GPL(rt2800_config_erp); |
| 1435 | 1436 | ||
| 1437 | static 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, ®); | ||
| 1444 | if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) { | ||
| 1445 | rt2x00_set_field32(®, GPIO_SWITCH_0, 1); | ||
| 1446 | rt2x00_set_field32(®, GPIO_SWITCH_1, 1); | ||
| 1447 | } else { | ||
| 1448 | rt2x00_set_field32(®, GPIO_SWITCH_0, 0); | ||
| 1449 | rt2x00_set_field32(®, GPIO_SWITCH_1, 0); | ||
| 1450 | } | ||
| 1451 | rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg); | ||
| 1452 | |||
| 1453 | rt2800_register_read(rt2x00dev, LED_CFG, ®); | ||
| 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(®, LED_CFG_G_LED_MODE, led_g_mode); | ||
| 1462 | rt2x00_set_field32(®, 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 | |||
| 1436 | static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev, | 1471 | static 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 | ||
| 1684 | static 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, ®); | ||
| 1828 | rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT7, 0); | ||
| 1829 | if (rf->channel <= 14) | ||
| 1830 | rt2x00_set_field32(®, GPIO_CTRL_CFG_BIT7, 1); | ||
| 1831 | else | ||
| 1832 | rt2x00_set_field32(®, 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(®, TX_BAND_CFG_BG, rf->channel <= 14); | 2001 | rt2x00_set_field32(®, 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, ®); | 3520 | rt2800_register_read(rt2x00dev, GPIO_SWITCH, ®); |
| 3265 | rt2x00_set_field32(®, GPIO_SWITCH_5, 0); | 3521 | rt2x00_set_field32(®, 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, ®); | ||
| 3529 | rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 3); | ||
| 3530 | rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); | ||
| 3531 | rt2800_register_write(rt2x00dev, LDO_CFG0, reg); | ||
| 3532 | msleep(1); | ||
| 3533 | rt2800_register_read(rt2x00dev, LDO_CFG0, ®); | ||
| 3534 | rt2x00_set_field32(®, 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, ®); | 507 | rt2x00pci_register_read(rt2x00dev, AUX_CTRL, ®); |
| 506 | rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1); | 508 | rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1); |
| 507 | rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); | 509 | rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); |
