aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
diff options
context:
space:
mode:
authorAriel Elior <ariele@broadcom.com>2011-11-12 23:34:29 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-13 16:03:56 -0500
commit8304859adc213df9f69a86e06164683f76cd5d49 (patch)
tree5053cd99191b51bdbf32ec25de96bebdc3e5459a /drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
parent46fa1309fe5b05249447df903ec256c3509eb985 (diff)
bnx2x: add fan failure event handling
Shut down the device in case of fan failure to prevent HW damage. 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>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 967c41b8b172..33ff60d9fec8 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -3299,6 +3299,17 @@ static inline void bnx2x_fan_failure(struct bnx2x *bp)
3299 netdev_err(bp->dev, "Fan Failure on Network Controller has caused" 3299 netdev_err(bp->dev, "Fan Failure on Network Controller has caused"
3300 " the driver to shutdown the card to prevent permanent" 3300 " the driver to shutdown the card to prevent permanent"
3301 " damage. Please contact OEM Support for assistance\n"); 3301 " damage. Please contact OEM Support for assistance\n");
3302
3303 /*
3304 * Scheudle device reset (unload)
3305 * This is due to some boards consuming sufficient power when driver is
3306 * up to overheat if fan fails.
3307 */
3308 smp_mb__before_clear_bit();
3309 set_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state);
3310 smp_mb__after_clear_bit();
3311 schedule_delayed_work(&bp->sp_rtnl_task, 0);
3312
3302} 3313}
3303 3314
3304static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) 3315static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
@@ -8503,6 +8514,17 @@ sp_rtnl_not_reset:
8503 if (test_and_clear_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state)) 8514 if (test_and_clear_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state))
8504 bnx2x_setup_tc(bp->dev, bp->dcbx_port_params.ets.num_of_cos); 8515 bnx2x_setup_tc(bp->dev, bp->dcbx_port_params.ets.num_of_cos);
8505 8516
8517 /*
8518 * in case of fan failure we need to reset id if the "stop on error"
8519 * debug flag is set, since we trying to prevent permanent overheating
8520 * damage
8521 */
8522 if (test_and_clear_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state)) {
8523 DP(BNX2X_MSG_SP, "fan failure detected. Unloading driver");
8524 netif_device_detach(bp->dev);
8525 bnx2x_close(bp->dev);
8526 }
8527
8506sp_rtnl_exit: 8528sp_rtnl_exit:
8507 rtnl_unlock(); 8529 rtnl_unlock();
8508} 8530}
@@ -9969,7 +9991,7 @@ static int bnx2x_open(struct net_device *dev)
9969} 9991}
9970 9992
9971/* called with rtnl_lock */ 9993/* called with rtnl_lock */
9972static int bnx2x_close(struct net_device *dev) 9994int bnx2x_close(struct net_device *dev)
9973{ 9995{
9974 struct bnx2x *bp = netdev_priv(dev); 9996 struct bnx2x *bp = netdev_priv(dev);
9975 9997