• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2009-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 is the implementation file for the MCAP Data Channel Action
22  *  Functions.
23  *
24  ******************************************************************************/
25 #include "bt_target.h"
26 #include "bt_utils.h"
27 #include "gki.h"
28 #include "mca_api.h"
29 #include "mca_int.h"
30 
31 /*******************************************************************************
32 **
33 ** Function         mca_dcb_report_cong
34 **
35 ** Description      This function is called to report the congestion flag.
36 **
37 ** Returns          void.
38 **
39 *******************************************************************************/
mca_dcb_report_cong(tMCA_DCB * p_dcb)40 void mca_dcb_report_cong (tMCA_DCB *p_dcb)
41 {
42     tMCA_CTRL   evt_data;
43 
44     evt_data.cong_chg.cong   = p_dcb->cong;
45     evt_data.cong_chg.mdl    = mca_dcb_to_hdl(p_dcb);
46     evt_data.cong_chg.mdl_id = p_dcb->mdl_id;
47     mca_ccb_report_event (p_dcb->p_ccb, MCA_CONG_CHG_EVT, &evt_data);
48 }
49 
50 /*******************************************************************************
51 **
52 ** Function         mca_dcb_tc_open
53 **
54 ** Description      This function is called to report MCA_OPEN_IND_EVT or
55 **                  MCA_OPEN_CFM_EVT event.
56 **                  It also clears the congestion flag (dcb.cong).
57 **
58 ** Returns          void.
59 **
60 *******************************************************************************/
mca_dcb_tc_open(tMCA_DCB * p_dcb,tMCA_DCB_EVT * p_data)61 void mca_dcb_tc_open (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
62 {
63     tMCA_CTRL   evt_data;
64     tMCA_CCB    *p_ccb = p_dcb->p_ccb;
65     UINT8       event = MCA_OPEN_IND_EVT;
66 
67     if (p_data->open.param == MCA_INT)
68         event = MCA_OPEN_CFM_EVT;
69     p_dcb->cong  = FALSE;
70     evt_data.open_cfm.mtu       = p_data->open.peer_mtu;
71     evt_data.open_cfm.mdl_id    = p_dcb->mdl_id;
72     evt_data.open_cfm.mdl       = mca_dcb_to_hdl(p_dcb);
73     mca_ccb_event (p_ccb, MCA_CCB_DL_OPEN_EVT, NULL);
74     mca_ccb_report_event (p_ccb, event, &evt_data);
75 }
76 
77 /*******************************************************************************
78 **
79 ** Function         mca_dcb_cong
80 **
81 ** Description      This function sets the congestion state for the DCB.
82 **
83 ** Returns          void.
84 **
85 *******************************************************************************/
mca_dcb_cong(tMCA_DCB * p_dcb,tMCA_DCB_EVT * p_data)86 void mca_dcb_cong (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
87 {
88     p_dcb->cong  = p_data->llcong;
89     mca_dcb_report_cong(p_dcb);
90 }
91 
92 /*******************************************************************************
93 **
94 ** Function         mca_dcb_free_data
95 **
96 ** Description      This function frees the received message.
97 **
98 ** Returns          void.
99 **
100 *******************************************************************************/
mca_dcb_free_data(tMCA_DCB * p_dcb,tMCA_DCB_EVT * p_data)101 void mca_dcb_free_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
102 {
103     UNUSED(p_dcb);
104 
105     GKI_freebuf (p_data);
106 }
107 
108 /*******************************************************************************
109 **
110 ** Function         mca_dcb_do_disconn
111 **
112 ** Description      This function closes a data channel.
113 **
114 ** Returns          void.
115 **
116 *******************************************************************************/
mca_dcb_do_disconn(tMCA_DCB * p_dcb,tMCA_DCB_EVT * p_data)117 void mca_dcb_do_disconn (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
118 {
119     tMCA_CLOSE  close;
120     UNUSED(p_data);
121 
122     if ((p_dcb->lcid == 0) || (L2CA_DisconnectReq(p_dcb->lcid) == FALSE))
123     {
124         close.param  = MCA_INT;
125         close.reason = L2CAP_DISC_OK;
126         close.lcid   = 0;
127         mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, (tMCA_DCB_EVT *) &close);
128     }
129 }
130 
131 /*******************************************************************************
132 **
133 ** Function         mca_dcb_snd_data
134 **
135 ** Description      This function sends the data from application to the peer device.
136 **
137 ** Returns          void.
138 **
139 *******************************************************************************/
mca_dcb_snd_data(tMCA_DCB * p_dcb,tMCA_DCB_EVT * p_data)140 void mca_dcb_snd_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
141 {
142     UINT8   status;
143 
144     /* do not need to check cong, because API already checked the status */
145     status = L2CA_DataWrite (p_dcb->lcid, p_data->p_pkt);
146     if (status == L2CAP_DW_CONGESTED)
147     {
148         p_dcb->cong = TRUE;
149         mca_dcb_report_cong(p_dcb);
150     }
151 }
152 
153 /*******************************************************************************
154 **
155 ** Function         mca_dcb_hdl_data
156 **
157 ** Description      This function reports the received data through the data
158 **                  callback function.
159 **
160 ** Returns          void.
161 **
162 *******************************************************************************/
mca_dcb_hdl_data(tMCA_DCB * p_dcb,tMCA_DCB_EVT * p_data)163 void mca_dcb_hdl_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
164 {
165     (*p_dcb->p_cs->p_data_cback) (mca_dcb_to_hdl(p_dcb), (BT_HDR *)p_data);
166 }
167 
168