bnx2x: prevent DCB if disabled in nvram
authorBarak Witkowski <barak@broadcom.com>
Sun, 2 Dec 2012 04:05:55 +0000 (04:05 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Dec 2012 01:23:00 +0000 (20:23 -0500)
Signed-off-by: Barak Witkowski <barak@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index c0d9b6947d979d3f42594cf9a013331ee72dac6b..c8c034027ce50ab156635c6cafaf95bca9177579 100644 (file)
@@ -1904,6 +1904,11 @@ static u8 bnx2x_dcbnl_set_state(struct net_device *netdev, u8 state)
        struct bnx2x *bp = netdev_priv(netdev);
        DP(BNX2X_MSG_DCB, "state = %s\n", state ? "on" : "off");
 
+       if (state && ((bp->dcbx_enabled == BNX2X_DCBX_ENABLED_OFF) ||
+                     (bp->dcbx_enabled == BNX2X_DCBX_ENABLED_INVALID))) {
+               DP(BNX2X_MSG_DCB, "Can not set dcbx to enabled while it is disabled in nvm\n");
+               return 1;
+       }
        bnx2x_dcbx_set_state(bp, (state ? true : false), bp->dcbx_enabled);
        return 0;
 }
index d76ca90eea94c516051277174692ea73f12a3d27..ab65f34bb5410aed3e9ebe383a1bbbc2d783a50c 100644 (file)
@@ -11120,8 +11120,15 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
        bp->timer.data = (unsigned long) bp;
        bp->timer.function = bnx2x_timer;
 
-       bnx2x_dcbx_set_state(bp, true, BNX2X_DCBX_ENABLED_ON_NEG_ON);
-       bnx2x_dcbx_init_params(bp);
+       if (SHMEM2_HAS(bp, dcbx_lldp_params_offset) &&
+           SHMEM2_HAS(bp, dcbx_lldp_dcbx_stat_offset) &&
+           SHMEM2_RD(bp, dcbx_lldp_params_offset) &&
+           SHMEM2_RD(bp, dcbx_lldp_dcbx_stat_offset)) {
+               bnx2x_dcbx_set_state(bp, true, BNX2X_DCBX_ENABLED_ON_NEG_ON);
+               bnx2x_dcbx_init_params(bp);
+       } else {
+               bnx2x_dcbx_set_state(bp, false, BNX2X_DCBX_ENABLED_OFF);
+       }
 
        if (CHIP_IS_E1x(bp))
                bp->cnic_base_cl_id = FP_SB_MAX_E1x;