[RFC 4/7] Bluetooth: hci_uart: Add support for word alignment

Sebastian Reichel
2016-08-13T03:15:22Z

This will be used by Nokia's H4+ protocol, which
adds padding to packets to reach word alignment.
---
drivers/bluetooth/hci_h4.c | 10 ++++++++++
drivers/bluetooth/hci_uart.h | 1 +
2 files changed, 11 insertions(+)

diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c
index 635597b6e168..a934e4eb692b 100644
--- a/drivers/bluetooth/hci_h4.c
+++ b/drivers/bluetooth/hci_h4.c
@@ -253,11 +253,21 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
}

if (!dlen) {
+ if ((&pkts[i])->wordaligned && !(skb->len % 2)) {
+ buffer++;
+ count--;
+ }
+
/* No more data, complete frame */
(&pkts[i])->recv(hdev, skb);
skb = NULL;
}
} else {
+ if ((&pkts[i])->wordaligned && !(skb->len % 2)) {
+ buffer++;
+ count--;
+ }
+
/* Complete frame */
(&pkts[i])->recv(hdev, skb);
skb = NULL;
diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h
index 839bad1d8152..a7d67aec3632 100644
--- a/drivers/bluetooth/hci_uart.h
+++ b/drivers/bluetooth/hci_uart.h
@@ -121,6 +121,7 @@ struct h4_recv_pkt {
u8 loff; /* Data length offset in header */
u8 lsize; /* Data length field size */
u16 maxlen; /* Max overall packet length */
+ bool wordaligned; /* packets are word aligned */
int (*recv)(struct hci_dev *hdev, struct sk_buff *skb);
};

--
2.8.1