Commit d0eb755a authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: hid: fix missing response on request errors

Send response also to incoming requests that cannot be fulfilled.
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Reviewed-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 382145be
...@@ -155,17 +155,20 @@ static void gb_hid_irq_handler(u8 type, struct gb_operation *op) ...@@ -155,17 +155,20 @@ static void gb_hid_irq_handler(u8 type, struct gb_operation *op)
struct gb_connection *connection = op->connection; struct gb_connection *connection = op->connection;
struct gb_hid *ghid = connection->private; struct gb_hid *ghid = connection->private;
struct gb_hid_input_report_request *request = op->request->payload; struct gb_hid_input_report_request *request = op->request->payload;
int status;
int ret, size; int ret, size;
if (type != GB_HID_TYPE_IRQ_EVENT) { if (type != GB_HID_TYPE_IRQ_EVENT) {
dev_err(&connection->dev, dev_err(&connection->dev,
"unsupported unsolicited request\n"); "unsupported unsolicited request\n");
return; status = -EINVAL;
goto send_response;
} }
if (op->request->payload_size < 2) { if (op->request->payload_size < 2) {
dev_err(&connection->dev, "short report received\n"); dev_err(&connection->dev, "short report received\n");
return; status = -EINVAL;
goto send_response;
} }
/* /*
...@@ -175,18 +178,21 @@ static void gb_hid_irq_handler(u8 type, struct gb_operation *op) ...@@ -175,18 +178,21 @@ static void gb_hid_irq_handler(u8 type, struct gb_operation *op)
size = request->report[0] | request->report[1] << 8; size = request->report[0] | request->report[1] << 8;
if (size < 2 || size > op->request->payload_size - 2) { if (size < 2 || size > op->request->payload_size - 2) {
dev_err(&connection->dev, "bad report size: %d\n", size); dev_err(&connection->dev, "bad report size: %d\n", size);
return; status = -EINVAL;
goto send_response;
} }
if (test_bit(GB_HID_STARTED, &ghid->flags)) if (test_bit(GB_HID_STARTED, &ghid->flags))
hid_input_report(ghid->hid, HID_INPUT_REPORT, hid_input_report(ghid->hid, HID_INPUT_REPORT,
request->report + 2, size - 2, 1); request->report + 2, size - 2, 1);
ret = gb_operation_response_send(op, 0); status = 0;
send_response:
ret = gb_operation_response_send(op, status);
if (ret) { if (ret) {
dev_err(&connection->dev, dev_err(&connection->dev,
"failed to send response status %d: %d\n", "failed to send response status %d: %d\n",
0, ret); status, ret);
} }
} }
......
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