소스 검색

bnx2: Fix bandwidth allocation for some MF modes

Management firmware tells driver in case bandwidth configuration for
a specific function exists, but [regretably] the same field has different
meanings depending on the multi-function mode - it can either be
a percentile value or an actual speed.

For newer multi-function modes current logic is incorrect -
driver understands values as actual speeds instead of percentages,
causing the resulting chip configuration to be incorrect.

Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Yuval Mintz 10 년 전
부모
커밋
da3cc2da7c

+ 4 - 0
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h

@@ -2571,6 +2571,10 @@ void bnx2x_notify_link_changed(struct bnx2x *bp);
 			(IS_MF_SD_STORAGE_PERSONALITY_ONLY(bp) ||	\
 			(IS_MF_SD_STORAGE_PERSONALITY_ONLY(bp) ||	\
 			 IS_MF_SI_STORAGE_PERSONALITY_ONLY(bp))
 			 IS_MF_SI_STORAGE_PERSONALITY_ONLY(bp))
 
 
+/* Determines whether BW configuration arrives in 100Mb units or in
+ * percentages from actual physical link speed.
+ */
+#define IS_MF_PERCENT_BW(bp) (IS_MF_SI(bp) || IS_MF_UFP(bp) || IS_MF_BD(bp))
 
 
 #define SET_FLAG(value, mask, flag) \
 #define SET_FLAG(value, mask, flag) \
 	do {\
 	do {\

+ 1 - 1
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c

@@ -1190,7 +1190,7 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp)
 		/* Calculate the current MAX line speed limit for the MF
 		/* Calculate the current MAX line speed limit for the MF
 		 * devices
 		 * devices
 		 */
 		 */
-		if (IS_MF_SI(bp))
+		if (IS_MF_PERCENT_BW(bp))
 			line_speed = (line_speed * maxCfg) / 100;
 			line_speed = (line_speed * maxCfg) / 100;
 		else { /* SD mode */
 		else { /* SD mode */
 			u16 vn_max_rate = maxCfg * 100;
 			u16 vn_max_rate = maxCfg * 100;

+ 1 - 1
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

@@ -2494,7 +2494,7 @@ static void bnx2x_calc_vn_max(struct bnx2x *bp, int vn,
 	else {
 	else {
 		u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg);
 		u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg);
 
 
-		if (IS_MF_SI(bp)) {
+		if (IS_MF_PERCENT_BW(bp)) {
 			/* maxCfg in percents of linkspeed */
 			/* maxCfg in percents of linkspeed */
 			vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100;
 			vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100;
 		} else /* SD modes */
 		} else /* SD modes */