Bluetooth: btintel: Create common Intel Read Boot Params function
authorTedd Ho-Jeong An <tedd.an@linux.intel.com>
Wed, 24 Jan 2018 17:19:20 +0000 (09:19 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 24 Jan 2018 18:31:49 +0000 (19:31 +0100)
The Intel_Read_Boot_Params command is used to read boot parameters
from the bootloader and this is Intel generic command used in USB
and UART drivers.

Signed-off-by: Tedd Ho-Jeong An <tedd.an@linux.intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btintel.c
drivers/bluetooth/btintel.h
drivers/bluetooth/btusb.c
drivers/bluetooth/hci_intel.c

index c8aaed1..da47f6d 100644 (file)
@@ -589,6 +589,57 @@ int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param)
 }
 EXPORT_SYMBOL_GPL(btintel_send_intel_reset);
 
+int btintel_read_boot_params(struct hci_dev *hdev,
+                            struct intel_boot_params *params)
+{
+       struct sk_buff *skb;
+
+       skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_INIT_TIMEOUT);
+       if (IS_ERR(skb)) {
+               bt_dev_err(hdev, "Reading Intel boot parameters failed (%ld)",
+                          PTR_ERR(skb));
+               return PTR_ERR(skb);
+       }
+
+       if (skb->len != sizeof(*params)) {
+               bt_dev_err(hdev, "Intel boot parameters size mismatch");
+               kfree_skb(skb);
+               return -EILSEQ;
+       }
+
+       memcpy(params, skb->data, sizeof(*params));
+
+       kfree_skb(skb);
+
+       if (params->status) {
+               bt_dev_err(hdev, "Intel boot parameters command failed (%02x)",
+                          params->status);
+               return -bt_to_errno(params->status);
+       }
+
+       bt_dev_info(hdev, "Device revision is %u",
+                   le16_to_cpu(params->dev_revid));
+
+       bt_dev_info(hdev, "Secure boot is %s",
+                   params->secure_boot ? "enabled" : "disabled");
+
+       bt_dev_info(hdev, "OTP lock is %s",
+                   params->otp_lock ? "enabled" : "disabled");
+
+       bt_dev_info(hdev, "API lock is %s",
+                   params->api_lock ? "enabled" : "disabled");
+
+       bt_dev_info(hdev, "Debug lock is %s",
+                   params->debug_lock ? "enabled" : "disabled");
+
+       bt_dev_info(hdev, "Minimum firmware build %u week %u %u",
+                   params->min_fw_build_nn, params->min_fw_build_cw,
+                   2000 + params->min_fw_build_yy);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(btintel_read_boot_params);
+
 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION);
 MODULE_VERSION(VERSION);
index 2235705..0391e7a 100644 (file)
@@ -98,6 +98,8 @@ int btintel_read_version(struct hci_dev *hdev, struct intel_version *ver);
 struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read,
                                   u16 opcode_write);
 int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param);
+int btintel_read_boot_params(struct hci_dev *hdev,
+                            struct intel_boot_params *params);
 
 #else
 
@@ -180,4 +182,10 @@ static inline int btintel_send_intel_reset(struct hci_dev *hdev,
 {
        return -EOPNOTSUPP;
 }
+
+static inline int btintel_read_boot_params(struct hci_dev *hdev,
+                                          struct intel_boot_params *params)
+{
+       return -EOPNOTSUPP;
+}
 #endif
index 2a7d690..6ea21d5 100644 (file)
@@ -2010,9 +2010,8 @@ static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
 static int btusb_setup_intel_new(struct hci_dev *hdev)
 {
        struct btusb_data *data = hci_get_drvdata(hdev);
-       struct sk_buff *skb;
        struct intel_version ver;
-       struct intel_boot_params *params;
+       struct intel_boot_params params;
        const struct firmware *fw;
        const u8 *fw_ptr;
        u32 frag_len;
@@ -2100,55 +2099,24 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
        /* Read the secure boot parameters to identify the operating
         * details of the bootloader.
         */
-       skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_INIT_TIMEOUT);
-       if (IS_ERR(skb)) {
-               BT_ERR("%s: Reading Intel boot parameters failed (%ld)",
-                      hdev->name, PTR_ERR(skb));
-               return PTR_ERR(skb);
-       }
-
-       if (skb->len != sizeof(*params)) {
-               BT_ERR("%s: Intel boot parameters size mismatch", hdev->name);
-               kfree_skb(skb);
-               return -EILSEQ;
-       }
-
-       params = (struct intel_boot_params *)skb->data;
-
-       bt_dev_info(hdev, "Device revision is %u",
-                   le16_to_cpu(params->dev_revid));
-
-       bt_dev_info(hdev, "Secure boot is %s",
-                   params->secure_boot ? "enabled" : "disabled");
-
-       bt_dev_info(hdev, "OTP lock is %s",
-                   params->otp_lock ? "enabled" : "disabled");
-
-       bt_dev_info(hdev, "API lock is %s",
-                   params->api_lock ? "enabled" : "disabled");
-
-       bt_dev_info(hdev, "Debug lock is %s",
-                   params->debug_lock ? "enabled" : "disabled");
-
-       bt_dev_info(hdev, "Minimum firmware build %u week %u %u",
-                   params->min_fw_build_nn, params->min_fw_build_cw,
-                   2000 + params->min_fw_build_yy);
+       err = btintel_read_boot_params(hdev, &params);
+       if (err)
+               return err;
 
        /* It is required that every single firmware fragment is acknowledged
         * with a command complete event. If the boot parameters indicate
         * that this bootloader does not send them, then abort the setup.
         */
-       if (params->limited_cce != 0x00) {
+       if (params.limited_cce != 0x00) {
                BT_ERR("%s: Unsupported Intel firmware loading method (%u)",
-                      hdev->name, params->limited_cce);
-               kfree_skb(skb);
+                      hdev->name, params.limited_cce);
                return -EINVAL;
        }
 
        /* If the OTP has no valid Bluetooth device address, then there will
         * also be no valid address for the operational firmware.
         */
-       if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) {
+       if (!bacmp(&params.otp_bdaddr, BDADDR_ANY)) {
                bt_dev_info(hdev, "No device address configured");
                set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
        }
@@ -2179,7 +2147,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
        case 0x0c:      /* WsP */
                snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",
                         le16_to_cpu(ver.hw_variant),
-                        le16_to_cpu(params->dev_revid));
+                        le16_to_cpu(params.dev_revid));
                break;
        case 0x11:      /* JfP */
        case 0x12:      /* ThP */
@@ -2197,7 +2165,6 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
        if (err < 0) {
                BT_ERR("%s: Failed to load Intel firmware file (%d)",
                       hdev->name, err);
-               kfree_skb(skb);
                return err;
        }
 
@@ -2211,7 +2178,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
        case 0x0c:      /* WsP */
                snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc",
                         le16_to_cpu(ver.hw_variant),
-                        le16_to_cpu(params->dev_revid));
+                        le16_to_cpu(params.dev_revid));
                break;
        case 0x11:      /* JfP */
        case 0x12:      /* ThP */
@@ -2225,8 +2192,6 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
                return -EINVAL;
        }
 
-       kfree_skb(skb);
-
        if (fw->size < 644) {
                BT_ERR("%s: Invalid size of firmware file (%zu)",
                       hdev->name, fw->size);
index 6f02f65..cf74385 100644 (file)
@@ -545,7 +545,7 @@ static int intel_setup(struct hci_uart *hu)
        struct hci_dev *hdev = hu->hdev;
        struct sk_buff *skb;
        struct intel_version ver;
-       struct intel_boot_params *params;
+       struct intel_boot_params params;
        struct list_head *p;
        const struct firmware *fw;
        const u8 *fw_ptr;
@@ -662,53 +662,24 @@ static int intel_setup(struct hci_uart *hu)
        /* Read the secure boot parameters to identify the operating
         * details of the bootloader.
         */
-       skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_CMD_TIMEOUT);
-       if (IS_ERR(skb)) {
-               bt_dev_err(hdev, "Reading Intel boot parameters failed (%ld)",
-                          PTR_ERR(skb));
-               return PTR_ERR(skb);
-       }
-
-       if (skb->len != sizeof(*params)) {
-               bt_dev_err(hdev, "Intel boot parameters size mismatch");
-               kfree_skb(skb);
-               return -EILSEQ;
-       }
-
-       params = (struct intel_boot_params *)skb->data;
-       if (params->status) {
-               bt_dev_err(hdev, "Intel boot parameters command failure (%02x)",
-                          params->status);
-               err = -bt_to_errno(params->status);
-               kfree_skb(skb);
+       err = btintel_read_boot_params(hdev, &params);
+       if (err)
                return err;
-       }
-
-       bt_dev_info(hdev, "Device revision is %u",
-                   le16_to_cpu(params->dev_revid));
-
-       bt_dev_info(hdev, "Secure boot is %s",
-                   params->secure_boot ? "enabled" : "disabled");
-
-       bt_dev_info(hdev, "Minimum firmware build %u week %u %u",
-               params->min_fw_build_nn, params->min_fw_build_cw,
-               2000 + params->min_fw_build_yy);
 
        /* It is required that every single firmware fragment is acknowledged
         * with a command complete event. If the boot parameters indicate
         * that this bootloader does not send them, then abort the setup.
         */
-       if (params->limited_cce != 0x00) {
+       if (params.limited_cce != 0x00) {
                bt_dev_err(hdev, "Unsupported Intel firmware loading method (%u)",
-                          params->limited_cce);
-               kfree_skb(skb);
+                          params.limited_cce);
                return -EINVAL;
        }
 
        /* If the OTP has no valid Bluetooth device address, then there will
         * also be no valid address for the operational firmware.
         */
-       if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) {
+       if (!bacmp(&params.otp_bdaddr, BDADDR_ANY)) {
                bt_dev_info(hdev, "No device address configured");
                set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
        }
@@ -738,7 +709,7 @@ static int intel_setup(struct hci_uart *hu)
        case 0x0c:      /* WsP */
                snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",
                         le16_to_cpu(ver.hw_variant),
-                        le16_to_cpu(params->dev_revid));
+                        le16_to_cpu(params.dev_revid));
                break;
        case 0x12:      /* ThP */
                snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.sfi",
@@ -756,7 +727,6 @@ static int intel_setup(struct hci_uart *hu)
        if (err < 0) {
                bt_dev_err(hdev, "Failed to load Intel firmware file (%d)",
                           err);
-               kfree_skb(skb);
                return err;
        }
 
@@ -768,7 +738,7 @@ static int intel_setup(struct hci_uart *hu)
        case 0x0c:      /* WsP */
                snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc",
                         le16_to_cpu(ver.hw_variant),
-                        le16_to_cpu(params->dev_revid));
+                        le16_to_cpu(params.dev_revid));
                break;
        case 0x12:      /* ThP */
                snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.ddc",
@@ -782,8 +752,6 @@ static int intel_setup(struct hci_uart *hu)
                return -EINVAL;
        }
 
-       kfree_skb(skb);
-
        if (fw->size < 644) {
                bt_dev_err(hdev, "Invalid size of firmware file (%zu)",
                           fw->size);