[PATCH 2.6.19-rc3 2/2] ehea: 64K page support fix
From: Jan-Bernd Themann <hidden>
Date: 2006-10-25 12:01:35
This patch fixes the 64K page support Signed-off-by: Jan-Bernd Themann <redacted> --- drivers/net/ehea/ehea.h | 2 +- drivers/net/ehea/ehea_phyp.h | 14 +++++++++++++- drivers/net/ehea/ehea_qmr.c | 13 +++++++------ 3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h
index b40724f..cd412b5 100644
--- a/drivers/net/ehea/ehea.h
+++ b/drivers/net/ehea/ehea.h@@ -39,7 +39,7 @@ #include <asm/abs_addr.h> #include <asm/io.h> #define DRV_NAME "ehea" -#define DRV_VERSION "EHEA_0034" +#define DRV_VERSION "EHEA_0040" #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
diff --git a/drivers/net/ehea/ehea_phyp.h b/drivers/net/ehea/ehea_phyp.h
index fa51e3b..59ab646 100644
--- a/drivers/net/ehea/ehea_phyp.h
+++ b/drivers/net/ehea/ehea_phyp.h@@ -81,15 +81,27 @@ #define NELR_PORTSTATE_CHG EHEA_BMASK_IB static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel, u64 paddr_user) { +#ifdef CONFIG_PPC_64K_PAGES + /* To support 64k pages we must round to 64k page boundary */ + epas->kernel.addr = + ioremap((paddr_kernel & 0xFFFFFFFFFFFF0000), PAGE_SIZE) + + (paddr_kernel & 0xFFFF); +#else epas->kernel.addr = ioremap(paddr_kernel, PAGE_SIZE); +#endif epas->user.addr = paddr_user; } static inline void hcp_epas_dtor(struct h_epas *epas) { +#ifdef CONFIG_PPC_64K_PAGES + if (epas->kernel.addr) + iounmap((void __iomem*)((u64)epas->kernel.addr & + 0xFFFFFFFFFFFF0000)); +#else if (epas->kernel.addr) iounmap(epas->kernel.addr); - +#endif epas->user.addr = 0; epas->kernel.addr = 0; }
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c
index 3e18623..3daedfa 100644
--- a/drivers/net/ehea/ehea_qmr.c
+++ b/drivers/net/ehea/ehea_qmr.c@@ -512,7 +512,7 @@ int ehea_reg_mr_adapter(struct ehea_adap start = KERNELBASE; end = (u64)high_memory; - nr_pages = (end - start) / PAGE_SIZE; + nr_pages = (end - start) / EHEA_PAGESIZE; pt = kzalloc(PAGE_SIZE, GFP_KERNEL); if (!pt) {
@@ -538,9 +538,9 @@ int ehea_reg_mr_adapter(struct ehea_adap if (nr_pages > 1) { u64 num_pages = min(nr_pages, (u64)512); for (i = 0; i < num_pages; i++) - pt[i] = virt_to_abs((void*)(((u64)start) - + ((k++) * - PAGE_SIZE))); + pt[i] = virt_to_abs((void*)(((u64)start) + + ((k++) * + EHEA_PAGESIZE))); hret = ehea_h_register_rpage_mr(adapter->handle, adapter->mr.handle, 0,
@@ -548,8 +548,9 @@ int ehea_reg_mr_adapter(struct ehea_adap num_pages); nr_pages -= num_pages; } else { - u64 abs_adr = virt_to_abs((void*)(((u64)start) - + (k * PAGE_SIZE))); + u64 abs_adr = virt_to_abs((void*)(((u64)start) + + (k * EHEA_PAGESIZE))); + hret = ehea_h_register_rpage_mr(adapter->handle, adapter->mr.handle, 0, 0, abs_adr,1);