diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2015-03-24 17:11:09 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-05-30 01:04:29 +0000 |
commit | c89ebdb66c839fb6ef7787d22c4492a4507fb727 (patch) | |
tree | 91576ccf12e34e6c16c25935ea353f898f14289e /util/misc_util.c | |
parent | 1ade8e02a7379732683e34b5cd71acfb2f1685ce (diff) | |
download | chrome-ec-c89ebdb66c839fb6ef7787d22c4492a4507fb727.tar.gz |
ectool: query packet size and set them properly internally.
Allow to negotiate the packet command and responses to
whatever values the EC can support.
Set the buffer size including the necessary V3 header.
If the EC run v3 protocol with large packet support, but the kernel
does not have v3 support (3.10), we can not support sending or
receiving large commands.
Be aware that on 3.10, commands like ectool console will fail if
the EC wants to send command larger than the kernel can handle.
Copied kernel_version_ge from libusb-1.0.19/libusb/os/linux_usbfs.c.
BUG=chrome-os-partner:31989,chrome-os-partner:31660,chromium:454324,chrome-os-partner:39265
BRANCH=none
TEST=Build a special firmware to exchange 300 bytes.
Check ectool console works with the righ size.
Check that ectool is calling uname.
Check on Nyan_big: without change, "ectool version" crashes kernel. With
changes, "ectool version" works.
In conseuqence, it reverts commit be0bd9b83538427cc350ad38d64b821dfcad82a0,
"ectool: Do not increase buffer size after probe max size from ec"
Change-Id: I54ffd43488ea81272f30789dc87a261085769fe0
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/274086
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'util/misc_util.c')
-rw-r--r-- | util/misc_util.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/util/misc_util.c b/util/misc_util.c index 63c0fead2a..3e4ff71f0f 100644 --- a/util/misc_util.c +++ b/util/misc_util.c @@ -8,6 +8,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/utsname.h> #include "comm-host.h" #include "misc_util.h" @@ -133,3 +134,39 @@ int ec_cmd_version_supported(int cmd, int ver) return (mask & EC_VER_MASK(ver)) ? 1 : 0; } + +/** + * Return 1 is the current kernel version is greater or equal to + * <major>.<minor>.<sublevel> + */ +int kernel_version_ge(int major, int minor, int sublevel) +{ + struct utsname uts; + int atoms, kmajor, kminor, ksublevel; + + if (uname(&uts) < 0) + return -1; + atoms = sscanf(uts.release, "%d.%d.%d", &kmajor, &kminor, &ksublevel); + if (atoms < 1) + return -1; + + if (kmajor > major) + return 1; + if (kmajor < major) + return 0; + + /* kmajor == major */ + if (atoms < 2) + return 0 == minor && 0 == sublevel; + if (kminor > minor) + return 1; + if (kminor < minor) + return 0; + + /* kminor == minor */ + if (atoms < 3) + return 0 == sublevel; + + return ksublevel >= sublevel; +} + |