Commit bc091356 authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman

greybus: fix uart request_operation()

This fixes a problem similar to what was found in the battery
protcool driver code.

There's no need to allocate a local buffer, that already set up
by gb_operation_create().  Just use that instead.

Change a few variable names to reflect that they hold response
messages, not request messages.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 0bbfe04c
...@@ -144,19 +144,12 @@ static int request_operation(struct gb_connection *connection, int type, ...@@ -144,19 +144,12 @@ static int request_operation(struct gb_connection *connection, int type,
void *response, int response_size) void *response, int response_size)
{ {
struct gb_operation *operation; struct gb_operation *operation;
struct gb_uart_simple_response *fake_request; struct gb_uart_simple_response *fake_response;
u8 *local_response;
int ret; int ret;
local_response = kmalloc(response_size, GFP_KERNEL);
if (!local_response)
return -ENOMEM;
operation = gb_operation_create(connection, type, 0, response_size); operation = gb_operation_create(connection, type, 0, response_size);
if (!operation) { if (!operation)
kfree(local_response);
return -ENOMEM; return -ENOMEM;
}
/* Synchronous operation--no callback */ /* Synchronous operation--no callback */
ret = gb_operation_request_send(operation, NULL); ret = gb_operation_request_send(operation, NULL);
...@@ -170,19 +163,18 @@ static int request_operation(struct gb_connection *connection, int type, ...@@ -170,19 +163,18 @@ static int request_operation(struct gb_connection *connection, int type,
* layout for where the status is, so cast this to a random request so * layout for where the status is, so cast this to a random request so
* we can see the status easier. * we can see the status easier.
*/ */
fake_request = (struct gb_uart_simple_response *)local_response; fake_response = operation->response.payload;
if (fake_request->status) { if (fake_response->status) {
gb_connection_err(connection, "response %hhu", gb_connection_err(connection, "response %hhu",
fake_request->status); fake_response->status);
ret = -EIO; ret = -EIO;
} else { } else {
/* Good request, so copy to the caller's buffer */ /* Good request, so copy to the caller's buffer */
if (response_size && response) if (response_size && response)
memcpy(response, local_response, response_size); memcpy(response, fake_response, response_size);
} }
out: out:
gb_operation_destroy(operation); gb_operation_destroy(operation);
kfree(local_response);
return ret; return ret;
} }
...@@ -193,23 +185,23 @@ static int request_operation(struct gb_connection *connection, int type, ...@@ -193,23 +185,23 @@ static int request_operation(struct gb_connection *connection, int type,
*/ */
static int get_version(struct gb_tty *tty) static int get_version(struct gb_tty *tty)
{ {
struct gb_uart_proto_version_response version_request; struct gb_uart_proto_version_response version_response;
int retval; int retval;
retval = request_operation(tty->connection, retval = request_operation(tty->connection,
GB_UART_REQ_PROTOCOL_VERSION, GB_UART_REQ_PROTOCOL_VERSION,
&version_request, sizeof(version_request)); &version_response, sizeof(version_response));
if (retval) if (retval)
return retval; return retval;
if (version_request.major > GB_UART_VERSION_MAJOR) { if (version_response.major > GB_UART_VERSION_MAJOR) {
pr_err("unsupported major version (%hhu > %hhu)\n", pr_err("unsupported major version (%hhu > %hhu)\n",
version_request.major, GB_UART_VERSION_MAJOR); version_response.major, GB_UART_VERSION_MAJOR);
return -ENOTSUPP; return -ENOTSUPP;
} }
tty->version_major = version_request.major; tty->version_major = version_response.major;
tty->version_minor = version_request.minor; tty->version_minor = version_response.minor;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment