static hw_info_t *get_hwinfo(struct pcmcia_device *link) { struct net_device *dev = link->priv; u_char __iomem *base, *virt; int i, j; /* Allocate a small memory window */ link->resource[2]->flags |= WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; link->resource[2]->start = 0; link->resource[2]->end = 0; i = pcmcia_request_window(link, link->resource[2], 0); if (i != 0) return NULL; virt = ioremap(link->resource[2]->start, resource_size(link->resource[2])); for (i = 0; i < NR_INFO; i++) { pcmcia_map_mem_page(link, link->resource[2], hw_info[i].offset & ~(resource_size(link->resource[2])-1)); base = &virt[hw_info[i].offset & (resource_size(link->resource[2])-1)]; if ((readb(base+0) == hw_info[i].a0) && (readb(base+2) == hw_info[i].a1) && (readb(base+4) == hw_info[i].a2)) { for (j = 0; j < 6; j++) dev->dev_addr[j] = readb(base + (j<<1)); break; } } iounmap(virt); j = pcmcia_release_window(link, link->resource[2]); return (i < NR_INFO) ? hw_info+i : NULL; } /* get_hwinfo */
static void ines_gpib_release( struct pcmcia_device *link ) { DEBUG(0, "ines_gpib_release(0x%p)\n", link); /* Don't bother checking to see if these succeed or not */ pcmcia_release_window(link->win); pcmcia_disable_device (link); } /* gpib_release */
static void prism2_cs_remove(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; #else wlandev = link->priv; #endif if (wlandev) { p80211netdev_hwremoved(wlandev); unregister_wlandev(wlandev); wlan_unsetup(wlandev); if (wlandev->priv) { hfa384x_t *hw = wlandev->priv; wlandev->priv = NULL; if (hw) { hfa384x_destroy(hw); kfree(hw); } } kfree(wlandev); } #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16) pdev->priv = NULL; pcmcia_disable_device(pdev); #else if (link->state & DEV_CONFIG) { if (link->win) pcmcia_release_window(link->win); pcmcia_release_configuration(link->handle); if (link->io.NumPorts1) pcmcia_release_io(link->handle, &link->io); if (link->irq.AssignedIRQ) pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; } link->priv = NULL; kfree(link); #endif DBFEXIT; return; }
static void release_ipwireless(struct ipw_dev *ipw) { pcmcia_disable_device(ipw->link); if (ipw->common_memory) { release_mem_region(ipw->request_common_memory.Base, ipw->request_common_memory.Size); iounmap(ipw->common_memory); } if (ipw->attr_memory) { release_mem_region(ipw->request_attr_memory.Base, ipw->request_attr_memory.Size); iounmap(ipw->attr_memory); } if (ipw->common_memory) pcmcia_release_window(ipw->handle_common_memory); if (ipw->attr_memory) pcmcia_release_window(ipw->handle_attr_memory); /* Break the link with Card Services */ pcmcia_disable_device(ipw->link); }
static void pcmciamtd_release(dev_link_t *link) { struct pcmciamtd_dev *dev = link->priv; DEBUG(3, "link = 0x%p", link); if (link->win) { if(dev->win_base) { iounmap(dev->win_base); dev->win_base = NULL; } pcmcia_release_window(link->win); } pcmcia_release_configuration(link->handle); link->state &= ~DEV_CONFIG; }
static void cif60_release(dev_link_t *link) { cif60_dev_t *info = link->priv; //CARD_DEVICE *dev = info->dev; DEBUG(0, "cif60_release(0x%p)\n", link); pcmcia_release_configuration(link->handle); //pcmcia_release_io(link->handle, &link->io); //pcmcia_release_irq(link->handle, &link->irq); if (link->win) { //iounmap((void *)dev->mmio); //pcmcia_release_window(link->win); pcmcia_release_window(info->sram_win_handle); } link->state &= ~DEV_CONFIG; }
static void airo_release(dev_link_t *link) { DEBUG(0, "airo_release(0x%p)\n", link); /* Unlink the device chain */ link->dev = NULL; /* In a normal driver, additional code may be needed to release other kernel data structures associated with this device. */ /* Don't bother checking to see if these succeed or not */ if (link->win) pcmcia_release_window(link->win); pcmcia_release_configuration(link->handle); if (link->io.NumPorts1) pcmcia_release_io(link->handle, &link->io); if (link->irq.AssignedIRQ) pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; }
static void elsa_cs_release(dev_link_t *link) { local_info_t *local = link->priv; DEBUG(0, "elsa_cs_release(0x%p)\n", link); if (local) { if (local->cardnr >= 0) { /* no unregister function with hisax */ HiSax_closecard(local->cardnr); } } /* Unlink the device chain */ link->dev = NULL; /* Don't bother checking to see if these succeed or not */ if (link->win) pcmcia_release_window(link->win); pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; } /* elsa_cs_release */
int MTDHelperEntry(int func, void *a1, void *a2) { switch (func) { case MTDRequestWindow: { window_handle_t w; int ret = pcmcia_request_window(a1, a2, &w); (window_handle_t *)a1 = w; return ret; } break; case MTDReleaseWindow: return pcmcia_release_window(a1); case MTDModifyWindow: return mtd_modify_window(a1, a2); break; case MTDSetVpp: return mtd_set_vpp(a1, a2); break; case MTDRDYMask: return mtd_rdy_mask(a1, a2); break; default: return CS_UNSUPPORTED_FUNCTION; break; } } /* MTDHelperEntry */
static int config_ipwireless(struct ipw_dev *ipw) { struct pcmcia_device *link = ipw->link; int ret; tuple_t tuple; unsigned short buf[64]; cisparse_t parse; unsigned short cor_value; memreq_t memreq_attr_memory; memreq_t memreq_common_memory; ipw->is_v2_card = 0; tuple.Attributes = 0; tuple.TupleData = (cisdata_t *) buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = RETURN_FIRST_TUPLE; ret = pcmcia_get_first_tuple(link, &tuple); while (ret == 0) { ret = pcmcia_get_tuple_data(link, &tuple); if (ret != 0) { cs_error(link, GetTupleData, ret); goto exit0; } ret = pcmcia_get_next_tuple(link, &tuple); } tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; ret = pcmcia_get_first_tuple(link, &tuple); if (ret != 0) { cs_error(link, GetFirstTuple, ret); goto exit0; } ret = pcmcia_get_tuple_data(link, &tuple); if (ret != 0) { cs_error(link, GetTupleData, ret); goto exit0; } ret = pcmcia_parse_tuple(&tuple, &parse); if (ret != 0) { cs_error(link, ParseTuple, ret); goto exit0; } link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; link->io.BasePort1 = parse.cftable_entry.io.win[0].base; link->io.NumPorts1 = parse.cftable_entry.io.win[0].len; link->io.IOAddrLines = 16; link->irq.IRQInfo1 = parse.cftable_entry.irq.IRQInfo1; /* 0x40 causes it to generate level mode interrupts. */ /* 0x04 enables IREQ pin. */ cor_value = parse.cftable_entry.index | 0x44; link->conf.ConfigIndex = cor_value; /* IRQ and I/O settings */ tuple.DesiredTuple = CISTPL_CONFIG; ret = pcmcia_get_first_tuple(link, &tuple); if (ret != 0) { cs_error(link, GetFirstTuple, ret); goto exit0; } ret = pcmcia_get_tuple_data(link, &tuple); if (ret != 0) { cs_error(link, GetTupleData, ret); goto exit0; } ret = pcmcia_parse_tuple(&tuple, &parse); if (ret != 0) { cs_error(link, GetTupleData, ret); goto exit0; } link->conf.Attributes = CONF_ENABLE_IRQ; link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; link->conf.IntType = INT_MEMORY_AND_IO; link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; link->irq.Handler = ipwireless_interrupt; link->irq.Instance = ipw->hardware; ret = pcmcia_request_io(link, &link->io); if (ret != 0) { cs_error(link, RequestIO, ret); goto exit0; } request_region(link->io.BasePort1, link->io.NumPorts1, IPWIRELESS_PCCARD_NAME); /* memory settings */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; ret = pcmcia_get_first_tuple(link, &tuple); if (ret != 0) { cs_error(link, GetFirstTuple, ret); goto exit1; } ret = pcmcia_get_tuple_data(link, &tuple); if (ret != 0) { cs_error(link, GetTupleData, ret); goto exit1; } ret = pcmcia_parse_tuple(&tuple, &parse); if (ret != 0) { cs_error(link, ParseTuple, ret); goto exit1; } if (parse.cftable_entry.mem.nwin > 0) { ipw->request_common_memory.Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE; ipw->request_common_memory.Base = parse.cftable_entry.mem.win[0].host_addr; ipw->request_common_memory.Size = parse.cftable_entry.mem.win[0].len; if (ipw->request_common_memory.Size < 0x1000) ipw->request_common_memory.Size = 0x1000; ipw->request_common_memory.AccessSpeed = 0; ret = pcmcia_request_window(&link, &ipw->request_common_memory, &ipw->handle_common_memory); if (ret != 0) { cs_error(link, RequestWindow, ret); goto exit1; } memreq_common_memory.CardOffset = parse.cftable_entry.mem.win[0].card_addr; memreq_common_memory.Page = 0; ret = pcmcia_map_mem_page(ipw->handle_common_memory, &memreq_common_memory); if (ret != 0) { cs_error(link, MapMemPage, ret); goto exit1; } ipw->is_v2_card = parse.cftable_entry.mem.win[0].len == 0x100; ipw->common_memory = ioremap(ipw->request_common_memory.Base, ipw->request_common_memory.Size); request_mem_region(ipw->request_common_memory.Base, ipw->request_common_memory.Size, IPWIRELESS_PCCARD_NAME); ipw->request_attr_memory.Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM | WIN_ENABLE; ipw->request_attr_memory.Base = 0; ipw->request_attr_memory.Size = 0; /* this used to be 0x1000 */ ipw->request_attr_memory.AccessSpeed = 0; ret = pcmcia_request_window(&link, &ipw->request_attr_memory, &ipw->handle_attr_memory); if (ret != 0) { cs_error(link, RequestWindow, ret); goto exit2; } memreq_attr_memory.CardOffset = 0; memreq_attr_memory.Page = 0; ret = pcmcia_map_mem_page(ipw->handle_attr_memory, &memreq_attr_memory); if (ret != 0) { cs_error(link, MapMemPage, ret); goto exit2; } ipw->attr_memory = ioremap(ipw->request_attr_memory.Base, ipw->request_attr_memory.Size); request_mem_region(ipw->request_attr_memory.Base, ipw->request_attr_memory.Size, IPWIRELESS_PCCARD_NAME); } INIT_WORK(&ipw->work_reboot, signalled_reboot_work); ipwireless_init_hardware_v1(ipw->hardware, link->io.BasePort1, ipw->attr_memory, ipw->common_memory, ipw->is_v2_card, signalled_reboot_callback, ipw); ret = pcmcia_request_irq(link, &link->irq); if (ret != 0) { cs_error(link, RequestIRQ, ret); goto exit3; } printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": Card type %s\n", ipw->is_v2_card ? "V2/V3" : "V1"); printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": I/O ports 0x%04x-0x%04x, irq %d\n", (unsigned int) link->io.BasePort1, (unsigned int) (link->io.BasePort1 + link->io.NumPorts1 - 1), (unsigned int) link->irq.AssignedIRQ); if (ipw->attr_memory && ipw->common_memory) printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": attr memory 0x%08lx-0x%08lx, common memory 0x%08lx-0x%08lx\n", ipw->request_attr_memory.Base, ipw->request_attr_memory.Base + ipw->request_attr_memory.Size - 1, ipw->request_common_memory.Base, ipw->request_common_memory.Base + ipw->request_common_memory.Size - 1); ipw->network = ipwireless_network_create(ipw->hardware); if (!ipw->network) goto exit3; ipw->tty = ipwireless_tty_create(ipw->hardware, ipw->network, ipw->nodes); if (!ipw->tty) goto exit3; ipwireless_init_hardware_v2_v3(ipw->hardware); /* * Do the RequestConfiguration last, because it enables interrupts. * Then we don't get any interrupts before we're ready for them. */ ret = pcmcia_request_configuration(link, &link->conf); if (ret != 0) { cs_error(link, RequestConfiguration, ret); goto exit4; } link->dev_node = &ipw->nodes[0]; return 0; exit4: pcmcia_disable_device(link); exit3: if (ipw->attr_memory) { release_mem_region(ipw->request_attr_memory.Base, ipw->request_attr_memory.Size); iounmap(ipw->attr_memory); pcmcia_release_window(ipw->handle_attr_memory); pcmcia_disable_device(link); } exit2: if (ipw->common_memory) { release_mem_region(ipw->request_common_memory.Base, ipw->request_common_memory.Size); iounmap(ipw->common_memory); pcmcia_release_window(ipw->handle_common_memory); } exit1: pcmcia_disable_device(link); exit0: return -1; }