Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Nov 2006 12:12:06 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        Stepan Zastupov <redchrom@gmail.com>
Cc:        acpi@freebsd.org
Subject:   Re: Add suspend/resume support for the bfe driver
Message-ID:  <200611201212.07578.jhb@freebsd.org>
In-Reply-To: <20061118033649.GA870@stepan.ispsystem.net>
References:  <20061117172102.GA836@stepan.ispsystem.net> <200611171412.35214.john@baldwin.cx> <20061118033649.GA870@stepan.ispsystem.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 17 November 2006 22:42, Stepan Zastupov wrote:
> On Fri, Nov 17, 2006 at 02:12:34PM -0500, John Baldwin wrote:
> > Usually drivers don't detach on suspend.  How about this patch instead:
> > 
> > Index: if_bfe.c
> > ===================================================================
> > RCS file: /usr/cvs/src/sys/dev/bfe/if_bfe.c,v
> > retrieving revision 1.40
> > diff -u -r1.40 if_bfe.c
> > --- if_bfe.c	28 May 2006 20:35:39 -0000	1.40
> > +++ if_bfe.c	17 Nov 2006 19:11:47 -0000
> > @@ -87,6 +87,8 @@
> >  static int  bfe_probe				(device_t);
> >  static int  bfe_attach				(device_t);
> >  static int  bfe_detach				(device_t);
> > +static int  bfe_suspend				(device_t);
> > +static int  bfe_resume				(device_t);
> >  static void bfe_release_resources	(struct bfe_softc *);
> >  static void bfe_intr				(void *);
> >  static void bfe_start				(struct ifnet *);
> > @@ -136,6 +138,8 @@
> >  	DEVMETHOD(device_attach,	bfe_attach),
> >  	DEVMETHOD(device_detach,	bfe_detach),
> >  	DEVMETHOD(device_shutdown,	bfe_shutdown),
> > +	DEVMETHOD(device_suspend,	bfe_suspend),
> > +	DEVMETHOD(device_resume,	bfe_resume),
> >  
> >  	/* bus interface */
> >  	DEVMETHOD(bus_print_child,	bus_generic_print_child),
> > @@ -480,6 +484,39 @@
> >  }
> >  
> >  static int
> > +bfe_suspend(device_t dev)
> > +{
> > +	struct bfe_softc *sc;
> > +
> > +	sc = device_get_softc(dev);
> > +	BFE_LOCK(sc);
> > +	bfe_stop(sc);
> > +	BFE_UNLOCK(sc);
> > +
> > +	return (0);
> > +}
> > +
> > +static int
> > +bfe_resume(device_t dev)
> > +{
> > +	struct bfe_softc *sc;
> > +	struct ifnet *ifp;
> > +
> > +	sc = device_get_softc(dev);
> > +	ifp = sc->bfe_ifp;
> > +	BFE_LOCK(sc);
> > +	if (ifp->if_flags & IFF_UP) {
> > +		bfe_init_locked(sc);
> > +		if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
> > +		    !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
> > +			bfe_start_locked(ifp);
> > +	}
> > +	BFE_UNLOCK(sc);
> > +
> > +	return (0);
> > +}
> > +
> > +static int
> >  bfe_miibus_readreg(device_t dev, int phy, int reg)
> >  {
> >  	struct bfe_softc *sc;
> > 
> > -- 
> > John Baldwin
> No, system don't want to resume with it. I've tried the same variant
> before I looked into the Linux kernel.

How does it not work?  If you do 'ifconfig bfe0 down ; ifconfig bfe0 up' after 
resume with the above patch does it then start working?

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611201212.07578.jhb>