Buffer allocation for USB transfers

From: Christian Eggers
Date: Wed Jan 14 2009 - 13:59:00 EST


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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/