[PATCH] Input: yealink - stop URB resubmission on completion error

From: Jie Wang

Date: Mon Jun 15 2026 - 23:18:32 EST


urb_irq_callback() and urb_ctl_callback() resubmit each other's URBs
regardless of completion status. When the device returns a persistent
error (-EPROTO), this creates an unthrottled resubmission loop that
starves the CPU and triggers RCU stalls.

Stop resubmitting on any non-zero URB status, following the standard
completion pattern used by other USB input drivers.

Reported-by: syzbot+039eab266c6321a174bd@xxxxxxxxxxxxxxxxxxxxxxxxx
Closes: https://syzkaller.appspot.com/bug?extid=039eab266c6321a174bd
Signed-off-by: Jie Wang <jie.wang@xxxxxxxxx>
---
drivers/input/misc/yealink.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c
index 8786ed8b3565..bbfa1a9c23d1 100644
--- a/drivers/input/misc/yealink.c
+++ b/drivers/input/misc/yealink.c
@@ -414,9 +414,20 @@ static void urb_irq_callback(struct urb *urb)
struct yealink_dev *yld = urb->context;
int ret, status = urb->status;

- if (status)
+ switch (status) {
+ case 0:
+ break;
+ case -ECONNRESET:
+ case -ENOENT:
+ case -ESHUTDOWN:
+ dev_dbg(&yld->intf->dev, "%s - urb shutting down with status %d\n",
+ __func__, status);
+ return;
+ default:
dev_err(&yld->intf->dev, "%s - urb status %d\n",
__func__, status);
+ return;
+ }

switch (yld->irq_data->cmd) {
case CMD_KEYPRESS:
@@ -452,9 +463,20 @@ static void urb_ctl_callback(struct urb *urb)
struct yealink_dev *yld = urb->context;
int ret = 0, status = urb->status;

- if (status)
+ switch (status) {
+ case 0:
+ break;
+ case -ECONNRESET:
+ case -ENOENT:
+ case -ESHUTDOWN:
+ dev_dbg(&yld->intf->dev, "%s - urb shutting down with status %d\n",
+ __func__, status);
+ return;
+ default:
dev_err(&yld->intf->dev, "%s - urb status %d\n",
__func__, status);
+ return;
+ }

switch (yld->ctl_data->cmd) {
case CMD_KEYPRESS:
--
2.34.1