Bluetooth: Add support for LE PHY Update Complete event
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 2 Jan 2020 23:00:55 +0000 (15:00 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 4 Jan 2020 09:49:23 +0000 (10:49 +0100)
This handles LE PHY Update Complete event and store both tx_phy and
rx_phy into hci_conn.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
net/bluetooth/hci_event.c

index 5bc1e30..07b6ece 100644 (file)
@@ -2186,6 +2186,14 @@ struct hci_ev_le_direct_adv_info {
        __s8     rssi;
 } __packed;
 
+#define HCI_EV_LE_PHY_UPDATE_COMPLETE  0x0c
+struct hci_ev_le_phy_update_complete {
+       __u8  status;
+       __u16 handle;
+       __u8  tx_phy;
+       __u8  rx_phy;
+} __packed;
+
 #define HCI_EV_LE_EXT_ADV_REPORT    0x0d
 struct hci_ev_le_ext_adv_report {
        __le16   evt_type;
index b689ace..faebe38 100644 (file)
@@ -493,6 +493,8 @@ struct hci_conn {
        __u16           le_supv_timeout;
        __u8            le_adv_data[HCI_MAX_AD_LENGTH];
        __u8            le_adv_data_len;
+       __u8            le_tx_phy;
+       __u8            le_rx_phy;
        __s8            rssi;
        __s8            tx_power;
        __s8            max_tx_power;
index 1941f12..6ddc4a7 100644 (file)
@@ -5718,6 +5718,29 @@ static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
        hci_dev_unlock(hdev);
 }
 
+static void hci_le_phy_update_evt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct hci_ev_le_phy_update_complete *ev = (void *) skb->data;
+       struct hci_conn *conn;
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
+
+       if (!ev->status)
+               return;
+
+       hci_dev_lock(hdev);
+
+       conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
+       if (!conn)
+               goto unlock;
+
+       conn->le_tx_phy = ev->tx_phy;
+       conn->le_rx_phy = ev->rx_phy;
+
+unlock:
+       hci_dev_unlock(hdev);
+}
+
 static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
 {
        struct hci_ev_le_meta *le_ev = (void *) skb->data;
@@ -5753,6 +5776,10 @@ static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
                hci_le_direct_adv_report_evt(hdev, skb);
                break;
 
+       case HCI_EV_LE_PHY_UPDATE_COMPLETE:
+               hci_le_phy_update_evt(hdev, skb);
+               break;
+
        case HCI_EV_LE_EXT_ADV_REPORT:
                hci_le_ext_adv_report_evt(hdev, skb);
                break;