Re: [PATCH] HID: usbhid: fix "always poll" quirk

2017-07-21 Thread Jiri Kosina
On Wed, 12 Jul 2017, Dmitry Torokhov wrote:

> Even though the IO for devices with "always poll" quirk is already running,
> we still need to set HID_OPENED bit in usbhid->iofl so the interrupt
> handler does not ignore the data coming from the device.
> 
> Reported-by: Olof Johansson 
> Tested-by: Olof Johansson 
> Fixes: e399396a6b0 ("HID: usbhid: remove custom locking from usbhid_open...")
> Signed-off-by: Dmitry Torokhov 

Ah, pitty I've missed this one for the yesterday pull request, sorry for 
that. Applied now to for-4.13/upstream-fixes and will be sending upstream 
next week.

Thanks,

-- 
Jiri Kosina
SUSE Labs

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] HID: usbhid: fix "always poll" quirk

2017-07-21 Thread Benjamin Tissoires
On Jul 12 2017 or thereabouts, Dmitry Torokhov wrote:
> Even though the IO for devices with "always poll" quirk is already running,
> we still need to set HID_OPENED bit in usbhid->iofl so the interrupt
> handler does not ignore the data coming from the device.
> 
> Reported-by: Olof Johansson 
> Tested-by: Olof Johansson 
> Fixes: e399396a6b0 ("HID: usbhid: remove custom locking from usbhid_open...")
> Signed-off-by: Dmitry Torokhov 
> ---

slightly reviewed and
Acked-by: Benjamin Tissoires 

Cheers,
Benjamin

>  drivers/hid/usbhid/hid-core.c | 16 ++--
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
> index 76013eb5cb7f..c008847e0b20 100644
> --- a/drivers/hid/usbhid/hid-core.c
> +++ b/drivers/hid/usbhid/hid-core.c
> @@ -680,18 +680,21 @@ static int usbhid_open(struct hid_device *hid)
>   struct usbhid_device *usbhid = hid->driver_data;
>   int res;
>  
> + set_bit(HID_OPENED, >iofl);
> +
>   if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
>   return 0;
>  
>   res = usb_autopm_get_interface(usbhid->intf);
>   /* the device must be awake to reliably request remote wakeup */
> - if (res < 0)
> + if (res < 0) {
> + clear_bit(HID_OPENED, >iofl);
>   return -EIO;
> + }
>  
>   usbhid->intf->needs_remote_wakeup = 1;
>  
>   set_bit(HID_RESUME_RUNNING, >iofl);
> - set_bit(HID_OPENED, >iofl);
>   set_bit(HID_IN_POLLING, >iofl);
>  
>   res = hid_start_in(hid);
> @@ -727,19 +730,20 @@ static void usbhid_close(struct hid_device *hid)
>  {
>   struct usbhid_device *usbhid = hid->driver_data;
>  
> - if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
> - return;
> -
>   /*
>* Make sure we don't restart data acquisition due to
>* a resumption we no longer care about by avoiding racing
>* with hid_start_in().
>*/
>   spin_lock_irq(>lock);
> - clear_bit(HID_IN_POLLING, >iofl);
>   clear_bit(HID_OPENED, >iofl);
> + if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL))
> + clear_bit(HID_IN_POLLING, >iofl);
>   spin_unlock_irq(>lock);
>  
> + if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
> + return;
> +
>   hid_cancel_delayed_stuff(usbhid);
>   usb_kill_urb(usbhid->urbin);
>   usbhid->intf->needs_remote_wakeup = 0;
> -- 
> 2.13.2.932.g7449e964c-goog
> 
> 
> -- 
> Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] HID: usbhid: fix "always poll" quirk

2017-07-12 Thread Dmitry Torokhov
Even though the IO for devices with "always poll" quirk is already running,
we still need to set HID_OPENED bit in usbhid->iofl so the interrupt
handler does not ignore the data coming from the device.

Reported-by: Olof Johansson 
Tested-by: Olof Johansson 
Fixes: e399396a6b0 ("HID: usbhid: remove custom locking from usbhid_open...")
Signed-off-by: Dmitry Torokhov 
---
 drivers/hid/usbhid/hid-core.c | 16 ++--
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 76013eb5cb7f..c008847e0b20 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -680,18 +680,21 @@ static int usbhid_open(struct hid_device *hid)
struct usbhid_device *usbhid = hid->driver_data;
int res;
 
+   set_bit(HID_OPENED, >iofl);
+
if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
return 0;
 
res = usb_autopm_get_interface(usbhid->intf);
/* the device must be awake to reliably request remote wakeup */
-   if (res < 0)
+   if (res < 0) {
+   clear_bit(HID_OPENED, >iofl);
return -EIO;
+   }
 
usbhid->intf->needs_remote_wakeup = 1;
 
set_bit(HID_RESUME_RUNNING, >iofl);
-   set_bit(HID_OPENED, >iofl);
set_bit(HID_IN_POLLING, >iofl);
 
res = hid_start_in(hid);
@@ -727,19 +730,20 @@ static void usbhid_close(struct hid_device *hid)
 {
struct usbhid_device *usbhid = hid->driver_data;
 
-   if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
-   return;
-
/*
 * Make sure we don't restart data acquisition due to
 * a resumption we no longer care about by avoiding racing
 * with hid_start_in().
 */
spin_lock_irq(>lock);
-   clear_bit(HID_IN_POLLING, >iofl);
clear_bit(HID_OPENED, >iofl);
+   if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL))
+   clear_bit(HID_IN_POLLING, >iofl);
spin_unlock_irq(>lock);
 
+   if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
+   return;
+
hid_cancel_delayed_stuff(usbhid);
usb_kill_urb(usbhid->urbin);
usbhid->intf->needs_remote_wakeup = 0;
-- 
2.13.2.932.g7449e964c-goog


-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html