spinlock_t              lock;
        struct if_sdio_packet   *packets;
+
+       struct workqueue_struct *workqueue;
        struct work_struct      packet_worker;
 };
 
 
        spin_unlock_irqrestore(&card->lock, flags);
 
-       schedule_work(&card->packet_worker);
+       queue_work(card->workqueue, &card->packet_worker);
 
        ret = 0;
 
        card->func = func;
        card->model = model;
        spin_lock_init(&card->lock);
+       card->workqueue = create_workqueue("libertas_sdio");
        INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
 
        for (i = 0;i < ARRAY_SIZE(if_sdio_models);i++) {
        return ret;
 
 err_activate_card:
-       flush_scheduled_work();
-       free_netdev(priv->dev);
-       kfree(priv);
+       flush_workqueue(card->workqueue);
+       lbs_remove_card(priv);
 reclaim:
        sdio_claim_host(func);
 release_int:
 release:
        sdio_release_host(func);
 free:
+       destroy_workqueue(card->workqueue);
        while (card->packets) {
                packet = card->packets;
                card->packets = card->packets->next;
        lbs_stop_card(card->priv);
        lbs_remove_card(card->priv);
 
-       flush_scheduled_work();
+       flush_workqueue(card->workqueue);
+       destroy_workqueue(card->workqueue);
 
        sdio_claim_host(func);
        sdio_release_irq(func);