mirror of
https://github.com/ipxe/ipxe
synced 2025-12-07 18:00:28 +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;
|
FUNC_DRV_RGTR_REQ_ENABLES_VER;
|
||||||
req->flags = FUNC_DRV_RGTR_REQ_FLAGS_16BIT_VER_MODE;
|
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 ) {
|
if ( bp->err_rcvry_supported ) {
|
||||||
req->flags |= FUNC_DRV_RGTR_REQ_FLAGS_ERROR_RECOVERY_SUPPORT;
|
req->flags |= FUNC_DRV_RGTR_REQ_FLAGS_ERROR_RECOVERY_SUPPORT;
|
||||||
req->flags |= FUNC_DRV_RGTR_REQ_FLAGS_MASTER_SUPPORT;
|
req->flags |= FUNC_DRV_RGTR_REQ_FLAGS_MASTER_SUPPORT;
|
||||||
req->async_event_fwd[0] |= 0x301;
|
req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY;
|
||||||
} else {
|
req->async_event_fwd[0] |= 1 << ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY;
|
||||||
req->async_event_fwd[0] |= 0x01;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
req->os_type = FUNC_DRV_RGTR_REQ_OS_TYPE_OTHER;
|
req->os_type = FUNC_DRV_RGTR_REQ_OS_TYPE_OTHER;
|
||||||
req->ver_maj = IPXE_VERSION_MAJOR;
|
req->ver_maj = IPXE_VERSION_MAJOR;
|
||||||
req->ver_min = IPXE_VERSION_MINOR;
|
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 )
|
static void bnxt_service_cq ( struct net_device *dev )
|
||||||
{
|
{
|
||||||
struct bnxt *bp = dev->priv;
|
struct bnxt *bp = dev->priv;
|
||||||
@@ -2574,12 +2624,24 @@ static void bnxt_service_cq ( struct net_device *dev )
|
|||||||
( struct rx_pkt_cmpl * )cmp );
|
( struct rx_pkt_cmpl * )cmp );
|
||||||
break;
|
break;
|
||||||
case CMPL_BASE_TYPE_HWRM_ASYNC_EVENT:
|
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 ) {
|
switch ( evt->event_id ) {
|
||||||
case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
|
case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
|
||||||
bnxt_link_evt ( bp,
|
bnxt_link_evt ( bp,
|
||||||
( struct hwrm_async_event_cmpl * )cmp );
|
( struct hwrm_async_event_cmpl * )cmp );
|
||||||
break;
|
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:
|
case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY:
|
||||||
bnxt_process_er_event ( bp,
|
bnxt_process_er_event ( bp,
|
||||||
( struct hwrm_async_event_cmpl * )cmp );
|
( struct hwrm_async_event_cmpl * )cmp );
|
||||||
@@ -2628,12 +2690,24 @@ static void bnxt_service_nq ( struct net_device *dev )
|
|||||||
|
|
||||||
switch ( nq_type ) {
|
switch ( nq_type ) {
|
||||||
case CMPL_BASE_TYPE_HWRM_ASYNC_EVENT:
|
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 ) {
|
switch ( evt->event_id ) {
|
||||||
case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
|
case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
|
||||||
bnxt_link_evt ( bp,
|
bnxt_link_evt ( bp,
|
||||||
( struct hwrm_async_event_cmpl * )nqp );
|
( struct hwrm_async_event_cmpl * )nqp );
|
||||||
break;
|
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:
|
case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY:
|
||||||
bnxt_process_er_event ( bp,
|
bnxt_process_er_event ( bp,
|
||||||
( struct hwrm_async_event_cmpl * )nqp );
|
( struct hwrm_async_event_cmpl * )nqp );
|
||||||
|
|||||||
@@ -659,5 +659,6 @@ void dbg_link_state(struct bnxt *bp, u32 tmo)
|
|||||||
#else
|
#else
|
||||||
#define dump_evt(cq, ty, id, ring)
|
#define dump_evt(cq, ty, id, ring)
|
||||||
#define dbg_link_status(bp)
|
#define dbg_link_status(bp)
|
||||||
|
#define dbg_link_info(bp)
|
||||||
#define dbg_link_state(bp, tmo)
|
#define dbg_link_state(bp, tmo)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -661,22 +661,22 @@ struct hwrm_async_event_cmpl_link_speed_change {
|
|||||||
u8 timestamp_lo;
|
u8 timestamp_lo;
|
||||||
__le16 timestamp_hi;
|
__le16 timestamp_hi;
|
||||||
__le32 event_data1;
|
__le32 event_data1;
|
||||||
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_FORCE 0x1UL
|
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_FORCE 0x1UL
|
||||||
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_MASK 0xfffeUL
|
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_MASK 0xfffeUL
|
||||||
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_SFT 1
|
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_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_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_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_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_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_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_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_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_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_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_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_NEW_LINK_SPEED_100MBPS_LAST ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_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_PORT_ID_MASK 0xffff0000UL
|
||||||
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_PORT_ID_SFT 16
|
#define ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_PORT_ID_SFT 16
|
||||||
};
|
};
|
||||||
|
|
||||||
/* hwrm_async_event_cmpl_dcb_config_change (size:128b/16B) */
|
/* 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;
|
u8 timestamp_lo;
|
||||||
__le16 timestamp_hi;
|
__le16 timestamp_hi;
|
||||||
__le32 event_data1;
|
__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_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_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_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_ILLEGAL_LINK_SPEED_CFG 0x20000UL
|
||||||
};
|
};
|
||||||
|
|
||||||
/* hwrm_async_event_cmpl_port_phy_cfg_change (size:128b/16B) */
|
/* 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;
|
u8 timestamp_lo;
|
||||||
__le16 timestamp_hi;
|
__le16 timestamp_hi;
|
||||||
__le32 event_data1;
|
__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_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_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_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_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_PAUSE_CFG_CHANGE 0x40000UL
|
||||||
};
|
};
|
||||||
|
|
||||||
/* hwrm_async_event_cmpl_reset_notify (size:128b/16B) */
|
/* hwrm_async_event_cmpl_reset_notify (size:128b/16B) */
|
||||||
|
|||||||
Reference in New Issue
Block a user