static int pdacf_config(struct pcmcia_device *link) { struct snd_pdacf *pdacf = link->priv; int ret; snd_printdd(KERN_DEBUG "pdacf_config called\n"); link->conf.ConfigIndex = 0x5; ret = pcmcia_request_io(link); if (ret) goto failed; ret = pcmcia_request_exclusive_irq(link, pdacf_interrupt); if (ret) goto failed; ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; if (snd_pdacf_assign_resources(pdacf, link->resource[0]->start, link->irq) < 0) goto failed; return 0; failed: pcmcia_disable_device(link); return -ENODEV; }
static int ixj_config(struct pcmcia_device * link) { IXJ *j; ixj_info_t *info; cistpl_cftable_entry_t dflt = { 0 }; info = link->priv; DEBUG(0, "ixj_config(0x%p)\n", link); if (pcmcia_loop_config(link, ixj_config_check, &dflt)) goto cs_failed; if (pcmcia_request_configuration(link, &link->conf)) goto cs_failed; j = ixj_pcmcia_probe(link->io.BasePort1, link->io.BasePort1 + 0x10); info->ndev = 1; info->node.major = PHONE_MAJOR; link->dev_node = &info->node; ixj_get_serial(link, j); return 0; cs_failed: ixj_cs_release(link); return -ENODEV; }
static int dtl1_config(struct pcmcia_device *link) { dtl1_info_t *info = link->priv; int i; /* Look for a generic full-sized window */ link->resource[0]->end = 8; if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0) goto failed; i = pcmcia_request_irq(link, dtl1_interrupt); if (i != 0) goto failed; i = pcmcia_request_configuration(link, &link->conf); if (i != 0) goto failed; if (dtl1_open(info) != 0) goto failed; return 0; failed: dtl1_release(link); return -ENODEV; }
static int prism2_cs_resume(struct pcmcia_device *pdev) { struct wlandevice *wlandev; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) dev_link_t *link = dev_to_instance(pdev); #endif DBFENTER; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16) wlandev = pdev->priv; // XXX do something here? #else wlandev = link->priv; link->state &= ~DEV_SUSPEND; if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); // XXX do something here? } #endif DBFEXIT; return 0; }
static int avmcs_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; switch (event) { case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) avmcs_release(link); break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; avmcs_config(link); break; case CS_EVENT_PM_SUSPEND: link->state |= DEV_SUSPEND; /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: if (link->state & DEV_CONFIG) pcmcia_release_configuration(link->handle); break; case CS_EVENT_PM_RESUME: link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: if (link->state & DEV_CONFIG) pcmcia_request_configuration(link->handle, &link->conf); break; } return 0; } /* avmcs_event */
static int atmel_config(struct pcmcia_device *link) { local_info_t *dev; int ret; struct pcmcia_device_id *did; dev = link->priv; did = dev_get_drvdata(&link->dev); dev_dbg(&link->dev, "atmel_config\n"); /* In this loop, we scan the CIS for configuration table entries, each of which describes a valid card configuration, including voltage, IO window, memory window, and interrupt settings. We make no assumptions about the card to be configured: we use just the information available in the CIS. In an ideal world, this would work for any PCMCIA card, but it requires a complete and accurate CIS. In practice, a driver usually "knows" most of these things without consulting the CIS, and most client drivers will only use the CIS to fill in implementation-defined details. */ if (pcmcia_loop_config(link, atmel_config_check, NULL)) goto failed; if (!link->irq) { dev_err(&link->dev, "atmel: cannot assign IRQ: check that CONFIG_ISA is set in kernel config."); goto failed; } /* This actually configures the PCMCIA socket -- setting up the I/O windows and the interrupt mapping, and putting the card and host interface into "Memory and IO" mode. */ ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; ((local_info_t*)link->priv)->eth_dev = init_atmel_card(link->irq, link->io.BasePort1, did ? did->driver_info : ATMEL_FW_TYPE_NONE, &link->dev, card_present, link); if (!((local_info_t*)link->priv)->eth_dev) goto failed; return 0; failed: atmel_release(link); return -ENODEV; }
static int ixj_resume(struct pcmcia_device *dev) { dev_link_t *link = dev_to_instance(dev); link->state &= ~DEV_SUSPEND; if (DEV_OK(link)) pcmcia_request_configuration(link->handle, &link->conf); return 0; }
void wl_adapter_insert( struct pcmcia_device *link ) { struct net_device *dev; int i; int ret; /*------------------------------------------------------------------------*/ DBG_FUNC( "wl_adapter_insert" ); DBG_ENTER( DbgInfo ); DBG_PARAM( DbgInfo, "link", "0x%p", link ); dev = link->priv; /* Do we need to allocate an interrupt? */ link->conf.Attributes |= CONF_ENABLE_IRQ; ret = pcmcia_request_io(link, &link->io); if (ret != 0) goto failed; ret = pcmcia_request_irq(link, (void *) wl_isr); if (ret != 0) goto failed; ret = pcmcia_request_configuration(link, &link->conf); if (ret != 0) goto failed; dev->irq = link->irq; dev->base_addr = link->io.BasePort1; SET_NETDEV_DEV(dev, &link->dev); if (register_netdev(dev) != 0) { printk("%s: register_netdev() failed\n", MODULE_NAME); goto failed; } register_wlags_sysfs(dev); printk(KERN_INFO "%s: Wireless, io_addr %#03lx, irq %d, ""mac_address ", dev->name, dev->base_addr, dev->irq); for( i = 0; i < ETH_ALEN; i++ ) { printk("%02X%c", dev->dev_addr[i], ((i < (ETH_ALEN-1)) ? ':' : '\n')); } DBG_LEAVE( DbgInfo ); return; failed: wl_adapter_release( link ); DBG_LEAVE(DbgInfo); return; } // wl_adapter_insert
static int fdomain_resume(struct pcmcia_device *dev) { dev_link_t *link = dev_to_instance(dev); link->state &= ~DEV_SUSPEND; if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); fdomain_16x0_bus_reset(NULL); } return 0; }
static void pdacf_config(dev_link_t *link) { client_handle_t handle = link->handle; struct snd_pdacf *pdacf = link->priv; tuple_t tuple; cisparse_t *parse = NULL; config_info_t conf; u_short buf[32]; int last_fn, last_ret; snd_printdd(KERN_DEBUG "pdacf_config called\n"); parse = kmalloc(sizeof(*parse), GFP_KERNEL); if (! parse) { snd_printk(KERN_ERR "pdacf_config: cannot allocate\n"); return; } tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; tuple.TupleData = (cisdata_t *)buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, parse)); link->conf.ConfigBase = parse->config.base; link->conf.ConfigIndex = 0x5; kfree(parse); CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); link->conf.Vcc = conf.Vcc; /* Configure card */ link->state |= DEV_CONFIG; CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io)); CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0) goto failed; link->dev = &pdacf->node; link->state &= ~DEV_CONFIG_PENDING; return; cs_failed: cs_error(link->handle, last_fn, last_ret); failed: pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); }
static int __devinit teles_cs_config(struct pcmcia_device *link) { local_info_t *dev; int i; IsdnCard_t icard; dev_dbg(&link->dev, "teles_config(0x%p)\n", link); dev = link->priv; i = pcmcia_loop_config(link, teles_cs_configcheck, NULL); if (i != 0) goto cs_failed; if (!link->irq) goto cs_failed; i = pcmcia_request_configuration(link, &link->conf); if (i != 0) goto cs_failed; /* Finally, report what we've done */ dev_info(&link->dev, "index 0x%02x:", link->conf.ConfigIndex); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %d", link->irq); if (link->io.NumPorts1) printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); if (link->io.NumPorts2) printk(" & 0x%04x-0x%04x", link->io.BasePort2, link->io.BasePort2+link->io.NumPorts2-1); printk("\n"); icard.para[0] = link->irq; icard.para[1] = link->io.BasePort1; icard.protocol = protocol; icard.typ = ISDN_CTYPE_TELESPCMCIA; i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard); if (i < 0) { printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n", i, link->io.BasePort1); teles_cs_release(link); return -ENODEV; } ((local_info_t*)link->priv)->cardnr = i; return 0; cs_failed: teles_cs_release(link); return -ENODEV; } /* teles_cs_config */
static int elsa_resume(struct pcmcia_device *p_dev) { dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; link->state &= ~DEV_SUSPEND; if (link->state & DEV_CONFIG) pcmcia_request_configuration(link->handle, &link->conf); dev->busy = 0; return 0; }
static int atmel_config(struct pcmcia_device *link) { local_info_t *dev; int last_fn, last_ret; struct pcmcia_device_id *did; dev = link->priv; did = dev_get_drvdata(&handle_to_dev(link)); DEBUG(0, "atmel_config(0x%p)\n", link); if (pcmcia_loop_config(link, atmel_config_check, NULL)) goto failed; if (link->conf.Attributes & CONF_ENABLE_IRQ) CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); if (link->irq.AssignedIRQ == 0) { printk(KERN_ALERT "atmel: cannot assign IRQ: check that CONFIG_ISA is set in kernel config."); goto cs_failed; } ((local_info_t*)link->priv)->eth_dev = init_atmel_card(link->irq.AssignedIRQ, link->io.BasePort1, did ? did->driver_info : ATMEL_FW_TYPE_NONE, &handle_to_dev(link), card_present, link); if (!((local_info_t*)link->priv)->eth_dev) goto cs_failed; strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name ); dev->node.major = dev->node.minor = 0; link->dev_node = &dev->node; return 0; cs_failed: cs_error(link, last_fn, last_ret); failed: atmel_release(link); return -ENODEV; }
/* * event callback */ static int vxpocket_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; vx_core_t *chip = link->priv; switch (event) { case CS_EVENT_CARD_REMOVAL: snd_printdd(KERN_DEBUG "CARD_REMOVAL..\n"); link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) chip->chip_status |= VX_STAT_IS_STALE; break; case CS_EVENT_CARD_INSERTION: snd_printdd(KERN_DEBUG "CARD_INSERTION..\n"); link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; vxpocket_config(link); break; #ifdef CONFIG_PM case CS_EVENT_PM_SUSPEND: snd_printdd(KERN_DEBUG "SUSPEND\n"); link->state |= DEV_SUSPEND; if (chip && chip->card->pm_suspend) { snd_printdd(KERN_DEBUG "snd_vx_suspend calling\n"); chip->card->pm_suspend(chip->card, PMSG_SUSPEND); } /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: snd_printdd(KERN_DEBUG "RESET_PHYSICAL\n"); if (link->state & DEV_CONFIG) pcmcia_release_configuration(link->handle); break; case CS_EVENT_PM_RESUME: snd_printdd(KERN_DEBUG "RESUME\n"); link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: snd_printdd(KERN_DEBUG "CARD_RESET\n"); if (DEV_OK(link)) { //struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip; snd_printdd(KERN_DEBUG "requestconfig...\n"); pcmcia_request_configuration(link->handle, &link->conf); if (chip && chip->card->pm_resume) { snd_printdd(KERN_DEBUG "calling snd_vx_resume\n"); chip->card->pm_resume(chip->card); } } snd_printdd(KERN_DEBUG "resume done!\n"); break; #endif } return 0; }
static int qlogic_config(struct pcmcia_device * link) { scsi_info_t *info = link->priv; int last_ret, last_fn; struct Scsi_Host *host; DEBUG(0, "qlogic_config(0x%p)\n", link); last_ret = pcmcia_loop_config(link, qlogic_config_check, NULL); if (last_ret) { cs_error(link, RequestIO, last_ret); goto failed; } CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &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); } /* The KXL-810AN has a bigger IO port window */ if (link->io.NumPorts1 == 32) host = qlogic_detect(&qlogicfas_driver_template, link, link->io.BasePort1 + 16, link->irq.AssignedIRQ); else host = qlogic_detect(&qlogicfas_driver_template, link, link->io.BasePort1, link->irq.AssignedIRQ); if (!host) { printk(KERN_INFO "%s: no SCSI devices found\n", qlogic_name); goto cs_failed; } sprintf(info->node.dev_name, "scsi%d", host->host_no); link->dev_node = &info->node; info->host = host; return 0; cs_failed: cs_error(link, last_fn, last_ret); pcmcia_disable_device(link); failed: return -ENODEV; } /* qlogic_config */
static int aha152x_config_cs(struct pcmcia_device *link) { scsi_info_t *info = link->priv; struct aha152x_setup s; int last_ret, last_fn; struct Scsi_Host *host; DEBUG(0, "aha152x_config(0x%p)\n", link); last_ret = pcmcia_loop_config(link, aha152x_config_check, NULL); if (last_ret) { cs_error(link, RequestIO, last_ret); goto failed; } CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); memset(&s, 0, sizeof(s)); s.conf = "PCMCIA setup"; s.io_port = link->io.BasePort1; s.irq = link->irq.AssignedIRQ; s.scsiid = host_id; s.reconnect = reconnect; s.parity = parity; s.synchronous = synchronous; s.delay = reset_delay; if (ext_trans) s.ext_trans = ext_trans; host = aha152x_probe_one(&s); if (host == NULL) { printk(KERN_INFO "aha152x_cs: no SCSI devices found\n"); goto cs_failed; } sprintf(info->node.dev_name, "scsi%d", host->host_no); link->dev_node = &info->node; info->host = host; return 0; cs_failed: cs_error(link, last_fn, last_ret); failed: aha152x_release_cs(link); return -ENODEV; }
static void serial_resume(dev_link_t *link) { link->state &= ~DEV_SUSPEND; if (DEV_OK(link)) { struct serial_info *info = link->priv; int i; if (!info->slave) pcmcia_request_configuration(link->handle, &link->conf); for (i = 0; i < info->ndev; i++) serial8250_resume_port(info->line[i]); } }
static int nmclan_resume(struct pcmcia_device *p_dev) { dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; link->state &= ~DEV_SUSPEND; if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); if (link->open) { nmclan_reset(dev); netif_device_attach(dev); } } return 0; }
static int aha152x_config_cs(struct pcmcia_device *link) { scsi_info_t *info = link->priv; struct aha152x_setup s; int ret; struct Scsi_Host *host; dev_dbg(&link->dev, "aha152x_config\n"); ret = pcmcia_loop_config(link, aha152x_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; /* Set configuration options for the aha152x driver */ memset(&s, 0, sizeof(s)); s.conf = "PCMCIA setup"; s.io_port = link->io.BasePort1; s.irq = link->irq; s.scsiid = host_id; s.reconnect = reconnect; s.parity = parity; s.synchronous = synchronous; s.delay = reset_delay; if (ext_trans) s.ext_trans = ext_trans; host = aha152x_probe_one(&s); if (host == NULL) { printk(KERN_INFO "aha152x_cs: no SCSI devices found\n"); goto failed; } info->host = host; return 0; failed: aha152x_release_cs(link); return -ENODEV; }
static int sl811_cs_config(struct pcmcia_device *link) { struct device *parent = &link->dev; local_info_t *dev = link->priv; int ret; dev_dbg(&link->dev, "sl811_cs_config\n"); if (pcmcia_loop_config(link, sl811_cs_config_check, NULL)) goto failed; /* require an IRQ and two registers */ if (!link->io.NumPorts1 || link->io.NumPorts1 < 2) goto failed; if (link->conf.Attributes & CONF_ENABLE_IRQ) { ret = pcmcia_request_irq(link, &link->irq); if (ret) goto failed; } else goto failed; ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; sprintf(dev->node.dev_name, driver_name); dev->node.major = dev->node.minor = 0; link->dev_node = &dev->node; printk(KERN_INFO "%s: index 0x%02x: ", dev->node.dev_name, link->conf.ConfigIndex); if (link->conf.Vpp) printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10); printk(", irq %d", link->irq.AssignedIRQ); printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); printk("\n"); if (sl811_hc_init(parent, link->io.BasePort1, link->irq.AssignedIRQ) < 0) { failed: printk(KERN_WARNING "sl811_cs_config failed\n"); sl811_cs_release(link); return -ENODEV; } return 0; }
static int qlogic_resume(struct pcmcia_device *link) { scsi_info_t *info = link->priv; pcmcia_request_configuration(link, &link->conf); if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { outb(0x80, link->io.BasePort1 + 0xd); outb(0x24, link->io.BasePort1 + 0x9); outb(0x04, link->io.BasePort1 + 0xd); } /* Ugggglllyyyy!!! */ qlogicfas408_bus_reset(NULL); return 0; }
static void mio_cs_config(struct pcmcia_device *link) { int ret; DPRINTK("mio_cs_config(link=%p)\n", link); ret = pcmcia_loop_config(link, mio_pcmcia_config_loop, NULL); if (ret) { dev_warn(&link->dev, "no configuration found\n"); return; } if (!link->irq) dev_info(&link->dev, "no IRQ available\n"); ret = pcmcia_request_configuration(link, &link->conf); }
static int parport_config(struct pcmcia_device *link) { parport_info_t *info = link->priv; struct parport *p; int last_ret, last_fn; DEBUG(0, "parport_config(0x%p)\n", link); last_ret = pcmcia_loop_config(link, parport_config_check, NULL); if (last_ret) { cs_error(link, RequestIO, last_ret); goto failed; } CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2, link->irq.AssignedIRQ, PARPORT_DMA_NONE, &link->dev); if (p == NULL) { printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at " "0x%3x, irq %u failed\n", link->io.BasePort1, link->irq.AssignedIRQ); goto failed; } p->modes |= PARPORT_MODE_PCSPP; if (epp_mode) p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP; info->ndev = 1; info->node.major = LP_MAJOR; info->node.minor = p->number; info->port = p; strcpy(info->node.dev_name, p->name); link->dev_node = &info->node; return 0; cs_failed: cs_error(link, last_fn, last_ret); failed: parport_cs_release(link); return -ENODEV; } /* parport_config */
static int bluecard_config(struct pcmcia_device *link) { bluecard_info_t *info = link->priv; int i, n; link->conf.ConfigIndex = 0x20; link->io.NumPorts1 = 64; link->io.IOAddrLines = 6; for (n = 0; n < 0x400; n += 0x40) { link->io.BasePort1 = n ^ 0x300; i = pcmcia_request_io(link, &link->io); if (i == CS_SUCCESS) break; } if (i != CS_SUCCESS) { cs_error(link, RequestIO, i); goto failed; } i = pcmcia_request_irq(link, &link->irq); if (i != CS_SUCCESS) { cs_error(link, RequestIRQ, i); link->irq.AssignedIRQ = 0; } i = pcmcia_request_configuration(link, &link->conf); if (i != CS_SUCCESS) { cs_error(link, RequestConfiguration, i); goto failed; } if (bluecard_open(info) != 0) goto failed; strcpy(info->node.dev_name, info->hdev->name); link->dev_node = &info->node; return 0; failed: bluecard_release(link); return -ENODEV; }
static int serial_resume(struct pcmcia_device *dev) { dev_link_t *link = dev_to_instance(dev); link->state &= ~DEV_SUSPEND; if (DEV_OK(link)) { struct serial_info *info = link->priv; int i; if (!info->slave) pcmcia_request_configuration(link->handle, &link->conf); for (i = 0; i < info->ndev; i++) serial8250_resume_port(info->line[i]); } return 0; }
static int fdomain_config(struct pcmcia_device *link) { scsi_info_t *info = link->priv; int ret; char str[22]; struct Scsi_Host *host; dev_dbg(&link->dev, "fdomain_config\n"); ret = pcmcia_loop_config(link, fdomain_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; /* A bad hack... */ release_region(link->io.BasePort1, link->io.NumPorts1); /* Set configuration options for the fdomain driver */ sprintf(str, "%d,%d", link->io.BasePort1, link->irq); fdomain_setup(str); host = __fdomain_16x0_detect(&fdomain_driver_template); if (!host) { printk(KERN_INFO "fdomain_cs: no SCSI devices found\n"); goto failed; } if (scsi_add_host(host, NULL)) goto failed; scsi_scan_host(host); info->host = host; return 0; failed: fdomain_release(link); return -ENODEV; } /* fdomain_config */
static int pdacf_config(struct pcmcia_device *link) { struct snd_pdacf *pdacf = link->priv; tuple_t tuple; cisparse_t *parse = NULL; u_short buf[32]; int last_fn, last_ret; snd_printdd(KERN_DEBUG "pdacf_config called\n"); parse = kmalloc(sizeof(*parse), GFP_KERNEL); if (! parse) { snd_printk(KERN_ERR "pdacf_config: cannot allocate\n"); return -ENOMEM; } tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; tuple.TupleData = (cisdata_t *)buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, parse)); link->conf.ConfigBase = parse->config.base; link->conf.ConfigIndex = 0x5; kfree(parse); CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0) goto failed; link->dev_node = &pdacf->node; return 0; cs_failed: cs_error(link, last_fn, last_ret); failed: pcmcia_disable_device(link); return -ENODEV; }
static void das08_pcmcia_config(struct pcmcia_device *link) { int ret; dev_dbg(&link->dev, "das08_pcmcia_config\n"); ret = pcmcia_loop_config(link, das08_pcmcia_config_loop, NULL); if (ret) { dev_warn(&link->dev, "no configuration found\n"); goto failed; } if (!link->irq) goto failed; /* This actually configures the PCMCIA socket -- setting up the I/O windows and the interrupt mapping, and putting the card and host interface into "Memory and IO" mode. */ ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; /* Finally, report what we've done */ dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %u", link->irq); if (link->io.NumPorts1) printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1 + link->io.NumPorts1 - 1); if (link->io.NumPorts2) printk(" & 0x%04x-0x%04x", link->io.BasePort2, link->io.BasePort2 + link->io.NumPorts2 - 1); printk("\n"); return; failed: das08_pcmcia_release(link); } /* das08_pcmcia_config */
static int qlogic_event(event_t event, int priority, event_callback_args_t * args) { dev_link_t *link = args->client_data; DEBUG(1, "qlogic_event(0x%06x)\n", event); switch (event) { case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) qlogic_release(link); break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; qlogic_config(link); break; case CS_EVENT_PM_SUSPEND: link->state |= DEV_SUSPEND; /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: if (link->state & DEV_CONFIG) pcmcia_release_configuration(link->handle); break; case CS_EVENT_PM_RESUME: link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: if (link->state & DEV_CONFIG) { scsi_info_t *info = link->priv; pcmcia_request_configuration(link->handle, &link->conf); if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { outb(0x80, link->io.BasePort1 + 0xd); outb(0x24, link->io.BasePort1 + 0x9); outb(0x04, link->io.BasePort1 + 0xd); } /* Ugggglllyyyy!!! */ qlogicfas408_bus_reset(NULL); } break; } return 0; } /* qlogic_event */
static int airo_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; local_info_t *local = link->priv; DEBUG(1, "airo_event(0x%06x)\n", event); switch (event) { case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { netif_device_detach(local->eth_dev); airo_release(link); } break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; airo_config(link); break; case CS_EVENT_PM_SUSPEND: link->state |= DEV_SUSPEND; /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: if (link->state & DEV_CONFIG) { netif_device_detach(local->eth_dev); pcmcia_release_configuration(link->handle); } break; case CS_EVENT_PM_RESUME: link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); reset_airo_card(local->eth_dev); netif_device_attach(local->eth_dev); } break; } return 0; } /* airo_event */