bnxt_en: Add async. event logic for PHY configuration changes.
authorMichael Chan <michael.chan@broadcom.com>
Sun, 24 Nov 2019 03:30:48 +0000 (22:30 -0500)
committerJakub Kicinski <jakub.kicinski@netronome.com>
Sun, 24 Nov 2019 22:48:02 +0000 (14:48 -0800)
If the link settings have been changed by another function sharing the
port, firmware will send us an async. message.  In response, we will
call the new bnxt_init_ethtool_link_settings() function to update
the current settings.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index 1b86ba8d0be35f39d570fb5abeb419eff2877162..4b0303ac307fd0ffc271c4cc0c67a97048cb45fb 100644 (file)
@@ -250,10 +250,12 @@ static const u16 bnxt_vf_req_snif[] = {
 
 static const u16 bnxt_async_events_arr[] = {
        ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE,
+       ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE,
        ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD,
        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_PORT_PHY_CFG_CHANGE,
        ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY,
        ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY,
 };
@@ -1968,6 +1970,10 @@ static int bnxt_async_event_process(struct bnxt *bp,
                set_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT, &bp->sp_event);
        }
        /* fall through */
+       case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
+       case ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE:
+               set_bit(BNXT_LINK_CFG_CHANGE_SP_EVENT, &bp->sp_event);
+               /* fall through */
        case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
                set_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event);
                break;
@@ -10324,6 +10330,10 @@ static void bnxt_sp_task(struct work_struct *work)
                                       &bp->sp_event))
                        bnxt_hwrm_phy_qcaps(bp);
 
+               if (test_and_clear_bit(BNXT_LINK_CFG_CHANGE_SP_EVENT,
+                                      &bp->sp_event))
+                       bnxt_init_ethtool_link_settings(bp);
+
                rc = bnxt_update_link(bp, true);
                mutex_unlock(&bp->link_lock);
                if (rc)
index 94c8a9276d3ad1cfc5634cc1b2f75baeb6d8a56a..cab1703dfcf7498ac2c88b83ac26b11603d278a0 100644 (file)
@@ -1763,6 +1763,7 @@ struct bnxt {
 #define BNXT_RING_COAL_NOW_SP_EVENT    17
 #define BNXT_FW_RESET_NOTIFY_SP_EVENT  18
 #define BNXT_FW_EXCEPTION_SP_EVENT     19
+#define BNXT_LINK_CFG_CHANGE_SP_EVENT  21
 
        struct delayed_work     fw_reset_task;
        int                     fw_reset_state;