u32                     last_adv_flags;
        u8                      last_adv_data[HCI_MAX_AD_LENGTH];
        u8                      last_adv_data_len;
+       s8                      rssi;
+       u16                     uuid_count;
+       u8                      (*uuids)[16];
 };
 
 struct hci_conn_hash {
        INIT_LIST_HEAD(&hdev->discovery.all);
        INIT_LIST_HEAD(&hdev->discovery.unknown);
        INIT_LIST_HEAD(&hdev->discovery.resolve);
+       hdev->discovery.rssi = HCI_RSSI_INVALID;
 }
 
 bool hci_discovery_active(struct hci_dev *hdev);
 
        case DISCOVERY_STOPPED:
                hci_update_background_scan(hdev);
 
+               /* Reset RSSI and UUID filters to ensure Start Discovery
+                * and Start Service Discovery operate properly no matter
+                * which one started the previous discovery.
+                *
+                * While the Start Discovery and Start Service Discovery
+                * operations will set proper values for RSSI and UUID
+                * count, it is important to actually free the allocated
+                * list of UUIDs here.
+                */
+               hdev->discovery.rssi = HCI_RSSI_INVALID;
+               hdev->discovery.uuid_count = 0;
+               kfree(hdev->discovery.uuids);
+               hdev->discovery.uuids = NULL;
+
                if (old_state != DISCOVERY_STARTING)
                        mgmt_discovering(hdev, 0);
                break;
 
        }
 
        hdev->discovery.type = cp->type;
+       hdev->discovery.rssi = HCI_RSSI_INVALID;
+       hdev->discovery.uuid_count = 0;
 
        hci_req_init(&req, hdev);