Hi,

Here's a patch against 2.4.6-pre1 that fixes a bluetooth driver problem
when a device is unplugged while the stack is running.  Somehow this
patch fell through the cracks with the last bluetooth patch that got
sent.

thanks,

greg k-h
diff -Nru a/drivers/usb/bluetooth.c b/drivers/usb/bluetooth.c
--- a/drivers/usb/bluetooth.c   Tue Jun  5 14:02:34 2001
+++ b/drivers/usb/bluetooth.c   Tue Jun  5 14:02:34 2001
@@ -1,7 +1,7 @@
 /*
  * bluetooth.c   Version 0.10
  *
- * Copyright (c) 2000 Greg Kroah-Hartman       <[EMAIL PROTECTED]>
+ * Copyright (c) 2000, 2001 Greg Kroah-Hartman <[EMAIL PROTECTED]>
  * Copyright (c) 2000 Mark Douglas Corner      <[EMAIL PROTECTED]>
  *
  * USB Bluetooth driver, based on the Bluetooth Spec version 1.0B
@@ -15,6 +15,10 @@
  *     - Added a buffer to the control_urb_pool which fixes a memory leak
  *       when the device is removed from the system.
  *
+ * (2001/05/28) Version 0.9 gkh
+ *     Fixed problem with bluetooth==NULL for bluetooth_read_bulk_callback
+ *     which was found by both the CHECKER project and Mikko Rahkonen.
+ *
  * (08/04/2001) gb
  *     Identify version on module load.
  *
@@ -863,21 +867,6 @@
        unsigned int packet_size;
        int result;
 
-#ifdef BTBUGGYHARDWARE
-       if ((count == 4) && (data[0] == 0x00) && (data[1] == 0x00)
-           && (data[2] == 0x00) && (data[3] == 0x00)) {
-               urb->actual_length = 0;
-               FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, 
-                             usb_rcvbulkpipe(bluetooth->dev, 
bluetooth->bulk_in_endpointAddress),
-                             bluetooth->bulk_in_buffer, 
bluetooth->bulk_in_buffer_size, 
-                             bluetooth_read_bulk_callback, bluetooth);
-               result = usb_submit_urb(bluetooth->read_urb);
-               if (result)
-                       err (__FUNCTION__ " - failed resubmitting read urb, error %d", 
result);
-
-               return;
-       }
-#endif
 
        dbg(__FUNCTION__);
 
@@ -905,6 +894,21 @@
                printk ("\n");
        }
 #endif
+#ifdef BTBUGGYHARDWARE
+       if ((count == 4) && (data[0] == 0x00) && (data[1] == 0x00)
+           && (data[2] == 0x00) && (data[3] == 0x00)) {
+               urb->actual_length = 0;
+               FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, 
+                             usb_rcvbulkpipe(bluetooth->dev, 
+bluetooth->bulk_in_endpointAddress),
+                             bluetooth->bulk_in_buffer, 
+bluetooth->bulk_in_buffer_size, 
+                             bluetooth_read_bulk_callback, bluetooth);
+               result = usb_submit_urb(bluetooth->read_urb);
+               if (result)
+                       err (__FUNCTION__ " - failed resubmitting read urb, error %d", 
+result);
+
+               return;
+       }
+#endif
        /* We add  a packet type identifier to the beginning of each
           HCI frame.  This makes the data in the tty look like a
           serial USB devices.  Each HCI frame can be broken across
@@ -952,6 +956,9 @@
        }       
 
 exit:
+       if (!bluetooth || !bluetooth->active)
+               return;
+
        FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, 
                      usb_rcvbulkpipe(bluetooth->dev, 
bluetooth->bulk_in_endpointAddress),
                      bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, 

Reply via email to