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) return0; 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; return0;
}
} 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")) return0;
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); return0;
}
dev_set_drvdata(dev, sh); return1;
}
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.