Lines Matching refs:dev

45 static void b43_lo_write(struct b43_wldev *dev, struct b43_loctl *control)  in b43_lo_write()  argument
47 struct b43_phy *phy = &dev->phy; in b43_lo_write()
52 b43dbg(dev->wl, "Invalid LO control pair " in b43_lo_write()
62 b43_phy_write(dev, B43_PHY_LO_CTL, value); in b43_lo_write()
65 static u16 lo_measure_feedthrough(struct b43_wldev *dev, in lo_measure_feedthrough() argument
68 struct b43_phy *phy = &dev->phy; in lo_measure_feedthrough()
88 if ((dev->dev->bus_sprom->boardflags_lo & B43_BFL_EXTLNA) in lo_measure_feedthrough()
92 b43_phy_write(dev, B43_PHY_PGACTL, 0xE300); in lo_measure_feedthrough()
93 b43_phy_write(dev, B43_PHY_RFOVERVAL, rfover); in lo_measure_feedthrough()
96 b43_phy_write(dev, B43_PHY_RFOVERVAL, rfover); in lo_measure_feedthrough()
99 b43_phy_write(dev, B43_PHY_RFOVERVAL, rfover); in lo_measure_feedthrough()
101 b43_phy_write(dev, B43_PHY_PGACTL, 0xF300); in lo_measure_feedthrough()
104 b43_phy_write(dev, B43_PHY_PGACTL, pga); in lo_measure_feedthrough()
107 b43_phy_write(dev, B43_PHY_PGACTL, pga); in lo_measure_feedthrough()
110 b43_phy_write(dev, B43_PHY_PGACTL, pga); in lo_measure_feedthrough()
113 feedthrough = b43_phy_read(dev, B43_PHY_LO_LEAKAGE); in lo_measure_feedthrough()
128 static u16 lo_txctl_register_table(struct b43_wldev *dev, in lo_txctl_register_table() argument
131 struct b43_phy *phy = &dev->phy; in lo_txctl_register_table()
162 static void lo_measure_txctl_values(struct b43_wldev *dev) in lo_measure_txctl_values() argument
164 struct b43_phy *phy = &dev->phy; in lo_measure_txctl_values()
216 b43_radio_maskset(dev, 0x43, 0xFFF0, radio_pctl_reg); in lo_measure_txctl_values()
217 b43_gphy_set_baseband_attenuation(dev, 2); in lo_measure_txctl_values()
219 reg = lo_txctl_register_table(dev, &mask, NULL); in lo_measure_txctl_values()
221 b43_radio_mask(dev, reg, mask); in lo_measure_txctl_values()
231 b43_radio_maskset(dev, 0x52, 0xFF0F, tx_magn); in lo_measure_txctl_values()
234 b43_radio_maskset(dev, 0x52, 0xFFF0, tx_bias); in lo_measure_txctl_values()
236 lo_measure_feedthrough(dev, 0, pga, in lo_measure_txctl_values()
246 b43_radio_write16(dev, 0x52, in lo_measure_txctl_values()
247 (b43_radio_read16(dev, 0x52) in lo_measure_txctl_values()
254 b43_radio_mask(dev, 0x52, 0xFFF0); /* TX bias == 0 */ in lo_measure_txctl_values()
259 static void lo_read_power_vector(struct b43_wldev *dev) in lo_read_power_vector() argument
261 struct b43_phy *phy = &dev->phy; in lo_read_power_vector()
269 tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x310 + i); in lo_read_power_vector()
272 b43_shm_write16(dev, B43_SHM_SHARED, 0x310 + i, 0); in lo_read_power_vector()
280 static void lo_measure_gain_values(struct b43_wldev *dev, in lo_measure_gain_values() argument
283 struct b43_phy *phy = &dev->phy; in lo_measure_gain_values()
331 tmp = b43_radio_read16(dev, 0x7A); in lo_measure_gain_values()
336 b43_radio_write16(dev, 0x7A, tmp); in lo_measure_gain_values()
372 static void lo_measure_setup(struct b43_wldev *dev, in lo_measure_setup() argument
375 struct ssb_sprom *sprom = dev->dev->bus_sprom; in lo_measure_setup()
376 struct b43_phy *phy = &dev->phy; in lo_measure_setup()
381 if (b43_has_hardware_pctl(dev)) { in lo_measure_setup()
382 sav->phy_lo_mask = b43_phy_read(dev, B43_PHY_LO_MASK); in lo_measure_setup()
383 sav->phy_extg_01 = b43_phy_read(dev, B43_PHY_EXTG(0x01)); in lo_measure_setup()
384 sav->phy_dacctl_hwpctl = b43_phy_read(dev, B43_PHY_DACCTL); in lo_measure_setup()
385 sav->phy_cck_14 = b43_phy_read(dev, B43_PHY_CCK(0x14)); in lo_measure_setup()
386 sav->phy_hpwr_tssictl = b43_phy_read(dev, B43_PHY_HPWR_TSSICTL); in lo_measure_setup()
388 b43_phy_set(dev, B43_PHY_HPWR_TSSICTL, 0x100); in lo_measure_setup()
389 b43_phy_set(dev, B43_PHY_EXTG(0x01), 0x40); in lo_measure_setup()
390 b43_phy_set(dev, B43_PHY_DACCTL, 0x40); in lo_measure_setup()
391 b43_phy_set(dev, B43_PHY_CCK(0x14), 0x200); in lo_measure_setup()
395 b43_phy_write(dev, B43_PHY_CCK(0x16), 0x410); in lo_measure_setup()
396 b43_phy_write(dev, B43_PHY_CCK(0x17), 0x820); in lo_measure_setup()
399 sav->phy_analogover = b43_phy_read(dev, B43_PHY_ANALOGOVER); in lo_measure_setup()
401 b43_phy_read(dev, B43_PHY_ANALOGOVERVAL); in lo_measure_setup()
402 sav->phy_rfover = b43_phy_read(dev, B43_PHY_RFOVER); in lo_measure_setup()
403 sav->phy_rfoverval = b43_phy_read(dev, B43_PHY_RFOVERVAL); in lo_measure_setup()
404 sav->phy_classctl = b43_phy_read(dev, B43_PHY_CLASSCTL); in lo_measure_setup()
405 sav->phy_cck_3E = b43_phy_read(dev, B43_PHY_CCK(0x3E)); in lo_measure_setup()
406 sav->phy_crs0 = b43_phy_read(dev, B43_PHY_CRS0); in lo_measure_setup()
408 b43_phy_mask(dev, B43_PHY_CLASSCTL, 0xFFFC); in lo_measure_setup()
409 b43_phy_mask(dev, B43_PHY_CRS0, 0x7FFF); in lo_measure_setup()
410 b43_phy_set(dev, B43_PHY_ANALOGOVER, 0x0003); in lo_measure_setup()
411 b43_phy_mask(dev, B43_PHY_ANALOGOVERVAL, 0xFFFC); in lo_measure_setup()
415 b43_phy_write(dev, B43_PHY_RFOVER, 0x933); in lo_measure_setup()
417 b43_phy_write(dev, B43_PHY_RFOVER, 0x133); in lo_measure_setup()
420 b43_phy_write(dev, B43_PHY_RFOVER, 0); in lo_measure_setup()
422 b43_phy_write(dev, B43_PHY_CCK(0x3E), 0); in lo_measure_setup()
424 sav->reg_3F4 = b43_read16(dev, 0x3F4); in lo_measure_setup()
425 sav->reg_3E2 = b43_read16(dev, 0x3E2); in lo_measure_setup()
426 sav->radio_43 = b43_radio_read16(dev, 0x43); in lo_measure_setup()
427 sav->radio_7A = b43_radio_read16(dev, 0x7A); in lo_measure_setup()
428 sav->phy_pgactl = b43_phy_read(dev, B43_PHY_PGACTL); in lo_measure_setup()
429 sav->phy_cck_2A = b43_phy_read(dev, B43_PHY_CCK(0x2A)); in lo_measure_setup()
430 sav->phy_syncctl = b43_phy_read(dev, B43_PHY_SYNCCTL); in lo_measure_setup()
431 sav->phy_dacctl = b43_phy_read(dev, B43_PHY_DACCTL); in lo_measure_setup()
434 sav->radio_52 = b43_radio_read16(dev, 0x52); in lo_measure_setup()
438 sav->phy_cck_30 = b43_phy_read(dev, B43_PHY_CCK(0x30)); in lo_measure_setup()
439 sav->phy_cck_06 = b43_phy_read(dev, B43_PHY_CCK(0x06)); in lo_measure_setup()
440 b43_phy_write(dev, B43_PHY_CCK(0x30), 0x00FF); in lo_measure_setup()
441 b43_phy_write(dev, B43_PHY_CCK(0x06), 0x3F3F); in lo_measure_setup()
443 b43_write16(dev, 0x3E2, b43_read16(dev, 0x3E2) in lo_measure_setup()
446 b43_write16(dev, 0x3F4, b43_read16(dev, 0x3F4) in lo_measure_setup()
451 b43_phy_write(dev, tmp, 0x007F); in lo_measure_setup()
454 b43_phy_write(dev, B43_PHY_SYNCCTL, tmp & 0xFF7F); in lo_measure_setup()
456 b43_radio_write16(dev, 0x007A, tmp & 0xFFF0); in lo_measure_setup()
458 b43_phy_write(dev, B43_PHY_CCK(0x2A), 0x8A3); in lo_measure_setup()
462 b43_phy_write(dev, B43_PHY_CCK(0x2B), 0x1003); in lo_measure_setup()
464 b43_phy_write(dev, B43_PHY_CCK(0x2B), 0x0802); in lo_measure_setup()
466 b43_dummy_transmission(dev, false, true); in lo_measure_setup()
467 b43_gphy_channel_switch(dev, 6, 0); in lo_measure_setup()
468 b43_radio_read16(dev, 0x51); /* dummy read */ in lo_measure_setup()
470 b43_phy_write(dev, B43_PHY_CCK(0x2F), 0); in lo_measure_setup()
475 lo_measure_txctl_values(dev); in lo_measure_setup()
478 b43_phy_write(dev, B43_PHY_LO_MASK, 0xC078); in lo_measure_setup()
481 b43_phy_write(dev, B43_PHY_CCK(0x2E), 0x8078); in lo_measure_setup()
483 b43_phy_write(dev, B43_PHY_LO_MASK, 0x8078); in lo_measure_setup()
487 static void lo_measure_restore(struct b43_wldev *dev, in lo_measure_restore() argument
490 struct b43_phy *phy = &dev->phy; in lo_measure_restore()
495 b43_phy_write(dev, B43_PHY_PGACTL, 0xE300); in lo_measure_restore()
497 b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA0); in lo_measure_restore()
499 b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA2); in lo_measure_restore()
501 b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA3); in lo_measure_restore()
504 b43_phy_write(dev, B43_PHY_PGACTL, tmp); in lo_measure_restore()
508 b43_phy_write(dev, B43_PHY_CCK(0x2E), 0xC078); in lo_measure_restore()
510 b43_phy_write(dev, B43_PHY_CCK(0x2E), 0x8078); in lo_measure_restore()
512 b43_phy_write(dev, B43_PHY_CCK(0x2F), 0x0202); in lo_measure_restore()
514 b43_phy_write(dev, B43_PHY_CCK(0x2F), 0x0101); in lo_measure_restore()
516 b43_write16(dev, 0x3F4, sav->reg_3F4); in lo_measure_restore()
517 b43_phy_write(dev, B43_PHY_PGACTL, sav->phy_pgactl); in lo_measure_restore()
518 b43_phy_write(dev, B43_PHY_CCK(0x2A), sav->phy_cck_2A); in lo_measure_restore()
519 b43_phy_write(dev, B43_PHY_SYNCCTL, sav->phy_syncctl); in lo_measure_restore()
520 b43_phy_write(dev, B43_PHY_DACCTL, sav->phy_dacctl); in lo_measure_restore()
521 b43_radio_write16(dev, 0x43, sav->radio_43); in lo_measure_restore()
522 b43_radio_write16(dev, 0x7A, sav->radio_7A); in lo_measure_restore()
525 b43_radio_maskset(dev, 0x52, 0xFF0F, tmp); in lo_measure_restore()
527 b43_write16(dev, 0x3E2, sav->reg_3E2); in lo_measure_restore()
530 b43_phy_write(dev, B43_PHY_CCK(0x30), sav->phy_cck_30); in lo_measure_restore()
531 b43_phy_write(dev, B43_PHY_CCK(0x06), sav->phy_cck_06); in lo_measure_restore()
534 b43_phy_write(dev, B43_PHY_ANALOGOVER, sav->phy_analogover); in lo_measure_restore()
535 b43_phy_write(dev, B43_PHY_ANALOGOVERVAL, in lo_measure_restore()
537 b43_phy_write(dev, B43_PHY_CLASSCTL, sav->phy_classctl); in lo_measure_restore()
538 b43_phy_write(dev, B43_PHY_RFOVER, sav->phy_rfover); in lo_measure_restore()
539 b43_phy_write(dev, B43_PHY_RFOVERVAL, sav->phy_rfoverval); in lo_measure_restore()
540 b43_phy_write(dev, B43_PHY_CCK(0x3E), sav->phy_cck_3E); in lo_measure_restore()
541 b43_phy_write(dev, B43_PHY_CRS0, sav->phy_crs0); in lo_measure_restore()
543 if (b43_has_hardware_pctl(dev)) { in lo_measure_restore()
545 b43_phy_write(dev, B43_PHY_LO_MASK, tmp); in lo_measure_restore()
546 b43_phy_write(dev, B43_PHY_EXTG(0x01), sav->phy_extg_01); in lo_measure_restore()
547 b43_phy_write(dev, B43_PHY_DACCTL, sav->phy_dacctl_hwpctl); in lo_measure_restore()
548 b43_phy_write(dev, B43_PHY_CCK(0x14), sav->phy_cck_14); in lo_measure_restore()
549 b43_phy_write(dev, B43_PHY_HPWR_TSSICTL, sav->phy_hpwr_tssictl); in lo_measure_restore()
551 b43_gphy_channel_switch(dev, sav->old_channel, 1); in lo_measure_restore()
563 static int lo_probe_possible_loctls(struct b43_wldev *dev, in lo_probe_possible_loctls() argument
567 struct b43_phy *phy = &dev->phy; in lo_probe_possible_loctls()
617 b43_lo_write(dev, &test_loctl); in lo_probe_possible_loctls()
618 feedth = lo_measure_feedthrough(dev, gphy->lna_gain, in lo_probe_possible_loctls()
644 static void lo_probe_loctls_statemachine(struct b43_wldev *dev, in lo_probe_loctls_statemachine() argument
648 struct b43_phy *phy = &dev->phy; in lo_probe_loctls_statemachine()
665 b43_lo_write(dev, &d.min_loctl); in lo_probe_loctls_statemachine()
666 feedth = lo_measure_feedthrough(dev, gphy->lna_gain, in lo_probe_loctls_statemachine()
674 feedth = lo_measure_feedthrough(dev, gphy->lna_gain, in lo_probe_loctls_statemachine()
688 lo_probe_possible_loctls(dev, &probe_loctl, &d); in lo_probe_loctls_statemachine()
714 lo_measure_gain_values(dev, *max_rx_gain, in lo_probe_loctls_statemachine()
720 struct b43_lo_calib *b43_calibrate_lo_setting(struct b43_wldev *dev, in b43_calibrate_lo_setting() argument
724 struct b43_phy *phy = &dev->phy; in b43_calibrate_lo_setting()
739 b43_mac_suspend(dev); in b43_calibrate_lo_setting()
740 lo_measure_setup(dev, &saved_regs); in b43_calibrate_lo_setting()
742 txctl_reg = lo_txctl_register_table(dev, &txctl_value, &pad_mix_gain); in b43_calibrate_lo_setting()
744 b43_radio_maskset(dev, 0x43, 0xFFF0, rfatt->att); in b43_calibrate_lo_setting()
745 b43_radio_maskset(dev, txctl_reg, ~txctl_value, (rfatt->with_padmix ? txctl_value :0)); in b43_calibrate_lo_setting()
753 lo_measure_gain_values(dev, max_rx_gain, in b43_calibrate_lo_setting()
756 b43_gphy_set_baseband_attenuation(dev, bbatt->att); in b43_calibrate_lo_setting()
757 lo_probe_loctls_statemachine(dev, &loctl, &max_rx_gain); in b43_calibrate_lo_setting()
759 lo_measure_restore(dev, &saved_regs); in b43_calibrate_lo_setting()
760 b43_mac_enable(dev); in b43_calibrate_lo_setting()
762 if (b43_debug(dev, B43_DBG_LO)) { in b43_calibrate_lo_setting()
763 b43dbg(dev->wl, "LO: Calibrated for BB(%u), RF(%u,%u) " in b43_calibrate_lo_setting()
771 b43warn(dev->wl, "LO calib: out of memory\n"); in b43_calibrate_lo_setting()
786 struct b43_lo_calib *b43_get_calib_lo_settings(struct b43_wldev *dev, in b43_get_calib_lo_settings() argument
790 struct b43_txpower_lo_control *lo = dev->phy.g->lo_control; in b43_get_calib_lo_settings()
798 c = b43_calibrate_lo_setting(dev, bbatt, rfatt); in b43_get_calib_lo_settings()
806 void b43_gphy_dc_lt_init(struct b43_wldev *dev, bool update_all) in b43_gphy_dc_lt_init() argument
808 struct b43_phy *phy = &dev->phy; in b43_gphy_dc_lt_init()
827 b43_mac_suspend(dev); in b43_gphy_dc_lt_init()
843 cal = b43_calibrate_lo_setting(dev, bbatt, rfatt); in b43_gphy_dc_lt_init()
845 b43warn(dev->wl, "LO: Could not " in b43_gphy_dc_lt_init()
871 b43_phy_write(dev, 0x3A0 + i, lo->dc_lt[i]); in b43_gphy_dc_lt_init()
873 b43_mac_enable(dev); in b43_gphy_dc_lt_init()
886 void b43_lo_g_adjust(struct b43_wldev *dev) in b43_lo_g_adjust() argument
888 struct b43_phy_g *gphy = dev->phy.g; in b43_lo_g_adjust()
895 cal = b43_get_calib_lo_settings(dev, &gphy->bbatt, &rf); in b43_lo_g_adjust()
898 b43_lo_write(dev, &cal->ctl); in b43_lo_g_adjust()
901 void b43_lo_g_adjust_to(struct b43_wldev *dev, in b43_lo_g_adjust_to() argument
913 cal = b43_get_calib_lo_settings(dev, &bb, &rf); in b43_lo_g_adjust_to()
916 b43_lo_write(dev, &cal->ctl); in b43_lo_g_adjust_to()
920 void b43_lo_g_maintenance_work(struct b43_wldev *dev) in b43_lo_g_maintenance_work() argument
922 struct b43_phy *phy = &dev->phy; in b43_lo_g_maintenance_work()
934 hwpctl = b43_has_hardware_pctl(dev); in b43_lo_g_maintenance_work()
940 lo_read_power_vector(dev); in b43_lo_g_maintenance_work()
941 b43_gphy_dc_lt_init(dev, 0); in b43_lo_g_maintenance_work()
960 if (b43_debug(dev, B43_DBG_LO)) { in b43_lo_g_maintenance_work()
961 b43dbg(dev->wl, "LO: Item BB(%u), RF(%u,%u), " in b43_lo_g_maintenance_work()
972 if (b43_debug(dev, B43_DBG_LO)) in b43_lo_g_maintenance_work()
973 b43dbg(dev->wl, "LO: Recalibrating current LO setting\n"); in b43_lo_g_maintenance_work()
974 cal = b43_calibrate_lo_setting(dev, &gphy->bbatt, &gphy->rfatt); in b43_lo_g_maintenance_work()
977 b43_lo_write(dev, &cal->ctl); in b43_lo_g_maintenance_work()
979 b43warn(dev->wl, "Failed to recalibrate current LO setting\n"); in b43_lo_g_maintenance_work()
983 void b43_lo_g_cleanup(struct b43_wldev *dev) in b43_lo_g_cleanup() argument
985 struct b43_txpower_lo_control *lo = dev->phy.g->lo_control; in b43_lo_g_cleanup()
997 void b43_lo_g_init(struct b43_wldev *dev) in b43_lo_g_init() argument
999 if (b43_has_hardware_pctl(dev)) { in b43_lo_g_init()
1000 lo_read_power_vector(dev); in b43_lo_g_init()
1001 b43_gphy_dc_lt_init(dev, 1); in b43_lo_g_init()