libusb10.c (264344) | libusb10.c (284744) |
---|---|
1/* $FreeBSD: head/lib/libusb/libusb10.c 264344 2014-04-11 14:11:55Z hselasky $ */ | 1/* $FreeBSD: head/lib/libusb/libusb10.c 284744 2015-06-24 01:34:35Z araujo $ */ |
2/*- 3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 4 * Copyright (c) 2009 Hans Petter Selasky. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright --- 993 unchanged lines hidden (view full) --- 1003libusb10_isoc_proxy(struct libusb20_transfer *pxfer) 1004{ 1005 struct libusb_super_transfer *sxfer; 1006 struct libusb_transfer *uxfer; 1007 uint32_t actlen; 1008 uint16_t iso_packets; 1009 uint16_t i; 1010 uint8_t status; | 2/*- 3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 4 * Copyright (c) 2009 Hans Petter Selasky. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright --- 993 unchanged lines hidden (view full) --- 1003libusb10_isoc_proxy(struct libusb20_transfer *pxfer) 1004{ 1005 struct libusb_super_transfer *sxfer; 1006 struct libusb_transfer *uxfer; 1007 uint32_t actlen; 1008 uint16_t iso_packets; 1009 uint16_t i; 1010 uint8_t status; |
1011 uint8_t flags; | |
1012 1013 status = libusb20_tr_get_status(pxfer); 1014 sxfer = libusb20_tr_get_priv_sc1(pxfer); 1015 actlen = libusb20_tr_get_actual_length(pxfer); 1016 iso_packets = libusb20_tr_get_max_frames(pxfer); 1017 1018 if (sxfer == NULL) | 1011 1012 status = libusb20_tr_get_status(pxfer); 1013 sxfer = libusb20_tr_get_priv_sc1(pxfer); 1014 actlen = libusb20_tr_get_actual_length(pxfer); 1015 iso_packets = libusb20_tr_get_max_frames(pxfer); 1016 1017 if (sxfer == NULL) |
1019 return; /* cancelled - nothing to do */ | 1018 return; /* cancelled - nothing to do */ |
1020 1021 uxfer = (struct libusb_transfer *)( 1022 ((uint8_t *)sxfer) + sizeof(*sxfer)); 1023 1024 if (iso_packets > uxfer->num_iso_packets) 1025 iso_packets = uxfer->num_iso_packets; 1026 1027 if (iso_packets == 0) | 1019 1020 uxfer = (struct libusb_transfer *)( 1021 ((uint8_t *)sxfer) + sizeof(*sxfer)); 1022 1023 if (iso_packets > uxfer->num_iso_packets) 1024 iso_packets = uxfer->num_iso_packets; 1025 1026 if (iso_packets == 0) |
1028 return; /* nothing to do */ | 1027 return; /* nothing to do */ |
1029 1030 /* make sure that the number of ISOCHRONOUS packets is valid */ 1031 uxfer->num_iso_packets = iso_packets; 1032 | 1028 1029 /* make sure that the number of ISOCHRONOUS packets is valid */ 1030 uxfer->num_iso_packets = iso_packets; 1031 |
1033 flags = uxfer->flags; 1034 | |
1035 switch (status) { 1036 case LIBUSB20_TRANSFER_COMPLETED: | 1032 switch (status) { 1033 case LIBUSB20_TRANSFER_COMPLETED: |
1037 | |
1038 /* update actual length */ 1039 uxfer->actual_length = actlen; 1040 for (i = 0; i != iso_packets; i++) { 1041 uxfer->iso_packet_desc[i].actual_length = 1042 libusb20_tr_get_length(pxfer, i); 1043 } 1044 libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED); 1045 break; | 1034 /* update actual length */ 1035 uxfer->actual_length = actlen; 1036 for (i = 0; i != iso_packets; i++) { 1037 uxfer->iso_packet_desc[i].actual_length = 1038 libusb20_tr_get_length(pxfer, i); 1039 } 1040 libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED); 1041 break; |
1046 | |
1047 case LIBUSB20_TRANSFER_START: | 1042 case LIBUSB20_TRANSFER_START: |
1048 | |
1049 /* setup length(s) */ 1050 actlen = 0; 1051 for (i = 0; i != iso_packets; i++) { 1052 libusb20_tr_setup_isoc(pxfer, 1053 &uxfer->buffer[actlen], 1054 uxfer->iso_packet_desc[i].length, i); 1055 actlen += uxfer->iso_packet_desc[i].length; 1056 } 1057 1058 /* no remainder */ 1059 sxfer->rem_len = 0; 1060 1061 libusb20_tr_set_total_frames(pxfer, iso_packets); 1062 libusb20_tr_submit(pxfer); 1063 1064 /* fork another USB transfer, if any */ 1065 libusb10_submit_transfer_sub(libusb20_tr_get_priv_sc0(pxfer), uxfer->endpoint); 1066 break; | 1043 /* setup length(s) */ 1044 actlen = 0; 1045 for (i = 0; i != iso_packets; i++) { 1046 libusb20_tr_setup_isoc(pxfer, 1047 &uxfer->buffer[actlen], 1048 uxfer->iso_packet_desc[i].length, i); 1049 actlen += uxfer->iso_packet_desc[i].length; 1050 } 1051 1052 /* no remainder */ 1053 sxfer->rem_len = 0; 1054 1055 libusb20_tr_set_total_frames(pxfer, iso_packets); 1056 libusb20_tr_submit(pxfer); 1057 1058 /* fork another USB transfer, if any */ 1059 libusb10_submit_transfer_sub(libusb20_tr_get_priv_sc0(pxfer), uxfer->endpoint); 1060 break; |
1067 | |
1068 default: 1069 libusb10_complete_transfer(pxfer, sxfer, libusb10_convert_error(status)); 1070 break; 1071 } 1072} 1073 1074/* This function must be called locked */ 1075 --- 504 unchanged lines hidden --- | 1061 default: 1062 libusb10_complete_transfer(pxfer, sxfer, libusb10_convert_error(status)); 1063 break; 1064 } 1065} 1066 1067/* This function must be called locked */ 1068 --- 504 unchanged lines hidden --- |