From 5303eb905fec44d58f8a8866ee68201957388934 Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" <w.terpstra@gsi.de> Date: Fri, 4 May 2012 15:01:33 +0000 Subject: [PATCH] Added optional debug printk tracking of IO to the WB bridge Fixed bugs in kernel etherbone: record_len was shadowed by redeclation wrote maximum of possible bytes instead of minimum added non-blocking IO support --- driver/pcie_wb.c | 27 +++++++++++++++++++++------ driver/wishbone.c | 13 +++++++++---- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/driver/pcie_wb.c b/driver/pcie_wb.c index be74b23..f06aa19 100644 --- a/driver/pcie_wb.c +++ b/driver/pcie_wb.c @@ -110,9 +110,18 @@ void wb_write(struct wishbone* wb, wb_addr_t addr, wb_data_t data) } switch (dev->width) { - case 4: iowrite32(data, window + (addr & WINDOW_LOW)); break; - case 2: iowrite16(data >> dev->shift, window + (addr & WINDOW_LOW) + dev->low_addr); break; - case 1: iowrite8 (data >> dev->shift, window + (addr & WINDOW_LOW) + dev->low_addr); break; + case 4: + if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": iowrite32(0x%x, 0x%x)\n", data, addr); + iowrite32(data, window + (addr & WINDOW_LOW)); + break; + case 2: + if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": iowrite16(0x%x, 0x%x)\n", data >> dev->shift, addr + dev->low_addr); + iowrite16(data >> dev->shift, window + (addr & WINDOW_LOW) + dev->low_addr); + break; + case 1: + if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": iowrite8(0x%x, 0x%x)\n", data >> dev->shift, addr + dev->low_addr); + iowrite8 (data >> dev->shift, window + (addr & WINDOW_LOW) + dev->low_addr); + break; } } @@ -136,9 +145,15 @@ wb_data_t wb_read(struct wishbone* wb, wb_addr_t addr) rmb(); // has to be executed before reading switch (dev->width) { - case 4: return ((wb_data_t)ioread32(window + (addr & WINDOW_LOW))); - case 2: return ((wb_data_t)ioread16(window + (addr & WINDOW_LOW) + dev->low_addr)) << dev->shift; - case 1: return ((wb_data_t)ioread8 (window + (addr & WINDOW_LOW) + dev->low_addr)) << dev->shift; + case 4: + if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": ioread32(0x%x)\n", addr); + return ((wb_data_t)ioread32(window + (addr & WINDOW_LOW))); + case 2: + if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": ioread32(0x%x)\n", addr + dev->low_addr); + return ((wb_data_t)ioread16(window + (addr & WINDOW_LOW) + dev->low_addr)) << dev->shift; + case 1: + if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": ioread32(0x%x)\n", addr + dev->low_addr); + return ((wb_data_t)ioread8 (window + (addr & WINDOW_LOW) + dev->low_addr)) << dev->shift; } return 0; } diff --git a/driver/wishbone.c b/driver/wishbone.c index 1744f17..ab8ba66 100644 --- a/driver/wishbone.c +++ b/driver/wishbone.c @@ -51,7 +51,7 @@ static void etherbone_process(struct etherbone_context* context) { struct wishbone *wb; const struct wishbone_operations *wops; - unsigned int size, left, i, record_len = 0; + unsigned int size, left, i, record_len; unsigned char *buf; if (context->state == header) { @@ -77,7 +77,6 @@ static void etherbone_process(struct etherbone_context* context) size = RING_PROC_LEN(context); for (left = size; left >= 4; left -= record_len) { - unsigned int record_len; unsigned char flags, be, wcount, rcount; /* Determine record size */ @@ -191,7 +190,7 @@ static ssize_t char_aio_read(struct kiocb *iocb, const struct iovec *iov, unsign mutex_lock(&context->mutex); ring_len = RING_READ_LEN(context); - len = max_t(unsigned int, ring_len, iov_len); + len = min_t(unsigned int, ring_len, iov_len); /* How far till we must wrap? */ buf_len = sizeof(context->buf) - context->sent; @@ -210,6 +209,9 @@ static ssize_t char_aio_read(struct kiocb *iocb, const struct iovec *iov, unsign mutex_unlock(&context->mutex); + if (len == 0 && (filep->f_flags & O_NONBLOCK) != 0) + return -EAGAIN; + return len; } @@ -224,7 +226,7 @@ static ssize_t char_aio_write(struct kiocb *iocb, const struct iovec *iov, unsig mutex_lock(&context->mutex); ring_len = RING_WRITE_LEN(context); - len = max_t(unsigned int, ring_len, iov_len); + len = min_t(unsigned int, ring_len, iov_len); /* How far till we must wrap? */ buf_len = sizeof(context->buf) - context->received; @@ -246,6 +248,9 @@ static ssize_t char_aio_write(struct kiocb *iocb, const struct iovec *iov, unsig mutex_unlock(&context->mutex); + if (len == 0 && (filep->f_flags & O_NONBLOCK) != 0) + return -EAGAIN; + return len; } -- GitLab