[SCSI] megaraid_sas: Add 1078 OCR support
authoradam radford <aradford@gmail.com>
Thu, 12 May 2011 01:34:52 +0000 (18:34 -0700)
committerJames Bottomley <jbottomley@parallels.com>
Tue, 24 May 2011 16:35:56 +0000 (12:35 -0400)
Signed-off-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <jbottomley@parallels.com>
drivers/scsi/megaraid/megaraid_sas_base.c

index f43ab031edc82190a381d82597f0ea6792de23e4..09a0d9539ca6d407dd53f9479a797963a5f742e4 100644 (file)
@@ -437,15 +437,18 @@ megasas_read_fw_status_reg_ppc(struct megasas_register_set __iomem * regs)
 static int
 megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs)
 {
-       u32 status;
+       u32 status, mfiStatus = 0;
+
        /*
         * Check if it is our interrupt
         */
        status = readl(&regs->outbound_intr_status);
 
-       if (!(status & MFI_REPLY_1078_MESSAGE_INTERRUPT)) {
-               return 0;
-       }
+       if (status & MFI_REPLY_1078_MESSAGE_INTERRUPT)
+               mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
+
+       if (status & MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT)
+               mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
 
        /*
         * Clear the interrupt by writing back the same value
@@ -455,8 +458,9 @@ megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs)
        /* Dummy readl to force pci flush */
        readl(&regs->outbound_doorbell_clear);
 
-       return 1;
+       return mfiStatus;
 }
+
 /**
  * megasas_fire_cmd_ppc -      Sends command to the FW
  * @frame_phys_addr :          Physical address of cmd
@@ -476,17 +480,6 @@ megasas_fire_cmd_ppc(struct megasas_instance *instance,
        spin_unlock_irqrestore(&instance->hba_lock, flags);
 }
 
-/**
- * megasas_adp_reset_ppc -     For controller reset
- * @regs:                              MFI register set
- */
-static int
-megasas_adp_reset_ppc(struct megasas_instance *instance,
-                       struct megasas_register_set __iomem *regs)
-{
-       return 0;
-}
-
 /**
  * megasas_check_reset_ppc -   For controller reset check
  * @regs:                              MFI register set
@@ -495,8 +488,12 @@ static int
 megasas_check_reset_ppc(struct megasas_instance *instance,
                        struct megasas_register_set __iomem *regs)
 {
+       if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL)
+               return 1;
+
        return 0;
 }
+
 static struct megasas_instance_template megasas_instance_template_ppc = {
 
        .fire_cmd = megasas_fire_cmd_ppc,
@@ -504,7 +501,7 @@ static struct megasas_instance_template megasas_instance_template_ppc = {
        .disable_intr = megasas_disable_intr_ppc,
        .clear_intr = megasas_clear_intr_ppc,
        .read_fw_status_reg = megasas_read_fw_status_reg_ppc,
-       .adp_reset = megasas_adp_reset_ppc,
+       .adp_reset = megasas_adp_reset_xscale,
        .check_reset = megasas_check_reset_ppc,
        .service_isr = megasas_isr,
        .tasklet = megasas_complete_cmd_dpc,
@@ -620,6 +617,9 @@ static int
 megasas_check_reset_skinny(struct megasas_instance *instance,
                                struct megasas_register_set __iomem *regs)
 {
+       if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL)
+               return 1;
+
        return 0;
 }