* [PATCH v5 2/5] Bluetooth: btmtk: apply the common btmtk_fw_get_filename
2024-05-15 23:15 [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name sean.wang
@ 2024-05-15 23:15 ` sean.wang
2024-05-15 23:15 ` [PATCH v5 3/5] Bluetooth: btusb: mediatek: refactor the function btusb_mtk_reset sean.wang
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: sean.wang @ 2024-05-15 23:15 UTC (permalink / raw)
To: marcel, johan.hedberg, luiz.dentz
Cc: linux-bluetooth, linux-mediatek, linux-kernel, Sean Wang
From: Sean Wang <sean.wang@mediatek.com>
Apply the common btmtk_fw_get_filename to avoid the similar coding in each
driver.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
v3: first added to the series
v4: rebase onto the latest code
v5: update the caller usage with btmtk_fw_get_filename
---
drivers/bluetooth/btmtksdio.c | 3 +++
drivers/bluetooth/btusb.c | 14 ++------------
2 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c
index ff4868c83cd8..04be06f73e05 100644
--- a/drivers/bluetooth/btmtksdio.c
+++ b/drivers/bluetooth/btmtksdio.c
@@ -1117,6 +1117,9 @@ static int btmtksdio_setup(struct hci_dev *hdev)
return err;
}
+ btmtk_fw_get_filename(fwname, sizeof(fwname), dev_id,
+ fw_version, 0);
+
snprintf(fwname, sizeof(fwname),
"mediatek/BT_RAM_CODE_MT%04x_1_%x_hdr.bin",
dev_id & 0xffff, (fw_version & 0xff) + 1);
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index e384ef6ff050..611135d1ce01 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -3166,18 +3166,8 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
case 0x7922:
case 0x7961:
case 0x7925:
- if (dev_id == 0x7925)
- snprintf(fw_bin_name, sizeof(fw_bin_name),
- "mediatek/mt%04x/BT_RAM_CODE_MT%04x_1_%x_hdr.bin",
- dev_id & 0xffff, dev_id & 0xffff, (fw_version & 0xff) + 1);
- else if (dev_id == 0x7961 && fw_flavor)
- snprintf(fw_bin_name, sizeof(fw_bin_name),
- "mediatek/BT_RAM_CODE_MT%04x_1a_%x_hdr.bin",
- dev_id & 0xffff, (fw_version & 0xff) + 1);
- else
- snprintf(fw_bin_name, sizeof(fw_bin_name),
- "mediatek/BT_RAM_CODE_MT%04x_1_%x_hdr.bin",
- dev_id & 0xffff, (fw_version & 0xff) + 1);
+ btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
+ fw_version, fw_flavor);
err = btmtk_setup_firmware_79xx(hdev, fw_bin_name,
btusb_mtk_hci_wmt_sync);
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 3/5] Bluetooth: btusb: mediatek: refactor the function btusb_mtk_reset
2024-05-15 23:15 [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name sean.wang
2024-05-15 23:15 ` [PATCH v5 2/5] Bluetooth: btmtk: apply the common btmtk_fw_get_filename sean.wang
@ 2024-05-15 23:15 ` sean.wang
2024-05-15 23:15 ` [PATCH v5 4/5] Bluetooth: btusb: mediatek: reset the controller before downloading the fw sean.wang
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: sean.wang @ 2024-05-15 23:15 UTC (permalink / raw)
To: marcel, johan.hedberg, luiz.dentz
Cc: linux-bluetooth, linux-mediatek, linux-kernel, Hao Qin, Sean Wang
From: Hao Qin <hao.qin@mediatek.com>
Extract the function btusb_mtk_subsys_reset from the btusb_mtk_reset
for the future handling of resetting bluetooth controller without
the USB reset.
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Hao Qin <hao.qin@mediatek.com>
---
v3: refine the git message
v4: rebase onto the latest code
v5: no change
---
drivers/bluetooth/btusb.c | 45 +++++++++++++++++++++++----------------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 611135d1ce01..602456e94fdb 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -3033,28 +3033,13 @@ static u32 btusb_mtk_reset_done(struct hci_dev *hdev)
return val & MTK_BT_RST_DONE;
}
-static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
+static int btusb_mtk_subsys_reset(struct hci_dev *hdev, u32 dev_id)
{
struct btusb_data *data = hci_get_drvdata(hdev);
- struct btmediatek_data *mediatek;
u32 val;
int err;
- /* It's MediaTek specific bluetooth reset mechanism via USB */
- if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) {
- bt_dev_err(hdev, "last reset failed? Not resetting again");
- return -EBUSY;
- }
-
- err = usb_autopm_get_interface(data->intf);
- if (err < 0)
- return err;
-
- btusb_stop_traffic(data);
- usb_kill_anchored_urbs(&data->tx_anchor);
- mediatek = hci_get_priv(hdev);
-
- if (mediatek->dev_id == 0x7925) {
+ if (dev_id == 0x7925) {
btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val);
val |= (1 << 5);
btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val);
@@ -3098,8 +3083,32 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
if (!val)
bt_dev_err(hdev, "Can't get device id, subsys reset fail.");
- usb_queue_reset_device(data->intf);
+ return err;
+}
+static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
+{
+ struct btusb_data *data = hci_get_drvdata(hdev);
+ struct btmediatek_data *mtk_data;
+ int err;
+
+ /* It's MediaTek specific bluetooth reset mechanism via USB */
+ if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) {
+ bt_dev_err(hdev, "last reset failed? Not resetting again");
+ return -EBUSY;
+ }
+
+ err = usb_autopm_get_interface(data->intf);
+ if (err < 0)
+ return err;
+
+ btusb_stop_traffic(data);
+ usb_kill_anchored_urbs(&data->tx_anchor);
+ mtk_data = hci_get_priv(hdev);
+
+ err = btusb_mtk_subsys_reset(hdev, mtk_data->dev_id);
+
+ usb_queue_reset_device(data->intf);
clear_bit(BTUSB_HW_RESET_ACTIVE, &data->flags);
return err;
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 4/5] Bluetooth: btusb: mediatek: reset the controller before downloading the fw
2024-05-15 23:15 [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name sean.wang
2024-05-15 23:15 ` [PATCH v5 2/5] Bluetooth: btmtk: apply the common btmtk_fw_get_filename sean.wang
2024-05-15 23:15 ` [PATCH v5 3/5] Bluetooth: btusb: mediatek: refactor the function btusb_mtk_reset sean.wang
@ 2024-05-15 23:15 ` sean.wang
2024-05-15 23:15 ` [PATCH v5 5/5] Bluetooth: btusb: mediatek: add MT7922 subsystem reset sean.wang
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: sean.wang @ 2024-05-15 23:15 UTC (permalink / raw)
To: marcel, johan.hedberg, luiz.dentz
Cc: linux-bluetooth, linux-mediatek, linux-kernel, Hao Qin, Sean Wang,
Chris Lu
From: Hao Qin <hao.qin@mediatek.com>
Reset the controller before downloading the firmware to improve its
reliability. This includes situations like cold or warm reboots, ensuring
the controller is in its initial state before starting the firmware
download.
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Co-developed-by: Chris Lu <chris.lu@mediatek.com>
Signed-off-by: Chris Lu <chris.lu@mediatek.com>
Signed-off-by: Hao Qin <hao.qin@mediatek.com>
---
v3: split from the v2 to make the patch do one thing in a patch and ensure
the reset the controller only when we actually need it to avoid the
regression on the time spent in opening the controller.
v4: rebase onto the latest code
v5: no change
---
drivers/bluetooth/btusb.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 602456e94fdb..ddd5ca7596e5 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -3175,6 +3175,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
case 0x7922:
case 0x7961:
case 0x7925:
+ /* Reset the device to ensure it's in the initial state before
+ * downloading the firmware to ensure.
+ */
+
+ if (!test_bit(BTUSB_FIRMWARE_LOADED, &data->flags))
+ btusb_mtk_subsys_reset(hdev, dev_id);
+
btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
fw_version, fw_flavor);
@@ -3182,9 +3189,12 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
btusb_mtk_hci_wmt_sync);
if (err < 0) {
bt_dev_err(hdev, "Failed to set up firmware (%d)", err);
+ clear_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
return err;
}
+ set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
+
/* It's Device EndPoint Reset Option Register */
btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, MTK_EP_RST_IN_OUT_OPT);
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 5/5] Bluetooth: btusb: mediatek: add MT7922 subsystem reset
2024-05-15 23:15 [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name sean.wang
` (2 preceding siblings ...)
2024-05-15 23:15 ` [PATCH v5 4/5] Bluetooth: btusb: mediatek: reset the controller before downloading the fw sean.wang
@ 2024-05-15 23:15 ` sean.wang
2024-05-15 23:56 ` [v5,1/5] Bluetooth: btmtk: add the function to get the fw name bluez.test.bot
2024-05-20 19:40 ` [PATCH v5 1/5] " patchwork-bot+bluetooth
5 siblings, 0 replies; 7+ messages in thread
From: sean.wang @ 2024-05-15 23:15 UTC (permalink / raw)
To: marcel, johan.hedberg, luiz.dentz
Cc: linux-bluetooth, linux-mediatek, linux-kernel, Hao Qin, Sean Wang
From: Hao Qin <hao.qin@mediatek.com>
Add the support of MT7922 bluetooth subsystem reset that was called the
auto revert to self-recover from the fatal error in the controller like
the host encounters HCI cmd timeout or the controller crashes.
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Hao Qin <hao.qin@mediatek.com>
---
v3: split from the v2 to make the patch do one thing in a patch.
v4: rebase onto the latest code
v5: no change
---
drivers/bluetooth/btusb.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index ddd5ca7596e5..79aefdb3324d 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -3039,7 +3039,16 @@ static int btusb_mtk_subsys_reset(struct hci_dev *hdev, u32 dev_id)
u32 val;
int err;
- if (dev_id == 0x7925) {
+ if (dev_id == 0x7922) {
+ btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val);
+ val |= 0x00002020;
+ btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, val);
+ btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, 0x00010001);
+ btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val);
+ val |= BIT(0);
+ btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, val);
+ msleep(100);
+ } else if (dev_id == 0x7925) {
btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val);
val |= (1 << 5);
btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val);
@@ -3079,6 +3088,9 @@ static int btusb_mtk_subsys_reset(struct hci_dev *hdev, u32 dev_id)
if (err < 0)
bt_dev_err(hdev, "Reset timeout");
+ if (dev_id == 0x7922)
+ btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF);
+
btusb_mtk_id_get(data, 0x70010200, &val);
if (!val)
bt_dev_err(hdev, "Can't get device id, subsys reset fail.");
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* RE: [v5,1/5] Bluetooth: btmtk: add the function to get the fw name
2024-05-15 23:15 [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name sean.wang
` (3 preceding siblings ...)
2024-05-15 23:15 ` [PATCH v5 5/5] Bluetooth: btusb: mediatek: add MT7922 subsystem reset sean.wang
@ 2024-05-15 23:56 ` bluez.test.bot
2024-05-20 19:40 ` [PATCH v5 1/5] " patchwork-bot+bluetooth
5 siblings, 0 replies; 7+ messages in thread
From: bluez.test.bot @ 2024-05-15 23:56 UTC (permalink / raw)
To: linux-bluetooth, sean.wang
[-- Attachment #1: Type: text/plain, Size: 2961 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=853525
---Test result---
Test Summary:
CheckPatch PASS 3.60 seconds
GitLint FAIL 1.71 seconds
SubjectPrefix PASS 0.58 seconds
BuildKernel PASS 29.25 seconds
CheckAllWarning PASS 32.14 seconds
CheckSparse PASS 37.90 seconds
CheckSmatch FAIL 34.30 seconds
BuildKernel32 PASS 28.20 seconds
TestRunnerSetup PASS 513.42 seconds
TestRunner_l2cap-tester PASS 18.10 seconds
TestRunner_iso-tester PASS 28.65 seconds
TestRunner_bnep-tester PASS 4.71 seconds
TestRunner_mgmt-tester PASS 112.77 seconds
TestRunner_rfcomm-tester PASS 7.28 seconds
TestRunner_sco-tester PASS 14.84 seconds
TestRunner_ioctl-tester PASS 7.62 seconds
TestRunner_mesh-tester PASS 5.79 seconds
TestRunner_smp-tester PASS 6.73 seconds
TestRunner_userchan-tester PASS 4.87 seconds
IncrementalBuild PASS 48.16 seconds
Details
##############################
Test: GitLint - FAIL
Desc: Run gitlint
Output:
[v5,4/5] Bluetooth: btusb: mediatek: reset the controller before downloading the fw
WARNING: I3 - ignore-body-lines: gitlint will be switching from using Python regex 'match' (match beginning) to 'search' (match anywhere) semantics. Please review your ignore-body-lines.regex option accordingly. To remove this warning, set general.regex-style-search=True. More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search
1: T1 Title exceeds max length (83>80): "[v5,4/5] Bluetooth: btusb: mediatek: reset the controller before downloading the fw"
##############################
Test: CheckSmatch - FAIL
Desc: Run smatch tool with source
Output:
Segmentation fault (core dumped)
make[4]: *** [scripts/Makefile.build:244: net/bluetooth/hci_core.o] Error 139
make[4]: *** Deleting file 'net/bluetooth/hci_core.o'
make[3]: *** [scripts/Makefile.build:485: net/bluetooth] Error 2
make[2]: *** [scripts/Makefile.build:485: net] Error 2
make[2]: *** Waiting for unfinished jobs....
Segmentation fault (core dumped)
make[4]: *** [scripts/Makefile.build:244: drivers/bluetooth/bcm203x.o] Error 139
make[4]: *** Deleting file 'drivers/bluetooth/bcm203x.o'
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [scripts/Makefile.build:485: drivers/bluetooth] Error 2
make[2]: *** [scripts/Makefile.build:485: drivers] Error 2
make[1]: *** [/github/workspace/src/src/Makefile:1919: .] Error 2
make: *** [Makefile:240: __sub-make] Error 2
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name
2024-05-15 23:15 [PATCH v5 1/5] Bluetooth: btmtk: add the function to get the fw name sean.wang
` (4 preceding siblings ...)
2024-05-15 23:56 ` [v5,1/5] Bluetooth: btmtk: add the function to get the fw name bluez.test.bot
@ 2024-05-20 19:40 ` patchwork-bot+bluetooth
5 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+bluetooth @ 2024-05-20 19:40 UTC (permalink / raw)
To: Sean Wang
Cc: marcel, johan.hedberg, luiz.dentz, linux-bluetooth,
linux-mediatek, linux-kernel, sean.wang
Hello:
This series was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:
On Wed, 15 May 2024 16:15:17 -0700 you wrote:
> From: Sean Wang <sean.wang@mediatek.com>
>
> Include a shared function to get the firmware name, to prevent repeating
> code for similar chipsets.
>
> Signed-off-by: Sean Wang <sean.wang@mediatek.com>
>
> [...]
Here is the summary with links:
- [v5,1/5] Bluetooth: btmtk: add the function to get the fw name
https://git.kernel.org/bluetooth/bluetooth-next/c/1a9f00aa23b8
- [v5,2/5] Bluetooth: btmtk: apply the common btmtk_fw_get_filename
https://git.kernel.org/bluetooth/bluetooth-next/c/8a5b9ee69fe6
- [v5,3/5] Bluetooth: btusb: mediatek: refactor the function btusb_mtk_reset
https://git.kernel.org/bluetooth/bluetooth-next/c/9d5a3b40987d
- [v5,4/5] Bluetooth: btusb: mediatek: reset the controller before downloading the fw
https://git.kernel.org/bluetooth/bluetooth-next/c/8f9fa6c70d35
- [v5,5/5] Bluetooth: btusb: mediatek: add MT7922 subsystem reset
https://git.kernel.org/bluetooth/bluetooth-next/c/2a6bc5724952
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 7+ messages in thread