[PATCH 1/19] psmouse state locking

From: Dmitry Torokhov
Date: Mon Jun 28 2004 - 00:12:23 EST



===================================================================


ChangeSet@xxxxxx, 2004-06-27 15:44:44-05:00, dtor_core@xxxxxxxxxxxxx
Input: when changing psmouse state (activated, ignore) do it while
holding serio lock so it will not fight with the interrupt
handler.

Signed-off-by: Dmitry Torokhov <dtor@xxxxxxx>


psmouse-base.c | 32 ++++++++++++++++++++++----------
1 files changed, 22 insertions(+), 10 deletions(-)


===================================================================



diff -Nru a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c 2004-06-27 17:46:50 -05:00
+++ b/drivers/input/mouse/psmouse-base.c 2004-06-27 17:46:50 -05:00
@@ -622,6 +622,23 @@
}

/*
+ * psmouse_set_state() sets new psmouse state and resets all flags and
+ * counters while holding serio lock so fighting with interrupt handler
+ * is not a concern.
+ */
+
+static void psmouse_set_state(struct psmouse *psmouse, unsigned char new_state)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&psmouse->serio->lock, flags);
+ psmouse->state = new_state;
+ psmouse->pktcnt = psmouse->cmdcnt = psmouse->out_of_sync = 0;
+ psmouse->flags = 0;
+ spin_unlock_irqrestore(&psmouse->serio->lock, flags);
+}
+
+/*
* psmouse_activate() enables the mouse so that we get motion reports from it.
*/

@@ -630,7 +647,7 @@
if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_ENABLE))
printk(KERN_WARNING "psmouse.c: Failed to enable mouse on %s\n", psmouse->serio->phys);

- psmouse->state = PSMOUSE_ACTIVATED;
+ psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
}

/*
@@ -652,7 +669,7 @@
{
struct psmouse *psmouse = serio->private;

- psmouse->state = PSMOUSE_CMD_MODE;
+ psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);

if (psmouse->ptport) {
if (psmouse->ptport->deactivate)
@@ -665,7 +682,7 @@
if (psmouse->disconnect)
psmouse->disconnect(psmouse);

- psmouse->state = PSMOUSE_IGNORE;
+ psmouse_set_state(psmouse, PSMOUSE_IGNORE);

input_unregister_device(&psmouse->dev);
serio_close(serio);
@@ -693,9 +710,9 @@
psmouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
psmouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
- psmouse->state = PSMOUSE_CMD_MODE;
psmouse->serio = serio;
psmouse->dev.private = psmouse;
+ psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);

serio->private = psmouse;
if (serio_open(serio, dev)) {
@@ -758,12 +775,7 @@
return -1;
}

- psmouse->state = PSMOUSE_CMD_MODE;
-
- clear_bit(PSMOUSE_FLAG_ACK, &psmouse->flags);
- clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
-
- psmouse->pktcnt = psmouse->out_of_sync = 0;
+ psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);

if (psmouse->reconnect) {
if (psmouse->reconnect(psmouse))
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/