aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/xdma
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/xdma')
-rw-r--r--sys/dev/xdma/xdma.h4
-rw-r--r--sys/dev/xdma/xdma_mbuf.c20
-rw-r--r--sys/dev/xdma/xdma_sg.c48
3 files changed, 30 insertions, 42 deletions
diff --git a/sys/dev/xdma/xdma.h b/sys/dev/xdma/xdma.h
index 97cb4d429ad6..36a773b85f41 100644
--- a/sys/dev/xdma/xdma.h
+++ b/sys/dev/xdma/xdma.h
@@ -84,7 +84,6 @@ struct xchan_buf {
bus_dmamap_t map;
uint32_t nsegs;
uint32_t nsegs_left;
- void *cbuf;
};
struct xdma_request {
@@ -130,7 +129,8 @@ struct xdma_channel {
uint32_t caps;
#define XCHAN_CAP_BUSDMA (1 << 0)
-#define XCHAN_CAP_BUSDMA_NOSEG (1 << 1)
+#define XCHAN_CAP_NOSEG (1 << 1)
+#define XCHAN_CAP_NOBUFS (1 << 2)
/* A real hardware driver channel. */
void *chan;
diff --git a/sys/dev/xdma/xdma_mbuf.c b/sys/dev/xdma/xdma_mbuf.c
index 2035111ec7e0..ee5f564c1269 100644
--- a/sys/dev/xdma/xdma_mbuf.c
+++ b/sys/dev/xdma/xdma_mbuf.c
@@ -136,19 +136,15 @@ xdma_mbuf_defrag(xdma_channel_t *xchan, struct xdma_request *xr)
if (c == 1)
return (c); /* Nothing to do. */
- if (xchan->caps & XCHAN_CAP_BUSDMA) {
- if ((xchan->caps & XCHAN_CAP_BUSDMA_NOSEG) || \
- (c > xchan->maxnsegs)) {
- if ((m = m_defrag(xr->m, M_NOWAIT)) == NULL) {
- device_printf(xdma->dma_dev,
- "%s: Can't defrag mbuf\n",
- __func__);
- return (c);
- }
- xr->m = m;
- c = 1;
- }
+ if ((m = m_defrag(xr->m, M_NOWAIT)) == NULL) {
+ device_printf(xdma->dma_dev,
+ "%s: Can't defrag mbuf\n",
+ __func__);
+ return (c);
}
+ xr->m = m;
+ c = 1;
+
return (c);
}
diff --git a/sys/dev/xdma/xdma_sg.c b/sys/dev/xdma/xdma_sg.c
index eae6d8282872..6a6652679eb7 100644
--- a/sys/dev/xdma/xdma_sg.c
+++ b/sys/dev/xdma/xdma_sg.c
@@ -69,14 +69,7 @@ _xchan_bufs_alloc(xdma_channel_t *xchan)
for (i = 0; i < xchan->xr_num; i++) {
xr = &xchan->xr_mem[i];
- xr->buf.cbuf = contigmalloc(xchan->maxsegsize,
- M_XDMA, 0, 0, ~0, PAGE_SIZE, 0);
- if (xr->buf.cbuf == NULL) {
- device_printf(xdma->dev,
- "%s: Can't allocate contiguous kernel"
- " physical memory\n", __func__);
- return (-1);
- }
+ /* TODO: bounce buffer */
}
return (0);
@@ -179,7 +172,7 @@ xchan_bufs_free(xdma_channel_t *xchan)
} else {
for (i = 0; i < xchan->xr_num; i++) {
xr = &xchan->xr_mem[i];
- contigfree(xr->buf.cbuf, xchan->maxsegsize, M_XDMA);
+ /* TODO: bounce buffer */
}
}
@@ -245,17 +238,19 @@ xdma_prep_sg(xdma_channel_t *xchan, uint32_t xr_num,
return (-1);
}
- /* Allocate bufs. */
- ret = xchan_bufs_alloc(xchan);
- if (ret != 0) {
- device_printf(xdma->dev,
- "%s: Can't allocate bufs.\n", __func__);
+ /* Allocate buffers if required. */
+ if ((xchan->caps & XCHAN_CAP_NOBUFS) == 0) {
+ ret = xchan_bufs_alloc(xchan);
+ if (ret != 0) {
+ device_printf(xdma->dev,
+ "%s: Can't allocate bufs.\n", __func__);
- /* Cleanup */
- xchan_sglist_free(xchan);
- xchan_bank_free(xchan);
+ /* Cleanup */
+ xchan_sglist_free(xchan);
+ xchan_bank_free(xchan);
- return (-1);
+ return (-1);
+ }
}
xchan->flags |= (XCHAN_CONFIGURED | XCHAN_TYPE_SG);
@@ -442,14 +437,8 @@ _xdma_load_data(xdma_channel_t *xchan, struct xdma_request *xr,
switch (xr->req_type) {
case XR_TYPE_MBUF:
- if (xr->direction == XDMA_MEM_TO_DEV) {
- m_copydata(m, 0, m->m_pkthdr.len, xr->buf.cbuf);
- seg[0].ds_addr = (bus_addr_t)xr->buf.cbuf;
- seg[0].ds_len = m->m_pkthdr.len;
- } else {
- seg[0].ds_addr = mtod(m, bus_addr_t);
- seg[0].ds_len = m->m_pkthdr.len;
- }
+ seg[0].ds_addr = mtod(m, bus_addr_t);
+ seg[0].ds_len = m->m_pkthdr.len;
break;
case XR_TYPE_BIO:
case XR_TYPE_VIRT:
@@ -516,7 +505,9 @@ xdma_process(xdma_channel_t *xchan,
TAILQ_FOREACH_SAFE(xr, &xchan->queue_in, xr_next, xr_tmp) {
switch (xr->req_type) {
case XR_TYPE_MBUF:
- c = xdma_mbuf_defrag(xchan, xr);
+ if ((xchan->caps & XCHAN_CAP_NOSEG) ||
+ (c > xchan->maxnsegs))
+ c = xdma_mbuf_defrag(xchan, xr);
break;
case XR_TYPE_BIO:
case XR_TYPE_VIRT:
@@ -571,7 +562,8 @@ xdma_queue_submit_sg(xdma_channel_t *xchan)
sg = xchan->sg;
- if ((xchan->flags & XCHAN_BUFS_ALLOCATED) == 0) {
+ if ((xchan->caps & XCHAN_CAP_NOBUFS) == 0 &&
+ (xchan->flags & XCHAN_BUFS_ALLOCATED) == 0) {
device_printf(xdma->dev,
"%s: Can't submit a transfer: no bufs\n",
__func__);