Skip to content

Commit 9cd25d0

Browse files
committed
linux-yocto-6.12: import patches enabling Bluetooth on RB1 board
Backport patches enabling Bluetooth on the Qualcomm RB1 board to the 6.12 kernel. Bluetooth part has been accepted for 6.15. DT patches will be merged into the 6.16 kernel. Compared to linux-yocto-dev this kernel requires one extra patch, backported from 6.14. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 19552a5 commit 9cd25d0

9 files changed

+828
-0
lines changed
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
From 30209aeff75fe18cf01a63332a7a7f472877d445 Mon Sep 17 00:00:00 2001
2+
From: Cheng Jiang <[email protected]>
3+
Date: Tue, 7 Jan 2025 17:26:50 +0800
4+
Subject: [PATCH] Bluetooth: qca: Expand firmware-name to load specific
5+
rampatch
6+
7+
The firmware-name property has been expanded to specify the names of NVM
8+
and rampatch firmware for certain chips, such as the QCA6698 Bluetooth
9+
chip. Although it shares the same IP core as the WCN6855, the QCA6698
10+
has different RF components and RAM sizes, necessitating new firmware
11+
files. This change allows for the configuration of NVM and rampatch in
12+
DT.
13+
14+
Possible configurations:
15+
firmware-name = QCA6698/hpnv21.bin, QCA6698/hpbtfw21.tlv;
16+
firmware-name = QCA6698/hpnv21, QCA6698/hpbtfw21.tlv;
17+
18+
Signed-off-by: Cheng Jiang <[email protected]>
19+
Signed-off-by: Luiz Augusto von Dentz <[email protected]>
20+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/30209aeff75f]
21+
---
22+
drivers/bluetooth/btqca.c | 82 +++++++++++++++++++------------------
23+
drivers/bluetooth/btqca.h | 5 ++-
24+
drivers/bluetooth/hci_qca.c | 22 +++++++---
25+
3 files changed, 63 insertions(+), 46 deletions(-)
26+
27+
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
28+
index 5cb1fd1a0c7b..a6b53d1f23db 100644
29+
--- a/drivers/bluetooth/btqca.c
30+
+++ b/drivers/bluetooth/btqca.c
31+
@@ -782,7 +782,7 @@ static void qca_get_nvm_name_by_board(char *fwname, size_t max_size,
32+
33+
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
34+
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
35+
- const char *firmware_name)
36+
+ const char *firmware_name, const char *rampatch_name)
37+
{
38+
struct qca_fw_config config = {};
39+
int err;
40+
@@ -811,44 +811,48 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
41+
42+
/* Download rampatch file */
43+
config.type = TLV_TYPE_PATCH;
44+
- switch (soc_type) {
45+
- case QCA_WCN3990:
46+
- case QCA_WCN3991:
47+
- case QCA_WCN3998:
48+
- snprintf(config.fwname, sizeof(config.fwname),
49+
- "qca/crbtfw%02x.tlv", rom_ver);
50+
- break;
51+
- case QCA_WCN3988:
52+
- snprintf(config.fwname, sizeof(config.fwname),
53+
- "qca/apbtfw%02x.tlv", rom_ver);
54+
- break;
55+
- case QCA_QCA2066:
56+
- snprintf(config.fwname, sizeof(config.fwname),
57+
- "qca/hpbtfw%02x.tlv", rom_ver);
58+
- break;
59+
- case QCA_QCA6390:
60+
- snprintf(config.fwname, sizeof(config.fwname),
61+
- "qca/htbtfw%02x.tlv", rom_ver);
62+
- break;
63+
- case QCA_WCN6750:
64+
- /* Choose mbn file by default.If mbn file is not found
65+
- * then choose tlv file
66+
- */
67+
- config.type = ELF_TYPE_PATCH;
68+
- snprintf(config.fwname, sizeof(config.fwname),
69+
- "qca/msbtfw%02x.mbn", rom_ver);
70+
- break;
71+
- case QCA_WCN6855:
72+
- snprintf(config.fwname, sizeof(config.fwname),
73+
- "qca/hpbtfw%02x.tlv", rom_ver);
74+
- break;
75+
- case QCA_WCN7850:
76+
- snprintf(config.fwname, sizeof(config.fwname),
77+
- "qca/hmtbtfw%02x.tlv", rom_ver);
78+
- break;
79+
- default:
80+
- snprintf(config.fwname, sizeof(config.fwname),
81+
- "qca/rampatch_%08x.bin", soc_ver);
82+
+ if (rampatch_name) {
83+
+ snprintf(config.fwname, sizeof(config.fwname), "qca/%s", rampatch_name);
84+
+ } else {
85+
+ switch (soc_type) {
86+
+ case QCA_WCN3990:
87+
+ case QCA_WCN3991:
88+
+ case QCA_WCN3998:
89+
+ snprintf(config.fwname, sizeof(config.fwname),
90+
+ "qca/crbtfw%02x.tlv", rom_ver);
91+
+ break;
92+
+ case QCA_WCN3988:
93+
+ snprintf(config.fwname, sizeof(config.fwname),
94+
+ "qca/apbtfw%02x.tlv", rom_ver);
95+
+ break;
96+
+ case QCA_QCA2066:
97+
+ snprintf(config.fwname, sizeof(config.fwname),
98+
+ "qca/hpbtfw%02x.tlv", rom_ver);
99+
+ break;
100+
+ case QCA_QCA6390:
101+
+ snprintf(config.fwname, sizeof(config.fwname),
102+
+ "qca/htbtfw%02x.tlv", rom_ver);
103+
+ break;
104+
+ case QCA_WCN6750:
105+
+ /* Choose mbn file by default.If mbn file is not found
106+
+ * then choose tlv file
107+
+ */
108+
+ config.type = ELF_TYPE_PATCH;
109+
+ snprintf(config.fwname, sizeof(config.fwname),
110+
+ "qca/msbtfw%02x.mbn", rom_ver);
111+
+ break;
112+
+ case QCA_WCN6855:
113+
+ snprintf(config.fwname, sizeof(config.fwname),
114+
+ "qca/hpbtfw%02x.tlv", rom_ver);
115+
+ break;
116+
+ case QCA_WCN7850:
117+
+ snprintf(config.fwname, sizeof(config.fwname),
118+
+ "qca/hmtbtfw%02x.tlv", rom_ver);
119+
+ break;
120+
+ default:
121+
+ snprintf(config.fwname, sizeof(config.fwname),
122+
+ "qca/rampatch_%08x.bin", soc_ver);
123+
+ }
124+
}
125+
126+
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);
127+
diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
128+
index bb5207d7a8c7..9d28c8800225 100644
129+
--- a/drivers/bluetooth/btqca.h
130+
+++ b/drivers/bluetooth/btqca.h
131+
@@ -161,7 +161,7 @@ enum qca_btsoc_type {
132+
int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr);
133+
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
134+
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
135+
- const char *firmware_name);
136+
+ const char *firmware_name, const char *rampatch_name);
137+
int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
138+
enum qca_btsoc_type);
139+
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
140+
@@ -176,7 +176,8 @@ static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdad
141+
static inline int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
142+
enum qca_btsoc_type soc_type,
143+
struct qca_btsoc_version ver,
144+
- const char *firmware_name)
145+
+ const char *firmware_name,
146+
+ const char *rampatch_name)
147+
{
148+
return -EOPNOTSUPP;
149+
}
150+
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
151+
index 37129e6cb0eb..5d75087cca99 100644
152+
--- a/drivers/bluetooth/hci_qca.c
153+
+++ b/drivers/bluetooth/hci_qca.c
154+
@@ -228,7 +228,7 @@ struct qca_serdev {
155+
u32 init_speed;
156+
u32 oper_speed;
157+
bool bdaddr_property_broken;
158+
- const char *firmware_name;
159+
+ const char *firmware_name[2];
160+
};
161+
162+
static int qca_regulator_enable(struct qca_serdev *qcadev);
163+
@@ -258,7 +258,18 @@ static const char *qca_get_firmware_name(struct hci_uart *hu)
164+
if (hu->serdev) {
165+
struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
166+
167+
- return qsd->firmware_name;
168+
+ return qsd->firmware_name[0];
169+
+ } else {
170+
+ return NULL;
171+
+ }
172+
+}
173+
+
174+
+static const char *qca_get_rampatch_name(struct hci_uart *hu)
175+
+{
176+
+ if (hu->serdev) {
177+
+ struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
178+
+
179+
+ return qsd->firmware_name[1];
180+
} else {
181+
return NULL;
182+
}
183+
@@ -1855,6 +1866,7 @@ static int qca_setup(struct hci_uart *hu)
184+
unsigned int retries = 0;
185+
enum qca_btsoc_type soc_type = qca_soc_type(hu);
186+
const char *firmware_name = qca_get_firmware_name(hu);
187+
+ const char *rampatch_name = qca_get_rampatch_name(hu);
188+
int ret;
189+
struct qca_btsoc_version ver;
190+
struct qca_serdev *qcadev;
191+
@@ -1963,7 +1975,7 @@ static int qca_setup(struct hci_uart *hu)
192+
193+
/* Setup patch / NVM configurations */
194+
ret = qca_uart_setup(hdev, qca_baudrate, soc_type, ver,
195+
- firmware_name);
196+
+ firmware_name, rampatch_name);
197+
if (!ret) {
198+
clear_bit(QCA_IBS_DISABLED, &qca->flags);
199+
qca_debugfs_init(hdev);
200+
@@ -2309,8 +2321,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
201+
qcadev->serdev_hu.serdev = serdev;
202+
data = device_get_match_data(&serdev->dev);
203+
serdev_device_set_drvdata(serdev, qcadev);
204+
- device_property_read_string(&serdev->dev, "firmware-name",
205+
- &qcadev->firmware_name);
206+
+ device_property_read_string_array(&serdev->dev, "firmware-name",
207+
+ qcadev->firmware_name, ARRAY_SIZE(qcadev->firmware_name));
208+
device_property_read_u32(&serdev->dev, "max-speed",
209+
&qcadev->oper_speed);
210+
if (!qcadev->oper_speed)
211+
--
212+
2.39.5
213+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
From 87e51368071f342be6046304a17789b01fddc840 Mon Sep 17 00:00:00 2001
2+
From: Dmitry Baryshkov <[email protected]>
3+
Date: Tue, 1 Apr 2025 17:56:51 +0300
4+
Subject: [PATCH] Bluetooth: qca: fix NV variant for one of WCN3950 SoCs
5+
6+
The QCA_WCN3950_SOC_ID_S should be using qca/cmnv13s.bin, rather than
7+
qca/cmnv13u.bin file. Correct the variant suffix to be used for this SoC
8+
ID.
9+
10+
Fixes: 3b0e0839d9f2 ("Bluetooth: qca: add WCN3950 support")
11+
Reported-by: Wojciech Slenska <[email protected]>
12+
Closes: https://github.com/qualcomm-linux/meta-qcom/pull/817#discussion_r2022866431
13+
Signed-off-by: Dmitry Baryshkov <[email protected]>
14+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/87d48ed16c9f]
15+
---
16+
drivers/bluetooth/btqca.c | 2 +-
17+
1 file changed, 1 insertion(+), 1 deletion(-)
18+
19+
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
20+
index 3d6778b95e00..edefb9dc76aa 100644
21+
--- a/drivers/bluetooth/btqca.c
22+
+++ b/drivers/bluetooth/btqca.c
23+
@@ -889,7 +889,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
24+
if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_T)
25+
variant = "t";
26+
else if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_S)
27+
- variant = "u";
28+
+ variant = "s";
29+
30+
snprintf(config.fwname, sizeof(config.fwname),
31+
"qca/cmnv%02x%s.bin", rom_ver, variant);
32+
--
33+
2.39.5
34+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
From 394d7aab802ce9bf6406d22524ab14cad7ace83a Mon Sep 17 00:00:00 2001
2+
From: Dmitry Baryshkov <[email protected]>
3+
Date: Fri, 7 Feb 2025 22:41:15 +0200
4+
Subject: [PATCH] dt-bindings: net: bluetooth: qualcomm: document WCN3950
5+
6+
WCN3950 is another member of the WiFi/BT WCN39xx family of the chips. It
7+
requires different firmware, so document it as a new compat string.
8+
9+
Reviewed-by: Krzysztof Kozlowski <[email protected]>
10+
Signed-off-by: Dmitry Baryshkov <[email protected]>
11+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/a3d5067f33d1]
12+
---
13+
.../devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml | 2 ++
14+
1 file changed, 2 insertions(+)
15+
16+
diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
17+
index a72152f7e29b..6353a336f382 100644
18+
--- a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
19+
+++ b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
20+
@@ -19,6 +19,7 @@ properties:
21+
- qcom,qca2066-bt
22+
- qcom,qca6174-bt
23+
- qcom,qca9377-bt
24+
+ - qcom,wcn3950-bt
25+
- qcom,wcn3988-bt
26+
- qcom,wcn3990-bt
27+
- qcom,wcn3991-bt
28+
@@ -138,6 +139,7 @@ allOf:
29+
compatible:
30+
contains:
31+
enum:
32+
+ - qcom,wcn3950-bt
33+
- qcom,wcn3988-bt
34+
- qcom,wcn3990-bt
35+
- qcom,wcn3991-bt
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
From a749b2a90c94494018b2f67cbd54aa3f2d27625c Mon Sep 17 00:00:00 2001
2+
From: Dmitry Baryshkov <[email protected]>
3+
Date: Fri, 7 Feb 2025 22:41:16 +0200
4+
Subject: [PATCH] Bluetooth: qca: simplify WCN399x NVM loading
5+
6+
The WCN399x code has two separate cases for loading the NVM data. In
7+
preparation to adding support for WCN3950, which also requires similar
8+
quirk, split the "variant" to be specified explicitly and merge two
9+
snprintfs into a single one.
10+
11+
Signed-off-by: Dmitry Baryshkov <[email protected]>
12+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/28a5679ac56f]
13+
---
14+
drivers/bluetooth/btqca.c | 13 ++++++-------
15+
1 file changed, 6 insertions(+), 7 deletions(-)
16+
17+
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
18+
index cdf09d9a9ad2..7d6b02fe2040 100644
19+
--- a/drivers/bluetooth/btqca.c
20+
+++ b/drivers/bluetooth/btqca.c
21+
@@ -785,6 +785,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
22+
const char *firmware_name, const char *rampatch_name)
23+
{
24+
struct qca_fw_config config = {};
25+
+ const char *variant = "";
26+
int err;
27+
u8 rom_ver = 0;
28+
u32 soc_ver;
29+
@@ -883,13 +884,11 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
30+
case QCA_WCN3990:
31+
case QCA_WCN3991:
32+
case QCA_WCN3998:
33+
- if (le32_to_cpu(ver.soc_id) == QCA_WCN3991_SOC_ID) {
34+
- snprintf(config.fwname, sizeof(config.fwname),
35+
- "qca/crnv%02xu.bin", rom_ver);
36+
- } else {
37+
- snprintf(config.fwname, sizeof(config.fwname),
38+
- "qca/crnv%02x.bin", rom_ver);
39+
- }
40+
+ if (le32_to_cpu(ver.soc_id) == QCA_WCN3991_SOC_ID)
41+
+ variant = "u";
42+
+
43+
+ snprintf(config.fwname, sizeof(config.fwname),
44+
+ "qca/crnv%02x%s.bin", rom_ver, variant);
45+
break;
46+
case QCA_WCN3988:
47+
snprintf(config.fwname, sizeof(config.fwname),

0 commit comments

Comments
 (0)