2010-03-29 15:14:45

by Daniel Mack

[permalink] [raw]
Subject: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

The libertas driver calls wiphy_unregister() without a prior
wiphy_register() when a devices fails initialization. Fix this by
introducing a private flag.

[ 9.310000] Unable to handle kernel NULL pointer dereference at virtual address 00000000

[...]

[ 9.330000] [<c0311310>] (wiphy_unregister+0xfc/0x19c) from [<bf00c9ec>] (lbs_cfg_free+0x70/0x9c [libertas])
[ 9.330000] [<bf00c9ec>] (lbs_cfg_free+0x70/0x9c [libertas]) from [<bf014fdc>] (lbs_remove_card+0x180/0x210 [libertas])
[ 9.330000] [<bf014fdc>] (lbs_remove_card+0x180/0x210 [libertas]) from [<bf035394>] (if_sdio_probe+0xdc4/0xef4 [libertas_sdio])
[ 9.330000] [<bf035394>] (if_sdio_probe+0xdc4/0xef4 [libertas_sdio]) from [<c0230d14>] (sdio_bus_probe+0xd4/0xf0)
[ 9.330000] [<c0230d14>] (sdio_bus_probe+0xd4/0xf0) from [<c01a6034>] (driver_probe_device+0xa4/0x174)
[ 9.330000] [<c01a6034>] (driver_probe_device+0xa4/0x174) from [<c01a6164>] (__driver_attach+0x60/0x84)
[ 9.330000] [<c01a6164>] (__driver_attach+0x60/0x84) from [<c01a5854>] (bus_for_each_dev+0x4c/0x8c)
[ 9.330000] [<c01a5854>] (bus_for_each_dev+0x4c/0x8c) from [<c01a50e4>] (bus_add_driver+0xa0/0x228)
[ 9.330000] [<c01a50e4>] (bus_add_driver+0xa0/0x228) from [<c01a6470>] (driver_register+0xc0/0x150)
[ 9.330000] [<c01a6470>] (driver_register+0xc0/0x150) from [<bf03a06c>] (if_sdio_init_module+0x6c/0x108 [libertas_sdio])
[ 9.330000] [<bf03a06c>] (if_sdio_init_module+0x6c/0x108 [libertas_sdio]) from [<c00263ac>] (do_one_initcall+0x5c/0x1bc)
[ 9.330000] [<c00263ac>] (do_one_initcall+0x5c/0x1bc) from [<c0069f80>] (sys_init_module+0xc0/0x1f0)
[ 9.330000] [<c0069f80>] (sys_init_module+0xc0/0x1f0) from [<c0026f00>] (ret_fast_syscall+0x0/0x30)

Signed-off-by: Daniel Mack <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: John W. Linville <[email protected]>
Cc: Holger Schurig <[email protected]>
Cc: Bing Zhao <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
drivers/net/wireless/libertas/cfg.c | 8 ++++++--
drivers/net/wireless/libertas/dev.h | 1 +
2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index 4396dcc..82ebe14 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -172,6 +172,8 @@ int lbs_cfg_register(struct lbs_private *priv)
if (ret < 0)
lbs_pr_err("cannot register wiphy device\n");

+ priv->wiphy_registered = true;
+
ret = register_netdev(priv->dev);
if (ret)
lbs_pr_err("cannot register network device\n");
@@ -190,9 +192,11 @@ void lbs_cfg_free(struct lbs_private *priv)
if (!wdev)
return;

- if (wdev->wiphy) {
+ if (priv->wiphy_registered)
wiphy_unregister(wdev->wiphy);
+
+ if (wdev->wiphy)
wiphy_free(wdev->wiphy);
- }
+
kfree(wdev);
}
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 6977ee8..6875e14 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -36,6 +36,7 @@ struct lbs_private {

/* CFG80211 */
struct wireless_dev *wdev;
+ bool wiphy_registered;

/* Mesh */
struct net_device *mesh_dev; /* Virtual device */
--
1.7.0



2010-03-30 08:52:58

by Daniel Mack

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

On Tue, Mar 30, 2010 at 08:49:07AM +0200, Holger Schurig wrote:
> > The libertas driver calls wiphy_unregister() without a prior
> > wiphy_register() when a devices fails initialization. Fix this by
> > introducing a private flag.
>
> Nice.
>
> However, I wonder: do we really need a private variable? Does each driver
> introduce a private variable for this?

I didn't check other drivers thoroughly. I just saw the comment on the
function which does the wiphy allocation and considered libertas to be
special in the way it deals with the wireless core:

/*
* At this time lbs_private *priv doesn't even exist, so we just allocate
* memory and don't initialize the wiphy further. This is postponed until we
* can talk to the firmware and happens at registration time in
* lbs_cfg_wiphy_register().
*/

And as I didn't find any function to tell me whether a wiphy has been
registered and not just allocated, I saw no other way than manually
track what the libertas driver does.

If there's any better solution, I'd happily test it.

Thanks,
Daniel


2010-03-30 10:58:23

by Holger Schurig

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

> I don't get your point. The patch I submitted fixes an Ooops in the
> driver, due to wrong handling of an API. What does that have to do with
> principle discussions about the frameworks in use?

I asked if there is a better method, and you said that you would test a better
solution. That means that someone else should make a better solution.

I just pointed out that I won't be the one who creates the better solution,
because for fundamental reasons I don't see the libertas+cfg80211 approach
going forward. That issue has nothing to do with you or your patch, so please
don't feel offended or confused.


Basically, I neither ack nor nak you patch. Given that it fixes an oops the
patch should go in, and probably to stable at well. I just gave a hint, to
make you think if you could come up with something better.



BTW, testing/fixing of failure paths in libertas as well as simplifying the
call sequence of functions during initialisation could be quite useful.

2010-03-30 09:48:14

by Holger Schurig

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

> If there's any better solution, I'd happily test it.

Not from me, unfortunately. I'm not really interested into getting full
cfg80211 into Libertas. That is, until either _one_ of this two options
happen:

* someone that actually uses/wants the proprietary Libertas mesh steps
forward and says "We'll look after this and make it work with cfg80211"
* we remove the proprietary Libertas mesh support

That is: I won't work on Libertas mesh. I can't justify this time investment
with my employer for something that I'll never need. For my device, my own
version of Libertas + cfg80211 (without any WEXT anymore) works quite nice.


So, if neither of the above things happens, then Libertas will work for the
rest of the world with WEXT, as it did before.

2010-03-30 10:50:54

by Daniel Mack

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

On Tue, Mar 30, 2010 at 11:49:13AM +0200, Holger Schurig wrote:
> > If there's any better solution, I'd happily test it.
>
> Not from me, unfortunately. I'm not really interested into getting full
> cfg80211 into Libertas. That is, until either _one_ of this two options
> happen:
>
> * someone that actually uses/wants the proprietary Libertas mesh steps
> forward and says "We'll look after this and make it work with cfg80211"
> * we remove the proprietary Libertas mesh support
>
> That is: I won't work on Libertas mesh. I can't justify this time investment
> with my employer for something that I'll never need. For my device, my own
> version of Libertas + cfg80211 (without any WEXT anymore) works quite nice.
>
>
> So, if neither of the above things happens, then Libertas will work for the
> rest of the world with WEXT, as it did before.

I don't get your point. The patch I submitted fixes an Ooops in the
driver, due to wrong handling of an API. What does that have to do with
principle discussions about the frameworks in use?

Daniel


2010-03-30 06:48:07

by Holger Schurig

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

> The libertas driver calls wiphy_unregister() without a prior
> wiphy_register() when a devices fails initialization. Fix this by
> introducing a private flag.

Nice.

However, I wonder: do we really need a private variable? Does each driver
introduce a private variable for this?

2010-03-30 17:30:12

by John W. Linville

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

On Tue, Mar 30, 2010 at 10:04:33AM -0700, Dan Williams wrote:
> On Tue, 2010-03-30 at 12:59 +0200, Holger Schurig wrote:
> > > I don't get your point. The patch I submitted fixes an Ooops in the
> > > driver, due to wrong handling of an API. What does that have to do with
> > > principle discussions about the frameworks in use?
> >
> > I asked if there is a better method, and you said that you would test a better
> > solution. That means that someone else should make a better solution.
> >
> > I just pointed out that I won't be the one who creates the better solution,
> > because for fundamental reasons I don't see the libertas+cfg80211 approach
> > going forward. That issue has nothing to do with you or your patch, so please
> > don't feel offended or confused.
>
> Fine; just rip out the mesh code and do the vanilla cfg80211 conversion
> for infra & adhoc, and we'll add the mesh code back later. I don't have
> time to do the cfg80211 bits, neither do the OLPC guys (AFAIK), so lets
> take advantage of your willingness to do this and just move the driver
> forward.

Someone post a feature removal patch, please?

John
--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.

2010-03-30 17:09:45

by Dan Williams

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

On Tue, 2010-03-30 at 12:59 +0200, Holger Schurig wrote:
> > I don't get your point. The patch I submitted fixes an Ooops in the
> > driver, due to wrong handling of an API. What does that have to do with
> > principle discussions about the frameworks in use?
>
> I asked if there is a better method, and you said that you would test a better
> solution. That means that someone else should make a better solution.
>
> I just pointed out that I won't be the one who creates the better solution,
> because for fundamental reasons I don't see the libertas+cfg80211 approach
> going forward. That issue has nothing to do with you or your patch, so please
> don't feel offended or confused.

Fine; just rip out the mesh code and do the vanilla cfg80211 conversion
for infra & adhoc, and we'll add the mesh code back later. I don't have
time to do the cfg80211 bits, neither do the OLPC guys (AFAIK), so lets
take advantage of your willingness to do this and just move the driver
forward.

Dan

>
> Basically, I neither ack nor nak you patch. Given that it fixes an oops the
> patch should go in, and probably to stable at well. I just gave a hint, to
> make you think if you could come up with something better.
>
>
>
> BTW, testing/fixing of failure paths in libertas as well as simplifying the
> call sequence of functions during initialisation could be quite useful.
>
> _______________________________________________
> libertas-dev mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/libertas-dev



2010-04-08 19:15:24

by John W. Linville

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

On Tue, Mar 30, 2010 at 01:20:08PM -0400, John W. Linville wrote:
> On Tue, Mar 30, 2010 at 10:04:33AM -0700, Dan Williams wrote:
> > On Tue, 2010-03-30 at 12:59 +0200, Holger Schurig wrote:
> > > > I don't get your point. The patch I submitted fixes an Ooops in the
> > > > driver, due to wrong handling of an API. What does that have to do with
> > > > principle discussions about the frameworks in use?
> > >
> > > I asked if there is a better method, and you said that you would test a better
> > > solution. That means that someone else should make a better solution.
> > >
> > > I just pointed out that I won't be the one who creates the better solution,
> > > because for fundamental reasons I don't see the libertas+cfg80211 approach
> > > going forward. That issue has nothing to do with you or your patch, so please
> > > don't feel offended or confused.
> >
> > Fine; just rip out the mesh code and do the vanilla cfg80211 conversion
> > for infra & adhoc, and we'll add the mesh code back later. I don't have
> > time to do the cfg80211 bits, neither do the OLPC guys (AFAIK), so lets
> > take advantage of your willingness to do this and just move the driver
> > forward.
>
> Someone post a feature removal patch, please?

Ping?

--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.

2010-04-09 13:51:00

by Holger Schurig

[permalink] [raw]
Subject: Re: [PATCH] net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register()

> Ping?

Pong.

I'm a bit swamped with other stuff, so I can't do that right now. That's the
pity of someone who can only use this-and-then on kernel projects.