On Wed, Sep 21, 2016 at 02:23:57PM +0200, Mark Kettenis wrote:
> > Date: Wed, 21 Sep 2016 21:42:36 +1000
> > From: Jonathan Gray <j...@jsg.id.au>
> > 
> > On Wed, Sep 21, 2016 at 01:22:04PM +0200, Mark Kettenis wrote:
> > > Here is the promised diff that makes fec(4) call mii_tick() like all
> > > our other ethernet drivers that use mii do.
> > > 
> > > Does this fix your problem Philip?
> > 
> > Isn't this missing a call to timeout_add_sec() outside of
> > fec_tick()?
> 
> Right.  Updated diff (for real now).

ok jsg@

> 
> Index: sys/arch/armv7/imx/if_fec.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/armv7/imx/if_fec.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 if_fec.c
> --- sys/arch/armv7/imx/if_fec.c       21 Sep 2016 10:28:47 -0000      1.17
> +++ sys/arch/armv7/imx/if_fec.c       21 Sep 2016 12:16:28 -0000
> @@ -231,6 +231,7 @@ struct fec_softc {
>       struct fec_buffer       *rx_buffer_base;
>       int                     cur_tx;
>       int                     cur_rx;
> +     struct timeout          sc_tick;
>  };
>  
>  struct fec_softc *fec_sc;
> @@ -249,6 +250,7 @@ void fec_iff(struct fec_softc *);
>  struct mbuf * fec_newbuf(void);
>  int fec_intr(void *);
>  void fec_recv(struct fec_softc *);
> +void fec_tick(void *);
>  int fec_miibus_readreg(struct device *, int, int);
>  void fec_miibus_writereg(struct device *, int, int, int);
>  void fec_miibus_statchg(struct device *);
> @@ -430,6 +432,8 @@ fec_attach(struct device *parent, struct
>       ether_ifattach(ifp);
>       splx(s);
>  
> +     timeout_set(&sc->sc_tick, fec_tick, sc);
> +
>       fec_sc = sc;
>       return;
>  
> @@ -672,6 +676,8 @@ fec_init(struct fec_softc *sc)
>       /* program promiscuous mode and multicast filters */
>       fec_iff(sc);
>  
> +     timeout_add_sec(&sc->sc_tick, 1);
> +
>       /* Indicate we are up and running. */
>       ifp->if_flags |= IFF_RUNNING;
>       ifq_clr_oactive(&ifp->if_snd);
> @@ -694,6 +700,8 @@ fec_stop(struct fec_softc *sc)
>       ifp->if_timer = 0;
>       ifq_clr_oactive(&ifp->if_snd);
>  
> +     timeout_del(&sc->sc_tick);
> +
>       /* reset the controller */
>       HSET4(sc, ENET_ECR, ENET_ECR_RESET);
>       while(HREAD4(sc, ENET_ECR) & ENET_ECR_RESET);
> @@ -966,6 +974,19 @@ done:
>       HWRITE4(sc, ENET_RDAR, ENET_RDAR_RDAR);
>  
>       if_input(ifp, &ml);
> +}
> +
> +void
> +fec_tick(void *arg)
> +{
> +     struct fec_softc *sc = arg;
> +     int s;
> +
> +     s = splnet();
> +     mii_tick(&sc->sc_mii);
> +     splx(s);
> +
> +     timeout_add_sec(&sc->sc_tick, 1);
>  }
>  
>  /*
> 

Reply via email to