diff options
| author | Rafał Miłecki <zajec5@gmail.com> | 2014-07-31 15:59:42 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2014-08-25 16:00:42 -0400 |
| commit | 6247d2aa5188ac0ace33d8390341075c04107218 (patch) | |
| tree | b7b4076bbe3bd173d25afcc3977a7d6a9399fcdd /drivers/net/wireless/b43 | |
| parent | 07bc788424b9a2ee6cc20b70311c0950897ee0eb (diff) | |
b43: update flushing many writes performed in a row
Flush radio writes as well and add some tiny optimizations (e.g.
masksetting PHY reg involves reading it, so reset the counter).
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43')
| -rw-r--r-- | drivers/net/wireless/b43/bus.h | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_common.c | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_n.c | 1 |
3 files changed, 25 insertions, 3 deletions
diff --git a/drivers/net/wireless/b43/bus.h b/drivers/net/wireless/b43/bus.h index f3205c6988bc..460d9d90bdde 100644 --- a/drivers/net/wireless/b43/bus.h +++ b/drivers/net/wireless/b43/bus.h | |||
| @@ -60,7 +60,21 @@ static inline bool b43_bus_host_is_pcmcia(struct b43_bus_dev *dev) | |||
| 60 | #else | 60 | #else |
| 61 | return false; | 61 | return false; |
| 62 | #endif | 62 | #endif |
| 63 | }; | ||
| 64 | |||
| 65 | static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev) | ||
| 66 | { | ||
| 67 | #ifdef CONFIG_B43_BCMA | ||
| 68 | if (dev->bus_type == B43_BUS_BCMA) | ||
| 69 | return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI); | ||
| 70 | #endif | ||
| 71 | #ifdef CONFIG_B43_SSB | ||
| 72 | if (dev->bus_type == B43_BUS_SSB) | ||
| 73 | return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI); | ||
| 74 | #endif | ||
| 75 | return false; | ||
| 63 | } | 76 | } |
| 77 | |||
| 64 | static inline bool b43_bus_host_is_sdio(struct b43_bus_dev *dev) | 78 | static inline bool b43_bus_host_is_sdio(struct b43_bus_dev *dev) |
| 65 | { | 79 | { |
| 66 | #ifdef CONFIG_B43_SSB | 80 | #ifdef CONFIG_B43_SSB |
diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c index 3cbef21b4726..c868748b3f9e 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 | ||
| @@ -274,11 +280,12 @@ u16 b43_phy_read(struct b43_wldev *dev, u16 reg) | |||
| 274 | void b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value) | 280 | void b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value) |
| 275 | { | 281 | { |
| 276 | assert_mac_suspended(dev); | 282 | assert_mac_suspended(dev); |
| 277 | dev->phy.ops->phy_write(dev, reg, value); | 283 | if (b43_bus_host_is_pci(dev->dev) && |
| 278 | if (++dev->phy.writes_counter == B43_MAX_WRITES_IN_ROW) { | 284 | ++dev->phy.writes_counter > B43_MAX_WRITES_IN_ROW) { |
| 279 | b43_read16(dev, B43_MMIO_PHY_VER); | 285 | b43_read16(dev, B43_MMIO_PHY_VER); |
| 280 | dev->phy.writes_counter = 0; | 286 | dev->phy.writes_counter = 1; |
| 281 | } | 287 | } |
| 288 | dev->phy.ops->phy_write(dev, reg, value); | ||
| 282 | } | 289 | } |
| 283 | 290 | ||
| 284 | void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) | 291 | void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) |
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c index e2a3f0d5bcc2..b04aa34b0277 100644 --- a/drivers/net/wireless/b43/phy_n.c +++ b/drivers/net/wireless/b43/phy_n.c | |||
| @@ -6517,6 +6517,7 @@ static void b43_nphy_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask, | |||
| 6517 | check_phyreg(dev, reg); | 6517 | check_phyreg(dev, reg); |
| 6518 | b43_write16(dev, B43_MMIO_PHY_CONTROL, reg); | 6518 | b43_write16(dev, B43_MMIO_PHY_CONTROL, reg); |
| 6519 | b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set); | 6519 | b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set); |
| 6520 | dev->phy.writes_counter = 1; | ||
| 6520 | } | 6521 | } |
| 6521 | 6522 | ||
| 6522 | static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg) | 6523 | static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg) |
