Hello,
Oliver Neukum wrote:
> Hi,
>
> in the appletouch driver open() races with suspend(). This should
> fix it. Nicolas, could you please test it?
>
I applied the patch, loaded the driver, and it works. I don't know how
to reproduce the initial bug, so I cannot test it more precisely. (I'm
using appletouch with suspend2 for quite a long time, and didn't get
problems with it)
Anyway, I'm not really responsible for that part of the code, I just
added support for the latest Macbook(Pro) touchpads.
Best regards,
Nicolas
> Regards
> Oliver
>
> Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>
>
> ------------------------------------------------------------------------
>
> --- current/drivers/usb/input/appletouch.c 2006-10-03 00:22:56.000000000
> +0200
> +++ linux-2.6.18/drivers/usb/input/appletouch.c 2006-10-03
> 00:58:04.000000000 +0200
> @@ -77,6 +77,8 @@
> };
> MODULE_DEVICE_TABLE (usb, atp_table);
>
> +static DEFINE_MUTEX(appletouch_open_mutex);
> +
> /*
> * number of sensors. Note that only 16 instead of 26 X (horizontal)
> * sensors exist on 12" and 15" PowerBooks. All models have 16 Y
> @@ -134,6 +136,7 @@
> int xy_acc[ATP_XSENSORS + ATP_YSENSORS];
> int overflowwarn; /* overflow warning printed? */
> int datalen; /* size of an USB urb transfer
> */
> + unsigned char suspended; /* is the device suspended ? */
> };
>
> #define dbg_dump(msg, tab) \
> @@ -404,11 +407,17 @@
> static int atp_open(struct input_dev *input)
> {
> struct atp *dev = input->private;
> + int rv = 0;
>
> - if (usb_submit_urb(dev->urb, GFP_ATOMIC))
> - return -EIO;
> + mutex_lock(&appletouch_open_mutex);
> + if (!dev->suspended && usb_submit_urb(dev->urb, GFP_KERNEL)) {
> + rv = -EIO;
> + goto done;
> + }
>
> dev->open = 1;
> +done:
> + mutex_unlock(&appletouch_open_mutex);
> return 0;
> }
>
> @@ -416,8 +425,8 @@
> {
> struct atp *dev = input->private;
>
> - usb_kill_urb(dev->urb);
> dev->open = 0;
> + usb_kill_urb(dev->urb);
> }
>
> static int atp_probe(struct usb_interface *iface, const struct usb_device_id
> *id)
> @@ -609,18 +618,27 @@
> static int atp_suspend(struct usb_interface *iface, pm_message_t message)
> {
> struct atp *dev = usb_get_intfdata(iface);
> +
> + mutex_lock(&appletouch_open_mutex);
> usb_kill_urb(dev->urb);
> dev->valid = 0;
> + dev->suspended = 1;
> + mutex_unlock(&appletouch_open_mutex);
> return 0;
> }
>
> static int atp_resume(struct usb_interface *iface)
> {
> struct atp *dev = usb_get_intfdata(iface);
> + int rv = 0;
> +
> + mutex_lock(&appletouch_open_mutex);
> + dev->suspended = 0;
> if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC))
> - return -EIO;
> + rv = -EIO;
> + mutex_unlock(&appletouch_open_mutex);
>
> - return 0;
> + return rv;
> }
>
> static struct usb_driver atp_driver = {
>
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel