aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tmk_core/protocol/chibios/usb_driver.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/tmk_core/protocol/chibios/usb_driver.c b/tmk_core/protocol/chibios/usb_driver.c
index cc0ce7600..eb72f8ff6 100644
--- a/tmk_core/protocol/chibios/usb_driver.c
+++ b/tmk_core/protocol/chibios/usb_driver.c
@@ -80,7 +80,19 @@ static bool qmkusb_start_receive(QMKUSBDriver *qmkusbp) {
80 * Interface implementation. 80 * Interface implementation.
81 */ 81 */
82 82
83static size_t _write(void *ip, const uint8_t *bp, size_t n) { return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, TIME_INFINITE); } 83static size_t _write(void *ip, const uint8_t *bp, size_t n) {
84 output_buffers_queue_t *obqueue = &((QMKUSBDriver *)ip)->obqueue;
85 chSysLock();
86 const bool full = obqIsFullI(obqueue);
87 chSysUnlock();
88 if (full || bqIsSuspendedX(obqueue)) {
89 /* Discard any writes while the queue is suspended or full, i.e. the hidraw
90 interface is not open. If we tried to send with an infinite timeout, we
91 would deadlock the keyboard otherwise. */
92 return -1;
93 }
94 return obqWriteTimeout(obqueue, bp, n, TIME_INFINITE);
95}
84 96
85static size_t _read(void *ip, uint8_t *bp, size_t n) { return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, TIME_INFINITE); } 97static size_t _read(void *ip, uint8_t *bp, size_t n) { return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, TIME_INFINITE); }
86 98