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