1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 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 "usbd_dispatcher.h"
17094332d3Sopenharmony_ci#include "hdf_slist.h"
18094332d3Sopenharmony_ci#include "osal_mutex.h"
19094332d3Sopenharmony_ci#include "usb_ddk.h"
20094332d3Sopenharmony_ci#include "usb_impl.h"
21094332d3Sopenharmony_ci#include "usb_interface_pool.h"
22094332d3Sopenharmony_ci#include "v1_0/iusbd_subscriber.h"
23094332d3Sopenharmony_ci#include "usbd_wrapper.h"
24094332d3Sopenharmony_ci
25094332d3Sopenharmony_cinamespace OHOS {
26094332d3Sopenharmony_cinamespace HDI {
27094332d3Sopenharmony_cinamespace Usb {
28094332d3Sopenharmony_cinamespace V1_1 {
29094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdAllocFifo(DataFifo *fifo, uint32_t size)
30094332d3Sopenharmony_ci{
31094332d3Sopenharmony_ci    if (!DataFifoIsInitialized(fifo)) {
32094332d3Sopenharmony_ci        void *data = OsalMemAlloc(size);
33094332d3Sopenharmony_ci        if (data == nullptr) {
34094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:OsalMemAlloc failed", __func__);
35094332d3Sopenharmony_ci            return HDF_ERR_MALLOC_FAIL;
36094332d3Sopenharmony_ci        }
37094332d3Sopenharmony_ci        DataFifoInit(fifo, size, data);
38094332d3Sopenharmony_ci    }
39094332d3Sopenharmony_ci    return HDF_SUCCESS;
40094332d3Sopenharmony_ci}
41094332d3Sopenharmony_ci
42094332d3Sopenharmony_civoid UsbdDispatcher::UsbdFreeFifo(DataFifo *fifo)
43094332d3Sopenharmony_ci{
44094332d3Sopenharmony_ci    if (fifo == nullptr) {
45094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:fifo is nullptr", __func__);
46094332d3Sopenharmony_ci        return;
47094332d3Sopenharmony_ci    }
48094332d3Sopenharmony_ci
49094332d3Sopenharmony_ci    OsalMemFree(fifo->data);
50094332d3Sopenharmony_ci    fifo->data = nullptr;
51094332d3Sopenharmony_ci    DataFifoInit(fifo, 0, nullptr);
52094332d3Sopenharmony_ci}
53094332d3Sopenharmony_ci
54094332d3Sopenharmony_civoid UsbdDispatcher::UsbdReadCallback(UsbRequest *req)
55094332d3Sopenharmony_ci{
56094332d3Sopenharmony_ci    if (req == nullptr) {
57094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:req is nullptr!", __func__);
58094332d3Sopenharmony_ci        return;
59094332d3Sopenharmony_ci    }
60094332d3Sopenharmony_ci
61094332d3Sopenharmony_ci    UsbIfRequest *reqObj = reinterpret_cast<UsbIfRequest *>(req);
62094332d3Sopenharmony_ci    UsbdRequestASync *dev = static_cast<UsbdRequestASync *>(req->compInfo.userData);
63094332d3Sopenharmony_ci    if (dev == nullptr) {
64094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param dev is nullptr!", __func__);
65094332d3Sopenharmony_ci        OsalSemPost(&reqObj->hostRequest->sem);
66094332d3Sopenharmony_ci    }
67094332d3Sopenharmony_ci}
68094332d3Sopenharmony_ci
69094332d3Sopenharmony_civoid UsbdDispatcher::UsbdWriteCallback(UsbRequest *req)
70094332d3Sopenharmony_ci{
71094332d3Sopenharmony_ci    if (req == nullptr) {
72094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param req is nullptr!", __func__);
73094332d3Sopenharmony_ci        return;
74094332d3Sopenharmony_ci    }
75094332d3Sopenharmony_ci
76094332d3Sopenharmony_ci    int32_t status = req->compInfo.status;
77094332d3Sopenharmony_ci    HDF_LOGI("%{public}s:status is %{public}d!", __func__, status);
78094332d3Sopenharmony_ci}
79094332d3Sopenharmony_ci
80094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbControlSetUp(UsbControlParams *controlParams, UsbControlRequest *controlReq)
81094332d3Sopenharmony_ci{
82094332d3Sopenharmony_ci    if (controlParams == nullptr || controlReq == nullptr) {
83094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:controlParams or controlReq is nullptr", __func__);
84094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
85094332d3Sopenharmony_ci    }
86094332d3Sopenharmony_ci
87094332d3Sopenharmony_ci    controlReq->target = controlParams->target;
88094332d3Sopenharmony_ci    controlReq->reqType = controlParams->reqType;
89094332d3Sopenharmony_ci    controlReq->directon = controlParams->directon;
90094332d3Sopenharmony_ci    controlReq->request = controlParams->request;
91094332d3Sopenharmony_ci    controlReq->value = controlParams->value;
92094332d3Sopenharmony_ci    controlReq->index = controlParams->index;
93094332d3Sopenharmony_ci    controlReq->buffer = controlParams->data;
94094332d3Sopenharmony_ci    controlReq->length = static_cast<uint32_t>(controlParams->size);
95094332d3Sopenharmony_ci    return HDF_SUCCESS;
96094332d3Sopenharmony_ci}
97094332d3Sopenharmony_ci
98094332d3Sopenharmony_ciUsbInterface *UsbdDispatcher::GetUsbInterfaceById(const HostDevice *dev, uint8_t interfaceIndex)
99094332d3Sopenharmony_ci{
100094332d3Sopenharmony_ci    if (dev == nullptr || dev->service == nullptr) {
101094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:idx:%{public}u service is nullptr", __func__, interfaceIndex);
102094332d3Sopenharmony_ci        return nullptr;
103094332d3Sopenharmony_ci    }
104094332d3Sopenharmony_ci
105094332d3Sopenharmony_ci    UsbInterface *tmpIf = UsbClaimInterface(dev->service->session_, dev->busNum, dev->devAddr, interfaceIndex);
106094332d3Sopenharmony_ci    if (tmpIf == nullptr) {
107094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbClaimInterface failed", __func__);
108094332d3Sopenharmony_ci    }
109094332d3Sopenharmony_ci    return tmpIf;
110094332d3Sopenharmony_ci}
111094332d3Sopenharmony_ci
112094332d3Sopenharmony_ciint32_t UsbdDispatcher::GetInterfacePipe(
113094332d3Sopenharmony_ci    const HostDevice *dev, UsbInterface *interface, uint8_t pipeAddr, UsbPipeInfo *pipe)
114094332d3Sopenharmony_ci{
115094332d3Sopenharmony_ci    UsbPipeInfo pipeTmp;
116094332d3Sopenharmony_ci    if (memset_s(&pipeTmp, sizeof(pipeTmp), 0, sizeof(pipeTmp)) != EOK) {
117094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:memset_s failed ", __func__);
118094332d3Sopenharmony_ci        return HDF_FAILURE;
119094332d3Sopenharmony_ci    }
120094332d3Sopenharmony_ci
121094332d3Sopenharmony_ci    if (dev == nullptr || interface == nullptr || pipe == nullptr) {
122094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid params", __func__);
123094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
124094332d3Sopenharmony_ci    }
125094332d3Sopenharmony_ci
126094332d3Sopenharmony_ci    UsbInterfaceInfo *info = &interface->info;
127094332d3Sopenharmony_ci    if (info == nullptr) {
128094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid interface", __func__);
129094332d3Sopenharmony_ci        return HDF_FAILURE;
130094332d3Sopenharmony_ci    }
131094332d3Sopenharmony_ci
132094332d3Sopenharmony_ci    UsbInterfaceHandle *interfaceHandle = UsbImpl::InterfaceIdToHandle(dev, info->interfaceIndex);
133094332d3Sopenharmony_ci    if (interfaceHandle == nullptr) {
134094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid interface handle", __func__);
135094332d3Sopenharmony_ci        return HDF_FAILURE;
136094332d3Sopenharmony_ci    }
137094332d3Sopenharmony_ci
138094332d3Sopenharmony_ci    int32_t ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, pipeAddr, &pipeTmp);
139094332d3Sopenharmony_ci    if (ret == HDF_SUCCESS && ((pipeTmp.pipeAddress | static_cast<uint8_t>(pipeTmp.pipeDirection)) == pipeAddr)) {
140094332d3Sopenharmony_ci        if (pipe) {
141094332d3Sopenharmony_ci            *pipe = pipeTmp;
142094332d3Sopenharmony_ci        }
143094332d3Sopenharmony_ci        return HDF_SUCCESS;
144094332d3Sopenharmony_ci    }
145094332d3Sopenharmony_ci    return HDF_FAILURE;
146094332d3Sopenharmony_ci}
147094332d3Sopenharmony_ci
148094332d3Sopenharmony_ciint32_t UsbdDispatcher::GetPipe(const HostDevice *dev, uint8_t interfaceId, uint8_t pipeId, UsbPipeInfo *pipe)
149094332d3Sopenharmony_ci{
150094332d3Sopenharmony_ci    if (dev == nullptr || pipe == nullptr) {
151094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:dev or pipe is nullptr, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId);
152094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
153094332d3Sopenharmony_ci    }
154094332d3Sopenharmony_ci
155094332d3Sopenharmony_ci    if (interfaceId >= USB_MAX_INTERFACES) {
156094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:interfaceId invalid, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId);
157094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
158094332d3Sopenharmony_ci    }
159094332d3Sopenharmony_ci
160094332d3Sopenharmony_ci    UsbInterface *interface = dev->iface[interfaceId];
161094332d3Sopenharmony_ci    if (interface == nullptr) {
162094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:interface is nullptr ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeId);
163094332d3Sopenharmony_ci        return HDF_FAILURE;
164094332d3Sopenharmony_ci    }
165094332d3Sopenharmony_ci
166094332d3Sopenharmony_ci    int32_t ret = GetInterfacePipe(dev, interface, pipeId, pipe);
167094332d3Sopenharmony_ci    return ret;
168094332d3Sopenharmony_ci}
169094332d3Sopenharmony_ci
170094332d3Sopenharmony_civoid UsbdDispatcher::UsbdFreeCtrlPipe(HostDevice *dev)
171094332d3Sopenharmony_ci{
172094332d3Sopenharmony_ci    if (dev == nullptr) {
173094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:params dev is nullptr", __func__);
174094332d3Sopenharmony_ci        return;
175094332d3Sopenharmony_ci    }
176094332d3Sopenharmony_ci
177094332d3Sopenharmony_ci    OsalMemFree(dev->ctrPipe);
178094332d3Sopenharmony_ci    dev->ctrPipe = nullptr;
179094332d3Sopenharmony_ci}
180094332d3Sopenharmony_ci
181094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdGetCtrlPipe(HostDevice *dev)
182094332d3Sopenharmony_ci{
183094332d3Sopenharmony_ci    UsbPipeInfo *pipe = static_cast<UsbPipeInfo *>(OsalMemCalloc(sizeof(UsbPipeInfo)));
184094332d3Sopenharmony_ci    if (pipe == nullptr) {
185094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
186094332d3Sopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
187094332d3Sopenharmony_ci    }
188094332d3Sopenharmony_ci
189094332d3Sopenharmony_ci    int32_t ret = UsbGetPipeInfo(dev->ctrDevHandle, dev->ctrIface->info.curAltSetting, 0, pipe);
190094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
191094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:get pipe failed ret:%{public}d", __func__, ret);
192094332d3Sopenharmony_ci        OsalMemFree(pipe);
193094332d3Sopenharmony_ci        pipe = nullptr;
194094332d3Sopenharmony_ci        return HDF_FAILURE;
195094332d3Sopenharmony_ci    }
196094332d3Sopenharmony_ci
197094332d3Sopenharmony_ci    dev->ctrPipe = pipe;
198094332d3Sopenharmony_ci    return HDF_SUCCESS;
199094332d3Sopenharmony_ci}
200094332d3Sopenharmony_ci
201094332d3Sopenharmony_ciUsbdRequestSync *UsbdDispatcher::UsbdFindRequestSync(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
202094332d3Sopenharmony_ci{
203094332d3Sopenharmony_ci    if (port == nullptr) {
204094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
205094332d3Sopenharmony_ci        return nullptr;
206094332d3Sopenharmony_ci    }
207094332d3Sopenharmony_ci
208094332d3Sopenharmony_ci    UsbdRequestSync *req = nullptr;
209094332d3Sopenharmony_ci    HdfSListIterator it;
210094332d3Sopenharmony_ci    bool flag = false;
211094332d3Sopenharmony_ci    OsalMutexLock(&port->reqSyncLock);
212094332d3Sopenharmony_ci    HdfSListIteratorInit(&it, &port->reqSyncList);
213094332d3Sopenharmony_ci    while (HdfSListIteratorHasNext(&it)) {
214094332d3Sopenharmony_ci        req = reinterpret_cast<UsbdRequestSync *>(HdfSListIteratorNext(&it));
215094332d3Sopenharmony_ci        if (req == nullptr) {
216094332d3Sopenharmony_ci            continue;
217094332d3Sopenharmony_ci        }
218094332d3Sopenharmony_ci        if (req->pipe.interfaceId == interfaceId && ((req->pipe.pipeAddress | req->pipe.pipeDirection) == pipeAddr)) {
219094332d3Sopenharmony_ci            flag = true;
220094332d3Sopenharmony_ci            break;
221094332d3Sopenharmony_ci        }
222094332d3Sopenharmony_ci    }
223094332d3Sopenharmony_ci    OsalMutexUnlock(&port->reqSyncLock);
224094332d3Sopenharmony_ci
225094332d3Sopenharmony_ci    if (flag) {
226094332d3Sopenharmony_ci        return req;
227094332d3Sopenharmony_ci    }
228094332d3Sopenharmony_ci    return nullptr;
229094332d3Sopenharmony_ci}
230094332d3Sopenharmony_ci
231094332d3Sopenharmony_ciUsbdRequestSync *UsbdDispatcher::UsbdRequestSyncAlloc(void)
232094332d3Sopenharmony_ci{
233094332d3Sopenharmony_ci    UsbdRequestSync *req = static_cast<UsbdRequestSync *>(OsalMemCalloc(sizeof(UsbdRequestSync)));
234094332d3Sopenharmony_ci    if (req == nullptr) {
235094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
236094332d3Sopenharmony_ci        return req;
237094332d3Sopenharmony_ci    }
238094332d3Sopenharmony_ci
239094332d3Sopenharmony_ci    req->request = nullptr;
240094332d3Sopenharmony_ci    req->endPointAddr = 0;
241094332d3Sopenharmony_ci    req->ifHandle = nullptr;
242094332d3Sopenharmony_ci    OsalMutexInit(&req->lock);
243094332d3Sopenharmony_ci    return req;
244094332d3Sopenharmony_ci}
245094332d3Sopenharmony_ci
246094332d3Sopenharmony_civoid UsbdDispatcher::UsbRequestParamsWSyncInit(UsbRequestParams *params, int32_t timeout, const UsbPipeInfo *pipe)
247094332d3Sopenharmony_ci{
248094332d3Sopenharmony_ci    if (params == nullptr || pipe == nullptr) {
249094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: params or pipe is nullptr", __func__);
250094332d3Sopenharmony_ci        return;
251094332d3Sopenharmony_ci    }
252094332d3Sopenharmony_ci
253094332d3Sopenharmony_ci    params->interfaceId = pipe->interfaceId;
254094332d3Sopenharmony_ci    params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
255094332d3Sopenharmony_ci    params->pipeId = pipe->pipeId;
256094332d3Sopenharmony_ci    params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
257094332d3Sopenharmony_ci    params->timeout = static_cast<uint32_t>(timeout);
258094332d3Sopenharmony_ci    params->dataReq.numIsoPackets = 0;
259094332d3Sopenharmony_ci    params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_DIR_OFFSET) & 0x1);
260094332d3Sopenharmony_ci    params->dataReq.length = pipe->maxPacketSize;
261094332d3Sopenharmony_ci}
262094332d3Sopenharmony_ci
263094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestSyncInit(
264094332d3Sopenharmony_ci    HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestSync *requestSync)
265094332d3Sopenharmony_ci{
266094332d3Sopenharmony_ci    if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) {
267094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid params", __func__);
268094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
269094332d3Sopenharmony_ci    }
270094332d3Sopenharmony_ci
271094332d3Sopenharmony_ci    int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
272094332d3Sopenharmony_ci    if (ret != EOK) {
273094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
274094332d3Sopenharmony_ci        return ret;
275094332d3Sopenharmony_ci    }
276094332d3Sopenharmony_ci
277094332d3Sopenharmony_ci    requestSync->ifHandle = ifHandle;
278094332d3Sopenharmony_ci    requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, requestSync->pipe.maxPacketSize);
279094332d3Sopenharmony_ci    if (requestSync->request == nullptr) {
280094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:alloc request failed", __func__);
281094332d3Sopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
282094332d3Sopenharmony_ci    }
283094332d3Sopenharmony_ci    UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe);
284094332d3Sopenharmony_ci    requestSync->params.userData = port;
285094332d3Sopenharmony_ci    OsalMutexLock(&port->reqSyncLock);
286094332d3Sopenharmony_ci    HdfSListAdd(&port->reqSyncList, &requestSync->node);
287094332d3Sopenharmony_ci    OsalMutexUnlock(&port->reqSyncLock);
288094332d3Sopenharmony_ci    return HDF_SUCCESS;
289094332d3Sopenharmony_ci}
290094332d3Sopenharmony_ci
291094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestSyncInitwithLength(HostDevice *port, UsbInterfaceHandle *ifHandle,
292094332d3Sopenharmony_ci    UsbPipeInfo *pipe, int32_t length, UsbdRequestSync *requestSync)
293094332d3Sopenharmony_ci{
294094332d3Sopenharmony_ci    if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) {
295094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid params", __func__);
296094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
297094332d3Sopenharmony_ci    }
298094332d3Sopenharmony_ci
299094332d3Sopenharmony_ci    int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
300094332d3Sopenharmony_ci    if (ret != EOK) {
301094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
302094332d3Sopenharmony_ci        return ret;
303094332d3Sopenharmony_ci    }
304094332d3Sopenharmony_ci
305094332d3Sopenharmony_ci    requestSync->ifHandle = ifHandle;
306094332d3Sopenharmony_ci    requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, length);
307094332d3Sopenharmony_ci    if (requestSync->request == nullptr) {
308094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:alloc request failed", __func__);
309094332d3Sopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
310094332d3Sopenharmony_ci    }
311094332d3Sopenharmony_ci    UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe);
312094332d3Sopenharmony_ci    requestSync->params.userData = port;
313094332d3Sopenharmony_ci    OsalMutexLock(&port->reqSyncLock);
314094332d3Sopenharmony_ci    HdfSListAdd(&port->reqSyncList, &requestSync->node);
315094332d3Sopenharmony_ci    OsalMutexUnlock(&port->reqSyncLock);
316094332d3Sopenharmony_ci    return HDF_SUCCESS;
317094332d3Sopenharmony_ci}
318094332d3Sopenharmony_ci
319094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestSyncRelease(UsbdRequestSync *requestSync)
320094332d3Sopenharmony_ci{
321094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
322094332d3Sopenharmony_ci    if (requestSync != nullptr) {
323094332d3Sopenharmony_ci        OsalMutexLock(&requestSync->lock);
324094332d3Sopenharmony_ci        if (requestSync->request != nullptr) {
325094332d3Sopenharmony_ci            ret = UsbFreeRequest(requestSync->request);
326094332d3Sopenharmony_ci            if (ret != HDF_SUCCESS) {
327094332d3Sopenharmony_ci                HDF_LOGW("%{public}s:UsbFreeRequest failed", __func__);
328094332d3Sopenharmony_ci            }
329094332d3Sopenharmony_ci            requestSync->request = nullptr;
330094332d3Sopenharmony_ci        }
331094332d3Sopenharmony_ci        OsalMutexUnlock(&requestSync->lock);
332094332d3Sopenharmony_ci        OsalMemFree(requestSync);
333094332d3Sopenharmony_ci    }
334094332d3Sopenharmony_ci    return ret;
335094332d3Sopenharmony_ci}
336094332d3Sopenharmony_ci
337094332d3Sopenharmony_civoid UsbdDispatcher::UsbRequestParamsInit(UsbRequestParams *params, int32_t timeout)
338094332d3Sopenharmony_ci{
339094332d3Sopenharmony_ci    if (params == nullptr) {
340094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:params is nullptr", __func__);
341094332d3Sopenharmony_ci        return;
342094332d3Sopenharmony_ci    }
343094332d3Sopenharmony_ci
344094332d3Sopenharmony_ci    params->interfaceId = USB_CTRL_INTERFACE_ID;
345094332d3Sopenharmony_ci    params->pipeAddress = 0;
346094332d3Sopenharmony_ci    params->pipeId = 0;
347094332d3Sopenharmony_ci    params->requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
348094332d3Sopenharmony_ci    params->timeout = static_cast<uint32_t>(timeout);
349094332d3Sopenharmony_ci}
350094332d3Sopenharmony_ci
351094332d3Sopenharmony_ciint32_t UsbdDispatcher::CtrlTranParamGetReqType(HdfSBuf *data, UsbControlParams *pCtrParams, uint32_t requestType)
352094332d3Sopenharmony_ci{
353094332d3Sopenharmony_ci    if (data == nullptr || pCtrParams == nullptr) {
354094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:param failed", __func__);
355094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
356094332d3Sopenharmony_ci    }
357094332d3Sopenharmony_ci
358094332d3Sopenharmony_ci    uint8_t *buffer = nullptr;
359094332d3Sopenharmony_ci    uint32_t length = 0;
360094332d3Sopenharmony_ci    int32_t target = requestType & USB_RECIP_MASK;
361094332d3Sopenharmony_ci    int32_t direction = (requestType >> DIRECTION_OFFSET_7) & ENDPOINT_DIRECTION_MASK;
362094332d3Sopenharmony_ci    int32_t cmdType = (requestType >> CMD_OFFSET_5) & CMD_TYPE_MASK;
363094332d3Sopenharmony_ci    if (direction == USB_REQUEST_DIR_TO_DEVICE) {
364094332d3Sopenharmony_ci        if (!HdfSbufReadBuffer(data, (const void **)(&buffer), &length)) {
365094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:hdf sbuf Read failed", __func__);
366094332d3Sopenharmony_ci            return HDF_FAILURE;
367094332d3Sopenharmony_ci        }
368094332d3Sopenharmony_ci    } else {
369094332d3Sopenharmony_ci        length = MAX_CONTROL_BUFF_SIZE;
370094332d3Sopenharmony_ci        buffer = static_cast<uint8_t *>(OsalMemCalloc(length));
371094332d3Sopenharmony_ci        if (buffer == nullptr) {
372094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:OsalMemCalloc failed length = %{public}u", __func__, length);
373094332d3Sopenharmony_ci            return HDF_ERR_MALLOC_FAIL;
374094332d3Sopenharmony_ci        }
375094332d3Sopenharmony_ci    }
376094332d3Sopenharmony_ci    pCtrParams->target = static_cast<UsbRequestTargetType>(target);
377094332d3Sopenharmony_ci    pCtrParams->directon = static_cast<UsbRequestDirection>(direction);
378094332d3Sopenharmony_ci    pCtrParams->reqType = static_cast<UsbControlRequestType>(cmdType);
379094332d3Sopenharmony_ci    pCtrParams->size = length;
380094332d3Sopenharmony_ci    pCtrParams->data = buffer;
381094332d3Sopenharmony_ci    return HDF_SUCCESS;
382094332d3Sopenharmony_ci}
383094332d3Sopenharmony_ci
384094332d3Sopenharmony_ciint32_t UsbdDispatcher::CtrlTransferParamInit(HdfSBuf *data, UsbControlParams *pCtrParams, int32_t *timeout)
385094332d3Sopenharmony_ci{
386094332d3Sopenharmony_ci    if (data == nullptr || pCtrParams == nullptr) {
387094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:data or pCtrParams is nullptr", __func__);
388094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
389094332d3Sopenharmony_ci    }
390094332d3Sopenharmony_ci
391094332d3Sopenharmony_ci    int32_t requestType;
392094332d3Sopenharmony_ci    if (!HdfSbufReadInt32(data, &requestType)) {
393094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:failed to read the requestType from data", __func__);
394094332d3Sopenharmony_ci        return HDF_ERR_IO;
395094332d3Sopenharmony_ci    }
396094332d3Sopenharmony_ci
397094332d3Sopenharmony_ci    int32_t requestCmd;
398094332d3Sopenharmony_ci    if (!HdfSbufReadInt32(data, &requestCmd)) {
399094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:Failed to read the requestCmd from data", __func__);
400094332d3Sopenharmony_ci        return HDF_ERR_IO;
401094332d3Sopenharmony_ci    }
402094332d3Sopenharmony_ci
403094332d3Sopenharmony_ci    int32_t value;
404094332d3Sopenharmony_ci    if (!HdfSbufReadInt32(data, &value)) {
405094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:Failed to read the value from data", __func__);
406094332d3Sopenharmony_ci        return HDF_ERR_IO;
407094332d3Sopenharmony_ci    }
408094332d3Sopenharmony_ci
409094332d3Sopenharmony_ci    int32_t index;
410094332d3Sopenharmony_ci    if (!HdfSbufReadInt32(data, &index)) {
411094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:Failed to read the index from data", __func__);
412094332d3Sopenharmony_ci        return HDF_ERR_IO;
413094332d3Sopenharmony_ci    }
414094332d3Sopenharmony_ci
415094332d3Sopenharmony_ci    if (!HdfSbufReadInt32(data, timeout)) {
416094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:Failed to read the timeout from data", __func__);
417094332d3Sopenharmony_ci        return HDF_ERR_IO;
418094332d3Sopenharmony_ci    }
419094332d3Sopenharmony_ci
420094332d3Sopenharmony_ci    pCtrParams->request = static_cast<uint8_t>(requestCmd);
421094332d3Sopenharmony_ci    pCtrParams->value = value;
422094332d3Sopenharmony_ci    pCtrParams->index = index;
423094332d3Sopenharmony_ci    int32_t ret = CtrlTranParamGetReqType(data, pCtrParams, requestType);
424094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
425094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:CtrlTransferParamInit failed:%{public}d", __func__, ret);
426094332d3Sopenharmony_ci        OsalMemFree(pCtrParams->data);
427094332d3Sopenharmony_ci        pCtrParams->data = nullptr;
428094332d3Sopenharmony_ci    }
429094332d3Sopenharmony_ci    return ret;
430094332d3Sopenharmony_ci}
431094332d3Sopenharmony_ci
432094332d3Sopenharmony_civoid UsbdDispatcher::UsbdReleaseInterfaces(HostDevice *dev)
433094332d3Sopenharmony_ci{
434094332d3Sopenharmony_ci    if (dev == nullptr) {
435094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
436094332d3Sopenharmony_ci        return;
437094332d3Sopenharmony_ci    }
438094332d3Sopenharmony_ci
439094332d3Sopenharmony_ci    for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) {
440094332d3Sopenharmony_ci        if (dev->iface[i] != nullptr) {
441094332d3Sopenharmony_ci            UsbReleaseInterface(dev->iface[i]);
442094332d3Sopenharmony_ci            dev->iface[i] = nullptr;
443094332d3Sopenharmony_ci        }
444094332d3Sopenharmony_ci    }
445094332d3Sopenharmony_ci    if (dev->ctrIface != nullptr) {
446094332d3Sopenharmony_ci        UsbReleaseInterface(dev->ctrIface);
447094332d3Sopenharmony_ci        dev->ctrIface = nullptr;
448094332d3Sopenharmony_ci    }
449094332d3Sopenharmony_ci}
450094332d3Sopenharmony_ci
451094332d3Sopenharmony_civoid UsbdDispatcher::UsbdCloseInterfaces(HostDevice *dev)
452094332d3Sopenharmony_ci{
453094332d3Sopenharmony_ci    if (dev == nullptr) {
454094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
455094332d3Sopenharmony_ci        return;
456094332d3Sopenharmony_ci    }
457094332d3Sopenharmony_ci
458094332d3Sopenharmony_ci    for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) {
459094332d3Sopenharmony_ci        if (dev->devHandle[i] != nullptr) {
460094332d3Sopenharmony_ci            UsbCloseInterface(dev->devHandle[i], false);
461094332d3Sopenharmony_ci            dev->devHandle[i] = nullptr;
462094332d3Sopenharmony_ci        }
463094332d3Sopenharmony_ci    }
464094332d3Sopenharmony_ci    if (dev->ctrDevHandle != nullptr) {
465094332d3Sopenharmony_ci        UsbCloseInterface(dev->ctrDevHandle, false);
466094332d3Sopenharmony_ci        dev->ctrDevHandle = nullptr;
467094332d3Sopenharmony_ci    }
468094332d3Sopenharmony_ci}
469094332d3Sopenharmony_ci
470094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdOpenInterfaces(HostDevice *dev)
471094332d3Sopenharmony_ci{
472094332d3Sopenharmony_ci    if (dev == nullptr) {
473094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
474094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
475094332d3Sopenharmony_ci    }
476094332d3Sopenharmony_ci
477094332d3Sopenharmony_ci    int32_t ret =
478094332d3Sopenharmony_ci        memset_s(dev->devHandle, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES);
479094332d3Sopenharmony_ci    if (ret != EOK) {
480094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:memset_s failed ", __func__);
481094332d3Sopenharmony_ci        return HDF_FAILURE;
482094332d3Sopenharmony_ci    }
483094332d3Sopenharmony_ci    dev->ctrDevHandle = UsbOpenInterface(dev->ctrIface);
484094332d3Sopenharmony_ci    if (dev->ctrDevHandle == nullptr) {
485094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:ctrDevHandle UsbOpenInterface nullptr", __func__);
486094332d3Sopenharmony_ci        UsbdCloseInterfaces(dev);
487094332d3Sopenharmony_ci        return HDF_FAILURE;
488094332d3Sopenharmony_ci    }
489094332d3Sopenharmony_ci    return HDF_SUCCESS;
490094332d3Sopenharmony_ci}
491094332d3Sopenharmony_ci
492094332d3Sopenharmony_civoid UsbdDispatcher::RemoveDevFromService(UsbImpl *service, HostDevice *port)
493094332d3Sopenharmony_ci{
494094332d3Sopenharmony_ci    if (service == nullptr || port == nullptr) {
495094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: service or port is nullptr", __func__);
496094332d3Sopenharmony_ci        return;
497094332d3Sopenharmony_ci    }
498094332d3Sopenharmony_ci
499094332d3Sopenharmony_ci    HdfSListIterator it;
500094332d3Sopenharmony_ci    HostDevice *tempPort = nullptr;
501094332d3Sopenharmony_ci    OsalMutexLock(&service->lock_);
502094332d3Sopenharmony_ci    HdfSListIteratorInit(&it, &service->devList_);
503094332d3Sopenharmony_ci    while (HdfSListIteratorHasNext(&it)) {
504094332d3Sopenharmony_ci        tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
505094332d3Sopenharmony_ci        if (tempPort == nullptr) {
506094332d3Sopenharmony_ci            continue;
507094332d3Sopenharmony_ci        }
508094332d3Sopenharmony_ci        if (tempPort->busNum == port->busNum && tempPort->devAddr == port->devAddr) {
509094332d3Sopenharmony_ci            HdfSListIteratorRemove(&it);
510094332d3Sopenharmony_ci            break;
511094332d3Sopenharmony_ci        }
512094332d3Sopenharmony_ci    }
513094332d3Sopenharmony_ci    OsalMutexUnlock(&service->lock_);
514094332d3Sopenharmony_ci}
515094332d3Sopenharmony_ci
516094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdClaimInterfaces(HostDevice *dev)
517094332d3Sopenharmony_ci{
518094332d3Sopenharmony_ci    if (dev == nullptr) {
519094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
520094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
521094332d3Sopenharmony_ci    }
522094332d3Sopenharmony_ci
523094332d3Sopenharmony_ci    if (memset_s(dev->iface, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES) != EOK) {
524094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:memset_s failed", __func__);
525094332d3Sopenharmony_ci        return HDF_FAILURE;
526094332d3Sopenharmony_ci    }
527094332d3Sopenharmony_ci
528094332d3Sopenharmony_ci    dev->ctrIface = GetUsbInterfaceById(const_cast<const HostDevice *>(dev), USB_CTRL_INTERFACE_ID);
529094332d3Sopenharmony_ci    if (dev->ctrIface == nullptr) {
530094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetUsbInterfaceById nullptr", __func__);
531094332d3Sopenharmony_ci        UsbdReleaseInterfaces(dev);
532094332d3Sopenharmony_ci        return HDF_FAILURE;
533094332d3Sopenharmony_ci    }
534094332d3Sopenharmony_ci
535094332d3Sopenharmony_ci    return HDF_SUCCESS;
536094332d3Sopenharmony_ci}
537094332d3Sopenharmony_ci
538094332d3Sopenharmony_ciint32_t UsbdDispatcher::ReturnGetPipes(int32_t ret, HostDevice *dev)
539094332d3Sopenharmony_ci{
540094332d3Sopenharmony_ci    UsbdCloseInterfaces(dev);
541094332d3Sopenharmony_ci    UsbdReleaseInterfaces(dev);
542094332d3Sopenharmony_ci    dev->service->session_ = nullptr;
543094332d3Sopenharmony_ci    return ret;
544094332d3Sopenharmony_ci}
545094332d3Sopenharmony_ci
546094332d3Sopenharmony_ciint32_t UsbdDispatcher::ReturnOpenInterfaces(int32_t ret, HostDevice *dev)
547094332d3Sopenharmony_ci{
548094332d3Sopenharmony_ci    UsbdReleaseInterfaces(dev);
549094332d3Sopenharmony_ci    dev->service->session_ = nullptr;
550094332d3Sopenharmony_ci    return ret;
551094332d3Sopenharmony_ci}
552094332d3Sopenharmony_ci
553094332d3Sopenharmony_ciint32_t UsbdDispatcher::ReturnClainInterfaces(int32_t ret, HostDevice *dev)
554094332d3Sopenharmony_ci{
555094332d3Sopenharmony_ci    dev->service->session_ = nullptr;
556094332d3Sopenharmony_ci    return ret;
557094332d3Sopenharmony_ci}
558094332d3Sopenharmony_ci
559094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdInit(HostDevice *dev)
560094332d3Sopenharmony_ci{
561094332d3Sopenharmony_ci    if (dev == nullptr) {
562094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param dev", __func__);
563094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
564094332d3Sopenharmony_ci    }
565094332d3Sopenharmony_ci
566094332d3Sopenharmony_ci    if (dev->initFlag) {
567094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:initFlag is true", __func__);
568094332d3Sopenharmony_ci        return HDF_SUCCESS;
569094332d3Sopenharmony_ci    }
570094332d3Sopenharmony_ci
571094332d3Sopenharmony_ci    int32_t ret = UsbInitHostSdk(nullptr);
572094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
573094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbInitHostSdk failed", __func__);
574094332d3Sopenharmony_ci        return HDF_FAILURE;
575094332d3Sopenharmony_ci    }
576094332d3Sopenharmony_ci
577094332d3Sopenharmony_ci    if (dev->service == nullptr) {
578094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:dev->service is nullptr", __func__);
579094332d3Sopenharmony_ci        return HDF_FAILURE;
580094332d3Sopenharmony_ci    }
581094332d3Sopenharmony_ci
582094332d3Sopenharmony_ci    dev->service->session_ = nullptr;
583094332d3Sopenharmony_ci
584094332d3Sopenharmony_ci    ret = UsbdClaimInterfaces(dev);
585094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
586094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbdClaimInterfaces failed ret:%{public}d", __func__, ret);
587094332d3Sopenharmony_ci        return ReturnClainInterfaces(ret, dev);
588094332d3Sopenharmony_ci    }
589094332d3Sopenharmony_ci
590094332d3Sopenharmony_ci    ret = UsbdOpenInterfaces(dev);
591094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
592094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbdOpenInterfaces failed ret:%{public}d", __func__, ret);
593094332d3Sopenharmony_ci        return ReturnOpenInterfaces(ret, dev);
594094332d3Sopenharmony_ci    }
595094332d3Sopenharmony_ci
596094332d3Sopenharmony_ci    ret = UsbdGetCtrlPipe(dev);
597094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
598094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbdGetPipes failed ret:%{public}d", __func__, ret);
599094332d3Sopenharmony_ci        return ReturnGetPipes(ret, dev);
600094332d3Sopenharmony_ci    }
601094332d3Sopenharmony_ci    return HDF_SUCCESS;
602094332d3Sopenharmony_ci}
603094332d3Sopenharmony_ci
604094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestASyncRelease(UsbdRequestASync *request)
605094332d3Sopenharmony_ci{
606094332d3Sopenharmony_ci    if (request == nullptr) {
607094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:request is nullptr.", __func__);
608094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
609094332d3Sopenharmony_ci    }
610094332d3Sopenharmony_ci
611094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
612094332d3Sopenharmony_ci    OsalMutexLock(&request->lock);
613094332d3Sopenharmony_ci    UsbImpl::UsbdRequestASyncReleaseData(request);
614094332d3Sopenharmony_ci    if (request->reqMsg.request != nullptr) {
615094332d3Sopenharmony_ci        ret = UsbFreeRequest(request->reqMsg.request);
616094332d3Sopenharmony_ci        request->reqMsg.request = nullptr;
617094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
618094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:UsbFreeRequest failed", __func__);
619094332d3Sopenharmony_ci        }
620094332d3Sopenharmony_ci    }
621094332d3Sopenharmony_ci    OsalMutexUnlock(&request->lock);
622094332d3Sopenharmony_ci    OsalMemFree(request);
623094332d3Sopenharmony_ci    return ret;
624094332d3Sopenharmony_ci}
625094332d3Sopenharmony_ci
626094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqRelease(UsbdBulkASyncReqList *list)
627094332d3Sopenharmony_ci{
628094332d3Sopenharmony_ci    for (int32_t i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
629094332d3Sopenharmony_ci        UsbFreeRequest(list->node[i].request);
630094332d3Sopenharmony_ci        list->node[i].request = nullptr;
631094332d3Sopenharmony_ci    }
632094332d3Sopenharmony_ci    DListHeadInit(&list->eList);
633094332d3Sopenharmony_ci    DListHeadInit(&list->uList);
634094332d3Sopenharmony_ci    OsalMutexDestroy(&list->elock);
635094332d3Sopenharmony_ci    OsalMutexDestroy(&list->ulock);
636094332d3Sopenharmony_ci    return HDF_SUCCESS;
637094332d3Sopenharmony_ci}
638094332d3Sopenharmony_ci
639094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncListRelease(UsbdBulkASyncList *list)
640094332d3Sopenharmony_ci{
641094332d3Sopenharmony_ci    UsbdBulkASyncReqRelease(&list->rList);
642094332d3Sopenharmony_ci    OsalMutexDestroy(&list->asmHandle.lock);
643094332d3Sopenharmony_ci    OsalMemFree(list);
644094332d3Sopenharmony_ci    return HDF_SUCCESS;
645094332d3Sopenharmony_ci}
646094332d3Sopenharmony_ci
647094332d3Sopenharmony_civoid UsbdDispatcher::UsbdRelease(HostDevice *dev)
648094332d3Sopenharmony_ci{
649094332d3Sopenharmony_ci    if (dev == nullptr) {
650094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
651094332d3Sopenharmony_ci        return;
652094332d3Sopenharmony_ci    }
653094332d3Sopenharmony_ci
654094332d3Sopenharmony_ci    UsbdCloseInterfaces(dev);
655094332d3Sopenharmony_ci    UsbdReleaseInterfaces(dev);
656094332d3Sopenharmony_ci    UsbdFreeCtrlPipe(dev);
657094332d3Sopenharmony_ci    UsbImpl::UsbdRequestSyncReleaseList(dev);
658094332d3Sopenharmony_ci    UsbImpl::UsbdRequestASyncReleaseList(dev);
659094332d3Sopenharmony_ci    UsbImpl::UsbdBulkASyncListReleasePort(dev);
660094332d3Sopenharmony_ci
661094332d3Sopenharmony_ci    if (dev->ctrlReq != nullptr) {
662094332d3Sopenharmony_ci        UsbFreeRequest(dev->ctrlReq);
663094332d3Sopenharmony_ci        dev->ctrlReq = nullptr;
664094332d3Sopenharmony_ci    }
665094332d3Sopenharmony_ci    UsbExitHostSdk(dev->service->session_);
666094332d3Sopenharmony_ci    dev->service->session_ = nullptr;
667094332d3Sopenharmony_ci    OsalMutexDestroy(&dev->writeLock);
668094332d3Sopenharmony_ci    OsalMutexDestroy(&dev->readLock);
669094332d3Sopenharmony_ci    OsalMutexDestroy(&dev->lock);
670094332d3Sopenharmony_ci    OsalMutexDestroy(&dev->requestLock);
671094332d3Sopenharmony_ci    OsalMutexDestroy(&dev->reqSyncLock);
672094332d3Sopenharmony_ci    OsalMutexDestroy(&dev->reqASyncLock);
673094332d3Sopenharmony_ci    dev->busNum = 0;
674094332d3Sopenharmony_ci    dev->devAddr = 0;
675094332d3Sopenharmony_ci    dev->initFlag = false;
676094332d3Sopenharmony_ci}
677094332d3Sopenharmony_ci
678094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdMallocAndFill(uint8_t *&dataAddr, const std::vector<uint8_t> &data)
679094332d3Sopenharmony_ci{
680094332d3Sopenharmony_ci    uint32_t length = sizeof(uint8_t) * data.size();
681094332d3Sopenharmony_ci    if (length == 0) {
682094332d3Sopenharmony_ci        HDF_LOGI("%{public}s: data is empty", __func__);
683094332d3Sopenharmony_ci        return HDF_SUCCESS;
684094332d3Sopenharmony_ci    }
685094332d3Sopenharmony_ci
686094332d3Sopenharmony_ci    dataAddr = static_cast<uint8_t *>(OsalMemCalloc(length));
687094332d3Sopenharmony_ci    if (dataAddr == nullptr) {
688094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemAlloc failed", __func__);
689094332d3Sopenharmony_ci        return HDF_FAILURE;
690094332d3Sopenharmony_ci    }
691094332d3Sopenharmony_ci
692094332d3Sopenharmony_ci    void *dataAddrCovert = static_cast<void *>(dataAddr);
693094332d3Sopenharmony_ci    int32_t err = memcpy_s(dataAddrCovert, length, data.data(), length);
694094332d3Sopenharmony_ci    if (err != EOK) {
695094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: memcpy_s failed", __func__);
696094332d3Sopenharmony_ci        OsalMemFree(dataAddr);
697094332d3Sopenharmony_ci        dataAddr = nullptr;
698094332d3Sopenharmony_ci        return HDF_FAILURE;
699094332d3Sopenharmony_ci    }
700094332d3Sopenharmony_ci    return HDF_SUCCESS;
701094332d3Sopenharmony_ci}
702094332d3Sopenharmony_ci
703094332d3Sopenharmony_ciint32_t UsbdDispatcher::FillReqAyncParams(
704094332d3Sopenharmony_ci    UsbdRequestASync *userData, UsbPipeInfo *pipe, UsbRequestParams *params, const uint8_t *buffer, uint32_t length)
705094332d3Sopenharmony_ci{
706094332d3Sopenharmony_ci    if (userData == nullptr || pipe == nullptr || params == nullptr) {
707094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
708094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
709094332d3Sopenharmony_ci    }
710094332d3Sopenharmony_ci
711094332d3Sopenharmony_ci    bool bWrite = (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT);
712094332d3Sopenharmony_ci    params->interfaceId = pipe->interfaceId;
713094332d3Sopenharmony_ci    params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
714094332d3Sopenharmony_ci    params->pipeId = pipe->pipeId;
715094332d3Sopenharmony_ci    params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
716094332d3Sopenharmony_ci    params->timeout = USB_CTRL_SET_TIMEOUT;
717094332d3Sopenharmony_ci    params->dataReq.numIsoPackets = 0;
718094332d3Sopenharmony_ci    params->userData = static_cast<void *>(userData);
719094332d3Sopenharmony_ci    params->dataReq.length = length;
720094332d3Sopenharmony_ci    params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1);
721094332d3Sopenharmony_ci    if (bWrite) {
722094332d3Sopenharmony_ci        params->callback = UsbdWriteCallback;
723094332d3Sopenharmony_ci        params->dataReq.buffer = const_cast<uint8_t *>(buffer);
724094332d3Sopenharmony_ci    } else {
725094332d3Sopenharmony_ci        params->callback = UsbdReadCallback;
726094332d3Sopenharmony_ci        params->dataReq.length = length;
727094332d3Sopenharmony_ci    }
728094332d3Sopenharmony_ci    return HDF_SUCCESS;
729094332d3Sopenharmony_ci}
730094332d3Sopenharmony_ci
731094332d3Sopenharmony_ciUsbdRequestASync *UsbdDispatcher::UsbdRequestASyncAlloc(void)
732094332d3Sopenharmony_ci{
733094332d3Sopenharmony_ci    UsbdRequestASync *req = static_cast<UsbdRequestASync *>(OsalMemCalloc(sizeof(UsbdRequestASync)));
734094332d3Sopenharmony_ci    if (req == nullptr) {
735094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
736094332d3Sopenharmony_ci        return req;
737094332d3Sopenharmony_ci    }
738094332d3Sopenharmony_ci
739094332d3Sopenharmony_ci    req->reqMsg.request = nullptr;
740094332d3Sopenharmony_ci    req->endPointAddr = 0;
741094332d3Sopenharmony_ci    req->ifHandle = nullptr;
742094332d3Sopenharmony_ci    req->status = 0;
743094332d3Sopenharmony_ci    OsalMutexInit(&req->lock);
744094332d3Sopenharmony_ci    return req;
745094332d3Sopenharmony_ci}
746094332d3Sopenharmony_ci
747094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestASyncInit(
748094332d3Sopenharmony_ci    HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestASync *request)
749094332d3Sopenharmony_ci{
750094332d3Sopenharmony_ci    if (port == nullptr || request == nullptr || ifHandle == nullptr || pipe == nullptr) {
751094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
752094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
753094332d3Sopenharmony_ci    }
754094332d3Sopenharmony_ci
755094332d3Sopenharmony_ci    int32_t ret = memcpy_s(&request->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
756094332d3Sopenharmony_ci    if (ret != EOK) {
757094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
758094332d3Sopenharmony_ci        return ret;
759094332d3Sopenharmony_ci    }
760094332d3Sopenharmony_ci
761094332d3Sopenharmony_ci    request->ifHandle = ifHandle;
762094332d3Sopenharmony_ci    request->reqMsg.request = UsbAllocRequest(request->ifHandle, 0, request->pipe.maxPacketSize);
763094332d3Sopenharmony_ci    if (request->reqMsg.request == nullptr) {
764094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:alloc request failed", __func__);
765094332d3Sopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
766094332d3Sopenharmony_ci    }
767094332d3Sopenharmony_ci    FillReqAyncParams(request, &request->pipe, &request->params, nullptr, 0);
768094332d3Sopenharmony_ci    OsalMutexLock(&port->reqASyncLock);
769094332d3Sopenharmony_ci    HdfSListAddTail(&port->reqASyncList, &request->node);
770094332d3Sopenharmony_ci    OsalMutexUnlock(&port->reqASyncLock);
771094332d3Sopenharmony_ci    return HDF_SUCCESS;
772094332d3Sopenharmony_ci}
773094332d3Sopenharmony_ci
774094332d3Sopenharmony_ciUsbdRequestASync *UsbdDispatcher::UsbdRequestASyncCreatAndInsert(
775094332d3Sopenharmony_ci    HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
776094332d3Sopenharmony_ci{
777094332d3Sopenharmony_ci    UsbPipeInfo pipe;
778094332d3Sopenharmony_ci    if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
779094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:memset_s failed", __func__);
780094332d3Sopenharmony_ci        return nullptr;
781094332d3Sopenharmony_ci    }
782094332d3Sopenharmony_ci
783094332d3Sopenharmony_ci    int32_t ret = GetPipe(port, interfaceId, pipeAddr, &pipe);
784094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
785094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get pipe info failed interfaceId=%{public}d, pipeAddr=%{public}d", __func__, interfaceId,
786094332d3Sopenharmony_ci            pipeAddr);
787094332d3Sopenharmony_ci        return nullptr;
788094332d3Sopenharmony_ci    }
789094332d3Sopenharmony_ci
790094332d3Sopenharmony_ci    UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, interfaceId);
791094332d3Sopenharmony_ci    if (ifHandle == nullptr) {
792094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:get interface handle failed", __func__);
793094332d3Sopenharmony_ci        return nullptr;
794094332d3Sopenharmony_ci    }
795094332d3Sopenharmony_ci
796094332d3Sopenharmony_ci    UsbdRequestASync *req = UsbdRequestASyncAlloc();
797094332d3Sopenharmony_ci    if (req == nullptr) {
798094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbdRequestASyncAlloc failed", __func__);
799094332d3Sopenharmony_ci        return req;
800094332d3Sopenharmony_ci    }
801094332d3Sopenharmony_ci    ret = UsbdRequestASyncInit(port, ifHandle, &pipe, req);
802094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
803094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbdRequestASyncInit failed:%{public}d", __func__, ret);
804094332d3Sopenharmony_ci        UsbdRequestASyncRelease(req);
805094332d3Sopenharmony_ci        req = nullptr;
806094332d3Sopenharmony_ci        return req;
807094332d3Sopenharmony_ci    }
808094332d3Sopenharmony_ci    return req;
809094332d3Sopenharmony_ci}
810094332d3Sopenharmony_ci
811094332d3Sopenharmony_ciint32_t UsbdDispatcher::HostDeviceInit(HostDevice *port)
812094332d3Sopenharmony_ci{
813094332d3Sopenharmony_ci    if (port == nullptr) {
814094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:port is nullptr", __func__);
815094332d3Sopenharmony_ci        return HDF_ERR_INVALID_OBJECT;
816094332d3Sopenharmony_ci    }
817094332d3Sopenharmony_ci
818094332d3Sopenharmony_ci    port->busNum = 0;
819094332d3Sopenharmony_ci    port->devAddr = 0;
820094332d3Sopenharmony_ci    port->initFlag = false;
821094332d3Sopenharmony_ci    port->interfaceCnt = 0;
822094332d3Sopenharmony_ci    if (OsalMutexInit(&port->lock) != HDF_SUCCESS) {
823094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:init lock failed!", __func__);
824094332d3Sopenharmony_ci        return HDF_FAILURE;
825094332d3Sopenharmony_ci    }
826094332d3Sopenharmony_ci
827094332d3Sopenharmony_ci    if (OsalMutexInit(&port->requestLock) != HDF_SUCCESS) {
828094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:init requestLock failed!", __func__);
829094332d3Sopenharmony_ci        return HDF_FAILURE;
830094332d3Sopenharmony_ci    }
831094332d3Sopenharmony_ci
832094332d3Sopenharmony_ci    if (OsalMutexInit(&port->writeLock) != HDF_SUCCESS) {
833094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:init writeLock failed!", __func__);
834094332d3Sopenharmony_ci        return HDF_FAILURE;
835094332d3Sopenharmony_ci    }
836094332d3Sopenharmony_ci
837094332d3Sopenharmony_ci    if (OsalMutexInit(&port->readLock) != HDF_SUCCESS) {
838094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:init readLock failed!", __func__);
839094332d3Sopenharmony_ci        return HDF_FAILURE;
840094332d3Sopenharmony_ci    }
841094332d3Sopenharmony_ci
842094332d3Sopenharmony_ci    if (OsalMutexInit(&port->reqSyncLock) != HDF_SUCCESS) {
843094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:init reqSyncLock failed!", __func__);
844094332d3Sopenharmony_ci        return HDF_FAILURE;
845094332d3Sopenharmony_ci    }
846094332d3Sopenharmony_ci
847094332d3Sopenharmony_ci    if (OsalMutexInit(&port->reqASyncLock) != HDF_SUCCESS) {
848094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:init reqASyncLock failed!", __func__);
849094332d3Sopenharmony_ci        return HDF_FAILURE;
850094332d3Sopenharmony_ci    }
851094332d3Sopenharmony_ci
852094332d3Sopenharmony_ci    HdfSListInit(&port->requestQueue);
853094332d3Sopenharmony_ci    HdfSListInit(&port->reqSyncList);
854094332d3Sopenharmony_ci    HdfSListInit(&port->reqASyncList);
855094332d3Sopenharmony_ci    return HDF_SUCCESS;
856094332d3Sopenharmony_ci}
857094332d3Sopenharmony_ci
858094332d3Sopenharmony_ciint32_t UsbdDispatcher::HostDeviceCreate(HostDevice **port)
859094332d3Sopenharmony_ci{
860094332d3Sopenharmony_ci    if (port == nullptr) {
861094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
862094332d3Sopenharmony_ci        return HDF_ERR_INVALID_OBJECT;
863094332d3Sopenharmony_ci    }
864094332d3Sopenharmony_ci
865094332d3Sopenharmony_ci    HostDevice *tmp = static_cast<HostDevice *>(OsalMemCalloc(sizeof(HostDevice)));
866094332d3Sopenharmony_ci    if (tmp == nullptr) {
867094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
868094332d3Sopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
869094332d3Sopenharmony_ci    }
870094332d3Sopenharmony_ci
871094332d3Sopenharmony_ci    int32_t ret = HostDeviceInit(tmp);
872094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
873094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:HostDeviceInit failed!", __func__);
874094332d3Sopenharmony_ci        OsalMemFree(tmp);
875094332d3Sopenharmony_ci        tmp = nullptr;
876094332d3Sopenharmony_ci        return ret;
877094332d3Sopenharmony_ci    }
878094332d3Sopenharmony_ci
879094332d3Sopenharmony_ci    tmp->initFlag = false;
880094332d3Sopenharmony_ci    *port = tmp;
881094332d3Sopenharmony_ci    return HDF_SUCCESS;
882094332d3Sopenharmony_ci}
883094332d3Sopenharmony_ci
884094332d3Sopenharmony_ciint32_t UsbdDispatcher::FunAttachDevice(HostDevice *port, HdfSBuf *data, HdfSBuf *reply)
885094332d3Sopenharmony_ci{
886094332d3Sopenharmony_ci    if (port == nullptr) {
887094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:mangf invalid param", __func__);
888094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
889094332d3Sopenharmony_ci    }
890094332d3Sopenharmony_ci    if (port->initFlag) {
891094332d3Sopenharmony_ci        HDF_LOGD("%{public}s:device is already on flag:%{public}d bus:%{public}d dev:%{public}d", __func__,
892094332d3Sopenharmony_ci            port->initFlag, port->busNum, port->devAddr);
893094332d3Sopenharmony_ci        return HDF_SUCCESS;
894094332d3Sopenharmony_ci    }
895094332d3Sopenharmony_ci
896094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
897094332d3Sopenharmony_ci    do {
898094332d3Sopenharmony_ci        ret = UsbdInit(port);
899094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
900094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:UsbInit failed ret:%{public}d", __func__, ret);
901094332d3Sopenharmony_ci            RemoveDevFromService(port->service, port);
902094332d3Sopenharmony_ci            UsbdRelease(port);
903094332d3Sopenharmony_ci            OsalMemFree(port);
904094332d3Sopenharmony_ci            return ret;
905094332d3Sopenharmony_ci        }
906094332d3Sopenharmony_ci        ret = UsbdAllocFifo(&port->readFifo, READ_BUF_SIZE);
907094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
908094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:UsbAllocFifo failed ret:%{public}d", __func__, ret);
909094332d3Sopenharmony_ci            ret = HDF_ERR_INVALID_PARAM;
910094332d3Sopenharmony_ci            break;
911094332d3Sopenharmony_ci        }
912094332d3Sopenharmony_ci        if (ret == HDF_SUCCESS) {
913094332d3Sopenharmony_ci            port->initFlag = true;
914094332d3Sopenharmony_ci            HDF_LOGI("%{public}s:UsbOpen success", __func__);
915094332d3Sopenharmony_ci        } else {
916094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:UsbOpen fail:%{public}d", __func__, ret);
917094332d3Sopenharmony_ci        }
918094332d3Sopenharmony_ci        return ret;
919094332d3Sopenharmony_ci    } while (0);
920094332d3Sopenharmony_ci
921094332d3Sopenharmony_ci    UsbdFreeFifo(&port->readFifo);
922094332d3Sopenharmony_ci    UsbdRelease(port);
923094332d3Sopenharmony_ci    RemoveDevFromService(port->service, port);
924094332d3Sopenharmony_ci    OsalMemFree(port);
925094332d3Sopenharmony_ci    return ret;
926094332d3Sopenharmony_ci}
927094332d3Sopenharmony_ci
928094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdDeviceCreateAndAttach(const sptr<UsbImpl> &service, uint8_t busNum, uint8_t devAddr)
929094332d3Sopenharmony_ci{
930094332d3Sopenharmony_ci    HostDevice *port = service->FindDevFromService(busNum, devAddr);
931094332d3Sopenharmony_ci    if (port != nullptr) {
932094332d3Sopenharmony_ci        HDF_LOGI("%{public}s:device already add", __func__);
933094332d3Sopenharmony_ci        return HDF_ERR_DEVICE_BUSY;
934094332d3Sopenharmony_ci    }
935094332d3Sopenharmony_ci    int32_t ret = HostDeviceCreate(&port);
936094332d3Sopenharmony_ci    if (ret == HDF_SUCCESS) {
937094332d3Sopenharmony_ci        port->busNum = busNum;
938094332d3Sopenharmony_ci        port->devAddr = devAddr;
939094332d3Sopenharmony_ci        port->service = service;
940094332d3Sopenharmony_ci        OsalMutexLock(&service->lock_);
941094332d3Sopenharmony_ci        HdfSListAdd(&service->devList_, &port->node);
942094332d3Sopenharmony_ci        OsalMutexUnlock(&service->lock_);
943094332d3Sopenharmony_ci        ret = FunAttachDevice(port, nullptr, nullptr);
944094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
945094332d3Sopenharmony_ci            HDF_LOGW("%{public}s:FunAttachDevice error ret:%{public}d", __func__, ret);
946094332d3Sopenharmony_ci        }
947094332d3Sopenharmony_ci        port = nullptr;
948094332d3Sopenharmony_ci    } else {
949094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:createdevice error ret:%{public}d", __func__, ret);
950094332d3Sopenharmony_ci    }
951094332d3Sopenharmony_ci    return ret;
952094332d3Sopenharmony_ci}
953094332d3Sopenharmony_ci
954094332d3Sopenharmony_ciint32_t UsbdDispatcher::FunDetachDevice(HostDevice *port, HdfSBuf *data)
955094332d3Sopenharmony_ci{
956094332d3Sopenharmony_ci    if (port == nullptr) {
957094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param port", __func__);
958094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
959094332d3Sopenharmony_ci    }
960094332d3Sopenharmony_ci
961094332d3Sopenharmony_ci    RemoveDevFromService(port->service, port);
962094332d3Sopenharmony_ci    UsbdRelease(port);
963094332d3Sopenharmony_ci    UsbdFreeFifo(&port->readFifo);
964094332d3Sopenharmony_ci    OsalMemFree(port);
965094332d3Sopenharmony_ci    return HDF_SUCCESS;
966094332d3Sopenharmony_ci}
967094332d3Sopenharmony_ci
968094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdDeviceDettach(UsbImpl *service, uint8_t busNum, uint8_t devAddr)
969094332d3Sopenharmony_ci{
970094332d3Sopenharmony_ci    if (service == nullptr) {
971094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param service!", __func__);
972094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
973094332d3Sopenharmony_ci    }
974094332d3Sopenharmony_ci
975094332d3Sopenharmony_ci    HostDevice *port = service->FindDevFromService(busNum, devAddr);
976094332d3Sopenharmony_ci    if (port == nullptr) {
977094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
978094332d3Sopenharmony_ci        return HDF_DEV_ERR_NO_DEVICE;
979094332d3Sopenharmony_ci    }
980094332d3Sopenharmony_ci
981094332d3Sopenharmony_ci    int32_t ret = FunDetachDevice(port, nullptr);
982094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
983094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d FunDetachDevice failed", __func__, ret);
984094332d3Sopenharmony_ci        return HDF_FAILURE;
985094332d3Sopenharmony_ci    }
986094332d3Sopenharmony_ci
987094332d3Sopenharmony_ci    return HDF_SUCCESS;
988094332d3Sopenharmony_ci}
989094332d3Sopenharmony_ci
990094332d3Sopenharmony_ciHostDevice *UsbdDispatcher::UsbdFindDevForBusNum(UsbImpl *service, uint8_t busNum)
991094332d3Sopenharmony_ci{
992094332d3Sopenharmony_ci    if (service == nullptr) {
993094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: service is nullptr", __func__);
994094332d3Sopenharmony_ci        return nullptr;
995094332d3Sopenharmony_ci    }
996094332d3Sopenharmony_ci
997094332d3Sopenharmony_ci    uint8_t flag = false;
998094332d3Sopenharmony_ci    HdfSListIterator it;
999094332d3Sopenharmony_ci    HostDevice *tempPort = nullptr;
1000094332d3Sopenharmony_ci    OsalMutexLock(&service->lock_);
1001094332d3Sopenharmony_ci    HdfSListIteratorInit(&it, &service->devList_);
1002094332d3Sopenharmony_ci    while (HdfSListIteratorHasNext(&it)) {
1003094332d3Sopenharmony_ci        tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
1004094332d3Sopenharmony_ci        if (!tempPort) {
1005094332d3Sopenharmony_ci            continue;
1006094332d3Sopenharmony_ci        }
1007094332d3Sopenharmony_ci        if (tempPort->busNum == busNum) {
1008094332d3Sopenharmony_ci            HdfSListIteratorRemove(&it);
1009094332d3Sopenharmony_ci            flag = true;
1010094332d3Sopenharmony_ci            break;
1011094332d3Sopenharmony_ci        }
1012094332d3Sopenharmony_ci    }
1013094332d3Sopenharmony_ci    OsalMutexUnlock(&service->lock_);
1014094332d3Sopenharmony_ci    if (flag) {
1015094332d3Sopenharmony_ci        return tempPort;
1016094332d3Sopenharmony_ci    }
1017094332d3Sopenharmony_ci    return nullptr;
1018094332d3Sopenharmony_ci}
1019094332d3Sopenharmony_ci
1020094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRemoveBusDev(UsbImpl *service, uint8_t busNum, const sptr<IUsbdSubscriber> &subscriber)
1021094332d3Sopenharmony_ci{
1022094332d3Sopenharmony_ci    HostDevice *tempPort = nullptr;
1023094332d3Sopenharmony_ci    USBDeviceInfo info;
1024094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
1025094332d3Sopenharmony_ci
1026094332d3Sopenharmony_ci    while (1) {
1027094332d3Sopenharmony_ci        tempPort = UsbdDispatcher::UsbdFindDevForBusNum(service, busNum);
1028094332d3Sopenharmony_ci        if (!tempPort) {
1029094332d3Sopenharmony_ci            break;
1030094332d3Sopenharmony_ci        }
1031094332d3Sopenharmony_ci        info = {ACT_DEVDOWN, tempPort->busNum, tempPort->devAddr};
1032094332d3Sopenharmony_ci        ret = subscriber->DeviceEvent(info);
1033094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1034094332d3Sopenharmony_ci            HDF_LOGE("%{public}s failed to notify subscriber, ret: %{public}d", __func__, ret);
1035094332d3Sopenharmony_ci            return ret;
1036094332d3Sopenharmony_ci        }
1037094332d3Sopenharmony_ci        UsbdRelease(tempPort);
1038094332d3Sopenharmony_ci        UsbdFreeFifo(&tempPort->readFifo);
1039094332d3Sopenharmony_ci        OsalMemFree(tempPort);
1040094332d3Sopenharmony_ci    }
1041094332d3Sopenharmony_ci    return ret;
1042094332d3Sopenharmony_ci}
1043094332d3Sopenharmony_ci
1044094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqInit(UsbdBulkASyncReqList *list, UsbdBulkASyncList *pList)
1045094332d3Sopenharmony_ci{
1046094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
1047094332d3Sopenharmony_ci    int32_t i = 0;
1048094332d3Sopenharmony_ci    DListHeadInit(&list->eList);
1049094332d3Sopenharmony_ci    DListHeadInit(&list->uList);
1050094332d3Sopenharmony_ci    OsalMutexInit(&list->elock);
1051094332d3Sopenharmony_ci    OsalMutexInit(&list->ulock);
1052094332d3Sopenharmony_ci    for (i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
1053094332d3Sopenharmony_ci        list->node[i].request = UsbAllocRequest(pList->ifHandle, 0, pList->pipe.maxPacketSize);
1054094332d3Sopenharmony_ci        if (!list->node[i].request) {
1055094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:alloc request failed i:%{public}d", __func__, i);
1056094332d3Sopenharmony_ci            ret = HDF_ERR_MALLOC_FAIL;
1057094332d3Sopenharmony_ci            break;
1058094332d3Sopenharmony_ci        }
1059094332d3Sopenharmony_ci        list->node[i].list = list;
1060094332d3Sopenharmony_ci        list->node[i].id = i;
1061094332d3Sopenharmony_ci        DListInsertTail(&list->node[i].node, &list->eList);
1062094332d3Sopenharmony_ci        pList->params.userData = static_cast<void *>(&list->node[i]);
1063094332d3Sopenharmony_ci    }
1064094332d3Sopenharmony_ci
1065094332d3Sopenharmony_ci    if (i != USBD_BULKASYNCREQ_NUM_MAX) {
1066094332d3Sopenharmony_ci        for (; i >= 0; --i) {
1067094332d3Sopenharmony_ci            UsbFreeRequest(list->node[i].request);
1068094332d3Sopenharmony_ci            list->node[i].request = nullptr;
1069094332d3Sopenharmony_ci        }
1070094332d3Sopenharmony_ci        DListHeadInit(&list->eList);
1071094332d3Sopenharmony_ci        DListHeadInit(&list->uList);
1072094332d3Sopenharmony_ci        OsalMutexDestroy(&list->elock);
1073094332d3Sopenharmony_ci        OsalMutexDestroy(&list->ulock);
1074094332d3Sopenharmony_ci    }
1075094332d3Sopenharmony_ci    list->pList = pList;
1076094332d3Sopenharmony_ci    return ret;
1077094332d3Sopenharmony_ci}
1078094332d3Sopenharmony_ci
1079094332d3Sopenharmony_ciUsbdBulkASyncList *UsbdDispatcher::UsbdBulkASyncListAlloc(HostDevice *port, uint8_t ifId, uint8_t epId)
1080094332d3Sopenharmony_ci{
1081094332d3Sopenharmony_ci    UsbPipeInfo pipe;
1082094332d3Sopenharmony_ci    if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
1083094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:memset_s failed", __func__);
1084094332d3Sopenharmony_ci        return nullptr;
1085094332d3Sopenharmony_ci    }
1086094332d3Sopenharmony_ci
1087094332d3Sopenharmony_ci    int32_t ret = GetPipe(port, ifId, epId, &pipe);
1088094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1089094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetPipe failed, ret:%{public}d", __func__, ret);
1090094332d3Sopenharmony_ci        return nullptr;
1091094332d3Sopenharmony_ci    }
1092094332d3Sopenharmony_ci
1093094332d3Sopenharmony_ci    UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, ifId);
1094094332d3Sopenharmony_ci    if (ifHandle == nullptr) {
1095094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:get interface handle failed", __func__);
1096094332d3Sopenharmony_ci        return nullptr;
1097094332d3Sopenharmony_ci    }
1098094332d3Sopenharmony_ci
1099094332d3Sopenharmony_ci    UsbdBulkASyncList *bulkAsyncList = reinterpret_cast<UsbdBulkASyncList *>(OsalMemCalloc(sizeof(UsbdBulkASyncList)));
1100094332d3Sopenharmony_ci    if (bulkAsyncList == nullptr) {
1101094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:malloc failed!", __func__);
1102094332d3Sopenharmony_ci        return nullptr;
1103094332d3Sopenharmony_ci    }
1104094332d3Sopenharmony_ci    bulkAsyncList->ifId = ifId;
1105094332d3Sopenharmony_ci    bulkAsyncList->epId = epId;
1106094332d3Sopenharmony_ci    bulkAsyncList->instance = port;
1107094332d3Sopenharmony_ci    OsalMutexInit(&bulkAsyncList->asmHandle.lock);
1108094332d3Sopenharmony_ci    bulkAsyncList->pipe = pipe;
1109094332d3Sopenharmony_ci    bulkAsyncList->ifHandle = ifHandle;
1110094332d3Sopenharmony_ci    UsbdBulkASyncReqFillParams(&bulkAsyncList->pipe, &bulkAsyncList->params, nullptr);
1111094332d3Sopenharmony_ci    ret = UsbdBulkASyncReqInit(&bulkAsyncList->rList, bulkAsyncList);
1112094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1113094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: UsbdBulkASyncReqInit failed ret:%{public}d", __func__, ret);
1114094332d3Sopenharmony_ci        UsbdBulkASyncListRelease(bulkAsyncList);
1115094332d3Sopenharmony_ci        bulkAsyncList = nullptr;
1116094332d3Sopenharmony_ci        return bulkAsyncList;
1117094332d3Sopenharmony_ci    }
1118094332d3Sopenharmony_ci
1119094332d3Sopenharmony_ci    return bulkAsyncList;
1120094332d3Sopenharmony_ci}
1121094332d3Sopenharmony_ci
1122094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode *db)
1123094332d3Sopenharmony_ci{
1124094332d3Sopenharmony_ci    OsalMutexLock(&db->list->elock);
1125094332d3Sopenharmony_ci    db->use = USBD_REQNODE_NOUSE;
1126094332d3Sopenharmony_ci    DListInsertTail(&db->node, &db->list->eList);
1127094332d3Sopenharmony_ci    OsalMutexUnlock(&db->list->elock);
1128094332d3Sopenharmony_ci    return HDF_SUCCESS;
1129094332d3Sopenharmony_ci}
1130094332d3Sopenharmony_ci
1131094332d3Sopenharmony_ciUsbdBulkASyncReqNode *UsbdDispatcher::UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList *list)
1132094332d3Sopenharmony_ci{
1133094332d3Sopenharmony_ci    OsalMutexLock(&list->elock);
1134094332d3Sopenharmony_ci    if (DListIsEmpty(&list->eList)) {
1135094332d3Sopenharmony_ci        OsalMutexUnlock(&list->elock);
1136094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
1137094332d3Sopenharmony_ci        return nullptr;
1138094332d3Sopenharmony_ci    }
1139094332d3Sopenharmony_ci    UsbdBulkASyncReqNode *ptr = DLIST_FIRST_ENTRY(&list->eList, UsbdBulkASyncReqNode, node);
1140094332d3Sopenharmony_ci    if (ptr != nullptr) {
1141094332d3Sopenharmony_ci        ptr->use = USBD_REQNODE_OTHER;
1142094332d3Sopenharmony_ci        DListRemove(&ptr->node);
1143094332d3Sopenharmony_ci    }
1144094332d3Sopenharmony_ci    OsalMutexUnlock(&list->elock);
1145094332d3Sopenharmony_ci    return ptr;
1146094332d3Sopenharmony_ci}
1147094332d3Sopenharmony_ci
1148094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkReadRemoteCallback(
1149094332d3Sopenharmony_ci    const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle)
1150094332d3Sopenharmony_ci{
1151094332d3Sopenharmony_ci    if (service == nullptr || handle == nullptr) {
1152094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
1153094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1154094332d3Sopenharmony_ci    }
1155094332d3Sopenharmony_ci
1156094332d3Sopenharmony_ci    OsalMutexLock(&handle->lock);
1157094332d3Sopenharmony_ci    uint8_t flag = handle->cbflg;
1158094332d3Sopenharmony_ci    handle->cbflg = 1;
1159094332d3Sopenharmony_ci    int32_t actLength = static_cast<int32_t>(handle->rcur);
1160094332d3Sopenharmony_ci    OsalMutexUnlock(&handle->lock);
1161094332d3Sopenharmony_ci    if (flag) {
1162094332d3Sopenharmony_ci        return HDF_SUCCESS;
1163094332d3Sopenharmony_ci    }
1164094332d3Sopenharmony_ci    int32_t ret = service->OnBulkReadCallback(status, actLength);
1165094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1166094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:OnBulkReadCallback failed, ret=%{public}d", __func__, ret);
1167094332d3Sopenharmony_ci    }
1168094332d3Sopenharmony_ci    return ret;
1169094332d3Sopenharmony_ci}
1170094332d3Sopenharmony_ci
1171094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkWriteRemoteCallback(
1172094332d3Sopenharmony_ci    const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle)
1173094332d3Sopenharmony_ci{
1174094332d3Sopenharmony_ci    if (service == nullptr || handle == nullptr) {
1175094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
1176094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1177094332d3Sopenharmony_ci    }
1178094332d3Sopenharmony_ci
1179094332d3Sopenharmony_ci    OsalMutexLock(&handle->lock);
1180094332d3Sopenharmony_ci    uint8_t flag = handle->cbflg;
1181094332d3Sopenharmony_ci    handle->cbflg = 1;
1182094332d3Sopenharmony_ci    int32_t actLength = static_cast<int32_t>(handle->cur);
1183094332d3Sopenharmony_ci    OsalMutexUnlock(&handle->lock);
1184094332d3Sopenharmony_ci    if (flag) {
1185094332d3Sopenharmony_ci        return HDF_SUCCESS;
1186094332d3Sopenharmony_ci    }
1187094332d3Sopenharmony_ci
1188094332d3Sopenharmony_ci    int32_t ret = service->OnBulkWriteCallback(status, actLength);
1189094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1190094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:OnBulkWriteCallback failed, ret=%{public}d", __func__, ret);
1191094332d3Sopenharmony_ci    }
1192094332d3Sopenharmony_ci    return ret;
1193094332d3Sopenharmony_ci}
1194094332d3Sopenharmony_ci
1195094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncPutAsmData(UsbdBufferHandle *handle, uint8_t *buffer, uint32_t len)
1196094332d3Sopenharmony_ci{
1197094332d3Sopenharmony_ci    if (handle == nullptr || buffer == nullptr || len < 1) {
1198094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param len:%{public}d", __func__, len);
1199094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1200094332d3Sopenharmony_ci    }
1201094332d3Sopenharmony_ci
1202094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
1203094332d3Sopenharmony_ci    OsalMutexLock(&handle->lock);
1204094332d3Sopenharmony_ci    do {
1205094332d3Sopenharmony_ci        if (handle->fd < 1) {
1206094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:fd error, handle->fd:%{public}d", __func__, handle->fd);
1207094332d3Sopenharmony_ci            ret = HDF_ERR_BAD_FD;
1208094332d3Sopenharmony_ci            break;
1209094332d3Sopenharmony_ci        }
1210094332d3Sopenharmony_ci        uint32_t tlen = (handle->size > handle->rcur) ? (handle->size - handle->rcur) : 0;
1211094332d3Sopenharmony_ci        tlen = tlen < len ? tlen : len;
1212094332d3Sopenharmony_ci        if (tlen > 0) {
1213094332d3Sopenharmony_ci            ret = memcpy_s(handle->starAddr + handle->rcur, tlen, buffer, len);
1214094332d3Sopenharmony_ci            if (ret != EOK) {
1215094332d3Sopenharmony_ci                HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1216094332d3Sopenharmony_ci                OsalMutexUnlock(&handle->lock);
1217094332d3Sopenharmony_ci                return ret;
1218094332d3Sopenharmony_ci            }
1219094332d3Sopenharmony_ci
1220094332d3Sopenharmony_ci            handle->rcur += tlen;
1221094332d3Sopenharmony_ci        }
1222094332d3Sopenharmony_ci    } while (0);
1223094332d3Sopenharmony_ci    OsalMutexUnlock(&handle->lock);
1224094332d3Sopenharmony_ci    return ret;
1225094332d3Sopenharmony_ci}
1226094332d3Sopenharmony_ci
1227094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkAsyncGetAsmData(
1228094332d3Sopenharmony_ci    UsbdBufferHandle *handle, UsbRequestParams *params, uint16_t maxPacketSize)
1229094332d3Sopenharmony_ci{
1230094332d3Sopenharmony_ci    if (handle == nullptr || params == nullptr || handle->size < 1 || maxPacketSize < 1) {
1231094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
1232094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1233094332d3Sopenharmony_ci    }
1234094332d3Sopenharmony_ci
1235094332d3Sopenharmony_ci    int32_t ret = HDF_ERR_INVALID_PARAM;
1236094332d3Sopenharmony_ci    OsalMutexLock(&handle->lock);
1237094332d3Sopenharmony_ci    if (handle->cur < handle->size) {
1238094332d3Sopenharmony_ci        params->dataReq.length =
1239094332d3Sopenharmony_ci            (handle->size - handle->cur) < maxPacketSize ? (handle->size - handle->cur) : maxPacketSize;
1240094332d3Sopenharmony_ci        params->dataReq.buffer = handle->starAddr + handle->cur;
1241094332d3Sopenharmony_ci        handle->cur += params->dataReq.length;
1242094332d3Sopenharmony_ci        ret = HDF_SUCCESS;
1243094332d3Sopenharmony_ci    } else {
1244094332d3Sopenharmony_ci        params->dataReq.length = 0;
1245094332d3Sopenharmony_ci        params->dataReq.buffer = nullptr;
1246094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
1247094332d3Sopenharmony_ci        ret = HDF_DEV_ERR_NODATA;
1248094332d3Sopenharmony_ci    }
1249094332d3Sopenharmony_ci    OsalMutexUnlock(&handle->lock);
1250094332d3Sopenharmony_ci    return ret;
1251094332d3Sopenharmony_ci}
1252094332d3Sopenharmony_ci
1253094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle *handle, uint32_t *reqLen, uint16_t maxPacketSize)
1254094332d3Sopenharmony_ci{
1255094332d3Sopenharmony_ci    if (handle == nullptr || reqLen == nullptr || handle->size < 1 || maxPacketSize < 1) {
1256094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1257094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1258094332d3Sopenharmony_ci    }
1259094332d3Sopenharmony_ci
1260094332d3Sopenharmony_ci    uint32_t tlen = 0;
1261094332d3Sopenharmony_ci    OsalMutexLock(&handle->lock);
1262094332d3Sopenharmony_ci    if (handle->cur < handle->size) {
1263094332d3Sopenharmony_ci        tlen = handle->size - handle->cur;
1264094332d3Sopenharmony_ci        tlen = tlen < maxPacketSize ? tlen : maxPacketSize;
1265094332d3Sopenharmony_ci        handle->cur += tlen;
1266094332d3Sopenharmony_ci    }
1267094332d3Sopenharmony_ci    OsalMutexUnlock(&handle->lock);
1268094332d3Sopenharmony_ci    *reqLen = tlen;
1269094332d3Sopenharmony_ci    return HDF_SUCCESS;
1270094332d3Sopenharmony_ci}
1271094332d3Sopenharmony_ci
1272094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqWriteAutoSubmit(UsbRequest *request)
1273094332d3Sopenharmony_ci{
1274094332d3Sopenharmony_ci    UsbRequestParams params;
1275094332d3Sopenharmony_ci    UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1276094332d3Sopenharmony_ci    int32_t ret = memcpy_s(&params, sizeof(params), &db->list->pList->params, sizeof(params));
1277094332d3Sopenharmony_ci    if (ret != EOK) {
1278094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1279094332d3Sopenharmony_ci        return ret;
1280094332d3Sopenharmony_ci    }
1281094332d3Sopenharmony_ci
1282094332d3Sopenharmony_ci    params.userData = static_cast<void *>(db);
1283094332d3Sopenharmony_ci    ret = UsbdBulkAsyncGetAsmData(&db->list->pList->asmHandle, &params, db->list->pList->pipe.maxPacketSize);
1284094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1285094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1286094332d3Sopenharmony_ci        return ret;
1287094332d3Sopenharmony_ci    }
1288094332d3Sopenharmony_ci    db->request->compInfo.status = USB_REQUEST_COMPLETED;
1289094332d3Sopenharmony_ci    ret = UsbFillRequest(request, db->list->pList->ifHandle, &params);
1290094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1291094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1292094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret);
1293094332d3Sopenharmony_ci        return ret;
1294094332d3Sopenharmony_ci    }
1295094332d3Sopenharmony_ci    ret = UsbSubmitRequestAsync(request);
1296094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1297094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1298094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret);
1299094332d3Sopenharmony_ci    }
1300094332d3Sopenharmony_ci    return ret;
1301094332d3Sopenharmony_ci}
1302094332d3Sopenharmony_ci
1303094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqReadAutoSubmit(UsbRequest *request)
1304094332d3Sopenharmony_ci{
1305094332d3Sopenharmony_ci    uint32_t readLen = 0;
1306094332d3Sopenharmony_ci    UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1307094332d3Sopenharmony_ci    int32_t ret =
1308094332d3Sopenharmony_ci        UsbdBulkASyncPutAsmData(&db->list->pList->asmHandle, request->compInfo.buffer, request->compInfo.actualLength);
1309094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1310094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d UsbdBulkASyncPutAsmData error size:%{public}d ret:%{public}d", __func__,
1311094332d3Sopenharmony_ci            __LINE__, request->compInfo.actualLength, ret);
1312094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1313094332d3Sopenharmony_ci        return ret;
1314094332d3Sopenharmony_ci    }
1315094332d3Sopenharmony_ci
1316094332d3Sopenharmony_ci    ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize);
1317094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS || readLen < 1) {
1318094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1319094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid param", __func__);
1320094332d3Sopenharmony_ci        return HDF_DEV_ERR_NODATA;
1321094332d3Sopenharmony_ci    }
1322094332d3Sopenharmony_ci    db->request->compInfo.status = USB_REQUEST_COMPLETED;
1323094332d3Sopenharmony_ci    UsbHostRequest *hostRequest = reinterpret_cast<UsbIfRequest *>(request)->hostRequest;
1324094332d3Sopenharmony_ci    if (readLen != static_cast<uint32_t>(hostRequest->length)) {
1325094332d3Sopenharmony_ci        UsbRequestParams params;
1326094332d3Sopenharmony_ci        ret = memcpy_s(&params, sizeof(params), &db->list->pList->params, sizeof(params));
1327094332d3Sopenharmony_ci        if (ret != EOK) {
1328094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: %{public}d memcpy_s failed", __func__, ret);
1329094332d3Sopenharmony_ci            return ret;
1330094332d3Sopenharmony_ci        }
1331094332d3Sopenharmony_ci
1332094332d3Sopenharmony_ci        params.dataReq.length = readLen;
1333094332d3Sopenharmony_ci        params.userData = static_cast<void *>(db);
1334094332d3Sopenharmony_ci        ret = UsbFillRequest(request, db->list->pList->ifHandle, &params);
1335094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1336094332d3Sopenharmony_ci            UsbdBulkASyncReqNodeSetNoUse(db);
1337094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d ", __func__, ret);
1338094332d3Sopenharmony_ci            return ret;
1339094332d3Sopenharmony_ci        }
1340094332d3Sopenharmony_ci    }
1341094332d3Sopenharmony_ci    ret = UsbSubmitRequestAsync(request);
1342094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1343094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1344094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d ", __func__, ret);
1345094332d3Sopenharmony_ci    }
1346094332d3Sopenharmony_ci    return ret;
1347094332d3Sopenharmony_ci}
1348094332d3Sopenharmony_ci
1349094332d3Sopenharmony_civoid UsbdDispatcher::UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest *request)
1350094332d3Sopenharmony_ci{
1351094332d3Sopenharmony_ci    if (request == nullptr) {
1352094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__);
1353094332d3Sopenharmony_ci        return;
1354094332d3Sopenharmony_ci    }
1355094332d3Sopenharmony_ci
1356094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
1357094332d3Sopenharmony_ci    UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1358094332d3Sopenharmony_ci    int32_t status = request->compInfo.status;
1359094332d3Sopenharmony_ci    if (status != 0) {
1360094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(node);
1361094332d3Sopenharmony_ci        ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle);
1362094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1363094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed, ret:%{public}d"
1364094332d3Sopenharmony_ci                "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status);
1365094332d3Sopenharmony_ci        }
1366094332d3Sopenharmony_ci        return;
1367094332d3Sopenharmony_ci    }
1368094332d3Sopenharmony_ci
1369094332d3Sopenharmony_ci    ret = UsbdBulkASyncReqWriteAutoSubmit(request);
1370094332d3Sopenharmony_ci    if (ret == HDF_DEV_ERR_NODATA) {
1371094332d3Sopenharmony_ci        int32_t count = DListGetCount(&node->list->eList);
1372094332d3Sopenharmony_ci        if (count >= USBD_BULKASYNCREQ_NUM_MAX) {
1373094332d3Sopenharmony_ci            ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle);
1374094332d3Sopenharmony_ci            if (ret != HDF_SUCCESS) {
1375094332d3Sopenharmony_ci                HDF_LOGE("%{public}s: %{public}d UsbdBulkWriteRemoteCallback failed", __func__, __LINE__);
1376094332d3Sopenharmony_ci            }
1377094332d3Sopenharmony_ci            return;
1378094332d3Sopenharmony_ci        }
1379094332d3Sopenharmony_ci    } else if (ret != HDF_SUCCESS) {
1380094332d3Sopenharmony_ci        ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle);
1381094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1382094332d3Sopenharmony_ci            HDF_LOGE(
1383094332d3Sopenharmony_ci                "%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed ret:%{public}d id:%{public}d",
1384094332d3Sopenharmony_ci                __func__, __LINE__, ret, node->id);
1385094332d3Sopenharmony_ci        }
1386094332d3Sopenharmony_ci        return;
1387094332d3Sopenharmony_ci    }
1388094332d3Sopenharmony_ci}
1389094332d3Sopenharmony_ci
1390094332d3Sopenharmony_civoid UsbdDispatcher::UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest *request)
1391094332d3Sopenharmony_ci{
1392094332d3Sopenharmony_ci    if (request == nullptr) {
1393094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__);
1394094332d3Sopenharmony_ci        return;
1395094332d3Sopenharmony_ci    }
1396094332d3Sopenharmony_ci
1397094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
1398094332d3Sopenharmony_ci    UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1399094332d3Sopenharmony_ci    int32_t status = request->compInfo.status;
1400094332d3Sopenharmony_ci    if (status != 0) {
1401094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(node);
1402094332d3Sopenharmony_ci        ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle);
1403094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1404094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d UsbdBulkReadRemoteCallback failed, ret:%{public}d"
1405094332d3Sopenharmony_ci                "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status);
1406094332d3Sopenharmony_ci        }
1407094332d3Sopenharmony_ci        return;
1408094332d3Sopenharmony_ci    }
1409094332d3Sopenharmony_ci
1410094332d3Sopenharmony_ci    ret = UsbdBulkASyncReqReadAutoSubmit(request);
1411094332d3Sopenharmony_ci    if (ret == HDF_DEV_ERR_NODATA) {
1412094332d3Sopenharmony_ci        int32_t count = DListGetCount(&node->list->eList);
1413094332d3Sopenharmony_ci        if (count >= USBD_BULKASYNCREQ_NUM_MAX) {
1414094332d3Sopenharmony_ci            ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle);
1415094332d3Sopenharmony_ci            if (ret != HDF_SUCCESS) {
1416094332d3Sopenharmony_ci                HDF_LOGE("%{public}s: %{public}d UsbdBulkReadRemoteCallback failed", __func__, __LINE__);
1417094332d3Sopenharmony_ci            }
1418094332d3Sopenharmony_ci            return;
1419094332d3Sopenharmony_ci        }
1420094332d3Sopenharmony_ci    } else if (ret != HDF_SUCCESS) {
1421094332d3Sopenharmony_ci        ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle);
1422094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1423094332d3Sopenharmony_ci            HDF_LOGE(
1424094332d3Sopenharmony_ci                "%{public}s:%{public}d UsbdBulkReadRemoteCallback failed ret:%{public}d id:%{public}d",
1425094332d3Sopenharmony_ci                __func__, __LINE__, ret, node->id);
1426094332d3Sopenharmony_ci        }
1427094332d3Sopenharmony_ci        return;
1428094332d3Sopenharmony_ci    }
1429094332d3Sopenharmony_ci}
1430094332d3Sopenharmony_ci
1431094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqFillParams(UsbPipeInfo *pipe, UsbRequestParams *params, uint8_t *buffer)
1432094332d3Sopenharmony_ci{
1433094332d3Sopenharmony_ci    params->interfaceId = pipe->interfaceId;
1434094332d3Sopenharmony_ci    params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
1435094332d3Sopenharmony_ci    params->pipeId = pipe->pipeId;
1436094332d3Sopenharmony_ci    params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
1437094332d3Sopenharmony_ci    params->timeout = USB_CTRL_SET_TIMEOUT;
1438094332d3Sopenharmony_ci    params->dataReq.numIsoPackets = 0;
1439094332d3Sopenharmony_ci    params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1);
1440094332d3Sopenharmony_ci    params->dataReq.length = pipe->maxPacketSize;
1441094332d3Sopenharmony_ci
1442094332d3Sopenharmony_ci    if (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT) {
1443094332d3Sopenharmony_ci        params->callback = UsbdBulkASyncWriteCallbackAutoSubmit;
1444094332d3Sopenharmony_ci        params->dataReq.buffer = buffer;
1445094332d3Sopenharmony_ci    } else {
1446094332d3Sopenharmony_ci        params->callback = UsbdBulkASyncReadCallbackAutoSubmit;
1447094332d3Sopenharmony_ci    }
1448094332d3Sopenharmony_ci    return HDF_SUCCESS;
1449094332d3Sopenharmony_ci}
1450094332d3Sopenharmony_ci
1451094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode *req)
1452094332d3Sopenharmony_ci{
1453094332d3Sopenharmony_ci    UsbRequestParams params;
1454094332d3Sopenharmony_ci    int32_t ret = memcpy_s(&params, sizeof(params), &req->list->pList->params, sizeof(params));
1455094332d3Sopenharmony_ci    if (ret != EOK) {
1456094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1457094332d3Sopenharmony_ci        return ret;
1458094332d3Sopenharmony_ci    }
1459094332d3Sopenharmony_ci
1460094332d3Sopenharmony_ci    params.userData = static_cast<void *>(req);
1461094332d3Sopenharmony_ci    ret = UsbdBulkAsyncGetAsmData(&req->list->pList->asmHandle, &params, req->list->pList->pipe.maxPacketSize);
1462094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1463094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(req);
1464094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmData ret:%{public}d", __func__, ret);
1465094332d3Sopenharmony_ci        return ret;
1466094332d3Sopenharmony_ci    }
1467094332d3Sopenharmony_ci    req->request->compInfo.status = USB_REQUEST_COMPLETED;
1468094332d3Sopenharmony_ci    ret = UsbFillRequest(req->request, req->list->pList->ifHandle, &params);
1469094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1470094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(req);
1471094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret);
1472094332d3Sopenharmony_ci        return ret;
1473094332d3Sopenharmony_ci    }
1474094332d3Sopenharmony_ci    ret = UsbSubmitRequestAsync(req->request);
1475094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1476094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(req);
1477094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret);
1478094332d3Sopenharmony_ci    }
1479094332d3Sopenharmony_ci    return ret;
1480094332d3Sopenharmony_ci}
1481094332d3Sopenharmony_ci
1482094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode *db)
1483094332d3Sopenharmony_ci{
1484094332d3Sopenharmony_ci    uint32_t readLen = 0;
1485094332d3Sopenharmony_ci    int32_t ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize);
1486094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS || readLen == 0) {
1487094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1488094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmReqLen failed, readLen:%{public}u", __func__, readLen);
1489094332d3Sopenharmony_ci        return HDF_DEV_ERR_NODATA;
1490094332d3Sopenharmony_ci    }
1491094332d3Sopenharmony_ci
1492094332d3Sopenharmony_ci    db->request->compInfo.status = USB_REQUEST_COMPLETED;
1493094332d3Sopenharmony_ci    UsbRequestParams params;
1494094332d3Sopenharmony_ci    ret = memcpy_s(&params, sizeof(params), &db->list->pList->params, sizeof(params));
1495094332d3Sopenharmony_ci    if (ret != EOK) {
1496094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1497094332d3Sopenharmony_ci        return ret;
1498094332d3Sopenharmony_ci    }
1499094332d3Sopenharmony_ci
1500094332d3Sopenharmony_ci    params.dataReq.length = readLen;
1501094332d3Sopenharmony_ci    params.userData = static_cast<void *>(db);
1502094332d3Sopenharmony_ci    ret = UsbFillRequest(db->request, db->list->pList->ifHandle, &params);
1503094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1504094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbFillRequest failed", __func__);
1505094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1506094332d3Sopenharmony_ci        return ret;
1507094332d3Sopenharmony_ci    }
1508094332d3Sopenharmony_ci
1509094332d3Sopenharmony_ci    ret = UsbSubmitRequestAsync(db->request);
1510094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1511094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:UsbSubmitRequestAsync failed", __func__);
1512094332d3Sopenharmony_ci        UsbdBulkASyncReqNodeSetNoUse(db);
1513094332d3Sopenharmony_ci    }
1514094332d3Sopenharmony_ci    return ret;
1515094332d3Sopenharmony_ci}
1516094332d3Sopenharmony_ci} // namespace V1_1
1517094332d3Sopenharmony_ci} // namespace Usb
1518094332d3Sopenharmony_ci} // namespace HDI
1519094332d3Sopenharmony_ci} // namespace OHOS
1520