Hi! the ix(4)-Driver stores a pointer to the pci_attach_args structure (as passed to ixgbe_attach) in its softc. However, the pci_attach_args structure lives on the stack somewhere in autoconf, i.e. its contents are undefined after ixgbe_attach returns.
However, the pointer to that data remains in ix_softc and is used at least in ixgbe_detach. The diff below changes this by storing a copy of the pci_attach_args in ix_softc. Tested (with a slightly modified source tree) on x86. regards Christian Index: if_ix.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_ix.c,v retrieving revision 1.59 diff -u -p -r1.59 if_ix.c --- if_ix.c 13 Jan 2012 09:38:23 -0000 1.59 +++ if_ix.c 20 Jan 2012 14:02:04 -0000 @@ -209,7 +209,7 @@ ixgbe_attach(struct device *parent, stru INIT_DEBUGOUT("ixgbe_attach: begin"); sc->osdep.os_sc = sc; - sc->osdep.os_pa = pa; + sc->osdep.os_pa = *pa; /* Core Lock Init*/ mtx_init(&sc->core_mtx, IPL_NET); @@ -1400,7 +1400,7 @@ void ixgbe_identify_hardware(struct ix_softc *sc) { struct ixgbe_osdep *os = &sc->osdep; - struct pci_attach_args *pa = os->os_pa; + struct pci_attach_args *pa = &os->os_pa; uint32_t reg; /* Save off the information about this board */ @@ -1534,7 +1534,7 @@ ixgbe_allocate_legacy(struct ix_softc *s { struct ifnet *ifp = &sc->arpcom.ac_if; struct ixgbe_osdep *os = &sc->osdep; - struct pci_attach_args *pa = os->os_pa; + struct pci_attach_args *pa = &os->os_pa; const char *intrstr = NULL; pci_chipset_tag_t pc = pa->pa_pc; pci_intr_handle_t ih; @@ -1576,7 +1576,7 @@ int ixgbe_allocate_pci_resources(struct ix_softc *sc) { struct ixgbe_osdep *os = &sc->osdep; - struct pci_attach_args *pa = os->os_pa; + struct pci_attach_args *pa = &os->os_pa; int val; val = pci_conf_read(pa->pa_pc, pa->pa_tag, PCIR_BAR(0)); @@ -1609,7 +1609,7 @@ void ixgbe_free_pci_resources(struct ix_softc * sc) { struct ixgbe_osdep *os = &sc->osdep; - struct pci_attach_args *pa = os->os_pa; + struct pci_attach_args *pa = &os->os_pa; struct ix_queue *que = sc->queues; int i; @@ -1749,7 +1749,7 @@ ixgbe_dma_malloc(struct ix_softc *sc, bu struct ixgbe_osdep *os = &sc->osdep; int r; - dma->dma_tag = os->os_pa->pa_dmat; + dma->dma_tag = os->os_pa.pa_dmat; r = bus_dmamap_create(dma->dma_tag, size, 1, size, 0, BUS_DMA_NOWAIT, &dma->dma_map); if (r != 0) { @@ -3330,7 +3330,7 @@ ixgbe_read_pci_cfg(struct ixgbe_hw *hw, high = 1; reg &= ~0x2; } - pa = ((struct ixgbe_osdep *)hw->back)->os_pa; + pa = &((struct ixgbe_osdep *)hw->back)->os_pa; value = pci_conf_read(pa->pa_pc, pa->pa_tag, reg); if (high) @@ -3351,7 +3351,7 @@ ixgbe_write_pci_cfg(struct ixgbe_hw *hw, high = 1; reg &= ~0x2; } - pa = ((struct ixgbe_osdep *)hw->back)->os_pa; + pa = &((struct ixgbe_osdep *)hw->back)->os_pa; rv = pci_conf_read(pa->pa_pc, pa->pa_tag, reg); if (!high) rv = (rv & 0xffff0000) | value; Index: ixgbe.h =================================================================== RCS file: /cvs/src/sys/dev/pci/ixgbe.h,v retrieving revision 1.7 diff -u -p -r1.7 ixgbe.h --- ixgbe.h 10 Jun 2011 12:46:35 -0000 1.7 +++ ixgbe.h 20 Jan 2012 14:02:04 -0000 @@ -127,7 +127,7 @@ struct ixgbe_osdep { bus_addr_t os_membase; void *os_sc; - struct pci_attach_args *os_pa; + struct pci_attach_args os_pa; }; extern uint16_t ixgbe_read_pci_cfg(struct ixgbe_hw *, uint32_t);