On Sunday, 20 of January 2008, Michael Buesch wrote:
> On Sunday 20 January 2008, Rafael J. Wysocki wrote:
> > On Sunday, 13 of January 2008, Alan Stern wrote:
> > > On Sun, 13 Jan 2008, Michael Buesch wrote:
> > >
> > > > > Besides, if you're going to register the device right back again
> > > > > during
> > > > > the subsequent resume, then why go to the trouble of unregistering it
> > > > > during suspend? Why not just leave it registered the whole time and
> > > > > avoid all the complication (and excess meaningless uevents)?
> > > >
> > > > Well, because not doing it complicates code :)
> > > > Currently suspend/resume calls the same code as init/exit.
> > > > The b43 init/exit code is really complicated, compared to other
> > > > drivers, due to dozens of hardware versions. So I just avoided
> > > > having yet other codepaths for suspend/resume. But I will add
> > > > a flag to the device structure that's used to avoid unregistering stuff.
> > >
> > > Instead of adding an extra flag you should refactor the code. Have a
> > > common "enable" subroutine that can be called for both init and resume,
> > > and a common "disable" subroutine that can be called for both exit and
> > > suspend. Then the method routines themselves will contain only the
> > > portions unique to their particular functions, making them shorter and
> > > simpler.
> >
> > Well, it doesn't seem to be that easy.
> >
> > I tried to fix the issue myself and finally obtained the appended,
> > apparently
> > working, patch (against 2.6.24-rc8-mm1). Well, it should have been a series
> > of patches against multiple subsystems, but I thought it would be
> > instructive
> > to put everything needed into one bigger patch for starters.
> >
> > Greetings,
> > Rafael
> >
> > ---
> > drivers/base/power/main.c | 1
> > drivers/base/power/power.h | 1
> > drivers/char/hw_random/core.c | 10 ++++-----
> > drivers/char/misc.c | 13 ++++++++----
> > drivers/leds/led-class.c | 13 ++++++++----
> > drivers/net/wireless/b43/leds.c | 17 +++++++++------
> > drivers/net/wireless/b43/leds.h | 14 +++++++++++--
> > drivers/net/wireless/b43/main.c | 43
> > +++++++++++++++++++++++++++++-----------
> > include/linux/device.h | 6 +++++
> > include/linux/hw_random.h | 10 ++++++++-
> > include/linux/leds.h | 10 ++++++++-
> > include/linux/miscdevice.h | 10 ++++++++-
> > 12 files changed, 111 insertions(+), 37 deletions(-)
> >
> > Index: linux-2.6.24-rc8-mm1/drivers/net/wireless/b43/main.c
> > ===================================================================
> > --- linux-2.6.24-rc8-mm1.orig/drivers/net/wireless/b43/main.c
> > +++ linux-2.6.24-rc8-mm1/drivers/net/wireless/b43/main.c
> > @@ -2470,10 +2470,15 @@ static int b43_rng_read(struct hwrng *rn
> > return (sizeof(u16));
> > }
> >
> > -static void b43_rng_exit(struct b43_wl *wl)
> > +static void __b43_rng_exit(struct b43_wl *wl, bool suspended)
> > {
> > if (wl->rng_initialized)
> > - hwrng_unregister(&wl->rng);
> > + __hwrng_unregister(&wl->rng, suspended);
> > +}
> > +
> > +static void b43_rng_exit(struct b43_wl *wl)
> > +{
> > + __b43_rng_exit(wl, false);
> > }
> >
> > static int b43_rng_init(struct b43_wl *wl)
> > @@ -3289,7 +3294,7 @@ static void b43_set_retry_limits(struct
> >
> > /* Shutdown a wireless core */
> > /* Locking: wl->mutex */
> > -static void b43_wireless_core_exit(struct b43_wldev *dev)
> > +static void __b43_wireless_core_exit(struct b43_wldev *dev, bool
> > no_suspend)
> > {
> > struct b43_phy *phy = &dev->phy;
> >
> > @@ -3298,8 +3303,10 @@ static void b43_wireless_core_exit(struc
> > return;
> > b43_set_status(dev, B43_STAT_UNINIT);
> >
> > - b43_leds_exit(dev);
> > - b43_rng_exit(dev->wl);
> > + if (no_suspend) {
> > + b43_leds_exit(dev);
> > + b43_rng_exit(dev->wl);
> > + }
> > b43_pio_free(dev);
> > b43_dma_free(dev);
> > b43_chip_exit(dev);
> > @@ -3313,8 +3320,13 @@ static void b43_wireless_core_exit(struc
> > ssb_bus_may_powerdown(dev->dev->bus);
> > }
> >
> > +static void b43_wireless_core_exit(struct b43_wldev *dev)
> > +{
> > + __b43_wireless_core_exit(dev, true);
> > +}
>
> Nah, please don't obfuscate the code.
> Better add a flag to struct b43_wldev and check that in the few places
> that need different behaviour.
I can do that, if you prefer, but that will look worse, IMHO.
Thanks,
Rafael
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev