bnxt_en: Handle ethernet link being disabled by firmware.
On some 200G dual port NICs, if one port is configured to 200G, firmware will disable the ethernet link on the other port. Firmware will send notification to the driver for the disabled port when this happens. Define a new field in the link_info structure to keep track of this state. The new phy_state field replaces the unused loop_back field. Log a message when the phy_state changes state. In the disabled state, disallow any PHY configurations on the disabled port as the firmware will fail all calls to configure the PHY in this state. Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com> Reviewed-by: Edwin Peer <edwin.peer@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
532262ba3b
commit
3128e811b1
|
@ -8777,6 +8777,16 @@ static void bnxt_report_link(struct bnxt *bp)
|
|||
}
|
||||
}
|
||||
|
||||
static bool bnxt_phy_qcaps_no_speed(struct hwrm_port_phy_qcaps_output *resp)
|
||||
{
|
||||
if (!resp->supported_speeds_auto_mode &&
|
||||
!resp->supported_speeds_force_mode &&
|
||||
!resp->supported_pam4_speeds_auto_mode &&
|
||||
!resp->supported_pam4_speeds_force_mode)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
|
||||
{
|
||||
int rc = 0;
|
||||
|
@ -8824,6 +8834,18 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
|
|||
if (resp->flags & PORT_PHY_QCAPS_RESP_FLAGS_CUMULATIVE_COUNTERS_ON_RESET)
|
||||
bp->fw_cap |= BNXT_FW_CAP_PORT_STATS_NO_RESET;
|
||||
|
||||
if (bp->hwrm_spec_code >= 0x10a01) {
|
||||
if (bnxt_phy_qcaps_no_speed(resp)) {
|
||||
link_info->phy_state = BNXT_PHY_STATE_DISABLED;
|
||||
netdev_warn(bp->dev, "Ethernet link disabled\n");
|
||||
} else if (link_info->phy_state == BNXT_PHY_STATE_DISABLED) {
|
||||
link_info->phy_state = BNXT_PHY_STATE_ENABLED;
|
||||
netdev_info(bp->dev, "Ethernet link enabled\n");
|
||||
/* Phy re-enabled, reprobe the speeds */
|
||||
link_info->support_auto_speeds = 0;
|
||||
link_info->support_pam4_auto_speeds = 0;
|
||||
}
|
||||
}
|
||||
if (resp->supported_speeds_auto_mode)
|
||||
link_info->support_auto_speeds =
|
||||
le16_to_cpu(resp->supported_speeds_auto_mode);
|
||||
|
|
|
@ -1152,7 +1152,10 @@ struct bnxt_link_info {
|
|||
#define BNXT_LINK_SIGNAL PORT_PHY_QCFG_RESP_LINK_SIGNAL
|
||||
#define BNXT_LINK_LINK PORT_PHY_QCFG_RESP_LINK_LINK
|
||||
u8 wire_speed;
|
||||
u8 loop_back;
|
||||
u8 phy_state;
|
||||
#define BNXT_PHY_STATE_ENABLED 0
|
||||
#define BNXT_PHY_STATE_DISABLED 1
|
||||
|
||||
u8 link_up;
|
||||
u8 duplex;
|
||||
#define BNXT_LINK_DUPLEX_HALF PORT_PHY_QCFG_RESP_DUPLEX_STATE_HALF
|
||||
|
@ -1601,8 +1604,9 @@ struct bnxt {
|
|||
#define BNXT_NPAR(bp) ((bp)->port_partition_type)
|
||||
#define BNXT_MH(bp) ((bp)->flags & BNXT_FLAG_MULTI_HOST)
|
||||
#define BNXT_SINGLE_PF(bp) (BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp))
|
||||
#define BNXT_PHY_CFG_ABLE(bp) (BNXT_SINGLE_PF(bp) || \
|
||||
((bp)->fw_cap & BNXT_FW_CAP_SHARED_PORT_CFG))
|
||||
#define BNXT_PHY_CFG_ABLE(bp) ((BNXT_SINGLE_PF(bp) || \
|
||||
((bp)->fw_cap & BNXT_FW_CAP_SHARED_PORT_CFG)) && \
|
||||
(bp)->link_info.phy_state == BNXT_PHY_STATE_ENABLED)
|
||||
#define BNXT_CHIP_TYPE_NITRO_A0(bp) ((bp)->flags & BNXT_FLAG_CHIP_NITRO_A0)
|
||||
#define BNXT_RX_PAGE_MODE(bp) ((bp)->flags & BNXT_FLAG_RX_PAGE_MODE)
|
||||
#define BNXT_SUPPORTS_TPA(bp) (!BNXT_CHIP_TYPE_NITRO_A0(bp) && \
|
||||
|
|
Loading…
Reference in New Issue