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