2020-05-20 05:24:25

by Tony Chuang

[permalink] [raw]
Subject: [PATCH 7/7] rtw88: 8821c: add phy calibration

From: Tzu-En Huang <[email protected]>

In order to get a better tramit EVM, we need to perform calibration
after association.
The calibration needed for 8821c is called iq calibration, which is
done in firmware. Implement the callback function for triggering
firmware to do it.

Signed-off-by: Tzu-En Huang <[email protected]>
Signed-off-by: Yan-Hsuan Chuang <[email protected]>
---
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
index 7169e6fb9ca9..749569eab912 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
@@ -555,6 +555,39 @@ static void rtw8821c_false_alarm_statistics(struct rtw_dev *rtwdev)
rtw_write32_clr(rtwdev, 0xb58, BIT(0));
}

+static void rtw8821c_do_iqk(struct rtw_dev *rtwdev)
+{
+ static int do_iqk_cnt;
+ struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
+ u32 rf_reg, iqk_fail_mask;
+ int counter;
+ bool reload;
+
+ if (rtw_is_assoc(rtwdev))
+ para.segment_iqk = 1;
+
+ rtw_fw_do_iqk(rtwdev, &para);
+
+ for (counter = 0; counter < 300; counter++) {
+ rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
+ if (rf_reg == 0xabcde)
+ break;
+ msleep(20);
+ }
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
+
+ reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
+ iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
+ rtw_dbg(rtwdev, RTW_DBG_PHY,
+ "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
+ counter, reload, ++do_iqk_cnt, iqk_fail_mask);
+}
+
+static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev)
+{
+ rtw8821c_do_iqk(rtwdev);
+}
+
static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
{0x0086,
RTW_PWR_CUT_ALL_MSK,
@@ -993,6 +1026,7 @@ static struct rtw_chip_ops rtw8821c_ops = {
.set_tx_power_index = rtw8821c_set_tx_power_index,
.cfg_ldo25 = rtw8821c_cfg_ldo25,
.false_alarm_statistics = rtw8821c_false_alarm_statistics,
+ .phy_calibration = rtw8821c_phy_calibration,
};

struct rtw_chip_info rtw8821c_hw_spec = {
--
2.17.1


Subject: Re: [PATCH 7/7] rtw88: 8821c: add phy calibration

On 2020-05-20 13:23:35 [+0800], [email protected] wrote:
> From: Tzu-En Huang <[email protected]>
>
> In order to get a better tramit EVM, we need to perform calibration

s/tramit/transmit/ ?

> after association.
> The calibration needed for 8821c is called iq calibration, which is
> done in firmware. Implement the callback function for triggering
> firmware to do it.
>
> Signed-off-by: Tzu-En Huang <[email protected]>
> Signed-off-by: Yan-Hsuan Chuang <[email protected]>
> ---
> drivers/net/wireless/realtek/rtw88/rtw8821c.c | 34 +++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> index 7169e6fb9ca9..749569eab912 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> @@ -555,6 +555,39 @@ static void rtw8821c_false_alarm_statistics(struct rtw_dev *rtwdev)
> rtw_write32_clr(rtwdev, 0xb58, BIT(0));
> }
>
> +static void rtw8821c_do_iqk(struct rtw_dev *rtwdev)
> +{
> + static int do_iqk_cnt;
> + struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
> + u32 rf_reg, iqk_fail_mask;
> + int counter;
> + bool reload;
> +
> + if (rtw_is_assoc(rtwdev))
> + para.segment_iqk = 1;
> +
> + rtw_fw_do_iqk(rtwdev, &para);
> +
> + for (counter = 0; counter < 300; counter++) {
> + rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
> + if (rf_reg == 0xabcde)
> + break;
> + msleep(20);
> + }
> + rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
> +
> + reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
> + iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
> + rtw_dbg(rtwdev, RTW_DBG_PHY,
> + "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
> + counter, reload, ++do_iqk_cnt, iqk_fail_mask);
> +}
> +
> +static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev)
> +{
> + rtw8821c_do_iqk(rtwdev);

Why this extra step? You could name it rtw8821c_phy_calibration_iqk().

> +}
> +

Sebastian

2020-05-29 06:34:47

by Tony Chuang

[permalink] [raw]
Subject: RE: [PATCH 7/7] rtw88: 8821c: add phy calibration

> On 2020-05-20 13:23:35 [+0800], [email protected] wrote:
> > From: Tzu-En Huang <[email protected]>
> >
> > In order to get a better tramit EVM, we need to perform calibration
>
> s/tramit/transmit/ ?
>
> > after association.
> > The calibration needed for 8821c is called iq calibration, which is
> > done in firmware. Implement the callback function for triggering
> > firmware to do it.
> >
> > Signed-off-by: Tzu-En Huang <[email protected]>
> > Signed-off-by: Yan-Hsuan Chuang <[email protected]>
> > ---
> > drivers/net/wireless/realtek/rtw88/rtw8821c.c | 34
> +++++++++++++++++++
> > 1 file changed, 34 insertions(+)
> >
> > diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> > index 7169e6fb9ca9..749569eab912 100644
> > --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> > +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
> > @@ -555,6 +555,39 @@ static void rtw8821c_false_alarm_statistics(struct
> rtw_dev *rtwdev)
> > rtw_write32_clr(rtwdev, 0xb58, BIT(0));
> > }
> >
> > +static void rtw8821c_do_iqk(struct rtw_dev *rtwdev)
> > +{
> > + static int do_iqk_cnt;
> > + struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
> > + u32 rf_reg, iqk_fail_mask;
> > + int counter;
> > + bool reload;
> > +
> > + if (rtw_is_assoc(rtwdev))
> > + para.segment_iqk = 1;
> > +
> > + rtw_fw_do_iqk(rtwdev, &para);
> > +
> > + for (counter = 0; counter < 300; counter++) {
> > + rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK,
> RFREG_MASK);
> > + if (rf_reg == 0xabcde)
> > + break;
> > + msleep(20);
> > + }
> > + rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
> > +
> > + reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
> > + iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7,
> 0));
> > + rtw_dbg(rtwdev, RTW_DBG_PHY,
> > + "iqk counter=%d reload=%d do_iqk_cnt=%d
> n_iqk_fail(mask)=0x%02x\n",
> > + counter, reload, ++do_iqk_cnt, iqk_fail_mask);
> > +}
> > +
> > +static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev)
> > +{
> > + rtw8821c_do_iqk(rtwdev);
>
> Why this extra step? You could name it rtw8821c_phy_calibration_iqk().
>

This is hooked at rtw_chip_ops::phy_calibration(). For 8821C, only IQK is
required. So just keep the name consistent.

Yan-Hsuan

Subject: Re: [PATCH 7/7] rtw88: 8821c: add phy calibration

On 2020-05-29 06:31:23 [+0000], Tony Chuang wrote:
> > > +static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev)
> > > +{
> > > + rtw8821c_do_iqk(rtwdev);
> >
> > Why this extra step? You could name it rtw8821c_phy_calibration_iqk().
> >
>
> This is hooked at rtw_chip_ops::phy_calibration(). For 8821C, only IQK is
> required. So just keep the name consistent.

Ah okay.

> Yan-Hsuan

Sebastian