1 /******************************************************************************
2  *
3  *  Copyright (C) 2003-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  Routes connection status callbacks from various sub systems to DM
22  *
23  ******************************************************************************/
24 
25 #include <stddef.h>
26 #include "bta_api.h"
27 #include "bta_sys.h"
28 #include "bta_sys_int.h"
29 #include "gki.h"
30 #include "utl.h"
31 
32 /*******************************************************************************
33 **
34 ** Function         bta_sys_rm_register
35 **
36 ** Description      Called by BTA DM to register role management callbacks
37 **
38 **
39 ** Returns          void
40 **
41 *******************************************************************************/
bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback)42 void bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback)
43 {
44     bta_sys_cb.prm_cb = p_cback;
45 }
46 
47 
48 /*******************************************************************************
49 **
50 ** Function         bta_sys_policy_register
51 **
52 ** Description      Called by BTA DM to register link policy change callbacks
53 **
54 **
55 ** Returns          void
56 **
57 *******************************************************************************/
bta_sys_policy_register(tBTA_SYS_CONN_CBACK * p_cback)58 void bta_sys_policy_register(tBTA_SYS_CONN_CBACK * p_cback)
59 {
60     bta_sys_cb.p_policy_cb = p_cback;
61 }
62 
63 /*******************************************************************************
64 **
65 ** Function         bta_sys_role_chg_register
66 **
67 ** Description      Called by BTA AV to register role change callbacks
68 **
69 **
70 ** Returns          void
71 **
72 *******************************************************************************/
bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback)73 void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback)
74 {
75     bta_sys_cb.p_role_cb = p_cback;
76 }
77 /*******************************************************************************
78 **
79 ** Function         bta_sys_ssr_cfg_register
80 **
81 ** Description      Called by BTA DM to register SSR configuration callback
82 **
83 **
84 ** Returns          void
85 **
86 *******************************************************************************/
87 #if (BTM_SSR_INCLUDED == TRUE)
bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback)88 void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback)
89 {
90     bta_sys_cb.p_ssr_cb = p_cback;
91 }
92 #endif
93 /*******************************************************************************
94 **
95 ** Function         bta_sys_role_chg_register
96 **
97 ** Description      Called by BTA AV to register role change callbacks
98 **
99 **
100 ** Returns          void
101 **
102 *******************************************************************************/
bta_sys_notify_role_chg(BD_ADDR_PTR p_bda,UINT8 new_role,UINT8 hci_status)103 void bta_sys_notify_role_chg(BD_ADDR_PTR p_bda, UINT8 new_role, UINT8 hci_status)
104 {
105     if (bta_sys_cb.p_role_cb)
106     {
107         bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda);
108     }
109 }
110 
111 /*******************************************************************************
112 **
113 ** Function         bta_sys_collision_register
114 **
115 ** Description      Called by any BTA module to register for collision event.
116 **
117 **
118 ** Returns          void
119 **
120 *******************************************************************************/
bta_sys_collision_register(UINT8 bta_id,tBTA_SYS_CONN_CBACK * p_cback)121 void bta_sys_collision_register(UINT8 bta_id, tBTA_SYS_CONN_CBACK *p_cback)
122 {
123     UINT8 index;
124 
125     for (index = 0; index < MAX_COLLISION_REG; index++)
126     {
127         if ((bta_sys_cb.colli_reg.id[index] == bta_id) ||
128             (bta_sys_cb.colli_reg.id[index] == 0))
129         {
130             bta_sys_cb.colli_reg.id[index] = bta_id;
131             bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback;
132             return;
133         }
134     }
135 }
136 
137 /*******************************************************************************
138 **
139 ** Function         bta_sys_notify_collision
140 **
141 ** Description      Called by BTA DM to notify collision event.
142 **
143 **
144 ** Returns          void
145 **
146 *******************************************************************************/
bta_sys_notify_collision(BD_ADDR_PTR p_bda)147 void bta_sys_notify_collision (BD_ADDR_PTR p_bda)
148 {
149     UINT8 index;
150 
151     for (index = 0; index < MAX_COLLISION_REG; index++)
152     {
153         if ((bta_sys_cb.colli_reg.id[index] != 0) &&
154             (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL))
155         {
156             bta_sys_cb.colli_reg.p_coll_cback[index] (0, BTA_ID_SYS, 0, p_bda);
157         }
158     }
159 }
160 
161 /*******************************************************************************
162 **
163 ** Function         bta_sys_sco_register
164 **
165 ** Description      Called by BTA AV to register sco connection change callbacks
166 **
167 **
168 ** Returns          void
169 **
170 *******************************************************************************/
bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback)171 void bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback)
172 {
173     bta_sys_cb.p_sco_cb = p_cback;
174 }
175 
176 /*******************************************************************************
177 **
178 ** Function         bta_sys_pm_register
179 **
180 ** Description      Called by BTA DM to register power management callbacks
181 **
182 **
183 ** Returns          void
184 **
185 *******************************************************************************/
bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback)186 void bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback)
187 {
188     bta_sys_cb.ppm_cb = p_cback;
189 }
190 
191 /*******************************************************************************
192 **
193 ** Function         bta_sys_conn_open
194 **
195 ** Description      Called by BTA subsystems when a connection is made to
196 **                  the service
197 **
198 **
199 ** Returns          void
200 **
201 *******************************************************************************/
bta_sys_conn_open(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)202 void bta_sys_conn_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
203 {
204     if(bta_sys_cb.prm_cb)
205     {
206 
207         bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
208 
209     }
210 
211     if(bta_sys_cb.ppm_cb)
212     {
213 
214         bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
215 
216     }
217 }
218 
219 
220 
221 /*******************************************************************************
222 **
223 ** Function         bta_sys_conn_close
224 **
225 ** Description      Called by BTA subsystems when a connection to the service
226 **                  is closed
227 **
228 **
229 ** Returns          void
230 **
231 *******************************************************************************/
bta_sys_conn_close(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)232 void bta_sys_conn_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
233 {
234     if(bta_sys_cb.prm_cb)
235     {
236 
237         bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
238 
239     }
240 
241     if(bta_sys_cb.ppm_cb)
242     {
243 
244         bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
245 
246     }
247 }
248 
249 
250 /*******************************************************************************
251 **
252 ** Function         bta_sys_app_open
253 **
254 ** Description      Called by BTA subsystems when application initiates connection
255 **                  to a peer device
256 **
257 **
258 ** Returns          void
259 **
260 *******************************************************************************/
bta_sys_app_open(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)261 void bta_sys_app_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
262 {
263     if(bta_sys_cb.ppm_cb)
264     {
265         bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr);
266     }
267 }
268 
269 
270 
271 /*******************************************************************************
272 **
273 ** Function         bta_sys_app_close
274 **
275 ** Description      Called by BTA subsystems when application initiates close
276 **                  of connection to peer device
277 **
278 ** Returns          void
279 **
280 *******************************************************************************/
bta_sys_app_close(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)281 void bta_sys_app_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
282 {
283     if(bta_sys_cb.ppm_cb)
284     {
285         bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr);
286     }
287 }
288 
289 
290 /*******************************************************************************
291 **
292 ** Function         bta_sys_sco_open
293 **
294 ** Description      Called by BTA subsystems when sco connection for that service
295 **                  is open
296 **
297 ** Returns          void
298 **
299 *******************************************************************************/
bta_sys_sco_open(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)300 void bta_sys_sco_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
301 {
302     /* AG triggers p_sco_cb by bta_sys_sco_use. */
303     if((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb))
304     {
305         /* without querying BTM_GetNumScoLinks() */
306         bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
307     }
308 
309     if(bta_sys_cb.ppm_cb)
310     {
311         bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr);
312     }
313 }
314 
315 /*******************************************************************************
316 **
317 ** Function         bta_sys_sco_close
318 **
319 ** Description      Called by BTA subsystems when sco connection for that service
320 **                  is closed
321 **
322 ** Returns          void
323 **
324 *******************************************************************************/
bta_sys_sco_close(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)325 void bta_sys_sco_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
326 {
327     UINT8 num_sco_links;
328 
329     if((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb))
330     {
331         num_sco_links = BTM_GetNumScoLinks();
332         bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
333     }
334 
335     if(bta_sys_cb.ppm_cb)
336     {
337         bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr);
338     }
339 }
340 
341 /*******************************************************************************
342 **
343 ** Function         bta_sys_sco_use
344 **
345 ** Description      Called by BTA subsystems when that service needs to use sco.
346 **
347 **
348 ** Returns          void
349 **
350 *******************************************************************************/
bta_sys_sco_use(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)351 void bta_sys_sco_use(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
352 {
353     UNUSED(id);
354 
355     /* AV streaming need to be suspended before SCO is connected. */
356     if(bta_sys_cb.p_sco_cb)
357     {
358         /* without querying BTM_GetNumScoLinks() */
359         bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
360     }
361 }
362 
363 /*******************************************************************************
364 **
365 ** Function         bta_sys_sco_unuse
366 **
367 ** Description      Called by BTA subsystems when sco connection for that service
368 **                  is no longer needed.
369 **
370 ** Returns          void
371 **
372 *******************************************************************************/
bta_sys_sco_unuse(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)373 void bta_sys_sco_unuse(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
374 {
375     UINT8 num_sco_links;
376     UNUSED(id);
377 
378     if((bta_sys_cb.p_sco_cb))
379     {
380         num_sco_links = BTM_GetNumScoLinks();
381         bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
382     }
383 }
384 /*******************************************************************************
385 **
386 ** Function         bta_sys_chg_ssr_config
387 **
388 ** Description      Called by BTA subsystems to indicate that the given app SSR setting
389 **                  need to be changed.
390 **
391 ** Returns          void
392 **
393 *******************************************************************************/
394 #if (BTM_SSR_INCLUDED == TRUE)
bta_sys_chg_ssr_config(UINT8 id,UINT8 app_id,UINT16 max_latency,UINT16 min_tout)395 void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 min_tout)
396 {
397     if(bta_sys_cb.p_ssr_cb)
398     {
399         bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout);
400     }
401 }
402 #endif
403 /*******************************************************************************
404 **
405 ** Function         bta_sys_set_policy
406 **
407 ** Description      Called by BTA subsystems to indicate that the given link
408 **                  policy to peer device should be set
409 **
410 ** Returns          void
411 **
412 *******************************************************************************/
bta_sys_set_policy(UINT8 id,UINT8 policy,BD_ADDR peer_addr)413 void bta_sys_set_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr)
414 {
415     if(bta_sys_cb.p_policy_cb)
416     {
417         bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_SET, id, policy, peer_addr);
418     }
419 }
420 
421 /*******************************************************************************
422 **
423 ** Function         bta_sys_clear_policy
424 **
425 ** Description      Called by BTA subsystems to indicate that the given link
426 **                  policy to peer device should be clear
427 **
428 ** Returns          void
429 **
430 *******************************************************************************/
bta_sys_clear_policy(UINT8 id,UINT8 policy,BD_ADDR peer_addr)431 void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr)
432 {
433     if(bta_sys_cb.p_policy_cb)
434     {
435         bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_CLR, id, policy, peer_addr);
436     }
437 }
438 
439 /*******************************************************************************
440 **
441 ** Function         bta_sys_set_default_policy
442 **
443 ** Description      Called by BTA subsystems to indicate that the given default
444 **                  link policy should be set
445 **
446 ** Returns          void
447 **
448 *******************************************************************************/
bta_sys_set_default_policy(UINT8 id,UINT8 policy)449 void bta_sys_set_default_policy (UINT8 id, UINT8 policy)
450 {
451     if(bta_sys_cb.p_policy_cb)
452     {
453         bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_SET, id, policy, NULL);
454     }
455 }
456 
457 /*******************************************************************************
458 **
459 ** Function         bta_sys_clear_default_policy
460 **
461 ** Description      Called by BTA subsystems to indicate that the given default
462 **                  link policy should be clear
463 **
464 ** Returns          void
465 **
466 *******************************************************************************/
bta_sys_clear_default_policy(UINT8 id,UINT8 policy)467 void bta_sys_clear_default_policy (UINT8 id, UINT8 policy)
468 {
469     if(bta_sys_cb.p_policy_cb)
470     {
471         bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_CLR, id, policy, NULL);
472     }
473 }
474 
475 /*******************************************************************************
476 **
477 ** Function         bta_sys_idle
478 **
479 ** Description      Called by BTA subsystems to indicate that the connection to
480 **                  peer device is idle
481 **
482 ** Returns          void
483 **
484 *******************************************************************************/
bta_sys_idle(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)485 void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
486 {
487 
488     if(bta_sys_cb.prm_cb)
489     {
490 
491         bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
492 
493     }
494 
495     if(bta_sys_cb.ppm_cb)
496     {
497 
498         bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
499     }
500 }
501 
502 /*******************************************************************************
503 **
504 ** Function         bta_sys_busy
505 **
506 ** Description      Called by BTA subsystems to indicate that the connection to
507 **                  peer device is busy
508 **
509 ** Returns          void
510 **
511 *******************************************************************************/
bta_sys_busy(UINT8 id,UINT8 app_id,BD_ADDR peer_addr)512 void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
513 {
514     if(bta_sys_cb.prm_cb)
515     {
516 
517         bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
518 
519     }
520 
521     if(bta_sys_cb.ppm_cb)
522     {
523 
524         bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
525 
526     }
527 }
528 
529 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
530 /*******************************************************************************
531 **
532 ** Function         bta_sys_eir_register
533 **
534 ** Description      Called by BTA DM to register EIR utility function that can be
535 **                  used by the other BTA modules to add/remove UUID.
536 **
537 ** Returns          void
538 **
539 *******************************************************************************/
bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback)540 void bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback)
541 {
542     bta_sys_cb.eir_cb = p_cback;
543 }
544 
545 /*******************************************************************************
546 **
547 ** Function         bta_sys_add_uuid
548 **
549 ** Description      Called by BTA subsystems to indicate to DM that new service
550 **                  class UUID is added.
551 **
552 ** Returns          void
553 **
554 *******************************************************************************/
bta_sys_add_uuid(UINT16 uuid16)555 void bta_sys_add_uuid(UINT16 uuid16)
556 {
557     if(bta_sys_cb.eir_cb)
558     {
559         bta_sys_cb.eir_cb(uuid16, TRUE );
560     }
561 }
562 
563 /*******************************************************************************
564 **
565 ** Function         bta_sys_remove_uuid
566 **
567 ** Description      Called by BTA subsystems to indicate to DM that the service
568 **                  class UUID is removed.
569 **
570 ** Returns          void
571 **
572 *******************************************************************************/
bta_sys_remove_uuid(UINT16 uuid16)573 void bta_sys_remove_uuid(UINT16 uuid16)
574 {
575     if(bta_sys_cb.eir_cb)
576     {
577         bta_sys_cb.eir_cb(uuid16, FALSE);
578     }
579 }
580 #endif
581 
582 /*******************************************************************************
583 **
584 ** Function         bta_sys_vs_hdl
585 **
586 ** Description      Called by BTA subsystems to execute a VS event handler function
587 **
588 ** Returns          void
589 **
590 *******************************************************************************/
bta_sys_vs_hdl(UINT16 evt,void * p)591 BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p)
592 {
593     if (bta_sys_cb.p_vs_evt_hdlr)
594         return (*bta_sys_cb.p_vs_evt_hdlr)(evt, p);
595 
596     return FALSE;
597 }
598 
599