oxnas: sata_oxnas: make irq handler more readable
[openwrt/staging/chunkeey.git] / target / linux / oxnas / files / drivers / ata / sata_oxnas.c
index 30bcb23b1e6a9d766d9eb0b635e0fe9fb13a9b2e..291a06f959821810d95eaa7530992ad30b3431b5 100644 (file)
@@ -2041,7 +2041,7 @@ int       sata_oxnas_init_controller(struct ata_host *host)
  *
  * @param port SATA port to check and if necessary, correct.
  */
-static int sata_oxnas_bug_6320_workaround(struct ata_port *ap)
+static int sata_oxnas_bug_6320_detect(struct ata_port *ap)
 {
        struct sata_oxnas_port_priv *pd = ap->private_data;
        void __iomem *core_base = pd->core_base;
@@ -2175,17 +2175,18 @@ static irqreturn_t sata_oxnas_interrupt(int irq, void *dev_instance)
                        /* check the raw end of command interrupt to see if the
                         * port is done */
                        mask = (COREINT_END << port_no);
-                       if (int_status & mask) {
-                               /* this port had an interrupt, clear it */
-                               iowrite32(mask, core_base + CORE_INT_CLEAR);
-                               bug_present =
-                                       (hd->current_ucode == UNKNOWN_MODE) ?
-                                       sata_oxnas_bug_6320_workaround(
-                                               ah->ports[port_no]):0;
-                               sata_oxnas_port_irq(ah->ports[port_no],
-                                                       bug_present);
-                               ret = IRQ_HANDLED;
-                       }
+                       if (!(int_status & mask))
+                               continue;
+
+                       /* this port had an interrupt, clear it */
+                       iowrite32(mask, core_base + CORE_INT_CLEAR);
+                       /* check for bug 6320 only if no microcode was loaded */
+                       bug_present = (hd->current_ucode == UNKNOWN_MODE) &&
+                               sata_oxnas_bug_6320_detect(ah->ports[port_no]);
+
+                       sata_oxnas_port_irq(ah->ports[port_no],
+                                               bug_present);
+                       ret = IRQ_HANDLED;
                }
        }