/* This driver works *ONLY* for Future Domain cards using the TMC-1800, * TMC-18C50, or TMC-18C30 chip. This includes models TMC-1650, 1660, 1670, * and 1680. These are all 16-bit cards. * BIOS versions prior to 3.2 assigned SCSI ID 6 to SCSI adapter. * * The following BIOS signature signatures are for boards which do *NOT* * work with this driver (these TMC-8xx and TMC-9xx boards may work with the * Seagate driver): * * FUTURE DOMAIN CORP. (C) 1986-1988 V4.0I 03/16/88 * FUTURE DOMAIN CORP. (C) 1986-1989 V5.0C2/14/89 * FUTURE DOMAIN CORP. (C) 1986-1989 V6.0A7/28/89 * FUTURE DOMAIN CORP. (C) 1986-1990 V6.0105/31/90 * FUTURE DOMAIN CORP. (C) 1986-1990 V6.0209/18/90 * FUTURE DOMAIN CORP. (C) 1986-1990 V7.009/18/90 * FUTURE DOMAIN CORP. (C) 1992 V8.00.004/02/92 * * (The cards which do *NOT* work are all 8-bit cards -- although some of * them have a 16-bit form-factor, the upper 8-bits are used only for IRQs * and are *NOT* used for data. You can tell the difference by following * the tracings on the circuit board -- if only the IRQ lines are involved, * you have a "8-bit" card, and should *NOT* use this driver.)
*/
staticint fdomain_isa_match(struct device *dev, unsignedint ndev)
{ struct Scsi_Host *sh; int i, base = 0, irq = 0; unsignedlong bios_base = 0; struct signature *sig = NULL; void __iomem *p; staticstruct signature *saved_sig; int this_id = 7;
if (ndev < ADDRESS_COUNT) { /* scan supported ISA BIOS addresses */
p = ioremap(addresses[ndev], FDOMAIN_BIOS_SIZE); if (!p) return 0; for (i = 0; i < SIGNATURE_COUNT; i++) if (check_signature(p + signatures[i].offset,
signatures[i].signature,
signatures[i].length)) break; if (i == SIGNATURE_COUNT) /* no signature found */ goto fail_unmap;
sig = &signatures[i];
bios_base = addresses[ndev]; /* read I/O base from BIOS area */ if (sig->base_offset)
base = readb(p + sig->base_offset) +
(readb(p + sig->base_offset + 1) << 8);
iounmap(p); if (base) {
dev_info(dev, "BIOS at 0x%lx specifies I/O base 0x%x\n",
bios_base, base);
} else { /* no I/O base in BIOS area */
dev_info(dev, "BIOS at 0x%lx\n", bios_base); /* save BIOS signature for later use in port probing */
saved_sig = sig; return 0;
}
} else/* scan supported I/O ports */
base = ports[ndev - ADDRESS_COUNT];
/* use saved BIOS signature if present */ if (!sig && saved_sig)
sig = saved_sig;
if (!request_region(base, FDOMAIN_REGION_SIZE, "fdomain_isa")) return 0;
sh = fdomain_create(io[ndev], irq_, scsi_id[ndev], dev); if (!sh) {
dev_err(dev, "controller not found at base 0x%x", io[ndev]);
release_region(io[ndev], FDOMAIN_REGION_SIZE); return 0;
}
dev_set_drvdata(dev, sh); return 1;
}
staticvoid fdomain_isa_remove(struct device *dev, unsignedint ndev)
{ struct Scsi_Host *sh = dev_get_drvdata(dev); int base = sh->io_port;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.