Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb76b099 authored by Vojtech Pavlik's avatar Vojtech Pavlik Committed by Dmitry Torokhov
Browse files

Input: iforce - use wait_event_interruptible_timeout



The timeout while() loops in iforce-packets.c lack a
set_current_state(TASK_INTERRUPTIBLE); call. The right solution is
to replace them with wait_event_interruptible_timeout().

Reported-by: default avatarNishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: default avatarVojtech Pavlik <vojtech@suse.cz>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 39fd748f
Loading
Loading
Loading
Loading
+7 −25
Original line number Diff line number Diff line
@@ -249,9 +249,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 +257,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 != -EINPROGRESS) {
			usb_unlink_urb(iforce->ctrl);
			return -1;
		}
@@ -290,16 +278,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;
		}
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ static void iforce_usb_irq(struct urb *urb, struct pt_regs *regs)
		goto exit;
	}

	wake_up(&iforce->wait);
	iforce_process_packet(iforce,
		(iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1, regs);