diff options
author | Michael Buesch <mb@bu3sch.de> | 2008-08-27 12:53:02 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-08-29 16:24:12 -0400 |
commit | ef1a628d83fc0423c36e773281162be790503168 (patch) | |
tree | 436d3d7d91434febb1813dcea16060e6937288b9 /drivers/net/wireless/b43/lo.c | |
parent | 35e032d82f3e2a9b0d92077b4fbc97166525ed53 (diff) |
b43: Implement dynamic PHY API
This patch implements a dynamic "ops" based PHY API.
This is needed in order to conveniently support future PHY types
to avoid the "switch"-hell.
This patch does not change any functionality. It just moves lots
of code from one place to another and adjusts it for the changed
data structures.
Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43/lo.c')
-rw-r--r-- | drivers/net/wireless/b43/lo.c | 120 |
1 files changed, 64 insertions, 56 deletions
diff --git a/drivers/net/wireless/b43/lo.c b/drivers/net/wireless/b43/lo.c index 9c854d6aae36..6a18a1470465 100644 --- a/drivers/net/wireless/b43/lo.c +++ b/drivers/net/wireless/b43/lo.c | |||
@@ -29,7 +29,7 @@ | |||
29 | 29 | ||
30 | #include "b43.h" | 30 | #include "b43.h" |
31 | #include "lo.h" | 31 | #include "lo.h" |
32 | #include "phy.h" | 32 | #include "phy_g.h" |
33 | #include "main.h" | 33 | #include "main.h" |
34 | 34 | ||
35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
@@ -174,7 +174,8 @@ static u16 lo_txctl_register_table(struct b43_wldev *dev, | |||
174 | static void lo_measure_txctl_values(struct b43_wldev *dev) | 174 | static void lo_measure_txctl_values(struct b43_wldev *dev) |
175 | { | 175 | { |
176 | struct b43_phy *phy = &dev->phy; | 176 | struct b43_phy *phy = &dev->phy; |
177 | struct b43_txpower_lo_control *lo = phy->lo_control; | 177 | struct b43_phy_g *gphy = phy->g; |
178 | struct b43_txpower_lo_control *lo = gphy->lo_control; | ||
178 | u16 reg, mask; | 179 | u16 reg, mask; |
179 | u16 trsw_rx, pga; | 180 | u16 trsw_rx, pga; |
180 | u16 radio_pctl_reg; | 181 | u16 radio_pctl_reg; |
@@ -195,7 +196,7 @@ static void lo_measure_txctl_values(struct b43_wldev *dev) | |||
195 | int lb_gain; /* Loopback gain (in dB) */ | 196 | int lb_gain; /* Loopback gain (in dB) */ |
196 | 197 | ||
197 | trsw_rx = 0; | 198 | trsw_rx = 0; |
198 | lb_gain = phy->max_lb_gain / 2; | 199 | lb_gain = gphy->max_lb_gain / 2; |
199 | if (lb_gain > 10) { | 200 | if (lb_gain > 10) { |
200 | radio_pctl_reg = 0; | 201 | radio_pctl_reg = 0; |
201 | pga = abs(10 - lb_gain) / 6; | 202 | pga = abs(10 - lb_gain) / 6; |
@@ -226,7 +227,7 @@ static void lo_measure_txctl_values(struct b43_wldev *dev) | |||
226 | } | 227 | } |
227 | b43_radio_write16(dev, 0x43, (b43_radio_read16(dev, 0x43) | 228 | b43_radio_write16(dev, 0x43, (b43_radio_read16(dev, 0x43) |
228 | & 0xFFF0) | radio_pctl_reg); | 229 | & 0xFFF0) | radio_pctl_reg); |
229 | b43_phy_set_baseband_attenuation(dev, 2); | 230 | b43_gphy_set_baseband_attenuation(dev, 2); |
230 | 231 | ||
231 | reg = lo_txctl_register_table(dev, &mask, NULL); | 232 | reg = lo_txctl_register_table(dev, &mask, NULL); |
232 | mask = ~mask; | 233 | mask = ~mask; |
@@ -277,7 +278,8 @@ static void lo_measure_txctl_values(struct b43_wldev *dev) | |||
277 | static void lo_read_power_vector(struct b43_wldev *dev) | 278 | static void lo_read_power_vector(struct b43_wldev *dev) |
278 | { | 279 | { |
279 | struct b43_phy *phy = &dev->phy; | 280 | struct b43_phy *phy = &dev->phy; |
280 | struct b43_txpower_lo_control *lo = phy->lo_control; | 281 | struct b43_phy_g *gphy = phy->g; |
282 | struct b43_txpower_lo_control *lo = gphy->lo_control; | ||
281 | int i; | 283 | int i; |
282 | u64 tmp; | 284 | u64 tmp; |
283 | u64 power_vector = 0; | 285 | u64 power_vector = 0; |
@@ -298,6 +300,7 @@ static void lo_measure_gain_values(struct b43_wldev *dev, | |||
298 | s16 max_rx_gain, int use_trsw_rx) | 300 | s16 max_rx_gain, int use_trsw_rx) |
299 | { | 301 | { |
300 | struct b43_phy *phy = &dev->phy; | 302 | struct b43_phy *phy = &dev->phy; |
303 | struct b43_phy_g *gphy = phy->g; | ||
301 | u16 tmp; | 304 | u16 tmp; |
302 | 305 | ||
303 | if (max_rx_gain < 0) | 306 | if (max_rx_gain < 0) |
@@ -308,7 +311,7 @@ static void lo_measure_gain_values(struct b43_wldev *dev, | |||
308 | int trsw_rx_gain; | 311 | int trsw_rx_gain; |
309 | 312 | ||
310 | if (use_trsw_rx) { | 313 | if (use_trsw_rx) { |
311 | trsw_rx_gain = phy->trsw_rx_gain / 2; | 314 | trsw_rx_gain = gphy->trsw_rx_gain / 2; |
312 | if (max_rx_gain >= trsw_rx_gain) { | 315 | if (max_rx_gain >= trsw_rx_gain) { |
313 | trsw_rx_gain = max_rx_gain - trsw_rx_gain; | 316 | trsw_rx_gain = max_rx_gain - trsw_rx_gain; |
314 | trsw_rx = 0x20; | 317 | trsw_rx = 0x20; |
@@ -316,38 +319,38 @@ static void lo_measure_gain_values(struct b43_wldev *dev, | |||
316 | } else | 319 | } else |
317 | trsw_rx_gain = max_rx_gain; | 320 | trsw_rx_gain = max_rx_gain; |
318 | if (trsw_rx_gain < 9) { | 321 | if (trsw_rx_gain < 9) { |
319 | phy->lna_lod_gain = 0; | 322 | gphy->lna_lod_gain = 0; |
320 | } else { | 323 | } else { |
321 | phy->lna_lod_gain = 1; | 324 | gphy->lna_lod_gain = 1; |
322 | trsw_rx_gain -= 8; | 325 | trsw_rx_gain -= 8; |
323 | } | 326 | } |
324 | trsw_rx_gain = clamp_val(trsw_rx_gain, 0, 0x2D); | 327 | trsw_rx_gain = clamp_val(trsw_rx_gain, 0, 0x2D); |
325 | phy->pga_gain = trsw_rx_gain / 3; | 328 | gphy->pga_gain = trsw_rx_gain / 3; |
326 | if (phy->pga_gain >= 5) { | 329 | if (gphy->pga_gain >= 5) { |
327 | phy->pga_gain -= 5; | 330 | gphy->pga_gain -= 5; |
328 | phy->lna_gain = 2; | 331 | gphy->lna_gain = 2; |
329 | } else | 332 | } else |
330 | phy->lna_gain = 0; | 333 | gphy->lna_gain = 0; |
331 | } else { | 334 | } else { |
332 | phy->lna_gain = 0; | 335 | gphy->lna_gain = 0; |
333 | phy->trsw_rx_gain = 0x20; | 336 | gphy->trsw_rx_gain = 0x20; |
334 | if (max_rx_gain >= 0x14) { | 337 | if (max_rx_gain >= 0x14) { |
335 | phy->lna_lod_gain = 1; | 338 | gphy->lna_lod_gain = 1; |
336 | phy->pga_gain = 2; | 339 | gphy->pga_gain = 2; |
337 | } else if (max_rx_gain >= 0x12) { | 340 | } else if (max_rx_gain >= 0x12) { |
338 | phy->lna_lod_gain = 1; | 341 | gphy->lna_lod_gain = 1; |
339 | phy->pga_gain = 1; | 342 | gphy->pga_gain = 1; |
340 | } else if (max_rx_gain >= 0xF) { | 343 | } else if (max_rx_gain >= 0xF) { |
341 | phy->lna_lod_gain = 1; | 344 | gphy->lna_lod_gain = 1; |
342 | phy->pga_gain = 0; | 345 | gphy->pga_gain = 0; |
343 | } else { | 346 | } else { |
344 | phy->lna_lod_gain = 0; | 347 | gphy->lna_lod_gain = 0; |
345 | phy->pga_gain = 0; | 348 | gphy->pga_gain = 0; |
346 | } | 349 | } |
347 | } | 350 | } |
348 | 351 | ||
349 | tmp = b43_radio_read16(dev, 0x7A); | 352 | tmp = b43_radio_read16(dev, 0x7A); |
350 | if (phy->lna_lod_gain == 0) | 353 | if (gphy->lna_lod_gain == 0) |
351 | tmp &= ~0x0008; | 354 | tmp &= ~0x0008; |
352 | else | 355 | else |
353 | tmp |= 0x0008; | 356 | tmp |= 0x0008; |
@@ -392,10 +395,11 @@ static void lo_measure_setup(struct b43_wldev *dev, | |||
392 | { | 395 | { |
393 | struct ssb_sprom *sprom = &dev->dev->bus->sprom; | 396 | struct ssb_sprom *sprom = &dev->dev->bus->sprom; |
394 | struct b43_phy *phy = &dev->phy; | 397 | struct b43_phy *phy = &dev->phy; |
395 | struct b43_txpower_lo_control *lo = phy->lo_control; | 398 | struct b43_phy_g *gphy = phy->g; |
399 | struct b43_txpower_lo_control *lo = gphy->lo_control; | ||
396 | u16 tmp; | 400 | u16 tmp; |
397 | 401 | ||
398 | if (b43_has_hardware_pctl(phy)) { | 402 | if (b43_has_hardware_pctl(dev)) { |
399 | sav->phy_lo_mask = b43_phy_read(dev, B43_PHY_LO_MASK); | 403 | sav->phy_lo_mask = b43_phy_read(dev, B43_PHY_LO_MASK); |
400 | sav->phy_extg_01 = b43_phy_read(dev, B43_PHY_EXTG(0x01)); | 404 | sav->phy_extg_01 = b43_phy_read(dev, B43_PHY_EXTG(0x01)); |
401 | sav->phy_dacctl_hwpctl = b43_phy_read(dev, B43_PHY_DACCTL); | 405 | sav->phy_dacctl_hwpctl = b43_phy_read(dev, B43_PHY_DACCTL); |
@@ -496,7 +500,7 @@ static void lo_measure_setup(struct b43_wldev *dev, | |||
496 | b43_phy_write(dev, B43_PHY_CCK(0x2B), 0x0802); | 500 | b43_phy_write(dev, B43_PHY_CCK(0x2B), 0x0802); |
497 | if (phy->rev >= 2) | 501 | if (phy->rev >= 2) |
498 | b43_dummy_transmission(dev); | 502 | b43_dummy_transmission(dev); |
499 | b43_radio_selectchannel(dev, 6, 0); | 503 | b43_gphy_channel_switch(dev, 6, 0); |
500 | b43_radio_read16(dev, 0x51); /* dummy read */ | 504 | b43_radio_read16(dev, 0x51); /* dummy read */ |
501 | if (phy->type == B43_PHYTYPE_G) | 505 | if (phy->type == B43_PHYTYPE_G) |
502 | b43_phy_write(dev, B43_PHY_CCK(0x2F), 0); | 506 | b43_phy_write(dev, B43_PHY_CCK(0x2F), 0); |
@@ -520,18 +524,19 @@ static void lo_measure_restore(struct b43_wldev *dev, | |||
520 | struct lo_g_saved_values *sav) | 524 | struct lo_g_saved_values *sav) |
521 | { | 525 | { |
522 | struct b43_phy *phy = &dev->phy; | 526 | struct b43_phy *phy = &dev->phy; |
527 | struct b43_phy_g *gphy = phy->g; | ||
523 | u16 tmp; | 528 | u16 tmp; |
524 | 529 | ||
525 | if (phy->rev >= 2) { | 530 | if (phy->rev >= 2) { |
526 | b43_phy_write(dev, B43_PHY_PGACTL, 0xE300); | 531 | b43_phy_write(dev, B43_PHY_PGACTL, 0xE300); |
527 | tmp = (phy->pga_gain << 8); | 532 | tmp = (gphy->pga_gain << 8); |
528 | b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA0); | 533 | b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA0); |
529 | udelay(5); | 534 | udelay(5); |
530 | b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA2); | 535 | b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA2); |
531 | udelay(2); | 536 | udelay(2); |
532 | b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA3); | 537 | b43_phy_write(dev, B43_PHY_RFOVERVAL, tmp | 0xA3); |
533 | } else { | 538 | } else { |
534 | tmp = (phy->pga_gain | 0xEFA0); | 539 | tmp = (gphy->pga_gain | 0xEFA0); |
535 | b43_phy_write(dev, B43_PHY_PGACTL, tmp); | 540 | b43_phy_write(dev, B43_PHY_PGACTL, tmp); |
536 | } | 541 | } |
537 | if (phy->type == B43_PHYTYPE_G) { | 542 | if (phy->type == B43_PHYTYPE_G) { |
@@ -572,7 +577,7 @@ static void lo_measure_restore(struct b43_wldev *dev, | |||
572 | b43_phy_write(dev, B43_PHY_CCK(0x3E), sav->phy_cck_3E); | 577 | b43_phy_write(dev, B43_PHY_CCK(0x3E), sav->phy_cck_3E); |
573 | b43_phy_write(dev, B43_PHY_CRS0, sav->phy_crs0); | 578 | b43_phy_write(dev, B43_PHY_CRS0, sav->phy_crs0); |
574 | } | 579 | } |
575 | if (b43_has_hardware_pctl(phy)) { | 580 | if (b43_has_hardware_pctl(dev)) { |
576 | tmp = (sav->phy_lo_mask & 0xBFFF); | 581 | tmp = (sav->phy_lo_mask & 0xBFFF); |
577 | b43_phy_write(dev, B43_PHY_LO_MASK, tmp); | 582 | b43_phy_write(dev, B43_PHY_LO_MASK, tmp); |
578 | b43_phy_write(dev, B43_PHY_EXTG(0x01), sav->phy_extg_01); | 583 | b43_phy_write(dev, B43_PHY_EXTG(0x01), sav->phy_extg_01); |
@@ -580,7 +585,7 @@ static void lo_measure_restore(struct b43_wldev *dev, | |||
580 | b43_phy_write(dev, B43_PHY_CCK(0x14), sav->phy_cck_14); | 585 | b43_phy_write(dev, B43_PHY_CCK(0x14), sav->phy_cck_14); |
581 | b43_phy_write(dev, B43_PHY_HPWR_TSSICTL, sav->phy_hpwr_tssictl); | 586 | b43_phy_write(dev, B43_PHY_HPWR_TSSICTL, sav->phy_hpwr_tssictl); |
582 | } | 587 | } |
583 | b43_radio_selectchannel(dev, sav->old_channel, 1); | 588 | b43_gphy_channel_switch(dev, sav->old_channel, 1); |
584 | } | 589 | } |
585 | 590 | ||
586 | struct b43_lo_g_statemachine { | 591 | struct b43_lo_g_statemachine { |
@@ -597,6 +602,7 @@ static int lo_probe_possible_loctls(struct b43_wldev *dev, | |||
597 | struct b43_lo_g_statemachine *d) | 602 | struct b43_lo_g_statemachine *d) |
598 | { | 603 | { |
599 | struct b43_phy *phy = &dev->phy; | 604 | struct b43_phy *phy = &dev->phy; |
605 | struct b43_phy_g *gphy = phy->g; | ||
600 | struct b43_loctl test_loctl; | 606 | struct b43_loctl test_loctl; |
601 | struct b43_loctl orig_loctl; | 607 | struct b43_loctl orig_loctl; |
602 | struct b43_loctl prev_loctl = { | 608 | struct b43_loctl prev_loctl = { |
@@ -646,9 +652,9 @@ static int lo_probe_possible_loctls(struct b43_wldev *dev, | |||
646 | test_loctl.q != prev_loctl.q) && | 652 | test_loctl.q != prev_loctl.q) && |
647 | (abs(test_loctl.i) <= 16 && abs(test_loctl.q) <= 16)) { | 653 | (abs(test_loctl.i) <= 16 && abs(test_loctl.q) <= 16)) { |
648 | b43_lo_write(dev, &test_loctl); | 654 | b43_lo_write(dev, &test_loctl); |
649 | feedth = lo_measure_feedthrough(dev, phy->lna_gain, | 655 | feedth = lo_measure_feedthrough(dev, gphy->lna_gain, |
650 | phy->pga_gain, | 656 | gphy->pga_gain, |
651 | phy->trsw_rx_gain); | 657 | gphy->trsw_rx_gain); |
652 | if (feedth < d->lowest_feedth) { | 658 | if (feedth < d->lowest_feedth) { |
653 | memcpy(probe_loctl, &test_loctl, | 659 | memcpy(probe_loctl, &test_loctl, |
654 | sizeof(struct b43_loctl)); | 660 | sizeof(struct b43_loctl)); |
@@ -677,6 +683,7 @@ static void lo_probe_loctls_statemachine(struct b43_wldev *dev, | |||
677 | int *max_rx_gain) | 683 | int *max_rx_gain) |
678 | { | 684 | { |
679 | struct b43_phy *phy = &dev->phy; | 685 | struct b43_phy *phy = &dev->phy; |
686 | struct b43_phy_g *gphy = phy->g; | ||
680 | struct b43_lo_g_statemachine d; | 687 | struct b43_lo_g_statemachine d; |
681 | u16 feedth; | 688 | u16 feedth; |
682 | int found_lower; | 689 | int found_lower; |
@@ -693,17 +700,17 @@ static void lo_probe_loctls_statemachine(struct b43_wldev *dev, | |||
693 | max_repeat = 4; | 700 | max_repeat = 4; |
694 | do { | 701 | do { |
695 | b43_lo_write(dev, &d.min_loctl); | 702 | b43_lo_write(dev, &d.min_loctl); |
696 | feedth = lo_measure_feedthrough(dev, phy->lna_gain, | 703 | feedth = lo_measure_feedthrough(dev, gphy->lna_gain, |
697 | phy->pga_gain, | 704 | gphy->pga_gain, |
698 | phy->trsw_rx_gain); | 705 | gphy->trsw_rx_gain); |
699 | if (feedth < 0x258) { | 706 | if (feedth < 0x258) { |
700 | if (feedth >= 0x12C) | 707 | if (feedth >= 0x12C) |
701 | *max_rx_gain += 6; | 708 | *max_rx_gain += 6; |
702 | else | 709 | else |
703 | *max_rx_gain += 3; | 710 | *max_rx_gain += 3; |
704 | feedth = lo_measure_feedthrough(dev, phy->lna_gain, | 711 | feedth = lo_measure_feedthrough(dev, gphy->lna_gain, |
705 | phy->pga_gain, | 712 | gphy->pga_gain, |
706 | phy->trsw_rx_gain); | 713 | gphy->trsw_rx_gain); |
707 | } | 714 | } |
708 | d.lowest_feedth = feedth; | 715 | d.lowest_feedth = feedth; |
709 | 716 | ||
@@ -752,6 +759,7 @@ struct b43_lo_calib * b43_calibrate_lo_setting(struct b43_wldev *dev, | |||
752 | const struct b43_rfatt *rfatt) | 759 | const struct b43_rfatt *rfatt) |
753 | { | 760 | { |
754 | struct b43_phy *phy = &dev->phy; | 761 | struct b43_phy *phy = &dev->phy; |
762 | struct b43_phy_g *gphy = phy->g; | ||
755 | struct b43_loctl loctl = { | 763 | struct b43_loctl loctl = { |
756 | .i = 0, | 764 | .i = 0, |
757 | .q = 0, | 765 | .q = 0, |
@@ -782,11 +790,11 @@ struct b43_lo_calib * b43_calibrate_lo_setting(struct b43_wldev *dev, | |||
782 | if (rfatt->with_padmix) | 790 | if (rfatt->with_padmix) |
783 | max_rx_gain -= pad_mix_gain; | 791 | max_rx_gain -= pad_mix_gain; |
784 | if (has_loopback_gain(phy)) | 792 | if (has_loopback_gain(phy)) |
785 | max_rx_gain += phy->max_lb_gain; | 793 | max_rx_gain += gphy->max_lb_gain; |
786 | lo_measure_gain_values(dev, max_rx_gain, | 794 | lo_measure_gain_values(dev, max_rx_gain, |
787 | has_loopback_gain(phy)); | 795 | has_loopback_gain(phy)); |
788 | 796 | ||
789 | b43_phy_set_baseband_attenuation(dev, bbatt->att); | 797 | b43_gphy_set_baseband_attenuation(dev, bbatt->att); |
790 | lo_probe_loctls_statemachine(dev, &loctl, &max_rx_gain); | 798 | lo_probe_loctls_statemachine(dev, &loctl, &max_rx_gain); |
791 | 799 | ||
792 | lo_measure_restore(dev, &saved_regs); | 800 | lo_measure_restore(dev, &saved_regs); |
@@ -820,7 +828,7 @@ struct b43_lo_calib * b43_get_calib_lo_settings(struct b43_wldev *dev, | |||
820 | const struct b43_bbatt *bbatt, | 828 | const struct b43_bbatt *bbatt, |
821 | const struct b43_rfatt *rfatt) | 829 | const struct b43_rfatt *rfatt) |
822 | { | 830 | { |
823 | struct b43_txpower_lo_control *lo = dev->phy.lo_control; | 831 | struct b43_txpower_lo_control *lo = dev->phy.g->lo_control; |
824 | struct b43_lo_calib *c; | 832 | struct b43_lo_calib *c; |
825 | 833 | ||
826 | c = b43_find_lo_calib(lo, bbatt, rfatt); | 834 | c = b43_find_lo_calib(lo, bbatt, rfatt); |
@@ -839,7 +847,8 @@ struct b43_lo_calib * b43_get_calib_lo_settings(struct b43_wldev *dev, | |||
839 | void b43_gphy_dc_lt_init(struct b43_wldev *dev, bool update_all) | 847 | void b43_gphy_dc_lt_init(struct b43_wldev *dev, bool update_all) |
840 | { | 848 | { |
841 | struct b43_phy *phy = &dev->phy; | 849 | struct b43_phy *phy = &dev->phy; |
842 | struct b43_txpower_lo_control *lo = phy->lo_control; | 850 | struct b43_phy_g *gphy = phy->g; |
851 | struct b43_txpower_lo_control *lo = gphy->lo_control; | ||
843 | int i; | 852 | int i; |
844 | int rf_offset, bb_offset; | 853 | int rf_offset, bb_offset; |
845 | const struct b43_rfatt *rfatt; | 854 | const struct b43_rfatt *rfatt; |
@@ -917,14 +926,14 @@ static inline void b43_lo_fixup_rfatt(struct b43_rfatt *rf) | |||
917 | 926 | ||
918 | void b43_lo_g_adjust(struct b43_wldev *dev) | 927 | void b43_lo_g_adjust(struct b43_wldev *dev) |
919 | { | 928 | { |
920 | struct b43_phy *phy = &dev->phy; | 929 | struct b43_phy_g *gphy = dev->phy.g; |
921 | struct b43_lo_calib *cal; | 930 | struct b43_lo_calib *cal; |
922 | struct b43_rfatt rf; | 931 | struct b43_rfatt rf; |
923 | 932 | ||
924 | memcpy(&rf, &phy->rfatt, sizeof(rf)); | 933 | memcpy(&rf, &gphy->rfatt, sizeof(rf)); |
925 | b43_lo_fixup_rfatt(&rf); | 934 | b43_lo_fixup_rfatt(&rf); |
926 | 935 | ||
927 | cal = b43_get_calib_lo_settings(dev, &phy->bbatt, &rf); | 936 | cal = b43_get_calib_lo_settings(dev, &gphy->bbatt, &rf); |
928 | if (!cal) | 937 | if (!cal) |
929 | return; | 938 | return; |
930 | b43_lo_write(dev, &cal->ctl); | 939 | b43_lo_write(dev, &cal->ctl); |
@@ -952,7 +961,8 @@ void b43_lo_g_adjust_to(struct b43_wldev *dev, | |||
952 | void b43_lo_g_maintanance_work(struct b43_wldev *dev) | 961 | void b43_lo_g_maintanance_work(struct b43_wldev *dev) |
953 | { | 962 | { |
954 | struct b43_phy *phy = &dev->phy; | 963 | struct b43_phy *phy = &dev->phy; |
955 | struct b43_txpower_lo_control *lo = phy->lo_control; | 964 | struct b43_phy_g *gphy = phy->g; |
965 | struct b43_txpower_lo_control *lo = gphy->lo_control; | ||
956 | unsigned long now; | 966 | unsigned long now; |
957 | unsigned long expire; | 967 | unsigned long expire; |
958 | struct b43_lo_calib *cal, *tmp; | 968 | struct b43_lo_calib *cal, *tmp; |
@@ -962,7 +972,7 @@ void b43_lo_g_maintanance_work(struct b43_wldev *dev) | |||
962 | if (!lo) | 972 | if (!lo) |
963 | return; | 973 | return; |
964 | now = jiffies; | 974 | now = jiffies; |
965 | hwpctl = b43_has_hardware_pctl(phy); | 975 | hwpctl = b43_has_hardware_pctl(dev); |
966 | 976 | ||
967 | if (hwpctl) { | 977 | if (hwpctl) { |
968 | /* Read the power vector and update it, if needed. */ | 978 | /* Read the power vector and update it, if needed. */ |
@@ -983,8 +993,8 @@ void b43_lo_g_maintanance_work(struct b43_wldev *dev) | |||
983 | if (!time_before(cal->calib_time, expire)) | 993 | if (!time_before(cal->calib_time, expire)) |
984 | continue; | 994 | continue; |
985 | /* This item expired. */ | 995 | /* This item expired. */ |
986 | if (b43_compare_bbatt(&cal->bbatt, &phy->bbatt) && | 996 | if (b43_compare_bbatt(&cal->bbatt, &gphy->bbatt) && |
987 | b43_compare_rfatt(&cal->rfatt, &phy->rfatt)) { | 997 | b43_compare_rfatt(&cal->rfatt, &gphy->rfatt)) { |
988 | B43_WARN_ON(current_item_expired); | 998 | B43_WARN_ON(current_item_expired); |
989 | current_item_expired = 1; | 999 | current_item_expired = 1; |
990 | } | 1000 | } |
@@ -1002,7 +1012,7 @@ void b43_lo_g_maintanance_work(struct b43_wldev *dev) | |||
1002 | /* Recalibrate currently used LO setting. */ | 1012 | /* Recalibrate currently used LO setting. */ |
1003 | if (b43_debug(dev, B43_DBG_LO)) | 1013 | if (b43_debug(dev, B43_DBG_LO)) |
1004 | b43dbg(dev->wl, "LO: Recalibrating current LO setting\n"); | 1014 | b43dbg(dev->wl, "LO: Recalibrating current LO setting\n"); |
1005 | cal = b43_calibrate_lo_setting(dev, &phy->bbatt, &phy->rfatt); | 1015 | cal = b43_calibrate_lo_setting(dev, &gphy->bbatt, &gphy->rfatt); |
1006 | if (cal) { | 1016 | if (cal) { |
1007 | list_add(&cal->list, &lo->calib_list); | 1017 | list_add(&cal->list, &lo->calib_list); |
1008 | b43_lo_write(dev, &cal->ctl); | 1018 | b43_lo_write(dev, &cal->ctl); |
@@ -1013,7 +1023,7 @@ void b43_lo_g_maintanance_work(struct b43_wldev *dev) | |||
1013 | 1023 | ||
1014 | void b43_lo_g_cleanup(struct b43_wldev *dev) | 1024 | void b43_lo_g_cleanup(struct b43_wldev *dev) |
1015 | { | 1025 | { |
1016 | struct b43_txpower_lo_control *lo = dev->phy.lo_control; | 1026 | struct b43_txpower_lo_control *lo = dev->phy.g->lo_control; |
1017 | struct b43_lo_calib *cal, *tmp; | 1027 | struct b43_lo_calib *cal, *tmp; |
1018 | 1028 | ||
1019 | if (!lo) | 1029 | if (!lo) |
@@ -1027,9 +1037,7 @@ void b43_lo_g_cleanup(struct b43_wldev *dev) | |||
1027 | /* LO Initialization */ | 1037 | /* LO Initialization */ |
1028 | void b43_lo_g_init(struct b43_wldev *dev) | 1038 | void b43_lo_g_init(struct b43_wldev *dev) |
1029 | { | 1039 | { |
1030 | struct b43_phy *phy = &dev->phy; | 1040 | if (b43_has_hardware_pctl(dev)) { |
1031 | |||
1032 | if (b43_has_hardware_pctl(phy)) { | ||
1033 | lo_read_power_vector(dev); | 1041 | lo_read_power_vector(dev); |
1034 | b43_gphy_dc_lt_init(dev, 1); | 1042 | b43_gphy_dc_lt_init(dev, 1); |
1035 | } | 1043 | } |