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