]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ehea: 64K page kernel support fix
authorJan-Bernd Themann <ossthema@de.ibm.com>
Tue, 16 Oct 2007 13:45:23 +0000 (15:45 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 16 Nov 2007 17:25:34 +0000 (09:25 -0800)
based on 2c69448bbcedebeb8409ddb05fbc7d3fe1cfbda7 in mainline.

The current eHEA module compiled for 64K page kernels can not
be loaded with insmod due to bad hypervisor call parameters.
The patch is a subset of the follwing patch which has been applied
for 2.6.24 upstream:

http://www.spinics.net/lists/netdev/msg42814.html

Signed-off-by: Jan-Bernd Themann <themann@de.ibm.com>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/net/ehea/ehea_qmr.c
drivers/net/ehea/ehea_qmr.h

index c82e245960746ed2f126a4f4b78d77ec30eba3bc..329a25248d75c13aa7a6d5ca348675dd6c08bddc 100644 (file)
@@ -563,8 +563,7 @@ int ehea_destroy_qp(struct ehea_qp *qp)
 int ehea_create_busmap( void )
 {
        u64 vaddr = EHEA_BUSMAP_START;
-       unsigned long abs_max_pfn = 0;
-       unsigned long sec_max_pfn;
+       unsigned long high_section_index = 0;
        int i;
 
        /*
@@ -574,14 +573,10 @@ int ehea_create_busmap( void )
        ehea_bmap.valid_sections = 0;
 
        for (i = 0; i < NR_MEM_SECTIONS; i++)
-               if (valid_section_nr(i)) {
-                       sec_max_pfn = section_nr_to_pfn(i);
-                       if (sec_max_pfn > abs_max_pfn)
-                               abs_max_pfn = sec_max_pfn;
-                       ehea_bmap.valid_sections++;
-               }
+               if (valid_section_nr(i))
+                       high_section_index = i;
 
-       ehea_bmap.entries = abs_max_pfn / EHEA_PAGES_PER_SECTION + 1;
+       ehea_bmap.entries = high_section_index + 1;
        ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr));
 
        if (!ehea_bmap.vaddr)
@@ -593,6 +588,7 @@ int ehea_create_busmap( void )
                if (pfn_valid(pfn)) {
                        ehea_bmap.vaddr[i] = vaddr;
                        vaddr += EHEA_SECTSIZE;
+                       ehea_bmap.valid_sections++;
                } else
                        ehea_bmap.vaddr[i] = 0;
        }
@@ -637,7 +633,7 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
 
        mr_len = ehea_bmap.valid_sections * EHEA_SECTSIZE;
 
-       pt =  kzalloc(EHEA_MAX_RPAGE * sizeof(u64), GFP_KERNEL);
+       pt =  kzalloc(PAGE_SIZE, GFP_KERNEL);
        if (!pt) {
                ehea_error("no mem");
                ret = -ENOMEM;
@@ -660,8 +656,8 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
                        void *sectbase = __va(i << SECTION_SIZE_BITS);
                        unsigned long k = 0;
 
-                       for (j = 0; j < (PAGES_PER_SECTION / EHEA_MAX_RPAGE);
-                             j++) {
+                       for (j = 0; j < (EHEA_PAGES_PER_SECTION /
+                                        EHEA_MAX_RPAGE); j++) {
 
                                for (m = 0; m < EHEA_MAX_RPAGE; m++) {
                                        pg = sectbase + ((k++) * EHEA_PAGESIZE);
index b71f8452a5e36be88a5c1d4283695f4cfec1a261..352cb3858527c16a04aaca93d3efdfaf95b75e53 100644 (file)
@@ -39,7 +39,7 @@
 #define EHEA_PAGESHIFT         12
 #define EHEA_PAGESIZE          (1UL << EHEA_PAGESHIFT)
 #define EHEA_SECTSIZE          (1UL << 24)
-#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> PAGE_SHIFT)
+#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT)
 
 #if (1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE
 #error eHEA module can't work if kernel sectionsize < ehea sectionsize