From 0e125c3e6d2fafd6c2460e1859c29b9ece8b5eed Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sat, 26 May 2018 21:01:28 +0200 Subject: Fix synchronization --- pci.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'pci.c') 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); -- cgit v1.2.3