LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Kernel (https://www.linuxquestions.org/questions/linux-kernel-70/)
-   -   set feature halt endpoint fails always USB linux driver usb gadget serial dot c (https://www.linuxquestions.org/questions/linux-kernel-70/set-feature-halt-endpoint-fails-always-usb-linux-driver-usb-gadget-serial-dot-c-4175422122/)

sarmads1 08-14-2012 10:06 PM

set feature halt endpoint fails always USB linux driver usb gadget serial dot c
 
Hello Kernel lovers.
I have an issue of my 2.6.10 embedded Linux
My USB bus is S3C2410, samsung, and my processor is ARM
http://www.wvshare.com/datasheet_html/S3C2410-PDF.html

I am trying to place a "stall" over the USB bus in Linux over the file linux/drivers/usb/gadget/serial.c.

I added set_feature, clear_feature and get_status requests from include/linux/usb.h & usb_gadget.h.
I am intending to use the functions (queue, dequeue, set&clear halt etc in the header file here)
http://lxr.free-electrons.com/ident?i=usb_ep_set_halt

I am supposing set_halt (if returned 0) will set halt on an endpoint - but it is not.
I tried this
if ((ctrl->brequest==SET_FEATURE) && (ctrl->brecepient == endpoint && 0xf))//MASK - 5 endpoints, I receive 0x80 + endpoint is direction in, 0x00 + endpoint direction out
then
1- I tried:
usb_ep_fifo_flush(ep); //so set_ep_halt succeeds, we need to dequeue, but I am flushing totally
ret = usb_ep_halt (ep); //ret is 0 as I see on debug files
status[endpoint_number] = 0;
On log file, I see endp = 2 or 3, direction in or out and ret = 0

2- I tried:
from USB samsung manual above, page 13-9
USB dev controller special index register:
place the index of an endpoint into the index register, and send value to the hardware according to page 13-12 and 13-13
spinlock(&device);
set_index_reg_value (brecepient & 0xf); //to program the endpoint's index register
u32 value = read (EP0_CSR);
value = value | SERVICED_OUT_PKT_RDY; //clear OUT_PKT_RDY bit 0
value = value | SEND_STALL; // placing this MUST stall by hw
write (EP0_CSR, value);
spinunlock(&device);

On clear_halt, I read the same value that I placed last time when set, which means, my write is successful and consistent.

BUT
But running the ch9 test
http://www.usb.org/developers/tools/

tells me ALWAYS that
Endpoint halt failed for 83
cleared stall 83
Endpoint halt failed for 82
cleared stall on 82
Endpoint halt failed for 1
cleared stall on 1
A device that has Bulk/Interrupt endpoints must support the Halt Endpoint request on those endpoints
failure
I tried http://www.cygnal.org/ubb/Forum9/HTML/001749.html
and changed the interval into 0x8, 0x10, etc, but the test is still consistent on bothering me for a week!!

on my custom structure (gadget_usb_driver) I have 2 endpoints only not 5 (marked as 0x80 in, 0x0 out)
but I cheat with the number bEndpointAddress 0x80 + 1 / + 2 / +3 now and then
Still it fails all the tests 83, 82 and 1, which means it is IRRELATED to the number bEndpointAddress.
please help if you know where I am failing.
Could it be (delay) addition because serial is too slow?
Or must I insert other endpoints and initialize them, bind them and etc?
Or I am programming wrong hardware?
Or any other hint that I am missing?
Is it endianness in ARM? I dont believe so
thank you


All times are GMT -5. The time now is 12:52 AM.