]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/hw/ehca/ehca_main.c
IB/ehca: Fix reported max number of QPs and CQs in systems with >1 adapter
[linux-2.6-omap-h63xx.git] / drivers / infiniband / hw / ehca / ehca_main.c
index 598844d2edc93131a0cd1c9264035e1651f2097a..086959a0cbee2e10dae8dfd9ff7ed0792684bcde 100644 (file)
@@ -366,22 +366,23 @@ static int ehca_sense_attributes(struct ehca_shca *shca)
                        shca->hca_cap_mr_pgsize |= pgsize_map[i + 1];
 
        /* Set maximum number of CQs and QPs to calculate EQ size */
-       if (ehca_max_qp == -1)
-               ehca_max_qp = min_t(int, rblock->max_qp, EHCA_MAX_NUM_QUEUES);
-       else if (ehca_max_qp < 1 || ehca_max_qp > rblock->max_qp) {
-               ehca_gen_err("Requested number of QPs is out of range (1 - %i) "
-                       "specified by HW", rblock->max_qp);
-               ret = -EINVAL;
-               goto sense_attributes1;
+       if (shca->max_num_qps == -1)
+               shca->max_num_qps = min_t(int, rblock->max_qp,
+                                         EHCA_MAX_NUM_QUEUES);
+       else if (shca->max_num_qps < 1 || shca->max_num_qps > rblock->max_qp) {
+               ehca_gen_warn("The requested number of QPs is out of range "
+                             "(1 - %i) specified by HW. Value is set to %i",
+                             rblock->max_qp, rblock->max_qp);
+               shca->max_num_qps = rblock->max_qp;
        }
 
-       if (ehca_max_cq == -1)
-               ehca_max_cq = min_t(int, rblock->max_cq, EHCA_MAX_NUM_QUEUES);
-       else if (ehca_max_cq < 1 || ehca_max_cq > rblock->max_cq) {
-               ehca_gen_err("Requested number of CQs is out of range (1 - %i) "
-                       "specified by HW", rblock->max_cq);
-               ret = -EINVAL;
-               goto sense_attributes1;
+       if (shca->max_num_cqs == -1)
+               shca->max_num_cqs = min_t(int, rblock->max_cq,
+                                         EHCA_MAX_NUM_QUEUES);
+       else if (shca->max_num_cqs < 1 || shca->max_num_cqs > rblock->max_cq) {
+               ehca_gen_warn("The requested number of CQs is out of range "
+                             "(1 - %i) specified by HW. Value is set to %i",
+                             rblock->max_cq, rblock->max_cq);
        }
 
        /* query max MTU from first port -- it's the same for all ports */
@@ -733,9 +734,13 @@ static int __devinit ehca_probe(struct of_device *dev,
                ehca_gen_err("Cannot allocate shca memory.");
                return -ENOMEM;
        }
+
        mutex_init(&shca->modify_mutex);
        atomic_set(&shca->num_cqs, 0);
        atomic_set(&shca->num_qps, 0);
+       shca->max_num_qps = ehca_max_qp;
+       shca->max_num_cqs = ehca_max_cq;
+
        for (i = 0; i < ARRAY_SIZE(shca->sport); i++)
                spin_lock_init(&shca->sport[i].mod_sqp_lock);
 
@@ -755,7 +760,7 @@ static int __devinit ehca_probe(struct of_device *dev,
                goto probe1;
        }
 
-       eq_size = 2 * ehca_max_cq + 4 * ehca_max_qp;
+       eq_size = 2 * shca->max_num_cqs + 4 * shca->max_num_qps;
        /* create event queues */
        ret = ehca_create_eq(shca, &shca->eq, EHCA_EQ, eq_size);
        if (ret) {