From: Greg KH <greg@kroah.com>
To: Max Krasnyansky <maxk@qualcomm.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
linux-usb-devel@lists.sourceforge.net
Subject: Re: [Bluetooth] HCI USB driver update. Support for SCO over HCI USB.
Date: Tue, 29 Apr 2003 14:15:50 -0700 [thread overview]
Message-ID: <20030429211550.GA8669@kroah.com> (raw)
In-Reply-To: <5.1.0.14.2.20030429131303.10d7f330@unixmail.qualcomm.com>
On Tue, Apr 29, 2003 at 01:29:41PM -0700, Max Krasnyansky wrote:
> >You aren't calling usb_free_urb() as you are embedding a struct urb
> >within your struct _urb structure. Any reason you can't use a struct
> >urb * instead and call the usb core's functions to create and return
> >a urb ?
> I didn't want to do two allocations (one for struct _urb and one for
> struct urb).
I agree, and understand what you are doing, it makes sense for your
case. Just wanted to make sure you were aware of the future danger :)
> >Otherwise any changes to the internal urb structures, and the
> >usb_alloc_urb() and usb_free_urb() functions will have to be mirrored
> >here in your functions, and I know I will forget to do that :)
> How about
<snip>
Ok, that works for me. Does the patch below work out for you?
> I was actually going to ask you guys if you'd be interested in
> generalizing this _urb_queue() stuff that I have for other drivers.
> Current URB api does not provide any interface for
> queueing/linking/etc of URBs in the _driver_ itself. Things like next,
> prev, etc are used in the HCD. So if driver submits bunch of different
> URBs (and potentially multiple URBs of the same type like hci_usb
> does) it has to implement its own lists, arrays and stuff. I used to
> use SKBs for URB queues but struct sk_buff is to big for that simple
> task.
Yes, generalizing that stuff would be nice to have. Lots of drivers
have to manage their urbs on their own today, and making that easier to
do would be a good thing.
thanks,
greg k-h
# usb: create usb_init_urb() for those people who like to live dangerously (like the bluetooth stack.)
diff -Nru a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
--- a/drivers/usb/core/urb.c Tue Apr 29 14:07:13 2003
+++ b/drivers/usb/core/urb.c Tue Apr 29 14:07:13 2003
@@ -14,6 +14,29 @@
#include "hcd.h"
/**
+ * usb_init_urb - initializes a urb so that it can be used by a USB driver
+ * @urb: pointer to the urb to initialize
+ *
+ * Initializes a urb so that the USB subsystem can use it properly.
+ *
+ * If a urb is created with a call to usb_alloc_urb() it is not
+ * necessary to call this function. Only use this if you allocate the
+ * space for a struct urb on your own. If you call this function, be
+ * careful when freeing the memory for your urb that it is no longer in
+ * use by the USB core.
+ */
+int usb_init_urb(struct urb *urb)
+{
+ if (!urb)
+ return -EINVAL;
+ memset(urb, 0, sizeof(*urb));
+ urb->count = (atomic_t)ATOMIC_INIT(1);
+ spin_lock_init(&urb->lock);
+
+ return 0;
+}
+
+/**
* usb_alloc_urb - creates a new urb for a USB driver to use
* @iso_packets: number of iso packets for this urb
* @mem_flags: the type of memory to allocate, see kmalloc() for a list of
@@ -38,13 +61,14 @@
mem_flags);
if (!urb) {
err("alloc_urb: kmalloc failed");
- return NULL;
+ goto exit;
+ }
+ if (usb_init_urb(urb)) {
+ kfree(urb);
+ urb = NULL;
}
- memset(urb, 0, sizeof(*urb));
- urb->count = (atomic_t)ATOMIC_INIT(1);
- spin_lock_init(&urb->lock);
-
+exit:
return urb;
}
@@ -387,7 +411,7 @@
return -ENODEV;
}
-// asynchronous request completion model
+EXPORT_SYMBOL(usb_init_urb);
EXPORT_SYMBOL(usb_alloc_urb);
EXPORT_SYMBOL(usb_free_urb);
EXPORT_SYMBOL(usb_get_urb);
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h Tue Apr 29 14:07:13 2003
+++ b/include/linux/usb.h Tue Apr 29 14:07:13 2003
@@ -766,6 +766,7 @@
}
extern struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
+extern int usb_init_urb(struct urb *urb);
extern void usb_free_urb(struct urb *urb);
#define usb_put_urb usb_free_urb
extern struct urb *usb_get_urb(struct urb *urb);
next prev parent reply other threads:[~2003-04-29 21:02 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200304290317.h3T3HOdA027579@hera.kernel.org>
2003-04-29 4:15 ` [Bluetooth] HCI USB driver update. Support for SCO over HCI USB Greg KH
2003-04-29 20:29 ` Max Krasnyansky
2003-04-29 21:15 ` Greg KH [this message]
2003-04-29 21:34 ` Oliver Neukum
2003-04-29 21:40 ` Greg KH
2003-04-29 22:24 ` [linux-usb-devel] " Oliver Neukum
2003-04-30 0:44 ` Max Krasnyansky
2003-04-30 7:06 ` Oliver Neukum
2003-04-29 21:55 ` Max Krasnyansky
2003-04-29 22:04 ` Greg KH
2003-04-29 21:39 ` [linux-usb-devel] " David Brownell
2003-04-29 21:37 ` Greg KH
2003-04-29 22:04 ` Max Krasnyansky
2003-04-30 4:55 ` David Brownell
2003-05-08 22:55 ` Max Krasnyansky
2003-05-09 19:06 ` David Brownell
2003-05-09 19:29 ` Greg KH
2003-05-09 22:35 ` Max Krasnyansky
2003-05-09 22:35 ` Max Krasnyansky
2003-05-09 23:05 ` Greg KH
2003-05-10 0:48 ` David Brownell
2003-05-10 5:06 ` Brad Hards
2003-05-10 5:40 ` Greg KH
2003-05-10 5:55 ` William Lee Irwin III
2003-05-10 6:11 ` Greg KH
2003-05-10 6:14 ` William Lee Irwin III
2003-05-12 17:53 ` Max Krasnyansky
2003-05-12 18:01 ` Greg KH
2003-05-12 18:55 ` Max Krasnyansky
2003-05-12 20:23 ` David Brownell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030429211550.GA8669@kroah.com \
--to=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb-devel@lists.sourceforge.net \
--cc=maxk@qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox