Skip to content

Commit 9cc8301

Browse files
bearshfabiobaltieri
authored andcommitted
usb: device_next: prevent CDC ACM notifications from being blocked forever
Reset semaphore if USB transfer failed or was canceled and prevent cdc_acm_send_notification() from blocking forever. Signed-off-by: Martin Gysel <[email protected]>
1 parent ed1b56b commit 9cc8301

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

subsys/usb/device_next/class/usbd_cdc_acm.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,10 @@ static int usbd_cdc_acm_request(struct usbd_class_data *const c_data,
243243
atomic_clear_bit(&data->state, CDC_ACM_TX_FIFO_BUSY);
244244
}
245245

246+
if (bi->ep == cdc_acm_get_int_in(c_data)) {
247+
k_sem_reset(&data->notif_sem);
248+
}
249+
246250
goto ep_request_error;
247251
}
248252

@@ -554,7 +558,9 @@ static inline int cdc_acm_send_notification(const struct device *dev,
554558
return ret;
555559
}
556560

557-
k_sem_take(&data->notif_sem, K_FOREVER);
561+
if (k_sem_take(&data->notif_sem, K_FOREVER) == -EAGAIN) {
562+
return -ECANCELED;
563+
}
558564

559565
return ret;
560566
}

0 commit comments

Comments
 (0)