Commit 98e3a9af authored by Karen Xie's avatar Karen Xie

XDMA: 1. split module parameter sgdma_timeout to h2c_timeout & c2h_timeout. 2....

XDMA: 1. split module parameter sgdma_timeout to h2c_timeout & c2h_timeout. 2. value of 0 means no timeout (i.e., wait forever).
parent bcd444ce
...@@ -36,10 +36,13 @@ ...@@ -36,10 +36,13 @@
#include "xdma_thread.h" #include "xdma_thread.h"
/* Module Parameters */ /* Module Parameters */
unsigned int sgdma_timeout = 10; unsigned int h2c_timeout = 10;
module_param(sgdma_timeout, uint, 0644); module_param(h2c_timeout, uint, 0644);
MODULE_PARM_DESC(sgdma_timeout, "timeout in seconds for sgdma, default is 10 sec."); MODULE_PARM_DESC(h2c_timeout, "H2C sgdma timeout in seconds, default is 10 sec.");
unsigned int c2h_timeout = 10;
module_param(c2h_timeout, uint, 0644);
MODULE_PARM_DESC(c2h_timeout, "C2H sgdma timeout in seconds, default is 10 sec.");
extern struct kmem_cache *cdev_cache; extern struct kmem_cache *cdev_cache;
static void char_sgdma_unmap_user_buf(struct xdma_io_cb *cb, bool write); static void char_sgdma_unmap_user_buf(struct xdma_io_cb *cb, bool write);
...@@ -85,7 +88,9 @@ static void async_io_handler(unsigned long cb_hndl, int err) ...@@ -85,7 +88,9 @@ static void async_io_handler(unsigned long cb_hndl, int err)
if (!err) if (!err)
numbytes = xdma_xfer_completion((void *)cb, xdev, numbytes = xdma_xfer_completion((void *)cb, xdev,
engine->channel, cb->write, cb->ep_addr, engine->channel, cb->write, cb->ep_addr,
&cb->sgt, 0, sgdma_timeout * 1000); &cb->sgt, 0,
cb->write ? h2c_timeout * 1000 :
c2h_timeout * 1000);
char_sgdma_unmap_user_buf(cb, cb->write); char_sgdma_unmap_user_buf(cb, cb->write);
...@@ -387,7 +392,8 @@ static ssize_t char_sgdma_read_write(struct file *file, const char __user *buf, ...@@ -387,7 +392,8 @@ static ssize_t char_sgdma_read_write(struct file *file, const char __user *buf,
return rv; return rv;
res = xdma_xfer_submit(xdev, engine->channel, write, *pos, &cb.sgt, res = xdma_xfer_submit(xdev, engine->channel, write, *pos, &cb.sgt,
0, sgdma_timeout * 1000); 0, write ? h2c_timeout * 1000 :
c2h_timeout * 1000);
char_sgdma_unmap_user_buf(&cb, write); char_sgdma_unmap_user_buf(&cb, write);
...@@ -470,7 +476,7 @@ static ssize_t cdev_aio_write(struct kiocb *iocb, const struct iovec *io, ...@@ -470,7 +476,7 @@ static ssize_t cdev_aio_write(struct kiocb *iocb, const struct iovec *io,
rv = xdma_xfer_submit_nowait((void *)&caio->cb[i], xdev, rv = xdma_xfer_submit_nowait((void *)&caio->cb[i], xdev,
engine->channel, caio->cb[i].write, engine->channel, caio->cb[i].write,
caio->cb[i].ep_addr, &caio->cb[i].sgt, caio->cb[i].ep_addr, &caio->cb[i].sgt,
0, sgdma_timeout * 1000); 0, h2c_timeout * 1000);
} }
if (engine->cmplthp) if (engine->cmplthp)
...@@ -545,7 +551,7 @@ static ssize_t cdev_aio_read(struct kiocb *iocb, const struct iovec *io, ...@@ -545,7 +551,7 @@ static ssize_t cdev_aio_read(struct kiocb *iocb, const struct iovec *io,
rv = xdma_xfer_submit_nowait((void *)&caio->cb[i], xdev, rv = xdma_xfer_submit_nowait((void *)&caio->cb[i], xdev,
engine->channel, caio->cb[i].write, engine->channel, caio->cb[i].write,
caio->cb[i].ep_addr, &caio->cb[i].sgt, caio->cb[i].ep_addr, &caio->cb[i].sgt,
0, sgdma_timeout * 1000); 0, c2h_timeout * 1000);
} }
if (engine->cmplthp) if (engine->cmplthp)
......
...@@ -64,14 +64,20 @@ MODULE_PARM_DESC(desc_blen_max, ...@@ -64,14 +64,20 @@ MODULE_PARM_DESC(desc_blen_max,
#define xlx_wake_up swake_up_one #define xlx_wake_up swake_up_one
#define xlx_wait_event_interruptible_timeout \ #define xlx_wait_event_interruptible_timeout \
swait_event_interruptible_timeout_exclusive swait_event_interruptible_timeout_exclusive
#define xlx_wait_event_interruptible \
swait_event_interruptible_exclusive
#elif HAS_SWAKE_UP #elif HAS_SWAKE_UP
#define xlx_wake_up swake_up #define xlx_wake_up swake_up
#define xlx_wait_event_interruptible_timeout \ #define xlx_wait_event_interruptible_timeout \
swait_event_interruptible_timeout swait_event_interruptible_timeout
#define xlx_wait_event_interruptible \
swait_event_interruptible
#else #else
#define xlx_wake_up wake_up_interruptible #define xlx_wake_up wake_up_interruptible
#define xlx_wait_event_interruptible_timeout \ #define xlx_wait_event_interruptible_timeout \
wait_event_interruptible_timeout wait_event_interruptible_timeout
#define xlx_wait_event_interruptible \
wait_event_interruptible
#endif #endif
...@@ -3551,10 +3557,13 @@ ssize_t xdma_xfer_submit(void *dev_hndl, int channel, bool write, u64 ep_addr, ...@@ -3551,10 +3557,13 @@ ssize_t xdma_xfer_submit(void *dev_hndl, int channel, bool write, u64 ep_addr,
} }
} else { } else {
xlx_wait_event_interruptible_timeout( if (timeout_ms > 0)
xfer->wq, xlx_wait_event_interruptible_timeout(xfer->wq,
(xfer->state != TRANSFER_STATE_SUBMITTED), (xfer->state != TRANSFER_STATE_SUBMITTED),
msecs_to_jiffies(timeout_ms)); msecs_to_jiffies(timeout_ms));
else
xlx_wait_event_interruptible(xfer->wq,
(xfer->state != TRANSFER_STATE_SUBMITTED));
} }
spin_lock_irqsave(&engine->lock, flags); spin_lock_irqsave(&engine->lock, flags);
...@@ -3642,10 +3651,8 @@ unmap_sgl: ...@@ -3642,10 +3651,8 @@ unmap_sgl:
if (req) if (req)
xdma_request_free(req); xdma_request_free(req);
if (rv < 0) /* as long as some data is processed, return the count */
return rv; return done ? done : rv;
return done;
} }
ssize_t xdma_xfer_completion(void *cb_hndl, void *dev_hndl, int channel, ssize_t xdma_xfer_completion(void *cb_hndl, void *dev_hndl, int channel,
...@@ -4744,20 +4751,31 @@ static int transfer_monitor_cyclic(struct xdma_engine *engine, ...@@ -4744,20 +4751,31 @@ static int transfer_monitor_cyclic(struct xdma_engine *engine,
dbg_tfr("%s: rx_head=%d,rx_tail=%d, wait ...\n", dbg_tfr("%s: rx_head=%d,rx_tail=%d, wait ...\n",
engine->name, engine->rx_head, engine->rx_tail); engine->name, engine->rx_head, engine->rx_tail);
rc = xlx_wait_event_interruptible_timeout( if (timeout_ms > 0)
transfer->wq, rc = xlx_wait_event_interruptible_timeout(
(engine->rx_head != engine->rx_tail || transfer->wq,
engine->rx_overrun), (engine->rx_head != engine->rx_tail ||
msecs_to_jiffies(timeout_ms)); engine->rx_overrun),
msecs_to_jiffies(timeout_ms));
else
rc = xlx_wait_event_interruptible(
transfer->wq,
(engine->rx_head != engine->rx_tail ||
engine->rx_overrun));
dbg_tfr("%s: wait returns %d, rx %d/%d, overrun %d.\n", dbg_tfr("%s: wait returns %d, rx %d/%d, overrun %d.\n",
engine->name, rc, engine->rx_head, engine->name, rc, engine->rx_head,
engine->rx_tail, engine->rx_overrun); engine->rx_tail, engine->rx_overrun);
} else { } else {
rc = xlx_wait_event_interruptible_timeout( if (timeout_ms > 0)
transfer->wq, rc = xlx_wait_event_interruptible_timeout(
engine->eop_found, transfer->wq,
msecs_to_jiffies(timeout_ms)); engine->eop_found,
msecs_to_jiffies(timeout_ms));
else
rc = xlx_wait_event_interruptible(
transfer->wq,
engine->eop_found);
dbg_tfr("%s: wait returns %d, eop_found %d.\n", dbg_tfr("%s: wait returns %d, eop_found %d.\n",
engine->name, rc, engine->eop_found); engine->name, rc, engine->eop_found);
......
...@@ -359,8 +359,8 @@ static int xdma_mod_init(void) ...@@ -359,8 +359,8 @@ static int xdma_mod_init(void)
if (desc_blen_max > XDMA_DESC_BLEN_MAX) if (desc_blen_max > XDMA_DESC_BLEN_MAX)
desc_blen_max = XDMA_DESC_BLEN_MAX; desc_blen_max = XDMA_DESC_BLEN_MAX;
pr_info("desc_blen_max: 0x%x/%u, sgdma_timeout: %u sec.\n", pr_info("desc_blen_max: 0x%x/%u, timeout: h2c %u c2h %u sec.\n",
desc_blen_max, desc_blen_max, sgdma_timeout); desc_blen_max, desc_blen_max, h2c_timeout, c2h_timeout);
rv = xdma_cdev_init(); rv = xdma_cdev_init();
if (rv < 0) if (rv < 0)
......
...@@ -55,7 +55,8 @@ ...@@ -55,7 +55,8 @@
#define MAGIC_BITSTREAM 0xBBBBBBBBUL #define MAGIC_BITSTREAM 0xBBBBBBBBUL
extern unsigned int desc_blen_max; extern unsigned int desc_blen_max;
extern unsigned int sgdma_timeout; extern unsigned int h2c_timeout;
extern unsigned int c2h_timeout;
struct xdma_cdev { struct xdma_cdev {
unsigned long magic; /* structure ID for sanity checks */ unsigned long magic; /* structure ID for sanity checks */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment