Re: [PATCH 037/113] rtl8xxxu: First stab at adding IQK calibration for 8723bu parts

2016-03-10 Thread Jes Sorensen
Kalle Valo  writes:
> jes.soren...@redhat.com writes:
>
>> From: Jes Sorensen 
>>
>> The 8723bu also has it's own IQK calibration process. This is similar
>> in flow, but still different enough to warrent it's own
>> implementation, at least for now.
>>
>> Signed-off-by: Jes Sorensen 
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 811
>> -
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h   |   1 +
>>  .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h  |  17 +
>>  3 files changed, 827 insertions(+), 2 deletions(-)
>>
>
> [...]
>
>> +#ifdef RTL8723BU_BT
>> +/* GNT_BT = 1 */
>> +rtl8xxxu_write32(priv, REG_BT_CONTROL_8723BU, 0x1800);
>> +#endif
>
> What's this about?
>
>> +#ifdef RTL8723BU_BT
>> +/* GNT_BT = 1 */
>> +rtl8xxxu_write32(priv, REG_BT_CONTROL_8723BU, 0x1800);
>> +#endif
>
> Same here.
>
>> +#ifdef RTL8723BU_PATH_B
>> +static int rtl8723bu_iqk_path_b(struct rtl8xxxu_priv *priv)
>
> And this?
>
>> +#if 0
>> +/* Page B init */
>> +rtl8xxxu_write32(priv, REG_CONFIG_ANT_A, 0x0f60);
>> +
>> +if (priv->tx_paths > 1)
>> +rtl8xxxu_write32(priv, REG_CONFIG_ANT_B, 0x0f60);
>> +#endif
>
> Like discussed before, "#if 0" is not really welcomed in upstream. Can't
> you just keep the unimplemented parts in a private branch and submit
> them once they are ready? That way upstream code is not cluttered with
> these.

This is removed in a follow-on patch, so it becomes a non-issue.
Rebasing this to remove it retroactively would create a mess.

Jes
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 037/113] rtl8xxxu: First stab at adding IQK calibration for 8723bu parts

2016-03-10 Thread Kalle Valo
jes.soren...@redhat.com writes:

> From: Jes Sorensen 
>
> The 8723bu also has it's own IQK calibration process. This is similar
> in flow, but still different enough to warrent it's own
> implementation, at least for now.
>
> Signed-off-by: Jes Sorensen 
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c   | 811 
> -
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h   |   1 +
>  .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h  |  17 +
>  3 files changed, 827 insertions(+), 2 deletions(-)
>

[...]

> +#ifdef RTL8723BU_BT
> + /* GNT_BT = 1 */
> + rtl8xxxu_write32(priv, REG_BT_CONTROL_8723BU, 0x1800);
> +#endif

What's this about?

> +#ifdef RTL8723BU_BT
> + /* GNT_BT = 1 */
> + rtl8xxxu_write32(priv, REG_BT_CONTROL_8723BU, 0x1800);
> +#endif

Same here.

> +#ifdef RTL8723BU_PATH_B
> +static int rtl8723bu_iqk_path_b(struct rtl8xxxu_priv *priv)

And this?

> +#if 0
> + /* Page B init */
> + rtl8xxxu_write32(priv, REG_CONFIG_ANT_A, 0x0f60);
> +
> + if (priv->tx_paths > 1)
> + rtl8xxxu_write32(priv, REG_CONFIG_ANT_B, 0x0f60);
> +#endif

Like discussed before, "#if 0" is not really welcomed in upstream. Can't
you just keep the unimplemented parts in a private branch and submit
them once they are ready? That way upstream code is not cluttered with
these.

-- 
Kalle Valo
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 037/113] rtl8xxxu: First stab at adding IQK calibration for 8723bu parts

2016-02-29 Thread Jes . Sorensen
From: Jes Sorensen 

The 8723bu also has it's own IQK calibration process. This is similar
in flow, but still different enough to warrent it's own
implementation, at least for now.

Signed-off-by: Jes Sorensen 
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c   | 811 -
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h   |   1 +
 .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h  |  17 +
 3 files changed, 827 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c 
b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index e543a26..b2aa723 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -3510,6 +3510,91 @@ static bool rtl8xxxu_simularity_compare(struct 
rtl8xxxu_priv *priv,
return false;
 }
 
+static bool rtl8723bu_simularity_compare(struct rtl8xxxu_priv *priv,
+int result[][8], int c1, int c2)
+{
+   u32 i, j, diff, simubitmap, bound = 0;
+   int candidate[2] = {-1, -1};/* for path A and path B */
+   int tmp1, tmp2;
+   bool retval = true;
+
+   if (priv->tx_paths > 1)
+   bound = 8;
+   else
+   bound = 4;
+
+   simubitmap = 0;
+
+   for (i = 0; i < bound; i++) {
+   if (i & 1) {
+   if ((result[c1][i] & 0x0200))
+   tmp1 = result[c1][i] | 0xfc00;
+   else
+   tmp1 = result[c1][i];
+
+   if ((result[c2][i]& 0x0200))
+   tmp2 = result[c2][i] | 0xfc00;
+   else
+   tmp2 = result[c2][i];
+   } else {
+   tmp1 = result[c1][i];
+   tmp2 = result[c2][i];
+   }
+
+   diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
+
+   if (diff > MAX_TOLERANCE) {
+   if ((i == 2 || i == 6) && !simubitmap) {
+   if (result[c1][i] + result[c1][i + 1] == 0)
+   candidate[(i / 4)] = c2;
+   else if (result[c2][i] + result[c2][i + 1] == 0)
+   candidate[(i / 4)] = c1;
+   else
+   simubitmap = simubitmap | (1 << i);
+   } else {
+   simubitmap = simubitmap | (1 << i);
+   }
+   }
+   }
+
+   if (simubitmap == 0) {
+   for (i = 0; i < (bound / 4); i++) {
+   if (candidate[i] >= 0) {
+   for (j = i * 4; j < (i + 1) * 4 - 2; j++)
+   result[3][j] = result[candidate[i]][j];
+   retval = false;
+   }
+   }
+   return retval;
+   } else {
+   if (!(simubitmap & 0x03)) {
+   /* path A TX OK */
+   for (i = 0; i < 2; i++)
+   result[3][i] = result[c1][i];
+   }
+
+   if (!(simubitmap & 0x0c)) {
+   /* path A RX OK */
+   for (i = 2; i < 4; i++)
+   result[3][i] = result[c1][i];
+   }
+
+   if (!(simubitmap & 0x30) && priv->tx_paths > 1) {
+   /* path B RX OK */
+   for (i = 4; i < 6; i++)
+   result[3][i] = result[c1][i];
+   }
+
+   if (!(simubitmap & 0x30) && priv->tx_paths > 1) {
+   /* path B RX OK */
+   for (i = 6; i < 8; i++)
+   result[3][i] = result[c1][i];
+   }
+   }
+
+   return false;
+}
+
 static void
 rtl8xxxu_save_mac_regs(struct rtl8xxxu_priv *priv, const u32 *reg, u32 *backup)
 {
@@ -3677,6 +3762,369 @@ out:
return result;
 }
 
+static int rtl8723bu_iqk_path_a(struct rtl8xxxu_priv *priv)
+{
+   u32 reg_eac, reg_e94, reg_e9c, path_sel, val32;
+   int result = 0;
+
+   path_sel = rtl8xxxu_read32(priv, REG_S0S1_PATH_SWITCH);
+
+   /*
+* Leave IQK mode
+*/
+   val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+   val32 &= 0x00ff;
+   rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+   /*
+* Enable path A PA in TX IQK mode
+*/
+   val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_WE_LUT);
+   val32 |= 0x8;
+   rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, val32);
+   rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x2);
+   rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0003f);
+