[SCSI] megaraid_sas: function pointer for disable interrupt
authorSumant Patro <sumantp@lsil.com>
Tue, 3 Oct 2006 19:52:12 +0000 (12:52 -0700)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Wed, 4 Oct 2006 17:49:27 +0000 (12:49 -0500)
This patch adds function pointer to invoke disable interrupt for
xscale and ppc IOP based controllers. Removes old implementation that checks
for controller type in megasas_disable_intr.

Signed-off-by: Sumant Patro <Sumant.Patro@lsil.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/megaraid/megaraid_sas.c
drivers/scsi/megaraid/megaraid_sas.h

index e177fc5c5dd05879d40148c5274a8294f33b39d9..c3b50b3757993758f8f93f1c43ad33e7e42405aa 100644 (file)
@@ -134,6 +134,19 @@ megasas_enable_intr_xscale(struct megasas_register_set __iomem * regs)
        readl(&regs->outbound_intr_mask);
 }
 
+/**
+ * megasas_disable_intr_xscale -Disables interrupt
+ * @regs:                      MFI register set
+ */
+static inline void
+megasas_disable_intr_xscale(struct megasas_register_set __iomem * regs)
+{
+       u32 mask = 0x1f;
+       writel(mask, &regs->outbound_intr_mask);
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_intr_mask);
+}
+
 /**
  * megasas_read_fw_status_reg_xscale - returns the current FW status value
  * @regs:                      MFI register set
@@ -185,6 +198,7 @@ static struct megasas_instance_template megasas_instance_template_xscale = {
 
        .fire_cmd = megasas_fire_cmd_xscale,
        .enable_intr = megasas_enable_intr_xscale,
+       .disable_intr = megasas_disable_intr_xscale,
        .clear_intr = megasas_clear_intr_xscale,
        .read_fw_status_reg = megasas_read_fw_status_reg_xscale,
 };
@@ -214,6 +228,19 @@ megasas_enable_intr_ppc(struct megasas_register_set __iomem * regs)
        readl(&regs->outbound_intr_mask);
 }
 
+/**
+ * megasas_disable_intr_ppc -  Disable interrupt
+ * @regs:                      MFI register set
+ */
+static inline void
+megasas_disable_intr_ppc(struct megasas_register_set __iomem * regs)
+{
+       u32 mask = 0xFFFFFFFF;
+       writel(mask, &regs->outbound_intr_mask);
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_intr_mask);
+}
+
 /**
  * megasas_read_fw_status_reg_ppc - returns the current FW status value
  * @regs:                      MFI register set
@@ -265,6 +292,7 @@ static struct megasas_instance_template megasas_instance_template_ppc = {
        
        .fire_cmd = megasas_fire_cmd_ppc,
        .enable_intr = megasas_enable_intr_ppc,
+       .disable_intr = megasas_disable_intr_ppc,
        .clear_intr = megasas_clear_intr_ppc,
        .read_fw_status_reg = megasas_read_fw_status_reg_ppc,
 };
@@ -274,25 +302,6 @@ static struct megasas_instance_template megasas_instance_template_ppc = {
 *      specific to ppc (deviceid : 0x60) controllers
 */
 
-/**
- * megasas_disable_intr -      Disables interrupts
- * @regs:                      MFI register set
- */
-static inline void
-megasas_disable_intr(struct megasas_instance *instance)
-{
-       u32 mask = 0x1f; 
-       struct megasas_register_set __iomem *regs = instance->reg_set;
-
-       if(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078R)
-               mask = 0xffffffff;
-
-       writel(mask, &regs->outbound_intr_mask);
-
-       /* Dummy readl to force pci flush */
-       readl(&regs->outbound_intr_mask);
-}
-
 /**
  * megasas_issue_polled -      Issues a polling command
  * @instance:                  Adapter soft state
@@ -1293,7 +1302,7 @@ megasas_transition_to_ready(struct megasas_instance* instance)
                        /*
                         * Bring it to READY state; assuming max wait 10 secs
                         */
-                       megasas_disable_intr(instance);
+                       instance->instancet->disable_intr(instance->reg_set);
                        writel(MFI_RESET_FLAGS, &instance->reg_set->inbound_doorbell);
 
                        max_wait = 10;
@@ -1799,7 +1808,7 @@ static int megasas_init_mfi(struct megasas_instance *instance)
        /*
         * disable the intr before firing the init frame to FW
         */
-       megasas_disable_intr(instance);
+       instance->instancet->disable_intr(instance->reg_set);
 
        /*
         * Issue the init frame in polled mode
@@ -2279,7 +2288,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        megasas_mgmt_info.max_index--;
 
        pci_set_drvdata(pdev, NULL);
-       megasas_disable_intr(instance);
+       instance->instancet->disable_intr(instance->reg_set);
        free_irq(instance->pdev->irq, instance);
 
        megasas_release_mfi(instance);
@@ -2409,7 +2418,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
 
        pci_set_drvdata(instance->pdev, NULL);
 
-       megasas_disable_intr(instance);
+       instance->instancet->disable_intr(instance->reg_set);
 
        free_irq(instance->pdev->irq, instance);
 
index 930c06d0a4f7442b8eb8ecf2143ebfaf54086431..74feffe2fff3cd621d446808214a6dd22f70b478 100644 (file)
@@ -1049,6 +1049,7 @@ struct megasas_evt_detail {
        void (*fire_cmd)(dma_addr_t ,u32 ,struct megasas_register_set __iomem *);
 
        void (*enable_intr)(struct megasas_register_set __iomem *) ;
+       void (*disable_intr)(struct megasas_register_set __iomem *);
 
        int (*clear_intr)(struct megasas_register_set __iomem *);