Index: usb-devel/drivers/input/misc/cm109.c =================================================================== --- usb-devel.orig/drivers/input/misc/cm109.c +++ usb-devel/drivers/input/misc/cm109.c @@ -349,10 +349,14 @@ static void cm109_submit_buzz_toggle(str dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); - if (error) + if (error) { dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_ctl) failed %d\n", __func__, error); + } else { + dev->ctl_urb_pending = 1; + dev->buzzer_pending = 0; + } } static void cm109_submit_ctl(struct cm109_dev *dev) @@ -361,9 +365,7 @@ static void cm109_submit_ctl(struct cm10 guard(spinlock_irqsave)(&dev->ctl_submit_lock); - dev->irq_urb_pending = 0; - - if (unlikely(dev->shutdown)) + if (unlikely(dev->shutdown) || dev->ctl_urb_pending) return; if (dev->buzzer_state) @@ -374,14 +376,15 @@ static void cm109_submit_ctl(struct cm10 dev->ctl_data->byte[HID_OR1] = dev->keybit; dev->ctl_data->byte[HID_OR2] = dev->keybit; - dev->buzzer_pending = 0; - dev->ctl_urb_pending = 1; - error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); - if (error) + if (error) { dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_ctl) failed %d\n", __func__, error); + } else { + dev->ctl_urb_pending = 1; + dev->buzzer_pending = 0; + } } /* @@ -428,6 +431,7 @@ static void cm109_urb_irq_callback(struc } out: + dev->irq_urb_pending = 0; cm109_submit_ctl(dev); } @@ -458,17 +462,16 @@ static void cm109_urb_ctl_callback(struc return; if (dev->buzzer_pending || status) { - dev->buzzer_pending = 0; - dev->ctl_urb_pending = 1; cm109_submit_buzz_toggle(dev); } else if (likely(!dev->irq_urb_pending)) { /* ask for key data */ - dev->irq_urb_pending = 1; error = usb_submit_urb(dev->urb_irq, GFP_ATOMIC); if (error) dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_irq) failed %d\n", __func__, error); + else + dev->irq_urb_pending = 1; } } @@ -480,7 +483,6 @@ static void cm109_toggle_buzzer_async(st /* URB completion will resubmit */ dev->buzzer_pending = 1; } else { - dev->ctl_urb_pending = 1; cm109_submit_buzz_toggle(dev); } }