static void __exit exit_com20020_cs(void) { DEBUG(0, "com20020_cs: unloading\n"); unregister_pccard_driver(&dev_info); while (dev_list != NULL) com20020_detach(dev_list); }
static void flush_stale_links(void) { dev_link_t *link, *next; for (link = dev_list; link; link = next) { next = link->next; if (link->state & DEV_STALE_LINK) com20020_detach(link); } }
static void com20020_release(dev_link_t *link) { DEBUG(1,"release...\n"); DEBUG(0, "com20020_release(0x%p)\n", link); if (link->open) { DEBUG(1,"postpone...\n"); DEBUG(1, "com20020_cs: release postponed, device stll open\n"); link->state |= DEV_STALE_CONFIG; return; } CardServices(ReleaseConfiguration, link->handle); CardServices(ReleaseIO, link->handle, &link->io); CardServices(ReleaseIRQ, link->handle, &link->irq); link->state &= ~(DEV_CONFIG | DEV_RELEASE_PENDING); if (link->state & DEV_STALE_CONFIG) com20020_detach(link); }
static void __exit exit_com20020_cs(void) { pcmcia_unregister_driver(&com20020_cs_driver); while (dev_list != NULL) com20020_detach(dev_list); }
static dev_link_t *com20020_attach(void) { client_reg_t client_reg; dev_link_t *link; com20020_dev_t *info; struct net_device *dev; int i, ret; struct arcnet_local *lp; DEBUG(0, "com20020_attach()\n"); /* Create new network device */ link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); if (!link) return NULL; info = kmalloc(sizeof(struct com20020_dev_t), GFP_KERNEL); if (!info) goto fail_alloc_info; dev = alloc_netdev(sizeof(struct arcnet_local), "arc%d", com20020_setup); if (!dev) goto fail_alloc_dev; memset(info, 0, sizeof(struct com20020_dev_t)); memset(link, 0, sizeof(struct dev_link_t)); lp = dev->priv; link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.NumPorts1 = 16; link->io.IOAddrLines = 16; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID; if (irq_list[0] == -1) link->irq.IRQInfo2 = irq_mask; else for (i = 0; i < 4; i++) link->irq.IRQInfo2 |= 1 << irq_list[i]; link->conf.Attributes = CONF_ENABLE_IRQ; link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; link->irq.Instance = info->dev = dev; link->priv = info; /* Register with Card Services */ link->next = dev_list; dev_list = link; client_reg.dev_info = &dev_info; client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; client_reg.EventMask = CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; client_reg.event_handler = &com20020_event; client_reg.Version = 0x0210; client_reg.event_callback_args.client_data = link; ret = CardServices(RegisterClient, &link->handle, &client_reg); if (ret != 0) { cs_error(link->handle, RegisterClient, ret); com20020_detach(link); return NULL; } return link; fail_alloc_dev: kfree(info); fail_alloc_info: kfree(link); return NULL; } /* com20020_attach */