aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt73usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index b5443148d621..e99bcacfc191 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -924,24 +924,25 @@ static void rt73usb_link_stats(struct rt2x00_dev *rt2x00dev,
924 qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR); 924 qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR);
925} 925}
926 926
927static inline void rt73usb_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level) 927static inline void rt73usb_set_vgc(struct rt2x00_dev *rt2x00dev,
928 struct link_qual *qual, u8 vgc_level)
928{ 929{
929 if (rt2x00dev->link.vgc_level != vgc_level) { 930 if (qual->vgc_level != vgc_level) {
930 rt73usb_bbp_write(rt2x00dev, 17, vgc_level); 931 rt73usb_bbp_write(rt2x00dev, 17, vgc_level);
931 rt2x00dev->link.vgc_level = vgc_level; 932 qual->vgc_level = vgc_level;
932 rt2x00dev->link.vgc_level_reg = vgc_level; 933 qual->vgc_level_reg = vgc_level;
933 } 934 }
934} 935}
935 936
936static void rt73usb_reset_tuner(struct rt2x00_dev *rt2x00dev) 937static void rt73usb_reset_tuner(struct rt2x00_dev *rt2x00dev,
938 struct link_qual *qual)
937{ 939{
938 rt73usb_set_vgc(rt2x00dev, 0x20); 940 rt73usb_set_vgc(rt2x00dev, qual, 0x20);
939} 941}
940 942
941static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev) 943static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev,
944 struct link_qual *qual, const u32 count)
942{ 945{
943 struct link *link = &rt2x00dev->link;
944 int rssi = rt2x00_get_link_rssi(link);
945 u8 up_bound; 946 u8 up_bound;
946 u8 low_bound; 947 u8 low_bound;
947 948
@@ -957,10 +958,10 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
957 up_bound += 0x10; 958 up_bound += 0x10;
958 } 959 }
959 } else { 960 } else {
960 if (rssi > -82) { 961 if (qual->rssi > -82) {
961 low_bound = 0x1c; 962 low_bound = 0x1c;
962 up_bound = 0x40; 963 up_bound = 0x40;
963 } else if (rssi > -84) { 964 } else if (qual->rssi > -84) {
964 low_bound = 0x1c; 965 low_bound = 0x1c;
965 up_bound = 0x20; 966 up_bound = 0x20;
966 } else { 967 } else {
@@ -984,32 +985,32 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
984 /* 985 /*
985 * Special big-R17 for very short distance 986 * Special big-R17 for very short distance
986 */ 987 */
987 if (rssi > -35) { 988 if (qual->rssi > -35) {
988 rt73usb_set_vgc(rt2x00dev, 0x60); 989 rt73usb_set_vgc(rt2x00dev, qual, 0x60);
989 return; 990 return;
990 } 991 }
991 992
992 /* 993 /*
993 * Special big-R17 for short distance 994 * Special big-R17 for short distance
994 */ 995 */
995 if (rssi >= -58) { 996 if (qual->rssi >= -58) {
996 rt73usb_set_vgc(rt2x00dev, up_bound); 997 rt73usb_set_vgc(rt2x00dev, qual, up_bound);
997 return; 998 return;
998 } 999 }
999 1000
1000 /* 1001 /*
1001 * Special big-R17 for middle-short distance 1002 * Special big-R17 for middle-short distance
1002 */ 1003 */
1003 if (rssi >= -66) { 1004 if (qual->rssi >= -66) {
1004 rt73usb_set_vgc(rt2x00dev, low_bound + 0x10); 1005 rt73usb_set_vgc(rt2x00dev, qual, low_bound + 0x10);
1005 return; 1006 return;
1006 } 1007 }
1007 1008
1008 /* 1009 /*
1009 * Special mid-R17 for middle distance 1010 * Special mid-R17 for middle distance
1010 */ 1011 */
1011 if (rssi >= -74) { 1012 if (qual->rssi >= -74) {
1012 rt73usb_set_vgc(rt2x00dev, low_bound + 0x08); 1013 rt73usb_set_vgc(rt2x00dev, qual, low_bound + 0x08);
1013 return; 1014 return;
1014 } 1015 }
1015 1016
@@ -1017,12 +1018,12 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
1017 * Special case: Change up_bound based on the rssi. 1018 * Special case: Change up_bound based on the rssi.
1018 * Lower up_bound when rssi is weaker then -74 dBm. 1019 * Lower up_bound when rssi is weaker then -74 dBm.
1019 */ 1020 */
1020 up_bound -= 2 * (-74 - rssi); 1021 up_bound -= 2 * (-74 - qual->rssi);
1021 if (low_bound > up_bound) 1022 if (low_bound > up_bound)
1022 up_bound = low_bound; 1023 up_bound = low_bound;
1023 1024
1024 if (link->vgc_level > up_bound) { 1025 if (qual->vgc_level > up_bound) {
1025 rt73usb_set_vgc(rt2x00dev, up_bound); 1026 rt73usb_set_vgc(rt2x00dev, qual, up_bound);
1026 return; 1027 return;
1027 } 1028 }
1028 1029
@@ -1032,12 +1033,12 @@ dynamic_cca_tune:
1032 * r17 does not yet exceed upper limit, continue and base 1033 * r17 does not yet exceed upper limit, continue and base
1033 * the r17 tuning on the false CCA count. 1034 * the r17 tuning on the false CCA count.
1034 */ 1035 */
1035 if ((link->qual.false_cca > 512) && (link->vgc_level < up_bound)) 1036 if ((qual->false_cca > 512) && (qual->vgc_level < up_bound))
1036 rt73usb_set_vgc(rt2x00dev, 1037 rt73usb_set_vgc(rt2x00dev, qual,
1037 min_t(u8, link->vgc_level + 4, up_bound)); 1038 min_t(u8, qual->vgc_level + 4, up_bound));
1038 else if ((link->qual.false_cca < 100) && (link->vgc_level > low_bound)) 1039 else if ((qual->false_cca < 100) && (qual->vgc_level > low_bound))
1039 rt73usb_set_vgc(rt2x00dev, 1040 rt73usb_set_vgc(rt2x00dev, qual,
1040 max_t(u8, link->vgc_level - 4, low_bound)); 1041 max_t(u8, qual->vgc_level - 4, low_bound));
1041} 1042}
1042 1043
1043/* 1044/*