diff options
| author | Rafał Miłecki <zajec5@gmail.com> | 2014-07-31 15:59:45 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2014-08-25 16:00:42 -0400 |
| commit | 33df85f662a0ee03f2b8e0c9d34a51d8dd0406c0 (patch) | |
| tree | 0be6f74dfa580d4fd65f8171e7dd8adfb4e1363f /drivers/net/wireless/b43 | |
| parent | 25c15566635fef86e87f762f73a19f24598e45fa (diff) | |
b43: N-PHY: update rev3+ gain control workarounds
This fixes workarounds on rev 6+ and cleans code slightly.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43')
| -rw-r--r-- | drivers/net/wireless/b43/tables_nphy.c | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/drivers/net/wireless/b43/tables_nphy.c b/drivers/net/wireless/b43/tables_nphy.c index 4b5885077b01..f449cffc697b 100644 --- a/drivers/net/wireless/b43/tables_nphy.c +++ b/drivers/net/wireless/b43/tables_nphy.c | |||
| @@ -3197,7 +3197,7 @@ static struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][4] = { | |||
| 3197 | { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, | 3197 | { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, |
| 3198 | 0x527E, /* invalid for external LNA! */ | 3198 | 0x527E, /* invalid for external LNA! */ |
| 3199 | { 0x513F, 0x513F, 0x513F, 0x513F }, /* invalid for external LNA! */ | 3199 | { 0x513F, 0x513F, 0x513F, 0x513F }, /* invalid for external LNA! */ |
| 3200 | 0x1076, 0x0066, 0x0000, /* low is invalid (the last one) */ | 3200 | 0x007E, 0x0066, 0x0000, /* low is invalid (the last one) */ |
| 3201 | 0x18, 0x18, 0x18, | 3201 | 0x18, 0x18, 0x18, |
| 3202 | 0x01D0, 0x5, | 3202 | 0x01D0, 0x5, |
| 3203 | }, | 3203 | }, |
| @@ -3711,6 +3711,7 @@ const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev) | |||
| 3711 | struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent( | 3711 | struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent( |
| 3712 | struct b43_wldev *dev, bool ghz5, bool ext_lna) | 3712 | struct b43_wldev *dev, bool ghz5, bool ext_lna) |
| 3713 | { | 3713 | { |
| 3714 | struct b43_phy *phy = &dev->phy; | ||
| 3714 | struct nphy_gain_ctl_workaround_entry *e; | 3715 | struct nphy_gain_ctl_workaround_entry *e; |
| 3715 | u8 phy_idx; | 3716 | u8 phy_idx; |
| 3716 | 3717 | ||
| @@ -3729,37 +3730,49 @@ struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent( | |||
| 3729 | e = &nphy_gain_ctl_workaround[ghz5][phy_idx]; | 3730 | e = &nphy_gain_ctl_workaround[ghz5][phy_idx]; |
| 3730 | 3731 | ||
| 3731 | /* Some workarounds to the workarounds... */ | 3732 | /* Some workarounds to the workarounds... */ |
| 3732 | if (ghz5 && dev->phy.rev >= 6) { | 3733 | if (!ghz5) { |
| 3733 | if (dev->phy.radio_rev == 11 && | ||
| 3734 | !b43_is_40mhz(dev)) | ||
| 3735 | e->cliplo_gain = 0x2d; | ||
| 3736 | } else if (!ghz5 && dev->phy.rev >= 5) { | ||
| 3737 | static const int gain_data[] = {0x0062, 0x0064, 0x006a, 0x106a, | ||
| 3738 | 0x106c, 0x1074, 0x107c, 0x207c}; | ||
| 3739 | u8 tr_iso = dev->dev->bus_sprom->fem.ghz2.tr_iso; | 3734 | u8 tr_iso = dev->dev->bus_sprom->fem.ghz2.tr_iso; |
| 3740 | 3735 | ||
| 3741 | if (ext_lna) { | 3736 | if (tr_iso > 7) |
| 3737 | tr_iso = 3; | ||
| 3738 | |||
| 3739 | if (phy->rev >= 6) { | ||
| 3740 | static const int gain_data[] = { 0x106a, 0x106c, 0x1074, | ||
| 3741 | 0x107c, 0x007e, 0x107e, | ||
| 3742 | 0x207e, 0x307e, }; | ||
| 3743 | |||
| 3744 | e->cliplo_gain = gain_data[tr_iso]; | ||
| 3745 | } else if (phy->rev == 5) { | ||
| 3746 | static const int gain_data[] = { 0x0062, 0x0064, 0x006a, | ||
| 3747 | 0x106a, 0x106c, 0x1074, | ||
| 3748 | 0x107c, 0x207c, }; | ||
| 3749 | |||
| 3750 | e->cliplo_gain = gain_data[tr_iso]; | ||
| 3751 | } | ||
| 3752 | |||
| 3753 | if (phy->rev >= 5 && ext_lna) { | ||
| 3742 | e->rfseq_init[0] &= ~0x4000; | 3754 | e->rfseq_init[0] &= ~0x4000; |
| 3743 | e->rfseq_init[1] &= ~0x4000; | 3755 | e->rfseq_init[1] &= ~0x4000; |
| 3744 | e->rfseq_init[2] &= ~0x4000; | 3756 | e->rfseq_init[2] &= ~0x4000; |
| 3745 | e->rfseq_init[3] &= ~0x4000; | 3757 | e->rfseq_init[3] &= ~0x4000; |
| 3746 | e->init_gain &= ~0x4000; | 3758 | e->init_gain &= ~0x4000; |
| 3747 | } | 3759 | } |
| 3748 | if (tr_iso > 7) | 3760 | } else { |
| 3749 | tr_iso = 3; | 3761 | if (phy->rev >= 6) { |
| 3750 | e->cliplo_gain = gain_data[tr_iso]; | 3762 | if (phy->radio_rev == 11 && !b43_is_40mhz(dev)) |
| 3751 | 3763 | e->crsminu = 0x2d; | |
| 3752 | } else if (ghz5 && dev->phy.rev == 4 && ext_lna) { | 3764 | } else if (phy->rev == 4 && ext_lna) { |
| 3753 | e->rfseq_init[0] &= ~0x4000; | 3765 | e->rfseq_init[0] &= ~0x4000; |
| 3754 | e->rfseq_init[1] &= ~0x4000; | 3766 | e->rfseq_init[1] &= ~0x4000; |
| 3755 | e->rfseq_init[2] &= ~0x4000; | 3767 | e->rfseq_init[2] &= ~0x4000; |
| 3756 | e->rfseq_init[3] &= ~0x4000; | 3768 | e->rfseq_init[3] &= ~0x4000; |
| 3757 | e->init_gain &= ~0x4000; | 3769 | e->init_gain &= ~0x4000; |
| 3758 | e->rfseq_init[0] |= 0x1000; | 3770 | e->rfseq_init[0] |= 0x1000; |
| 3759 | e->rfseq_init[1] |= 0x1000; | 3771 | e->rfseq_init[1] |= 0x1000; |
| 3760 | e->rfseq_init[2] |= 0x1000; | 3772 | e->rfseq_init[2] |= 0x1000; |
| 3761 | e->rfseq_init[3] |= 0x1000; | 3773 | e->rfseq_init[3] |= 0x1000; |
| 3762 | e->init_gain |= 0x1000; | 3774 | e->init_gain |= 0x1000; |
| 3775 | } | ||
| 3763 | } | 3776 | } |
| 3764 | 3777 | ||
| 3765 | return e; | 3778 | return e; |
