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, ®istInfo); 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, ®istInfo) != 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