GSList *discovery_found; /* list of found devices */
guint discovery_idle_timeout; /* timeout between discovery runs */
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ guint le_discovery_idle_timeout; /* timeout between le discovery runs */
+#endif
guint passive_scan_timeout; /* timeout between passive scans */
guint temp_devices_timeout; /* timeout for temporary devices */
}
#endif
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+static gboolean start_le_discovery_timeout(gpointer user_data)
+{
+ struct btd_adapter *adapter = user_data;
+ uint8_t new_type;
+
+ DBG("");
+
+ adapter->discovery_idle_timeout = 0;
+
+ new_type = SCAN_TYPE_LE;
+
+ if (adapter->discovery_enable == 0x01) {
+ /*
+ * If there is an already running discovery and it has the
+ * same type, then just keep it.
+ */
+
+ if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
+ if (adapter->le_discovering)
+ return FALSE;
+
+ adapter->le_discovering = true;
+ g_dbus_emit_property_changed(dbus_conn, adapter->path,
+ ADAPTER_INTERFACE, "LEDiscovering");
+
+ return FALSE;
+ }
+ }
+
+ struct mgmt_cp_start_discovery cp;
+
+ cp.type = new_type;
+ mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
+ adapter->dev_id, sizeof(cp), &cp,
+ start_le_discovery_complete, adapter, NULL);
+
+ return FALSE;
+}
+#endif
+
static gboolean start_discovery_timeout(gpointer user_data)
{
struct btd_adapter *adapter = user_data;
adapter->discovery_idle_timeout = 0;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
- if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY)
- new_type = SCAN_TYPE_BREDR;
- else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY)
- new_type = SCAN_TYPE_LE;
- else if (adapter->disc_type == BT_DISC_TYPE_LE_BREDR)
- new_type = SCAN_TYPE_DUAL;
- else
- new_type = 0;
+ new_type = SCAN_TYPE_BREDR;
if (adapter->discovery_enable == 0x01) {
/*
* If there is an already running discovery and it has the
* same type, then just keep it.
*/
- if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
- if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
- if (adapter->discovering)
- return FALSE;
-
- adapter->discovering = true;
- g_dbus_emit_property_changed(dbus_conn, adapter->path,
- ADAPTER_INTERFACE, "Discovering");
-
+ if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
+ if (adapter->discovering)
return FALSE;
- }
-
- } else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
- if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
- if (adapter->le_discovering)
- return FALSE;
- adapter->le_discovering = true;
- g_dbus_emit_property_changed(dbus_conn, adapter->path,
- ADAPTER_INTERFACE, "LEDiscovering");
+ adapter->discovering = true;
+ g_dbus_emit_property_changed(dbus_conn, adapter->path,
+ ADAPTER_INTERFACE, "Discovering");
- return FALSE;
- }
+ return FALSE;
}
}
- DBG("adapter->disc_type [%d]", adapter->disc_type);
struct mgmt_cp_start_discovery cp;
- if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
- cp.type = new_type;
- mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
- adapter->dev_id, sizeof(cp), &cp,
- start_discovery_complete, adapter, NULL);
+ cp.type = new_type;
+ mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
+ adapter->dev_id, sizeof(cp), &cp,
+ start_discovery_complete, adapter, NULL);
- } else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
- cp.type = new_type;
- mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
- adapter->dev_id, sizeof(cp), &cp,
- start_le_discovery_complete, adapter, NULL);
- }
#else
/* If we're doing filtered discovery, it must be quickly restarted */
adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
return FALSE;
}
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+static void trigger_start_le_discovery(struct btd_adapter *adapter, guint delay)
+{
+
+ DBG("");
+
+ cancel_passive_scanning(adapter);
+
+ if (adapter->le_discovery_idle_timeout > 0) {
+ g_source_remove(adapter->le_discovery_idle_timeout);
+ adapter->le_discovery_idle_timeout = 0;
+ }
+
+ /*
+ * If the controller got powered down in between, then ensure
+ * that we do not keep trying to restart discovery.
+ *
+ * This is safe-guard and should actually never trigger.
+ */
+ if (!(adapter->current_settings & MGMT_SETTING_POWERED))
+ return;
+
+ adapter->le_discovery_idle_timeout = g_timeout_add_seconds(delay,
+ start_le_discovery_timeout, adapter);
+}
+#endif
+
static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
{
if (adapter->discovery_list)
return;
-#ifdef __TIZEN_PATCH__
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
#else
adapter->discovery_type = 0x00;
* discovery in idle phase exists, it will be restarted right
* away.
*/
- trigger_start_discovery(adapter, 0);
+ trigger_start_le_discovery(adapter, 0);
return dbus_message_new_method_return(msg);
}