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++; } }
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++; } }