@@ -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);
}
/*
@@ -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 */
Prefer generic lists over ad-hoc quirks to manage timers, adjust related code. Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- 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(-)