diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt61pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index c7ab744f0052..94523f7f0d88 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1046,21 +1046,27 @@ static void rt61pci_link_stats(struct rt2x00_dev *rt2x00dev, | |||
1046 | qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR); | 1046 | qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR); |
1047 | } | 1047 | } |
1048 | 1048 | ||
1049 | static inline void rt61pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level) | ||
1050 | { | ||
1051 | if (rt2x00dev->link.vgc_level != vgc_level) { | ||
1052 | rt61pci_bbp_write(rt2x00dev, 17, vgc_level); | ||
1053 | rt2x00dev->link.vgc_level = vgc_level; | ||
1054 | rt2x00dev->link.vgc_level_reg = vgc_level; | ||
1055 | } | ||
1056 | } | ||
1057 | |||
1049 | static void rt61pci_reset_tuner(struct rt2x00_dev *rt2x00dev) | 1058 | static void rt61pci_reset_tuner(struct rt2x00_dev *rt2x00dev) |
1050 | { | 1059 | { |
1051 | rt61pci_bbp_write(rt2x00dev, 17, 0x20); | 1060 | rt61pci_set_vgc(rt2x00dev, 0x20); |
1052 | rt2x00dev->link.vgc_level = 0x20; | ||
1053 | } | 1061 | } |
1054 | 1062 | ||
1055 | static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) | 1063 | static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) |
1056 | { | 1064 | { |
1057 | int rssi = rt2x00_get_link_rssi(&rt2x00dev->link); | 1065 | struct link *link = &rt2x00dev->link; |
1058 | u8 r17; | 1066 | int rssi = rt2x00_get_link_rssi(link); |
1059 | u8 up_bound; | 1067 | u8 up_bound; |
1060 | u8 low_bound; | 1068 | u8 low_bound; |
1061 | 1069 | ||
1062 | rt61pci_bbp_read(rt2x00dev, 17, &r17); | ||
1063 | |||
1064 | /* | 1070 | /* |
1065 | * Determine r17 bounds. | 1071 | * Determine r17 bounds. |
1066 | */ | 1072 | */ |
@@ -1091,8 +1097,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
1091 | * Special big-R17 for very short distance | 1097 | * Special big-R17 for very short distance |
1092 | */ | 1098 | */ |
1093 | if (rssi >= -35) { | 1099 | if (rssi >= -35) { |
1094 | if (r17 != 0x60) | 1100 | rt61pci_set_vgc(rt2x00dev, 0x60); |
1095 | rt61pci_bbp_write(rt2x00dev, 17, 0x60); | ||
1096 | return; | 1101 | return; |
1097 | } | 1102 | } |
1098 | 1103 | ||
@@ -1100,8 +1105,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
1100 | * Special big-R17 for short distance | 1105 | * Special big-R17 for short distance |
1101 | */ | 1106 | */ |
1102 | if (rssi >= -58) { | 1107 | if (rssi >= -58) { |
1103 | if (r17 != up_bound) | 1108 | rt61pci_set_vgc(rt2x00dev, up_bound); |
1104 | rt61pci_bbp_write(rt2x00dev, 17, up_bound); | ||
1105 | return; | 1109 | return; |
1106 | } | 1110 | } |
1107 | 1111 | ||
@@ -1109,9 +1113,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
1109 | * Special big-R17 for middle-short distance | 1113 | * Special big-R17 for middle-short distance |
1110 | */ | 1114 | */ |
1111 | if (rssi >= -66) { | 1115 | if (rssi >= -66) { |
1112 | low_bound += 0x10; | 1116 | rt61pci_set_vgc(rt2x00dev, low_bound + 0x10); |
1113 | if (r17 != low_bound) | ||
1114 | rt61pci_bbp_write(rt2x00dev, 17, low_bound); | ||
1115 | return; | 1117 | return; |
1116 | } | 1118 | } |
1117 | 1119 | ||
@@ -1119,9 +1121,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
1119 | * Special mid-R17 for middle distance | 1121 | * Special mid-R17 for middle distance |
1120 | */ | 1122 | */ |
1121 | if (rssi >= -74) { | 1123 | if (rssi >= -74) { |
1122 | low_bound += 0x08; | 1124 | rt61pci_set_vgc(rt2x00dev, low_bound + 0x08); |
1123 | if (r17 != low_bound) | ||
1124 | rt61pci_bbp_write(rt2x00dev, 17, low_bound); | ||
1125 | return; | 1125 | return; |
1126 | } | 1126 | } |
1127 | 1127 | ||
@@ -1133,8 +1133,8 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
1133 | if (low_bound > up_bound) | 1133 | if (low_bound > up_bound) |
1134 | up_bound = low_bound; | 1134 | up_bound = low_bound; |
1135 | 1135 | ||
1136 | if (r17 > up_bound) { | 1136 | if (link->vgc_level > up_bound) { |
1137 | rt61pci_bbp_write(rt2x00dev, 17, up_bound); | 1137 | rt61pci_set_vgc(rt2x00dev, up_bound); |
1138 | return; | 1138 | return; |
1139 | } | 1139 | } |
1140 | 1140 | ||
@@ -1144,15 +1144,10 @@ dynamic_cca_tune: | |||
1144 | * r17 does not yet exceed upper limit, continue and base | 1144 | * r17 does not yet exceed upper limit, continue and base |
1145 | * the r17 tuning on the false CCA count. | 1145 | * the r17 tuning on the false CCA count. |
1146 | */ | 1146 | */ |
1147 | if (rt2x00dev->link.qual.false_cca > 512 && r17 < up_bound) { | 1147 | if ((link->qual.false_cca > 512) && (link->vgc_level < up_bound)) |
1148 | if (++r17 > up_bound) | 1148 | rt61pci_set_vgc(rt2x00dev, ++link->vgc_level); |
1149 | r17 = up_bound; | 1149 | else if ((link->qual.false_cca < 100) && (link->vgc_level > low_bound)) |
1150 | rt61pci_bbp_write(rt2x00dev, 17, r17); | 1150 | rt61pci_set_vgc(rt2x00dev, --link->vgc_level); |
1151 | } else if (rt2x00dev->link.qual.false_cca < 100 && r17 > low_bound) { | ||
1152 | if (--r17 < low_bound) | ||
1153 | r17 = low_bound; | ||
1154 | rt61pci_bbp_write(rt2x00dev, 17, r17); | ||
1155 | } | ||
1156 | } | 1151 | } |
1157 | 1152 | ||
1158 | /* | 1153 | /* |