Merge tag 'for_v5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[linux-2.6-microblaze.git] / net / bluetooth / hci_event.c
index f049639..67668be 100644 (file)
@@ -1202,6 +1202,20 @@ static void hci_cc_le_set_adv_set_random_addr(struct hci_dev *hdev,
        hci_dev_unlock(hdev);
 }
 
+static void hci_cc_le_read_transmit_power(struct hci_dev *hdev,
+                                         struct sk_buff *skb)
+{
+       struct hci_rp_le_read_transmit_power *rp = (void *)skb->data;
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
+
+       if (rp->status)
+               return;
+
+       hdev->min_le_tx_power = rp->min_le_tx_power;
+       hdev->max_le_tx_power = rp->max_le_tx_power;
+}
+
 static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
 {
        __u8 *sent, status = *((__u8 *) skb->data);
@@ -1752,6 +1766,7 @@ static void hci_cc_set_ext_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
        }
        /* Update adv data as tx power is known now */
        hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
+
        hci_dev_unlock(hdev);
 }
 
@@ -3581,6 +3596,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
                hci_cc_le_set_adv_set_random_addr(hdev, skb);
                break;
 
+       case HCI_OP_LE_READ_TRANSMIT_POWER:
+               hci_cc_le_read_transmit_power(hdev, skb);
+               break;
+
        default:
                BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
                break;
@@ -4936,15 +4955,15 @@ static void hci_phy_link_complete_evt(struct hci_dev *hdev,
        hci_dev_lock(hdev);
 
        hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
-       if (!hcon) {
-               hci_dev_unlock(hdev);
-               return;
-       }
+       if (!hcon)
+               goto unlock;
+
+       if (!hcon->amp_mgr)
+               goto unlock;
 
        if (ev->status) {
                hci_conn_del(hcon);
-               hci_dev_unlock(hdev);
-               return;
+               goto unlock;
        }
 
        bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
@@ -4961,6 +4980,7 @@ static void hci_phy_link_complete_evt(struct hci_dev *hdev,
 
        amp_physical_cfm(bredr_hcon, hcon);
 
+unlock:
        hci_dev_unlock(hdev);
 }
 
@@ -5868,21 +5888,19 @@ static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
                                         struct sk_buff *skb)
 {
        u8 num_reports = skb->data[0];
-       void *ptr = &skb->data[1];
+       struct hci_ev_le_direct_adv_info *ev = (void *)&skb->data[1];
 
-       hci_dev_lock(hdev);
+       if (!num_reports || skb->len < num_reports * sizeof(*ev) + 1)
+               return;
 
-       while (num_reports--) {
-               struct hci_ev_le_direct_adv_info *ev = ptr;
+       hci_dev_lock(hdev);
 
+       for (; num_reports; num_reports--, ev++)
                process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
                                   ev->bdaddr_type, &ev->direct_addr,
                                   ev->direct_addr_type, ev->rssi, NULL, 0,
                                   false);
 
-               ptr += sizeof(*ev);
-       }
-
        hci_dev_unlock(hdev);
 }