/* * Before rebooting, we must make sure that the expansion card is in a * sensible state, so it can be re-detected. This means that the first * page of the ROM must be visible. We call the expansion cards reset * handler, if any. */ static void ecard_drv_shutdown(struct device *dev) { struct expansion_card *ec = ECARD_DEV(dev); struct ecard_driver *drv = ECARD_DRV(dev->driver); struct ecard_request req; if (drv->shutdown) drv->shutdown(ec); ecard_release(ec); req.req = req_reset; req.ec = ec; ecard_call(&req); }
int cumanascsi_release (struct Scsi_Host *shpnt) { int i; if (shpnt->irq != IRQ_NONE) free_irq (shpnt->irq, NULL); if (shpnt->io_port) release_region (shpnt->io_port, shpnt->n_io_port); for (i = 0; i < 4; i++) if (shpnt->io_port == CUMANA_ADDRESS(ecs[i])) ecard_release (ecs[i]); return 0; }
void cleanup_module (void) { int i; for (i = 0; i < MAX_ECARDS; i++) if (ec[i]) { unsigned long port; port = ecard_address(ec[i], ECARD_MEMC, 0); ide_unregister_port(port, ec[i]->irq, 16); ecard_release(ec[i]); ec[i] = NULL; } }
static int ecard_drv_probe(struct device *dev) { struct expansion_card *ec = ECARD_DEV(dev); struct ecard_driver *drv = ECARD_DRV(dev->driver); const struct ecard_id *id; int ret; id = ecard_match_device(drv->id_table, ec); ecard_claim(ec); ret = drv->probe(ec, id); if (ret) ecard_release(ec); return ret; }
static void __exit EXIT (void) { #ifdef MODULE int i; for (i = 0; i < __serial_pcount; i++) { unregister_serial(__serial_ports[i]); release_region(__serial_addr[i], 8); } for (i = 0; i < MAX_ECARDS; i++) if (expcard[i]) ecard_release (expcard[i]); #endif }
static void powertecscsi_remove(struct Scsi_Host *host) { struct powertec_info *info = (struct powertec_info *)host->hostdata; fas216_remove(host); if (host->dma_channel != NO_DMA) free_dma(host->dma_channel); free_irq(host->irq, info); release_region(host->io_port + POWERTEC_FAS216_OFFSET, 16 << POWERTEC_FAS216_SHIFT); fas216_release(host); ecard_release(info->ec); }
/* Prototype: int powertecscsi_release(struct Scsi_Host * host) * Purpose : releases all resources used by this adapter * Params : host - driver host structure to return info for. */ int powertecscsi_release(struct Scsi_Host *host) { int i; fas216_release(host); if (host->irq != NO_IRQ) free_irq(host->irq, host); if (host->dma_channel != NO_DMA) free_dma(host->dma_channel); release_region(host->io_port + POWERTEC_FAS216_OFFSET, 16 << POWERTEC_FAS216_SHIFT); for (i = 0; i < MAX_ECARDS; i++) if (ecs[i] && host->io_port == ecard_address(ecs[i], ECARD_IOC, ECARD_FAST)) ecard_release(ecs[i]); return 0; }
static int __devinit rapide_probe(struct expansion_card *ec, const struct ecard_id *id) { unsigned long port = ecard_address (ec, ECARD_MEMC, 0); hw_regs_t hw; int i, ret; memset(&hw, 0, sizeof(hw)); for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { hw.io_ports[i] = port; port += 1 << 4; } hw.io_ports[IDE_CONTROL_OFFSET] = port + 0x206; hw.irq = ec->irq; ret = ide_register_hw(&hw, NULL); if (ret) ecard_release(ec); return ret; }
int rapide_init(void) { int i; for (i = 0; i < MAX_ECARDS; i++) ec[i] = NULL; ecard_startfind(); for (i = 0; ; i++) { if ((ec[i] = ecard_find(0, rapide_cids)) == NULL) break; ecard_claim(ec[i]); result[i] = rapide_register(ec[i]); } for (i = 0; i < MAX_ECARDS; i++) if (ec[i] && result[i] < 0) { ecard_release(ec[i]); ec[i] = NULL; } return 0; }
/* Prototype: int powertecscsi_detect(Scsi_Host_Template * tpnt) * Purpose : initialises PowerTec SCSI driver * Params : tpnt - template for this SCSI adapter * Returns : >0 if host found, 0 otherwise. */ int powertecscsi_detect(Scsi_Host_Template *tpnt) { static const card_ids powertecscsi_cids[] = { POWERTECSCSI_LIST, { 0xffff, 0xffff} }; int count = 0; struct Scsi_Host *host; tpnt->proc_dir = &proc_scsi_powertec; memset(ecs, 0, sizeof (ecs)); ecard_startfind(); while (1) { PowerTecScsi_Info *info; ecs[count] = ecard_find(0, powertecscsi_cids); if (!ecs[count]) break; ecard_claim(ecs[count]); host = scsi_register(tpnt, sizeof (PowerTecScsi_Info)); if (!host) { ecard_release(ecs[count]); break; } host->io_port = ecard_address(ecs[count], ECARD_IOC, ECARD_FAST); host->irq = ecs[count]->irq; host->dma_channel = ecs[count]->dma; info = (PowerTecScsi_Info *)host->hostdata; info->control.term_port = host->io_port + POWERTEC_TERM_CONTROL; info->control.terms = term[count] ? POWERTEC_TERM_ENABLE : 0; powertecscsi_terminator_ctl(host, info->control.terms); info->info.scsi.io_port = host->io_port + POWERTEC_FAS216_OFFSET; info->info.scsi.io_shift= POWERTEC_FAS216_SHIFT; info->info.scsi.irq = host->irq; info->info.ifcfg.clockrate = POWERTEC_XTALFREQ; info->info.ifcfg.select_timeout = 255; info->info.ifcfg.asyncperiod = POWERTEC_ASYNC_PERIOD; info->info.ifcfg.sync_max_depth = POWERTEC_SYNC_DEPTH; info->info.ifcfg.cntl3 = /*CNTL3_BS8 |*/ CNTL3_FASTSCSI | CNTL3_FASTCLK; info->info.ifcfg.disconnect_ok = 1; info->info.ifcfg.wide_max_size = 0; info->info.dma.setup = powertecscsi_dma_setup; info->info.dma.pseudo = NULL; info->info.dma.stop = powertecscsi_dma_stop; ecs[count]->irqaddr = (unsigned char *) ioaddr(host->io_port + POWERTEC_INTR_STATUS); ecs[count]->irqmask = POWERTEC_INTR_BIT; ecs[count]->irq_data = (void *) (host->io_port + POWERTEC_INTR_CONTROL); ecs[count]->ops = (expansioncard_ops_t *)&powertecscsi_ops; request_region(host->io_port + POWERTEC_FAS216_OFFSET, 16 << POWERTEC_FAS216_SHIFT, "powertec2-fas"); if (host->irq != NO_IRQ && request_irq(host->irq, powertecscsi_intr, SA_INTERRUPT, "powertec", host)) { printk("scsi%d: IRQ%d not free, interrupts disabled\n", host->host_no, host->irq); host->irq = NO_IRQ; info->info.scsi.irq = NO_IRQ; } if (host->dma_channel != NO_DMA && request_dma(host->dma_channel, "powertec")) { printk("scsi%d: DMA%d not free, DMA disabled\n", host->host_no, host->dma_channel); host->dma_channel = NO_DMA; } fas216_init(host); ++count; } return count; }