diff options
Diffstat (limited to 'drivers/platform/chrome/cros_ec_proto.c')
| -rw-r--r-- | drivers/platform/chrome/cros_ec_proto.c | 40 | 
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index 8350ca2311c7..398393ab5df8 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -506,10 +506,31 @@ int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,  }  EXPORT_SYMBOL(cros_ec_cmd_xfer_status); +static int get_next_event_xfer(struct cros_ec_device *ec_dev, +			       struct cros_ec_command *msg, +			       int version, uint32_t size) +{ +	int ret; + +	msg->version = version; +	msg->command = EC_CMD_GET_NEXT_EVENT; +	msg->insize = size; +	msg->outsize = 0; + +	ret = cros_ec_cmd_xfer(ec_dev, msg); +	if (ret > 0) { +		ec_dev->event_size = ret - 1; +		memcpy(&ec_dev->event_data, msg->data, ec_dev->event_size); +	} + +	return ret; +} +  static int get_next_event(struct cros_ec_device *ec_dev)  {  	u8 buffer[sizeof(struct cros_ec_command) + sizeof(ec_dev->event_data)];  	struct cros_ec_command *msg = (struct cros_ec_command *)&buffer; +	static int cmd_version = 1;  	int ret;  	if (ec_dev->suspended) { @@ -517,18 +538,19 @@ static int get_next_event(struct cros_ec_device *ec_dev)  		return -EHOSTDOWN;  	} -	msg->version = 0; -	msg->command = EC_CMD_GET_NEXT_EVENT; -	msg->insize = sizeof(ec_dev->event_data); -	msg->outsize = 0; +	if (cmd_version == 1) { +		ret = get_next_event_xfer(ec_dev, msg, cmd_version, +				sizeof(struct ec_response_get_next_event_v1)); +		if (ret < 0 || msg->result != EC_RES_INVALID_VERSION) +			return ret; -	ret = cros_ec_cmd_xfer(ec_dev, msg); -	if (ret > 0) { -		ec_dev->event_size = ret - 1; -		memcpy(&ec_dev->event_data, msg->data, -		       sizeof(ec_dev->event_data)); +		/* Fallback to version 0 for future send attempts */ +		cmd_version = 0;  	} +	ret = get_next_event_xfer(ec_dev, msg, cmd_version, +				  sizeof(struct ec_response_get_next_event)); +  	return ret;  }  |