diff options
author | gavin <gavin@FreeBSD.org> | 2014-05-07 21:38:33 +0000 |
---|---|---|
committer | gavin <gavin@FreeBSD.org> | 2014-05-07 21:38:33 +0000 |
commit | d41ec318f9450a569a2d83b56c63243d8f513c51 (patch) | |
tree | af11e30137ca09e2c01cda3bffaad7ba298b02bd /sys/dev/an | |
parent | ff6061264f66e81c86ccd62cec9ceee03ecac27f (diff) | |
download | FreeBSD-src-d41ec318f9450a569a2d83b56c63243d8f513c51.zip FreeBSD-src-d41ec318f9450a569a2d83b56c63243d8f513c51.tar.gz |
Merge r259393 from head:
Fix several panics when initialization of an ISA or PC-CARD device fails:
o Assign sc->an_dev in an_probe() (which isn't really a probe function in
the standard newbus sense) as we may need it for printing errors.
o Use device_printf() rather than if_printf() in an_reset() - this is
called from an_probe() long before the ifp structure is initialised
in an_attach().
o Initialize the ifp structure early in an_attach() as we use if_printf()
in cases where allocation of descriptors etc fails.
Diffstat (limited to 'sys/dev/an')
-rw-r--r-- | sys/dev/an/if_an.c | 9 | ||||
-rw-r--r-- | sys/dev/an/if_an_pccard.c | 2 |
2 files changed, 5 insertions, 6 deletions
diff --git a/sys/dev/an/if_an.c b/sys/dev/an/if_an.c index b2a13df..ee40c69 100644 --- a/sys/dev/an/if_an.c +++ b/sys/dev/an/if_an.c @@ -357,6 +357,7 @@ an_probe(device_t dev) CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), 0); CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 0xFFFF); + sc->an_dev = dev; mtx_init(&sc->an_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); AN_LOCK(sc); @@ -685,6 +686,9 @@ an_attach(struct an_softc *sc, int flags) device_printf(sc->an_dev, "can not if_alloc()\n"); goto fail; } + ifp->if_softc = sc; + if_initname(ifp, device_get_name(sc->an_dev), + device_get_unit(sc->an_dev)); sc->an_gone = 0; sc->an_associated = 0; @@ -758,9 +762,6 @@ an_attach(struct an_softc *sc, int flags) #endif AN_UNLOCK(sc); - ifp->if_softc = sc; - if_initname(ifp, device_get_name(sc->an_dev), - device_get_unit(sc->an_dev)); ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = an_ioctl; ifp->if_start = an_start; @@ -1387,7 +1388,7 @@ an_reset(struct an_softc *sc) an_cmd(sc, AN_CMD_NOOP2, 0); if (an_cmd(sc, AN_CMD_FORCE_SYNCLOSS, 0) == ETIMEDOUT) - if_printf(sc->an_ifp, "reset failed\n"); + device_printf(sc->an_dev, "reset failed\n"); an_cmd(sc, AN_CMD_DISABLE, 0); diff --git a/sys/dev/an/if_an_pccard.c b/sys/dev/an/if_an_pccard.c index bdd40f3..e9485ea 100644 --- a/sys/dev/an/if_an_pccard.c +++ b/sys/dev/an/if_an_pccard.c @@ -141,8 +141,6 @@ an_pccard_attach(device_t dev) an_alloc_irq(dev, sc->irq_rid, 0); - sc->an_dev = dev; - error = an_attach(sc, flags); if (error) goto fail; |