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

b43: N-PHY: finish 2.4GHz 0x2056 radio setup

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
38646eba c7d64310

+105 -1
+89 -1
drivers/net/wireless/b43/phy_n.c
··· 228 228 static void b43_radio_2056_setup(struct b43_wldev *dev, 229 229 const struct b43_nphy_channeltab_entry_rev3 *e) 230 230 { 231 + struct ssb_sprom *sprom = dev->dev->bus_sprom; 232 + enum ieee80211_band band = b43_current_band(dev->wl); 233 + u16 offset; 234 + u8 i; 235 + u16 bias, cbias, pag_boost, pgag_boost, mixg_boost, padg_boost; 236 + 231 237 B43_WARN_ON(dev->phy.rev < 3); 232 238 233 239 b43_chantab_radio_2056_upload(dev, e); 234 - /* TODO */ 240 + b2056_upload_syn_pll_cp2(dev, band == IEEE80211_BAND_5GHZ); 241 + 242 + if (sprom->boardflags2_lo & B43_BFL2_GPLL_WAR && 243 + b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 244 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER1, 0x1F); 245 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER2, 0x1F); 246 + if (dev->dev->chip_id == 0x4716) { 247 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER4, 0x14); 248 + b43_radio_write(dev, B2056_SYN_PLL_CP2, 0); 249 + } else { 250 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER4, 0x0B); 251 + b43_radio_write(dev, B2056_SYN_PLL_CP2, 0x14); 252 + } 253 + } 254 + if (sprom->boardflags2_lo & B43_BFL2_APLL_WAR && 255 + b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { 256 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER1, 0x1F); 257 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER2, 0x1F); 258 + b43_radio_write(dev, B2056_SYN_PLL_LOOPFILTER4, 0x05); 259 + b43_radio_write(dev, B2056_SYN_PLL_CP2, 0x0C); 260 + } 261 + 262 + if (dev->phy.n->ipa2g_on && band == IEEE80211_BAND_2GHZ) { 263 + for (i = 0; i < 2; i++) { 264 + offset = i ? B2056_TX1 : B2056_TX0; 265 + if (dev->phy.rev >= 5) { 266 + b43_radio_write(dev, 267 + offset | B2056_TX_PADG_IDAC, 0xcc); 268 + 269 + if (dev->dev->chip_id == 0x4716) { 270 + bias = 0x40; 271 + cbias = 0x45; 272 + pag_boost = 0x5; 273 + pgag_boost = 0x33; 274 + mixg_boost = 0x55; 275 + } else { 276 + bias = 0x25; 277 + cbias = 0x20; 278 + pag_boost = 0x4; 279 + pgag_boost = 0x03; 280 + mixg_boost = 0x65; 281 + } 282 + padg_boost = 0x77; 283 + 284 + b43_radio_write(dev, 285 + offset | B2056_TX_INTPAG_IMAIN_STAT, 286 + bias); 287 + b43_radio_write(dev, 288 + offset | B2056_TX_INTPAG_IAUX_STAT, 289 + bias); 290 + b43_radio_write(dev, 291 + offset | B2056_TX_INTPAG_CASCBIAS, 292 + cbias); 293 + b43_radio_write(dev, 294 + offset | B2056_TX_INTPAG_BOOST_TUNE, 295 + pag_boost); 296 + b43_radio_write(dev, 297 + offset | B2056_TX_PGAG_BOOST_TUNE, 298 + pgag_boost); 299 + b43_radio_write(dev, 300 + offset | B2056_TX_PADG_BOOST_TUNE, 301 + padg_boost); 302 + b43_radio_write(dev, 303 + offset | B2056_TX_MIXG_BOOST_TUNE, 304 + mixg_boost); 305 + } else { 306 + bias = dev->phy.is_40mhz ? 0x40 : 0x20; 307 + b43_radio_write(dev, 308 + offset | B2056_TX_INTPAG_IMAIN_STAT, 309 + bias); 310 + b43_radio_write(dev, 311 + offset | B2056_TX_INTPAG_IAUX_STAT, 312 + bias); 313 + b43_radio_write(dev, 314 + offset | B2056_TX_INTPAG_CASCBIAS, 315 + 0x30); 316 + } 317 + b43_radio_write(dev, offset | B2056_TX_PA_SPARE1, 0xee); 318 + } 319 + } else if (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ) { 320 + /* TODO */ 321 + } 322 + 235 323 udelay(50); 236 324 /* VCO calibration */ 237 325 b43_radio_write(dev, B2056_SYN_PLL_VCOCAL12, 0x00);
+15
drivers/net/wireless/b43/radio_2056.c
··· 9055 9055 B2056_RX1, pts->rx, pts->rx_length); 9056 9056 } 9057 9057 9058 + void b2056_upload_syn_pll_cp2(struct b43_wldev *dev, bool ghz5) 9059 + { 9060 + struct b2056_inittabs_pts *pts; 9061 + const struct b2056_inittab_entry *e; 9062 + 9063 + if (dev->phy.rev >= ARRAY_SIZE(b2056_inittabs)) { 9064 + B43_WARN_ON(1); 9065 + return; 9066 + } 9067 + pts = &b2056_inittabs[dev->phy.rev]; 9068 + e = &pts->syn[B2056_SYN_PLL_CP2]; 9069 + 9070 + b43_radio_write(dev, B2056_SYN_PLL_CP2, ghz5 ? e->ghz5 : e->ghz2); 9071 + } 9072 + 9058 9073 const struct b43_nphy_channeltab_entry_rev3 * 9059 9074 b43_nphy_get_chantabent_rev3(struct b43_wldev *dev, u16 freq) 9060 9075 {
+1
drivers/net/wireless/b43/radio_2056.h
··· 1090 1090 1091 1091 void b2056_upload_inittabs(struct b43_wldev *dev, 1092 1092 bool ghz5, bool ignore_uploadflag); 1093 + void b2056_upload_syn_pll_cp2(struct b43_wldev *dev, bool ghz5); 1093 1094 1094 1095 /* Get the NPHY Channel Switch Table entry for a channel. 1095 1096 * Returns NULL on failure to find an entry. */