|
@@ -3299,6 +3299,17 @@ static inline void bnx2x_fan_failure(struct bnx2x *bp)
|
|
netdev_err(bp->dev, "Fan Failure on Network Controller has caused"
|
|
netdev_err(bp->dev, "Fan Failure on Network Controller has caused"
|
|
" the driver to shutdown the card to prevent permanent"
|
|
" the driver to shutdown the card to prevent permanent"
|
|
" damage. Please contact OEM Support for assistance\n");
|
|
" damage. Please contact OEM Support for assistance\n");
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Scheudle device reset (unload)
|
|
|
|
+ * This is due to some boards consuming sufficient power when driver is
|
|
|
|
+ * up to overheat if fan fails.
|
|
|
|
+ */
|
|
|
|
+ smp_mb__before_clear_bit();
|
|
|
|
+ set_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state);
|
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
|
+ schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
|
|
static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
|
|
@@ -8503,6 +8514,17 @@ sp_rtnl_not_reset:
|
|
if (test_and_clear_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state))
|
|
if (test_and_clear_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state))
|
|
bnx2x_setup_tc(bp->dev, bp->dcbx_port_params.ets.num_of_cos);
|
|
bnx2x_setup_tc(bp->dev, bp->dcbx_port_params.ets.num_of_cos);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * in case of fan failure we need to reset id if the "stop on error"
|
|
|
|
+ * debug flag is set, since we trying to prevent permanent overheating
|
|
|
|
+ * damage
|
|
|
|
+ */
|
|
|
|
+ if (test_and_clear_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state)) {
|
|
|
|
+ DP(BNX2X_MSG_SP, "fan failure detected. Unloading driver");
|
|
|
|
+ netif_device_detach(bp->dev);
|
|
|
|
+ bnx2x_close(bp->dev);
|
|
|
|
+ }
|
|
|
|
+
|
|
sp_rtnl_exit:
|
|
sp_rtnl_exit:
|
|
rtnl_unlock();
|
|
rtnl_unlock();
|
|
}
|
|
}
|
|
@@ -9969,7 +9991,7 @@ static int bnx2x_open(struct net_device *dev)
|
|
}
|
|
}
|
|
|
|
|
|
/* called with rtnl_lock */
|
|
/* called with rtnl_lock */
|
|
-static int bnx2x_close(struct net_device *dev)
|
|
|
|
|
|
+int bnx2x_close(struct net_device *dev)
|
|
{
|
|
{
|
|
struct bnx2x *bp = netdev_priv(dev);
|
|
struct bnx2x *bp = netdev_priv(dev);
|
|
|
|
|