mirror of
https://github.com/ipxe/ipxe
synced 2025-12-06 17:30:26 +03:00
[bnxt] Handle link related async events
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>
This commit is contained in:
committed by
Michael Brown
parent
4508e10233
commit
cf53497541
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) */
|
||||
|
||||
Reference in New Issue
Block a user