|
|
@@ -1,19 +1,31 @@
|
|
|
-From 38b78ba60f6759968b19fe183a344a8612fef694 Mon Sep 17 00:00:00 2001
|
|
|
-From: Daniel Golle <[email protected]>
|
|
|
-Date: Mon, 8 Jan 2018 13:43:56 +0100
|
|
|
-Subject: [PATCH 07/16] rt2x00: add RXIQ calibration for MT7620
|
|
|
+From patchwork Sat Sep 17 20:28:10 2022
|
|
|
+Content-Type: text/plain; charset="utf-8"
|
|
|
MIME-Version: 1.0
|
|
|
-Content-Type: text/plain; charset=UTF-8
|
|
|
Content-Transfer-Encoding: 8bit
|
|
|
-To: [email protected],
|
|
|
- Stanislaw Gruszka <[email protected]>,
|
|
|
- Helmut Schaa <[email protected]>
|
|
|
+X-Patchwork-Submitter: Daniel Golle <[email protected]>
|
|
|
+X-Patchwork-Id: 12979249
|
|
|
+X-Patchwork-Delegate: [email protected]
|
|
|
+Return-Path: <[email protected]>
|
|
|
+Date: Sat, 17 Sep 2022 21:28:10 +0100
|
|
|
+From: Daniel Golle <[email protected]>
|
|
|
+To: [email protected], Stanislaw Gruszka <[email protected]>,
|
|
|
+ Helmut Schaa <[email protected]>
|
|
|
Cc: Kalle Valo <[email protected]>,
|
|
|
- David S. Miller <[email protected]>,
|
|
|
- Eric Dumazet <[email protected]>,
|
|
|
- Jakub Kicinski <[email protected]>,
|
|
|
- Paolo Abeni <[email protected]>,
|
|
|
- Johannes Berg <[email protected]>
|
|
|
+ "David S. Miller" <[email protected]>,
|
|
|
+ Eric Dumazet <[email protected]>,
|
|
|
+ Jakub Kicinski <[email protected]>,
|
|
|
+ Paolo Abeni <[email protected]>,
|
|
|
+ Johannes Berg <[email protected]>
|
|
|
+Subject: [PATCH v3 08/16] rt2x00: add RXIQ calibration for MT7620
|
|
|
+Message-ID:
|
|
|
+ <033a39a697d51f6df258acea4c33608e0944fe4c.1663445157.git.daniel@makrotopia.org>
|
|
|
+References: <[email protected]>
|
|
|
+MIME-Version: 1.0
|
|
|
+Content-Disposition: inline
|
|
|
+In-Reply-To: <[email protected]>
|
|
|
+Precedence: bulk
|
|
|
+List-ID: <linux-wireless.vger.kernel.org>
|
|
|
+X-Mailing-List: [email protected]
|
|
|
|
|
|
From: Tomislav Požega <[email protected]>
|
|
|
|
|
|
@@ -21,13 +33,17 @@ Add RXIQ calibration found in mtk driver. With old openwrt builds this
|
|
|
gets us ~8Mbps more of RX bandwidth (test with iPA/eLNA layout).
|
|
|
|
|
|
Signed-off-by: Tomislav Požega <[email protected]>
|
|
|
+Signed-off-by: Daniel Golle <[email protected]>
|
|
|
+Acked-by: Stanislaw Gruszka <[email protected]>
|
|
|
---
|
|
|
- .../net/wireless/ralink/rt2x00/rt2800lib.c | 384 ++++++++++++++++++
|
|
|
- 1 file changed, 384 insertions(+)
|
|
|
+v2: use rt2800_wait_bbp_rf_ready(), fix indentation
|
|
|
+
|
|
|
+ .../net/wireless/ralink/rt2x00/rt2800lib.c | 375 ++++++++++++++++++
|
|
|
+ 1 file changed, 375 insertions(+)
|
|
|
|
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
|
-@@ -8696,6 +8696,389 @@ static void rt2800_rxdcoc_calibration(st
|
|
|
+@@ -8666,6 +8666,380 @@ static void rt2800_rxdcoc_calibration(st
|
|
|
rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
|
|
|
}
|
|
|
|
|
|
@@ -73,8 +89,8 @@ Signed-off-by: Tomislav Požega <[email protected]>
|
|
|
+ u32 orig_RF_BYPASS1 = 0;
|
|
|
+ u32 orig_RF_CONTROL3 = 0;
|
|
|
+ u32 orig_RF_BYPASS3 = 0;
|
|
|
-+ u32 macstatus, bbpval1 = 0;
|
|
|
-+ u8 rf_vga_table[] = {0x20, 0x21, 0x22, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};
|
|
|
++ u32 bbpval1 = 0;
|
|
|
++ static const u8 rf_vga_table[] = {0x20, 0x21, 0x22, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};
|
|
|
+
|
|
|
+ savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
|
|
|
+ orig_RF_CONTROL0 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
|
|
|
@@ -89,16 +105,8 @@ Signed-off-by: Tomislav Požega <[email protected]>
|
|
|
+
|
|
|
+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x0);
|
|
|
+
|
|
|
-+ for (i = 0; i < 10000; i++) {
|
|
|
-+ macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
|
|
|
-+ if (macstatus & 0x3)
|
|
|
-+ usleep_range(50, 100);
|
|
|
-+ else
|
|
|
-+ break;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ if (i == 10000)
|
|
|
-+ rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
|
|
|
++ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY)))
|
|
|
++ rt2x00_warn(rt2x00dev, "Timeout waiting for MAC status in RXIQ calibration\n");
|
|
|
+
|
|
|
+ bbpval = bbp4 & (~0x18);
|
|
|
+ bbpval = bbp4 | 0x00;
|
|
|
@@ -223,92 +231,91 @@ Signed-off-by: Tomislav Požega <[email protected]>
|
|
|
+ usleep_range(500, 1500);
|
|
|
+
|
|
|
+ vga_idx = 0;
|
|
|
-+ while (vga_idx < 11) {
|
|
|
-+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, rf_vga_table[vga_idx]);
|
|
|
-+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, rf_vga_table[vga_idx]);
|
|
|
-+
|
|
|
-+ rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x93);
|
|
|
-+
|
|
|
-+ for (i = 0; i < 10000; i++) {
|
|
|
-+ bbpval = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
-+ if ((bbpval & 0xff) == 0x93)
|
|
|
-+ usleep_range(50, 100);
|
|
|
-+ else
|
|
|
-+ break;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ if ((bbpval & 0xff) == 0x93) {
|
|
|
-+ rt2x00_warn(rt2x00dev, "Fatal Error: Calibration doesn't finish");
|
|
|
-+ goto restore_value;
|
|
|
-+ }
|
|
|
++ while (vga_idx < 11) {
|
|
|
++ rt2800_rfcsr_write_dccal(rt2x00dev, 3, rf_vga_table[vga_idx]);
|
|
|
++ rt2800_rfcsr_write_dccal(rt2x00dev, 4, rf_vga_table[vga_idx]);
|
|
|
+
|
|
|
-+ for (i = 0; i < 5; i++) {
|
|
|
-+ u32 bbptemp = 0;
|
|
|
-+ u8 value = 0;
|
|
|
-+ int result = 0;
|
|
|
-+
|
|
|
-+ rt2800_bbp_write(rt2x00dev, 158, 0x1e);
|
|
|
-+ rt2800_bbp_write(rt2x00dev, 159, i);
|
|
|
-+ rt2800_bbp_write(rt2x00dev, 158, 0x22);
|
|
|
-+ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
-+ bbptemp = bbptemp + (value << 24);
|
|
|
-+ rt2800_bbp_write(rt2x00dev, 158, 0x21);
|
|
|
-+ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
-+ bbptemp = bbptemp + (value << 16);
|
|
|
-+ rt2800_bbp_write(rt2x00dev, 158, 0x20);
|
|
|
-+ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
-+ bbptemp = bbptemp + (value << 8);
|
|
|
-+ rt2800_bbp_write(rt2x00dev, 158, 0x1f);
|
|
|
-+ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
-+ bbptemp = bbptemp + value;
|
|
|
-+
|
|
|
-+ if (i < 2 && (bbptemp & 0x800000))
|
|
|
-+ result = (bbptemp & 0xffffff) - 0x1000000;
|
|
|
-+ else if (i == 4)
|
|
|
-+ result = bbptemp;
|
|
|
-+ else
|
|
|
-+ result = bbptemp;
|
|
|
-+
|
|
|
-+ if (i == 0)
|
|
|
-+ mi = result / 4096;
|
|
|
-+ else if (i == 1)
|
|
|
-+ mq = result / 4096;
|
|
|
-+ else if (i == 2)
|
|
|
-+ si = bbptemp / 4096;
|
|
|
-+ else if (i == 3)
|
|
|
-+ sq = bbptemp / 4096;
|
|
|
-+ else
|
|
|
-+ riq = result / 4096;
|
|
|
-+ }
|
|
|
++ rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x93);
|
|
|
+
|
|
|
-+ bbpval1 = si - mi * mi;
|
|
|
-+ rt2x00_dbg(rt2x00dev,
|
|
|
-+ "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d",
|
|
|
-+ si, sq, riq, bbpval1, vga_idx);
|
|
|
-+
|
|
|
-+ if (bbpval1 >= (100 * 100))
|
|
|
++ for (i = 0; i < 10000; i++) {
|
|
|
++ bbpval = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
++ if ((bbpval & 0xff) == 0x93)
|
|
|
++ usleep_range(50, 100);
|
|
|
++ else
|
|
|
+ break;
|
|
|
++ }
|
|
|
+
|
|
|
-+ if (bbpval1 <= 100)
|
|
|
-+ vga_idx = vga_idx + 9;
|
|
|
-+ else if (bbpval1 <= 158)
|
|
|
-+ vga_idx = vga_idx + 8;
|
|
|
-+ else if (bbpval1 <= 251)
|
|
|
-+ vga_idx = vga_idx + 7;
|
|
|
-+ else if (bbpval1 <= 398)
|
|
|
-+ vga_idx = vga_idx + 6;
|
|
|
-+ else if (bbpval1 <= 630)
|
|
|
-+ vga_idx = vga_idx + 5;
|
|
|
-+ else if (bbpval1 <= 1000)
|
|
|
-+ vga_idx = vga_idx + 4;
|
|
|
-+ else if (bbpval1 <= 1584)
|
|
|
-+ vga_idx = vga_idx + 3;
|
|
|
-+ else if (bbpval1 <= 2511)
|
|
|
-+ vga_idx = vga_idx + 2;
|
|
|
++ if ((bbpval & 0xff) == 0x93) {
|
|
|
++ rt2x00_warn(rt2x00dev, "Fatal Error: Calibration doesn't finish");
|
|
|
++ goto restore_value;
|
|
|
++ }
|
|
|
++ for (i = 0; i < 5; i++) {
|
|
|
++ u32 bbptemp = 0;
|
|
|
++ u8 value = 0;
|
|
|
++ int result = 0;
|
|
|
++
|
|
|
++ rt2800_bbp_write(rt2x00dev, 158, 0x1e);
|
|
|
++ rt2800_bbp_write(rt2x00dev, 159, i);
|
|
|
++ rt2800_bbp_write(rt2x00dev, 158, 0x22);
|
|
|
++ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
++ bbptemp = bbptemp + (value << 24);
|
|
|
++ rt2800_bbp_write(rt2x00dev, 158, 0x21);
|
|
|
++ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
++ bbptemp = bbptemp + (value << 16);
|
|
|
++ rt2800_bbp_write(rt2x00dev, 158, 0x20);
|
|
|
++ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
++ bbptemp = bbptemp + (value << 8);
|
|
|
++ rt2800_bbp_write(rt2x00dev, 158, 0x1f);
|
|
|
++ value = rt2800_bbp_read(rt2x00dev, 159);
|
|
|
++ bbptemp = bbptemp + value;
|
|
|
++
|
|
|
++ if (i < 2 && (bbptemp & 0x800000))
|
|
|
++ result = (bbptemp & 0xffffff) - 0x1000000;
|
|
|
++ else if (i == 4)
|
|
|
++ result = bbptemp;
|
|
|
+ else
|
|
|
-+ vga_idx = vga_idx + 1;
|
|
|
++ result = bbptemp;
|
|
|
++
|
|
|
++ if (i == 0)
|
|
|
++ mi = result / 4096;
|
|
|
++ else if (i == 1)
|
|
|
++ mq = result / 4096;
|
|
|
++ else if (i == 2)
|
|
|
++ si = bbptemp / 4096;
|
|
|
++ else if (i == 3)
|
|
|
++ sq = bbptemp / 4096;
|
|
|
++ else
|
|
|
++ riq = result / 4096;
|
|
|
+ }
|
|
|
+
|
|
|
++ bbpval1 = si - mi * mi;
|
|
|
++ rt2x00_dbg(rt2x00dev,
|
|
|
++ "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d",
|
|
|
++ si, sq, riq, bbpval1, vga_idx);
|
|
|
++
|
|
|
++ if (bbpval1 >= (100 * 100))
|
|
|
++ break;
|
|
|
++
|
|
|
++ if (bbpval1 <= 100)
|
|
|
++ vga_idx = vga_idx + 9;
|
|
|
++ else if (bbpval1 <= 158)
|
|
|
++ vga_idx = vga_idx + 8;
|
|
|
++ else if (bbpval1 <= 251)
|
|
|
++ vga_idx = vga_idx + 7;
|
|
|
++ else if (bbpval1 <= 398)
|
|
|
++ vga_idx = vga_idx + 6;
|
|
|
++ else if (bbpval1 <= 630)
|
|
|
++ vga_idx = vga_idx + 5;
|
|
|
++ else if (bbpval1 <= 1000)
|
|
|
++ vga_idx = vga_idx + 4;
|
|
|
++ else if (bbpval1 <= 1584)
|
|
|
++ vga_idx = vga_idx + 3;
|
|
|
++ else if (bbpval1 <= 2511)
|
|
|
++ vga_idx = vga_idx + 2;
|
|
|
++ else
|
|
|
++ vga_idx = vga_idx + 1;
|
|
|
++ }
|
|
|
++
|
|
|
+ sigma_i = rt2800_do_sqrt_accumulation(100 * (si - mi * mi));
|
|
|
+ sigma_q = rt2800_do_sqrt_accumulation(100 * (sq - mq * mq));
|
|
|
+ r_iq = 10 * (riq - (mi * mq));
|
|
|
@@ -417,7 +424,7 @@ Signed-off-by: Tomislav Požega <[email protected]>
|
|
|
static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
|
|
|
bool set_bw, bool is_ht40)
|
|
|
{
|
|
|
-@@ -9308,6 +9691,7 @@ static void rt2800_init_rfcsr_6352(struc
|
|
|
+@@ -9278,6 +9652,7 @@ static void rt2800_init_rfcsr_6352(struc
|
|
|
rt2800_rxdcoc_calibration(rt2x00dev);
|
|
|
rt2800_bw_filter_calibration(rt2x00dev, true);
|
|
|
rt2800_bw_filter_calibration(rt2x00dev, false);
|