summaryrefslogtreecommitdiff
path: root/util/misc_util.c
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2015-03-24 17:11:09 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-05-30 01:04:29 +0000
commitc89ebdb66c839fb6ef7787d22c4492a4507fb727 (patch)
tree91576ccf12e34e6c16c25935ea353f898f14289e /util/misc_util.c
parent1ade8e02a7379732683e34b5cd71acfb2f1685ce (diff)
downloadchrome-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.c37
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;
+}
+