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