From edc9820244d0ebbc9a57f24fcc0d8ddecb7381be Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Tue, 5 Jul 2011 13:45:12 +0200 Subject: [PATCH] --- yaml --- r: 256821 b: refs/heads/master c: 4d36e9754f6b71870a476e84f418a864c2ddf77c h: refs/heads/master i: 256819: af8d05e9e028d586ce5fa56a1d639bd3dad1a9eb v: v3 --- [refs] | 2 +- trunk/drivers/hid/hid-wiimote.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 8a4226620ecf..2c0cc5573dd0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 672bc4e090c9a2c655c28f8295e981609a1b84ba +refs/heads/master: 4d36e9754f6b71870a476e84f418a864c2ddf77c diff --git a/trunk/drivers/hid/hid-wiimote.c b/trunk/drivers/hid/hid-wiimote.c index deaf23207812..3416f69302cd 100644 --- a/trunk/drivers/hid/hid-wiimote.c +++ b/trunk/drivers/hid/hid-wiimote.c @@ -10,6 +10,7 @@ * any later version. */ +#include #include #include #include @@ -20,6 +21,7 @@ #define WIIMOTE_NAME "Nintendo Wii Remote" struct wiimote_data { + atomic_t ready; struct hid_device *hdev; struct input_dev *input; }; @@ -27,12 +29,26 @@ struct wiimote_data { static int wiimote_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { + struct wiimote_data *wdata = input_get_drvdata(dev); + + if (!atomic_read(&wdata->ready)) + return -EBUSY; + /* smp_rmb: Make sure wdata->xy is available when wdata->ready is 1 */ + smp_rmb(); + return 0; } static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report, u8 *raw_data, int size) { + struct wiimote_data *wdata = hid_get_drvdata(hdev); + + if (!atomic_read(&wdata->ready)) + return -EBUSY; + /* smp_rmb: Make sure wdata->xy is available when wdata->ready is 1 */ + smp_rmb(); + if (size < 1) return -EINVAL; @@ -103,6 +119,9 @@ static int wiimote_hid_probe(struct hid_device *hdev, goto err_stop; } + /* smp_wmb: Write wdata->xy first before wdata->ready is set to 1 */ + smp_wmb(); + atomic_set(&wdata->ready, 1); hid_info(hdev, "New device registered\n"); return 0;