Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/ic - split out chip reset ops from hme_stop() into a...



details:   https://anonhg.NetBSD.org/src/rev/78bf1c58ea38
branches:  trunk
changeset: 747284:78bf1c58ea38
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Tue Sep 08 17:16:33 2009 +0000

description:
- split out chip reset ops from hme_stop() into a new function
  hme_chipreset() to make hme_stop() match struct ifnet API
- set ifp->if_timer in hme_start() if any TX packets are queued
- also clear ifp->if_timer and ifp->if_flags in hme_stop()
- replace shutdownhook_establish(9) with pmf_device_reigster1(9)
Briefly checked hme at pci.

diffstat:

 sys/dev/ic/hme.c    |  70 ++++++++++++++++++++++++++++++++++------------------
 sys/dev/ic/hmevar.h |   3 +-
 2 files changed, 47 insertions(+), 26 deletions(-)

diffs (199 lines):

diff -r ef29ef893483 -r 78bf1c58ea38 sys/dev/ic/hme.c
--- a/sys/dev/ic/hme.c  Tue Sep 08 13:38:01 2009 +0000
+++ b/sys/dev/ic/hme.c  Tue Sep 08 17:16:33 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: hme.c,v 1.79 2009/05/17 00:40:43 tsutsui Exp $ */
+/*     $NetBSD: hme.c,v 1.80 2009/09/08 17:16:33 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.79 2009/05/17 00:40:43 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.80 2009/09/08 17:16:33 tsutsui Exp $");
 
 /* #define HMEDEBUG */
 
@@ -87,15 +87,16 @@
 #include <dev/ic/hmevar.h>
 
 void           hme_start(struct ifnet *);
-void           hme_stop(struct hme_softc *,bool);
+void           hme_stop(struct ifnet *, int);
 int            hme_ioctl(struct ifnet *, u_long, void *);
 void           hme_tick(void *);
 void           hme_watchdog(struct ifnet *);
-void           hme_shutdown(void *);
+bool           hme_shutdown(device_t, int);
 int            hme_init(struct hme_softc *);
 void           hme_meminit(struct hme_softc *);
 void           hme_mifinit(struct hme_softc *);
 void           hme_reset(struct hme_softc *);
+void           hme_chipreset(struct hme_softc *);
 void           hme_setladrf(struct hme_softc *);
 
 /* MII methods & callbacks */
@@ -159,8 +160,7 @@
         */
 
        /* Make sure the chip is stopped. */
-       hme_stop(sc, true);
-
+       hme_chipreset(sc);
 
        /*
         * Allocate descriptors and buffers
@@ -237,6 +237,7 @@
        strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
        ifp->if_softc = sc;
        ifp->if_start = hme_start;
+       ifp->if_stop = hme_stop;
        ifp->if_ioctl = hme_ioctl;
        ifp->if_watchdog = hme_watchdog;
        ifp->if_flags =
@@ -319,9 +320,11 @@
        if_attach(ifp);
        ether_ifattach(ifp, sc->sc_enaddr);
 
-       sc->sc_sh = shutdownhook_establish(hme_shutdown, sc);
-       if (sc->sc_sh == NULL)
-               panic("hme_config: can't establish shutdownhook");
+       if (pmf_device_register1(sc->sc_dev, NULL, NULL, hme_shutdown))
+               pmf_class_network_register(sc->sc_dev, ifp);
+       else
+               aprint_error_dev(sc->sc_dev,
+                   "couldn't establish power handler\n");
 
 #if NRND > 0
        rnd_attach_source(&sc->rnd_source, device_xname(sc->sc_dev),
@@ -355,17 +358,12 @@
 }
 
 void
-hme_stop(struct hme_softc *sc, bool chip_only)
+hme_chipreset(struct hme_softc *sc)
 {
        bus_space_tag_t t = sc->sc_bustag;
        bus_space_handle_t seb = sc->sc_seb;
        int n;
 
-       if (!chip_only) {
-               callout_stop(&sc->sc_tick_ch);
-               mii_down(&sc->sc_mii);
-       }
-
        /* Mask all interrupts */
        bus_space_write_4(t, seb, HME_SEBI_IMASK, 0xffffffff);
 
@@ -380,7 +378,23 @@
                DELAY(20);
        }
 
-       printf("%s: hme_stop: reset failed\n", device_xname(sc->sc_dev));
+       printf("%s: %s: reset failed\n", device_xname(sc->sc_dev), __func__);
+}
+
+void
+hme_stop(struct ifnet *ifp, int disable)
+{
+       struct hme_softc *sc;
+
+       sc = ifp->if_softc;
+
+       ifp->if_timer = 0;
+       ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
+
+       callout_stop(&sc->sc_tick_ch);
+       mii_down(&sc->sc_mii);
+
+       hme_chipreset(sc);
 }
 
 void
@@ -484,7 +498,7 @@
         */
 
        /* step 1 & 2. Reset the Ethernet Channel */
-       hme_stop(sc, false);
+       hme_stop(ifp, 0);
 
        /* Re-initialize the MIF */
        hme_mifinit(sc);
@@ -898,13 +912,14 @@
        void *txd = sc->sc_rb.rb_txd;
        struct mbuf *m;
        unsigned int txflags;
-       unsigned int ri, len;
+       unsigned int ri, len, obusy;
        unsigned int ntbuf = sc->sc_rb.rb_ntbuf;
 
        if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
                return;
 
        ri = sc->sc_rb.rb_tdhead;
+       obusy = sc->sc_rb.rb_td_nbusy;
 
        for (;;) {
                IFQ_DEQUEUE(&ifp->if_snd, m);
@@ -975,7 +990,10 @@
                }
        }
 
-       sc->sc_rb.rb_tdhead = ri;
+       if (obusy != sc->sc_rb.rb_td_nbusy) {
+               sc->sc_rb.rb_tdhead = ri;
+               ifp->if_timer = 5;
+       }
 }
 
 /*
@@ -1460,7 +1478,7 @@
                         * If interface is marked down and it is running, then
                         * stop it.
                         */
-                       hme_stop(sc, false);
+                       hme_stop(ifp, 0);
                        ifp->if_flags &= ~IFF_RUNNING;
                        break;
                case IFF_UP:
@@ -1518,13 +1536,17 @@
        return (error);
 }
 
-void
-hme_shutdown(void *arg)
+bool
+hme_shutdown(device_t self, int howto)
 {
        struct hme_softc *sc;
+       struct ifnet *ifp;
 
-       sc = arg;
-       hme_stop(sc, false);
+       sc = device_private(self);
+       ifp = &sc->sc_ethercom.ec_if;
+       hme_stop(ifp, 1);
+
+       return true;
 }
 
 /*
diff -r ef29ef893483 -r 78bf1c58ea38 sys/dev/ic/hmevar.h
--- a/sys/dev/ic/hmevar.h       Tue Sep 08 13:38:01 2009 +0000
+++ b/sys/dev/ic/hmevar.h       Tue Sep 08 17:16:33 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: hmevar.h,v 1.19 2009/05/17 00:40:43 tsutsui Exp $      */
+/*     $NetBSD: hmevar.h,v 1.20 2009/09/08 17:16:33 tsutsui Exp $      */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -86,7 +86,6 @@
 #endif
 
        int                     sc_debug;
-       void                    *sc_sh;         /* shutdownhook cookie */
        int                     sc_ec_capenable;
        short                   sc_if_flags;
        uint8_t                 sc_enaddr[ETHER_ADDR_LEN]; /* MAC address */



Home | Main Index | Thread Index | Old Index