aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2010-04-28 03:58:59 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-04-28 16:50:27 -0400
commitbaff8006b58bb7fca5d1ea1825bc8c6486900303 (patch)
treef12f9301364dd7bc4ea89fb94bf3c1d73e7678d5 /drivers
parent23a7a51c5a35b30aa3edcc31a6a57b01c523b4cd (diff)
rt2x00: rt2800lib: update rfcsr & bbp init code for SoC devices
Update the rfcsr and bbp init code for SoC devices to match with the latest Ralink driver. To have better control over which values are used for the register initialization create a new function rt2800_is_305x_soc which checks for SoC interface type, the correct RT chipset and the correct RF chipset. This is based on the assumption that all rt305x SoC devices use a rt2872 and rf3020/rf3021/rf3022. In case an unknown RF chipset is found on a SoC device with a rt2872 don't treat it as rt305x and just print a message. Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 12a49e0c4ac..674609d1a72 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -75,6 +75,23 @@ MODULE_LICENSE("GPL");
75 rt2800_regbusy_read((__dev), H2M_MAILBOX_CSR, \ 75 rt2800_regbusy_read((__dev), H2M_MAILBOX_CSR, \
76 H2M_MAILBOX_CSR_OWNER, (__reg)) 76 H2M_MAILBOX_CSR_OWNER, (__reg))
77 77
78static inline bool rt2800_is_305x_soc(struct rt2x00_dev *rt2x00dev)
79{
80 /* check for rt2872 on SoC */
81 if (!rt2x00_is_soc(rt2x00dev) ||
82 !rt2x00_rt(rt2x00dev, RT2872))
83 return false;
84
85 /* we know for sure that these rf chipsets are used on rt305x boards */
86 if (rt2x00_rf(rt2x00dev, RF3020) ||
87 rt2x00_rf(rt2x00dev, RF3021) ||
88 rt2x00_rf(rt2x00dev, RF3022))
89 return true;
90
91 NOTICE(rt2x00dev, "Unknown RF chipset on rt305x\n");
92 return false;
93}
94
78static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev, 95static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
79 const unsigned int word, const u8 value) 96 const unsigned int word, const u8 value)
80{ 97{
@@ -1555,6 +1572,9 @@ int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
1555 rt2800_wait_bbp_ready(rt2x00dev))) 1572 rt2800_wait_bbp_ready(rt2x00dev)))
1556 return -EACCES; 1573 return -EACCES;
1557 1574
1575 if (rt2800_is_305x_soc(rt2x00dev))
1576 rt2800_bbp_write(rt2x00dev, 31, 0x08);
1577
1558 rt2800_bbp_write(rt2x00dev, 65, 0x2c); 1578 rt2800_bbp_write(rt2x00dev, 65, 0x2c);
1559 rt2800_bbp_write(rt2x00dev, 66, 0x38); 1579 rt2800_bbp_write(rt2x00dev, 66, 0x38);
1560 1580
@@ -1575,6 +1595,9 @@ int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
1575 rt2800_bbp_write(rt2x00dev, 79, 0x13); 1595 rt2800_bbp_write(rt2x00dev, 79, 0x13);
1576 rt2800_bbp_write(rt2x00dev, 80, 0x05); 1596 rt2800_bbp_write(rt2x00dev, 80, 0x05);
1577 rt2800_bbp_write(rt2x00dev, 81, 0x33); 1597 rt2800_bbp_write(rt2x00dev, 81, 0x33);
1598 } else if (rt2800_is_305x_soc(rt2x00dev)) {
1599 rt2800_bbp_write(rt2x00dev, 78, 0x0e);
1600 rt2800_bbp_write(rt2x00dev, 80, 0x08);
1578 } else { 1601 } else {
1579 rt2800_bbp_write(rt2x00dev, 81, 0x37); 1602 rt2800_bbp_write(rt2x00dev, 81, 0x37);
1580 } 1603 }
@@ -1595,12 +1618,16 @@ int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
1595 if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) || 1618 if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
1596 rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) || 1619 rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
1597 rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) || 1620 rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
1598 rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E)) 1621 rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
1622 rt2800_is_305x_soc(rt2x00dev))
1599 rt2800_bbp_write(rt2x00dev, 103, 0xc0); 1623 rt2800_bbp_write(rt2x00dev, 103, 0xc0);
1600 else 1624 else
1601 rt2800_bbp_write(rt2x00dev, 103, 0x00); 1625 rt2800_bbp_write(rt2x00dev, 103, 0x00);
1602 1626
1603 rt2800_bbp_write(rt2x00dev, 105, 0x05); 1627 if (rt2800_is_305x_soc(rt2x00dev))
1628 rt2800_bbp_write(rt2x00dev, 105, 0x01);
1629 else
1630 rt2800_bbp_write(rt2x00dev, 105, 0x05);
1604 rt2800_bbp_write(rt2x00dev, 106, 0x35); 1631 rt2800_bbp_write(rt2x00dev, 106, 0x35);
1605 1632
1606 if (rt2x00_rt(rt2x00dev, RT3071) || 1633 if (rt2x00_rt(rt2x00dev, RT3071) ||
@@ -1617,11 +1644,6 @@ int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
1617 rt2800_bbp_write(rt2x00dev, 138, value); 1644 rt2800_bbp_write(rt2x00dev, 138, value);
1618 } 1645 }
1619 1646
1620 if (rt2x00_rt(rt2x00dev, RT2872)) {
1621 rt2800_bbp_write(rt2x00dev, 31, 0x08);
1622 rt2800_bbp_write(rt2x00dev, 78, 0x0e);
1623 rt2800_bbp_write(rt2x00dev, 80, 0x08);
1624 }
1625 1647
1626 for (i = 0; i < EEPROM_BBP_SIZE; i++) { 1648 for (i = 0; i < EEPROM_BBP_SIZE; i++) {
1627 rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom); 1649 rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom);
@@ -1708,7 +1730,7 @@ int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
1708 !rt2x00_rt(rt2x00dev, RT3071) && 1730 !rt2x00_rt(rt2x00dev, RT3071) &&
1709 !rt2x00_rt(rt2x00dev, RT3090) && 1731 !rt2x00_rt(rt2x00dev, RT3090) &&
1710 !rt2x00_rt(rt2x00dev, RT3390) && 1732 !rt2x00_rt(rt2x00dev, RT3390) &&
1711 !(rt2x00_is_soc(rt2x00dev) && rt2x00_rt(rt2x00dev, RT2872))) 1733 !rt2800_is_305x_soc(rt2x00dev))
1712 return 0; 1734 return 0;
1713 1735
1714 /* 1736 /*
@@ -1776,7 +1798,7 @@ int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
1776 rt2800_rfcsr_write(rt2x00dev, 29, 0x8f); 1798 rt2800_rfcsr_write(rt2x00dev, 29, 0x8f);
1777 rt2800_rfcsr_write(rt2x00dev, 30, 0x20); 1799 rt2800_rfcsr_write(rt2x00dev, 30, 0x20);
1778 rt2800_rfcsr_write(rt2x00dev, 31, 0x0f); 1800 rt2800_rfcsr_write(rt2x00dev, 31, 0x0f);
1779 } else if (rt2x00_rt(rt2x00dev, RT2872)) { 1801 } else if (rt2800_is_305x_soc(rt2x00dev)) {
1780 rt2800_rfcsr_write(rt2x00dev, 0, 0x50); 1802 rt2800_rfcsr_write(rt2x00dev, 0, 0x50);
1781 rt2800_rfcsr_write(rt2x00dev, 1, 0x01); 1803 rt2800_rfcsr_write(rt2x00dev, 1, 0x01);
1782 rt2800_rfcsr_write(rt2x00dev, 2, 0xf7); 1804 rt2800_rfcsr_write(rt2x00dev, 2, 0xf7);
@@ -1807,6 +1829,9 @@ int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
1807 rt2800_rfcsr_write(rt2x00dev, 27, 0x23); 1829 rt2800_rfcsr_write(rt2x00dev, 27, 0x23);
1808 rt2800_rfcsr_write(rt2x00dev, 28, 0x13); 1830 rt2800_rfcsr_write(rt2x00dev, 28, 0x13);
1809 rt2800_rfcsr_write(rt2x00dev, 29, 0x83); 1831 rt2800_rfcsr_write(rt2x00dev, 29, 0x83);
1832 rt2800_rfcsr_write(rt2x00dev, 30, 0x00);
1833 rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
1834 return 0;
1810 } 1835 }
1811 1836
1812 if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) { 1837 if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {