aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/vge
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2011-05-20 18:27:13 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2011-05-20 18:27:13 +0000
commit7ba75dc4e9abb4f4ae2230d34381d50152c2342e (patch)
tree95aa95723222f84de830fe4a27ae4ac1d0ef7b2f /sys/dev/vge
parent81046d3cb345a6b5052d212db4bc995d3f7dc00f (diff)
Notes
Diffstat (limited to 'sys/dev/vge')
-rw-r--r--sys/dev/vge/if_vge.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/sys/dev/vge/if_vge.c b/sys/dev/vge/if_vge.c
index 4549bb08bca9..d9a58cce5b82 100644
--- a/sys/dev/vge/if_vge.c
+++ b/sys/dev/vge/if_vge.c
@@ -685,7 +685,18 @@ vge_dma_alloc(struct vge_softc *sc)
bus_addr_t lowaddr, tx_ring_end, rx_ring_end;
int error, i;
- lowaddr = BUS_SPACE_MAXADDR;
+ /*
+ * It seems old PCI controllers do not support DAC. DAC
+ * configuration can be enabled by accessing VGE_CHIPCFG3
+ * register but honor EEPROM configuration instead of
+ * blindly overriding DAC configuration. PCIe based
+ * controllers are supposed to support 64bit DMA so enable
+ * 64bit DMA on these controllers.
+ */
+ if ((sc->vge_flags & VGE_FLAG_PCIE) != 0)
+ lowaddr = BUS_SPACE_MAXADDR;
+ else
+ lowaddr = BUS_SPACE_MAXADDR_32BIT;
again:
/* Create parent ring tag. */
@@ -802,10 +813,14 @@ again:
goto again;
}
+ if ((sc->vge_flags & VGE_FLAG_PCIE) != 0)
+ lowaddr = VGE_BUF_DMA_MAXADDR;
+ else
+ lowaddr = BUS_SPACE_MAXADDR_32BIT;
/* Create parent buffer tag. */
error = bus_dma_tag_create(bus_get_dma_tag(sc->vge_dev),/* parent */
1, 0, /* algnmnt, boundary */
- VGE_BUF_DMA_MAXADDR, /* lowaddr */
+ lowaddr, /* lowaddr */
BUS_SPACE_MAXADDR, /* highaddr */
NULL, NULL, /* filter, filterarg */
BUS_SPACE_MAXSIZE_32BIT, /* maxsize */