Hi Vlad, please apply the following fixes + backport adjustments for OFED-1.5.3.
The changes are tested with ./ofed_scripts/ofed_makedist.sh Signed-off-by: Alexander Schmidt <[email protected]> diff --git a/kernel_patches/backport/2.6.16_sles10_sp2/ehca-030-ibmebus_loc_code.patch b/kernel_patches/backport/2.6.16_sles10_sp2/ehca-030-ibmebus_loc_code.patch index 23a7f1e..2fea541 100644 --- a/kernel_patches/backport/2.6.16_sles10_sp2/ehca-030-ibmebus_loc_code.patch +++ b/kernel_patches/backport/2.6.16_sles10_sp2/ehca-030-ibmebus_loc_code.patch @@ -4,10 +4,10 @@ drivers/infiniband/hw/ehca/ehca_main.c | 49 ++++++++++++++---------------- 3 files changed, 27 insertions(+), 30 deletions(-) -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h +Index: ofed_kernel-2.6.16_sles10_sp2/drivers/infiniband/hw/ehca/ehca_classes.h =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-25 12:43:39.000000000 +0200 +--- ofed_kernel-2.6.16_sles10_sp2.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 05:15:26.000000000 -0500 ++++ ofed_kernel-2.6.16_sles10_sp2/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 05:20:26.000000000 -0500 @@ -112,7 +112,7 @@ struct ehca_shca { @@ -17,41 +17,41 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h u8 num_ports; int hw_level; struct list_head shca_list; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c +Index: ofed_kernel-2.6.16_sles10_sp2/drivers/infiniband/hw/ehca/ehca_eq.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-25 12:43:39.000000000 +0200 -@@ -122,7 +122,7 @@ - - /* register interrupt handlers and initialize work queues */ +--- ofed_kernel-2.6.16_sles10_sp2.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 05:15:27.000000000 -0500 ++++ ofed_kernel-2.6.16_sles10_sp2/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 05:21:46.000000000 -0500 +@@ -124,7 +124,7 @@ if (type == EHCA_EQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_eq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_eq, IRQF_DISABLED, "ehca_eq", (void *)shca); if (ret < 0) -@@ -130,7 +130,7 @@ - - tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); +@@ -132,7 +132,7 @@ } else if (type == EHCA_NEQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_neq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_neq, IRQF_DISABLED, "ehca_neq", (void *)shca); if (ret < 0) -@@ -169,7 +169,7 @@ int ehca_destroy_eq(struct ehca_shca *sh - unsigned long flags; - u64 h_ret; - -- ibmebus_free_irq(eq->ist, (void *)shca); -+ ibmebus_free_irq(NULL, eq->ist, (void *)shca); - - spin_lock_irqsave(&shca_list_lock, flags); - eq->is_initialized = 0; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c +@@ -169,7 +169,7 @@ + unsigned long flags; + u64 h_ret; + +- ibmebus_free_irq(eq->ist, (void *)shca); ++ ibmebus_free_irq(NULL, eq->ist, (void *)shca); + + spin_lock_irqsave(&shca_list_lock, flags); + eq->is_initialized = 0; +Index: ofed_kernel-2.6.16_sles10_sp2/drivers/infiniband/hw/ehca/ehca_main.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:42:48.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:45:40.000000000 +0200 +--- ofed_kernel-2.6.16_sles10_sp2.orig/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 05:16:09.000000000 -0500 ++++ ofed_kernel-2.6.16_sles10_sp2/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 05:20:26.000000000 -0500 @@ -289,8 +289,8 @@ }; @@ -63,7 +63,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (loc_code) ehca_gen_dbg(" ... location lode=%s", loc_code); -@@ -459,7 +459,7 @@ +@@ -460,7 +460,7 @@ shca->ib_device.node_type = RDMA_NODE_IB_CA; shca->ib_device.phys_port_cnt = shca->num_ports; shca->ib_device.num_comp_vectors = 1; @@ -72,7 +72,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c shca->ib_device.query_device = ehca_query_device; shca->ib_device.query_port = ehca_query_port; shca->ib_device.query_gid = ehca_query_gid; -@@ -620,11 +620,6 @@ +@@ -621,11 +621,6 @@ .attrs = ehca_drv_attrs }; @@ -84,7 +84,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c #define EHCA_RESOURCE_ATTR(name) \ static ssize_t ehca_show_##name(struct device *dev, \ struct device_attribute *attr, \ -@@ -708,7 +703,7 @@ +@@ -709,7 +704,7 @@ .attrs = ehca_dev_attrs }; @@ -93,7 +93,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c const struct of_device_id *id) { struct ehca_shca *shca; -@@ -717,16 +712,16 @@ +@@ -718,16 +713,16 @@ int ret, i, eq_size; unsigned long flags; @@ -113,7 +113,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c return -ENODEV; } -@@ -745,9 +740,9 @@ +@@ -746,9 +741,9 @@ for (i = 0; i < ARRAY_SIZE(shca->sport); i++) spin_lock_init(&shca->sport[i].mod_sqp_lock); @@ -125,7 +125,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c ret = ehca_sense_attributes(shca); if (ret < 0) { -@@ -824,7 +819,7 @@ +@@ -825,7 +820,7 @@ } } @@ -134,7 +134,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ret) /* only complain; we can live without attributes */ ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); -@@ -874,13 +869,13 @@ +@@ -875,13 +870,13 @@ return -EINVAL; } @@ -151,7 +151,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_open_aqp1 == 1) { int i; -@@ -932,14 +927,11 @@ +@@ -933,14 +928,11 @@ }; MODULE_DEVICE_TABLE(of, ehca_device_table); @@ -171,7 +171,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c }; void ehca_poll_eqs(unsigned long data) -@@ -998,6 +990,10 @@ +@@ -999,6 +991,10 @@ goto module_init2; } @@ -182,7 +182,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_poll_all_eqs != 1) { ehca_gen_err("WARNING!!!"); ehca_gen_err("It is possible to lose interrupts."); -@@ -1023,6 +1019,7 @@ +@@ -1024,6 +1020,7 @@ if (ehca_poll_all_eqs == 1) del_timer_sync(&poll_eqs_timer); diff --git a/kernel_patches/backport/2.6.16_sles10_sp3/ehca-030-ibmebus_loc_code.patch b/kernel_patches/backport/2.6.16_sles10_sp3/ehca-030-ibmebus_loc_code.patch index cf9b5bb..dc3c9d9 100644 --- a/kernel_patches/backport/2.6.16_sles10_sp3/ehca-030-ibmebus_loc_code.patch +++ b/kernel_patches/backport/2.6.16_sles10_sp3/ehca-030-ibmebus_loc_code.patch @@ -4,10 +4,10 @@ drivers/infiniband/hw/ehca/ehca_main.c | 49 ++++++++++++++---------------- 3 files changed, 27 insertions(+), 30 deletions(-) -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h +Index: ofed_kernel-2.6.16_sles10_sp3/drivers/infiniband/hw/ehca/ehca_classes.h =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-25 12:43:39.000000000 +0200 +--- ofed_kernel-2.6.16_sles10_sp3.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 05:25:56.000000000 -0500 ++++ ofed_kernel-2.6.16_sles10_sp3/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 05:29:34.000000000 -0500 @@ -112,7 +112,7 @@ struct ehca_shca { @@ -17,41 +17,41 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h u8 num_ports; int hw_level; struct list_head shca_list; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c +Index: ofed_kernel-2.6.16_sles10_sp3/drivers/infiniband/hw/ehca/ehca_eq.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-25 12:43:39.000000000 +0200 -@@ -122,7 +122,7 @@ - - /* register interrupt handlers and initialize work queues */ +--- ofed_kernel-2.6.16_sles10_sp3.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 05:25:57.000000000 -0500 ++++ ofed_kernel-2.6.16_sles10_sp3/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 05:30:39.000000000 -0500 +@@ -124,7 +124,7 @@ if (type == EHCA_EQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_eq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_eq, IRQF_DISABLED, "ehca_eq", (void *)shca); if (ret < 0) -@@ -130,7 +130,7 @@ - - tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); +@@ -132,7 +132,7 @@ } else if (type == EHCA_NEQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_neq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_neq, IRQF_DISABLED, "ehca_neq", (void *)shca); if (ret < 0) @@ -169,7 +169,7 @@ - unsigned long flags; - u64 h_ret; + unsigned long flags; + u64 h_ret; -- ibmebus_free_irq(eq->ist, (void *)shca); -+ ibmebus_free_irq(NULL, eq->ist, (void *)shca); +- ibmebus_free_irq(eq->ist, (void *)shca); ++ ibmebus_free_irq(NULL, eq->ist, (void *)shca); - spin_lock_irqsave(&shca_list_lock, flags); - eq->is_initialized = 0; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c + spin_lock_irqsave(&shca_list_lock, flags); + eq->is_initialized = 0; +Index: ofed_kernel-2.6.16_sles10_sp3/drivers/infiniband/hw/ehca/ehca_main.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:42:48.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:45:40.000000000 +0200 +--- ofed_kernel-2.6.16_sles10_sp3.orig/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 05:26:40.000000000 -0500 ++++ ofed_kernel-2.6.16_sles10_sp3/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 05:29:34.000000000 -0500 @@ -289,8 +289,8 @@ }; @@ -63,7 +63,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (loc_code) ehca_gen_dbg(" ... location lode=%s", loc_code); -@@ -459,7 +459,7 @@ +@@ -460,7 +460,7 @@ shca->ib_device.node_type = RDMA_NODE_IB_CA; shca->ib_device.phys_port_cnt = shca->num_ports; shca->ib_device.num_comp_vectors = 1; @@ -72,7 +72,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c shca->ib_device.query_device = ehca_query_device; shca->ib_device.query_port = ehca_query_port; shca->ib_device.query_gid = ehca_query_gid; -@@ -620,11 +620,6 @@ +@@ -621,11 +621,6 @@ .attrs = ehca_drv_attrs }; @@ -84,7 +84,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c #define EHCA_RESOURCE_ATTR(name) \ static ssize_t ehca_show_##name(struct device *dev, \ struct device_attribute *attr, \ -@@ -708,7 +703,7 @@ +@@ -709,7 +704,7 @@ .attrs = ehca_dev_attrs }; @@ -93,7 +93,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c const struct of_device_id *id) { struct ehca_shca *shca; -@@ -717,16 +712,16 @@ +@@ -718,16 +713,16 @@ int ret, i, eq_size; unsigned long flags; @@ -113,7 +113,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c return -ENODEV; } -@@ -745,9 +740,9 @@ +@@ -746,9 +741,9 @@ for (i = 0; i < ARRAY_SIZE(shca->sport); i++) spin_lock_init(&shca->sport[i].mod_sqp_lock); @@ -125,7 +125,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c ret = ehca_sense_attributes(shca); if (ret < 0) { -@@ -824,7 +819,7 @@ +@@ -825,7 +820,7 @@ } } @@ -134,7 +134,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ret) /* only complain; we can live without attributes */ ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); -@@ -874,13 +869,13 @@ +@@ -875,13 +870,13 @@ return -EINVAL; } @@ -151,7 +151,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_open_aqp1 == 1) { int i; -@@ -932,14 +927,11 @@ +@@ -933,14 +928,11 @@ }; MODULE_DEVICE_TABLE(of, ehca_device_table); @@ -171,7 +171,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c }; void ehca_poll_eqs(unsigned long data) -@@ -998,6 +990,10 @@ +@@ -999,6 +991,10 @@ goto module_init2; } @@ -182,7 +182,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_poll_all_eqs != 1) { ehca_gen_err("WARNING!!!"); ehca_gen_err("It is possible to lose interrupts."); -@@ -1023,6 +1019,7 @@ +@@ -1024,6 +1020,7 @@ if (ehca_poll_all_eqs == 1) del_timer_sync(&poll_eqs_timer); diff --git a/kernel_patches/backport/2.6.18-EL5.3/ehca-030-ibmebus_loc_code.patch b/kernel_patches/backport/2.6.18-EL5.3/ehca-030-ibmebus_loc_code.patch index cfc1595..8550a43 100644 --- a/kernel_patches/backport/2.6.18-EL5.3/ehca-030-ibmebus_loc_code.patch +++ b/kernel_patches/backport/2.6.18-EL5.3/ehca-030-ibmebus_loc_code.patch @@ -4,10 +4,10 @@ drivers/infiniband/hw/ehca/ehca_main.c | 49 ++++++++++++++---------------- 3 files changed, 27 insertions(+), 30 deletions(-) -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_classes.h =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-25 12:43:39.000000000 +0200 +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 07:04:10.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 07:11:26.000000000 -0500 @@ -112,7 +112,7 @@ struct ehca_shca { @@ -17,41 +17,41 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h u8 num_ports; int hw_level; struct list_head shca_list; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_eq.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-25 12:43:39.000000000 +0200 -@@ -122,7 +122,7 @@ - - /* register interrupt handlers and initialize work queues */ +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 07:04:11.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 07:12:11.000000000 -0500 +@@ -124,7 +124,7 @@ if (type == EHCA_EQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_eq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_eq, IRQF_DISABLED, "ehca_eq", (void *)shca); if (ret < 0) -@@ -130,7 +130,7 @@ - - tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); +@@ -132,7 +132,7 @@ } else if (type == EHCA_NEQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_neq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_neq, IRQF_DISABLED, "ehca_neq", (void *)shca); if (ret < 0) @@ -169,7 +169,7 @@ - unsigned long flags; - u64 h_ret; - -- ibmebus_free_irq(eq->ist, (void *)shca); -+ ibmebus_free_irq(NULL, eq->ist, (void *)shca); - - spin_lock_irqsave(&shca_list_lock, flags); - eq->is_initialized = 0; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c + unsigned long flags; + u64 h_ret; + +- ibmebus_free_irq(eq->ist, (void *)shca); ++ ibmebus_free_irq(NULL, eq->ist, (void *)shca); + + spin_lock_irqsave(&shca_list_lock, flags); + eq->is_initialized = 0; +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_main.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:42:48.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:45:40.000000000 +0200 +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 07:04:54.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 07:11:26.000000000 -0500 @@ -289,8 +289,8 @@ }; @@ -63,7 +63,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (loc_code) ehca_gen_dbg(" ... location lode=%s", loc_code); -@@ -459,7 +459,7 @@ +@@ -460,7 +460,7 @@ shca->ib_device.node_type = RDMA_NODE_IB_CA; shca->ib_device.phys_port_cnt = shca->num_ports; shca->ib_device.num_comp_vectors = 1; @@ -72,7 +72,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c shca->ib_device.query_device = ehca_query_device; shca->ib_device.query_port = ehca_query_port; shca->ib_device.query_gid = ehca_query_gid; -@@ -620,11 +620,6 @@ +@@ -621,11 +621,6 @@ .attrs = ehca_drv_attrs }; @@ -84,7 +84,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c #define EHCA_RESOURCE_ATTR(name) \ static ssize_t ehca_show_##name(struct device *dev, \ struct device_attribute *attr, \ -@@ -708,7 +703,7 @@ +@@ -709,7 +704,7 @@ .attrs = ehca_dev_attrs }; @@ -93,7 +93,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c const struct of_device_id *id) { struct ehca_shca *shca; -@@ -717,16 +712,16 @@ +@@ -718,16 +713,16 @@ int ret, i, eq_size; unsigned long flags; @@ -113,7 +113,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c return -ENODEV; } -@@ -745,9 +740,9 @@ +@@ -746,9 +741,9 @@ for (i = 0; i < ARRAY_SIZE(shca->sport); i++) spin_lock_init(&shca->sport[i].mod_sqp_lock); @@ -125,7 +125,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c ret = ehca_sense_attributes(shca); if (ret < 0) { -@@ -824,7 +819,7 @@ +@@ -825,7 +820,7 @@ } } @@ -134,7 +134,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ret) /* only complain; we can live without attributes */ ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); -@@ -874,13 +869,13 @@ +@@ -875,13 +870,13 @@ return -EINVAL; } @@ -151,7 +151,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_open_aqp1 == 1) { int i; -@@ -932,14 +927,11 @@ +@@ -933,14 +928,11 @@ }; MODULE_DEVICE_TABLE(of, ehca_device_table); @@ -171,7 +171,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c }; void ehca_poll_eqs(unsigned long data) -@@ -998,6 +990,10 @@ +@@ -999,6 +991,10 @@ goto module_init2; } @@ -182,7 +182,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_poll_all_eqs != 1) { ehca_gen_err("WARNING!!!"); ehca_gen_err("It is possible to lose interrupts."); -@@ -1023,6 +1019,7 @@ +@@ -1024,6 +1020,7 @@ if (ehca_poll_all_eqs == 1) del_timer_sync(&poll_eqs_timer); diff --git a/kernel_patches/backport/2.6.18-EL5.4/ehca-030-ibmebus_loc_code.patch b/kernel_patches/backport/2.6.18-EL5.4/ehca-030-ibmebus_loc_code.patch index cfc1595..8550a43 100644 --- a/kernel_patches/backport/2.6.18-EL5.4/ehca-030-ibmebus_loc_code.patch +++ b/kernel_patches/backport/2.6.18-EL5.4/ehca-030-ibmebus_loc_code.patch @@ -4,10 +4,10 @@ drivers/infiniband/hw/ehca/ehca_main.c | 49 ++++++++++++++---------------- 3 files changed, 27 insertions(+), 30 deletions(-) -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_classes.h =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-25 12:43:39.000000000 +0200 +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 07:04:10.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 07:11:26.000000000 -0500 @@ -112,7 +112,7 @@ struct ehca_shca { @@ -17,41 +17,41 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h u8 num_ports; int hw_level; struct list_head shca_list; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_eq.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-25 12:43:39.000000000 +0200 -@@ -122,7 +122,7 @@ - - /* register interrupt handlers and initialize work queues */ +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 07:04:11.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 07:12:11.000000000 -0500 +@@ -124,7 +124,7 @@ if (type == EHCA_EQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_eq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_eq, IRQF_DISABLED, "ehca_eq", (void *)shca); if (ret < 0) -@@ -130,7 +130,7 @@ - - tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); +@@ -132,7 +132,7 @@ } else if (type == EHCA_NEQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_neq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_neq, IRQF_DISABLED, "ehca_neq", (void *)shca); if (ret < 0) @@ -169,7 +169,7 @@ - unsigned long flags; - u64 h_ret; - -- ibmebus_free_irq(eq->ist, (void *)shca); -+ ibmebus_free_irq(NULL, eq->ist, (void *)shca); - - spin_lock_irqsave(&shca_list_lock, flags); - eq->is_initialized = 0; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c + unsigned long flags; + u64 h_ret; + +- ibmebus_free_irq(eq->ist, (void *)shca); ++ ibmebus_free_irq(NULL, eq->ist, (void *)shca); + + spin_lock_irqsave(&shca_list_lock, flags); + eq->is_initialized = 0; +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_main.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:42:48.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:45:40.000000000 +0200 +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 07:04:54.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 07:11:26.000000000 -0500 @@ -289,8 +289,8 @@ }; @@ -63,7 +63,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (loc_code) ehca_gen_dbg(" ... location lode=%s", loc_code); -@@ -459,7 +459,7 @@ +@@ -460,7 +460,7 @@ shca->ib_device.node_type = RDMA_NODE_IB_CA; shca->ib_device.phys_port_cnt = shca->num_ports; shca->ib_device.num_comp_vectors = 1; @@ -72,7 +72,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c shca->ib_device.query_device = ehca_query_device; shca->ib_device.query_port = ehca_query_port; shca->ib_device.query_gid = ehca_query_gid; -@@ -620,11 +620,6 @@ +@@ -621,11 +621,6 @@ .attrs = ehca_drv_attrs }; @@ -84,7 +84,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c #define EHCA_RESOURCE_ATTR(name) \ static ssize_t ehca_show_##name(struct device *dev, \ struct device_attribute *attr, \ -@@ -708,7 +703,7 @@ +@@ -709,7 +704,7 @@ .attrs = ehca_dev_attrs }; @@ -93,7 +93,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c const struct of_device_id *id) { struct ehca_shca *shca; -@@ -717,16 +712,16 @@ +@@ -718,16 +713,16 @@ int ret, i, eq_size; unsigned long flags; @@ -113,7 +113,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c return -ENODEV; } -@@ -745,9 +740,9 @@ +@@ -746,9 +741,9 @@ for (i = 0; i < ARRAY_SIZE(shca->sport); i++) spin_lock_init(&shca->sport[i].mod_sqp_lock); @@ -125,7 +125,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c ret = ehca_sense_attributes(shca); if (ret < 0) { -@@ -824,7 +819,7 @@ +@@ -825,7 +820,7 @@ } } @@ -134,7 +134,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ret) /* only complain; we can live without attributes */ ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); -@@ -874,13 +869,13 @@ +@@ -875,13 +870,13 @@ return -EINVAL; } @@ -151,7 +151,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_open_aqp1 == 1) { int i; -@@ -932,14 +927,11 @@ +@@ -933,14 +928,11 @@ }; MODULE_DEVICE_TABLE(of, ehca_device_table); @@ -171,7 +171,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c }; void ehca_poll_eqs(unsigned long data) -@@ -998,6 +990,10 @@ +@@ -999,6 +991,10 @@ goto module_init2; } @@ -182,7 +182,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_poll_all_eqs != 1) { ehca_gen_err("WARNING!!!"); ehca_gen_err("It is possible to lose interrupts."); -@@ -1023,6 +1019,7 @@ +@@ -1024,6 +1020,7 @@ if (ehca_poll_all_eqs == 1) del_timer_sync(&poll_eqs_timer); diff --git a/kernel_patches/backport/2.6.18-EL5.5/ehca-030-ibmebus_loc_code.patch b/kernel_patches/backport/2.6.18-EL5.5/ehca-030-ibmebus_loc_code.patch index cfc1595..8550a43 100644 --- a/kernel_patches/backport/2.6.18-EL5.5/ehca-030-ibmebus_loc_code.patch +++ b/kernel_patches/backport/2.6.18-EL5.5/ehca-030-ibmebus_loc_code.patch @@ -4,10 +4,10 @@ drivers/infiniband/hw/ehca/ehca_main.c | 49 ++++++++++++++---------------- 3 files changed, 27 insertions(+), 30 deletions(-) -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_classes.h =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h 2009-09-25 12:43:39.000000000 +0200 +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 07:04:10.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_classes.h 2011-01-03 07:11:26.000000000 -0500 @@ -112,7 +112,7 @@ struct ehca_shca { @@ -17,41 +17,41 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_classes.h u8 num_ports; int hw_level; struct list_head shca_list; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_eq.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-23 15:08:25.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_eq.c 2009-09-25 12:43:39.000000000 +0200 -@@ -122,7 +122,7 @@ - - /* register interrupt handlers and initialize work queues */ +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 07:04:11.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_eq.c 2011-01-03 07:12:11.000000000 -0500 +@@ -124,7 +124,7 @@ if (type == EHCA_EQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_eq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_eq, IRQF_DISABLED, "ehca_eq", (void *)shca); if (ret < 0) -@@ -130,7 +130,7 @@ - - tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); +@@ -132,7 +132,7 @@ } else if (type == EHCA_NEQ) { + tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); + - ret = ibmebus_request_irq(eq->ist, ehca_interrupt_neq, + ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_neq, IRQF_DISABLED, "ehca_neq", (void *)shca); if (ret < 0) @@ -169,7 +169,7 @@ - unsigned long flags; - u64 h_ret; - -- ibmebus_free_irq(eq->ist, (void *)shca); -+ ibmebus_free_irq(NULL, eq->ist, (void *)shca); - - spin_lock_irqsave(&shca_list_lock, flags); - eq->is_initialized = 0; -Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c + unsigned long flags; + u64 h_ret; + +- ibmebus_free_irq(eq->ist, (void *)shca); ++ ibmebus_free_irq(NULL, eq->ist, (void *)shca); + + spin_lock_irqsave(&shca_list_lock, flags); + eq->is_initialized = 0; +Index: ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_main.c =================================================================== ---- ofa_kernel-1.5.orig/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:42:48.000000000 +0200 -+++ ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c 2009-09-25 12:45:40.000000000 +0200 +--- ofed_kernel-2.6.18-EL5.3.orig/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 07:04:54.000000000 -0500 ++++ ofed_kernel-2.6.18-EL5.3/drivers/infiniband/hw/ehca/ehca_main.c 2011-01-03 07:11:26.000000000 -0500 @@ -289,8 +289,8 @@ }; @@ -63,7 +63,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (loc_code) ehca_gen_dbg(" ... location lode=%s", loc_code); -@@ -459,7 +459,7 @@ +@@ -460,7 +460,7 @@ shca->ib_device.node_type = RDMA_NODE_IB_CA; shca->ib_device.phys_port_cnt = shca->num_ports; shca->ib_device.num_comp_vectors = 1; @@ -72,7 +72,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c shca->ib_device.query_device = ehca_query_device; shca->ib_device.query_port = ehca_query_port; shca->ib_device.query_gid = ehca_query_gid; -@@ -620,11 +620,6 @@ +@@ -621,11 +621,6 @@ .attrs = ehca_drv_attrs }; @@ -84,7 +84,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c #define EHCA_RESOURCE_ATTR(name) \ static ssize_t ehca_show_##name(struct device *dev, \ struct device_attribute *attr, \ -@@ -708,7 +703,7 @@ +@@ -709,7 +704,7 @@ .attrs = ehca_dev_attrs }; @@ -93,7 +93,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c const struct of_device_id *id) { struct ehca_shca *shca; -@@ -717,16 +712,16 @@ +@@ -718,16 +713,16 @@ int ret, i, eq_size; unsigned long flags; @@ -113,7 +113,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c return -ENODEV; } -@@ -745,9 +740,9 @@ +@@ -746,9 +741,9 @@ for (i = 0; i < ARRAY_SIZE(shca->sport); i++) spin_lock_init(&shca->sport[i].mod_sqp_lock); @@ -125,7 +125,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c ret = ehca_sense_attributes(shca); if (ret < 0) { -@@ -824,7 +819,7 @@ +@@ -825,7 +820,7 @@ } } @@ -134,7 +134,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ret) /* only complain; we can live without attributes */ ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); -@@ -874,13 +869,13 @@ +@@ -875,13 +870,13 @@ return -EINVAL; } @@ -151,7 +151,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_open_aqp1 == 1) { int i; -@@ -932,14 +927,11 @@ +@@ -933,14 +928,11 @@ }; MODULE_DEVICE_TABLE(of, ehca_device_table); @@ -171,7 +171,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c }; void ehca_poll_eqs(unsigned long data) -@@ -998,6 +990,10 @@ +@@ -999,6 +991,10 @@ goto module_init2; } @@ -182,7 +182,7 @@ Index: ofa_kernel-1.5/drivers/infiniband/hw/ehca/ehca_main.c if (ehca_poll_all_eqs != 1) { ehca_gen_err("WARNING!!!"); ehca_gen_err("It is possible to lose interrupts."); -@@ -1023,6 +1019,7 @@ +@@ -1024,6 +1020,7 @@ if (ehca_poll_all_eqs == 1) del_timer_sync(&poll_eqs_timer); diff --git a/kernel_patches/fixes/ehca-0160-init_tasklet.patch b/kernel_patches/fixes/ehca-0160-init_tasklet.patch new file mode 100644 index 0000000..773c5bc --- /dev/null +++ b/kernel_patches/fixes/ehca-0160-init_tasklet.patch @@ -0,0 +1,42 @@ +commit bd5d0ccbef9f2565e76dba4ff291da6a2cb8b1b4 +Author: Alexander Schmidt <[email protected]> +Date: Mon Jul 5 11:41:56 2010 +0000 + + IB/ehca: Init irq tasklet before irq can happen + + Initialize tasklet before interrupts are requested to prevent + scheduling of an uninitialized tasklet. + + Signed-off-by: Alexander Schmidt <[email protected]> + Signed-off-by: Roland Dreier <[email protected]> + +diff --git a/drivers/infiniband/hw/ehca/ehca_eq.c b/drivers/infiniband/hw/ehca/ehca_eq.c +index 3b87589..d9b1bb4 100644 +--- a/drivers/infiniband/hw/ehca/ehca_eq.c ++++ b/drivers/infiniband/hw/ehca/ehca_eq.c +@@ -122,21 +122,21 @@ int ehca_create_eq(struct ehca_shca *shca, + + /* register interrupt handlers and initialize work queues */ + if (type == EHCA_EQ) { ++ tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); ++ + ret = ibmebus_request_irq(eq->ist, ehca_interrupt_eq, + IRQF_DISABLED, "ehca_eq", + (void *)shca); + if (ret < 0) + ehca_err(ib_dev, "Can't map interrupt handler."); +- +- tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca); + } else if (type == EHCA_NEQ) { ++ tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); ++ + ret = ibmebus_request_irq(eq->ist, ehca_interrupt_neq, + IRQF_DISABLED, "ehca_neq", + (void *)shca); + if (ret < 0) + ehca_err(ib_dev, "Can't map interrupt handler."); +- +- tasklet_init(&eq->interrupt_task, ehca_tasklet_neq, (long)shca); + } + + eq->is_initialized = 1; diff --git a/kernel_patches/fixes/ehca-0170-catch_failing_ioremap.patch b/kernel_patches/fixes/ehca-0170-catch_failing_ioremap.patch new file mode 100644 index 0000000..d46f723 --- /dev/null +++ b/kernel_patches/fixes/ehca-0170-catch_failing_ioremap.patch @@ -0,0 +1,120 @@ +commit e675b6db1245649f91bb1bfb10baef9af6d3f8e6 +Author: Alexander Schmidt <[email protected]> +Date: Mon Jul 5 16:19:25 2010 +0000 + + IB/ehca: Catch failing ioremap() + + When ioremap() fails with a NULL pointer, catch the error and pass it + to the caller of create_qp() or create_cq() instead of trying to + dereference the NULL pointer later on. + + Signed-off-by: Alexander Schmidt <[email protected]> + Signed-off-by: Roland Dreier <[email protected]> + +diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c +index 4d5dc33..e6f9cdd 100644 +--- a/drivers/infiniband/hw/ehca/hcp_if.c ++++ b/drivers/infiniband/hw/ehca/hcp_if.c +@@ -269,6 +269,7 @@ u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle, + struct ehca_cq *cq, + struct ehca_alloc_cq_parms *param) + { ++ int rc; + u64 ret; + unsigned long outs[PLPAR_HCALL9_BUFSIZE]; + +@@ -283,8 +284,19 @@ u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle, + param->act_nr_of_entries = (u32)outs[3]; + param->act_pages = (u32)outs[4]; + +- if (ret == H_SUCCESS) +- hcp_galpas_ctor(&cq->galpas, 0, outs[5], outs[6]); ++ if (ret == H_SUCCESS) { ++ rc = hcp_galpas_ctor(&cq->galpas, 0, outs[5], outs[6]); ++ if (rc) { ++ ehca_gen_err("Could not establish HW access. rc=%d paddr=%#lx", ++ rc, outs[5]); ++ ++ ehca_plpar_hcall_norets(H_FREE_RESOURCE, ++ adapter_handle.handle, /* r4 */ ++ cq->ipz_cq_handle.handle, /* r5 */ ++ 0, 0, 0, 0, 0); ++ ret = H_NO_MEM; ++ } ++ } + + if (ret == H_NOT_ENOUGH_RESOURCES) + ehca_gen_err("Not enough resources. ret=%lli", ret); +@@ -295,6 +307,7 @@ u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle, + u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle, + struct ehca_alloc_qp_parms *parms, int is_user) + { ++ int rc; + u64 ret; + u64 allocate_controls, max_r10_reg, r11, r12; + unsigned long outs[PLPAR_HCALL9_BUFSIZE]; +@@ -358,8 +371,19 @@ u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle, + parms->rqueue.queue_size = + (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, outs[4]); + +- if (ret == H_SUCCESS) +- hcp_galpas_ctor(&parms->galpas, is_user, outs[6], outs[6]); ++ if (ret == H_SUCCESS) { ++ rc = hcp_galpas_ctor(&parms->galpas, is_user, outs[6], outs[6]); ++ if (rc) { ++ ehca_gen_err("Could not establish HW access. rc=%d paddr=%#lx", ++ rc, outs[6]); ++ ++ ehca_plpar_hcall_norets(H_FREE_RESOURCE, ++ adapter_handle.handle, /* r4 */ ++ parms->qp_handle.handle, /* r5 */ ++ 0, 0, 0, 0, 0); ++ ret = H_NO_MEM; ++ } ++ } + + if (ret == H_NOT_ENOUGH_RESOURCES) + ehca_gen_err("Not enough resources. ret=%lli", ret); +diff --git a/drivers/infiniband/hw/ehca/hcp_phyp.c b/drivers/infiniband/hw/ehca/hcp_phyp.c +index b3e0e72..077376f 100644 +--- a/drivers/infiniband/hw/ehca/hcp_phyp.c ++++ b/drivers/infiniband/hw/ehca/hcp_phyp.c +@@ -42,10 +42,9 @@ + #include "ehca_classes.h" + #include "hipz_hw.h" + +-int hcall_map_page(u64 physaddr, u64 *mapaddr) ++u64 hcall_map_page(u64 physaddr) + { +- *mapaddr = (u64)(ioremap(physaddr, EHCA_PAGESIZE)); +- return 0; ++ return (u64)ioremap(physaddr, EHCA_PAGESIZE); + } + + int hcall_unmap_page(u64 mapaddr) +@@ -58,9 +57,9 @@ int hcp_galpas_ctor(struct h_galpas *galpas, int is_user, + u64 paddr_kernel, u64 paddr_user) + { + if (!is_user) { +- int ret = hcall_map_page(paddr_kernel, &galpas->kernel.fw_handle); +- if (ret) +- return ret; ++ galpas->kernel.fw_handle = hcall_map_page(paddr_kernel); ++ if (!galpas->kernel.fw_handle) ++ return -ENOMEM; + } else + galpas->kernel.fw_handle = 0; + +diff --git a/drivers/infiniband/hw/ehca/hcp_phyp.h b/drivers/infiniband/hw/ehca/hcp_phyp.h +index 204227d..d1b0299 100644 +--- a/drivers/infiniband/hw/ehca/hcp_phyp.h ++++ b/drivers/infiniband/hw/ehca/hcp_phyp.h +@@ -83,7 +83,7 @@ int hcp_galpas_ctor(struct h_galpas *galpas, int is_user, + + int hcp_galpas_dtor(struct h_galpas *galpas); + +-int hcall_map_page(u64 physaddr, u64 * mapaddr); ++u64 hcall_map_page(u64 physaddr); + + int hcall_unmap_page(u64 mapaddr); + _______________________________________________ ewg mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg
