summaryrefslogtreecommitdiff
path: root/util/comm-host.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/comm-host.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/comm-host.c')
-rw-r--r--util/comm-host.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/util/comm-host.c b/util/comm-host.c
index 7da86316fb..601411d74f 100644
--- a/util/comm-host.c
+++ b/util/comm-host.c
@@ -11,6 +11,8 @@
#include "comm-host.h"
#include "ec_commands.h"
+#include "misc_util.h"
+
int (*ec_command_proto)(int command, int version,
const void *outdata, int outsize,
@@ -78,10 +80,17 @@ int ec_command(int command, int version,
int comm_init(int interfaces, const char *device_name)
{
struct ec_response_get_protocol_info info;
+ int allow_large_buffer;
/* Default memmap access */
ec_readmem = fake_readmem;
+ allow_large_buffer = kernel_version_ge(3, 14, 0);
+ if (allow_large_buffer < 0) {
+ fprintf(stderr, "Unable to check linux version\n");
+ return 1;
+ }
+
/* Prefer new /dev method */
if ((interfaces & COMM_DEV) && comm_init_dev &&
!comm_init_dev(device_name))
@@ -111,10 +120,12 @@ int comm_init(int interfaces, const char *device_name)
/* read max request / response size from ec for protocol v3+ */
if (ec_command(EC_CMD_GET_PROTOCOL_INFO, 0, NULL, 0, &info,
sizeof(info)) == sizeof(info)) {
- ec_max_outsize = info.max_request_packet_size -
- sizeof(struct ec_host_request);
- ec_max_insize = info.max_response_packet_size -
- sizeof(struct ec_host_response);
+ if ((allow_large_buffer) ||
+ (info.max_request_packet_size < ec_max_outsize))
+ ec_max_outsize = info.max_request_packet_size;
+ if ((allow_large_buffer) ||
+ (info.max_request_packet_size < ec_max_insize))
+ ec_max_insize = info.max_response_packet_size;
ec_outbuf = realloc(ec_outbuf, ec_max_outsize);
ec_inbuf = realloc(ec_inbuf, ec_max_insize);