提交 9e049375 编写于 作者: G Gavin Shan 提交者: Benjamin Herrenschmidt

powerpc/eeh: Remove EEH_PE_PHB_DEAD

The PE state (for eeh_pe instance) EEH_PE_PHB_DEAD is duplicate to
EEH_PE_ISOLATED. Originally, those PHBs (PHB PE) with EEH_PE_PHB_DEAD
would be removed from the system. However, it's safe to replace
that with EEH_PE_ISOLATED.

The patch also clear EEH_PE_RECOVERING after fenced PHB has been handled,
either failure or success. It makes the PHB PE state consistent with:

	PHB functions normally		  NONE
	PHB has been removed		  EEH_PE_ISOLATED
	PHB fenced, recovery in progress  EEH_PE_ISOLATED | RECOVERING
Signed-off-by: NGavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 e4565362
...@@ -53,7 +53,6 @@ struct device_node; ...@@ -53,7 +53,6 @@ struct device_node;
#define EEH_PE_ISOLATED (1 << 0) /* Isolated PE */ #define EEH_PE_ISOLATED (1 << 0) /* Isolated PE */
#define EEH_PE_RECOVERING (1 << 1) /* Recovering PE */ #define EEH_PE_RECOVERING (1 << 1) /* Recovering PE */
#define EEH_PE_PHB_DEAD (1 << 2) /* Dead PHB */
#define EEH_PE_KEEP (1 << 8) /* Keep PE on hotplug */ #define EEH_PE_KEEP (1 << 8) /* Keep PE on hotplug */
......
...@@ -232,7 +232,6 @@ void eeh_slot_error_detail(struct eeh_pe *pe, int severity) ...@@ -232,7 +232,6 @@ void eeh_slot_error_detail(struct eeh_pe *pe, int severity)
{ {
size_t loglen = 0; size_t loglen = 0;
struct eeh_dev *edev, *tmp; struct eeh_dev *edev, *tmp;
bool valid_cfg_log = true;
/* /*
* When the PHB is fenced or dead, it's pointless to collect * When the PHB is fenced or dead, it's pointless to collect
...@@ -240,12 +239,7 @@ void eeh_slot_error_detail(struct eeh_pe *pe, int severity) ...@@ -240,12 +239,7 @@ void eeh_slot_error_detail(struct eeh_pe *pe, int severity)
* 0xFF's. For ER, we still retrieve the data from the PCI * 0xFF's. For ER, we still retrieve the data from the PCI
* config space. * config space.
*/ */
if (eeh_probe_mode_dev() && if (!(pe->type & EEH_PE_PHB)) {
(pe->type & EEH_PE_PHB) &&
(pe->state & (EEH_PE_ISOLATED | EEH_PE_PHB_DEAD)))
valid_cfg_log = false;
if (valid_cfg_log) {
eeh_pci_enable(pe, EEH_OPT_THAW_MMIO); eeh_pci_enable(pe, EEH_OPT_THAW_MMIO);
eeh_ops->configure_bridge(pe); eeh_ops->configure_bridge(pe);
eeh_pe_restore_bars(pe); eeh_pe_restore_bars(pe);
...@@ -309,7 +303,7 @@ static int eeh_phb_check_failure(struct eeh_pe *pe) ...@@ -309,7 +303,7 @@ static int eeh_phb_check_failure(struct eeh_pe *pe)
/* If the PHB has been in problematic state */ /* If the PHB has been in problematic state */
eeh_serialize_lock(&flags); eeh_serialize_lock(&flags);
if (phb_pe->state & (EEH_PE_ISOLATED | EEH_PE_PHB_DEAD)) { if (phb_pe->state & EEH_PE_ISOLATED) {
ret = 0; ret = 0;
goto out; goto out;
} }
......
...@@ -682,8 +682,7 @@ static void eeh_handle_special_event(void) ...@@ -682,8 +682,7 @@ static void eeh_handle_special_event(void)
phb_pe = eeh_phb_pe_get(hose); phb_pe = eeh_phb_pe_get(hose);
if (!phb_pe) continue; if (!phb_pe) continue;
eeh_pe_state_mark(phb_pe, eeh_pe_state_mark(phb_pe, EEH_PE_ISOLATED);
EEH_PE_ISOLATED | EEH_PE_PHB_DEAD);
} }
eeh_serialize_unlock(flags); eeh_serialize_unlock(flags);
...@@ -699,8 +698,7 @@ static void eeh_handle_special_event(void) ...@@ -699,8 +698,7 @@ static void eeh_handle_special_event(void)
eeh_remove_event(pe); eeh_remove_event(pe);
if (rc == EEH_NEXT_ERR_DEAD_PHB) if (rc == EEH_NEXT_ERR_DEAD_PHB)
eeh_pe_state_mark(pe, eeh_pe_state_mark(pe, EEH_PE_ISOLATED);
EEH_PE_ISOLATED | EEH_PE_PHB_DEAD);
else else
eeh_pe_state_mark(pe, eeh_pe_state_mark(pe,
EEH_PE_ISOLATED | EEH_PE_RECOVERING); EEH_PE_ISOLATED | EEH_PE_RECOVERING);
...@@ -724,12 +722,14 @@ static void eeh_handle_special_event(void) ...@@ -724,12 +722,14 @@ static void eeh_handle_special_event(void)
if (rc == EEH_NEXT_ERR_FROZEN_PE || if (rc == EEH_NEXT_ERR_FROZEN_PE ||
rc == EEH_NEXT_ERR_FENCED_PHB) { rc == EEH_NEXT_ERR_FENCED_PHB) {
eeh_handle_normal_event(pe); eeh_handle_normal_event(pe);
eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
} else { } else {
pci_lock_rescan_remove(); pci_lock_rescan_remove();
list_for_each_entry(hose, &hose_list, list_node) { list_for_each_entry(hose, &hose_list, list_node) {
phb_pe = eeh_phb_pe_get(hose); phb_pe = eeh_phb_pe_get(hose);
if (!phb_pe || if (!phb_pe ||
!(phb_pe->state & EEH_PE_PHB_DEAD)) !(phb_pe->state & EEH_PE_ISOLATED) ||
(phb_pe->state & EEH_PE_RECOVERING))
continue; continue;
/* Notify all devices to be down */ /* Notify all devices to be down */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册