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