• 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 "linux_adapter.h"
17 #include <errno.h>
18 #include <fcntl.h>
19 #include <sys/ioctl.h>
20 #include <sys/mman.h>
21 #include <unistd.h>
22 #include <signal.h>
23 
24 #define HDF_LOG_TAG         USB_LINUX_ADAPTER
25 
26 #define PATH_LEN            24
27 #define DESC_READ_LEN       256
28 #define EP_NUM_MAX          30
29 
OsAdapterRealloc(void * ptr,size_t oldSize,size_t newSize)30 static void *OsAdapterRealloc(void *ptr, size_t oldSize, size_t newSize)
31 {
32     void *mem;
33 
34     mem = RawUsbMemAlloc(newSize);
35     if (mem == NULL) {
36         HDF_LOGE("%s:%d", __func__, __LINE__);
37         goto out;
38     }
39 
40     if (oldSize > 0) {
41         if (memmove_s(mem, newSize, ptr, oldSize) != HDF_SUCCESS) {
42             HDF_LOGE("%s:%d", __func__, __LINE__);
43             RawUsbMemFree(mem);
44             mem = NULL;
45             goto out;
46         }
47     }
48 
49     RawUsbMemFree(ptr);
50 out:
51     return mem;
52 }
53 
OsDeviceCompare(struct HdfSListNode * listEntry,uint32_t searchKey)54 static bool OsDeviceCompare(struct HdfSListNode *listEntry, uint32_t searchKey)
55 {
56     struct UsbDevice *dev = (struct UsbDevice *)listEntry;
57     if (dev == NULL) {
58         return false;
59     }
60 
61     if ((dev->busNum == (searchKey >> BUS_OFFSET)) &&
62         (dev->devAddr == (searchKey & 0xFF))) {
63         return true;
64     }
65 
66     return false;
67 }
68 
OsGetDeviceHandle(struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)69 static struct UsbDeviceHandle *OsGetDeviceHandle(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
70 {
71     struct UsbDevice *dev = NULL;
72     struct UsbDeviceHandle *handle = NULL;
73 
74     if (session == NULL) {
75         HDF_LOGE("%s:invalid param\n", __func__);
76         return NULL;
77     }
78 
79     OsalMutexLock(&session->lock);
80     dev = (struct UsbDevice *)HdfSListSearch(
81         &session->usbDevs, (busNum << BUS_OFFSET) | usbAddr, OsDeviceCompare);
82     if (dev != NULL) {
83         handle = dev->devHandle;
84         AdapterAtomicInc(&dev->refcnt);
85     }
86     OsalMutexUnlock(&session->lock);
87 
88     return handle;
89 }
90 
OsCallocDeviceHandle(void)91 static struct UsbDeviceHandle *OsCallocDeviceHandle(void)
92 {
93     struct UsbDeviceHandle *handle = NULL;
94 
95     handle = RawUsbMemCalloc(sizeof(*handle));
96     if (handle == NULL) {
97         HDF_LOGE("%s: allocate handle failed", __func__);
98         return NULL;
99     }
100 
101     OsalMutexInit(&handle->lock);
102 
103     return handle;
104 }
105 
OsAllocDevice(struct UsbSession * session,struct UsbDeviceHandle * handle)106 static struct UsbDevice *OsAllocDevice(struct UsbSession *session, struct UsbDeviceHandle *handle)
107 {
108     struct UsbDevice *dev = RawUsbMemCalloc(sizeof(*dev));
109     if (dev == NULL) {
110         HDF_LOGE("%s:%d no memory", __func__, __LINE__);
111         return NULL;
112     }
113 
114     dev->session = session;
115     dev->devHandle = handle;
116 
117     RawRequestListInit(dev);
118 
119     handle->dev = dev;
120 
121     return dev;
122 }
123 
OsGetUsbFd(struct UsbDevice * dev,mode_t mode)124 static int OsGetUsbFd(struct UsbDevice *dev, mode_t mode)
125 {
126     char path[PATH_LEN];
127     int fd = HDF_FAILURE;
128     int ret;
129 
130     if (dev == NULL) {
131         HDF_LOGE("%s: invalid param", __func__);
132         return HDF_ERR_INVALID_PARAM;
133     }
134 
135     ret = sprintf_s(path, sizeof(path), USB_DEV_FS_PATH "/%03u/%03u", dev->busNum, dev->devAddr);
136     if (ret < HDF_SUCCESS) {
137         HDF_LOGE("%s:%d path error", __func__, __LINE__);
138         return HDF_FAILURE;
139     }
140 
141     fd = open(path, mode | O_CLOEXEC);
142     if (fd != HDF_FAILURE) {
143         return fd;
144     }
145 
146     switch (errno) {
147         case ENOENT:
148             fd = open(path, mode | O_CLOEXEC);
149             if (fd != HDF_FAILURE) {
150                 return fd;
151             }
152             ret = HDF_DEV_ERR_NO_DEVICE;
153             break;
154         case EACCES:
155             ret = HDF_ERR_BAD_FD;
156             break;
157         default:
158             ret = HDF_FAILURE;
159             break;
160     }
161 
162     return ret;
163 }
164 
OsReadDescriptors(struct UsbDevice * dev)165 static int OsReadDescriptors(struct UsbDevice *dev)
166 {
167     int fd = dev->devHandle->fd;
168     size_t allocLen = 0;
169     uint8_t *ptr = NULL;
170     int len;
171 
172     do {
173         size_t oldLen = allocLen;
174         allocLen += DESC_READ_LEN;
175         dev->descriptors = OsAdapterRealloc(dev->descriptors, oldLen, allocLen);
176         if (!dev->descriptors) {
177             HDF_LOGE("%s:%d", __func__, __LINE__);
178             return HDF_ERR_MALLOC_FAIL;
179         }
180         ptr = (uint8_t *)dev->descriptors + dev->descriptorsLength;
181         memset_s(ptr, DESC_READ_LEN, 0, DESC_READ_LEN);
182 
183         len = read(fd, ptr, DESC_READ_LEN);
184         if (len < 0) {
185             HDF_LOGE("read descriptor failed, errno=%d", errno);
186             return HDF_ERR_IO;
187         }
188         dev->descriptorsLength += (size_t)len;
189     } while (dev->descriptorsLength == allocLen);
190 
191     return HDF_SUCCESS;
192 }
193 
OsParseConfigDescriptors(struct UsbDevice * dev)194 static int OsParseConfigDescriptors(struct UsbDevice *dev)
195 {
196     struct UsbDeviceDescriptor *deviceDesc = NULL;
197     uint8_t i;
198     uint8_t numConfigs;
199     uint8_t *buffer = NULL;
200     size_t descLen;
201 
202     deviceDesc = dev->descriptors;
203     numConfigs = deviceDesc->bNumConfigurations;
204     if (numConfigs == 0) {
205         return HDF_SUCCESS;
206     }
207     dev->configDescriptors = RawUsbMemAlloc(numConfigs * sizeof(struct UsbDeviceConfigDescriptor));
208     if (dev->configDescriptors == NULL) {
209         HDF_LOGE("%s:%d", __func__, __LINE__);
210         return HDF_ERR_MALLOC_FAIL;
211     }
212     buffer = (uint8_t *)dev->descriptors + USB_DDK_DT_DEVICE_SIZE;
213     descLen = dev->descriptorsLength - USB_DDK_DT_DEVICE_SIZE;
214 
215     for (i = 0; i < numConfigs; i++) {
216         struct UsbConfigDescriptor *configDesc = NULL;
217         uint16_t configLen;
218 
219         if (descLen < USB_DDK_DT_CONFIG_SIZE) {
220             HDF_LOGE("%s:%d read %zu", __func__, __LINE__, descLen);
221             return HDF_ERR_IO;
222         }
223         configDesc = (struct UsbConfigDescriptor *)buffer;
224         if ((configDesc->bDescriptorType != USB_DDK_DT_CONFIG) ||
225             (configDesc->bLength < USB_DDK_DT_CONFIG_SIZE)) {
226             HDF_LOGE("%s:%d config desc error: type 0x%02x, length %u",
227                 __func__, __LINE__, configDesc->bDescriptorType, configDesc->bLength);
228             return HDF_ERR_IO;
229         }
230         configLen = Le16ToCpu(configDesc->wTotalLength);
231         if (configLen < USB_DDK_DT_CONFIG_SIZE) {
232             HDF_LOGE("invalid wTotalLength value %u", configLen);
233             return HDF_ERR_IO;
234         }
235         if (configLen > descLen) {
236             HDF_LOGD("%s:%d read %zu/%u",
237                 __func__, __LINE__, descLen, configLen);
238             configLen = (uint16_t)descLen;
239         }
240         dev->configDescriptors[i].desc = configDesc;
241         dev->configDescriptors[i].actualLen = configLen;
242         buffer += configLen;
243         descLen -= configLen;
244     }
245     return HDF_SUCCESS;
246 }
247 
OsInitDevice(struct UsbDevice * dev,uint8_t busNum,uint8_t devAddr)248 static int OsInitDevice(struct UsbDevice *dev, uint8_t busNum, uint8_t devAddr)
249 {
250     struct UsbDeviceHandle *devHandle = dev->devHandle;
251     int fd;
252     int ret;
253 
254     dev->busNum = busNum;
255     dev->devAddr = devAddr;
256 
257     fd = OsGetUsbFd(dev, O_RDWR);
258     if (fd < 0) {
259         return fd;
260     }
261     devHandle->fd = fd;
262 
263     ret = ioctl(fd, USBDEVFS_GET_CAPABILITIES, &devHandle->caps);
264     if (ret < 0) {
265         HDF_LOGE("%s:%d get capabilities faild, errno=%d",
266             __func__, __LINE__, errno);
267         devHandle->caps = USB_ADAPTER_CAP_BULK_CONTINUATION;
268     }
269 
270     dev->descriptorsLength = 0;
271     ret = OsReadDescriptors(dev);
272     if (ret != HDF_SUCCESS) {
273         HDF_LOGE("%s:%d ret=%d", __func__, __LINE__, ret);
274         return ret;
275     }
276     ret = OsParseConfigDescriptors(dev);
277     if (ret != HDF_SUCCESS) {
278         HDF_LOGE("%s:%d ret=%d", __func__, __LINE__, ret);
279         return ret;
280     }
281     ret = memcpy_s(&dev->deviceDescriptor, sizeof(struct UsbDeviceDescriptor),
282         dev->descriptors, USB_DDK_DT_DEVICE_SIZE);
283     if (ret != HDF_SUCCESS) {
284         HDF_LOGE("%s:%d ret=%d", __func__, __LINE__, ret);
285         ret = HDF_ERR_IO;
286     }
287     return ret;
288 }
289 
OsGetActiveConfig(struct UsbDevice * dev,int fd)290 static int OsGetActiveConfig(struct UsbDevice *dev, int fd)
291 {
292     int ret;
293     uint8_t activeConfig = 0;
294     struct UsbControlRequestData ctrlData;
295 
296     if (dev == NULL) {
297         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
298         return HDF_ERR_INVALID_PARAM;
299     }
300 
301     ctrlData.requestType = USB_PIPE_DIRECTION_IN,
302     ctrlData.requestCmd = USB_REQUEST_GET_CONFIGURATION,
303     ctrlData.value = 0,
304     ctrlData.index = 0,
305     ctrlData.length = 1,
306     ctrlData.timeout = USB_RAW_REQUEST_DEFAULT_TIMEOUT,
307     ctrlData.data = &activeConfig;
308 
309     ret = ioctl(fd, USBDEVFS_CONTROL, &ctrlData);
310     if (ret < 0) {
311         HDF_LOGE("%s:%d errno=%d", __func__, __LINE__, errno);
312         return HDF_FAILURE;
313     }
314     dev->activeConfig = activeConfig;
315 
316     return HDF_SUCCESS;
317 }
318 
OsFreeIsoUrbs(struct UsbHostRequest * request)319 static void OsFreeIsoUrbs(struct UsbHostRequest *request)
320 {
321     struct UsbAdapterUrb *urb = NULL;
322 
323     for (int i = 0; i < request->numUrbs; i++) {
324         urb = request->isoUrbs[i];
325         if (urb == NULL) {
326             break;
327         }
328         RawUsbMemFree(urb);
329     }
330 
331     RawUsbMemFree(request->isoUrbs);
332     request->isoUrbs = NULL;
333 }
334 
OsDiscardUrbs(struct UsbHostRequest * request,int first,int last)335 static void OsDiscardUrbs(struct UsbHostRequest *request, int first, int last)
336 {
337     struct UsbAdapterUrb *urb = NULL;
338 
339     if ((request == NULL) || (request->devHandle == NULL) ||
340         (first > URBS_PER_REQUEST) || (first > last)) {
341         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
342         return;
343     }
344 
345     for (int i = last - 1; i >= first; i--) {
346         if (request->requestType == USB_REQUEST_TYPE_ISOCHRONOUS) {
347             urb = request->isoUrbs[i];
348         } else {
349             urb = &request->urbs[i];
350         }
351         if (ioctl(request->devHandle->fd, USBDEVFS_DISCARDURB, urb) == 0) {
352             continue;
353         }
354     }
355 }
356 
OsSubmitControlRequest(struct UsbHostRequest * request)357 static int OsSubmitControlRequest(struct UsbHostRequest *request)
358 {
359     struct UsbAdapterUrb *urb = NULL;
360     int ret;
361     int fd;
362 
363     if ((request == NULL) || (request->length  > MAX_BULK_DATA_BUFFER_LENGTH) ||
364         (request->devHandle == NULL)) {
365         HDF_LOGD("%s:%d invalid param", __func__, __LINE__);
366         return HDF_ERR_INVALID_PARAM;
367     }
368 
369     fd = request->devHandle->fd;
370     urb = RawUsbMemCalloc(sizeof(*urb));
371     if (urb == NULL) {
372         return HDF_ERR_MALLOC_FAIL;
373     }
374 
375     urb->type = USB_ADAPTER_URB_TYPE_CONTROL;
376     urb->endPoint = request->endPoint;
377     urb->buffer = request->buffer;
378     urb->bufferLength = request->length;
379     urb->userContext = request;
380     request->urbs = urb;
381     request->numUrbs = 1;
382 
383     ret = ioctl(fd, USBDEVFS_SUBMITURB, urb);
384     if (ret < 0) {
385         HDF_LOGE("submiturb failed, errno=%d", errno);
386         RawUsbMemFree(urb);
387         request->urbs = NULL;
388         if (errno == ENODEV) {
389             return HDF_DEV_ERR_NO_DEVICE;
390         }
391         return HDF_ERR_IO;
392     }
393     return HDF_SUCCESS;
394 }
395 
OsSubmitBulkRequestHandleUrb(struct UsbHostRequest * request,struct UsbAdapterUrb * urb,int bulkBufferLen,int number)396 static int OsSubmitBulkRequestHandleUrb(struct UsbHostRequest *request, struct UsbAdapterUrb *urb,
397     int bulkBufferLen, int number)
398 {
399     if (bulkBufferLen == 0) {
400         HDF_LOGE("%s:%d bulkBufferLen can not be zero", __func__, __LINE__);
401         return HDF_ERR_INVALID_PARAM;
402     }
403 
404     urb->userContext = (void *)request;
405     switch (request->requestType) {
406         case USB_REQUEST_TYPE_BULK:
407             urb->type = USB_ADAPTER_URB_TYPE_BULK;
408             break;
409         case USB_REQUEST_TYPE_INTERRUPT:
410             urb->type = USB_ADAPTER_URB_TYPE_INTERRUPT;
411             break;
412         default:
413             HDF_LOGE("%s:%d unknown requestType=%u", __func__, __LINE__, request->requestType);
414             return HDF_ERR_INVALID_PARAM;
415     }
416     urb->endPoint = request->endPoint;
417     urb->buffer = request->buffer + (number * bulkBufferLen);
418     if (number == request->numUrbs - 1) {
419         uint32_t len = request->length % bulkBufferLen;
420         urb->bufferLength = (len == 0) ? bulkBufferLen : len;
421     } else {
422         urb->bufferLength = bulkBufferLen;
423     }
424 
425     return HDF_SUCCESS;
426 }
427 
OsSubmitBulkRequestHandle(struct UsbHostRequest * request,struct UsbAdapterUrb * urbs,int bulkBufferLen)428 static int OsSubmitBulkRequestHandle(struct UsbHostRequest *request, struct UsbAdapterUrb *urbs, int bulkBufferLen)
429 {
430     struct UsbAdapterUrb *urb = NULL;
431     int fd = request->devHandle->fd;
432     int numUrbs = request->numUrbs;
433     int i;
434     int ret;
435 
436     for (i = 0; i < numUrbs; i++) {
437         urb = &urbs[i];
438         ret = OsSubmitBulkRequestHandleUrb(request, urb, bulkBufferLen, i);
439         if (ret != HDF_SUCCESS) {
440             return ret;
441         }
442 
443         ret = ioctl(fd, USBDEVFS_SUBMITURB, urb);
444         if (ret == 0) {
445             continue;
446         }
447 
448         if (i == 0) {
449             HDF_LOGE("submitUrb: ret=%d errno=%d \
450                 urb->bufferLength=%d urb->buffer=%p urb->endPoint=%d urb->type=%d",
451                 ret, errno,urb->bufferLength, urb->buffer, urb->endPoint, urb->type);
452             return HDF_ERR_IO;
453         }
454         request->numRetired += numUrbs - i;
455         if (errno != EREMOTEIO) {
456             request->reqStatus = USB_REQUEST_ERROR;
457         }
458 
459         return HDF_SUCCESS;
460     }
461 
462     return HDF_SUCCESS;
463 }
464 
OsSubmitBulkRequest(struct UsbHostRequest * request)465 static int OsSubmitBulkRequest(struct UsbHostRequest *request)
466 {
467     struct UsbAdapterUrb *urbs = NULL;
468     int bulkBufferLen;
469     int numUrbs;
470 
471     if (request == NULL) {
472         HDF_LOGE("%s: invalid param", __func__);
473         return HDF_ERR_INVALID_PARAM;
474     }
475 
476     if (request->length > MAX_BULK_DATA_BUFFER_LENGTH || request->length <= 0) {
477         HDF_LOGE("Bulk request size err");
478         return -1;
479     }
480 
481     if (request->devHandle->caps & USB_ADAPTER_CAP_BULK_SCATTER_GATHER) {
482         bulkBufferLen = request->length ? request->length : 1;
483     } else if (request->devHandle->caps & USB_ADAPTER_CAP_BULK_CONTINUATION) {
484         bulkBufferLen = MAX_BULK_DATA_BUFFER_LENGTH;
485     } else if (request->devHandle->caps & USB_ADAPTER_CAP_NO_PACKET_SIZE_LIM) {
486         bulkBufferLen = request->length ? request->length : 1;
487     } else {
488         bulkBufferLen = MAX_BULK_DATA_BUFFER_LENGTH;
489     }
490     numUrbs = request->length / bulkBufferLen;
491     if (request->length == 0) {
492         numUrbs = 1;
493     } else if ((request->length % bulkBufferLen) > 0) {
494         numUrbs++;
495     }
496 
497     if (numUrbs != 1) {
498         urbs = RawUsbMemCalloc(numUrbs * sizeof(*urbs));
499         if (request->bulkUrb) {
500             RawUsbMemFree(request->bulkUrb);
501         }
502         request->bulkUrb = urbs;
503         request->urbs = NULL;
504     } else {
505         urbs = request->bulkUrb;
506     }
507 
508     if (urbs == NULL) {
509         HDF_LOGE("%s:%d no mem", __func__, __LINE__);
510         return HDF_ERR_MALLOC_FAIL;
511     }
512     request->urbs       = urbs;
513     request->numUrbs    = numUrbs;
514     request->numRetired = 0;
515     request->reqStatus = USB_REQUEST_COMPLETED;
516 
517     return OsSubmitBulkRequestHandle(request, urbs, bulkBufferLen);
518 }
519 
OsAllocIsoUrbs(struct UsbHostRequest * request,int numUrbs,struct UsbAdapterUrb ** urbs)520 static int OsAllocIsoUrbs(struct UsbHostRequest *request, int numUrbs, struct UsbAdapterUrb **urbs)
521 {
522     struct UsbAdapterUrb *urb = NULL;
523     void *urbBuffer = (void *)request->buffer;
524     int numPacketsLeft = request->numIsoPackets;
525     int packetIdx = 0;
526     int i, j;
527 
528     for (i = 0; i < numUrbs; i++) {
529         int numPackets = MIN(numPacketsLeft, MAX_ISO_PACKETS_PER_URB);
530         urb = RawUsbMemCalloc(sizeof(struct UsbAdapterUrb));
531         if (urb == NULL) {
532             OsFreeIsoUrbs(request);
533             return HDF_ERR_MALLOC_FAIL;
534         }
535         urbs[i] = urb;
536 
537         for (j = 0; j < numPackets; j++) {
538             unsigned int packetLen = request->isoPacketDesc[packetIdx++].length;
539             urb->bufferLength += packetLen;
540             urb->isoFrameDesc[j].length = packetLen;
541         }
542         urb->type = USB_ADAPTER_URB_TYPE_ISO;
543         urb->flags = USB_ADAPTER_URB_ISO_ASAP;
544         urb->endPoint = request->endPoint;
545         urb->numberOfPackets = numPackets;
546         urb->buffer = urbBuffer;
547         urb->userContext = request;
548         urbBuffer += urb->bufferLength;
549         numPacketsLeft -= numPackets;
550     }
551 
552     return HDF_SUCCESS;
553 }
554 
OsSubmitIsoUrbs(struct UsbHostRequest * request,int numUrbs,struct UsbAdapterUrb ** pUrbs)555 static int OsSubmitIsoUrbs(struct UsbHostRequest *request, int numUrbs, struct UsbAdapterUrb **pUrbs)
556 {
557     int i;
558     int ret;
559 
560     for (i = 0; i < numUrbs; i++) {
561         ret = ioctl(request->devHandle->fd, USBDEVFS_SUBMITURB, *pUrbs[i]);
562         if (ret == 0) {
563             continue;
564         }
565 
566         if (errno == ENODEV) {
567             ret = HDF_DEV_ERR_NO_DEVICE;
568         } else {
569             HDF_LOGE("%s:%d submit iso urb failed errno=%d", __func__, __LINE__, errno);
570             ret = HDF_ERR_IO;
571         }
572 
573         if (i == 0) {
574             HDF_LOGE("first URB failed");
575             OsFreeIsoUrbs(request);
576             return ret;
577         }
578         request->reqStatus = USB_REQUEST_ERROR;
579         request->numRetired += numUrbs - i;
580         if (request->numRetired == numUrbs) {
581             RawUsbMemFree(pUrbs);
582             request->urbs = NULL;
583         }
584         break;
585     }
586 
587     return HDF_SUCCESS;
588 }
589 
OsSubmitIsoRequest(struct UsbHostRequest * request)590 static int OsSubmitIsoRequest(struct UsbHostRequest *request)
591 {
592     struct UsbAdapterUrb **pUrbs = NULL;
593     int numUrbs;
594     unsigned int packetLen;
595     unsigned int totalLen = 0;
596     int ret;
597 
598     if ((request == NULL) || (request->devHandle == NULL) || (request->numIsoPackets < 1)) {
599         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
600         return HDF_ERR_INVALID_PARAM;
601     }
602 
603     if (request->length > MAX_ISO_DATA_BUFFER_LEN) {
604         HDF_LOGE("%s:%d request length exceed the maximum", __func__, __LINE__);
605         return -1;
606     }
607 
608     for (int i = 0; i < request->numIsoPackets; i++) {
609         packetLen = request->isoPacketDesc[i].length;
610         if (packetLen > MAX_ISO_DATA_BUFFER_LEN) {
611             HDF_LOGE("%s:%d packet length: %u exceeds maximum: %u",
612                 __func__, __LINE__, packetLen, MAX_ISO_DATA_BUFFER_LEN);
613             return HDF_ERR_INVALID_PARAM;
614         }
615         totalLen += packetLen;
616     }
617     if (request->length < (int)totalLen) {
618         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
619         return HDF_ERR_INVALID_PARAM;
620     }
621     numUrbs = (request->numIsoPackets + (MAX_ISO_PACKETS_PER_URB - 1)) / MAX_ISO_PACKETS_PER_URB;
622     pUrbs = RawUsbMemCalloc(numUrbs * sizeof(struct UsbAdapterUrb*));
623     if (pUrbs == NULL) {
624         HDF_LOGE("%s:%d RawUsbMemCalloc pUrbs failed", __func__, __LINE__);
625         return HDF_ERR_MALLOC_FAIL;
626     }
627     request->isoUrbs = (void **)pUrbs;
628     request->numUrbs = numUrbs;
629     request->numRetired = 0;
630     request->isoPacketOffset = 0;
631     ret = OsAllocIsoUrbs(request, numUrbs, pUrbs);
632     if (ret != HDF_SUCCESS) {
633         HDF_LOGE("%s:%d alloc iso urbs failed", __func__, __LINE__);
634         return ret;
635     }
636 
637     return OsSubmitIsoUrbs(request, numUrbs, pUrbs);
638 }
639 
OsControlCompletion(struct UsbHostRequest * request,struct UsbAdapterUrb * urb)640 static int OsControlCompletion(struct UsbHostRequest *request, struct UsbAdapterUrb *urb)
641 {
642     int status;
643 
644     request->actualLength += urb->actualLength;
645     if (request->reqStatus == USB_REQUEST_CANCELLED) {
646         RawUsbMemFree(request->urbs);
647         request->urbs = NULL;
648         return RawHandleRequestCompletion(request, USB_REQUEST_CANCELLED);
649     }
650 
651     switch (urb->status) {
652         case 0:
653             status = USB_REQUEST_COMPLETED;
654             break;
655         case -ENOENT:
656             status = USB_REQUEST_CANCELLED;
657             break;
658         case -EPIPE:
659             status = USB_REQUEST_STALL;
660             break;
661         case -EOVERFLOW:
662             status = USB_REQUEST_OVERFLOW;
663             break;
664         case -ENODEV:
665         case -ESHUTDOWN:
666             status = USB_REQUEST_NO_DEVICE;
667             break;
668         default:
669             status = USB_REQUEST_ERROR;
670             break;
671     }
672     RawUsbMemFree(request->urbs);
673     request->urbs = NULL;
674     return RawHandleRequestCompletion(request, status);
675 }
676 
OsIsoRequestDesStatus(struct UsbHostRequest * request,struct UsbAdapterUrb * urb)677 static void OsIsoRequestDesStatus(struct UsbHostRequest *request, struct UsbAdapterUrb *urb)
678 {
679     int i;
680     struct UsbIsoPacketDesc *urbDesc = NULL;
681     struct UsbIsoPacketDesc *requestDesc = NULL;
682 
683     for (i = 0; i < urb->numberOfPackets; i++) {
684         urbDesc = &urb->isoFrameDesc[i];
685         requestDesc = &request->isoPacketDesc[request->isoPacketOffset++];
686 
687         switch (urbDesc->status) {
688             case HDF_SUCCESS:
689                 requestDesc->status = USB_REQUEST_COMPLETED;
690                 break;
691             case -ENODEV:
692             case -ESHUTDOWN:
693                 requestDesc->status = USB_REQUEST_NO_DEVICE;
694                 break;
695             case -EPIPE:
696                 requestDesc->status = USB_REQUEST_STALL;
697                 break;
698             case -EOVERFLOW:
699                 requestDesc->status = USB_REQUEST_OVERFLOW;
700                 break;
701             default:
702                 requestDesc->status = USB_REQUEST_ERROR;
703                 break;
704         }
705 
706         requestDesc->actualLength = urbDesc->actualLength;
707     }
708 }
709 
OsIsoCompletion(struct UsbHostRequest * request,struct UsbAdapterUrb * urb)710 static int OsIsoCompletion(struct UsbHostRequest *request, struct UsbAdapterUrb *urb)
711 {
712     UsbRequestStatus status;
713     int urbIndex = 0;
714     int numUrbs;
715 
716     if (request == NULL) {
717         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
718         return HDF_ERR_INVALID_PARAM;
719     }
720 
721     numUrbs = request->numUrbs;
722 
723     for (int i = 0; i < numUrbs; i++) {
724         if (urb == request->isoUrbs[i]) {
725             urbIndex = i + 1;
726             break;
727         }
728     }
729     if (urbIndex == 0) {
730         HDF_LOGE("%s:%d urbIndex is zero", __func__, __LINE__);
731         return HDF_ERR_BAD_FD;
732     }
733 
734     OsIsoRequestDesStatus(request, urb);
735     request->numRetired++;
736     if  (request->reqStatus != USB_REQUEST_COMPLETED) {
737         HDF_LOGE("%s:%d urb status=%d", __func__, __LINE__, urb->status);
738         if (request->numRetired == numUrbs) {
739             OsFreeIsoUrbs(request);
740             return RawHandleRequestCompletion(request, USB_REQUEST_ERROR);
741         }
742         goto out;
743     }
744 
745     if (urb->status == -ESHUTDOWN) {
746         status = USB_REQUEST_NO_DEVICE;
747     } else if (!((urb->status == HDF_SUCCESS) || (urb->status == -ENOENT) ||
748                  (urb->status == -ECONNRESET))) {
749         status = USB_REQUEST_ERROR;
750     } else {
751         status = USB_REQUEST_COMPLETED;
752     }
753 
754     if (request->numRetired == numUrbs) {
755         OsFreeIsoUrbs(request);
756         return RawHandleRequestCompletion(request, status);
757     }
758 out:
759     return 0;
760 }
761 
OsProcessAbnormalReap(struct UsbHostRequest * request,const struct UsbAdapterUrb * urb)762 static int OsProcessAbnormalReap(struct UsbHostRequest *request, const struct UsbAdapterUrb *urb)
763 {
764     int32_t ret;
765 
766     if (urb->actualLength > 0) {
767         unsigned char *target = request->buffer + request->actualLength;
768         if (urb->buffer != target) {
769             ret = memmove_s(target, urb->actualLength, urb->buffer, urb->actualLength);
770             if (ret) {
771                 HDF_LOGE("%s: memmove_s failed", __func__);
772             }
773         }
774         request->actualLength += urb->actualLength;
775     }
776     if (request->numRetired == request->numUrbs) {
777         return HDF_SUCCESS;
778     }
779 
780     return HDF_ERR_IO;
781 }
782 
OsUrbStatusToRequestStatus(struct UsbHostRequest * request,const struct UsbAdapterUrb * urb)783 static int OsUrbStatusToRequestStatus(struct UsbHostRequest *request, const struct UsbAdapterUrb *urb)
784 {
785     int ret;
786 
787     switch (urb->status) {
788         case 0:
789             ret = HDF_SUCCESS;
790             break;
791         case -ESHUTDOWN:
792             request->reqStatus = USB_REQUEST_NO_DEVICE;
793             ret = HDF_DEV_ERR_NO_DEVICE;
794             break;
795         case -EPIPE:
796             if (request->reqStatus == USB_REQUEST_COMPLETED) {
797                 request->reqStatus = USB_REQUEST_STALL;
798             }
799             ret = HDF_DEV_ERR_NO_DEVICE;
800             break;
801         case -EOVERFLOW:
802             if (request->reqStatus == USB_REQUEST_COMPLETED) {
803                 request->reqStatus = USB_REQUEST_OVERFLOW;
804             }
805             ret = HDF_FAILURE;
806             break;
807         default:
808             if (request->reqStatus == USB_REQUEST_COMPLETED) {
809                 request->reqStatus = USB_REQUEST_ERROR;
810             }
811             ret = HDF_DEV_ERR_NO_DEVICE;
812             break;
813     }
814 
815     return ret;
816 }
817 
OsBulkCompletion(struct UsbHostRequest * request,const struct UsbAdapterUrb * urb)818 static int OsBulkCompletion(struct UsbHostRequest *request,
819     const struct UsbAdapterUrb *urb)
820 {
821     int ret;
822     int urbIdx = urb - (struct UsbAdapterUrb *)request->urbs;
823 
824     request->numRetired++;
825     if (request->reqStatus != USB_REQUEST_COMPLETED) {
826         if (OsProcessAbnormalReap(request, urb) == HDF_SUCCESS) {
827             goto completed;
828         } else {
829             goto out;
830         }
831     }
832     request->actualLength += urb->actualLength;
833 
834     ret = OsUrbStatusToRequestStatus(request, urb);
835     if (ret == HDF_DEV_ERR_NO_DEVICE) {
836         goto cancel;
837     } else if (ret == HDF_FAILURE) {
838         goto completed;
839     }
840 
841     if (request->numRetired == request->numUrbs) {
842         goto completed;
843     } else if (urb->actualLength < urb->bufferLength) {
844         if (request->reqStatus == USB_REQUEST_COMPLETED) {
845             request->reqStatus = USB_REQUEST_COMPLETED_SHORT;
846         }
847     } else {
848         goto out;
849     }
850 
851 cancel:
852     if (request->numRetired == request->numUrbs) {
853         goto completed;
854     }
855     OsDiscardUrbs(request, urbIdx + 1, request->numUrbs);
856 out:
857     return HDF_SUCCESS;
858 completed:
859     return RawHandleRequestCompletion(request, request->reqStatus);
860 }
861 
AdapterInit(const struct UsbSession * session)862 static int AdapterInit(const struct UsbSession *session)
863 {
864     return HDF_SUCCESS;
865 }
866 
AdapterExit(const struct UsbSession * session)867 static void AdapterExit(const struct UsbSession *session)
868 {
869     return;
870 }
871 
AdapterOpenDevice(struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)872 static struct UsbDeviceHandle *AdapterOpenDevice(struct UsbSession *session, uint8_t busNum,  uint8_t usbAddr)
873 {
874     int ret;
875     struct UsbDevice *dev = NULL;
876     struct UsbDeviceHandle *handle = NULL;
877 
878     handle = OsGetDeviceHandle(session, busNum, usbAddr);
879     if (handle != NULL) {
880         return handle;
881     }
882 
883     handle = OsCallocDeviceHandle();
884     if (handle == NULL) {
885         return NULL;
886     }
887 
888     dev = OsAllocDevice(session, handle);
889     if (dev == NULL) {
890         goto err;
891     }
892 
893     ret = OsInitDevice(dev, busNum, usbAddr);
894     if (ret) {
895         RawUsbMemFree(dev);
896         goto err;
897     }
898 
899     OsalAtomicSet(&dev->refcnt, 1);
900     /* add the new device to the device list on session */
901     OsalMutexLock(&session->lock);
902     HdfSListAdd(&session->usbDevs, &dev->list);
903     OsalMutexUnlock(&session->lock);
904 
905     return handle;
906 
907 err:
908     OsalMutexDestroy(&handle->lock);
909     RawUsbMemFree(handle);
910     return NULL;
911 }
912 
AdapterCloseDevice(struct UsbDeviceHandle * handle)913 static void AdapterCloseDevice(struct UsbDeviceHandle *handle)
914 {
915     struct UsbDevice *dev = NULL;
916 
917     if ((handle == NULL) || (handle->dev == NULL)) {
918         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
919         return;
920     }
921 
922     dev = handle->dev;
923     if (AdapterAtomicDec(&dev->refcnt) > 0) {
924         return;
925     }
926 
927     OsalMutexLock(&dev->session->lock);
928     HdfSListRemove(&dev->session->usbDevs, &dev->list);
929     OsalMutexUnlock(&dev->session->lock);
930 
931     if (dev->configDescriptors) {
932         RawUsbMemFree(dev->configDescriptors);
933     }
934     if (dev->descriptors) {
935         RawUsbMemFree(dev->descriptors);
936     }
937     RawUsbMemFree(dev);
938 
939     close(handle->fd);
940     OsalMutexDestroy(&handle->lock);
941     RawUsbMemFree(handle);
942 }
943 
AdapterGetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIndex,void * buffer,size_t len)944 static int AdapterGetConfigDescriptor(const struct UsbDevice *dev,
945     uint8_t configIndex, void *buffer, size_t len)
946 {
947     struct UsbDeviceConfigDescriptor *config = NULL;
948     uint8_t i;
949 
950     if ((dev == NULL) || (buffer == NULL) ||
951         (configIndex > dev->deviceDescriptor.bNumConfigurations)) {
952         HDF_LOGE("%s:%d configIndex=%d-%d",
953             __func__, __LINE__, configIndex, dev->deviceDescriptor.bNumConfigurations);
954         return HDF_ERR_INVALID_PARAM;
955     }
956 
957     for (i = 0; i < dev->deviceDescriptor.bNumConfigurations; i++) {
958         if (configIndex == dev->configDescriptors[i].desc->bConfigurationValue) {
959             config = &dev->configDescriptors[i];
960             break;
961         }
962     }
963 
964     if (config == NULL) {
965         HDF_LOGE("%s:%d config is NULL", __func__, __LINE__);
966         return HDF_ERR_BAD_FD;
967     }
968 
969     len = MIN(len, config->actualLen);
970     if (memcpy_s(buffer, len, config->desc, len) != EOK) {
971         HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__);
972         return HDF_ERR_IO;
973     }
974 
975     return len;
976 }
977 
AdapterGetConfiguration(const struct UsbDeviceHandle * handle,uint8_t * activeConfig)978 static int AdapterGetConfiguration(const struct UsbDeviceHandle *handle, uint8_t *activeConfig)
979 {
980     if ((handle == NULL) || (activeConfig == NULL) || (handle->dev == NULL)) {
981         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
982         return HDF_ERR_INVALID_PARAM;
983     }
984 
985     int ret = OsGetActiveConfig(handle->dev, handle->fd);
986     if (ret != HDF_SUCCESS) {
987         return ret;
988     }
989 
990     *activeConfig = handle->dev->activeConfig;
991     if (*activeConfig == 0) {
992         HDF_LOGD("%s:%d activeConfig is zero", __func__, __LINE__);
993     }
994 
995     return HDF_SUCCESS;
996 }
997 
AdapterSetConfiguration(struct UsbDeviceHandle * handle,int activeConfig)998 static int AdapterSetConfiguration(struct UsbDeviceHandle *handle, int activeConfig)
999 {
1000     int ret;
1001 
1002     if ((handle == NULL) || (handle->dev == NULL)) {
1003         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1004         return HDF_ERR_INVALID_PARAM;
1005     }
1006 
1007     ret = ioctl(handle->fd, USBDEVFS_SETCONFIGURATION, &activeConfig);
1008     if (ret < 0) {
1009         HDF_LOGE("%s:%d set config failed errno=%d", __func__, __LINE__, errno);
1010         return HDF_FAILURE;
1011     }
1012     if (activeConfig == HDF_FAILURE) {
1013         activeConfig = 0;
1014     }
1015     handle->dev->activeConfig = (uint8_t)activeConfig;
1016 
1017     return HDF_SUCCESS;
1018 }
1019 
AdapterClaimInterface(const struct UsbDeviceHandle * handle,unsigned int interfaceNumber)1020 static int AdapterClaimInterface(const struct UsbDeviceHandle *handle, unsigned int interfaceNumber)
1021 {
1022     int ret;
1023 
1024     if (handle == NULL) {
1025         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1026         return HDF_ERR_INVALID_PARAM;
1027     }
1028 
1029     ret = ioctl(handle->fd, USBDEVFS_CLAIMINTERFACE, &interfaceNumber);
1030     if (ret < 0) {
1031         HDF_LOGE("%s;%d claim failed errno=%d", __func__, __LINE__, errno);
1032         return HDF_FAILURE;
1033     }
1034 
1035     return HDF_SUCCESS;
1036 }
1037 
AdapterReleaseInterface(const struct UsbDeviceHandle * handle,unsigned int interfaceNumber)1038 static int AdapterReleaseInterface(const struct UsbDeviceHandle *handle, unsigned int interfaceNumber)
1039 {
1040     int ret;
1041 
1042     if (handle == NULL) {
1043         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1044         return HDF_ERR_INVALID_PARAM;
1045     }
1046 
1047     ret = ioctl(handle->fd, USBDEVFS_RELEASEINTERFACE, &interfaceNumber);
1048     if (ret < 0) {
1049         HDF_LOGE("%s:%d release failed errno=%d", __func__, __LINE__, errno);
1050         if (errno == ENODEV) {
1051             return HDF_DEV_ERR_NO_DEVICE;
1052         }
1053         return HDF_FAILURE;
1054     }
1055 
1056     return HDF_SUCCESS;
1057 }
1058 
AdapterSetInterface(const struct UsbDeviceHandle * handle,uint8_t interface,uint8_t altSetting)1059 static int AdapterSetInterface(const struct UsbDeviceHandle *handle, uint8_t interface, uint8_t altSetting)
1060 {
1061     struct UsbAdapterSetInterface setIntf;
1062     int ret;
1063 
1064     if (handle == NULL) {
1065         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1066         return HDF_ERR_INVALID_PARAM;
1067     }
1068 
1069     setIntf.interface = interface;
1070     setIntf.altSetting = altSetting;
1071     ret = ioctl(handle->fd, USBDEVFS_SETINTERFACE, &setIntf);
1072     if (ret < 0) {
1073         HDF_LOGE("%s:%d set interface failed errno=%d", __func__, __LINE__, errno);
1074         return HDF_FAILURE;
1075     }
1076 
1077     return HDF_SUCCESS;
1078 }
1079 
AdapterClearHalt(const struct UsbDeviceHandle * handle,unsigned int endPoint)1080 static int AdapterClearHalt(const struct UsbDeviceHandle *handle, unsigned int endPoint)
1081 {
1082     int ret;
1083 
1084     if (handle == NULL) {
1085         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1086         return HDF_ERR_INVALID_PARAM;
1087     }
1088 
1089     ret = ioctl(handle->fd, USBDEVFS_CLEAR_HALT, &endPoint);
1090     if (ret < 0) {
1091         HDF_LOGE("%s:%d clear halt failed errno=%d", __func__, __LINE__, errno);
1092         return HDF_FAILURE;
1093     }
1094 
1095     return HDF_SUCCESS;
1096 }
1097 
AdapterResetDevice(const struct UsbDeviceHandle * handle)1098 static int AdapterResetDevice(const struct UsbDeviceHandle *handle)
1099 {
1100     int ret;
1101     uint8_t i;
1102 
1103     if (handle == NULL) {
1104         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1105         return HDF_ERR_INVALID_PARAM;
1106     }
1107 
1108     for (i = 0; i < USB_MAXINTERFACES; i++) {
1109         if (handle->claimedInterfaces & (1UL << i)) {
1110             AdapterReleaseInterface(handle, i);
1111         }
1112     }
1113 
1114     ret = ioctl(handle->fd, USBDEVFS_RESET, NULL);
1115     if (ret < 0) {
1116         HDF_LOGE("%s:%d errno=%d", __func__, __LINE__, errno);
1117         return HDF_FAILURE;
1118     }
1119 
1120     return HDF_SUCCESS;
1121 }
1122 
AdapterAllocRequest(const struct UsbDeviceHandle * handle,int isoPackets,size_t len)1123 static struct UsbHostRequest *AdapterAllocRequest(const struct UsbDeviceHandle *handle, int isoPackets, size_t len)
1124 {
1125     void *memBuf = NULL;
1126     size_t allocSize;
1127     struct UsbHostRequest *request = NULL;
1128     if (handle == NULL) {
1129         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1130         return NULL;
1131     }
1132     allocSize = sizeof(struct UsbHostRequest)
1133                 + (sizeof(struct UsbIsoPacketDesc) * (size_t)isoPackets)
1134                 + (sizeof(unsigned char) * len);
1135 
1136     memBuf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd, 0);
1137     if (memBuf == MAP_FAILED) {
1138         HDF_LOGE("%s:%d mmap failed, errno=%d", __func__, __LINE__, errno);
1139         return NULL;
1140     }
1141     request = (struct UsbHostRequest *)memBuf;
1142     request->numIsoPackets = isoPackets;
1143     request->buffer = (unsigned char *)request + allocSize - len;
1144     request->bufLen = len;
1145     request->bulkUrb = RawUsbMemCalloc(sizeof(struct UsbAdapterUrb));
1146     if (request->bulkUrb == NULL) {
1147         HDF_LOGE("%s RawUsbMemAlloc fail", __func__);
1148         return NULL;
1149     }
1150     request->urbs = request->bulkUrb;
1151     return request;
1152 }
1153 
AdapterFreeRequest(struct UsbHostRequest * request)1154 static int AdapterFreeRequest(struct UsbHostRequest *request)
1155 {
1156     size_t allocSize;
1157     if (request == NULL) {
1158         HDF_LOGE("%s:%d invalid param", __func__, __LINE__);
1159         return HDF_ERR_INVALID_PARAM;
1160     }
1161     allocSize = sizeof(struct UsbHostRequest)
1162                 + (sizeof(struct UsbIsoPacketDesc) * (size_t)(request->numIsoPackets))
1163                 + request->bufLen;
1164     if (request->bulkUrb){
1165         RawUsbMemFree(request->bulkUrb);
1166         request->bulkUrb = NULL;
1167     }
1168     request->urbs = NULL;
1169     if (munmap((void *)request, allocSize) != 0) {
1170         HDF_LOGE("%s:%d munmap failed, errno=%d", __func__, __LINE__, errno);
1171         return HDF_ERR_IO;
1172     }
1173 
1174     return HDF_SUCCESS;
1175 }
1176 
AdapterSubmitRequest(struct UsbHostRequest * request)1177 static int AdapterSubmitRequest(struct UsbHostRequest *request)
1178 {
1179     int ret;
1180 
1181     if (request == NULL) {
1182         HDF_LOGE("%s:%d request is NULL", __func__, __LINE__);
1183         return HDF_FAILURE;
1184     }
1185 
1186     request->actualLength = 0;
1187     switch (request->requestType) {
1188         case USB_REQUEST_TYPE_CONTROL:
1189             ret = OsSubmitControlRequest(request);
1190             break;
1191         case USB_REQUEST_TYPE_ISOCHRONOUS:
1192             ret = OsSubmitIsoRequest(request);
1193             break;
1194         case USB_REQUEST_TYPE_BULK:
1195         case USB_REQUEST_TYPE_INTERRUPT:
1196             ret = OsSubmitBulkRequest(request);
1197             break;
1198         default:
1199             HDF_LOGE("%s:%d unknown requestType=%u", __func__, __LINE__, request->requestType);
1200             ret = HDF_ERR_INVALID_PARAM;
1201             break;
1202     }
1203 
1204     return ret;
1205 }
1206 
AdapterCancelRequest(struct UsbHostRequest * request)1207 static int AdapterCancelRequest(struct UsbHostRequest *request)
1208 {
1209     if (!request->urbs) {
1210         HDF_LOGE("%s:%d", __func__, __LINE__);
1211         return HDF_ERR_BAD_FD;
1212     }
1213 
1214     OsDiscardUrbs(request, 0, request->numUrbs);
1215 
1216     if (!((request->requestType == USB_REQUEST_TYPE_BULK) && (request->reqStatus == USB_REQUEST_ERROR))) {
1217         request->reqStatus = USB_REQUEST_CANCELLED;
1218     }
1219 
1220     return HDF_SUCCESS;
1221 }
1222 
AdapterUrbCompleteHandle(const struct UsbDeviceHandle * devHandle)1223 static int AdapterUrbCompleteHandle(const struct UsbDeviceHandle *devHandle)
1224 {
1225     struct UsbAdapterUrb *urb = NULL;
1226     struct UsbHostRequest *request = NULL;
1227     int ret;
1228 
1229     if (devHandle == NULL) {
1230         HDF_LOGE("%s:%d invalid parameter", __func__, __LINE__);
1231         return HDF_ERR_INVALID_PARAM;
1232     }
1233 
1234     ret = ioctl(devHandle->fd, USBDEVFS_REAPURB, &urb);
1235     if (ret < 0) {
1236         HDF_LOGE("%s:%d reap failed, errno=%d", __func__, __LINE__, errno);
1237         if (errno == EAGAIN) {
1238             return 1;
1239         }
1240         if (errno == ENODEV) {
1241             return HDF_DEV_ERR_NO_DEVICE;
1242         }
1243 
1244         return HDF_ERR_IO;
1245     }
1246 
1247     request = urb->userContext;
1248 
1249     switch (request->requestType) {
1250         case USB_REQUEST_TYPE_CONTROL:
1251             ret = OsControlCompletion(request, urb);
1252             break;
1253         case USB_REQUEST_TYPE_ISOCHRONOUS:
1254             ret = OsIsoCompletion(request, urb);
1255             break;
1256         case USB_REQUEST_TYPE_BULK:
1257         case USB_REQUEST_TYPE_INTERRUPT:
1258             ret = OsBulkCompletion(request, (const struct UsbAdapterUrb *)urb);
1259             break;
1260         default:
1261             HDF_LOGE("%s:%d unrecognised requestType %u", __func__, __LINE__, request->requestType);
1262             ret = HDF_FAILURE;
1263             break;
1264     }
1265 
1266     return ret;
1267 }
1268 
1269 static struct UsbOsAdapterOps g_usbAdapter = {
1270     .init = AdapterInit,
1271     .exit = AdapterExit,
1272     .openDevice = AdapterOpenDevice,
1273     .closeDevice = AdapterCloseDevice,
1274     .getConfigDescriptor = AdapterGetConfigDescriptor,
1275     .getConfiguration = AdapterGetConfiguration,
1276     .setConfiguration = AdapterSetConfiguration,
1277     .claimInterface = AdapterClaimInterface,
1278     .releaseInterface = AdapterReleaseInterface,
1279     .setInterfaceAltsetting = AdapterSetInterface,
1280     .clearHalt = AdapterClearHalt,
1281     .resetDevice = AdapterResetDevice,
1282     .allocRequest = AdapterAllocRequest,
1283     .freeRequest = AdapterFreeRequest,
1284     .submitRequest = AdapterSubmitRequest,
1285     .cancelRequest = AdapterCancelRequest,
1286     .urbCompleteHandle = AdapterUrbCompleteHandle,
1287 };
1288 
OsSignalHandler(int signo)1289 static void OsSignalHandler(int signo)
1290 {
1291     switch (signo) {
1292         case SIGUSR1:
1293             break;
1294         default:
1295             break;
1296     }
1297 }
1298 
UsbAdapterGetOps(void)1299 struct UsbOsAdapterOps *UsbAdapterGetOps(void)
1300 {
1301     return &g_usbAdapter;
1302 }
1303 
UsbAdapterGetTid(void)1304 UsbRawTidType UsbAdapterGetTid(void)
1305 {
1306     return gettid();
1307 }
1308 
UsbAdapterRegisterSignal(void)1309 int UsbAdapterRegisterSignal(void)
1310 {
1311     if (signal(SIGUSR1, OsSignalHandler) == SIG_ERR) {
1312         HDF_LOGE("%s:%d Can't set AdapterSignalHandler for SIGUSR1", __func__, __LINE__);
1313         return HDF_ERR_IO;
1314     }
1315 
1316     return HDF_SUCCESS;
1317 }
1318 
UsbAdapterKillSignal(struct UsbDeviceHandle * devHandle,UsbRawTidType tid)1319 int UsbAdapterKillSignal(struct UsbDeviceHandle *devHandle, UsbRawTidType tid)
1320 {
1321     if (kill(tid, SIGUSR1) == HDF_ERR_IO) {
1322         HDF_LOGE("%s:%d kill tid=%d SIGUSR1 failed", __func__, __LINE__, tid);
1323         return HDF_ERR_IO;
1324     }
1325 
1326     return HDF_SUCCESS;
1327 }
1328 
AdapterAtomicInc(OsalAtomic * v)1329 int AdapterAtomicInc(OsalAtomic *v)
1330 {
1331     return OsalAtomicInc(v);
1332 }
1333 
AdapterAtomicDec(OsalAtomic * v)1334 int AdapterAtomicDec(OsalAtomic *v)
1335 {
1336     return OsalAtomicDec(v);
1337 }
1338