aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2800lib.h
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.h
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.h')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.h11
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 @@
23struct rt2800_ops { 23struct 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
54static 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
52static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev, 63static 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)