Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / input / joystick / iforce / iforce-packets.c
index 58728eb..76cb1f8 100644 (file)
@@ -139,7 +139,8 @@ printk(KERN_DEBUG "iforce-packets.c: control_playback %d %d\n", id, value);
 static int mark_core_as_ready(struct iforce *iforce, unsigned short addr)
 {
        int i;
-       for (i=0; i<iforce->dev.ff_effects_max; ++i) {
+
+       for (i = 0; i < iforce->dev->ff_effects_max; ++i) {
                if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags) &&
                    (iforce->core_effects[i].mod1_chunk.start == addr ||
                     iforce->core_effects[i].mod2_chunk.start == addr)) {
@@ -153,7 +154,7 @@ static int mark_core_as_ready(struct iforce *iforce, unsigned short addr)
 
 void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data, struct pt_regs *regs)
 {
-       struct input_dev *dev = &iforce->dev;
+       struct input_dev *dev = iforce->dev;
        int i;
        static int being_used = 0;
 
@@ -166,9 +167,9 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data,
                iforce->expect_packet = 0;
                iforce->ecmd = cmd;
                memcpy(iforce->edata, data, IFORCE_MAX_LENGTH);
-               wake_up(&iforce->wait);
        }
 #endif
+       wake_up(&iforce->wait);
 
        if (!iforce->type) {
                being_used--;
@@ -249,9 +250,6 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data,
 
 int iforce_get_id_packet(struct iforce *iforce, char *packet)
 {
-       DECLARE_WAITQUEUE(wait, current);
-       int timeout = HZ; /* 1 second */
-
        switch (iforce->bus) {
 
        case IFORCE_USB:
@@ -260,22 +258,13 @@ int iforce_get_id_packet(struct iforce *iforce, char *packet)
                iforce->cr.bRequest = packet[0];
                iforce->ctrl->dev = iforce->usbdev;
 
-               set_current_state(TASK_INTERRUPTIBLE);
-               add_wait_queue(&iforce->wait, &wait);
-
-               if (usb_submit_urb(iforce->ctrl, GFP_ATOMIC)) {
-                       set_current_state(TASK_RUNNING);
-                       remove_wait_queue(&iforce->wait, &wait);
+               if (usb_submit_urb(iforce->ctrl, GFP_ATOMIC))
                        return -1;
-               }
 
-               while (timeout && iforce->ctrl->status == -EINPROGRESS)
-                       timeout = schedule_timeout(timeout);
+               wait_event_interruptible_timeout(iforce->wait,
+                       iforce->ctrl->status != -EINPROGRESS, HZ);
 
-               set_current_state(TASK_RUNNING);
-               remove_wait_queue(&iforce->wait, &wait);
-
-               if (!timeout) {
+               if (iforce->ctrl->status) {
                        usb_unlink_urb(iforce->ctrl);
                        return -1;
                }
@@ -290,16 +279,10 @@ int iforce_get_id_packet(struct iforce *iforce, char *packet)
                iforce->expect_packet = FF_CMD_QUERY;
                iforce_send_packet(iforce, FF_CMD_QUERY, packet);
 
-               set_current_state(TASK_INTERRUPTIBLE);
-               add_wait_queue(&iforce->wait, &wait);
-
-               while (timeout && iforce->expect_packet)
-                       timeout = schedule_timeout(timeout);
-
-               set_current_state(TASK_RUNNING);
-               remove_wait_queue(&iforce->wait, &wait);
+               wait_event_interruptible_timeout(iforce->wait,
+                       !iforce->expect_packet, HZ);
 
-               if (!timeout) {
+               if (iforce->expect_packet) {
                        iforce->expect_packet = 0;
                        return -1;
                }