static int __devinit qlogicfas_detect(struct scsi_host_template *sht) { struct Scsi_Host *shost; struct qlogicfas408_priv *priv; int num; for (num = 0; num < MAX_QLOGICFAS; num++) { shost = __qlogicfas_detect(sht, iobase[num], irq[num]); if (shost == NULL) { break; } priv = get_priv_by_host(shost); priv->next = cards; cards = priv; } return num; }
static void qlogic_config(dev_link_t * link) { client_handle_t handle = link->handle; scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; int i, last_ret, last_fn; unsigned short tuple_data[32]; struct Scsi_Host *host; DEBUG(0, "qlogic_config(0x%p)\n", link); tuple.TupleData = (cisdata_t *) tuple_data; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, handle, &tuple); CS_CHECK(GetTupleData, handle, &tuple); CS_CHECK(ParseTuple, handle, &tuple, &parse); link->conf.ConfigBase = parse.config.base; tuple.DesiredTuple = CISTPL_MANFID; if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) && (CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS)) info->manf_id = le16_to_cpu(tuple.TupleData[0]); /* Configure card */ link->state |= DEV_CONFIG; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; CS_CHECK(GetFirstTuple, handle, &tuple); while (1) { CFG_CHECK(GetTupleData, handle, &tuple); CFG_CHECK(ParseTuple, handle, &tuple, &parse); link->conf.ConfigIndex = parse.cftable_entry.index; link->io.BasePort1 = parse.cftable_entry.io.win[0].base; link->io.NumPorts1 = parse.cftable_entry.io.win[0].len; if (link->io.BasePort1 != 0) { i = CardServices(RequestIO, handle, &link->io); if (i == CS_SUCCESS) break; } next_entry: CS_CHECK(GetNextTuple, handle, &tuple); } CS_CHECK(RequestIRQ, handle, &link->irq); CS_CHECK(RequestConfiguration, handle, &link->conf); if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { /* set ATAcmd */ outb(0xb4, link->io.BasePort1 + 0xd); outb(0x24, link->io.BasePort1 + 0x9); outb(0x04, link->io.BasePort1 + 0xd); } /* A bad hack... */ release_region(link->io.BasePort1, link->io.NumPorts1); /* The KXL-810AN has a bigger IO port window */ if (link->io.NumPorts1 == 32) qlogicfas_preset(link->io.BasePort1 + 16, link->irq.AssignedIRQ); else qlogicfas_preset(link->io.BasePort1, link->irq.AssignedIRQ); host = __qlogicfas_detect(&qlogicfas_driver_template); if (!host) { printk(KERN_INFO "qlogic_cs: no SCSI devices found\n"); goto out; } sprintf(info->node.dev_name, "scsi%d", host->host_no); link->dev = &info->node; info->host = host; scsi_add_host(host, NULL); /* XXX handle failure */ scsi_scan_host(host); out: link->state &= ~DEV_CONFIG_PENDING; return; cs_failed: cs_error(link->handle, last_fn, last_ret); qlogic_release(link); return; } /* qlogic_config */