You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by je...@apache.org on 2020/12/28 09:38:14 UTC
[incubator-nuttx] 04/04: bt_uart: Retry the lower half operation if
-EINTR is returned
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 <xi...@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 <xi...@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)