Skip to content

Commit

Permalink
Bluetooth: btusb: Split fragement receiption into separate functions
Browse files Browse the repository at this point in the history
The actual packet reassembly should be done inside the driver. To allow
this to happen cleanly in future patches, split the fragment reception
into its own functions.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
  • Loading branch information
Marcel Holtmann authored and Johan Hedberg committed Sep 16, 2014
1 parent 89e7533 commit 1ffa4ad
Showing 1 changed file with 21 additions and 9 deletions.
30 changes: 21 additions & 9 deletions drivers/bluetooth/btusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,21 @@ struct btusb_data {
int suspend_count;
};

static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
{
return hci_recv_fragment(data->hdev, HCI_EVENT_PKT, buffer, count);
}

static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
{
return hci_recv_fragment(data->hdev, HCI_ACLDATA_PKT, buffer, count);
}

static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
{
return hci_recv_fragment(data->hdev, HCI_SCODATA_PKT, buffer, count);
}

static void btusb_intr_complete(struct urb *urb)
{
struct hci_dev *hdev = urb->context;
Expand All @@ -311,9 +326,8 @@ static void btusb_intr_complete(struct urb *urb)
if (urb->status == 0) {
hdev->stat.byte_rx += urb->actual_length;

if (hci_recv_fragment(hdev, HCI_EVENT_PKT,
urb->transfer_buffer,
urb->actual_length) < 0) {
if (btusb_recv_intr(data, urb->transfer_buffer,
urb->actual_length) < 0) {
BT_ERR("%s corrupted event packet", hdev->name);
hdev->stat.err_rx++;
}
Expand Down Expand Up @@ -401,9 +415,8 @@ static void btusb_bulk_complete(struct urb *urb)
if (urb->status == 0) {
hdev->stat.byte_rx += urb->actual_length;

if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,
urb->transfer_buffer,
urb->actual_length) < 0) {
if (btusb_recv_bulk(data, urb->transfer_buffer,
urb->actual_length) < 0) {
BT_ERR("%s corrupted ACL packet", hdev->name);
hdev->stat.err_rx++;
}
Expand Down Expand Up @@ -497,9 +510,8 @@ static void btusb_isoc_complete(struct urb *urb)

hdev->stat.byte_rx += length;

if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,
urb->transfer_buffer + offset,
length) < 0) {
if (btusb_recv_isoc(data, urb->transfer_buffer + offset,
length) < 0) {
BT_ERR("%s corrupted SCO packet", hdev->name);
hdev->stat.err_rx++;
}
Expand Down

0 comments on commit 1ffa4ad

Please sign in to comment.