Hi Alan,
> > Sounds even more useful. Better abandon the halfway wrappers for the new
> > ones. Another thing I'd think may be useful is to take the endpoint
> > address instead of the pipe, because the pipe type is known to each
> > wrapper, right?
>
> I'm in favor of doing away with pipe values. Bear in mind however that
> the endpoint address or usb_host_endpoint structure doesn't quite
> contain all the information of a pipe. The extra missing ingredient is
> a way to specify the direction for Control transfers (with Bulk,
> Interrupt, or Isochronous transfers the endpoint descriptor determines
> the direction).
>
> If you prefer, the direction can be or'ed into the high bit of the
> endpoint number. That's a reasonably standard approach, since it's how
> endpoint descriptors are formatted. (Note that devices do not contain
> an endpoint descriptor for ep0. usbcore makes up a fake descriptor of
> its own, with the direction permanently set to OUT.)
the attached patch is an attempt for usb_alloc_bulk_urb() which will
allocate the URB itself and its transfer buffer. It also use the
endpoint data structure to create the pipe value. Please review it.
I can create the other helper functions if you think this would be
useful and is heading in the right direction.
Regards
Marcel
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index 0601665..eb50664 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -482,6 +482,54 @@ void usb_kill_urb(struct urb *urb)
spin_unlock_irq(&urb->lock);
}
+/**
+ * usb_alloc_bulk_urb - creates a new bulk urb for an USB driver to use
+ * @dev: pointer to the struct usb_device for this urb.
+ * @desc: pointer to the struct usb_endpoint_descriptor for this urb.
+ * @size: requested buffer size
+ * @mem_flags: affect whether allocation may block
+ * @complete_fn: pointer to the usb_complete_t function
+ * @context: what to set the urb context to.
+ *
+ * Creates a bulk urb for the USB driver to use, initializes a few internal
+ * structures, incrementes the usage counter, allocates the transfer buffer,
+ * sets the pipe information from the endpoint descriptor, and returns a
+ * pointer to it.
+ *
+ * If no memory is available, NULL is returned.
+ *
+ * The driver must call usb_free_urb() when it is finished with the urb.
+ */
+struct urb *usb_alloc_bulk_urb(struct usb_device *dev,
+ struct usb_endpoint_descriptor *desc,
+ size_t size, gfp_t mem_flags,
+ usb_complete_t complete_fn, void *context)
+{
+ unsigned int pipe;
+ struct urb *urb;
+ void *buffer;
+
+ urb = usb_alloc_urb(0, mem_flags);
+ if (!urb)
+ return NULL;
+
+ buffer = kmalloc(size, mem_flags);
+ if (!buffer) {
+ usb_free_urb(urb);
+ return NULL;
+ }
+
+ pipe = (PIPE_BULK << 30) |
+ __create_pipe(dev, desc->bEndpointAddress) |
+ (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK);
+
+ usb_fill_bulk_urb(urb, dev, pipe, buffer, size, complete_fn, context);
+
+ urb->transfer_flags |= URB_FREE_BUFFER;
+
+ return urb;
+}
+
EXPORT_SYMBOL(usb_init_urb);
EXPORT_SYMBOL(usb_alloc_urb);
EXPORT_SYMBOL(usb_free_urb);
@@ -489,4 +537,5 @@ EXPORT_SYMBOL(usb_get_urb);
EXPORT_SYMBOL(usb_submit_urb);
EXPORT_SYMBOL(usb_unlink_urb);
EXPORT_SYMBOL(usb_kill_urb);
+EXPORT_SYMBOL(usb_alloc_bulk_urb);
diff --git a/include/linux/usb.h b/include/linux/usb.h
index e751593..1468e9c 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -1271,6 +1271,10 @@ extern struct urb *usb_get_urb(struct urb *urb);
extern int usb_submit_urb(struct urb *urb, gfp_t mem_flags);
extern int usb_unlink_urb(struct urb *urb);
extern void usb_kill_urb(struct urb *urb);
+extern struct urb *usb_alloc_bulk_urb(struct usb_device *dev,
+ struct usb_endpoint_descriptor *desc,
+ size_t size, gfp_t mem_flags,
+ usb_complete_t complete_fn, void *context);
void *usb_buffer_alloc (struct usb_device *dev, size_t size,
gfp_t mem_flags, dma_addr_t *dma);
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel