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