rtl8xxxu: Do BT_WLAN_CALIBRATION before doing IQK calibration
authorJes Sorensen <Jes.Sorensen@redhat.com>
Mon, 29 Feb 2016 22:04:30 +0000 (17:04 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 10 Mar 2016 13:29:00 +0000 (15:29 +0200)
Newer generation chips require the firmware be notified before we
start the IQK calibration.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h

index b42d71b..e0653b2 100644 (file)
@@ -1497,7 +1497,7 @@ static int rtl8723a_h2c_cmd(struct rtl8xxxu_priv *priv,
        } while (retry--);
 
        if (!retry) {
-               dev_dbg(dev, "%s: Mailbox busy\n", __func__);
+               dev_info(dev, "%s: Mailbox busy\n", __func__);
                retval = -EBUSY;
                goto error;
        }
@@ -3877,6 +3877,20 @@ static void rtl8xxxu_phy_iqcalibrate(struct rtl8xxxu_priv *priv,
        }
 }
 
+static void rtl8xxxu_prepare_calibrate(struct rtl8xxxu_priv *priv, u8 start)
+{
+       struct h2c_cmd h2c;
+
+       if (priv->fops->mbox_ext_width < 4)
+               return;
+
+       memset(&h2c, 0, sizeof(struct h2c_cmd));
+       h2c.bt_wlan_calibration.cmd = H2C_8723B_BT_WLAN_CALIBRATION;
+       h2c.bt_wlan_calibration.data = start;
+
+       rtl8723a_h2c_cmd(priv, &h2c, sizeof(h2c.bt_wlan_calibration));
+}
+
 static void rtl8723a_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
 {
        struct device *dev = &priv->udev->dev;
@@ -3888,6 +3902,8 @@ static void rtl8723a_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
        s32 reg_tmp = 0;
        bool simu;
 
+       rtl8xxxu_prepare_calibrate(priv, 1);
+
        memset(result, 0, sizeof(result));
        candidate = -1;
 
@@ -3975,6 +3991,8 @@ static void rtl8723a_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
 
        rtl8xxxu_save_regs(priv, rtl8723au_iqk_phy_iq_bb_reg,
                           priv->bb_recovery_backup, RTL8XXXU_BB_REGS);
+
+       rtl8xxxu_prepare_calibrate(priv, 0);
 }
 
 static void rtl8723a_phy_lc_calibrate(struct rtl8xxxu_priv *priv)
index 47898ff..07533ac 100644 (file)
@@ -727,6 +727,10 @@ struct h2c_cmd {
                        u8 arg;
                        __le16 mask_lo;
                } __packed ramask;
+               struct {
+                       u8 cmd;
+                       u8 data;
+               } __packed bt_wlan_calibration;
        };
 };