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 "liteos_adapter.h"
17 #include "los_spinlock.h"
18 #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY
19 #include "usb_pnp_notify.h"
20 #endif
21
22 #define HDF_LOG_TAG USB_LITEOS_ADAPTER
23
24 #define PATH_LEN 24
25 #define DESC_READ_LEN 256
26 #define EP_NUM_MAX 30
27 #define SLEEP_TIME 20
28 #define REQ_NUM 10
29 #define TEST_BYTE_COUNT 1024
30 #define TIME_OUT 500
31 #define BUFFER_LEN 50
32
33 static bool g_CompleteExit;
34
35 enum UrbState {
36 URB_INIT_STATE,
37 URB_SUBMIT_STATE,
38 URB_REAP_STATE,
39 };
40
41 struct Async {
42 struct DListHead asynclist;
43 enum UrbState state;
44 struct UsbDevice *dev;
45 UsbAdapterUrb urb;
46 };
47
48 struct OsDev {
49 struct DListHead asyncCompleted;
50 UsbAdapterDevice *adapterDevice;
51 SPIN_LOCK_S completeLock;
52 struct OsalMutex completeMux;
53 struct OsalSem cvWait;
54 };
55
OsAdapterRealloc(void * ptr,size_t oldSize,size_t newSize)56 static void *OsAdapterRealloc(void *ptr, size_t oldSize, size_t newSize)
57 {
58 void *mem;
59
60 mem = RawUsbMemAlloc(newSize);
61 if (mem == NULL) {
62 HDF_LOGE("%{public}s:%d", __func__, __LINE__);
63 goto OUT;
64 }
65
66 if (oldSize > 0) {
67 if (memmove_s(mem, newSize, ptr, oldSize) != HDF_SUCCESS) {
68 HDF_LOGE("%{public}s:%d", __func__, __LINE__);
69 RawUsbMemFree(mem);
70 mem = NULL;
71 goto OUT;
72 }
73 }
74
75 RawUsbMemFree(ptr);
76 OUT:
77 return mem;
78 }
79
UsbFindUrb(const struct Async * urb,struct DListHead * list)80 static bool UsbFindUrb(const struct Async *urb, struct DListHead *list)
81 {
82 bool findFlag = false;
83 struct OsDev *osDev = CONTAINER_OF(list, struct OsDev, asyncCompleted);
84 struct Async *asPos = NULL;
85 struct Async *asTemp = NULL;
86 if (DListIsEmpty(&osDev->asyncCompleted)) {
87 return false;
88 }
89 DLIST_FOR_EACH_ENTRY_SAFE(asPos, asTemp, list, struct Async, asynclist) {
90 if (asPos == urb) {
91 findFlag = true;
92 break;
93 }
94 }
95 return findFlag;
96 }
97
OsUrbComplete(UsbAdapterUrb * urb)98 static void OsUrbComplete(UsbAdapterUrb *urb)
99 {
100 uint32_t save;
101 struct Async *as = CONTAINER_OF(urb, struct Async, urb);
102 struct UsbDevice *dev = as->dev;
103 if (dev == NULL) {
104 DPRINTFN(0, "dev is null\n");
105 return;
106 }
107 struct OsDev *osDev = (struct OsDev *)dev->privateData;
108 if (osDev == NULL) {
109 DPRINTFN(0, "osDev is null\n");
110 return;
111 }
112 as->state = URB_REAP_STATE;
113 LOS_SpinLockSave(&osDev->completeLock, &save);
114 if (UsbFindUrb(as, &osDev->asyncCompleted) == false) {
115 DListInsertTail(&as->asynclist, &osDev->asyncCompleted);
116 LOS_SpinUnlockRestore(&osDev->completeLock, save);
117 OsalSemPost(&osDev->cvWait);
118 } else {
119 LOS_SpinUnlockRestore(&osDev->completeLock, save);
120 }
121 }
122
OsSubmitUrb(UsbAdapterUrb * urb,UsbAdapterDevice * adapterDevice,UsbAdapterHostEndpoint * uhe)123 static int32_t OsSubmitUrb(UsbAdapterUrb *urb, UsbAdapterDevice *adapterDevice, UsbAdapterHostEndpoint *uhe)
124 {
125 int32_t err;
126
127 if ((uhe == NULL) || (urb == NULL) || (adapterDevice == NULL)) {
128 DPRINTFN(0, "invalid param\n");
129 return (-EINVAL);
130 }
131
132 err = usb_setup_endpoint(adapterDevice, uhe, TEST_BYTE_COUNT);
133 if (err < 0) {
134 DPRINTFN(0, "setup failed err:%d\n", err);
135 return (err);
136 }
137 err = usb_submit_urb(urb, 0);
138 return (err);
139 }
140
OsControlMsg(UsbAdapterUrb * urb)141 static int32_t OsControlMsg(UsbAdapterUrb *urb)
142 {
143 uint16_t actLen = 0;
144 UsbAdapterDevice *adapterDevice = urb->dev;
145 void *buffer = urb->transfer_buffer;
146 UsbAdapterDeviceRequest req;
147
148 int32_t err = memcpy_s(&req, sizeof(UsbAdapterDeviceRequest), buffer, sizeof(UsbAdapterDeviceRequest));
149 if (err != EOK) {
150 DPRINTFN(0, "%s:%d err=%d\n", __func__, __LINE__, err);
151 err = HDF_ERR_IO;
152 return err;
153 }
154 err = usbd_do_request_flags(
155 adapterDevice, NULL, &req, (char *)buffer + sizeof(req), USB_SHORT_XFER_OK, &actLen, urb->timeout);
156 if (err) {
157 DPRINTFN(1, "OsControlMsg!err:%d\n", err);
158 }
159 urb->actual_length = actLen;
160 if (urb->complete) {
161 (urb->complete)(urb);
162 }
163 return err;
164 }
165
OsWaitUrb(struct OsDev * osDev)166 static int32_t OsWaitUrb(struct OsDev *osDev)
167 {
168 if (osDev == NULL) {
169 return HDF_FAILURE;
170 }
171 do {
172 OsalSemWait(&osDev->cvWait, HDF_WAIT_FOREVER);
173 } while (!g_CompleteExit && DListIsEmpty(&osDev->asyncCompleted));
174 return HDF_SUCCESS;
175 }
176
OsReapUrb(const struct UsbDeviceHandle * handle,struct Async ** urb)177 static int32_t OsReapUrb(const struct UsbDeviceHandle *handle, struct Async **urb)
178 {
179 if ((handle == NULL) || (handle->dev == NULL) || (handle->dev->privateData == NULL)) {
180 PRINTK("invalid parmater\n");
181 return HDF_ERR_INVALID_PARAM;
182 }
183 int32_t err = 0;
184 uint32_t save;
185 struct Async *as = NULL;
186 struct UsbDevice *dev = handle->dev;
187 if (dev->privateData == NULL) {
188 PRINTK("invalid parmater\n");
189 return HDF_ERR_INVALID_PARAM;
190 }
191 struct OsDev *osDev = (struct OsDev *)dev->privateData;
192 err = OsWaitUrb(osDev);
193 LOS_SpinLockSave(&osDev->completeLock, &save);
194 if (!DListIsEmpty(&osDev->asyncCompleted)) {
195 as = DLIST_FIRST_ENTRY(&osDev->asyncCompleted, struct Async, asynclist);
196 DListRemove(&as->asynclist);
197 }
198 LOS_SpinUnlockRestore(&osDev->completeLock, save);
199 *urb = as;
200 return err;
201 }
202
OsDeviceCompare(struct HdfSListNode * listEntry,uint32_t searchKey)203 static bool OsDeviceCompare(struct HdfSListNode *listEntry, uint32_t searchKey)
204 {
205 struct UsbDevice *dev = (struct UsbDevice *)listEntry;
206 if (dev == NULL) {
207 return false;
208 }
209
210 if ((dev->busNum == (searchKey >> BUS_OFFSET)) && (dev->devAddr == (searchKey & 0xFF))) {
211 return true;
212 }
213
214 return false;
215 }
216
OsGetDeviceHandle(struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)217 static struct UsbDeviceHandle *OsGetDeviceHandle(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
218 {
219 struct UsbDevice *dev = NULL;
220 struct UsbDeviceHandle *handle = NULL;
221
222 if (session == NULL) {
223 DPRINTFN(0, "%s:invalid param\n", __func__);
224 return NULL;
225 }
226
227 OsalMutexLock(&session->lock);
228 dev = (struct UsbDevice *)HdfSListSearch(&session->usbDevs, (busNum << BUS_OFFSET) | usbAddr, OsDeviceCompare);
229 if (dev != NULL) {
230 handle = dev->devHandle;
231 AdapterAtomicInc(&dev->refcnt);
232 }
233 OsalMutexUnlock(&session->lock);
234
235 return handle;
236 }
237
OsCallocDeviceHandle(void)238 static struct UsbDeviceHandle *OsCallocDeviceHandle(void)
239 {
240 struct UsbDeviceHandle *handle = NULL;
241
242 handle = RawUsbMemCalloc(sizeof(*handle));
243 if (handle == NULL) {
244 DPRINTFN(0, "%s: allocate handle failed", __func__);
245 return NULL;
246 }
247
248 OsalMutexInit(&handle->lock);
249
250 return handle;
251 }
252
OsAllocDevice(struct UsbSession * session,struct UsbDeviceHandle * handle)253 static struct UsbDevice *OsAllocDevice(struct UsbSession *session, struct UsbDeviceHandle *handle)
254 {
255 struct UsbDevice *dev = RawUsbMemCalloc(sizeof(*dev));
256 if (dev == NULL) {
257 DPRINTFN(0, "%s:%d no memory", __func__, __LINE__);
258 return NULL;
259 }
260
261 dev->session = session;
262 dev->devHandle = handle;
263
264 RawRequestListInit(dev);
265
266 handle->dev = dev;
267 return dev;
268 }
269
OsReadDescriptors(struct UsbDevice * dev)270 static int32_t OsReadDescriptors(struct UsbDevice *dev)
271 {
272 size_t allocLen = 0;
273 int32_t ret;
274 if (dev == NULL) {
275 HDF_LOGE("%{public}s:%d dev is NULL!", __func__, __LINE__);
276 return HDF_ERR_INVALID_PARAM;
277 }
278 struct OsDev *osDev = (struct OsDev *)dev->privateData;
279 if ((osDev == NULL) || (osDev->adapterDevice == NULL) || (osDev->adapterDevice->cdesc == NULL)) {
280 HDF_LOGE("%{public}s:%d is NULL!", __func__, __LINE__);
281 return HDF_ERR_INVALID_PARAM;
282 }
283
284 do {
285 size_t oldLen = allocLen;
286 allocLen += DESC_READ_LEN;
287 dev->descriptors = OsAdapterRealloc(dev->descriptors, oldLen, allocLen);
288 if ((dev->descriptors == NULL) || (dev->descriptorsLength > allocLen)) {
289 DPRINTFN(0, "%s:%d\n", __func__, __LINE__);
290 return HDF_ERR_MALLOC_FAIL;
291 }
292 uint8_t *ptr = (uint8_t *)dev->descriptors + dev->descriptorsLength;
293 if (ptr == NULL) {
294 DPRINTFN(0, "%s:%d ptr is NULL\n", __func__, __LINE__);
295 ret = HDF_ERR_INVALID_PARAM;
296 return ret;
297 }
298 ret = memset_s(ptr, DESC_READ_LEN, 0, DESC_READ_LEN);
299 if (ret != HDF_SUCCESS) {
300 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
301 return HDF_FAILURE;
302 }
303
304 size_t count = UGETW(osDev->adapterDevice->cdesc->wTotalLength);
305 if (count > DESC_READ_LEN) {
306 ret = HDF_ERR_IO;
307 return ret;
308 }
309 ret = memcpy_s(ptr, DESC_READ_LEN, osDev->adapterDevice->cdesc, count);
310 if (ret != EOK) {
311 DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
312 ret = HDF_ERR_IO;
313 return ret;
314 }
315 DPRINTFN(0, "%s:+configdes_size:%d+type:%d\n", __func__, UGETW(osDev->adapterDevice->cdesc->wTotalLength),
316 osDev->adapterDevice->cdesc->bDescriptorType);
317 dev->descriptorsLength += count;
318 } while (dev->descriptorsLength == allocLen);
319
320 return HDF_SUCCESS;
321 }
322
OsParseConfigDescriptors(struct UsbDevice * dev)323 static int32_t OsParseConfigDescriptors(struct UsbDevice *dev)
324 {
325 uint8_t i;
326 uint8_t numConfigs;
327 uint8_t *buffer = NULL;
328 size_t descLen;
329 UsbAdapterDeviceDescriptor *deviceDesc = NULL;
330 struct OsDev *osDev = (struct OsDev *)dev->privateData;
331 deviceDesc = &osDev->adapterDevice->ddesc;
332 numConfigs = deviceDesc->bNumConfigurations;
333 if (numConfigs == 0) {
334 return HDF_SUCCESS;
335 }
336 dev->configDescriptors = RawUsbMemAlloc(numConfigs * sizeof(struct UsbDeviceConfigDescriptor));
337 if (dev->configDescriptors == NULL) {
338 DPRINTFN(0, "%s:%d\n", __func__, __LINE__);
339 return HDF_ERR_MALLOC_FAIL;
340 }
341 buffer = (uint8_t *)dev->descriptors;
342 descLen = dev->descriptorsLength;
343
344 for (i = 0; i < numConfigs; i++) {
345 struct UsbConfigDescriptor *configDesc = NULL;
346 uint16_t configLen;
347
348 if (descLen < USB_DDK_DT_CONFIG_SIZE) {
349 DPRINTFN(0, "%s:%d read %zu", __func__, __LINE__, descLen);
350 return HDF_ERR_IO;
351 }
352 configDesc = (struct UsbConfigDescriptor *)buffer;
353 if ((configDesc->bDescriptorType != USB_DDK_DT_CONFIG) || (configDesc->bLength < USB_DDK_DT_CONFIG_SIZE)) {
354 DPRINTFN(0, "%s:%d config desc error: type 0x%02x, length %u\n", __func__, __LINE__,
355 configDesc->bDescriptorType, configDesc->bLength);
356 return HDF_ERR_IO;
357 }
358 configLen = LE16_TO_CPU(configDesc->wTotalLength);
359 if (configLen < USB_DDK_DT_CONFIG_SIZE) {
360 DPRINTFN(0, "invalid wTotalLength value %u\n", configLen);
361 return HDF_ERR_IO;
362 }
363 if (configLen > descLen) {
364 DPRINTFN(0, "%s:%d read %zu/%u\n", __func__, __LINE__, descLen, configLen);
365 configLen = (uint16_t)descLen;
366 }
367 dev->configDescriptors[i].desc = configDesc;
368 dev->configDescriptors[i].actualLen = configLen;
369 buffer += configLen;
370 descLen -= configLen;
371 }
372 return HDF_SUCCESS;
373 }
374
OsDevAllocInit(void)375 static struct OsDev *OsDevAllocInit(void)
376 {
377 struct OsDev *osDev = NULL;
378 osDev = RawUsbMemCalloc(sizeof(*osDev));
379 if (osDev == NULL) {
380 return NULL;
381 }
382 DListHeadInit(&osDev->asyncCompleted);
383 OsalSemInit(&osDev->cvWait, 0);
384 LOS_SpinInit(&osDev->completeLock);
385 OsalMutexInit(&osDev->completeMux);
386 return osDev;
387 }
388
OsDevDestory(struct OsDev * osDev)389 static void OsDevDestory(struct OsDev *osDev)
390 {
391 if (osDev == NULL) {
392 DPRINTFN(0, "invalid parma\n");
393 return;
394 }
395 OsalSemDestroy(&osDev->cvWait);
396 OsalMutexDestroy(&osDev->completeMux);
397 RawUsbMemFree(osDev);
398 }
399
OsInitDevice(struct UsbDevice * dev,uint8_t busNum,uint8_t devAddr)400 static int32_t OsInitDevice(struct UsbDevice *dev, uint8_t busNum, uint8_t devAddr)
401 {
402 struct OsDev *osDev = NULL;
403 int32_t ret;
404
405 dev->busNum = busNum;
406 dev->devAddr = devAddr;
407 osDev = OsDevAllocInit();
408 if (osDev == NULL) {
409 DPRINTFN(0, "%s:%d osDev is NULL\n", __func__, __LINE__);
410 return HDF_DEV_ERR_NO_DEVICE;
411 }
412 g_CompleteExit = false;
413 #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY
414 struct UsbGetDevicePara paraData;
415 paraData.type = USB_PNP_DEVICE_ADDRESS_TYPE;
416 paraData.busNum = dev->busNum;
417 paraData.devNum = dev->devAddr;
418 osDev->adapterDevice = UsbPnpNotifyGetUsbDevice(paraData);
419 #else
420 osDev->adapterDevice = NULL;
421 #endif
422 if (osDev->adapterDevice == NULL) {
423 DPRINTFN(0, "%s:%d osDev->adapterDevice is NULL\n", __func__, __LINE__);
424 return HDF_DEV_ERR_NO_DEVICE;
425 }
426
427 dev->privateData = (void *)osDev;
428 dev->descriptorsLength = 0;
429 ret = OsReadDescriptors(dev);
430 if (ret != HDF_SUCCESS) {
431 DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
432 return ret;
433 }
434 ret = OsParseConfigDescriptors(dev);
435 if (ret != HDF_SUCCESS) {
436 DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
437 return ret;
438 }
439 ret = memcpy_s(&dev->deviceDescriptor, sizeof(struct UsbDeviceDescriptor), &osDev->adapterDevice->ddesc,
440 USB_DDK_DT_DEVICE_SIZE);
441 if (ret != HDF_SUCCESS) {
442 DPRINTFN(0, "%s:%d ret=%d\n", __func__, __LINE__, ret);
443 ret = HDF_ERR_IO;
444 }
445 return ret;
446 }
447
OsFreeIsoUrbs(struct UsbHostRequest * request)448 static void OsFreeIsoUrbs(struct UsbHostRequest *request)
449 {
450 struct Async *urb = NULL;
451
452 for (int32_t i = 0; i < request->numUrbs; i++) {
453 urb = request->isoUrbs[i];
454 if (urb == NULL) {
455 break;
456 }
457 RawUsbMemFree(urb);
458 request->isoUrbs[i] = NULL;
459 }
460
461 RawUsbMemFree(request->isoUrbs);
462 request->isoUrbs = NULL;
463 }
464
OsDiscardUrbs(const struct UsbHostRequest * request,int32_t first,int32_t last)465 static void OsDiscardUrbs(const struct UsbHostRequest *request, int32_t first, int32_t last)
466 {
467 UsbAdapterUrb *urb = NULL;
468 struct Async *as = NULL;
469
470 if ((request == NULL) || (request->devHandle == NULL) || (first > URBS_PER_REQUEST) || (first > last)) {
471 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
472 return;
473 }
474
475 for (int32_t i = last - 1; i >= first; i--) {
476 if (request->requestType == USB_REQUEST_TYPE_ISOCHRONOUS) {
477 as = (struct Async *)request->isoUrbs[i];
478 } else {
479 as = &(((struct Async *)request->urbs)[i]);
480 }
481 if (as == NULL) {
482 DPRINTFN(0, "discard as null\n");
483 return;
484 }
485 urb = &as->urb;
486 if (as->state == URB_SUBMIT_STATE) {
487 DPRINTFN(0, "usb kill urb\n");
488 usb_kill_urb(urb);
489 DPRINTFN(0, "%s:%d discard request\n", __func__, __LINE__);
490 }
491 }
492 }
493
OsSubmitControlMsg(struct UsbHostRequest * const request,const UsbAdapterDevice * adapterDevice,const struct UsbDevice * dev)494 static int32_t OsSubmitControlMsg(
495 struct UsbHostRequest * const request, const UsbAdapterDevice *adapterDevice, const struct UsbDevice *dev)
496 {
497 int32_t ret;
498 struct Async *as = NULL;
499 UsbAdapterUrb *urb = NULL;
500 UsbAdapterHostEndpoint *uhe = NULL;
501 if ((request == NULL) || (request->length > MAX_BULK_DATA_BUFFER_LENGTH) || (request->buffer == NULL) ||
502 (adapterDevice == NULL) || (dev == NULL)) {
503 return HDF_ERR_INVALID_PARAM;
504 }
505 uhe = usb_find_host_endpoint((UsbAdapterDevice *)adapterDevice, request->requestType, request->endPoint);
506 if (uhe == NULL) {
507 DPRINTFN(0, "no found endpoint\n");
508 return -1;
509 }
510 if (request->urbs == NULL) {
511 as = RawUsbMemCalloc(sizeof(*as));
512 request->urbs = (void *)as;
513 request->numUrbs = 1;
514 }
515
516 if (request->urbs == NULL) {
517 DPRINTFN(0, "%s:%d no mem", __func__, __LINE__);
518 return HDF_ERR_MALLOC_FAIL;
519 }
520 as = (struct Async *)request->urbs;
521 DListHeadInit(&as->asynclist);
522 as->dev = (struct UsbDevice *)dev;
523 as->state = URB_SUBMIT_STATE;
524 urb = &as->urb;
525 ret = memset_s(urb, sizeof(*urb), 0, sizeof(*urb));
526 if (ret != HDF_SUCCESS) {
527 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
528 return HDF_FAILURE;
529 }
530
531 urb->dev = (UsbAdapterDevice *)adapterDevice;
532 urb->endpoint = uhe;
533 urb->timeout = TIME_OUT;
534 urb->transfer_buffer = request->buffer;
535 urb->context = (void *)request;
536 urb->complete = OsUrbComplete;
537 ret = OsControlMsg(urb);
538 DPRINTFN(0, "OsSubmitControlRequest:ret:%d\n", ret);
539 if (ret) {
540 DPRINTFN(0, "submiturb failed, errno=%d\n", errno);
541 return HDF_ERR_IO;
542 }
543
544 return HDF_SUCCESS;
545 }
546
OsSubmitControlRequest(struct UsbHostRequest * request)547 static int32_t OsSubmitControlRequest(struct UsbHostRequest *request)
548 {
549 struct OsDev *osDev = NULL;
550 UsbAdapterDevice *adapterDevice = NULL;
551
552 if ((request == NULL) || (request->length > MAX_BULK_DATA_BUFFER_LENGTH) || (request->devHandle == NULL) ||
553 (request->buffer == NULL)) {
554 return HDF_ERR_INVALID_PARAM;
555 }
556 struct UsbDeviceHandle *handle = request->devHandle;
557 struct UsbDevice *dev = handle->dev;
558 if (dev) {
559 osDev = (struct OsDev *)dev->privateData;
560 }
561 if (osDev) {
562 adapterDevice = osDev->adapterDevice;
563 }
564
565 return OsSubmitControlMsg(request, adapterDevice, dev);
566 }
567
OsSubmitBulkRequestHandleUrb(struct Async * pas,struct UsbHostRequest * request,int32_t bulkBufferLen,int32_t number)568 static int32_t OsSubmitBulkRequestHandleUrb(
569 struct Async *pas, struct UsbHostRequest *request, int32_t bulkBufferLen, int32_t number)
570 {
571 UsbAdapterUrb *urb = NULL;
572
573 if (bulkBufferLen == 0) {
574 HDF_LOGE("%{public}s:%d bulkBufferLen can not be zero", __func__, __LINE__);
575 return HDF_ERR_INVALID_PARAM;
576 }
577
578 urb = &pas->urb;
579 urb->context = (void *)request;
580 switch (request->requestType) {
581 case USB_REQUEST_TYPE_BULK:
582 break;
583 case USB_REQUEST_TYPE_INTERRUPT:
584 urb->interval = BUFFER_LEN;
585 break;
586 default:
587 DPRINTFN(0, "%s:%d unknown requestType=%u\n", __func__, __LINE__, request->requestType);
588 return HDF_ERR_INVALID_PARAM;
589 }
590 urb->transfer_buffer = request->buffer + (number * bulkBufferLen);
591 urb->complete = OsUrbComplete;
592 if (number == request->numUrbs - 1) {
593 uint32_t len = (uint32_t)(request->length % bulkBufferLen);
594 urb->transfer_buffer_length = (len == 0) ? (uint32_t)bulkBufferLen : len;
595 } else {
596 urb->transfer_buffer_length = (uint32_t)bulkBufferLen;
597 }
598
599 return HDF_SUCCESS;
600 }
601
OsSubmitBulkRequestHandle(struct UsbHostRequest * const request,struct Async * const as,int32_t bulkBufferLen)602 static int32_t OsSubmitBulkRequestHandle(
603 struct UsbHostRequest * const request, struct Async * const as, int32_t bulkBufferLen)
604 {
605 struct Async *pas = NULL;
606 int32_t numUrbs = request->numUrbs;
607 struct UsbDevice *dev = request->devHandle->dev;
608 struct OsDev *osDev = (struct OsDev *)dev->privateData;
609 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
610 UsbAdapterUrb *urb = NULL;
611
612 UsbAdapterHostEndpoint *uhe = usb_find_host_endpoint(adapterDevice, request->requestType, request->endPoint);
613 if (uhe == NULL) {
614 DPRINTFN(0, "no found endpoint\n");
615 return HDF_DEV_ERR_NO_DEVICE;
616 }
617
618 int32_t i;
619 for (i = 0, pas = as; i < numUrbs; i++, pas++) {
620 urb = &pas->urb;
621 int32_t ret = memset_s(urb, sizeof(*urb), 0, sizeof(*urb));
622 if (ret != HDF_SUCCESS) {
623 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
624 return HDF_FAILURE;
625 }
626
627 ret = OsSubmitBulkRequestHandleUrb(pas, request, bulkBufferLen, i);
628 if (ret != HDF_SUCCESS) {
629 return ret;
630 }
631 pas->state = URB_SUBMIT_STATE;
632 DListHeadInit(&pas->asynclist);
633 pas->dev = dev;
634 urb->dev = adapterDevice;
635 urb->endpoint = uhe;
636
637 ret = OsSubmitUrb(urb, urb->dev, urb->endpoint);
638 if (ret == 0) {
639 continue;
640 }
641 if (i == 0) {
642 DPRINTFN(0, "the first urb failed\n");
643 return HDF_ERR_IO;
644 }
645 OsalMutexLock(&request->lock);
646 request->numRetired += numUrbs - i;
647 if (errno != EREMOTEIO) {
648 request->reqStatus = USB_REQUEST_ERROR;
649 }
650 OsDiscardUrbs(request, 0, i);
651 OsalMutexUnlock(&request->lock);
652 return HDF_SUCCESS;
653 }
654
655 return HDF_SUCCESS;
656 }
657
OsSubmitBulkRequest(struct UsbHostRequest * const request)658 static int32_t OsSubmitBulkRequest(struct UsbHostRequest * const request)
659 {
660 struct Async *as = NULL;
661 uint32_t bulkBufferLen;
662 int32_t numUrbs;
663
664 if ((request == NULL) || (request->devHandle == NULL)) {
665 DPRINTFN(0, "%s: invalid param", __func__);
666 return HDF_ERR_INVALID_PARAM;
667 }
668
669 if (request->length > MAX_BULK_DATA_BUFFER_LENGTH || request->length <= 0) {
670 DPRINTFN(0, "Bulk request size err\n");
671 return HDF_FAILURE;
672 }
673
674 if (request->devHandle->caps & USB_ADAPTER_CAP_BULK_SCATTER_GATHER) {
675 bulkBufferLen = request->length ? request->length : 1;
676 } else {
677 bulkBufferLen = MAX_BULK_DATA_BUFFER_LENGTH;
678 }
679 if (request->length < bulkBufferLen) {
680 numUrbs = 1;
681 } else {
682 numUrbs = (request->length + bulkBufferLen - 1) / bulkBufferLen;
683 }
684 if (request->urbs == NULL) {
685 as = RawUsbMemCalloc(sizeof(*as));
686 request->urbs = (void *)as;
687 } else if (numUrbs > 1) {
688 RawUsbMemFree(request->urbs);
689 as = RawUsbMemCalloc(numUrbs * sizeof(*as));
690 request->urbs = (void *)as;
691 }
692 if (request->urbs == NULL) {
693 DPRINTFN(0, "%s:%d no mem", __func__, __LINE__);
694 return HDF_ERR_MALLOC_FAIL;
695 }
696 as = (struct Async *)request->urbs;
697 request->numUrbs = numUrbs;
698 request->numRetired = 0;
699 request->reqStatus = USB_REQUEST_COMPLETED;
700
701 return OsSubmitBulkRequestHandle(request, as, bulkBufferLen);
702 }
703
OsAllocIsoUrbs(struct UsbHostRequest * request,int32_t numUrbs,struct Async ** ass)704 static int32_t OsAllocIsoUrbs(struct UsbHostRequest *request, int32_t numUrbs, struct Async **ass)
705 {
706 struct Async *as = NULL;
707 unsigned char *urbBuffer = request->buffer;
708 int32_t numPacketsLeft = request->numIsoPackets;
709 int32_t packetIdx = 0;
710 int32_t i, j;
711
712 UsbPipeType pipeType = request->requestType;
713 unsigned char endPoint = request->endPoint;
714 struct UsbDeviceHandle *handle = request->devHandle;
715 struct UsbDevice *dev = handle->dev;
716 struct OsDev *osDev = (struct OsDev *)dev->privateData;
717 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
718 UsbAdapterHostEndpoint *uhe = NULL;
719 uhe = usb_find_host_endpoint(adapterDevice, pipeType, endPoint);
720 if (uhe == NULL) {
721 DPRINTFN(0, "no found endpoint\n");
722 return HDF_DEV_ERR_NO_DEVICE;
723 }
724
725 for (i = 0; i < numUrbs; i++) {
726 UsbAdapterUrb *urb = NULL;
727 int32_t numPackets = MIN(numPacketsLeft, MAX_ISO_PACKETS_PER_URB);
728 as = RawUsbMemCalloc(sizeof(struct Async));
729 if (as == NULL) {
730 OsFreeIsoUrbs(request);
731 return HDF_ERR_MALLOC_FAIL;
732 }
733 ass[i] = as;
734 urb = &as->urb;
735 for (j = 0; j < numPackets; j++) {
736 unsigned int packetLen = request->isoPacketDesc[packetIdx++].length;
737 urb->transfer_buffer_length += packetLen;
738 urb->iso_frame_desc[j].length = packetLen;
739 }
740 urb->endpoint = uhe;
741 urb->number_of_packets = (unsigned int)numPackets;
742 urb->transfer_buffer = urbBuffer;
743 urb->context = request;
744 urbBuffer += urb->transfer_buffer_length;
745 numPacketsLeft -= numPackets;
746 }
747
748 return HDF_SUCCESS;
749 }
750
OsSubmitIsoUrbs(struct UsbHostRequest * request,int32_t numUrbs,struct Async ** pUrbs)751 static int32_t OsSubmitIsoUrbs(struct UsbHostRequest *request, int32_t numUrbs, struct Async **pUrbs)
752 {
753 for (int32_t i = 0; i < numUrbs; i++) {
754 UsbAdapterUrb *urb = &(pUrbs[i]->urb);
755 int32_t ret = OsSubmitUrb(urb, urb->dev, urb->endpoint);
756 DPRINTFN(0, "submitUrb:%d errno=%d\n", ret, errno);
757 if (ret == 0) {
758 continue;
759 }
760
761 if (errno == ENODEV) {
762 ret = HDF_DEV_ERR_NO_DEVICE;
763 } else {
764 DPRINTFN(0, "%s:%d submit iso urb failed errno=%d\n", __func__, __LINE__, errno);
765 ret = HDF_ERR_IO;
766 }
767
768 if (i == 0) {
769 DPRINTFN(0, "first URB failed");
770 OsFreeIsoUrbs(request);
771 return ret;
772 }
773
774 OsalMutexLock(&request->lock);
775 request->reqStatus = USB_REQUEST_ERROR;
776 request->numRetired += numUrbs - i;
777 if (request->numRetired == numUrbs) {
778 RawUsbMemFree(pUrbs);
779 request->isoUrbs = NULL;
780 }
781 OsalMutexUnlock(&request->lock);
782
783 break;
784 }
785
786 return HDF_SUCCESS;
787 }
788
OsSubmitIsoRequest(struct UsbHostRequest * request)789 static int32_t OsSubmitIsoRequest(struct UsbHostRequest *request)
790 {
791 unsigned int totalLen = 0;
792
793 if ((request == NULL) || (request->devHandle == NULL) || (request->numIsoPackets < 1)) {
794 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
795 return HDF_ERR_INVALID_PARAM;
796 }
797
798 if (request->length > MAX_ISO_DATA_BUFFER_LEN) {
799 DPRINTFN(0, "%s:%d request length exceed the maximum", __func__, __LINE__);
800 return HDF_ERR_NOT_SUPPORT;
801 }
802
803 for (int32_t i = 0; i < request->numIsoPackets; i++) {
804 unsigned int packetLen = request->isoPacketDesc[i].length;
805 if (packetLen > MAX_ISO_DATA_BUFFER_LEN) {
806 DPRINTFN(0, "%s:%d packet length: %u exceeds maximum: %u\n", __func__, __LINE__, packetLen,
807 MAX_ISO_DATA_BUFFER_LEN);
808 return HDF_ERR_INVALID_PARAM;
809 }
810 totalLen += packetLen;
811 }
812 if (request->length < totalLen) {
813 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
814 return HDF_ERR_INVALID_PARAM;
815 }
816 int32_t numUrbs = (request->numIsoPackets + (MAX_ISO_PACKETS_PER_URB - 1)) / MAX_ISO_PACKETS_PER_URB;
817 struct Async **pUrbs = RawUsbMemCalloc(numUrbs * sizeof(struct Async *));
818 if (pUrbs == NULL) {
819 DPRINTFN(0, "%s:%d RawUsbMemCalloc pUrbs failed", __func__, __LINE__);
820 return HDF_ERR_MALLOC_FAIL;
821 }
822 request->isoUrbs = (void **)pUrbs;
823 request->numUrbs = numUrbs;
824 request->numRetired = 0;
825 request->isoPacketOffset = 0;
826 int32_t ret = OsAllocIsoUrbs(request, numUrbs, pUrbs);
827 if (ret != HDF_SUCCESS) {
828 DPRINTFN(0, "%s:%d alloc iso urbs failed", __func__, __LINE__);
829 return ret;
830 }
831
832 return OsSubmitIsoUrbs(request, numUrbs, pUrbs);
833 }
834
OsControlCompletion(struct UsbHostRequest * request,struct Async * as)835 static int32_t OsControlCompletion(struct UsbHostRequest *request, struct Async *as)
836 {
837 int32_t status;
838 UsbAdapterUrb *urb = &as->urb;
839
840 OsalMutexLock(&request->lock);
841 request->numRetired++;
842 request->actualLength += (int)urb->actual_length;
843 if (request->reqStatus == USB_REQUEST_CANCELLED) {
844 OsalMutexUnlock(&request->lock);
845 as->state = URB_INIT_STATE;
846 return RawHandleRequestCompletion(request, USB_REQUEST_CANCELLED);
847 }
848
849 switch (urb->status) {
850 case 0:
851 status = USB_REQUEST_COMPLETED;
852 break;
853 case -ENOENT:
854 status = USB_REQUEST_CANCELLED;
855 break;
856 case -EPIPE:
857 DPRINTFN(0, "%s:%d unsupported control request", __func__, __LINE__);
858 status = USB_REQUEST_STALL;
859 break;
860 case -EOVERFLOW:
861 DPRINTFN(0, "%s:%d overflow actualLength=%d\n", __func__, __LINE__, urb->actual_length);
862 status = USB_REQUEST_OVERFLOW;
863 break;
864 case -ENODEV:
865 case -ESHUTDOWN:
866 DPRINTFN(0, "device removed");
867 status = USB_REQUEST_NO_DEVICE;
868 break;
869 default:
870 DPRINTFN(0, "%s:%d urb status=%d\n", __func__, __LINE__, urb->status);
871 status = USB_REQUEST_ERROR;
872 break;
873 }
874 OsalMutexUnlock(&request->lock);
875 as->state = URB_INIT_STATE;
876 return RawHandleRequestCompletion(request, status);
877 }
878
OsIsoRequestDesStatus(struct UsbHostRequest * request,UsbAdapterUrb * urb)879 static void OsIsoRequestDesStatus(struct UsbHostRequest *request, UsbAdapterUrb *urb)
880 {
881 uint32_t i;
882 UsbAdapterIsoPacketDescriptor *urbDesc = NULL;
883 struct UsbIsoPacketDesc *requestDesc = NULL;
884
885 for (i = 0; i < urb->number_of_packets; i++) {
886 urbDesc = &urb->iso_frame_desc[i];
887 requestDesc = &request->isoPacketDesc[request->isoPacketOffset++];
888
889 switch (urbDesc->status) {
890 case HDF_SUCCESS:
891 requestDesc->status = USB_REQUEST_COMPLETED;
892 break;
893 case -ENODEV:
894 case -ESHUTDOWN:
895 requestDesc->status = USB_REQUEST_NO_DEVICE;
896 break;
897 case -EPIPE:
898 requestDesc->status = USB_REQUEST_STALL;
899 break;
900 case -EOVERFLOW:
901 requestDesc->status = USB_REQUEST_OVERFLOW;
902 break;
903 default:
904 requestDesc->status = USB_REQUEST_ERROR;
905 break;
906 }
907 DPRINTFN(0, "%s:%d urb status=%d-%d\n", __func__, __LINE__, i, urbDesc->status);
908
909 requestDesc->actualLength = urbDesc->actual_length;
910 }
911 }
912
OsIsoCompletion(struct UsbHostRequest * request,struct Async * as)913 static int32_t OsIsoCompletion(struct UsbHostRequest *request, struct Async *as)
914 {
915 UsbRequestStatus status;
916 int32_t urbIndex = 0;
917 int32_t numUrbs;
918 UsbAdapterUrb *urb = &as->urb;
919
920 if (request == NULL) {
921 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
922 return HDF_ERR_INVALID_PARAM;
923 }
924
925 numUrbs = request->numUrbs;
926 OsalMutexLock(&request->lock);
927 for (int32_t i = 0; i < numUrbs; i++) {
928 if (urb == request->isoUrbs[i]) {
929 urbIndex = i + 1;
930 break;
931 }
932 }
933 if (urbIndex == 0) {
934 DPRINTFN(0, "%s:%d urbIndex is zero", __func__, __LINE__);
935 OsalMutexUnlock(&request->lock);
936 return HDF_ERR_BAD_FD;
937 }
938
939 OsIsoRequestDesStatus(request, urb);
940 request->numRetired++;
941 if (request->reqStatus != USB_REQUEST_COMPLETED) {
942 if (request->numRetired == numUrbs) {
943 OsFreeIsoUrbs(request);
944 OsalMutexUnlock(&request->lock);
945 return RawHandleRequestCompletion(request, USB_REQUEST_ERROR);
946 }
947 goto OUT;
948 }
949
950 status = USB_REQUEST_COMPLETED;
951 if (urb->status == -ESHUTDOWN) {
952 status = USB_REQUEST_NO_DEVICE;
953 } else if (!((urb->status == HDF_SUCCESS) || (urb->status == -ENOENT) || (urb->status == -ECONNRESET))) {
954 status = USB_REQUEST_ERROR;
955 }
956
957 if (request->numRetired == numUrbs) {
958 DPRINTFN(0, "%s:%d all URBs reaped for complete", __func__, __LINE__);
959 OsFreeIsoUrbs(request);
960 OsalMutexUnlock(&request->lock);
961 return RawHandleRequestCompletion(request, status);
962 }
963 OUT:
964 OsalMutexUnlock(&request->lock);
965 return HDF_SUCCESS;
966 }
967
OsProcessAbnormalReap(struct UsbHostRequest * request,const UsbAdapterUrb * urb)968 static int32_t OsProcessAbnormalReap(struct UsbHostRequest *request, const UsbAdapterUrb *urb)
969 {
970 if (urb->actual_length > 0) {
971 unsigned char *target = request->buffer + request->actualLength;
972 if (urb->transfer_buffer != target) {
973 if (memmove_s(target, urb->actual_length, urb->transfer_buffer, urb->actual_length) != EOK) {
974 DPRINTFN(0, "%s: memmove_s failed, ret=%d", __func__, ret);
975 }
976 }
977 request->actualLength += urb->actual_length;
978 }
979 if (request->numRetired == request->numUrbs) {
980 return HDF_SUCCESS;
981 }
982
983 return HDF_ERR_IO;
984 }
985
OsUrbStatusToRequestStatus(struct UsbHostRequest * request,const UsbAdapterUrb * urb)986 static int32_t OsUrbStatusToRequestStatus(struct UsbHostRequest *request, const UsbAdapterUrb *urb)
987 {
988 int32_t ret;
989
990 switch (urb->status) {
991 case 0:
992 ret = HDF_SUCCESS;
993 break;
994 case -ESHUTDOWN:
995 DPRINTFN(0, "%s:%d device is removed", __func__, __LINE__);
996 request->reqStatus = USB_REQUEST_NO_DEVICE;
997 ret = HDF_DEV_ERR_NO_DEVICE;
998 break;
999 case -EPIPE:
1000 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1001 request->reqStatus = USB_REQUEST_STALL;
1002 }
1003 ret = HDF_DEV_ERR_NO_DEVICE;
1004 break;
1005 case -EOVERFLOW:
1006 DPRINTFN(0, "%s:%d overflow error, actualLength=%d\n", __func__, __LINE__, urb->actual_length);
1007 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1008 request->reqStatus = USB_REQUEST_OVERFLOW;
1009 }
1010 ret = HDF_FAILURE;
1011 break;
1012 case -ECONNRESET:
1013 ret = HDF_DEV_ERR_OP;
1014 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1015 request->reqStatus = USB_REQUEST_CANCELLED;
1016 }
1017 break;
1018 default:
1019 DPRINTFN(0, "unknown urb status %d\n", urb->status);
1020 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1021 request->reqStatus = USB_REQUEST_ERROR;
1022 }
1023 ret = HDF_FAILURE;
1024 break;
1025 }
1026
1027 return ret;
1028 }
1029
OsBulkCompletion(struct UsbHostRequest * const request,struct Async * const as)1030 static int32_t OsBulkCompletion(struct UsbHostRequest * const request, struct Async * const as)
1031 {
1032 int32_t ret;
1033 int32_t urbIdx = as - (struct Async *)request->urbs;
1034 const UsbAdapterUrb *urb = &as->urb;
1035
1036 OsalMutexLock(&request->lock);
1037 request->numRetired++;
1038 if (request->reqStatus != USB_REQUEST_COMPLETED) {
1039 if (OsProcessAbnormalReap(request, urb) == HDF_SUCCESS) {
1040 goto COMPLETED;
1041 } else {
1042 goto OUT;
1043 }
1044 }
1045 request->actualLength += urb->actual_length;
1046 ret = OsUrbStatusToRequestStatus(request, urb);
1047 if (ret == HDF_DEV_ERR_NO_DEVICE) {
1048 goto CANCEL;
1049 } else if (ret == HDF_FAILURE) {
1050 goto COMPLETED;
1051 }
1052
1053 if (request->numRetired == request->numUrbs) {
1054 goto COMPLETED;
1055 } else if (urb->actual_length < urb->transfer_buffer_length) {
1056 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1057 request->reqStatus = USB_REQUEST_COMPLETED_SHORT;
1058 }
1059 } else {
1060 goto OUT;
1061 }
1062
1063 CANCEL:
1064 if (request->numRetired == request->numUrbs) {
1065 goto COMPLETED;
1066 }
1067 OsDiscardUrbs(request, urbIdx + 1, request->numUrbs);
1068
1069 OUT:
1070 OsalMutexUnlock(&request->lock);
1071 return HDF_SUCCESS;
1072
1073 COMPLETED:
1074 OsalMutexUnlock(&request->lock);
1075 as->state = URB_INIT_STATE;
1076 return RawHandleRequestCompletion(request, request->reqStatus);
1077 }
1078
OsFreeRequest(const struct UsbHostRequest * request)1079 static int32_t OsFreeRequest(const struct UsbHostRequest *request)
1080 {
1081 int32_t retry = 0;
1082 if (request == NULL) {
1083 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
1084 return HDF_ERR_INVALID_PARAM;
1085 }
1086
1087 while (true) {
1088 OsalMSleep(SLEEP_TIME);
1089 if (request->numUrbs != request->numRetired) {
1090 if (++retry > REQ_NUM) {
1091 DPRINTFN(0, "request busy numUrbs:%d+numretired:%d\n", request->numUrbs, request->numRetired);
1092 return HDF_ERR_DEVICE_BUSY;
1093 }
1094 continue;
1095 } else {
1096 break;
1097 }
1098 }
1099
1100 return HDF_SUCCESS;
1101 }
1102
AdapterInit(const struct UsbSession * session)1103 static int32_t AdapterInit(const struct UsbSession *session)
1104 {
1105 (void)session;
1106 return HDF_SUCCESS;
1107 }
1108
AdapterExit(const struct UsbSession * session)1109 static void AdapterExit(const struct UsbSession *session)
1110 {
1111 (void)session;
1112 return;
1113 }
1114
AdapterOpenDevice(struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)1115 static struct UsbDeviceHandle *AdapterOpenDevice(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
1116 {
1117 int32_t ret;
1118 struct UsbDevice *dev = NULL;
1119 struct UsbDeviceHandle *handle = NULL;
1120
1121 handle = OsGetDeviceHandle(session, busNum, usbAddr);
1122 if (handle != NULL) {
1123 return handle;
1124 }
1125 handle = OsCallocDeviceHandle();
1126 if (handle == NULL) {
1127 DPRINTFN(0, "%s: Calloc Device Handle failed", __func__);
1128 return NULL;
1129 }
1130 dev = OsAllocDevice(session, handle);
1131 if (dev == NULL) {
1132 DPRINTFN(0, "%s: OsAllocDevice failed\n", __func__);
1133 goto ERR;
1134 }
1135 ret = OsInitDevice(dev, busNum, usbAddr);
1136 if (ret) {
1137 DPRINTFN(0, "%s: OsInitDevice failed ret=%d\n", __func__, ret);
1138 RawUsbMemFree(dev);
1139 goto ERR;
1140 }
1141 OsalAtomicSet(&dev->refcnt, 1);
1142 OsalMutexLock(&session->lock);
1143 HdfSListAdd(&session->usbDevs, &dev->list);
1144 OsalMutexUnlock(&session->lock);
1145 return handle;
1146 ERR:
1147 OsalMutexDestroy(&handle->lock);
1148 RawUsbMemFree(handle);
1149 return NULL;
1150 }
1151
AdapterCloseDevice(struct UsbDeviceHandle * handle)1152 static void AdapterCloseDevice(struct UsbDeviceHandle *handle)
1153 {
1154 struct UsbDevice *dev = NULL;
1155
1156 if ((handle == NULL) || (handle->dev == NULL)) {
1157 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
1158 return;
1159 }
1160 if (RawKillSignal(handle, 0) != HDF_SUCCESS) {
1161 HDF_LOGE("%{public}s:%d RawKillSignal failed", __func__, __LINE__);
1162 }
1163 dev = handle->dev;
1164 if (AdapterAtomicDec(&dev->refcnt)) {
1165 return;
1166 }
1167 if (dev->session == NULL) {
1168 return;
1169 }
1170 OsalMutexLock(&dev->session->lock);
1171 HdfSListRemove(&dev->session->usbDevs, &dev->list);
1172 OsalMutexUnlock(&dev->session->lock);
1173
1174 if (dev->configDescriptors) {
1175 RawUsbMemFree(dev->configDescriptors);
1176 }
1177 if (dev->descriptors) {
1178 RawUsbMemFree(dev->descriptors);
1179 }
1180 if (dev->privateData) {
1181 OsDevDestory(dev->privateData);
1182 dev->privateData = NULL;
1183 }
1184 RawUsbMemFree(dev);
1185
1186 OsalMutexDestroy(&handle->lock);
1187 RawUsbMemFree(handle);
1188 }
1189
AdapterGetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIndex,void * buffer,size_t len)1190 static int32_t AdapterGetConfigDescriptor(const struct UsbDevice *dev, uint8_t configIndex, void *buffer, size_t len)
1191 {
1192 struct OsDev *osDev = (struct OsDev *)dev->privateData;
1193 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1194 size_t count;
1195 if ((buffer == NULL) || (len == 0) || (adapterDevice == NULL) || (adapterDevice->cdesc == NULL)) {
1196 DPRINTFN(0, "invalid param is NULL");
1197 return HDF_ERR_INVALID_PARAM;
1198 }
1199 count = UGETW(adapterDevice->cdesc->wTotalLength);
1200 if (count > len) {
1201 DPRINTFN(0, "count length is error");
1202 return HDF_ERR_IO;
1203 }
1204 if (memcpy_s(buffer, len, adapterDevice->cdesc, count) != EOK) {
1205 DPRINTFN(0, "memcpy_s fail");
1206 return HDF_ERR_IO;
1207 }
1208 return (int32_t)len;
1209 }
1210
AdapterGetConfiguration(const struct UsbDeviceHandle * handle,uint8_t * activeConfig)1211 static int32_t AdapterGetConfiguration(const struct UsbDeviceHandle *handle, uint8_t *activeConfig)
1212 {
1213 struct UsbDevice *dev = handle->dev;
1214 struct OsDev *osDev = (struct OsDev *)dev->privateData;
1215 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1216
1217 if (adapterDevice != NULL) {
1218 *activeConfig = adapterDevice->curr_config_index;
1219 }
1220
1221 return HDF_SUCCESS;
1222 }
1223
AdapterSetConfiguration(struct UsbDeviceHandle * handle,int32_t activeConfig)1224 static int32_t AdapterSetConfiguration(struct UsbDeviceHandle *handle, int32_t activeConfig)
1225 {
1226 struct UsbDevice *dev = handle->dev;
1227 struct OsDev *osDev = (struct OsDev *)dev->privateData;
1228 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1229
1230 if (adapterDevice->flags.usb_mode != USB_MODE_HOST) {
1231 return HDF_DEV_ERR_DEV_INIT_FAIL;
1232 }
1233 if ((activeConfig < 0) || (activeConfig >= (int)adapterDevice->curr_config_no)) {
1234 return HDF_ERR_INVALID_PARAM;
1235 }
1236 if (activeConfig == adapterDevice->curr_config_index) {
1237 return HDF_SUCCESS;
1238 }
1239 if (usbd_set_config_index(adapterDevice, activeConfig) != 0) {
1240 return HDF_ERR_IO;
1241 }
1242
1243 return HDF_SUCCESS;
1244 }
1245
AdapterClaimInterface(const struct UsbDeviceHandle * handle,unsigned int interfaceNumber)1246 static int32_t AdapterClaimInterface(const struct UsbDeviceHandle *handle, unsigned int interfaceNumber)
1247 {
1248 (void)handle;
1249 (void)interfaceNumber;
1250 return HDF_SUCCESS;
1251 }
1252
AdapterReleaseInterface(const struct UsbDeviceHandle * handle,unsigned int interfaceNumber)1253 static int32_t AdapterReleaseInterface(const struct UsbDeviceHandle *handle, unsigned int interfaceNumber)
1254 {
1255 (void)handle;
1256 (void)interfaceNumber;
1257 return HDF_SUCCESS;
1258 }
1259
AdapterSetInterface(const struct UsbDeviceHandle * handle,uint8_t interface,uint8_t altSetting)1260 static int32_t AdapterSetInterface(const struct UsbDeviceHandle *handle, uint8_t interface, uint8_t altSetting)
1261 {
1262 struct UsbDevice *dev = handle->dev;
1263 struct OsDev *osDev = (struct OsDev *)dev->privateData;
1264 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1265
1266 if (adapterDevice->flags.usb_mode != USB_MODE_HOST) {
1267 return HDF_DEV_ERR_DEV_INIT_FAIL;
1268 }
1269 DPRINTFN(0, "altSetting interfaceId:%d+altSetting:%d\n", interface, altSetting);
1270 if (usb_set_interface(adapterDevice, interface, altSetting)) {
1271 return HDF_ERR_IO;
1272 }
1273
1274 return HDF_SUCCESS;
1275 }
1276
AdapterClearHalt(const struct UsbDeviceHandle * handle,unsigned int endPoint)1277 static int32_t AdapterClearHalt(const struct UsbDeviceHandle *handle, unsigned int endPoint)
1278 {
1279 struct UsbDevice *dev = handle->dev;
1280 struct OsDev *osDev = (struct OsDev *)dev->privateData;
1281 UsbAdapterDevice *adapterDevice = osDev->adapterDevice;
1282 int32_t ret;
1283 UsbAdapterHostEndpoint *uhe = usb_find_host_endpoint(adapterDevice, PIPE_BULK, endPoint);
1284 if (uhe == NULL) {
1285 printf("no found uhe\n");
1286 return -1;
1287 }
1288 ret = usb_clear_halt(adapterDevice, uhe);
1289 return ret;
1290 }
1291
AdapterResetDevice(const struct UsbDeviceHandle * handle)1292 static int32_t AdapterResetDevice(const struct UsbDeviceHandle *handle)
1293 {
1294 (void)handle;
1295 return HDF_SUCCESS;
1296 }
1297
AdapterAllocRequest(const struct UsbDeviceHandle * handle,int32_t isoPackets,size_t length)1298 static struct UsbHostRequest *AdapterAllocRequest(
1299 const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t length)
1300 {
1301 (void)handle;
1302 size_t allocSize;
1303 struct UsbHostRequest *request = NULL;
1304
1305 allocSize = sizeof(struct UsbHostRequest) + (sizeof(struct UsbIsoPacketDesc) * (size_t)isoPackets) +
1306 (sizeof(unsigned char) * length);
1307 request = RawUsbMemCalloc(allocSize);
1308 if (request == NULL) {
1309 HDF_LOGE("%{public}s RawMemAlloc fail", __func__);
1310 return NULL;
1311 }
1312 request->numIsoPackets = isoPackets;
1313 request->buffer = (unsigned char *)request + allocSize - length;
1314 request->bufLen = (int)length;
1315 return request;
1316 }
1317
AdapterFreeRequest(struct UsbHostRequest * request)1318 static int32_t AdapterFreeRequest(struct UsbHostRequest *request)
1319 {
1320 if (request == NULL) {
1321 DPRINTFN(0, "%s:%d invalid param", __func__, __LINE__);
1322 return HDF_ERR_INVALID_PARAM;
1323 }
1324 if (request->numUrbs > request->numRetired) {
1325 OsDiscardUrbs(request, request->numRetired, request->numUrbs);
1326 int32_t ret = OsFreeRequest(request);
1327 if (ret != HDF_SUCCESS) {
1328 return ret;
1329 }
1330 }
1331 if (request->urbs) {
1332 RawUsbMemFree(request->urbs);
1333 request->urbs = NULL;
1334 }
1335 RawUsbMemFree((void *)request);
1336 return HDF_SUCCESS;
1337 }
1338
AdapterSubmitRequest(struct UsbHostRequest * request)1339 static int32_t AdapterSubmitRequest(struct UsbHostRequest *request)
1340 {
1341 int32_t ret;
1342
1343 if (request == NULL) {
1344 DPRINTFN(0, "%s:%d request is NULL", __func__, __LINE__);
1345 return HDF_FAILURE;
1346 }
1347 OsalMutexInit(&(request->lock));
1348 request->actualLength = 0;
1349 request->numRetired = 0;
1350 request->numUrbs = 0;
1351 switch (request->requestType) {
1352 case USB_REQUEST_TYPE_CONTROL:
1353 ret = OsSubmitControlRequest(request);
1354 break;
1355 case USB_REQUEST_TYPE_ISOCHRONOUS:
1356 ret = OsSubmitIsoRequest(request);
1357 break;
1358 case USB_REQUEST_TYPE_BULK:
1359 case USB_REQUEST_TYPE_INTERRUPT:
1360 ret = OsSubmitBulkRequest(request);
1361 break;
1362 default:
1363 DPRINTFN(0, "%s:%d unknown requestType=%u\n", __func__, __LINE__, request->requestType);
1364 ret = HDF_ERR_INVALID_PARAM;
1365 break;
1366 }
1367
1368 return ret;
1369 }
1370
AdapterCancelRequest(const struct UsbHostRequest * request)1371 static int32_t AdapterCancelRequest(const struct UsbHostRequest *request)
1372 {
1373 if (!request->urbs) {
1374 DPRINTFN(0, "adapter cancel urb null\n");
1375 goto END;
1376 }
1377
1378 OsDiscardUrbs(request, 0, request->numUrbs);
1379 END:
1380 return HDF_SUCCESS;
1381 }
1382
AdapterUrbCompleteHandle(const struct UsbDeviceHandle * devHandle)1383 static int32_t AdapterUrbCompleteHandle(const struct UsbDeviceHandle *devHandle)
1384 {
1385 int32_t ret;
1386 struct UsbDevice *dev = NULL;
1387 struct OsDev *osDev = NULL;
1388 UsbAdapterUrb *urb = NULL;
1389 struct Async *as = NULL;
1390 struct UsbHostRequest *request = NULL;
1391 if ((devHandle == NULL) || (devHandle->dev == NULL) || (devHandle->dev->privateData == NULL)) {
1392 HDF_LOGE("%{public}s:%d invalid parameter", __func__, __LINE__);
1393 return HDF_ERR_INVALID_PARAM;
1394 }
1395 dev = devHandle->dev;
1396 osDev = (struct OsDev *)dev->privateData;
1397 ret = OsReapUrb(devHandle, &as);
1398 if (as == NULL) {
1399 HDF_LOGE("as is null\n");
1400 return HDF_FAILURE;
1401 }
1402 urb = &as->urb;
1403 request = urb->context;
1404 switch (request->requestType) {
1405 case USB_REQUEST_TYPE_CONTROL:
1406 ret = OsControlCompletion(request, as);
1407 break;
1408 case USB_REQUEST_TYPE_ISOCHRONOUS:
1409 ret = OsIsoCompletion(request, as);
1410 break;
1411 case USB_REQUEST_TYPE_BULK:
1412 case USB_REQUEST_TYPE_INTERRUPT:
1413 ret = OsBulkCompletion(request, as);
1414 break;
1415 default:
1416 DPRINTFN(0, "%s:%d unrecognised requestType %u\n", __func__, __LINE__, request->requestType);
1417 ret = HDF_FAILURE;
1418 break;
1419 }
1420 return ret;
1421 }
1422
1423 static struct UsbOsAdapterOps g_usbAdapter = {
1424 .init = AdapterInit,
1425 .exit = AdapterExit,
1426 .openDevice = AdapterOpenDevice,
1427 .closeDevice = AdapterCloseDevice,
1428 .getConfigDescriptor = AdapterGetConfigDescriptor,
1429 .getConfiguration = AdapterGetConfiguration,
1430 .setConfiguration = AdapterSetConfiguration,
1431 .claimInterface = AdapterClaimInterface,
1432 .releaseInterface = AdapterReleaseInterface,
1433 .setInterfaceAltsetting = AdapterSetInterface,
1434 .clearHalt = AdapterClearHalt,
1435 .resetDevice = AdapterResetDevice,
1436 .allocRequest = AdapterAllocRequest,
1437 .freeRequest = AdapterFreeRequest,
1438 .submitRequest = AdapterSubmitRequest,
1439 .cancelRequest = AdapterCancelRequest,
1440 .urbCompleteHandle = AdapterUrbCompleteHandle,
1441 };
1442
UsbAdapterGetOps(void)1443 struct UsbOsAdapterOps *UsbAdapterGetOps(void)
1444 {
1445 return &g_usbAdapter;
1446 }
1447
UsbAdapterGetTid(void)1448 UsbRawTidType UsbAdapterGetTid(void)
1449 {
1450 return HDF_FAILURE;
1451 }
1452
UsbAdapterRegisterSignal(void)1453 int32_t UsbAdapterRegisterSignal(void)
1454 {
1455 return HDF_SUCCESS;
1456 }
1457
UsbAdapterKillSignal(struct UsbDeviceHandle * handle,UsbRawTidType tid)1458 int32_t UsbAdapterKillSignal(struct UsbDeviceHandle *handle, UsbRawTidType tid)
1459 {
1460 if ((handle != NULL) && (handle->dev != NULL)) {
1461 struct UsbDevice *dev = handle->dev;
1462 struct OsDev *osDev = (struct OsDev *)dev->privateData;
1463 if (osDev != NULL) {
1464 g_CompleteExit = true;
1465 OsalSemPost(&osDev->cvWait);
1466 HDF_LOGD("%{public}s:%d signal post", __func__, __LINE__);
1467 return HDF_SUCCESS;
1468 } else {
1469 return HDF_FAILURE;
1470 }
1471 } else {
1472 return HDF_FAILURE;
1473 }
1474 }
1475
AdapterAtomicInc(OsalAtomic * v)1476 int32_t AdapterAtomicInc(OsalAtomic *v)
1477 {
1478 int32_t valOld;
1479 int32_t val;
1480 uint32_t status = 0;
1481 Atomic *p = NULL;
1482 if (v) {
1483 p = (Atomic *)&(v)->counter;
1484 } else {
1485 return HDF_FAILURE;
1486 }
1487 do {
1488 __asm__ __volatile__("ldrex %1, [%4]\n"
1489 "mov %0, %1\n"
1490 "add %1, %1, #1\n"
1491 "strex %2, %1, [%4]"
1492 : "=&r"(valOld), "=&r"(val), "=&r"(status), "+m"(*p)
1493 : "r"(p)
1494 : "cc");
1495 } while (__builtin_expect(status != 0, 0));
1496
1497 return valOld;
1498 }
1499
AdapterAtomicDec(OsalAtomic * v)1500 int32_t AdapterAtomicDec(OsalAtomic *v)
1501 {
1502 if (v) {
1503 return LOS_AtomicDecRet((Atomic *)&(v)->counter);
1504 } else {
1505 return HDF_FAILURE;
1506 }
1507 }
1508