I've decided to made LP-PHY init code review for compatibility with specs and
found some issues.
We lack some code for higher PHY revisions (up from 2/3) and for some specific
boards. Also I've found little mistake in specs which Larry just corrected.
Gábor: could you care for this parts of LP-PHY code?
So far I've only checked
lpphy_read_band_sprom(dev);
and
lpphy_baseband_init(dev);
I check for all conditions and operations (registers, masks, values). So far
didn't notice anything more serious than what's exposed by patch, so good work
Gábor :)
diff --git a/drivers/net/wireless/b43/phy_lp.c
b/drivers/net/wireless/b43/phy_lp.c
index 1e318d8..43a9fcc 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -198,6 +198,17 @@ static void lpphy_table_init(struct b43_wldev *dev)
lpphy_init_tx_gain_table(dev);
+ if (dev->phy.rev >=2) {
+ int i;
+ for (i = 0; i < 128; ++i) {
+ /* TODO
+ Set the table offset to 576 + the loop index
+ Set the table data pointer to a u32 containing 127 -
loop index
+ Write the table
+ */
+ }
+ }
+
if (dev->phy.rev < 2)
lpphy_adjust_gain_table(dev, freq);
}
diff --git a/drivers/net/wireless/b43/tables_lpphy.c
b/drivers/net/wireless/b43/tables_lpphy.c
index 61027ee..cb233e6 100644
--- a/drivers/net/wireless/b43/tables_lpphy.c
+++ b/drivers/net/wireless/b43/tables_lpphy.c
@@ -2312,34 +2312,42 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev)
for (i = 0; i < 704; i++)
b43_lptab_write(dev, B43_LPTAB32(7, i), 0);
- b43_lptab_write_bulk(dev, B43_LPTAB8(2, 0),
- ARRAY_SIZE(lpphy_min_sig_sq_table), lpphy_min_sig_sq_table);
- b43_lptab_write_bulk(dev, B43_LPTAB16(1, 0),
- ARRAY_SIZE(lpphy_rev2plus_noise_scale_table),
lpphy_rev2plus_noise_scale_table);
- b43_lptab_write_bulk(dev, B43_LPTAB32(11, 0),
- ARRAY_SIZE(lpphy_rev2plus_filter_control_table),
lpphy_rev2plus_filter_control_table);
- b43_lptab_write_bulk(dev, B43_LPTAB32(12, 0),
- ARRAY_SIZE(lpphy_rev2plus_ps_control_table),
lpphy_rev2plus_ps_control_table);
- b43_lptab_write_bulk(dev, B43_LPTAB32(13, 0),
- ARRAY_SIZE(lpphy_gain_idx_table), lpphy_gain_idx_table);
- b43_lptab_write_bulk(dev, B43_LPTAB16(14, 0),
- ARRAY_SIZE(lpphy_aux_gain_idx_table), lpphy_aux_gain_idx_table);
- b43_lptab_write_bulk(dev, B43_LPTAB16(15, 0),
- ARRAY_SIZE(lpphy_sw_control_table), lpphy_sw_control_table);
- b43_lptab_write_bulk(dev, B43_LPTAB8(16, 0),
- ARRAY_SIZE(lpphy_hf_table), lpphy_hf_table);
- b43_lptab_write_bulk(dev, B43_LPTAB32(17, 0),
- ARRAY_SIZE(lpphy_gain_value_table), lpphy_gain_value_table);
- b43_lptab_write_bulk(dev, B43_LPTAB16(18, 0),
- ARRAY_SIZE(lpphy_gain_table), lpphy_gain_table);
- b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0),
- ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table);
- b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0),
- ARRAY_SIZE(lpphy_iqlo_cal_table), lpphy_iqlo_cal_table);
- b43_lptab_write_bulk(dev, B43_LPTAB32(9, 0),
- ARRAY_SIZE(lpphy_papd_eps_table), lpphy_papd_eps_table);
- b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0),
- ARRAY_SIZE(lpphy_papd_mult_table), lpphy_papd_mult_table);
+ if (dev->phy.rev >= 3) {
+ /* TODO */
+ } else {
+ b43_lptab_write_bulk(dev, B43_LPTAB8(2, 0),
+ ARRAY_SIZE(lpphy_min_sig_sq_table),
lpphy_min_sig_sq_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB16(1, 0),
+ ARRAY_SIZE(lpphy_rev2plus_noise_scale_table),
lpphy_rev2plus_noise_scale_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB32(11, 0),
+ ARRAY_SIZE(lpphy_rev2plus_filter_control_table),
lpphy_rev2plus_filter_control_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB32(12, 0),
+ ARRAY_SIZE(lpphy_rev2plus_ps_control_table),
lpphy_rev2plus_ps_control_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB32(13, 0),
+ ARRAY_SIZE(lpphy_gain_idx_table), lpphy_gain_idx_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB16(14, 0),
+ ARRAY_SIZE(lpphy_aux_gain_idx_table),
lpphy_aux_gain_idx_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB16(15, 0),
+ ARRAY_SIZE(lpphy_sw_control_table),
lpphy_sw_control_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB8(16, 0),
+ ARRAY_SIZE(lpphy_hf_table), lpphy_hf_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB32(17, 0),
+ ARRAY_SIZE(lpphy_gain_value_table),
lpphy_gain_value_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB16(18, 0),
+ ARRAY_SIZE(lpphy_gain_table), lpphy_gain_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0),
+ ARRAY_SIZE(lpphy_pll_fraction_table),
lpphy_pll_fraction_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0),
+ ARRAY_SIZE(lpphy_iqlo_cal_table), lpphy_iqlo_cal_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB32(9, 0),
+ ARRAY_SIZE(lpphy_papd_eps_table), lpphy_papd_eps_table);
+ b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0),
+ ARRAY_SIZE(lpphy_papd_mult_table),
lpphy_papd_mult_table);
+ }
+
+ if (bus->boardinfo.type == 0x04AA && bus->boardinfo.rev <= 0x10) {
+ /* TODO */
+ }
if ((bus->chip_id == 0x4325) && (bus->chip_rev == 0)) {
b43_lptab_write_bulk(dev, B43_LPTAB32(13, 0),
@@ -2421,7 +2429,7 @@ void lpphy_init_tx_gain_table(struct b43_wldev *dev)
switch (dev->phy.rev) {
case 0:
if ((bus->sprom.boardflags_hi & B43_BFH_NOPA) ||
- (bus->sprom.boardflags_lo & B43_BFL_HGPA))
+ (bus->sprom.boardflags_hi & B43_BFH_RSSIINV))
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
@@ -2433,7 +2441,7 @@ void lpphy_init_tx_gain_table(struct b43_wldev *dev)
break;
case 1:
if ((bus->sprom.boardflags_hi & B43_BFH_NOPA) ||
- (bus->sprom.boardflags_lo & B43_BFL_HGPA))
+ (bus->sprom.boardflags_hi & B43_BFH_RSSIINV))
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev