summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2007-06-13 08:02:11 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2007-07-13 01:34:38 +0200
commit8b3b01c898a44c2fc7217eb579982b9d132113f5 (patch)
tree4d7da145c0fa47243b0f67b62fcdfaa4f53d184e
parentUSB: Fix up full-speed bInterval values in high-speed interrupt descriptor (diff)
downloadlinux-8b3b01c898a44c2fc7217eb579982b9d132113f5.tar.xz
linux-8b3b01c898a44c2fc7217eb579982b9d132113f5.zip
USB: Add URB_FREE_BUFFER flag and the logic behind it
USB: Add URB_FREE_BUFFER flag for freeing the transfer buffer In some cases it is not needed that the driver keeps track of the transfer buffer of an URB. It can be simply freed along with the URB itself when the reference count goes down to zero. The new flag URB_FREE_BUFFER enables this behavior. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/core/urb.c3
-rw-r--r--include/linux/usb.h1
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index ac4273dddf34..52ec44b828f3 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -13,6 +13,9 @@ static void urb_destroy(struct kref *kref)
{
struct urb *urb = to_urb(kref);
+ if (urb->transfer_flags & URB_FREE_BUFFER)
+ kfree(urb->transfer_buffer);
+
kfree(urb);
}
diff --git a/include/linux/usb.h b/include/linux/usb.h
index efce9a4c511c..533c32374e01 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -994,6 +994,7 @@ extern int usb_disabled(void);
#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */
#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt
* needed */
+#define URB_FREE_BUFFER 0x0100 /* Free transfer buffer with the URB */
struct usb_iso_packet_descriptor {
unsigned int offset;