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