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