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 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel