/* First stage of disconnect processing: stop all commands and remove * the host */ static void quiesce_and_remove_host(struct rtsx_dev *dev) { struct Scsi_Host *host = rtsx_to_host(dev); struct rtsx_chip *chip = dev->chip; /* Prevent new transfers, stop the current command, and * interrupt a SCSI-scan or device-reset delay */ mutex_lock(&dev->dev_mutex); scsi_lock(host); rtsx_set_stat(chip, RTSX_STAT_DISCONNECT); scsi_unlock(host); mutex_unlock(&dev->dev_mutex); wake_up(&dev->delay_wait); wait_for_completion(&dev->scanning_done); /* Wait some time to let other threads exist */ wait_timeout(100); /* queuecommand won't accept any new commands and the control * thread won't execute a previously-queued command. If there * is such a command pending, complete it with an error. */ mutex_lock(&dev->dev_mutex); if (chip->srb) { chip->srb->result = DID_NO_CONNECT << 16; scsi_lock(host); chip->srb->scsi_done(dev->chip->srb); chip->srb = NULL; scsi_unlock(host); } mutex_unlock(&dev->dev_mutex); /* Now we own no commands so it's safe to remove the SCSI host */ scsi_remove_host(host); }
static void quiesce_and_remove_host(struct us_data *us) { struct Scsi_Host *host = us_to_host(us); //--------------------------- pr_info("17 quiesce and remove host\n"); /* If the device is really gone, cut short reset delays */ if (us->pusb_dev->state == USB_STATE_NOTATTACHED) { set_bit(US_FLIDX_DISCONNECTING, &us->dflags); wake_up(&us->delay_wait); } /* Prevent SCSI scanning (if it hasn't started yet) * or wait for the SCSI-scanning routine to stop. */ cancel_delayed_work_sync(&us->scan_dwork); /* Balance autopm calls if scanning was cancelled */ if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags)) usb_autopm_put_interface_no_suspend(us->pusb_intf); /* Removing the host will perform an orderly shutdown: caches * synchronized, disks spun down, etc. */ scsi_remove_host(host); /* Prevent any new commands from being accepted and cut short * reset delays. */ scsi_lock(host); set_bit(US_FLIDX_DISCONNECTING, &us->dflags); scsi_unlock(host); wake_up(&us->delay_wait); }
static void __devexit NCR_D700_remove_one(struct Scsi_Host *host) { scsi_remove_host(host); NCR_700_release(host); kfree((struct NCR_700_Host_Parameters *)host->hostdata[0]); free_irq(host->irq, host); release_region(host->base, 64); }
static void __exit mvme147_exit(void) { scsi_remove_host(mvme147_shost); /* XXX Make sure DMA is stopped! */ free_irq(MVME147_IRQ_SCSI_PORT, mvme147_shost); free_irq(MVME147_IRQ_SCSI_DMA, mvme147_shost); scsi_host_put(mvme147_shost); }
static void __devexit oakscsi_remove(struct expansion_card *ec) { struct Scsi_Host *host = ecard_get_drvdata(ec); ecard_set_drvdata(ec, NULL); scsi_remove_host(host); release_region(host->io_port, host->n_io_port); scsi_host_put(host); }
static void fdomain_release(struct pcmcia_device *link) { scsi_info_t *info = link->priv; dev_dbg(&link->dev, "fdomain_release\n"); scsi_remove_host(info->host); pcmcia_disable_device(link); scsi_unregister(info->host); }
static int __exit mac_scsi_remove(struct platform_device *pdev) { struct Scsi_Host *instance = platform_get_drvdata(pdev); scsi_remove_host(instance); if (instance->irq != NO_IRQ) free_irq(instance->irq, instance); NCR5380_exit(instance); scsi_host_put(instance); return 0; }
static int __exit zalon_remove(struct parisc_device *dev) { struct Scsi_Host *host = dev_get_drvdata(&dev->dev); int irq = host->irq; scsi_remove_host(host); ncr53c8xx_release(host); free_irq(irq, host); return 0; }
static void __devexit a2091_remove(struct zorro_dev *z) { struct Scsi_Host *instance = zorro_get_drvdata(z); struct a2091_hostdata *hdata = shost_priv(instance); hdata->regs->CNTR = 0; scsi_remove_host(instance); free_irq(IRQ_AMIGA_PORTS, instance); scsi_host_put(instance); release_mem_region(z->resource.start, 256); }
static void __devexit oakscsi_remove(struct expansion_card *ec) { struct Scsi_Host *host = ecard_get_drvdata(ec); ecard_set_drvdata(ec, NULL); scsi_remove_host(host); NCR5380_exit(host); iounmap(priv(host)->base); scsi_host_put(host); ecard_release_resources(ec); }
static __devexit void zorro7xx_remove_one(struct zorro_dev *z) { struct Scsi_Host *host = zorro_get_drvdata(z); struct NCR_700_Host_Parameters *hostdata = shost_priv(host); scsi_remove_host(host); NCR_700_release(host); kfree(hostdata); free_irq(host->irq, host); zorro_release_device(z); }
static int tcm_loop_driver_remove(struct device *dev) { struct tcm_loop_hba *tl_hba; struct Scsi_Host *sh; tl_hba = to_tcm_loop_hba(dev); sh = tl_hba->sh; scsi_remove_host(sh); scsi_host_put(sh); return 0; }
static int __exit sgiwd93_remove(struct platform_device *pdev) { struct Scsi_Host *host = platform_get_drvdata(pdev); struct ip22_hostdata *hdata = (struct ip22_hostdata *) host->hostdata; struct sgiwd93_platform_data *pd = pdev->dev.platform_data; scsi_remove_host(host); free_irq(pd->irq, host); dma_free_noncoherent(&pdev->dev, HPC_DMA_SIZE, hdata->cpu, hdata->dma); scsi_host_put(host); return 0; }
static void __devexit cumanascsi1_remove(struct expansion_card *ec) { struct Scsi_Host *host = ecard_get_drvdata(ec); ecard_set_drvdata(ec, NULL); scsi_remove_host(host); free_irq(host->irq, host); NCR5380_exit(host); release_region(host->io_port, host->n_io_port); scsi_host_put(host); }
static void qlogic_release(struct pcmcia_device *link) { scsi_info_t *info = link->priv; DEBUG(0, "qlogic_release(0x%p)\n", link); scsi_remove_host(info->host); free_irq(link->irq.AssignedIRQ, info->host); pcmcia_disable_device(link); scsi_host_put(info->host); }
/** * megaraid_io_detach - detach a device from the IO subsystem * @adapter : controller's soft state * * Detach this device from the IO subsystem. */ static void megaraid_io_detach(adapter_t *adapter) { struct Scsi_Host *host; con_log(CL_DLEVEL1, (KERN_INFO "megaraid: io detach\n")); host = adapter->host; scsi_remove_host(host); return; }
static int __exit amiga_a3000_scsi_remove(struct platform_device *pdev) { struct Scsi_Host *instance = platform_get_drvdata(pdev); struct a3000_hostdata *hdata = shost_priv(instance); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); hdata->regs->CNTR = 0; scsi_remove_host(instance); free_irq(IRQ_AMIGA_PORTS, instance); scsi_host_put(instance); release_mem_region(res->start, resource_size(res)); return 0; }
static void dmx3191d_remove_one(struct pci_dev *pdev) { struct Scsi_Host *shost = pci_get_drvdata(pdev); struct NCR5380_hostdata *hostdata = shost_priv(shost); unsigned long io = hostdata->base; scsi_remove_host(shost); NCR5380_exit(shost); scsi_host_put(shost); release_region(io, DMX3191D_REGION_LEN); pci_disable_device(pdev); }
static void qlogic_release(struct pcmcia_device *link) { scsi_info_t *info = link->priv; dev_dbg(&link->dev, "qlogic_release\n"); scsi_remove_host(info->host); free_irq(link->irq, info->host); pcmcia_disable_device(link); scsi_host_put(info->host); }
static __devexit int bvme6000_device_remove(struct platform_device *dev) { struct Scsi_Host *host = platform_get_drvdata(dev); struct NCR_700_Host_Parameters *hostdata = shost_priv(host); scsi_remove_host(host); NCR_700_release(host); kfree(hostdata); free_irq(host->irq, host); return 0; }
static int __exit snirm710_driver_remove(struct platform_device *dev) { struct Scsi_Host *host = dev_get_drvdata(&dev->dev); struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)host->hostdata[0]; scsi_remove_host(host); NCR_700_release(host); free_irq(host->irq, host); iounmap(hostdata->base); kfree(hostdata); return 0; }
static __devexit int a4000t_device_remove(struct device *dev) { struct Scsi_Host *host = dev_get_drvdata(dev); struct NCR_700_Host_Parameters *hostdata = shost_priv(host); scsi_remove_host(host); NCR_700_release(host); kfree(hostdata); free_irq(host->irq, host); release_mem_region(A4000T_SCSI_ADDR, 0x1000); return 0; }
static void isci_unregister(struct isci_host *isci_host) { struct Scsi_Host *shost; if (!isci_host) return; shost = to_shost(isci_host); scsi_remove_host(shost); sas_unregister_ha(&isci_host->sas_ha); sas_remove_host(shost); scsi_host_put(shost); }
static void aha152x_release_cs(dev_link_t *link) { scsi_info_t *info = link->priv; scsi_remove_host(info->host); link->dev = NULL; CardServices(ReleaseConfiguration, link->handle); CardServices(ReleaseIO, link->handle, &link->io); CardServices(ReleaseIRQ, link->handle, &link->irq); link->state &= ~DEV_CONFIG; scsi_unregister(info->host); }
static void pvscsi_remove(struct pci_dev *pdev) { struct Scsi_Host *host = pci_get_drvdata(pdev); struct pvscsi_adapter *adapter = shost_priv(host); scsi_remove_host(host); __pvscsi_shutdown(adapter); pvscsi_release_resources(adapter); scsi_host_put(host); pci_disable_device(pdev); }
static __devexit int sim710_device_remove(struct device *dev) { struct Scsi_Host *host = dev_get_drvdata(dev); struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)host->hostdata[0]; scsi_remove_host(host); NCR_700_release(host); kfree(hostdata); free_irq(host->irq, host); release_region(host->base, 64); return 0; }
static void ahd_linux_pci_dev_remove(struct pci_dev *pdev) { struct ahd_softc *ahd = pci_get_drvdata(pdev); u_long s; if (ahd->platform_data && ahd->platform_data->host) scsi_remove_host(ahd->platform_data->host); ahd_lock(ahd, &s); ahd_intr_enable(ahd, FALSE); ahd_unlock(ahd, &s); ahd_free(ahd); }
static int __exit lasi700_driver_remove(struct parisc_device *dev) { struct Scsi_Host *host = dev_get_drvdata(&dev->dev); struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)host->hostdata[0]; scsi_remove_host(host); NCR_700_release(host); free_irq(host->irq, host); kfree(hostdata); return 0; }
static void mts_usb_disconnect (struct usb_interface *intf) { struct mts_desc *desc = usb_get_intfdata(intf); usb_set_intfdata(intf, NULL); usb_kill_urb(desc->urb); scsi_remove_host(desc->host); scsi_host_put(desc->host); usb_free_urb(desc->urb); kfree(desc->context.scsi_status); kfree(desc); }
static void cumanascsi1_remove(struct expansion_card *ec) { struct Scsi_Host *host = ecard_get_drvdata(ec); ecard_set_drvdata(ec, NULL); scsi_remove_host(host); free_irq(host->irq, host); NCR5380_exit(host); iounmap(priv(host)->base); iounmap(priv(host)->dma); scsi_host_put(host); ecard_release_resources(ec); }