static void ks7010_sdio_remove(struct sdio_func *func) { int ret; struct ks_sdio_card *card; struct ks_wlan_private *priv; card = sdio_get_drvdata(func); if (!card) return; DPRINTK(1, "priv = card->priv\n"); priv = card->priv; if (priv) { struct net_device *netdev = priv->net_dev; ks_wlan_net_stop(netdev); DPRINTK(1, "ks_wlan_net_stop\n"); /* interrupt disable */ sdio_claim_host(func); sdio_writeb(func, 0, INT_ENABLE, &ret); sdio_writeb(func, 0xff, INT_PENDING, &ret); sdio_release_host(func); DPRINTK(1, "interrupt disable\n"); ret = send_stop_request(func); if (ret) /* memory allocation failure */ return; DPRINTK(1, "STOP Req\n"); if (priv->wq) { flush_workqueue(priv->wq); destroy_workqueue(priv->wq); } DPRINTK(1, "destroy_workqueue(priv->wq);\n"); hostif_exit(priv); DPRINTK(1, "hostif_exit\n"); unregister_netdev(netdev); trx_device_exit(priv); free_netdev(priv->net_dev); card->priv = NULL; } sdio_claim_host(func); sdio_release_irq(func); DPRINTK(1, "sdio_release_irq()\n"); sdio_disable_func(func); DPRINTK(1, "sdio_disable_func()\n"); sdio_release_host(func); sdio_set_drvdata(func, NULL); kfree(card); DPRINTK(1, "kfree()\n"); DPRINTK(5, " Bye !!\n"); }
static void ks7010_sdio_remove(struct sdio_func *func) { int ret; struct ks_sdio_card *card; struct ks_wlan_private *priv; struct net_device *netdev; DPRINTK(1, "ks7010_sdio_remove()\n"); card = sdio_get_drvdata(func); if (card == NULL) return; DPRINTK(1, "priv = card->priv\n"); priv = card->priv; netdev = priv->net_dev; if (priv) { ks_wlan_net_stop(netdev); DPRINTK(1, "ks_wlan_net_stop\n"); /* interrupt disable */ sdio_claim_host(func); sdio_writeb(func, 0, INT_ENABLE, &ret); sdio_writeb(func, 0xff, INT_PENDING, &ret); sdio_release_host(func); DPRINTK(1, "interrupt disable\n"); /* send stop request to MAC */ { struct hostif_stop_request_t *pp; pp = (struct hostif_stop_request_t *) kzalloc(hif_align_size(sizeof(*pp)), GFP_KERNEL); if (pp == NULL) { DPRINTK(3, "allocate memory failed..\n"); return; /* to do goto ni suru */ } pp->header.size = cpu_to_le16((uint16_t) (sizeof(*pp) - sizeof(pp->header.size))); pp->header.event = cpu_to_le16((uint16_t) HIF_STOP_REQ); sdio_claim_host(func); write_to_device(priv, (unsigned char *)pp, hif_align_size(sizeof(*pp))); sdio_release_host(func); kfree(pp); } DPRINTK(1, "STOP Req\n"); if (priv->ks_wlan_hw.ks7010sdio_wq) { flush_workqueue(priv->ks_wlan_hw.ks7010sdio_wq); destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq); } DPRINTK(1, "destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);\n"); hostif_exit(priv); DPRINTK(1, "hostif_exit\n"); unregister_netdev(netdev); trx_device_exit(priv); if (priv->ks_wlan_hw.read_buf) { kfree(priv->ks_wlan_hw.read_buf); } free_netdev(priv->net_dev); card->priv = NULL; } sdio_claim_host(func); sdio_release_irq(func); DPRINTK(1, "sdio_release_irq()\n"); sdio_disable_func(func); DPRINTK(1, "sdio_disable_func()\n"); sdio_release_host(func); sdio_set_drvdata(func, NULL); kfree(card); DPRINTK(1, "kfree()\n"); DPRINTK(5, " Bye !!\n"); return; }