aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtl818x
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2009-05-19 00:08:20 -0400
committerDavid S. Miller <davem@davemloft.net>2009-05-19 00:08:20 -0400
commitbb803cfbecb03a0cf8dc7e1864f18dda6631af00 (patch)
tree6c0989693bea6f50cfa5c6bb14f52ec19668def3 /drivers/net/wireless/rtl818x
parent3878fb6fdbceecca20b15748f807340854220f06 (diff)
parent511e11e396dc596825ce04d53d7f6d579404bc01 (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.h57
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_dev.c13
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_rtl8225.c8
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
132void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); 138void 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)
188static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, 206static 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
197static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) 220static 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)
202static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, 225static 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
213static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, 239static 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,
219static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, 245static 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
230static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr, 259static 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);