On 03/18/2013 05:58 AM, Mahesh Rajashekhara wrote: > This patch adds dual flash firmware support for Series 7 and above controllers. > > Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@xxxxxxxx> > --- > drivers/scsi/aacraid/aacraid.h | 6 +++++- > drivers/scsi/aacraid/comminit.c | 2 +- > drivers/scsi/aacraid/src.c | 31 ++++++++++++++++++++++++++++++- > 3 files changed, 36 insertions(+), 3 deletions(-) > > diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h > index a6f7190..9323d05 100644 > --- a/drivers/scsi/aacraid/aacraid.h > +++ b/drivers/scsi/aacraid/aacraid.h > @@ -12,7 +12,7 @@ > *----------------------------------------------------------------------------*/ > > #ifndef AAC_DRIVER_BUILD > -# define AAC_DRIVER_BUILD 30000 > +# define AAC_DRIVER_BUILD 30200 > # define AAC_DRIVER_BRANCH "-ms" > #endif > #define MAXIMUM_NUM_CONTAINERS 32 > @@ -1918,6 +1918,10 @@ extern struct aac_common aac_config; > #define MONITOR_PANIC 0x00000020 > #define KERNEL_UP_AND_RUNNING 0x00000080 > #define KERNEL_PANIC 0x00000100 > +#define FLASH_UPD_PENDING 0x00002000 > +#define FLASH_UPD_SUCCESS 0x00004000 > +#define FLASH_UPD_FAILED 0x00008000 > +#define FWUPD_TIMEOUT (5 * 60) > > /* > * Doorbell bit defines > diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c > index 3f75995..177b094 100644 > --- a/drivers/scsi/aacraid/comminit.c > +++ b/drivers/scsi/aacraid/comminit.c > @@ -214,7 +214,7 @@ int aac_send_shutdown(struct aac_dev * dev) > cmd = (struct aac_close *) fib_data(fibctx); > > cmd->command = cpu_to_le32(VM_CloseAll); > - cmd->cid = cpu_to_le32(0xffffffff); > + cmd->cid = cpu_to_le32(0xfffffffe); > > status = aac_fib_send(ContainerCommand, > fibctx, > diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c > index e2e3492..b8be2ab 100644 > --- a/drivers/scsi/aacraid/src.c > +++ b/drivers/scsi/aacraid/src.c > @@ -685,6 +685,7 @@ int aac_srcv_init(struct aac_dev *dev) > unsigned long status; > int restart = 0; > int instance = dev->id; > + int waitCount; > const char *name = dev->name; > > dev->a_ops.adapter_ioremap = aac_srcv_ioremap; > @@ -703,6 +704,32 @@ int aac_srcv_init(struct aac_dev *dev) > !aac_src_restart_adapter(dev, 0)) > ++restart; > /* > + * Check to see if flash update is running. > + * Wait for the adapter to be up and running. Wait up to 5 minutes > + */ > + status = src_readl(dev, MUnit.OMR); > + if (status & FLASH_UPD_PENDING) { > + start = jiffies; > + do { > + status = src_readl(dev, MUnit.OMR); > + if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) { > + printk(KERN_ERR "%s%d: adapter flash update failed.\n", > + dev->name, instance); > + goto error_iounmap; > + } > + } while (!(status & FLASH_UPD_SUCCESS) && > + !(status & FLASH_UPD_FAILED)); > + /* Delay 10 seconds. > + * Because right now FW is doing a soft reset, > + * do not read scratch pad register at this time > + */ > + waitCount = 10 * 10000; > + while (waitCount) { > + udelay(100); /* delay 100 microseconds */ > + waitCount--; Hi Mahesh, what is the reason for udelay here ? Maybe a ssleep (10); does the same job. Regards, Tomas > + } > + } > + /* > * Check to see if the board panic'd while booting. > */ > status = src_readl(dev, MUnit.OMR); > @@ -730,7 +757,9 @@ int aac_srcv_init(struct aac_dev *dev) > /* > * Wait for the adapter to be up and running. Wait up to 3 minutes > */ > - while (!((status = src_readl(dev, MUnit.OMR)) & KERNEL_UP_AND_RUNNING)) { > + while (!((status = src_readl(dev, MUnit.OMR)) & > + KERNEL_UP_AND_RUNNING) || > + status == 0xffffffff) { > if ((restart && > (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) || > time_after(jiffies, start+HZ*startup_timeout)) { -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html