OSDN Git Service

Merge branch 'master' into ysato-h8300
[uclinux-h8/linux.git] / include / net / bluetooth / hci_core.h
index 3c78270..a056c2b 100644 (file)
@@ -76,9 +76,12 @@ struct discovery_state {
        u8                      last_adv_data[HCI_MAX_AD_LENGTH];
        u8                      last_adv_data_len;
        bool                    report_invalid_rssi;
+       bool                    result_filtering;
        s8                      rssi;
        u16                     uuid_count;
        u8                      (*uuids)[16];
+       unsigned long           scan_start;
+       unsigned long           scan_duration;
 };
 
 struct hci_conn_hash {
@@ -106,7 +109,7 @@ struct bt_uuid {
 struct smp_csrk {
        bdaddr_t bdaddr;
        u8 bdaddr_type;
-       u8 master;
+       u8 type;
        u8 val[16];
 };
 
@@ -145,12 +148,24 @@ struct oob_data {
        struct list_head list;
        bdaddr_t bdaddr;
        u8 bdaddr_type;
+       u8 present;
        u8 hash192[16];
        u8 rand192[16];
        u8 hash256[16];
        u8 rand256[16];
 };
 
+struct adv_info {
+       struct delayed_work timeout_exp;
+       __u8    instance;
+       __u32   flags;
+       __u16   timeout;
+       __u16   adv_data_len;
+       __u8    adv_data[HCI_MAX_AD_LENGTH];
+       __u16   scan_rsp_len;
+       __u8    scan_rsp_data[HCI_MAX_AD_LENGTH];
+};
+
 #define HCI_MAX_SHORT_NAME_LENGTH      10
 
 /* Default LE RPA expiry time, 15 minutes */
@@ -170,7 +185,6 @@ struct amp_assoc {
 
 #define HCI_MAX_PAGES  3
 
-#define NUM_REASSEMBLY 4
 struct hci_dev {
        struct list_head list;
        struct mutex    lock;
@@ -205,6 +219,8 @@ struct hci_dev {
        __u16           lmp_subver;
        __u16           voice_setting;
        __u8            num_iac;
+       __u8            stored_max_keys;
+       __u8            stored_num_keys;
        __u8            io_capability;
        __s8            inq_tx_power;
        __u16           page_scan_interval;
@@ -220,10 +236,17 @@ struct hci_dev {
        __u16           le_conn_max_interval;
        __u16           le_conn_latency;
        __u16           le_supv_timeout;
+       __u16           le_def_tx_len;
+       __u16           le_def_tx_time;
+       __u16           le_max_tx_len;
+       __u16           le_max_tx_time;
+       __u16           le_max_rx_len;
+       __u16           le_max_rx_time;
        __u16           discov_interleaved_timeout;
        __u16           conn_info_min_age;
        __u16           conn_info_max_age;
        __u8            ssp_debug_mode;
+       __u8            hw_error_code;
        __u32           clock;
 
        __u16           devid_source;
@@ -285,6 +308,7 @@ struct hci_dev {
 
        struct work_struct      power_on;
        struct delayed_work     power_off;
+       struct work_struct      error_reset;
 
        __u16                   discov_timeout;
        struct delayed_work     discov_off;
@@ -301,14 +325,13 @@ struct hci_dev {
        struct sk_buff_head     raw_q;
        struct sk_buff_head     cmd_q;
 
-       struct sk_buff          *recv_evt;
        struct sk_buff          *sent_cmd;
-       struct sk_buff          *reassembly[NUM_REASSEMBLY];
 
        struct mutex            req_lock;
        wait_queue_head_t       req_wait_q;
        __u32                   req_status;
        __u32                   req_result;
+       struct sk_buff          *req_skb;
 
        void                    *smp_data;
        void                    *smp_bredr_data;
@@ -339,10 +362,10 @@ struct hci_dev {
 
        struct rfkill           *rfkill;
 
-       unsigned long           dbg_flags;
-       unsigned long           dev_flags;
+       DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS);
 
        struct delayed_work     le_scan_disable;
+       struct delayed_work     le_scan_restart;
 
        __s8                    adv_tx_power;
        __u8                    adv_data[HCI_MAX_AD_LENGTH];
@@ -350,6 +373,8 @@ struct hci_dev {
        __u8                    scan_rsp_data[HCI_MAX_AD_LENGTH];
        __u8                    scan_rsp_data_len;
 
+       struct adv_info         adv_instance;
+
        __u8                    irk[16];
        __u32                   rpa_timeout;
        struct delayed_work     rpa_expired;
@@ -359,8 +384,10 @@ struct hci_dev {
        int (*close)(struct hci_dev *hdev);
        int (*flush)(struct hci_dev *hdev);
        int (*setup)(struct hci_dev *hdev);
+       int (*shutdown)(struct hci_dev *hdev);
        int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
        void (*notify)(struct hci_dev *hdev, unsigned int evt);
+       void (*hw_error)(struct hci_dev *hdev, u8 code);
        int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr);
 };
 
@@ -434,6 +461,7 @@ struct hci_conn {
        struct delayed_work le_conn_timeout;
 
        struct device   dev;
+       struct dentry   *debugfs;
 
        struct hci_dev  *hdev;
        void            *l2cap_data;
@@ -482,19 +510,29 @@ struct hci_conn_params {
 extern struct list_head hci_dev_list;
 extern struct list_head hci_cb_list;
 extern rwlock_t hci_dev_list_lock;
-extern rwlock_t hci_cb_list_lock;
+extern struct mutex hci_cb_list_lock;
+
+#define hci_dev_set_flag(hdev, nr)             set_bit((nr), (hdev)->dev_flags)
+#define hci_dev_clear_flag(hdev, nr)           clear_bit((nr), (hdev)->dev_flags)
+#define hci_dev_change_flag(hdev, nr)          change_bit((nr), (hdev)->dev_flags)
+#define hci_dev_test_flag(hdev, nr)            test_bit((nr), (hdev)->dev_flags)
+#define hci_dev_test_and_set_flag(hdev, nr)    test_and_set_bit((nr), (hdev)->dev_flags)
+#define hci_dev_test_and_clear_flag(hdev, nr)  test_and_clear_bit((nr), (hdev)->dev_flags)
+#define hci_dev_test_and_change_flag(hdev, nr) test_and_change_bit((nr), (hdev)->dev_flags)
+
+#define hci_dev_clear_volatile_flags(hdev)                     \
+       do {                                                    \
+               hci_dev_clear_flag(hdev, HCI_LE_SCAN);          \
+               hci_dev_clear_flag(hdev, HCI_LE_ADV);           \
+               hci_dev_clear_flag(hdev, HCI_PERIODIC_INQ);     \
+       } while (0)
 
 /* ----- HCI interface to upper protocols ----- */
 int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
-void l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
 int l2cap_disconn_ind(struct hci_conn *hcon);
-void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
-int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
 int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags);
 
 int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
-void sco_connect_cfm(struct hci_conn *hcon, __u8 status);
-void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
 int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
 
 /* ----- Inquiry cache ----- */
@@ -513,11 +551,19 @@ static inline void discovery_init(struct hci_dev *hdev)
 
 static inline void hci_discovery_filter_clear(struct hci_dev *hdev)
 {
+       hdev->discovery.result_filtering = false;
        hdev->discovery.report_invalid_rssi = true;
        hdev->discovery.rssi = HCI_RSSI_INVALID;
        hdev->discovery.uuid_count = 0;
        kfree(hdev->discovery.uuids);
        hdev->discovery.uuids = NULL;
+       hdev->discovery.scan_start = 0;
+       hdev->discovery.scan_duration = 0;
+}
+
+static inline void adv_info_init(struct hci_dev *hdev)
+{
+       memset(&hdev->adv_instance, 0, sizeof(struct adv_info));
 }
 
 bool hci_discovery_active(struct hci_dev *hdev);
@@ -566,7 +612,6 @@ enum {
        HCI_CONN_SC_ENABLED,
        HCI_CONN_AES_CCM,
        HCI_CONN_POWER_SAVE,
-       HCI_CONN_REMOTE_OOB,
        HCI_CONN_FLUSH_KEY,
        HCI_CONN_ENCRYPT,
        HCI_CONN_AUTH,
@@ -582,14 +627,14 @@ enum {
 static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
 {
        struct hci_dev *hdev = conn->hdev;
-       return test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
+       return hci_dev_test_flag(hdev, HCI_SSP_ENABLED) &&
               test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
 }
 
 static inline bool hci_conn_sc_enabled(struct hci_conn *conn)
 {
        struct hci_dev *hdev = conn->hdev;
-       return test_bit(HCI_SC_ENABLED, &hdev->dev_flags) &&
+       return hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
               test_bit(HCI_CONN_SC_ENABLED, &conn->flags);
 }
 
@@ -772,7 +817,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn);
 int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
 int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type,
                      bool initiator);
-int hci_conn_change_link_key(struct hci_conn *conn);
 int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
 
 void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
@@ -920,8 +964,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
                                               bdaddr_t *addr, u8 addr_type);
 struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
                                            bdaddr_t *addr, u8 addr_type);
-int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
-                       u8 auto_connect);
 void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
 void hci_conn_params_clear_all(struct hci_dev *hdev);
 void hci_conn_params_clear_disabled(struct hci_dev *hdev);
@@ -930,8 +972,6 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
                                                  bdaddr_t *addr,
                                                  u8 addr_type);
 
-void hci_update_background_scan(struct hci_dev *hdev);
-
 void hci_uuids_clear(struct hci_dev *hdev);
 
 void hci_link_keys_clear(struct hci_dev *hdev);
@@ -956,6 +996,8 @@ struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
 void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type);
 void hci_smp_irks_clear(struct hci_dev *hdev);
 
+bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
+
 void hci_remote_oob_data_clear(struct hci_dev *hdev);
 struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
                                          bdaddr_t *bdaddr, u8 bdaddr_type);
@@ -968,7 +1010,6 @@ int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
 void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
 
 int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
-int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
 
 void hci_init_sysfs(struct hci_dev *hdev);
 void hci_conn_init_sysfs(struct hci_conn *conn);
@@ -1012,11 +1053,10 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 #define lmp_host_le_capable(dev)   (!!((dev)->features[1][0] & LMP_HOST_LE))
 #define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR))
 
-#define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
-                               !test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
-#define bredr_sc_enabled(dev) ((lmp_sc_capable(dev) || \
-                               test_bit(HCI_FORCE_SC, &(dev)->dbg_flags)) && \
-                              test_bit(HCI_SC_ENABLED, &(dev)->dev_flags))
+#define hdev_is_powered(dev)   (test_bit(HCI_UP, &(dev)->flags) && \
+                               !hci_dev_test_flag(dev, HCI_AUTO_OFF))
+#define bredr_sc_enabled(dev)  (lmp_sc_capable(dev) && \
+                               hci_dev_test_flag(dev, HCI_SC_ENABLED))
 
 /* ----- HCI protocols ----- */
 #define HCI_PROTO_DEFER             0x01
@@ -1038,28 +1078,6 @@ static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
        }
 }
 
-static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
-{
-       switch (conn->type) {
-       case ACL_LINK:
-       case LE_LINK:
-               l2cap_connect_cfm(conn, status);
-               break;
-
-       case SCO_LINK:
-       case ESCO_LINK:
-               sco_connect_cfm(conn, status);
-               break;
-
-       default:
-               BT_ERR("unknown link type %d", conn->type);
-               break;
-       }
-
-       if (conn->connect_cfm_cb)
-               conn->connect_cfm_cb(conn, status);
-}
-
 static inline int hci_proto_disconn_ind(struct hci_conn *conn)
 {
        if (conn->type != ACL_LINK && conn->type != LE_LINK)
@@ -1068,91 +1086,69 @@ static inline int hci_proto_disconn_ind(struct hci_conn *conn)
        return l2cap_disconn_ind(conn);
 }
 
-static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
-{
-       switch (conn->type) {
-       case ACL_LINK:
-       case LE_LINK:
-               l2cap_disconn_cfm(conn, reason);
-               break;
-
-       case SCO_LINK:
-       case ESCO_LINK:
-               sco_disconn_cfm(conn, reason);
-               break;
-
-       /* L2CAP would be handled for BREDR chan */
-       case AMP_LINK:
-               break;
+/* ----- HCI callbacks ----- */
+struct hci_cb {
+       struct list_head list;
 
-       default:
-               BT_ERR("unknown link type %d", conn->type);
-               break;
-       }
+       char *name;
 
-       if (conn->disconn_cfm_cb)
-               conn->disconn_cfm_cb(conn, reason);
-}
+       void (*connect_cfm)     (struct hci_conn *conn, __u8 status);
+       void (*disconn_cfm)     (struct hci_conn *conn, __u8 status);
+       void (*security_cfm)    (struct hci_conn *conn, __u8 status,
+                                                               __u8 encrypt);
+       void (*key_change_cfm)  (struct hci_conn *conn, __u8 status);
+       void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
+};
 
-static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
+static inline void hci_connect_cfm(struct hci_conn *conn, __u8 status)
 {
-       __u8 encrypt;
-
-       if (conn->type != ACL_LINK && conn->type != LE_LINK)
-               return;
-
-       if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
-               return;
+       struct hci_cb *cb;
 
-       encrypt = test_bit(HCI_CONN_ENCRYPT, &conn->flags) ? 0x01 : 0x00;
-       l2cap_security_cfm(conn, status, encrypt);
+       mutex_lock(&hci_cb_list_lock);
+       list_for_each_entry(cb, &hci_cb_list, list) {
+               if (cb->connect_cfm)
+                       cb->connect_cfm(conn, status);
+       }
+       mutex_unlock(&hci_cb_list_lock);
 
-       if (conn->security_cfm_cb)
-               conn->security_cfm_cb(conn, status);
+       if (conn->connect_cfm_cb)
+               conn->connect_cfm_cb(conn, status);
 }
 
-static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status,
-                                                               __u8 encrypt)
+static inline void hci_disconn_cfm(struct hci_conn *conn, __u8 reason)
 {
-       if (conn->type != ACL_LINK && conn->type != LE_LINK)
-               return;
+       struct hci_cb *cb;
 
-       l2cap_security_cfm(conn, status, encrypt);
+       mutex_lock(&hci_cb_list_lock);
+       list_for_each_entry(cb, &hci_cb_list, list) {
+               if (cb->disconn_cfm)
+                       cb->disconn_cfm(conn, reason);
+       }
+       mutex_unlock(&hci_cb_list_lock);
 
-       if (conn->security_cfm_cb)
-               conn->security_cfm_cb(conn, status);
+       if (conn->disconn_cfm_cb)
+               conn->disconn_cfm_cb(conn, reason);
 }
 
-/* ----- HCI callbacks ----- */
-struct hci_cb {
-       struct list_head list;
-
-       char *name;
-
-       void (*security_cfm)    (struct hci_conn *conn, __u8 status,
-                                                               __u8 encrypt);
-       void (*key_change_cfm)  (struct hci_conn *conn, __u8 status);
-       void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
-};
-
 static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
 {
        struct hci_cb *cb;
        __u8 encrypt;
 
-       hci_proto_auth_cfm(conn, status);
-
        if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
                return;
 
        encrypt = test_bit(HCI_CONN_ENCRYPT, &conn->flags) ? 0x01 : 0x00;
 
-       read_lock(&hci_cb_list_lock);
+       mutex_lock(&hci_cb_list_lock);
        list_for_each_entry(cb, &hci_cb_list, list) {
                if (cb->security_cfm)
                        cb->security_cfm(conn, status, encrypt);
        }
-       read_unlock(&hci_cb_list_lock);
+       mutex_unlock(&hci_cb_list_lock);
+
+       if (conn->security_cfm_cb)
+               conn->security_cfm_cb(conn, status);
 }
 
 static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
@@ -1166,26 +1162,27 @@ static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
        if (conn->pending_sec_level > conn->sec_level)
                conn->sec_level = conn->pending_sec_level;
 
-       hci_proto_encrypt_cfm(conn, status, encrypt);
-
-       read_lock(&hci_cb_list_lock);
+       mutex_lock(&hci_cb_list_lock);
        list_for_each_entry(cb, &hci_cb_list, list) {
                if (cb->security_cfm)
                        cb->security_cfm(conn, status, encrypt);
        }
-       read_unlock(&hci_cb_list_lock);
+       mutex_unlock(&hci_cb_list_lock);
+
+       if (conn->security_cfm_cb)
+               conn->security_cfm_cb(conn, status);
 }
 
 static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
 {
        struct hci_cb *cb;
 
-       read_lock(&hci_cb_list_lock);
+       mutex_lock(&hci_cb_list_lock);
        list_for_each_entry(cb, &hci_cb_list, list) {
                if (cb->key_change_cfm)
                        cb->key_change_cfm(conn, status);
        }
-       read_unlock(&hci_cb_list_lock);
+       mutex_unlock(&hci_cb_list_lock);
 }
 
 static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
@@ -1193,12 +1190,12 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
 {
        struct hci_cb *cb;
 
-       read_lock(&hci_cb_list_lock);
+       mutex_lock(&hci_cb_list_lock);
        list_for_each_entry(cb, &hci_cb_list, list) {
                if (cb->role_switch_cfm)
                        cb->role_switch_cfm(conn, status, role);
        }
-       read_unlock(&hci_cb_list_lock);
+       mutex_unlock(&hci_cb_list_lock);
 }
 
 static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
@@ -1284,30 +1281,6 @@ static inline int hci_check_conn_params(u16 min, u16 max, u16 latency,
 int hci_register_cb(struct hci_cb *hcb);
 int hci_unregister_cb(struct hci_cb *hcb);
 
-struct hci_request {
-       struct hci_dev          *hdev;
-       struct sk_buff_head     cmd_q;
-
-       /* If something goes wrong when building the HCI request, the error
-        * value is stored in this field.
-        */
-       int                     err;
-};
-
-void hci_req_init(struct hci_request *req, struct hci_dev *hdev);
-int hci_req_run(struct hci_request *req, hci_req_complete_t complete);
-void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
-                const void *param);
-void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
-                   const void *param, u8 event);
-void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status);
-bool hci_req_pending(struct hci_dev *hdev);
-
-void hci_req_add_le_scan_disable(struct hci_request *req);
-void hci_req_add_le_passive_scan(struct hci_request *req);
-
-void hci_update_page_scan(struct hci_dev *hdev, struct hci_request *req);
-
 struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
                               const void *param, u32 timeout);
 struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
@@ -1322,11 +1295,35 @@ void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
 
 /* ----- HCI Sockets ----- */
 void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
-void hci_send_to_control(struct sk_buff *skb, struct sock *skip_sk);
+void hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
+                        int flag, struct sock *skip_sk);
 void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb);
 
 void hci_sock_dev_event(struct hci_dev *hdev, int event);
 
+#define HCI_MGMT_VAR_LEN       BIT(0)
+#define HCI_MGMT_NO_HDEV       BIT(1)
+#define HCI_MGMT_UNTRUSTED     BIT(2)
+#define HCI_MGMT_UNCONFIGURED  BIT(3)
+
+struct hci_mgmt_handler {
+       int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
+                    u16 data_len);
+       size_t data_len;
+       unsigned long flags;
+};
+
+struct hci_mgmt_chan {
+       struct list_head list;
+       unsigned short channel;
+       size_t handler_count;
+       const struct hci_mgmt_handler *handlers;
+       void (*hdev_init) (struct sock *sk, struct hci_dev *hdev);
+};
+
+int hci_mgmt_chan_register(struct hci_mgmt_chan *c);
+void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c);
+
 /* Management interface */
 #define DISCOV_TYPE_BREDR              (BIT(BDADDR_BREDR))
 #define DISCOV_TYPE_LE                 (BIT(BDADDR_LE_PUBLIC) | \
@@ -1344,8 +1341,8 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event);
 #define DISCOV_INTERLEAVED_TIMEOUT     5120    /* msec */
 #define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04
 #define DISCOV_BREDR_INQUIRY_LEN       0x08
+#define DISCOV_LE_RESTART_DELAY                msecs_to_jiffies(200)   /* msec */
 
-int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
 int mgmt_new_settings(struct hci_dev *hdev);
 void mgmt_index_added(struct hci_dev *hdev);
 void mgmt_index_removed(struct hci_dev *hdev);
@@ -1388,13 +1385,9 @@ int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
 void mgmt_auth_failed(struct hci_conn *conn, u8 status);
 void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
 void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
-void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
 void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
                                    u8 status);
 void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
-void mgmt_read_local_oob_data_complete(struct hci_dev *hdev, u8 *hash192,
-                                      u8 *rand192, u8 *hash256, u8 *rand256,
-                                      u8 status);
 void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
                       u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
                       u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len);
@@ -1417,8 +1410,6 @@ u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency,
 void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand,
                                                        __u8 ltk[16]);
 
-int hci_update_random_address(struct hci_request *req, bool require_privacy,
-                             u8 *own_addr_type);
 void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
                               u8 *bdaddr_type);