aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43/tables_nphy.c
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2011-12-21 18:47:17 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-01-04 14:30:42 -0500
commited5103edc217aea9e2018178971ad4ff0d40a9b0 (patch)
tree7b5788e935e250a60072e6130757b5a8e1c313b8 /drivers/net/wireless/b43/tables_nphy.c
parentcc96adddbb04ead9ed9e844f6336f7cdfebbb407 (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.c106
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
2755struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][3] = { 2755struct 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};
2766struct 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;