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 *******************************************************************************/ 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 *******************************************************************************/ 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 *******************************************************************************/ 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 *******************************************************************************/ 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 *******************************************************************************/ 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 *******************************************************************************/ 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 *******************************************************************************/ 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