ChangeSet 1.1595.7.8, 2003/07/30 12:52:21-07:00, [EMAIL PROTECTED]
[PATCH] USB: bluetty: remove write_urb_pool logic, fixing locking issues.
Now we just throw urbs at the device as fast as we can.
drivers/usb/class/bluetty.c | 178 +++++++++++++-------------------------------
1 files changed, 55 insertions(+), 123 deletions(-)
diff -Nru a/drivers/usb/class/bluetty.c b/drivers/usb/class/bluetty.c
--- a/drivers/usb/class/bluetty.c Fri Aug 1 10:55:40 2003
+++ b/drivers/usb/class/bluetty.c Fri Aug 1 10:55:40 2003
@@ -190,7 +190,6 @@
int bulk_in_buffer_size;
int bulk_out_buffer_size;
- struct urb * write_urb_pool[NUM_BULK_URBS];
__u8 bulk_out_endpointAddress;
wait_queue_head_t write_wait;
@@ -408,7 +407,6 @@
static void bluetooth_close (struct tty_struct *tty, struct file * filp)
{
struct usb_bluetooth *bluetooth = get_usb_bluetooth ((struct usb_bluetooth
*)tty->driver_data, __FUNCTION__);
- int i;
if (!bluetooth) {
return;
@@ -427,9 +425,7 @@
if (bluetooth->open_count <= 0) {
bluetooth->open_count = 0;
- /* shutdown any bulk reads and writes that might be going on */
- for (i = 0; i < NUM_BULK_URBS; ++i)
- usb_unlink_urb (bluetooth->write_urb_pool[i]);
+ /* shutdown any in-flight urbs that we know about */
usb_unlink_urb (bluetooth->read_urb);
usb_unlink_urb (bluetooth->interrupt_in_urb);
}
@@ -443,9 +439,7 @@
struct urb *urb = NULL;
unsigned char *temp_buffer = NULL;
const unsigned char *current_buffer;
- const unsigned char *current_position;
- int bytes_sent;
- int buffer_size;
+ unsigned char *urb_buffer;
int i;
int retval = 0;
@@ -506,54 +500,46 @@
break;
case ACL_PKT:
- current_position = current_buffer;
- ++current_position;
+ ++current_buffer;
--count;
- bytes_sent = 0;
- while (count > 0) {
- urb = NULL;
+ urb_buffer = kmalloc (count, GFP_ATOMIC);
+ if (!urb_buffer) {
+ dev_err(&bluetooth->dev->dev, "out of memory\n");
+ retval = -ENOMEM;
+ goto exit;
+ }
- /* try to find a free urb in our list */
- for (i = 0; i < NUM_BULK_URBS; ++i) {
- if (bluetooth->write_urb_pool[i]->status !=
-EINPROGRESS) {
- urb = bluetooth->write_urb_pool[i];
- break;
- }
- }
- if (urb == NULL) {
- dbg ("%s - no free urbs", __FUNCTION__);
- retval = bytes_sent;
- goto exit;
- }
-
-
- buffer_size = min (count,
bluetooth->bulk_out_buffer_size);
- memcpy (urb->transfer_buffer, current_position,
buffer_size);
-
- /* build up our urb */
- usb_fill_bulk_urb (urb, bluetooth->dev,
usb_sndbulkpipe(bluetooth->dev, bluetooth->bulk_out_endpointAddress),
- urb->transfer_buffer, buffer_size,
bluetooth_write_bulk_callback, bluetooth);
-
- /* send it down the pipe */
- retval = usb_submit_urb(urb, GFP_KERNEL);
- if (retval) {
- dbg("%s - usb_submit_urb(write bulk) failed
with error = %d", __FUNCTION__, retval);
- goto exit;
- }
-#ifdef BTBUGGYHARDWARE
- /* A workaround for the stalled data bug */
- /* May or may not be needed...*/
- if (count != 0) {
- udelay(500);
- }
-#endif
- current_position += buffer_size;
- bytes_sent += buffer_size;
- count -= buffer_size;
+ urb = usb_alloc_urb(0, GFP_ATOMIC);
+ if (!urb) {
+ dev_err(&bluetooth->dev->dev, "no more free urbs\n");
+ kfree(urb_buffer);
+ retval = -ENOMEM;
+ goto exit;
}
+ memcpy (urb_buffer, current_buffer, count);
+
+ /* build up our urb */
+ usb_fill_bulk_urb(urb, bluetooth->dev,
+ usb_sndbulkpipe(bluetooth->dev,
+
bluetooth->bulk_out_endpointAddress),
+ urb_buffer,
+ count,
+ bluetooth_write_bulk_callback,
+ bluetooth);
- retval = bytes_sent + 1;
+
+ /* send it down the pipe */
+ retval = usb_submit_urb(urb, GFP_KERNEL);
+ if (retval) {
+ dbg("%s - usb_submit_urb(write bulk) failed with error
= %d", __FUNCTION__, retval);
+ goto exit;
+ }
+
+ /* we are done with this urb, so let the host driver
+ * really free it when it is finished with it */
+ usb_free_urb (urb);
+ retval = count + 1;
break;
default :
@@ -563,8 +549,7 @@
}
exit:
- if (temp_buffer != NULL)
- kfree (temp_buffer);
+ kfree (temp_buffer);
return retval;
}
@@ -572,55 +557,28 @@
static int bluetooth_write_room (struct tty_struct *tty)
{
- struct usb_bluetooth *bluetooth = get_usb_bluetooth ((struct usb_bluetooth
*)tty->driver_data, __FUNCTION__);
- int room = 0;
- int i;
-
- if (!bluetooth) {
- return -ENODEV;
- }
-
dbg("%s", __FUNCTION__);
- if (!bluetooth->open_count) {
- dbg ("%s - device not open", __FUNCTION__);
- return -EINVAL;
- }
-
- for (i = 0; i < NUM_BULK_URBS; ++i) {
- if (bluetooth->write_urb_pool[i]->status != -EINPROGRESS) {
- room += bluetooth->bulk_out_buffer_size;
- }
- }
-
- dbg("%s - returns %d", __FUNCTION__, room);
- return room;
+ /*
+ * We really can take anything the user throws at us
+ * but let's pick a nice big number to tell the tty
+ * layer that we have lots of free space
+ */
+ return 2048;
}
static int bluetooth_chars_in_buffer (struct tty_struct *tty)
{
- struct usb_bluetooth *bluetooth = get_usb_bluetooth ((struct usb_bluetooth
*)tty->driver_data, __FUNCTION__);
- int chars = 0;
- int i;
-
- if (!bluetooth) {
- return -ENODEV;
- }
-
- if (!bluetooth->open_count) {
- dbg ("%s - device not open", __FUNCTION__);
- return -EINVAL;
- }
-
- for (i = 0; i < NUM_BULK_URBS; ++i) {
- if (bluetooth->write_urb_pool[i]->status == -EINPROGRESS) {
- chars += bluetooth->write_urb_pool[i]->transfer_buffer_length;
- }
- }
+ dbg("%s", __FUNCTION__);
- dbg ("%s - returns %d", __FUNCTION__, chars);
- return chars;
+ /*
+ * We can't really account for how much data we
+ * have sent out, but hasn't made it through to the
+ * device, so just tell the tty layer that everything
+ * is flushed.
+ */
+ return 0;
}
@@ -1009,6 +967,9 @@
dbg("%s", __FUNCTION__);
+ /* free up the transfer buffer, as usb_free_urb() does not do this */
+ kfree(urb->transfer_buffer);
+
if (!bluetooth) {
dbg("%s - bad bluetooth pointer, exiting", __FUNCTION__);
return;
@@ -1161,21 +1122,6 @@
bluetooth->bulk_out_endpointAddress = endpoint->bEndpointAddress;
bluetooth->bulk_out_buffer_size = endpoint->wMaxPacketSize * 2;
- /* create our write urb pool */
- for (i = 0; i < NUM_BULK_URBS; ++i) {
- struct urb *urb = usb_alloc_urb(0, GFP_KERNEL);
- if (urb == NULL) {
- err("No free urbs available");
- goto probe_error;
- }
- urb->transfer_buffer = kmalloc (bluetooth->bulk_out_buffer_size,
GFP_KERNEL);
- if (urb->transfer_buffer == NULL) {
- err("out of memory");
- goto probe_error;
- }
- bluetooth->write_urb_pool[i] = urb;
- }
-
endpoint = interrupt_in_endpoint[0];
bluetooth->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
if (!bluetooth->interrupt_in_urb) {
@@ -1213,12 +1159,6 @@
usb_free_urb (bluetooth->interrupt_in_urb);
if (bluetooth->interrupt_in_buffer)
kfree (bluetooth->interrupt_in_buffer);
- for (i = 0; i < NUM_BULK_URBS; ++i)
- if (bluetooth->write_urb_pool[i]) {
- if (bluetooth->write_urb_pool[i]->transfer_buffer)
- kfree (bluetooth->write_urb_pool[i]->transfer_buffer);
- usb_free_urb (bluetooth->write_urb_pool[i]);
- }
for (i = 0; i < NUM_CONTROL_URBS; ++i)
if (bluetooth->control_urb_pool[i]) {
if (bluetooth->control_urb_pool[i]->transfer_buffer)
@@ -1262,14 +1202,6 @@
tty_unregister_device (bluetooth_tty_driver, bluetooth->minor);
- for (i = 0; i < NUM_BULK_URBS; ++i) {
- if (bluetooth->write_urb_pool[i]) {
- usb_unlink_urb (bluetooth->write_urb_pool[i]);
- if (bluetooth->write_urb_pool[i]->transfer_buffer)
- kfree
(bluetooth->write_urb_pool[i]->transfer_buffer);
- usb_free_urb (bluetooth->write_urb_pool[i]);
- }
- }
for (i = 0; i < NUM_CONTROL_URBS; ++i) {
if (bluetooth->control_urb_pool[i]) {
usb_unlink_urb (bluetooth->control_urb_pool[i]);
-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel