Commit 6322f377 authored by Fabian Schindlatz's avatar Fabian Schindlatz Committed by Marcel Holtmann

Bluetooth: hci_ll: Refactor download_firmware

Extract the new function send_command_from_firmware from
download_firmware, which helps with the readability of the switch
statement. This way the code is less deeply nested and also no longer
exceeds the 80 character limit.
Co-developed-by: default avatarThomas Röthenbacher <thomas.roethenbacher@fau.de>
Signed-off-by: default avatarThomas Röthenbacher <thomas.roethenbacher@fau.de>
Signed-off-by: default avatarFabian Schindlatz <fabian.schindlatz@fau.de>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent a2e02f38
......@@ -474,6 +474,32 @@ static int read_local_version(struct hci_dev *hdev)
return err ? err : version;
}
static int send_command_from_firmware(struct ll_device *lldev,
struct hci_command *cmd)
{
struct sk_buff *skb;
if (cmd->opcode == HCI_VS_UPDATE_UART_HCI_BAUDRATE) {
/* ignore remote change
* baud rate HCI VS command
*/
bt_dev_warn(lldev->hu.hdev,
"change remote baud rate command in firmware");
return 0;
}
if (cmd->prefix != 1)
bt_dev_dbg(lldev->hu.hdev, "command type %d", cmd->prefix);
skb = __hci_cmd_sync(lldev->hu.hdev, cmd->opcode, cmd->plen,
&cmd->speed, HCI_INIT_TIMEOUT);
if (IS_ERR(skb)) {
bt_dev_err(lldev->hu.hdev, "send command failed");
return PTR_ERR(skb);
}
kfree_skb(skb);
return 0;
}
/**
* download_firmware -
* internal function which parses through the .bts firmware
......@@ -486,7 +512,6 @@ static int download_firmware(struct ll_device *lldev)
unsigned char *ptr, *action_ptr;
unsigned char bts_scr_name[40]; /* 40 char long bts scr name? */
const struct firmware *fw;
struct sk_buff *skb;
struct hci_command *cmd;
version = read_local_version(lldev->hu.hdev);
......@@ -528,23 +553,9 @@ static int download_firmware(struct ll_device *lldev)
case ACTION_SEND_COMMAND: /* action send */
bt_dev_dbg(lldev->hu.hdev, "S");
cmd = (struct hci_command *)action_ptr;
if (cmd->opcode == HCI_VS_UPDATE_UART_HCI_BAUDRATE) {
/* ignore remote change
* baud rate HCI VS command
*/
bt_dev_warn(lldev->hu.hdev, "change remote baud rate command in firmware");
break;
}
if (cmd->prefix != 1)
bt_dev_dbg(lldev->hu.hdev, "command type %d", cmd->prefix);
skb = __hci_cmd_sync(lldev->hu.hdev, cmd->opcode, cmd->plen, &cmd->speed, HCI_INIT_TIMEOUT);
if (IS_ERR(skb)) {
bt_dev_err(lldev->hu.hdev, "send command failed");
err = PTR_ERR(skb);
err = send_command_from_firmware(lldev, cmd);
if (err)
goto out_rel_fw;
}
kfree_skb(skb);
break;
case ACTION_WAIT_EVENT: /* wait */
/* no need to wait as command was synchronous */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment