On Fri, Mar 1, 2019 at 8:27 PM Steve Sistare <steven.sistare@xxxxxxxxxx> wrote: > > megaraid_sas takes 1+ seconds to load while waiting for firmware: > > [2.822603] megaraid_sas 0000:03:00.0: Waiting for FW to come to ready state > [3.871003] megaraid_sas 0000:03:00.0: FW now in Ready state > > This is due to the following loop in megasas_transition_to_ready(), which > waits a minimum of 1 second, even though the FW becomes ready in tens of > millisecs: > > /* > * The cur_state should not last for more than max_wait secs > */ > for (i = 0; i < max_wait; i++) { > ... > msleep(1000); > ... > dev_info(&instance->pdev->dev, "FW now in Ready state\n"); > > This is a regression, caused by a change of the msleep granularity from 1 to > 1000 due to concern about waiting too long on systems with coarse jiffies. > > To fix, increase iterations and use msleep(20), which results in: > > [2.670627] megaraid_sas 0000:03:00.0: Waiting for FW to come to ready state > [2.739386] megaraid_sas 0000:03:00.0: FW now in Ready state > > Fixes: fb2f3e96d80f ("scsi: megaraid_sas: Fix msleep granularity") > Signed-off-by: Steve Sistare <steven.sistare@xxxxxxxxxx> Acked-by: Sumit Saxena <sumit.saxena@xxxxxxxxxxxx> > --- > drivers/scsi/megaraid/megaraid_sas_base.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c > index a30c1b3..a707af5 100644 > --- a/drivers/scsi/megaraid/megaraid_sas_base.c > +++ b/drivers/scsi/megaraid/megaraid_sas_base.c > @@ -3932,12 +3932,12 @@ static irqreturn_t megasas_isr(int irq, void *devp) > /* > * The cur_state should not last for more than max_wait secs > */ > - for (i = 0; i < max_wait; i++) { > + for (i = 0; i < max_wait * 50; i++) { > curr_abs_state = instance->instancet-> > read_fw_status_reg(instance); > > if (abs_state == curr_abs_state) { > - msleep(1000); > + msleep(20); > } else > break; > } > -- > 1.8.3.1 >