summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/if_nxe.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/sys/dev/pci/if_nxe.c b/sys/dev/pci/if_nxe.c
index ca6aaf58634..21e9b939c52 100644
--- a/sys/dev/pci/if_nxe.c
+++ b/sys/dev/pci/if_nxe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_nxe.c,v 1.38 2007/08/15 07:46:02 dlg Exp $ */
+/* $OpenBSD: if_nxe.c,v 1.39 2007/08/15 10:14:59 dlg Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -729,6 +729,7 @@ void nxe_pci_unmap(struct nxe_softc *);
int nxe_board_info(struct nxe_softc *);
int nxe_user_info(struct nxe_softc *);
int nxe_init(struct nxe_softc *);
+void nxe_uninit(struct nxe_softc *);
void nxe_mountroot(void *);
/* chip state */
@@ -843,6 +844,7 @@ nxe_attach(struct device *parent, struct device *self, void *aux)
{
struct nxe_softc *sc = (struct nxe_softc *)self;
struct pci_attach_args *pa = aux;
+ pci_intr_handle_t ih;
struct ifnet *ifp;
sc->sc_dmat = pa->pa_dmat;
@@ -873,6 +875,17 @@ nxe_attach(struct device *parent, struct device *self, void *aux)
goto unmap;
}
+ if (pci_intr_map(pa, &ih) != 0) {
+ printf(": unable to map interrupt\n");
+ goto uninit;
+ }
+ sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_NET,
+ nxe_intr, sc, DEVNAME(sc));
+ if (sc->sc_ih == NULL) {
+ printf(": unable to establish interrupt\n");
+ goto uninit;
+ }
+
ifp = &sc->sc_ac.ac_if;
ifp->if_softc = sc;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
@@ -896,6 +909,9 @@ nxe_attach(struct device *parent, struct device *self, void *aux)
sc->sc_fw_major, sc->sc_fw_minor, sc->sc_fw_build,
ether_sprintf(sc->sc_ac.ac_enaddr));
return;
+
+uninit:
+ nxe_uninit(sc);
unmap:
nxe_pci_unmap(sc);
}
@@ -1578,6 +1594,16 @@ err:
}
void
+nxe_uninit(struct nxe_softc *sc)
+{
+ if (sc->sc_function == 0) {
+ bus_dmamap_sync(sc->sc_dmat, NXE_DMA_MAP(sc->sc_dummy_dma),
+ 0, NXE_DMA_LEN(sc->sc_dummy_dma), BUS_DMASYNC_POSTREAD);
+ nxe_dmamem_free(sc, sc->sc_dummy_dma);
+ }
+}
+
+void
nxe_mountroot(void *arg)
{
struct nxe_softc *sc = arg;