Re: [PATCH] HID: generic: Check other drivers match callback from __check_hid_generic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

On Fri, Jan 31, 2020 at 1:46 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
>
> __check_hid_generic is used to check if there is a driver, other then
> the hid-generic driver, which wants to handle the hid-device, in which
> case hid_generic_match() will return false so that the other driver can
> bind.
>
> But what if the other driver also has a match callback and that indicates
> it does not want to handle the device? Then hid-generic should bind to it
> and thus hid_generic_match() should NOT return false in that case.
>
> This commit makes __check_hid_generic check if a matching driver has
> a match callback and if it does makes its check this, so that
> hid-generic will bind to devices which have a matching other driver,
> but that other driver's match callback rejects the device.

I get that part, but I am not sure I'll remember this in 2 months time
when/if we need to extend the .match() in another driver.
I am especially worried about the potential circular calls where an
other driver decides to check on all the other drivers having a match
callback...

Could you add a little blurb either in hid-generic.c explaining the
logic, or (and) in hid.h where .match is defined?

Because now, we have 2 callers for .match(): hid-core and hid-generic
(and 2 is usually one too many :-/).

Cheers,
Benjamin




>
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
> This patch was written while fixing the issues with hid-ite on the
> Acer SW5-012, where we only want to bind to one interface. In that
> specific case this change is not necessary because hid-multitouch will
> pick the hid-device which hid-ite's match callback is rejecting.
> ---
>  drivers/hid/hid-generic.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hid/hid-generic.c b/drivers/hid/hid-generic.c
> index f9db991d3c5a..fe3ca7612750 100644
> --- a/drivers/hid/hid-generic.c
> +++ b/drivers/hid/hid-generic.c
> @@ -31,7 +31,13 @@ static int __check_hid_generic(struct device_driver *drv, void *data)
>         if (hdrv == &hid_generic)
>                 return 0;
>
> -       return hid_match_device(hdev, hdrv) != NULL;
> +       if (!hid_match_device(hdev, hdrv))
> +               return 0;
> +
> +       if (!hdrv->match)
> +               return 1;
> +
> +       return hdrv->match(hdev, false);
>  }
>
>  static bool hid_generic_match(struct hid_device *hdev,
> --
> 2.23.0
>




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux