Commit 7160ddbb authored by Wesley W. Terpstra's avatar Wesley W. Terpstra

wishbone: read-out any MSI data we enqueue

parent 7019dabd
...@@ -109,6 +109,13 @@ static inline void eb_from_cpu(unsigned char* x, wb_data_t dat) ...@@ -109,6 +109,13 @@ static inline void eb_from_cpu(unsigned char* x, wb_data_t dat)
} }
} }
static int deliver_msi(struct etherbone_master_context* context)
{
return context->msi_unread > 0 &&
context->sent == context->processed &&
context->sent == context->received;
}
static void claim_msi(struct etherbone_master_context* context) static void claim_msi(struct etherbone_master_context* context)
{ {
unsigned i; unsigned i;
...@@ -327,19 +334,26 @@ static ssize_t char_master_aio_read(struct kiocb *iocb, const struct iovec *iov, ...@@ -327,19 +334,26 @@ static ssize_t char_master_aio_read(struct kiocb *iocb, const struct iovec *iov,
if (mutex_lock_interruptible(&context->mutex)) if (mutex_lock_interruptible(&context->mutex))
return -EINTR; return -EINTR;
ring_len = RING_READ_LEN(context); /* If MSI is pending, deliver it */
len = min_t(unsigned int, ring_len, iov_len); if (deliver_msi(context)) {
len = min_t(unsigned int, context->msi_unread, iov_len);
/* How far till we must wrap? */ memcpy_toiovecend(iov, context->msi + sizeof(context->msi) - context->msi_unread, 0, len);
buf_len = sizeof(context->buf) - RING_INDEX(context->sent); context->msi_unread -= len;
if (buf_len < len) {
memcpy_toiovecend(iov, RING_POINTER(context, sent), 0, buf_len);
memcpy_toiovecend(iov, &context->buf[0], buf_len, len-buf_len);
} else { } else {
memcpy_toiovecend(iov, RING_POINTER(context, sent), 0, len); ring_len = RING_READ_LEN(context);
len = min_t(unsigned int, ring_len, iov_len);
/* How far till we must wrap? */
buf_len = sizeof(context->buf) - RING_INDEX(context->sent);
if (buf_len < len) {
memcpy_toiovecend(iov, RING_POINTER(context, sent), 0, buf_len);
memcpy_toiovecend(iov, &context->buf[0], buf_len, len-buf_len);
} else {
memcpy_toiovecend(iov, RING_POINTER(context, sent), 0, len);
}
context->sent = RING_POS(context->sent + len);
} }
context->sent = RING_POS(context->sent + len);
mutex_unlock(&context->mutex); mutex_unlock(&context->mutex);
...@@ -403,6 +417,7 @@ static unsigned int char_master_poll(struct file *filep, poll_table *wait) ...@@ -403,6 +417,7 @@ static unsigned int char_master_poll(struct file *filep, poll_table *wait)
mutex_lock(&context->mutex); mutex_lock(&context->mutex);
if (deliver_msi(context)) mask |= POLLIN | POLLRDNORM;
if (RING_READ_LEN (context) != 0) mask |= POLLIN | POLLRDNORM; if (RING_READ_LEN (context) != 0) mask |= POLLIN | POLLRDNORM;
if (RING_WRITE_LEN(context) != 0) mask |= POLLOUT | POLLWRNORM; if (RING_WRITE_LEN(context) != 0) mask |= POLLOUT | POLLWRNORM;
......
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