From: John W. Linville <linville@tuxdriver.com>
To: Seth Forshee <seth.forshee@gmail.com>
Cc: Oleksij Rempel <bug-track@fisher-privat.net>,
b43-dev@lists.infradead.org,
Stefano Brivio <stefano.brivio@polimi.it>,
Larry Finger <Larry.Finger@lwfinger.net>,
linux-wireless@vger.kernel.org
Subject: [PATCH 1/1] b43: do not call ieee80211_unregister_hw if we are not registred
Date: Tue, 5 Jun 2012 14:24:10 -0400 [thread overview]
Message-ID: <20120605182410.GA1937@tuxdriver.com> (raw)
In-Reply-To: <20120605164945.GB18176@thinkpad-t410>
Could someone repost a clean version to linux-wireless at vger.kernel.org?
On Tue, Jun 05, 2012 at 11:49:45AM -0500, Seth Forshee wrote:
> (I don't have access to the original message, so I appologize if any
> Cc's were dropped. I added some additional Cc's.)
>
> On Fri, Jun 01, 2012 at 09:37:20AM +0200, Oleksij Rempel wrote:
> > this patch fixes kernel Oops on "rmmod b43" if firmware was not loaded:
> >
> > BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
> > IP: [<ffffffff8104e988>] drain_workqueue+0x25/0x142
> > PGD 153ac6067 PUD 153b82067 PMD 0
> > Oops: 0000 [#1] SMP
> >
> > Signed-off-by: Oleksij Rempel <bug-track-M18mAb7Tlt0yCq4wW13eYl6hYfS7NtTn@public.gmane.org>
>
> This issue is affecting the Ubuntu installer, and I've verified the
> patch fixes the problem on a Mac Mini 5,2.
>
> Tested-by: Seth Forshee <seth.forshee@canonical.com>
>
> This issue affects 3.4, probably introduced in 6b6fa58 (b43: Load
> firmware from a work queue and not from the probe routine), so I'd
> suggest a Cc for stable also be added.
>
> > ---
> > drivers/net/wireless/b43/b43.h | 4 ++++
> > drivers/net/wireless/b43/main.c | 19 ++++++++++++-------
> > 2 files changed, 16 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
> > index 67c13af..c06b6cb 100644
> > --- a/drivers/net/wireless/b43/b43.h
> > +++ b/drivers/net/wireless/b43/b43.h
> > @@ -877,6 +877,10 @@ struct b43_wl {
> > * from the mac80211 subsystem. */
> > u16 mac80211_initially_registered_queues;
> >
> > + /* Set this if we call ieee80211_register_hw() and check if we call
> > + * ieee80211_unregister_hw(). */
> > + bool hw_registred;
> > +
> > /* We can only have one operating interface (802.11 core)
> > * at a time. General information about this interface follows.
> > */
> > diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
> > index e4d6dc2..747079b 100644
> > --- a/drivers/net/wireless/b43/main.c
> > +++ b/drivers/net/wireless/b43/main.c
> > @@ -2437,6 +2437,7 @@ start_ieee80211:
> > err = ieee80211_register_hw(wl->hw);
> > if (err)
> > goto err_one_core_detach;
> > + wl->hw_registred = true;
> > b43_leds_register(wl->current_dev);
> > goto out;
> >
> > @@ -5283,6 +5284,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
> >
> > hw->queues = modparam_qos ? B43_QOS_QUEUE_NUM : 1;
> > wl->mac80211_initially_registered_queues = hw->queues;
> > + wl->hw_registred = false;
> > hw->max_rates = 2;
> > SET_IEEE80211_DEV(hw, dev->dev);
> > if (is_valid_ether_addr(sprom->et1mac))
> > @@ -5354,12 +5356,15 @@ static void b43_bcma_remove(struct bcma_device *core)
> > * as the ieee80211 unreg will destroy the workqueue. */
> > cancel_work_sync(&wldev->restart_work);
> >
> > - /* Restore the queues count before unregistering, because firmware detect
> > - * might have modified it. Restoring is important, so the networking
> > - * stack can properly free resources. */
> > - wl->hw->queues = wl->mac80211_initially_registered_queues;
> > - b43_leds_stop(wldev);
> > - ieee80211_unregister_hw(wl->hw);
> > + B43_WARN_ON(!wl);
> > + if (wl->current_dev == wldev && wl->hw_registred) {
> > + /* Restore the queues count before unregistering, because firmware detect
> > + * might have modified it. Restoring is important, so the networking
> > + * stack can properly free resources. */
> > + wl->hw->queues = wl->mac80211_initially_registered_queues;
> > + b43_leds_stop(wldev);
> > + ieee80211_unregister_hw(wl->hw);
> > + }
> >
> > b43_one_core_detach(wldev->dev);
> >
> > @@ -5430,7 +5435,7 @@ static void b43_ssb_remove(struct ssb_device *sdev)
> > cancel_work_sync(&wldev->restart_work);
> >
> > B43_WARN_ON(!wl);
> > - if (wl->current_dev == wldev) {
> > + if (wl->current_dev == wldev && wl->hw_registred) {
> > /* Restore the queues count before unregistering, because firmware detect
> > * might have modified it. Restoring is important, so the networking
> > * stack can properly free resources. */
> > --
> > 1.7.9.5
> >
>
--
John W. Linville Someday the world will need a hero, and you
linville at tuxdriver.com might be all we have. Be ready.
WARNING: multiple messages have this Message-ID (diff)
From: "John W. Linville" <linville@tuxdriver.com>
To: Seth Forshee <seth.forshee@gmail.com>
Cc: Oleksij Rempel <bug-track@fisher-privat.net>,
b43-dev@lists.infradead.org,
Stefano Brivio <stefano.brivio@polimi.it>,
Larry Finger <Larry.Finger@lwfinger.net>,
linux-wireless@vger.kernel.org
Subject: Re: [PATCH 1/1] b43: do not call ieee80211_unregister_hw if we are not registred
Date: Tue, 5 Jun 2012 14:24:10 -0400 [thread overview]
Message-ID: <20120605182410.GA1937@tuxdriver.com> (raw)
In-Reply-To: <20120605164945.GB18176@thinkpad-t410>
Could someone repost a clean version to linux-wireless@vger.kernel.org?
On Tue, Jun 05, 2012 at 11:49:45AM -0500, Seth Forshee wrote:
> (I don't have access to the original message, so I appologize if any
> Cc's were dropped. I added some additional Cc's.)
>
> On Fri, Jun 01, 2012 at 09:37:20AM +0200, Oleksij Rempel wrote:
> > this patch fixes kernel Oops on "rmmod b43" if firmware was not loaded:
> >
> > BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
> > IP: [<ffffffff8104e988>] drain_workqueue+0x25/0x142
> > PGD 153ac6067 PUD 153b82067 PMD 0
> > Oops: 0000 [#1] SMP
> >
> > Signed-off-by: Oleksij Rempel <bug-track-M18mAb7Tlt0yCq4wW13eYl6hYfS7NtTn@public.gmane.org>
>
> This issue is affecting the Ubuntu installer, and I've verified the
> patch fixes the problem on a Mac Mini 5,2.
>
> Tested-by: Seth Forshee <seth.forshee@canonical.com>
>
> This issue affects 3.4, probably introduced in 6b6fa58 (b43: Load
> firmware from a work queue and not from the probe routine), so I'd
> suggest a Cc for stable also be added.
>
> > ---
> > drivers/net/wireless/b43/b43.h | 4 ++++
> > drivers/net/wireless/b43/main.c | 19 ++++++++++++-------
> > 2 files changed, 16 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
> > index 67c13af..c06b6cb 100644
> > --- a/drivers/net/wireless/b43/b43.h
> > +++ b/drivers/net/wireless/b43/b43.h
> > @@ -877,6 +877,10 @@ struct b43_wl {
> > * from the mac80211 subsystem. */
> > u16 mac80211_initially_registered_queues;
> >
> > + /* Set this if we call ieee80211_register_hw() and check if we call
> > + * ieee80211_unregister_hw(). */
> > + bool hw_registred;
> > +
> > /* We can only have one operating interface (802.11 core)
> > * at a time. General information about this interface follows.
> > */
> > diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
> > index e4d6dc2..747079b 100644
> > --- a/drivers/net/wireless/b43/main.c
> > +++ b/drivers/net/wireless/b43/main.c
> > @@ -2437,6 +2437,7 @@ start_ieee80211:
> > err = ieee80211_register_hw(wl->hw);
> > if (err)
> > goto err_one_core_detach;
> > + wl->hw_registred = true;
> > b43_leds_register(wl->current_dev);
> > goto out;
> >
> > @@ -5283,6 +5284,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
> >
> > hw->queues = modparam_qos ? B43_QOS_QUEUE_NUM : 1;
> > wl->mac80211_initially_registered_queues = hw->queues;
> > + wl->hw_registred = false;
> > hw->max_rates = 2;
> > SET_IEEE80211_DEV(hw, dev->dev);
> > if (is_valid_ether_addr(sprom->et1mac))
> > @@ -5354,12 +5356,15 @@ static void b43_bcma_remove(struct bcma_device *core)
> > * as the ieee80211 unreg will destroy the workqueue. */
> > cancel_work_sync(&wldev->restart_work);
> >
> > - /* Restore the queues count before unregistering, because firmware detect
> > - * might have modified it. Restoring is important, so the networking
> > - * stack can properly free resources. */
> > - wl->hw->queues = wl->mac80211_initially_registered_queues;
> > - b43_leds_stop(wldev);
> > - ieee80211_unregister_hw(wl->hw);
> > + B43_WARN_ON(!wl);
> > + if (wl->current_dev == wldev && wl->hw_registred) {
> > + /* Restore the queues count before unregistering, because firmware detect
> > + * might have modified it. Restoring is important, so the networking
> > + * stack can properly free resources. */
> > + wl->hw->queues = wl->mac80211_initially_registered_queues;
> > + b43_leds_stop(wldev);
> > + ieee80211_unregister_hw(wl->hw);
> > + }
> >
> > b43_one_core_detach(wldev->dev);
> >
> > @@ -5430,7 +5435,7 @@ static void b43_ssb_remove(struct ssb_device *sdev)
> > cancel_work_sync(&wldev->restart_work);
> >
> > B43_WARN_ON(!wl);
> > - if (wl->current_dev == wldev) {
> > + if (wl->current_dev == wldev && wl->hw_registred) {
> > /* Restore the queues count before unregistering, because firmware detect
> > * might have modified it. Restoring is important, so the networking
> > * stack can properly free resources. */
> > --
> > 1.7.9.5
> >
>
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
next prev parent reply other threads:[~2012-06-05 18:24 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-01 7:37 [PATCH 0/1 ] b43: do not call ieee80211_unregister_hw if we are not registred Oleksij Rempel
2012-06-01 7:37 ` [PATCH 1/1] " Oleksij Rempel
2012-06-05 16:49 ` Seth Forshee
2012-06-05 16:49 ` Seth Forshee
2012-06-05 18:24 ` John W. Linville [this message]
2012-06-05 18:24 ` John W. Linville
2012-06-05 18:53 ` [PATCH] " Seth Forshee
2012-06-05 18:53 ` Seth Forshee
-- strict thread matches above, loose matches on Subject: below --
2012-06-05 18:39 [PATCH 0/1 ] " Oleksij Rempel
2012-06-05 18:39 ` [PATCH 1/1] " Oleksij Rempel
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=20120605182410.GA1937@tuxdriver.com \
--to=linville@tuxdriver.com \
--cc=Larry.Finger@lwfinger.net \
--cc=b43-dev@lists.infradead.org \
--cc=bug-track@fisher-privat.net \
--cc=linux-wireless@vger.kernel.org \
--cc=seth.forshee@gmail.com \
--cc=stefano.brivio@polimi.it \
/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.