Re: [PATCH 037/113] rtl8xxxu: First stab at adding IQK calibration for 8723bu parts
Kalle Valowrites: > 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
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
From: Jes SorensenThe 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); +