1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "usb_io_manage.h"
17094332d3Sopenharmony_ci#include "usb_raw_api_library.h"
18094332d3Sopenharmony_ci#include "usbd_wrapper.h"
19094332d3Sopenharmony_ci
20094332d3Sopenharmony_ci#define HDF_LOG_TAG USB_IO_MANAGE
21094332d3Sopenharmony_ci
22094332d3Sopenharmony_cistatic const int MAX_ERROR_TIMES = 20;
23094332d3Sopenharmony_ci
24094332d3Sopenharmony_cistatic bool IoCancelRequest(struct UsbInterfacePool *interfacePool, const struct UsbHostRequest *hostRequest)
25094332d3Sopenharmony_ci{
26094332d3Sopenharmony_ci    struct UsbIfRequest *requestObj = NULL;
27094332d3Sopenharmony_ci
28094332d3Sopenharmony_ci    if (hostRequest == NULL) {
29094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d hostRequest is NULL", __func__, __LINE__);
30094332d3Sopenharmony_ci        return true;
31094332d3Sopenharmony_ci    }
32094332d3Sopenharmony_ci
33094332d3Sopenharmony_ci    requestObj = (struct UsbIfRequest *)hostRequest->privateObj;
34094332d3Sopenharmony_ci    if (requestObj == NULL) {
35094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d get request error", __func__, __LINE__);
36094332d3Sopenharmony_ci        return true;
37094332d3Sopenharmony_ci    }
38094332d3Sopenharmony_ci
39094332d3Sopenharmony_ci    if (interfacePool->ioProcessStopStatus != USB_POOL_PROCESS_RUNNING) {
40094332d3Sopenharmony_ci        UsbCancelRequest(&requestObj->request);
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci
43094332d3Sopenharmony_ci    return (requestObj->request.compInfo.status == USB_REQUEST_CANCELLED);
44094332d3Sopenharmony_ci}
45094332d3Sopenharmony_ci
46094332d3Sopenharmony_cistatic int32_t IoSendProcess(const void *interfacePoolArg)
47094332d3Sopenharmony_ci{
48094332d3Sopenharmony_ci    if (interfacePoolArg == NULL) {
49094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid param", __func__);
50094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
51094332d3Sopenharmony_ci    }
52094332d3Sopenharmony_ci
53094332d3Sopenharmony_ci    struct UsbInterfacePool *interfacePool = (struct UsbInterfacePool *)interfacePoolArg;
54094332d3Sopenharmony_ci    struct UsbHostRequest *submitRequest = NULL;
55094332d3Sopenharmony_ci    int32_t ret;
56094332d3Sopenharmony_ci    int32_t i;
57094332d3Sopenharmony_ci    int32_t errorTimes = 0;
58094332d3Sopenharmony_ci
59094332d3Sopenharmony_ci    while (errorTimes < MAX_ERROR_TIMES) {
60094332d3Sopenharmony_ci        submitRequest = NULL;
61094332d3Sopenharmony_ci        /* Get a request from curretn submit queue */
62094332d3Sopenharmony_ci        ret = UsbIoGetRequest(&interfacePool->submitRequestQueue, &submitRequest);
63094332d3Sopenharmony_ci
64094332d3Sopenharmony_ci        if (interfacePool->ioProcessStopStatus != USB_POOL_PROCESS_RUNNING) {
65094332d3Sopenharmony_ci            if (submitRequest != NULL) {
66094332d3Sopenharmony_ci                submitRequest->status = USB_REQUEST_ERROR;
67094332d3Sopenharmony_ci                UsbIoSetRequestCompletionInfo(submitRequest);
68094332d3Sopenharmony_ci            }
69094332d3Sopenharmony_ci            break;
70094332d3Sopenharmony_ci        }
71094332d3Sopenharmony_ci
72094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS || submitRequest == NULL) {
73094332d3Sopenharmony_ci            ++errorTimes;
74094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d ret=%{public}d errtimes=%{public}d", __func__, __LINE__, ret, errorTimes);
75094332d3Sopenharmony_ci            continue;
76094332d3Sopenharmony_ci        }
77094332d3Sopenharmony_ci        errorTimes = 0;
78094332d3Sopenharmony_ci
79094332d3Sopenharmony_ci        if (IoCancelRequest(interfacePool, submitRequest)) {
80094332d3Sopenharmony_ci            continue;
81094332d3Sopenharmony_ci        }
82094332d3Sopenharmony_ci
83094332d3Sopenharmony_ci        for (i = 0; i < USB_IO_SUBMIT_RETRY_TIME_CNT; i++) {
84094332d3Sopenharmony_ci            ret = RawSubmitRequest(submitRequest);
85094332d3Sopenharmony_ci            if (ret != HDF_SUCCESS) {
86094332d3Sopenharmony_ci                continue;
87094332d3Sopenharmony_ci            }
88094332d3Sopenharmony_ci            /* Submit success */
89094332d3Sopenharmony_ci            OsalSemPost(&interfacePool->ioSem);
90094332d3Sopenharmony_ci            break;
91094332d3Sopenharmony_ci        }
92094332d3Sopenharmony_ci
93094332d3Sopenharmony_ci        if (i >= USB_IO_SUBMIT_RETRY_TIME_CNT) {
94094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d submit request failed", __func__, __LINE__);
95094332d3Sopenharmony_ci            submitRequest->status = USB_REQUEST_ERROR;
96094332d3Sopenharmony_ci            UsbIoSetRequestCompletionInfo(submitRequest);
97094332d3Sopenharmony_ci            continue;
98094332d3Sopenharmony_ci        }
99094332d3Sopenharmony_ci    }
100094332d3Sopenharmony_ci    HDF_LOGE("%{public}s, stop. errorTimes=%{public}d", __func__, errorTimes);
101094332d3Sopenharmony_ci    return 0;
102094332d3Sopenharmony_ci}
103094332d3Sopenharmony_ci
104094332d3Sopenharmony_cistatic int32_t IoAsyncReceiveProcess(const void *interfacePoolArg)
105094332d3Sopenharmony_ci{
106094332d3Sopenharmony_ci    if (interfacePoolArg == NULL) {
107094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid param", __func__);
108094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
109094332d3Sopenharmony_ci    }
110094332d3Sopenharmony_ci
111094332d3Sopenharmony_ci    struct UsbInterfacePool *interfacePool = (struct UsbInterfacePool *)interfacePoolArg;
112094332d3Sopenharmony_ci    if (RawRegisterSignal() != HDF_SUCCESS) {
113094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d RawRegisterSignal error", __func__, __LINE__);
114094332d3Sopenharmony_ci    }
115094332d3Sopenharmony_ci
116094332d3Sopenharmony_ci    HDF_LOGD("%{public}s, enter recv thread", __func__);
117094332d3Sopenharmony_ci    while (true) {
118094332d3Sopenharmony_ci        if (!interfacePool->ioProcessTid) {
119094332d3Sopenharmony_ci            interfacePool->ioProcessTid = RawGetTid();
120094332d3Sopenharmony_ci        }
121094332d3Sopenharmony_ci
122094332d3Sopenharmony_ci        if (interfacePool->device == NULL) {
123094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d interfacePool->device is NULL!", __func__, __LINE__);
124094332d3Sopenharmony_ci            OsalMSleep(USB_IO_SLEEP_MS_TIME);
125094332d3Sopenharmony_ci            continue;
126094332d3Sopenharmony_ci        }
127094332d3Sopenharmony_ci
128094332d3Sopenharmony_ci        if (interfacePool->device->devHandle == NULL) {
129094332d3Sopenharmony_ci            HDF_LOGE("%{public}s:%{public}d interfacePool->device->devHandle is NULL!", __func__, __LINE__);
130094332d3Sopenharmony_ci            OsalMSleep(USB_IO_SLEEP_MS_TIME);
131094332d3Sopenharmony_ci            continue;
132094332d3Sopenharmony_ci        }
133094332d3Sopenharmony_ci
134094332d3Sopenharmony_ci        int32_t ret = OsalSemWait(&interfacePool->ioSem, HDF_WAIT_FOREVER);
135094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
136094332d3Sopenharmony_ci            HDF_LOGE("sem wait failed: %{public}d", ret);
137094332d3Sopenharmony_ci        }
138094332d3Sopenharmony_ci
139094332d3Sopenharmony_ci        if (interfacePool->ioProcessStopStatus != USB_POOL_PROCESS_RUNNING ||
140094332d3Sopenharmony_ci            interfacePool->ioRecvProcessStopStatus != USB_POOL_PROCESS_RUNNING) {
141094332d3Sopenharmony_ci            break;
142094332d3Sopenharmony_ci        }
143094332d3Sopenharmony_ci
144094332d3Sopenharmony_ci        ret = RawHandleRequest(interfacePool->device->devHandle);
145094332d3Sopenharmony_ci        if (ret < 0) {
146094332d3Sopenharmony_ci            HDF_LOGE("%{public}s RawHandleRequest failed ret: %{public}d", __func__, ret);
147094332d3Sopenharmony_ci            OsalMSleep(USB_IO_SLEEP_MS_TIME);
148094332d3Sopenharmony_ci            continue;
149094332d3Sopenharmony_ci        }
150094332d3Sopenharmony_ci    }
151094332d3Sopenharmony_ci    HDF_LOGE("%{public}s, recv thread end. ", __func__);
152094332d3Sopenharmony_ci    OsalMutexLock(&interfacePool->ioStopLock);
153094332d3Sopenharmony_ci    interfacePool->ioProcessStopStatus = USB_POOL_PROCESS_STOPED;
154094332d3Sopenharmony_ci    interfacePool->ioRecvProcessStopStatus = USB_POOL_PROCESS_STOPED;
155094332d3Sopenharmony_ci    OsalSemPost(&interfacePool->submitRequestQueue.sem);
156094332d3Sopenharmony_ci    OsalMutexUnlock(&interfacePool->ioStopLock);
157094332d3Sopenharmony_ci
158094332d3Sopenharmony_ci    return HDF_SUCCESS;
159094332d3Sopenharmony_ci}
160094332d3Sopenharmony_ci
161094332d3Sopenharmony_ciHDF_STATUS UsbIoCreateQueue(const struct UsbInterfacePool *interfacePool)
162094332d3Sopenharmony_ci{
163094332d3Sopenharmony_ci    if (interfacePool == NULL) {
164094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid param", __func__);
165094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
166094332d3Sopenharmony_ci    }
167094332d3Sopenharmony_ci
168094332d3Sopenharmony_ci    DListHeadInit((struct DListHead *)&interfacePool->submitRequestQueue.entry);
169094332d3Sopenharmony_ci    OsalMutexInit((struct OsalMutex *)&interfacePool->submitRequestQueue.mutex);
170094332d3Sopenharmony_ci    OsalSemInit((struct OsalSem *)&interfacePool->submitRequestQueue.sem, 0);
171094332d3Sopenharmony_ci
172094332d3Sopenharmony_ci    return HDF_SUCCESS;
173094332d3Sopenharmony_ci}
174094332d3Sopenharmony_ci
175094332d3Sopenharmony_ciHDF_STATUS UsbIoDestroyQueue(const struct UsbInterfacePool *interfacePool)
176094332d3Sopenharmony_ci{
177094332d3Sopenharmony_ci    if (interfacePool == NULL) {
178094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid param", __func__);
179094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
180094332d3Sopenharmony_ci    }
181094332d3Sopenharmony_ci
182094332d3Sopenharmony_ci    if (!DListIsEmpty(&interfacePool->submitRequestQueue.entry)) {
183094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d submitRequestQueue is not empty", __func__, __LINE__);
184094332d3Sopenharmony_ci        return HDF_FAILURE;
185094332d3Sopenharmony_ci    }
186094332d3Sopenharmony_ci
187094332d3Sopenharmony_ci    OsalMutexDestroy((struct OsalMutex *)&interfacePool->submitRequestQueue.mutex);
188094332d3Sopenharmony_ci    OsalSemDestroy((struct OsalSem *)&interfacePool->submitRequestQueue.sem);
189094332d3Sopenharmony_ci
190094332d3Sopenharmony_ci    return HDF_SUCCESS;
191094332d3Sopenharmony_ci}
192094332d3Sopenharmony_ci
193094332d3Sopenharmony_ciint32_t UsbIoSendRequest(const struct UsbMessageQueue *msgQueue, const struct UsbHostRequest *request)
194094332d3Sopenharmony_ci{
195094332d3Sopenharmony_ci    if ((msgQueue == NULL) || (request == NULL)) {
196094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid parameter", __func__, __LINE__);
197094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
198094332d3Sopenharmony_ci    }
199094332d3Sopenharmony_ci
200094332d3Sopenharmony_ci    OsalMutexLock((struct OsalMutex *)&msgQueue->mutex);
201094332d3Sopenharmony_ci    DListInsertTail((struct DListHead *)&request->list, (struct DListHead *)&msgQueue->entry);
202094332d3Sopenharmony_ci    OsalMutexUnlock((struct OsalMutex *)&msgQueue->mutex);
203094332d3Sopenharmony_ci
204094332d3Sopenharmony_ci    OsalSemPost((struct OsalSem *)&msgQueue->sem);
205094332d3Sopenharmony_ci
206094332d3Sopenharmony_ci    return HDF_SUCCESS;
207094332d3Sopenharmony_ci}
208094332d3Sopenharmony_ci
209094332d3Sopenharmony_ciHDF_STATUS UsbIoGetRequest(const struct UsbMessageQueue *msgQueue, struct UsbHostRequest **request)
210094332d3Sopenharmony_ci{
211094332d3Sopenharmony_ci    HDF_STATUS ret;
212094332d3Sopenharmony_ci    struct UsbHostRequest *reqEntry = NULL;
213094332d3Sopenharmony_ci
214094332d3Sopenharmony_ci    if ((msgQueue == NULL) || (request == NULL)) {
215094332d3Sopenharmony_ci        ret = HDF_ERR_INVALID_OBJECT;
216094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid parameter", __func__, __LINE__);
217094332d3Sopenharmony_ci        return ret;
218094332d3Sopenharmony_ci    }
219094332d3Sopenharmony_ci
220094332d3Sopenharmony_ci    ret = OsalSemWait((struct OsalSem *)&msgQueue->sem, HDF_WAIT_FOREVER);
221094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
222094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalSemWait failed, ret=%{public}d", __func__, __LINE__, ret);
223094332d3Sopenharmony_ci        goto ERROR;
224094332d3Sopenharmony_ci    }
225094332d3Sopenharmony_ci    if (DListIsEmpty(&msgQueue->entry)) {
226094332d3Sopenharmony_ci        ret = HDF_SUCCESS;
227094332d3Sopenharmony_ci        goto ERROR;
228094332d3Sopenharmony_ci    }
229094332d3Sopenharmony_ci
230094332d3Sopenharmony_ci    OsalMutexLock((struct OsalMutex *)&msgQueue->mutex);
231094332d3Sopenharmony_ci    if (msgQueue->entry.next == NULL || msgQueue->entry.next->prev == NULL || msgQueue->entry.prev == NULL || msgQueue->entry.prev->next == NULL) {
232094332d3Sopenharmony_ci        ret = HDF_ERR_INVALID_OBJECT;
233094332d3Sopenharmony_ci        OsalMutexUnlock((struct OsalMutex *)&msgQueue->mutex);
234094332d3Sopenharmony_ci        goto ERROR;
235094332d3Sopenharmony_ci    }
236094332d3Sopenharmony_ci    reqEntry = DLIST_FIRST_ENTRY(&msgQueue->entry, struct UsbHostRequest, list);
237094332d3Sopenharmony_ci    if (reqEntry == NULL || reqEntry->list.prev == NULL || reqEntry->list.next == NULL ||
238094332d3Sopenharmony_ci        reqEntry->list.prev->next != &reqEntry->list || reqEntry->list.next->prev != &reqEntry->list) {
239094332d3Sopenharmony_ci        ret = HDF_ERR_INVALID_OBJECT;
240094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d list node is invalid", __func__, __LINE__);
241094332d3Sopenharmony_ci        OsalMutexUnlock((struct OsalMutex *)&msgQueue->mutex);
242094332d3Sopenharmony_ci        goto ERROR;
243094332d3Sopenharmony_ci    }
244094332d3Sopenharmony_ci    DListRemove(&reqEntry->list);
245094332d3Sopenharmony_ci    *request = (struct UsbHostRequest *)reqEntry;
246094332d3Sopenharmony_ci    OsalMutexUnlock((struct OsalMutex *)&msgQueue->mutex);
247094332d3Sopenharmony_ci
248094332d3Sopenharmony_ci    return HDF_SUCCESS;
249094332d3Sopenharmony_ci
250094332d3Sopenharmony_ciERROR:
251094332d3Sopenharmony_ci    *request = NULL;
252094332d3Sopenharmony_ci    return ret;
253094332d3Sopenharmony_ci}
254094332d3Sopenharmony_ci
255094332d3Sopenharmony_ciHDF_STATUS UsbIoStart(struct UsbInterfacePool *interfacePool)
256094332d3Sopenharmony_ci{
257094332d3Sopenharmony_ci    struct OsalThreadParam threadCfg;
258094332d3Sopenharmony_ci    if (interfacePool == NULL) {
259094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d", __func__, __LINE__);
260094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
261094332d3Sopenharmony_ci    }
262094332d3Sopenharmony_ci
263094332d3Sopenharmony_ci    OsalMutexLock(&interfacePool->ioStopLock);
264094332d3Sopenharmony_ci    interfacePool->ioProcessStopStatus = USB_POOL_PROCESS_RUNNING;
265094332d3Sopenharmony_ci    interfacePool->ioRecvProcessStopStatus = USB_POOL_PROCESS_RUNNING;
266094332d3Sopenharmony_ci    OsalSemInit(&interfacePool->ioSem, 0);
267094332d3Sopenharmony_ci    OsalMutexUnlock(&interfacePool->ioStopLock);
268094332d3Sopenharmony_ci
269094332d3Sopenharmony_ci    /* create IoSendProcess thread */
270094332d3Sopenharmony_ci    HDF_STATUS ret = memset_s(&threadCfg, sizeof(threadCfg), 0, sizeof(threadCfg));
271094332d3Sopenharmony_ci    if (ret != EOK) {
272094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
273094332d3Sopenharmony_ci        return ret;
274094332d3Sopenharmony_ci    }
275094332d3Sopenharmony_ci    threadCfg.name = "usb io send process";
276094332d3Sopenharmony_ci    threadCfg.priority = OSAL_THREAD_PRI_DEFAULT;
277094332d3Sopenharmony_ci    threadCfg.stackSize = USB_IO_SEND_PROCESS_STACK_SIZE;
278094332d3Sopenharmony_ci
279094332d3Sopenharmony_ci    ret = OsalThreadCreate(&interfacePool->ioSendProcess, (OsalThreadEntry)IoSendProcess, (void *)interfacePool);
280094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
281094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalThreadCreate failed, ret=%{public}d ", __func__, __LINE__, ret);
282094332d3Sopenharmony_ci        return ret;
283094332d3Sopenharmony_ci    }
284094332d3Sopenharmony_ci
285094332d3Sopenharmony_ci    ret = OsalThreadStart(&interfacePool->ioSendProcess, &threadCfg);
286094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
287094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalThreadStart failed, ret=%{public}d ", __func__, __LINE__, ret);
288094332d3Sopenharmony_ci        goto ERR_DESTROY_SEND;
289094332d3Sopenharmony_ci    }
290094332d3Sopenharmony_ci
291094332d3Sopenharmony_ci    /* create IoAsyncReceiveProcess thread */
292094332d3Sopenharmony_ci    (void)memset_s(&threadCfg, sizeof(threadCfg), 0, sizeof(threadCfg));
293094332d3Sopenharmony_ci    threadCfg.name = "usb io async receive process";
294094332d3Sopenharmony_ci    threadCfg.priority = OSAL_THREAD_PRI_DEFAULT;
295094332d3Sopenharmony_ci    threadCfg.stackSize = USB_IO_RECEIVE_PROCESS_STACK_SIZE;
296094332d3Sopenharmony_ci
297094332d3Sopenharmony_ci    ret = OsalThreadCreate(&interfacePool->ioAsyncReceiveProcess, (void *)IoAsyncReceiveProcess, (void *)interfacePool);
298094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
299094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalThreadCreate failed, ret=%{public}d ", __func__, __LINE__, ret);
300094332d3Sopenharmony_ci        goto ERR_DESTROY_SEND;
301094332d3Sopenharmony_ci    }
302094332d3Sopenharmony_ci
303094332d3Sopenharmony_ci    ret = OsalThreadStart(&interfacePool->ioAsyncReceiveProcess, &threadCfg);
304094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
305094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalThreadStart failed, ret=%{public}d ", __func__, __LINE__, ret);
306094332d3Sopenharmony_ci        goto ERR_DESTROY_RECV;
307094332d3Sopenharmony_ci    }
308094332d3Sopenharmony_ci
309094332d3Sopenharmony_ci    return HDF_SUCCESS;
310094332d3Sopenharmony_ci
311094332d3Sopenharmony_ciERR_DESTROY_SEND:
312094332d3Sopenharmony_ci    OsalThreadDestroy(&interfacePool->ioAsyncReceiveProcess);
313094332d3Sopenharmony_ciERR_DESTROY_RECV:
314094332d3Sopenharmony_ci    OsalThreadDestroy(&interfacePool->ioSendProcess);
315094332d3Sopenharmony_ci
316094332d3Sopenharmony_ci    return ret;
317094332d3Sopenharmony_ci}
318094332d3Sopenharmony_ci
319094332d3Sopenharmony_ciHDF_STATUS UsbIoRecvProcessStop(struct UsbInterfacePool *interfacePool)
320094332d3Sopenharmony_ci{
321094332d3Sopenharmony_ci    if ((interfacePool == NULL) || (interfacePool->device == NULL) || (interfacePool->device->devHandle == NULL)) {
322094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d param is NULL", __func__, __LINE__);
323094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
324094332d3Sopenharmony_ci    }
325094332d3Sopenharmony_ci    if ((interfacePool->ioRecvProcessStopStatus != USB_POOL_PROCESS_STOPED)) {
326094332d3Sopenharmony_ci        OsalMutexLock(&interfacePool->ioStopLock);
327094332d3Sopenharmony_ci        interfacePool->ioRecvProcessStopStatus = USB_POOL_PROCESS_STOP;
328094332d3Sopenharmony_ci        OsalSemPost(&interfacePool->submitRequestQueue.sem);
329094332d3Sopenharmony_ci        OsalMutexUnlock(&interfacePool->ioStopLock);
330094332d3Sopenharmony_ci    }
331094332d3Sopenharmony_ci    return HDF_SUCCESS;
332094332d3Sopenharmony_ci}
333094332d3Sopenharmony_ci
334094332d3Sopenharmony_ciHDF_STATUS UsbIoStop(struct UsbInterfacePool *interfacePool)
335094332d3Sopenharmony_ci{
336094332d3Sopenharmony_ci    if ((interfacePool == NULL) || (interfacePool->device == NULL) || (interfacePool->device->devHandle == NULL)) {
337094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d param is NULL", __func__, __LINE__);
338094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
339094332d3Sopenharmony_ci    }
340094332d3Sopenharmony_ci    if ((interfacePool->ioProcessStopStatus != USB_POOL_PROCESS_STOPED)) {
341094332d3Sopenharmony_ci        OsalMutexLock(&interfacePool->ioStopLock);
342094332d3Sopenharmony_ci        interfacePool->ioProcessStopStatus = USB_POOL_PROCESS_STOP;
343094332d3Sopenharmony_ci        OsalSemPost(&interfacePool->ioSem);
344094332d3Sopenharmony_ci        OsalSemPost(&interfacePool->submitRequestQueue.sem);
345094332d3Sopenharmony_ci        OsalMutexUnlock(&interfacePool->ioStopLock);
346094332d3Sopenharmony_ci
347094332d3Sopenharmony_ci        if (RawKillSignal(interfacePool->device->devHandle, interfacePool->ioProcessTid) != HDF_SUCCESS) {
348094332d3Sopenharmony_ci            HDF_LOGE(
349094332d3Sopenharmony_ci                "%{public}s:%{public}d RawKillSignal ioProcessTid=%{public}d failed",
350094332d3Sopenharmony_ci                __func__, __LINE__, interfacePool->ioProcessTid);
351094332d3Sopenharmony_ci        }
352094332d3Sopenharmony_ci    }
353094332d3Sopenharmony_ci    int32_t i = 0;
354094332d3Sopenharmony_ci    while (interfacePool->ioProcessStopStatus != USB_POOL_PROCESS_STOPED) {
355094332d3Sopenharmony_ci        i++;
356094332d3Sopenharmony_ci        OsalMSleep(USB_IO_SLEEP_MS_TIME);
357094332d3Sopenharmony_ci        if (i > USB_IO_STOP_WAIT_MAX_TIME) {
358094332d3Sopenharmony_ci            HDF_LOGD("%{public}s:%{public}d", __func__, __LINE__);
359094332d3Sopenharmony_ci            break;
360094332d3Sopenharmony_ci        }
361094332d3Sopenharmony_ci    }
362094332d3Sopenharmony_ci
363094332d3Sopenharmony_ci    HDF_STATUS ret = OsalThreadDestroy(&interfacePool->ioSendProcess);
364094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
365094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalThreadDestroy failed, ret=%{public}d ", __func__, __LINE__, ret);
366094332d3Sopenharmony_ci        return ret;
367094332d3Sopenharmony_ci    }
368094332d3Sopenharmony_ci    ret = OsalThreadDestroy(&interfacePool->ioAsyncReceiveProcess);
369094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
370094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d OsalThreadDestroy failed, ret=%{public}d ", __func__, __LINE__, ret);
371094332d3Sopenharmony_ci    } else {
372094332d3Sopenharmony_ci        OsalSemDestroy(&interfacePool->ioSem);
373094332d3Sopenharmony_ci    }
374094332d3Sopenharmony_ci    return ret;
375094332d3Sopenharmony_ci}
376094332d3Sopenharmony_ci
377094332d3Sopenharmony_civoid UsbIoSetRequestCompletionInfo(const void *requestArg)
378094332d3Sopenharmony_ci{
379094332d3Sopenharmony_ci    if (requestArg == NULL) {
380094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d parameter error. ", __func__, __LINE__);
381094332d3Sopenharmony_ci        return;
382094332d3Sopenharmony_ci    }
383094332d3Sopenharmony_ci
384094332d3Sopenharmony_ci    struct UsbHostRequest *hostRequest = (struct UsbHostRequest *)requestArg;
385094332d3Sopenharmony_ci    struct UsbIfRequest *requestObj = (struct UsbIfRequest *)hostRequest->privateObj;
386094332d3Sopenharmony_ci    if (requestObj == NULL) {
387094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d get request error. ", __func__, __LINE__);
388094332d3Sopenharmony_ci        return;
389094332d3Sopenharmony_ci    }
390094332d3Sopenharmony_ci    requestObj->request.compInfo.buffer = hostRequest->buffer;
391094332d3Sopenharmony_ci    requestObj->request.compInfo.length = hostRequest->length;
392094332d3Sopenharmony_ci    requestObj->request.compInfo.actualLength = (uint32_t)hostRequest->actualLength;
393094332d3Sopenharmony_ci    requestObj->request.compInfo.status = hostRequest->status;
394094332d3Sopenharmony_ci    requestObj->request.compInfo.userData = hostRequest->userData;
395094332d3Sopenharmony_ci    if ((hostRequest->requestType & USB_DDK_ENDPOINT_XFERTYPE_MASK) == USB_DDK_ENDPOINT_XFER_CONTROL) {
396094332d3Sopenharmony_ci        requestObj->request.compInfo.buffer = requestObj->request.compInfo.buffer + USB_RAW_CONTROL_SETUP_SIZE;
397094332d3Sopenharmony_ci    }
398094332d3Sopenharmony_ci
399094332d3Sopenharmony_ci    /* Fill in the request completion information. */
400094332d3Sopenharmony_ci    /* Call user callback function. */
401094332d3Sopenharmony_ci    if (hostRequest->userCallback) {
402094332d3Sopenharmony_ci        hostRequest->userCallback(&requestObj->request);
403094332d3Sopenharmony_ci    }
404094332d3Sopenharmony_ci
405094332d3Sopenharmony_ci    if (requestObj->isSyncReq) {
406094332d3Sopenharmony_ci        OsalSemPost(&hostRequest->sem);
407094332d3Sopenharmony_ci    }
408094332d3Sopenharmony_ci}
409