/** * This function frees the WL per-device resources. * * This function frees resources owned by the WL device pointed to * by the wl parameter. * * precondition: can both be called locked and unlocked * */ static void brcms_free(struct brcms_info *wl) { struct brcms_timer *t, *next; /* free ucode data */ if (wl->fw.fw_cnt) brcms_ucode_data_free(); if (wl->irq) free_irq(wl->irq, wl); /* kill dpc */ tasklet_kill(&wl->tasklet); if (wl->pub) { brcms_c_module_unregister(wl->pub, "linux", wl); } /* free common resources */ if (wl->wlc) { brcms_c_detach(wl->wlc); wl->wlc = NULL; wl->pub = NULL; } /* virtual interface deletion is deferred so we cannot spinwait */ /* wait for all pending callbacks to complete */ while (atomic_read(&wl->callbacks) > 0) schedule(); /* free timers */ for (t = wl->timers; t; t = next) { next = t->next; #ifdef BCMDBG kfree(t->name); #endif kfree(t); } /* * unregister_netdev() calls get_stats() which may read chip registers * so we cannot unmap the chip registers until after calling unregister_netdev() . */ if (wl->regsva && wl->bcm_bustype != SDIO_BUS && wl->bcm_bustype != JTAG_BUS) { iounmap((void *)wl->regsva); } wl->regsva = NULL; }
/** * This function frees the WL per-device resources. * * This function frees resources owned by the WL device pointed to * by the wl parameter. * * precondition: can both be called locked and unlocked * */ static void brcms_free(struct brcms_info *wl) { struct brcms_timer *t, *next; /* free ucode data */ if (wl->fw.fw_cnt) brcms_ucode_data_free(&wl->ucode); if (wl->irq) free_irq(wl->irq, wl); /* kill dpc */ tasklet_kill(&wl->tasklet); if (wl->pub) { brcms_debugfs_detach(wl->pub); brcms_c_module_unregister(wl->pub, "linux", wl); } /* free common resources */ if (wl->wlc) { brcms_c_detach(wl->wlc); wl->wlc = NULL; wl->pub = NULL; } /* virtual interface deletion is deferred so we cannot spinwait */ /* wait for all pending callbacks to complete */ while (atomic_read(&wl->callbacks) > 0) schedule(); /* free timers */ for (t = wl->timers; t; t = next) { next = t->next; #ifdef DEBUG kfree(t->name); #endif kfree(t); } }