aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43/phy_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/b43/phy_common.c')
-rw-r--r--drivers/net/wireless/b43/phy_common.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c
index 3cbef21b4726..1dfc682a8055 100644
--- a/drivers/net/wireless/b43/phy_common.c
+++ b/drivers/net/wireless/b43/phy_common.c
@@ -222,12 +222,18 @@ static inline void assert_mac_suspended(struct b43_wldev *dev)
222u16 b43_radio_read(struct b43_wldev *dev, u16 reg) 222u16 b43_radio_read(struct b43_wldev *dev, u16 reg)
223{ 223{
224 assert_mac_suspended(dev); 224 assert_mac_suspended(dev);
225 dev->phy.writes_counter = 0;
225 return dev->phy.ops->radio_read(dev, reg); 226 return dev->phy.ops->radio_read(dev, reg);
226} 227}
227 228
228void b43_radio_write(struct b43_wldev *dev, u16 reg, u16 value) 229void b43_radio_write(struct b43_wldev *dev, u16 reg, u16 value)
229{ 230{
230 assert_mac_suspended(dev); 231 assert_mac_suspended(dev);
232 if (b43_bus_host_is_pci(dev->dev) &&
233 ++dev->phy.writes_counter > B43_MAX_WRITES_IN_ROW) {
234 b43_read32(dev, B43_MMIO_MACCTL);
235 dev->phy.writes_counter = 1;
236 }
231 dev->phy.ops->radio_write(dev, reg, value); 237 dev->phy.ops->radio_write(dev, reg, value);
232} 238}
233 239
@@ -268,17 +274,28 @@ u16 b43_phy_read(struct b43_wldev *dev, u16 reg)
268{ 274{
269 assert_mac_suspended(dev); 275 assert_mac_suspended(dev);
270 dev->phy.writes_counter = 0; 276 dev->phy.writes_counter = 0;
271 return dev->phy.ops->phy_read(dev, reg); 277
278 if (dev->phy.ops->phy_read)
279 return dev->phy.ops->phy_read(dev, reg);
280
281 b43_write16f(dev, B43_MMIO_PHY_CONTROL, reg);
282 return b43_read16(dev, B43_MMIO_PHY_DATA);
272} 283}
273 284
274void b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value) 285void b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value)
275{ 286{
276 assert_mac_suspended(dev); 287 assert_mac_suspended(dev);
277 dev->phy.ops->phy_write(dev, reg, value); 288 if (b43_bus_host_is_pci(dev->dev) &&
278 if (++dev->phy.writes_counter == B43_MAX_WRITES_IN_ROW) { 289 ++dev->phy.writes_counter > B43_MAX_WRITES_IN_ROW) {
279 b43_read16(dev, B43_MMIO_PHY_VER); 290 b43_read16(dev, B43_MMIO_PHY_VER);
280 dev->phy.writes_counter = 0; 291 dev->phy.writes_counter = 1;
281 } 292 }
293
294 if (dev->phy.ops->phy_write)
295 return dev->phy.ops->phy_write(dev, reg, value);
296
297 b43_write16f(dev, B43_MMIO_PHY_CONTROL, reg);
298 b43_write16(dev, B43_MMIO_PHY_DATA, value);
282} 299}
283 300
284void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) 301void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg)