bta_sys_conn.c revision b203d478f4835f5e35217874a1787e1914328f7c
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*******************************************************************************/
41void 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*******************************************************************************/
57void 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*******************************************************************************/
72void 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)
87void 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*******************************************************************************/
102void 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*******************************************************************************/
120void 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*******************************************************************************/
146void 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*******************************************************************************/
170void 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*******************************************************************************/
185void 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*******************************************************************************/
201void 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*******************************************************************************/
231void 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*******************************************************************************/
260void 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*******************************************************************************/
280void 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*******************************************************************************/
299void 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*******************************************************************************/
324void 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*******************************************************************************/
350void 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*******************************************************************************/
372void 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)
394void 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*******************************************************************************/
412void 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*******************************************************************************/
430void 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*******************************************************************************/
448void 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*******************************************************************************/
466void 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*******************************************************************************/
484void 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*******************************************************************************/
511void 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*******************************************************************************/
539void 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*******************************************************************************/
554void 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*******************************************************************************/
572void 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*******************************************************************************/
590BOOLEAN 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