]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[bnxt] Handle link related async events coverity_scan master 1535/head
authorJoseph Wong <joseph.wong@broadcom.com>
Thu, 18 Sep 2025 19:27:43 +0000 (12:27 -0700)
committerMichael Brown <mcb30@ipxe.org>
Wed, 1 Oct 2025 15:20:23 +0000 (16:20 +0100)
Handle async events related to link speed change, link speed config
change, and port phy config changes.

Signed-off-by: Joseph Wong <joseph.wong@broadcom.com>
src/drivers/net/bnxt/bnxt.c
src/drivers/net/bnxt/bnxt_dbg.h
src/drivers/net/bnxt/bnxt_hsi.h

index bac601ab6fa4074cf4ef7dcab4db44483d71d302..703f6e3847f9000a2d2dc6eaedbbd59180b149e5 100644 (file)
@@ -1114,13 +1114,18 @@ static int bnxt_hwrm_func_drv_rgtr ( struct bnxt *bp )
                        FUNC_DRV_RGTR_REQ_ENABLES_VER;
        req->flags = FUNC_DRV_RGTR_REQ_FLAGS_16BIT_VER_MODE;
 
+       req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE;
+       req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE;
+       req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE;
+       req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE;
+
        if ( bp->err_rcvry_supported ) {
                req->flags |= FUNC_DRV_RGTR_REQ_FLAGS_ERROR_RECOVERY_SUPPORT;
                req->flags |= FUNC_DRV_RGTR_REQ_FLAGS_MASTER_SUPPORT;
-               req->async_event_fwd[0] |= 0x301;
-       } else {
-               req->async_event_fwd[0] |= 0x01;
+               req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY;
+               req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY;
        }
+
        req->os_type = FUNC_DRV_RGTR_REQ_OS_TYPE_OTHER;
        req->ver_maj = IPXE_VERSION_MAJOR;
        req->ver_min = IPXE_VERSION_MINOR;
@@ -2538,6 +2543,51 @@ void bnxt_process_reset_notify_event ( struct bnxt *bp,
        }
 }
 
+void bnxt_link_speed_evt ( struct bnxt *bp, struct hwrm_async_event_cmpl *evt )
+{
+       if ( evt->event_data1 & ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_FORCE ) {
+               DBGP ("bnxt_link_speed_evt: event data = %lx\n",
+              ( evt->event_data1 & ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_MASK ));
+       }
+
+       if ( bnxt_hwrm_port_phy_qcfg ( bp, QCFG_PHY_ALL ) != STATUS_SUCCESS ) {
+               return;
+       }
+
+       bnxt_set_link ( bp );
+       dbg_link_info ( bp );
+       dbg_link_status ( bp );
+}
+
+void bnxt_link_speed_chg_evt ( struct bnxt *bp, struct hwrm_async_event_cmpl *evt )
+{
+       if ( ( evt->event_data1 & ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_SUPPORTED_LINK_SPEEDS_CHANGE ) ||
+               ( evt->event_data1 & ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_ILLEGAL_LINK_SPEED_CFG ) ) {
+               if ( bnxt_hwrm_port_phy_qcfg ( bp, QCFG_PHY_ALL ) != STATUS_SUCCESS ) {
+                       return;
+               }
+       }
+
+       bnxt_set_link ( bp );
+       dbg_link_info ( bp );
+       dbg_link_status ( bp );
+}
+
+void bnxt_port_phy_chg_evt ( struct bnxt *bp, struct hwrm_async_event_cmpl *evt )
+{
+       if ( ( evt->event_data1 & ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_FEC_CFG_CHANGE ) ||
+               ( evt->event_data1 & ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EEE_CFG_CHANGE ) ||
+               ( evt->event_data1 & ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_PAUSE_CFG_CHANGE)) {
+               if ( bnxt_hwrm_port_phy_qcfg ( bp, QCFG_PHY_ALL ) != STATUS_SUCCESS ) {
+                       return;
+               }
+       }
+
+       bnxt_set_link ( bp );
+       dbg_link_info ( bp );
+       dbg_link_status ( bp );
+}
+
 static void bnxt_service_cq ( struct net_device *dev )
 {
        struct bnxt *bp = dev->priv;
@@ -2574,12 +2624,24 @@ static void bnxt_service_cq ( struct net_device *dev )
                                ( struct rx_pkt_cmpl * )cmp );
                        break;
                case CMPL_BASE_TYPE_HWRM_ASYNC_EVENT:
-                       evt = (struct hwrm_async_event_cmpl * )cmp;
+                       evt = ( struct hwrm_async_event_cmpl * )cmp;
                        switch ( evt->event_id ) {
                        case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
                                bnxt_link_evt ( bp,
                                        ( struct hwrm_async_event_cmpl * )cmp );
                                break;
+                       case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
+                               bnxt_link_speed_evt ( bp,
+                                       ( struct hwrm_async_event_cmpl * )cmp );
+                               break;
+                       case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE:
+                               bnxt_link_speed_chg_evt ( bp,
+                                       ( struct hwrm_async_event_cmpl * )cmp );
+                               break;
+                       case ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE:
+                               bnxt_port_phy_chg_evt ( bp,
+                                       ( struct hwrm_async_event_cmpl * )cmp );
+                               break;
                        case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY:
                                bnxt_process_er_event ( bp,
                                        ( struct hwrm_async_event_cmpl * )cmp );
@@ -2628,12 +2690,24 @@ static void bnxt_service_nq ( struct net_device *dev )
 
                switch ( nq_type ) {
                case CMPL_BASE_TYPE_HWRM_ASYNC_EVENT:
-                       evt = (struct hwrm_async_event_cmpl * )nqp;
+                       evt = ( struct hwrm_async_event_cmpl * )nqp;
                        switch ( evt->event_id ) {
                        case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
                                bnxt_link_evt ( bp,
                                        ( struct hwrm_async_event_cmpl * )nqp );
                                break;
+                       case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
+                               bnxt_link_speed_evt ( bp,
+                                       ( struct hwrm_async_event_cmpl * )nqp );
+                               break;
+                       case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE:
+                               bnxt_link_speed_chg_evt ( bp,
+                                       ( struct hwrm_async_event_cmpl * )nqp );
+                               break;
+                       case ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE:
+                               bnxt_port_phy_chg_evt ( bp,
+                                       ( struct hwrm_async_event_cmpl * )nqp );
+                               break;
                        case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY:
                                bnxt_process_er_event ( bp,
                                        ( struct hwrm_async_event_cmpl * )nqp );
index d6e66ceef8d781c2ccf1d3c2fa387f6f5b7852b4..2cda84488755baa41a26c710e4c21ae149605f06 100644 (file)
@@ -659,5 +659,6 @@ void dbg_link_state(struct bnxt *bp, u32 tmo)
 #else
 #define dump_evt(cq, ty, id, ring)
 #define dbg_link_status(bp)
+#define dbg_link_info(bp)
 #define dbg_link_state(bp, tmo)
 #endif
index e1ed7c1f2fd3c0a39178036107fb7d302b45898e..77706504ccf6a8b8be5d112eacabc036e2073873 100644 (file)
@@ -661,22 +661,22 @@ struct hwrm_async_event_cmpl_link_speed_change {
        u8      timestamp_lo;
        __le16  timestamp_hi;
        __le32  event_data1;
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_FORCE                       0x1UL
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_MASK 0xfffeUL
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_SFT  1
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_100MB  (0x1UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_1GB    (0xaUL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_2GB    (0x14UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_2_5GB  (0x19UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_10GB   (0x64UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_20GB   (0xc8UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_25GB   (0xfaUL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_40GB   (0x190UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_50GB   (0x1f4UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_100GB  (0x3e8UL << 1)
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_LAST  ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_100GB
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_PORT_ID_MASK                0xffff0000UL
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_PORT_ID_SFT                 16
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_FORCE                       0x1UL
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_MASK 0xfffeUL
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_SFT  1
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_100MB  (0x1UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_1GB    (0xaUL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_2GB    (0x14UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_2_5GB  (0x19UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_10GB   (0x64UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_20GB   (0xc8UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_25GB   (0xfaUL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_40GB   (0x190UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_50GB   (0x1f4UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_100GB  (0x3e8UL << 1)
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_LAST  ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_NEW_LINK_SPEED_100MBPS_100GB
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_PORT_ID_MASK                0xffff0000UL
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_PORT_ID_SFT                 16
 };
 
 /* hwrm_async_event_cmpl_dcb_config_change (size:128b/16B) */
@@ -781,10 +781,10 @@ struct hwrm_async_event_cmpl_link_speed_cfg_change {
        u8      timestamp_lo;
        __le16  timestamp_hi;
        __le32  event_data1;
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_PORT_ID_MASK                     0xffffUL
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_PORT_ID_SFT                      0
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_SUPPORTED_LINK_SPEEDS_CHANGE     0x10000UL
-       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_ILLEGAL_LINK_SPEED_CFG           0x20000UL
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_PORT_ID_MASK                     0xffffUL
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_PORT_ID_SFT                      0
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_SUPPORTED_LINK_SPEEDS_CHANGE     0x10000UL
+       #define ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_ILLEGAL_LINK_SPEED_CFG           0x20000UL
 };
 
 /* hwrm_async_event_cmpl_port_phy_cfg_change (size:128b/16B) */
@@ -805,11 +805,11 @@ struct hwrm_async_event_cmpl_port_phy_cfg_change {
        u8      timestamp_lo;
        __le16  timestamp_hi;
        __le32  event_data1;
-       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_PORT_ID_MASK         0xffffUL
-       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_PORT_ID_SFT          0
-       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_FEC_CFG_CHANGE       0x10000UL
-       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_EEE_CFG_CHANGE       0x20000UL
-       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_PAUSE_CFG_CHANGE     0x40000UL
+       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_PORT_ID_MASK         0xffffUL
+       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_PORT_ID_SFT          0
+       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_FEC_CFG_CHANGE       0x10000UL
+       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EEE_CFG_CHANGE       0x20000UL
+       #define ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_PAUSE_CFG_CHANGE     0x40000UL
 };
 
 /* hwrm_async_event_cmpl_reset_notify (size:128b/16B) */