diff -rU 10 linux-source-5.10/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c linux-source-5.10-ob/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c --- linux-source-5.10/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c 2022-08-31 17:15:24.000000000 +0200 +++ linux-source-5.10-ob/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c 2022-09-17 12:45:19.940019068 +0200 @@ -144,20 +144,21 @@ LINK_STATUS_PHYSICAL_LINK_FLAG | \ LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | \ LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | \ LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | \ LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK | \ LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE | \ LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE) #define SFP_EEPROM_CON_TYPE_ADDR 0x2 #define SFP_EEPROM_CON_TYPE_VAL_UNKNOWN 0x0 + #define SFP_EEPROM_CON_TYPE_VAL_SC 0x1 #define SFP_EEPROM_CON_TYPE_VAL_LC 0x7 #define SFP_EEPROM_CON_TYPE_VAL_COPPER 0x21 #define SFP_EEPROM_CON_TYPE_VAL_RJ45 0x22 #define SFP_EEPROM_10G_COMP_CODE_ADDR 0x3 #define SFP_EEPROM_10G_COMP_CODE_SR_MASK (1<<4) #define SFP_EEPROM_10G_COMP_CODE_LR_MASK (1<<5) #define SFP_EEPROM_10G_COMP_CODE_LRM_MASK (1<<6) @@ -4203,30 +4204,41 @@ bnx2x_warpcore_set_lpi_passthrough(phy, params); if (always_autoneg || phy->req_line_speed == SPEED_AUTO_NEG) { /* SGMII Autoneg */ bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, MDIO_WC_REG_COMBO_IEEE0_MIICTRL, 0x1000); DP(NETIF_MSG_LINK, "set SGMII AUTONEG\n"); } else { + /* Note that 2.5G works only when used with 1G advertisment */ + if (fiber_mode && (phy->req_line_speed == SPEED_2500) && + (phy->speed_cap_mask & + (PORT_HW_CFG_SPEED_CAPABILITY_D0_1G | + PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G))) { + bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, + MDIO_WC_REG_SERDESDIGITAL_MISC1, + 0x6010); + } + bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, MDIO_WC_REG_COMBO_IEEE0_MIICTRL, &val16); val16 &= 0xcebf; switch (phy->req_line_speed) { case SPEED_10: break; case SPEED_100: val16 |= 0x2000; break; case SPEED_1000: + case SPEED_2500: val16 |= 0x0040; break; default: DP(NETIF_MSG_LINK, "Speed not supported: 0x%x\n", phy->req_line_speed); return; } if (phy->req_duplex == DUPLEX_FULL) val16 |= 0x0100; @@ -8166,30 +8178,32 @@ "Passive Copper cable detected\n"); } else { DP(NETIF_MSG_LINK, "Unknown copper-cable-type\n"); } } break; } case SFP_EEPROM_CON_TYPE_VAL_UNKNOWN: case SFP_EEPROM_CON_TYPE_VAL_LC: + case SFP_EEPROM_CON_TYPE_VAL_SC: case SFP_EEPROM_CON_TYPE_VAL_RJ45: check_limiting_mode = 1; if (((val[SFP_EEPROM_10G_COMP_CODE_ADDR] & (SFP_EEPROM_10G_COMP_CODE_SR_MASK | SFP_EEPROM_10G_COMP_CODE_LR_MASK | SFP_EEPROM_10G_COMP_CODE_LRM_MASK)) == 0) && (val[SFP_EEPROM_1G_COMP_CODE_ADDR] != 0)) { DP(NETIF_MSG_LINK, "1G SFP module detected\n"); phy->media_type = ETH_PHY_SFP_1G_FIBER; - if (phy->req_line_speed != SPEED_1000) { + if ((phy->req_line_speed != SPEED_1000) && + (phy->req_line_speed != SPEED_2500)) { u8 gport = params->port; phy->req_line_speed = SPEED_1000; if (!CHIP_IS_E1x(bp)) { gport = BP_PATH(bp) + (params->port << 1); } netdev_err(bp->dev, "Warning: Link speed was forced to 1000Mbps. Current SFP module in port %d is not compliant with 10G Ethernet\n", gport); } @@ -8335,21 +8349,21 @@ { u8 val; int rc; struct bnx2x *bp = params->bp; u16 timeout; /* Initialization time after hot-plug may take up to 300ms for * some phys type ( e.g. JDSU ) */ - for (timeout = 0; timeout < 60; timeout++) { + for (timeout = 0; timeout < 1800; timeout++) { if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) rc = bnx2x_warpcore_read_sfp_module_eeprom( phy, params, I2C_DEV_ADDR_A0, 1, 1, &val, 1); else rc = bnx2x_read_sfp_module_eeprom(phy, params, I2C_DEV_ADDR_A0, 1, 1, &val); if (rc == 0) { DP(NETIF_MSG_LINK, @@ -11713,20 +11727,21 @@ .flags = FLAGS_TX_ERROR_CHECK, .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, .mdio_ctrl = 0, .supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Full | SUPPORTED_1000baseKX_Full | + SUPPORTED_2500baseX_Full | SUPPORTED_10000baseT_Full | SUPPORTED_10000baseKR_Full | SUPPORTED_20000baseKR2_Full | SUPPORTED_20000baseMLD2_Full | SUPPORTED_FIBRE | SUPPORTED_Autoneg | SUPPORTED_Pause | SUPPORTED_Asym_Pause), .media_type = ETH_PHY_UNSPECIFIED, .ver_addr = 0, @@ -12246,20 +12261,21 @@ case PORT_HW_CFG_NET_SERDES_IF_XFI: phy->supported &= (SUPPORTED_1000baseT_Full | SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE | SUPPORTED_Pause | SUPPORTED_Asym_Pause); phy->media_type = ETH_PHY_XFP_FIBER; break; case PORT_HW_CFG_NET_SERDES_IF_SFI: phy->supported &= (SUPPORTED_1000baseT_Full | + SUPPORTED_2500baseX_Full | SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE | SUPPORTED_Pause | SUPPORTED_Asym_Pause); phy->media_type = ETH_PHY_SFPP_10G_FIBER; break; case PORT_HW_CFG_NET_SERDES_IF_KR: phy->media_type = ETH_PHY_KR; phy->supported &= (SUPPORTED_1000baseKX_Full | SUPPORTED_10000baseKR_Full |