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