Skip to content

Commit 5802e30

Browse files
Michael Chandavem330
authored andcommitted
bnxt_en: Refactor NRZ/PAM4 link speed related logic
Refactor some NRZ/PAM4 link speed related logic into helper functions. The NRZ and PAM4 link parameters are stored in separate structure fields. The driver logic has to check whether it is in NRZ or PAM4 mode and then use the appropriate field. Refactor this logic into helper functions for better readability. Reviewed-by: Damodharam Ammepalli <[email protected]> Reviewed-by: Ajit Khaparde <[email protected]> Reviewed-by: Andy Gospodarek <[email protected]> Signed-off-by: Michael Chan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 94c89e7 commit 5802e30

File tree

1 file changed

+67
-31
lines changed
  • drivers/net/ethernet/broadcom/bnxt

1 file changed

+67
-31
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 67 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2129,6 +2129,48 @@ static u16 bnxt_agg_ring_id_to_grp_idx(struct bnxt *bp, u16 ring_id)
21292129
return INVALID_HW_RING_ID;
21302130
}
21312131

2132+
static u16 bnxt_get_force_speed(struct bnxt_link_info *link_info)
2133+
{
2134+
if (link_info->req_signal_mode == BNXT_SIG_MODE_PAM4)
2135+
return link_info->force_pam4_link_speed;
2136+
return link_info->force_link_speed;
2137+
}
2138+
2139+
static void bnxt_set_force_speed(struct bnxt_link_info *link_info)
2140+
{
2141+
link_info->req_link_speed = link_info->force_link_speed;
2142+
link_info->req_signal_mode = BNXT_SIG_MODE_NRZ;
2143+
if (link_info->force_pam4_link_speed) {
2144+
link_info->req_link_speed = link_info->force_pam4_link_speed;
2145+
link_info->req_signal_mode = BNXT_SIG_MODE_PAM4;
2146+
}
2147+
}
2148+
2149+
static void bnxt_set_auto_speed(struct bnxt_link_info *link_info)
2150+
{
2151+
link_info->advertising = link_info->auto_link_speeds;
2152+
link_info->advertising_pam4 = link_info->auto_pam4_link_speeds;
2153+
}
2154+
2155+
static bool bnxt_force_speed_updated(struct bnxt_link_info *link_info)
2156+
{
2157+
if (link_info->req_signal_mode == BNXT_SIG_MODE_NRZ &&
2158+
link_info->req_link_speed != link_info->force_link_speed)
2159+
return true;
2160+
if (link_info->req_signal_mode == BNXT_SIG_MODE_PAM4 &&
2161+
link_info->req_link_speed != link_info->force_pam4_link_speed)
2162+
return true;
2163+
return false;
2164+
}
2165+
2166+
static bool bnxt_auto_speed_updated(struct bnxt_link_info *link_info)
2167+
{
2168+
if (link_info->advertising != link_info->auto_link_speeds ||
2169+
link_info->advertising_pam4 != link_info->auto_pam4_link_speeds)
2170+
return true;
2171+
return false;
2172+
}
2173+
21322174
#define BNXT_EVENT_THERMAL_CURRENT_TEMP(data2) \
21332175
((data2) & \
21342176
ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_CURRENT_TEMP_MASK)
@@ -2255,7 +2297,7 @@ static int bnxt_async_event_process(struct bnxt *bp,
22552297
/* print unsupported speed warning in forced speed mode only */
22562298
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED) &&
22572299
(data1 & 0x20000)) {
2258-
u16 fw_speed = link_info->force_link_speed;
2300+
u16 fw_speed = bnxt_get_force_speed(link_info);
22592301
u32 speed = bnxt_fw_to_ethtool_speed(fw_speed);
22602302

22612303
if (speed != SPEED_UNKNOWN)
@@ -9689,13 +9731,31 @@ static bool bnxt_support_dropped(u16 advertising, u16 supported)
96899731
return ((supported | diff) != supported);
96909732
}
96919733

9734+
static bool bnxt_support_speed_dropped(struct bnxt_link_info *link_info)
9735+
{
9736+
/* Check if any advertised speeds are no longer supported. The caller
9737+
* holds the link_lock mutex, so we can modify link_info settings.
9738+
*/
9739+
if (bnxt_support_dropped(link_info->advertising,
9740+
link_info->support_auto_speeds)) {
9741+
link_info->advertising = link_info->support_auto_speeds;
9742+
return true;
9743+
}
9744+
if (bnxt_support_dropped(link_info->advertising_pam4,
9745+
link_info->support_pam4_auto_speeds)) {
9746+
link_info->advertising_pam4 = link_info->support_pam4_auto_speeds;
9747+
return true;
9748+
}
9749+
return false;
9750+
}
9751+
96929752
int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
96939753
{
96949754
struct bnxt_link_info *link_info = &bp->link_info;
96959755
struct hwrm_port_phy_qcfg_output *resp;
96969756
struct hwrm_port_phy_qcfg_input *req;
96979757
u8 link_state = link_info->link_state;
9698-
bool support_changed = false;
9758+
bool support_changed;
96999759
int rc;
97009760

97019761
rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_QCFG);
@@ -9809,19 +9869,7 @@ int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
98099869
if (!BNXT_PHY_CFG_ABLE(bp))
98109870
return 0;
98119871

9812-
/* Check if any advertised speeds are no longer supported. The caller
9813-
* holds the link_lock mutex, so we can modify link_info settings.
9814-
*/
9815-
if (bnxt_support_dropped(link_info->advertising,
9816-
link_info->support_auto_speeds)) {
9817-
link_info->advertising = link_info->support_auto_speeds;
9818-
support_changed = true;
9819-
}
9820-
if (bnxt_support_dropped(link_info->advertising_pam4,
9821-
link_info->support_pam4_auto_speeds)) {
9822-
link_info->advertising_pam4 = link_info->support_pam4_auto_speeds;
9823-
support_changed = true;
9824-
}
9872+
support_changed = bnxt_support_speed_dropped(link_info);
98259873
if (support_changed && (link_info->autoneg & BNXT_AUTONEG_SPEED))
98269874
bnxt_hwrm_set_link_setting(bp, true, false);
98279875
return 0;
@@ -10362,19 +10410,14 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
1036210410
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
1036310411
if (BNXT_AUTO_MODE(link_info->auto_mode))
1036410412
update_link = true;
10365-
if (link_info->req_signal_mode == BNXT_SIG_MODE_NRZ &&
10366-
link_info->req_link_speed != link_info->force_link_speed)
10367-
update_link = true;
10368-
else if (link_info->req_signal_mode == BNXT_SIG_MODE_PAM4 &&
10369-
link_info->req_link_speed != link_info->force_pam4_link_speed)
10413+
if (bnxt_force_speed_updated(link_info))
1037010414
update_link = true;
1037110415
if (link_info->req_duplex != link_info->duplex_setting)
1037210416
update_link = true;
1037310417
} else {
1037410418
if (link_info->auto_mode == BNXT_LINK_AUTO_NONE)
1037510419
update_link = true;
10376-
if (link_info->advertising != link_info->auto_link_speeds ||
10377-
link_info->advertising_pam4 != link_info->auto_pam4_link_speeds)
10420+
if (bnxt_auto_speed_updated(link_info))
1037810421
update_link = true;
1037910422
}
1038010423

@@ -11992,16 +12035,9 @@ static void bnxt_init_ethtool_link_settings(struct bnxt *bp)
1199212035
} else {
1199312036
link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
1199412037
}
11995-
link_info->advertising = link_info->auto_link_speeds;
11996-
link_info->advertising_pam4 = link_info->auto_pam4_link_speeds;
12038+
bnxt_set_auto_speed(link_info);
1199712039
} else {
11998-
link_info->req_link_speed = link_info->force_link_speed;
11999-
link_info->req_signal_mode = BNXT_SIG_MODE_NRZ;
12000-
if (link_info->force_pam4_link_speed) {
12001-
link_info->req_link_speed =
12002-
link_info->force_pam4_link_speed;
12003-
link_info->req_signal_mode = BNXT_SIG_MODE_PAM4;
12004-
}
12040+
bnxt_set_force_speed(link_info);
1200512041
link_info->req_duplex = link_info->duplex_setting;
1200612042
}
1200712043
if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)

0 commit comments

Comments
 (0)