mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
bnx2x: (NPAR mode) Fix FW initialization
Fix FW initialization according to max BW stored in percents for NPAR mode. Protect HW from being configured to speed 0. Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e3fa3aff0c
commit
faa6fcbbba
@ -703,19 +703,20 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp)
|
||||
{
|
||||
u16 line_speed = bp->link_vars.line_speed;
|
||||
if (IS_MF(bp)) {
|
||||
u16 maxCfg = (bp->mf_config[BP_VN(bp)] &
|
||||
FUNC_MF_CFG_MAX_BW_MASK) >>
|
||||
FUNC_MF_CFG_MAX_BW_SHIFT;
|
||||
/* Calculate the current MAX line speed limit for the DCC
|
||||
* capable devices
|
||||
u16 maxCfg = bnx2x_extract_max_cfg(bp,
|
||||
bp->mf_config[BP_VN(bp)]);
|
||||
|
||||
/* Calculate the current MAX line speed limit for the MF
|
||||
* devices
|
||||
*/
|
||||
if (IS_MF_SD(bp)) {
|
||||
if (IS_MF_SI(bp))
|
||||
line_speed = (line_speed * maxCfg) / 100;
|
||||
else { /* SD mode */
|
||||
u16 vn_max_rate = maxCfg * 100;
|
||||
|
||||
if (vn_max_rate < line_speed)
|
||||
line_speed = vn_max_rate;
|
||||
} else /* IS_MF_SI(bp)) */
|
||||
line_speed = (line_speed * maxCfg) / 100;
|
||||
}
|
||||
}
|
||||
|
||||
return line_speed;
|
||||
|
@ -1044,4 +1044,24 @@ static inline void storm_memset_cmng(struct bnx2x *bp,
|
||||
void bnx2x_acquire_phy_lock(struct bnx2x *bp);
|
||||
void bnx2x_release_phy_lock(struct bnx2x *bp);
|
||||
|
||||
/**
|
||||
* Extracts MAX BW part from MF configuration.
|
||||
*
|
||||
* @param bp
|
||||
* @param mf_cfg
|
||||
*
|
||||
* @return u16
|
||||
*/
|
||||
static inline u16 bnx2x_extract_max_cfg(struct bnx2x *bp, u32 mf_cfg)
|
||||
{
|
||||
u16 max_cfg = (mf_cfg & FUNC_MF_CFG_MAX_BW_MASK) >>
|
||||
FUNC_MF_CFG_MAX_BW_SHIFT;
|
||||
if (!max_cfg) {
|
||||
BNX2X_ERR("Illegal configuration detected for Max BW - "
|
||||
"using 100 instead\n");
|
||||
max_cfg = 100;
|
||||
}
|
||||
return max_cfg;
|
||||
}
|
||||
|
||||
#endif /* BNX2X_CMN_H */
|
||||
|
@ -238,7 +238,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
speed |= (cmd->speed_hi << 16);
|
||||
|
||||
if (IS_MF_SI(bp)) {
|
||||
u32 param = 0;
|
||||
u32 param = 0, part;
|
||||
u32 line_speed = bp->link_vars.line_speed;
|
||||
|
||||
/* use 10G if no link detected */
|
||||
@ -251,9 +251,11 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
REQ_BC_VER_4_SET_MF_BW);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (line_speed < speed) {
|
||||
BNX2X_DEV_INFO("New speed should be less or equal "
|
||||
"to actual line speed\n");
|
||||
part = (speed * 100) / line_speed;
|
||||
if (line_speed < speed || !part) {
|
||||
BNX2X_DEV_INFO("Speed setting should be in a range "
|
||||
"from 1%% to 100%% "
|
||||
"of actual line speed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* load old values */
|
||||
@ -263,8 +265,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
param &= FUNC_MF_CFG_MIN_BW_MASK;
|
||||
|
||||
/* set new MAX value */
|
||||
param |= (((speed * 100) / line_speed)
|
||||
<< FUNC_MF_CFG_MAX_BW_SHIFT)
|
||||
param |= (part << FUNC_MF_CFG_MAX_BW_SHIFT)
|
||||
& FUNC_MF_CFG_MAX_BW_MASK;
|
||||
|
||||
bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param);
|
||||
|
@ -1974,13 +1974,22 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn)
|
||||
vn_max_rate = 0;
|
||||
|
||||
} else {
|
||||
u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg);
|
||||
|
||||
vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >>
|
||||
FUNC_MF_CFG_MIN_BW_SHIFT) * 100;
|
||||
/* If min rate is zero - set it to 1 */
|
||||
/* If fairness is enabled (not all min rates are zeroes) and
|
||||
if current min rate is zero - set it to 1.
|
||||
This is a requirement of the algorithm. */
|
||||
if (bp->vn_weight_sum && (vn_min_rate == 0))
|
||||
vn_min_rate = DEF_MIN_RATE;
|
||||
vn_max_rate = ((vn_cfg & FUNC_MF_CFG_MAX_BW_MASK) >>
|
||||
FUNC_MF_CFG_MAX_BW_SHIFT) * 100;
|
||||
|
||||
if (IS_MF_SI(bp))
|
||||
/* maxCfg in percents of linkspeed */
|
||||
vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100;
|
||||
else
|
||||
/* maxCfg is absolute in 100Mb units */
|
||||
vn_max_rate = maxCfg * 100;
|
||||
}
|
||||
|
||||
DP(NETIF_MSG_IFUP,
|
||||
|
Loading…
Reference in New Issue
Block a user