bnx2: Fix bandwidth allocation for some MF modes
authorYuval Mintz <Yuval.Mintz@qlogic.com>
Mon, 17 Aug 2015 05:28:25 +0000 (08:28 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Aug 2015 17:27:57 +0000 (10:27 -0700)
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>
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index 5762c48..e28c90c 100644 (file)
@@ -2571,6 +2571,10 @@ void bnx2x_notify_link_changed(struct bnx2x *bp);
                        (IS_MF_SD_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) \
        do {\
index a2bb1f0..44173be 100644 (file)
@@ -1190,7 +1190,7 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp)
                /* Calculate the current MAX line speed limit for the MF
                 * devices
                 */
-               if (IS_MF_SI(bp))
+               if (IS_MF_PERCENT_BW(bp))
                        line_speed = (line_speed * maxCfg) / 100;
                else { /* SD mode */
                        u16 vn_max_rate = maxCfg * 100;
index ad73a60..eafd25d 100644 (file)
@@ -2494,7 +2494,7 @@ static void bnx2x_calc_vn_max(struct bnx2x *bp, int vn,
        else {
                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 */
                        vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100;
                } else /* SD modes */