Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

b43: Implement PHY PLL reset

We should reset PLL after changing MAC frequency.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Rafał Miłecki and committed by
John W. Linville
737f657f 50398ee0

+34 -2
+30
drivers/net/wireless/b43/main.c
··· 1204 1204 } 1205 1205 } 1206 1206 1207 + /* http://bcm-v4.sipsolutions.net/802.11/PHY/BmacCorePllReset */ 1208 + void b43_wireless_core_phy_pll_reset(struct b43_wldev *dev) 1209 + { 1210 + struct bcma_drv_cc *bcma_cc __maybe_unused; 1211 + struct ssb_chipcommon *ssb_cc __maybe_unused; 1212 + 1213 + switch (dev->dev->bus_type) { 1214 + #ifdef CONFIG_B43_BCMA 1215 + case B43_BUS_BCMA: 1216 + bcma_cc = &dev->dev->bdev->bus->drv_cc; 1217 + 1218 + bcma_cc_write32(bcma_cc, BCMA_CC_CHIPCTL_ADDR, 0); 1219 + bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4); 1220 + bcma_cc_set32(bcma_cc, BCMA_CC_CHIPCTL_DATA, 0x4); 1221 + bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4); 1222 + break; 1223 + #endif 1224 + #ifdef CONFIG_B43_SSB 1225 + case B43_BUS_SSB: 1226 + ssb_cc = &dev->dev->sdev->bus->chipco; 1227 + 1228 + chipco_write32(ssb_cc, SSB_CHIPCO_CHIPCTL_ADDR, 0); 1229 + chipco_mask32(ssb_cc, SSB_CHIPCO_CHIPCTL_DATA, ~0x4); 1230 + chipco_set32(ssb_cc, SSB_CHIPCO_CHIPCTL_DATA, 0x4); 1231 + chipco_mask32(ssb_cc, SSB_CHIPCO_CHIPCTL_DATA, ~0x4); 1232 + break; 1233 + #endif 1234 + } 1235 + } 1236 + 1207 1237 #ifdef CONFIG_B43_BCMA 1208 1238 static void b43_bcma_phy_reset(struct b43_wldev *dev) 1209 1239 {
+2
drivers/net/wireless/b43/main.h
··· 96 96 #define B43_PS_ASLEEP (1 << 3) /* Force device asleep */ 97 97 void b43_power_saving_ctl_bits(struct b43_wldev *dev, unsigned int ps_flags); 98 98 99 + void b43_wireless_core_phy_pll_reset(struct b43_wldev *dev); 100 + 99 101 void b43_mac_suspend(struct b43_wldev *dev); 100 102 void b43_mac_enable(struct b43_wldev *dev); 101 103 void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on);
+1 -1
drivers/net/wireless/b43/phy_ht.c
··· 762 762 763 763 b43_mac_switch_freq(dev, spuravoid); 764 764 765 - /* TODO: reset PLL */ 765 + b43_wireless_core_phy_pll_reset(dev); 766 766 767 767 if (spuravoid) 768 768 b43_phy_set(dev, B43_PHY_HT_BBCFG, B43_PHY_HT_BBCFG_RSTRX);
+1 -1
drivers/net/wireless/b43/phy_n.c
··· 6369 6369 b43_mac_switch_freq(dev, spuravoid); 6370 6370 6371 6371 if (dev->phy.rev == 3 || dev->phy.rev == 4) 6372 - ; /* TODO: reset PLL */ 6372 + b43_wireless_core_phy_pll_reset(dev); 6373 6373 6374 6374 if (spuravoid) 6375 6375 b43_phy_set(dev, B43_NPHY_BBCFG, B43_NPHY_BBCFG_RSTRX);