diff options
author | Gertjan van Wingerde <gwingerde@gmail.com> | 2009-11-14 14:20:36 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-11-16 14:17:12 -0500 |
commit | 31a4cf1f22677ba1ea90be055bc20aac25b8e7c4 (patch) | |
tree | 8432c39f519d86bff3e2793db7478cd31f59c6c6 /drivers/net/wireless/rt2x00/rt2800lib.h | |
parent | 16475b095a9c952f16e626c142b30bc95cfeadb3 (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.h')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h index 7c790118999b..535ce22f2ac8 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/rt2x00/rt2800lib.h | |||
@@ -23,6 +23,8 @@ | |||
23 | struct rt2800_ops { | 23 | struct rt2800_ops { |
24 | void (*register_read)(struct rt2x00_dev *rt2x00dev, | 24 | void (*register_read)(struct rt2x00_dev *rt2x00dev, |
25 | const unsigned int offset, u32 *value); | 25 | const unsigned int offset, u32 *value); |
26 | void (*register_read_lock)(struct rt2x00_dev *rt2x00dev, | ||
27 | const unsigned int offset, u32 *value); | ||
26 | void (*register_write)(struct rt2x00_dev *rt2x00dev, | 28 | void (*register_write)(struct rt2x00_dev *rt2x00dev, |
27 | const unsigned int offset, u32 value); | 29 | const unsigned int offset, u32 value); |
28 | void (*register_write_lock)(struct rt2x00_dev *rt2x00dev, | 30 | void (*register_write_lock)(struct rt2x00_dev *rt2x00dev, |
@@ -49,6 +51,15 @@ static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev, | |||
49 | rt2800ops->register_read(rt2x00dev, offset, value); | 51 | rt2800ops->register_read(rt2x00dev, offset, value); |
50 | } | 52 | } |
51 | 53 | ||
54 | static inline void rt2800_register_read_lock(struct rt2x00_dev *rt2x00dev, | ||
55 | const unsigned int offset, | ||
56 | u32 *value) | ||
57 | { | ||
58 | const struct rt2800_ops *rt2800ops = rt2x00dev->priv; | ||
59 | |||
60 | rt2800ops->register_read_lock(rt2x00dev, offset, value); | ||
61 | } | ||
62 | |||
52 | static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev, | 63 | static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev, |
53 | const unsigned int offset, | 64 | const unsigned int offset, |
54 | u32 value) | 65 | u32 value) |