bnxt_en: Handle RESET_NOTIFY async event from firmware.
authorMichael Chan <michael.chan@broadcom.com>
Fri, 30 Aug 2019 03:54:58 +0000 (23:54 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 30 Aug 2019 21:02:19 +0000 (14:02 -0700)
This event from firmware signals a coordinated reset initiated by the
firmware.  It may be triggered by some error conditions encountered
in the firmware or other orderly reset conditions.

We store the parameters from this event.  Subsequent patches will
add logic to handle reset itself using devlink reporters.

Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index 4caacabf62e2c3113cb05be3769ea4d3a56087e3..d1d33f619978278eec0dff24c3cdd96eeb593429 100644 (file)
@@ -254,6 +254,7 @@ static const u16 bnxt_async_events_arr[] = {
        ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED,
        ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE,
        ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE,
+       ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY,
        ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY,
 };
 
@@ -1979,6 +1980,16 @@ static int bnxt_async_event_process(struct bnxt *bp,
                        goto async_event_process_exit;
                set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event);
                break;
+       case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY:
+               bp->fw_reset_timestamp = jiffies;
+               bp->fw_reset_min_dsecs = cmpl->timestamp_lo;
+               if (!bp->fw_reset_min_dsecs)
+                       bp->fw_reset_min_dsecs = BNXT_DFLT_FW_RST_MIN_DSECS;
+               bp->fw_reset_max_dsecs = le16_to_cpu(cmpl->timestamp_hi);
+               if (!bp->fw_reset_max_dsecs)
+                       bp->fw_reset_max_dsecs = BNXT_DFLT_FW_RST_MAX_DSECS;
+               set_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event);
+               break;
        case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY: {
                struct bnxt_fw_health *fw_health = bp->fw_health;
                u32 data1 = le32_to_cpu(cmpl->event_data1);
index a75fe16cf2e61817cf1cd1f0ad72389d33ddf269..858dc4021fbb5f87c6578e22e6d768c4e22d8391 100644 (file)
@@ -1719,6 +1719,13 @@ struct bnxt {
 #define BNXT_FLOW_STATS_SP_EVENT       15
 #define BNXT_UPDATE_PHY_SP_EVENT       16
 #define BNXT_RING_COAL_NOW_SP_EVENT    17
+#define BNXT_FW_RESET_NOTIFY_SP_EVENT  18
+
+       u16                     fw_reset_min_dsecs;
+#define BNXT_DFLT_FW_RST_MIN_DSECS     20
+       u16                     fw_reset_max_dsecs;
+#define BNXT_DFLT_FW_RST_MAX_DSECS     60
+       unsigned long           fw_reset_timestamp;
 
        struct bnxt_fw_health   *fw_health;