K750 fixes in hidpp-rework branch

Peter Wu lekensteyn at gmail.com
Mon Sep 2 02:22:41 PDT 2013

Hi Martin,

Thank you for your feedback, a general review of the structure is also helful.

On Monday 02 September 2013 07:00:48 Martin Pitt wrote:
> I'm afraid I can't help much with the actual protocol bits, but some
> general/logic things that caught my eye:
>  - hidpp_device_print_buffer()
>    + This now always prints sizeof (*msg) bytes, which is a constant
>      (i. e. the larger part of the union for a long message). That
>      means for a short message the last 13 bytes will be only garbage.
>      Perhaps the byte dump should be moved into the if TYPE_SHORT/elif
>      TYPE_LONG / elif UNKNOWN right below it?

This code is only executed when running the hidpp-test program, what the 
output looks like should not really matter since most reports are padded 
anyway (and those padding can be ignored). I will fix this for short messages 

>  - hidpp_device_cmd():
>    + Do we need to check for EINTR in the write()? Or are all
>      commands very tiny and thus the chance of EINTRing is negligible?

When trying to debug, I encountered a few times that write/read fails due to 
EINTR, therefore I added this check.

>    + In this part:
>               /* validate response */
>               if (read_msg.type != HIDPP_MSG_TYPE_SHORT &&
>                       read_msg.type != HIDPP_MSG_TYPE_LONG) {
>                       /* ignore key presses, mouse motions, etc. */
>                       continue;
>               }
>       This means we read an unknown message type and thus we probably
>       did a short or too long (if there are more messages queued)
>       read(), i. e. the next read() will be complete garbage as we
>       start reading in the middle of some message. Can it actually
>       happen that the next read() after a command write() is unrelated
>       to that write()? I. e. do messages actually arrive out of band?

The hidraw API guaruantees that message boundaries are preserved. See also the 
implementation of hidpp_discard_messages(), that only reads one byte and let 
the kernel take care of the remainder.

>    + After the "out:" label it unconditionally copies the read message
>      from the local "read_msg" into the output argument "response"
>      anyway. Any reason why it couldn't use "response" right away for
>      the read() call and evaluation, and drop "read_msg"?

Before "hidpp: split request read/write functions", the response pointer could 
be the same as the request. After that commit, I can now directly copy to 
read_msg. I will fix this.

>  - hidpp_device_refresh():
>    + This construction
>                 name = g_string_new ("");
>                 serialp = (guint32 *) &msg.l.params[1];
>                 g_string_printf (name, "%08X", g_ntohl(*serialp));
>                 priv->serial = g_strdup (name->str);
>       looks overly complicated to me. new is freed at the end of the
>       function so it doesn't leak, but this would seem easier:
>                 serialp = (guint32 *) &msg.l.params[1];
>                 priv->serial = g_strdup_printf ("%08X", g_ntohl(*serialp));

Yes, I followed the other example without considering alternatives. 
g_strdup_printf seems sufficient here.

>       Same for the other occurrence, which is even easier (it's just
>       setting it to a single string).

Not exactly the same, the other string does not have to be NUL terminated. 
Anyway, I am now using:

    g_strdup_printf ("%.*s", len, msg.l.params + 2);

>    + Is "if (lux > 200) CHARGING else DISCHARGING" some kind of
>      heuristic, or actually defined somewhere?

It was found by experimentation of Julien Danjou[1].

>  - up_device_unifying_coldplug():
>    + I think it's better to keep the "GUdevDevice *parent_dev"
>      declaration within the if/else blocks, as it's going to be an
>      undefined non-NULL value outside of them (the dev got unreffed
>      already).

Should I name it 'tmp2' instead? No, you are right ;) The scope is limited to 
if which is probably a better place for it. I do not want to add a new commit 
for fixing such a tiny style issue, can I rebase it before merging?

>    + Is there some technical specification that this is a valid
>      assumption?
>      /* give newly paired devices a chance to complete pairing */
>      g_usleep(30000);
>      Or should this rather wait for some signal/uevent to happen?

I looked at the maximum "Default report interval" in the HID++ 1.0 spec (20 
ms) and added a few ms extra. It might not make any sense at all to use that 
value here, but it seems a safe boundary to allow the hidpp-logitech-dj driver 
to complete initialisation.


 [1]: http://lists.freedesktop.org/archives/devkit-devel/2013-August/001460.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/devkit-devel/attachments/20130902/73926d98/attachment.pgp>

More information about the devkit-devel mailing list