Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d3d5a96 authored by Peng Qi's avatar Peng Qi Committed by Myles Watson
Browse files

BT HAL H4 write flow

If to send type and data separately for one HCI packet,
it will cause two system call context switch to kernel space,
which will introduce software overhead on data path.
Plus, if vendor does not use pure UART interface, it causes different
data behavior on BUS and may not adapt to all vendors as legacy HAL did.
Considering backward-compatibility, to use writev to send
type and data together once as legacy BT HAL did.

Bug: 63391357
Test: H4 UTTest, BT VTS test, Bluetooth on/off
Change-Id: I2d93085fe0c01b48d0e3729a3fa85b5b27335b2c
(cherry picked from commit 92afd74a)
parent 5e5c1847
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -18,8 +18,10 @@

#define LOG_TAG "android.hardware.bluetooth-hci-h4"
#include <android-base/logging.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <log/log.h>
#include <sys/uio.h>

namespace android {
namespace hardware {
@@ -27,11 +29,20 @@ namespace bluetooth {
namespace hci {

size_t H4Protocol::Send(uint8_t type, const uint8_t* data, size_t length) {
  int rv = WriteSafely(uart_fd_, &type, sizeof(type));
  if (rv == sizeof(type)) {
    rv = WriteSafely(uart_fd_, data, length);
  struct iovec iov[] = {{&type, sizeof(type)},
                        {const_cast<uint8_t*>(data), length}};
  ssize_t ret = 0;
  do {
    ret = TEMP_FAILURE_RETRY(writev(uart_fd_, iov, sizeof(iov) / sizeof(iov[0])));
  } while (-1 == ret && EAGAIN == errno);

  if (ret == -1) {
    ALOGE("%s error writing to UART (%s)", __func__, strerror(errno));
  } else if (ret == 0) {
    // Nothing written :(
    ALOGE("%s zero bytes written - something went wrong...", __func__);
  }
  return rv;
  return ret;
}

void H4Protocol::OnPacketReady() {