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)
downloadsrc-7ba75dc4e9abb4f4ae2230d34381d50152c2342e.tar.gz
src-7ba75dc4e9abb4f4ae2230d34381d50152c2342e.zip
Datasheet says vge(4) controllers support DAC but it seems that's
not true on old PCI based controllers. DAC configuration is read from EEPROM in device reset phase and driver can override DAC configuration. However I guess there is an undocumented reason why EEPROM configuration does not enable DAC so do not blindly override DAC configuration. Recent PCIe based controllers are supposed to support 64bit DMA so allow 64bit DMA only on PCIe based controllers. PR: kern/157184 MFC after: 1 week
Notes
Notes: svn path=/head/; revision=222142
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 */