Hello Jeff, Here are 2 small myri10ge patches for 2.6.27: 1) remove the obsolete wcfifo code 2) use ioremap_wc() A multiqueue TX patch is underwork but I am not sure it will be ready for 2.6.27. We'll see. thanks, Brice --
Remove the wcfifo since it never gave any performance improvement.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 54 ++--------------------------------------
1 file changed, 3 insertions(+), 51 deletions(-)
Index: linux-2.6/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-2.6.orig/drivers/net/myri10ge/myri10ge.c 2008-07-21 09:23:20.000000000 +0200
+++ linux-2.6/drivers/net/myri10ge/myri10ge.c 2008-07-21 09:24:21.000000000 +0200
@@ -125,7 +125,6 @@
struct myri10ge_rx_buf {
struct mcp_kreq_ether_recv __iomem *lanai; /* lanai ptr for recv ring */
- u8 __iomem *wc_fifo; /* w/c rx dma addr fifo address */
struct mcp_kreq_ether_recv *shadow; /* host shadow of recv ring */
struct myri10ge_rx_buffer_state *info;
struct page *page;
@@ -140,7 +139,6 @@
struct myri10ge_tx_buf {
struct mcp_kreq_ether_send __iomem *lanai; /* lanai ptr for sendq */
- u8 __iomem *wc_fifo; /* w/c send fifo address */
struct mcp_kreq_ether_send *req_list; /* host shadow of sendq */
char *req_bytes;
struct myri10ge_tx_buffer_state *info;
@@ -332,10 +330,6 @@
static int myri10ge_reset_recover = 1;
-static int myri10ge_wcfifo = 0;
-module_param(myri10ge_wcfifo, int, S_IRUGO);
-MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled");
-
static int myri10ge_max_slices = 1;
module_param(myri10ge_max_slices, int, S_IRUGO);
MODULE_PARM_DESC(myri10ge_max_slices, "Max tx/rx queues");
@@ -1218,14 +1212,8 @@
/* copy 8 descriptors to the firmware at a time */
if ((idx & 7) == 7) {
- if (rx->wc_fifo == NULL)
- myri10ge_submit_8rx(&rx->lanai[idx - 7],
- &rx->shadow[idx - 7]);
- else {
- mb();
- myri10ge_pio_copy(rx->wc_fifo,
- &rx->shadow[idx - 7], 64);
- }
+ myri10ge_submit_8rx(&rx->lanai[idx - 7],
+ &rx->shadow[idx - 7]);
}
}
}
@@ -2229,18 +2217,6 @@
ss->rx_big.lanai = (struct mcp_kreq_ether_recv ...Switch to ioremap_wc(). We keep the MTRR code since ioremap_wc()
will use UC_MINUS when falling back to uncachable, and thus let
the MTRR WC take precedence.
Also rename the error path better.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Index: linux-2.6/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-2.6.orig/drivers/net/myri10ge/myri10ge.c 2008-07-21 09:24:21.000000000 +0200
+++ linux-2.6/drivers/net/myri10ge/myri10ge.c 2008-07-21 09:24:33.000000000 +0200
@@ -3720,14 +3720,14 @@
if (mgp->sram_size > mgp->board_span) {
dev_err(&pdev->dev, "board span %ld bytes too small\n",
mgp->board_span);
- goto abort_with_wc;
+ goto abort_with_mtrr;
}
- mgp->sram = ioremap(mgp->iomem_base, mgp->board_span);
+ mgp->sram = ioremap_wc(mgp->iomem_base, mgp->board_span);
if (mgp->sram == NULL) {
dev_err(&pdev->dev, "ioremap failed for %ld bytes at 0x%lx\n",
mgp->board_span, mgp->iomem_base);
status = -ENXIO;
- goto abort_with_wc;
+ goto abort_with_mtrr;
}
memcpy_fromio(mgp->eeprom_strings,
mgp->sram + mgp->sram_size - MYRI10GE_EEPROM_STRINGS_SIZE,
@@ -3828,7 +3828,7 @@
abort_with_ioremap:
iounmap(mgp->sram);
-abort_with_wc:
+abort_with_mtrr:
#ifdef CONFIG_MTRR
if (mgp->mtrr >= 0)
mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span);
--
This change leads to a compilation failure on (at least) arm: CC [M] drivers/net/myri10ge/myri10ge.o drivers/net/myri10ge/myri10ge.c: In function ‘myri10ge_probe’: drivers/net/myri10ge/myri10ge.c:3725: error: implicit declaration of function ‘ioremap_wc’ drivers/net/myri10ge/myri10ge.c:3725: warning: assignment makes pointer from integer without a cast make[3]: *** [drivers/net/myri10ge/myri10ge.o] Error 1 -- Martin Michlmayr http://www.cyrius.com/ --
Isn't arm's asm/io.h supposed to get #ifndef ARCH_HAS_IOREMAP_WC #define ioremap_wc ioremap_nocache #endif from asm-generic/iomap.h since ARCH_HAS_IOREMAP_WC isn't defined on arm ? Brice --
arch/arm/include/asm/io.h doesn't include asm-generic/iomap.h. When I add this includes, myri10ge compiles. Russell, any comments on the change below? diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 94a95d7..eb71224 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -26,6 +26,7 @@ #include <linux/types.h> #include <asm/byteorder.h> #include <asm/memory.h> +#include <asm-generic/iomap.h> /* * ISA I/O bus memory addresses are 1:1 with the physical address. -- Martin Michlmayr http://www.cyrius.com/ --
Only that I'm not including asm-generic/iomap.h - we have our own iomap implementation, and the generic stuff in there isn't applicable to ARM. I believe Lennert is sorting out ioremap_wc(). --
In that case, let's add Lennert to the CC line. -- Martin Michlmayr http://www.cyrius.com/ --
