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(¶ms, 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, ¶ms, 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, ¶ms);
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(¶ms, 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, ¶ms);
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(¶ms, 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, ¶ms, 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, ¶ms);
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(¶ms, 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, ¶ms);
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