net: qed: invoke err notify on critical areas
authorIgor Russkikh <irusskikh@marvell.com>
Thu, 14 May 2020 09:57:19 +0000 (12:57 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 14 May 2020 20:25:46 +0000 (13:25 -0700)
In a number of critical places not only debug trace should be printed,
but the appropriate hw error condition should be raised and error
handling/recovery should start.

Introduce our new qed_hw_err_notify invocation in these places to
record and indicate critical error conditions in hardware.

Signed-off-by: Ariel Elior <ariel.elior@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_dev.c
drivers/net/ethernet/qlogic/qed/qed_hw.c
drivers/net/ethernet/qlogic/qed/qed_int.c
drivers/net/ethernet/qlogic/qed/qed_mcp.c
drivers/net/ethernet/qlogic/qed/qed_spq.c

index 7119a18..6e85746 100644 (file)
@@ -3085,7 +3085,9 @@ int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
                        rc = qed_final_cleanup(p_hwfn, p_hwfn->p_main_ptt,
                                               p_hwfn->rel_pf_id, false);
                        if (rc) {
-                               DP_NOTICE(p_hwfn, "Final cleanup failed\n");
+                               qed_hw_err_notify(p_hwfn, p_hwfn->p_main_ptt,
+                                                 QED_HW_ERR_RAMROD_FAIL,
+                                                 "Final cleanup failed\n");
                                goto load_err;
                        }
                }
index 90b7770..2d176e1 100644 (file)
@@ -762,9 +762,10 @@ static int qed_dmae_execute_command(struct qed_hwfn *p_hwfn,
                                                            dst_type,
                                                            length_cur);
                if (qed_status) {
-                       DP_NOTICE(p_hwfn,
-                                 "qed_dmae_execute_sub_operation Failed with error 0x%x. source_addr 0x%llx, destination addr 0x%llx, size_in_dwords 0x%x\n",
-                                 qed_status, src_addr, dst_addr, length_cur);
+                       qed_hw_err_notify(p_hwfn, p_ptt, QED_HW_ERR_DMAE_FAIL,
+                                         "qed_dmae_execute_sub_operation Failed with error 0x%x. source_addr 0x%llx, destination addr 0x%llx, size_in_dwords 0x%x\n",
+                                         qed_status, src_addr,
+                                         dst_addr, length_cur);
                        break;
                }
        }
index 9f51136..1b1447b 100644 (file)
@@ -363,6 +363,14 @@ static int qed_pglueb_rbc_attn_cb(struct qed_hwfn *p_hwfn)
        return qed_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_dpc_ptt);
 }
 
+static int qed_fw_assertion(struct qed_hwfn *p_hwfn)
+{
+       qed_hw_err_notify(p_hwfn, p_hwfn->p_dpc_ptt, QED_HW_ERR_FW_ASSERT,
+                         "FW assertion!\n");
+
+       return -EINVAL;
+}
+
 #define QED_DORQ_ATTENTION_REASON_MASK  (0xfffff)
 #define QED_DORQ_ATTENTION_OPAQUE_MASK  (0xffff)
 #define QED_DORQ_ATTENTION_OPAQUE_SHIFT (0x0)
@@ -606,7 +614,8 @@ static struct aeu_invert_reg aeu_descs[NUM_ATTN_REGS] = {
        {
                {       /* After Invert 4 */
                        {"General Attention 32", ATTENTION_SINGLE,
-                        NULL, MAX_BLOCK_ID},
+                        qed_fw_assertion,
+                        MAX_BLOCK_ID},
                        {"General Attention %d",
                         (2 << ATTENTION_LENGTH_SHIFT) |
                         (33 << ATTENTION_OFFSET_SHIFT), NULL, MAX_BLOCK_ID},
@@ -927,9 +936,12 @@ qed_int_deassertion_aeu_bit(struct qed_hwfn *p_hwfn,
                qed_int_attn_print(p_hwfn, p_aeu->block_index,
                                   ATTN_TYPE_INTERRUPT, !b_fatal);
 
-
-       /* If the attention is benign, no need to prevent it */
-       if (!rc)
+       /* Reach assertion if attention is fatal */
+       if (b_fatal)
+               qed_hw_err_notify(p_hwfn, p_hwfn->p_dpc_ptt, QED_HW_ERR_HW_ATTN,
+                                 "`%s': Fatal attention\n",
+                                 p_bit_name);
+       else /* If the attention is benign, no need to prevent it */
                goto out;
 
        /* Prevent this Attention from being asserted in the future */
index 280527c..46653af 100644 (file)
@@ -575,6 +575,8 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
                if (!QED_MB_FLAGS_IS_SET(p_mb_params, AVOID_BLOCK))
                        qed_mcp_cmd_set_blocking(p_hwfn, true);
 
+               qed_hw_err_notify(p_hwfn, p_ptt,
+                                 QED_HW_ERR_MFW_RESP_FAIL, NULL);
                return -EAGAIN;
        }
 
index f5f3c03..790c28d 100644 (file)
@@ -160,12 +160,16 @@ static int qed_spq_block(struct qed_hwfn *p_hwfn,
                return 0;
        }
 err:
-       DP_NOTICE(p_hwfn,
-                 "Ramrod is stuck [CID %08x cmd %02x protocol %02x echo %04x]\n",
-                 le32_to_cpu(p_ent->elem.hdr.cid),
-                 p_ent->elem.hdr.cmd_id,
-                 p_ent->elem.hdr.protocol_id,
-                 le16_to_cpu(p_ent->elem.hdr.echo));
+       p_ptt = qed_ptt_acquire(p_hwfn);
+       if (!p_ptt)
+               return -EBUSY;
+       qed_hw_err_notify(p_hwfn, p_ptt, QED_HW_ERR_RAMROD_FAIL,
+                         "Ramrod is stuck [CID %08x cmd %02x protocol %02x echo %04x]\n",
+                         le32_to_cpu(p_ent->elem.hdr.cid),
+                         p_ent->elem.hdr.cmd_id,
+                         p_ent->elem.hdr.protocol_id,
+                         le16_to_cpu(p_ent->elem.hdr.echo));
+       qed_ptt_release(p_hwfn, p_ptt);
 
        return -EBUSY;
 }