Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Bluetooth: btnxpuart: Update firmware names

This updates the firmware names of 3 chipsets: w8987, w8997, w9098.
These changes are been done to standardize chip specific firmware
file names to be in sync with firmware names of newer chipsets.

The naming convention for BT-only files would be as follows:
For dual-radio WiFi+BT chipsets:
- <protocol-BT><chip-name>_bt_v<HW-version>.bin
For tri-radio WiFi+BT+15.4 chipsets:
- <protocol-BT><protocol-15.4><chip-name>_bt_v<HW-version>.bin

To maintain backward compatibility, this commit adds a provision to
request older firmware file name, if new firmware file name not found in
/lib/firmware/nxp/.

A new device tree property has been introduced called firmware-name, to
override the hardcoded firmware names (old and new) in the driver.

Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

authored by

Neeraj Sanjay Kale and committed by
Luiz Augusto von Dentz
cb24bb7e 92182545

+50 -17
+50 -17
drivers/bluetooth/btnxpuart.c
··· 34 34 /* NXP HW err codes */ 35 35 #define BTNXPUART_IR_HW_ERR 0xb0 36 36 37 - #define FIRMWARE_W8987 "nxp/uartuart8987_bt.bin" 38 - #define FIRMWARE_W8997 "nxp/uartuart8997_bt_v4.bin" 39 - #define FIRMWARE_W9098 "nxp/uartuart9098_bt_v1.bin" 40 - #define FIRMWARE_IW416 "nxp/uartiw416_bt_v0.bin" 41 - #define FIRMWARE_IW612 "nxp/uartspi_n61x_v1.bin.se" 42 - #define FIRMWARE_IW624 "nxp/uartiw624_bt.bin" 43 - #define FIRMWARE_SECURE_IW624 "nxp/uartiw624_bt.bin.se" 44 - #define FIRMWARE_AW693 "nxp/uartaw693_bt.bin" 45 - #define FIRMWARE_SECURE_AW693 "nxp/uartaw693_bt.bin.se" 46 - #define FIRMWARE_HELPER "nxp/helper_uart_3000000.bin" 37 + #define FIRMWARE_W8987 "uart8987_bt_v0.bin" 38 + #define FIRMWARE_W8987_OLD "uartuart8987_bt.bin" 39 + #define FIRMWARE_W8997 "uart8997_bt_v4.bin" 40 + #define FIRMWARE_W8997_OLD "uartuart8997_bt_v4.bin" 41 + #define FIRMWARE_W9098 "uart9098_bt_v1.bin" 42 + #define FIRMWARE_W9098_OLD "uartuart9098_bt_v1.bin" 43 + #define FIRMWARE_IW416 "uartiw416_bt_v0.bin" 44 + #define FIRMWARE_IW612 "uartspi_n61x_v1.bin.se" 45 + #define FIRMWARE_IW624 "uartiw624_bt.bin" 46 + #define FIRMWARE_SECURE_IW624 "uartiw624_bt.bin.se" 47 + #define FIRMWARE_AW693 "uartaw693_bt.bin" 48 + #define FIRMWARE_SECURE_AW693 "uartaw693_bt.bin.se" 49 + #define FIRMWARE_HELPER "helper_uart_3000000.bin" 47 50 48 51 #define CHIP_ID_W9098 0x5c03 49 52 #define CHIP_ID_IW416 0x7201 ··· 148 145 struct btnxpuart_data { 149 146 const char *helper_fw_name; 150 147 const char *fw_name; 148 + const char *fw_name_old; 151 149 }; 152 150 153 151 struct btnxpuart_dev { ··· 698 694 return is_fw_downloading(nxpdev); 699 695 } 700 696 701 - static int nxp_request_firmware(struct hci_dev *hdev, const char *fw_name) 697 + static int nxp_request_firmware(struct hci_dev *hdev, const char *fw_name, 698 + const char *fw_name_old) 702 699 { 703 700 struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); 701 + const char *fw_name_dt; 704 702 int err = 0; 705 703 706 704 if (!fw_name) 707 705 return -ENOENT; 708 706 709 707 if (!strlen(nxpdev->fw_name)) { 710 - snprintf(nxpdev->fw_name, MAX_FW_FILE_NAME_LEN, "%s", fw_name); 708 + if (strcmp(fw_name, FIRMWARE_HELPER) && 709 + !device_property_read_string(&nxpdev->serdev->dev, 710 + "firmware-name", 711 + &fw_name_dt)) 712 + fw_name = fw_name_dt; 713 + snprintf(nxpdev->fw_name, MAX_FW_FILE_NAME_LEN, "nxp/%s", fw_name); 714 + err = request_firmware_direct(&nxpdev->fw, nxpdev->fw_name, &hdev->dev); 715 + if (err < 0 && fw_name_old) { 716 + snprintf(nxpdev->fw_name, MAX_FW_FILE_NAME_LEN, "nxp/%s", fw_name_old); 717 + err = request_firmware_direct(&nxpdev->fw, nxpdev->fw_name, &hdev->dev); 718 + } 711 719 712 720 bt_dev_info(hdev, "Request Firmware: %s", nxpdev->fw_name); 713 - err = request_firmware(&nxpdev->fw, nxpdev->fw_name, &hdev->dev); 714 721 if (err < 0) { 715 722 bt_dev_err(hdev, "Firmware file %s not found", nxpdev->fw_name); 716 723 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); ··· 800 785 } 801 786 802 787 if (!nxp_data->helper_fw_name || nxpdev->helper_downloaded) { 803 - if (nxp_request_firmware(hdev, nxp_data->fw_name)) 788 + if (nxp_request_firmware(hdev, nxp_data->fw_name, nxp_data->fw_name_old)) 804 789 goto free_skb; 805 790 } else if (nxp_data->helper_fw_name && !nxpdev->helper_downloaded) { 806 - if (nxp_request_firmware(hdev, nxp_data->helper_fw_name)) 791 + if (nxp_request_firmware(hdev, nxp_data->helper_fw_name, NULL)) 807 792 goto free_skb; 808 793 } 809 794 ··· 905 890 return fw_name; 906 891 } 907 892 893 + static char *nxp_get_old_fw_name_from_chipid(struct hci_dev *hdev, u16 chipid, 894 + u8 loader_ver) 895 + { 896 + char *fw_name_old = NULL; 897 + 898 + switch (chipid) { 899 + case CHIP_ID_W9098: 900 + fw_name_old = FIRMWARE_W9098_OLD; 901 + break; 902 + } 903 + return fw_name_old; 904 + } 905 + 908 906 static int nxp_recv_chip_ver_v3(struct hci_dev *hdev, struct sk_buff *skb) 909 907 { 910 908 struct v3_start_ind *req = skb_pull_data(skb, sizeof(*req)); 911 909 struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); 910 + const char *fw_name; 911 + const char *fw_name_old; 912 912 u16 chip_id; 913 913 u8 loader_ver; 914 914 ··· 933 903 chip_id = le16_to_cpu(req->chip_id); 934 904 loader_ver = req->loader_ver; 935 905 bt_dev_info(hdev, "ChipID: %04x, Version: %d", chip_id, loader_ver); 936 - if (!nxp_request_firmware(hdev, nxp_get_fw_name_from_chipid(hdev, 937 - chip_id, loader_ver))) 906 + fw_name = nxp_get_fw_name_from_chipid(hdev, chip_id, loader_ver); 907 + fw_name_old = nxp_get_old_fw_name_from_chipid(hdev, chip_id, loader_ver); 908 + if (!nxp_request_firmware(hdev, fw_name, fw_name_old)) 938 909 nxp_send_ack(NXP_ACK_V3, hdev); 939 910 940 911 free_skb: ··· 1457 1426 static struct btnxpuart_data w8987_data __maybe_unused = { 1458 1427 .helper_fw_name = NULL, 1459 1428 .fw_name = FIRMWARE_W8987, 1429 + .fw_name_old = FIRMWARE_W8987_OLD, 1460 1430 }; 1461 1431 1462 1432 static struct btnxpuart_data w8997_data __maybe_unused = { 1463 1433 .helper_fw_name = FIRMWARE_HELPER, 1464 1434 .fw_name = FIRMWARE_W8997, 1435 + .fw_name_old = FIRMWARE_W8997_OLD, 1465 1436 }; 1466 1437 1467 1438 static const struct of_device_id nxpuart_of_match_table[] __maybe_unused = {