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  *  This file contains compile-time configurable constants for the device
22  *  manager.
23  *
24  ******************************************************************************/
25 
26 #include <stddef.h>
27 #include "bt_target.h"
28 #include "bta_sys.h"
29 #include "bta_api.h"
30 #include "bta_dm_int.h"
31 #include "bta_jv_api.h"
32 
33 #ifndef BTA_DM_LINK_POLICY_SETTINGS
34 #define BTA_DM_LINK_POLICY_SETTINGS    (HCI_ENABLE_MASTER_SLAVE_SWITCH | HCI_ENABLE_HOLD_MODE | HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)
35 #endif
36 
37 /* page timeout in 625uS */
38 #ifndef BTA_DM_PAGE_TIMEOUT
39 #define BTA_DM_PAGE_TIMEOUT    8192
40 #endif
41 
42 /* link supervision timeout in 625uS (5 secs) */
43 #ifndef BTA_DM_LINK_TIMEOUT
44 #define BTA_DM_LINK_TIMEOUT    8000
45 #endif
46 
47 /* TRUE to avoid scatternet when av is streaming (be the master) */
48 #ifndef BTA_DM_AVOID_SCATTER_A2DP
49 #define BTA_DM_AVOID_SCATTER_A2DP    TRUE
50 #endif
51 
52 /* For Insight, PM cfg lookup tables are runtime configurable (to allow tweaking of params for power consumption measurements) */
53 #ifndef BTE_SIM_APP
54 #define tBTA_DM_PM_TYPE_QUALIFIER   const
55 #else
56 #define tBTA_DM_PM_TYPE_QUALIFIER
57 #endif
58 
59 
60 const tBTA_DM_CFG bta_dm_cfg =
61 {
62     /* mobile phone COD */
63     BTA_DM_COD,
64     /* link policy settings */
65     BTA_DM_LINK_POLICY_SETTINGS,
66     /* page timeout in 625uS */
67     BTA_DM_PAGE_TIMEOUT,
68     /* link supervision timeout in 625uS*/
69     BTA_DM_LINK_TIMEOUT,
70     /* TRUE to avoid scatternet when av is streaming (be the master) */
71     BTA_DM_AVOID_SCATTER_A2DP
72 };
73 
74 #ifndef BTA_DM_SCATTERNET
75 /* By default, allow partial scatternet */
76 #define BTA_DM_SCATTERNET BTA_DM_PARTIAL_SCATTERNET
77 #endif
78 
79 #ifndef BTA_HH_ROLE
80 /* By default, do not specify HH role (backward compatibility) */
81 #define BTA_HH_ROLE BTA_ANY_ROLE
82 #endif
83 
84 #ifndef BTA_AV_ROLE
85 /* By default, AV role (backward BTA_MASTER_ROLE_PREF) */
86 #define BTA_AV_ROLE BTA_MASTER_ROLE_PREF
87 #endif
88 
89 #ifndef BTA_PANU_ROLE
90 /* By default, AV role (backward BTA_MASTER_ROLE_PREF) */
91 #define BTA_PANU_ROLE BTA_SLAVE_ROLE_ONLY
92 #endif
93 #define BTA_DM_NUM_RM_ENTRY    6
94 
95 /* appids for PAN used by insight sample application
96    these have to be same as defined in btui_int.h */
97 #define BTUI_PAN_ID_PANU         0
98 #define BTUI_PAN_ID_NAP          1
99 #define BTUI_PAN_ID_GN           2
100 
101 /* First element is always for SYS:
102    app_id = # of entries table, cfg is
103    device scatternet support */
104 const tBTA_DM_RM bta_dm_rm_cfg[] =
105 {
106     {BTA_ID_SYS, BTA_DM_NUM_RM_ENTRY, BTA_DM_SCATTERNET},
107     {BTA_ID_PAN, BTUI_PAN_ID_NAP, BTA_ANY_ROLE},
108     {BTA_ID_PAN, BTUI_PAN_ID_GN, BTA_ANY_ROLE},
109     {BTA_ID_PAN, BTA_APP_ID_PAN_MULTI, BTA_MASTER_ROLE_ONLY},
110     {BTA_ID_PAN, BTUI_PAN_ID_PANU, BTA_PANU_ROLE},
111     {BTA_ID_HH,  BTA_ALL_APP_ID, BTA_HH_ROLE},
112     {BTA_ID_AV,  BTA_ALL_APP_ID, BTA_AV_ROLE}
113 };
114 
115 
116 tBTA_DM_CFG *p_bta_dm_cfg = (tBTA_DM_CFG *)&bta_dm_cfg;
117 
118 tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *)&bta_dm_rm_cfg;
119 
120 #if BLE_INCLUDED == TRUE
121 #  define BTA_DM_NUM_PM_ENTRY         23  /* number of entries in bta_dm_pm_cfg except the first */
122 #  define BTA_DM_NUM_PM_SPEC          15  /* number of entries in bta_dm_pm_spec */
123 #else
124 #  define BTA_DM_NUM_PM_ENTRY         21  /* number of entries in bta_dm_pm_cfg except the first */
125 #  define BTA_DM_NUM_PM_SPEC          13  /* number of entries in bta_dm_pm_spec */
126 #endif
127 
128 tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] =
129 {
130   {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0},  /* reserved: specifies length of this table. */
131   {BTA_ID_AG,  BTA_ALL_APP_ID,      0},  /* ag uses first spec table for app id 0 */
132   {BTA_ID_CT,  1,                   1},  /* ct (BTA_ID_CT,APP ID=1) spec table */
133   {BTA_ID_CG,  BTA_ALL_APP_ID,      1},  /* cg resue ct spec table */
134   {BTA_ID_DG,  BTA_ALL_APP_ID,      2},  /* dg spec table */
135   {BTA_ID_AV,  BTA_ALL_APP_ID,      4},  /* av spec table */
136   {BTA_ID_AVK, BTA_ALL_APP_ID,     12},  /* avk spec table */
137   {BTA_ID_FTC, BTA_ALL_APP_ID,      6},  /* ftc spec table */
138   {BTA_ID_FTS, BTA_ALL_APP_ID,      7},  /* fts spec table */
139   {BTA_ID_HD,  BTA_ALL_APP_ID,      3},  /* hd spec table */
140   {BTA_ID_HH,  BTA_ALL_APP_ID,      5},  /* hh spec table */
141   {BTA_ID_PBC, BTA_ALL_APP_ID,      2},  /* reuse dg spec table */
142   {BTA_ID_PBS, BTA_ALL_APP_ID,      7},  /* reuse fts spec table */
143   {BTA_ID_OPC, BTA_ALL_APP_ID,      6},  /* reuse ftc spec table */
144   {BTA_ID_OPS, BTA_ALL_APP_ID,      7},  /* reuse fts spec table */
145   {BTA_ID_MSE, BTA_ALL_APP_ID,      7},  /* reuse fts spec table */
146   {BTA_ID_JV,  BTA_JV_PM_ID_1,      6},  /* app BTA_JV_PM_ID_1, reuse ftc spec table */
147   {BTA_ID_JV,  BTA_ALL_APP_ID,      7},  /* reuse fts spec table */
148   {BTA_ID_HL,  BTA_ALL_APP_ID,      8},  /* reuse fts spec table */
149   {BTA_ID_PAN, BTUI_PAN_ID_PANU,    9},  /* PANU spec table */
150   {BTA_ID_PAN, BTUI_PAN_ID_NAP,    10},  /* NAP spec table */
151   {BTA_ID_HS,  BTA_ALL_APP_ID,     11}   /* HS spec table */
152 #if BLE_INCLUDED == TRUE
153   ,{BTA_ID_GATTC,  BTA_ALL_APP_ID,  13}  /* gattc spec table */
154   ,{BTA_ID_GATTS,  BTA_ALL_APP_ID,  14}  /* gatts spec table */
155 #endif
156 };
157 
158 tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] =
159 {
160   /* AG : 0 */
161  {
162   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                           /* allow park & sniff */
163 #if (BTM_SSR_INCLUDED == TRUE)
164   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
165 #endif
166   {
167       {{BTA_DM_PM_SNIFF_A2DP_IDX,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn open sniff  */
168       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn close  */
169       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app open */
170       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app close */
171       {{BTA_DM_PM_SNIFF_SCO_OPEN_IDX, 7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco open, active */
172       {{BTA_DM_PM_SNIFF_A2DP_IDX,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco close sniff  */
173       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* idle */
174       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
175       {{BTA_DM_PM_RETRY,  7000},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
176   }
177  },
178 
179   /* CT, CG : 1 */
180  {
181   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                           /* allow park & sniff */
182 #if (BTM_SSR_INCLUDED == TRUE)
183   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
184 #endif
185   {
186       {{BTA_DM_PM_PARK,   5000},  {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  park */
187       {{BTA_DM_PM_NO_PREF,   0},  {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
188       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
189       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
190       {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open sniff */
191       {{BTA_DM_PM_PARK,   5000},  {BTA_DM_PM_NO_ACTION, 0}},    /* sco close  park */
192       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
193       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
194       {{BTA_DM_PM_RETRY,  5000},  {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
195   }
196  },
197 
198   /* DG, PBC : 2 */
199  {
200   (BTA_DM_PM_ACTIVE),                                             /* no power saving mode allowed */
201 #if (BTM_SSR_INCLUDED == TRUE)
202   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
203 #endif
204   {
205       {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open active */
206       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
207       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
208       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
209       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
210       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
211       {{BTA_DM_PM_SNIFF,  1000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
212       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
213       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
214   }
215  },
216 
217    /* HD : 3 */
218  {
219   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                            /* allow park & sniff */
220 #if (BTM_SSR_INCLUDED == TRUE)
221   (BTA_DM_PM_SSR3),                                              /* the SSR entry */
222 #endif
223   {
224       {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */
225       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close */
226       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
227       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
228       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
229       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close */
230       {{BTA_DM_PM_SNIFF_HD_IDLE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}},   /* idle */
231       {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 0}, {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
232       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
233   }
234  },
235 
236    /* AV : 4 */
237  {
238   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
239 #if (BTM_SSR_INCLUDED == TRUE)
240   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
241 #endif
242   {
243       {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open  sniff */
244       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
245       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
246       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
247       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
248       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
249       {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
250       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
251       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
252   }
253  },
254 
255   /* HH : 5 */
256  {
257   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                            /* allow park & sniff */
258 #if (BTM_SSR_INCLUDED == TRUE)
259   (BTA_DM_PM_SSR1),                                              /* the SSR entry */
260 #endif
261   {
262       {{BTA_DM_PM_SNIFF_HH_OPEN_IDX, BTA_DM_PM_HH_OPEN_DELAY},{BTA_DM_PM_NO_ACTION, 0}}, /* conn open  sniff */
263       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
264       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
265       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
266       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
267       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close, used for HH suspend   */
268       {{BTA_DM_PM_SNIFF_HH_IDLE_IDX, BTA_DM_PM_HH_IDLE_DELAY},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
269       {{BTA_DM_PM_SNIFF_HH_ACTIVE_IDX, BTA_DM_PM_HH_ACTIVE_DELAY},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
270       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
271   }
272  },
273 
274   /* FTC, OPC, JV : 6 */
275  {
276   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
277 #if (BTM_SSR_INCLUDED == TRUE)
278   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
279 #endif
280   {
281       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
282       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
283       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
284       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
285       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
286       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
287       {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
288       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
289       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
290   }
291  },
292 
293   /* FTS, PBS, OPS, MSE, BTA_JV_PM_ID_1 : 7 */
294  {
295   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
296 #if (BTM_SSR_INCLUDED == TRUE)
297   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
298 #endif
299   {
300       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
301       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
302       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
303       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
304       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
305       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
306       {{BTA_DM_PM_SNIFF_A2DP_IDX, BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
307       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
308       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
309   }
310  },
311 
312    /* HL : 8 */
313  {
314   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
315 #if (BTM_SSR_INCLUDED == TRUE)
316   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
317 #endif
318   {
319       {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff  */
320       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn close  */
321       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app open */
322       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app close */
323       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco open, active */
324       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco close sniff  */
325       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* idle */
326       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
327       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
328   }
329  },
330 
331   /* PANU : 9 */
332  {
333   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
334 #if (BTM_SSR_INCLUDED == TRUE)
335   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
336 #endif
337   {
338       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
339       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
340       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
341       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
342       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
343       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
344       {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
345       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
346       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
347   }
348  },
349 
350   /* NAP : 10 */
351  {
352   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
353 #if (BTM_SSR_INCLUDED == TRUE)
354   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
355 #endif
356   {
357       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
358       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
359       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
360       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
361       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
362       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
363       {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
364       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
365 
366       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
367   }
368  },
369 
370   /* HS : 11 */
371  {
372   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                           /* allow park & sniff */
373 #if (BTM_SSR_INCLUDED == TRUE)
374   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
375 #endif
376   {
377       {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn open sniff  */
378       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn close  */
379       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app open */
380       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app close */
381       {{BTA_DM_PM_SNIFF3, 7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco open, active */
382       {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco close sniff  */
383       {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* idle */
384       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
385       {{BTA_DM_PM_RETRY,  7000},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
386   }
387  },
388 
389   /* AVK : 12 */
390  {
391   (BTA_DM_PM_SNIFF),                                             /* allow sniff */
392 #if (BTM_SSR_INCLUDED == TRUE)
393   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
394 #endif
395   {
396       {{BTA_DM_PM_SNIFF,  3000},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  sniff */
397       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
398       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
399       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
400       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
401       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
402       {{BTA_DM_PM_SNIFF4, 3000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
403       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
404       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
405   }
406  }
407 
408 #if BLE_INCLUDED == TRUE
409     /* GATTC : 13 */
410  ,{
411   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                           /* allow park & sniff */
412 #if (BTM_SSR_INCLUDED == TRUE)
413   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
414 #endif
415   {
416       {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open  active */
417       {{BTA_DM_PM_NO_PREF,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
418       {{BTA_DM_PM_ACTIVE,     0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
419       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
420       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
421       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
422       {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
423       {{BTA_DM_PM_ACTIVE,     0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
424 #if (AMP_INCLUDED == TRUE)
425       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},   /* amp */
426 #endif
427       {{BTA_DM_PM_RETRY,   5000},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
428   }
429  }
430     /* GATTS : 14 */
431  ,{
432   (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                           /* allow park & sniff */
433 #if (BTM_SSR_INCLUDED == TRUE)
434   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
435 #endif
436   {
437       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
438       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
439       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
440       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
441       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
442       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
443       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
444       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
445 #if (AMP_INCLUDED == TRUE)
446       {{BTA_DM_PM_NO_PREF, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* amp */
447 #endif
448       {{BTA_DM_PM_RETRY,  5000},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
449   }
450  }
451 
452 #endif
453 
454 #ifdef BTE_SIM_APP      /* For Insight builds only */
455  /* Entries at the end of the pm_spec table are user-defined (runtime configurable),
456     for power consumption experiments.
457     Insight finds the first user-defined entry by looking for the first BTA_DM_PM_NO_PREF.
458     The number of user_defined specs is defined by BTA_SWRAP_UD_PM_SPEC_COUNT */
459  ,
460  {BTA_DM_PM_NO_PREF},               /* pm_spec USER_DEFINED_0 */
461  {BTA_DM_PM_NO_PREF}                /* pm_spec USER_DEFINED_1 */
462 #endif  /* BTE_SIM_APP */
463 };
464 
465 /* Please refer to the SNIFF table definitions in bta_api.h.
466  *
467  * Adding to or Modifying the Table
468  * Additional sniff parameter entries can be added for BTA_DM_PM_SNIFF5 - BTA_DM_PM_SNIFF7.
469  * Overrides of additional table entries can be specified in bdroid_buildcfg.h.  If additional
470  * sniff parameter entries are added or an override of an existing entry is specified in
471  * bdroid_buildcfg.h then the BTA_DM_PM_*_IDX defines in bta_api.h will need to be match the new
472  * ordering.
473  *
474  * Table Ordering
475  * Sniff Table entries must be ordered from highest latency (biggest interval) to lowest latency.
476  * If there is a conflict among the connected services the setting with the lowest latency will
477  * be selected.
478  */
479 tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] =
480 {
481 /*
482  * More sniff parameter entries can be added for
483  * BTA_DM_PM_SNIFF3 - BTA_DM_PM_SNIFF7, if needed. When entries are added or
484  * removed, BTA_DM_PM_PARK_IDX needs to be updated to reflect the actual index
485  * BTA_DM_PM_PARK_IDX is defined in bta_api.h and can be override by the
486  * bdroid_buildcfg.h settings.
487  * The SNIFF table entries must be in the order from highest latency (biggest
488  * interval) to lowest latency. If there's a conflict among the connected
489  * services, the setting with lowest latency wins.
490  */
491 /* sniff modes: max interval, min interval, attempt, timeout */
492   {BTA_DM_PM_SNIFF_MAX, BTA_DM_PM_SNIFF_MIN, BTA_DM_PM_SNIFF_ATTEMPT, BTA_DM_PM_SNIFF_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF - A2DP */
493   {BTA_DM_PM_SNIFF1_MAX, BTA_DM_PM_SNIFF1_MIN, BTA_DM_PM_SNIFF1_ATTEMPT, BTA_DM_PM_SNIFF1_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF1 */
494   {BTA_DM_PM_SNIFF2_MAX, BTA_DM_PM_SNIFF2_MIN, BTA_DM_PM_SNIFF2_ATTEMPT, BTA_DM_PM_SNIFF2_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF2- HD idle */
495   {BTA_DM_PM_SNIFF3_MAX, BTA_DM_PM_SNIFF3_MIN, BTA_DM_PM_SNIFF3_ATTEMPT, BTA_DM_PM_SNIFF3_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF3- SCO open */
496   {BTA_DM_PM_SNIFF4_MAX, BTA_DM_PM_SNIFF4_MIN, BTA_DM_PM_SNIFF4_ATTEMPT, BTA_DM_PM_SNIFF4_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF4- HD active */
497   {BTA_DM_PM_SNIFF5_MAX, BTA_DM_PM_SNIFF5_MIN, BTA_DM_PM_SNIFF5_ATTEMPT, BTA_DM_PM_SNIFF5_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF5- HD active */
498   {BTA_DM_PM_PARK_MAX, BTA_DM_PM_PARK_MIN, BTA_DM_PM_PARK_ATTEMPT, BTA_DM_PM_PARK_TIMEOUT, BTM_PM_MD_PARK}
499 
500 #ifdef BTE_SIM_APP      /* For Insight builds only */
501   /* Entries at the end of the bta_dm_pm_md table are user-defined (runtime configurable),
502      for power consumption experiments.
503      Insight finds the first user-defined entry by looking for the first 'max=0'.
504      The number of user_defined specs is defined by BTA_SWRAP_UD_PM_DM_COUNT */
505   ,
506   {0},           /* CONN_OPEN/SCO_CLOSE power mode settings for pm_spec USER_DEFINED_0 */
507   {0},           /* SCO_OPEN power mode settings for pm_spec USER_DEFINED_0 */
508 
509   {0},           /* CONN_OPEN/SCO_CLOSE power mode settings for pm_spec USER_DEFINED_1 */
510   {0}            /* SCO_OPEN power mode settings for pm_spec USER_DEFINED_1 */
511 #endif  /* BTE_SIM_APP */
512 };
513 
514 /* 0=max_lat -> no SSR */
515 /* the smaller of the SSR max latency wins.
516  * the entries in this table must be from highest latency (biggest interval) to lowest latency */
517 #if (BTM_SSR_INCLUDED == TRUE)
518 tBTA_DM_SSR_SPEC bta_dm_ssr_spec[] =
519 {
520     /*max_lat, min_rmt_to, min_loc_to*/
521     {0,      0, 0},     /* BTA_DM_PM_SSR0 - do not use SSR */
522     {0,      0, 2},     /* BTA_DM_PM_SSR1 - HH, can NOT share entry with any other profile,
523                            seting default max latency and min remote timeout as 0,
524                            and always read individual device preference from HH module */
525     {1200,   2, 2},     /* BTA_DM_PM_SSR2 - others (as long as sniff is allowed)*/
526     {360,  160, 2}      /* BTA_DM_PM_SSR3 - HD */
527 };
528 
529 tBTA_DM_SSR_SPEC *p_bta_dm_ssr_spec = (tBTA_DM_SSR_SPEC *)&bta_dm_ssr_spec;
530 #endif
531 
532 tBTA_DM_PM_CFG *p_bta_dm_pm_cfg = (tBTA_DM_PM_CFG *)&bta_dm_pm_cfg;
533 tBTA_DM_PM_SPEC *p_bta_dm_pm_spec = (tBTA_DM_PM_SPEC *)&bta_dm_pm_spec;
534 tBTM_PM_PWR_MD *p_bta_dm_pm_md = (tBTM_PM_PWR_MD *)&bta_dm_pm_md;
535 
536 /* The performance impact of EIR packet size
537 **
538 ** When BTM_EIR_DEFAULT_FEC_REQUIRED is TRUE,
539 ** 1 to 17 bytes,    DM1 is used and most robust.
540 ** 18 to 121 bytes,  DM3 is used but impacts inquiry scan time with large number
541 **                    of devices.(almost double with 150 users)
542 ** 122 to 224 bytes, DM5 is used but cause quite big performance loss even with
543 **                    small number of users. so it is not recommended.
544 ** 225 to 240 bytes, DH5 is used without FEC but it not recommended.
545 **                    (same reason of DM5)
546 **
547 ** When BTM_EIR_DEFAULT_FEC_REQUIRED is FALSE,
548 ** 1 to 27 bytes,    DH1 is used but only robust at short range.
549 ** 28 to 183 bytes,  DH3 is used but only robust at short range and impacts inquiry
550 **                    scan time with large number of devices.
551 ** 184 to 240 bytes, DH5 is used but it not recommended.
552 */
553 
554 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
555                                             /* for example */
556 const UINT8 bta_dm_eir_uuid16_list[] = {    0x08, 0x11, /* Headset */
557                                             0x1E, 0x11, /* Handsfree */
558                                             0x0E, 0x11, /* AV Remote Control */
559                                             0x0B, 0x11, /* Audio Sink */
560 };
561 #endif  // BTA_EIR_CANNED_UUID_LIST
562 
563 /* Extended Inquiry Response */
564 const tBTA_DM_EIR_CONF bta_dm_eir_cfg =
565 {
566     50,    /* minimum length of local name when it is shortened */
567            /* if length of local name is longer than this and EIR has not enough */
568            /* room for all UUID list then local name is shortened to this length */
569 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
570     8,
571     (UINT8 *)bta_dm_eir_uuid16_list,
572 #else // BTA_EIR_CANNED_UUID_LIST
573     {   /* mask of UUID list in EIR */
574         0xFFFFFFFF, /* LSB is the first UUID of the first 32 UUIDs in BTM_EIR_UUID_LKUP_TBL */
575         0xFFFFFFFF  /* LSB is the first UUID of the next 32 UUIDs in BTM_EIR_UUID_LKUP_TBL */
576         /* BTM_EIR_UUID_LKUP_TBL can be overrided */
577     },
578 #endif  // BTA_EIR_CANNED_UUID_LIST
579     NULL,   /* Inquiry TX power         */
580     0,      /* length of flags in bytes */
581     NULL,   /* flags for EIR */
582     0,      /* length of manufacturer specific in bytes */
583     NULL,   /* manufacturer specific */
584     0,      /* length of additional data in bytes */
585     NULL    /* additional data */
586 };
587 tBTA_DM_EIR_CONF *p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF*)&bta_dm_eir_cfg;
588