@@ -126,6 +126,9 @@ static int fsp_ipmi_send_request(void)
struct fsp_msg *msg;
int rc;
+ if (fsp_in_rr())
+ return OPAL_BUSY;
+
lock(&fsp_ipmi.lock);
/* An outstanding request is still pending */
if (fsp_ipmi.cur_msg) {
@@ -376,6 +376,9 @@ static int64_t fsp_sensor_send_read_request(struct opal_sensor_data *attr)
uint32_t align;
uint32_t cmd_header;
+ if (fsp_in_rr())
+ return OPAL_BUSY;
+
prlog(PR_INSANE, "Get the data for modifier [%x]\n",
spcn_mod_data[attr->mod_index].mod);
@@ -516,6 +519,9 @@ int64_t fsp_opal_read_sensor(uint32_t sensor_hndl, int token,
prlog(PR_INSANE, "fsp_opal_read_sensor [%08x]\n", sensor_hndl);
+ if (fsp_in_rr())
+ return OPAL_BUSY;
+
if (sensor_state == SENSOR_PERMANENT_ERROR) {
rc = OPAL_HARDWARE;
goto out;
@@ -409,6 +409,22 @@ static bool fsp_in_reset(struct fsp *fsp)
}
}
+bool fsp_in_rr(void)
+{
+ struct fsp *fsp = fsp_get_active();
+ struct fsp_iopath *iop;
+
+ if (fsp->active_iopath < 0)
+ return true;
+
+ iop = &fsp->iopath[fsp->active_iopath];
+
+ if (fsp_in_reset(fsp) || fsp_in_hir(fsp) || !(psi_check_link_active(iop->psi)))
+ return true;
+
+ return false;
+}
+
static bool fsp_hir_state_timeout(void)
{
u64 now = mftb();
@@ -810,6 +810,7 @@ extern void fsp_ipmi_init(void);
extern void fsp_reinit_fsp(void);
extern void fsp_trigger_reset(void);
extern void fsp_reset_links(void);
+extern bool fsp_in_rr(void);
/* FSP memory errors */
extern void fsp_memory_err_init(void);