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