powerpc/eeh: Cleanup eeh_ops.wait_state()
The wait_state member of eeh_ops does not need to be platform dependent; it's just logic around eeh_ops.get_state(). Therefore, merge the two (slightly different!) platform versions into a new function, eeh_wait_state() and remove the eeh_ops member. While doing this, also correct: * The wait logic, so that it never waits longer than max_wait. * The wait logic, so that it never waits less than EEH_STATE_MIN_WAIT_TIME. * One call site where the result is treated like a bit field before it's checked for negative error values. * In pseries_eeh_get_state(), rename the "state" parameter to "delay" because that's what it is. Signed-off-by: Sam Bobroff <sbobroff@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
e762bb891a
commit
fef7f90552
@@ -108,6 +108,57 @@ int eeh_phb_pe_create(struct pci_controller *phb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* eeh_wait_state - Wait for PE state
|
||||
* @pe: EEH PE
|
||||
* @max_wait: maximal period in millisecond
|
||||
*
|
||||
* Wait for the state of associated PE. It might take some time
|
||||
* to retrieve the PE's state.
|
||||
*/
|
||||
int eeh_wait_state(struct eeh_pe *pe, int max_wait)
|
||||
{
|
||||
int ret;
|
||||
int mwait;
|
||||
|
||||
/*
|
||||
* According to PAPR, the state of PE might be temporarily
|
||||
* unavailable. Under the circumstance, we have to wait
|
||||
* for indicated time determined by firmware. The maximal
|
||||
* wait time is 5 minutes, which is acquired from the original
|
||||
* EEH implementation. Also, the original implementation
|
||||
* also defined the minimal wait time as 1 second.
|
||||
*/
|
||||
#define EEH_STATE_MIN_WAIT_TIME (1000)
|
||||
#define EEH_STATE_MAX_WAIT_TIME (300 * 1000)
|
||||
|
||||
while (1) {
|
||||
ret = eeh_ops->get_state(pe, &mwait);
|
||||
|
||||
if (ret != EEH_STATE_UNAVAILABLE)
|
||||
return ret;
|
||||
|
||||
if (max_wait <= 0) {
|
||||
pr_warn("%s: Timeout when getting PE's state (%d)\n",
|
||||
__func__, max_wait);
|
||||
return EEH_STATE_NOT_SUPPORT;
|
||||
}
|
||||
|
||||
if (mwait < EEH_STATE_MIN_WAIT_TIME) {
|
||||
pr_warn("%s: Firmware returned bad wait value %d\n",
|
||||
__func__, mwait);
|
||||
mwait = EEH_STATE_MIN_WAIT_TIME;
|
||||
} else if (mwait > EEH_STATE_MAX_WAIT_TIME) {
|
||||
pr_warn("%s: Firmware returned too long wait value %d\n",
|
||||
__func__, mwait);
|
||||
mwait = EEH_STATE_MAX_WAIT_TIME;
|
||||
}
|
||||
|
||||
msleep(min(mwait, max_wait));
|
||||
max_wait -= mwait;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eeh_phb_pe_get - Retrieve PHB PE based on the given PHB
|
||||
* @phb: PCI controller
|
||||
|
Reference in New Issue
Block a user