Hello everyone I'm trying to make a driver that, for now, just answers depending on what is sent OUT from the host. The problem is that apparently gadgetfs has a queue with the usb_requests. So whatever I send to the driver I get the answer after asking 2 or 3 times, i.e., I have to make two or three IN bulk transfers to get what I want. I did some simple modifications to the usb.c example driver found in linux-usb.org. I used a global variable to access it from both threads: static char *buffer; In empty_out_buf function I do a simple switch to assing value to the global buffer depending on the value sent out by the host: switch (((char *)buf)[0]) { case 0x01: printf("case 0x01\n"); memset(buffer, '1', nbytes); break; case 0x02: printf("case 0x02\n"); memset(buffer, '2', nbytes); break; default: printf("case default\n"); memset(buffer, 'd', nbytes); break; } The other modification was in simple_source_thread function. Where the "buffer" variable created by me is sent instead of the local buf variable: status = write(source_fd, buffer, USB_BUFSIZE); I'm using libusb to test on the host side, with the following functions: libusb_bulk_transfer (devHandle, BULK_OUT, buffer, bufferSize, &transferred, 500); libusb_bulk_transfer (devHandle, BULK_IN, buffer, bufferSize, &transferred, 500); When using a buffer size of 511 bytes or less until the third IN bulk transfer I get, e.g., in case 0x01 the '1' I assigned before. When the buffer size is of 512 or more I get the assigned value in the second transfer. Here is the usbmon trace, USB_BUFSIZE 511: f2adf880 32307.036783 S Bi:1:090:1 - 511 < f2adf880 32307.036843 C Bi:1:090:1 0 511 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 f2a78100 32333.300397 S Bo:1:090:1 - 511 = 01010101 01010101 01010101 01010101 01010101 01010101 01010101 01010101 f2a78100 32333.300472 C Bo:1:090:1 0 511 > f2a30500 32349.364816 S Bi:1:090:1 - 511 < f2a30500 32349.364975 C Bi:1:090:1 0 511 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 f2ba3400 32350.468457 S Bi:1:090:1 - 511 < f2ba3400 32350.468601 C Bi:1:090:1 0 511 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 f2a97680 32351.268549 S Bi:1:090:1 - 511 < f2a97680 32351.268600 C Bi:1:090:1 0 511 = 31313131 31313131 31313131 31313131 31313131 31313131 31313131 31313131 USB_BUFSIZE 512: f2b86600 35192.622809 S Bi:1:091:1 - 512 < f2b86600 35192.622879 C Bi:1:091:1 0 512 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 f2bd2280 35196.388595 S Bo:1:091:1 - 512 = 01010101 01010101 01010101 01010101 01010101 01010101 01010101 01010101 f2bd2280 35196.388756 C Bo:1:091:1 0 512 > f6612080 35198.996722 S Bi:1:091:1 - 512 < f6612080 35198.996754 C Bi:1:091:1 0 512 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 f2922680 35200.028271 S Bi:1:091:1 - 512 < f2922680 35200.028381 C Bi:1:091:1 0 512 = 31313131 31313131 31313131 31313131 31313131 31313131 31313131 31313131 I've also noticed that when "usb" binary it first initialized it calls fill_in_buf function (1 or 2 depending on the buffer size as specified before). Is there a form to flush the queue? Or how can I access the information I want right in the next transfer? Thanks for your help, Aldo Brett -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html