|
@@ -95,6 +95,8 @@ struct if_sdio_card {
|
|
|
|
|
|
spinlock_t lock;
|
|
|
struct if_sdio_packet *packets;
|
|
|
+
|
|
|
+ struct workqueue_struct *workqueue;
|
|
|
struct work_struct packet_worker;
|
|
|
};
|
|
|
|
|
@@ -746,7 +748,7 @@ static int if_sdio_host_to_card(struct lbs_private *priv,
|
|
|
|
|
|
spin_unlock_irqrestore(&card->lock, flags);
|
|
|
|
|
|
- schedule_work(&card->packet_worker);
|
|
|
+ queue_work(card->workqueue, &card->packet_worker);
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
@@ -836,6 +838,7 @@ static int if_sdio_probe(struct sdio_func *func,
|
|
|
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++) {
|
|
@@ -933,9 +936,8 @@ out:
|
|
|
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:
|
|
@@ -945,6 +947,7 @@ disable:
|
|
|
release:
|
|
|
sdio_release_host(func);
|
|
|
free:
|
|
|
+ destroy_workqueue(card->workqueue);
|
|
|
while (card->packets) {
|
|
|
packet = card->packets;
|
|
|
card->packets = card->packets->next;
|
|
@@ -971,7 +974,8 @@ static void if_sdio_remove(struct sdio_func *func)
|
|
|
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);
|