static void manager_remove_adapter(struct btd_adapter *adapter) { uint16_t dev_id = adapter_get_dev_id(adapter); const gchar *path = adapter_get_path(adapter); adapters = g_slist_remove(adapters, adapter); manager_update_adapters(); if (default_adapter_id == dev_id || default_adapter_id < 0) { int new_default = hci_get_route(NULL); manager_set_default_adapter(new_default); } g_dbus_emit_signal(connection, "/", MANAGER_INTERFACE, "AdapterRemoved", DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); adapter_remove(adapter); btd_adapter_unref(adapter); if (adapters == NULL) btd_start_exit_timer(); }
static void mic_remove(struct pci_dev *pdev) { int32_t brdnum; bd_info_t *bd_info; if (mic_data.dd_numdevs - 1 < 0) return; mic_data.dd_numdevs--; brdnum = mic_data.dd_numdevs; /* Make sure boards are shutdown and not available. */ bd_info = mic_data.dd_bi[brdnum]; spin_lock_bh(&bd_info->bi_ctx.sysfs_lock); sysfs_put(bd_info->bi_ctx.sysfs_state); bd_info->bi_ctx.sysfs_state = NULL; spin_unlock_bh(&bd_info->bi_ctx.sysfs_lock); if (bd_info->bi_ctx.bi_psmi.enabled) { device_remove_bin_file(bd_info->bi_sysfsdev, &mic_psmi_ptes_attr); sysfs_remove_group(&bd_info->bi_sysfsdev->kobj, &psmi_attr_group); } sysfs_remove_group(&bd_info->bi_sysfsdev->kobj, &bd_attr_group); free_sysfs_entries(&bd_info->bi_ctx); device_destroy(mic_lindata.dd_class, mic_lindata.dd_dev + 2 + bd_info->bi_ctx.bi_id); adapter_stop_device(&bd_info->bi_ctx, 1, 0); /* * Need to wait for reset since accessing the card while GDDR training * is ongoing by adapter_remove(..) below for example can be fatal. */ wait_for_reset(&bd_info->bi_ctx); mic_disable_interrupts(&bd_info->bi_ctx); if (!bd_info->bi_ctx.msie) { free_irq(bd_info->bi_ctx.bi_pdev->irq, &bd_info->bi_ctx); #ifdef CONFIG_PCI_MSI } else { free_irq(bd_info->bi_msix_entries[0].vector, &bd_info->bi_ctx); pci_disable_msix(bd_info->bi_ctx.bi_pdev); #endif } adapter_remove(&bd_info->bi_ctx); release_mem_region(bd_info->bi_ctx.aper.pa, bd_info->bi_ctx.aper.len); release_mem_region(bd_info->bi_ctx.mmio.pa, bd_info->bi_ctx.mmio.len); pci_disable_device(bd_info->bi_ctx.bi_pdev); kfree(bd_info); }
void manager_cleanup(DBusConnection *conn, const char *path) { while (adapters) { struct btd_adapter *adapter = adapters->data; adapters = g_slist_remove(adapters, adapter); adapter_remove(adapter); btd_adapter_unref(adapter); } btd_start_exit_timer(); g_dbus_unregister_interface(conn, "/", MANAGER_INTERFACE); }
void adapter_deinit(int adapter_no) { adapter_dev *adapter; adapter = *adapter_search(&adapter_device, adapter_no); //close i2c handle if (adapter->adapter_deinit() < 0) { char buf[1024]; sprintf(buf, "Error De-initialising I2C bus %d", adapter_no); log_print(buf, ERR_ADAPTER_DEALLOC_FAIL); } adapter_remove(&adapter); }