bt_uart: Retry the lower half operation if -EINTR is returned
to handle the partial write and read gracefully Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
parent
1d8397a36d
commit
d85cf99a65
@ -79,7 +79,7 @@ static ssize_t btuart_read(FAR struct btuart_upperhalf_s *upper,
|
|||||||
while (buflen > 0)
|
while (buflen > 0)
|
||||||
{
|
{
|
||||||
nread = lower->read(lower, buffer, buflen);
|
nread = lower->read(lower, buffer, buflen);
|
||||||
if (nread == 0)
|
if (nread == 0 || nread == -EINTR)
|
||||||
{
|
{
|
||||||
wlwarn("Got zero bytes from UART\n");
|
wlwarn("Got zero bytes from UART\n");
|
||||||
if (ntotal < minread)
|
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 struct btuart_upperhalf_s *upper;
|
||||||
FAR const struct btuart_lowerhalf_s *lower;
|
FAR const struct btuart_lowerhalf_s *lower;
|
||||||
FAR uint8_t *type;
|
FAR uint8_t *type;
|
||||||
ssize_t nwritten;
|
ssize_t ntotal = 0;
|
||||||
|
|
||||||
upper = (FAR struct btuart_upperhalf_s *)dev;
|
upper = (FAR struct btuart_upperhalf_s *)dev;
|
||||||
DEBUGASSERT(upper != NULL && upper->lower != NULL);
|
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);
|
BT_DUMP("Sending", buf->data, buf->len);
|
||||||
|
|
||||||
nwritten = lower->write(lower, buf->data, buf->len);
|
while (ntotal < buf->len)
|
||||||
if (nwritten == 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 OK;
|
||||||
{
|
|
||||||
return nwritten;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EIO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int btuart_open(FAR const struct bt_driver_s *dev)
|
int btuart_open(FAR const struct bt_driver_s *dev)
|
||||||
|
Loading…
Reference in New Issue
Block a user