Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / drivers / usb / serial / whiteheat.c
index 6e6c793..3ced09c 100644 (file)
@@ -65,6 +65,7 @@
  * 
  */
 
+#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -79,7 +80,7 @@
 #include <linux/usb.h>
 #include <linux/serial_reg.h>
 #include <linux/serial.h>
-#include <linux/usb/serial.h>
+#include "usb-serial.h"
 #include "whiteheat_fw.h"              /* firmware for the ConnectTech WhiteHEAT device */
 #include "whiteheat.h"                 /* WhiteHEAT specific commands */
 
@@ -685,16 +686,19 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
                wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
                urb = wrap->urb;
                usb_kill_urb(urb);
-               list_move(tmp, &info->rx_urbs_free);
+               list_del(tmp);
+               list_add(tmp, &info->rx_urbs_free);
+       }
+       list_for_each_safe(tmp, tmp2, &info->rx_urb_q) {
+               list_del(tmp);
+               list_add(tmp, &info->rx_urbs_free);
        }
-       list_for_each_safe(tmp, tmp2, &info->rx_urb_q)
-               list_move(tmp, &info->rx_urbs_free);
-
        list_for_each_safe(tmp, tmp2, &info->tx_urbs_submitted) {
                wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
                urb = wrap->urb;
                usb_kill_urb(urb);
-               list_move(tmp, &info->tx_urbs_free);
+               list_del(tmp);
+               list_add(tmp, &info->tx_urbs_free);
        }
        spin_unlock_irqrestore(&info->lock, flags);
 
@@ -1076,7 +1080,8 @@ static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs)
                err("%s - Not my urb!", __FUNCTION__);
                return;
        }
-       list_move(&wrap->list, &info->tx_urbs_free);
+       list_del(&wrap->list);
+       list_add(&wrap->list, &info->tx_urbs_free);
        spin_unlock(&info->lock);
 
        if (urb->status) {
@@ -1084,7 +1089,9 @@ static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs)
                return;
        }
 
-       usb_serial_port_softint(port);
+       usb_serial_port_softint((void *)port);
+
+       schedule_work(&port->work);
 }
 
 
@@ -1366,7 +1373,8 @@ static int start_port_read(struct usb_serial_port *port)
                                wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
                                urb = wrap->urb;
                                usb_kill_urb(urb);
-                               list_move(tmp, &info->rx_urbs_free);
+                               list_del(tmp);
+                               list_add(tmp, &info->rx_urbs_free);
                        }
                        break;
                }