diff options
author | mux <mux@FreeBSD.org> | 2005-03-27 16:38:08 +0000 |
---|---|---|
committer | mux <mux@FreeBSD.org> | 2005-03-27 16:38:08 +0000 |
commit | c8f1495d8b06d33c7dbce0e2fb19365a7334c6ea (patch) | |
tree | 72b9aee9e6a612471d606cf8dbc332ba2574390d /sys/dev/ixgb | |
parent | eb0b07ecf6707c82c03e2d91ca054402fd2462b2 (diff) | |
download | FreeBSD-src-c8f1495d8b06d33c7dbce0e2fb19365a7334c6ea.zip FreeBSD-src-c8f1495d8b06d33c7dbce0e2fb19365a7334c6ea.tar.gz |
Fix a bunch of bugs I came accross when looking at the ixgb(4) driver,
some of which are rather serious:
- Use the device sysctl tree instead of rolling our own.
- Don't create a bus_dmamap_t to pass to bus_dmamem_alloc(), it is
bus_dmamem_alloc() that creates it itself. The DMA map created
by the driver was overwritten and its memory was leaked.
- Fix resource handling bugs in the error path of ixgb_dma_alloc().
- Don't use vtophys() to get the base address of the TX and RX rings
when busdma already gave us the correct address to use!
- Remove now useless includes and the alpha_XXX_dmamap() hack.
- Don't initialize if_output to ether_output(), ether_ifattach() does
it for us already.
- Add proper module dependencies on ether and pci.
Unfortunately, I'm not lucky enough to own an ixgb(4) card, nor a
machine with a bus where to plug it in and I couldn't find anyone able
to test these patches, so they are only build-tested and I won't MFC
them for 5.4-RELEASE.
Diffstat (limited to 'sys/dev/ixgb')
-rw-r--r-- | sys/dev/ixgb/if_ixgb.c | 41 | ||||
-rw-r--r-- | sys/dev/ixgb/if_ixgb.h | 7 | ||||
-rw-r--r-- | sys/dev/ixgb/if_ixgb_osdep.h | 2 |
3 files changed, 9 insertions, 41 deletions
diff --git a/sys/dev/ixgb/if_ixgb.c b/sys/dev/ixgb/if_ixgb.c index 4256ecb..908a4ae 100644 --- a/sys/dev/ixgb/if_ixgb.c +++ b/sys/dev/ixgb/if_ixgb.c @@ -160,6 +160,9 @@ static driver_t ixgb_driver = { static devclass_t ixgb_devclass; DRIVER_MODULE(if_ixgb, pci, ixgb_driver, ixgb_devclass, 0, 0); +MODULE_DEPEND(fxp, pci, 1, 1, 1); +MODULE_DEPEND(fxp, ether, 1, 1, 1); + /* some defines for controlling descriptor fetches in h/w */ #define RXDCTL_PTHRESH_DEFAULT 128 /* chip considers prefech below this */ #define RXDCTL_HTHRESH_DEFAULT 16 /* chip will only prefetch if tail is @@ -259,19 +262,8 @@ ixgb_attach(device_t dev) ixgb_adapter_list = adapter; /* SYSCTL APIs */ - sysctl_ctx_init(&adapter->sysctl_ctx); - adapter->sysctl_tree = SYSCTL_ADD_NODE(&adapter->sysctl_ctx, - SYSCTL_STATIC_CHILDREN(_hw), - OID_AUTO, - device_get_nameunit(dev), - CTLFLAG_RD, - 0, ""); - if (adapter->sysctl_tree == NULL) { - error = EIO; - goto err_sysctl; - } - SYSCTL_ADD_PROC(&adapter->sysctl_ctx, - SYSCTL_CHILDREN(adapter->sysctl_tree), + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "stats", CTLTYPE_INT | CTLFLAG_RW, (void *)adapter, 0, ixgb_sysctl_stats, "I", "Statistics"); @@ -355,7 +347,6 @@ err_tx_desc: err_pci: ixgb_free_pci_resources(adapter); sysctl_ctx_free(&adapter->sysctl_ctx); -err_sysctl: splx(s); return (error); @@ -414,9 +405,6 @@ ixgb_detach(device_t dev) ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); ifp->if_timer = 0; - adapter->sysctl_tree = NULL; - sysctl_ctx_free(&adapter->sysctl_ctx); - splx(s); return (0); } @@ -1315,7 +1303,6 @@ ixgb_setup_interface(device_t dev, struct adapter * adapter) ifp->if_name = "ixgb"; #endif ifp->if_mtu = ETHERMTU; - ifp->if_output = ether_output; ifp->if_baudrate = 1000000000; ifp->if_init = ixgb_init; ifp->if_softc = adapter; @@ -1396,18 +1383,12 @@ ixgb_dma_malloc(struct adapter * adapter, bus_size_t size, "error %u\n", adapter->unit, r); goto fail_0; } - r = bus_dmamap_create(dma->dma_tag, BUS_DMA_NOWAIT, &dma->dma_map); - if (r != 0) { - printf("ixgb%d: ixgb_dma_malloc: bus_dmamap_create failed; " - "error %u\n", adapter->unit, r); - goto fail_1; - } r = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr, BUS_DMA_NOWAIT, &dma->dma_map); if (r != 0) { printf("ixgb%d: ixgb_dma_malloc: bus_dmamem_alloc failed; " "error %u\n", adapter->unit, r); - goto fail_2; + goto fail_1; } r = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr, size, @@ -1417,16 +1398,13 @@ ixgb_dma_malloc(struct adapter * adapter, bus_size_t size, if (r != 0) { printf("ixgb%d: ixgb_dma_malloc: bus_dmamap_load failed; " "error %u\n", adapter->unit, r); - goto fail_3; + goto fail_2; } dma->dma_size = size; return (0); -fail_3: - bus_dmamap_unload(dma->dma_tag, dma->dma_map); fail_2: bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map); fail_1: - bus_dmamap_destroy(dma->dma_tag, dma->dma_map); bus_dma_tag_destroy(dma->dma_tag); fail_0: dma->dma_map = NULL; @@ -1441,7 +1419,6 @@ ixgb_dma_free(struct adapter * adapter, struct ixgb_dma_alloc * dma) { bus_dmamap_unload(dma->dma_tag, dma->dma_map); bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map); - bus_dmamap_destroy(dma->dma_tag, dma->dma_map); bus_dma_tag_destroy(dma->dma_tag); } @@ -1523,7 +1500,7 @@ static void ixgb_initialize_transmit_unit(struct adapter * adapter) { u_int32_t reg_tctl; - u_int64_t tdba = vtophys((vm_offset_t) adapter->tx_desc_base); + u_int64_t tdba = adapter->txdma.dma_paddr; /* Setup the Base and Length of the Tx Descriptor Ring */ IXGB_WRITE_REG(&adapter->hw, TDBAL, @@ -1901,7 +1878,7 @@ ixgb_initialize_receive_unit(struct adapter * adapter) u_int32_t reg_rxcsum; u_int32_t reg_rxdctl; struct ifnet *ifp; - u_int64_t rdba = vtophys((vm_offset_t) adapter->rx_desc_base); + u_int64_t rdba = adapter->rxdma.dma_paddr; ifp = &adapter->interface_data.ac_if; diff --git a/sys/dev/ixgb/if_ixgb.h b/sys/dev/ixgb/if_ixgb.h index f0be006..2ea7dae 100644 --- a/sys/dev/ixgb/if_ixgb.h +++ b/sys/dev/ixgb/if_ixgb.h @@ -66,8 +66,6 @@ POSSIBILITY OF SUCH DAMAGE. #include <machine/bus.h> #include <sys/rman.h> #include <machine/resource.h> -#include <vm/vm.h> -#include <vm/pmap.h> #include <machine/clock.h> #if __FreeBSD_version >= 502000 #include <dev/pci/pcivar.h> @@ -228,11 +226,6 @@ POSSIBILITY OF SUCH DAMAGE. #define IXGB_MAX_SCATTER 100 -#ifdef __alpha__ -#undef vtophys -#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)(va)) -#endif /* __alpha__ */ - /* * ****************************************************************************** * vendor_info_array diff --git a/sys/dev/ixgb/if_ixgb_osdep.h b/sys/dev/ixgb/if_ixgb_osdep.h index 31ba684..4e9cd0f 100644 --- a/sys/dev/ixgb/if_ixgb_osdep.h +++ b/sys/dev/ixgb/if_ixgb_osdep.h @@ -48,8 +48,6 @@ POSSIBILITY OF SUCH DAMAGE. #include <machine/bus.h> #include <sys/rman.h> #include <machine/resource.h> -#include <vm/vm.h> -#include <vm/pmap.h> #include <machine/clock.h> #if __FreeBSD_version >= 502000 #include <dev/pci/pcivar.h> |