1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "hci_cmd_failure_status_params.h"
17
18 #include "btstack.h"
19 #include "platform/include/list.h"
20
21 #include "hci/evt/hci_evt.h"
22 #include "hci/hci.h"
23 #include "hci/hci_def.h"
24
25 #include "hci_cmd_failure.h"
26
HciCmdOnReadFailedContactCounterFailed(uint8_t status,const void * param)27 static void HciCmdOnReadFailedContactCounterFailed(uint8_t status, const void *param)
28 {
29 HciReadFailedContactCounterReturnParam returnParam = {
30 .status = status,
31 .handle = ((HciReadFailedContactCounterReturnParam *)param)->handle,
32 };
33
34 HciEventCallbacks *callbacks = NULL;
35 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
36 if (callbacks->readFailedContactCounterComplete != NULL) {
37 callbacks->readFailedContactCounterComplete(&returnParam);
38 }
39 HCI_FOREACH_EVT_CALLBACKS_END;
40 }
41
HciCmdOnResetFailedContactCounterFailed(uint8_t status,const void * param)42 static void HciCmdOnResetFailedContactCounterFailed(uint8_t status, const void *param)
43 {
44 HciResetFailedContactCounterReturnParam returnParam = {
45 .status = status,
46 .handle = ((HciResetFailedContactCounterReturnParam *)param)->handle,
47 };
48
49 HciEventCallbacks *callbacks = NULL;
50 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
51 if (callbacks->resetFailedContactCounterComplete != NULL) {
52 callbacks->resetFailedContactCounterComplete(&returnParam);
53 }
54 HCI_FOREACH_EVT_CALLBACKS_END;
55 }
56
HciCmdOnReadLinkQualityFailed(uint8_t status,const void * param)57 static void HciCmdOnReadLinkQualityFailed(uint8_t status, const void *param)
58 {
59 HciReadLinkQualityReturnParam returnParam = {
60 .status = status,
61 .handle = ((HciReadLinkQualityReturnParam *)param)->handle,
62 };
63
64 HciEventCallbacks *callbacks = NULL;
65 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
66 if (callbacks->readLinkQualityComplete != NULL) {
67 callbacks->readLinkQualityComplete(&returnParam);
68 }
69 HCI_FOREACH_EVT_CALLBACKS_END;
70 }
71
HciCmdOnReadRssiFailed(uint8_t status,const void * param)72 static void HciCmdOnReadRssiFailed(uint8_t status, const void *param)
73 {
74 HciReadRssiReturnParam returnParam = {
75 .status = status,
76 .handle = ((HciReadRssiParam *)param)->handle,
77 };
78
79 HciEventCallbacks *callbacks = NULL;
80 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
81 if (callbacks->readRssiComplete != NULL) {
82 callbacks->readRssiComplete(&returnParam);
83 }
84 HCI_FOREACH_EVT_CALLBACKS_END;
85 }
86
HciCmdOnReadAfhChannelMapFailed(uint8_t status,const void * param)87 static void HciCmdOnReadAfhChannelMapFailed(uint8_t status, const void *param)
88 {
89 HciReadAfhChannelMapReturnParam returnParam = {
90 .status = status,
91 .connectionHandle = ((HciReadAfhChannelMapReturnParam *)param)->connectionHandle,
92 };
93
94 HciEventCallbacks *callbacks = NULL;
95 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
96 if (callbacks->readAfhChannelMapComplete != NULL) {
97 callbacks->readAfhChannelMapComplete(&returnParam);
98 }
99 HCI_FOREACH_EVT_CALLBACKS_END;
100 }
101
HciCmdOnReadClockFailed(uint8_t status,const void * param)102 static void HciCmdOnReadClockFailed(uint8_t status, const void *param)
103 {
104 HciReadClockReturnParam returnParam = {
105 .status = status,
106 .connectionHandle = ((HciReadClockReturnParam *)param)->connectionHandle,
107 };
108
109 HciEventCallbacks *callbacks = NULL;
110 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
111 if (callbacks->readClockComplete != NULL) {
112 callbacks->readClockComplete(&returnParam);
113 }
114 HCI_FOREACH_EVT_CALLBACKS_END;
115 }
116
HciCmdOnReadEncryptionKeySizeFailed(uint8_t status,const void * param)117 static void HciCmdOnReadEncryptionKeySizeFailed(uint8_t status, const void *param)
118 {
119 HciReadEncryptionKeySizeReturnParam returnParam = {
120 .status = status,
121 .connectionHandle = ((HciReadEncryptionKeySizeReturnParam *)param)->connectionHandle,
122 };
123
124 HciEventCallbacks *callbacks = NULL;
125 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
126 if (callbacks->readEncryptionKeySizeComplete != NULL) {
127 callbacks->readEncryptionKeySizeComplete(&returnParam);
128 }
129 HCI_FOREACH_EVT_CALLBACKS_END;
130 }
131
HciCmdOnReadLocalAmpInfoFailed(uint8_t status,const void * param)132 static void HciCmdOnReadLocalAmpInfoFailed(uint8_t status, const void *param)
133 {
134 HciReadLocalAMPInfoReturnParam returnParam = {
135 .status = status,
136 };
137
138 HciEventCallbacks *callbacks = NULL;
139 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
140 if (callbacks->readLocalAmpInfoComplete != NULL) {
141 callbacks->readLocalAmpInfoComplete(&returnParam);
142 }
143 HCI_FOREACH_EVT_CALLBACKS_END;
144 }
145
HciCmdOnReadLocalAmpAssocFailed(uint8_t status,const void * param)146 static void HciCmdOnReadLocalAmpAssocFailed(uint8_t status, const void *param)
147 {
148 HciReadLocalAmpAssocReturnParam returnParam = {
149 .status = status,
150 };
151
152 HciEventCallbacks *callbacks = NULL;
153 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
154 if (callbacks->readLocalAmpAssocComplete != NULL) {
155 callbacks->readLocalAmpAssocComplete(&returnParam);
156 }
157 HCI_FOREACH_EVT_CALLBACKS_END;
158 }
159
HciCmdOnWriteRemoteAmpAssocFailed(uint8_t status,const void * param)160 static void HciCmdOnWriteRemoteAmpAssocFailed(uint8_t status, const void *param)
161 {
162 HciWriteRemoteAmpAssocReturnParam returnParam = {
163 .status = status,
164 };
165
166 HciEventCallbacks *callbacks = NULL;
167 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
168 if (callbacks->writeRemoteAmpAssocComplete != NULL) {
169 callbacks->writeRemoteAmpAssocComplete(&returnParam);
170 }
171 HCI_FOREACH_EVT_CALLBACKS_END;
172 }
173
HciCmdOnSetTriggeredClockCaptureFailed(uint8_t status,const void * param)174 static void HciCmdOnSetTriggeredClockCaptureFailed(uint8_t status, const void *param)
175 {
176 HciSetTriggeredClockCaptureReturnParam returnParam = {
177 .status = status,
178 };
179
180 HciEventCallbacks *callbacks = NULL;
181 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
182 if (callbacks->setTriggeredClockCaptureComplete != NULL) {
183 callbacks->setTriggeredClockCaptureComplete(&returnParam);
184 }
185 HCI_FOREACH_EVT_CALLBACKS_END;
186 }
187
188 static HciCmdOnFailedFunc g_funcMap[] = {
189 NULL, // 0x0000
190 HciCmdOnReadFailedContactCounterFailed, // 0x0001
191 HciCmdOnResetFailedContactCounterFailed, // 0x0002
192 HciCmdOnReadLinkQualityFailed, // 0x0003
193 NULL, // 0x0004
194 HciCmdOnReadRssiFailed, // 0x0005
195 HciCmdOnReadAfhChannelMapFailed, // 0x0006
196 HciCmdOnReadClockFailed, // 0x0007
197 HciCmdOnReadEncryptionKeySizeFailed, // 0x0008
198 HciCmdOnReadLocalAmpInfoFailed, // 0x0009
199 HciCmdOnReadLocalAmpAssocFailed, // 0x000A
200 HciCmdOnWriteRemoteAmpAssocFailed, // 0x000B
201 NULL, // 0x000C
202 HciCmdOnSetTriggeredClockCaptureFailed, // 0x000D
203 };
204
205 #define STATUSPARAMETERS_OCF_MAX 0x000D
206
HciOnStatusParametersCmdFailed(uint16_t opCode,uint8_t status,const void * param)207 void HciOnStatusParametersCmdFailed(uint16_t opCode, uint8_t status, const void *param)
208 {
209 uint16_t ocf = GET_OCF(opCode);
210 if (ocf > STATUSPARAMETERS_OCF_MAX) {
211 return;
212 }
213
214 HciCmdOnFailedFunc func = g_funcMap[ocf];
215 if (func != NULL) {
216 func(status, param);
217 }
218 }