Search Linux Wireless

[PATCH] [v2] wifi: brcmsmac: use generic lists to manage timers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Prefer generic lists over ad-hoc quirks to manage
timers, adjust related code.

Signed-off-by: Dmitry Antipov <dmantipov@xxxxxxxxx>
---
v2: add missing list_del() in removal loop within brcms_free()
---
 .../broadcom/brcm80211/brcmsmac/mac80211_if.c | 36 +++++--------------
 .../broadcom/brcm80211/brcmsmac/mac80211_if.h |  4 +--
 2 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
index 0bd4e679a359..18a06290af1c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
@@ -314,8 +314,8 @@ static void brcms_free(struct brcms_info *wl)
 		schedule();
 
 	/* free timers */
-	for (t = wl->timers; t; t = next) {
-		next = t->next;
+	list_for_each_entry_safe(t, next, &wl->timers, list) {
+		list_del(&t->list);
 #ifdef DEBUG
 		kfree(t->name);
 #endif
@@ -1152,6 +1152,8 @@ static struct brcms_info *brcms_attach(struct bcma_device *pdev)
 	spin_lock_init(&wl->lock);
 	spin_lock_init(&wl->isr_lock);
 
+	INIT_LIST_HEAD(&wl->timers);
+
 	/* common load-time initialization */
 	wl->wlc = brcms_c_attach((void *)wl, pdev, unit, false, &err);
 	if (!wl->wlc) {
@@ -1502,8 +1504,7 @@ struct brcms_timer *brcms_init_timer(struct brcms_info *wl,
 	t->wl = wl;
 	t->fn = fn;
 	t->arg = arg;
-	t->next = wl->timers;
-	wl->timers = t;
+	list_add(&t->list, &wl->timers);
 
 #ifdef DEBUG
 	t->name = kstrdup(name, GFP_ATOMIC);
@@ -1561,35 +1562,14 @@ bool brcms_del_timer(struct brcms_timer *t)
  */
 void brcms_free_timer(struct brcms_timer *t)
 {
-	struct brcms_info *wl = t->wl;
-	struct brcms_timer *tmp;
-
 	/* delete the timer in case it is active */
 	brcms_del_timer(t);
 
-	if (wl->timers == t) {
-		wl->timers = wl->timers->next;
+	list_del(&t->list);
 #ifdef DEBUG
-		kfree(t->name);
+	kfree(t->name);
 #endif
-		kfree(t);
-		return;
-
-	}
-
-	tmp = wl->timers;
-	while (tmp) {
-		if (tmp->next == t) {
-			tmp->next = t->next;
-#ifdef DEBUG
-			kfree(t->name);
-#endif
-			kfree(t);
-			return;
-		}
-		tmp = tmp->next;
-	}
-
+	kfree(t);
 }
 
 /*
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.h
index eaf926a96a88..c2c3d90f4ed3 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.h
@@ -41,7 +41,7 @@ struct brcms_timer {
 	uint ms;
 	bool periodic;
 	bool set;		/* indicates if timer is active */
-	struct brcms_timer *next;	/* for freeing on unload */
+	struct list_head list;	/* for freeing on unload */
 #ifdef DEBUG
 	char *name;		/* Description of the timer */
 #endif
@@ -75,7 +75,7 @@ struct brcms_info {
 
 	/* timer related fields */
 	atomic_t callbacks;	/* # outstanding callback functions */
-	struct brcms_timer *timers;	/* timer cleanup queue */
+	struct list_head timers;	/* timer cleanup queue */
 
 	struct tasklet_struct tasklet;	/* dpc tasklet */
 	bool resched;		/* dpc needs to be and is rescheduled */
-- 
2.41.0




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux