浏览代码

Bluetooth: btusb: Split fragement receiption into separate functions

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>
Marcel Holtmann 11 年之前
父节点
当前提交
1ffa4ad042
共有 1 个文件被更改,包括 21 次插入9 次删除
  1. 21 9
      drivers/bluetooth/btusb.c

+ 21 - 9
drivers/bluetooth/btusb.c

@@ -296,6 +296,21 @@ struct btusb_data {
 	int suspend_count;
 	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)
 static void btusb_intr_complete(struct urb *urb)
 {
 {
 	struct hci_dev *hdev = urb->context;
 	struct hci_dev *hdev = urb->context;
@@ -311,9 +326,8 @@ static void btusb_intr_complete(struct urb *urb)
 	if (urb->status == 0) {
 	if (urb->status == 0) {
 		hdev->stat.byte_rx += urb->actual_length;
 		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);
 			BT_ERR("%s corrupted event packet", hdev->name);
 			hdev->stat.err_rx++;
 			hdev->stat.err_rx++;
 		}
 		}
@@ -401,9 +415,8 @@ static void btusb_bulk_complete(struct urb *urb)
 	if (urb->status == 0) {
 	if (urb->status == 0) {
 		hdev->stat.byte_rx += urb->actual_length;
 		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);
 			BT_ERR("%s corrupted ACL packet", hdev->name);
 			hdev->stat.err_rx++;
 			hdev->stat.err_rx++;
 		}
 		}
@@ -497,9 +510,8 @@ static void btusb_isoc_complete(struct urb *urb)
 
 
 			hdev->stat.byte_rx += length;
 			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);
 				BT_ERR("%s corrupted SCO packet", hdev->name);
 				hdev->stat.err_rx++;
 				hdev->stat.err_rx++;
 			}
 			}