On Friday 30 October 2009 19:23:15 Larry Finger wrote: > David Woodhouse wrote: > > On a 64-bit kernel, skb->tail is an offset, not a pointer. The libertas > > usb driver passes it to usb_fill_bulk_urb() anyway, causing interesting > > crashes. Fix that by using skb->data instead. > > > > This highlights a problem with usb_fill_bulk_urb(). It doesn't notice > > when dma_map_single() fails and return the error to its caller as it > > should. In fact it _can't_ currently return the error, since it returns > > void. > > This should be fixed. If changing the code to return the error would > be too invasive (It is used in 30+ drivers), perhaps the routine > should be modified to log a warning when dma mapping fails. I will > submit an RFC to do that. err, hold on a sec: - include/linux/usb.h - static inline void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete_fn, void *context) { urb->dev = dev; urb->pipe = pipe; urb->transfer_buffer = transfer_buffer; urb->transfer_buffer_length = buffer_length; urb->complete = complete_fn; urb->context = context; } that's just a fill-in macro. AFAICT usb_submit_urb does the tricky dma mapping. Regards, Chr -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html