m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'pci.c')
-rw-r--r--pci.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/pci.c b/pci.c
index 3c45d9b..69783d6 100644
--- a/pci.c
+++ b/pci.c
@@ -15,14 +15,25 @@ void handle_pong_sync(struct doom_data *doom_data)
up(&doom_data->pong_sem);
}
+void handle_pong_async(struct doom_data *doom_data)
+{
+ up(&doom_data->pong_async_sem);
+ disable_intr(doom_data->iomem, HARDDOOM_INTR_PONG_ASYNC);
+}
+
irqreturn_t doom_irq(int irq, void *dev)
{
uint32_t interrupts;
struct doom_data *doom_data;
+ void __iomem *iomem;
+
doom_data = dev;
+ iomem = doom_data->iomem;
- interrupts = get_interrupts(doom_data->iomem);
+ interrupts = ioread32(iomem + HARDDOOM_INTR) & ioread32(iomem + HARDDOOM_INTR_ENABLE);
+ iowrite32(interrupts, iomem + HARDDOOM_INTR);
+
if (!interrupts) {
return IRQ_NONE;
}
@@ -32,7 +43,9 @@ irqreturn_t doom_irq(int irq, void *dev)
interrupts &= ~HARDDOOM_INTR_PONG_SYNC;
}
- deactivate_intr(doom_data->iomem, HARDDOOM_INTR_MASK);
+ if (interrupts & HARDDOOM_INTR_PONG_ASYNC) {
+ handle_pong_async(doom_data);
+ }
return IRQ_HANDLED;
}
@@ -61,6 +74,8 @@ int init_pci(struct pci_dev *dev)
mutex_init(&doom_data->cmd_mutex);
mutex_init(&doom_data->ping_mutex);
sema_init(&doom_data->pong_sem, 0);
+ sema_init(&doom_data->pong_async_sem, 0);
+ doom_data->cmd_counter = 0;
ORFAIL(request_irq(dev->irq, doom_irq, IRQF_SHARED,
"doom", doom_data), error_irq);