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