Skip to content

Commit 30209ae

Browse files
Cheng JiangVudentz
authored andcommitted
Bluetooth: qca: Expand firmware-name to load specific rampatch
The firmware-name property has been expanded to specify the names of NVM and rampatch firmware for certain chips, such as the QCA6698 Bluetooth chip. Although it shares the same IP core as the WCN6855, the QCA6698 has different RF components and RAM sizes, necessitating new firmware files. This change allows for the configuration of NVM and rampatch in DT. Possible configurations: firmware-name = QCA6698/hpnv21.bin, QCA6698/hpbtfw21.tlv; firmware-name = QCA6698/hpnv21, QCA6698/hpbtfw21.tlv; Signed-off-by: Cheng Jiang <[email protected]> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent a4c5a46 commit 30209ae

File tree

3 files changed

+63
-46
lines changed

3 files changed

+63
-46
lines changed

drivers/bluetooth/btqca.c

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ static void qca_get_nvm_name_by_board(char *fwname, size_t max_size,
782782

783783
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
784784
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
785-
const char *firmware_name)
785+
const char *firmware_name, const char *rampatch_name)
786786
{
787787
struct qca_fw_config config = {};
788788
int err;
@@ -811,44 +811,48 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
811811

812812
/* Download rampatch file */
813813
config.type = TLV_TYPE_PATCH;
814-
switch (soc_type) {
815-
case QCA_WCN3990:
816-
case QCA_WCN3991:
817-
case QCA_WCN3998:
818-
snprintf(config.fwname, sizeof(config.fwname),
819-
"qca/crbtfw%02x.tlv", rom_ver);
820-
break;
821-
case QCA_WCN3988:
822-
snprintf(config.fwname, sizeof(config.fwname),
823-
"qca/apbtfw%02x.tlv", rom_ver);
824-
break;
825-
case QCA_QCA2066:
826-
snprintf(config.fwname, sizeof(config.fwname),
827-
"qca/hpbtfw%02x.tlv", rom_ver);
828-
break;
829-
case QCA_QCA6390:
830-
snprintf(config.fwname, sizeof(config.fwname),
831-
"qca/htbtfw%02x.tlv", rom_ver);
832-
break;
833-
case QCA_WCN6750:
834-
/* Choose mbn file by default.If mbn file is not found
835-
* then choose tlv file
836-
*/
837-
config.type = ELF_TYPE_PATCH;
838-
snprintf(config.fwname, sizeof(config.fwname),
839-
"qca/msbtfw%02x.mbn", rom_ver);
840-
break;
841-
case QCA_WCN6855:
842-
snprintf(config.fwname, sizeof(config.fwname),
843-
"qca/hpbtfw%02x.tlv", rom_ver);
844-
break;
845-
case QCA_WCN7850:
846-
snprintf(config.fwname, sizeof(config.fwname),
847-
"qca/hmtbtfw%02x.tlv", rom_ver);
848-
break;
849-
default:
850-
snprintf(config.fwname, sizeof(config.fwname),
851-
"qca/rampatch_%08x.bin", soc_ver);
814+
if (rampatch_name) {
815+
snprintf(config.fwname, sizeof(config.fwname), "qca/%s", rampatch_name);
816+
} else {
817+
switch (soc_type) {
818+
case QCA_WCN3990:
819+
case QCA_WCN3991:
820+
case QCA_WCN3998:
821+
snprintf(config.fwname, sizeof(config.fwname),
822+
"qca/crbtfw%02x.tlv", rom_ver);
823+
break;
824+
case QCA_WCN3988:
825+
snprintf(config.fwname, sizeof(config.fwname),
826+
"qca/apbtfw%02x.tlv", rom_ver);
827+
break;
828+
case QCA_QCA2066:
829+
snprintf(config.fwname, sizeof(config.fwname),
830+
"qca/hpbtfw%02x.tlv", rom_ver);
831+
break;
832+
case QCA_QCA6390:
833+
snprintf(config.fwname, sizeof(config.fwname),
834+
"qca/htbtfw%02x.tlv", rom_ver);
835+
break;
836+
case QCA_WCN6750:
837+
/* Choose mbn file by default.If mbn file is not found
838+
* then choose tlv file
839+
*/
840+
config.type = ELF_TYPE_PATCH;
841+
snprintf(config.fwname, sizeof(config.fwname),
842+
"qca/msbtfw%02x.mbn", rom_ver);
843+
break;
844+
case QCA_WCN6855:
845+
snprintf(config.fwname, sizeof(config.fwname),
846+
"qca/hpbtfw%02x.tlv", rom_ver);
847+
break;
848+
case QCA_WCN7850:
849+
snprintf(config.fwname, sizeof(config.fwname),
850+
"qca/hmtbtfw%02x.tlv", rom_ver);
851+
break;
852+
default:
853+
snprintf(config.fwname, sizeof(config.fwname),
854+
"qca/rampatch_%08x.bin", soc_ver);
855+
}
852856
}
853857

854858
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);

drivers/bluetooth/btqca.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ enum qca_btsoc_type {
161161
int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr);
162162
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
163163
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
164-
const char *firmware_name);
164+
const char *firmware_name, const char *rampatch_name);
165165
int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
166166
enum qca_btsoc_type);
167167
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
@@ -176,7 +176,8 @@ static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdad
176176
static inline int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
177177
enum qca_btsoc_type soc_type,
178178
struct qca_btsoc_version ver,
179-
const char *firmware_name)
179+
const char *firmware_name,
180+
const char *rampatch_name)
180181
{
181182
return -EOPNOTSUPP;
182183
}

drivers/bluetooth/hci_qca.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ struct qca_serdev {
228228
u32 init_speed;
229229
u32 oper_speed;
230230
bool bdaddr_property_broken;
231-
const char *firmware_name;
231+
const char *firmware_name[2];
232232
};
233233

234234
static int qca_regulator_enable(struct qca_serdev *qcadev);
@@ -258,7 +258,18 @@ static const char *qca_get_firmware_name(struct hci_uart *hu)
258258
if (hu->serdev) {
259259
struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
260260

261-
return qsd->firmware_name;
261+
return qsd->firmware_name[0];
262+
} else {
263+
return NULL;
264+
}
265+
}
266+
267+
static const char *qca_get_rampatch_name(struct hci_uart *hu)
268+
{
269+
if (hu->serdev) {
270+
struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
271+
272+
return qsd->firmware_name[1];
262273
} else {
263274
return NULL;
264275
}
@@ -1855,6 +1866,7 @@ static int qca_setup(struct hci_uart *hu)
18551866
unsigned int retries = 0;
18561867
enum qca_btsoc_type soc_type = qca_soc_type(hu);
18571868
const char *firmware_name = qca_get_firmware_name(hu);
1869+
const char *rampatch_name = qca_get_rampatch_name(hu);
18581870
int ret;
18591871
struct qca_btsoc_version ver;
18601872
struct qca_serdev *qcadev;
@@ -1963,7 +1975,7 @@ static int qca_setup(struct hci_uart *hu)
19631975

19641976
/* Setup patch / NVM configurations */
19651977
ret = qca_uart_setup(hdev, qca_baudrate, soc_type, ver,
1966-
firmware_name);
1978+
firmware_name, rampatch_name);
19671979
if (!ret) {
19681980
clear_bit(QCA_IBS_DISABLED, &qca->flags);
19691981
qca_debugfs_init(hdev);
@@ -2309,8 +2321,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
23092321
qcadev->serdev_hu.serdev = serdev;
23102322
data = device_get_match_data(&serdev->dev);
23112323
serdev_device_set_drvdata(serdev, qcadev);
2312-
device_property_read_string(&serdev->dev, "firmware-name",
2313-
&qcadev->firmware_name);
2324+
device_property_read_string_array(&serdev->dev, "firmware-name",
2325+
qcadev->firmware_name, ARRAY_SIZE(qcadev->firmware_name));
23142326
device_property_read_u32(&serdev->dev, "max-speed",
23152327
&qcadev->oper_speed);
23162328
if (!qcadev->oper_speed)

0 commit comments

Comments
 (0)