diff --git a/driver/pcie_wb.c b/driver/pcie_wb.c index be74b234739bd5bf89afc9690a2a2f6ee449b41f..f06aa191075bf96e7b8215385eee6b920349326d 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 1744f170b8ccbba28dff5050962531e602674ef0..ab8ba66061d60c76863c9c767b067167e4ef39e3 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; }