diff options
Diffstat (limited to 'drivers/net/wireless/b43/phy_common.c')
-rw-r--r-- | drivers/net/wireless/b43/phy_common.c | 25 |
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) | |||
222 | u16 b43_radio_read(struct b43_wldev *dev, u16 reg) | 222 | u16 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 | ||
228 | void b43_radio_write(struct b43_wldev *dev, u16 reg, u16 value) | 229 | void 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 | ||
274 | void b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value) | 285 | void 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 | ||
284 | void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) | 301 | void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) |