net: qed: introduce critical fan failure handler
authorIgor Russkikh <irusskikh@marvell.com>
Thu, 14 May 2020 09:57:25 +0000 (12:57 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 14 May 2020 20:25:46 +0000 (13:25 -0700)
Fan failure is sent by firmware, driver reacts on this error with
newly introduced notification path. It will collect dump and shut down
the device to prevent physical breakage

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_hsi.h
drivers/net/ethernet/qlogic/qed/qed_mcp.c

index 21d53b0..ab042b8 100644 (file)
@@ -12761,7 +12761,7 @@ enum MFW_DRV_MSG_TYPE {
        MFW_DRV_MSG_GET_FCOE_STATS,
        MFW_DRV_MSG_GET_ISCSI_STATS,
        MFW_DRV_MSG_GET_RDMA_STATS,
-       MFW_DRV_MSG_BW_UPDATE10,
+       MFW_DRV_MSG_FAILURE_DETECTED,
        MFW_DRV_MSG_TRANSCEIVER_STATE_CHANGE,
        MFW_DRV_MSG_BW_UPDATE11,
        MFW_DRV_MSG_RESERVED,
index db7cf12..d5be2d2 100644 (file)
@@ -1706,6 +1706,17 @@ static void qed_mcp_update_stag(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
                    &resp, &param);
 }
 
+static void qed_mcp_handle_fan_failure(struct qed_hwfn *p_hwfn,
+                                      struct qed_ptt *p_ptt)
+{
+       /* A single notification should be sent to upper driver in CMT mode */
+       if (p_hwfn != QED_LEADING_HWFN(p_hwfn->cdev))
+               return;
+
+       qed_hw_err_notify(p_hwfn, p_ptt, QED_HW_ERR_FAN_FAIL,
+                         "Fan failure was detected on the network interface card and it's going to be shut down.\n");
+}
+
 void qed_mcp_read_ufp_config(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
 {
        struct public_func shmem_info;
@@ -1852,6 +1863,9 @@ int qed_mcp_handle_events(struct qed_hwfn *p_hwfn,
                case MFW_DRV_MSG_S_TAG_UPDATE:
                        qed_mcp_update_stag(p_hwfn, p_ptt);
                        break;
+               case MFW_DRV_MSG_FAILURE_DETECTED:
+                       qed_mcp_handle_fan_failure(p_hwfn, p_ptt);
+                       break;
                case MFW_DRV_MSG_GET_TLV_REQ:
                        qed_mfw_tlv_req(p_hwfn);
                        break;