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