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); }
/* DDS????: Display Error */ void display_error(enum error err) { unsigned int language; struct image *bgimage; language = get_language(); /* Draw background if we can, otherwise clear screen */ bgimage = get_message_mayfail(language, MSG_BACKGROUND); if (bgimage) paste_image(0, 0, bgimage); else clear_screen(); /* Message to tell them */ play_audio(true, get_audio("error.raw")); /* Use electorate "1" here for the numbers. */ draw_error(get_message_mayfail(language, MSG_ERROR), get_preference_image_mayfail(1, (unsigned int)err), err); /* Loop until reset. */ wait_for_reset(); }