• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "usbd_dispatcher.h"
17 #include "hdf_slist.h"
18 #include "osal_mutex.h"
19 #include "usb_ddk.h"
20 #include "usb_impl.h"
21 #include "usb_interface_pool.h"
22 #include "v1_0/iusbd_subscriber.h"
23 #include "usbd_wrapper.h"
24 
25 namespace OHOS {
26 namespace HDI {
27 namespace Usb {
28 namespace V1_2 {
UsbdAllocFifo(DataFifo * fifo,uint32_t size)29 int32_t UsbdDispatcher::UsbdAllocFifo(DataFifo *fifo, uint32_t size)
30 {
31     if (fifo == nullptr) {
32         HDF_LOGE("%{public}s:fifo is nullptr", __func__);
33         return HDF_FAILURE;
34     }
35     if (!DataFifoIsInitialized(fifo)) {
36         void *data = OsalMemAlloc(size);
37         if (data == nullptr) {
38             HDF_LOGE("%{public}s:OsalMemAlloc failed", __func__);
39             return HDF_ERR_MALLOC_FAIL;
40         }
41         DataFifoInit(fifo, size, data);
42     }
43     return HDF_SUCCESS;
44 }
45 
UsbdFreeFifo(DataFifo * fifo)46 void UsbdDispatcher::UsbdFreeFifo(DataFifo *fifo)
47 {
48     if (fifo == nullptr) {
49         HDF_LOGE("%{public}s:fifo is nullptr", __func__);
50         return;
51     }
52 
53     OsalMemFree(fifo->data);
54     fifo->data = nullptr;
55     DataFifoInit(fifo, 0, nullptr);
56 }
57 
UsbdReadCallback(UsbRequest * req)58 void UsbdDispatcher::UsbdReadCallback(UsbRequest *req)
59 {
60     if (req == nullptr) {
61         HDF_LOGE("%{public}s:req is nullptr!", __func__);
62         return;
63     }
64 
65     UsbIfRequest *reqObj = reinterpret_cast<UsbIfRequest *>(req);
66     UsbdRequestASync *dev = static_cast<UsbdRequestASync *>(req->compInfo.userData);
67     if (dev == nullptr) {
68         HDF_LOGE("%{public}s:invalid param dev is nullptr!", __func__);
69         OsalSemPost(&reqObj->hostRequest->sem);
70     }
71 }
72 
UsbdWriteCallback(UsbRequest * req)73 void UsbdDispatcher::UsbdWriteCallback(UsbRequest *req)
74 {
75     if (req == nullptr) {
76         HDF_LOGE("%{public}s:invalid param req is nullptr!", __func__);
77         return;
78     }
79 
80     int32_t status = req->compInfo.status;
81     HDF_LOGI("%{public}s:status is %{public}d!", __func__, status);
82 }
83 
UsbControlSetUp(UsbControlParams * controlParams,UsbControlRequest * controlReq)84 int32_t UsbdDispatcher::UsbControlSetUp(UsbControlParams *controlParams, UsbControlRequest *controlReq)
85 {
86     if (controlParams == nullptr || controlReq == nullptr) {
87         HDF_LOGE("%{public}s:controlParams or controlReq is nullptr", __func__);
88         return HDF_ERR_INVALID_PARAM;
89     }
90 
91     controlReq->target = controlParams->target;
92     controlReq->reqType = controlParams->reqType;
93     controlReq->directon = controlParams->directon;
94     controlReq->request = controlParams->request;
95     controlReq->value = controlParams->value;
96     controlReq->index = controlParams->index;
97     controlReq->buffer = controlParams->data;
98     controlReq->length = static_cast<uint32_t>(controlParams->size);
99     return HDF_SUCCESS;
100 }
101 
GetUsbInterfaceById(const HostDevice * dev,uint8_t interfaceIndex)102 UsbInterface *UsbdDispatcher::GetUsbInterfaceById(const HostDevice *dev, uint8_t interfaceIndex)
103 {
104     if (dev == nullptr || dev->service == nullptr) {
105         HDF_LOGE("%{public}s:idx:%{public}u service is nullptr", __func__, interfaceIndex);
106         return nullptr;
107     }
108 
109     UsbInterface *tmpIf = UsbClaimInterface(dev->service->session_, dev->busNum, dev->devAddr, interfaceIndex);
110     if (tmpIf == nullptr) {
111         HDF_LOGE("%{public}s: UsbClaimInterface failed", __func__);
112     }
113     return tmpIf;
114 }
115 
GetInterfacePipe(const HostDevice * dev,UsbInterface * interface,uint8_t pipeAddr,UsbPipeInfo * pipe)116 int32_t UsbdDispatcher::GetInterfacePipe(
117     const HostDevice *dev, UsbInterface *interface, uint8_t pipeAddr, UsbPipeInfo *pipe)
118 {
119     UsbPipeInfo pipeTmp;
120     if (memset_s(&pipeTmp, sizeof(pipeTmp), 0, sizeof(pipeTmp)) != EOK) {
121         HDF_LOGE("%{public}s:memset_s failed ", __func__);
122         return HDF_FAILURE;
123     }
124 
125     if (dev == nullptr || interface == nullptr || pipe == nullptr) {
126         HDF_LOGE("%{public}s:invalid params", __func__);
127         return HDF_ERR_INVALID_PARAM;
128     }
129 
130     UsbInterfaceInfo *info = &interface->info;
131     if (info == nullptr) {
132         HDF_LOGE("%{public}s:invalid interface", __func__);
133         return HDF_FAILURE;
134     }
135 
136     UsbInterfaceHandle *interfaceHandle = UsbImpl::InterfaceIdToHandle(dev, info->interfaceIndex);
137     if (interfaceHandle == nullptr) {
138         HDF_LOGE("%{public}s:invalid interface handle", __func__);
139         return HDF_FAILURE;
140     }
141 
142     int32_t ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, pipeAddr, &pipeTmp);
143     if (ret == HDF_SUCCESS && ((pipeTmp.pipeAddress | static_cast<uint8_t>(pipeTmp.pipeDirection)) == pipeAddr)) {
144         if (pipe) {
145             *pipe = pipeTmp;
146         }
147         return HDF_SUCCESS;
148     }
149     return HDF_FAILURE;
150 }
151 
GetPipe(const HostDevice * dev,uint8_t interfaceId,uint8_t pipeId,UsbPipeInfo * pipe)152 int32_t UsbdDispatcher::GetPipe(const HostDevice *dev, uint8_t interfaceId, uint8_t pipeId, UsbPipeInfo *pipe)
153 {
154     if (dev == nullptr || pipe == nullptr) {
155         HDF_LOGE("%{public}s:dev or pipe is nullptr, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId);
156         return HDF_ERR_INVALID_PARAM;
157     }
158 
159     if (interfaceId >= USB_MAX_INTERFACES) {
160         HDF_LOGE("%{public}s:interfaceId invalid, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId);
161         return HDF_ERR_INVALID_PARAM;
162     }
163 
164     UsbInterface *interface = dev->iface[interfaceId];
165     if (interface == nullptr) {
166         HDF_LOGE("%{public}s:interface is nullptr ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeId);
167         return HDF_FAILURE;
168     }
169 
170     int32_t ret = GetInterfacePipe(dev, interface, pipeId, pipe);
171     return ret;
172 }
173 
UsbdFreeCtrlPipe(HostDevice * dev)174 void UsbdDispatcher::UsbdFreeCtrlPipe(HostDevice *dev)
175 {
176     if (dev == nullptr) {
177         HDF_LOGE("%{public}s:params dev is nullptr", __func__);
178         return;
179     }
180 
181     OsalMemFree(dev->ctrPipe);
182     dev->ctrPipe = nullptr;
183 }
184 
UsbdGetCtrlPipe(HostDevice * dev)185 int32_t UsbdDispatcher::UsbdGetCtrlPipe(HostDevice *dev)
186 {
187     UsbPipeInfo *pipe = static_cast<UsbPipeInfo *>(OsalMemCalloc(sizeof(UsbPipeInfo)));
188     if (pipe == nullptr) {
189         HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
190         return HDF_ERR_MALLOC_FAIL;
191     }
192 
193     int32_t ret = UsbGetPipeInfo(dev->ctrDevHandle, dev->ctrIface->info.curAltSetting, 0, pipe);
194     if (ret != HDF_SUCCESS) {
195         HDF_LOGE("%{public}s:get pipe failed ret:%{public}d", __func__, ret);
196         OsalMemFree(pipe);
197         pipe = nullptr;
198         return HDF_FAILURE;
199     }
200 
201     dev->ctrPipe = pipe;
202     return HDF_SUCCESS;
203 }
204 
UsbdFindRequestSync(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr)205 UsbdRequestSync *UsbdDispatcher::UsbdFindRequestSync(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
206 {
207     if (port == nullptr) {
208         HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
209         return nullptr;
210     }
211 
212     UsbdRequestSync *req = nullptr;
213     HdfSListIterator it;
214     bool flag = false;
215     OsalMutexLock(&port->reqSyncLock);
216     HdfSListIteratorInit(&it, &port->reqSyncList);
217     while (HdfSListIteratorHasNext(&it)) {
218         req = reinterpret_cast<UsbdRequestSync *>(HdfSListIteratorNext(&it));
219         if (req == nullptr) {
220             continue;
221         }
222         if (req->pipe.interfaceId == interfaceId && ((req->pipe.pipeAddress | req->pipe.pipeDirection) == pipeAddr)) {
223             flag = true;
224             break;
225         }
226     }
227     OsalMutexUnlock(&port->reqSyncLock);
228 
229     if (flag) {
230         return req;
231     }
232     return nullptr;
233 }
234 
UsbdRequestSyncAlloc(void)235 UsbdRequestSync *UsbdDispatcher::UsbdRequestSyncAlloc(void)
236 {
237     UsbdRequestSync *req = static_cast<UsbdRequestSync *>(OsalMemCalloc(sizeof(UsbdRequestSync)));
238     if (req == nullptr) {
239         HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
240         return req;
241     }
242 
243     req->request = nullptr;
244     req->endPointAddr = 0;
245     req->ifHandle = nullptr;
246     OsalMutexInit(&req->lock);
247     return req;
248 }
249 
UsbRequestParamsWSyncInit(UsbRequestParams * params,int32_t timeout,const UsbPipeInfo * pipe)250 void UsbdDispatcher::UsbRequestParamsWSyncInit(UsbRequestParams *params, int32_t timeout, const UsbPipeInfo *pipe)
251 {
252     if (params == nullptr || pipe == nullptr) {
253         HDF_LOGE("%{public}s: params or pipe is nullptr", __func__);
254         return;
255     }
256 
257     params->interfaceId = pipe->interfaceId;
258     params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
259     params->pipeId = pipe->pipeId;
260     params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
261     params->timeout = static_cast<uint32_t>(timeout);
262     params->dataReq.numIsoPackets = 0;
263     params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_DIR_OFFSET) & 0x1);
264     params->dataReq.length = pipe->maxPacketSize;
265 }
266 
UsbdRequestSyncInit(HostDevice * port,UsbInterfaceHandle * ifHandle,UsbPipeInfo * pipe,UsbdRequestSync * requestSync)267 int32_t UsbdDispatcher::UsbdRequestSyncInit(
268     HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestSync *requestSync)
269 {
270     if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) {
271         HDF_LOGE("%{public}s:invalid params", __func__);
272         return HDF_ERR_INVALID_PARAM;
273     }
274 
275     int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
276     if (ret != EOK) {
277         HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
278         return ret;
279     }
280 
281     requestSync->ifHandle = ifHandle;
282     requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, requestSync->pipe.maxPacketSize);
283     if (requestSync->request == nullptr) {
284         HDF_LOGE("%{public}s:alloc request failed", __func__);
285         return HDF_ERR_MALLOC_FAIL;
286     }
287     UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe);
288     requestSync->params.userData = port;
289     OsalMutexLock(&port->reqSyncLock);
290     HdfSListAdd(&port->reqSyncList, &requestSync->node);
291     OsalMutexUnlock(&port->reqSyncLock);
292     return HDF_SUCCESS;
293 }
294 
UsbdRequestSyncInitwithLength(HostDevice * port,UsbInterfaceHandle * ifHandle,UsbPipeInfo * pipe,int32_t length,UsbdRequestSync * requestSync)295 int32_t UsbdDispatcher::UsbdRequestSyncInitwithLength(HostDevice *port, UsbInterfaceHandle *ifHandle,
296     UsbPipeInfo *pipe, int32_t length, UsbdRequestSync *requestSync)
297 {
298     if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) {
299         HDF_LOGE("%{public}s:invalid params", __func__);
300         return HDF_ERR_INVALID_PARAM;
301     }
302 
303     int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
304     if (ret != EOK) {
305         HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
306         return ret;
307     }
308 
309     requestSync->ifHandle = ifHandle;
310     requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, length);
311     if (requestSync->request == nullptr) {
312         HDF_LOGE("%{public}s:alloc request failed", __func__);
313         return HDF_ERR_MALLOC_FAIL;
314     }
315     UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe);
316     requestSync->params.userData = port;
317     OsalMutexLock(&port->reqSyncLock);
318     HdfSListAdd(&port->reqSyncList, &requestSync->node);
319     OsalMutexUnlock(&port->reqSyncLock);
320     return HDF_SUCCESS;
321 }
322 
UsbdRequestSyncRelease(UsbdRequestSync * requestSync)323 int32_t UsbdDispatcher::UsbdRequestSyncRelease(UsbdRequestSync *requestSync)
324 {
325     int32_t ret = HDF_SUCCESS;
326     if (requestSync != nullptr) {
327         OsalMutexLock(&requestSync->lock);
328         if (requestSync->request != nullptr) {
329             ret = UsbFreeRequest(requestSync->request);
330             if (ret != HDF_SUCCESS) {
331                 HDF_LOGW("%{public}s:UsbFreeRequest failed", __func__);
332             }
333             requestSync->request = nullptr;
334         }
335         OsalMutexUnlock(&requestSync->lock);
336         OsalMemFree(requestSync);
337     }
338     return ret;
339 }
340 
UsbRequestParamsInit(UsbRequestParams * params,int32_t timeout)341 void UsbdDispatcher::UsbRequestParamsInit(UsbRequestParams *params, int32_t timeout)
342 {
343     if (params == nullptr) {
344         HDF_LOGE("%{public}s:params is nullptr", __func__);
345         return;
346     }
347 
348     params->interfaceId = USB_CTRL_INTERFACE_ID;
349     params->pipeAddress = 0;
350     params->pipeId = 0;
351     params->requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
352     params->timeout = static_cast<uint32_t>(timeout);
353 }
354 
CtrlTranParamGetReqType(HdfSBuf * data,UsbControlParams * pCtrParams,uint32_t requestType)355 int32_t UsbdDispatcher::CtrlTranParamGetReqType(HdfSBuf *data, UsbControlParams *pCtrParams, uint32_t requestType)
356 {
357     if (data == nullptr || pCtrParams == nullptr) {
358         HDF_LOGE("%{public}s:param failed", __func__);
359         return HDF_ERR_INVALID_PARAM;
360     }
361 
362     uint8_t *buffer = nullptr;
363     uint32_t length = 0;
364     int32_t target = requestType & USB_RECIP_MASK;
365     int32_t direction = (requestType >> DIRECTION_OFFSET_7) & ENDPOINT_DIRECTION_MASK;
366     int32_t cmdType = (requestType >> CMD_OFFSET_5) & CMD_TYPE_MASK;
367     if (direction == USB_REQUEST_DIR_TO_DEVICE) {
368         if (!HdfSbufReadBuffer(data, (const void **)(&buffer), &length)) {
369             HDF_LOGE("%{public}s:hdf sbuf Read failed", __func__);
370             return HDF_FAILURE;
371         }
372     } else {
373         length = MAX_CONTROL_BUFF_SIZE;
374         buffer = static_cast<uint8_t *>(OsalMemCalloc(length));
375         if (buffer == nullptr) {
376             HDF_LOGE("%{public}s:OsalMemCalloc failed length = %{public}u", __func__, length);
377             return HDF_ERR_MALLOC_FAIL;
378         }
379     }
380     pCtrParams->target = static_cast<UsbRequestTargetType>(target);
381     pCtrParams->directon = static_cast<UsbRequestDirection>(direction);
382     pCtrParams->reqType = static_cast<UsbControlRequestType>(cmdType);
383     pCtrParams->size = length;
384     pCtrParams->data = buffer;
385     return HDF_SUCCESS;
386 }
387 
CtrlTransferParamInit(HdfSBuf * data,UsbControlParams * pCtrParams,int32_t * timeout)388 int32_t UsbdDispatcher::CtrlTransferParamInit(HdfSBuf *data, UsbControlParams *pCtrParams, int32_t *timeout)
389 {
390     if (data == nullptr || pCtrParams == nullptr) {
391         HDF_LOGE("%{public}s:data or pCtrParams is nullptr", __func__);
392         return HDF_ERR_INVALID_PARAM;
393     }
394 
395     int32_t requestType;
396     if (!HdfSbufReadInt32(data, &requestType)) {
397         HDF_LOGE("%{public}s:failed to read the requestType from data", __func__);
398         return HDF_ERR_IO;
399     }
400 
401     int32_t requestCmd;
402     if (!HdfSbufReadInt32(data, &requestCmd)) {
403         HDF_LOGE("%{public}s:Failed to read the requestCmd from data", __func__);
404         return HDF_ERR_IO;
405     }
406 
407     int32_t value;
408     if (!HdfSbufReadInt32(data, &value)) {
409         HDF_LOGE("%{public}s:Failed to read the value from data", __func__);
410         return HDF_ERR_IO;
411     }
412 
413     int32_t index;
414     if (!HdfSbufReadInt32(data, &index)) {
415         HDF_LOGE("%{public}s:Failed to read the index from data", __func__);
416         return HDF_ERR_IO;
417     }
418 
419     if (!HdfSbufReadInt32(data, timeout)) {
420         HDF_LOGE("%{public}s:Failed to read the timeout from data", __func__);
421         return HDF_ERR_IO;
422     }
423 
424     pCtrParams->request = static_cast<uint8_t>(requestCmd);
425     pCtrParams->value = value;
426     pCtrParams->index = index;
427     int32_t ret = CtrlTranParamGetReqType(data, pCtrParams, requestType);
428     if (ret != HDF_SUCCESS) {
429         HDF_LOGE("%{public}s:CtrlTransferParamInit failed:%{public}d", __func__, ret);
430         OsalMemFree(pCtrParams->data);
431         pCtrParams->data = nullptr;
432     }
433     return ret;
434 }
435 
UsbdReleaseInterfaces(HostDevice * dev)436 void UsbdDispatcher::UsbdReleaseInterfaces(HostDevice *dev)
437 {
438     if (dev == nullptr) {
439         HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
440         return;
441     }
442 
443     for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) {
444         if (dev->iface[i] != nullptr) {
445             UsbReleaseInterface(dev->iface[i]);
446             dev->iface[i] = nullptr;
447         }
448     }
449     if (dev->ctrIface != nullptr) {
450         UsbReleaseInterface(dev->ctrIface);
451         dev->ctrIface = nullptr;
452     }
453 }
454 
UsbdCloseInterfaces(HostDevice * dev)455 void UsbdDispatcher::UsbdCloseInterfaces(HostDevice *dev)
456 {
457     if (dev == nullptr) {
458         HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
459         return;
460     }
461 
462     for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) {
463         if (dev->devHandle[i] != nullptr) {
464             UsbCloseInterface(dev->devHandle[i], false);
465             dev->devHandle[i] = nullptr;
466         }
467     }
468     if (dev->ctrDevHandle != nullptr) {
469         UsbCloseInterface(dev->ctrDevHandle, false);
470         dev->ctrDevHandle = nullptr;
471     }
472 }
473 
UsbdOpenInterfaces(HostDevice * dev)474 int32_t UsbdDispatcher::UsbdOpenInterfaces(HostDevice *dev)
475 {
476     if (dev == nullptr) {
477         HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
478         return HDF_ERR_INVALID_PARAM;
479     }
480 
481     int32_t ret =
482         memset_s(dev->devHandle, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES);
483     if (ret != EOK) {
484         HDF_LOGE("%{public}s:memset_s failed ", __func__);
485         return HDF_FAILURE;
486     }
487     dev->ctrDevHandle = UsbOpenInterface(dev->ctrIface);
488     if (dev->ctrDevHandle == nullptr) {
489         HDF_LOGE("%{public}s:ctrDevHandle UsbOpenInterface nullptr", __func__);
490         UsbdCloseInterfaces(dev);
491         return HDF_FAILURE;
492     }
493     return HDF_SUCCESS;
494 }
495 
RemoveDevFromService(UsbImpl * service,HostDevice * port)496 void UsbdDispatcher::RemoveDevFromService(UsbImpl *service, HostDevice *port)
497 {
498     if (service == nullptr || port == nullptr) {
499         HDF_LOGE("%{public}s: service or port is nullptr", __func__);
500         return;
501     }
502 
503     HdfSListIterator it;
504     HostDevice *tempPort = nullptr;
505     OsalMutexLock(&service->lock_);
506     HdfSListIteratorInit(&it, &service->devList_);
507     while (HdfSListIteratorHasNext(&it)) {
508         tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
509         if (tempPort == nullptr) {
510             continue;
511         }
512         if (tempPort->busNum == port->busNum && tempPort->devAddr == port->devAddr) {
513             HdfSListIteratorRemove(&it);
514             break;
515         }
516     }
517     OsalMutexUnlock(&service->lock_);
518 }
519 
UsbdClaimInterfaces(HostDevice * dev)520 int32_t UsbdDispatcher::UsbdClaimInterfaces(HostDevice *dev)
521 {
522     if (dev == nullptr) {
523         HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
524         return HDF_ERR_INVALID_PARAM;
525     }
526 
527     if (memset_s(dev->iface, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES) != EOK) {
528         HDF_LOGE("%{public}s:memset_s failed", __func__);
529         return HDF_FAILURE;
530     }
531 
532     dev->ctrIface = GetUsbInterfaceById(const_cast<const HostDevice *>(dev), USB_CTRL_INTERFACE_ID);
533     if (dev->ctrIface == nullptr) {
534         HDF_LOGE("%{public}s:GetUsbInterfaceById nullptr", __func__);
535         UsbdReleaseInterfaces(dev);
536         return HDF_FAILURE;
537     }
538 
539     return HDF_SUCCESS;
540 }
541 
ReturnGetPipes(int32_t ret,HostDevice * dev)542 int32_t UsbdDispatcher::ReturnGetPipes(int32_t ret, HostDevice *dev)
543 {
544     UsbdCloseInterfaces(dev);
545     UsbdReleaseInterfaces(dev);
546     dev->service->session_ = nullptr;
547     return ret;
548 }
549 
ReturnOpenInterfaces(int32_t ret,HostDevice * dev)550 int32_t UsbdDispatcher::ReturnOpenInterfaces(int32_t ret, HostDevice *dev)
551 {
552     UsbdReleaseInterfaces(dev);
553     dev->service->session_ = nullptr;
554     return ret;
555 }
556 
ReturnClainInterfaces(int32_t ret,HostDevice * dev)557 int32_t UsbdDispatcher::ReturnClainInterfaces(int32_t ret, HostDevice *dev)
558 {
559     dev->service->session_ = nullptr;
560     return ret;
561 }
562 
UsbdInit(HostDevice * dev)563 int32_t UsbdDispatcher::UsbdInit(HostDevice *dev)
564 {
565     if (dev == nullptr) {
566         HDF_LOGE("%{public}s:invalid param dev", __func__);
567         return HDF_ERR_INVALID_PARAM;
568     }
569 
570     if (dev->initFlag) {
571         HDF_LOGE("%{public}s:initFlag is true", __func__);
572         return HDF_SUCCESS;
573     }
574 
575     int32_t ret = UsbInitHostSdk(nullptr);
576     if (ret != HDF_SUCCESS) {
577         HDF_LOGE("%{public}s:UsbInitHostSdk failed", __func__);
578         return HDF_FAILURE;
579     }
580 
581     if (dev->service == nullptr) {
582         HDF_LOGE("%{public}s:dev->service is nullptr", __func__);
583         return HDF_FAILURE;
584     }
585 
586     dev->service->session_ = nullptr;
587 
588     ret = UsbdClaimInterfaces(dev);
589     if (ret != HDF_SUCCESS) {
590         HDF_LOGE("%{public}s:UsbdClaimInterfaces failed ret:%{public}d", __func__, ret);
591         return ReturnClainInterfaces(ret, dev);
592     }
593 
594     ret = UsbdOpenInterfaces(dev);
595     if (ret != HDF_SUCCESS) {
596         HDF_LOGE("%{public}s:UsbdOpenInterfaces failed ret:%{public}d", __func__, ret);
597         return ReturnOpenInterfaces(ret, dev);
598     }
599 
600     ret = UsbdGetCtrlPipe(dev);
601     if (ret != HDF_SUCCESS) {
602         HDF_LOGE("%{public}s:UsbdGetPipes failed ret:%{public}d", __func__, ret);
603         return ReturnGetPipes(ret, dev);
604     }
605     return HDF_SUCCESS;
606 }
607 
UsbdRequestASyncRelease(UsbdRequestASync * request)608 int32_t UsbdDispatcher::UsbdRequestASyncRelease(UsbdRequestASync *request)
609 {
610     if (request == nullptr) {
611         HDF_LOGE("%{public}s:request is nullptr.", __func__);
612         return HDF_ERR_INVALID_PARAM;
613     }
614 
615     int32_t ret = HDF_SUCCESS;
616     OsalMutexLock(&request->lock);
617     UsbImpl::UsbdRequestASyncReleaseData(request);
618     if (request->reqMsg.request != nullptr) {
619         ret = UsbFreeRequest(request->reqMsg.request);
620         request->reqMsg.request = nullptr;
621         if (ret != HDF_SUCCESS) {
622             HDF_LOGE("%{public}s:UsbFreeRequest failed", __func__);
623         }
624     }
625     OsalMutexUnlock(&request->lock);
626     OsalMemFree(request);
627     return ret;
628 }
629 
UsbdBulkASyncReqRelease(UsbdBulkASyncReqList * list)630 int32_t UsbdDispatcher::UsbdBulkASyncReqRelease(UsbdBulkASyncReqList *list)
631 {
632     for (int32_t i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
633         UsbFreeRequest(list->node[i].request);
634         list->node[i].request = nullptr;
635     }
636     DListHeadInit(&list->eList);
637     DListHeadInit(&list->uList);
638     OsalMutexDestroy(&list->elock);
639     OsalMutexDestroy(&list->ulock);
640     return HDF_SUCCESS;
641 }
642 
UsbdBulkASyncListRelease(UsbdBulkASyncList * list)643 int32_t UsbdDispatcher::UsbdBulkASyncListRelease(UsbdBulkASyncList *list)
644 {
645     UsbdBulkASyncReqRelease(&list->rList);
646     OsalMutexDestroy(&list->asmHandle.lock);
647     OsalMemFree(list);
648     return HDF_SUCCESS;
649 }
650 
UsbdRelease(HostDevice * dev)651 void UsbdDispatcher::UsbdRelease(HostDevice *dev)
652 {
653     if (dev == nullptr) {
654         HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
655         return;
656     }
657 
658     UsbdCloseInterfaces(dev);
659     UsbdReleaseInterfaces(dev);
660     UsbdFreeCtrlPipe(dev);
661     UsbImpl::UsbdRequestSyncReleaseList(dev);
662     UsbImpl::UsbdRequestASyncReleaseList(dev);
663     UsbImpl::UsbdBulkASyncListReleasePort(dev);
664 
665     if (dev->ctrlReq != nullptr) {
666         UsbFreeRequest(dev->ctrlReq);
667         dev->ctrlReq = nullptr;
668     }
669     UsbExitHostSdk(dev->service->session_);
670     dev->service->session_ = nullptr;
671     OsalMutexDestroy(&dev->writeLock);
672     OsalMutexDestroy(&dev->readLock);
673     OsalMutexDestroy(&dev->lock);
674     OsalMutexDestroy(&dev->requestLock);
675     OsalMutexDestroy(&dev->reqSyncLock);
676     OsalMutexDestroy(&dev->reqASyncLock);
677     dev->busNum = 0;
678     dev->devAddr = 0;
679     dev->initFlag = false;
680 }
681 
UsbdMallocAndFill(uint8_t * & dataAddr,const std::vector<uint8_t> & data)682 int32_t UsbdDispatcher::UsbdMallocAndFill(uint8_t *&dataAddr, const std::vector<uint8_t> &data)
683 {
684     uint32_t length = sizeof(uint8_t) * data.size();
685     if (length == 0) {
686         HDF_LOGI("%{public}s: data is empty", __func__);
687         return HDF_SUCCESS;
688     }
689 
690     dataAddr = static_cast<uint8_t *>(OsalMemCalloc(length));
691     if (dataAddr == nullptr) {
692         HDF_LOGE("%{public}s: OsalMemAlloc failed", __func__);
693         return HDF_FAILURE;
694     }
695 
696     void *dataAddrCovert = static_cast<void *>(dataAddr);
697     int32_t err = memcpy_s(dataAddrCovert, length, data.data(), length);
698     if (err != EOK) {
699         HDF_LOGE("%{public}s: memcpy_s failed", __func__);
700         OsalMemFree(dataAddr);
701         dataAddr = nullptr;
702         return HDF_FAILURE;
703     }
704     return HDF_SUCCESS;
705 }
706 
FillReqAyncParams(UsbdRequestASync * userData,UsbPipeInfo * pipe,UsbRequestParams * params,const uint8_t * buffer,uint32_t length)707 int32_t UsbdDispatcher::FillReqAyncParams(
708     UsbdRequestASync *userData, UsbPipeInfo *pipe, UsbRequestParams *params, const uint8_t *buffer, uint32_t length)
709 {
710     if (userData == nullptr || pipe == nullptr || params == nullptr) {
711         HDF_LOGE("%{public}s:invalid param", __func__);
712         return HDF_ERR_INVALID_PARAM;
713     }
714 
715     bool bWrite = (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT);
716     params->interfaceId = pipe->interfaceId;
717     params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
718     params->pipeId = pipe->pipeId;
719     params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
720     params->timeout = USB_CTRL_SET_TIMEOUT;
721     params->dataReq.numIsoPackets = 0;
722     params->userData = static_cast<void *>(userData);
723     params->dataReq.length = length;
724     params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1);
725     if (bWrite) {
726         params->callback = UsbdWriteCallback;
727         params->dataReq.buffer = const_cast<uint8_t *>(buffer);
728     } else {
729         params->callback = UsbdReadCallback;
730         params->dataReq.length = length;
731     }
732     return HDF_SUCCESS;
733 }
734 
UsbdRequestASyncAlloc(void)735 UsbdRequestASync *UsbdDispatcher::UsbdRequestASyncAlloc(void)
736 {
737     UsbdRequestASync *req = static_cast<UsbdRequestASync *>(OsalMemCalloc(sizeof(UsbdRequestASync)));
738     if (req == nullptr) {
739         HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
740         return req;
741     }
742 
743     req->reqMsg.request = nullptr;
744     req->endPointAddr = 0;
745     req->ifHandle = nullptr;
746     req->status = 0;
747     OsalMutexInit(&req->lock);
748     return req;
749 }
750 
UsbdRequestASyncInit(HostDevice * port,UsbInterfaceHandle * ifHandle,UsbPipeInfo * pipe,UsbdRequestASync * request)751 int32_t UsbdDispatcher::UsbdRequestASyncInit(
752     HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestASync *request)
753 {
754     if (port == nullptr || request == nullptr || ifHandle == nullptr || pipe == nullptr) {
755         HDF_LOGE("%{public}s:invalid param", __func__);
756         return HDF_ERR_INVALID_PARAM;
757     }
758 
759     int32_t ret = memcpy_s(&request->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
760     if (ret != EOK) {
761         HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
762         return ret;
763     }
764 
765     request->ifHandle = ifHandle;
766     request->reqMsg.request = UsbAllocRequest(request->ifHandle, 0, request->pipe.maxPacketSize);
767     if (request->reqMsg.request == nullptr) {
768         HDF_LOGE("%{public}s:alloc request failed", __func__);
769         return HDF_ERR_MALLOC_FAIL;
770     }
771     FillReqAyncParams(request, &request->pipe, &request->params, nullptr, 0);
772     OsalMutexLock(&port->reqASyncLock);
773     HdfSListAddTail(&port->reqASyncList, &request->node);
774     OsalMutexUnlock(&port->reqASyncLock);
775     return HDF_SUCCESS;
776 }
777 
UsbdRequestASyncCreatAndInsert(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr)778 UsbdRequestASync *UsbdDispatcher::UsbdRequestASyncCreatAndInsert(
779     HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
780 {
781     UsbPipeInfo pipe;
782     if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
783         HDF_LOGE("%{public}s:memset_s failed", __func__);
784         return nullptr;
785     }
786 
787     int32_t ret = GetPipe(port, interfaceId, pipeAddr, &pipe);
788     if (ret != HDF_SUCCESS) {
789         HDF_LOGE("%{public}s: get pipe info failed interfaceId=%{public}d, pipeAddr=%{public}d", __func__, interfaceId,
790             pipeAddr);
791         return nullptr;
792     }
793 
794     UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, interfaceId);
795     if (ifHandle == nullptr) {
796         HDF_LOGE("%{public}s:get interface handle failed", __func__);
797         return nullptr;
798     }
799 
800     UsbdRequestASync *req = UsbdRequestASyncAlloc();
801     if (req == nullptr) {
802         HDF_LOGE("%{public}s: UsbdRequestASyncAlloc failed", __func__);
803         return req;
804     }
805     ret = UsbdRequestASyncInit(port, ifHandle, &pipe, req);
806     if (ret != HDF_SUCCESS) {
807         HDF_LOGE("%{public}s:UsbdRequestASyncInit failed:%{public}d", __func__, ret);
808         UsbdRequestASyncRelease(req);
809         req = nullptr;
810         return req;
811     }
812     return req;
813 }
814 
HostDeviceInit(HostDevice * port)815 int32_t UsbdDispatcher::HostDeviceInit(HostDevice *port)
816 {
817     if (port == nullptr) {
818         HDF_LOGE("%{public}s:port is nullptr", __func__);
819         return HDF_ERR_INVALID_OBJECT;
820     }
821 
822     port->busNum = 0;
823     port->devAddr = 0;
824     port->initFlag = false;
825     port->interfaceCnt = 0;
826     if (OsalMutexInit(&port->lock) != HDF_SUCCESS) {
827         HDF_LOGE("%{public}s:init lock failed!", __func__);
828         return HDF_FAILURE;
829     }
830 
831     if (OsalMutexInit(&port->requestLock) != HDF_SUCCESS) {
832         HDF_LOGE("%{public}s:init requestLock failed!", __func__);
833         return HDF_FAILURE;
834     }
835 
836     if (OsalMutexInit(&port->writeLock) != HDF_SUCCESS) {
837         HDF_LOGE("%{public}s:init writeLock failed!", __func__);
838         return HDF_FAILURE;
839     }
840 
841     if (OsalMutexInit(&port->readLock) != HDF_SUCCESS) {
842         HDF_LOGE("%{public}s:init readLock failed!", __func__);
843         return HDF_FAILURE;
844     }
845 
846     if (OsalMutexInit(&port->reqSyncLock) != HDF_SUCCESS) {
847         HDF_LOGE("%{public}s:init reqSyncLock failed!", __func__);
848         return HDF_FAILURE;
849     }
850 
851     if (OsalMutexInit(&port->reqASyncLock) != HDF_SUCCESS) {
852         HDF_LOGE("%{public}s:init reqASyncLock failed!", __func__);
853         return HDF_FAILURE;
854     }
855 
856     HdfSListInit(&port->requestQueue);
857     HdfSListInit(&port->reqSyncList);
858     HdfSListInit(&port->reqASyncList);
859     return HDF_SUCCESS;
860 }
861 
HostDeviceCreate(HostDevice ** port)862 int32_t UsbdDispatcher::HostDeviceCreate(HostDevice **port)
863 {
864     if (port == nullptr) {
865         HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
866         return HDF_ERR_INVALID_OBJECT;
867     }
868 
869     HostDevice *tmp = static_cast<HostDevice *>(OsalMemCalloc(sizeof(HostDevice)));
870     if (tmp == nullptr) {
871         HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
872         return HDF_ERR_MALLOC_FAIL;
873     }
874 
875     int32_t ret = HostDeviceInit(tmp);
876     if (ret != HDF_SUCCESS) {
877         HDF_LOGE("%{public}s:HostDeviceInit failed!", __func__);
878         OsalMemFree(tmp);
879         tmp = nullptr;
880         return ret;
881     }
882 
883     tmp->initFlag = false;
884     *port = tmp;
885     return HDF_SUCCESS;
886 }
887 
FunAttachDevice(HostDevice * port,HdfSBuf * data,HdfSBuf * reply)888 int32_t UsbdDispatcher::FunAttachDevice(HostDevice *port, HdfSBuf *data, HdfSBuf *reply)
889 {
890     if (port == nullptr) {
891         HDF_LOGE("%{public}s:mangf invalid param", __func__);
892         return HDF_ERR_INVALID_PARAM;
893     }
894     if (port->initFlag) {
895         HDF_LOGD("%{public}s:device is already on flag:%{public}d bus:%{public}d dev:%{public}d", __func__,
896             port->initFlag, port->busNum, port->devAddr);
897         return HDF_SUCCESS;
898     }
899 
900     int32_t ret = HDF_SUCCESS;
901     do {
902         ret = UsbdInit(port);
903         if (ret != HDF_SUCCESS) {
904             HDF_LOGE("%{public}s:UsbInit failed ret:%{public}d", __func__, ret);
905             RemoveDevFromService(port->service, port);
906             UsbdRelease(port);
907             OsalMemFree(port);
908             return ret;
909         }
910         ret = UsbdAllocFifo(&port->readFifo, READ_BUF_SIZE);
911         if (ret != HDF_SUCCESS) {
912             HDF_LOGE("%{public}s:UsbAllocFifo failed ret:%{public}d", __func__, ret);
913             ret = HDF_ERR_INVALID_PARAM;
914             break;
915         }
916         if (ret == HDF_SUCCESS) {
917             port->initFlag = true;
918             HDF_LOGI("%{public}s:UsbOpen success", __func__);
919         } else {
920             HDF_LOGE("%{public}s:UsbOpen fail:%{public}d", __func__, ret);
921         }
922         return ret;
923     } while (0);
924 
925     UsbdFreeFifo(&port->readFifo);
926     UsbdRelease(port);
927     RemoveDevFromService(port->service, port);
928     OsalMemFree(port);
929     return ret;
930 }
931 
UsbdDeviceCreateAndAttach(const sptr<UsbImpl> & service,uint8_t busNum,uint8_t devAddr)932 int32_t UsbdDispatcher::UsbdDeviceCreateAndAttach(const sptr<UsbImpl> &service, uint8_t busNum, uint8_t devAddr)
933 {
934     HostDevice *port = service->FindDevFromService(busNum, devAddr);
935     if (port != nullptr) {
936         HDF_LOGI("%{public}s:device already add", __func__);
937         return HDF_ERR_DEVICE_BUSY;
938     }
939     int32_t ret = HostDeviceCreate(&port);
940     if (ret == HDF_SUCCESS) {
941         port->busNum = busNum;
942         port->devAddr = devAddr;
943         port->service = service;
944         OsalMutexLock(&service->lock_);
945         HdfSListAdd(&service->devList_, &port->node);
946         OsalMutexUnlock(&service->lock_);
947         ret = FunAttachDevice(port, nullptr, nullptr);
948         if (ret != HDF_SUCCESS) {
949             HDF_LOGW("%{public}s:FunAttachDevice error ret:%{public}d", __func__, ret);
950         }
951         port = nullptr;
952     } else {
953         HDF_LOGE("%{public}s:createdevice error ret:%{public}d", __func__, ret);
954     }
955     return ret;
956 }
957 
FunDetachDevice(HostDevice * port,HdfSBuf * data)958 int32_t UsbdDispatcher::FunDetachDevice(HostDevice *port, HdfSBuf *data)
959 {
960     if (port == nullptr) {
961         HDF_LOGE("%{public}s:invalid param port", __func__);
962         return HDF_ERR_INVALID_PARAM;
963     }
964 
965     RemoveDevFromService(port->service, port);
966     UsbdRelease(port);
967     UsbdFreeFifo(&port->readFifo);
968     OsalMemFree(port);
969     return HDF_SUCCESS;
970 }
971 
UsbdDeviceDettach(UsbImpl * service,uint8_t busNum,uint8_t devAddr)972 int32_t UsbdDispatcher::UsbdDeviceDettach(UsbImpl *service, uint8_t busNum, uint8_t devAddr)
973 {
974     if (service == nullptr) {
975         HDF_LOGE("%{public}s:invalid param service!", __func__);
976         return HDF_ERR_INVALID_PARAM;
977     }
978 
979     HostDevice *port = service->FindDevFromService(busNum, devAddr);
980     if (port == nullptr) {
981         HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
982         return HDF_DEV_ERR_NO_DEVICE;
983     }
984 
985     int32_t ret = FunDetachDevice(port, nullptr);
986     if (ret != HDF_SUCCESS) {
987         HDF_LOGE("%{public}s: %{public}d FunDetachDevice failed", __func__, ret);
988         return HDF_FAILURE;
989     }
990 
991     return HDF_SUCCESS;
992 }
993 
UsbdFindDevForBusNum(UsbImpl * service,uint8_t busNum)994 HostDevice *UsbdDispatcher::UsbdFindDevForBusNum(UsbImpl *service, uint8_t busNum)
995 {
996     if (service == nullptr) {
997         HDF_LOGE("%{public}s: service is nullptr", __func__);
998         return nullptr;
999     }
1000 
1001     uint8_t flag = false;
1002     HdfSListIterator it;
1003     HostDevice *tempPort = nullptr;
1004     OsalMutexLock(&service->lock_);
1005     HdfSListIteratorInit(&it, &service->devList_);
1006     while (HdfSListIteratorHasNext(&it)) {
1007         tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
1008         if (!tempPort) {
1009             continue;
1010         }
1011         if (tempPort->busNum == busNum) {
1012             HdfSListIteratorRemove(&it);
1013             flag = true;
1014             break;
1015         }
1016     }
1017     OsalMutexUnlock(&service->lock_);
1018     if (flag) {
1019         return tempPort;
1020     }
1021     return nullptr;
1022 }
1023 
UsbdRemoveBusDev(UsbImpl * service,uint8_t busNum,const sptr<IUsbdSubscriber> & subscriber)1024 int32_t UsbdDispatcher::UsbdRemoveBusDev(UsbImpl *service, uint8_t busNum, const sptr<IUsbdSubscriber> &subscriber)
1025 {
1026     HostDevice *tempPort = nullptr;
1027     USBDeviceInfo info;
1028     int32_t ret = HDF_FAILURE;
1029 
1030     while (1) {
1031         tempPort = UsbdDispatcher::UsbdFindDevForBusNum(service, busNum);
1032         if (!tempPort) {
1033             break;
1034         }
1035         info = {ACT_DEVDOWN, tempPort->busNum, tempPort->devAddr};
1036         ret = subscriber->DeviceEvent(info);
1037         if (ret != HDF_SUCCESS) {
1038             HDF_LOGE("%{public}s failed to notify subscriber, ret: %{public}d", __func__, ret);
1039             return ret;
1040         }
1041         UsbdRelease(tempPort);
1042         UsbdFreeFifo(&tempPort->readFifo);
1043         OsalMemFree(tempPort);
1044     }
1045     return ret;
1046 }
1047 
UsbdBulkASyncReqInit(UsbdBulkASyncReqList * list,UsbdBulkASyncList * pList)1048 int32_t UsbdDispatcher::UsbdBulkASyncReqInit(UsbdBulkASyncReqList *list, UsbdBulkASyncList *pList)
1049 {
1050     int32_t ret = HDF_SUCCESS;
1051     int32_t i = 0;
1052     DListHeadInit(&list->eList);
1053     DListHeadInit(&list->uList);
1054     OsalMutexInit(&list->elock);
1055     OsalMutexInit(&list->ulock);
1056     for (i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
1057         list->node[i].request = UsbAllocRequest(pList->ifHandle, 0, pList->pipe.maxPacketSize);
1058         if (!list->node[i].request) {
1059             HDF_LOGE("%{public}s:alloc request failed i:%{public}d", __func__, i);
1060             ret = HDF_ERR_MALLOC_FAIL;
1061             break;
1062         }
1063         list->node[i].list = list;
1064         list->node[i].id = i;
1065         DListInsertTail(&list->node[i].node, &list->eList);
1066         pList->params.userData = static_cast<void *>(&list->node[i]);
1067     }
1068 
1069     if (i != USBD_BULKASYNCREQ_NUM_MAX) {
1070         for (; i >= 0; --i) {
1071             UsbFreeRequest(list->node[i].request);
1072             list->node[i].request = nullptr;
1073         }
1074         DListHeadInit(&list->eList);
1075         DListHeadInit(&list->uList);
1076         OsalMutexDestroy(&list->elock);
1077         OsalMutexDestroy(&list->ulock);
1078     }
1079     list->pList = pList;
1080     return ret;
1081 }
1082 
UsbdBulkASyncListAlloc(HostDevice * port,uint8_t ifId,uint8_t epId)1083 UsbdBulkASyncList *UsbdDispatcher::UsbdBulkASyncListAlloc(HostDevice *port, uint8_t ifId, uint8_t epId)
1084 {
1085     UsbPipeInfo pipe;
1086     if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
1087         HDF_LOGE("%{public}s:memset_s failed", __func__);
1088         return nullptr;
1089     }
1090 
1091     int32_t ret = GetPipe(port, ifId, epId, &pipe);
1092     if (ret != HDF_SUCCESS) {
1093         HDF_LOGE("%{public}s:GetPipe failed, ret:%{public}d", __func__, ret);
1094         return nullptr;
1095     }
1096 
1097     UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, ifId);
1098     if (ifHandle == nullptr) {
1099         HDF_LOGE("%{public}s:get interface handle failed", __func__);
1100         return nullptr;
1101     }
1102 
1103     UsbdBulkASyncList *bulkAsyncList = reinterpret_cast<UsbdBulkASyncList *>(OsalMemCalloc(sizeof(UsbdBulkASyncList)));
1104     if (bulkAsyncList == nullptr) {
1105         HDF_LOGE("%{public}s:malloc failed!", __func__);
1106         return nullptr;
1107     }
1108     bulkAsyncList->ifId = ifId;
1109     bulkAsyncList->epId = epId;
1110     bulkAsyncList->instance = port;
1111     OsalMutexInit(&bulkAsyncList->asmHandle.lock);
1112     bulkAsyncList->pipe = pipe;
1113     bulkAsyncList->ifHandle = ifHandle;
1114     UsbdBulkASyncReqFillParams(&bulkAsyncList->pipe, &bulkAsyncList->params, nullptr);
1115     ret = UsbdBulkASyncReqInit(&bulkAsyncList->rList, bulkAsyncList);
1116     if (ret != HDF_SUCCESS) {
1117         HDF_LOGE("%{public}s: UsbdBulkASyncReqInit failed ret:%{public}d", __func__, ret);
1118         UsbdBulkASyncListRelease(bulkAsyncList);
1119         bulkAsyncList = nullptr;
1120         return bulkAsyncList;
1121     }
1122 
1123     return bulkAsyncList;
1124 }
1125 
UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode * db)1126 int32_t UsbdDispatcher::UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode *db)
1127 {
1128     OsalMutexLock(&db->list->elock);
1129     db->use = USBD_REQNODE_NOUSE;
1130     DListInsertTail(&db->node, &db->list->eList);
1131     OsalMutexUnlock(&db->list->elock);
1132     return HDF_SUCCESS;
1133 }
1134 
UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList * list)1135 UsbdBulkASyncReqNode *UsbdDispatcher::UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList *list)
1136 {
1137     OsalMutexLock(&list->elock);
1138     if (DListIsEmpty(&list->eList)) {
1139         OsalMutexUnlock(&list->elock);
1140         HDF_LOGE("%{public}s:invalid param", __func__);
1141         return nullptr;
1142     }
1143     UsbdBulkASyncReqNode *ptr = DLIST_FIRST_ENTRY(&list->eList, UsbdBulkASyncReqNode, node);
1144     if (ptr != nullptr) {
1145         ptr->use = USBD_REQNODE_OTHER;
1146         if (ptr->node.prev != NULL && ptr->node.next != NULL) {
1147             DListRemove(&ptr->node);
1148         } else {
1149             HDF_LOGE("%{public}s: The node prev or next is NULL", __func__);
1150         }
1151     }
1152     OsalMutexUnlock(&list->elock);
1153     return ptr;
1154 }
1155 
UsbdBulkReadRemoteCallback(const sptr<IUsbdBulkCallback> & service,int32_t status,UsbdBufferHandle * handle)1156 int32_t UsbdDispatcher::UsbdBulkReadRemoteCallback(
1157     const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle)
1158 {
1159     if (service == nullptr || handle == nullptr) {
1160         HDF_LOGE("%{public}s:invalid param", __func__);
1161         return HDF_ERR_INVALID_PARAM;
1162     }
1163 
1164     OsalMutexLock(&handle->lock);
1165     uint8_t flag = handle->cbflg;
1166     handle->cbflg = 1;
1167     int32_t actLength = static_cast<int32_t>(handle->rcur);
1168     OsalMutexUnlock(&handle->lock);
1169     if (flag) {
1170         return HDF_SUCCESS;
1171     }
1172     int32_t ret = service->OnBulkReadCallback(status, actLength);
1173     if (ret != HDF_SUCCESS) {
1174         HDF_LOGE("%{public}s:OnBulkReadCallback failed, ret=%{public}d", __func__, ret);
1175     }
1176     return ret;
1177 }
1178 
UsbdBulkWriteRemoteCallback(const sptr<IUsbdBulkCallback> & service,int32_t status,UsbdBufferHandle * handle)1179 int32_t UsbdDispatcher::UsbdBulkWriteRemoteCallback(
1180     const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle)
1181 {
1182     if (service == nullptr || handle == nullptr) {
1183         HDF_LOGE("%{public}s:invalid param", __func__);
1184         return HDF_ERR_INVALID_PARAM;
1185     }
1186 
1187     OsalMutexLock(&handle->lock);
1188     uint8_t flag = handle->cbflg;
1189     handle->cbflg = 1;
1190     int32_t actLength = static_cast<int32_t>(handle->cur);
1191     OsalMutexUnlock(&handle->lock);
1192     if (flag) {
1193         return HDF_SUCCESS;
1194     }
1195 
1196     int32_t ret = service->OnBulkWriteCallback(status, actLength);
1197     if (ret != HDF_SUCCESS) {
1198         HDF_LOGE("%{public}s:OnBulkWriteCallback failed, ret=%{public}d", __func__, ret);
1199     }
1200     return ret;
1201 }
1202 
UsbdBulkASyncPutAsmData(UsbdBufferHandle * handle,uint8_t * buffer,uint32_t len)1203 int32_t UsbdDispatcher::UsbdBulkASyncPutAsmData(UsbdBufferHandle *handle, uint8_t *buffer, uint32_t len)
1204 {
1205     if (handle == nullptr || buffer == nullptr || len < 1) {
1206         HDF_LOGE("%{public}s:invalid param len:%{public}d", __func__, len);
1207         return HDF_ERR_INVALID_PARAM;
1208     }
1209 
1210     int32_t ret = HDF_SUCCESS;
1211     OsalMutexLock(&handle->lock);
1212     do {
1213         if (handle->fd < 1) {
1214             HDF_LOGE("%{public}s:fd error, handle->fd:%{public}d", __func__, handle->fd);
1215             ret = HDF_ERR_BAD_FD;
1216             break;
1217         }
1218         uint32_t tlen = (handle->size > handle->rcur) ? (handle->size - handle->rcur) : 0;
1219         tlen = tlen < len ? tlen : len;
1220         if (tlen > 0) {
1221             ret = memcpy_s(handle->starAddr + handle->rcur, tlen, buffer, len);
1222             if (ret != EOK) {
1223                 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1224                 OsalMutexUnlock(&handle->lock);
1225                 return ret;
1226             }
1227 
1228             handle->rcur += tlen;
1229         }
1230     } while (0);
1231     OsalMutexUnlock(&handle->lock);
1232     return ret;
1233 }
1234 
UsbdBulkAsyncGetAsmData(UsbdBufferHandle * handle,UsbRequestParams * params,uint16_t maxPacketSize)1235 int32_t UsbdDispatcher::UsbdBulkAsyncGetAsmData(
1236     UsbdBufferHandle *handle, UsbRequestParams *params, uint16_t maxPacketSize)
1237 {
1238     if (handle == nullptr || params == nullptr || handle->size < 1 || maxPacketSize < 1) {
1239         HDF_LOGE("%{public}s:invalid param", __func__);
1240         return HDF_ERR_INVALID_PARAM;
1241     }
1242 
1243     int32_t ret = HDF_ERR_INVALID_PARAM;
1244     OsalMutexLock(&handle->lock);
1245     if (handle->cur < handle->size) {
1246         params->dataReq.length =
1247             (handle->size - handle->cur) < maxPacketSize ? (handle->size - handle->cur) : maxPacketSize;
1248         params->dataReq.buffer = handle->starAddr + handle->cur;
1249         handle->cur += params->dataReq.length;
1250         ret = HDF_SUCCESS;
1251     } else {
1252         params->dataReq.length = 0;
1253         params->dataReq.buffer = nullptr;
1254         HDF_LOGE("%{public}s:invalid param", __func__);
1255         ret = HDF_DEV_ERR_NODATA;
1256     }
1257     OsalMutexUnlock(&handle->lock);
1258     return ret;
1259 }
1260 
UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle * handle,uint32_t * reqLen,uint16_t maxPacketSize)1261 int32_t UsbdDispatcher::UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle *handle, uint32_t *reqLen, uint16_t maxPacketSize)
1262 {
1263     if (handle == nullptr || reqLen == nullptr || handle->size < 1 || maxPacketSize < 1) {
1264         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1265         return HDF_ERR_INVALID_PARAM;
1266     }
1267 
1268     uint32_t tlen = 0;
1269     OsalMutexLock(&handle->lock);
1270     if (handle->cur < handle->size) {
1271         tlen = handle->size - handle->cur;
1272         tlen = tlen < maxPacketSize ? tlen : maxPacketSize;
1273         handle->cur += tlen;
1274     }
1275     OsalMutexUnlock(&handle->lock);
1276     *reqLen = tlen;
1277     return HDF_SUCCESS;
1278 }
1279 
UsbdBulkASyncReqWriteAutoSubmit(UsbRequest * request)1280 int32_t UsbdDispatcher::UsbdBulkASyncReqWriteAutoSubmit(UsbRequest *request)
1281 {
1282     UsbRequestParams params;
1283     UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1284     int32_t ret = memcpy_s(&params, sizeof(params), &db->list->pList->params, sizeof(params));
1285     if (ret != EOK) {
1286         HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1287         return ret;
1288     }
1289 
1290     params.userData = static_cast<void *>(db);
1291     ret = UsbdBulkAsyncGetAsmData(&db->list->pList->asmHandle, &params, db->list->pList->pipe.maxPacketSize);
1292     if (ret != HDF_SUCCESS) {
1293         UsbdBulkASyncReqNodeSetNoUse(db);
1294         return ret;
1295     }
1296     db->request->compInfo.status = USB_REQUEST_COMPLETED;
1297     ret = UsbFillRequest(request, db->list->pList->ifHandle, &params);
1298     if (ret != HDF_SUCCESS) {
1299         UsbdBulkASyncReqNodeSetNoUse(db);
1300         HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret);
1301         return ret;
1302     }
1303     ret = UsbSubmitRequestAsync(request);
1304     if (ret != HDF_SUCCESS) {
1305         UsbdBulkASyncReqNodeSetNoUse(db);
1306         HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret);
1307     }
1308     return ret;
1309 }
1310 
UsbdBulkASyncReqReadAutoSubmit(UsbRequest * request)1311 int32_t UsbdDispatcher::UsbdBulkASyncReqReadAutoSubmit(UsbRequest *request)
1312 {
1313     uint32_t readLen = 0;
1314     UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1315     int32_t ret =
1316         UsbdBulkASyncPutAsmData(&db->list->pList->asmHandle, request->compInfo.buffer, request->compInfo.actualLength);
1317     if (ret != HDF_SUCCESS) {
1318         HDF_LOGE("%{public}s:%{public}d UsbdBulkASyncPutAsmData error size:%{public}d ret:%{public}d", __func__,
1319             __LINE__, request->compInfo.actualLength, ret);
1320         UsbdBulkASyncReqNodeSetNoUse(db);
1321         return ret;
1322     }
1323 
1324     ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize);
1325     if (ret != HDF_SUCCESS || readLen < 1) {
1326         UsbdBulkASyncReqNodeSetNoUse(db);
1327         HDF_LOGE("%{public}s:invalid param", __func__);
1328         return HDF_DEV_ERR_NODATA;
1329     }
1330     db->request->compInfo.status = USB_REQUEST_COMPLETED;
1331     UsbHostRequest *hostRequest = reinterpret_cast<UsbIfRequest *>(request)->hostRequest;
1332     if (readLen != static_cast<uint32_t>(hostRequest->length)) {
1333         UsbRequestParams params;
1334         ret = memcpy_s(&params, sizeof(params), &db->list->pList->params, sizeof(params));
1335         if (ret != EOK) {
1336             HDF_LOGE("%{public}s: %{public}d memcpy_s failed", __func__, ret);
1337             return ret;
1338         }
1339 
1340         params.dataReq.length = readLen;
1341         params.userData = static_cast<void *>(db);
1342         ret = UsbFillRequest(request, db->list->pList->ifHandle, &params);
1343         if (ret != HDF_SUCCESS) {
1344             UsbdBulkASyncReqNodeSetNoUse(db);
1345             HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d ", __func__, ret);
1346             return ret;
1347         }
1348     }
1349     ret = UsbSubmitRequestAsync(request);
1350     if (ret != HDF_SUCCESS) {
1351         UsbdBulkASyncReqNodeSetNoUse(db);
1352         HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d ", __func__, ret);
1353     }
1354     return ret;
1355 }
1356 
UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest * request)1357 void UsbdDispatcher::UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest *request)
1358 {
1359     if (request == nullptr) {
1360         HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__);
1361         return;
1362     }
1363 
1364     int32_t ret = HDF_SUCCESS;
1365     UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1366     int32_t status = request->compInfo.status;
1367     if (status != 0) {
1368         UsbdBulkASyncReqNodeSetNoUse(node);
1369         ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle);
1370         if (ret != HDF_SUCCESS) {
1371             HDF_LOGE("%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed, ret:%{public}d"
1372                 "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status);
1373         }
1374         return;
1375     }
1376 
1377     ret = UsbdBulkASyncReqWriteAutoSubmit(request);
1378     if (ret == HDF_DEV_ERR_NODATA) {
1379         int32_t count = DListGetCount(&node->list->eList);
1380         if (count >= USBD_BULKASYNCREQ_NUM_MAX) {
1381             ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle);
1382             if (ret != HDF_SUCCESS) {
1383                 HDF_LOGE("%{public}s: %{public}d UsbdBulkWriteRemoteCallback failed", __func__, __LINE__);
1384             }
1385             return;
1386         }
1387     } else if (ret != HDF_SUCCESS) {
1388         ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle);
1389         if (ret != HDF_SUCCESS) {
1390             HDF_LOGE(
1391                 "%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed ret:%{public}d id:%{public}d",
1392                 __func__, __LINE__, ret, node->id);
1393         }
1394         return;
1395     }
1396 }
1397 
UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest * request)1398 void UsbdDispatcher::UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest *request)
1399 {
1400     if (request == nullptr) {
1401         HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__);
1402         return;
1403     }
1404 
1405     int32_t ret = HDF_SUCCESS;
1406     UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1407     int32_t status = request->compInfo.status;
1408     if (status != 0) {
1409         UsbdBulkASyncReqNodeSetNoUse(node);
1410         ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle);
1411         if (ret != HDF_SUCCESS) {
1412             HDF_LOGE("%{public}s:%{public}d UsbdBulkReadRemoteCallback failed, ret:%{public}d"
1413                 "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status);
1414         }
1415         return;
1416     }
1417 
1418     ret = UsbdBulkASyncReqReadAutoSubmit(request);
1419     if (ret == HDF_DEV_ERR_NODATA) {
1420         int32_t count = DListGetCount(&node->list->eList);
1421         if (count >= USBD_BULKASYNCREQ_NUM_MAX) {
1422             ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle);
1423             if (ret != HDF_SUCCESS) {
1424                 HDF_LOGE("%{public}s: %{public}d UsbdBulkReadRemoteCallback failed", __func__, __LINE__);
1425             }
1426             return;
1427         }
1428     } else if (ret != HDF_SUCCESS) {
1429         ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle);
1430         if (ret != HDF_SUCCESS) {
1431             HDF_LOGE(
1432                 "%{public}s:%{public}d UsbdBulkReadRemoteCallback failed ret:%{public}d id:%{public}d",
1433                 __func__, __LINE__, ret, node->id);
1434         }
1435         return;
1436     }
1437 }
1438 
UsbdBulkASyncReqFillParams(UsbPipeInfo * pipe,UsbRequestParams * params,uint8_t * buffer)1439 int32_t UsbdDispatcher::UsbdBulkASyncReqFillParams(UsbPipeInfo *pipe, UsbRequestParams *params, uint8_t *buffer)
1440 {
1441     params->interfaceId = pipe->interfaceId;
1442     params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
1443     params->pipeId = pipe->pipeId;
1444     params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
1445     params->timeout = USB_CTRL_SET_TIMEOUT;
1446     params->dataReq.numIsoPackets = 0;
1447     params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1);
1448     params->dataReq.length = pipe->maxPacketSize;
1449 
1450     if (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT) {
1451         params->callback = UsbdBulkASyncWriteCallbackAutoSubmit;
1452         params->dataReq.buffer = buffer;
1453     } else {
1454         params->callback = UsbdBulkASyncReadCallbackAutoSubmit;
1455     }
1456     return HDF_SUCCESS;
1457 }
1458 
UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode * req)1459 int32_t UsbdDispatcher::UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode *req)
1460 {
1461     UsbRequestParams params;
1462     int32_t ret = memcpy_s(&params, sizeof(params), &req->list->pList->params, sizeof(params));
1463     if (ret != EOK) {
1464         HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1465         return ret;
1466     }
1467 
1468     params.userData = static_cast<void *>(req);
1469     ret = UsbdBulkAsyncGetAsmData(&req->list->pList->asmHandle, &params, req->list->pList->pipe.maxPacketSize);
1470     if (ret != HDF_SUCCESS) {
1471         UsbdBulkASyncReqNodeSetNoUse(req);
1472         HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmData ret:%{public}d", __func__, ret);
1473         return ret;
1474     }
1475     req->request->compInfo.status = USB_REQUEST_COMPLETED;
1476     ret = UsbFillRequest(req->request, req->list->pList->ifHandle, &params);
1477     if (ret != HDF_SUCCESS) {
1478         UsbdBulkASyncReqNodeSetNoUse(req);
1479         HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret);
1480         return ret;
1481     }
1482     ret = UsbSubmitRequestAsync(req->request);
1483     if (ret != HDF_SUCCESS) {
1484         UsbdBulkASyncReqNodeSetNoUse(req);
1485         HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret);
1486     }
1487     return ret;
1488 }
1489 
UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode * db)1490 int32_t UsbdDispatcher::UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode *db)
1491 {
1492     uint32_t readLen = 0;
1493     int32_t ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize);
1494     if (ret != HDF_SUCCESS || readLen == 0) {
1495         UsbdBulkASyncReqNodeSetNoUse(db);
1496         HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmReqLen failed, readLen:%{public}u", __func__, readLen);
1497         return HDF_DEV_ERR_NODATA;
1498     }
1499 
1500     db->request->compInfo.status = USB_REQUEST_COMPLETED;
1501     UsbRequestParams params;
1502     ret = memcpy_s(&params, sizeof(params), &db->list->pList->params, sizeof(params));
1503     if (ret != EOK) {
1504         HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1505         return ret;
1506     }
1507 
1508     params.dataReq.length = readLen;
1509     params.userData = static_cast<void *>(db);
1510     ret = UsbFillRequest(db->request, db->list->pList->ifHandle, &params);
1511     if (ret != HDF_SUCCESS) {
1512         HDF_LOGE("%{public}s:UsbFillRequest failed", __func__);
1513         UsbdBulkASyncReqNodeSetNoUse(db);
1514         return ret;
1515     }
1516 
1517     ret = UsbSubmitRequestAsync(db->request);
1518     if (ret != HDF_SUCCESS) {
1519         HDF_LOGE("%{public}s:UsbSubmitRequestAsync failed", __func__);
1520         UsbdBulkASyncReqNodeSetNoUse(db);
1521     }
1522     return ret;
1523 }
1524 } // namespace V1_2
1525 } // namespace Usb
1526 } // namespace HDI
1527 } // namespace OHOS
1528