summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorSudha Bheemanna <b.sudha@samsung.com>2016-08-24 17:21:15 +0530
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-09-22 15:04:03 +0900
commit1d6f5dd804b3ba99d091a169c578dfa7d50b5cc5 (patch)
treef43290ebf4bd3bfb8604a42bc0a29b8c55afbf63 /include
parent7fef97bcc113485871077dd4356a96683d6bb7fe (diff)
downloadlinux-exynos-1d6f5dd804b3ba99d091a169c578dfa7d50b5cc5.tar.gz
linux-exynos-1d6f5dd804b3ba99d091a169c578dfa7d50b5cc5.tar.bz2
linux-exynos-1d6f5dd804b3ba99d091a169c578dfa7d50b5cc5.zip
Bluetooth: Add RSSI Monitor feature
Added feature support for monitoring the RSSI value. Commands and events for enabling, disabling and setting rssi threshold values are added. Change-Id: I850643a9228afc017e54217a11826b9c6a68a96b Signed-off-by: Sudha Bheemanna <b.sudha@samsung.com> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Diffstat (limited to 'include')
-rw-r--r--include/net/bluetooth/hci.h54
-rw-r--r--include/net/bluetooth/hci_core.h80
-rw-r--r--include/net/bluetooth/mgmt_tizen.h63
3 files changed, 197 insertions, 0 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 3ee3395b14fa..703f9dd04bf6 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -1468,6 +1468,60 @@ struct hci_rp_le_read_max_data_len {
__le16 rx_time;
} __packed;
+#ifdef TIZEN_BT
+/*
+ * Vendor Specific HCI Command
+ * Vendor: Broadcom
+ * Purpose: This HCI is used to enable RSSI monitoring and setting
+ * Threshold Values for LE Link
+ */
+#define HCI_OP_ENABLE_RSSI 0xfce9
+
+struct hci_cp_set_enable_rssi {
+ __u8 hci_le_ext_opcode;
+ __u8 le_enable_cs_Features;
+ __u8 data[3];
+} __packed;
+
+struct hci_cp_set_rssi_threshold {
+ __u8 hci_le_ext_opcode;
+ __u8 mode;
+ __le16 conn_handle;
+ __u8 alert_mask;
+ __u8 low_th;
+ __u8 in_range_th;
+ __u8 high_th;
+} __packed;
+
+struct hci_cc_rsp_enable_rssi {
+ __u8 status;
+ __u8 le_ext_opcode;
+} __packed;
+
+struct hci_ev_vendor_specific_rssi_alert {
+ __le16 conn_handle;
+ __s8 alert_type;
+ __s8 rssi_dbm;
+} __packed;
+
+/*
+ * Vendor Specific HCI Command
+ * Vendor: Broadcom
+ * Purpose: This HCI is used to get Raw RSSI value for a Link
+ */
+#define HCI_OP_GET_RAW_RSSI 0xfc48
+
+struct hci_cp_get_raw_rssi {
+ __le16 conn_handle;
+} __packed;
+
+struct hci_cc_rp_get_raw_rssi {
+ __u8 status;
+ __le16 conn_handle;
+ __s8 rssi_dbm;
+} __packed;
+#endif
+
/* ---- HCI Events ---- */
#define HCI_EV_INQUIRY_COMPLETE 0x01
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 2e03649b5af7..85ac015b0046 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -473,6 +473,9 @@ struct hci_conn {
void *sco_data;
struct amp_mgr *amp_mgr;
+#ifdef TIZEN_BT
+ bool rssi_monitored;
+#endif
struct hci_conn *link;
void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
@@ -796,6 +799,70 @@ static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
return NULL;
}
+#ifdef TIZEN_BT
+static inline bool hci_conn_rssi_state_set(struct hci_dev *hdev,
+ __u8 type, bdaddr_t *ba, bool value)
+{
+ struct hci_conn_hash *h = &hdev->conn_hash;
+ struct hci_conn *c;
+ __u8 conn_type;
+
+ if (type == 0x01)
+ conn_type = LE_LINK;
+ else
+ conn_type = ACL_LINK;
+
+ rcu_read_lock();
+
+ list_for_each_entry_rcu(c, &h->list, list) {
+ if (c->type == conn_type && !bacmp(&c->dst, ba)) {
+ c->rssi_monitored = value;
+ rcu_read_unlock();
+ return true;
+ }
+ }
+
+ rcu_read_unlock();
+ return false;
+}
+
+static inline void hci_conn_rssi_unset_all(struct hci_dev *hdev,
+ __u8 type)
+{
+ struct hci_conn_hash *h = &hdev->conn_hash;
+ struct hci_conn *c;
+ __u8 conn_type;
+
+ if (type == 0x01)
+ conn_type = LE_LINK;
+ else
+ conn_type = ACL_LINK;
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(c, &h->list, list) {
+ if (c->type == conn_type)
+ c->rssi_monitored = false;
+ }
+ rcu_read_unlock();
+}
+
+static inline int hci_conn_hash_lookup_rssi_count(struct hci_dev *hdev)
+{
+ struct hci_conn_hash *h = &hdev->conn_hash;
+ struct hci_conn *c;
+ int count = 0;
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(c, &h->list, list) {
+ if (c->rssi_monitored == true)
+ ++count;
+ }
+ rcu_read_unlock();
+
+ return count;
+}
+#endif
+
int hci_disconnect(struct hci_conn *conn, __u8 reason);
bool hci_setup_sync(struct hci_conn *conn, __u16 handle);
void hci_sco_setup(struct hci_conn *conn, __u8 status);
@@ -1416,6 +1483,19 @@ void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
void mgmt_reenable_advertising(struct hci_dev *hdev);
void mgmt_smp_complete(struct hci_conn *conn, bool complete);
+#ifdef TIZEN_BT
+void mgmt_rssi_enable_success(struct sock *sk, struct hci_dev *hdev,
+ void *data, struct hci_cc_rsp_enable_rssi *rp, int success);
+void mgmt_rssi_disable_success(struct sock *sk, struct hci_dev *hdev,
+ void *data, struct hci_cc_rsp_enable_rssi *rp, int success);
+int mgmt_set_rssi_threshold(struct sock *sk, struct hci_dev *hdev,
+ void *data, u16 len);
+void mgmt_rssi_alert_evt(struct hci_dev *hdev, struct sk_buff *skb);
+void mgmt_raw_rssi_response(struct hci_dev *hdev,
+ struct hci_cc_rp_get_raw_rssi *rp, int success);
+void mgmt_enable_rssi_cc(struct hci_dev *hdev, void *response, u8 status);
+#endif
+
u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency,
u16 to_multiplier);
void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand,
diff --git a/include/net/bluetooth/mgmt_tizen.h b/include/net/bluetooth/mgmt_tizen.h
index 6dc8e36eebda..46f652b069d3 100644
--- a/include/net/bluetooth/mgmt_tizen.h
+++ b/include/net/bluetooth/mgmt_tizen.h
@@ -63,4 +63,67 @@ struct mgmt_cp_remove_dev_from_white_list {
#define MGMT_OP_CLEAR_DEV_WHITE_LIST (TIZEN_OP_CODE_BASE + 0x06)
#define MGMT_OP_CLEAR_DEV_WHITE_LIST_SIZE 0
+/* For RSSI monitoring */
+#define MGMT_OP_SET_RSSI_ENABLE (TIZEN_OP_CODE_BASE + 0x07)
+#define MGMT_SET_RSSI_ENABLE_SIZE 10
+
+struct mgmt_cp_set_enable_rssi {
+ __s8 low_th;
+ __s8 in_range_th;
+ __s8 high_th;
+ bdaddr_t bdaddr;
+ __s8 link_type;
+} __packed;
+
+struct mgmt_cc_rsp_enable_rssi {
+ __u8 status;
+ __u8 le_ext_opcode;
+ bdaddr_t bt_address;
+ __s8 link_type;
+} __packed;
+
+#define MGMT_OP_GET_RAW_RSSI (TIZEN_OP_CODE_BASE + 0x08)
+#define MGMT_GET_RAW_RSSI_SIZE 7
+
+struct mgmt_cp_get_raw_rssi {
+ bdaddr_t bt_address;
+ __u8 link_type;
+} __packed;
+
+#define MGMT_OP_SET_RSSI_DISABLE (TIZEN_OP_CODE_BASE + 0x09)
+#define MGMT_SET_RSSI_DISABLE_SIZE 7
+struct mgmt_cp_disable_rssi {
+ bdaddr_t bdaddr;
+ __u8 link_type;
+} __packed;
+struct mgmt_cc_rp_disable_rssi {
+ __u8 status;
+ __u8 le_ext_opcode;
+ bdaddr_t bt_address;
+ __s8 link_type;
+} __packed;
+/* RSSI monitoring */
+
+/* For handling of RSSI Events */
+#define MGMT_EV_RSSI_ALERT (TIZEN_EV_BASE + 0x04)
+struct mgmt_ev_vendor_specific_rssi_alert {
+ bdaddr_t bdaddr;
+ __s8 link_type;
+ __s8 alert_type;
+ __s8 rssi_dbm;
+} __packed;
+
+#define MGMT_EV_RAW_RSSI (TIZEN_EV_BASE + 0x05)
+struct mgmt_cc_rp_get_raw_rssi {
+ __u8 status;
+ __s8 rssi_dbm;
+ __u8 link_type;
+ bdaddr_t bt_address;
+} __packed;
+
+#define MGMT_EV_RSSI_ENABLED (TIZEN_EV_BASE + 0x06)
+
+#define MGMT_EV_RSSI_DISABLED (TIZEN_EV_BASE + 0x07)
+/* Handling of RSSI Events */
+
#endif /* __MGMT_TIZEN_H */