diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c index 09270bc2665495a2f3010198187f03c48115933f..d8414540f743323dc83d2351990c5288f1bdef68 100644 --- a/drivers/bluetooth/hci_h4.c +++ b/drivers/bluetooth/hci_h4.c @@ -49,6 +49,7 @@ #define VERSION "1.2" struct h4_struct { + struct sk_buff *rx_skb; struct sk_buff_head txq; }; @@ -92,6 +93,8 @@ static int h4_close(struct hci_uart *hu) skb_queue_purge(&h4->txq); + kfree_skb(h4->rx_skb); + hu->priv = NULL; kfree(h4); @@ -115,15 +118,16 @@ static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb) /* Recv data */ static int h4_recv(struct hci_uart *hu, const void *data, int count) { - int ret; + struct h4_struct *h4 = hu->priv; if (!test_bit(HCI_UART_REGISTERED, &hu->flags)) return -EUNATCH; - ret = hci_recv_stream_fragment(hu->hdev, data, count); - if (ret < 0) { - BT_ERR("Frame Reassembly Failed"); - return ret; + h4->rx_skb = h4_recv_buf(hu->hdev, h4->rx_skb, data, count); + if (IS_ERR(h4->rx_skb)) { + int err = PTR_ERR(h4->rx_skb); + BT_ERR("%s: Frame reassembly failed (%d)", hu->hdev->name, err); + return err; } return count;