diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2011-12-21 18:47:17 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-01-04 14:30:42 -0500 |
commit | ed5103edc217aea9e2018178971ad4ff0d40a9b0 (patch) | |
tree | 7b5788e935e250a60072e6130757b5a8e1c313b8 /drivers/net/wireless/b43/tables_nphy.c | |
parent | cc96adddbb04ead9ed9e844f6336f7cdfebbb407 (diff) |
b43: N-PHY: update gain ctl workarounds
Specs were updated, now we match wl according to MMIO dumps.
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/tables_nphy.c')
-rw-r--r-- | drivers/net/wireless/b43/tables_nphy.c | 106 |
1 files changed, 90 insertions, 16 deletions
diff --git a/drivers/net/wireless/b43/tables_nphy.c b/drivers/net/wireless/b43/tables_nphy.c index 3252560e9fa1..f7def13524dd 100644 --- a/drivers/net/wireless/b43/tables_nphy.c +++ b/drivers/net/wireless/b43/tables_nphy.c | |||
@@ -2752,7 +2752,18 @@ const struct nphy_rf_control_override_rev3 tbl_rf_control_override_rev3[] = { | |||
2752 | { 0x00C0, 6, 0xE7, 0xF9, 0xEC, 0xFB } /* field == 0x4000 (fls 15) */ | 2752 | { 0x00C0, 6, 0xE7, 0xF9, 0xEC, 0xFB } /* field == 0x4000 (fls 15) */ |
2753 | }; | 2753 | }; |
2754 | 2754 | ||
2755 | struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][3] = { | 2755 | struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_wa_phy6_radio11_ghz2 = { |
2756 | { 10, 14, 19, 27 }, | ||
2757 | { -5, 6, 10, 15 }, | ||
2758 | { 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA }, | ||
2759 | { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, | ||
2760 | 0x427E, | ||
2761 | { 0x413F, 0x413F, 0x413F, 0x413F }, | ||
2762 | 0x007E, 0x0066, 0x1074, | ||
2763 | 0x18, 0x18, 0x18, | ||
2764 | 0x01D0, 0x5, | ||
2765 | }; | ||
2766 | struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][4] = { | ||
2756 | { /* 2GHz */ | 2767 | { /* 2GHz */ |
2757 | { /* PHY rev 3 */ | 2768 | { /* PHY rev 3 */ |
2758 | { 7, 11, 16, 23 }, | 2769 | { 7, 11, 16, 23 }, |
@@ -2776,15 +2787,26 @@ struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][3] = { | |||
2776 | 0x18, 0x18, 0x18, | 2787 | 0x18, 0x18, 0x18, |
2777 | 0x01A1, 0x5, | 2788 | 0x01A1, 0x5, |
2778 | }, | 2789 | }, |
2779 | { /* PHY rev 5+ */ | 2790 | { /* PHY rev 5 */ |
2780 | { 9, 13, 18, 26 }, | 2791 | { 9, 13, 18, 26 }, |
2781 | { -3, 7, 11, 16 }, | 2792 | { -3, 7, 11, 16 }, |
2782 | { 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA }, | 2793 | { 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA }, |
2783 | { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, | 2794 | { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, |
2784 | 0x427E, /* invalid for external LNA! */ | 2795 | 0x427E, /* invalid for external LNA! */ |
2785 | { 0x413F, 0x413F, 0x413F, 0x413F }, /* invalid for external LNA! */ | 2796 | { 0x413F, 0x413F, 0x413F, 0x413F }, /* invalid for external LNA! */ |
2786 | 0x1076, 0x0066, 0x106A, | 2797 | 0x1076, 0x0066, 0x0000, /* low is invalid (the last one) */ |
2787 | 0xC, 0xC, 0xC, | 2798 | 0x18, 0x18, 0x18, |
2799 | 0x01D0, 0x9, | ||
2800 | }, | ||
2801 | { /* PHY rev 6+ */ | ||
2802 | { 8, 13, 18, 25 }, | ||
2803 | { -5, 6, 10, 14 }, | ||
2804 | { 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA }, | ||
2805 | { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, | ||
2806 | 0x527E, /* invalid for external LNA! */ | ||
2807 | { 0x513F, 0x513F, 0x513F, 0x513F }, /* invalid for external LNA! */ | ||
2808 | 0x1076, 0x0066, 0x0000, /* low is invalid (the last one) */ | ||
2809 | 0x18, 0x18, 0x18, | ||
2788 | 0x01D0, 0x5, | 2810 | 0x01D0, 0x5, |
2789 | }, | 2811 | }, |
2790 | }, | 2812 | }, |
@@ -2811,7 +2833,7 @@ struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][3] = { | |||
2811 | 0x24, 0x24, 0x24, | 2833 | 0x24, 0x24, 0x24, |
2812 | 0x0107, 25, | 2834 | 0x0107, 25, |
2813 | }, | 2835 | }, |
2814 | { /* PHY rev 5+ */ | 2836 | { /* PHY rev 5 */ |
2815 | { 6, 10, 16, 21 }, | 2837 | { 6, 10, 16, 21 }, |
2816 | { -7, 0, 4, 8 }, | 2838 | { -7, 0, 4, 8 }, |
2817 | { 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD }, | 2839 | { 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD }, |
@@ -2822,6 +2844,17 @@ struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][3] = { | |||
2822 | 0x24, 0x24, 0x24, | 2844 | 0x24, 0x24, 0x24, |
2823 | 0x00A9, 25, | 2845 | 0x00A9, 25, |
2824 | }, | 2846 | }, |
2847 | { /* PHY rev 6+ */ | ||
2848 | { 6, 10, 16, 21 }, | ||
2849 | { -7, 0, 4, 8 }, | ||
2850 | { 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD }, | ||
2851 | { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }, | ||
2852 | 0x729E, | ||
2853 | { 0x714F, 0x714F, 0x714F, 0x714F }, | ||
2854 | 0x029E, 0x2084, 0x2086, | ||
2855 | 0x24, 0x24, 0x24, /* low is invalid for radio rev 11! */ | ||
2856 | 0x00F0, 25, | ||
2857 | }, | ||
2825 | }, | 2858 | }, |
2826 | }; | 2859 | }; |
2827 | 2860 | ||
@@ -3098,26 +3131,67 @@ struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent( | |||
3098 | { | 3131 | { |
3099 | struct nphy_gain_ctl_workaround_entry *e; | 3132 | struct nphy_gain_ctl_workaround_entry *e; |
3100 | u8 phy_idx; | 3133 | u8 phy_idx; |
3134 | u8 tr_iso = ghz5 ? dev->dev->bus_sprom->fem.ghz5.tr_iso : | ||
3135 | dev->dev->bus_sprom->fem.ghz2.tr_iso; | ||
3136 | |||
3137 | if (!ghz5 && dev->phy.rev >= 6 && dev->phy.radio_rev == 11) | ||
3138 | return &nphy_gain_ctl_wa_phy6_radio11_ghz2; | ||
3101 | 3139 | ||
3102 | B43_WARN_ON(dev->phy.rev < 3); | 3140 | B43_WARN_ON(dev->phy.rev < 3); |
3103 | if (dev->phy.rev >= 5) | 3141 | if (dev->phy.rev >= 6) |
3142 | phy_idx = 3; | ||
3143 | else if (dev->phy.rev == 5) | ||
3104 | phy_idx = 2; | 3144 | phy_idx = 2; |
3105 | else if (dev->phy.rev == 4) | 3145 | else if (dev->phy.rev == 4) |
3106 | phy_idx = 1; | 3146 | phy_idx = 1; |
3107 | else | 3147 | else |
3108 | phy_idx = 0; | 3148 | phy_idx = 0; |
3109 | |||
3110 | e = &nphy_gain_ctl_workaround[ghz5][phy_idx]; | 3149 | e = &nphy_gain_ctl_workaround[ghz5][phy_idx]; |
3111 | 3150 | ||
3112 | /* Only one entry differs for external LNA, so instead making whole | 3151 | /* Some workarounds to the workarounds... */ |
3113 | * table 2 times bigger, hack is here | 3152 | if (ghz5 && dev->phy.rev >= 6) { |
3114 | */ | 3153 | if (dev->phy.radio_rev == 11 && |
3115 | if (!ghz5 && dev->phy.rev >= 5 && ext_lna) { | 3154 | !b43_channel_type_is_40mhz(dev->phy.channel_type)) |
3116 | e->rfseq_init[0] &= 0x0FFF; | 3155 | e->cliplo_gain = 0x2d; |
3117 | e->rfseq_init[1] &= 0x0FFF; | 3156 | } else if (!ghz5 && dev->phy.rev >= 5) { |
3118 | e->rfseq_init[2] &= 0x0FFF; | 3157 | if (ext_lna) { |
3119 | e->rfseq_init[3] &= 0x0FFF; | 3158 | e->rfseq_init[0] &= ~0x4000; |
3120 | e->init_gain &= 0x0FFF; | 3159 | e->rfseq_init[1] &= ~0x4000; |
3160 | e->rfseq_init[2] &= ~0x4000; | ||
3161 | e->rfseq_init[3] &= ~0x4000; | ||
3162 | e->init_gain &= ~0x4000; | ||
3163 | } | ||
3164 | switch (tr_iso) { | ||
3165 | case 0: | ||
3166 | e->cliplo_gain = 0x0062; | ||
3167 | case 1: | ||
3168 | e->cliplo_gain = 0x0064; | ||
3169 | case 2: | ||
3170 | e->cliplo_gain = 0x006a; | ||
3171 | case 3: | ||
3172 | e->cliplo_gain = 0x106a; | ||
3173 | case 4: | ||
3174 | e->cliplo_gain = 0x106c; | ||
3175 | case 5: | ||
3176 | e->cliplo_gain = 0x1074; | ||
3177 | case 6: | ||
3178 | e->cliplo_gain = 0x107c; | ||
3179 | case 7: | ||
3180 | e->cliplo_gain = 0x207c; | ||
3181 | default: | ||
3182 | e->cliplo_gain = 0x106a; | ||
3183 | } | ||
3184 | } else if (ghz5 && dev->phy.rev == 4 && ext_lna) { | ||
3185 | e->rfseq_init[0] &= ~0x4000; | ||
3186 | e->rfseq_init[1] &= ~0x4000; | ||
3187 | e->rfseq_init[2] &= ~0x4000; | ||
3188 | e->rfseq_init[3] &= ~0x4000; | ||
3189 | e->init_gain &= ~0x4000; | ||
3190 | e->rfseq_init[0] |= 0x1000; | ||
3191 | e->rfseq_init[1] |= 0x1000; | ||
3192 | e->rfseq_init[2] |= 0x1000; | ||
3193 | e->rfseq_init[3] |= 0x1000; | ||
3194 | e->init_gain |= 0x1000; | ||
3121 | } | 3195 | } |
3122 | 3196 | ||
3123 | return e; | 3197 | return e; |