Skip to content

Commit

Permalink
b43: update flushing many writes performed in a row
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rafał Miłecki authored and John W. Linville committed Aug 25, 2014
1 parent 07bc788 commit 6247d2a
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
14 changes: 14 additions & 0 deletions drivers/net/wireless/b43/bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,21 @@ static inline bool b43_bus_host_is_pcmcia(struct b43_bus_dev *dev)
#else
return false;
#endif
};

static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
{
#ifdef CONFIG_B43_BCMA
if (dev->bus_type == B43_BUS_BCMA)
return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI);
#endif
#ifdef CONFIG_B43_SSB
if (dev->bus_type == B43_BUS_SSB)
return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
#endif
return false;
}

static inline bool b43_bus_host_is_sdio(struct b43_bus_dev *dev)
{
#ifdef CONFIG_B43_SSB
Expand Down
13 changes: 10 additions & 3 deletions drivers/net/wireless/b43/phy_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,12 +222,18 @@ static inline void assert_mac_suspended(struct b43_wldev *dev)
u16 b43_radio_read(struct b43_wldev *dev, u16 reg)
{
assert_mac_suspended(dev);
dev->phy.writes_counter = 0;
return dev->phy.ops->radio_read(dev, reg);
}

void b43_radio_write(struct b43_wldev *dev, u16 reg, u16 value)
{
assert_mac_suspended(dev);
if (b43_bus_host_is_pci(dev->dev) &&
++dev->phy.writes_counter > B43_MAX_WRITES_IN_ROW) {
b43_read32(dev, B43_MMIO_MACCTL);
dev->phy.writes_counter = 1;
}
dev->phy.ops->radio_write(dev, reg, value);
}

Expand Down Expand Up @@ -274,11 +280,12 @@ u16 b43_phy_read(struct b43_wldev *dev, u16 reg)
void b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value)
{
assert_mac_suspended(dev);
dev->phy.ops->phy_write(dev, reg, value);
if (++dev->phy.writes_counter == B43_MAX_WRITES_IN_ROW) {
if (b43_bus_host_is_pci(dev->dev) &&
++dev->phy.writes_counter > B43_MAX_WRITES_IN_ROW) {
b43_read16(dev, B43_MMIO_PHY_VER);
dev->phy.writes_counter = 0;
dev->phy.writes_counter = 1;
}
dev->phy.ops->phy_write(dev, reg, value);
}

void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg)
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/b43/phy_n.c
Original file line number Diff line number Diff line change
Expand Up @@ -6517,6 +6517,7 @@ static void b43_nphy_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask,
check_phyreg(dev, reg);
b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
dev->phy.writes_counter = 1;
}

static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg)
Expand Down

0 comments on commit 6247d2a

Please sign in to comment.