--- x/drivers/input/misc/cm109.c +++ y/drivers/input/misc/cm109.c @@ -562,15 +562,18 @@ static int cm109_input_open(struct input dev->ctl_data->byte[HID_OR2] = dev->keybit; dev->ctl_data->byte[HID_OR3] = 0x00; + spin_lock_irq(&dev->ctl_submit_lock); dev->ctl_urb_pending = 1; - error = usb_submit_urb(dev->urb_ctl, GFP_KERNEL); + error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); if (!error) { dev->open = 1; + spin_unlock_irq(&dev->ctl_submit_lock); return 0; } + dev->ctl_urb_pending = 0; + spin_unlock_irq(&dev->ctl_submit_lock); } - dev->ctl_urb_pending = 0; usb_autopm_put_interface(dev->intf); dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_ctl) failed %d\n",