dmaengine: idxd: make misc interrupt one shot
[linux-block.git] / drivers / dma / idxd / irq.c
index aa314ebec58783699fd8cd651fb0d5f54b37e25d..0d639303b51505c542ece151fbbd0a3575d3ed0c 100644 (file)
@@ -217,13 +217,22 @@ static void idxd_int_handle_revoke(struct work_struct *work)
        kfree(revoke);
 }
 
-static int process_misc_interrupts(struct idxd_device *idxd, u32 cause)
+irqreturn_t idxd_misc_thread(int vec, void *data)
 {
+       struct idxd_irq_entry *irq_entry = data;
+       struct idxd_device *idxd = ie_to_idxd(irq_entry);
        struct device *dev = &idxd->pdev->dev;
        union gensts_reg gensts;
        u32 val = 0;
        int i;
        bool err = false;
+       u32 cause;
+
+       cause = ioread32(idxd->reg_base + IDXD_INTCAUSE_OFFSET);
+       if (!cause)
+               return IRQ_NONE;
+
+       iowrite32(cause, idxd->reg_base + IDXD_INTCAUSE_OFFSET);
 
        if (cause & IDXD_INTC_HALT_STATE)
                goto halt;
@@ -301,7 +310,7 @@ static int process_misc_interrupts(struct idxd_device *idxd, u32 cause)
                              val);
 
        if (!err)
-               return 0;
+               goto out;
 
 halt:
        gensts.bits = ioread32(idxd->reg_base + IDXD_GENSTATS_OFFSET);
@@ -324,33 +333,10 @@ halt:
                                "idxd halted, need %s.\n",
                                gensts.reset_type == IDXD_DEVICE_RESET_FLR ?
                                "FLR" : "system reset");
-                       return -ENXIO;
                }
        }
 
-       return 0;
-}
-
-irqreturn_t idxd_misc_thread(int vec, void *data)
-{
-       struct idxd_irq_entry *irq_entry = data;
-       struct idxd_device *idxd = ie_to_idxd(irq_entry);
-       int rc;
-       u32 cause;
-
-       cause = ioread32(idxd->reg_base + IDXD_INTCAUSE_OFFSET);
-       if (cause)
-               iowrite32(cause, idxd->reg_base + IDXD_INTCAUSE_OFFSET);
-
-       while (cause) {
-               rc = process_misc_interrupts(idxd, cause);
-               if (rc < 0)
-                       break;
-               cause = ioread32(idxd->reg_base + IDXD_INTCAUSE_OFFSET);
-               if (cause)
-                       iowrite32(cause, idxd->reg_base + IDXD_INTCAUSE_OFFSET);
-       }
-
+out:
        return IRQ_HANDLED;
 }