Allow simultaneous LE Observe and BTM Inquiry/Scan
This patch allows BTM inquiry and LE observe to be launched
and overlap each others' occurance by redirecting results
and handling states accordingly.
CRs-Fixed: 579505
Conflicts:
stack/btm/btm_ble_gap.c
bug 12939764
Change-Id: Ifde73f17f8d40e9ebfff3b49e409591189574ee0
diff --git a/stack/btm/btm_inq.c b/stack/btm/btm_inq.c
index 4c5eecb..24f91a8 100644
--- a/stack/btm/btm_inq.c
+++ b/stack/btm/btm_inq.c
@@ -810,8 +810,8 @@
*/
#endif
- p_inq->inq_counter++;
- btm_clr_inq_result_flt();
+ p_inq->inq_counter++;
+ btm_clr_inq_result_flt();
}
return (status);
@@ -860,7 +860,27 @@
/* Only one active inquiry is allowed in this implementation.
Also do not allow an inquiry if the inquiry filter is being updated */
if (p_inq->inq_active || p_inq->inqfilt_active)
- return (BTM_BUSY);
+ {
+#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
+ /*check if LE observe is already running*/
+ if(p_inq->scan_type==INQ_LE_OBSERVE && p_inq->p_inq_ble_results_cb!=NULL)
+ {
+ BTM_TRACE_API0("BTM_StartInquiry: LE observe in progress");
+ p_inq->scan_type = INQ_GENERAL;
+ p_inq->inq_active = BTM_INQUIRY_INACTIVE;
+ btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
+ btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
+ btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
+ }
+ else
+#endif
+ {
+ return (BTM_BUSY);
+ BTM_TRACE_API0("BTM_StartInquiry: return BUSY");
+ }
+ }
+ else
+ p_inq->scan_type = INQ_GENERAL;
/*** Make sure the device is ready ***/
if (!BTM_IsDeviceUp())
@@ -2402,7 +2422,13 @@
p_inq->inqparms.mode &= ~(mode);
#endif
-
+ if(p_inq->scan_type == INQ_LE_OBSERVE && !p_inq->inq_active)
+ {
+ /*end of LE observe*/
+ p_inq->p_inq_ble_results_cb = (tBTM_INQ_RESULTS_CB *) NULL;
+ p_inq->p_inq_ble_cmpl_cb = (tBTM_CMPL_CB *) NULL;
+ p_inq->scan_type=INQ_NONE;
+ }
#if (BTM_INQ_DEBUG == TRUE)
@@ -2473,9 +2499,22 @@
p_inq->inq_active = BTM_INQUIRY_INACTIVE;
/* call the inquiry again */
BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb);
+ return;
}
#endif
}
+ if(p_inq->inqparms.mode == 0 && p_inq->scan_type == INQ_GENERAL)//this inquiry is complete
+ {
+ p_inq->scan_type = INQ_NONE;
+#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
+ /* check if the LE observe is pending */
+ if(p_inq->p_inq_ble_results_cb != NULL)
+ {
+ BTM_TRACE_DEBUG0("BTM Inq Compl: resuming a pending LE scan");
+ BTM_BleObserve(1,0, p_inq->p_inq_ble_results_cb, p_inq->p_inq_ble_cmpl_cb);
+ }
+#endif
+ }
#if (BTM_INQ_DEBUG == TRUE)
BTM_TRACE_DEBUG3 ("inq_active:0x%x state:%d inqfilt_active:%d",
btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);