diff options
author | David S. Miller <davem@davemloft.net> | 2009-05-19 00:08:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-19 00:08:20 -0400 |
commit | bb803cfbecb03a0cf8dc7e1864f18dda6631af00 (patch) | |
tree | 6c0989693bea6f50cfa5c6bb14f52ec19668def3 /drivers/net/wireless/rtl818x | |
parent | 3878fb6fdbceecca20b15748f807340854220f06 (diff) | |
parent | 511e11e396dc596825ce04d53d7f6d579404bc01 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/scsi/fcoe/fcoe.c
Diffstat (limited to 'drivers/net/wireless/rtl818x')
-rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187.h | 57 | ||||
-rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_dev.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_rtl8225.c | 8 |
3 files changed, 62 insertions, 16 deletions
diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h index 622196dc078e..c09bfefc70f3 100644 --- a/drivers/net/wireless/rtl818x/rtl8187.h +++ b/drivers/net/wireless/rtl818x/rtl8187.h | |||
@@ -127,6 +127,12 @@ struct rtl8187_priv { | |||
127 | __le64 buf; | 127 | __le64 buf; |
128 | struct sk_buff_head queue; | 128 | struct sk_buff_head queue; |
129 | } b_tx_status; /* This queue is used by both -b and non-b devices */ | 129 | } b_tx_status; /* This queue is used by both -b and non-b devices */ |
130 | struct mutex io_mutex; | ||
131 | union { | ||
132 | u8 bits8; | ||
133 | __le16 bits16; | ||
134 | __le32 bits32; | ||
135 | } *io_dmabuf; | ||
130 | }; | 136 | }; |
131 | 137 | ||
132 | void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); | 138 | void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); |
@@ -136,10 +142,14 @@ static inline u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv, | |||
136 | { | 142 | { |
137 | u8 val; | 143 | u8 val; |
138 | 144 | ||
145 | mutex_lock(&priv->io_mutex); | ||
139 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), | 146 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
140 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, | 147 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
141 | (unsigned long)addr, idx & 0x03, &val, | 148 | (unsigned long)addr, idx & 0x03, |
142 | sizeof(val), HZ / 2); | 149 | &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); |
150 | |||
151 | val = priv->io_dmabuf->bits8; | ||
152 | mutex_unlock(&priv->io_mutex); | ||
143 | 153 | ||
144 | return val; | 154 | return val; |
145 | } | 155 | } |
@@ -154,10 +164,14 @@ static inline u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv, | |||
154 | { | 164 | { |
155 | __le16 val; | 165 | __le16 val; |
156 | 166 | ||
167 | mutex_lock(&priv->io_mutex); | ||
157 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), | 168 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
158 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, | 169 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
159 | (unsigned long)addr, idx & 0x03, &val, | 170 | (unsigned long)addr, idx & 0x03, |
160 | sizeof(val), HZ / 2); | 171 | &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); |
172 | |||
173 | val = priv->io_dmabuf->bits16; | ||
174 | mutex_unlock(&priv->io_mutex); | ||
161 | 175 | ||
162 | return le16_to_cpu(val); | 176 | return le16_to_cpu(val); |
163 | } | 177 | } |
@@ -172,10 +186,14 @@ static inline u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv, | |||
172 | { | 186 | { |
173 | __le32 val; | 187 | __le32 val; |
174 | 188 | ||
189 | mutex_lock(&priv->io_mutex); | ||
175 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), | 190 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
176 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, | 191 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
177 | (unsigned long)addr, idx & 0x03, &val, | 192 | (unsigned long)addr, idx & 0x03, |
178 | sizeof(val), HZ / 2); | 193 | &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); |
194 | |||
195 | val = priv->io_dmabuf->bits32; | ||
196 | mutex_unlock(&priv->io_mutex); | ||
179 | 197 | ||
180 | return le32_to_cpu(val); | 198 | return le32_to_cpu(val); |
181 | } | 199 | } |
@@ -188,10 +206,15 @@ static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr) | |||
188 | static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, | 206 | static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, |
189 | u8 *addr, u8 val, u8 idx) | 207 | u8 *addr, u8 val, u8 idx) |
190 | { | 208 | { |
209 | mutex_lock(&priv->io_mutex); | ||
210 | |||
211 | priv->io_dmabuf->bits8 = val; | ||
191 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 212 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
192 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 213 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
193 | (unsigned long)addr, idx & 0x03, &val, | 214 | (unsigned long)addr, idx & 0x03, |
194 | sizeof(val), HZ / 2); | 215 | &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); |
216 | |||
217 | mutex_unlock(&priv->io_mutex); | ||
195 | } | 218 | } |
196 | 219 | ||
197 | static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) | 220 | static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) |
@@ -202,12 +225,15 @@ static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) | |||
202 | static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, | 225 | static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, |
203 | __le16 *addr, u16 val, u8 idx) | 226 | __le16 *addr, u16 val, u8 idx) |
204 | { | 227 | { |
205 | __le16 buf = cpu_to_le16(val); | 228 | mutex_lock(&priv->io_mutex); |
206 | 229 | ||
230 | priv->io_dmabuf->bits16 = cpu_to_le16(val); | ||
207 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 231 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
208 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 232 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
209 | (unsigned long)addr, idx & 0x03, &buf, sizeof(buf), | 233 | (unsigned long)addr, idx & 0x03, |
210 | HZ / 2); | 234 | &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); |
235 | |||
236 | mutex_unlock(&priv->io_mutex); | ||
211 | } | 237 | } |
212 | 238 | ||
213 | static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, | 239 | static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, |
@@ -219,12 +245,15 @@ static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, | |||
219 | static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, | 245 | static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, |
220 | __le32 *addr, u32 val, u8 idx) | 246 | __le32 *addr, u32 val, u8 idx) |
221 | { | 247 | { |
222 | __le32 buf = cpu_to_le32(val); | 248 | mutex_lock(&priv->io_mutex); |
223 | 249 | ||
250 | priv->io_dmabuf->bits32 = cpu_to_le32(val); | ||
224 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 251 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
225 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 252 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
226 | (unsigned long)addr, idx & 0x03, &buf, sizeof(buf), | 253 | (unsigned long)addr, idx & 0x03, |
227 | HZ / 2); | 254 | &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); |
255 | |||
256 | mutex_unlock(&priv->io_mutex); | ||
228 | } | 257 | } |
229 | 258 | ||
230 | static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr, | 259 | static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr, |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 158827e50c55..6499ccc34c94 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
@@ -1326,6 +1326,14 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1326 | priv = dev->priv; | 1326 | priv = dev->priv; |
1327 | priv->is_rtl8187b = (id->driver_info == DEVICE_RTL8187B); | 1327 | priv->is_rtl8187b = (id->driver_info == DEVICE_RTL8187B); |
1328 | 1328 | ||
1329 | /* allocate "DMA aware" buffer for register accesses */ | ||
1330 | priv->io_dmabuf = kmalloc(sizeof(*priv->io_dmabuf), GFP_KERNEL); | ||
1331 | if (!priv->io_dmabuf) { | ||
1332 | err = -ENOMEM; | ||
1333 | goto err_free_dev; | ||
1334 | } | ||
1335 | mutex_init(&priv->io_mutex); | ||
1336 | |||
1329 | SET_IEEE80211_DEV(dev, &intf->dev); | 1337 | SET_IEEE80211_DEV(dev, &intf->dev); |
1330 | usb_set_intfdata(intf, dev); | 1338 | usb_set_intfdata(intf, dev); |
1331 | priv->udev = udev; | 1339 | priv->udev = udev; |
@@ -1489,7 +1497,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1489 | err = ieee80211_register_hw(dev); | 1497 | err = ieee80211_register_hw(dev); |
1490 | if (err) { | 1498 | if (err) { |
1491 | printk(KERN_ERR "rtl8187: Cannot register device\n"); | 1499 | printk(KERN_ERR "rtl8187: Cannot register device\n"); |
1492 | goto err_free_dev; | 1500 | goto err_free_dmabuf; |
1493 | } | 1501 | } |
1494 | mutex_init(&priv->conf_mutex); | 1502 | mutex_init(&priv->conf_mutex); |
1495 | skb_queue_head_init(&priv->b_tx_status.queue); | 1503 | skb_queue_head_init(&priv->b_tx_status.queue); |
@@ -1506,6 +1514,8 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1506 | 1514 | ||
1507 | return 0; | 1515 | return 0; |
1508 | 1516 | ||
1517 | err_free_dmabuf: | ||
1518 | kfree(priv->io_dmabuf); | ||
1509 | err_free_dev: | 1519 | err_free_dev: |
1510 | ieee80211_free_hw(dev); | 1520 | ieee80211_free_hw(dev); |
1511 | usb_set_intfdata(intf, NULL); | 1521 | usb_set_intfdata(intf, NULL); |
@@ -1529,6 +1539,7 @@ static void __devexit rtl8187_disconnect(struct usb_interface *intf) | |||
1529 | priv = dev->priv; | 1539 | priv = dev->priv; |
1530 | usb_reset_device(priv->udev); | 1540 | usb_reset_device(priv->udev); |
1531 | usb_put_dev(interface_to_usbdev(intf)); | 1541 | usb_put_dev(interface_to_usbdev(intf)); |
1542 | kfree(priv->io_dmabuf); | ||
1532 | ieee80211_free_hw(dev); | 1543 | ieee80211_free_hw(dev); |
1533 | } | 1544 | } |
1534 | 1545 | ||
diff --git a/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c b/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c index 78df281b297a..a09819386a1e 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c +++ b/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c | |||
@@ -88,9 +88,15 @@ static void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data) | |||
88 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); | 88 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); |
89 | udelay(10); | 89 | udelay(10); |
90 | 90 | ||
91 | mutex_lock(&priv->io_mutex); | ||
92 | |||
93 | priv->io_dmabuf->bits16 = data; | ||
91 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 94 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
92 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 95 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
93 | addr, 0x8225, &data, sizeof(data), HZ / 2); | 96 | addr, 0x8225, &priv->io_dmabuf->bits16, sizeof(data), |
97 | HZ / 2); | ||
98 | |||
99 | mutex_unlock(&priv->io_mutex); | ||
94 | 100 | ||
95 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); | 101 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); |
96 | udelay(10); | 102 | udelay(10); |