static void atmel_detach(dev_link_t *link) { dev_link_t **linkp; DEBUG(0, "atmel_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->state & DEV_CONFIG) atmel_release(link); /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free pieces */ *linkp = link->next; if (link->priv) kfree(link->priv); kfree(link); }
static void cif60_detach(dev_link_t *link) { struct cif60_dev_t *info = link->priv; dev_link_t **linkp; CARD_DEVICE *dev; DEBUG(0, "cif60_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; dev = info->dev; DEBUG(0, "cif60_detach2\n"); if(link->state & DEV_CONFIG) { DEBUG(0, "cif60_detach2:cif60_release\n"); cif60_release(link); } if(link->handle) { DEBUG(0, "cif60_detach2:deregister_client\n"); pcmcia_deregister_client(link->handle); } /* Unlink device structure, free bits */ *linkp = link->next; kfree(dev); kfree(info); DEBUG(0, "cif60_detach2:return\n"); } /* cif60_detach */
static void fmvj18x_detach(dev_link_t *link) { struct net_device *dev = link->priv; dev_link_t **linkp; DEBUG(0, "fmvj18x_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->dev) unregister_netdev(dev); if (link->state & DEV_CONFIG) fmvj18x_release(link); /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free pieces */ *linkp = link->next; free_netdev(dev); } /* fmvj18x_detach */
/* * This deletes a driver "instance". The device is de-registered with * Card Services. If it has been released, all local data structures * are freed. Otherwise, the structures will be freed when the device * is released. */ static void orinoco_cs_detach(dev_link_t *link) { dev_link_t **linkp; struct net_device *dev = link->priv; /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; BUG_ON(*linkp == NULL); if (link->state & DEV_CONFIG) orinoco_cs_release(link); /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, and free it */ *linkp = link->next; DEBUG(0, PFX "detach: link=%p link->dev=%p\n", link, link->dev); if (link->dev) { DEBUG(0, PFX "About to unregister net device %p\n", dev); unregister_netdev(dev); } free_orinocodev(dev); } /* orinoco_cs_detach */
static void avmcs_detach(dev_link_t *link) { dev_link_t **linkp; /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; /* If the device is currently configured and active, we won't actually delete it yet. Instead, it is marked so that when the release() function is called, that will trigger a proper detach(). */ if (link->state & DEV_CONFIG) { link->state |= DEV_STALE_LINK; return; } /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free pieces */ *linkp = link->next; if (link->priv) { kfree(link->priv); } kfree(link); } /* avmcs_detach */
static void btuart_detach(dev_link_t *link) { btuart_info_t *info = link->priv; dev_link_t **linkp; int ret; /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->state & DEV_CONFIG) btuart_release(link); if (link->handle) { ret = pcmcia_deregister_client(link->handle); if (ret != CS_SUCCESS) cs_error(link->handle, DeregisterClient, ret); } /* Unlink device structure, free bits */ *linkp = link->next; kfree(info); }
static void elsa_cs_detach(dev_link_t *link) { dev_link_t **linkp; local_info_t *info = link->priv; int ret; DEBUG(0, "elsa_cs_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->state & DEV_CONFIG) elsa_cs_release(link); /* Break the link with Card Services */ if (link->handle) { ret = pcmcia_deregister_client(link->handle); if (ret != CS_SUCCESS) cs_error(link->handle, DeregisterClient, ret); } /* Unlink device structure and free it */ *linkp = link->next; kfree(info); } /* elsa_cs_detach */
static void airo_detach(dev_link_t *link) { dev_link_t **linkp; DEBUG(0, "airo_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->state & DEV_CONFIG) airo_release(link); if ( ((local_info_t*)link->priv)->eth_dev ) { stop_airo_card( ((local_info_t*)link->priv)->eth_dev, 0 ); } ((local_info_t*)link->priv)->eth_dev = NULL; /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free pieces */ *linkp = link->next; if (link->priv) { kfree(link->priv); } kfree(link); } /* airo_detach */
static void serial_detach(dev_link_t * link) { struct serial_info *info = link->priv; dev_link_t **linkp; int ret; DEBUG(0, "serial_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; /* * Ensure any outstanding scheduled tasks are completed. */ flush_scheduled_work(); /* * Ensure that the ports have been released. */ serial_remove(link); if (link->handle) { ret = pcmcia_deregister_client(link->handle); if (ret != CS_SUCCESS) cs_error(link->handle, DeregisterClient, ret); } /* Unlink device structure, free bits */ *linkp = link->next; kfree(info); }
static void ide_detach(dev_link_t *link) { dev_link_t **linkp; int ret; DEBUG(0, "ide_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->state & DEV_CONFIG) ide_release(link); if (link->handle) { ret = pcmcia_deregister_client(link->handle); if (ret != CS_SUCCESS) cs_error(link->handle, DeregisterClient, ret); } /* Unlink, free device structure */ *linkp = link->next; kfree(link->priv); } /* ide_detach */
void __exit cleanup_module(void) { int i; #ifdef CONFIG_PROC_FS if (proc_pccard) remove_proc_entry("drivers", proc_pccard); #endif if (major_dev != -1) unregister_chrdev(major_dev, "pcmcia"); for (i = 0; i < sockets; i++) pcmcia_deregister_client(socket_table[i].handle); sockets = 0; kfree(socket_table); }
static void vxpocket_release(dev_link_t *link) { if (link->state & DEV_CONFIG) { /* release cs resources */ pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; } if (link->handle) { /* Break the link with Card Services */ pcmcia_deregister_client(link->handle); link->handle = NULL; } }
/* * destructor */ static int snd_pdacf_free(pdacf_t *pdacf) { dev_link_t *link = &pdacf->link; pdacf_release(link); /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); card_list[pdacf->index] = NULL; pdacf->card = NULL; kfree(pdacf); return 0; }
static void pcmcia_bus_remove_socket(struct class_device *class_dev) { struct pcmcia_socket *socket = class_dev->class_data; if (!socket || !socket->pcmcia) return; flush_scheduled_work(); pcmcia_deregister_client(socket->pcmcia->handle); socket->pcmcia->state |= DS_SOCKET_DEAD; pcmcia_put_bus_socket(socket->pcmcia); socket->pcmcia = NULL; return; }
static void aha152x_detach(dev_link_t *link) { dev_link_t **linkp; DEBUG(0, "aha152x_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; if (link->state & DEV_CONFIG) aha152x_release_cs(link); if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); } /* aha152x_detach */
static void sl811_cs_detach(dev_link_t *link) { dev_link_t **linkp; DBG(0, "sl811_cs_detach(0x%p)\n", link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { if (*linkp == link) break; } if (*linkp == NULL) return; /* Break the link with Card Services */ if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, and free it */ *linkp = link->next; /* This points to the parent local_info_t struct */ kfree(link->priv); }
static void ixj_detach(dev_link_t * link) { dev_link_t **linkp; int ret; DEBUG(0, "ixj_detach(0x%p)\n", link); for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; link->state &= ~DEV_RELEASE_PENDING; if (link->state & DEV_CONFIG) ixj_cs_release(link); if (link->handle) { ret = pcmcia_deregister_client(link->handle); if (ret != CS_SUCCESS) cs_error(link->handle, DeregisterClient, ret); } /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); kfree(link); }
/*---------------------------------------------------------------- * prism2sta_detach * * Remove one of the device instances managed by this driver. * Search the list for the given instance, * check our flags for a waiting timer'd release call * call release * Deregister the instance with Card Services * (netdevice) unregister the network device. * unlink the instance from the list * free the link, priv, and priv->priv memory * Note: the dev_list variable is a driver scoped static used to * maintain a list of device instances managed by this * driver. * * Arguments: * link ptr to the instance to detach * * Returns: * nothing * * Side effects: * the link structure is gone, the netdevice is gone * * Call context: * Might be interrupt, don't block. ----------------------------------------------------------------*/ void prism2sta_detach(dev_link_t *link) { dev_link_t **linkp; wlandevice_t *wlandev; hfa384x_t *hw; DBFENTER; /* Locate prev device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { if (*linkp == link) break; } if (*linkp != NULL) { #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) unsigned long flags; /* Get rid of any timer'd release call */ save_flags(flags); cli(); #endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) if (link->state & DEV_RELEASE_PENDING) { del_timer_sync(&link->release); link->state &= ~DEV_RELEASE_PENDING; } #endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) restore_flags(flags); #endif /* If link says we're still config'd, call release */ if (link->state & DEV_CONFIG) { prism2sta_release((u_long)link); if (link->state & DEV_STALE_CONFIG) { link->state |= DEV_STALE_LINK; return; } } /* Tell Card Services we're not around any more */ if (link->handle) { pcmcia_deregister_client(link->handle); } /* Unlink device structure, free bits */ *linkp = link->next; if ( link->priv != NULL ) { wlandev = (wlandevice_t*)link->priv; p80211netdev_hwremoved(wlandev); if (link->dev != NULL) { unregister_wlandev(wlandev); } wlan_unsetup(wlandev); if (wlandev->priv) { hw = wlandev->priv; wlandev->priv = NULL; if (hw) { hfa384x_destroy(hw); kfree(hw); } } link->priv = NULL; kfree(wlandev); } kfree(link); } DBFEXIT; return; }