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