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