From: Michael Buesch <mb@bu3sch.de>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: Broadcom Wireless <bcm43xx-dev@lists.berlios.de>,
"linux-wireless" <linux-wireless@vger.kernel.org>,
Larry Finger <Larry.Finger@lwfinger.net>
Subject: [PATCH] b43: Don't abuse wl->current_dev in the led work
Date: Mon, 14 Sep 2009 23:22:08 +0200 [thread overview]
Message-ID: <200909142322.09152.mb@bu3sch.de> (raw)
Don't abuse wl->current_dev in the LED work for checking whether we're
going down. Add an explicit variable.
This fixes a crash on rmmod dereferencing the wl->current_dev NULL pointer
in various other places of the driver.
Signed-off-by: Michael Buesch <mb@bu3sch.de>
---
Note to self: Don't try to safe a byte of memory :)
Index: wireless-testing/drivers/net/wireless/b43/leds.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/b43/leds.c 2009-09-14 22:42:05.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/leds.c 2009-09-14 23:15:39.000000000 +0200
@@ -112,10 +112,7 @@ static void b43_led_brightness_set(struc
struct b43_led *led = container_of(led_dev, struct b43_led, led_dev);
struct b43_wl *wl = led->wl;
- /* The check for current_dev is only needed while unregistering,
- * so it is sequencial and does not race. But we must not dereference
- * current_dev here. */
- if (likely(wl->current_dev)) {
+ if (likely(!wl->leds.stop)) {
atomic_set(&led->state, brightness);
ieee80211_queue_work(wl->hw, &wl->leds.work);
}
@@ -314,6 +311,8 @@ void b43_leds_init(struct b43_wldev *dev
break;
}
}
+
+ dev->wl->leds.stop = 0;
}
void b43_leds_exit(struct b43_wldev *dev)
Index: wireless-testing/drivers/net/wireless/b43/leds.h
===================================================================
--- wireless-testing.orig/drivers/net/wireless/b43/leds.h 2009-09-14 22:42:05.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/leds.h 2009-09-14 23:13:38.000000000 +0200
@@ -35,6 +35,7 @@ struct b43_leds {
struct b43_led led_radio;
struct b43_led led_assoc;
+ bool stop;
struct work_struct work;
};
Index: wireless-testing/drivers/net/wireless/b43/main.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-09-14 23:11:17.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/main.c 2009-09-14 23:14:39.000000000 +0200
@@ -4987,7 +4987,7 @@ static void b43_remove(struct ssb_device
* might have modified it. Restoring is important, so the networking
* stack can properly free resources. */
wl->hw->queues = wl->mac80211_initially_registered_queues;
- wl->current_dev = NULL;
+ wl->leds.stop = 1;
cancel_work_sync(&wl->leds.work);
ieee80211_unregister_hw(wl->hw);
}
--
Greetings, Michael.
next reply other threads:[~2009-09-14 21:22 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-14 21:22 Michael Buesch [this message]
2009-09-14 22:58 ` [PATCH] b43: Don't abuse wl->current_dev in the led work Larry Finger
2009-09-15 9:49 ` Michael Buesch
2009-09-15 13:27 ` Larry Finger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200909142322.09152.mb@bu3sch.de \
--to=mb@bu3sch.de \
--cc=Larry.Finger@lwfinger.net \
--cc=bcm43xx-dev@lists.berlios.de \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.