• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &registInfo);
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, &registInfo)) {
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