Commit 586e8fed authored by Bastien Nocera's avatar Bastien Nocera Committed by Benjamin Tissoires
Browse files

HID: logitech-hidpp: Retry commands when device is busy



Handle the busy error coming from the device or receiver. The
documentation says a busy error can be returned when:
"
Device (or receiver) cannot answer immediately to this request
for any reason i.e:
- already processing a request from the same or another SW
- pipe full
"

Signed-off-by: default avatarBastien Nocera <hadess@hadess.net>
Link: https://lore.kernel.org/r/20230209154916.462158-1-hadess@hadess.net


Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
parent a47a3b7a
Loading
Loading
Loading
Loading
+30 −24
Original line number Diff line number Diff line
@@ -283,6 +283,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
	struct hidpp_report *response)
{
	int ret;
	int max_retries = 3;

	mutex_lock(&hidpp->send_mutex);

@@ -295,6 +296,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
	 */
	*response = *message;

	for (; max_retries != 0; max_retries--) {
		ret = __hidpp_send_report(hidpp->hid_dev, message);

		if (ret) {
@@ -321,9 +323,13 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
		     response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
		    response->fap.feature_index == HIDPP20_ERROR) {
			ret = response->fap.params[1];
			if (ret != HIDPP20_ERROR_BUSY) {
				dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
				goto exit;
			}
			dbg_hid("%s:got busy hidpp 2.0 error %02X, retrying\n", __func__, ret);
		}
	}

exit:
	mutex_unlock(&hidpp->send_mutex);