

Hi,

Please consider applying.

Description: Use wait_event_interruptible_timeout() instead of custom wait-queue
code. The main controversy of this patch is that I do not add to the wait-queue
before checking usb_submit_urb(). I am not sure if this will cause problems.
Otherwise the code is effectively identical. Remove the now unnecessary
declaration of the waitqueue and timeout. Add the appropriate #include to
iforce.h as well.

Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: Domen Puncer <domen@coderock.org>
---


 kj-domen/drivers/input/joystick/iforce/iforce-packets.c |   33 +---------------
 kj-domen/drivers/input/joystick/iforce/iforce.h         |    1 
 2 files changed, 5 insertions(+), 29 deletions(-)

diff -puN drivers/input/joystick/iforce/iforce-packets.c~wait_event_int_t-drivers_input_joystick_iforce_iforce.h drivers/input/joystick/iforce/iforce-packets.c
--- kj/drivers/input/joystick/iforce/iforce-packets.c~wait_event_int_t-drivers_input_joystick_iforce_iforce.h	2005-01-23 00:24:36.000000000 +0100
+++ kj-domen/drivers/input/joystick/iforce/iforce-packets.c	2005-01-23 00:24:36.000000000 +0100
@@ -249,9 +249,6 @@ void iforce_process_packet(struct iforce
 
 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,24 +257,12 @@ int iforce_get_id_packet(struct iforce *
 		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);
 			return -1;
 		}
 
-		while (timeout && iforce->ctrl->status == -EINPROGRESS) {
-			set_current_state(TASK_INTERRUPTIBLE);
-			timeout = schedule_timeout(timeout);
-		}
-
-		set_current_state(TASK_RUNNING);
-		remove_wait_queue(&iforce->wait, &wait);
-
-		if (!timeout) {
+		if (!wait_event_interruptible_timeout(iforce->wait,
+					(iforce->ctrl->status != -EINPROGRESS), HZ));
 			usb_unlink_urb(iforce->ctrl);
 			return -1;
 		}
@@ -292,18 +277,8 @@ int iforce_get_id_packet(struct iforce *
 		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) {
-			set_current_state(TASK_INTERRUPTIBLE);
-			timeout = schedule_timeout(timeout);
-		}
-
-		set_current_state(TASK_RUNNING);
-		remove_wait_queue(&iforce->wait, &wait);
-
-		if (!timeout) {
+		if (!wait_event_interrutible_timeout(iforce->wait,
+					(!iforce->expect_packet), HZ)) {
 			iforce->expect_packet = 0;
 			return -1;
 		}
diff -puN drivers/input/joystick/iforce/iforce.h~wait_event_int_t-drivers_input_joystick_iforce_iforce.h drivers/input/joystick/iforce/iforce.h
--- kj/drivers/input/joystick/iforce/iforce.h~wait_event_int_t-drivers_input_joystick_iforce_iforce.h	2005-01-23 00:24:36.000000000 +0100
+++ kj-domen/drivers/input/joystick/iforce/iforce.h	2005-01-23 00:24:36.000000000 +0100
@@ -37,6 +37,7 @@
 #include <linux/serio.h>
 #include <linux/config.h>
 #include <linux/circ_buf.h>
+#include <linux/wait.h>
 #include <asm/semaphore.h>
 
 /* This module provides arbitrary resource management routines.
_

