示例#1
0
event_complete(void* cookie, status_t status, void* data, size_t actual_len)
#endif
{
	bt_usb_dev* bdev = (bt_usb_dev*)cookie;
	// bt_usb_dev* bdev = fetch_device(cookie, 0); -> safer / slower option
	status_t error;

	TRACE("%s: cookie@%p status=%s len=%" B_PRIuSIZE "\n", __func__, cookie,
		strerror(status), actual_len);

	if (bdev == NULL)
		return;

	if (status == B_CANCELED || status == B_DEV_CRC_ERROR)
		return; // or not running anymore...

	if (status != B_OK || actual_len == 0)
		goto resubmit;

	if (assembly_rx(bdev, BT_EVENT, data, actual_len) == B_OK) {
		bdev->stat.successfulTX++;
	} else {
		bdev->stat.errorRX++;
	}

resubmit:

	error = usb->queue_interrupt(bdev->intr_in_ep->handle, data,
		max_c(HCI_MAX_EVENT_SIZE, bdev->max_packet_size_intr_in),
		event_complete, bdev);

	if (error != B_OK) {
		reuse_room(&bdev->eventRoom, data);
		bdev->stat.rejectedRX++;
		ERROR("%s: RX event resubmittion failed %s\n", __func__,
			strerror(error));
	} else {
		bdev->stat.acceptedRX++;
	}
}
示例#2
0
acl_rx_complete(void* cookie, status_t status, void* data, size_t actual_len)
#endif
{
	bt_usb_dev* bdev = (bt_usb_dev*)cookie;
	// bt_usb_dev* bdev = fetch_device(cookie, 0); -> safer / slower option
	status_t error;

	if (bdev == NULL)
		return;

	if (status == B_CANCELED || status == B_DEV_CRC_ERROR)
		return; // or not running anymore...

	if (status != B_OK || actual_len == 0)
		goto resubmit;

	if (assembly_rx(bdev, BT_ACL, data, actual_len) == B_OK) {
		bdev->stat.successfulRX++;
	} else {
		bdev->stat.errorRX++;
	}

resubmit:

	error = usb->queue_bulk(bdev->bulk_in_ep->handle, data,
		max_c(HCI_MAX_FRAME_SIZE, bdev->max_packet_size_bulk_in),
		acl_rx_complete, (void*) bdev);

	if (error != B_OK) {
		reuse_room(&bdev->aclRoom, data);
		bdev->stat.rejectedRX++;
		debugf("RX acl resubmittion failed %s\n", strerror(error));
	} else {
		bdev->stat.acceptedRX++;
	}
}