static void b43_phy_ht_spur_avoid(struct b43_wldev *dev, struct ieee80211_channel *new_channel) { struct bcma_device *core = dev->dev->bdev; int spuravoid = 0; /* Check for 13 and 14 is just a guess, we don't have enough logs. */ if (new_channel->hw_value == 13 || new_channel->hw_value == 14) spuravoid = 1; bcma_core_pll_ctl(core, B43_BCMA_CLKCTLST_PHY_PLL_REQ, 0, false); bcma_pmu_spuravoid_pllupdate(&core->bus->drv_cc, spuravoid); bcma_core_pll_ctl(core, B43_BCMA_CLKCTLST_80211_PLL_REQ | B43_BCMA_CLKCTLST_PHY_PLL_REQ, B43_BCMA_CLKCTLST_80211_PLL_ST | B43_BCMA_CLKCTLST_PHY_PLL_ST, false); b43_mac_switch_freq(dev, spuravoid); b43_wireless_core_phy_pll_reset(dev); if (spuravoid) b43_phy_set(dev, B43_PHY_HT_BBCFG, B43_PHY_HT_BBCFG_RSTRX); else b43_phy_mask(dev, B43_PHY_HT_BBCFG, ~B43_PHY_HT_BBCFG_RSTRX & 0xFFFF); b43_phy_ht_reset_cca(dev); }
static void b43_phy_ht_spur_avoid(struct b43_wldev *dev, struct ieee80211_channel *new_channel) { struct bcma_device *core = dev->dev->bdev; int spuravoid = 0; u16 tmp; /* Check for 13 and 14 is just a guess, we don't have enough logs. */ if (new_channel->hw_value == 13 || new_channel->hw_value == 14) spuravoid = 1; bcma_core_pll_ctl(core, B43_BCMA_CLKCTLST_PHY_PLL_REQ, 0, false); bcma_pmu_spuravoid_pllupdate(&core->bus->drv_cc, spuravoid); bcma_core_pll_ctl(core, B43_BCMA_CLKCTLST_80211_PLL_REQ | B43_BCMA_CLKCTLST_PHY_PLL_REQ, B43_BCMA_CLKCTLST_80211_PLL_ST | B43_BCMA_CLKCTLST_PHY_PLL_ST, false); /* Values has been taken from wlc_bmac_switch_macfreq comments */ switch (spuravoid) { case 2: /* 126MHz */ tmp = 0x2082; break; case 1: /* 123MHz */ tmp = 0x5341; break; default: /* 120MHz */ tmp = 0x8889; } b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, tmp); b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); /* TODO: reset PLL */ if (spuravoid) b43_phy_set(dev, B43_PHY_HT_BBCFG, B43_PHY_HT_BBCFG_RSTRX); else b43_phy_mask(dev, B43_PHY_HT_BBCFG, ~B43_PHY_HT_BBCFG_RSTRX & 0xFFFF); b43_phy_ht_reset_cca(dev); }