diff options
author | Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | 2013-03-19 03:07:26 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-04-10 14:55:52 -0400 |
commit | 2c10cd43ac0b618be1f2e394bef4cbb2aa8bad34 (patch) | |
tree | 7bdfe559606cc5b8f8a129349116de491bd81023 | |
parent | 162cca5ed9c28d5d0923179c2b5d6be0c4d4d72e (diff) |
[SCSI] aacraid: Dual firmware image support
This patch adds dual flash firmware support for Series 7 and above controllers.
[thenzl: used ssleep(10) instead udelay]
Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 6 | ||||
-rw-r--r-- | drivers/scsi/aacraid/comminit.c | 2 | ||||
-rw-r--r-- | drivers/scsi/aacraid/src.c | 26 |
3 files changed, 31 insertions, 3 deletions
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index a6f7190c09a4..9323d058706b 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -12,7 +12,7 @@ | |||
12 | *----------------------------------------------------------------------------*/ | 12 | *----------------------------------------------------------------------------*/ |
13 | 13 | ||
14 | #ifndef AAC_DRIVER_BUILD | 14 | #ifndef AAC_DRIVER_BUILD |
15 | # define AAC_DRIVER_BUILD 30000 | 15 | # define AAC_DRIVER_BUILD 30200 |
16 | # define AAC_DRIVER_BRANCH "-ms" | 16 | # define AAC_DRIVER_BRANCH "-ms" |
17 | #endif | 17 | #endif |
18 | #define MAXIMUM_NUM_CONTAINERS 32 | 18 | #define MAXIMUM_NUM_CONTAINERS 32 |
@@ -1918,6 +1918,10 @@ extern struct aac_common aac_config; | |||
1918 | #define MONITOR_PANIC 0x00000020 | 1918 | #define MONITOR_PANIC 0x00000020 |
1919 | #define KERNEL_UP_AND_RUNNING 0x00000080 | 1919 | #define KERNEL_UP_AND_RUNNING 0x00000080 |
1920 | #define KERNEL_PANIC 0x00000100 | 1920 | #define KERNEL_PANIC 0x00000100 |
1921 | #define FLASH_UPD_PENDING 0x00002000 | ||
1922 | #define FLASH_UPD_SUCCESS 0x00004000 | ||
1923 | #define FLASH_UPD_FAILED 0x00008000 | ||
1924 | #define FWUPD_TIMEOUT (5 * 60) | ||
1921 | 1925 | ||
1922 | /* | 1926 | /* |
1923 | * Doorbell bit defines | 1927 | * Doorbell bit defines |
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c index 3f759957f4b4..177b094c7792 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) | |||
214 | cmd = (struct aac_close *) fib_data(fibctx); | 214 | cmd = (struct aac_close *) fib_data(fibctx); |
215 | 215 | ||
216 | cmd->command = cpu_to_le32(VM_CloseAll); | 216 | cmd->command = cpu_to_le32(VM_CloseAll); |
217 | cmd->cid = cpu_to_le32(0xffffffff); | 217 | cmd->cid = cpu_to_le32(0xfffffffe); |
218 | 218 | ||
219 | status = aac_fib_send(ContainerCommand, | 219 | status = aac_fib_send(ContainerCommand, |
220 | fibctx, | 220 | fibctx, |
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c index e2e349204e7d..0f56d8d7524f 100644 --- a/drivers/scsi/aacraid/src.c +++ b/drivers/scsi/aacraid/src.c | |||
@@ -703,6 +703,28 @@ int aac_srcv_init(struct aac_dev *dev) | |||
703 | !aac_src_restart_adapter(dev, 0)) | 703 | !aac_src_restart_adapter(dev, 0)) |
704 | ++restart; | 704 | ++restart; |
705 | /* | 705 | /* |
706 | * Check to see if flash update is running. | ||
707 | * Wait for the adapter to be up and running. Wait up to 5 minutes | ||
708 | */ | ||
709 | status = src_readl(dev, MUnit.OMR); | ||
710 | if (status & FLASH_UPD_PENDING) { | ||
711 | start = jiffies; | ||
712 | do { | ||
713 | status = src_readl(dev, MUnit.OMR); | ||
714 | if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) { | ||
715 | printk(KERN_ERR "%s%d: adapter flash update failed.\n", | ||
716 | dev->name, instance); | ||
717 | goto error_iounmap; | ||
718 | } | ||
719 | } while (!(status & FLASH_UPD_SUCCESS) && | ||
720 | !(status & FLASH_UPD_FAILED)); | ||
721 | /* Delay 10 seconds. | ||
722 | * Because right now FW is doing a soft reset, | ||
723 | * do not read scratch pad register at this time | ||
724 | */ | ||
725 | ssleep(10); | ||
726 | } | ||
727 | /* | ||
706 | * Check to see if the board panic'd while booting. | 728 | * Check to see if the board panic'd while booting. |
707 | */ | 729 | */ |
708 | status = src_readl(dev, MUnit.OMR); | 730 | status = src_readl(dev, MUnit.OMR); |
@@ -730,7 +752,9 @@ int aac_srcv_init(struct aac_dev *dev) | |||
730 | /* | 752 | /* |
731 | * Wait for the adapter to be up and running. Wait up to 3 minutes | 753 | * Wait for the adapter to be up and running. Wait up to 3 minutes |
732 | */ | 754 | */ |
733 | while (!((status = src_readl(dev, MUnit.OMR)) & KERNEL_UP_AND_RUNNING)) { | 755 | while (!((status = src_readl(dev, MUnit.OMR)) & |
756 | KERNEL_UP_AND_RUNNING) || | ||
757 | status == 0xffffffff) { | ||
734 | if ((restart && | 758 | if ((restart && |
735 | (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) || | 759 | (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) || |
736 | time_after(jiffies, start+HZ*startup_timeout)) { | 760 | time_after(jiffies, start+HZ*startup_timeout)) { |