From d85cf99a6598bc5eee1fb15facf03226d5308641 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sun, 27 Dec 2020 19:57:16 +0800 Subject: [PATCH] bt_uart: Retry the lower half operation if -EINTR is returned to handle the partial write and read gracefully Signed-off-by: Xiang Xiao --- drivers/wireless/bluetooth/bt_uart.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/wireless/bluetooth/bt_uart.c b/drivers/wireless/bluetooth/bt_uart.c index 57b5dca44b..b75d3d45e3 100644 --- a/drivers/wireless/bluetooth/bt_uart.c +++ b/drivers/wireless/bluetooth/bt_uart.c @@ -79,7 +79,7 @@ static ssize_t btuart_read(FAR struct btuart_upperhalf_s *upper, while (buflen > 0) { nread = lower->read(lower, buffer, buflen); - if (nread == 0) + if (nread == 0 || nread == -EINTR) { wlwarn("Got zero bytes from UART\n"); if (ntotal < minread) @@ -298,7 +298,7 @@ int btuart_send(FAR const struct bt_driver_s *dev, FAR struct bt_buf_s *buf) FAR struct btuart_upperhalf_s *upper; FAR const struct btuart_lowerhalf_s *lower; FAR uint8_t *type; - ssize_t nwritten; + ssize_t ntotal = 0; upper = (FAR struct btuart_upperhalf_s *)dev; DEBUGASSERT(upper != NULL && upper->lower != NULL); @@ -333,18 +333,22 @@ int btuart_send(FAR const struct bt_driver_s *dev, FAR struct bt_buf_s *buf) BT_DUMP("Sending", buf->data, buf->len); - nwritten = lower->write(lower, buf->data, buf->len); - if (nwritten == buf->len) + while (ntotal < buf->len) { - return OK; + ssize_t nwritten; + + nwritten = lower->write(lower, buf->data + ntotal, buf->len - ntotal); + if (nwritten >= 0) + { + ntotal += nwritten; + } + else if (nwritten != -EINTR) + { + return nwritten; + } } - if (nwritten < 0) - { - return nwritten; - } - - return -EIO; + return OK; } int btuart_open(FAR const struct bt_driver_s *dev)