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: Gavin Shan <gwshan@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
committed by
Benjamin Herrenschmidt
parent
e4565362c7
commit
9e04937560
@@ -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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
* 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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user