In different drivers I've found several methods for allocating buffers transfered with usb_control_msg() or usb_submit_urb():
- usb_stor_msg_common() in "drivers/usb/storage/transport.c" uses buffers allocated with usb_buffer_alloc(). These buffers are used with URB_NO_xxx_DMA_MAP in urb->transfer_flags.
- asix_read_cmd() in "drivers/net/usb/asix.c" uses kmalloc(GFP_KERNEL).
- mcs7830_get_reg() in "drivers/net/usb/mcs7830.c" uses buffers from the stack.
At least the latter does not work on my SH-4 platform. It seems that other variables on the stack are overwritten after calling usb_control_msg(), probably as result of incorrect alignment.
For some reason the second example (kmalloc()) doesn't seem to cause problems (on my platform) but is there are guarantee that kmalloc() without GFP_DMA does always return a DMA capable buffer?
Shall all buffers used for usb_control_msg() and usb_submit_urb() be allocated with usb_buffer_alloc()? It seems that usb_control_msg() doesn't offer a way to set the URB_NO_xxx_DMA_MAP in urb->transfer_flags so that usb_buffer_alloc() can not be used here???
regards
Christian Eggers
Please CC to ceggers@xxxxxx