Lines Matching refs:request
447 static void OsFreeIsoUrbs(struct UsbHostRequest *request)
451 for (int32_t i = 0; i < request->numUrbs; i++) {
452 urb = request->isoUrbs[i];
457 request->isoUrbs[i] = NULL;
460 RawUsbMemFree(request->isoUrbs);
461 request->isoUrbs = NULL;
464 static void OsDiscardUrbs(const struct UsbHostRequest *request, int32_t first, int32_t last)
469 if ((request == NULL) || (request->devHandle == NULL) || (first > URBS_PER_REQUEST) || (first > last)) {
475 if (request->requestType == USB_REQUEST_TYPE_ISOCHRONOUS) {
476 as = (struct Async *)request->isoUrbs[i];
478 as = &(((struct Async *)request->urbs)[i]);
488 DPRINTFN(0, "%s:%d discard request\n", __func__, __LINE__);
494 struct UsbHostRequest * const request, const UsbAdapterDevice *adapterDevice, const struct UsbDevice *dev)
500 if ((request == NULL) || (request->length > MAX_BULK_DATA_BUFFER_LENGTH) || (request->buffer == NULL) ||
504 uhe = usb_find_host_endpoint((UsbAdapterDevice *)adapterDevice, request->requestType, request->endPoint);
509 if (request->urbs == NULL) {
511 request->urbs = (void *)as;
512 request->numUrbs = 1;
515 if (request->urbs == NULL) {
519 as = (struct Async *)request->urbs;
533 urb->transfer_buffer = request->buffer;
534 urb->context = (void *)request;
546 static int32_t OsSubmitControlRequest(struct UsbHostRequest *request)
551 if ((request == NULL) || (request->length > MAX_BULK_DATA_BUFFER_LENGTH) || (request->devHandle == NULL) ||
552 (request->buffer == NULL)) {
555 struct UsbDeviceHandle *handle = request->devHandle;
564 return OsSubmitControlMsg(request, adapterDevice, dev);
568 struct Async *pas, struct UsbHostRequest *request, int32_t bulkBufferLen, int32_t number)
578 urb->context = (void *)request;
579 switch (request->requestType) {
586 DPRINTFN(0, "%s:%d unknown requestType=%u\n", __func__, __LINE__, request->requestType);
589 urb->transfer_buffer = request->buffer + (number * bulkBufferLen);
591 if (number == request->numUrbs - 1) {
592 uint32_t len = (uint32_t)(request->length % bulkBufferLen);
602 struct UsbHostRequest * const request, struct Async * const as, int32_t bulkBufferLen)
605 int32_t numUrbs = request->numUrbs;
606 struct UsbDevice *dev = request->devHandle->dev;
611 UsbAdapterHostEndpoint *uhe = usb_find_host_endpoint(adapterDevice, request->requestType, request->endPoint);
626 ret = OsSubmitBulkRequestHandleUrb(pas, request, bulkBufferLen, i);
644 OsalMutexLock(&request->lock);
645 request->numRetired += numUrbs - i;
647 request->reqStatus = USB_REQUEST_ERROR;
649 OsDiscardUrbs(request, 0, i);
650 OsalMutexUnlock(&request->lock);
657 static int32_t OsSubmitBulkRequest(struct UsbHostRequest * const request)
663 if ((request == NULL) || (request->devHandle == NULL)) {
668 if (request->length > MAX_BULK_DATA_BUFFER_LENGTH || request->length <= 0) {
669 DPRINTFN(0, "Bulk request size err\n");
673 if (request->devHandle->caps & USB_ADAPTER_CAP_BULK_SCATTER_GATHER) {
674 bulkBufferLen = request->length ? request->length : 1;
678 if (request->length < bulkBufferLen) {
681 numUrbs = (request->length + bulkBufferLen - 1) / bulkBufferLen;
683 if (request->urbs == NULL) {
685 request->urbs = (void *)as;
687 RawUsbMemFree(request->urbs);
689 request->urbs = (void *)as;
691 if (request->urbs == NULL) {
695 as = (struct Async *)request->urbs;
696 request->numUrbs = numUrbs;
697 request->numRetired = 0;
698 request->reqStatus = USB_REQUEST_COMPLETED;
700 return OsSubmitBulkRequestHandle(request, as, bulkBufferLen);
703 static int32_t OsAllocIsoUrbs(struct UsbHostRequest *request, int32_t numUrbs, struct Async **ass)
706 unsigned char *urbBuffer = request->buffer;
707 int32_t numPacketsLeft = request->numIsoPackets;
711 UsbPipeType pipeType = request->requestType;
712 unsigned char endPoint = request->endPoint;
713 struct UsbDeviceHandle *handle = request->devHandle;
729 OsFreeIsoUrbs(request);
735 unsigned int packetLen = request->isoPacketDesc[packetIdx++].length;
742 urb->context = request;
750 static int32_t OsSubmitIsoUrbs(struct UsbHostRequest *request, int32_t numUrbs, struct Async **pUrbs)
769 OsFreeIsoUrbs(request);
773 OsalMutexLock(&request->lock);
774 request->reqStatus = USB_REQUEST_ERROR;
775 request->numRetired += numUrbs - i;
776 if (request->numRetired == numUrbs) {
778 request->isoUrbs = NULL;
780 OsalMutexUnlock(&request->lock);
788 static int32_t OsSubmitIsoRequest(struct UsbHostRequest *request)
792 if ((request == NULL) || (request->devHandle == NULL) || (request->numIsoPackets < 1)) {
797 if (request->length > MAX_ISO_DATA_BUFFER_LEN) {
798 DPRINTFN(0, "%s:%d request length exceed the maximum", __func__, __LINE__);
802 for (int32_t i = 0; i < request->numIsoPackets; i++) {
803 unsigned int packetLen = request->isoPacketDesc[i].length;
811 if (request->length < totalLen) {
815 int32_t numUrbs = (request->numIsoPackets + (MAX_ISO_PACKETS_PER_URB - 1)) / MAX_ISO_PACKETS_PER_URB;
821 request->isoUrbs = (void **)pUrbs;
822 request->numUrbs = numUrbs;
823 request->numRetired = 0;
824 request->isoPacketOffset = 0;
825 int32_t ret = OsAllocIsoUrbs(request, numUrbs, pUrbs);
831 return OsSubmitIsoUrbs(request, numUrbs, pUrbs);
834 static int32_t OsControlCompletion(struct UsbHostRequest *request, struct Async *as)
839 OsalMutexLock(&request->lock);
840 request->numRetired++;
841 request->actualLength += (int)urb->actual_length;
842 if (request->reqStatus == USB_REQUEST_CANCELLED) {
843 OsalMutexUnlock(&request->lock);
845 return RawHandleRequestCompletion(request, USB_REQUEST_CANCELLED);
856 DPRINTFN(0, "%s:%d unsupported control request", __func__, __LINE__);
873 OsalMutexUnlock(&request->lock);
875 return RawHandleRequestCompletion(request, status);
878 static void OsIsoRequestDesStatus(struct UsbHostRequest *request, UsbAdapterUrb *urb)
886 requestDesc = &request->isoPacketDesc[request->isoPacketOffset++];
912 static int32_t OsIsoCompletion(struct UsbHostRequest *request, struct Async *as)
919 if (request == NULL) {
924 numUrbs = request->numUrbs;
925 OsalMutexLock(&request->lock);
927 if (urb == request->isoUrbs[i]) {
934 OsalMutexUnlock(&request->lock);
938 OsIsoRequestDesStatus(request, urb);
939 request->numRetired++;
940 if (request->reqStatus != USB_REQUEST_COMPLETED) {
941 if (request->numRetired == numUrbs) {
942 OsFreeIsoUrbs(request);
943 OsalMutexUnlock(&request->lock);
944 return RawHandleRequestCompletion(request, USB_REQUEST_ERROR);
956 if (request->numRetired == numUrbs) {
958 OsFreeIsoUrbs(request);
959 OsalMutexUnlock(&request->lock);
960 return RawHandleRequestCompletion(request, status);
963 OsalMutexUnlock(&request->lock);
967 static int32_t OsProcessAbnormalReap(struct UsbHostRequest *request, const UsbAdapterUrb *urb)
970 unsigned char *target = request->buffer + request->actualLength;
976 request->actualLength += urb->actual_length;
978 if (request->numRetired == request->numUrbs) {
985 static int32_t OsUrbStatusToRequestStatus(struct UsbHostRequest *request, const UsbAdapterUrb *urb)
995 request->reqStatus = USB_REQUEST_NO_DEVICE;
999 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1000 request->reqStatus = USB_REQUEST_STALL;
1006 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1007 request->reqStatus = USB_REQUEST_OVERFLOW;
1013 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1014 request->reqStatus = USB_REQUEST_CANCELLED;
1019 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1020 request->reqStatus = USB_REQUEST_ERROR;
1029 static int32_t OsBulkCompletion(struct UsbHostRequest * const request, struct Async * const as)
1032 int32_t urbIdx = as - (struct Async *)request->urbs;
1035 OsalMutexLock(&request->lock);
1036 request->numRetired++;
1037 if (request->reqStatus != USB_REQUEST_COMPLETED) {
1038 if (OsProcessAbnormalReap(request, urb) == HDF_SUCCESS) {
1044 request->actualLength += urb->actual_length;
1045 ret = OsUrbStatusToRequestStatus(request, urb);
1052 if (request->numRetired == request->numUrbs) {
1055 if (request->reqStatus == USB_REQUEST_COMPLETED) {
1056 request->reqStatus = USB_REQUEST_COMPLETED_SHORT;
1063 if (request->numRetired == request->numUrbs) {
1066 OsDiscardUrbs(request, urbIdx + 1, request->numUrbs);
1069 OsalMutexUnlock(&request->lock);
1073 OsalMutexUnlock(&request->lock);
1075 return RawHandleRequestCompletion(request, request->reqStatus);
1078 static int32_t OsFreeRequest(const struct UsbHostRequest *request)
1081 if (request == NULL) {
1088 if (request->numUrbs != request->numRetired) {
1090 DPRINTFN(0, "request busy numUrbs:%d+numretired:%d\n", request->numUrbs, request->numRetired);
1304 struct UsbHostRequest *request = NULL;
1308 request = RawUsbMemCalloc(allocSize);
1309 if (request == NULL) {
1313 request->numIsoPackets = isoPackets;
1314 request->buffer = (unsigned char *)request + allocSize - length;
1315 request->bufLen = (int)length;
1316 return request;
1319 static int32_t AdapterFreeRequest(struct UsbHostRequest *request)
1321 if (request == NULL) {
1325 if (request->numUrbs > request->numRetired) {
1326 OsDiscardUrbs(request, request->numRetired, request->numUrbs);
1327 int32_t ret = OsFreeRequest(request);
1332 if (request->urbs) {
1333 RawUsbMemFree(request->urbs);
1334 request->urbs = NULL;
1336 RawUsbMemFree((void *)request);
1340 static int32_t AdapterSubmitRequest(struct UsbHostRequest *request)
1344 if (request == NULL) {
1345 DPRINTFN(0, "%s:%d request is NULL", __func__, __LINE__);
1348 OsalMutexInit(&(request->lock));
1349 request->actualLength = 0;
1350 request->numRetired = 0;
1351 request->numUrbs = 0;
1352 switch (request->requestType) {
1354 ret = OsSubmitControlRequest(request);
1357 ret = OsSubmitIsoRequest(request);
1361 ret = OsSubmitBulkRequest(request);
1364 DPRINTFN(0, "%s:%d unknown requestType=%u\n", __func__, __LINE__, request->requestType);
1372 static int32_t AdapterCancelRequest(const struct UsbHostRequest *request)
1374 if (!request->urbs) {
1379 OsDiscardUrbs(request, 0, request->numUrbs);
1391 struct UsbHostRequest *request = NULL;
1404 request = urb->context;
1405 switch (request->requestType) {
1407 ret = OsControlCompletion(request, as);
1410 ret = OsIsoCompletion(request, as);
1414 ret = OsBulkCompletion(request, as);
1417 DPRINTFN(0, "%s:%d unrecognised requestType %u\n", __func__, __LINE__, request->requestType);