• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "liteos_adapter.h"
17 #include "los_spinlock.h"
18 #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY
19 #include "usb_pnp_notify.h"
20 #endif
21 
22 #define HDF_LOG_TAG USB_LITEOS_ADAPTER
23 
24 #define PATH_LEN      24
25 #define DESC_READ_LEN 256
26 #define EP_NUM_MAX    30
27 #define SLEEP_TIME    20
28 #define REQ_NUM       10
29 #define TEST_BYTE_COUNT 1024
30 #define TIME_OUT      500
31 #define BUFFER_LEN    50
32 
33 static bool g_CompleteExit;
34 
35 enum UrbState {
36     URB_INIT_STATE,
37     URB_SUBMIT_STATE,
38     URB_REAP_STATE,
39 };
40 
41 struct Async {
42     struct DListHead asynclist;
43     enum UrbState state;
44     struct UsbDevice *dev;
45     UsbAdapterUrb urb;
46 };
47 
48 struct OsDev {
49     struct DListHead asyncCompleted;
50     UsbAdapterDevice *adapterDevice;
51     SPIN_LOCK_S completeLock;
52     struct OsalMutex completeMux;
53     struct OsalSem cvWait;
54 };
55 
OsAdapterRealloc(void * ptr,size_t oldSize,size_t newSize)56 static void *OsAdapterRealloc(void *ptr, size_t oldSize, size_t newSize)
57 {
58     void *mem;
59 
60     mem = RawUsbMemAlloc(newSize);
61     if (mem == NULL) {
62         HDF_LOGE("%{public}s:%d", __func__, __LINE__);
63         goto OUT;
64     }
65 
66     if (oldSize > 0) {
67         if (memmove_s(mem, newSize, ptr, oldSize) != HDF_SUCCESS) {
68             HDF_LOGE("%{public}s:%d", __func__, __LINE__);
69             RawUsbMemFree(mem);
70             mem = NULL;
71             goto OUT;
72         }
73     }
74 
75     RawUsbMemFree(ptr);
76 OUT:
77     return mem;
78 }
79 
UsbFindUrb(const struct Async * urb,struct DListHead * list)80 static bool UsbFindUrb(const struct Async *urb, struct DListHead *list)
81 {
82     bool findFlag = false;
83     struct OsDev *osDev = CONTAINER_OF(list, struct OsDev, asyncCompleted);
84     struct Async *asPos = NULL;
85     struct Async *asTemp = NULL;
86     if (DListIsEmpty(&osDev->asyncCompleted)) {
87         return false;
88     }
89     DLIST_FOR_EACH_ENTRY_SAFE(asPos, asTemp, list, struct Async, asynclist) {
90         if (asPos == urb) {
91             findFlag = true;
92             break;
93         }
94     }
95     return findFlag;
96 }
97 
OsUrbComplete(UsbAdapterUrb * urb)98 static void OsUrbComplete(UsbAdapterUrb *urb)
99 {
100     uint32_t save;
101     struct Async *as = CONTAINER_OF(urb, struct Async, urb);
102     struct UsbDevice *dev = as->dev;
103     if (dev == NULL) {
104         DPRINTFN(0, "dev is null\n");
105         return;
106     }
107     struct OsDev *osDev = (struct OsDev *)dev->privateData;
108     if (osDev == NULL) {
109         DPRINTFN(0, "osDev is null\n");
110         return;
111     }
112     as->state = URB_REAP_STATE;
113     LOS_SpinLockSave(&osDev->completeLock, &save);
114     if (UsbFindUrb(as, &osDev->asyncCompleted) == false) {
115         DListInsertTail(&as->asynclist, &osDev->asyncCompleted);
116         LOS_SpinUnlockRestore(&osDev->completeLock, save);
117         OsalSemPost(&osDev->cvWait);
118     } else {
119         LOS_SpinUnlockRestore(&osDev->completeLock, save);
120     }
121 }
122 
OsSubmitUrb(UsbAdapterUrb * urb,UsbAdapterDevice * adapterDevice,UsbAdapterHostEndpoint * uhe)123 static int32_t OsSubmitUrb(UsbAdapterUrb *urb, UsbAdapterDevice *adapterDevice, UsbAdapterHostEndpoint *uhe)
124 {
125     int32_t err;
126 
127     if ((uhe == NULL) || (urb == NULL) || (adapterDevice == NULL)) {
128         DPRINTFN(0, "invalid param\n");
129         return (-EINVAL);
130     }
131 
132     err = usb_setup_endpoint(adapterDevice, uhe, TEST_BYTE_COUNT);
133     if (err < 0) {
134         DPRINTFN(0, "setup failed err:%d\n", err);
135         return (err);
136     }
137     err = usb_submit_urb(urb, 0);
138     return (err);
139 }
140 
OsControlMsg(UsbAdapterUrb * urb)141 static int32_t OsControlMsg(UsbAdapterUrb *urb)
142 {
143     uint16_t actLen = 0;
144     UsbAdapterDevice *adapterDevice = urb->dev;
145     void *buffer = urb->transfer_buffer;
146     UsbAdapterDeviceRequest req;
147 
148     int32_t err = memcpy_s(&req, sizeof(UsbAdapterDeviceRequest), buffer, sizeof(UsbAdapterDeviceRequest));
149     if (err != EOK) {
150         DPRINTFN(0, "%s:%d err=%d\n", __func__, __LINE__, err);
151         err = HDF_ERR_IO;
152         return err;
153     }
154     err = usbd_do_request_flags(
155         adapterDevice, NULL, &req, (char *)buffer + sizeof(req), USB_SHORT_XFER_OK, &actLen, urb->timeout);
156     if (err) {
157         DPRINTFN(1, "OsControlMsg!err:%d\n", err);
158     }
159     urb->actual_length = actLen;
160     if (urb->complete) {
161         (urb->complete)(urb);
162     }
163     return err;
164 }
165 
OsWaitUrb(struct OsDev * osDev)166 static int32_t OsWaitUrb(struct OsDev *osDev)
167 {
168     if (osDev == NULL) {
169         return HDF_FAILURE;
170     }
171     do {
172         OsalSemWait(&osDev->cvWait, HDF_WAIT_FOREVER);
173     } while (!g_CompleteExit && DListIsEmpty(&osDev->asyncCompleted));
174     return HDF_SUCCESS;
175 }
176 
OsReapUrb(const struct UsbDeviceHandle * handle,struct Async ** urb)177 static int32_t OsReapUrb(const struct UsbDeviceHandle *handle, struct Async **urb)
178 {
179     if ((handle == NULL) || (handle->dev == NULL) || (handle->dev->privateData == NULL)) {
180         PRINTK("invalid parmater\n");
181         return HDF_ERR_INVALID_PARAM;
182     }
183     int32_t err = 0;
184     uint32_t save;
185     struct Async *as = NULL;
186     struct UsbDevice *dev = handle->dev;
187     if (dev->privateData == NULL) {
188         PRINTK("invalid parmater\n");
189         return HDF_ERR_INVALID_PARAM;
190     }
191     struct OsDev *osDev = (struct OsDev *)dev->privateData;
192     err = OsWaitUrb(osDev);
193     LOS_SpinLockSave(&osDev->completeLock, &save);
194     if (!DListIsEmpty(&osDev->asyncCompleted)) {
195         as = DLIST_FIRST_ENTRY(&osDev->asyncCompleted, struct Async, asynclist);
196         DListRemove(&as->asynclist);
197     }
198     LOS_SpinUnlockRestore(&osDev->completeLock, save);
199     *urb = as;
200     return err;
201 }
202 
OsDeviceCompare(struct HdfSListNode * listEntry,uint32_t searchKey)203 static bool OsDeviceCompare(struct HdfSListNode *listEntry, uint32_t searchKey)
204 {
205     struct UsbDevice *dev = (struct UsbDevice *)listEntry;
206     if (dev == NULL) {
207         return false;
208     }
209 
210     if ((dev->busNum == (searchKey >> BUS_OFFSET)) && (dev->devAddr == (searchKey & 0xFF))) {
211         return true;
212     }
213 
214     return false;
215 }
216 
OsGetDeviceHandle(struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)217 static struct UsbDeviceHandle *OsGetDeviceHandle(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
218 {
219     struct UsbDevice *dev = NULL;
220     struct UsbDeviceHandle *handle = NULL;
221 
222     if (session == NULL) {
223         DPRINTFN(0, "%s:invalid param\n", __func__);
224         return NULL;
225     }
226 
227     OsalMutexLock(&session->lock);
228     dev = (struct UsbDevice *)HdfSListSearch(&session->usbDevs, (busNum << BUS_OFFSET) | usbAddr, OsDeviceCompare);
229     if (dev != NULL) {
230         handle = dev->devHandle;
231         AdapterAtomicInc(&dev->refcnt);
232     }
233     OsalMutexUnlock(&session->lock);
234 
235     return handle;
236 }
237 
OsCallocDeviceHandle(void)238 static struct UsbDeviceHandle *OsCallocDeviceHandle(void)
239 {
240     struct UsbDeviceHandle *handle = NULL;
241 
242     handle = RawUsbMemCalloc(sizeof(*handle));
243     if (handle == NULL) {
244         DPRINTFN(0, "%s: allocate handle failed", __func__);
245         return NULL;
246     }
247 
248     OsalMutexInit(&handle->lock);
249 
250     return handle;
251 }
252 
OsAllocDevice(struct UsbSession * session,struct UsbDeviceHandle * handle)253 static struct UsbDevice *OsAllocDevice(struct UsbSession *session, struct UsbDeviceHandle *handle)
254 {
255     struct UsbDevice *dev = RawUsbMemCalloc(sizeof(*dev));
256     if (dev == NULL) {
257         DPRINTFN(0, "%s:%d no memory", __func__, __LINE__);
258         return NULL;
259     }
260 
261     dev->session = session;
262     dev->devHandle = handle;
263 
264     RawRequestListInit(dev);
265 
266     handle->dev = dev;
267     return dev;
268 }
269 
OsReadDescriptors(struct UsbDevice * dev)270 static int32_t OsReadDescriptors(struct UsbDevice *dev)
271 {
272     size_t allocLen = 0;
273     int32_t ret;
274     if (dev == NULL) {
275         HDF_LOGE("%{public}s:%d dev is NULL!", __func__, __LINE__);
276         return HDF_ERR_INVALID_PARAM;
277     }
278     struct OsDev *osDev = (struct OsDev *)dev->privateData;
279     if ((osDev == NULL) || (osDev->adapterDevice == NULL) || (osDev->adapterDevice->cdesc == NULL)) {
280         HDF_LOGE("%{public}s:%d is NULL!", __func__, __LINE__);
281         return HDF_ERR_INVALID_PARAM;
282     }
283 
284     do {
285         size_t oldLen = allocLen;
286         allocLen += DESC_READ_LEN;
287         dev->descriptors = OsAdapterRealloc(dev->descriptors, oldLen, allocLen);
288         if ((dev->descriptors == NULL) || (dev->descriptorsLength > allocLen)) {
289             DPRINTFN(0, "%s:%d\n", __func__, __LINE__);
290             return HDF_ERR_MALLOC_FAIL;
291         }
292         uint8_t *ptr = (uint8_t *)dev->descriptors + dev->descriptorsLength;
293         if (ptr == NULL) {
294             DPRINTFN(0, "%s:%d ptr is NULL\n", __func__, __LINE__);
295             ret = HDF_ERR_INVALID_PARAM;
296             return ret;
297         }
298         ret = memset_s(ptr, DESC_READ_LEN, 0, DESC_READ_LEN);
299         if (ret != HDF_SUCCESS) {
300             HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
301             return HDF_FAILURE;
302         }
303 
304         size_t count = UGETW(osDev->adapterDevice->cdesc->wTotalLength);
305         if (count > DESC_READ_LEN) {
306             ret = HDF_ERR_IO;
307             return ret;
308         }
309         ret = memcpy_s(ptr, DESC_READ_LEN, osDev->adapterDevice->cdesc, count);
310         if (ret != EOK) {
311             DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
312             ret = HDF_ERR_IO;
313             return ret;
314         }
315         DPRINTFN(0, "%s:+configdes_size:%d+type:%d\n", __func__, UGETW(osDev->adapterDevice->cdesc->wTotalLength),
316             osDev->adapterDevice->cdesc->bDescriptorType);
317         dev->descriptorsLength += count;
318     } while (dev->descriptorsLength == allocLen);
319 
320     return HDF_SUCCESS;
321 }
322 
OsParseConfigDescriptors(struct UsbDevice * dev)323 static int32_t OsParseConfigDescriptors(struct UsbDevice *dev)
324 {
325     uint8_t i;
326     uint8_t numConfigs;
327     uint8_t *buffer = NULL;
328     size_t descLen;
329     UsbAdapterDeviceDescriptor *deviceDesc = NULL;
330     struct OsDev *osDev = (struct OsDev *)dev->privateData;
331     deviceDesc = &osDev->adapterDevice->ddesc;
332     numConfigs = deviceDesc->bNumConfigurations;
333     if (numConfigs == 0) {
334         return HDF_SUCCESS;
335     }
336     dev->configDescriptors = RawUsbMemAlloc(numConfigs * sizeof(struct UsbDeviceConfigDescriptor));
337     if (dev->configDescriptors == NULL) {
338         DPRINTFN(0, "%s:%d\n", __func__, __LINE__);
339         return HDF_ERR_MALLOC_FAIL;
340     }
341     buffer = (uint8_t *)dev->descriptors;
342     descLen = dev->descriptorsLength;
343 
344     for (i = 0; i < numConfigs; i++) {
345         struct UsbConfigDescriptor *configDesc = NULL;
346         uint16_t configLen;
347 
348         if (descLen < USB_DDK_DT_CONFIG_SIZE) {
349             DPRINTFN(0, "%s:%d read %zu", __func__, __LINE__, descLen);
350             return HDF_ERR_IO;
351         }
352         configDesc = (struct UsbConfigDescriptor *)buffer;
353         if ((configDesc->bDescriptorType != USB_DDK_DT_CONFIG) || (configDesc->bLength < USB_DDK_DT_CONFIG_SIZE)) {
354             DPRINTFN(0, "%s:%d config desc error: type 0x%02x, length %u\n", __func__, __LINE__,
355                 configDesc->bDescriptorType, configDesc->bLength);
356             return HDF_ERR_IO;
357         }
358         configLen = LE16_TO_CPU(configDesc->wTotalLength);
359         if (configLen < USB_DDK_DT_CONFIG_SIZE) {
360             DPRINTFN(0, "invalid wTotalLength value %u\n", configLen);
361             return HDF_ERR_IO;
362         }
363         if (configLen > descLen) {
364             DPRINTFN(0, "%s:%d read %zu/%u\n", __func__, __LINE__, descLen, configLen);
365             configLen = (uint16_t)descLen;
366         }
367         dev->configDescriptors[i].desc = configDesc;
368         dev->configDescriptors[i].actualLen = configLen;
369         buffer += configLen;
370         descLen -= configLen;
371     }
372     return HDF_SUCCESS;
373 }
374 
OsDevAllocInit(void)375 static struct OsDev *OsDevAllocInit(void)
376 {
377     struct OsDev *osDev = NULL;
378     osDev = RawUsbMemCalloc(sizeof(*osDev));
379     if (osDev == NULL) {
380         return NULL;
381     }
382     DListHeadInit(&osDev->asyncCompleted);
383     OsalSemInit(&osDev->cvWait, 0);
384     LOS_SpinInit(&osDev->completeLock);
385     OsalMutexInit(&osDev->completeMux);
386     return osDev;
387 }
388 
OsDevDestory(struct OsDev * osDev)389 static void OsDevDestory(struct OsDev *osDev)
390 {
391     if (osDev == NULL) {
392         DPRINTFN(0, "invalid parma\n");
393         return;
394     }
395     OsalSemDestroy(&osDev->cvWait);
396     OsalMutexDestroy(&osDev->completeMux);
397     RawUsbMemFree(osDev);
398 }
399 
OsInitDevice(struct UsbDevice * dev,uint8_t busNum,uint8_t devAddr)400 static int32_t OsInitDevice(struct UsbDevice *dev, uint8_t busNum, uint8_t devAddr)
401 {
402     struct OsDev *osDev = NULL;
403     int32_t ret;
404 
405     dev->busNum = busNum;
406     dev->devAddr = devAddr;
407     osDev = OsDevAllocInit();
408     if (osDev == NULL) {
409         DPRINTFN(0, "%s:%d osDev  is NULL\n", __func__, __LINE__);
410         return HDF_DEV_ERR_NO_DEVICE;
411     }
412     g_CompleteExit = false;
413 #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY
414     struct UsbGetDevicePara paraData;
415     paraData.type = USB_PNP_DEVICE_ADDRESS_TYPE;
416     paraData.busNum = dev->busNum;
417     paraData.devNum = dev->devAddr;
418     osDev->adapterDevice = UsbPnpNotifyGetUsbDevice(paraData);
419 #else
420     osDev->adapterDevice = NULL;
421 #endif
422     if (osDev->adapterDevice == NULL) {
423         DPRINTFN(0, "%s:%d osDev->adapterDevice is NULL\n", __func__, __LINE__);
424         return HDF_DEV_ERR_NO_DEVICE;
425     }
426 
427     dev->privateData = (void *)osDev;
428     dev->descriptorsLength = 0;
429     ret = OsReadDescriptors(dev);
430     if (ret != HDF_SUCCESS) {
431         DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
432         return ret;
433     }
434     ret = OsParseConfigDescriptors(dev);
435     if (ret != HDF_SUCCESS) {
436         DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
437         return ret;
438     }
439     ret = memcpy_s(&dev->deviceDescriptor, sizeof(struct UsbDeviceDescriptor), &osDev->adapterDevice->ddesc,
440         USB_DDK_DT_DEVICE_SIZE);
441     if (ret != HDF_SUCCESS) {
442         DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
443         ret = HDF_ERR_IO;
444     }
445     return ret;
446 }
447 
OsFreeIsoUrbs(struct UsbHostRequest * request)448 static void OsFreeIsoUrbs(struct UsbHostRequest *request)
449 {
450     struct Async *urb = NULL;
451 
452     for (int32_t i = 0; i < request->numUrbs; i++) {
453         urb = request->isoUrbs[i];
454         if (urb == NULL) {
455             break;
456         }
457         RawUsbMemFree(urb);
458         request->isoUrbs[i] = NULL;
459     }
460 
461     RawUsbMemFree(request->isoUrbs);
462     request->isoUrbs = NULL;
463 }
464 
OsDiscardUrbs(const struct UsbHostRequest * request,int32_t first,int32_t last)465 static void OsDiscardUrbs(const struct UsbHostRequest *request, int32_t first, int32_t last)
466 {
467     UsbAdapterUrb *urb = NULL;
468     struct Async *as = NULL;
469 
470     if ((request == NULL) || (request->devHandle == NULL) || (first > URBS_PER_REQUEST) || (first > last)) {
471         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
472         return;
473     }
474 
475     for (int32_t i = last - 1; i >= first; i--) {
476         if (request->requestType == USB_REQUEST_TYPE_ISOCHRONOUS) {
477             as = (struct Async *)request->isoUrbs[i];
478         } else {
479             as = &(((struct Async *)request->urbs)[i]);
480         }
481         if (as == NULL) {
482             DPRINTFN(0, "discard as null\n");
483             return;
484         }
485         urb = &as->urb;
486         if (as->state == URB_SUBMIT_STATE) {
487             DPRINTFN(0, "usb kill urb\n");
488             usb_kill_urb(urb);
489             DPRINTFN(0, "%s:%d discard request\n", __func__, __LINE__);
490         }
491     }
492 }
493 
OsSubmitControlMsg(struct UsbHostRequest * const request,const UsbAdapterDevice * adapterDevice,const struct UsbDevice * dev)494 static int32_t OsSubmitControlMsg(
495     struct UsbHostRequest * const request, const UsbAdapterDevice *adapterDevice, const struct UsbDevice *dev)
496 {
497     int32_t ret;
498     struct Async *as = NULL;
499     UsbAdapterUrb *urb = NULL;
500     UsbAdapterHostEndpoint *uhe = NULL;
501     if ((request == NULL) || (request->length > MAX_BULK_DATA_BUFFER_LENGTH) || (request->buffer == NULL) ||
502         (adapterDevice == NULL) || (dev == NULL)) {
503         return HDF_ERR_INVALID_PARAM;
504     }
505     uhe = usb_find_host_endpoint((UsbAdapterDevice *)adapterDevice, request->requestType, request->endPoint);
506     if (uhe == NULL) {
507         DPRINTFN(0, "no found endpoint\n");
508         return -1;
509     }
510     if (request->urbs == NULL) {
511         as = RawUsbMemCalloc(sizeof(*as));
512         request->urbs = (void *)as;
513         request->numUrbs = 1;
514     }
515 
516     if (request->urbs == NULL) {
517         DPRINTFN(0, "%s:%d no mem", __func__, __LINE__);
518         return HDF_ERR_MALLOC_FAIL;
519     }
520     as = (struct Async *)request->urbs;
521     DListHeadInit(&as->asynclist);
522     as->dev = (struct UsbDevice *)dev;
523     as->state = URB_SUBMIT_STATE;
524     urb = &as->urb;
525     ret = memset_s(urb, sizeof(*urb), 0, sizeof(*urb));
526     if (ret != HDF_SUCCESS) {
527         HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
528         return HDF_FAILURE;
529     }
530 
531     urb->dev = (UsbAdapterDevice *)adapterDevice;
532     urb->endpoint = uhe;
533     urb->timeout = TIME_OUT;
534     urb->transfer_buffer = request->buffer;
535     urb->context = (void *)request;
536     urb->complete = OsUrbComplete;
537     ret = OsControlMsg(urb);
538     DPRINTFN(0, "OsSubmitControlRequest:ret:%d\n", ret);
539     if (ret) {
540         DPRINTFN(0, "submiturb failed, errno=%d\n", errno);
541         return HDF_ERR_IO;
542     }
543 
544     return HDF_SUCCESS;
545 }
546 
OsSubmitControlRequest(struct UsbHostRequest * request)547 static int32_t OsSubmitControlRequest(struct UsbHostRequest *request)
548 {
549     struct OsDev *osDev = NULL;
550     UsbAdapterDevice *adapterDevice = NULL;
551 
552     if ((request == NULL) || (request->length > MAX_BULK_DATA_BUFFER_LENGTH) || (request->devHandle == NULL) ||
553         (request->buffer == NULL)) {
554         return HDF_ERR_INVALID_PARAM;
555     }
556     struct UsbDeviceHandle *handle = request->devHandle;
557     struct UsbDevice *dev = handle->dev;
558     if (dev) {
559         osDev = (struct OsDev *)dev->privateData;
560     }
561     if (osDev) {
562         adapterDevice = osDev->adapterDevice;
563     }
564 
565     return OsSubmitControlMsg(request, adapterDevice, dev);
566 }
567 
OsSubmitBulkRequestHandleUrb(struct Async * pas,struct UsbHostRequest * request,int32_t bulkBufferLen,int32_t number)568 static int32_t OsSubmitBulkRequestHandleUrb(
569     struct Async *pas, struct UsbHostRequest *request, int32_t bulkBufferLen, int32_t number)
570 {
571     UsbAdapterUrb *urb = NULL;
572 
573     if (bulkBufferLen == 0) {
574         HDF_LOGE("%{public}s:%d bulkBufferLen can not be zero", __func__, __LINE__);
575         return HDF_ERR_INVALID_PARAM;
576     }
577 
578     urb = &pas->urb;
579     urb->context = (void *)request;
580     switch (request->requestType) {
581         case USB_REQUEST_TYPE_BULK:
582             break;
583         case USB_REQUEST_TYPE_INTERRUPT:
584             urb->interval = BUFFER_LEN;
585             break;
586         default:
587             DPRINTFN(0, "%s:%d unknown requestType=%u\n", __func__, __LINE__, request->requestType);
588             return HDF_ERR_INVALID_PARAM;
589     }
590     urb->transfer_buffer = request->buffer + (number * bulkBufferLen);
591     urb->complete = OsUrbComplete;
592     if (number == request->numUrbs - 1) {
593         uint32_t len = (uint32_t)(request->length % bulkBufferLen);
594         urb->transfer_buffer_length = (len == 0) ? (uint32_t)bulkBufferLen : len;
595     } else {
596         urb->transfer_buffer_length = (uint32_t)bulkBufferLen;
597     }
598 
599     return HDF_SUCCESS;
600 }
601 
OsSubmitBulkRequestHandle(struct UsbHostRequest * const request,struct Async * const as,int32_t bulkBufferLen)602 static int32_t OsSubmitBulkRequestHandle(
603     struct UsbHostRequest * const request, struct Async * const as, int32_t bulkBufferLen)
604 {
605     struct Async *pas = NULL;
606     int32_t numUrbs = request->numUrbs;
607     struct UsbDevice *dev = request->devHandle->dev;
608     struct OsDev *osDev = (struct OsDev *)dev->privateData;
609     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
610     UsbAdapterUrb *urb = NULL;
611 
612     UsbAdapterHostEndpoint *uhe = usb_find_host_endpoint(adapterDevice, request->requestType, request->endPoint);
613     if (uhe == NULL) {
614         DPRINTFN(0, "no found endpoint\n");
615         return HDF_DEV_ERR_NO_DEVICE;
616     }
617 
618     int32_t i;
619     for (i = 0, pas = as; i < numUrbs; i++, pas++) {
620         urb = &pas->urb;
621         int32_t ret = memset_s(urb, sizeof(*urb), 0, sizeof(*urb));
622         if (ret != HDF_SUCCESS) {
623             HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
624             return HDF_FAILURE;
625         }
626 
627         ret = OsSubmitBulkRequestHandleUrb(pas, request, bulkBufferLen, i);
628         if (ret != HDF_SUCCESS) {
629             return ret;
630         }
631         pas->state = URB_SUBMIT_STATE;
632         DListHeadInit(&pas->asynclist);
633         pas->dev = dev;
634         urb->dev = adapterDevice;
635         urb->endpoint = uhe;
636 
637         ret = OsSubmitUrb(urb, urb->dev, urb->endpoint);
638         if (ret == 0) {
639             continue;
640         }
641         if (i == 0) {
642             DPRINTFN(0, "the first urb failed\n");
643             return HDF_ERR_IO;
644         }
645         OsalMutexLock(&request->lock);
646         request->numRetired += numUrbs - i;
647         if (errno != EREMOTEIO) {
648             request->reqStatus = USB_REQUEST_ERROR;
649         }
650         OsDiscardUrbs(request, 0, i);
651         OsalMutexUnlock(&request->lock);
652         return HDF_SUCCESS;
653     }
654 
655     return HDF_SUCCESS;
656 }
657 
OsSubmitBulkRequest(struct UsbHostRequest * const request)658 static int32_t OsSubmitBulkRequest(struct UsbHostRequest * const request)
659 {
660     struct Async *as = NULL;
661     uint32_t bulkBufferLen;
662     int32_t numUrbs;
663 
664     if ((request == NULL) || (request->devHandle == NULL)) {
665         DPRINTFN(0, "%s: invalid param", __func__);
666         return HDF_ERR_INVALID_PARAM;
667     }
668 
669     if (request->length > MAX_BULK_DATA_BUFFER_LENGTH || request->length <= 0) {
670         DPRINTFN(0, "Bulk request size err\n");
671         return HDF_FAILURE;
672     }
673 
674     if (request->devHandle->caps & USB_ADAPTER_CAP_BULK_SCATTER_GATHER) {
675         bulkBufferLen = request->length ? request->length : 1;
676     } else {
677         bulkBufferLen = MAX_BULK_DATA_BUFFER_LENGTH;
678     }
679     if (request->length < bulkBufferLen) {
680         numUrbs = 1;
681     } else {
682         numUrbs = (request->length + bulkBufferLen - 1) / bulkBufferLen;
683     }
684     if (request->urbs == NULL) {
685         as = RawUsbMemCalloc(sizeof(*as));
686         request->urbs = (void *)as;
687     } else if (numUrbs > 1) {
688         RawUsbMemFree(request->urbs);
689         as = RawUsbMemCalloc(numUrbs * sizeof(*as));
690         request->urbs = (void *)as;
691     }
692     if (request->urbs == NULL) {
693         DPRINTFN(0, "%s:%d no mem", __func__, __LINE__);
694         return HDF_ERR_MALLOC_FAIL;
695     }
696     as = (struct Async *)request->urbs;
697     request->numUrbs = numUrbs;
698     request->numRetired = 0;
699     request->reqStatus = USB_REQUEST_COMPLETED;
700 
701     return OsSubmitBulkRequestHandle(request, as, bulkBufferLen);
702 }
703 
OsAllocIsoUrbs(struct UsbHostRequest * request,int32_t numUrbs,struct Async ** ass)704 static int32_t OsAllocIsoUrbs(struct UsbHostRequest *request, int32_t numUrbs, struct Async **ass)
705 {
706     struct Async *as = NULL;
707     unsigned char *urbBuffer = request->buffer;
708     int32_t numPacketsLeft = request->numIsoPackets;
709     int32_t packetIdx = 0;
710     int32_t i, j;
711 
712     UsbPipeType pipeType = request->requestType;
713     unsigned char endPoint = request->endPoint;
714     struct UsbDeviceHandle *handle = request->devHandle;
715     struct UsbDevice *dev = handle->dev;
716     struct OsDev *osDev = (struct OsDev *)dev->privateData;
717     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
718     UsbAdapterHostEndpoint *uhe = NULL;
719     uhe = usb_find_host_endpoint(adapterDevice, pipeType, endPoint);
720     if (uhe == NULL) {
721         DPRINTFN(0, "no found endpoint\n");
722         return HDF_DEV_ERR_NO_DEVICE;
723     }
724 
725     for (i = 0; i < numUrbs; i++) {
726         UsbAdapterUrb *urb = NULL;
727         int32_t numPackets = MIN(numPacketsLeft, MAX_ISO_PACKETS_PER_URB);
728         as = RawUsbMemCalloc(sizeof(struct Async));
729         if (as == NULL) {
730             OsFreeIsoUrbs(request);
731             return HDF_ERR_MALLOC_FAIL;
732         }
733         ass[i] = as;
734         urb = &as->urb;
735         for (j = 0; j < numPackets; j++) {
736             unsigned int packetLen = request->isoPacketDesc[packetIdx++].length;
737             urb->transfer_buffer_length += packetLen;
738             urb->iso_frame_desc[j].length = packetLen;
739         }
740         urb->endpoint = uhe;
741         urb->number_of_packets = (unsigned int)numPackets;
742         urb->transfer_buffer = urbBuffer;
743         urb->context = request;
744         urbBuffer += urb->transfer_buffer_length;
745         numPacketsLeft -= numPackets;
746     }
747 
748     return HDF_SUCCESS;
749 }
750 
OsSubmitIsoUrbs(struct UsbHostRequest * request,int32_t numUrbs,struct Async ** pUrbs)751 static int32_t OsSubmitIsoUrbs(struct UsbHostRequest *request, int32_t numUrbs, struct Async **pUrbs)
752 {
753     for (int32_t i = 0; i < numUrbs; i++) {
754         UsbAdapterUrb *urb = &(pUrbs[i]->urb);
755         int32_t ret = OsSubmitUrb(urb, urb->dev, urb->endpoint);
756         DPRINTFN(0, "submitUrb:%d errno=%d\n", ret, errno);
757         if (ret == 0) {
758             continue;
759         }
760 
761         if (errno == ENODEV) {
762             ret = HDF_DEV_ERR_NO_DEVICE;
763         } else {
764             DPRINTFN(0, "%s:%d submit iso urb failed errno=%d\n", __func__, __LINE__, errno);
765             ret = HDF_ERR_IO;
766         }
767 
768         if (i == 0) {
769             DPRINTFN(0, "first URB failed");
770             OsFreeIsoUrbs(request);
771             return ret;
772         }
773 
774         OsalMutexLock(&request->lock);
775         request->reqStatus = USB_REQUEST_ERROR;
776         request->numRetired += numUrbs - i;
777         if (request->numRetired == numUrbs) {
778             RawUsbMemFree(pUrbs);
779             request->isoUrbs = NULL;
780         }
781         OsalMutexUnlock(&request->lock);
782 
783         break;
784     }
785 
786     return HDF_SUCCESS;
787 }
788 
OsSubmitIsoRequest(struct UsbHostRequest * request)789 static int32_t OsSubmitIsoRequest(struct UsbHostRequest *request)
790 {
791     unsigned int totalLen = 0;
792 
793     if ((request == NULL) || (request->devHandle == NULL) || (request->numIsoPackets < 1)) {
794         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
795         return HDF_ERR_INVALID_PARAM;
796     }
797 
798     if (request->length > MAX_ISO_DATA_BUFFER_LEN) {
799         DPRINTFN(0, "%s:%d request length exceed the maximum", __func__, __LINE__);
800         return HDF_ERR_NOT_SUPPORT;
801     }
802 
803     for (int32_t i = 0; i < request->numIsoPackets; i++) {
804         unsigned int packetLen = request->isoPacketDesc[i].length;
805         if (packetLen > MAX_ISO_DATA_BUFFER_LEN) {
806             DPRINTFN(0, "%s:%d packet length: %u exceeds maximum: %u\n", __func__, __LINE__, packetLen,
807                 MAX_ISO_DATA_BUFFER_LEN);
808             return HDF_ERR_INVALID_PARAM;
809         }
810         totalLen += packetLen;
811     }
812     if (request->length < totalLen) {
813         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
814         return HDF_ERR_INVALID_PARAM;
815     }
816     int32_t numUrbs = (request->numIsoPackets + (MAX_ISO_PACKETS_PER_URB - 1)) / MAX_ISO_PACKETS_PER_URB;
817     struct Async **pUrbs = RawUsbMemCalloc(numUrbs * sizeof(struct Async *));
818     if (pUrbs == NULL) {
819         DPRINTFN(0, "%s:%d RawUsbMemCalloc pUrbs failed", __func__, __LINE__);
820         return HDF_ERR_MALLOC_FAIL;
821     }
822     request->isoUrbs = (void **)pUrbs;
823     request->numUrbs = numUrbs;
824     request->numRetired = 0;
825     request->isoPacketOffset = 0;
826     int32_t ret = OsAllocIsoUrbs(request, numUrbs, pUrbs);
827     if (ret != HDF_SUCCESS) {
828         DPRINTFN(0, "%s:%d alloc iso urbs failed", __func__, __LINE__);
829         return ret;
830     }
831 
832     return OsSubmitIsoUrbs(request, numUrbs, pUrbs);
833 }
834 
OsControlCompletion(struct UsbHostRequest * request,struct Async * as)835 static int32_t OsControlCompletion(struct UsbHostRequest *request, struct Async *as)
836 {
837     int32_t status;
838     UsbAdapterUrb *urb = &as->urb;
839 
840     OsalMutexLock(&request->lock);
841     request->numRetired++;
842     request->actualLength += (int)urb->actual_length;
843     if (request->reqStatus == USB_REQUEST_CANCELLED) {
844         OsalMutexUnlock(&request->lock);
845         as->state = URB_INIT_STATE;
846         return RawHandleRequestCompletion(request, USB_REQUEST_CANCELLED);
847     }
848 
849     switch (urb->status) {
850         case 0:
851             status = USB_REQUEST_COMPLETED;
852             break;
853         case -ENOENT:
854             status = USB_REQUEST_CANCELLED;
855             break;
856         case -EPIPE:
857             DPRINTFN(0, "%s:%d unsupported control request", __func__, __LINE__);
858             status = USB_REQUEST_STALL;
859             break;
860         case -EOVERFLOW:
861             DPRINTFN(0, "%s:%d overflow actualLength=%d\n", __func__, __LINE__, urb->actual_length);
862             status = USB_REQUEST_OVERFLOW;
863             break;
864         case -ENODEV:
865         case -ESHUTDOWN:
866             DPRINTFN(0, "device removed");
867             status = USB_REQUEST_NO_DEVICE;
868             break;
869         default:
870             DPRINTFN(0, "%s:%d urb status=%d\n", __func__, __LINE__, urb->status);
871             status = USB_REQUEST_ERROR;
872             break;
873     }
874     OsalMutexUnlock(&request->lock);
875     as->state = URB_INIT_STATE;
876     return RawHandleRequestCompletion(request, status);
877 }
878 
OsIsoRequestDesStatus(struct UsbHostRequest * request,UsbAdapterUrb * urb)879 static void OsIsoRequestDesStatus(struct UsbHostRequest *request, UsbAdapterUrb *urb)
880 {
881     uint32_t i;
882     UsbAdapterIsoPacketDescriptor *urbDesc = NULL;
883     struct UsbIsoPacketDesc *requestDesc = NULL;
884 
885     for (i = 0; i < urb->number_of_packets; i++) {
886         urbDesc = &urb->iso_frame_desc[i];
887         requestDesc = &request->isoPacketDesc[request->isoPacketOffset++];
888 
889         switch (urbDesc->status) {
890             case HDF_SUCCESS:
891                 requestDesc->status = USB_REQUEST_COMPLETED;
892                 break;
893             case -ENODEV:
894             case -ESHUTDOWN:
895                 requestDesc->status = USB_REQUEST_NO_DEVICE;
896                 break;
897             case -EPIPE:
898                 requestDesc->status = USB_REQUEST_STALL;
899                 break;
900             case -EOVERFLOW:
901                 requestDesc->status = USB_REQUEST_OVERFLOW;
902                 break;
903             default:
904                 requestDesc->status = USB_REQUEST_ERROR;
905                 break;
906         }
907         DPRINTFN(0, "%s:%d urb status=%d-%d\n", __func__, __LINE__, i, urbDesc->status);
908 
909         requestDesc->actualLength = urbDesc->actual_length;
910     }
911 }
912 
OsIsoCompletion(struct UsbHostRequest * request,struct Async * as)913 static int32_t OsIsoCompletion(struct UsbHostRequest *request, struct Async *as)
914 {
915     UsbRequestStatus status;
916     int32_t urbIndex = 0;
917     int32_t numUrbs;
918     UsbAdapterUrb *urb = &as->urb;
919 
920     if (request == NULL) {
921         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
922         return HDF_ERR_INVALID_PARAM;
923     }
924 
925     numUrbs = request->numUrbs;
926     OsalMutexLock(&request->lock);
927     for (int32_t i = 0; i < numUrbs; i++) {
928         if (urb == request->isoUrbs[i]) {
929             urbIndex = i + 1;
930             break;
931         }
932     }
933     if (urbIndex == 0) {
934         DPRINTFN(0, "%s:%d urbIndex is zero", __func__, __LINE__);
935         OsalMutexUnlock(&request->lock);
936         return HDF_ERR_BAD_FD;
937     }
938 
939     OsIsoRequestDesStatus(request, urb);
940     request->numRetired++;
941     if (request->reqStatus != USB_REQUEST_COMPLETED) {
942         if (request->numRetired == numUrbs) {
943             OsFreeIsoUrbs(request);
944             OsalMutexUnlock(&request->lock);
945             return RawHandleRequestCompletion(request, USB_REQUEST_ERROR);
946         }
947         goto OUT;
948     }
949 
950     status = USB_REQUEST_COMPLETED;
951     if (urb->status == -ESHUTDOWN) {
952         status = USB_REQUEST_NO_DEVICE;
953     } else if (!((urb->status == HDF_SUCCESS) || (urb->status == -ENOENT) || (urb->status == -ECONNRESET))) {
954         status = USB_REQUEST_ERROR;
955     }
956 
957     if (request->numRetired == numUrbs) {
958         DPRINTFN(0, "%s:%d all URBs reaped for complete", __func__, __LINE__);
959         OsFreeIsoUrbs(request);
960         OsalMutexUnlock(&request->lock);
961         return RawHandleRequestCompletion(request, status);
962     }
963 OUT:
964     OsalMutexUnlock(&request->lock);
965     return HDF_SUCCESS;
966 }
967 
OsProcessAbnormalReap(struct UsbHostRequest * request,const UsbAdapterUrb * urb)968 static int32_t OsProcessAbnormalReap(struct UsbHostRequest *request, const UsbAdapterUrb *urb)
969 {
970     if (urb->actual_length > 0) {
971         unsigned char *target = request->buffer + request->actualLength;
972         if (urb->transfer_buffer != target) {
973             if (memmove_s(target, urb->actual_length, urb->transfer_buffer, urb->actual_length) != EOK) {
974                 DPRINTFN(0, "%s: memmove_s failed, ret=%d", __func__, ret);
975             }
976         }
977         request->actualLength += urb->actual_length;
978     }
979     if (request->numRetired == request->numUrbs) {
980         return HDF_SUCCESS;
981     }
982 
983     return HDF_ERR_IO;
984 }
985 
OsUrbStatusToRequestStatus(struct UsbHostRequest * request,const UsbAdapterUrb * urb)986 static int32_t OsUrbStatusToRequestStatus(struct UsbHostRequest *request, const UsbAdapterUrb *urb)
987 {
988     int32_t ret;
989 
990     switch (urb->status) {
991         case 0:
992             ret = HDF_SUCCESS;
993             break;
994         case -ESHUTDOWN:
995             DPRINTFN(0, "%s:%d device is removed", __func__, __LINE__);
996             request->reqStatus = USB_REQUEST_NO_DEVICE;
997             ret = HDF_DEV_ERR_NO_DEVICE;
998             break;
999         case -EPIPE:
1000             if (request->reqStatus == USB_REQUEST_COMPLETED) {
1001                 request->reqStatus = USB_REQUEST_STALL;
1002             }
1003             ret = HDF_DEV_ERR_NO_DEVICE;
1004             break;
1005         case -EOVERFLOW:
1006             DPRINTFN(0, "%s:%d overflow error, actualLength=%d\n", __func__, __LINE__, urb->actual_length);
1007             if (request->reqStatus == USB_REQUEST_COMPLETED) {
1008                 request->reqStatus = USB_REQUEST_OVERFLOW;
1009             }
1010             ret = HDF_FAILURE;
1011             break;
1012         case -ECONNRESET:
1013             ret = HDF_DEV_ERR_OP;
1014             if (request->reqStatus == USB_REQUEST_COMPLETED) {
1015                 request->reqStatus = USB_REQUEST_CANCELLED;
1016             }
1017             break;
1018         default:
1019             DPRINTFN(0, "unknown urb status %d\n", urb->status);
1020             if (request->reqStatus == USB_REQUEST_COMPLETED) {
1021                 request->reqStatus = USB_REQUEST_ERROR;
1022             }
1023             ret = HDF_FAILURE;
1024             break;
1025     }
1026 
1027     return ret;
1028 }
1029 
OsBulkCompletion(struct UsbHostRequest * const request,struct Async * const as)1030 static int32_t OsBulkCompletion(struct UsbHostRequest * const request, struct Async * const as)
1031 {
1032     int32_t ret;
1033     int32_t urbIdx = as - (struct Async *)request->urbs;
1034     const UsbAdapterUrb *urb = &as->urb;
1035 
1036     OsalMutexLock(&request->lock);
1037     request->numRetired++;
1038     if (request->reqStatus != USB_REQUEST_COMPLETED) {
1039         if (OsProcessAbnormalReap(request, urb) == HDF_SUCCESS) {
1040             goto COMPLETED;
1041         } else {
1042             goto OUT;
1043         }
1044     }
1045     request->actualLength += urb->actual_length;
1046     ret = OsUrbStatusToRequestStatus(request, urb);
1047     if (ret == HDF_DEV_ERR_NO_DEVICE) {
1048         goto CANCEL;
1049     } else if (ret == HDF_FAILURE) {
1050         goto COMPLETED;
1051     }
1052 
1053     if (request->numRetired == request->numUrbs) {
1054         goto COMPLETED;
1055     } else if (urb->actual_length < urb->transfer_buffer_length) {
1056         if (request->reqStatus == USB_REQUEST_COMPLETED) {
1057             request->reqStatus = USB_REQUEST_COMPLETED_SHORT;
1058         }
1059     } else {
1060         goto OUT;
1061     }
1062 
1063 CANCEL:
1064     if (request->numRetired == request->numUrbs) {
1065         goto COMPLETED;
1066     }
1067     OsDiscardUrbs(request, urbIdx + 1, request->numUrbs);
1068 
1069 OUT:
1070     OsalMutexUnlock(&request->lock);
1071     return HDF_SUCCESS;
1072 
1073 COMPLETED:
1074     OsalMutexUnlock(&request->lock);
1075     as->state = URB_INIT_STATE;
1076     return RawHandleRequestCompletion(request, request->reqStatus);
1077 }
1078 
OsFreeRequest(const struct UsbHostRequest * request)1079 static int32_t OsFreeRequest(const struct UsbHostRequest *request)
1080 {
1081     int32_t retry = 0;
1082     if (request == NULL) {
1083         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
1084         return HDF_ERR_INVALID_PARAM;
1085     }
1086 
1087     while (true) {
1088         OsalMSleep(SLEEP_TIME);
1089         if (request->numUrbs != request->numRetired) {
1090             if (++retry > REQ_NUM) {
1091                 DPRINTFN(0, "request busy numUrbs:%d+numretired:%d\n", request->numUrbs, request->numRetired);
1092                 return HDF_ERR_DEVICE_BUSY;
1093             }
1094             continue;
1095         } else {
1096             break;
1097         }
1098     }
1099 
1100     return HDF_SUCCESS;
1101 }
1102 
AdapterInit(const struct UsbSession * session)1103 static int32_t AdapterInit(const struct UsbSession *session)
1104 {
1105     (void)session;
1106     return HDF_SUCCESS;
1107 }
1108 
AdapterExit(const struct UsbSession * session)1109 static void AdapterExit(const struct UsbSession *session)
1110 {
1111     (void)session;
1112     return;
1113 }
1114 
AdapterOpenDevice(struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)1115 static struct UsbDeviceHandle *AdapterOpenDevice(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
1116 {
1117     int32_t ret;
1118     struct UsbDevice *dev = NULL;
1119     struct UsbDeviceHandle *handle = NULL;
1120 
1121     handle = OsGetDeviceHandle(session, busNum, usbAddr);
1122     if (handle != NULL) {
1123         return handle;
1124     }
1125     handle = OsCallocDeviceHandle();
1126     if (handle == NULL) {
1127         DPRINTFN(0, "%s: Calloc Device Handle failed", __func__);
1128         return NULL;
1129     }
1130     dev = OsAllocDevice(session, handle);
1131     if (dev == NULL) {
1132         DPRINTFN(0, "%s: OsAllocDevice failed\n", __func__);
1133         goto ERR;
1134     }
1135     ret = OsInitDevice(dev, busNum, usbAddr);
1136     if (ret) {
1137         DPRINTFN(0, "%s: OsInitDevice failed ret=%d\n", __func__, ret);
1138         RawUsbMemFree(dev);
1139         goto ERR;
1140     }
1141     OsalAtomicSet(&dev->refcnt, 1);
1142     OsalMutexLock(&session->lock);
1143     HdfSListAdd(&session->usbDevs, &dev->list);
1144     OsalMutexUnlock(&session->lock);
1145     return handle;
1146 ERR:
1147     OsalMutexDestroy(&handle->lock);
1148     RawUsbMemFree(handle);
1149     return NULL;
1150 }
1151 
AdapterCloseDevice(struct UsbDeviceHandle * handle)1152 static void AdapterCloseDevice(struct UsbDeviceHandle *handle)
1153 {
1154     struct UsbDevice *dev = NULL;
1155 
1156     if ((handle == NULL) || (handle->dev == NULL)) {
1157         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
1158         return;
1159     }
1160     if (RawKillSignal(handle, 0) != HDF_SUCCESS) {
1161         HDF_LOGE("%{public}s:%d RawKillSignal failed", __func__, __LINE__);
1162     }
1163     dev = handle->dev;
1164     if (AdapterAtomicDec(&dev->refcnt)) {
1165         return;
1166     }
1167     if (dev->session == NULL) {
1168         return;
1169     }
1170     OsalMutexLock(&dev->session->lock);
1171     HdfSListRemove(&dev->session->usbDevs, &dev->list);
1172     OsalMutexUnlock(&dev->session->lock);
1173 
1174     if (dev->configDescriptors) {
1175         RawUsbMemFree(dev->configDescriptors);
1176     }
1177     if (dev->descriptors) {
1178         RawUsbMemFree(dev->descriptors);
1179     }
1180     if (dev->privateData) {
1181         OsDevDestory(dev->privateData);
1182         dev->privateData = NULL;
1183     }
1184     RawUsbMemFree(dev);
1185 
1186     OsalMutexDestroy(&handle->lock);
1187     RawUsbMemFree(handle);
1188 }
1189 
AdapterGetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIndex,void * buffer,size_t len)1190 static int32_t AdapterGetConfigDescriptor(const struct UsbDevice *dev, uint8_t configIndex, void *buffer, size_t len)
1191 {
1192     struct OsDev *osDev = (struct OsDev *)dev->privateData;
1193     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1194     size_t count;
1195     if ((buffer == NULL) || (len == 0) || (adapterDevice == NULL) || (adapterDevice->cdesc == NULL)) {
1196         DPRINTFN(0, "invalid param is NULL");
1197         return HDF_ERR_INVALID_PARAM;
1198     }
1199     count = UGETW(adapterDevice->cdesc->wTotalLength);
1200     if (count > len) {
1201         DPRINTFN(0, "count length is error");
1202         return HDF_ERR_IO;
1203     }
1204     if (memcpy_s(buffer, len, adapterDevice->cdesc, count) != EOK) {
1205         DPRINTFN(0, "memcpy_s fail");
1206         return HDF_ERR_IO;
1207     }
1208     return (int32_t)len;
1209 }
1210 
AdapterGetConfiguration(const struct UsbDeviceHandle * handle,uint8_t * activeConfig)1211 static int32_t AdapterGetConfiguration(const struct UsbDeviceHandle *handle, uint8_t *activeConfig)
1212 {
1213     struct UsbDevice *dev = handle->dev;
1214     struct OsDev *osDev = (struct OsDev *)dev->privateData;
1215     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1216 
1217     if (adapterDevice != NULL) {
1218         *activeConfig = adapterDevice->curr_config_index;
1219     }
1220 
1221     return HDF_SUCCESS;
1222 }
1223 
AdapterSetConfiguration(struct UsbDeviceHandle * handle,int32_t activeConfig)1224 static int32_t AdapterSetConfiguration(struct UsbDeviceHandle *handle, int32_t activeConfig)
1225 {
1226     struct UsbDevice *dev = handle->dev;
1227     struct OsDev *osDev = (struct OsDev *)dev->privateData;
1228     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1229 
1230     if (adapterDevice->flags.usb_mode != USB_MODE_HOST) {
1231         return HDF_DEV_ERR_DEV_INIT_FAIL;
1232     }
1233     if ((activeConfig < 0) || (activeConfig >= (int)adapterDevice->curr_config_no)) {
1234         return HDF_ERR_INVALID_PARAM;
1235     }
1236     if (activeConfig == adapterDevice->curr_config_index) {
1237         return HDF_SUCCESS;
1238     }
1239     if (usbd_set_config_index(adapterDevice, activeConfig) != 0) {
1240         return HDF_ERR_IO;
1241     }
1242 
1243     return HDF_SUCCESS;
1244 }
1245 
AdapterClaimInterface(const struct UsbDeviceHandle * handle,unsigned int interfaceNumber)1246 static int32_t AdapterClaimInterface(const struct UsbDeviceHandle *handle, unsigned int interfaceNumber)
1247 {
1248     (void)handle;
1249     (void)interfaceNumber;
1250     return HDF_SUCCESS;
1251 }
1252 
AdapterReleaseInterface(const struct UsbDeviceHandle * handle,unsigned int interfaceNumber)1253 static int32_t AdapterReleaseInterface(const struct UsbDeviceHandle *handle, unsigned int interfaceNumber)
1254 {
1255     (void)handle;
1256     (void)interfaceNumber;
1257     return HDF_SUCCESS;
1258 }
1259 
AdapterSetInterface(const struct UsbDeviceHandle * handle,uint8_t interface,uint8_t altSetting)1260 static int32_t AdapterSetInterface(const struct UsbDeviceHandle *handle, uint8_t interface, uint8_t altSetting)
1261 {
1262     struct UsbDevice *dev = handle->dev;
1263     struct OsDev *osDev = (struct OsDev *)dev->privateData;
1264     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1265 
1266     if (adapterDevice->flags.usb_mode != USB_MODE_HOST) {
1267         return HDF_DEV_ERR_DEV_INIT_FAIL;
1268     }
1269     DPRINTFN(0, "altSetting interfaceId:%d+altSetting:%d\n", interface, altSetting);
1270     if (usb_set_interface(adapterDevice, interface, altSetting)) {
1271         return HDF_ERR_IO;
1272     }
1273 
1274     return HDF_SUCCESS;
1275 }
1276 
AdapterClearHalt(const struct UsbDeviceHandle * handle,unsigned int endPoint)1277 static int32_t AdapterClearHalt(const struct UsbDeviceHandle *handle, unsigned int endPoint)
1278 {
1279     struct UsbDevice *dev = handle->dev;
1280     struct OsDev *osDev = (struct OsDev *)dev->privateData;
1281     UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1282     int32_t ret;
1283     UsbAdapterHostEndpoint *uhe = usb_find_host_endpoint(adapterDevice, PIPE_BULK, endPoint);
1284     if (uhe == NULL) {
1285         printf("no found uhe\n");
1286         return -1;
1287     }
1288     ret = usb_clear_halt(adapterDevice, uhe);
1289     return ret;
1290 }
1291 
AdapterResetDevice(const struct UsbDeviceHandle * handle)1292 static int32_t AdapterResetDevice(const struct UsbDeviceHandle *handle)
1293 {
1294     (void)handle;
1295     return HDF_SUCCESS;
1296 }
1297 
AdapterAllocRequest(const struct UsbDeviceHandle * handle,int32_t isoPackets,size_t length)1298 static struct UsbHostRequest *AdapterAllocRequest(
1299     const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t length)
1300 {
1301     (void)handle;
1302     size_t allocSize;
1303     struct UsbHostRequest *request = NULL;
1304 
1305     allocSize = sizeof(struct UsbHostRequest) + (sizeof(struct UsbIsoPacketDesc) * (size_t)isoPackets) +
1306         (sizeof(unsigned char) * length);
1307     request = RawUsbMemCalloc(allocSize);
1308     if (request == NULL) {
1309         HDF_LOGE("%{public}s RawMemAlloc fail", __func__);
1310         return NULL;
1311     }
1312     request->numIsoPackets = isoPackets;
1313     request->buffer = (unsigned char *)request + allocSize - length;
1314     request->bufLen = (int)length;
1315     return request;
1316 }
1317 
AdapterFreeRequest(struct UsbHostRequest * request)1318 static int32_t AdapterFreeRequest(struct UsbHostRequest *request)
1319 {
1320     if (request == NULL) {
1321         DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
1322         return HDF_ERR_INVALID_PARAM;
1323     }
1324     if (request->numUrbs > request->numRetired) {
1325         OsDiscardUrbs(request, request->numRetired, request->numUrbs);
1326         int32_t ret = OsFreeRequest(request);
1327         if (ret != HDF_SUCCESS) {
1328             return ret;
1329         }
1330     }
1331     if (request->urbs) {
1332         RawUsbMemFree(request->urbs);
1333         request->urbs = NULL;
1334     }
1335     RawUsbMemFree((void *)request);
1336     return HDF_SUCCESS;
1337 }
1338 
AdapterSubmitRequest(struct UsbHostRequest * request)1339 static int32_t AdapterSubmitRequest(struct UsbHostRequest *request)
1340 {
1341     int32_t ret;
1342 
1343     if (request == NULL) {
1344         DPRINTFN(0, "%s:%d request is NULL", __func__, __LINE__);
1345         return HDF_FAILURE;
1346     }
1347     OsalMutexInit(&(request->lock));
1348     request->actualLength = 0;
1349     request->numRetired = 0;
1350     request->numUrbs = 0;
1351     switch (request->requestType) {
1352         case USB_REQUEST_TYPE_CONTROL:
1353             ret = OsSubmitControlRequest(request);
1354             break;
1355         case USB_REQUEST_TYPE_ISOCHRONOUS:
1356             ret = OsSubmitIsoRequest(request);
1357             break;
1358         case USB_REQUEST_TYPE_BULK:
1359         case USB_REQUEST_TYPE_INTERRUPT:
1360             ret = OsSubmitBulkRequest(request);
1361             break;
1362         default:
1363             DPRINTFN(0, "%s:%d unknown requestType=%u\n", __func__, __LINE__, request->requestType);
1364             ret = HDF_ERR_INVALID_PARAM;
1365             break;
1366     }
1367 
1368     return ret;
1369 }
1370 
AdapterCancelRequest(const struct UsbHostRequest * request)1371 static int32_t AdapterCancelRequest(const struct UsbHostRequest *request)
1372 {
1373     if (!request->urbs) {
1374         DPRINTFN(0, "adapter cancel urb null\n");
1375         goto END;
1376     }
1377 
1378     OsDiscardUrbs(request, 0, request->numUrbs);
1379 END:
1380     return HDF_SUCCESS;
1381 }
1382 
AdapterUrbCompleteHandle(const struct UsbDeviceHandle * devHandle)1383 static int32_t AdapterUrbCompleteHandle(const struct UsbDeviceHandle *devHandle)
1384 {
1385     int32_t ret;
1386     struct UsbDevice *dev = NULL;
1387     struct OsDev *osDev = NULL;
1388     UsbAdapterUrb *urb = NULL;
1389     struct Async *as = NULL;
1390     struct UsbHostRequest *request = NULL;
1391     if ((devHandle == NULL) || (devHandle->dev == NULL) || (devHandle->dev->privateData == NULL)) {
1392         HDF_LOGE("%{public}s:%d invalid parameter", __func__, __LINE__);
1393         return HDF_ERR_INVALID_PARAM;
1394     }
1395     dev = devHandle->dev;
1396     osDev = (struct OsDev *)dev->privateData;
1397     ret = OsReapUrb(devHandle, &as);
1398     if (as == NULL) {
1399         HDF_LOGE("as is null\n");
1400         return HDF_FAILURE;
1401     }
1402     urb = &as->urb;
1403     request = urb->context;
1404     switch (request->requestType) {
1405         case USB_REQUEST_TYPE_CONTROL:
1406             ret = OsControlCompletion(request, as);
1407             break;
1408         case USB_REQUEST_TYPE_ISOCHRONOUS:
1409             ret = OsIsoCompletion(request, as);
1410             break;
1411         case USB_REQUEST_TYPE_BULK:
1412         case USB_REQUEST_TYPE_INTERRUPT:
1413             ret = OsBulkCompletion(request, as);
1414             break;
1415         default:
1416             DPRINTFN(0, "%s:%d unrecognised requestType %u\n", __func__, __LINE__, request->requestType);
1417             ret = HDF_FAILURE;
1418             break;
1419     }
1420     return ret;
1421 }
1422 
1423 static struct UsbOsAdapterOps g_usbAdapter = {
1424     .init = AdapterInit,
1425     .exit = AdapterExit,
1426     .openDevice = AdapterOpenDevice,
1427     .closeDevice = AdapterCloseDevice,
1428     .getConfigDescriptor = AdapterGetConfigDescriptor,
1429     .getConfiguration = AdapterGetConfiguration,
1430     .setConfiguration = AdapterSetConfiguration,
1431     .claimInterface = AdapterClaimInterface,
1432     .releaseInterface = AdapterReleaseInterface,
1433     .setInterfaceAltsetting = AdapterSetInterface,
1434     .clearHalt = AdapterClearHalt,
1435     .resetDevice = AdapterResetDevice,
1436     .allocRequest = AdapterAllocRequest,
1437     .freeRequest = AdapterFreeRequest,
1438     .submitRequest = AdapterSubmitRequest,
1439     .cancelRequest = AdapterCancelRequest,
1440     .urbCompleteHandle = AdapterUrbCompleteHandle,
1441 };
1442 
UsbAdapterGetOps(void)1443 struct UsbOsAdapterOps *UsbAdapterGetOps(void)
1444 {
1445     return &g_usbAdapter;
1446 }
1447 
UsbAdapterGetTid(void)1448 UsbRawTidType UsbAdapterGetTid(void)
1449 {
1450     return HDF_FAILURE;
1451 }
1452 
UsbAdapterRegisterSignal(void)1453 int32_t UsbAdapterRegisterSignal(void)
1454 {
1455     return HDF_SUCCESS;
1456 }
1457 
UsbAdapterKillSignal(struct UsbDeviceHandle * handle,UsbRawTidType tid)1458 int32_t UsbAdapterKillSignal(struct UsbDeviceHandle *handle, UsbRawTidType tid)
1459 {
1460     if ((handle != NULL) && (handle->dev != NULL)) {
1461         struct UsbDevice *dev = handle->dev;
1462         struct OsDev *osDev = (struct OsDev *)dev->privateData;
1463         if (osDev != NULL) {
1464             g_CompleteExit = true;
1465             OsalSemPost(&osDev->cvWait);
1466             HDF_LOGD("%{public}s:%d signal post", __func__, __LINE__);
1467             return HDF_SUCCESS;
1468         } else {
1469             return HDF_FAILURE;
1470         }
1471     } else {
1472         return HDF_FAILURE;
1473     }
1474 }
1475 
AdapterAtomicInc(OsalAtomic * v)1476 int32_t AdapterAtomicInc(OsalAtomic *v)
1477 {
1478     int32_t valOld;
1479     int32_t val;
1480     uint32_t status = 0;
1481     Atomic *p = NULL;
1482     if (v) {
1483         p = (Atomic *)&(v)->counter;
1484     } else {
1485         return HDF_FAILURE;
1486     }
1487     do {
1488         __asm__ __volatile__("ldrex   %1, [%4]\n"
1489                              "mov   %0, %1\n"
1490                              "add   %1, %1, #1\n"
1491                              "strex   %2, %1, [%4]"
1492                              : "=&r"(valOld), "=&r"(val), "=&r"(status), "+m"(*p)
1493                              : "r"(p)
1494                              : "cc");
1495     } while (__builtin_expect(status != 0, 0));
1496 
1497     return valOld;
1498 }
1499 
AdapterAtomicDec(OsalAtomic * v)1500 int32_t AdapterAtomicDec(OsalAtomic *v)
1501 {
1502     if (v) {
1503         return LOS_AtomicDecRet((Atomic *)&(v)->counter);
1504     } else {
1505         return HDF_FAILURE;
1506     }
1507 }
1508