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