Bluetooth: Read adversiting channel TX power during init sequence
This patch adds the reading of the LE advertising channel TX power to the HCI init sequence of LE-capable controllers. This data will be used e.g. for inclusion in the advertising data packets when advertising is enabled. 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:
parent
e36b04c805
commit
8fa19098eb
@ -932,6 +932,12 @@ struct hci_rp_le_read_buffer_size {
|
|||||||
__u8 le_max_pkt;
|
__u8 le_max_pkt;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
#define HCI_OP_LE_READ_ADV_TX_POWER 0x2007
|
||||||
|
struct hci_rp_le_read_adv_tx_power {
|
||||||
|
__u8 status;
|
||||||
|
__s8 tx_power;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
#define HCI_OP_LE_SET_SCAN_PARAM 0x200b
|
#define HCI_OP_LE_SET_SCAN_PARAM 0x200b
|
||||||
struct hci_cp_le_set_scan_param {
|
struct hci_cp_le_set_scan_param {
|
||||||
__u8 type;
|
__u8 type;
|
||||||
|
@ -278,6 +278,8 @@ struct hci_dev {
|
|||||||
struct work_struct le_scan;
|
struct work_struct le_scan;
|
||||||
struct le_scan_params le_scan_params;
|
struct le_scan_params le_scan_params;
|
||||||
|
|
||||||
|
__s8 adv_tx_power;
|
||||||
|
|
||||||
int (*open)(struct hci_dev *hdev);
|
int (*open)(struct hci_dev *hdev);
|
||||||
int (*close)(struct hci_dev *hdev);
|
int (*close)(struct hci_dev *hdev);
|
||||||
int (*flush)(struct hci_dev *hdev);
|
int (*flush)(struct hci_dev *hdev);
|
||||||
|
@ -594,6 +594,9 @@ static void le_init(struct hci_dev *hdev)
|
|||||||
{
|
{
|
||||||
/* Read LE Buffer Size */
|
/* Read LE Buffer Size */
|
||||||
hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
|
hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
|
||||||
|
|
||||||
|
/* Read LE Advertising Channel TX Power */
|
||||||
|
hci_send_cmd(hdev, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hci_setup(struct hci_dev *hdev)
|
static void hci_setup(struct hci_dev *hdev)
|
||||||
@ -1073,6 +1076,19 @@ static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
|
|||||||
hci_req_complete(hdev, HCI_OP_LE_READ_BUFFER_SIZE, rp->status);
|
hci_req_complete(hdev, HCI_OP_LE_READ_BUFFER_SIZE, rp->status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
|
||||||
|
struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
|
||||||
|
|
||||||
|
BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
|
||||||
|
|
||||||
|
if (!rp->status)
|
||||||
|
hdev->adv_tx_power = rp->tx_power;
|
||||||
|
|
||||||
|
hci_req_complete(hdev, HCI_OP_LE_READ_ADV_TX_POWER, rp->status);
|
||||||
|
}
|
||||||
|
|
||||||
static void hci_cc_le_set_event_mask(struct hci_dev *hdev, struct sk_buff *skb)
|
static void hci_cc_le_set_event_mask(struct hci_dev *hdev, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
__u8 status = *((__u8 *) skb->data);
|
__u8 status = *((__u8 *) skb->data);
|
||||||
@ -2505,6 +2521,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|||||||
hci_cc_le_read_buffer_size(hdev, skb);
|
hci_cc_le_read_buffer_size(hdev, skb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HCI_OP_LE_READ_ADV_TX_POWER:
|
||||||
|
hci_cc_le_read_adv_tx_power(hdev, skb);
|
||||||
|
break;
|
||||||
|
|
||||||
case HCI_OP_LE_SET_EVENT_MASK:
|
case HCI_OP_LE_SET_EVENT_MASK:
|
||||||
hci_cc_le_set_event_mask(hdev, skb);
|
hci_cc_le_set_event_mask(hdev, skb);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user