Commit 8304859a authored by Ariel Elior's avatar Ariel Elior Committed by David S. Miller

bnx2x: add fan failure event handling

Shut down the device in case of fan failure to prevent HW damage.
Signed-off-by: default avatarDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 46fa1309
...@@ -1141,6 +1141,7 @@ struct bnx2x_fw_stats_data { ...@@ -1141,6 +1141,7 @@ struct bnx2x_fw_stats_data {
enum { enum {
BNX2X_SP_RTNL_SETUP_TC, BNX2X_SP_RTNL_SETUP_TC,
BNX2X_SP_RTNL_TX_TIMEOUT, BNX2X_SP_RTNL_TX_TIMEOUT,
BNX2X_SP_RTNL_FAN_FAILURE,
}; };
...@@ -2048,6 +2049,8 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, ...@@ -2048,6 +2049,8 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
#define BNX2X_VPD_LEN 128 #define BNX2X_VPD_LEN 128
#define VENDOR_ID_LEN 4 #define VENDOR_ID_LEN 4
int bnx2x_close(struct net_device *dev);
/* Congestion management fairness mode */ /* Congestion management fairness mode */
#define CMNG_FNS_NONE 0 #define CMNG_FNS_NONE 0
#define CMNG_FNS_MINMAX 1 #define CMNG_FNS_MINMAX 1
......
...@@ -3299,6 +3299,17 @@ static inline void bnx2x_fan_failure(struct bnx2x *bp) ...@@ -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 @@ static void bnx2x_sp_rtnl_task(struct work_struct *work) ...@@ -8503,6 +8514,17 @@ static void bnx2x_sp_rtnl_task(struct work_struct *work)
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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment