|
@@ -171,9 +171,20 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
|
|
|
const unsigned char *buffer, int count,
|
|
|
const struct h4_recv_pkt *pkts, int pkts_count)
|
|
|
{
|
|
|
+ struct hci_uart *hu = hci_get_drvdata(hdev);
|
|
|
+ u8 alignment = hu->alignment;
|
|
|
+
|
|
|
while (count) {
|
|
|
int i, len;
|
|
|
|
|
|
+ /* remove padding bytes from buffer */
|
|
|
+ for (; hu->padding && count > 0; hu->padding--) {
|
|
|
+ count--;
|
|
|
+ buffer++;
|
|
|
+ }
|
|
|
+ if (!count)
|
|
|
+ break;
|
|
|
+
|
|
|
if (!skb) {
|
|
|
for (i = 0; i < pkts_count; i++) {
|
|
|
if (buffer[0] != (&pkts[i])->type)
|
|
@@ -253,11 +264,17 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
|
|
|
}
|
|
|
|
|
|
if (!dlen) {
|
|
|
+ hu->padding = (skb->len - 1) % alignment;
|
|
|
+ hu->padding = (alignment - hu->padding) % alignment;
|
|
|
+
|
|
|
/* No more data, complete frame */
|
|
|
(&pkts[i])->recv(hdev, skb);
|
|
|
skb = NULL;
|
|
|
}
|
|
|
} else {
|
|
|
+ hu->padding = (skb->len - 1) % alignment;
|
|
|
+ hu->padding = (alignment - hu->padding) % alignment;
|
|
|
+
|
|
|
/* Complete frame */
|
|
|
(&pkts[i])->recv(hdev, skb);
|
|
|
skb = NULL;
|