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 "bt_common.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*******************************************************************************/
42void 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*******************************************************************************/
58void 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*******************************************************************************/
73void 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)
88void 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*******************************************************************************/
103void 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*******************************************************************************/
121void 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*******************************************************************************/
147void 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*******************************************************************************/
171void 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*******************************************************************************/
186void 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*******************************************************************************/
202void 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*******************************************************************************/
232void 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*******************************************************************************/
261void 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*******************************************************************************/
281void 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*******************************************************************************/
300void 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*******************************************************************************/
325void 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*******************************************************************************/
351void 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*******************************************************************************/
373void 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)
395void 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*******************************************************************************/
413void 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*******************************************************************************/
431void 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*******************************************************************************/
449void 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*******************************************************************************/
467void 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*******************************************************************************/
485void 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*******************************************************************************/
512void 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*******************************************************************************/
540void 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*******************************************************************************/
555void 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*******************************************************************************/
573void 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