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 "usbfn_cfg_mgr.h"
17
18 #include <device_resource_if.h>
19 #include <hcs_tree_if.h>
20 #include <hdf_base.h>
21 #include <hdf_log.h>
22 #include <osal_mem.h>
23 #include <osal_thread.h>
24 #include <securec.h>
25
26 #include "adapter_if.h"
27 #include "usbfn_dev_mgr.h"
28
29 #define HDF_LOG_TAG usbfn_cfg
30 static struct DListHead g_cfgEntry = {0};
31
UsbFnCfgMgrParseDevDesc(const struct DeviceResourceNode * devDescNode,struct DeviceResourceIface * drsOps,struct UsbDeviceDescriptor * devDesc)32 static uint32_t UsbFnCfgMgrParseDevDesc(const struct DeviceResourceNode *devDescNode,
33 struct DeviceResourceIface *drsOps, struct UsbDeviceDescriptor *devDesc)
34 {
35 uint16_t value;
36
37 if (drsOps->GetUint8(devDescNode, DESC_LENGTH, &devDesc->bLength, 0) != HDF_SUCCESS) {
38 HDF_LOGE("%{public}s: read length fail", __func__);
39 return HDF_FAILURE;
40 }
41 if (devDesc->bLength != sizeof(struct UsbDeviceDescriptor)) {
42 HDF_LOGE("%{public}s: dev desc length is not ringht", __func__);
43 return HDF_FAILURE;
44 }
45 if (drsOps->GetUint8(devDescNode, DESC_TYPE, &devDesc->bDescriptorType, 0) != HDF_SUCCESS ||
46 drsOps->GetUint8(devDescNode, USBDEV_CLASS, &devDesc->bDeviceClass, 0) != HDF_SUCCESS ||
47 drsOps->GetUint8(devDescNode, USBDEV_SUBCLASS, &devDesc->bDeviceSubClass, 0) != HDF_SUCCESS ||
48 drsOps->GetUint8(devDescNode, USBDEV_PROTOCOL, &devDesc->bDeviceProtocol, 0) != HDF_SUCCESS ||
49 drsOps->GetUint8(devDescNode, USBDEV_MAXSIZE, &devDesc->bMaxPacketSize0, 0) != HDF_SUCCESS ||
50 drsOps->GetUint8(devDescNode, USBDEV_MANUFACTURER, &devDesc->iManufacturer, 0) != HDF_SUCCESS ||
51 drsOps->GetUint8(devDescNode, USBDEV_PRODUCT, &devDesc->iProduct, 0) != HDF_SUCCESS ||
52 drsOps->GetUint8(devDescNode, USBDEV_SERIALNUM, &devDesc->iSerialNumber, 0) != HDF_SUCCESS ||
53 drsOps->GetUint8(devDescNode, USBDEV_NUMCFG, &devDesc->bNumConfigurations, 0) != HDF_SUCCESS) {
54 HDF_LOGE("%{public}s: read fail", __func__);
55 return HDF_FAILURE;
56 }
57 if (devDesc->bDescriptorType != USB_DDK_DT_DEVICE) {
58 HDF_LOGE("%{public}s: dev desc length is not ringht", __func__);
59 return HDF_FAILURE;
60 }
61 if (drsOps->GetUint16(devDescNode, USBDEV_BCD, &value, 0) != HDF_SUCCESS) {
62 HDF_LOGE("%{public}s: read bcdUSB fail", __func__);
63 return HDF_FAILURE;
64 }
65 devDesc->bcdUSB = LE16_TO_CPU(value);
66 if (drsOps->GetUint16(devDescNode, USBDEV_VENDOR, &value, 0) != HDF_SUCCESS) {
67 HDF_LOGE("%{public}s: read idVendor fail", __func__);
68 return HDF_FAILURE;
69 }
70 devDesc->idVendor = LE16_TO_CPU(value);
71 if (drsOps->GetUint16(devDescNode, USBDEV_IDPRODUCT, &value, 0) != HDF_SUCCESS) {
72 HDF_LOGE("%{public}s: read idProduct fail", __func__);
73 return HDF_FAILURE;
74 }
75 devDesc->idProduct = LE16_TO_CPU(value);
76 if (drsOps->GetUint16(devDescNode, USBDEV_BCDDEVICE, &value, 0) != HDF_SUCCESS) {
77 HDF_LOGE("%{public}s: read bcdDevice fail", __func__);
78 return HDF_FAILURE;
79 }
80 devDesc->bcdDevice = LE16_TO_CPU(value);
81
82 return HDF_SUCCESS;
83 }
84
UsbFnCfgMgrParseUsbFnDevDesc(const struct DeviceResourceNode * node,struct UsbFnDeviceDesc * fnDevDesc)85 static int32_t UsbFnCfgMgrParseUsbFnDevDesc(const struct DeviceResourceNode *node, struct UsbFnDeviceDesc *fnDevDesc)
86 {
87 const char *childNodeName = NULL;
88 if (node == NULL || fnDevDesc == NULL) {
89 HDF_LOGE("%{public}s: node or fnDevDesc is null", __func__);
90 return HDF_FAILURE;
91 }
92 struct DeviceResourceIface *drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
93 if (drsOps == NULL || drsOps->GetChildNode == NULL) {
94 HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
95 return HDF_FAILURE;
96 }
97 if (drsOps->GetString(node, "usb_dev_desc", &childNodeName, NULL) != HDF_SUCCESS) {
98 HDF_LOGE("%{public}s: get usb_dev_desc node name failed", __func__);
99 return HDF_FAILURE;
100 }
101 const struct DeviceResourceNode *devDescNode = drsOps->GetChildNode(node, childNodeName);
102 if (devDescNode == NULL) {
103 HDF_LOGE("%{public}s: childDevDescNode is null", __func__);
104 return HDF_FAILURE;
105 }
106 fnDevDesc->deviceDesc = (struct UsbDeviceDescriptor *)UsbFnMemCalloc(sizeof(struct UsbDeviceDescriptor));
107 if (fnDevDesc->deviceDesc == NULL) {
108 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
109 return HDF_FAILURE;
110 }
111 if (UsbFnCfgMgrParseDevDesc(devDescNode, drsOps, fnDevDesc->deviceDesc)) {
112 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
113 goto FAIL;
114 }
115 return HDF_SUCCESS;
116 FAIL:
117 UsbFnMemFree(fnDevDesc->deviceDesc);
118 return HDF_FAILURE;
119 }
120
UsbFnCfgMgrParseString(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,struct UsbFnStrings * fnString)121 static int32_t UsbFnCfgMgrParseString(
122 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, struct UsbFnStrings *fnString)
123 {
124 int32_t iCount;
125 int32_t strCount;
126 int32_t ret;
127 const char *strNodeName = NULL;
128 const struct DeviceResourceNode *strNode = NULL;
129
130 if (node == NULL || fnString == NULL || drsOps == NULL) {
131 return HDF_FAILURE;
132 }
133 if (drsOps->GetUint16(node, "language", &fnString->language, 0) != HDF_SUCCESS) {
134 return HDF_FAILURE;
135 }
136 strCount = drsOps->GetElemNum(node, "stringList");
137 if (strCount <= 0) {
138 HDF_LOGE("%{public}s: stringList not found", __func__);
139 return HDF_FAILURE;
140 }
141 fnString->strings = (struct UsbString *)UsbFnMemCalloc((strCount + 1) * sizeof(struct UsbString));
142 if (fnString->strings == NULL) {
143 HDF_LOGE("%{public}s: fnString->strings is null", __func__);
144 goto FREE_USB_STRING;
145 }
146 fnString->strings[strCount].s = NULL;
147 fnString->strings[strCount].id = 0xff;
148 for (iCount = 0; iCount < strCount; iCount++) {
149 ret = drsOps->GetStringArrayElem(node, "stringList", iCount, &strNodeName, NULL);
150 if (ret != HDF_SUCCESS) {
151 HDF_LOGE("%{public}s: read stringList fail", __func__);
152 goto FREE_USB_STRING;
153 }
154 strNode = drsOps->GetChildNode(node, strNodeName);
155 if (strNode == NULL) {
156 HDF_LOGE("%{public}s: StrNode is null", __func__);
157 goto FREE_USB_STRING;
158 }
159 struct UsbString *usbStr = fnString->strings + iCount;
160 if (drsOps->GetUint8(strNode, "id", &usbStr->id, 0) != HDF_SUCCESS) {
161 goto FREE_USB_STRING;
162 }
163 if (drsOps->GetString(strNode, "str", &usbStr->s, 0) != HDF_SUCCESS) {
164 goto FREE_USB_STRING;
165 }
166 }
167
168 return HDF_SUCCESS;
169 FREE_USB_STRING:
170 UsbFnMemFree(fnString->strings);
171 return HDF_FAILURE;
172 }
173
UsbFnCfgMgrParseStrings(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps)174 static struct UsbFnStrings **UsbFnCfgMgrParseStrings(
175 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps)
176 {
177 int32_t strTabCount;
178 int32_t count;
179 int32_t ret;
180 const char *stringNodeName = NULL;
181 const struct DeviceResourceNode *stringNode = NULL;
182 struct UsbFnStrings **fnStrings = NULL;
183
184 if (node == NULL || drsOps == NULL) {
185 return NULL;
186 }
187 strTabCount = drsOps->GetElemNum(node, "stringTabList");
188 if (strTabCount <= 0) {
189 return NULL;
190 }
191 fnStrings = (struct UsbFnStrings **)UsbFnMemCalloc((strTabCount + 1) * sizeof(struct UsbFnStrings *));
192 if (fnStrings == NULL) {
193 return NULL;
194 }
195 fnStrings[strTabCount] = NULL;
196 for (count = 0; count < strTabCount; count++) {
197 fnStrings[count] = (struct UsbFnStrings *)UsbFnMemCalloc(sizeof(struct UsbFnStrings));
198 if (fnStrings[count] == NULL) {
199 goto FREE_STRING;
200 }
201 ret = drsOps->GetStringArrayElem(node, "stringTabList", count, &stringNodeName, NULL);
202 if (ret != HDF_SUCCESS) {
203 goto FREE_STRING;
204 }
205 stringNode = drsOps->GetChildNode(node, stringNodeName);
206 if (stringNode == NULL) {
207 goto FREE_STRING;
208 }
209 if (UsbFnCfgMgrParseString(stringNode, drsOps, fnStrings[count]) != HDF_SUCCESS) {
210 goto FREE_STRING;
211 }
212 }
213 return fnStrings;
214 FREE_STRING:
215 while ((--count) >= 0) {
216 UsbFnMemFree(fnStrings[count]);
217 }
218 UsbFnMemFree(fnStrings);
219 return NULL;
220 }
221
UsbFnCfgMgrParseUsbFnDevStrings(const struct DeviceResourceNode * node,struct UsbFnDeviceDesc * fnDevDesc)222 static int32_t UsbFnCfgMgrParseUsbFnDevStrings(const struct DeviceResourceNode *node, struct UsbFnDeviceDesc *fnDevDesc)
223 {
224 struct DeviceResourceIface *drsOps = NULL;
225 const char *fnDevStrNodeName = NULL;
226 const struct DeviceResourceNode *fnDevStrNode = NULL;
227
228 if (node == NULL || fnDevDesc == NULL) {
229 HDF_LOGE("%{public}s: node or fnDevDesc is null", __func__);
230 return HDF_FAILURE;
231 }
232 drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
233 if (drsOps == NULL || drsOps->GetChildNode == NULL) {
234 HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
235 return HDF_FAILURE;
236 }
237 if (drsOps->GetString(node, "usb_dev_string", &fnDevStrNodeName, NULL) != HDF_SUCCESS) {
238 HDF_LOGE("%{public}s: get dev strings name failed", __func__);
239 return HDF_FAILURE;
240 }
241 fnDevStrNode = drsOps->GetChildNode(node, fnDevStrNodeName);
242 if (fnDevStrNode == NULL) {
243 HDF_LOGE("%{public}s: childDevDescNode is null", __func__);
244 return HDF_FAILURE;
245 }
246 fnDevDesc->deviceStrings = UsbFnCfgMgrParseStrings(fnDevStrNode, drsOps);
247 if (fnDevDesc->deviceStrings == NULL) {
248 HDF_LOGE("%{public}s: parse device string error", __func__);
249 return HDF_FAILURE;
250 }
251
252 return HDF_SUCCESS;
253 }
254
UsbFnCfgMgrParseAccocInterfaceDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)255 static int32_t UsbFnCfgMgrParseAccocInterfaceDesc(
256 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
257 {
258 struct UsbInterfaceAssocDescriptor *desc = NULL;
259
260 if (node == NULL || drsOps == NULL || descBuff == NULL) {
261 return HDF_FAILURE;
262 }
263 desc = (struct UsbInterfaceAssocDescriptor *)descBuff;
264 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
265 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
266 drsOps->GetUint8(node, INTERFACE_FIRST, &desc->bFirstInterface, 0) != HDF_SUCCESS ||
267 drsOps->GetUint8(node, INTERFACE_COUNT, &desc->bInterfaceCount, 0) != HDF_SUCCESS ||
268 drsOps->GetUint8(node, FUNCTION_CLASS, &desc->bFunctionClass, 0) != HDF_SUCCESS ||
269 drsOps->GetUint8(node, FUNCTION_SUBCLASS, &desc->bFunctionSubClass, 0) != HDF_SUCCESS ||
270 drsOps->GetUint8(node, FUNCTION_PROTOCOL, &desc->bFunctionProtocol, 0) != HDF_SUCCESS ||
271 drsOps->GetUint8(node, FUNCTION_INDEX, &desc->iFunction, 0) != HDF_SUCCESS) {
272 HDF_LOGE("%{public}s: read fail", __func__);
273 return HDF_FAILURE;
274 }
275
276 return HDF_SUCCESS;
277 }
278
UsbFnCfgMgrParseInterfaceDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)279 static int32_t UsbFnCfgMgrParseInterfaceDesc(
280 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
281 {
282 struct UsbInterfaceDescriptor *desc = NULL;
283
284 if (node == NULL || drsOps == NULL || descBuff == NULL) {
285 return HDF_FAILURE;
286 }
287 desc = (struct UsbInterfaceDescriptor *)descBuff;
288 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
289 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
290 drsOps->GetUint8(node, INTERFACE_NUMBER, &desc->bInterfaceNumber, 0) != HDF_SUCCESS ||
291 drsOps->GetUint8(node, INTERFACE_ALTERNATE, &desc->bAlternateSetting, 0) != HDF_SUCCESS ||
292 drsOps->GetUint8(node, INTERFACE_NENDPOINT, &desc->bNumEndpoints, 0) != HDF_SUCCESS ||
293 drsOps->GetUint8(node, INTERFACE_CLASS, &desc->bInterfaceClass, 0) != HDF_SUCCESS ||
294 drsOps->GetUint8(node, INTERFACE_SUBCLASS, &desc->bInterfaceSubClass, 0) != HDF_SUCCESS ||
295 drsOps->GetUint8(node, INTERFACE_PROTOCOL, &desc->bInterfaceProtocol, 0) != HDF_SUCCESS ||
296 drsOps->GetUint8(node, INTERFACE_INTERFACE, &desc->iInterface, 0) != HDF_SUCCESS) {
297 HDF_LOGE("%{public}s: read fail", __func__);
298 return HDF_FAILURE;
299 }
300
301 return HDF_SUCCESS;
302 }
303
UsbFnCfgMgrParseEndpointDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)304 static int32_t UsbFnCfgMgrParseEndpointDesc(
305 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
306 {
307 if (node == NULL || drsOps == NULL || descBuff == NULL) {
308 return HDF_FAILURE;
309 }
310
311 uint16_t value;
312 struct UsbEndpointDescriptor *desc = (struct UsbEndpointDescriptor *)descBuff;
313 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
314 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
315 drsOps->GetUint8(node, ENDPOINT_ADDRESS, &desc->bEndpointAddress, 0) != HDF_SUCCESS ||
316 drsOps->GetUint8(node, ENDPOINT_MATTR, &desc->bmAttributes, 0) != HDF_SUCCESS ||
317 drsOps->GetUint16(node, ENDPOINT_MAXPACKSIZE_W, &value, 0) != HDF_SUCCESS ||
318 drsOps->GetUint8(node, ENDPOINT_INTERVAL, &desc->bInterval, 0) != HDF_SUCCESS) {
319 HDF_LOGE("%{public}s: read fail", __func__);
320 return HDF_FAILURE;
321 }
322 desc->wMaxPacketSize = LE16_TO_CPU(value);
323 if (desc->bLength == USB_DDK_DT_ENDPOINT_AUDIO_SIZE) {
324 if (drsOps->GetUint8(node, ENDPOINT_REFRESH, &desc->bRefresh, 0) != HDF_SUCCESS ||
325 drsOps->GetUint8(node, ENDPOINT_SYNCADDR, &desc->bSynchAddress, 0) != HDF_SUCCESS) {
326 HDF_LOGE("%{public}s: read fail", __func__);
327 return HDF_FAILURE;
328 }
329 }
330 return HDF_SUCCESS;
331 }
332
UsbFnCfgMgrParseStringDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)333 static int32_t UsbFnCfgMgrParseStringDesc(
334 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
335 {
336 struct UsbStringDescriptor *desc = NULL;
337 uint16_t value;
338
339 if (node == NULL || drsOps == NULL || descBuff == NULL) {
340 return HDF_FAILURE;
341 }
342 desc = (struct UsbStringDescriptor *)descBuff;
343 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
344 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
345 drsOps->GetUint16(node, STRING_DATA, &value, 0) != HDF_SUCCESS) {
346 HDF_LOGE("%{public}s: read fail", __func__);
347 return HDF_FAILURE;
348 }
349 desc->wData[0] = LE16_TO_CPU(value);
350
351 return HDF_SUCCESS;
352 }
353
UsbFnCfgMgrParseSspIsocEndpointDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)354 static int32_t UsbFnCfgMgrParseSspIsocEndpointDesc(
355 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
356 {
357 struct UsbSspIsocEpCompDescriptor *desc = NULL;
358 uint16_t sValue;
359 uint32_t iValue;
360
361 if (node == NULL || drsOps == NULL || descBuff == NULL) {
362 return HDF_FAILURE;
363 }
364 desc = (struct UsbSspIsocEpCompDescriptor *)descBuff;
365 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
366 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
367 drsOps->GetUint16(node, SSP_ISOC_EPCOMP_WRESEVED, &sValue, 0) != HDF_SUCCESS ||
368 drsOps->GetUint32(node, SSP_ISOC_EPCOMP_DWPERINTERVAL, &iValue, 0) != HDF_SUCCESS) {
369 HDF_LOGE("%{public}s: read fail", __func__);
370 return HDF_FAILURE;
371 }
372 desc->wReseved = LE16_TO_CPU(sValue);
373 desc->dwBytesPerInterval = LE32_TO_CPU(iValue);
374
375 return HDF_SUCCESS;
376 }
377
UsbFnCfgMgrParseSsEndpointDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)378 static int32_t UsbFnCfgMgrParseSsEndpointDesc(
379 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
380 {
381 struct UsbSsEpCompDescriptor *desc = NULL;
382 uint16_t sValue;
383
384 if (node == NULL || drsOps == NULL || descBuff == NULL) {
385 return HDF_FAILURE;
386 }
387 desc = (struct UsbSsEpCompDescriptor *)descBuff;
388 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
389 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
390 drsOps->GetUint8(node, SS_EP_COMP_MAXBURST, &desc->bMaxBurst, 0) != HDF_SUCCESS ||
391 drsOps->GetUint8(node, SS_EP_COMP_MTTRIBUTE, &desc->bmAttributes, 0) != HDF_SUCCESS ||
392 drsOps->GetUint16(node, SS_EP_COMP_WPERINTERVAL, &sValue, 0) != HDF_SUCCESS) {
393 HDF_LOGE("%{public}s: read fail", __func__);
394 return HDF_FAILURE;
395 }
396 desc->wBytesPerInterval = LE16_TO_CPU(sValue);
397
398 return HDF_SUCCESS;
399 }
400
UsbFnCfgMgrParseQualifierDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)401 static int32_t UsbFnCfgMgrParseQualifierDesc(
402 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
403 {
404 struct UsbQualifierDescriptor *desc = NULL;
405 uint16_t sValue;
406
407 if (node == NULL || drsOps == NULL || descBuff == NULL) {
408 return HDF_FAILURE;
409 }
410 desc = (struct UsbQualifierDescriptor *)descBuff;
411 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
412 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
413 drsOps->GetUint8(node, QUALIFIER_CLASS, &desc->bDeviceClass, 0) != HDF_SUCCESS ||
414 drsOps->GetUint8(node, QUALIFIER_SUBCLASS, &desc->bDeviceSubClass, 0) != HDF_SUCCESS ||
415 drsOps->GetUint8(node, QUALIFIER_PROTOCOL, &desc->bDeviceProtocol, 0) != HDF_SUCCESS ||
416 drsOps->GetUint8(node, QUALIFIER_MAXSIZE, &desc->bMaxPacketSize0, 0) != HDF_SUCCESS ||
417 drsOps->GetUint8(node, QUALIFIER_NUMCFG, &desc->bNumConfigurations, 0) != HDF_SUCCESS ||
418 drsOps->GetUint16(node, QUALIFIER_BCD, &sValue, 0) != HDF_SUCCESS) {
419 HDF_LOGE("%{public}s: read fail", __func__);
420 return HDF_FAILURE;
421 }
422 desc->bcdUSB = LE16_TO_CPU(sValue);
423
424 return HDF_SUCCESS;
425 }
426
UsbFnCfgMgrParseOtgDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff,uint8_t length)427 static int32_t UsbFnCfgMgrParseOtgDesc(
428 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff, uint8_t length)
429 {
430 struct UsbOtg20Descriptor *desc2 = NULL;
431 struct UsbOtgDescriptor *desc = NULL;
432 uint16_t sValue;
433
434 if (node == NULL || drsOps == NULL || descBuff == NULL) {
435 return HDF_FAILURE;
436 }
437 desc = (struct UsbOtgDescriptor *)descBuff;
438
439 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
440 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
441 drsOps->GetUint8(node, OTG_MTTRIBUTE, &desc->bmAttributes, 0) != HDF_SUCCESS) {
442 HDF_LOGE("%{public}s: read fail", __func__);
443 return HDF_FAILURE;
444 }
445 if (length == sizeof(struct UsbOtg20Descriptor)) {
446 desc2 = (struct UsbOtg20Descriptor *)descBuff;
447 if (drsOps->GetUint16(node, QUALIFIER_BCD, &sValue, 0) != HDF_SUCCESS) {
448 return HDF_FAILURE;
449 }
450 desc2->bcdOTG = LE16_TO_CPU(sValue);
451 }
452
453 return HDF_SUCCESS;
454 }
455
UsbFnCfgMgrParseDebugDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)456 static int32_t UsbFnCfgMgrParseDebugDesc(
457 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
458 {
459 struct UsbDebugDescriptor *desc = NULL;
460
461 if (node == NULL || drsOps == NULL || descBuff == NULL) {
462 return HDF_FAILURE;
463 }
464 desc = (struct UsbDebugDescriptor *)descBuff;
465 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
466 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
467 drsOps->GetUint8(node, DEBUG_IN, &desc->bDebugInEndpoint, 0) != HDF_SUCCESS ||
468 drsOps->GetUint8(node, DEBUG_OUT, &desc->bDebugOutEndpoint, 0) != HDF_SUCCESS) {
469 HDF_LOGE("%{public}s: read fail", __func__);
470 return HDF_FAILURE;
471 }
472
473 return HDF_SUCCESS;
474 }
475
UsbFnCfgMgrParseSecurityDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff)476 static int32_t UsbFnCfgMgrParseSecurityDesc(
477 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
478 {
479 struct UsbSecurityDescriptor *desc = NULL;
480 uint16_t sValue;
481
482 if (node == NULL || drsOps == NULL || descBuff == NULL) {
483 return HDF_FAILURE;
484 }
485 desc = (struct UsbSecurityDescriptor *)descBuff;
486 if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
487 drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
488 drsOps->GetUint8(node, SECURITY_ENCRYTYPE, &desc->bNumEncryptionTypes, 0) != HDF_SUCCESS ||
489 drsOps->GetUint16(node, SECURITY_TOTALLENGTH, &sValue, 0) != HDF_SUCCESS) {
490 HDF_LOGE("%{public}s: read fail", __func__);
491 return HDF_FAILURE;
492 }
493 desc->wTotalLength = LE16_TO_CPU(sValue);
494
495 return HDF_SUCCESS;
496 }
497
UsbFnCfgMgrParseOtherDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff,uint8_t length)498 static int32_t UsbFnCfgMgrParseOtherDesc(
499 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff, uint8_t length)
500 {
501 if (node == NULL || drsOps == NULL || descBuff == NULL) {
502 return HDF_FAILURE;
503 }
504 if (drsOps->GetUint8Array(node, "desc_data", descBuff, length, 0) != HDF_SUCCESS) {
505 return HDF_FAILURE;
506 }
507 if (descBuff[0] != length) {
508 return HDF_FAILURE;
509 }
510 return HDF_SUCCESS;
511 }
512
UsbFnCfgMgrParseDescriptor(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,uint8_t * descBuff,uint8_t descType,uint8_t length)513 static int32_t UsbFnCfgMgrParseDescriptor(const struct DeviceResourceNode *node,
514 const struct DeviceResourceIface *drsOps, uint8_t *descBuff, uint8_t descType, uint8_t length)
515 {
516 int32_t ret;
517
518 if (node == NULL || drsOps == NULL || descBuff == NULL) {
519 return HDF_FAILURE;
520 }
521 switch (descType) {
522 case USB_DDK_DT_INTERFACE:
523 ret = UsbFnCfgMgrParseInterfaceDesc(node, drsOps, descBuff);
524 break;
525 case USB_DDK_DT_ENDPOINT:
526 ret = UsbFnCfgMgrParseEndpointDesc(node, drsOps, descBuff);
527 break;
528 case USB_DDK_DT_STRING:
529 ret = UsbFnCfgMgrParseStringDesc(node, drsOps, descBuff);
530 break;
531 case USB_DDK_DT_INTERFACE_ASSOCIATION:
532 ret = UsbFnCfgMgrParseAccocInterfaceDesc(node, drsOps, descBuff);
533 break;
534 case USB_DDK_DT_SSP_ISOC_ENDPOINT_COMP:
535 ret = UsbFnCfgMgrParseSspIsocEndpointDesc(node, drsOps, descBuff);
536 break;
537 case USB_DDK_DT_SS_ENDPOINT_COMP:
538 ret = UsbFnCfgMgrParseSsEndpointDesc(node, drsOps, descBuff);
539 break;
540 case USB_DDK_DT_DEVICE_QUALIFIER:
541 ret = UsbFnCfgMgrParseQualifierDesc(node, drsOps, descBuff);
542 break;
543 case USB_DDK_DT_OTG:
544 ret = UsbFnCfgMgrParseOtgDesc(node, drsOps, descBuff, length);
545 break;
546 case USB_DDK_DT_DEBUG:
547 ret = UsbFnCfgMgrParseDebugDesc(node, drsOps, descBuff);
548 break;
549 case USB_DDK_DT_SECURITY:
550 ret = UsbFnCfgMgrParseSecurityDesc(node, drsOps, descBuff);
551 break;
552 case USB_DDK_DT_ENCRYPTION_TYPE:
553 ret = UsbFnCfgMgrParseSecurityDesc(node, drsOps, descBuff);
554 break;
555 default:
556 ret = UsbFnCfgMgrParseOtherDesc(node, drsOps, descBuff, length);
557 break;
558 }
559
560 return ret;
561 }
562
UsbFnCfgMgrParseDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps)563 static struct UsbDescriptorHeader *UsbFnCfgMgrParseDesc(
564 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps)
565 {
566 uint8_t length;
567 uint8_t descType;
568 uint8_t *descBuff = NULL;
569 int32_t ret;
570
571 if (node == NULL || drsOps == NULL) {
572 return NULL;
573 }
574 if (drsOps->GetUint8(node, DESC_LENGTH, &length, 0) != HDF_SUCCESS) {
575 HDF_LOGE("%{public}s: read length fail", __func__);
576 return NULL;
577 }
578 if (drsOps->GetUint8(node, DESC_TYPE, &descType, 0) != HDF_SUCCESS) {
579 HDF_LOGE("%{public}s: read type fail", __func__);
580 return NULL;
581 }
582 descBuff = (uint8_t *)UsbFnMemCalloc(length * sizeof(uint8_t));
583 if (descBuff == NULL) {
584 return NULL;
585 }
586 ret = UsbFnCfgMgrParseDescriptor(node, drsOps, descBuff, descType, length);
587 if (ret != HDF_SUCCESS) {
588 HDF_LOGE("%{public}s: length = 0x%x, descType = 0x%x Parse fail", __func__, length, descType);
589 UsbFnMemFree(descBuff);
590 return NULL;
591 }
592
593 return (struct UsbDescriptorHeader *)descBuff;
594 }
595
UsbFnCfgMgrParseFunDesc(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,const char * descName)596 static struct UsbDescriptorHeader **UsbFnCfgMgrParseFunDesc(
597 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, const char *descName)
598 {
599 int32_t descCount;
600 int32_t iCount;
601 const char *descNodeName = NULL;
602 const struct DeviceResourceNode *descNode = NULL;
603 struct UsbDescriptorHeader **descriptors = NULL;
604
605 if (node == NULL || descName == NULL || drsOps == NULL) {
606 return NULL;
607 }
608 descCount = drsOps->GetElemNum(node, descName);
609 if (descCount <= 0) {
610 return NULL;
611 }
612 descriptors = (struct UsbDescriptorHeader **)UsbFnMemCalloc((descCount + 1) * sizeof(struct UsbDescriptorHeader *));
613 if (descriptors == NULL) {
614 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
615 return NULL;
616 }
617 descriptors[descCount] = NULL;
618 for (iCount = 0; iCount < descCount; iCount++) {
619 if (drsOps->GetStringArrayElem(node, descName, iCount, &descNodeName, NULL) != HDF_SUCCESS) {
620 goto FREE_DESC_HEAD;
621 }
622 descNode = drsOps->GetChildNode(node, descNodeName);
623 if (descNode == NULL) {
624 goto FREE_DESC_HEAD;
625 }
626 descriptors[iCount] = UsbFnCfgMgrParseDesc(descNode, drsOps);
627 if (descriptors[iCount] == NULL) {
628 goto FREE_DESC_HEAD;
629 }
630 }
631 return descriptors;
632 FREE_DESC_HEAD:
633 while ((--iCount) >= 0) {
634 UsbFnMemFree(descriptors[iCount]);
635 }
636 UsbFnMemFree(descriptors);
637 return NULL;
638 }
639
UsbFnCfgMgrParseUsbFnFunction(const struct DeviceResourceNode * node,const struct DeviceResourceIface * drsOps,struct UsbFnFunction * fun)640 static int32_t UsbFnCfgMgrParseUsbFnFunction(
641 const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, struct UsbFnFunction *fun)
642 {
643 if (node == NULL || fun == NULL) {
644 HDF_LOGE("%{public}s: node or fnDevDesc or drsOps is null", __func__);
645 return HDF_FAILURE;
646 }
647 if (drsOps->GetString(node, "funcName", &fun->funcName, NULL) != HDF_SUCCESS) {
648 HDF_LOGE("%{public}s: get function name failed", __func__);
649 return HDF_FAILURE;
650 }
651 if (strncmp(fun->funcName, FUNCTION_GENERIC, strlen(FUNCTION_GENERIC)) != 0) {
652 return HDF_SUCCESS;
653 }
654 fun->strings = UsbFnCfgMgrParseStrings(node, drsOps);
655 if (fun->strings == NULL) {
656 HDF_LOGE("%{public}s: parse device string error", __func__);
657 return HDF_FAILURE;
658 }
659 fun->fsDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "fsDescList");
660 if (fun->fsDescriptors == NULL) {
661 HDF_LOGE("%{public}s: parse FS_DESC error", __func__);
662 }
663 fun->hsDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "hsDescList");
664 if (fun->hsDescriptors == NULL) {
665 HDF_LOGE("%{public}s: parse HS_DESC error", __func__);
666 }
667 fun->ssDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "ssDescList");
668 if (fun->ssDescriptors == NULL) {
669 HDF_LOGE("%{public}s: parse SS_DESC error", __func__);
670 }
671 fun->sspDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "sspDescList");
672 if (fun->sspDescriptors == NULL) {
673 HDF_LOGE("%{public}s: parse SSP_DESC error", __func__);
674 }
675
676 return HDF_SUCCESS;
677 }
678
UsbFnCfgMgrParseUsbFnFunctions(const struct DeviceResourceNode * node,struct DeviceResourceIface * drsOps,struct UsbFnConfiguration * fnConfig)679 static int32_t UsbFnCfgMgrParseUsbFnFunctions(
680 const struct DeviceResourceNode *node, struct DeviceResourceIface *drsOps, struct UsbFnConfiguration *fnConfig)
681 {
682 int32_t iCount;
683 int32_t funCount;
684 int32_t ret;
685 const char *funNodeName = NULL;
686 const struct DeviceResourceNode *funNode = NULL;
687
688 funCount = drsOps->GetElemNum(node, "functionList");
689 if (funCount <= 0) {
690 HDF_LOGE("%{public}s: get functionList num failed", __func__);
691 return HDF_FAILURE;
692 }
693 fnConfig->functions = (struct UsbFnFunction **)UsbFnMemCalloc((funCount + 1) * sizeof(struct UsbFnFunction *));
694 if (fnConfig->functions == NULL) {
695 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
696 return HDF_FAILURE;
697 }
698 fnConfig->functions[funCount] = NULL;
699 for (iCount = 0; iCount < funCount; iCount++) {
700 fnConfig->functions[iCount] = (struct UsbFnFunction *)UsbFnMemCalloc(sizeof(struct UsbFnFunction));
701 if (fnConfig->functions[iCount] == NULL) {
702 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
703 goto FREE_FUNTION;
704 }
705 ret = drsOps->GetStringArrayElem(node, "functionList", iCount, &funNodeName, NULL);
706 if (ret != HDF_SUCCESS) {
707 HDF_LOGE("%{public}s: read stringList fail", __func__);
708 goto FREE_FUNTION;
709 }
710 funNode = drsOps->GetChildNode(node, funNodeName);
711 if (funNode == NULL) {
712 HDF_LOGE("%{public}s: funNode not found", __func__);
713 goto FREE_FUNTION;
714 }
715 if (UsbFnCfgMgrParseUsbFnFunction(funNode, drsOps, fnConfig->functions[iCount]) != HDF_SUCCESS) {
716 HDF_LOGE("%{public}s: parse function error", __func__);
717 goto FREE_FUNTION;
718 }
719 }
720
721 return HDF_SUCCESS;
722 FREE_FUNTION:
723 while ((--iCount) > 0) {
724 UsbFnMemFree((void *)fnConfig->functions[iCount]);
725 }
726 UsbFnMemFree(fnConfig->functions);
727 return HDF_FAILURE;
728 }
729
UsbFnCfgMgrParseUsbFnConfiguration(const struct DeviceResourceNode * node,struct DeviceResourceIface * drsOps,struct UsbFnConfiguration * fnConfig)730 static int32_t UsbFnCfgMgrParseUsbFnConfiguration(
731 const struct DeviceResourceNode *node, struct DeviceResourceIface *drsOps, struct UsbFnConfiguration *fnConfig)
732 {
733 if (node == NULL || fnConfig == NULL || drsOps == NULL) {
734 HDF_LOGE("%{public}s: node or fnDevDesc or drsOps is null", __func__);
735 return HDF_FAILURE;
736 }
737 if (drsOps->GetUint8(node, "configurationValue", &fnConfig->configurationValue, 0) != HDF_SUCCESS) {
738 HDF_LOGE("%{public}s: read strCount fail", __func__);
739 return HDF_FAILURE;
740 }
741 if (drsOps->GetUint8(node, "iConfiguration", &fnConfig->iConfiguration, 0) != HDF_SUCCESS) {
742 HDF_LOGE("%{public}s: read strCount fail", __func__);
743 return HDF_FAILURE;
744 }
745 if (drsOps->GetUint8(node, "attributes", &fnConfig->attributes, 0) != HDF_SUCCESS) {
746 HDF_LOGE("%{public}s: read strCount fail", __func__);
747 return HDF_FAILURE;
748 }
749 if (drsOps->GetUint16(node, "maxPower", &fnConfig->maxPower, 0) != HDF_SUCCESS) {
750 HDF_LOGE("%{public}s: read strCount fail", __func__);
751 return HDF_FAILURE;
752 }
753 if (UsbFnCfgMgrParseUsbFnFunctions(node, drsOps, fnConfig) != HDF_SUCCESS) {
754 HDF_LOGE("%{public}s: parse functions failed", __func__);
755 return HDF_FAILURE;
756 }
757 return HDF_SUCCESS;
758 }
759
UsbFnCfgMgrParseUsbFnCfgLists(const struct DeviceResourceNode * configNode,struct DeviceResourceIface * drsOps,struct UsbFnDeviceDesc * fnDevDesc)760 static int32_t UsbFnCfgMgrParseUsbFnCfgLists(
761 const struct DeviceResourceNode *configNode, struct DeviceResourceIface *drsOps, struct UsbFnDeviceDesc *fnDevDesc)
762 {
763 int32_t configCount;
764 int32_t count;
765 int32_t ret;
766 const char *childConfigNodeName = NULL;
767 const struct DeviceResourceNode *childConfigNode = NULL;
768
769 configCount = drsOps->GetElemNum(configNode, "configList");
770 if (configCount <= 0) {
771 HDF_LOGE("%{public}s: get configList num failed", __func__);
772 return HDF_FAILURE;
773 }
774 fnDevDesc->configs =
775 (struct UsbFnConfiguration **)UsbFnMemCalloc((configCount + 1) * sizeof(struct UsbFnConfiguration *));
776 if (fnDevDesc->configs == NULL) {
777 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
778 return HDF_FAILURE;
779 }
780 fnDevDesc->configs[configCount] = NULL;
781 for (count = 0; count < configCount; count++) {
782 fnDevDesc->configs[count] = (struct UsbFnConfiguration *)UsbFnMemCalloc(sizeof(struct UsbFnConfiguration));
783 if (fnDevDesc->configs[count] == NULL) {
784 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
785 goto FREE_CONFIG;
786 }
787 ret = drsOps->GetStringArrayElem(configNode, "configList", count, &childConfigNodeName, NULL);
788 if (ret != HDF_SUCCESS) {
789 HDF_LOGE("%{public}s: read stringList fail", __func__);
790 goto FREE_CONFIG;
791 }
792 childConfigNode = drsOps->GetChildNode(configNode, childConfigNodeName);
793 if (childConfigNode == NULL) {
794 HDF_LOGE("%{public}s: StrNode is null", __func__);
795 goto FREE_CONFIG;
796 }
797 if (UsbFnCfgMgrParseUsbFnConfiguration(childConfigNode, drsOps, fnDevDesc->configs[count]) != HDF_SUCCESS) {
798 HDF_LOGE("%{public}s: parse config failed", __func__);
799 goto FREE_CONFIG;
800 }
801 }
802
803 return HDF_SUCCESS;
804 FREE_CONFIG:
805 while ((--count) >= 0) {
806 UsbFnMemFree(fnDevDesc->deviceStrings[count]);
807 }
808 UsbFnMemFree(fnDevDesc->deviceStrings);
809 return HDF_FAILURE;
810 }
811
UsbFnCfgMgrParseUsbFnConfigurations(const struct DeviceResourceNode * node,struct UsbFnDeviceDesc * fnDevDesc)812 static int32_t UsbFnCfgMgrParseUsbFnConfigurations(
813 const struct DeviceResourceNode *node, struct UsbFnDeviceDesc *fnDevDesc)
814 {
815 struct DeviceResourceIface *drsOps = NULL;
816 const char *configNodeName = NULL;
817 const struct DeviceResourceNode *configNode = NULL;
818
819 if (node == NULL || fnDevDesc == NULL) {
820 HDF_LOGE("%{public}s: node or fnDevDesc is null", __func__);
821 return HDF_FAILURE;
822 }
823 drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
824 if (drsOps == NULL || drsOps->GetChildNode == NULL) {
825 HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
826 return HDF_FAILURE;
827 }
828 if (drsOps->GetString(node, "usb_configuration", &configNodeName, NULL) != HDF_SUCCESS) {
829 HDF_LOGE("%{public}s: get config node name failed", __func__);
830 return HDF_FAILURE;
831 }
832 configNode = drsOps->GetChildNode(node, configNodeName);
833 if (configNode == NULL) {
834 HDF_LOGE("%{public}s: configNode is null", __func__);
835 return HDF_FAILURE;
836 }
837 if (UsbFnCfgMgrParseUsbFnCfgLists(configNode, drsOps, fnDevDesc) != HDF_SUCCESS) {
838 HDF_LOGE("%{public}s: parse usb config lists failed", __func__);
839 return HDF_FAILURE;
840 }
841 return HDF_SUCCESS;
842 }
843
UsbFnCfgMgrGetInstanceFromHCS(const struct DeviceResourceNode * node)844 struct UsbFnDeviceDesc *UsbFnCfgMgrGetInstanceFromHCS(const struct DeviceResourceNode *node)
845 {
846 int32_t ret;
847 struct UsbFnDeviceDesc *usbDevDesc = NULL;
848
849 if (node == NULL) {
850 HDF_LOGE("%{public}s: node is null", __func__);
851 return NULL;
852 }
853
854 usbDevDesc = (struct UsbFnDeviceDesc *)UsbFnMemCalloc(sizeof(*usbDevDesc));
855 if (usbDevDesc == NULL) {
856 HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
857 return NULL;
858 }
859 ret = UsbFnCfgMgrParseUsbFnDevDesc(node, usbDevDesc);
860 if (ret != HDF_SUCCESS) {
861 HDF_LOGE("%{public}s: parse device descriptor failed", __func__);
862 return NULL;
863 }
864 ret = UsbFnCfgMgrParseUsbFnDevStrings(node, usbDevDesc);
865 if (ret != HDF_SUCCESS) {
866 HDF_LOGE("%{public}s: parse device string failed", __func__);
867 goto FAIL_DEV_STRING;
868 }
869 ret = UsbFnCfgMgrParseUsbFnConfigurations(node, usbDevDesc);
870 if (ret != HDF_SUCCESS) {
871 HDF_LOGE("%{public}s: parse config descriptor failed", __func__);
872 goto FAIL_DEV_STRING;
873 }
874
875 return usbDevDesc;
876
877 FAIL_DEV_STRING:
878 UsbFnMemFree(usbDevDesc->deviceDesc);
879 UsbFnMemFree(usbDevDesc);
880 return NULL;
881 }
882
UsbFnCfgMgrFreeFnStrings(struct UsbFnStrings ** fnStrings)883 static void UsbFnCfgMgrFreeFnStrings(struct UsbFnStrings **fnStrings)
884 {
885 int8_t iCount;
886
887 for (iCount = 0; (fnStrings[iCount] != NULL); iCount++) {
888 UsbFnMemFree(fnStrings[iCount]);
889 }
890 UsbFnMemFree(fnStrings);
891 }
892
UsbFnCfgMgrFreeFuncDescHead(struct UsbDescriptorHeader ** descHeads)893 static void UsbFnCfgMgrFreeFuncDescHead(struct UsbDescriptorHeader **descHeads)
894 {
895 int8_t iCount;
896
897 for (iCount = 0; (descHeads[iCount] != NULL); iCount++) {
898 UsbFnMemFree(descHeads[iCount]);
899 }
900 UsbFnMemFree(descHeads);
901 }
902
UsbFnCfgMgrFreeFunctions(struct UsbFnFunction ** fnFunctions)903 static void UsbFnCfgMgrFreeFunctions(struct UsbFnFunction **fnFunctions)
904 {
905 int8_t iCount;
906
907 for (iCount = 0; (fnFunctions[iCount] != NULL); iCount++) {
908 if (fnFunctions[iCount]->strings) {
909 UsbFnCfgMgrFreeFnStrings(fnFunctions[iCount]->strings);
910 }
911 if (fnFunctions[iCount]->fsDescriptors) {
912 UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->fsDescriptors);
913 }
914 if (fnFunctions[iCount]->hsDescriptors) {
915 UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->hsDescriptors);
916 }
917 if (fnFunctions[iCount]->ssDescriptors) {
918 UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->ssDescriptors);
919 }
920 if (fnFunctions[iCount]->sspDescriptors) {
921 UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->sspDescriptors);
922 }
923 UsbFnMemFree(fnFunctions[iCount]);
924 }
925 UsbFnMemFree(fnFunctions);
926 }
927
UsbFnCfgMgrFreeConfigs(struct UsbFnConfiguration ** fnConfigs)928 static void UsbFnCfgMgrFreeConfigs(struct UsbFnConfiguration **fnConfigs)
929 {
930 int8_t iCount;
931
932 for (iCount = 0; fnConfigs[iCount] != NULL; iCount++) {
933 if (fnConfigs[iCount]->functions) {
934 UsbFnCfgMgrFreeFunctions(fnConfigs[iCount]->functions);
935 }
936 UsbFnMemFree(fnConfigs[iCount]);
937 }
938 UsbFnMemFree(fnConfigs);
939 }
940
UsbFnCfgMgrFreeUsbFnDeviceDesc(struct UsbFnDeviceDesc * fnDevDesc)941 void UsbFnCfgMgrFreeUsbFnDeviceDesc(struct UsbFnDeviceDesc *fnDevDesc)
942 {
943 if (fnDevDesc == NULL) {
944 HDF_LOGE("%{public}s: fnDevDesc null", __func__);
945 return;
946 }
947 if (fnDevDesc->deviceDesc) {
948 UsbFnMemFree(fnDevDesc->deviceDesc);
949 }
950 if (fnDevDesc->deviceStrings) {
951 UsbFnCfgMgrFreeFnStrings(fnDevDesc->deviceStrings);
952 }
953 if (fnDevDesc->configs) {
954 UsbFnCfgMgrFreeConfigs(fnDevDesc->configs);
955 }
956 UsbFnMemFree(fnDevDesc);
957 }
958
IsPropRegisted(const struct UsbFnInterface * intf,const char * name)959 static uint8_t IsPropRegisted(const struct UsbFnInterface *intf, const char *name)
960 {
961 if (DListIsEmpty(&g_cfgEntry) == true) {
962 return 0;
963 }
964
965 struct UsbFnCfgPropMgr *obj = NULL;
966 struct UsbFnCfgPropMgr *temp = NULL;
967 DLIST_FOR_EACH_ENTRY_SAFE(obj, temp, &g_cfgEntry, struct UsbFnCfgPropMgr, entry) {
968 if (obj->intf && (obj->intf == intf) && strcmp(name, obj->name) == 0) {
969 return 1;
970 }
971 }
972 return 0;
973 }
974
IsDevDescPropAndGetValue(const struct UsbFnInterface * intf,const char * name,uint16_t * value)975 static int32_t IsDevDescPropAndGetValue(const struct UsbFnInterface *intf, const char *name, uint16_t *value)
976 {
977 if (name == NULL || intf == NULL) {
978 return 0;
979 }
980 struct UsbFnDeviceMgr *fnDevMgr = (struct UsbFnDeviceMgr *)intf->object;
981 if (fnDevMgr == NULL || fnDevMgr->des == NULL || fnDevMgr->des->deviceDesc == NULL) {
982 HDF_LOGE("%{public}s: fnDevMgr is null", __func__);
983 return 0;
984 }
985 if (strcmp(USBDEV_CLASS, name) == 0) {
986 *value = (uint16_t)fnDevMgr->des->deviceDesc->bDeviceClass;
987 } else if (strcmp(USBDEV_SUBCLASS, name) == 0) {
988 *value = (uint16_t)fnDevMgr->des->deviceDesc->bDeviceSubClass;
989 } else if (strcmp(USBDEV_PROTOCOL, name) == 0) {
990 *value = (uint16_t)fnDevMgr->des->deviceDesc->bDeviceProtocol;
991 } else if (strcmp(USBDEV_MAXSIZE, name) == 0) {
992 *value = (uint16_t)fnDevMgr->des->deviceDesc->bMaxPacketSize0;
993 } else if (strcmp(USBDEV_MANUFACTURER, name) == 0) {
994 *value = (uint16_t)fnDevMgr->des->deviceDesc->iManufacturer;
995 } else if (strcmp(USBDEV_PRODUCT, name) == 0) {
996 *value = (uint16_t)fnDevMgr->des->deviceDesc->iProduct;
997 } else if (strcmp(USBDEV_SERIALNUM, name) == 0) {
998 *value = (uint16_t)fnDevMgr->des->deviceDesc->iSerialNumber;
999 } else if (strcmp(USBDEV_NUMCFG, name) == 0) {
1000 *value = (uint16_t)fnDevMgr->des->deviceDesc->bNumConfigurations;
1001 } else if (strcmp(USBDEV_BCD, name) == 0) {
1002 *value = (uint16_t)fnDevMgr->des->deviceDesc->bcdUSB;
1003 } else if (strcmp(USBDEV_VENDOR, name) == 0) {
1004 *value = (uint16_t)fnDevMgr->des->deviceDesc->idVendor;
1005 } else if (strcmp(USBDEV_IDPRODUCT, name) == 0) {
1006 *value = (uint16_t)fnDevMgr->des->deviceDesc->idProduct;
1007 } else if (strcmp(USBDEV_BCDDEVICE, name) == 0) {
1008 *value = (uint16_t)fnDevMgr->des->deviceDesc->bcdDevice;
1009 } else {
1010 HDF_LOGE("%{public}s: other prop", __func__);
1011 return 0;
1012 }
1013 return 1;
1014 }
1015
IsDevDescProp(const char * name)1016 static int32_t IsDevDescProp(const char *name)
1017 {
1018 if (name == NULL) {
1019 return 0;
1020 }
1021 if ((strcmp(USBDEV_SUBCLASS, name) == 0) || (strcmp(DESC_TYPE, name) == 0) || (strcmp(USBDEV_CLASS, name) == 0) ||
1022 (strcmp(USBDEV_PROTOCOL, name) == 0) || (strcmp(USBDEV_MAXSIZE, name) == 0) ||
1023 (strcmp(USBDEV_MANUFACTURER, name) == 0) || (strcmp(USBDEV_PRODUCT, name) == 0) ||
1024 (strcmp(USBDEV_SERIALNUM, name) == 0) || (strcmp(USBDEV_NUMCFG, name) == 0) ||
1025 (strcmp(USBDEV_BCD, name) == 0) || (strcmp(USBDEV_VENDOR, name) == 0) ||
1026 (strcmp(USBDEV_IDPRODUCT, name) == 0) || (strcmp(USBDEV_BCDDEVICE, name) == 0)) {
1027 return 1;
1028 }
1029 return 0;
1030 }
1031
UsbFnCfgGetPropValueFromPropList(const struct UsbFnDeviceMgr * fnDevMgr,const struct UsbFnInterface * intf,const struct DeviceResourceIface * drsOps,const struct DeviceResourceNode * propListNode,const char * name)1032 static const char *UsbFnCfgGetPropValueFromPropList(const struct UsbFnDeviceMgr *fnDevMgr,
1033 const struct UsbFnInterface *intf, const struct DeviceResourceIface *drsOps,
1034 const struct DeviceResourceNode *propListNode, const char *name)
1035 {
1036 uint8_t configNum;
1037 uint8_t interfaceNum;
1038 const char *propNodeName = NULL;
1039 const char *propValue = NULL;
1040 const char *propName = NULL;
1041 (void)fnDevMgr;
1042
1043 if (drsOps->GetUint8(propListNode, "configNum", &configNum, 0) != HDF_SUCCESS) {
1044 HDF_LOGE("%{public}s: read length fail", __func__);
1045 return NULL;
1046 }
1047 if (drsOps->GetUint8(propListNode, "interfaceNum", &interfaceNum, 0) != HDF_SUCCESS) {
1048 HDF_LOGE("%{public}s: read length fail", __func__);
1049 return NULL;
1050 }
1051 if ((intf->info.index != interfaceNum) || (intf->info.configIndex != configNum)) {
1052 HDF_LOGE("%{public}s: prop List is not ringt", __func__);
1053 return NULL;
1054 }
1055 int32_t propCount = drsOps->GetElemNum(propListNode, "propList");
1056 if (propCount <= 0) {
1057 return NULL;
1058 }
1059 for (int32_t count = 0; count < propCount; count++) {
1060 int32_t ret = drsOps->GetStringArrayElem(propListNode, "propList", count, &propNodeName, NULL);
1061 if (ret != HDF_SUCCESS) {
1062 HDF_LOGE("%{public}s: read stringList fail", __func__);
1063 return NULL;
1064 }
1065 const struct DeviceResourceNode *propNode = drsOps->GetChildNode(propListNode, propNodeName);
1066 if (propNode == NULL) {
1067 HDF_LOGE("%{public}s: propNode is null", __func__);
1068 return NULL;
1069 }
1070 if (drsOps->GetString(propNode, "name", &propName, 0) != HDF_SUCCESS) {
1071 return NULL;
1072 }
1073 if (strcmp(propName, name) == 0) {
1074 if (drsOps->GetString(propNode, "value", &propValue, 0) != HDF_SUCCESS) {
1075 return NULL;
1076 }
1077 return propValue;
1078 }
1079 }
1080
1081 return NULL;
1082 }
1083
UsbFnCfgGetPropValueFromHcs(const struct UsbFnDeviceMgr * fnDevMgr,const struct UsbFnInterface * intf,const struct DeviceResourceIface * drsOps,const struct DeviceResourceNode * customNode,const char * name)1084 static const char *UsbFnCfgGetPropValueFromHcs(const struct UsbFnDeviceMgr *fnDevMgr, const struct UsbFnInterface *intf,
1085 const struct DeviceResourceIface *drsOps, const struct DeviceResourceNode *customNode, const char *name)
1086 {
1087 const struct DeviceResourceNode *propListNode = NULL;
1088 const char *propNodeName = NULL;
1089 const char *propValue = NULL;
1090
1091 int32_t propTabCount = drsOps->GetElemNum(customNode, "propTable");
1092 if (propTabCount <= 0) {
1093 return NULL;
1094 }
1095 uint32_t totalCount = (uint32_t)propTabCount;
1096 for (uint32_t count = 0; count < totalCount; count++) {
1097 int32_t ret = drsOps->GetStringArrayElem(customNode, "propTable", count, &propNodeName, NULL);
1098 if (ret != HDF_SUCCESS) {
1099 HDF_LOGE("%{public}s: read stringList fail", __func__);
1100 return NULL;
1101 }
1102 propListNode = drsOps->GetChildNode(customNode, propNodeName);
1103 if (propListNode == NULL) {
1104 HDF_LOGE("%{public}s: propNode is null", __func__);
1105 return NULL;
1106 }
1107 propValue = UsbFnCfgGetPropValueFromPropList(fnDevMgr, intf, drsOps, propListNode, name);
1108 if (propValue) {
1109 return propValue;
1110 }
1111 }
1112
1113 return NULL;
1114 }
1115
UsbFnCfgFindPropFromHcs(const struct UsbFnInterface * intf,const char * name)1116 static const char *UsbFnCfgFindPropFromHcs(const struct UsbFnInterface *intf, const char *name)
1117 {
1118 struct UsbFnDeviceMgr *fnDevMgr = NULL;
1119 const struct DeviceResourceNode *customNode = NULL;
1120 struct DeviceResourceIface *drsOps = NULL;
1121 const char *propValue = NULL;
1122
1123 if (name == NULL || intf == NULL) {
1124 return NULL;
1125 }
1126 fnDevMgr = (struct UsbFnDeviceMgr *)intf->object;
1127 if (fnDevMgr == NULL || fnDevMgr->node == NULL) {
1128 HDF_LOGE("%{public}s: node is null", __func__);
1129 return NULL;
1130 }
1131 drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
1132 if (drsOps == NULL || drsOps->GetChildNode == NULL) {
1133 HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
1134 return NULL;
1135 }
1136 customNode = drsOps->GetChildNode(fnDevMgr->node, "custom_prop");
1137 if (customNode == NULL) {
1138 HDF_LOGE("%{public}s: childDevDescNode is null", __func__);
1139 return NULL;
1140 }
1141 propValue = UsbFnCfgGetPropValueFromHcs(fnDevMgr, intf, drsOps, customNode, name);
1142
1143 return propValue;
1144 }
1145
UsbFnCfgChangeUdcName(const struct UsbFnDeviceMgr * fnDevMgr,struct UsbFnAdapterOps * fnOps)1146 static int32_t UsbFnCfgChangeUdcName(const struct UsbFnDeviceMgr *fnDevMgr, struct UsbFnAdapterOps *fnOps)
1147 {
1148 int32_t ret;
1149
1150 if (fnDevMgr == NULL || fnOps == NULL) {
1151 return HDF_FAILURE;
1152 }
1153 ret = fnOps->writeUDC(fnDevMgr->name, fnDevMgr->udcName, 0);
1154 if (ret) {
1155 return HDF_FAILURE;
1156 }
1157 ret = fnOps->writeUDC(fnDevMgr->name, fnDevMgr->udcName, 1);
1158 if (ret) {
1159 return HDF_FAILURE;
1160 }
1161
1162 return HDF_SUCCESS;
1163 }
1164
UsbFnCfgChangeStrings(const struct UsbFnDeviceMgr * fnDevMgr,struct UsbFnAdapterOps * fnOps,uint32_t index,const char * propName)1165 static int32_t UsbFnCfgChangeStrings(
1166 const struct UsbFnDeviceMgr *fnDevMgr, struct UsbFnAdapterOps *fnOps, uint32_t index, const char *propName)
1167 {
1168 if (fnDevMgr == NULL || fnDevMgr->des == NULL || fnDevMgr->des->deviceStrings == NULL) {
1169 return HDF_FAILURE;
1170 }
1171
1172 struct UsbFnStrings **strings = fnDevMgr->des->deviceStrings;
1173 for (int32_t i = 0; strings[i] != NULL; i++) {
1174 int32_t ret =
1175 fnOps->writeDesString(fnDevMgr->name, strings[i]->language, propName, strings[i]->strings[index].s);
1176 if (ret != HDF_SUCCESS) {
1177 return HDF_FAILURE;
1178 }
1179 }
1180 return HDF_SUCCESS;
1181 }
1182
UsbFnCfgChangeDevceDes(const struct UsbFnInterface * intf,const char * name,const char * value)1183 static int32_t UsbFnCfgChangeDevceDes(const struct UsbFnInterface *intf, const char *name, const char *value)
1184 {
1185 int32_t ret;
1186 uint32_t data;
1187 struct UsbFnAdapterOps *fnOps = UsbFnAdapterGetOps();
1188
1189 if (name == NULL || intf == NULL || fnOps == NULL) {
1190 return HDF_FAILURE;
1191 }
1192 struct UsbFnDeviceMgr *fnDevMgr = (struct UsbFnDeviceMgr *)intf->object;
1193 if (fnDevMgr == NULL || fnDevMgr->des == NULL || fnDevMgr->des->deviceDesc == NULL ||
1194 fnDevMgr->des->deviceStrings == NULL) {
1195 HDF_LOGE("%{public}s: null", __func__);
1196 return HDF_FAILURE;
1197 }
1198 if (sscanf_s(value, "%x", &data) <= 0) {
1199 return HDF_FAILURE;
1200 }
1201 if (strcmp(name, USBDEV_MANUFACTURER) == 0 || strcmp(name, USBDEV_PRODUCT) == 0 ||
1202 strcmp(name, USBDEV_SERIALNUM) == 0) {
1203 ret = UsbFnCfgChangeStrings(fnDevMgr, fnOps, data, name);
1204 if (ret) {
1205 return HDF_ERR_INVALID_PARAM;
1206 }
1207 } else {
1208 ret = fnOps->writeProp(fnDevMgr->name, name, data);
1209 if (ret) {
1210 return HDF_ERR_INVALID_PARAM;
1211 }
1212 }
1213 if (UsbFnCfgChangeUdcName(fnDevMgr, fnOps) != HDF_SUCCESS) {
1214 return HDF_FAILURE;
1215 }
1216 return HDF_SUCCESS;
1217 }
1218
UsbfnCfgMgrFindPropMgr(const struct UsbFnInterface * intf,const char * name)1219 static struct UsbFnCfgPropMgr *UsbfnCfgMgrFindPropMgr(const struct UsbFnInterface *intf, const char *name)
1220 {
1221 if (DListIsEmpty(&g_cfgEntry) == true) {
1222 return NULL;
1223 }
1224
1225 struct UsbFnCfgPropMgr *obj = NULL;
1226 struct UsbFnCfgPropMgr *temp = NULL;
1227 DLIST_FOR_EACH_ENTRY_SAFE(obj, temp, &g_cfgEntry, struct UsbFnCfgPropMgr, entry) {
1228 if (obj->intf && (obj->intf == intf) && strcmp(name, obj->name) == 0) {
1229 return obj;
1230 }
1231 }
1232 return NULL;
1233 }
1234
UsbFnCfgMgrRegisterProp(const struct UsbFnInterface * intf,const struct UsbFnRegistInfo * registInfo)1235 int32_t UsbFnCfgMgrRegisterProp(const struct UsbFnInterface *intf, const struct UsbFnRegistInfo *registInfo)
1236 {
1237 if (intf == NULL || registInfo == NULL || registInfo->name == NULL) {
1238 return HDF_FAILURE;
1239 }
1240 if (g_cfgEntry.next == 0) {
1241 DListHeadInit(&g_cfgEntry);
1242 }
1243
1244 struct UsbFnCfgPropMgr *fnCfgPropMgr = NULL;
1245 uint8_t isDevProp = (uint8_t)IsDevDescProp(registInfo->name);
1246 int32_t isRegist = IsPropRegisted(intf, registInfo->name);
1247 if (isRegist != 0) {
1248 if (isDevProp == 0) {
1249 return HDF_FAILURE;
1250 } else {
1251 fnCfgPropMgr = UsbfnCfgMgrFindPropMgr(intf, registInfo->name);
1252 if (fnCfgPropMgr == NULL) {
1253 HDF_LOGE("%{public}s:%s not found", __func__, registInfo->name);
1254 return HDF_FAILURE;
1255 }
1256 }
1257 } else {
1258 fnCfgPropMgr = UsbFnMemCalloc(sizeof(struct UsbFnCfgPropMgr));
1259 if (fnCfgPropMgr == NULL) {
1260 HDF_LOGE("%{public}s:%d UsbFnMemCalloc failed", __func__, __LINE__);
1261 return HDF_FAILURE;
1262 }
1263 }
1264
1265 fnCfgPropMgr->isDevProp = isDevProp;
1266 fnCfgPropMgr->intf = intf;
1267 int32_t ret = snprintf_s(fnCfgPropMgr->name, MAX_LEN, MAX_LEN - 1, "%s", registInfo->name);
1268 if (ret < 0) {
1269 HDF_LOGE("%{public}s: snprintf_s failed", __func__);
1270 return HDF_FAILURE;
1271 }
1272 ret = snprintf_s(fnCfgPropMgr->value, MAX_LEN, MAX_LEN - 1, "%s", registInfo->value);
1273 if (ret < 0) {
1274 HDF_LOGE("%{public}s: snprintf_s failed", __func__);
1275 return HDF_FAILURE;
1276 }
1277 fnCfgPropMgr->getPropCallback = registInfo->getProp;
1278 fnCfgPropMgr->setPropCallback = registInfo->setProp;
1279 if (isRegist == 0) {
1280 DListInsertTail(&fnCfgPropMgr->entry, &g_cfgEntry);
1281 }
1282
1283 return HDF_SUCCESS;
1284 }
1285
UsbFnCfgMgrUnRegisterAllProp(void)1286 void UsbFnCfgMgrUnRegisterAllProp(void)
1287 {
1288 DListHeadInit(&g_cfgEntry);
1289 g_cfgEntry.next = 0;
1290 }
1291
UsbFnCfgMgrGetProp(const struct UsbFnInterface * intf,const char * name,char * value)1292 int32_t UsbFnCfgMgrGetProp(const struct UsbFnInterface *intf, const char *name, char *value)
1293 {
1294 if (intf == NULL || name == NULL) {
1295 return HDF_FAILURE;
1296 }
1297 if (g_cfgEntry.next == 0) {
1298 DListHeadInit(&g_cfgEntry);
1299 }
1300 if (IsPropRegisted(intf, name) == 0) {
1301 uint16_t val;
1302 if (IsDevDescPropAndGetValue(intf, name, &val)) {
1303 char tmp[MAX_LEN];
1304 if (snprintf_s(tmp, MAX_LEN, MAX_LEN - 1, "%x", val) < 0) {
1305 return HDF_FAILURE;
1306 }
1307 if (memcpy_s(value, strlen(tmp), tmp, strlen(tmp)) != 0) {
1308 return HDF_FAILURE;
1309 }
1310 return HDF_SUCCESS;
1311 } else {
1312 const char *propValue = UsbFnCfgFindPropFromHcs(intf, name);
1313 if (propValue == NULL) {
1314 return HDF_FAILURE;
1315 }
1316 if (memcpy_s(value, strlen(propValue), propValue, strlen(propValue)) != EOK) {
1317 HDF_LOGE("%{public}s: memcpy_s failed", __func__);
1318 return HDF_FAILURE;
1319 }
1320 return HDF_SUCCESS;
1321 }
1322 }
1323
1324 struct UsbFnCfgPropMgr *fnCfgPropMgr = UsbfnCfgMgrFindPropMgr(intf, name);
1325 if (fnCfgPropMgr == NULL) {
1326 return HDF_FAILURE;
1327 }
1328 if (memcpy_s(value, strlen(fnCfgPropMgr->value), fnCfgPropMgr->value, strlen(fnCfgPropMgr->value)) != EOK) {
1329 return HDF_FAILURE;
1330 }
1331 if (fnCfgPropMgr->getPropCallback) {
1332 fnCfgPropMgr->getPropCallback(intf, name, fnCfgPropMgr->value);
1333 }
1334 return HDF_SUCCESS;
1335 }
1336
UsbFnCfgMgrSetProp(const struct UsbFnInterface * intf,const char * name,const char * value)1337 int32_t UsbFnCfgMgrSetProp(const struct UsbFnInterface *intf, const char *name, const char *value)
1338 {
1339 if (intf == NULL || name == NULL) {
1340 return HDF_FAILURE;
1341 }
1342
1343 if (g_cfgEntry.next == 0) {
1344 DListHeadInit(&g_cfgEntry);
1345 }
1346
1347 struct UsbFnRegistInfo registInfo;
1348 registInfo.name = name;
1349 registInfo.value = value;
1350 registInfo.setProp = NULL;
1351 registInfo.getProp = NULL;
1352 int32_t deviceProp = IsDevDescProp(name);
1353 int32_t isRegist = IsPropRegisted(intf, name);
1354 if (isRegist == 0 && deviceProp == 0) {
1355 const char *propValue = UsbFnCfgFindPropFromHcs(intf, name);
1356 if (propValue != NULL) {
1357 return UsbFnCfgMgrRegisterProp(intf, ®istInfo);
1358 }
1359 return HDF_FAILURE;
1360 }
1361
1362 struct UsbFnCfgPropMgr *fnCfgPropMgr = NULL;
1363 if (isRegist != 0) {
1364 fnCfgPropMgr = UsbfnCfgMgrFindPropMgr(intf, name);
1365 if (fnCfgPropMgr == NULL) {
1366 return HDF_FAILURE;
1367 }
1368 int32_t ret = snprintf_s(fnCfgPropMgr->value, MAX_LEN, MAX_LEN - 1, "%s", value);
1369 if (ret < 0) {
1370 return HDF_FAILURE;
1371 }
1372 }
1373 if (deviceProp != 0) {
1374 if (isRegist == 0 && UsbFnCfgMgrRegisterProp(intf, ®istInfo) != HDF_SUCCESS) {
1375 return HDF_FAILURE;
1376 }
1377 if (UsbFnCfgChangeDevceDes(intf, name, value) != HDF_SUCCESS) {
1378 return HDF_FAILURE;
1379 }
1380 }
1381 if (isRegist && fnCfgPropMgr->setPropCallback) {
1382 fnCfgPropMgr->setPropCallback(intf, name, fnCfgPropMgr->value);
1383 }
1384 return HDF_SUCCESS;
1385 }
1386