Merge tag 'for-net-next-2021-04-08' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / net / bluetooth / hci_event.c
index 67668be..016b299 100644 (file)
@@ -395,6 +395,29 @@ done:
        hci_dev_unlock(hdev);
 }
 
+static void hci_cc_set_event_filter(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       __u8 status = *((__u8 *)skb->data);
+       struct hci_cp_set_event_filter *cp;
+       void *sent;
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, status);
+
+       if (status)
+               return;
+
+       sent = hci_sent_cmd_data(hdev, HCI_OP_SET_EVENT_FLT);
+       if (!sent)
+               return;
+
+       cp = (struct hci_cp_set_event_filter *)sent;
+
+       if (cp->flt_type == HCI_FLT_CLEAR_ALL)
+               hci_dev_clear_flag(hdev, HCI_EVENT_FILTER_CONFIGURED);
+       else
+               hci_dev_set_flag(hdev, HCI_EVENT_FILTER_CONFIGURED);
+}
+
 static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
 {
        struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
@@ -1189,12 +1212,11 @@ static void hci_cc_le_set_adv_set_random_addr(struct hci_dev *hdev,
 
        hci_dev_lock(hdev);
 
-       if (!hdev->cur_adv_instance) {
+       if (!cp->handle) {
                /* Store in hdev for instance 0 (Set adv and Directed advs) */
                bacpy(&hdev->random_addr, &cp->bdaddr);
        } else {
-               adv_instance = hci_find_adv_instance(hdev,
-                                                    hdev->cur_adv_instance);
+               adv_instance = hci_find_adv_instance(hdev, cp->handle);
                if (adv_instance)
                        bacpy(&adv_instance->random_addr, &cp->bdaddr);
        }
@@ -1755,17 +1777,16 @@ static void hci_cc_set_ext_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
 
        hci_dev_lock(hdev);
        hdev->adv_addr_type = cp->own_addr_type;
-       if (!hdev->cur_adv_instance) {
+       if (!cp->handle) {
                /* Store in hdev for instance 0 */
                hdev->adv_tx_power = rp->tx_power;
        } else {
-               adv_instance = hci_find_adv_instance(hdev,
-                                                    hdev->cur_adv_instance);
+               adv_instance = hci_find_adv_instance(hdev, cp->handle);
                if (adv_instance)
                        adv_instance->tx_power = rp->tx_power;
        }
        /* Update adv data as tx power is known now */
-       hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
+       hci_req_update_adv_data(hdev, cp->handle);
 
        hci_dev_unlock(hdev);
 }
@@ -3328,6 +3349,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
                hci_cc_write_scan_enable(hdev, skb);
                break;
 
+       case HCI_OP_SET_EVENT_FLT:
+               hci_cc_set_event_filter(hdev, skb);
+               break;
+
        case HCI_OP_READ_CLASS_OF_DEV:
                hci_cc_read_class_of_dev(hdev, skb);
                break;
@@ -5005,6 +5030,7 @@ static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
                return;
 
        hchan->handle = le16_to_cpu(ev->handle);
+       hchan->amp = true;
 
        BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
 
@@ -5037,7 +5063,7 @@ static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
        hci_dev_lock(hdev);
 
        hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
-       if (!hchan)
+       if (!hchan || !hchan->amp)
                goto unlock;
 
        amp_destroy_logical_link(hchan, ev->reason);
@@ -5280,12 +5306,12 @@ static void hci_le_ext_adv_term_evt(struct hci_dev *hdev, struct sk_buff *skb)
                if (hdev->adv_addr_type != ADDR_LE_DEV_RANDOM)
                        return;
 
-               if (!hdev->cur_adv_instance) {
+               if (!ev->handle) {
                        bacpy(&conn->resp_addr, &hdev->random_addr);
                        return;
                }
 
-               adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
+               adv_instance = hci_find_adv_instance(hdev, ev->handle);
                if (adv_instance)
                        bacpy(&conn->resp_addr, &adv_instance->random_addr);
        }
@@ -5863,7 +5889,7 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
                        params->conn_latency = latency;
                        params->supervision_timeout = timeout;
                        store_hint = 0x01;
-               } else{
+               } else {
                        store_hint = 0x00;
                }
 
@@ -5911,7 +5937,7 @@ static void hci_le_phy_update_evt(struct hci_dev *hdev, struct sk_buff *skb)
 
        BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
 
-       if (!ev->status)
+       if (ev->status)
                return;
 
        hci_dev_lock(hdev);