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