Bluetooth: Refactor HCI command skb creation
This patch moves out the skb creation from hci_send_cmd() into its own prepare_cmd() function. This is essential so the same prepare_cmd() function can be easily reused for skb creation for asynchronous HCI requests. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
This commit is contained in:
committed by
Gustavo Padovan
parent
3119ae9599
commit
1ca3a9d06e
@@ -2469,20 +2469,16 @@ int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send HCI command */
|
static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
|
||||||
int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param)
|
u32 plen, void *param)
|
||||||
{
|
{
|
||||||
int len = HCI_COMMAND_HDR_SIZE + plen;
|
int len = HCI_COMMAND_HDR_SIZE + plen;
|
||||||
struct hci_command_hdr *hdr;
|
struct hci_command_hdr *hdr;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
|
|
||||||
|
|
||||||
skb = bt_skb_alloc(len, GFP_ATOMIC);
|
skb = bt_skb_alloc(len, GFP_ATOMIC);
|
||||||
if (!skb) {
|
if (!skb)
|
||||||
BT_ERR("%s no memory for command", hdev->name);
|
return NULL;
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
|
hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
|
||||||
hdr->opcode = cpu_to_le16(opcode);
|
hdr->opcode = cpu_to_le16(opcode);
|
||||||
@@ -2496,6 +2492,22 @@ int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param)
|
|||||||
bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
|
bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
|
||||||
skb->dev = (void *) hdev;
|
skb->dev = (void *) hdev;
|
||||||
|
|
||||||
|
return skb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send HCI command */
|
||||||
|
int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param)
|
||||||
|
{
|
||||||
|
struct sk_buff *skb;
|
||||||
|
|
||||||
|
BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
|
||||||
|
|
||||||
|
skb = hci_prepare_cmd(hdev, opcode, plen, param);
|
||||||
|
if (!skb) {
|
||||||
|
BT_ERR("%s no memory for command", hdev->name);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
if (test_bit(HCI_INIT, &hdev->flags))
|
if (test_bit(HCI_INIT, &hdev->flags))
|
||||||
hdev->init_last_cmd = opcode;
|
hdev->init_last_cmd = opcode;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user