2009-03-28 22:45:49

by Lamarque Vieira Souza

[permalink] [raw]
Subject: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

This patch fix a problem with Acer Bluetooth Optical Rechargeable Mouse where
the cursor gets stuck at screen's upper-left corner. Even the touchpad of my
notebook (Acer Ferrari 4005) cannot move the cursor when the bluetooth mouse
is turned on. Using an input session instead of hid session solves this
problem although the cursor moves a little sluggishly with the bluetooth
mouse. It moves correctly using the touchpad. I do not know if there is a
better implementation or a quirk for this problem, if it exists let me know.

Signed-off-by: Lamarque V. Souza <[email protected]>
---

--- linux-2.6.29/net/bluetooth/hidp/core.c 2009-03-28 16:55:43.023380377 -0300
+++ linux-2.6.29-lvs/net/bluetooth/hidp/core.c 2009-03-28 19:22:14.896228520
-0300
@@ -832,7 +832,10 @@ int hidp_add_connection(struct hidp_conn
session->flags = req->flags & (1 << HIDP_BLUETOOTH_VENDOR_ID);
session->idle_to = req->idle_to;

- if (req->rd_size > 0) {
+ /* Lamarque: Acer Bluetooth Optical Rechargeable Mouse (0458:0058) does not
work properly with hid session. */
+ if (req->rd_size > 0 && (
+ req->vendor != 0x0458 ||
+ req->product != 0x0058)) {
err = hidp_setup_hid(session, req);
if (err && err != -ENODEV)
goto err_skb;


2009-07-23 23:59:33

by Lamarque Vieira Souza

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

Em Quinta-feira 23 Julho 2009, Anthony Waters escreveu:
> The patch in the bug report[1] just undoes the part of the commit that
> causes the stutter/sluggishness with my mouse so it isn't really a fix

Actually I have changed your patch to add a quirk for my bluetooth controller
(0a5c:200a), so it only undoes the change for this particular bluetooth
controller. The default link policy settings mentioned in commit "[Bluetooth]
Make use of the default link policy settings" does not work properly with this
mouse even in Windows. In Windows the mouse is slow to react even today,
increasing acceleration in mouse settings helped but then the touchpad becomes
to sensitive, the mouse had always worked better in Linux than in Windows
until kernel 2.6.21. In 2.6.22 the input-to-hid change happened in hci_usb
module and the mouse started to behave like in Windows. In 2.6.27 the stutter
problem was introduced, in 2.6.29 hci_usb module was removed and only btusb
was available, but with hid+btusb+2.6.2[89] the cursor gets stucked at upper-
left corner, with hid+hci_usb+2.6.28 there is only the stutter problem.
Finally, after two years trying to find the causes of those problems it is
working well again, better than in Windows, so please add those two patches to
the kernel. I even got to the point to undo the input-to-hid change from
kernels 2.6.22 until 2.6.26 and port the modified 2.6.26 bluetooth subsystem
to kernels 2.6.2[789] until I find a better solution, which seems to be those
two patches.

> [1] http://bugzilla.kernel.org/show_bug.cgi?id=13314
>
> On Thu, Jul 23, 2009 at 6:21 PM, Lamarque Vieira
>
> Souza<[email protected]> wrote:
> > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> >> On Thu, 23 Jul 2009 19:00:58 -0300
> >>
> >> Lamarque Vieira Souza <[email protected]> wrote:
> >> > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> >> > > On Thu, 23 Jul 2009 18:30:57 -0300
> >> > >
> >> > > Lamarque Vieira Souza <[email protected]> wrote:
> >> > > > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> >> > > > > On Fri, 17 Jul 2009 03:01:43 -0300
> >> > > > >
> >> > > > > Lamarque Vieira Souza <[email protected]> wrote:
> >> > > > > > This patch works around one problem with my Acer Bluetooth
> >> > > > > > Optical Rechargeable Mouse where the cursor gets stuck at
> >> > > > > > screen's upper-left corner. Even my notebook's touchpad is not
> >> > > > > > able to move cursor when the bluetooth mouse is connected to
> >> > > > > > my Acer Ferrari 4005 notebook. Using input session instead of
> >> > > > > > hid session solves this problem although the cursor still
> >> > > > > > moves a little sluggishly with the bluetooth mouse, cursor
> >> > > > > > moves correctly using the touchpad. My bluetooth mouse used to
> >> > > > > > work well (no sluggish) until kernel 2.6.21, since then the
> >> > > > > > problems are getting worse with each kernel release (it got
> >> > > > > > sluggish in 2.6.22 and this this upper-left corner problem
> >> > > > > > appeared in 2.6.28 or 2.6.27).
> >> > > >
> >> > > > By the way, I have found that bug
> >> > > > http://bugzilla.kernel.org/show_bug.cgi?id=13314 is the cause of
> >> > > > the sluggish in my mouse.
> >> > >
> >> > > (cc's added)
> >> > >
> >> > > OK, thanks. Did you test Anthony's patch on your system?
> >> >
> >> > Yes, I did.
> >>
> >> Did it fix the bug?
> >
> > It fixed one of the two problems I had with this mouse.
> >
> >> If so, does that mean that you think we should merge Anthony's patch
> >> instead of yours?
> >
> > I need both patches for my mouse to work properly. My patch fix
> > the problem of cursor stucked at upper-left corner. Anthony's fix the
> > cursor being sluggish (stutter). They are two different problems.
> >
> >> > > Also, you've determined that
> >> > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=c
> >> > >omm it;h =e4e8e37c42bdaaefcb84eeaef0dc1bc3f696f8f6 caused the problem
> >> > > on your machine and that reverting it fixes things up.
> >> > >
> >> > > I'm all confused.
> >
> > --
> > Lamarque V. Souza
> > http://www.geographicguide.com/brazil.htm
> > Linux User #57137 - http://counter.li.org/


--
Lamarque V. Souza
http://www.geographicguide.com/brazil.htm
Linux User #57137 - http://counter.li.org/

2009-07-23 23:05:49

by Anthony Waters

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

The patch in the bug report[1] just undoes the part of the commit that
causes the stutter/sluggishness with my mouse so it isn't really a fix

[1] http://bugzilla.kernel.org/show_bug.cgi?id=3D13314

On Thu, Jul 23, 2009 at 6:21 PM, Lamarque Vieira
Souza<[email protected]> wrote:
> Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
>> On Thu, 23 Jul 2009 19:00:58 -0300
>>
>> Lamarque Vieira Souza <[email protected]> wrote:
>> > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
>> > > On Thu, 23 Jul 2009 18:30:57 -0300
>> > >
>> > > Lamarque Vieira Souza <[email protected]> wrote:
>> > > > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
>> > > > > On Fri, 17 Jul 2009 03:01:43 -0300
>> > > > >
>> > > > > Lamarque Vieira Souza <[email protected]> wrote:
>> > > > > > =A0 =A0 This patch works around one problem with my Acer Bluet=
ooth
>> > > > > > Optical Rechargeable Mouse where the cursor gets stuck at
>> > > > > > screen's upper-left corner. Even my notebook's touchpad is not
>> > > > > > able to move cursor when the bluetooth mouse is connected to m=
y
>> > > > > > Acer Ferrari 4005 notebook. Using input session instead of hid
>> > > > > > session solves this problem although the cursor still moves a
>> > > > > > little sluggishly with the bluetooth mouse, cursor moves
>> > > > > > correctly using the touchpad. My bluetooth mouse used to work
>> > > > > > well (no sluggish) until kernel 2.6.21, since then the problem=
s
>> > > > > > are getting worse with each kernel release (it got sluggish in
>> > > > > > 2.6.22 and this this upper-left corner problem appeared in 2.6=
.28
>> > > > > > or 2.6.27).
>> > > >
>> > > > =A0 =A0 =A0 =A0 By the way, I have found that bug
>> > > > http://bugzilla.kernel.org/show_bug.cgi?id=3D13314 is the cause of=
the
>> > > > sluggish in my mouse.
>> > >
>> > > (cc's added)
>> > >
>> > > OK, thanks. =A0Did you test Anthony's patch on your system?
>> >
>> > =A0 =A0 Yes, =A0I did.
>>
>> Did it fix the bug?
>
> =A0 =A0 =A0 =A0It fixed one of the two problems I had with this mouse.
>
>> If so, does that mean that you think we should merge Anthony's patch
>> instead of yours?
>
> =A0 =A0 =A0 =A0I need both patches for my mouse to work properly. My patc=
h fix the problem
> of cursor stucked at upper-left corner. Anthony's fix the cursor being
> sluggish (stutter). They are two different problems.
>
>> > > Also, you've determined that
>> > > http://git.kernel.org/?p=3Dlinux/kernel/git/torvalds/linux-2.6.git;a=
=3Dcomm
>> > >it;h =3De4e8e37c42bdaaefcb84eeaef0dc1bc3f696f8f6 caused the problem o=
n
>> > > your machine and that reverting it fixes things up.
>> > >
>> > > I'm all confused.
>
>
> --
> Lamarque V. Souza
> http://www.geographicguide.com/brazil.htm
> Linux User #57137 - http://counter.li.org/
>

2009-07-23 22:21:30

by Lamarque Vieira Souza

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> On Thu, 23 Jul 2009 19:00:58 -0300
>
> Lamarque Vieira Souza <[email protected]> wrote:
> > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> > > On Thu, 23 Jul 2009 18:30:57 -0300
> > >
> > > Lamarque Vieira Souza <[email protected]> wrote:
> > > > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> > > > > On Fri, 17 Jul 2009 03:01:43 -0300
> > > > >
> > > > > Lamarque Vieira Souza <[email protected]> wrote:
> > > > > > This patch works around one problem with my Acer Bluetooth
> > > > > > Optical Rechargeable Mouse where the cursor gets stuck at
> > > > > > screen's upper-left corner. Even my notebook's touchpad is not
> > > > > > able to move cursor when the bluetooth mouse is connected to my
> > > > > > Acer Ferrari 4005 notebook. Using input session instead of hid
> > > > > > session solves this problem although the cursor still moves a
> > > > > > little sluggishly with the bluetooth mouse, cursor moves
> > > > > > correctly using the touchpad. My bluetooth mouse used to work
> > > > > > well (no sluggish) until kernel 2.6.21, since then the problems
> > > > > > are getting worse with each kernel release (it got sluggish in
> > > > > > 2.6.22 and this this upper-left corner problem appeared in 2.6.28
> > > > > > or 2.6.27).
> > > >
> > > > By the way, I have found that bug
> > > > http://bugzilla.kernel.org/show_bug.cgi?id=13314 is the cause of the
> > > > sluggish in my mouse.
> > >
> > > (cc's added)
> > >
> > > OK, thanks. Did you test Anthony's patch on your system?
> >
> > Yes, I did.
>
> Did it fix the bug?

It fixed one of the two problems I had with this mouse.

> If so, does that mean that you think we should merge Anthony's patch
> instead of yours?

I need both patches for my mouse to work properly. My patch fix the problem
of cursor stucked at upper-left corner. Anthony's fix the cursor being
sluggish (stutter). They are two different problems.

> > > Also, you've determined that
> > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=comm
> > >it;h =e4e8e37c42bdaaefcb84eeaef0dc1bc3f696f8f6 caused the problem on
> > > your machine and that reverting it fixes things up.
> > >
> > > I'm all confused.


--
Lamarque V. Souza
http://www.geographicguide.com/brazil.htm
Linux User #57137 - http://counter.li.org/

2009-07-23 22:06:43

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

On Thu, 23 Jul 2009 19:00:58 -0300
Lamarque Vieira Souza <[email protected]> wrote:

> Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> > On Thu, 23 Jul 2009 18:30:57 -0300
> >
> > Lamarque Vieira Souza <[email protected]> wrote:
> > > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> > > > On Fri, 17 Jul 2009 03:01:43 -0300
> > > >
> > > > Lamarque Vieira Souza <[email protected]> wrote:
> > > > > This patch works around one problem with my Acer Bluetooth Optical
> > > > > Rechargeable Mouse where the cursor gets stuck at screen's upper-left
> > > > > corner. Even my notebook's touchpad is not able to move cursor when
> > > > > the bluetooth mouse is connected to my Acer Ferrari 4005 notebook.
> > > > > Using input session instead of hid session solves this problem
> > > > > although the cursor still moves a little sluggishly with the
> > > > > bluetooth mouse, cursor moves correctly using the touchpad. My
> > > > > bluetooth mouse used to work well (no sluggish) until kernel 2.6.21,
> > > > > since then the problems are getting worse with each kernel release
> > > > > (it got sluggish in 2.6.22 and this this upper-left corner problem
> > > > > appeared in 2.6.28 or 2.6.27).
> > >
> > > By the way, I have found that bug
> > > http://bugzilla.kernel.org/show_bug.cgi?id=13314 is the cause of the
> > > sluggish in my mouse.
> >
> > (cc's added)
> >
> > OK, thanks. Did you test Anthony's patch on your system?
>
> Yes, I did.

Did it fix the bug?

If so, does that mean that you think we should merge Anthony's patch
instead of yours?

> > Also, you've determined that
> > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h
> >=e4e8e37c42bdaaefcb84eeaef0dc1bc3f696f8f6 caused the problem on your machine
> > and that reverting it fixes things up.
> >
> > I'm all confused.

2009-07-23 22:00:58

by Lamarque Vieira Souza

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> On Thu, 23 Jul 2009 18:30:57 -0300
>
> Lamarque Vieira Souza <[email protected]> wrote:
> > Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> > > On Fri, 17 Jul 2009 03:01:43 -0300
> > >
> > > Lamarque Vieira Souza <[email protected]> wrote:
> > > > This patch works around one problem with my Acer Bluetooth Optical
> > > > Rechargeable Mouse where the cursor gets stuck at screen's upper-left
> > > > corner. Even my notebook's touchpad is not able to move cursor when
> > > > the bluetooth mouse is connected to my Acer Ferrari 4005 notebook.
> > > > Using input session instead of hid session solves this problem
> > > > although the cursor still moves a little sluggishly with the
> > > > bluetooth mouse, cursor moves correctly using the touchpad. My
> > > > bluetooth mouse used to work well (no sluggish) until kernel 2.6.21,
> > > > since then the problems are getting worse with each kernel release
> > > > (it got sluggish in 2.6.22 and this this upper-left corner problem
> > > > appeared in 2.6.28 or 2.6.27).
> >
> > By the way, I have found that bug
> > http://bugzilla.kernel.org/show_bug.cgi?id=13314 is the cause of the
> > sluggish in my mouse.
>
> (cc's added)
>
> OK, thanks. Did you test Anthony's patch on your system?

Yes, I did.

> Also, you've determined that
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h
>=e4e8e37c42bdaaefcb84eeaef0dc1bc3f696f8f6 caused the problem on your machine
> and that reverting it fixes things up.
>
> I'm all confused.

--
Lamarque V. Souza
http://www.geographicguide.com/brazil.htm
Linux User #57137 - http://counter.li.org/

2009-07-23 21:43:36

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

On Thu, 23 Jul 2009 18:30:57 -0300
Lamarque Vieira Souza <[email protected]> wrote:

> Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> > On Fri, 17 Jul 2009 03:01:43 -0300
> >
> > Lamarque Vieira Souza <[email protected]> wrote:
> > > This patch works around one problem with my Acer Bluetooth Optical
> > > Rechargeable Mouse where the cursor gets stuck at screen's upper-left
> > > corner. Even my notebook's touchpad is not able to move cursor when the
> > > bluetooth mouse is connected to my Acer Ferrari 4005 notebook. Using
> > > input session instead of hid session solves this problem although the
> > > cursor still moves a little sluggishly with the bluetooth mouse, cursor
> > > moves correctly using the touchpad. My bluetooth mouse used to work well
> > > (no sluggish) until kernel 2.6.21, since then the problems are getting
> > > worse with each kernel release (it got sluggish in 2.6.22 and this this
> > > upper-left corner problem appeared in 2.6.28 or 2.6.27).
>
> By the way, I have found that bug
> http://bugzilla.kernel.org/show_bug.cgi?id=13314 is the cause of the sluggish
> in my mouse.

(cc's added)

OK, thanks. Did you test Anthony's patch on your system?

Also, you've determined that
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e4e8e37c42bdaaefcb84eeaef0dc1bc3f696f8f6
caused the problem on your machine and that reverting it fixes things
up.

I'm all confused.

2009-07-23 21:30:57

by Lamarque Vieira Souza

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

Hi,

Em Quinta-feira 23 Julho 2009, Andrew Morton escreveu:
> On Fri, 17 Jul 2009 03:01:43 -0300
>
> Lamarque Vieira Souza <[email protected]> wrote:
> > This patch works around one problem with my Acer Bluetooth Optical
> > Rechargeable Mouse where the cursor gets stuck at screen's upper-left
> > corner. Even my notebook's touchpad is not able to move cursor when the
> > bluetooth mouse is connected to my Acer Ferrari 4005 notebook. Using
> > input session instead of hid session solves this problem although the
> > cursor still moves a little sluggishly with the bluetooth mouse, cursor
> > moves correctly using the touchpad. My bluetooth mouse used to work well
> > (no sluggish) until kernel 2.6.21, since then the problems are getting
> > worse with each kernel release (it got sluggish in 2.6.22 and this this
> > upper-left corner problem appeared in 2.6.28 or 2.6.27).

By the way, I have found that bug
http://bugzilla.kernel.org/show_bug.cgi?id=13314 is the cause of the sluggish
in my mouse.

> The patch also adds a new general quirk infrastructure to the hidp
> core. That's worth noting in the changelog! I added this:
>
> The patch adds a general quirk handling framework to the HIDP
> core and then uses this framework to implement a quirk for this
> device.

Ok, that is better.

> > linux-2.6.30.1-lvs/net/bluetooth/hidp/core.c
> > --- linux-2.6.30.1-orig/net/bluetooth/hidp/core.c 2009-07-16
> > 23:53:04.697925121 -0300
> > +++ linux-2.6.30.1-lvs/net/bluetooth/hidp/core.c 2009-07-17
> > 02:35:03.969927384 -0300
> > @@ -73,6 +73,43 @@ static unsigned char hidp_keycode[256] =
> >
> > static unsigned char hidp_mkeyspat[] = { 0x01, 0x01, 0x01, 0x01, 0x01,
> > 0x01 };
> >
> > +/* HIDP device quirks */
> > +enum {
> > + HIDP_QUIRK_USE_INPUT_SESSION
> > +};
> > +
> > +struct quirk_id {
> > + __u16 vendor;
> > + __u16 product;
> > + unsigned long quirks;
> > +};
> > +
> > +static const struct quirk_id hidp_quirks[] = {
> > + {
> > + /* Lamarque: Acer Bluetooth Optical Rechargeable Mouse
> > + * does not work properly with hid session since 2.6.27. */
> > + .vendor = 0x0458,
> > + .product = 0x0058,
> > + .quirks = 1 << HIDP_QUIRK_USE_INPUT_SESSION
> > + },
> > +
> > + { /* end: all zeroes */ }
> > +};
> > +
> > +static int quirk_test_bit(__u16 vendor, __u16 product, int quirk)
> > +{
> > + const struct quirk_id *q = &hidp_quirks[0];
> > +
> > + while (q->vendor != vendor && q->product != product &&
> > + q->vendor && q->product)
> > + q++;
> > +
> > + if (q->vendor == vendor && q->product == product)
> > + return test_bit(quirk, &q->quirks);
> > +
> > + return 0;
> > +}
>
> Looks OK, but...
>
> It's a bit neater (IMO) and probably more efficient to replace the
> null-terminated search with a fixed-size one, using ARRAY_SIZE().
>
> How does this look?

It really looks better. Thanks for the tip about ARRAY_SIZE.

> static const struct quirk_id hidp_quirks[] = {
> {
> /* Lamarque: Acer Bluetooth Optical Rechargeable Mouse
> * does not work properly with hid session since 2.6.27. */
> .vendor = 0x0458,
> .product = 0x0058,
> .quirks = 1 << HIDP_QUIRK_USE_INPUT_SESSION
> },
> };
>
> static int quirk_test_bit(__u16 vendor, __u16 product, int quirk)
> {
> int i;
>
> for (i = 0; i < ARRAY_SIZE(hidp_quirks); i++) {
> const struct quirk_id *q = hidp_quirks + i;
>
> if (q->vendor == vendor && q->product == product)
> return test_bit(quirk, &q->quirks);
> }
>
> return 0;
> }
>
>
>
> Incremental patch:
>
> ---
> a/net/bluetooth/hidp/core.c~bluetooth-fix-for-acer-bluetooth-optical-rechar
>geable-mouse-fix +++ a/net/bluetooth/hidp/core.c
> @@ -92,20 +92,18 @@ static const struct quirk_id hidp_quirks
> .product = 0x0058,
> .quirks = 1 << HIDP_QUIRK_USE_INPUT_SESSION
> },
> -
> - { /* end: all zeroes */ }
> };
>
> static int quirk_test_bit(__u16 vendor, __u16 product, int quirk)
> {
> - const struct quirk_id *q = &hidp_quirks[0];
> + int i;
>
> - while (q->vendor != vendor && q->product != product &&
> - q->vendor && q->product)
> - q++;
> + for (i = 0; i < ARRAY_SIZE(hidp_quirks); i++) {
> + const struct quirk_id *q = hidp_quirks + i;
>
> - if (q->vendor == vendor && q->product == product)
> - return test_bit(quirk, &q->quirks);
> + if (q->vendor == vendor && q->product == product)
> + return test_bit(quirk, &q->quirks);
> + }
>
> return 0;
> }
> _


--
Lamarque V. Souza
http://www.geographicguide.com/brazil.htm
Linux User #57137 - http://counter.li.org/

2009-07-23 20:28:10

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] Fix for Acer Bluetooth Optical Rechargeable Mouse

On Fri, 17 Jul 2009 03:01:43 -0300
Lamarque Vieira Souza <[email protected]> wrote:

> This patch works around one problem with my Acer Bluetooth Optical
> Rechargeable Mouse where the cursor gets stuck at screen's upper-left corner.
> Even my notebook's touchpad is not able to move cursor when the bluetooth
> mouse is connected to my Acer Ferrari 4005 notebook. Using input session
> instead of hid session solves this problem although the cursor still moves a
> little sluggishly with the bluetooth mouse, cursor moves correctly using the
> touchpad. My bluetooth mouse used to work well (no sluggish) until kernel
> 2.6.21, since then the problems are getting worse with each kernel release (it
> got sluggish in 2.6.22 and this this upper-left corner problem appeared in
> 2.6.28 or 2.6.27).

The patch also adds a new general quirk infrastructure to the hidp
core. That's worth noting in the changelog! I added this:

The patch adds a general quirk handling framework to the HIDP
core and then uses this framework to implement a quirk for this
device.


> linux-2.6.30.1-lvs/net/bluetooth/hidp/core.c
> --- linux-2.6.30.1-orig/net/bluetooth/hidp/core.c 2009-07-16
> 23:53:04.697925121 -0300
> +++ linux-2.6.30.1-lvs/net/bluetooth/hidp/core.c 2009-07-17 02:35:03.969927384
> -0300
> @@ -73,6 +73,43 @@ static unsigned char hidp_keycode[256] =
>
> static unsigned char hidp_mkeyspat[] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
> };
>
> +/* HIDP device quirks */
> +enum {
> + HIDP_QUIRK_USE_INPUT_SESSION
> +};
> +
> +struct quirk_id {
> + __u16 vendor;
> + __u16 product;
> + unsigned long quirks;
> +};
> +
> +static const struct quirk_id hidp_quirks[] = {
> + {
> + /* Lamarque: Acer Bluetooth Optical Rechargeable Mouse
> + * does not work properly with hid session since 2.6.27. */
> + .vendor = 0x0458,
> + .product = 0x0058,
> + .quirks = 1 << HIDP_QUIRK_USE_INPUT_SESSION
> + },
> +
> + { /* end: all zeroes */ }
> +};
> +
> +static int quirk_test_bit(__u16 vendor, __u16 product, int quirk)
> +{
> + const struct quirk_id *q = &hidp_quirks[0];
> +
> + while (q->vendor != vendor && q->product != product &&
> + q->vendor && q->product)
> + q++;
> +
> + if (q->vendor == vendor && q->product == product)
> + return test_bit(quirk, &q->quirks);
> +
> + return 0;
> +}

Looks OK, but...

It's a bit neater (IMO) and probably more efficient to replace the
null-terminated search with a fixed-size one, using ARRAY_SIZE().

How does this look?

static const struct quirk_id hidp_quirks[] = {
{
/* Lamarque: Acer Bluetooth Optical Rechargeable Mouse
* does not work properly with hid session since 2.6.27. */
.vendor = 0x0458,
.product = 0x0058,
.quirks = 1 << HIDP_QUIRK_USE_INPUT_SESSION
},
};

static int quirk_test_bit(__u16 vendor, __u16 product, int quirk)
{
int i;

for (i = 0; i < ARRAY_SIZE(hidp_quirks); i++) {
const struct quirk_id *q = hidp_quirks + i;

if (q->vendor == vendor && q->product == product)
return test_bit(quirk, &q->quirks);
}

return 0;
}



Incremental patch:

--- a/net/bluetooth/hidp/core.c~bluetooth-fix-for-acer-bluetooth-optical-rechargeable-mouse-fix
+++ a/net/bluetooth/hidp/core.c
@@ -92,20 +92,18 @@ static const struct quirk_id hidp_quirks
.product = 0x0058,
.quirks = 1 << HIDP_QUIRK_USE_INPUT_SESSION
},
-
- { /* end: all zeroes */ }
};

static int quirk_test_bit(__u16 vendor, __u16 product, int quirk)
{
- const struct quirk_id *q = &hidp_quirks[0];
+ int i;

- while (q->vendor != vendor && q->product != product &&
- q->vendor && q->product)
- q++;
+ for (i = 0; i < ARRAY_SIZE(hidp_quirks); i++) {
+ const struct quirk_id *q = hidp_quirks + i;

- if (q->vendor == vendor && q->product == product)
- return test_bit(quirk, &q->quirks);
+ if (q->vendor == vendor && q->product == product)
+ return test_bit(quirk, &q->quirks);
+ }

return 0;
}
_