/* called when a client calls POSIX close() on the driver, but I/O * requests may still be pending */ static status_t device_close(void* cookie) { CALLED(); int32 i; void* item; bt_usb_dev* bdev = (bt_usb_dev*)cookie; if (bdev == NULL) panic("bad cookie"); // Clean queues if (bdev->connected == true) { TRACE("%s: Cancelling queues...\n", __func__); if (bdev->intr_in_ep != NULL) usb->cancel_queued_transfers(bdev->intr_in_ep->handle); if (bdev->bulk_in_ep!=NULL) usb->cancel_queued_transfers(bdev->bulk_in_ep->handle); if (bdev->bulk_out_ep!=NULL) usb->cancel_queued_transfers(bdev->bulk_out_ep->handle); } // TX for (i = 0; i < BT_DRIVER_TXCOVERAGE; i++) { if (i == BT_COMMAND) { while ((item = list_remove_head_item(&bdev->nbuffersTx[i])) != NULL) snb_free((snet_buffer*)item); } else { while ((item = list_remove_head_item(&bdev->nbuffersTx[i])) != NULL) nb_destroy((net_buffer*)item); } } // RX for (i = 0; i < BT_DRIVER_RXCOVERAGE; i++) { nb_destroy(bdev->nbufferRx[i]); } snb_free(bdev->eventRx); purge_room(&bdev->eventRoom); purge_room(&bdev->aclRoom); // Device no longer in our Stack if (btDevices != NULL) btDevices->UnregisterDriver(bdev->hdev); // unSet RUNNING if (TEST_AND_CLEAR(&bdev->state, RUNNING)) { ERROR("%s: %s not running?\n", __func__, bdev->name); return B_ERROR; } return B_OK; }
acl_tx_complete(void* cookie, status_t status, void* data, size_t actual_len) #endif { net_buffer* nbuf = (net_buffer*)cookie; bt_usb_dev* bdev = GET_DEVICE(nbuf); debugf("fetched=%p status=%ld type %lx %p\n", bdev, status, nbuf->type, data); if (status == B_OK) { bdev->stat.successfulTX++; bdev->stat.bytesTX += actual_len; } else { bdev->stat.errorTX++; // the packet has been lost, too late to requeue it } nb_destroy(nbuf); #ifdef BT_RESCHEDULING_AFTER_COMPLETITIONS schedTxProcessing(bdev); #endif }