1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "usbfn_cfg_mgr.h"
17094332d3Sopenharmony_ci
18094332d3Sopenharmony_ci#include <device_resource_if.h>
19094332d3Sopenharmony_ci#include <hcs_tree_if.h>
20094332d3Sopenharmony_ci#include <hdf_base.h>
21094332d3Sopenharmony_ci#include <hdf_log.h>
22094332d3Sopenharmony_ci#include <osal_mem.h>
23094332d3Sopenharmony_ci#include <osal_thread.h>
24094332d3Sopenharmony_ci#include <securec.h>
25094332d3Sopenharmony_ci
26094332d3Sopenharmony_ci#include "adapter_if.h"
27094332d3Sopenharmony_ci#include "usbfn_dev_mgr.h"
28094332d3Sopenharmony_ci#include "usbd_wrapper.h"
29094332d3Sopenharmony_ci
30094332d3Sopenharmony_ci#define HDF_LOG_TAG usbfn_cfg
31094332d3Sopenharmony_cistatic struct DListHead g_cfgEntry = {0};
32094332d3Sopenharmony_ci
33094332d3Sopenharmony_cistatic uint32_t UsbFnCfgMgrParseDevDesc(const struct DeviceResourceNode *devDescNode,
34094332d3Sopenharmony_ci    struct DeviceResourceIface *drsOps, struct UsbDeviceDescriptor *devDesc)
35094332d3Sopenharmony_ci{
36094332d3Sopenharmony_ci    uint16_t value;
37094332d3Sopenharmony_ci
38094332d3Sopenharmony_ci    if (drsOps->GetUint8(devDescNode, DESC_LENGTH, &devDesc->bLength, 0) != HDF_SUCCESS) {
39094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read length fail", __func__);
40094332d3Sopenharmony_ci        return HDF_FAILURE;
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci    if (devDesc->bLength != sizeof(struct UsbDeviceDescriptor)) {
43094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: dev desc length is not ringht", __func__);
44094332d3Sopenharmony_ci        return HDF_FAILURE;
45094332d3Sopenharmony_ci    }
46094332d3Sopenharmony_ci    if (drsOps->GetUint8(devDescNode, DESC_TYPE, &devDesc->bDescriptorType, 0) != HDF_SUCCESS ||
47094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_CLASS, &devDesc->bDeviceClass, 0) != HDF_SUCCESS ||
48094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_SUBCLASS, &devDesc->bDeviceSubClass, 0) != HDF_SUCCESS ||
49094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_PROTOCOL, &devDesc->bDeviceProtocol, 0) != HDF_SUCCESS ||
50094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_MAXSIZE, &devDesc->bMaxPacketSize0, 0) != HDF_SUCCESS ||
51094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_MANUFACTURER, &devDesc->iManufacturer, 0) != HDF_SUCCESS ||
52094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_PRODUCT, &devDesc->iProduct, 0) != HDF_SUCCESS ||
53094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_SERIALNUM, &devDesc->iSerialNumber, 0) != HDF_SUCCESS ||
54094332d3Sopenharmony_ci        drsOps->GetUint8(devDescNode, USBDEV_NUMCFG, &devDesc->bNumConfigurations, 0) != HDF_SUCCESS) {
55094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
56094332d3Sopenharmony_ci        return HDF_FAILURE;
57094332d3Sopenharmony_ci    }
58094332d3Sopenharmony_ci    if (devDesc->bDescriptorType != USB_DDK_DT_DEVICE) {
59094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: dev desc length is not ringht", __func__);
60094332d3Sopenharmony_ci        return HDF_FAILURE;
61094332d3Sopenharmony_ci    }
62094332d3Sopenharmony_ci    if (drsOps->GetUint16(devDescNode, USBDEV_BCD, &value, 0) != HDF_SUCCESS) {
63094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read bcdUSB fail", __func__);
64094332d3Sopenharmony_ci        return HDF_FAILURE;
65094332d3Sopenharmony_ci    }
66094332d3Sopenharmony_ci    devDesc->bcdUSB = LE16_TO_CPU(value);
67094332d3Sopenharmony_ci    if (drsOps->GetUint16(devDescNode, USBDEV_VENDOR, &value, 0) != HDF_SUCCESS) {
68094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read idVendor fail", __func__);
69094332d3Sopenharmony_ci        return HDF_FAILURE;
70094332d3Sopenharmony_ci    }
71094332d3Sopenharmony_ci    devDesc->idVendor = LE16_TO_CPU(value);
72094332d3Sopenharmony_ci    if (drsOps->GetUint16(devDescNode, USBDEV_IDPRODUCT, &value, 0) != HDF_SUCCESS) {
73094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read idProduct fail", __func__);
74094332d3Sopenharmony_ci        return HDF_FAILURE;
75094332d3Sopenharmony_ci    }
76094332d3Sopenharmony_ci    devDesc->idProduct = LE16_TO_CPU(value);
77094332d3Sopenharmony_ci    if (drsOps->GetUint16(devDescNode, USBDEV_BCDDEVICE, &value, 0) != HDF_SUCCESS) {
78094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read bcdDevice fail", __func__);
79094332d3Sopenharmony_ci        return HDF_FAILURE;
80094332d3Sopenharmony_ci    }
81094332d3Sopenharmony_ci    devDesc->bcdDevice = LE16_TO_CPU(value);
82094332d3Sopenharmony_ci
83094332d3Sopenharmony_ci    return HDF_SUCCESS;
84094332d3Sopenharmony_ci}
85094332d3Sopenharmony_ci
86094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnDevDesc(const struct DeviceResourceNode *node, struct UsbFnDeviceDesc *fnDevDesc)
87094332d3Sopenharmony_ci{
88094332d3Sopenharmony_ci    const char *childNodeName = NULL;
89094332d3Sopenharmony_ci    if (node == NULL || fnDevDesc == NULL) {
90094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node or fnDevDesc is null", __func__);
91094332d3Sopenharmony_ci        return HDF_FAILURE;
92094332d3Sopenharmony_ci    }
93094332d3Sopenharmony_ci    struct DeviceResourceIface *drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
94094332d3Sopenharmony_ci    if (drsOps == NULL || drsOps->GetChildNode == NULL) {
95094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
96094332d3Sopenharmony_ci        return HDF_FAILURE;
97094332d3Sopenharmony_ci    }
98094332d3Sopenharmony_ci    if (drsOps->GetString(node, "usb_dev_desc", &childNodeName, NULL) != HDF_SUCCESS) {
99094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get usb_dev_desc node name failed", __func__);
100094332d3Sopenharmony_ci        return HDF_FAILURE;
101094332d3Sopenharmony_ci    }
102094332d3Sopenharmony_ci    const struct DeviceResourceNode *devDescNode = drsOps->GetChildNode(node, childNodeName);
103094332d3Sopenharmony_ci    if (devDescNode == NULL) {
104094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: childDevDescNode is null", __func__);
105094332d3Sopenharmony_ci        return HDF_FAILURE;
106094332d3Sopenharmony_ci    }
107094332d3Sopenharmony_ci    fnDevDesc->deviceDesc = (struct UsbDeviceDescriptor *)UsbFnMemCalloc(sizeof(struct UsbDeviceDescriptor));
108094332d3Sopenharmony_ci    if (fnDevDesc->deviceDesc == NULL) {
109094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
110094332d3Sopenharmony_ci        return HDF_FAILURE;
111094332d3Sopenharmony_ci    }
112094332d3Sopenharmony_ci    if (UsbFnCfgMgrParseDevDesc(devDescNode, drsOps, fnDevDesc->deviceDesc)) {
113094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
114094332d3Sopenharmony_ci        goto FAIL;
115094332d3Sopenharmony_ci    }
116094332d3Sopenharmony_ci    return HDF_SUCCESS;
117094332d3Sopenharmony_ciFAIL:
118094332d3Sopenharmony_ci    UsbFnMemFree(fnDevDesc->deviceDesc);
119094332d3Sopenharmony_ci    return HDF_FAILURE;
120094332d3Sopenharmony_ci}
121094332d3Sopenharmony_ci
122094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseString(
123094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, struct UsbFnStrings *fnString)
124094332d3Sopenharmony_ci{
125094332d3Sopenharmony_ci    int32_t iCount;
126094332d3Sopenharmony_ci    int32_t strCount;
127094332d3Sopenharmony_ci    int32_t ret;
128094332d3Sopenharmony_ci    const char *strNodeName = NULL;
129094332d3Sopenharmony_ci    const struct DeviceResourceNode *strNode = NULL;
130094332d3Sopenharmony_ci
131094332d3Sopenharmony_ci    if (node == NULL || fnString == NULL || drsOps == NULL) {
132094332d3Sopenharmony_ci        return HDF_FAILURE;
133094332d3Sopenharmony_ci    }
134094332d3Sopenharmony_ci    if (drsOps->GetUint16(node, "language", &fnString->language, 0) != HDF_SUCCESS) {
135094332d3Sopenharmony_ci        return HDF_FAILURE;
136094332d3Sopenharmony_ci    }
137094332d3Sopenharmony_ci    strCount = drsOps->GetElemNum(node, "stringList");
138094332d3Sopenharmony_ci    if (strCount <= 0) {
139094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: stringList not found", __func__);
140094332d3Sopenharmony_ci        return HDF_FAILURE;
141094332d3Sopenharmony_ci    }
142094332d3Sopenharmony_ci    fnString->strings = (struct UsbString *)UsbFnMemCalloc((strCount + 1) * sizeof(struct UsbString));
143094332d3Sopenharmony_ci    if (fnString->strings == NULL) {
144094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: fnString->strings is null", __func__);
145094332d3Sopenharmony_ci        goto FREE_USB_STRING;
146094332d3Sopenharmony_ci    }
147094332d3Sopenharmony_ci    fnString->strings[strCount].s = NULL;
148094332d3Sopenharmony_ci    fnString->strings[strCount].id = 0xff;
149094332d3Sopenharmony_ci    for (iCount = 0; iCount < strCount; iCount++) {
150094332d3Sopenharmony_ci        ret = drsOps->GetStringArrayElem(node, "stringList", iCount, &strNodeName, NULL);
151094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
152094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: read stringList fail", __func__);
153094332d3Sopenharmony_ci            goto FREE_USB_STRING;
154094332d3Sopenharmony_ci        }
155094332d3Sopenharmony_ci        strNode = drsOps->GetChildNode(node, strNodeName);
156094332d3Sopenharmony_ci        if (strNode == NULL) {
157094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: StrNode is null", __func__);
158094332d3Sopenharmony_ci            goto FREE_USB_STRING;
159094332d3Sopenharmony_ci        }
160094332d3Sopenharmony_ci        struct UsbString *usbStr = fnString->strings + iCount;
161094332d3Sopenharmony_ci        if (drsOps->GetUint8(strNode, "id", &usbStr->id, 0) != HDF_SUCCESS) {
162094332d3Sopenharmony_ci            goto FREE_USB_STRING;
163094332d3Sopenharmony_ci        }
164094332d3Sopenharmony_ci        if (drsOps->GetString(strNode, "str", &usbStr->s, 0) != HDF_SUCCESS) {
165094332d3Sopenharmony_ci            goto FREE_USB_STRING;
166094332d3Sopenharmony_ci        }
167094332d3Sopenharmony_ci    }
168094332d3Sopenharmony_ci
169094332d3Sopenharmony_ci    return HDF_SUCCESS;
170094332d3Sopenharmony_ciFREE_USB_STRING:
171094332d3Sopenharmony_ci    UsbFnMemFree(fnString->strings);
172094332d3Sopenharmony_ci    return HDF_FAILURE;
173094332d3Sopenharmony_ci}
174094332d3Sopenharmony_ci
175094332d3Sopenharmony_cistatic struct UsbFnStrings **UsbFnCfgMgrParseStrings(
176094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps)
177094332d3Sopenharmony_ci{
178094332d3Sopenharmony_ci    int32_t strTabCount;
179094332d3Sopenharmony_ci    int32_t count;
180094332d3Sopenharmony_ci    int32_t ret;
181094332d3Sopenharmony_ci    const char *stringNodeName = NULL;
182094332d3Sopenharmony_ci    const struct DeviceResourceNode *stringNode = NULL;
183094332d3Sopenharmony_ci    struct UsbFnStrings **fnStrings = NULL;
184094332d3Sopenharmony_ci
185094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL) {
186094332d3Sopenharmony_ci        return NULL;
187094332d3Sopenharmony_ci    }
188094332d3Sopenharmony_ci    strTabCount = drsOps->GetElemNum(node, "stringTabList");
189094332d3Sopenharmony_ci    if (strTabCount <= 0) {
190094332d3Sopenharmony_ci        return NULL;
191094332d3Sopenharmony_ci    }
192094332d3Sopenharmony_ci    fnStrings = (struct UsbFnStrings **)UsbFnMemCalloc((strTabCount + 1) * sizeof(struct UsbFnStrings *));
193094332d3Sopenharmony_ci    if (fnStrings == NULL) {
194094332d3Sopenharmony_ci        return NULL;
195094332d3Sopenharmony_ci    }
196094332d3Sopenharmony_ci    fnStrings[strTabCount] = NULL;
197094332d3Sopenharmony_ci    for (count = 0; count < strTabCount; count++) {
198094332d3Sopenharmony_ci        fnStrings[count] = (struct UsbFnStrings *)UsbFnMemCalloc(sizeof(struct UsbFnStrings));
199094332d3Sopenharmony_ci        if (fnStrings[count] == NULL) {
200094332d3Sopenharmony_ci            goto FREE_STRING;
201094332d3Sopenharmony_ci        }
202094332d3Sopenharmony_ci        ret = drsOps->GetStringArrayElem(node, "stringTabList", count, &stringNodeName, NULL);
203094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
204094332d3Sopenharmony_ci            goto FREE_STRING;
205094332d3Sopenharmony_ci        }
206094332d3Sopenharmony_ci        stringNode = drsOps->GetChildNode(node, stringNodeName);
207094332d3Sopenharmony_ci        if (stringNode == NULL) {
208094332d3Sopenharmony_ci            goto FREE_STRING;
209094332d3Sopenharmony_ci        }
210094332d3Sopenharmony_ci        if (UsbFnCfgMgrParseString(stringNode, drsOps, fnStrings[count]) != HDF_SUCCESS) {
211094332d3Sopenharmony_ci            goto FREE_STRING;
212094332d3Sopenharmony_ci        }
213094332d3Sopenharmony_ci    }
214094332d3Sopenharmony_ci    return fnStrings;
215094332d3Sopenharmony_ciFREE_STRING:
216094332d3Sopenharmony_ci    while ((--count) >= 0) {
217094332d3Sopenharmony_ci        UsbFnMemFree(fnStrings[count]);
218094332d3Sopenharmony_ci    }
219094332d3Sopenharmony_ci    UsbFnMemFree(fnStrings);
220094332d3Sopenharmony_ci    return NULL;
221094332d3Sopenharmony_ci}
222094332d3Sopenharmony_ci
223094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnDevStrings(const struct DeviceResourceNode *node, struct UsbFnDeviceDesc *fnDevDesc)
224094332d3Sopenharmony_ci{
225094332d3Sopenharmony_ci    struct DeviceResourceIface *drsOps = NULL;
226094332d3Sopenharmony_ci    const char *fnDevStrNodeName = NULL;
227094332d3Sopenharmony_ci    const struct DeviceResourceNode *fnDevStrNode = NULL;
228094332d3Sopenharmony_ci
229094332d3Sopenharmony_ci    if (node == NULL || fnDevDesc == NULL) {
230094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node or fnDevDesc is null", __func__);
231094332d3Sopenharmony_ci        return HDF_FAILURE;
232094332d3Sopenharmony_ci    }
233094332d3Sopenharmony_ci    drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
234094332d3Sopenharmony_ci    if (drsOps == NULL || drsOps->GetChildNode == NULL) {
235094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
236094332d3Sopenharmony_ci        return HDF_FAILURE;
237094332d3Sopenharmony_ci    }
238094332d3Sopenharmony_ci    if (drsOps->GetString(node, "usb_dev_string", &fnDevStrNodeName, NULL) != HDF_SUCCESS) {
239094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get dev strings name failed", __func__);
240094332d3Sopenharmony_ci        return HDF_FAILURE;
241094332d3Sopenharmony_ci    }
242094332d3Sopenharmony_ci    fnDevStrNode = drsOps->GetChildNode(node, fnDevStrNodeName);
243094332d3Sopenharmony_ci    if (fnDevStrNode == NULL) {
244094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: childDevDescNode is null", __func__);
245094332d3Sopenharmony_ci        return HDF_FAILURE;
246094332d3Sopenharmony_ci    }
247094332d3Sopenharmony_ci    fnDevDesc->deviceStrings = UsbFnCfgMgrParseStrings(fnDevStrNode, drsOps);
248094332d3Sopenharmony_ci    if (fnDevDesc->deviceStrings == NULL) {
249094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse device string error", __func__);
250094332d3Sopenharmony_ci        return HDF_FAILURE;
251094332d3Sopenharmony_ci    }
252094332d3Sopenharmony_ci
253094332d3Sopenharmony_ci    return HDF_SUCCESS;
254094332d3Sopenharmony_ci}
255094332d3Sopenharmony_ci
256094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseAccocInterfaceDesc(
257094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
258094332d3Sopenharmony_ci{
259094332d3Sopenharmony_ci    struct UsbInterfaceAssocDescriptor *desc = NULL;
260094332d3Sopenharmony_ci
261094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
262094332d3Sopenharmony_ci        return HDF_FAILURE;
263094332d3Sopenharmony_ci    }
264094332d3Sopenharmony_ci    desc = (struct UsbInterfaceAssocDescriptor *)descBuff;
265094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
266094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
267094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_FIRST, &desc->bFirstInterface, 0) != HDF_SUCCESS ||
268094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_COUNT, &desc->bInterfaceCount, 0) != HDF_SUCCESS ||
269094332d3Sopenharmony_ci        drsOps->GetUint8(node, FUNCTION_CLASS, &desc->bFunctionClass, 0) != HDF_SUCCESS ||
270094332d3Sopenharmony_ci        drsOps->GetUint8(node, FUNCTION_SUBCLASS, &desc->bFunctionSubClass, 0) != HDF_SUCCESS ||
271094332d3Sopenharmony_ci        drsOps->GetUint8(node, FUNCTION_PROTOCOL, &desc->bFunctionProtocol, 0) != HDF_SUCCESS ||
272094332d3Sopenharmony_ci        drsOps->GetUint8(node, FUNCTION_INDEX, &desc->iFunction, 0) != HDF_SUCCESS) {
273094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
274094332d3Sopenharmony_ci        return HDF_FAILURE;
275094332d3Sopenharmony_ci    }
276094332d3Sopenharmony_ci
277094332d3Sopenharmony_ci    return HDF_SUCCESS;
278094332d3Sopenharmony_ci}
279094332d3Sopenharmony_ci
280094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseInterfaceDesc(
281094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
282094332d3Sopenharmony_ci{
283094332d3Sopenharmony_ci    struct UsbInterfaceDescriptor *desc = NULL;
284094332d3Sopenharmony_ci
285094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
286094332d3Sopenharmony_ci        return HDF_FAILURE;
287094332d3Sopenharmony_ci    }
288094332d3Sopenharmony_ci    desc = (struct UsbInterfaceDescriptor *)descBuff;
289094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
290094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
291094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_NUMBER, &desc->bInterfaceNumber, 0) != HDF_SUCCESS ||
292094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_ALTERNATE, &desc->bAlternateSetting, 0) != HDF_SUCCESS ||
293094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_NENDPOINT, &desc->bNumEndpoints, 0) != HDF_SUCCESS ||
294094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_CLASS, &desc->bInterfaceClass, 0) != HDF_SUCCESS ||
295094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_SUBCLASS, &desc->bInterfaceSubClass, 0) != HDF_SUCCESS ||
296094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_PROTOCOL, &desc->bInterfaceProtocol, 0) != HDF_SUCCESS ||
297094332d3Sopenharmony_ci        drsOps->GetUint8(node, INTERFACE_INTERFACE, &desc->iInterface, 0) != HDF_SUCCESS) {
298094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
299094332d3Sopenharmony_ci        return HDF_FAILURE;
300094332d3Sopenharmony_ci    }
301094332d3Sopenharmony_ci
302094332d3Sopenharmony_ci    return HDF_SUCCESS;
303094332d3Sopenharmony_ci}
304094332d3Sopenharmony_ci
305094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseEndpointDesc(
306094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
307094332d3Sopenharmony_ci{
308094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
309094332d3Sopenharmony_ci        return HDF_FAILURE;
310094332d3Sopenharmony_ci    }
311094332d3Sopenharmony_ci
312094332d3Sopenharmony_ci    uint16_t value;
313094332d3Sopenharmony_ci    struct UsbEndpointDescriptor *desc = (struct UsbEndpointDescriptor *)descBuff;
314094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
315094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
316094332d3Sopenharmony_ci        drsOps->GetUint8(node, ENDPOINT_ADDRESS, &desc->bEndpointAddress, 0) != HDF_SUCCESS ||
317094332d3Sopenharmony_ci        drsOps->GetUint8(node, ENDPOINT_MATTR, &desc->bmAttributes, 0) != HDF_SUCCESS ||
318094332d3Sopenharmony_ci        drsOps->GetUint16(node, ENDPOINT_MAXPACKSIZE_W, &value, 0) != HDF_SUCCESS ||
319094332d3Sopenharmony_ci        drsOps->GetUint8(node, ENDPOINT_INTERVAL, &desc->bInterval, 0) != HDF_SUCCESS) {
320094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
321094332d3Sopenharmony_ci        return HDF_FAILURE;
322094332d3Sopenharmony_ci    }
323094332d3Sopenharmony_ci    desc->wMaxPacketSize = LE16_TO_CPU(value);
324094332d3Sopenharmony_ci    if (desc->bLength == USB_DDK_DT_ENDPOINT_AUDIO_SIZE) {
325094332d3Sopenharmony_ci        if (drsOps->GetUint8(node, ENDPOINT_REFRESH, &desc->bRefresh, 0) != HDF_SUCCESS ||
326094332d3Sopenharmony_ci            drsOps->GetUint8(node, ENDPOINT_SYNCADDR, &desc->bSynchAddress, 0) != HDF_SUCCESS) {
327094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: read fail", __func__);
328094332d3Sopenharmony_ci            return HDF_FAILURE;
329094332d3Sopenharmony_ci        }
330094332d3Sopenharmony_ci    }
331094332d3Sopenharmony_ci    return HDF_SUCCESS;
332094332d3Sopenharmony_ci}
333094332d3Sopenharmony_ci
334094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseStringDesc(
335094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
336094332d3Sopenharmony_ci{
337094332d3Sopenharmony_ci    struct UsbStringDescriptor *desc = NULL;
338094332d3Sopenharmony_ci    uint16_t value;
339094332d3Sopenharmony_ci
340094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
341094332d3Sopenharmony_ci        return HDF_FAILURE;
342094332d3Sopenharmony_ci    }
343094332d3Sopenharmony_ci    desc = (struct UsbStringDescriptor *)descBuff;
344094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
345094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
346094332d3Sopenharmony_ci        drsOps->GetUint16(node, STRING_DATA, &value, 0) != HDF_SUCCESS) {
347094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
348094332d3Sopenharmony_ci        return HDF_FAILURE;
349094332d3Sopenharmony_ci    }
350094332d3Sopenharmony_ci    desc->wData[0] = LE16_TO_CPU(value);
351094332d3Sopenharmony_ci
352094332d3Sopenharmony_ci    return HDF_SUCCESS;
353094332d3Sopenharmony_ci}
354094332d3Sopenharmony_ci
355094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseSspIsocEndpointDesc(
356094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
357094332d3Sopenharmony_ci{
358094332d3Sopenharmony_ci    struct UsbSspIsocEpCompDescriptor *desc = NULL;
359094332d3Sopenharmony_ci    uint16_t sValue;
360094332d3Sopenharmony_ci    uint32_t iValue;
361094332d3Sopenharmony_ci
362094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
363094332d3Sopenharmony_ci        return HDF_FAILURE;
364094332d3Sopenharmony_ci    }
365094332d3Sopenharmony_ci    desc = (struct UsbSspIsocEpCompDescriptor *)descBuff;
366094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
367094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
368094332d3Sopenharmony_ci        drsOps->GetUint16(node, SSP_ISOC_EPCOMP_WRESEVED, &sValue, 0) != HDF_SUCCESS ||
369094332d3Sopenharmony_ci        drsOps->GetUint32(node, SSP_ISOC_EPCOMP_DWPERINTERVAL, &iValue, 0) != HDF_SUCCESS) {
370094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
371094332d3Sopenharmony_ci        return HDF_FAILURE;
372094332d3Sopenharmony_ci    }
373094332d3Sopenharmony_ci    desc->wReseved = LE16_TO_CPU(sValue);
374094332d3Sopenharmony_ci    desc->dwBytesPerInterval = LE32_TO_CPU(iValue);
375094332d3Sopenharmony_ci
376094332d3Sopenharmony_ci    return HDF_SUCCESS;
377094332d3Sopenharmony_ci}
378094332d3Sopenharmony_ci
379094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseSsEndpointDesc(
380094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
381094332d3Sopenharmony_ci{
382094332d3Sopenharmony_ci    struct UsbSsEpCompDescriptor *desc = NULL;
383094332d3Sopenharmony_ci    uint16_t sValue;
384094332d3Sopenharmony_ci
385094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
386094332d3Sopenharmony_ci        return HDF_FAILURE;
387094332d3Sopenharmony_ci    }
388094332d3Sopenharmony_ci    desc = (struct UsbSsEpCompDescriptor *)descBuff;
389094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
390094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
391094332d3Sopenharmony_ci        drsOps->GetUint8(node, SS_EP_COMP_MAXBURST, &desc->bMaxBurst, 0) != HDF_SUCCESS ||
392094332d3Sopenharmony_ci        drsOps->GetUint8(node, SS_EP_COMP_MTTRIBUTE, &desc->bmAttributes, 0) != HDF_SUCCESS ||
393094332d3Sopenharmony_ci        drsOps->GetUint16(node, SS_EP_COMP_WPERINTERVAL, &sValue, 0) != HDF_SUCCESS) {
394094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
395094332d3Sopenharmony_ci        return HDF_FAILURE;
396094332d3Sopenharmony_ci    }
397094332d3Sopenharmony_ci    desc->wBytesPerInterval = LE16_TO_CPU(sValue);
398094332d3Sopenharmony_ci
399094332d3Sopenharmony_ci    return HDF_SUCCESS;
400094332d3Sopenharmony_ci}
401094332d3Sopenharmony_ci
402094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseQualifierDesc(
403094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
404094332d3Sopenharmony_ci{
405094332d3Sopenharmony_ci    struct UsbQualifierDescriptor *desc = NULL;
406094332d3Sopenharmony_ci    uint16_t sValue;
407094332d3Sopenharmony_ci
408094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
409094332d3Sopenharmony_ci        return HDF_FAILURE;
410094332d3Sopenharmony_ci    }
411094332d3Sopenharmony_ci    desc = (struct UsbQualifierDescriptor *)descBuff;
412094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
413094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
414094332d3Sopenharmony_ci        drsOps->GetUint8(node, QUALIFIER_CLASS, &desc->bDeviceClass, 0) != HDF_SUCCESS ||
415094332d3Sopenharmony_ci        drsOps->GetUint8(node, QUALIFIER_SUBCLASS, &desc->bDeviceSubClass, 0) != HDF_SUCCESS ||
416094332d3Sopenharmony_ci        drsOps->GetUint8(node, QUALIFIER_PROTOCOL, &desc->bDeviceProtocol, 0) != HDF_SUCCESS ||
417094332d3Sopenharmony_ci        drsOps->GetUint8(node, QUALIFIER_MAXSIZE, &desc->bMaxPacketSize0, 0) != HDF_SUCCESS ||
418094332d3Sopenharmony_ci        drsOps->GetUint8(node, QUALIFIER_NUMCFG, &desc->bNumConfigurations, 0) != HDF_SUCCESS ||
419094332d3Sopenharmony_ci        drsOps->GetUint16(node, QUALIFIER_BCD, &sValue, 0) != HDF_SUCCESS) {
420094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
421094332d3Sopenharmony_ci        return HDF_FAILURE;
422094332d3Sopenharmony_ci    }
423094332d3Sopenharmony_ci    desc->bcdUSB = LE16_TO_CPU(sValue);
424094332d3Sopenharmony_ci
425094332d3Sopenharmony_ci    return HDF_SUCCESS;
426094332d3Sopenharmony_ci}
427094332d3Sopenharmony_ci
428094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseOtgDesc(
429094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff, uint8_t length)
430094332d3Sopenharmony_ci{
431094332d3Sopenharmony_ci    struct UsbOtg20Descriptor *desc2 = NULL;
432094332d3Sopenharmony_ci    struct UsbOtgDescriptor *desc = NULL;
433094332d3Sopenharmony_ci    uint16_t sValue;
434094332d3Sopenharmony_ci
435094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
436094332d3Sopenharmony_ci        return HDF_FAILURE;
437094332d3Sopenharmony_ci    }
438094332d3Sopenharmony_ci    desc = (struct UsbOtgDescriptor *)descBuff;
439094332d3Sopenharmony_ci
440094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
441094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
442094332d3Sopenharmony_ci        drsOps->GetUint8(node, OTG_MTTRIBUTE, &desc->bmAttributes, 0) != HDF_SUCCESS) {
443094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
444094332d3Sopenharmony_ci        return HDF_FAILURE;
445094332d3Sopenharmony_ci    }
446094332d3Sopenharmony_ci    if (length == sizeof(struct UsbOtg20Descriptor)) {
447094332d3Sopenharmony_ci        desc2 = (struct UsbOtg20Descriptor *)descBuff;
448094332d3Sopenharmony_ci        if (drsOps->GetUint16(node, QUALIFIER_BCD, &sValue, 0) != HDF_SUCCESS) {
449094332d3Sopenharmony_ci            return HDF_FAILURE;
450094332d3Sopenharmony_ci        }
451094332d3Sopenharmony_ci        desc2->bcdOTG = LE16_TO_CPU(sValue);
452094332d3Sopenharmony_ci    }
453094332d3Sopenharmony_ci
454094332d3Sopenharmony_ci    return HDF_SUCCESS;
455094332d3Sopenharmony_ci}
456094332d3Sopenharmony_ci
457094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseDebugDesc(
458094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
459094332d3Sopenharmony_ci{
460094332d3Sopenharmony_ci    struct UsbDebugDescriptor *desc = NULL;
461094332d3Sopenharmony_ci
462094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
463094332d3Sopenharmony_ci        return HDF_FAILURE;
464094332d3Sopenharmony_ci    }
465094332d3Sopenharmony_ci    desc = (struct UsbDebugDescriptor *)descBuff;
466094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
467094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
468094332d3Sopenharmony_ci        drsOps->GetUint8(node, DEBUG_IN, &desc->bDebugInEndpoint, 0) != HDF_SUCCESS ||
469094332d3Sopenharmony_ci        drsOps->GetUint8(node, DEBUG_OUT, &desc->bDebugOutEndpoint, 0) != HDF_SUCCESS) {
470094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
471094332d3Sopenharmony_ci        return HDF_FAILURE;
472094332d3Sopenharmony_ci    }
473094332d3Sopenharmony_ci
474094332d3Sopenharmony_ci    return HDF_SUCCESS;
475094332d3Sopenharmony_ci}
476094332d3Sopenharmony_ci
477094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseSecurityDesc(
478094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff)
479094332d3Sopenharmony_ci{
480094332d3Sopenharmony_ci    struct UsbSecurityDescriptor *desc = NULL;
481094332d3Sopenharmony_ci    uint16_t sValue;
482094332d3Sopenharmony_ci
483094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
484094332d3Sopenharmony_ci        return HDF_FAILURE;
485094332d3Sopenharmony_ci    }
486094332d3Sopenharmony_ci    desc = (struct UsbSecurityDescriptor *)descBuff;
487094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &desc->bLength, 0) != HDF_SUCCESS ||
488094332d3Sopenharmony_ci        drsOps->GetUint8(node, DESC_TYPE, &desc->bDescriptorType, 0) != HDF_SUCCESS ||
489094332d3Sopenharmony_ci        drsOps->GetUint8(node, SECURITY_ENCRYTYPE, &desc->bNumEncryptionTypes, 0) != HDF_SUCCESS ||
490094332d3Sopenharmony_ci        drsOps->GetUint16(node, SECURITY_TOTALLENGTH, &sValue, 0) != HDF_SUCCESS) {
491094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read fail", __func__);
492094332d3Sopenharmony_ci        return HDF_FAILURE;
493094332d3Sopenharmony_ci    }
494094332d3Sopenharmony_ci    desc->wTotalLength = LE16_TO_CPU(sValue);
495094332d3Sopenharmony_ci
496094332d3Sopenharmony_ci    return HDF_SUCCESS;
497094332d3Sopenharmony_ci}
498094332d3Sopenharmony_ci
499094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseOtherDesc(
500094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, uint8_t *descBuff, uint8_t length)
501094332d3Sopenharmony_ci{
502094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
503094332d3Sopenharmony_ci        return HDF_FAILURE;
504094332d3Sopenharmony_ci    }
505094332d3Sopenharmony_ci    if (drsOps->GetUint8Array(node, "desc_data", descBuff, length, 0) != HDF_SUCCESS) {
506094332d3Sopenharmony_ci        return HDF_FAILURE;
507094332d3Sopenharmony_ci    }
508094332d3Sopenharmony_ci    if (descBuff[0] != length) {
509094332d3Sopenharmony_ci        return HDF_FAILURE;
510094332d3Sopenharmony_ci    }
511094332d3Sopenharmony_ci    return HDF_SUCCESS;
512094332d3Sopenharmony_ci}
513094332d3Sopenharmony_ci
514094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseDescriptor(const struct DeviceResourceNode *node,
515094332d3Sopenharmony_ci    const struct DeviceResourceIface *drsOps, uint8_t *descBuff, uint8_t descType, uint8_t length)
516094332d3Sopenharmony_ci{
517094332d3Sopenharmony_ci    int32_t ret;
518094332d3Sopenharmony_ci
519094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL || descBuff == NULL) {
520094332d3Sopenharmony_ci        return HDF_FAILURE;
521094332d3Sopenharmony_ci    }
522094332d3Sopenharmony_ci    switch (descType) {
523094332d3Sopenharmony_ci        case USB_DDK_DT_INTERFACE:
524094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseInterfaceDesc(node, drsOps, descBuff);
525094332d3Sopenharmony_ci            break;
526094332d3Sopenharmony_ci        case USB_DDK_DT_ENDPOINT:
527094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseEndpointDesc(node, drsOps, descBuff);
528094332d3Sopenharmony_ci            break;
529094332d3Sopenharmony_ci        case USB_DDK_DT_STRING:
530094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseStringDesc(node, drsOps, descBuff);
531094332d3Sopenharmony_ci            break;
532094332d3Sopenharmony_ci        case USB_DDK_DT_INTERFACE_ASSOCIATION:
533094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseAccocInterfaceDesc(node, drsOps, descBuff);
534094332d3Sopenharmony_ci            break;
535094332d3Sopenharmony_ci        case USB_DDK_DT_SSP_ISOC_ENDPOINT_COMP:
536094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseSspIsocEndpointDesc(node, drsOps, descBuff);
537094332d3Sopenharmony_ci            break;
538094332d3Sopenharmony_ci        case USB_DDK_DT_SS_ENDPOINT_COMP:
539094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseSsEndpointDesc(node, drsOps, descBuff);
540094332d3Sopenharmony_ci            break;
541094332d3Sopenharmony_ci        case USB_DDK_DT_DEVICE_QUALIFIER:
542094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseQualifierDesc(node, drsOps, descBuff);
543094332d3Sopenharmony_ci            break;
544094332d3Sopenharmony_ci        case USB_DDK_DT_OTG:
545094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseOtgDesc(node, drsOps, descBuff, length);
546094332d3Sopenharmony_ci            break;
547094332d3Sopenharmony_ci        case USB_DDK_DT_DEBUG:
548094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseDebugDesc(node, drsOps, descBuff);
549094332d3Sopenharmony_ci            break;
550094332d3Sopenharmony_ci        case USB_DDK_DT_SECURITY:
551094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseSecurityDesc(node, drsOps, descBuff);
552094332d3Sopenharmony_ci            break;
553094332d3Sopenharmony_ci        case USB_DDK_DT_ENCRYPTION_TYPE:
554094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseSecurityDesc(node, drsOps, descBuff);
555094332d3Sopenharmony_ci            break;
556094332d3Sopenharmony_ci        default:
557094332d3Sopenharmony_ci            ret = UsbFnCfgMgrParseOtherDesc(node, drsOps, descBuff, length);
558094332d3Sopenharmony_ci            break;
559094332d3Sopenharmony_ci    }
560094332d3Sopenharmony_ci
561094332d3Sopenharmony_ci    return ret;
562094332d3Sopenharmony_ci}
563094332d3Sopenharmony_ci
564094332d3Sopenharmony_cistatic struct UsbDescriptorHeader *UsbFnCfgMgrParseDesc(
565094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps)
566094332d3Sopenharmony_ci{
567094332d3Sopenharmony_ci    uint8_t length;
568094332d3Sopenharmony_ci    uint8_t descType;
569094332d3Sopenharmony_ci    uint8_t *descBuff = NULL;
570094332d3Sopenharmony_ci    int32_t ret;
571094332d3Sopenharmony_ci
572094332d3Sopenharmony_ci    if (node == NULL || drsOps == NULL) {
573094332d3Sopenharmony_ci        return NULL;
574094332d3Sopenharmony_ci    }
575094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_LENGTH, &length, 0) != HDF_SUCCESS) {
576094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read length fail", __func__);
577094332d3Sopenharmony_ci        return NULL;
578094332d3Sopenharmony_ci    }
579094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, DESC_TYPE, &descType, 0) != HDF_SUCCESS) {
580094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read type fail", __func__);
581094332d3Sopenharmony_ci        return NULL;
582094332d3Sopenharmony_ci    }
583094332d3Sopenharmony_ci    descBuff = (uint8_t *)UsbFnMemCalloc(length * sizeof(uint8_t));
584094332d3Sopenharmony_ci    if (descBuff == NULL) {
585094332d3Sopenharmony_ci        return NULL;
586094332d3Sopenharmony_ci    }
587094332d3Sopenharmony_ci    ret = UsbFnCfgMgrParseDescriptor(node, drsOps, descBuff, descType, length);
588094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
589094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: length = 0x%{public}x, descType = 0x%{public}x Parse fail", __func__, length, descType);
590094332d3Sopenharmony_ci        UsbFnMemFree(descBuff);
591094332d3Sopenharmony_ci        return NULL;
592094332d3Sopenharmony_ci    }
593094332d3Sopenharmony_ci
594094332d3Sopenharmony_ci    return (struct UsbDescriptorHeader *)descBuff;
595094332d3Sopenharmony_ci}
596094332d3Sopenharmony_ci
597094332d3Sopenharmony_cistatic struct UsbDescriptorHeader **UsbFnCfgMgrParseFunDesc(
598094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, const char *descName)
599094332d3Sopenharmony_ci{
600094332d3Sopenharmony_ci    int32_t descCount;
601094332d3Sopenharmony_ci    int32_t iCount;
602094332d3Sopenharmony_ci    const char *descNodeName = NULL;
603094332d3Sopenharmony_ci    const struct DeviceResourceNode *descNode = NULL;
604094332d3Sopenharmony_ci    struct UsbDescriptorHeader **descriptors = NULL;
605094332d3Sopenharmony_ci
606094332d3Sopenharmony_ci    if (node == NULL || descName == NULL || drsOps == NULL) {
607094332d3Sopenharmony_ci        return NULL;
608094332d3Sopenharmony_ci    }
609094332d3Sopenharmony_ci    descCount = drsOps->GetElemNum(node, descName);
610094332d3Sopenharmony_ci    if (descCount <= 0) {
611094332d3Sopenharmony_ci        return NULL;
612094332d3Sopenharmony_ci    }
613094332d3Sopenharmony_ci    descriptors = (struct UsbDescriptorHeader **)UsbFnMemCalloc((descCount + 1) * sizeof(struct UsbDescriptorHeader *));
614094332d3Sopenharmony_ci    if (descriptors == NULL) {
615094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
616094332d3Sopenharmony_ci        return NULL;
617094332d3Sopenharmony_ci    }
618094332d3Sopenharmony_ci    descriptors[descCount] = NULL;
619094332d3Sopenharmony_ci    for (iCount = 0; iCount < descCount; iCount++) {
620094332d3Sopenharmony_ci        if (drsOps->GetStringArrayElem(node, descName, iCount, &descNodeName, NULL) != HDF_SUCCESS) {
621094332d3Sopenharmony_ci            goto FREE_DESC_HEAD;
622094332d3Sopenharmony_ci        }
623094332d3Sopenharmony_ci        descNode = drsOps->GetChildNode(node, descNodeName);
624094332d3Sopenharmony_ci        if (descNode == NULL) {
625094332d3Sopenharmony_ci            goto FREE_DESC_HEAD;
626094332d3Sopenharmony_ci        }
627094332d3Sopenharmony_ci        descriptors[iCount] = UsbFnCfgMgrParseDesc(descNode, drsOps);
628094332d3Sopenharmony_ci        if (descriptors[iCount] == NULL) {
629094332d3Sopenharmony_ci            goto FREE_DESC_HEAD;
630094332d3Sopenharmony_ci        }
631094332d3Sopenharmony_ci    }
632094332d3Sopenharmony_ci    return descriptors;
633094332d3Sopenharmony_ciFREE_DESC_HEAD:
634094332d3Sopenharmony_ci    while ((--iCount) >= 0) {
635094332d3Sopenharmony_ci        UsbFnMemFree(descriptors[iCount]);
636094332d3Sopenharmony_ci    }
637094332d3Sopenharmony_ci    UsbFnMemFree(descriptors);
638094332d3Sopenharmony_ci    return NULL;
639094332d3Sopenharmony_ci}
640094332d3Sopenharmony_ci
641094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnFunction(
642094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, const struct DeviceResourceIface *drsOps, struct UsbFnFunction *fun)
643094332d3Sopenharmony_ci{
644094332d3Sopenharmony_ci    if (node == NULL || fun == NULL) {
645094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node or fnDevDesc or drsOps is null", __func__);
646094332d3Sopenharmony_ci        return HDF_FAILURE;
647094332d3Sopenharmony_ci    }
648094332d3Sopenharmony_ci    if (drsOps->GetString(node, "funcName", &fun->funcName, NULL) != HDF_SUCCESS) {
649094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get function name failed", __func__);
650094332d3Sopenharmony_ci        return HDF_FAILURE;
651094332d3Sopenharmony_ci    }
652094332d3Sopenharmony_ci    if (strncmp(fun->funcName, FUNCTION_GENERIC, strlen(FUNCTION_GENERIC)) != 0) {
653094332d3Sopenharmony_ci        return HDF_SUCCESS;
654094332d3Sopenharmony_ci    }
655094332d3Sopenharmony_ci    fun->strings = UsbFnCfgMgrParseStrings(node, drsOps);
656094332d3Sopenharmony_ci    if (fun->strings == NULL) {
657094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse device string error", __func__);
658094332d3Sopenharmony_ci        return HDF_FAILURE;
659094332d3Sopenharmony_ci    }
660094332d3Sopenharmony_ci    fun->fsDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "fsDescList");
661094332d3Sopenharmony_ci    if (fun->fsDescriptors == NULL) {
662094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse FS_DESC error", __func__);
663094332d3Sopenharmony_ci    }
664094332d3Sopenharmony_ci    fun->hsDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "hsDescList");
665094332d3Sopenharmony_ci    if (fun->hsDescriptors == NULL) {
666094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse HS_DESC error", __func__);
667094332d3Sopenharmony_ci    }
668094332d3Sopenharmony_ci    fun->ssDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "ssDescList");
669094332d3Sopenharmony_ci    if (fun->ssDescriptors == NULL) {
670094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse SS_DESC error", __func__);
671094332d3Sopenharmony_ci    }
672094332d3Sopenharmony_ci    fun->sspDescriptors = UsbFnCfgMgrParseFunDesc(node, drsOps, "sspDescList");
673094332d3Sopenharmony_ci    if (fun->sspDescriptors == NULL) {
674094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse SSP_DESC error", __func__);
675094332d3Sopenharmony_ci    }
676094332d3Sopenharmony_ci
677094332d3Sopenharmony_ci    return HDF_SUCCESS;
678094332d3Sopenharmony_ci}
679094332d3Sopenharmony_ci
680094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnFunctions(
681094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, struct DeviceResourceIface *drsOps, struct UsbFnConfiguration *fnConfig)
682094332d3Sopenharmony_ci{
683094332d3Sopenharmony_ci    int32_t iCount;
684094332d3Sopenharmony_ci    int32_t funCount;
685094332d3Sopenharmony_ci    int32_t ret;
686094332d3Sopenharmony_ci    const char *funNodeName = NULL;
687094332d3Sopenharmony_ci    const struct DeviceResourceNode *funNode = NULL;
688094332d3Sopenharmony_ci
689094332d3Sopenharmony_ci    funCount = drsOps->GetElemNum(node, "functionList");
690094332d3Sopenharmony_ci    if (funCount <= 0) {
691094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get functionList num failed", __func__);
692094332d3Sopenharmony_ci        return HDF_FAILURE;
693094332d3Sopenharmony_ci    }
694094332d3Sopenharmony_ci    fnConfig->functions = (struct UsbFnFunction **)UsbFnMemCalloc((funCount + 1) * sizeof(struct UsbFnFunction *));
695094332d3Sopenharmony_ci    if (fnConfig->functions == NULL) {
696094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
697094332d3Sopenharmony_ci        return HDF_FAILURE;
698094332d3Sopenharmony_ci    }
699094332d3Sopenharmony_ci    fnConfig->functions[funCount] = NULL;
700094332d3Sopenharmony_ci    for (iCount = 0; iCount < funCount; iCount++) {
701094332d3Sopenharmony_ci        fnConfig->functions[iCount] = (struct UsbFnFunction *)UsbFnMemCalloc(sizeof(struct UsbFnFunction));
702094332d3Sopenharmony_ci        if (fnConfig->functions[iCount] == NULL) {
703094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
704094332d3Sopenharmony_ci            goto FREE_FUNTION;
705094332d3Sopenharmony_ci        }
706094332d3Sopenharmony_ci        ret = drsOps->GetStringArrayElem(node, "functionList", iCount, &funNodeName, NULL);
707094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
708094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: read stringList fail", __func__);
709094332d3Sopenharmony_ci            goto FREE_FUNTION;
710094332d3Sopenharmony_ci        }
711094332d3Sopenharmony_ci        funNode = drsOps->GetChildNode(node, funNodeName);
712094332d3Sopenharmony_ci        if (funNode == NULL) {
713094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: funNode not found", __func__);
714094332d3Sopenharmony_ci            goto FREE_FUNTION;
715094332d3Sopenharmony_ci        }
716094332d3Sopenharmony_ci        if (UsbFnCfgMgrParseUsbFnFunction(funNode, drsOps, fnConfig->functions[iCount]) != HDF_SUCCESS) {
717094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: parse function error", __func__);
718094332d3Sopenharmony_ci            goto FREE_FUNTION;
719094332d3Sopenharmony_ci        }
720094332d3Sopenharmony_ci    }
721094332d3Sopenharmony_ci
722094332d3Sopenharmony_ci    return HDF_SUCCESS;
723094332d3Sopenharmony_ciFREE_FUNTION:
724094332d3Sopenharmony_ci    while ((--iCount) > 0) {
725094332d3Sopenharmony_ci        UsbFnMemFree((void *)fnConfig->functions[iCount]);
726094332d3Sopenharmony_ci        fnConfig->functions[iCount] = NULL;
727094332d3Sopenharmony_ci    }
728094332d3Sopenharmony_ci    UsbFnMemFree(fnConfig->functions);
729094332d3Sopenharmony_ci    fnConfig->functions = NULL;
730094332d3Sopenharmony_ci    return HDF_FAILURE;
731094332d3Sopenharmony_ci}
732094332d3Sopenharmony_ci
733094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnConfiguration(
734094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, struct DeviceResourceIface *drsOps, struct UsbFnConfiguration *fnConfig)
735094332d3Sopenharmony_ci{
736094332d3Sopenharmony_ci    if (node == NULL || fnConfig == NULL || drsOps == NULL) {
737094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node or fnDevDesc or drsOps is null", __func__);
738094332d3Sopenharmony_ci        return HDF_FAILURE;
739094332d3Sopenharmony_ci    }
740094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, "configurationValue", &fnConfig->configurationValue, 0) != HDF_SUCCESS) {
741094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read strCount fail", __func__);
742094332d3Sopenharmony_ci        return HDF_FAILURE;
743094332d3Sopenharmony_ci    }
744094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, "iConfiguration", &fnConfig->iConfiguration, 0) != HDF_SUCCESS) {
745094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read strCount fail", __func__);
746094332d3Sopenharmony_ci        return HDF_FAILURE;
747094332d3Sopenharmony_ci    }
748094332d3Sopenharmony_ci    if (drsOps->GetUint8(node, "attributes", &fnConfig->attributes, 0) != HDF_SUCCESS) {
749094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read strCount fail", __func__);
750094332d3Sopenharmony_ci        return HDF_FAILURE;
751094332d3Sopenharmony_ci    }
752094332d3Sopenharmony_ci    if (drsOps->GetUint16(node, "maxPower", &fnConfig->maxPower, 0) != HDF_SUCCESS) {
753094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read strCount fail", __func__);
754094332d3Sopenharmony_ci        return HDF_FAILURE;
755094332d3Sopenharmony_ci    }
756094332d3Sopenharmony_ci    if (UsbFnCfgMgrParseUsbFnFunctions(node, drsOps, fnConfig) != HDF_SUCCESS) {
757094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse functions failed", __func__);
758094332d3Sopenharmony_ci        return HDF_FAILURE;
759094332d3Sopenharmony_ci    }
760094332d3Sopenharmony_ci    return HDF_SUCCESS;
761094332d3Sopenharmony_ci}
762094332d3Sopenharmony_ci
763094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnCfgLists(
764094332d3Sopenharmony_ci    const struct DeviceResourceNode *configNode, struct DeviceResourceIface *drsOps, struct UsbFnDeviceDesc *fnDevDesc)
765094332d3Sopenharmony_ci{
766094332d3Sopenharmony_ci    int32_t configCount;
767094332d3Sopenharmony_ci    int32_t count;
768094332d3Sopenharmony_ci    int32_t ret;
769094332d3Sopenharmony_ci    const char *childConfigNodeName = NULL;
770094332d3Sopenharmony_ci    const struct DeviceResourceNode *childConfigNode = NULL;
771094332d3Sopenharmony_ci
772094332d3Sopenharmony_ci    configCount = drsOps->GetElemNum(configNode, "configList");
773094332d3Sopenharmony_ci    if (configCount <= 0) {
774094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get configList num failed", __func__);
775094332d3Sopenharmony_ci        return HDF_FAILURE;
776094332d3Sopenharmony_ci    }
777094332d3Sopenharmony_ci    fnDevDesc->configs =
778094332d3Sopenharmony_ci        (struct UsbFnConfiguration **)UsbFnMemCalloc((configCount + 1) * sizeof(struct UsbFnConfiguration *));
779094332d3Sopenharmony_ci    if (fnDevDesc->configs == NULL) {
780094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
781094332d3Sopenharmony_ci        return HDF_FAILURE;
782094332d3Sopenharmony_ci    }
783094332d3Sopenharmony_ci    fnDevDesc->configs[configCount] = NULL;
784094332d3Sopenharmony_ci    for (count = 0; count < configCount; count++) {
785094332d3Sopenharmony_ci        fnDevDesc->configs[count] = (struct UsbFnConfiguration *)UsbFnMemCalloc(sizeof(struct UsbFnConfiguration));
786094332d3Sopenharmony_ci        if (fnDevDesc->configs[count] == NULL) {
787094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
788094332d3Sopenharmony_ci            goto FREE_CONFIG;
789094332d3Sopenharmony_ci        }
790094332d3Sopenharmony_ci        ret = drsOps->GetStringArrayElem(configNode, "configList", count, &childConfigNodeName, NULL);
791094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
792094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: read stringList fail", __func__);
793094332d3Sopenharmony_ci            goto FREE_CONFIG;
794094332d3Sopenharmony_ci        }
795094332d3Sopenharmony_ci        childConfigNode = drsOps->GetChildNode(configNode, childConfigNodeName);
796094332d3Sopenharmony_ci        if (childConfigNode == NULL) {
797094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: StrNode is null", __func__);
798094332d3Sopenharmony_ci            goto FREE_CONFIG;
799094332d3Sopenharmony_ci        }
800094332d3Sopenharmony_ci        if (UsbFnCfgMgrParseUsbFnConfiguration(childConfigNode, drsOps, fnDevDesc->configs[count]) != HDF_SUCCESS) {
801094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: parse config failed", __func__);
802094332d3Sopenharmony_ci            goto FREE_CONFIG;
803094332d3Sopenharmony_ci        }
804094332d3Sopenharmony_ci    }
805094332d3Sopenharmony_ci
806094332d3Sopenharmony_ci    return HDF_SUCCESS;
807094332d3Sopenharmony_ciFREE_CONFIG:
808094332d3Sopenharmony_ci    while ((--count) >= 0) {
809094332d3Sopenharmony_ci        UsbFnMemFree(fnDevDesc->deviceStrings[count]);
810094332d3Sopenharmony_ci        fnDevDesc->deviceStrings[count] = NULL;
811094332d3Sopenharmony_ci    }
812094332d3Sopenharmony_ci    UsbFnMemFree(fnDevDesc->deviceStrings);
813094332d3Sopenharmony_ci    fnDevDesc->deviceStrings = NULL;
814094332d3Sopenharmony_ci    return HDF_FAILURE;
815094332d3Sopenharmony_ci}
816094332d3Sopenharmony_ci
817094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrParseUsbFnConfigurations(
818094332d3Sopenharmony_ci    const struct DeviceResourceNode *node, struct UsbFnDeviceDesc *fnDevDesc)
819094332d3Sopenharmony_ci{
820094332d3Sopenharmony_ci    struct DeviceResourceIface *drsOps = NULL;
821094332d3Sopenharmony_ci    const char *configNodeName = NULL;
822094332d3Sopenharmony_ci    const struct DeviceResourceNode *configNode = NULL;
823094332d3Sopenharmony_ci
824094332d3Sopenharmony_ci    if (node == NULL || fnDevDesc == NULL) {
825094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node or fnDevDesc is null", __func__);
826094332d3Sopenharmony_ci        return HDF_FAILURE;
827094332d3Sopenharmony_ci    }
828094332d3Sopenharmony_ci    drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
829094332d3Sopenharmony_ci    if (drsOps == NULL || drsOps->GetChildNode == NULL) {
830094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
831094332d3Sopenharmony_ci        return HDF_FAILURE;
832094332d3Sopenharmony_ci    }
833094332d3Sopenharmony_ci    if (drsOps->GetString(node, "usb_configuration", &configNodeName, NULL) != HDF_SUCCESS) {
834094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get config node name failed", __func__);
835094332d3Sopenharmony_ci        return HDF_FAILURE;
836094332d3Sopenharmony_ci    }
837094332d3Sopenharmony_ci    configNode = drsOps->GetChildNode(node, configNodeName);
838094332d3Sopenharmony_ci    if (configNode == NULL) {
839094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: configNode is null", __func__);
840094332d3Sopenharmony_ci        return HDF_FAILURE;
841094332d3Sopenharmony_ci    }
842094332d3Sopenharmony_ci    if (UsbFnCfgMgrParseUsbFnCfgLists(configNode, drsOps, fnDevDesc) != HDF_SUCCESS) {
843094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse usb config lists failed", __func__);
844094332d3Sopenharmony_ci        return HDF_FAILURE;
845094332d3Sopenharmony_ci    }
846094332d3Sopenharmony_ci    return HDF_SUCCESS;
847094332d3Sopenharmony_ci}
848094332d3Sopenharmony_ci
849094332d3Sopenharmony_cistruct UsbFnDeviceDesc *UsbFnCfgMgrGetInstanceFromHCS(const struct DeviceResourceNode *node)
850094332d3Sopenharmony_ci{
851094332d3Sopenharmony_ci    int32_t ret;
852094332d3Sopenharmony_ci    struct UsbFnDeviceDesc *usbDevDesc = NULL;
853094332d3Sopenharmony_ci
854094332d3Sopenharmony_ci    if (node == NULL) {
855094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node is null", __func__);
856094332d3Sopenharmony_ci        return NULL;
857094332d3Sopenharmony_ci    }
858094332d3Sopenharmony_ci
859094332d3Sopenharmony_ci    usbDevDesc = (struct UsbFnDeviceDesc *)UsbFnMemCalloc(sizeof(*usbDevDesc));
860094332d3Sopenharmony_ci    if (usbDevDesc == NULL) {
861094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnMemCalloc failed", __func__);
862094332d3Sopenharmony_ci        return NULL;
863094332d3Sopenharmony_ci    }
864094332d3Sopenharmony_ci    ret = UsbFnCfgMgrParseUsbFnDevDesc(node, usbDevDesc);
865094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
866094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse device descriptor failed", __func__);
867094332d3Sopenharmony_ci        UsbFnMemFree(usbDevDesc);
868094332d3Sopenharmony_ci        return NULL;
869094332d3Sopenharmony_ci    }
870094332d3Sopenharmony_ci    ret = UsbFnCfgMgrParseUsbFnDevStrings(node, usbDevDesc);
871094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
872094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse device string failed", __func__);
873094332d3Sopenharmony_ci        goto FAIL_DEV_STRING;
874094332d3Sopenharmony_ci    }
875094332d3Sopenharmony_ci    ret = UsbFnCfgMgrParseUsbFnConfigurations(node, usbDevDesc);
876094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
877094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: parse config descriptor failed", __func__);
878094332d3Sopenharmony_ci        goto FAIL_DEV_STRING;
879094332d3Sopenharmony_ci    }
880094332d3Sopenharmony_ci
881094332d3Sopenharmony_ci    return usbDevDesc;
882094332d3Sopenharmony_ci
883094332d3Sopenharmony_ciFAIL_DEV_STRING:
884094332d3Sopenharmony_ci    UsbFnMemFree(usbDevDesc->deviceDesc);
885094332d3Sopenharmony_ci    UsbFnMemFree(usbDevDesc);
886094332d3Sopenharmony_ci    return NULL;
887094332d3Sopenharmony_ci}
888094332d3Sopenharmony_ci
889094332d3Sopenharmony_cistatic void UsbFnCfgMgrFreeFnStrings(struct UsbFnStrings **fnStrings)
890094332d3Sopenharmony_ci{
891094332d3Sopenharmony_ci    int8_t iCount;
892094332d3Sopenharmony_ci
893094332d3Sopenharmony_ci    for (iCount = 0; (fnStrings[iCount] != NULL); iCount++) {
894094332d3Sopenharmony_ci        UsbFnMemFree(fnStrings[iCount]);
895094332d3Sopenharmony_ci    }
896094332d3Sopenharmony_ci    UsbFnMemFree(fnStrings);
897094332d3Sopenharmony_ci}
898094332d3Sopenharmony_ci
899094332d3Sopenharmony_cistatic void UsbFnCfgMgrFreeFuncDescHead(struct UsbDescriptorHeader **descHeads)
900094332d3Sopenharmony_ci{
901094332d3Sopenharmony_ci    int8_t iCount;
902094332d3Sopenharmony_ci
903094332d3Sopenharmony_ci    for (iCount = 0; (descHeads[iCount] != NULL); iCount++) {
904094332d3Sopenharmony_ci        UsbFnMemFree(descHeads[iCount]);
905094332d3Sopenharmony_ci    }
906094332d3Sopenharmony_ci    UsbFnMemFree(descHeads);
907094332d3Sopenharmony_ci}
908094332d3Sopenharmony_ci
909094332d3Sopenharmony_cistatic void UsbFnCfgMgrFreeFunctions(struct UsbFnFunction **fnFunctions)
910094332d3Sopenharmony_ci{
911094332d3Sopenharmony_ci    int8_t iCount;
912094332d3Sopenharmony_ci
913094332d3Sopenharmony_ci    for (iCount = 0; (fnFunctions[iCount] != NULL); iCount++) {
914094332d3Sopenharmony_ci        if (fnFunctions[iCount]->strings) {
915094332d3Sopenharmony_ci            UsbFnCfgMgrFreeFnStrings(fnFunctions[iCount]->strings);
916094332d3Sopenharmony_ci        }
917094332d3Sopenharmony_ci        if (fnFunctions[iCount]->fsDescriptors) {
918094332d3Sopenharmony_ci            UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->fsDescriptors);
919094332d3Sopenharmony_ci        }
920094332d3Sopenharmony_ci        if (fnFunctions[iCount]->hsDescriptors) {
921094332d3Sopenharmony_ci            UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->hsDescriptors);
922094332d3Sopenharmony_ci        }
923094332d3Sopenharmony_ci        if (fnFunctions[iCount]->ssDescriptors) {
924094332d3Sopenharmony_ci            UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->ssDescriptors);
925094332d3Sopenharmony_ci        }
926094332d3Sopenharmony_ci        if (fnFunctions[iCount]->sspDescriptors) {
927094332d3Sopenharmony_ci            UsbFnCfgMgrFreeFuncDescHead(fnFunctions[iCount]->sspDescriptors);
928094332d3Sopenharmony_ci        }
929094332d3Sopenharmony_ci        UsbFnMemFree(fnFunctions[iCount]);
930094332d3Sopenharmony_ci    }
931094332d3Sopenharmony_ci    UsbFnMemFree(fnFunctions);
932094332d3Sopenharmony_ci}
933094332d3Sopenharmony_ci
934094332d3Sopenharmony_cistatic void UsbFnCfgMgrFreeConfigs(struct UsbFnConfiguration **fnConfigs)
935094332d3Sopenharmony_ci{
936094332d3Sopenharmony_ci    int8_t iCount;
937094332d3Sopenharmony_ci
938094332d3Sopenharmony_ci    for (iCount = 0; fnConfigs[iCount] != NULL; iCount++) {
939094332d3Sopenharmony_ci        if (fnConfigs[iCount]->functions) {
940094332d3Sopenharmony_ci            UsbFnCfgMgrFreeFunctions(fnConfigs[iCount]->functions);
941094332d3Sopenharmony_ci        }
942094332d3Sopenharmony_ci        UsbFnMemFree(fnConfigs[iCount]);
943094332d3Sopenharmony_ci    }
944094332d3Sopenharmony_ci    UsbFnMemFree(fnConfigs);
945094332d3Sopenharmony_ci}
946094332d3Sopenharmony_ci
947094332d3Sopenharmony_civoid UsbFnCfgMgrFreeUsbFnDeviceDesc(struct UsbFnDeviceDesc *fnDevDesc)
948094332d3Sopenharmony_ci{
949094332d3Sopenharmony_ci    if (fnDevDesc == NULL) {
950094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: fnDevDesc null", __func__);
951094332d3Sopenharmony_ci        return;
952094332d3Sopenharmony_ci    }
953094332d3Sopenharmony_ci    if (fnDevDesc->deviceDesc) {
954094332d3Sopenharmony_ci        UsbFnMemFree(fnDevDesc->deviceDesc);
955094332d3Sopenharmony_ci    }
956094332d3Sopenharmony_ci    if (fnDevDesc->deviceStrings) {
957094332d3Sopenharmony_ci        UsbFnCfgMgrFreeFnStrings(fnDevDesc->deviceStrings);
958094332d3Sopenharmony_ci    }
959094332d3Sopenharmony_ci    if (fnDevDesc->configs) {
960094332d3Sopenharmony_ci        UsbFnCfgMgrFreeConfigs(fnDevDesc->configs);
961094332d3Sopenharmony_ci    }
962094332d3Sopenharmony_ci    UsbFnMemFree(fnDevDesc);
963094332d3Sopenharmony_ci}
964094332d3Sopenharmony_ci
965094332d3Sopenharmony_cistatic uint8_t IsPropRegisted(const struct UsbFnInterface *intf, const char *name)
966094332d3Sopenharmony_ci{
967094332d3Sopenharmony_ci    if (DListIsEmpty(&g_cfgEntry) == true) {
968094332d3Sopenharmony_ci        return 0;
969094332d3Sopenharmony_ci    }
970094332d3Sopenharmony_ci
971094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *obj = NULL;
972094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *temp = NULL;
973094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(obj, temp, &g_cfgEntry, struct UsbFnCfgPropMgr, entry) {
974094332d3Sopenharmony_ci        if (obj->intf && (obj->intf == intf) && strcmp(name, obj->name) == 0) {
975094332d3Sopenharmony_ci            return 1;
976094332d3Sopenharmony_ci        }
977094332d3Sopenharmony_ci    }
978094332d3Sopenharmony_ci    return 0;
979094332d3Sopenharmony_ci}
980094332d3Sopenharmony_ci
981094332d3Sopenharmony_cistatic int32_t IsDevDescPropAndGetValue(const struct UsbFnInterface *intf, const char *name, uint16_t *value)
982094332d3Sopenharmony_ci{
983094332d3Sopenharmony_ci    if (name == NULL || intf == NULL) {
984094332d3Sopenharmony_ci        return 0;
985094332d3Sopenharmony_ci    }
986094332d3Sopenharmony_ci    struct UsbFnDeviceMgr *fnDevMgr = (struct UsbFnDeviceMgr *)intf->object;
987094332d3Sopenharmony_ci    if (fnDevMgr == NULL || fnDevMgr->des == NULL || fnDevMgr->des->deviceDesc == NULL) {
988094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: fnDevMgr is null", __func__);
989094332d3Sopenharmony_ci        return 0;
990094332d3Sopenharmony_ci    }
991094332d3Sopenharmony_ci    if (strcmp(USBDEV_CLASS, name) == 0) {
992094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bDeviceClass;
993094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_SUBCLASS, name) == 0) {
994094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bDeviceSubClass;
995094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_PROTOCOL, name) == 0) {
996094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bDeviceProtocol;
997094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_MAXSIZE, name) == 0) {
998094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bMaxPacketSize0;
999094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_MANUFACTURER, name) == 0) {
1000094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->iManufacturer;
1001094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_PRODUCT, name) == 0) {
1002094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->iProduct;
1003094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_SERIALNUM, name) == 0) {
1004094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->iSerialNumber;
1005094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_NUMCFG, name) == 0) {
1006094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bNumConfigurations;
1007094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_BCD, name) == 0) {
1008094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bcdUSB;
1009094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_VENDOR, name) == 0) {
1010094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->idVendor;
1011094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_IDPRODUCT, name) == 0) {
1012094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->idProduct;
1013094332d3Sopenharmony_ci    } else if (strcmp(USBDEV_BCDDEVICE, name) == 0) {
1014094332d3Sopenharmony_ci        *value = (uint16_t)fnDevMgr->des->deviceDesc->bcdDevice;
1015094332d3Sopenharmony_ci    } else {
1016094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: other prop", __func__);
1017094332d3Sopenharmony_ci        return 0;
1018094332d3Sopenharmony_ci    }
1019094332d3Sopenharmony_ci    return 1;
1020094332d3Sopenharmony_ci}
1021094332d3Sopenharmony_ci
1022094332d3Sopenharmony_cistatic int32_t IsDevDescProp(const char *name)
1023094332d3Sopenharmony_ci{
1024094332d3Sopenharmony_ci    if (name == NULL) {
1025094332d3Sopenharmony_ci        return 0;
1026094332d3Sopenharmony_ci    }
1027094332d3Sopenharmony_ci    if ((strcmp(USBDEV_SUBCLASS, name) == 0) || (strcmp(DESC_TYPE, name) == 0) || (strcmp(USBDEV_CLASS, name) == 0) ||
1028094332d3Sopenharmony_ci        (strcmp(USBDEV_PROTOCOL, name) == 0) || (strcmp(USBDEV_MAXSIZE, name) == 0) ||
1029094332d3Sopenharmony_ci        (strcmp(USBDEV_MANUFACTURER, name) == 0) || (strcmp(USBDEV_PRODUCT, name) == 0) ||
1030094332d3Sopenharmony_ci        (strcmp(USBDEV_SERIALNUM, name) == 0) || (strcmp(USBDEV_NUMCFG, name) == 0) ||
1031094332d3Sopenharmony_ci        (strcmp(USBDEV_BCD, name) == 0) || (strcmp(USBDEV_VENDOR, name) == 0) ||
1032094332d3Sopenharmony_ci        (strcmp(USBDEV_IDPRODUCT, name) == 0) || (strcmp(USBDEV_BCDDEVICE, name) == 0)) {
1033094332d3Sopenharmony_ci        return 1;
1034094332d3Sopenharmony_ci    }
1035094332d3Sopenharmony_ci    return 0;
1036094332d3Sopenharmony_ci}
1037094332d3Sopenharmony_ci
1038094332d3Sopenharmony_cistatic const char *UsbFnCfgGetPropValueFromPropList(const struct UsbFnDeviceMgr *fnDevMgr,
1039094332d3Sopenharmony_ci    const struct UsbFnInterface *intf, const struct DeviceResourceIface *drsOps,
1040094332d3Sopenharmony_ci    const struct DeviceResourceNode *propListNode, const char *name)
1041094332d3Sopenharmony_ci{
1042094332d3Sopenharmony_ci    uint8_t configNum;
1043094332d3Sopenharmony_ci    uint8_t interfaceNum;
1044094332d3Sopenharmony_ci    const char *propNodeName = NULL;
1045094332d3Sopenharmony_ci    const char *propValue = NULL;
1046094332d3Sopenharmony_ci    const char *propName = NULL;
1047094332d3Sopenharmony_ci    (void)fnDevMgr;
1048094332d3Sopenharmony_ci
1049094332d3Sopenharmony_ci    if (drsOps->GetUint8(propListNode, "configNum", &configNum, 0) != HDF_SUCCESS) {
1050094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read length fail", __func__);
1051094332d3Sopenharmony_ci        return NULL;
1052094332d3Sopenharmony_ci    }
1053094332d3Sopenharmony_ci    if (drsOps->GetUint8(propListNode, "interfaceNum", &interfaceNum, 0) != HDF_SUCCESS) {
1054094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: read length fail", __func__);
1055094332d3Sopenharmony_ci        return NULL;
1056094332d3Sopenharmony_ci    }
1057094332d3Sopenharmony_ci    if ((intf->info.index != interfaceNum) || (intf->info.configIndex != configNum)) {
1058094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: prop List is not ringt", __func__);
1059094332d3Sopenharmony_ci        return NULL;
1060094332d3Sopenharmony_ci    }
1061094332d3Sopenharmony_ci    int32_t propCount = drsOps->GetElemNum(propListNode, "propList");
1062094332d3Sopenharmony_ci    if (propCount <= 0) {
1063094332d3Sopenharmony_ci        return NULL;
1064094332d3Sopenharmony_ci    }
1065094332d3Sopenharmony_ci    for (int32_t count = 0; count < propCount; count++) {
1066094332d3Sopenharmony_ci        int32_t ret = drsOps->GetStringArrayElem(propListNode, "propList", count, &propNodeName, NULL);
1067094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1068094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: read stringList fail", __func__);
1069094332d3Sopenharmony_ci            return NULL;
1070094332d3Sopenharmony_ci        }
1071094332d3Sopenharmony_ci        const struct DeviceResourceNode *propNode = drsOps->GetChildNode(propListNode, propNodeName);
1072094332d3Sopenharmony_ci        if (propNode == NULL) {
1073094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: propNode is null", __func__);
1074094332d3Sopenharmony_ci            return NULL;
1075094332d3Sopenharmony_ci        }
1076094332d3Sopenharmony_ci        if (drsOps->GetString(propNode, "name", &propName, 0) != HDF_SUCCESS) {
1077094332d3Sopenharmony_ci            return NULL;
1078094332d3Sopenharmony_ci        }
1079094332d3Sopenharmony_ci        if (strcmp(propName, name) == 0) {
1080094332d3Sopenharmony_ci            if (drsOps->GetString(propNode, "value", &propValue, 0) != HDF_SUCCESS) {
1081094332d3Sopenharmony_ci                return NULL;
1082094332d3Sopenharmony_ci            }
1083094332d3Sopenharmony_ci            return propValue;
1084094332d3Sopenharmony_ci        }
1085094332d3Sopenharmony_ci    }
1086094332d3Sopenharmony_ci
1087094332d3Sopenharmony_ci    return NULL;
1088094332d3Sopenharmony_ci}
1089094332d3Sopenharmony_ci
1090094332d3Sopenharmony_cistatic const char *UsbFnCfgGetPropValueFromHcs(const struct UsbFnDeviceMgr *fnDevMgr, const struct UsbFnInterface *intf,
1091094332d3Sopenharmony_ci    const struct DeviceResourceIface *drsOps, const struct DeviceResourceNode *customNode, const char *name)
1092094332d3Sopenharmony_ci{
1093094332d3Sopenharmony_ci    const struct DeviceResourceNode *propListNode = NULL;
1094094332d3Sopenharmony_ci    const char *propNodeName = NULL;
1095094332d3Sopenharmony_ci    const char *propValue = NULL;
1096094332d3Sopenharmony_ci
1097094332d3Sopenharmony_ci    int32_t propTabCount = drsOps->GetElemNum(customNode, "propTable");
1098094332d3Sopenharmony_ci    if (propTabCount <= 0) {
1099094332d3Sopenharmony_ci        return NULL;
1100094332d3Sopenharmony_ci    }
1101094332d3Sopenharmony_ci    uint32_t totalCount = (uint32_t)propTabCount;
1102094332d3Sopenharmony_ci    for (uint32_t count = 0; count < totalCount; count++) {
1103094332d3Sopenharmony_ci        int32_t ret = drsOps->GetStringArrayElem(customNode, "propTable", count, &propNodeName, NULL);
1104094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1105094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: read stringList fail", __func__);
1106094332d3Sopenharmony_ci            return NULL;
1107094332d3Sopenharmony_ci        }
1108094332d3Sopenharmony_ci        propListNode = drsOps->GetChildNode(customNode, propNodeName);
1109094332d3Sopenharmony_ci        if (propListNode == NULL) {
1110094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: propNode is null", __func__);
1111094332d3Sopenharmony_ci            return NULL;
1112094332d3Sopenharmony_ci        }
1113094332d3Sopenharmony_ci        propValue = UsbFnCfgGetPropValueFromPropList(fnDevMgr, intf, drsOps, propListNode, name);
1114094332d3Sopenharmony_ci        if (propValue) {
1115094332d3Sopenharmony_ci            return propValue;
1116094332d3Sopenharmony_ci        }
1117094332d3Sopenharmony_ci    }
1118094332d3Sopenharmony_ci
1119094332d3Sopenharmony_ci    return NULL;
1120094332d3Sopenharmony_ci}
1121094332d3Sopenharmony_ci
1122094332d3Sopenharmony_cistatic const char *UsbFnCfgFindPropFromHcs(const struct UsbFnInterface *intf, const char *name)
1123094332d3Sopenharmony_ci{
1124094332d3Sopenharmony_ci    struct UsbFnDeviceMgr *fnDevMgr = NULL;
1125094332d3Sopenharmony_ci    const struct DeviceResourceNode *customNode = NULL;
1126094332d3Sopenharmony_ci    struct DeviceResourceIface *drsOps = NULL;
1127094332d3Sopenharmony_ci    const char *propValue = NULL;
1128094332d3Sopenharmony_ci
1129094332d3Sopenharmony_ci    if (name == NULL || intf == NULL) {
1130094332d3Sopenharmony_ci        return NULL;
1131094332d3Sopenharmony_ci    }
1132094332d3Sopenharmony_ci    fnDevMgr = (struct UsbFnDeviceMgr *)intf->object;
1133094332d3Sopenharmony_ci    if (fnDevMgr == NULL || fnDevMgr->node == NULL) {
1134094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: node is null", __func__);
1135094332d3Sopenharmony_ci        return NULL;
1136094332d3Sopenharmony_ci    }
1137094332d3Sopenharmony_ci    drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
1138094332d3Sopenharmony_ci    if (drsOps == NULL || drsOps->GetChildNode == NULL) {
1139094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid drs ops failed", __func__);
1140094332d3Sopenharmony_ci        return NULL;
1141094332d3Sopenharmony_ci    }
1142094332d3Sopenharmony_ci    customNode = drsOps->GetChildNode(fnDevMgr->node, "custom_prop");
1143094332d3Sopenharmony_ci    if (customNode == NULL) {
1144094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: childDevDescNode is null", __func__);
1145094332d3Sopenharmony_ci        return NULL;
1146094332d3Sopenharmony_ci    }
1147094332d3Sopenharmony_ci    propValue = UsbFnCfgGetPropValueFromHcs(fnDevMgr, intf, drsOps, customNode, name);
1148094332d3Sopenharmony_ci
1149094332d3Sopenharmony_ci    return propValue;
1150094332d3Sopenharmony_ci}
1151094332d3Sopenharmony_ci
1152094332d3Sopenharmony_cistatic int32_t UsbFnCfgChangeUdcName(const struct UsbFnDeviceMgr *fnDevMgr, struct UsbFnAdapterOps *fnOps)
1153094332d3Sopenharmony_ci{
1154094332d3Sopenharmony_ci    int32_t ret;
1155094332d3Sopenharmony_ci
1156094332d3Sopenharmony_ci    if (fnDevMgr == NULL || fnOps == NULL) {
1157094332d3Sopenharmony_ci        return HDF_FAILURE;
1158094332d3Sopenharmony_ci    }
1159094332d3Sopenharmony_ci    ret = fnOps->writeUDC(fnDevMgr->name, fnDevMgr->udcName, 0);
1160094332d3Sopenharmony_ci    if (ret) {
1161094332d3Sopenharmony_ci        return HDF_FAILURE;
1162094332d3Sopenharmony_ci    }
1163094332d3Sopenharmony_ci    ret = fnOps->writeUDC(fnDevMgr->name, fnDevMgr->udcName, 1);
1164094332d3Sopenharmony_ci    if (ret) {
1165094332d3Sopenharmony_ci        return HDF_FAILURE;
1166094332d3Sopenharmony_ci    }
1167094332d3Sopenharmony_ci
1168094332d3Sopenharmony_ci    return HDF_SUCCESS;
1169094332d3Sopenharmony_ci}
1170094332d3Sopenharmony_ci
1171094332d3Sopenharmony_cistatic int32_t UsbFnCfgChangeStrings(
1172094332d3Sopenharmony_ci    const struct UsbFnDeviceMgr *fnDevMgr, struct UsbFnAdapterOps *fnOps, uint32_t index, const char *propName)
1173094332d3Sopenharmony_ci{
1174094332d3Sopenharmony_ci    if (fnDevMgr == NULL || fnDevMgr->des == NULL || fnDevMgr->des->deviceStrings == NULL) {
1175094332d3Sopenharmony_ci        return HDF_FAILURE;
1176094332d3Sopenharmony_ci    }
1177094332d3Sopenharmony_ci
1178094332d3Sopenharmony_ci    struct UsbFnStrings **strings = fnDevMgr->des->deviceStrings;
1179094332d3Sopenharmony_ci    for (int32_t i = 0; strings[i] != NULL; i++) {
1180094332d3Sopenharmony_ci        int32_t ret =
1181094332d3Sopenharmony_ci            fnOps->writeDesString(fnDevMgr->name, strings[i]->language, propName, strings[i]->strings[index].s);
1182094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1183094332d3Sopenharmony_ci            return HDF_FAILURE;
1184094332d3Sopenharmony_ci        }
1185094332d3Sopenharmony_ci    }
1186094332d3Sopenharmony_ci    return HDF_SUCCESS;
1187094332d3Sopenharmony_ci}
1188094332d3Sopenharmony_ci
1189094332d3Sopenharmony_cistatic int32_t UsbFnCfgChangeDevceDes(const struct UsbFnInterface *intf, const char *name, const char *value)
1190094332d3Sopenharmony_ci{
1191094332d3Sopenharmony_ci    int32_t ret;
1192094332d3Sopenharmony_ci    uint32_t data;
1193094332d3Sopenharmony_ci    struct UsbFnAdapterOps *fnOps = UsbFnAdapterGetOps();
1194094332d3Sopenharmony_ci
1195094332d3Sopenharmony_ci    if (name == NULL || intf == NULL || fnOps == NULL) {
1196094332d3Sopenharmony_ci        return HDF_FAILURE;
1197094332d3Sopenharmony_ci    }
1198094332d3Sopenharmony_ci    struct UsbFnDeviceMgr *fnDevMgr = (struct UsbFnDeviceMgr *)intf->object;
1199094332d3Sopenharmony_ci    if (fnDevMgr == NULL || fnDevMgr->des == NULL || fnDevMgr->des->deviceDesc == NULL ||
1200094332d3Sopenharmony_ci        fnDevMgr->des->deviceStrings == NULL) {
1201094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: null", __func__);
1202094332d3Sopenharmony_ci        return HDF_FAILURE;
1203094332d3Sopenharmony_ci    }
1204094332d3Sopenharmony_ci    if (sscanf_s(value, "%x", &data) <= 0) {
1205094332d3Sopenharmony_ci        return HDF_FAILURE;
1206094332d3Sopenharmony_ci    }
1207094332d3Sopenharmony_ci    if (strcmp(name, USBDEV_MANUFACTURER) == 0 || strcmp(name, USBDEV_PRODUCT) == 0 ||
1208094332d3Sopenharmony_ci        strcmp(name, USBDEV_SERIALNUM) == 0) {
1209094332d3Sopenharmony_ci        ret = UsbFnCfgChangeStrings(fnDevMgr, fnOps, data, name);
1210094332d3Sopenharmony_ci        if (ret) {
1211094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
1212094332d3Sopenharmony_ci        }
1213094332d3Sopenharmony_ci    } else {
1214094332d3Sopenharmony_ci        ret = fnOps->writeProp(fnDevMgr->name, name, data);
1215094332d3Sopenharmony_ci        if (ret) {
1216094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
1217094332d3Sopenharmony_ci        }
1218094332d3Sopenharmony_ci    }
1219094332d3Sopenharmony_ci    if (UsbFnCfgChangeUdcName(fnDevMgr, fnOps) != HDF_SUCCESS) {
1220094332d3Sopenharmony_ci        return HDF_FAILURE;
1221094332d3Sopenharmony_ci    }
1222094332d3Sopenharmony_ci    return HDF_SUCCESS;
1223094332d3Sopenharmony_ci}
1224094332d3Sopenharmony_ci
1225094332d3Sopenharmony_cistatic struct UsbFnCfgPropMgr *UsbfnCfgMgrFindPropMgr(const struct UsbFnInterface *intf, const char *name)
1226094332d3Sopenharmony_ci{
1227094332d3Sopenharmony_ci    if (DListIsEmpty(&g_cfgEntry) == true) {
1228094332d3Sopenharmony_ci        return NULL;
1229094332d3Sopenharmony_ci    }
1230094332d3Sopenharmony_ci
1231094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *obj = NULL;
1232094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *temp = NULL;
1233094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(obj, temp, &g_cfgEntry, struct UsbFnCfgPropMgr, entry) {
1234094332d3Sopenharmony_ci        if (obj->intf && (obj->intf == intf) && strcmp(name, obj->name) == 0) {
1235094332d3Sopenharmony_ci            return obj;
1236094332d3Sopenharmony_ci        }
1237094332d3Sopenharmony_ci    }
1238094332d3Sopenharmony_ci    return NULL;
1239094332d3Sopenharmony_ci}
1240094332d3Sopenharmony_ci
1241094332d3Sopenharmony_cistatic int32_t UsbFnCfgMgrCheckRegist(const struct UsbFnInterface *intf, const struct UsbFnRegistInfo *registInfo,
1242094332d3Sopenharmony_ci    uint8_t isDevProp, int32_t isRegist, struct UsbFnCfgPropMgr *fnCfgPropMgr)
1243094332d3Sopenharmony_ci{
1244094332d3Sopenharmony_ci    if (isRegist != 0) {
1245094332d3Sopenharmony_ci        if (isDevProp == 0) {
1246094332d3Sopenharmony_ci            return HDF_FAILURE;
1247094332d3Sopenharmony_ci        } else {
1248094332d3Sopenharmony_ci            fnCfgPropMgr = UsbfnCfgMgrFindPropMgr(intf, registInfo->name);
1249094332d3Sopenharmony_ci            if (fnCfgPropMgr == NULL) {
1250094332d3Sopenharmony_ci                HDF_LOGE("%{public}s:%{public}s not found", __func__, registInfo->name);
1251094332d3Sopenharmony_ci                return HDF_FAILURE;
1252094332d3Sopenharmony_ci            }
1253094332d3Sopenharmony_ci        }
1254094332d3Sopenharmony_ci    } else {
1255094332d3Sopenharmony_ci        fnCfgPropMgr = UsbFnMemCalloc(sizeof(struct UsbFnCfgPropMgr));
1256094332d3Sopenharmony_ci        if (fnCfgPropMgr == NULL) {
1257094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d UsbFnMemCalloc failed", __func__, __LINE__);
1258094332d3Sopenharmony_ci            return HDF_FAILURE;
1259094332d3Sopenharmony_ci        }
1260094332d3Sopenharmony_ci    }
1261094332d3Sopenharmony_ci    return HDF_SUCCESS;
1262094332d3Sopenharmony_ci}
1263094332d3Sopenharmony_ci
1264094332d3Sopenharmony_ciint32_t UsbFnCfgMgrRegisterProp(const struct UsbFnInterface *intf, const struct UsbFnRegistInfo *registInfo)
1265094332d3Sopenharmony_ci{
1266094332d3Sopenharmony_ci    if (intf == NULL || registInfo == NULL || registInfo->name == NULL) {
1267094332d3Sopenharmony_ci        return HDF_FAILURE;
1268094332d3Sopenharmony_ci    }
1269094332d3Sopenharmony_ci    if (g_cfgEntry.next == 0) {
1270094332d3Sopenharmony_ci        DListHeadInit(&g_cfgEntry);
1271094332d3Sopenharmony_ci    }
1272094332d3Sopenharmony_ci
1273094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *fnCfgPropMgr = NULL;
1274094332d3Sopenharmony_ci    uint8_t isDevProp = (uint8_t)IsDevDescProp(registInfo->name);
1275094332d3Sopenharmony_ci    int32_t isRegist = IsPropRegisted(intf, registInfo->name);
1276094332d3Sopenharmony_ci    int32_t ret = UsbFnCfgMgrCheckRegist(intf, registInfo, isDevProp, isRegist, fnCfgPropMgr);
1277094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1278094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbFnCfgMgrCheckRegist failed", __func__);
1279094332d3Sopenharmony_ci        return HDF_FAILURE;
1280094332d3Sopenharmony_ci    }
1281094332d3Sopenharmony_ci    fnCfgPropMgr->isDevProp = isDevProp;
1282094332d3Sopenharmony_ci    fnCfgPropMgr->intf = intf;
1283094332d3Sopenharmony_ci    ret = snprintf_s(fnCfgPropMgr->name, MAX_LEN, MAX_LEN - 1, "%s", registInfo->name);
1284094332d3Sopenharmony_ci    if (ret < 0) {
1285094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: snprintf_s failed", __func__);
1286094332d3Sopenharmony_ci        if (isRegist == 0) {
1287094332d3Sopenharmony_ci            UsbFnMemFree(fnCfgPropMgr);
1288094332d3Sopenharmony_ci        }
1289094332d3Sopenharmony_ci        return HDF_FAILURE;
1290094332d3Sopenharmony_ci    }
1291094332d3Sopenharmony_ci    ret = snprintf_s(fnCfgPropMgr->value, MAX_LEN, MAX_LEN - 1, "%s", registInfo->value);
1292094332d3Sopenharmony_ci    if (ret < 0) {
1293094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: snprintf_s failed", __func__);
1294094332d3Sopenharmony_ci        if (isRegist == 0) {
1295094332d3Sopenharmony_ci            UsbFnMemFree(fnCfgPropMgr);
1296094332d3Sopenharmony_ci        }
1297094332d3Sopenharmony_ci        return HDF_FAILURE;
1298094332d3Sopenharmony_ci    }
1299094332d3Sopenharmony_ci    fnCfgPropMgr->getPropCallback = registInfo->getProp;
1300094332d3Sopenharmony_ci    fnCfgPropMgr->setPropCallback = registInfo->setProp;
1301094332d3Sopenharmony_ci    if (isRegist == 0) {
1302094332d3Sopenharmony_ci        DListInsertTail(&fnCfgPropMgr->entry, &g_cfgEntry);
1303094332d3Sopenharmony_ci    }
1304094332d3Sopenharmony_ci
1305094332d3Sopenharmony_ci    return HDF_SUCCESS;
1306094332d3Sopenharmony_ci}
1307094332d3Sopenharmony_ci
1308094332d3Sopenharmony_civoid UsbFnCfgMgrUnRegisterAllProp(void)
1309094332d3Sopenharmony_ci{
1310094332d3Sopenharmony_ci    if (g_cfgEntry.next == NULL) {
1311094332d3Sopenharmony_ci        return;
1312094332d3Sopenharmony_ci    }
1313094332d3Sopenharmony_ci
1314094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *obj = NULL;
1315094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *temp = NULL;
1316094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(obj, temp, &g_cfgEntry, struct UsbFnCfgPropMgr, entry) {
1317094332d3Sopenharmony_ci        DListRemove(&obj->entry);
1318094332d3Sopenharmony_ci        UsbFnMemFree(obj);
1319094332d3Sopenharmony_ci    }
1320094332d3Sopenharmony_ci    DListHeadInit(&g_cfgEntry);
1321094332d3Sopenharmony_ci}
1322094332d3Sopenharmony_ci
1323094332d3Sopenharmony_ciint32_t UsbFnCfgMgrGetProp(const struct UsbFnInterface *intf, const char *name, char *value)
1324094332d3Sopenharmony_ci{
1325094332d3Sopenharmony_ci    if (intf == NULL || name == NULL) {
1326094332d3Sopenharmony_ci        return HDF_FAILURE;
1327094332d3Sopenharmony_ci    }
1328094332d3Sopenharmony_ci    if (g_cfgEntry.next == 0) {
1329094332d3Sopenharmony_ci        DListHeadInit(&g_cfgEntry);
1330094332d3Sopenharmony_ci    }
1331094332d3Sopenharmony_ci    if (IsPropRegisted(intf, name) == 0) {
1332094332d3Sopenharmony_ci        uint16_t val;
1333094332d3Sopenharmony_ci        if (IsDevDescPropAndGetValue(intf, name, &val)) {
1334094332d3Sopenharmony_ci            char tmp[MAX_LEN];
1335094332d3Sopenharmony_ci            if (snprintf_s(tmp, MAX_LEN, MAX_LEN - 1, "%x", val) < 0) {
1336094332d3Sopenharmony_ci                return HDF_FAILURE;
1337094332d3Sopenharmony_ci            }
1338094332d3Sopenharmony_ci            if (memcpy_s(value, strlen(tmp), tmp, strlen(tmp)) != 0) {
1339094332d3Sopenharmony_ci                return HDF_FAILURE;
1340094332d3Sopenharmony_ci            }
1341094332d3Sopenharmony_ci            return HDF_SUCCESS;
1342094332d3Sopenharmony_ci        } else {
1343094332d3Sopenharmony_ci            const char *propValue = UsbFnCfgFindPropFromHcs(intf, name);
1344094332d3Sopenharmony_ci            if (propValue == NULL) {
1345094332d3Sopenharmony_ci                return HDF_FAILURE;
1346094332d3Sopenharmony_ci            }
1347094332d3Sopenharmony_ci            if (memcpy_s(value, strlen(propValue), propValue, strlen(propValue)) != EOK) {
1348094332d3Sopenharmony_ci                HDF_LOGE("%{public}s: memcpy_s failed", __func__);
1349094332d3Sopenharmony_ci                return HDF_FAILURE;
1350094332d3Sopenharmony_ci            }
1351094332d3Sopenharmony_ci            return HDF_SUCCESS;
1352094332d3Sopenharmony_ci        }
1353094332d3Sopenharmony_ci    }
1354094332d3Sopenharmony_ci
1355094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *fnCfgPropMgr = UsbfnCfgMgrFindPropMgr(intf, name);
1356094332d3Sopenharmony_ci    if (fnCfgPropMgr == NULL) {
1357094332d3Sopenharmony_ci        return HDF_FAILURE;
1358094332d3Sopenharmony_ci    }
1359094332d3Sopenharmony_ci    if (memcpy_s(value, strlen(fnCfgPropMgr->value), fnCfgPropMgr->value, strlen(fnCfgPropMgr->value)) != EOK) {
1360094332d3Sopenharmony_ci        return HDF_FAILURE;
1361094332d3Sopenharmony_ci    }
1362094332d3Sopenharmony_ci    if (fnCfgPropMgr->getPropCallback) {
1363094332d3Sopenharmony_ci        fnCfgPropMgr->getPropCallback(intf, name, fnCfgPropMgr->value);
1364094332d3Sopenharmony_ci    }
1365094332d3Sopenharmony_ci    return HDF_SUCCESS;
1366094332d3Sopenharmony_ci}
1367094332d3Sopenharmony_ci
1368094332d3Sopenharmony_ciint32_t UsbFnCfgMgrSetProp(const struct UsbFnInterface *intf, const char *name, const char *value)
1369094332d3Sopenharmony_ci{
1370094332d3Sopenharmony_ci    if (intf == NULL || name == NULL) {
1371094332d3Sopenharmony_ci        return HDF_FAILURE;
1372094332d3Sopenharmony_ci    }
1373094332d3Sopenharmony_ci
1374094332d3Sopenharmony_ci    if (g_cfgEntry.next == 0) {
1375094332d3Sopenharmony_ci        DListHeadInit(&g_cfgEntry);
1376094332d3Sopenharmony_ci    }
1377094332d3Sopenharmony_ci
1378094332d3Sopenharmony_ci    struct UsbFnRegistInfo registInfo;
1379094332d3Sopenharmony_ci    registInfo.name = name;
1380094332d3Sopenharmony_ci    registInfo.value = value;
1381094332d3Sopenharmony_ci    registInfo.setProp = NULL;
1382094332d3Sopenharmony_ci    registInfo.getProp = NULL;
1383094332d3Sopenharmony_ci    int32_t deviceProp = IsDevDescProp(name);
1384094332d3Sopenharmony_ci    int32_t isRegist = IsPropRegisted(intf, name);
1385094332d3Sopenharmony_ci    if (isRegist == 0 && deviceProp == 0) {
1386094332d3Sopenharmony_ci        const char *propValue = UsbFnCfgFindPropFromHcs(intf, name);
1387094332d3Sopenharmony_ci        if (propValue != NULL) {
1388094332d3Sopenharmony_ci            return UsbFnCfgMgrRegisterProp(intf, &registInfo);
1389094332d3Sopenharmony_ci        }
1390094332d3Sopenharmony_ci        return HDF_FAILURE;
1391094332d3Sopenharmony_ci    }
1392094332d3Sopenharmony_ci
1393094332d3Sopenharmony_ci    struct UsbFnCfgPropMgr *fnCfgPropMgr = NULL;
1394094332d3Sopenharmony_ci    if (isRegist != 0) {
1395094332d3Sopenharmony_ci        fnCfgPropMgr = UsbfnCfgMgrFindPropMgr(intf, name);
1396094332d3Sopenharmony_ci        if (fnCfgPropMgr == NULL) {
1397094332d3Sopenharmony_ci            return HDF_FAILURE;
1398094332d3Sopenharmony_ci        }
1399094332d3Sopenharmony_ci        int32_t ret = snprintf_s(fnCfgPropMgr->value, MAX_LEN, MAX_LEN - 1, "%s", value);
1400094332d3Sopenharmony_ci        if (ret < 0) {
1401094332d3Sopenharmony_ci            return HDF_FAILURE;
1402094332d3Sopenharmony_ci        }
1403094332d3Sopenharmony_ci    }
1404094332d3Sopenharmony_ci    if (deviceProp != 0) {
1405094332d3Sopenharmony_ci        if (isRegist == 0 && UsbFnCfgMgrRegisterProp(intf, &registInfo) != HDF_SUCCESS) {
1406094332d3Sopenharmony_ci            return HDF_FAILURE;
1407094332d3Sopenharmony_ci        }
1408094332d3Sopenharmony_ci        if (UsbFnCfgChangeDevceDes(intf, name, value) != HDF_SUCCESS) {
1409094332d3Sopenharmony_ci            return HDF_FAILURE;
1410094332d3Sopenharmony_ci        }
1411094332d3Sopenharmony_ci    }
1412094332d3Sopenharmony_ci    if (isRegist && fnCfgPropMgr->setPropCallback) {
1413094332d3Sopenharmony_ci        fnCfgPropMgr->setPropCallback(intf, name, fnCfgPropMgr->value);
1414094332d3Sopenharmony_ci    }
1415094332d3Sopenharmony_ci    return HDF_SUCCESS;
1416094332d3Sopenharmony_ci}
1417