bta_sys_conn.c revision 5738f83aeb59361a0a2eda2460113f6dc9194271
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
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    /* AV streaming need to be suspended before SCO is connected. */
353    if(bta_sys_cb.p_sco_cb)
354    {
355        /* without querying BTM_GetNumScoLinks() */
356        bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
357    }
358}
359
360/*******************************************************************************
361**
362** Function         bta_sys_sco_unuse
363**
364** Description      Called by BTA subsystems when sco connection for that service
365**                  is no longer needed.
366**
367** Returns          void
368**
369*******************************************************************************/
370void bta_sys_sco_unuse(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
371{
372    UINT8 num_sco_links;
373
374    if((bta_sys_cb.p_sco_cb))
375    {
376        num_sco_links = BTM_GetNumScoLinks();
377        bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
378    }
379}
380/*******************************************************************************
381**
382** Function         bta_sys_chg_ssr_config
383**
384** Description      Called by BTA subsystems to indicate that the given app SSR setting
385**                  need to be changed.
386**
387** Returns          void
388**
389*******************************************************************************/
390#if (BTM_SSR_INCLUDED == TRUE)
391void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 min_tout)
392{
393    if(bta_sys_cb.p_ssr_cb)
394    {
395        bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout);
396    }
397}
398#endif
399/*******************************************************************************
400**
401** Function         bta_sys_set_policy
402**
403** Description      Called by BTA subsystems to indicate that the given link
404**                  policy to peer device should be set
405**
406** Returns          void
407**
408*******************************************************************************/
409void bta_sys_set_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr)
410{
411    if(bta_sys_cb.p_policy_cb)
412    {
413        bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_SET, id, policy, peer_addr);
414    }
415}
416
417/*******************************************************************************
418**
419** Function         bta_sys_clear_policy
420**
421** Description      Called by BTA subsystems to indicate that the given link
422**                  policy to peer device should be clear
423**
424** Returns          void
425**
426*******************************************************************************/
427void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr)
428{
429    if(bta_sys_cb.p_policy_cb)
430    {
431        bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_CLR, id, policy, peer_addr);
432    }
433}
434
435/*******************************************************************************
436**
437** Function         bta_sys_set_default_policy
438**
439** Description      Called by BTA subsystems to indicate that the given default
440**                  link policy should be set
441**
442** Returns          void
443**
444*******************************************************************************/
445void bta_sys_set_default_policy (UINT8 id, UINT8 policy)
446{
447    if(bta_sys_cb.p_policy_cb)
448    {
449        bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_SET, id, policy, NULL);
450    }
451}
452
453/*******************************************************************************
454**
455** Function         bta_sys_clear_default_policy
456**
457** Description      Called by BTA subsystems to indicate that the given default
458**                  link policy should be clear
459**
460** Returns          void
461**
462*******************************************************************************/
463void bta_sys_clear_default_policy (UINT8 id, UINT8 policy)
464{
465    if(bta_sys_cb.p_policy_cb)
466    {
467        bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_CLR, id, policy, NULL);
468    }
469}
470
471/*******************************************************************************
472**
473** Function         bta_sys_idle
474**
475** Description      Called by BTA subsystems to indicate that the connection to
476**                  peer device is idle
477**
478** Returns          void
479**
480*******************************************************************************/
481void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
482{
483
484    if(bta_sys_cb.prm_cb)
485    {
486
487        bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
488
489    }
490
491    if(bta_sys_cb.ppm_cb)
492    {
493
494        bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
495    }
496}
497
498/*******************************************************************************
499**
500** Function         bta_sys_busy
501**
502** Description      Called by BTA subsystems to indicate that the connection to
503**                  peer device is busy
504**
505** Returns          void
506**
507*******************************************************************************/
508void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
509{
510    if(bta_sys_cb.prm_cb)
511    {
512
513        bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
514
515    }
516
517    if(bta_sys_cb.ppm_cb)
518    {
519
520        bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
521
522    }
523}
524
525#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
526/*******************************************************************************
527**
528** Function         bta_sys_eir_register
529**
530** Description      Called by BTA DM to register EIR utility function that can be
531**                  used by the other BTA modules to add/remove UUID.
532**
533** Returns          void
534**
535*******************************************************************************/
536void bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback)
537{
538    bta_sys_cb.eir_cb = p_cback;
539}
540
541/*******************************************************************************
542**
543** Function         bta_sys_add_uuid
544**
545** Description      Called by BTA subsystems to indicate to DM that new service
546**                  class UUID is added.
547**
548** Returns          void
549**
550*******************************************************************************/
551void bta_sys_add_uuid(UINT16 uuid16)
552{
553    if(bta_sys_cb.eir_cb)
554    {
555        bta_sys_cb.eir_cb(uuid16, TRUE );
556    }
557}
558
559/*******************************************************************************
560**
561** Function         bta_sys_remove_uuid
562**
563** Description      Called by BTA subsystems to indicate to DM that the service
564**                  class UUID is removed.
565**
566** Returns          void
567**
568*******************************************************************************/
569void bta_sys_remove_uuid(UINT16 uuid16)
570{
571    if(bta_sys_cb.eir_cb)
572    {
573        bta_sys_cb.eir_cb(uuid16, FALSE);
574    }
575}
576#endif
577
578