This is an automated email from the ASF dual-hosted git repository. jerpelea pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit d85cf99a6598bc5eee1fb15facf03226d5308641 Author: Xiang Xiao <xiaoxi...@xiaomi.com> AuthorDate: Sun Dec 27 19:57:16 2020 +0800 bt_uart: Retry the lower half operation if -EINTR is returned to handle the partial write and read gracefully Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com> --- drivers/wireless/bluetooth/bt_uart.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/wireless/bluetooth/bt_uart.c b/drivers/wireless/bluetooth/bt_uart.c index 57b5dca..b75d3d4 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; - if (nwritten < 0) - { - return nwritten; + nwritten = lower->write(lower, buf->data + ntotal, buf->len - ntotal); + if (nwritten >= 0) + { + ntotal += nwritten; + } + else if (nwritten != -EINTR) + { + return nwritten; + } } - return -EIO; + return OK; } int btuart_open(FAR const struct bt_driver_s *dev)