[4/8] rtw88: 8822c: add FW IQK support
diff mbox series

Message ID 1565174405-2689-5-git-send-email-yhchuang@realtek.com
State Changes Requested
Delegated to: Kalle Valo
Headers show
Series
  • rtw88: enhance and stabilize T-Put performance
Related show

Commit Message

Tony Chuang Aug. 7, 2019, 10:40 a.m. UTC
From: Yan-Hsuan Chuang <yhchuang@realtek.com>

Add support for doing IQK in firmware

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
---
 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 16 ++++++++++++++++
 drivers/net/wireless/realtek/rtw88/rtw8822c.h |  2 ++
 2 files changed, 18 insertions(+)

Comments

Kalle Valo Sept. 3, 2019, 12:53 p.m. UTC | #1
<yhchuang@realtek.com> wrote:

> From: Yan-Hsuan Chuang <yhchuang@realtek.com>
> 
> Add support for doing IQK in firmware
> 
> Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>

The commit log does not answer "Why?". What is IQK and how does it help?

No need to resend, I can update the commit log but just let me know what to
add.
Tony Chuang Sept. 4, 2019, 2:31 a.m. UTC | #2
> 
> <yhchuang@realtek.com> wrote:
> 
> > From: Yan-Hsuan Chuang <yhchuang@realtek.com>
> >
> > Add support for doing IQK in firmware
> >
> > Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
> 
> The commit log does not answer "Why?". What is IQK and how does it help?
> 
> No need to resend, I can update the commit log but just let me know what to
> add.
> 

Ideally the RF component's I/Q vectors should be orthogonal, but usually they are not.
So we need to calibrate for the RF components, ex. PA/LNA, ADC/DAC.

And if the I/Q vectors are more orthogonal, the mixed signal will have less deviation.
This helps with those rates with higher modulation (MCS8-9), because they have more
strict EVM/SNR requirement. Also the better of the quality of the signal, the longer it
can propagate, and the better throughput performance we can get.

Yan-Hsuan
Kalle Valo Sept. 6, 2019, 2:13 p.m. UTC | #3
Tony Chuang <yhchuang@realtek.com> writes:

>> 
>> <yhchuang@realtek.com> wrote:
>> 
>> > From: Yan-Hsuan Chuang <yhchuang@realtek.com>
>> >
>> > Add support for doing IQK in firmware
>> >
>> > Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
>> 
>> The commit log does not answer "Why?". What is IQK and how does it help?
>> 
>> No need to resend, I can update the commit log but just let me know what to
>> add.
>> 
>
> Ideally the RF component's I/Q vectors should be orthogonal, but usually they are not.
> So we need to calibrate for the RF components, ex. PA/LNA, ADC/DAC.
>
> And if the I/Q vectors are more orthogonal, the mixed signal will have less deviation.
> This helps with those rates with higher modulation (MCS8-9), because they have more
> strict EVM/SNR requirement. Also the better of the quality of the signal, the longer it
> can propagate, and the better throughput performance we can get.

I added this to patch 4 but there were some warnings so I had drop the
patches. So please send v2 and remember to add this description to patch
4.

Patch
diff mbox series

diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index e11bbc3..176ca5f 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -1876,6 +1876,22 @@  static void rtw8822c_false_alarm_statistics(struct rtw_dev *rtwdev)
 
 static void rtw8822c_do_iqk(struct rtw_dev *rtwdev)
 {
+	struct rtw_iqk_para para = {0};
+	u8 iqk_chk;
+	int counter;
+
+	para.clear = 1;
+	rtw_fw_do_iqk(rtwdev, &para);
+
+	for (counter = 0; counter < 300; counter++) {
+		iqk_chk = rtw_read8(rtwdev, REG_RPT_CIP);
+		if (iqk_chk == 0xaa)
+			break;
+		msleep(20);
+	}
+	rtw_write8(rtwdev, REG_IQKSTAT, 0x0);
+
+	rtw_dbg(rtwdev, RTW_DBG_RFK, "iqk counter=%d\n", counter);
 }
 
 /* for coex */
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
index 5ee1de4..14a8894 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
@@ -176,6 +176,7 @@  struct rtw8822c_efuse {
 #define REG_TXF7	0x1ab0
 #define REG_CCK_SOURCE	0x1abc
 #define BIT_NBI_EN		BIT(30)
+#define REG_IQKSTAT	0x1b10
 #define REG_TXANT	0x1c28
 #define REG_ENCCK	0x1c3c
 #define BIT_CCK_BLK_EN		BIT(1)
@@ -197,6 +198,7 @@  struct rtw8822c_efuse {
 #define REG_OFDM_FACNT3	0x2d0c
 #define REG_OFDM_FACNT4	0x2d10
 #define REG_OFDM_FACNT5	0x2d20
+#define REG_RPT_CIP	0x2d9c
 #define REG_OFDM_TXCNT	0x2de0
 #define REG_ORITXCODE2	0x4100
 #define REG_3WIRE2	0x410c