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