aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2800lib.c
diff options
context:
space:
mode:
authorGertjan van Wingerde <gwingerde@gmail.com>2009-11-14 14:20:36 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-11-16 14:17:12 -0500
commit31a4cf1f22677ba1ea90be055bc20aac25b8e7c4 (patch)
tree8432c39f519d86bff3e2793db7478cd31f59c6c6 /drivers/net/wireless/rt2x00/rt2800lib.c
parent16475b095a9c952f16e626c142b30bc95cfeadb3 (diff)
rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM.
Current tree hits a BUG_ON in rt2x00_regbusy_read, because the eFuse EEPROM reading code of rt2800lib uses the function without the csr_mutex locked. Fix this by locking the csr_mutex for the of the EEPROM reading cycly and using the _lock variants of the register reading and writing functions. This also introcudes the register_read_lock function pointer in the rt2800_ops structure. Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> Acked-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800lib.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index c7108050af3..621dac18ca6 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1684,24 +1684,28 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
1684{ 1684{
1685 u32 reg; 1685 u32 reg;
1686 1686
1687 rt2800_register_read(rt2x00dev, EFUSE_CTRL, &reg); 1687 mutex_lock(&rt2x00dev->csr_mutex);
1688
1689 rt2800_register_read_lock(rt2x00dev, EFUSE_CTRL, &reg);
1688 rt2x00_set_field32(&reg, EFUSE_CTRL_ADDRESS_IN, i); 1690 rt2x00_set_field32(&reg, EFUSE_CTRL_ADDRESS_IN, i);
1689 rt2x00_set_field32(&reg, EFUSE_CTRL_MODE, 0); 1691 rt2x00_set_field32(&reg, EFUSE_CTRL_MODE, 0);
1690 rt2x00_set_field32(&reg, EFUSE_CTRL_KICK, 1); 1692 rt2x00_set_field32(&reg, EFUSE_CTRL_KICK, 1);
1691 rt2800_register_write(rt2x00dev, EFUSE_CTRL, reg); 1693 rt2800_register_write_lock(rt2x00dev, EFUSE_CTRL, reg);
1692 1694
1693 /* Wait until the EEPROM has been loaded */ 1695 /* Wait until the EEPROM has been loaded */
1694 rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg); 1696 rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg);
1695 1697
1696 /* Apparently the data is read from end to start */ 1698 /* Apparently the data is read from end to start */
1697 rt2800_register_read(rt2x00dev, EFUSE_DATA3, 1699 rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3,
1698 (u32 *)&rt2x00dev->eeprom[i]); 1700 (u32 *)&rt2x00dev->eeprom[i]);
1699 rt2800_register_read(rt2x00dev, EFUSE_DATA2, 1701 rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2,
1700 (u32 *)&rt2x00dev->eeprom[i + 2]); 1702 (u32 *)&rt2x00dev->eeprom[i + 2]);
1701 rt2800_register_read(rt2x00dev, EFUSE_DATA1, 1703 rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1,
1702 (u32 *)&rt2x00dev->eeprom[i + 4]); 1704 (u32 *)&rt2x00dev->eeprom[i + 4]);
1703 rt2800_register_read(rt2x00dev, EFUSE_DATA0, 1705 rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0,
1704 (u32 *)&rt2x00dev->eeprom[i + 6]); 1706 (u32 *)&rt2x00dev->eeprom[i + 6]);
1707
1708 mutex_unlock(&rt2x00dev->csr_mutex);
1705} 1709}
1706 1710
1707void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev) 1711void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)