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