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)