@@ -1870,6 +1870,27 @@ static void qed_fill_link_capability(struct qed_hwfn *hwfn,
}
}
+static void qed_lp_caps_to_speed_mask(u32 caps, u32 *speed_mask)
+{
+ *speed_mask = 0;
+
+ if (caps &
+ (QED_LINK_PARTNER_SPEED_1G_FD | QED_LINK_PARTNER_SPEED_1G_HD))
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G;
+ if (caps & QED_LINK_PARTNER_SPEED_10G)
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G;
+ if (caps & QED_LINK_PARTNER_SPEED_20G)
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_20G;
+ if (caps & QED_LINK_PARTNER_SPEED_25G)
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G;
+ if (caps & QED_LINK_PARTNER_SPEED_40G)
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G;
+ if (caps & QED_LINK_PARTNER_SPEED_50G)
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_50G;
+ if (caps & QED_LINK_PARTNER_SPEED_100G)
+ *speed_mask |= NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G;
+}
+
static void qed_fill_link(struct qed_hwfn *hwfn,
struct qed_ptt *ptt,
struct qed_link_output *if_link)
@@ -1877,7 +1898,7 @@ static void qed_fill_link(struct qed_hwfn *hwfn,
struct qed_mcp_link_capabilities link_caps;
struct qed_mcp_link_params params;
struct qed_mcp_link_state link;
- u32 media_type;
+ u32 media_type, speed_mask;
memset(if_link, 0, sizeof(*if_link));
@@ -1908,13 +1929,18 @@ static void qed_fill_link(struct qed_hwfn *hwfn,
else
__clear_bit(QED_LM_Autoneg, if_link->advertised_caps);
- /* Fill link advertised capability*/
+ /* Fill link advertised capability */
qed_fill_link_capability(hwfn, ptt, params.speed.advertised_speeds,
if_link->advertised_caps);
- /* Fill link supported capability*/
+
+ /* Fill link supported capability */
qed_fill_link_capability(hwfn, ptt, link_caps.speed_capabilities,
if_link->supported_caps);
+ /* Fill partner advertised capability */
+ qed_lp_caps_to_speed_mask(link.partner_adv_speed, &speed_mask);
+ qed_fill_link_capability(hwfn, ptt, speed_mask, if_link->lp_caps);
+
if (link.link_up)
if_link->speed = link.speed;
@@ -1932,23 +1958,6 @@ static void qed_fill_link(struct qed_hwfn *hwfn,
if (params.pause.forced_tx)
if_link->pause_config |= QED_LINK_PAUSE_TX_ENABLE;
- /* Link partner capabilities */
-
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_1G_FD)
- __set_bit(QED_LM_1000baseT_Full, if_link->lp_caps);
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_10G)
- __set_bit(QED_LM_10000baseKR_Full, if_link->lp_caps);
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_20G)
- __set_bit(QED_LM_20000baseKR2_Full, if_link->lp_caps);
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_25G)
- __set_bit(QED_LM_25000baseKR_Full, if_link->lp_caps);
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_40G)
- __set_bit(QED_LM_40000baseLR4_Full, if_link->lp_caps);
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_50G)
- __set_bit(QED_LM_50000baseKR2_Full, if_link->lp_caps);
- if (link.partner_adv_speed & QED_LINK_PARTNER_SPEED_100G)
- __set_bit(QED_LM_100000baseKR4_Full, if_link->lp_caps);
-
if (link.an_complete)
__set_bit(QED_LM_Autoneg, if_link->lp_caps);
if (link.partner_adv_pause)