Lee, Chun-Yi bcac01
From: Sean Wang <sean.wang@mediatek.com>
Lee, Chun-Yi bcac01
Date: Fri, 13 May 2022 05:38:12 +0800
Lee, Chun-Yi bcac01
Subject: Bluetooth: btmtksdio: fix possible FW initialization failure
Lee, Chun-Yi bcac01
Patch-mainline: v5.19-rc1
Lee, Chun-Yi bcac01
Git-commit: 7469720563e01f479ec5afe06bd6f440f965d523
Lee, Chun-Yi bcac01
References: jsc#PED-1407
Lee, Chun-Yi bcac01
Lee, Chun-Yi bcac01
According to FW advised sequence, mt7921s need to re-acquire privilege
Lee, Chun-Yi bcac01
immediately after the firmware download is complete before normal running.
Lee, Chun-Yi bcac01
Otherwise, it is still possible the bus may be stuck in an abnormal status
Lee, Chun-Yi bcac01
that causes FW initialization failure in the current driver.
Lee, Chun-Yi bcac01
Lee, Chun-Yi bcac01
Fixes: 752aea58489f ("Bluetooth: mt7921s: fix bus hang with wrong privilege")
Lee, Chun-Yi bcac01
Co-developed-by: Yake Yang <yake.yang@mediatek.com>
Lee, Chun-Yi bcac01
Signed-off-by: Yake Yang <yake.yang@mediatek.com>
Lee, Chun-Yi bcac01
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Lee, Chun-Yi bcac01
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Lee, Chun-Yi bcac01
Acked-by: Lee, Chun-Yi <jlee@suse.com>
Lee, Chun-Yi bcac01
---
Lee, Chun-Yi bcac01
 drivers/bluetooth/btmtksdio.c |   16 ++++++++--------
Lee, Chun-Yi bcac01
 1 file changed, 8 insertions(+), 8 deletions(-)
Lee, Chun-Yi bcac01
Lee, Chun-Yi bcac01
--- a/drivers/bluetooth/btmtksdio.c
Lee, Chun-Yi bcac01
+++ b/drivers/bluetooth/btmtksdio.c
Lee, Chun-Yi bcac01
@@ -864,6 +864,14 @@ static int mt79xx_setup(struct hci_dev *
Lee, Chun-Yi bcac01
 		return err;
Lee, Chun-Yi bcac01
 	}
Lee, Chun-Yi bcac01
 
Lee, Chun-Yi bcac01
+	err = btmtksdio_fw_pmctrl(bdev);
Lee, Chun-Yi bcac01
+	if (err < 0)
Lee, Chun-Yi bcac01
+		return err;
Lee, Chun-Yi bcac01
+
Lee, Chun-Yi bcac01
+	err = btmtksdio_drv_pmctrl(bdev);
Lee, Chun-Yi bcac01
+	if (err < 0)
Lee, Chun-Yi bcac01
+		return err;
Lee, Chun-Yi bcac01
+
Lee, Chun-Yi bcac01
 	/* Enable Bluetooth protocol */
Lee, Chun-Yi bcac01
 	wmt_params.op = BTMTK_WMT_FUNC_CTRL;
Lee, Chun-Yi bcac01
 	wmt_params.flag = 0;
Lee, Chun-Yi bcac01
@@ -1109,14 +1117,6 @@ static int btmtksdio_setup(struct hci_de
Lee, Chun-Yi bcac01
 		if (err < 0)
Lee, Chun-Yi bcac01
 			return err;
Lee, Chun-Yi bcac01
 
Lee, Chun-Yi bcac01
-		err = btmtksdio_fw_pmctrl(bdev);
Lee, Chun-Yi bcac01
-		if (err < 0)
Lee, Chun-Yi bcac01
-			return err;
Lee, Chun-Yi bcac01
-
Lee, Chun-Yi bcac01
-		err = btmtksdio_drv_pmctrl(bdev);
Lee, Chun-Yi bcac01
-		if (err < 0)
Lee, Chun-Yi bcac01
-			return err;
Lee, Chun-Yi bcac01
-
Lee, Chun-Yi bcac01
 		/* Enable SCO over I2S/PCM */
Lee, Chun-Yi bcac01
 		err = btmtksdio_sco_setting(hdev);
Lee, Chun-Yi bcac01
 		if (err < 0) {