diff options
author | Ariel Elior <ariele@broadcom.com> | 2011-11-12 23:34:29 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-13 16:03:56 -0500 |
commit | 8304859adc213df9f69a86e06164683f76cd5d49 (patch) | |
tree | 5053cd99191b51bdbf32ec25de96bebdc3e5459a | |
parent | 46fa1309fe5b05249447df903ec256c3509eb985 (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>
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 24 |
2 files changed, 26 insertions, 1 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 23e91f4c1485..78613effd7e4 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
@@ -1141,6 +1141,7 @@ struct bnx2x_fw_stats_data { | |||
1141 | enum { | 1141 | enum { |
1142 | BNX2X_SP_RTNL_SETUP_TC, | 1142 | BNX2X_SP_RTNL_SETUP_TC, |
1143 | BNX2X_SP_RTNL_TX_TIMEOUT, | 1143 | BNX2X_SP_RTNL_TX_TIMEOUT, |
1144 | BNX2X_SP_RTNL_FAN_FAILURE, | ||
1144 | }; | 1145 | }; |
1145 | 1146 | ||
1146 | 1147 | ||
@@ -2048,6 +2049,8 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, | |||
2048 | #define BNX2X_VPD_LEN 128 | 2049 | #define BNX2X_VPD_LEN 128 |
2049 | #define VENDOR_ID_LEN 4 | 2050 | #define VENDOR_ID_LEN 4 |
2050 | 2051 | ||
2052 | int bnx2x_close(struct net_device *dev); | ||
2053 | |||
2051 | /* Congestion management fairness mode */ | 2054 | /* Congestion management fairness mode */ |
2052 | #define CMNG_FNS_NONE 0 | 2055 | #define CMNG_FNS_NONE 0 |
2053 | #define CMNG_FNS_MINMAX 1 | 2056 | #define CMNG_FNS_MINMAX 1 |
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 | ||
3304 | static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) | 3315 | static 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 | |||
8506 | sp_rtnl_exit: | 8528 | sp_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 */ |
9972 | static int bnx2x_close(struct net_device *dev) | 9994 | int bnx2x_close(struct net_device *dev) |
9973 | { | 9995 | { |
9974 | struct bnx2x *bp = netdev_priv(dev); | 9996 | struct bnx2x *bp = netdev_priv(dev); |
9975 | 9997 | ||