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

b43: LCN-PHY: finish sense 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
29818082 6be19ccd

+88 -3
+87 -3
drivers/net/wireless/b43/phy_lcn.c
··· 49 49 u16 values[16]; 50 50 }; 51 51 52 + enum lcn_sense_type { 53 + B43_SENSE_TEMP, 54 + B43_SENSE_VBAT, 55 + }; 56 + 52 57 /* In theory it's PHY common function, move if needed */ 53 58 /* brcms_b_switch_macfreq */ 54 59 static void b43_phy_switch_macfreq(struct b43_wldev *dev, u8 spurmode) ··· 340 335 } 341 336 342 337 /* wlc_lcnphy_vbat_temp_sense_setup */ 343 - static void b43_phy_lcn_sense_setup(struct b43_wldev *dev) 338 + static void b43_phy_lcn_sense_setup(struct b43_wldev *dev, 339 + enum lcn_sense_type sense_type) 344 340 { 341 + u8 auxpga_vmidcourse, auxpga_vmidfine, auxpga_gain; 342 + u16 auxpga_vmid; 343 + u8 tx_pwr_idx; 345 344 u8 i; 346 345 347 346 u16 save_radio_regs[6][2] = { ··· 360 351 }; 361 352 u16 save_radio_4a4; 362 353 354 + msleep(1); 355 + 356 + /* Save */ 363 357 for (i = 0; i < 6; i++) 364 358 save_radio_regs[i][1] = b43_radio_read(dev, 365 359 save_radio_regs[i][0]); 366 360 for (i = 0; i < 14; i++) 367 361 save_phy_regs[i][1] = b43_phy_read(dev, save_phy_regs[i][0]); 362 + b43_mac_suspend(dev); 368 363 save_radio_4a4 = b43_radio_read(dev, 0x4a4); 364 + /* wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF); */ 365 + tx_pwr_idx = dev->phy.lcn->tx_pwr_curr_idx; 369 366 370 - /* TODO: config sth */ 367 + /* Setup */ 368 + /* TODO: wlc_lcnphy_set_tx_pwr_by_index(pi, 127); */ 369 + b43_radio_set(dev, 0x007, 0x1); 370 + b43_radio_set(dev, 0x0ff, 0x10); 371 + b43_radio_set(dev, 0x11f, 0x4); 371 372 373 + b43_phy_mask(dev, 0x503, ~0x1); 374 + b43_phy_mask(dev, 0x503, ~0x4); 375 + b43_phy_mask(dev, 0x4a4, ~0x4000); 376 + b43_phy_mask(dev, 0x4a4, (u16) ~0x8000); 377 + b43_phy_mask(dev, 0x4d0, ~0x20); 378 + b43_phy_set(dev, 0x4a5, 0xff); 379 + b43_phy_maskset(dev, 0x4a5, ~0x7000, 0x5000); 380 + b43_phy_mask(dev, 0x4a5, ~0x700); 381 + b43_phy_maskset(dev, 0x40d, ~0xff, 64); 382 + b43_phy_maskset(dev, 0x40d, ~0x700, 0x600); 383 + b43_phy_maskset(dev, 0x4a2, ~0xff, 64); 384 + b43_phy_maskset(dev, 0x4a2, ~0x700, 0x600); 385 + b43_phy_maskset(dev, 0x4d9, ~0x70, 0x20); 386 + b43_phy_maskset(dev, 0x4d9, ~0x700, 0x300); 387 + b43_phy_maskset(dev, 0x4d9, ~0x7000, 0x1000); 388 + b43_phy_mask(dev, 0x4da, ~0x1000); 389 + b43_phy_set(dev, 0x4da, 0x2000); 390 + b43_phy_set(dev, 0x4a6, 0x8000); 391 + 392 + b43_radio_write(dev, 0x025, 0xc); 393 + b43_radio_set(dev, 0x005, 0x8); 394 + b43_phy_set(dev, 0x938, 0x4); 395 + b43_phy_set(dev, 0x939, 0x4); 396 + b43_phy_set(dev, 0x4a4, 0x1000); 397 + 398 + /* FIXME: don't hardcode */ 399 + b43_lcntab_write(dev, B43_LCNTAB16(0x8, 0x6), 0x640); 400 + 401 + switch (sense_type) { 402 + case B43_SENSE_TEMP: 403 + b43_phy_set(dev, 0x4d7, 0x8); 404 + b43_phy_maskset(dev, 0x4d7, ~0x7000, 0x1000); 405 + auxpga_vmidcourse = 8; 406 + auxpga_vmidfine = 0x4; 407 + auxpga_gain = 2; 408 + b43_radio_set(dev, 0x082, 0x20); 409 + break; 410 + case B43_SENSE_VBAT: 411 + b43_phy_set(dev, 0x4d7, 0x8); 412 + b43_phy_maskset(dev, 0x4d7, ~0x7000, 0x3000); 413 + auxpga_vmidcourse = 7; 414 + auxpga_vmidfine = 0xa; 415 + auxpga_gain = 2; 416 + break; 417 + } 418 + auxpga_vmid = (0x200 | (auxpga_vmidcourse << 4) | auxpga_vmidfine); 419 + 420 + b43_phy_set(dev, 0x4d8, 0x1); 421 + b43_phy_maskset(dev, 0x4d8, ~(0x3ff << 2), auxpga_vmid << 2); 422 + b43_phy_set(dev, 0x4d8, 0x2); 423 + b43_phy_maskset(dev, 0x4d8, ~(0x7 << 12), auxpga_gain << 12); 424 + b43_phy_set(dev, 0x4d0, 0x20); 425 + b43_radio_write(dev, 0x112, 0x6); 426 + 427 + /* TODO: dummy transmission? */ 428 + /* Wait if not done */ 429 + if (!(b43_phy_read(dev, 0x476) & 0x8000)) 430 + udelay(10); 431 + 432 + /* Restore */ 372 433 for (i = 0; i < 6; i++) 373 434 b43_radio_write(dev, save_radio_regs[i][0], 374 435 save_radio_regs[i][1]); 375 436 for (i = 0; i < 14; i++) 376 437 b43_phy_write(dev, save_phy_regs[i][0], save_phy_regs[i][1]); 438 + /* TODO: wlc_lcnphy_set_tx_pwr_by_index(tx_pwr_idx) */ 377 439 b43_radio_write(dev, 0x4a4, save_radio_4a4); 440 + 441 + b43_mac_enable(dev); 442 + 443 + msleep(1); 378 444 } 379 445 380 446 static bool b43_phy_lcn_load_tx_iir_cck_filter(struct b43_wldev *dev, ··· 583 499 } 584 500 b43_phy_lcn_set_tx_gain(dev, &tx_gains); 585 501 b43_phy_lcn_set_bbmult(dev, bbmult); 586 - b43_phy_lcn_sense_setup(dev); /* TODO: TEMPSENSE as arg */ 502 + b43_phy_lcn_sense_setup(dev, B43_SENSE_TEMP); 587 503 } else { 588 504 b43err(dev->wl, "TX power control not supported for this HW\n"); 589 505 }
+1
drivers/net/wireless/b43/phy_lcn.h
··· 21 21 struct b43_phy_lcn { 22 22 bool hw_pwr_ctl; 23 23 bool hw_pwr_ctl_capable; 24 + u8 tx_pwr_curr_idx; 24 25 }; 25 26 26 27