diff options
author | Chien Tung <ctung@neteffect.com> | 2008-09-26 16:08:10 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2008-09-30 18:35:49 -0400 |
commit | 9d156947c734747065178331e0c95745cf3a55e1 (patch) | |
tree | 278e4509d89f16aa2405a950306b14c601bf6400 | |
parent | 068e80de6af2b920d2644bba3a2c060431834160 (diff) |
RDMA/nes: Limit critical error interrupts
Mask off a critical error after 100 critical error interrupts to
keep the system "sane".
Signed-off-by: Sweta Bhatt <sweta.bhatt@einfochips.com>
Signed-off-by: Chien Tung <ctung@neteffect.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 40 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.h | 1 |
2 files changed, 29 insertions, 12 deletions
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 515c0716345b..fc45e9c808f1 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -55,7 +55,7 @@ u32 int_mod_cq_depth_24; | |||
55 | u32 int_mod_cq_depth_16; | 55 | u32 int_mod_cq_depth_16; |
56 | u32 int_mod_cq_depth_4; | 56 | u32 int_mod_cq_depth_4; |
57 | u32 int_mod_cq_depth_1; | 57 | u32 int_mod_cq_depth_1; |
58 | 58 | static const u8 nes_max_critical_error_count = 100; | |
59 | #include "nes_cm.h" | 59 | #include "nes_cm.h" |
60 | 60 | ||
61 | static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq); | 61 | static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq); |
@@ -67,6 +67,7 @@ static void nes_process_aeq(struct nes_device *nesdev, struct nes_hw_aeq *aeq); | |||
67 | static void nes_process_ceq(struct nes_device *nesdev, struct nes_hw_ceq *ceq); | 67 | static void nes_process_ceq(struct nes_device *nesdev, struct nes_hw_ceq *ceq); |
68 | static void nes_process_iwarp_aeqe(struct nes_device *nesdev, | 68 | static void nes_process_iwarp_aeqe(struct nes_device *nesdev, |
69 | struct nes_hw_aeqe *aeqe); | 69 | struct nes_hw_aeqe *aeqe); |
70 | static void process_critical_error(struct nes_device *nesdev); | ||
70 | static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number); | 71 | static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number); |
71 | static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode); | 72 | static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode); |
72 | 73 | ||
@@ -1352,7 +1353,7 @@ int nes_init_phy(struct nes_device *nesdev) | |||
1352 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc319, 0x0008); | 1353 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc319, 0x0008); |
1353 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc31a, 0x0098); | 1354 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc31a, 0x0098); |
1354 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0026, 0x0E00); | 1355 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0026, 0x0E00); |
1355 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0027, 0x0000); | 1356 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0027, 0x0001); |
1356 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0028, 0xA528); | 1357 | nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0028, 0xA528); |
1357 | 1358 | ||
1358 | /* | 1359 | /* |
@@ -1991,7 +1992,30 @@ int nes_napi_isr(struct nes_device *nesdev) | |||
1991 | } | 1992 | } |
1992 | } | 1993 | } |
1993 | 1994 | ||
1994 | 1995 | static void process_critical_error(struct nes_device *nesdev) | |
1996 | { | ||
1997 | u32 debug_error; | ||
1998 | u32 nes_idx_debug_error_masks0 = 0; | ||
1999 | u16 error_module = 0; | ||
2000 | |||
2001 | debug_error = nes_read_indexed(nesdev, NES_IDX_DEBUG_ERROR_CONTROL_STATUS); | ||
2002 | printk(KERN_ERR PFX "Critical Error reported by device!!! 0x%02X\n", | ||
2003 | (u16)debug_error); | ||
2004 | nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_CONTROL_STATUS, | ||
2005 | 0x01010000 | (debug_error & 0x0000ffff)); | ||
2006 | if (crit_err_count++ > 10) | ||
2007 | nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_MASKS1, 1 << 0x17); | ||
2008 | error_module = (u16) (debug_error & 0x0F00) >> 8; | ||
2009 | if (++nesdev->nesadapter->crit_error_count[error_module-1] >= | ||
2010 | nes_max_critical_error_count) { | ||
2011 | printk(KERN_ERR PFX "Masking off critical error for module " | ||
2012 | "0x%02X\n", (u16)error_module); | ||
2013 | nes_idx_debug_error_masks0 = nes_read_indexed(nesdev, | ||
2014 | NES_IDX_DEBUG_ERROR_MASKS0); | ||
2015 | nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_MASKS0, | ||
2016 | nes_idx_debug_error_masks0 | (1 << error_module)); | ||
2017 | } | ||
2018 | } | ||
1995 | /** | 2019 | /** |
1996 | * nes_dpc | 2020 | * nes_dpc |
1997 | */ | 2021 | */ |
@@ -2006,7 +2030,6 @@ void nes_dpc(unsigned long param) | |||
2006 | u32 timer_stat; | 2030 | u32 timer_stat; |
2007 | u32 temp_int_stat; | 2031 | u32 temp_int_stat; |
2008 | u32 intf_int_stat; | 2032 | u32 intf_int_stat; |
2009 | u32 debug_error; | ||
2010 | u32 processed_intf_int = 0; | 2033 | u32 processed_intf_int = 0; |
2011 | u16 processed_timer_int = 0; | 2034 | u16 processed_timer_int = 0; |
2012 | u16 completion_ints = 0; | 2035 | u16 completion_ints = 0; |
@@ -2084,14 +2107,7 @@ void nes_dpc(unsigned long param) | |||
2084 | intf_int_stat = nes_read32(nesdev->regs+NES_INTF_INT_STAT); | 2107 | intf_int_stat = nes_read32(nesdev->regs+NES_INTF_INT_STAT); |
2085 | intf_int_stat &= nesdev->intf_int_req; | 2108 | intf_int_stat &= nesdev->intf_int_req; |
2086 | if (NES_INTF_INT_CRITERR & intf_int_stat) { | 2109 | if (NES_INTF_INT_CRITERR & intf_int_stat) { |
2087 | debug_error = nes_read_indexed(nesdev, NES_IDX_DEBUG_ERROR_CONTROL_STATUS); | 2110 | process_critical_error(nesdev); |
2088 | printk(KERN_ERR PFX "Critical Error reported by device!!! 0x%02X\n", | ||
2089 | (u16)debug_error); | ||
2090 | nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_CONTROL_STATUS, | ||
2091 | 0x01010000 | (debug_error & 0x0000ffff)); | ||
2092 | /* BUG(); */ | ||
2093 | if (crit_err_count++ > 10) | ||
2094 | nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_MASKS1, 1 << 0x17); | ||
2095 | } | 2111 | } |
2096 | if (NES_INTF_INT_PCIERR & intf_int_stat) { | 2112 | if (NES_INTF_INT_PCIERR & intf_int_stat) { |
2097 | printk(KERN_ERR PFX "PCI Error reported by device!!!\n"); | 2113 | printk(KERN_ERR PFX "PCI Error reported by device!!!\n"); |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 82d06766ad52..1b93c571b931 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -1096,6 +1096,7 @@ struct nes_adapter { | |||
1096 | u16 pd_config_base[4]; | 1096 | u16 pd_config_base[4]; |
1097 | 1097 | ||
1098 | u16 link_interrupt_count[4]; | 1098 | u16 link_interrupt_count[4]; |
1099 | u8 crit_error_count[32]; | ||
1099 | 1100 | ||
1100 | /* the phy index for each port */ | 1101 | /* the phy index for each port */ |
1101 | u8 phy_index[4]; | 1102 | u8 phy_index[4]; |