1 /*
2  * Copyright (c) 2021-2023 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 "usb_raw_api_library.h"
17 #include "linux_adapter.h"
18 #include "usbd_wrapper.h"
19 #include "usb_interface_pool.h"
20 
21 #define HDF_LOG_TAG USB_RAW_API_LIBRARY
22 
23 struct UsbSession *g_usbRawDefaultSession = NULL;
24 
SyncRequestCallback(const void * requestArg)25 static void SyncRequestCallback(const void *requestArg)
26 {
27     struct UsbHostRequest *request = (struct UsbHostRequest *)requestArg;
28     if (request == NULL || request->userData == NULL) {
29         HDF_LOGE("%{public}s:%{public}d invalid param requestArg.", __func__, __LINE__);
30         return;
31     }
32 
33     int32_t *completed = request->userData;
34     *completed = 1;
35     OsalSemPost(&request->sem);
36 }
37 
ControlRequestGetData(const struct UsbHostRequest * request)38 static inline unsigned char *ControlRequestGetData(const struct UsbHostRequest *request)
39 {
40     return request->buffer + USB_RAW_CONTROL_SETUP_SIZE;
41 }
42 
HandleSyncRequestCompletion(const struct UsbHostRequest * request,struct UsbRequestData * requestData)43 static int32_t HandleSyncRequestCompletion(const struct UsbHostRequest *request, struct UsbRequestData *requestData)
44 {
45     int32_t ret;
46     uint32_t waitTime;
47 
48     if (request->timeout == USB_RAW_REQUEST_TIME_ZERO_MS) {
49         waitTime = HDF_WAIT_FOREVER;
50     } else {
51         waitTime = request->timeout;
52     }
53 
54     ret = OsalSemWait((struct OsalSem *)&request->sem, waitTime);
55     if (ret == HDF_ERR_TIMEOUT) {
56         RawCancelRequest(request);
57         RawHandleRequestCompletion((struct UsbHostRequest *)request, USB_REQUEST_TIMEOUT);
58     } else if (ret != HDF_SUCCESS) {
59         HDF_LOGE("%{public}s:%{public}d OsalSemWait failed, ret = %{public}d ", __func__, __LINE__, ret);
60         goto OUT;
61     }
62 
63     if (requestData->requested) {
64         *(requestData->requested) = request->actualLength;
65     }
66 
67     switch (request->status) {
68         case USB_REQUEST_COMPLETED:
69             ret = HDF_SUCCESS;
70             break;
71         case USB_REQUEST_TIMEOUT:
72             ret = HDF_ERR_TIMEOUT;
73             break;
74         case USB_REQUEST_NO_DEVICE:
75             ret = HDF_DEV_ERR_NO_DEVICE;
76             break;
77         case USB_REQUEST_STALL:
78         case USB_REQUEST_OVERFLOW:
79         case USB_REQUEST_ERROR:
80         case USB_REQUEST_CANCELLED:
81             ret = HDF_ERR_IO;
82             break;
83         default:
84             HDF_LOGW("%{public}s: unrecognised status code %{public}d", __func__, request->status);
85             ret = HDF_FAILURE;
86             break;
87     }
88 
89 OUT:
90     OsalSemDestroy((struct OsalSem *)&request->sem);
91     return ret;
92 }
93 
HandleSyncRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRequestData * requestData,unsigned char type)94 static int32_t HandleSyncRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
95     const struct UsbRequestData *requestData, unsigned char type)
96 {
97     int32_t ret;
98     static int32_t completed = 0;
99 
100     if (UsbEndpointDirOut(requestData->endPoint)) {
101         ret = memcpy_s(request->buffer, request->bufLen, requestData->data, requestData->length);
102         if (ret != EOK) {
103             HDF_LOGE("%{public}s:%{public}d memcpy_s fail!", __func__, __LINE__);
104             return ret;
105         }
106     }
107 
108     request->devHandle = (struct UsbDeviceHandle *)devHandle;
109     request->endPoint = requestData->endPoint;
110     request->requestType = type;
111     request->timeout = requestData->timeout;
112     request->length = requestData->length;
113     request->userData = &completed;
114     request->callback = SyncRequestCallback;
115     request->userCallback = NULL;
116 
117     ret = OsalSemInit(&request->sem, 0);
118     if (ret != HDF_SUCCESS) {
119         HDF_LOGE("%{public}s:%{public}d OsalSemInit failed, ret=%{public}d ", __func__, __LINE__, ret);
120         return ret;
121     }
122 
123     ret = RawSubmitRequest(request);
124     if (ret < 0) {
125         OsalSemDestroy(&request->sem);
126         return ret;
127     }
128 
129     return HandleSyncRequestCompletion(request, (struct UsbRequestData *)requestData);
130 }
131 
GetInterfaceNumberDes(const struct UsbDescriptorHeader * header,uint8_t nIntf[],uint8_t nAlts[],int32_t * num)132 static void GetInterfaceNumberDes(
133     const struct UsbDescriptorHeader *header, uint8_t nIntf[], uint8_t nAlts[], int32_t *num)
134 {
135     uint8_t inum;
136     int32_t i;
137     struct UsbInterfaceDescriptor *desc = NULL;
138 
139     desc = (struct UsbInterfaceDescriptor *)header;
140     if (desc->bLength < USB_DDK_DT_INTERFACE_SIZE) {
141         HDF_LOGW("%{public}s: invalid interface descriptor length %{public}d, skipping", __func__, desc->bLength);
142         return;
143     }
144 
145     inum = desc->bInterfaceNumber;
146     for (i = 0; i < *num; ++i) {
147         if (nIntf[i] == inum) {
148             break;
149         }
150     }
151     if (i < *num) {
152         if (nAlts[i] < USB_MAXALTSETTING) {
153             ++nAlts[i];
154         }
155     } else if (*num < USB_MAXINTERFACES) {
156         nIntf[*num] = inum;
157         nAlts[*num] = 1;
158         ++*num;
159     }
160 }
161 
GetInterfaceNumber(const uint8_t * buffer,size_t size,uint8_t nIntf[],uint8_t nAlts[])162 static int32_t GetInterfaceNumber(const uint8_t *buffer, size_t size, uint8_t nIntf[], uint8_t nAlts[])
163 {
164     struct UsbDescriptorHeader *header = NULL;
165     const uint8_t *buffer2;
166     size_t size2;
167     int32_t num = 0;
168 
169     for ((buffer2 = buffer, size2 = size); size2 > 0; (buffer2 += header->bLength, size2 -= header->bLength)) {
170         if (size2 < sizeof(struct UsbDescriptorHeader)) {
171             HDF_LOGW("%{public}s: descriptor has %{public}zu excess bytes", __func__, size2);
172             break;
173         }
174         header = (struct UsbDescriptorHeader *)buffer2;
175         if ((header->bLength > size2) || (header->bLength < sizeof(struct UsbDescriptorHeader))) {
176             HDF_LOGW("%{public}s: invalid descriptor length %{public}hhu, skipping remainder",
177                 __func__, header->bLength);
178             break;
179         }
180 
181         if (header->bDescriptorType == USB_DDK_DT_INTERFACE) {
182             GetInterfaceNumberDes(header, nIntf, nAlts, &num);
183         }
184     }
185 
186     return num;
187 }
188 
FindNextDescriptor(const uint8_t * buffer,size_t size)189 static int32_t FindNextDescriptor(const uint8_t *buffer, size_t size)
190 {
191     struct UsbDescriptorHeader *h = NULL;
192     const uint8_t *buffer0 = buffer;
193 
194     while (size > 0) {
195         h = (struct UsbDescriptorHeader *)buffer;
196         if (h->bDescriptorType == USB_DDK_DT_INTERFACE || h->bDescriptorType == USB_DDK_DT_ENDPOINT) {
197             break;
198         }
199         buffer += h->bLength;
200         size -= h->bLength;
201     }
202 
203     return buffer - buffer0;
204 }
GetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIdx,uint8_t * buffer,size_t size)205 static int32_t GetConfigDescriptor(const struct UsbDevice *dev, uint8_t configIdx, uint8_t *buffer, size_t size)
206 {
207     int32_t ret;
208     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
209 
210     if (dev == NULL) {
211         HDF_LOGE("%{public}s: invalid param", __func__);
212         return HDF_ERR_INVALID_PARAM;
213     }
214 
215     if (!osAdapterOps->getConfigDescriptor) {
216         HDF_LOGE("%{public}s: getConfigDescriptor is null", __func__);
217         return HDF_ERR_NOT_SUPPORT;
218     }
219 
220     ret = osAdapterOps->getConfigDescriptor(dev, configIdx, buffer, size);
221     if (ret < 0) {
222         HDF_LOGE("%{public}s: getConfigDescriptor error = %{public}d", __func__, ret);
223         return ret;
224     }
225 
226     if (ret < USB_DDK_DT_CONFIG_SIZE) {
227         HDF_LOGE("%{public}s: short config descriptor read error = %{public}d", __func__, ret);
228         return HDF_ERR_IO;
229     } else if (ret != (int)size) {
230         HDF_LOGE("%{public}s: short config descriptor read size = %{public}zu, ret = %{public}d", __func__, size, ret);
231     }
232 
233     return ret;
234 }
235 
GetRawConfigDescriptor(const UsbRawHandle * rawHandle,uint8_t configIndex,uint8_t * configDesc,uint32_t configDescLen)236 int32_t GetRawConfigDescriptor(
237     const UsbRawHandle *rawHandle, uint8_t configIndex, uint8_t *configDesc, uint32_t configDescLen)
238 {
239     if (rawHandle == NULL || configDesc == NULL) {
240         HDF_LOGE("%{public}s: invalid param", __func__);
241         return HDF_ERR_INVALID_PARAM;
242     }
243 
244     struct UsbDeviceHandle *devHandle = (struct UsbDeviceHandle *)rawHandle;
245     return GetConfigDescriptor(devHandle->dev, configIndex, configDesc, configDescLen);
246 }
247 
ParseDescriptor(const void * source,enum UsbRawDescriptorType bDescriptorType,void * dest)248 static void ParseDescriptor(const void *source, enum UsbRawDescriptorType bDescriptorType, void *dest)
249 {
250     int32_t ret;
251 
252     if (source == NULL) {
253         HDF_LOGE("%{public}s: invalid param", __func__);
254         return;
255     }
256 
257     switch (bDescriptorType) {
258         case USB_RAW_CONFIG_DESCRIPTOR_TYPE: {
259             struct UsbConfigDescriptor *desc = (struct UsbConfigDescriptor *)dest;
260             ret = memcpy_s(dest, sizeof(struct UsbConfigDescriptor), source, USB_DDK_DT_CONFIG_SIZE);
261             if (ret != EOK) {
262                 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
263                 break;
264             }
265             desc->wTotalLength = LE16_TO_CPU(desc->wTotalLength);
266             break;
267         }
268         case USB_RAW_INTERFACE_DESCRIPTOR_TYPE: {
269             ret = memcpy_s(dest, sizeof(struct UsbInterfaceDescriptor), source, USB_DDK_DT_INTERFACE_SIZE);
270             if (ret != EOK) {
271                 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
272             }
273             break;
274         }
275         case USB_RAW_ENDPOINT_DESCRIPTOR_TYPE: {
276             struct UsbEndpointDescriptor *desc = (struct UsbEndpointDescriptor *)dest;
277             ret = memcpy_s(dest, sizeof(struct UsbEndpointDescriptor), source, USB_DDK_DT_ENDPOINT_SIZE);
278             if (ret != EOK) {
279                 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
280                 break;
281             }
282             desc->wMaxPacketSize = LE16_TO_CPU(desc->wMaxPacketSize);
283             break;
284         }
285         case USB_RAW_AUDIO_ENDPOINT_DESCRIPTOR_TYPE: {
286             struct UsbEndpointDescriptor *desc = (struct UsbEndpointDescriptor *)dest;
287             ret = memcpy_s(dest, sizeof(struct UsbEndpointDescriptor), source, USB_DDK_DT_ENDPOINT_AUDIO_SIZE);
288             if (ret != EOK) {
289                 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
290                 break;
291             }
292             desc->wMaxPacketSize = LE16_TO_CPU(desc->wMaxPacketSize);
293             break;
294         }
295         default:
296             HDF_LOGE("%{public}s: error bDescriptorType = %{public}d", __func__, bDescriptorType);
297             break;
298     }
299 }
300 
ClearEndpoint(struct UsbRawEndpointDescriptor * endPoint)301 static void ClearEndpoint(struct UsbRawEndpointDescriptor *endPoint)
302 {
303     if ((endPoint != NULL) && (endPoint->extra != NULL)) {
304         RawUsbMemFree((void *)endPoint->extra);
305         endPoint->extra = NULL;
306     }
307 }
308 
ParseEndpoint(struct UsbRawEndpointDescriptor * endPoint,const uint8_t * buffer,int32_t size)309 static int32_t ParseEndpoint(struct UsbRawEndpointDescriptor *endPoint, const uint8_t *buffer, int32_t size)
310 {
311     const uint8_t *buffer0 = buffer;
312     const struct UsbDescriptorHeader *header = NULL;
313     void *extra = NULL;
314     int32_t len;
315     int32_t ret;
316 
317     if (size < DESC_HEADER_LENGTH) {
318         HDF_LOGE("%{public}s:size = %{public}d is short endPoint descriptor ", __func__, size);
319         return HDF_ERR_IO;
320     }
321 
322     header = (const struct UsbDescriptorHeader *)buffer;
323     if ((header->bDescriptorType != USB_DDK_DT_ENDPOINT) || (header->bLength > size)) {
324         HDF_LOGE("%{public}s:%{public}d unexpected descriptor, type = 0x%{public}x, length = %{public}hhu",
325             __func__, __LINE__, header->bDescriptorType, header->bLength);
326         return buffer - buffer0;
327     } else if (header->bLength < USB_DDK_DT_ENDPOINT_SIZE) {
328         HDF_LOGE("%{public}s:%{public}d invalid endpoint length = %{public}hhu", __func__, __LINE__, header->bLength);
329         return HDF_ERR_IO;
330     }
331 
332     if (header->bLength >= USB_DDK_DT_ENDPOINT_AUDIO_SIZE) {
333         ParseDescriptor(buffer, USB_RAW_AUDIO_ENDPOINT_DESCRIPTOR_TYPE, endPoint);
334     } else {
335         ParseDescriptor(buffer, USB_RAW_ENDPOINT_DESCRIPTOR_TYPE, endPoint);
336     }
337 
338     buffer += header->bLength;
339     size -= header->bLength;
340 
341     len = FindNextDescriptor(buffer, size);
342     if (!len) {
343         return buffer - buffer0;
344     }
345 
346     extra = RawUsbMemAlloc((size_t)len);
347     if (extra == NULL) {
348         return HDF_ERR_MALLOC_FAIL;
349     }
350 
351     ret = memcpy_s(extra, len + endPoint->extraLength, buffer, len);
352     if (ret != EOK) {
353         HDF_LOGE("%{public}s:%{public}d memcpy_s failed!", __func__, __LINE__);
354         RawUsbMemFree(extra);
355         return HDF_ERR_IO;
356     }
357     endPoint->extra = extra;
358     endPoint->extraLength = len;
359 
360     return buffer + len - buffer0;
361 }
362 
ClearInterface(const struct UsbRawInterface * usbInterface)363 static void ClearInterface(const struct UsbRawInterface *usbInterface)
364 {
365     struct UsbRawInterfaceDescriptor *infPtr = NULL;
366     uint8_t i;
367     uint8_t j;
368 
369     if (usbInterface == NULL) {
370         HDF_LOGE("%{public}s:%{public}d usbInterface is null", __func__, __LINE__);
371         return;
372     }
373 
374     if (usbInterface->numAltsetting > USB_MAXALTSETTING) {
375         HDF_LOGE("%{public}s:%{public}d numAltsetting = %{public}hhu is error",
376             __func__, __LINE__, usbInterface->numAltsetting);
377         return;
378     }
379 
380     for (i = 0; i < usbInterface->numAltsetting; i++) {
381         infPtr = (struct UsbRawInterfaceDescriptor *)(usbInterface->altsetting + i);
382         if (infPtr == NULL) {
383             HDF_LOGE("%{public}s:%{public}d altsetting is null", __func__, __LINE__);
384             continue;
385         }
386 
387         if (infPtr->extra != NULL) {
388             RawUsbMemFree((void *)infPtr->extra);
389             infPtr->extra = NULL;
390         }
391 
392         if (infPtr->endPoint != NULL) {
393             for (j = 0; j < infPtr->interfaceDescriptor.bNumEndpoints; j++) {
394                 ClearEndpoint((struct UsbRawEndpointDescriptor *)infPtr->endPoint + j);
395             }
396 
397             RawUsbMemFree((void *)infPtr->endPoint);
398             infPtr->endPoint = NULL;
399         }
400     }
401 
402     RawUsbMemFree((void *)usbInterface);
403 }
404 
RawParseDescriptor(int32_t size,const uint8_t * buffer,enum UsbRawDescriptorType bDescriptorType,const struct UsbRawInterfaceDescriptor * ifp)405 static int32_t RawParseDescriptor(int32_t size, const uint8_t *buffer, enum UsbRawDescriptorType bDescriptorType,
406     const struct UsbRawInterfaceDescriptor *ifp)
407 {
408     int32_t ret = HDF_SUCCESS;
409 
410     ParseDescriptor(buffer, bDescriptorType, (void *)ifp);
411     if ((ifp->interfaceDescriptor.bDescriptorType != USB_DDK_DT_INTERFACE) ||
412         (ifp->interfaceDescriptor.bLength > size)) {
413         HDF_LOGE("%{public}s: unexpected descriptor: type = 0x%{public}x, size = %{public}d", __func__,
414             ifp->interfaceDescriptor.bDescriptorType, size);
415         ret = HDF_FAILURE;
416     } else if ((ifp->interfaceDescriptor.bLength < USB_DDK_DT_INTERFACE_SIZE) ||
417         (ifp->interfaceDescriptor.bNumEndpoints > USB_MAXENDPOINTS)) {
418         HDF_LOGE("%{public}s: invalid descriptor: length = %{public}u, numEndpoints = %{public}u ", __func__,
419             ifp->interfaceDescriptor.bLength, ifp->interfaceDescriptor.bNumEndpoints);
420         ret = HDF_ERR_IO;
421     }
422 
423     return ret;
424 }
425 
ParseInterfaceCopy(struct UsbRawInterfaceDescriptor * const ifp,int32_t len,const uint8_t * buffer)426 static int32_t ParseInterfaceCopy(struct UsbRawInterfaceDescriptor * const ifp, int32_t len, const uint8_t *buffer)
427 {
428     int32_t ret;
429 
430     ifp->extra = RawUsbMemAlloc((size_t)len);
431     if (!ifp->extra) {
432         ret = HDF_ERR_MALLOC_FAIL;
433         return ret;
434     }
435 
436     ret = memcpy_s((void *)ifp->extra, len + ifp->extraLength, buffer, len);
437     if (ret != EOK) {
438         HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
439         RawUsbMemFree((void *)ifp->extra);
440         ifp->extra = NULL;
441         return ret;
442     }
443     ifp->extraLength = len;
444     return ret;
445 }
446 
ParseInterfaceEndpoint(struct UsbRawInterfaceDescriptor * ifp,const uint8_t ** buffer,int32_t * size)447 static int32_t ParseInterfaceEndpoint(struct UsbRawInterfaceDescriptor *ifp, const uint8_t **buffer, int32_t *size)
448 {
449     struct UsbRawEndpointDescriptor *endPoint = NULL;
450     int32_t ret = HDF_SUCCESS;
451 
452     if (ifp->interfaceDescriptor.bNumEndpoints > 0) {
453         endPoint = RawUsbMemCalloc(ifp->interfaceDescriptor.bNumEndpoints * sizeof(*endPoint));
454         if (endPoint == NULL) {
455             ret = HDF_ERR_MALLOC_FAIL;
456             return ret;
457         }
458 
459         ifp->endPoint = endPoint;
460         for (uint8_t i = 0; i < ifp->interfaceDescriptor.bNumEndpoints; i++) {
461             ret = ParseEndpoint(endPoint + i, *buffer, *size);
462             if (ret == 0) {
463                 ifp->interfaceDescriptor.bNumEndpoints = i;
464                 break;
465             } else if (ret < 0) {
466                 return ret;
467             }
468 
469             *buffer += ret;
470             *size -= ret;
471         }
472     }
473     return ret;
474 }
475 
ParseInterface(struct UsbRawInterface * usbInterface,const uint8_t * buffer,int32_t size)476 static int32_t ParseInterface(struct UsbRawInterface *usbInterface, const uint8_t *buffer, int32_t size)
477 {
478     const uint8_t *buffer0 = buffer;
479     int32_t interfaceNumber = -1; // initial value of interfaceNumber is -1
480     const struct UsbInterfaceDescriptor *ifDesc = NULL;
481     struct UsbRawInterfaceDescriptor *ifp = NULL;
482 
483     if (usbInterface == NULL || usbInterface->numAltsetting > USB_MAXALTSETTING) {
484         HDF_LOGE("%{public}s: usbInterface is null or numAltsetting is invalid", __func__);
485         return HDF_DEV_ERR_NORANGE;
486     }
487 
488     while (size >= USB_DDK_DT_INTERFACE_SIZE) {
489         ifp = (struct UsbRawInterfaceDescriptor *)(usbInterface->altsetting + usbInterface->numAltsetting);
490         int32_t ret = RawParseDescriptor(size, buffer, USB_RAW_INTERFACE_DESCRIPTOR_TYPE, ifp);
491         if (ret == HDF_FAILURE) {
492             return buffer - buffer0;
493         } else if (ret == HDF_ERR_IO) {
494             HDF_LOGE("%{public}s: RawParseDescriptor failed", __func__);
495             return ret;
496         }
497 
498         usbInterface->numAltsetting++;
499         ifp->extra = NULL;
500         ifp->extraLength = 0;
501         ifp->endPoint = NULL;
502         if (interfaceNumber == -1) {
503             interfaceNumber = ifp->interfaceDescriptor.bInterfaceNumber;
504         }
505 
506         buffer += ifp->interfaceDescriptor.bLength;
507         size -= (int)ifp->interfaceDescriptor.bLength;
508         int32_t len = FindNextDescriptor(buffer, size);
509         if (len != 0) {
510             if (ParseInterfaceCopy(ifp, len, buffer) != EOK) {
511                 HDF_LOGE("%{public}s: ParseInterfaceCopy failed", __func__);
512                 return HDF_FAILURE;
513             }
514             buffer += len;
515             size -= len;
516         }
517 
518         ret = ParseInterfaceEndpoint(ifp, &buffer, &size);
519         if (ret < HDF_SUCCESS) {
520             HDF_LOGE("%{public}s: ParseInterfaceEndpoint, ret less than zero", __func__);
521             return ret;
522         }
523 
524         ifDesc = (const struct UsbInterfaceDescriptor *)buffer;
525         bool tempFlag = (size < USB_DDK_DT_INTERFACE_SIZE) || (ifDesc->bDescriptorType != USB_DDK_DT_INTERFACE) ||
526             (ifDesc->bInterfaceNumber != interfaceNumber);
527         if (tempFlag == true) {
528             return buffer - buffer0;
529         }
530     }
531 
532     return buffer - buffer0;
533 }
534 
ParseConfigurationDes(struct UsbRawConfigDescriptor * config,const uint8_t * buffer,int32_t size,struct UsbRawInterface * usbInterface,const uint8_t * nIntf)535 static int32_t ParseConfigurationDes(struct UsbRawConfigDescriptor *config, const uint8_t *buffer, int32_t size,
536     struct UsbRawInterface *usbInterface, const uint8_t *nIntf)
537 {
538     int32_t ret, len;
539     uint8_t i;
540 
541     len = FindNextDescriptor(buffer, size);
542     if (len != 0) {
543         config->extra = RawUsbMemAlloc(len);
544         if (config->extra == NULL) {
545             ret = HDF_ERR_MALLOC_FAIL;
546             RawClearConfiguration(config);
547             return ret;
548         }
549 
550         ret = memcpy_s((void *)config->extra, len + config->extraLength, buffer, len);
551         if (ret != EOK) {
552             HDF_LOGE("%{public}s:%{public}d memcpy_s failed! ret = %{public}d", __func__, __LINE__, ret);
553             RawClearConfiguration(config);
554             return ret;
555         }
556         config->extraLength = len;
557         buffer += len;
558         size -= len;
559     }
560 
561     while (size > 0) {
562         struct UsbInterfaceDescriptor *ifDesc = (struct UsbInterfaceDescriptor *)buffer;
563         if (config->configDescriptor.bNumInterfaces >= USB_MAXINTERFACES) {
564             HDF_LOGE("%{public}d: bNumInterfaces overlong.", config->configDescriptor.bNumInterfaces);
565             RawClearConfiguration(config);
566             return HDF_FAILURE;
567         }
568         for (i = 0; i < config->configDescriptor.bNumInterfaces; ++i) {
569             if (nIntf[i] == ifDesc->bInterfaceNumber) {
570                 usbInterface = (struct UsbRawInterface *)config->interface[i];
571                 break;
572             }
573         }
574         ret = ParseInterface(usbInterface, buffer, size);
575         if (ret < 0) {
576             RawClearConfiguration(config);
577             return ret;
578         }
579         buffer += ret;
580         size -= ret;
581     }
582 
583     return size;
584 }
585 
ParseConfiguration(struct UsbRawConfigDescriptor * config,const uint8_t * buffer,int32_t size)586 static int32_t ParseConfiguration(struct UsbRawConfigDescriptor *config, const uint8_t *buffer, int32_t size)
587 {
588     struct UsbRawInterface *usbInterface = NULL;
589     uint8_t nIntf[USB_MAXINTERFACES] = {0};
590     uint8_t nAlts[USB_MAXINTERFACES] = {0};
591     int32_t intfNum;
592 
593     if (size < USB_DDK_DT_CONFIG_SIZE || config == NULL) {
594         HDF_LOGE("%{public}s:%{public}d size = %{public}d is short, or config is null!", __func__, __LINE__, size);
595         return HDF_ERR_IO;
596     }
597 
598     ParseDescriptor(buffer, USB_RAW_CONFIG_DESCRIPTOR_TYPE, config);
599     if ((config->configDescriptor.bDescriptorType != USB_DDK_DT_CONFIG) ||
600         (config->configDescriptor.bLength < USB_DDK_DT_CONFIG_SIZE) ||
601         (config->configDescriptor.bLength > (uint8_t)size) ||
602         (config->configDescriptor.bNumInterfaces > USB_MAXINTERFACES)) {
603         HDF_LOGE("%{public}s:%{public}d invalid descriptor: type = 0x%{public}x, length = %{public}u",
604             __func__, __LINE__, config->configDescriptor.bDescriptorType, config->configDescriptor.bLength);
605         return HDF_ERR_IO;
606     }
607 
608     intfNum = GetInterfaceNumber(buffer, size, nIntf, nAlts);
609     config->configDescriptor.bNumInterfaces = (uint8_t)intfNum;
610 
611     for (int32_t i = 0; i < intfNum; ++i) {
612         uint8_t j = nAlts[i];
613         if (j > USB_MAXALTSETTING) {
614             HDF_LOGW("%{public}s: too many alternate settings: %{public}hhu", __func__, j);
615             nAlts[i] = USB_MAXALTSETTING;
616             j = USB_MAXALTSETTING;
617         }
618         usbInterface = RawUsbMemCalloc(sizeof(struct UsbRawInterface) + sizeof(struct UsbRawInterfaceDescriptor) * j);
619         config->interface[i] = usbInterface;
620         if (usbInterface == NULL) {
621             return HDF_ERR_MALLOC_FAIL;
622         }
623     }
624 
625     buffer += config->configDescriptor.bLength;
626     size -= (int32_t)config->configDescriptor.bLength;
627 
628     return ParseConfigurationDes(config, buffer, size, usbInterface, nIntf);
629 }
630 
DescToConfig(const uint8_t * buf,int32_t size,struct UsbRawConfigDescriptor ** const config)631 static int32_t DescToConfig(const uint8_t *buf, int32_t size, struct UsbRawConfigDescriptor ** const config)
632 {
633     struct UsbRawConfigDescriptor *tmpConfig = RawUsbMemCalloc(sizeof(struct UsbRawConfigDescriptor));
634     int32_t ret;
635 
636     if (tmpConfig == NULL) {
637         HDF_LOGE("%{public}s: RawUsbMemCalloc failed", __func__);
638         return HDF_ERR_MALLOC_FAIL;
639     }
640 
641     ret = ParseConfiguration(tmpConfig, buf, size);
642     if (ret < 0) {
643         HDF_LOGE("%{public}s: ParseConfiguration failed with error = %{public}d", __func__, ret);
644         RawUsbMemFree(tmpConfig);
645         tmpConfig = NULL;
646         return ret;
647     } else if (ret > 0) {
648         HDF_LOGW("%{public}s: still %{public}d bytes of descriptor data left", __func__, ret);
649     }
650 
651     *config = tmpConfig;
652 
653     return ret;
654 }
655 
ControlRequestCompletion(const struct UsbHostRequest * request,struct UsbControlRequestData * requestData)656 static int32_t ControlRequestCompletion(const struct UsbHostRequest *request, struct UsbControlRequestData *requestData)
657 {
658     int32_t ret;
659     uint32_t waitTime;
660 
661     if (request->timeout == USB_RAW_REQUEST_TIME_ZERO_MS) {
662         waitTime = HDF_WAIT_FOREVER;
663     } else {
664         waitTime = request->timeout;
665     }
666 
667     ret = OsalSemWait((struct OsalSem *)&request->sem, waitTime);
668     if (ret == HDF_ERR_TIMEOUT) {
669         RawCancelRequest(request);
670         RawHandleRequestCompletion((struct UsbHostRequest *)request, USB_REQUEST_TIMEOUT);
671     } else if (ret != HDF_SUCCESS) {
672         HDF_LOGE("%{public}s:%{public}d OsalSemWait failed, ret=%{public}d ", __func__, __LINE__, ret);
673         goto OUT;
674     }
675 
676     if ((requestData->requestType & USB_DDK_ENDPOINT_DIR_MASK) == USB_PIPE_DIRECTION_IN) {
677         ret = memcpy_s(requestData->data, request->actualLength + requestData->length, ControlRequestGetData(request),
678             request->actualLength);
679         if (ret != EOK) {
680             HDF_LOGE("%{public}s:%{public}d memcpy_s failed! ret = %{public}d", __func__, __LINE__, ret);
681             goto OUT;
682         }
683     }
684 
685     switch (request->status) {
686         case USB_REQUEST_COMPLETED:
687             ret = request->actualLength;
688             break;
689         case USB_REQUEST_TIMEOUT:
690             ret = HDF_ERR_TIMEOUT;
691             break;
692         case USB_REQUEST_NO_DEVICE:
693             ret = HDF_DEV_ERR_NO_DEVICE;
694             break;
695         case USB_REQUEST_STALL:
696         case USB_REQUEST_OVERFLOW:
697         case USB_REQUEST_ERROR:
698         case USB_REQUEST_CANCELLED:
699             ret = HDF_ERR_IO;
700             break;
701         default:
702             HDF_LOGW("%{public}s: status = %{public}d is unrecognised", __func__, request->status);
703             ret = HDF_FAILURE;
704     }
705 
706 OUT:
707     OsalSemDestroy((struct OsalSem *)&request->sem);
708     return ret;
709 }
710 
RawGetSession(const struct UsbSession * session)711 struct UsbSession *RawGetSession(const struct UsbSession *session)
712 {
713     return (struct UsbSession *)(session ? session : g_usbRawDefaultSession);
714 }
715 
RawInit(struct UsbSession ** session)716 int32_t RawInit(struct UsbSession **session)
717 {
718     int32_t ret;
719     struct UsbSession *tempSession = NULL;
720     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
721 
722     if (session == NULL && g_usbRawDefaultSession != NULL) {
723         AdapterAtomicInc(&g_usbRawDefaultSession->refCount);
724         return HDF_SUCCESS;
725     }
726 
727     tempSession = (struct UsbSession *)RawUsbMemCalloc(sizeof(*tempSession));
728     if (tempSession == NULL) {
729         return HDF_ERR_MALLOC_FAIL;
730     }
731     OsalAtomicSet(&tempSession->refCount, 1);
732     HdfSListInit(&tempSession->usbDevs);
733     DListHeadInit(&tempSession->ifacePoolList);
734     OsalMutexInit(&tempSession->lock);
735     if (session == NULL && g_usbRawDefaultSession == NULL) {
736         g_usbRawDefaultSession = tempSession;
737         HDF_LOGI("%{public}s: created default context", __func__);
738     }
739 
740     if (osAdapterOps->init) {
741         ret = osAdapterOps->init(tempSession);
742         if (ret < 0) {
743             HDF_LOGE("%{public}s: init error, return %{public}d", __func__, ret);
744             goto ERR_FREE_SESSION;
745         }
746     } else {
747         ret = HDF_ERR_NOT_SUPPORT;
748         goto ERR_FREE_SESSION;
749     }
750 
751     if (session != NULL) {
752         *session = tempSession;
753     }
754 
755     return HDF_SUCCESS;
756 
757 ERR_FREE_SESSION:
758     if (tempSession == g_usbRawDefaultSession) {
759         g_usbRawDefaultSession = NULL;
760     }
761 
762     RawUsbMemFree(tempSession);
763     return ret;
764 }
765 
RawExit(const struct UsbSession * session)766 int32_t RawExit(const struct UsbSession *session)
767 {
768     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
769     struct UsbSession *realSession = RawGetSession(session);
770     if (realSession == NULL || AdapterAtomicDec(&realSession->refCount) > 0) {
771         return HDF_SUCCESS;
772     }
773 
774     if (osAdapterOps->exit) {
775         osAdapterOps->exit(realSession);
776     }
777     if (realSession == g_usbRawDefaultSession) {
778         g_usbRawDefaultSession = NULL;
779     }
780 
781     OsalMutexDestroy(&realSession->lock);
782     RawUsbMemFree(realSession);
783 
784     return HDF_SUCCESS;
785 }
786 
RawOpenDevice(const struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)787 struct UsbDeviceHandle *RawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
788 {
789     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
790     struct UsbSession *realSession = NULL;
791 
792     if (osAdapterOps->openDevice == NULL) {
793         HDF_LOGE("%{public}s: openDevice is null", __func__);
794         return NULL;
795     }
796 
797     realSession = RawGetSession(session);
798     if (realSession == NULL) {
799         return NULL;
800     }
801 
802     return osAdapterOps->openDevice(realSession, busNum, usbAddr);
803 }
804 
RawCloseDevice(const struct UsbDeviceHandle * devHandle)805 int32_t RawCloseDevice(const struct UsbDeviceHandle *devHandle)
806 {
807     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
808 
809     if (devHandle == NULL) {
810         HDF_LOGE("%{public}s devHandle is null", __func__);
811         return HDF_ERR_INVALID_PARAM;
812     }
813 
814     if (osAdapterOps->closeDevice) {
815         osAdapterOps->closeDevice((struct UsbDeviceHandle *)devHandle);
816     } else {
817         return HDF_ERR_NOT_SUPPORT;
818     }
819 
820     return HDF_SUCCESS;
821 }
822 
RawClaimInterface(struct UsbDeviceHandle * devHandle,int32_t interfaceNumber)823 int32_t RawClaimInterface(struct UsbDeviceHandle *devHandle, int32_t interfaceNumber)
824 {
825     int32_t ret;
826     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
827 
828     if (devHandle == NULL || interfaceNumber < 0 || interfaceNumber >= USB_MAXINTERFACES) {
829         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
830         return HDF_ERR_INVALID_PARAM;
831     }
832 
833     OsalMutexLock(&devHandle->lock);
834     if ((devHandle->claimedInterfaces) & (1U << (uint32_t)interfaceNumber)) {
835         ret = HDF_SUCCESS;
836         goto OUT;
837     }
838 
839     if (!osAdapterOps->claimInterface) {
840         ret = HDF_ERR_NOT_SUPPORT;
841         goto OUT;
842     }
843 
844     ret = osAdapterOps->claimInterface(devHandle, (unsigned int)interfaceNumber);
845     if (ret == HDF_SUCCESS) {
846         devHandle->claimedInterfaces |= 1U << (uint32_t)interfaceNumber;
847     }
848 
849 OUT:
850     OsalMutexUnlock(&devHandle->lock);
851 
852     return ret;
853 }
854 
RawClaimInterfaceForce(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)855 int32_t RawClaimInterfaceForce(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
856 {
857     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
858 
859     if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
860         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
861         return HDF_ERR_INVALID_PARAM;
862     }
863     if (((devHandle->claimedInterfaces) & (1U << interfaceNumber)) != 0) {
864         return HDF_SUCCESS;
865     }
866 
867     OsalMutexLock(&devHandle->lock);
868     int32_t ret = osAdapterOps->detachKernelDriverAndClaim(devHandle, interfaceNumber);
869     if (ret == HDF_SUCCESS) {
870         devHandle->claimedInterfaces |= 1U << interfaceNumber;
871     }
872     OsalMutexUnlock(&devHandle->lock);
873     return ret;
874 }
875 
RawDetachInterface(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)876 int32_t RawDetachInterface(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
877 {
878     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
879 
880     if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
881         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
882         return HDF_ERR_INVALID_PARAM;
883     }
884     HDF_LOGI("interfaceNumber = %{public}u", interfaceNumber);
885     if (((devHandle->detachedInterfaces) & (1U << interfaceNumber)) != 0) {
886         return HDF_SUCCESS;
887     }
888 
889     OsalMutexLock(&devHandle->lock);
890     int32_t ret = osAdapterOps->detachKernelDriver(devHandle, interfaceNumber);
891     if (ret >= 0) {
892         devHandle->detachedInterfaces |= 1U << interfaceNumber;
893         devHandle->attachedInterfaces &= ~(1U << interfaceNumber);
894         OsalMutexUnlock(&devHandle->lock);
895         return HDF_SUCCESS;
896     }
897     OsalMutexUnlock(&devHandle->lock);
898     return HDF_FAILURE;
899 }
900 
RawAttachInterface(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)901 int32_t RawAttachInterface(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
902 {
903     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
904 
905     if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
906         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
907         return HDF_ERR_INVALID_PARAM;
908     }
909     HDF_LOGI("interfaceNumber = %{public}u", interfaceNumber);
910     if (((devHandle->attachedInterfaces) & (1U << interfaceNumber)) != 0) {
911         return HDF_SUCCESS;
912     }
913 
914     OsalMutexLock(&devHandle->lock);
915     int32_t ret = osAdapterOps->attachKernelDriver(devHandle, interfaceNumber);
916     if (ret >= 0) {
917         devHandle->attachedInterfaces |= 1U << interfaceNumber;
918         devHandle->detachedInterfaces &= ~(1U << interfaceNumber);
919         OsalMutexUnlock(&devHandle->lock);
920         return HDF_SUCCESS;
921     }
922     OsalMutexUnlock(&devHandle->lock);
923     return HDF_FAILURE;
924 }
925 
AllocRequest(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,size_t length)926 struct UsbHostRequest *AllocRequest(const struct UsbDeviceHandle *devHandle, int32_t isoPackets, size_t length)
927 {
928     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
929 
930     if (osAdapterOps->allocRequest == NULL) {
931         return NULL;
932     }
933 
934     return osAdapterOps->allocRequest(devHandle, isoPackets, length);
935 }
936 
AllocRequestByMmap(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,size_t length)937 struct UsbHostRequest *AllocRequestByMmap(const struct UsbDeviceHandle *devHandle, int32_t isoPackets, size_t length)
938 {
939     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
940 
941     if (osAdapterOps->allocRequestByMmap == NULL) {
942         return NULL;
943     }
944 
945     return osAdapterOps->allocRequestByMmap(devHandle, isoPackets, length);
946 }
947 
FreeRequest(const struct UsbHostRequest * request)948 int32_t FreeRequest(const struct UsbHostRequest *request)
949 {
950     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
951     if (osAdapterOps->freeRequest == NULL) {
952         return HDF_ERR_NOT_SUPPORT;
953     }
954 
955     return osAdapterOps->freeRequest((struct UsbHostRequest *)request);
956 }
957 
FreeRequestByMmap(const struct UsbHostRequest * request)958 int32_t FreeRequestByMmap(const struct UsbHostRequest *request)
959 {
960     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
961     if (osAdapterOps->freeRequestByMmap == NULL) {
962         return HDF_ERR_NOT_SUPPORT;
963     }
964 
965     return osAdapterOps->freeRequestByMmap((struct UsbHostRequest *)request);
966 }
967 
RawFillBulkRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)968 int32_t RawFillBulkRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
969     const struct UsbFillRequestData *fillRequestData)
970 {
971     if (request == NULL || request->buffer == NULL || devHandle == NULL || fillRequestData == NULL) {
972         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
973         return HDF_ERR_INVALID_PARAM;
974     }
975 
976     if (UsbEndpointDirOut(fillRequestData->endPoint)) {
977         if (fillRequestData->buffer == NULL) {
978             HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
979             return HDF_ERR_INVALID_PARAM;
980         }
981         if (memcpy_s(request->buffer, request->bufLen, fillRequestData->buffer, fillRequestData->length) != EOK) {
982             HDF_LOGE("%{public}s:%{public}d memcpy_s failed!", __func__, __LINE__);
983             return HDF_FAILURE;
984         }
985     }
986     request->devHandle = (struct UsbDeviceHandle *)devHandle;
987     request->endPoint = fillRequestData->endPoint;
988     request->requestType = USB_PIPE_TYPE_BULK;
989     request->timeout = fillRequestData->timeout;
990     request->length = fillRequestData->length;
991     request->userData = fillRequestData->userData;
992     request->callback = fillRequestData->callback;
993     request->userCallback = fillRequestData->userCallback;
994 
995     return HDF_SUCCESS;
996 }
997 
RawFillControlSetup(const unsigned char * setup,const struct UsbControlRequestData * requestData)998 int32_t RawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData)
999 {
1000     struct UsbRawControlSetup *setupData = (struct UsbRawControlSetup *)setup;
1001 
1002     if (setup == NULL || requestData == NULL) {
1003         HDF_LOGE("%{public}s: invalid param", __func__);
1004         return HDF_ERR_INVALID_PARAM;
1005     }
1006 
1007     setupData->requestType = requestData->requestType;
1008     setupData->request = requestData->requestCmd;
1009     setupData->value = CPU_TO_LE16(requestData->value);
1010     setupData->index = CPU_TO_LE16(requestData->index);
1011     setupData->length = CPU_TO_LE16(requestData->length);
1012 
1013     return HDF_SUCCESS;
1014 }
1015 
RawFillControlRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1016 int32_t RawFillControlRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1017     const struct UsbFillRequestData *fillRequestData)
1018 {
1019     if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1020         HDF_LOGE("%{public}s: invalid param", __func__);
1021         return HDF_ERR_INVALID_PARAM;
1022     }
1023 
1024     request->devHandle = (struct UsbDeviceHandle *)devHandle;
1025     request->endPoint = fillRequestData->endPoint;
1026     request->requestType = USB_PIPE_TYPE_CONTROL;
1027     request->timeout = fillRequestData->timeout;
1028     request->userData = fillRequestData->userData;
1029     request->callback = fillRequestData->callback;
1030     request->userCallback = fillRequestData->userCallback;
1031     request->length = fillRequestData->length;
1032 
1033     return HDF_SUCCESS;
1034 }
1035 
RawFillInterruptRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1036 int32_t RawFillInterruptRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1037     const struct UsbFillRequestData *fillRequestData)
1038 {
1039     if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1040         HDF_LOGE("%{public}s:%{public}d param is null!", __func__, __LINE__);
1041         return HDF_ERR_INVALID_PARAM;
1042     }
1043 
1044     if (UsbEndpointDirOut(fillRequestData->endPoint)) {
1045         if (memcpy_s(request->buffer, request->bufLen, fillRequestData->buffer, fillRequestData->length) != EOK) {
1046             HDF_LOGE("%{public}s:%{public}d memcpy_s failed!", __func__, __LINE__);
1047             return HDF_FAILURE;
1048         }
1049     }
1050     request->devHandle = (struct UsbDeviceHandle *)devHandle;
1051     request->endPoint = fillRequestData->endPoint;
1052     request->requestType = USB_PIPE_TYPE_INTERRUPT;
1053     request->timeout = fillRequestData->timeout;
1054     request->length = fillRequestData->length;
1055     request->userData = fillRequestData->userData;
1056     request->callback = fillRequestData->callback;
1057     request->userCallback = fillRequestData->userCallback;
1058 
1059     return HDF_SUCCESS;
1060 }
1061 
RawFillInterruptRequestByMmap(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1062 int32_t RawFillInterruptRequestByMmap(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1063     const struct UsbFillRequestData *fillRequestData)
1064 {
1065     if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1066         HDF_LOGE("%{public}s:%{public}d param is null!", __func__, __LINE__);
1067         return HDF_ERR_INVALID_PARAM;
1068     }
1069 
1070     request->devHandle = (struct UsbDeviceHandle *)devHandle;
1071     request->endPoint = fillRequestData->endPoint;
1072     request->requestType = USB_PIPE_TYPE_INTERRUPT;
1073     request->timeout = fillRequestData->timeout;
1074     request->length = fillRequestData->length;
1075     request->userData = fillRequestData->userData;
1076     request->callback = fillRequestData->callback;
1077     request->userCallback = fillRequestData->userCallback;
1078 
1079     return HDF_SUCCESS;
1080 }
1081 
RawFillIsoRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1082 int32_t RawFillIsoRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1083     const struct UsbFillRequestData *fillRequestData)
1084 {
1085     if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1086         HDF_LOGE("%{public}s:%{public}d param is NULL!", __func__, __LINE__);
1087         return HDF_ERR_INVALID_PARAM;
1088     }
1089 
1090     if (UsbEndpointDirOut(fillRequestData->endPoint)) {
1091         int32_t ret = memcpy_s(request->buffer, request->bufLen, fillRequestData->buffer, fillRequestData->length);
1092         if (ret != EOK) {
1093             HDF_LOGE("%{public}s:%{public}d memcpy_s fail!", __func__, __LINE__);
1094             return ret;
1095         }
1096     }
1097     request->devHandle = (struct UsbDeviceHandle *)devHandle;
1098     request->endPoint = fillRequestData->endPoint;
1099     request->requestType = USB_PIPE_TYPE_ISOCHRONOUS;
1100     request->timeout = fillRequestData->timeout;
1101     request->length = fillRequestData->length;
1102     request->numIsoPackets = fillRequestData->numIsoPackets;
1103     request->userData = fillRequestData->userData;
1104     request->callback = fillRequestData->callback;
1105     request->userCallback = fillRequestData->userCallback;
1106 
1107     return HDF_SUCCESS;
1108 }
1109 
RawSendControlRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbControlRequestData * requestData)1110 int32_t RawSendControlRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1111     const struct UsbControlRequestData *requestData)
1112 {
1113     struct UsbFillRequestData fillRequestData = {0};
1114     unsigned char *setup = NULL;
1115     int32_t completed = 0;
1116     int32_t ret;
1117 
1118     if (request == NULL || request->buffer == NULL || devHandle == NULL || requestData == NULL) {
1119         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1120         return HDF_ERR_INVALID_PARAM;
1121     }
1122 
1123     setup = request->buffer;
1124     RawFillControlSetup(setup, requestData);
1125     if ((requestData->requestType & USB_DDK_ENDPOINT_DIR_MASK) == USB_PIPE_DIRECTION_OUT) {
1126         fillRequestData.endPoint = 0;
1127         fillRequestData.length = requestData->length;
1128         if (requestData->length > 0) {
1129             ret = memcpy_s(request->buffer + USB_RAW_CONTROL_SETUP_SIZE, fillRequestData.length, requestData->data,
1130                 requestData->length);
1131             if (ret != EOK) {
1132                 HDF_LOGE("%{public}s:%{public}d memcpy_s fail, requestData.length=%{public}d",
1133                     __func__, __LINE__, requestData->length);
1134                 return ret;
1135             }
1136         }
1137         fillRequestData.length = USB_RAW_CONTROL_SETUP_SIZE + requestData->length;
1138     } else {
1139         fillRequestData.endPoint = (0x1 << USB_DIR_OFFSET);
1140     }
1141     fillRequestData.userCallback = NULL;
1142     fillRequestData.callback = SyncRequestCallback;
1143     fillRequestData.userData = &completed;
1144     fillRequestData.timeout = requestData->timeout;
1145     RawFillControlRequest(request, devHandle, &fillRequestData);
1146 
1147     ret = OsalSemInit(&request->sem, 0);
1148     if (ret != HDF_SUCCESS) {
1149         HDF_LOGE("%{public}s:%{public}d OsalSemInit failed, ret = %{public}d ", __func__, __LINE__, ret);
1150         return ret;
1151     }
1152 
1153     ret = RawSubmitRequest(request);
1154     if (ret < 0) {
1155         OsalSemDestroy(&request->sem);
1156         return ret;
1157     }
1158 
1159     return ControlRequestCompletion(request, (struct UsbControlRequestData *)requestData);
1160 }
1161 
RawSendBulkRequest(const struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRequestData * requestData)1162 int32_t RawSendBulkRequest(const struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1163     const struct UsbRequestData *requestData)
1164 {
1165     if (request == NULL || devHandle == NULL || requestData == NULL) {
1166         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1167         return HDF_ERR_INVALID_PARAM;
1168     }
1169 
1170     return HandleSyncRequest((struct UsbHostRequest *)request, devHandle, requestData, USB_PIPE_TYPE_BULK);
1171 }
1172 
RawSendInterruptRequest(const struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRequestData * requestData)1173 int32_t RawSendInterruptRequest(const struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1174     const struct UsbRequestData *requestData)
1175 {
1176     if (request == NULL || devHandle == NULL || requestData == NULL) {
1177         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1178         return HDF_ERR_INVALID_PARAM;
1179     }
1180 
1181     return HandleSyncRequest((struct UsbHostRequest *)request, devHandle, requestData, USB_PIPE_TYPE_INTERRUPT);
1182 }
1183 
RawAllocRequest(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,int32_t length)1184 struct UsbHostRequest *RawAllocRequest(const struct UsbDeviceHandle *devHandle, int32_t isoPackets, int32_t length)
1185 {
1186     struct UsbHostRequest *request = NULL;
1187     request = (struct UsbHostRequest *)AllocRequest(devHandle, isoPackets, length);
1188     if (request == NULL) {
1189         HDF_LOGE("%{public}s:%{public}d RawMemAlloc failed", __func__, __LINE__);
1190         return NULL;
1191     }
1192     return request;
1193 }
1194 
RawAllocRequestByMmap(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,int32_t length)1195 struct UsbHostRequest *RawAllocRequestByMmap(
1196     const struct UsbDeviceHandle *devHandle, int32_t isoPackets, int32_t length)
1197 {
1198     struct UsbHostRequest *request = NULL;
1199     request = (struct UsbHostRequest *)AllocRequestByMmap(devHandle, isoPackets, length);
1200     if (request == NULL) {
1201         HDF_LOGE("%{public}s:%{public}d RawMemAlloc failed", __func__, __LINE__);
1202         return NULL;
1203     }
1204     return request;
1205 }
1206 
RawFreeRequest(const struct UsbHostRequest * request)1207 int32_t RawFreeRequest(const struct UsbHostRequest *request)
1208 {
1209     if (request == NULL) {
1210         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1211         return HDF_ERR_INVALID_PARAM;
1212     }
1213     return FreeRequest(request);
1214 }
1215 
RawFreeRequestByMmap(const struct UsbHostRequest * request)1216 int32_t RawFreeRequestByMmap(const struct UsbHostRequest *request)
1217 {
1218     if (request == NULL) {
1219         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1220         return HDF_ERR_INVALID_PARAM;
1221     }
1222     return FreeRequestByMmap(request);
1223 }
1224 
RawGetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIndex,struct UsbRawConfigDescriptor ** const config)1225 int32_t RawGetConfigDescriptor(
1226     const struct UsbDevice *dev, uint8_t configIndex, struct UsbRawConfigDescriptor ** const config)
1227 {
1228     int32_t ret;
1229     union UsbiConfigDescBuf tmpConfig;
1230     uint16_t configLen;
1231     uint8_t *buf = NULL;
1232 
1233     if (dev == NULL) {
1234         HDF_LOGE("%{public}s: invalid param", __func__);
1235         return HDF_ERR_INVALID_PARAM;
1236     }
1237 
1238     ret = GetConfigDescriptor(dev, configIndex, tmpConfig.buf, sizeof(tmpConfig.buf));
1239     if (ret < HDF_SUCCESS) {
1240         HDF_LOGE("%{public}s:%{public}d ret=%{public}d", __func__, __LINE__, ret);
1241         return ret;
1242     }
1243     configLen = LE16_TO_CPU(tmpConfig.desc.wTotalLength);
1244     buf = RawUsbMemAlloc(configLen);
1245     if (buf == NULL) {
1246         HDF_LOGE("%{public}s:%{public}d RawUsbMemAlloc failed", __func__, __LINE__);
1247         return HDF_ERR_MALLOC_FAIL;
1248     }
1249 
1250     ret = GetConfigDescriptor(dev, configIndex, buf, configLen);
1251     if (ret >= HDF_SUCCESS) {
1252         ret = DescToConfig(buf, ret, config);
1253     }
1254 
1255     RawUsbMemFree(buf);
1256     buf = NULL;
1257 
1258     return ret;
1259 }
1260 
RawClearConfiguration(struct UsbRawConfigDescriptor * config)1261 void RawClearConfiguration(struct UsbRawConfigDescriptor *config)
1262 {
1263     uint8_t i;
1264 
1265     if (config == NULL) {
1266         HDF_LOGE("%{public}s:%{public}d config is NULL", __func__, __LINE__);
1267         return;
1268     }
1269 
1270     for (i = 0; i < config->configDescriptor.bNumInterfaces; i++) {
1271         ClearInterface((const struct UsbRawInterface *)(config->interface[i]));
1272         config->interface[i] = NULL;
1273     }
1274 
1275     if (config->extra != NULL) {
1276         RawUsbMemFree((void *)config->extra);
1277         config->extra = NULL;
1278     }
1279 }
1280 
RawGetConfiguration(const struct UsbDeviceHandle * devHandle,int32_t * config)1281 int32_t RawGetConfiguration(const struct UsbDeviceHandle *devHandle, int32_t *config)
1282 {
1283     int32_t ret;
1284     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1285     uint8_t tmp = 0;
1286 
1287     if (devHandle == NULL || config == NULL) {
1288         HDF_LOGE("%{public}s:%{public}d param is null", __func__, __LINE__);
1289         return HDF_ERR_INVALID_PARAM;
1290     }
1291 
1292     if (!osAdapterOps->getConfiguration) {
1293         HDF_LOGE("%{public}s:%{public}d adapter don't support getConfiguration", __func__, __LINE__);
1294         return HDF_ERR_NOT_SUPPORT;
1295     }
1296 
1297     ret = osAdapterOps->getConfiguration(devHandle, &tmp);
1298     *config = tmp;
1299     return ret;
1300 }
1301 
RawUsbControlMsg(const struct UsbDeviceHandle * devHandle,struct UsbControlRequestData * ctrlData)1302 int32_t RawUsbControlMsg(const struct UsbDeviceHandle *devHandle,  struct UsbControlRequestData *ctrlData)
1303 {
1304     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1305     if (devHandle == NULL || ctrlData == NULL) {
1306         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
1307         return HDF_ERR_INVALID_PARAM;
1308     }
1309 
1310     if (!osAdapterOps->usbControlMsg) {
1311         HDF_LOGE("%{public}s:%{public}d not support control msg operation", __func__, __LINE__);
1312         return HDF_ERR_NOT_SUPPORT;
1313     }
1314     return osAdapterOps->usbControlMsg(devHandle, ctrlData);
1315 }
1316 
RawUsbGetUsbSpeed(const struct UsbDeviceHandle * devHandle)1317 int32_t RawUsbGetUsbSpeed(const struct UsbDeviceHandle *devHandle)
1318 {
1319     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1320     if (devHandle == NULL) {
1321         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
1322         return HDF_ERR_INVALID_PARAM;
1323     }
1324 
1325     if (!osAdapterOps->getUsbSpeed) {
1326         HDF_LOGE("%{public}s:%{public}d not support get usb speed operation", __func__, __LINE__);
1327         return HDF_ERR_NOT_SUPPORT;
1328     }
1329     return osAdapterOps->getUsbSpeed(devHandle);
1330 }
1331 
RawSetConfiguration(const struct UsbDeviceHandle * devHandle,int32_t configuration)1332 int32_t RawSetConfiguration(const struct UsbDeviceHandle *devHandle, int32_t configuration)
1333 {
1334     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1335 
1336     if (configuration < -1 || configuration > (int)0xFF) {
1337         HDF_LOGE("%{public}s: invalid param", __func__);
1338         return HDF_ERR_INVALID_PARAM;
1339     }
1340     if (!osAdapterOps->setConfiguration) {
1341         return HDF_ERR_NOT_SUPPORT;
1342     }
1343 
1344     return osAdapterOps->setConfiguration((struct UsbDeviceHandle *)devHandle, configuration);
1345 }
1346 
RawGetDescriptor(const struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRawDescriptorParam * param,const unsigned char * data)1347 int32_t RawGetDescriptor(const struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1348     const struct UsbRawDescriptorParam *param, const unsigned char *data)
1349 {
1350     int32_t ret;
1351     struct UsbControlRequestData requestData;
1352 
1353     if (request == NULL || devHandle == NULL || param == NULL || data == NULL) {
1354         HDF_LOGE("%{public}s:%{public}d param is NULL!", __func__, __LINE__);
1355         return HDF_ERR_INVALID_PARAM;
1356     }
1357 
1358     requestData.requestType = USB_PIPE_DIRECTION_IN;
1359     requestData.requestCmd = USB_REQUEST_GET_DESCRIPTOR;
1360     requestData.value = (uint16_t)((param->descType << BYTE_LENGTH) | param->descIndex);
1361     requestData.index = 0;
1362     requestData.data = (unsigned char *)data;
1363     requestData.length = (uint16_t)param->length;
1364     requestData.timeout = USB_RAW_REQUEST_DEFAULT_TIMEOUT;
1365     ret = RawSendControlRequest((struct UsbHostRequest *)request, devHandle, &requestData);
1366 
1367     return ret;
1368 }
1369 
RawGetDevice(const struct UsbDeviceHandle * devHandle)1370 struct UsbDevice *RawGetDevice(const struct UsbDeviceHandle *devHandle)
1371 {
1372     if (devHandle == NULL) {
1373         HDF_LOGE("%{public}s: invalid param", __func__);
1374         return NULL;
1375     }
1376 
1377     return devHandle->dev;
1378 }
1379 
RawGetDeviceDescriptor(const struct UsbDevice * dev,struct UsbDeviceDescriptor * desc)1380 int32_t RawGetDeviceDescriptor(const struct UsbDevice *dev, struct UsbDeviceDescriptor *desc)
1381 {
1382     if (dev == NULL || desc == NULL || sizeof(dev->deviceDescriptor) != USB_DDK_DT_DEVICE_SIZE) {
1383         HDF_LOGE("%{public}s: struct UsbDeviceDescriptor is not expected size", __func__);
1384         return HDF_ERR_INVALID_PARAM;
1385     }
1386 
1387     *desc = dev->deviceDescriptor;
1388     return HDF_SUCCESS;
1389 }
1390 
RawAttachKernelDriver(struct UsbDeviceHandle * devHandle,uint8_t interfaceNumber)1391 void RawAttachKernelDriver(struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber)
1392 {
1393     if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES) {
1394         HDF_LOGE("%{public}s param is NULL or interfaceNumber = %{public}d is out of range", __func__, interfaceNumber);
1395         return;
1396     }
1397 
1398     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1399     if (osAdapterOps->attachKernelDriver == NULL) {
1400         HDF_LOGE("%{public}s: releaseInterface not support", __func__);
1401         return;
1402     }
1403 
1404     OsalMutexLock(&devHandle->lock);
1405     osAdapterOps->attachKernelDriver(devHandle, interfaceNumber);
1406     OsalMutexUnlock(&devHandle->lock);
1407     return;
1408 }
1409 
RawReleaseInterface(struct UsbDeviceHandle * devHandle,int32_t interfaceNumber)1410 int32_t RawReleaseInterface(struct UsbDeviceHandle *devHandle, int32_t interfaceNumber)
1411 {
1412     int32_t ret;
1413     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1414 
1415     if (devHandle == NULL || interfaceNumber < 0 || interfaceNumber >= USB_MAXINTERFACES) {
1416         HDF_LOGE(
1417             "%{public}s:%{public}d param is NULL or interfaceNumber = %{public}d is out of range",
1418             __func__, __LINE__, interfaceNumber);
1419         return HDF_ERR_INVALID_PARAM;
1420     }
1421 
1422     OsalMutexLock(&devHandle->lock);
1423     if (!(devHandle->claimedInterfaces & (1U << (uint32_t)interfaceNumber))) {
1424         ret = HDF_ERR_BAD_FD;
1425         goto OUT;
1426     }
1427 
1428     if (!osAdapterOps->releaseInterface) {
1429         ret = HDF_ERR_NOT_SUPPORT;
1430         goto OUT;
1431     }
1432 
1433     ret = osAdapterOps->releaseInterface(devHandle, (unsigned int)interfaceNumber);
1434     if (ret == HDF_SUCCESS) {
1435         devHandle->claimedInterfaces &= ~(1U << (uint32_t)interfaceNumber);
1436     }
1437 
1438 OUT:
1439     OsalMutexUnlock(&devHandle->lock);
1440 
1441     return ret;
1442 }
1443 
RawResetDevice(const struct UsbDeviceHandle * devHandle)1444 int32_t RawResetDevice(const struct UsbDeviceHandle *devHandle)
1445 {
1446     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1447 
1448     if (!osAdapterOps->resetDevice) {
1449         return HDF_ERR_NOT_SUPPORT;
1450     }
1451 
1452     return osAdapterOps->resetDevice(devHandle);
1453 }
1454 
RawSubmitRequest(const struct UsbHostRequest * request)1455 int32_t RawSubmitRequest(const struct UsbHostRequest *request)
1456 {
1457     int32_t ret;
1458     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1459 
1460     if (request == NULL) {
1461         HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1462         return HDF_ERR_INVALID_PARAM;
1463     }
1464 
1465     if (!osAdapterOps->submitRequest) {
1466         return HDF_ERR_NOT_SUPPORT;
1467     }
1468 
1469     ret = osAdapterOps->submitRequest((struct UsbHostRequest *)request);
1470     if (ret != HDF_SUCCESS) {
1471         HDF_LOGE("%{public}s:%{public}d ret = %{public}d", __func__, __LINE__, ret);
1472     }
1473 
1474     return ret;
1475 }
1476 
RawCancelRequest(const struct UsbHostRequest * request)1477 int32_t RawCancelRequest(const struct UsbHostRequest *request)
1478 {
1479     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1480 
1481     if (!osAdapterOps->cancelRequest) {
1482         return HDF_ERR_NOT_SUPPORT;
1483     }
1484 
1485     return osAdapterOps->cancelRequest((struct UsbHostRequest *)request);
1486 }
1487 
RawHandleRequest(const struct UsbDeviceHandle * devHandle)1488 int32_t RawHandleRequest(const struct UsbDeviceHandle *devHandle)
1489 {
1490     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1491     int32_t ret;
1492 
1493     if (!osAdapterOps->urbCompleteHandle) {
1494         return HDF_ERR_NOT_SUPPORT;
1495     }
1496 
1497     ret = osAdapterOps->urbCompleteHandle(devHandle);
1498     if (ret < 0) {}
1499 
1500     return ret;
1501 }
1502 
RawClearHalt(const struct UsbDeviceHandle * devHandle,uint8_t pipeAddress)1503 int32_t RawClearHalt(const struct UsbDeviceHandle *devHandle, uint8_t pipeAddress)
1504 {
1505     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1506     unsigned int endPoint = pipeAddress;
1507 
1508     if (osAdapterOps->clearHalt == NULL) {
1509         return HDF_ERR_NOT_SUPPORT;
1510     }
1511 
1512     return osAdapterOps->clearHalt(devHandle, endPoint);
1513 }
1514 
RawHandleRequestCompletion(struct UsbHostRequest * request,UsbRequestStatus status)1515 int32_t RawHandleRequestCompletion(struct UsbHostRequest *request, UsbRequestStatus status)
1516 {
1517     if (request == NULL) {
1518         HDF_LOGE("%{public}s:%{public}d request is NULL!", __func__, __LINE__);
1519         return HDF_ERR_INVALID_PARAM;
1520     }
1521 
1522     request->status = status;
1523     if (request->callback) {
1524         request->callback((void *)request);
1525     }
1526 
1527     return HDF_SUCCESS;
1528 }
1529 
RawSetInterfaceAltsetting(const struct UsbDeviceHandle * devHandle,uint8_t interfaceNumber,uint8_t settingIndex)1530 int32_t RawSetInterfaceAltsetting(
1531     const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber, uint8_t settingIndex)
1532 {
1533     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1534 
1535     if (osAdapterOps->setInterfaceAltsetting == NULL) {
1536         return HDF_ERR_NOT_SUPPORT;
1537     }
1538 
1539     return osAdapterOps->setInterfaceAltsetting(devHandle, interfaceNumber, settingIndex);
1540 }
1541 
RawGetTid(void)1542 UsbRawTidType RawGetTid(void)
1543 {
1544     return UsbAdapterGetTid();
1545 }
1546 
RawRegisterSignal(void)1547 int32_t RawRegisterSignal(void)
1548 {
1549     return UsbAdapterRegisterSignal();
1550 }
1551 
RawKillSignal(struct UsbDeviceHandle * devHandle,UsbRawTidType tid)1552 int32_t RawKillSignal(struct UsbDeviceHandle *devHandle, UsbRawTidType tid)
1553 {
1554     return UsbAdapterKillSignal(devHandle, tid);
1555 }
1556 
RawInitPnpService(enum UsbPnpNotifyServiceCmd cmdType,struct UsbPnpAddRemoveInfo infoData)1557 int32_t RawInitPnpService(enum UsbPnpNotifyServiceCmd cmdType, struct UsbPnpAddRemoveInfo infoData)
1558 {
1559     if (cmdType != USB_PNP_NOTIFY_ADD_INTERFACE && cmdType != USB_PNP_NOTIFY_REMOVE_INTERFACE) {
1560         HDF_LOGE("%{public}s:%{public}d invalid param cmdType", __func__, __LINE__);
1561         return HDF_ERR_INVALID_PARAM;
1562     }
1563 
1564     int32_t ret;
1565     struct HdfIoService *serv = HdfIoServiceBind(USB_HOST_PNP_SERVICE_NAME);
1566     if (serv == NULL || serv->dispatcher == NULL || serv->dispatcher->Dispatch == NULL) {
1567         ret = HDF_FAILURE;
1568         HDF_LOGE("%{public}s:%d failed to get service %s", __func__, __LINE__, USB_HOST_PNP_SERVICE_NAME);
1569         return ret;
1570     }
1571 
1572     struct HdfSBuf *pnpData = HdfSbufObtainDefaultSize();
1573     struct HdfSBuf *pnpReply = HdfSbufObtainDefaultSize();
1574     if (pnpData == NULL || pnpReply == NULL) {
1575         ret = HDF_FAILURE;
1576         HDF_LOGE("%{public}s:%{public}d GetService err", __func__, __LINE__);
1577         goto ERR_SBUF;
1578     }
1579 
1580     if (!HdfSbufWriteBuffer(pnpData, (const void *)(&infoData), sizeof(struct UsbPnpAddRemoveInfo))) {
1581         HDF_LOGE("%{public}s:%{public}d sbuf write infoData failed", __func__, __LINE__);
1582         ret = HDF_FAILURE;
1583         goto OUT;
1584     }
1585 
1586     ret = serv->dispatcher->Dispatch(&serv->object, cmdType, pnpData, pnpReply);
1587     if (ret != HDF_SUCCESS) {
1588         HDF_LOGE("%{public}s:%{public}d Dispatch USB_PNP_NOTIFY_REMOVE_TEST failed ret = %{public}d",
1589             __func__, __LINE__, ret);
1590         goto OUT;
1591     }
1592 
1593     int32_t replyData = 0;
1594     if (!HdfSbufReadInt32(pnpReply, &replyData)) {
1595         HDF_LOGE("%{public}s:HdfSbufReadInt32 failed", __func__);
1596         ret = HDF_FAILURE;
1597         goto OUT;
1598     }
1599     if (replyData != INT32_MAX) {
1600         HDF_LOGE("%{public}s:%{public}d cmdType = %{public}d reply failed", __func__, __LINE__, cmdType);
1601         ret = HDF_FAILURE;
1602         goto OUT;
1603     }
1604     ret = HDF_SUCCESS;
1605     HDF_LOGI("%{public}s:%{public}d cmdType = %{public}d reply success", __func__, __LINE__, cmdType);
1606 
1607 OUT:
1608     HdfSbufRecycle(pnpData);
1609     HdfSbufRecycle(pnpReply);
1610 ERR_SBUF:
1611     HdfIoServiceRecycle(serv);
1612 
1613     return ret;
1614 }
1615 
RawRequestListInit(struct UsbDevice * deviceObj)1616 void RawRequestListInit(struct UsbDevice *deviceObj)
1617 {
1618     if (deviceObj == NULL) {
1619         HDF_LOGE("%{public}s:%{public}d deviceObj is NULL!", __func__, __LINE__);
1620         return;
1621     }
1622 
1623     OsalMutexInit(&deviceObj->requestLock);
1624     HdfSListInit(&deviceObj->requestList);
1625 }
1626 
RawUsbMemAlloc(size_t size)1627 void *RawUsbMemAlloc(size_t size)
1628 {
1629     return RawUsbMemCalloc(size);
1630 }
1631 
RawUsbMemCalloc(size_t size)1632 void *RawUsbMemCalloc(size_t size)
1633 {
1634     if (size == 0) {
1635         HDF_LOGE("%{public}s:%{public}d size is 0", __func__, __LINE__);
1636         return NULL;
1637     }
1638 
1639     void *buf = OsalMemCalloc(size);
1640     if (buf == NULL) {
1641         HDF_LOGE("%{public}s: %{public}d, OsalMemCalloc failed", __func__, __LINE__);
1642         return NULL;
1643     }
1644 
1645     return buf;
1646 }
1647 
RawUsbMemFree(void * mem)1648 void RawUsbMemFree(void *mem)
1649 {
1650     if (mem == NULL) {
1651         HDF_LOGE("%{public}s:%{public}d mem is null.", __func__, __LINE__);
1652         return;
1653     }
1654 
1655     if (mem != NULL) {
1656         OsalMemFree(mem);
1657         mem = NULL;
1658     }
1659 }
1660 
RawGetInterfaceActiveStatus(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)1661 bool RawGetInterfaceActiveStatus(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
1662 {
1663     struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1664     if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
1665         HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
1666         return false;
1667     }
1668     HDF_LOGI("interfaceNumber = %{public}u", interfaceNumber);
1669 
1670     OsalMutexLock(&devHandle->lock);
1671     bool ret = osAdapterOps->getInterfaceActiveStatus(devHandle, interfaceNumber);
1672     OsalMutexUnlock(&devHandle->lock);
1673     return ret;
1674 }
1675 
RawUsbCloseCtlProcess(const UsbInterfaceHandle * interfaceHandle)1676 int32_t RawUsbCloseCtlProcess(const UsbInterfaceHandle *interfaceHandle)
1677 {
1678     return UsbCloseCtlProcess(interfaceHandle);
1679 }