for-linus-2023060501

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iQIVAwUAZH5T6aZi849r7WBJAQIf8Q//YU0rp1nx9eWDEo5qMpHkoErtpLNmy89q
 LgMyKVgwIJYmMwcCWIpSW86OykI+xbMmgKzNTdaO2MeShXhgoT0OzmHHPR/88k2R
 rTQIX1+E9Qy32kEmMeQE5xTqmtlCVFTT3x2EQoPAWf3MTCPwbRcS/tc3T0qRy7lR
 sYVl9zB2gl+7Ud2gdIAfFA2GL3hYAXnQ11xE+6slEIyk7Dd1m8jg7rV3bMbnwLyB
 9QRookboZ+ddPvISsaJEOjr19P0jAj+ESEWBU8KDzUdo5lQ4L9FjCP0GbKBUFUGC
 5I9B3ID9xF0SHZiZ3huuDvZ/AHd2D1/JaMkb31b6Lk/e3xr8CEjdA6AWyLCjDxCU
 0EdPfbyoS4a1nbrZ3H+4eoIsyaMtWx3MaIjStN9PoVcNp44WRRA4Gbdj5n2DJrdT
 jAS8GzM8wH89V3kqrDetKuk1TKyeiv+KE1RqOfkYikFbNaZHF3OBlVOGM8oD1LVm
 ctCEVfhN/W2Yk84NO8yWEvgkKvraxpI2BTBGRHh+FK4+aNXogXcZjWc0u0fXZOl5
 6m45+6oA4ucWkBG1MVrov2fYk8wdJkrZUL6g17dxw23sUGFylnTqc7dlQMwm9kan
 VNrtkkf8O8BrA70aGQyhYl3ftbt2zSsjqcppzW5KwEIifWq3fn0FtjynCZT3tiVk
 aTcb82+nvTo=
 =AmtQ
 -----END PGP SIGNATURE-----

Merge tag 'for-linus-2023060501' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid

Pull HID fix from Jiri Kosina:

 - Final, confirmed fix for regression causing some devices connected
   via Logitech HID++ Unifying receiver take too long to initialize
   (Benjamin Tissoires)

* tag 'for-linus-2023060501' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
  HID: hidpp: terminate retry loop on success
This commit is contained in:
Linus Torvalds 2023-06-06 04:36:02 -07:00
commit fa56e0e44f
1 changed files with 6 additions and 7 deletions

View File

@ -286,7 +286,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
struct hidpp_report *message,
struct hidpp_report *response)
{
int ret;
int ret = -1;
int max_retries = 3;
mutex_lock(&hidpp->send_mutex);
@ -300,13 +300,13 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
*/
*response = *message;
for (; max_retries != 0; max_retries--) {
for (; max_retries != 0 && ret; max_retries--) {
ret = __hidpp_send_report(hidpp->hid_dev, message);
if (ret) {
dbg_hid("__hidpp_send_report returned err: %d\n", ret);
memset(response, 0, sizeof(struct hidpp_report));
goto exit;
break;
}
if (!wait_event_timeout(hidpp->wait, hidpp->answer_available,
@ -314,14 +314,14 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
dbg_hid("%s:timeout waiting for response\n", __func__);
memset(response, 0, sizeof(struct hidpp_report));
ret = -ETIMEDOUT;
goto exit;
break;
}
if (response->report_id == REPORT_ID_HIDPP_SHORT &&
response->rap.sub_id == HIDPP_ERROR) {
ret = response->rap.params[1];
dbg_hid("%s:got hidpp error %02X\n", __func__, ret);
goto exit;
break;
}
if ((response->report_id == REPORT_ID_HIDPP_LONG ||
@ -330,13 +330,12 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
ret = response->fap.params[1];
if (ret != HIDPP20_ERROR_BUSY) {
dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
goto exit;
break;
}
dbg_hid("%s:got busy hidpp 2.0 error %02X, retrying\n", __func__, ret);
}
}
exit:
mutex_unlock(&hidpp->send_mutex);
return ret;