]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/hw/ehca/hcp_if.c
IB/ehca: Move high-volume debug output to higher debug levels
[linux-2.6-omap-h63xx.git] / drivers / infiniband / hw / ehca / hcp_if.c
index 24f454162f2479029255a3b4097a6ad7b0a61c0b..5245e13c3a30aac8dc4ebfdc3728499f4c2270f6 100644 (file)
 #define H_MP_SHUTDOWN                   EHCA_BMASK_IBM(48, 48)
 #define H_MP_RESET_QKEY_CTR             EHCA_BMASK_IBM(49, 49)
 
+#define HCALL4_REGS_FORMAT "r4=%lx r5=%lx r6=%lx r7=%lx"
+#define HCALL7_REGS_FORMAT HCALL4_REGS_FORMAT " r8=%lx r9=%lx r10=%lx"
+#define HCALL9_REGS_FORMAT HCALL7_REGS_FORMAT " r11=%lx r12=%lx"
+
 static DEFINE_SPINLOCK(hcall_lock);
 
 static u32 get_longbusy_msecs(int longbusy_rc)
@@ -117,15 +121,23 @@ static long ehca_plpar_hcall_norets(unsigned long opcode,
 {
        long ret;
        int i, sleep_msecs;
+       unsigned long flags = 0;
 
-       ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx "
-                    "arg5=%lx arg6=%lx arg7=%lx",
-                    opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+       if (unlikely(ehca_debug_level >= 2))
+               ehca_gen_dbg("opcode=%lx " HCALL7_REGS_FORMAT,
+                            opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
 
        for (i = 0; i < 5; i++) {
+               /* serialize hCalls to work around firmware issue */
+               if (ehca_lock_hcalls)
+                       spin_lock_irqsave(&hcall_lock, flags);
+
                ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4,
                                         arg5, arg6, arg7);
 
+               if (ehca_lock_hcalls)
+                       spin_unlock_irqrestore(&hcall_lock, flags);
+
                if (H_IS_LONG_BUSY(ret)) {
                        sleep_msecs = get_longbusy_msecs(ret);
                        msleep_interruptible(sleep_msecs);
@@ -133,16 +145,14 @@ static long ehca_plpar_hcall_norets(unsigned long opcode,
                }
 
                if (ret < H_SUCCESS)
-                       ehca_gen_err("opcode=%lx ret=%lx"
-                                    " arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
-                                    " arg5=%lx arg6=%lx arg7=%lx ",
-                                    opcode, ret,
-                                    arg1, arg2, arg3, arg4, arg5,
-                                    arg6, arg7);
-
-               ehca_gen_dbg("opcode=%lx ret=%lx", opcode, ret);
-               return ret;
+                       ehca_gen_err("opcode=%lx ret=%li " HCALL7_REGS_FORMAT,
+                                    opcode, ret, arg1, arg2, arg3,
+                                    arg4, arg5, arg6, arg7);
+               else
+                       if (unlikely(ehca_debug_level >= 2))
+                               ehca_gen_dbg("opcode=%lx ret=%li", opcode, ret);
 
+               return ret;
        }
 
        return H_BUSY;
@@ -161,25 +171,24 @@ static long ehca_plpar_hcall9(unsigned long opcode,
                              unsigned long arg9)
 {
        long ret;
-       int i, sleep_msecs, lock_is_set = 0;
+       int i, sleep_msecs;
        unsigned long flags = 0;
 
-       ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx "
-                    "arg5=%lx arg6=%lx arg7=%lx arg8=%lx arg9=%lx",
-                    opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7,
-                    arg8, arg9);
+       if (unlikely(ehca_debug_level >= 2))
+               ehca_gen_dbg("INPUT -- opcode=%lx " HCALL9_REGS_FORMAT, opcode,
+                            arg1, arg2, arg3, arg4, arg5,
+                            arg6, arg7, arg8, arg9);
 
        for (i = 0; i < 5; i++) {
-               if ((opcode == H_ALLOC_RESOURCE) && (arg2 == 5)) {
+               /* serialize hCalls to work around firmware issue */
+               if (ehca_lock_hcalls)
                        spin_lock_irqsave(&hcall_lock, flags);
-                       lock_is_set = 1;
-               }
 
                ret = plpar_hcall9(opcode, outs,
                                   arg1, arg2, arg3, arg4, arg5,
                                   arg6, arg7, arg8, arg9);
 
-               if (lock_is_set)
+               if (ehca_lock_hcalls)
                        spin_unlock_irqrestore(&hcall_lock, flags);
 
                if (H_IS_LONG_BUSY(ret)) {
@@ -188,26 +197,19 @@ static long ehca_plpar_hcall9(unsigned long opcode,
                        continue;
                }
 
-               if (ret < H_SUCCESS)
-                       ehca_gen_err("opcode=%lx ret=%lx"
-                                    " arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
-                                    " arg5=%lx arg6=%lx arg7=%lx arg8=%lx"
-                                    " arg9=%lx"
-                                    " out1=%lx out2=%lx out3=%lx out4=%lx"
-                                    " out5=%lx out6=%lx out7=%lx out8=%lx"
-                                    " out9=%lx",
-                                    opcode, ret,
-                                    arg1, arg2, arg3, arg4, arg5,
-                                    arg6, arg7, arg8, arg9,
-                                    outs[0], outs[1], outs[2], outs[3],
+               if (ret < H_SUCCESS) {
+                       ehca_gen_err("INPUT -- opcode=%lx " HCALL9_REGS_FORMAT,
+                                    opcode, arg1, arg2, arg3, arg4, arg5,
+                                    arg6, arg7, arg8, arg9);
+                       ehca_gen_err("OUTPUT -- ret=%li " HCALL9_REGS_FORMAT,
+                                    ret, outs[0], outs[1], outs[2], outs[3],
+                                    outs[4], outs[5], outs[6], outs[7],
+                                    outs[8]);
+               } else if (unlikely(ehca_debug_level >= 2))
+                       ehca_gen_dbg("OUTPUT -- ret=%li " HCALL9_REGS_FORMAT,
+                                    ret, outs[0], outs[1], outs[2], outs[3],
                                     outs[4], outs[5], outs[6], outs[7],
                                     outs[8]);
-
-               ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx "
-                            "out4=%lx out5=%lx out6=%lx out7=%lx out8=%lx "
-                            "out9=%lx",
-                            opcode, ret, outs[0], outs[1], outs[2], outs[3],
-                            outs[4], outs[5], outs[6], outs[7], outs[8]);
                return ret;
        }
 
@@ -247,7 +249,7 @@ u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle,
        *eq_ist = (u32)outs[5];
 
        if (ret == H_NOT_ENOUGH_RESOURCES)
-               ehca_gen_err("Not enough resource - ret=%lx ", ret);
+               ehca_gen_err("Not enough resource - ret=%li ", ret);
 
        return ret;
 }
@@ -285,7 +287,7 @@ u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle,
                hcp_galpas_ctor(&cq->galpas, outs[5], outs[6]);
 
        if (ret == H_NOT_ENOUGH_RESOURCES)
-               ehca_gen_err("Not enough resources. ret=%lx", ret);
+               ehca_gen_err("Not enough resources. ret=%li", ret);
 
        return ret;
 }
@@ -360,7 +362,7 @@ u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle,
                hcp_galpas_ctor(&parms->galpas, outs[6], outs[6]);
 
        if (ret == H_NOT_ENOUGH_RESOURCES)
-               ehca_gen_err("Not enough resources. ret=%lx", ret);
+               ehca_gen_err("Not enough resources. ret=%li", ret);
 
        return ret;
 }
@@ -383,7 +385,7 @@ u64 hipz_h_query_port(const struct ipz_adapter_handle adapter_handle,
                                      r_cb,                  /* r6 */
                                      0, 0, 0, 0);
 
-       if (ehca_debug_level)
+       if (ehca_debug_level >= 2)
                ehca_dmp(query_port_response_block, 64, "response_block");
 
        return ret;
@@ -555,7 +557,7 @@ u64 hipz_h_modify_qp(const struct ipz_adapter_handle adapter_handle,
                                0, 0, 0, 0, 0);
 
        if (ret == H_NOT_ENOUGH_RESOURCES)
-               ehca_gen_err("Insufficient resources ret=%lx", ret);
+               ehca_gen_err("Insufficient resources ret=%li", ret);
 
        return ret;
 }
@@ -591,7 +593,7 @@ u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle,
                                qp->ipz_qp_handle.handle,  /* r6 */
                                0, 0, 0, 0, 0, 0);
        if (ret == H_HARDWARE)
-               ehca_gen_err("HCA not operational. ret=%lx", ret);
+               ehca_gen_err("HCA not operational. ret=%li", ret);
 
        ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
                                      adapter_handle.handle,     /* r4 */
@@ -599,7 +601,7 @@ u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle,
                                      0, 0, 0, 0, 0);
 
        if (ret == H_RESOURCE)
-               ehca_gen_err("Resource still in use. ret=%lx", ret);
+               ehca_gen_err("Resource still in use. ret=%li", ret);
 
        return ret;
 }
@@ -634,7 +636,7 @@ u64 hipz_h_define_aqp1(const struct ipz_adapter_handle adapter_handle,
        *bma_qp_nr = (u32)outs[1];
 
        if (ret == H_ALIAS_EXIST)
-               ehca_gen_err("AQP1 already exists. ret=%lx", ret);
+               ehca_gen_err("AQP1 already exists. ret=%li", ret);
 
        return ret;
 }
@@ -656,7 +658,7 @@ u64 hipz_h_attach_mcqp(const struct ipz_adapter_handle adapter_handle,
                                      0, 0);
 
        if (ret == H_NOT_ENOUGH_RESOURCES)
-               ehca_gen_err("Not enough resources. ret=%lx", ret);
+               ehca_gen_err("Not enough resources. ret=%li", ret);
 
        return ret;
 }
@@ -695,7 +697,7 @@ u64 hipz_h_destroy_cq(const struct ipz_adapter_handle adapter_handle,
                                      0, 0, 0, 0);
 
        if (ret == H_RESOURCE)
-               ehca_gen_err("H_FREE_RESOURCE failed ret=%lx ", ret);
+               ehca_gen_err("H_FREE_RESOURCE failed ret=%li ", ret);
 
        return ret;
 }
@@ -717,7 +719,7 @@ u64 hipz_h_destroy_eq(const struct ipz_adapter_handle adapter_handle,
                                      0, 0, 0, 0, 0);
 
        if (ret == H_RESOURCE)
-               ehca_gen_err("Resource in use. ret=%lx ", ret);
+               ehca_gen_err("Resource in use. ret=%li ", ret);
 
        return ret;
 }
@@ -733,9 +735,6 @@ u64 hipz_h_alloc_resource_mr(const struct ipz_adapter_handle adapter_handle,
        u64 ret;
        u64 outs[PLPAR_HCALL9_BUFSIZE];
 
-       ehca_gen_dbg("kernel PAGE_SIZE=%x access_ctrl=%016x "
-                    "vaddr=%lx length=%lx",
-                    (u32)PAGE_SIZE, access_ctrl, vaddr, length);
        ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
                                adapter_handle.handle,            /* r4 */
                                5,                                /* r5 */
@@ -760,7 +759,7 @@ u64 hipz_h_register_rpage_mr(const struct ipz_adapter_handle adapter_handle,
 {
        u64 ret;
 
-       if (unlikely(ehca_debug_level >= 2)) {
+       if (unlikely(ehca_debug_level >= 3)) {
                if (count > 1) {
                        u64 *kpage;
                        int i;