diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2018-05-26 21:01:28 +0200 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2018-05-26 21:01:28 +0200 |
commit | 0e125c3e6d2fafd6c2460e1859c29b9ece8b5eed (patch) | |
tree | 6e531c8c5317f0de19b71fcd7e38dc0235ebf57a /pci.c | |
parent | 911ab1a4ad24fb3c4f6df5c4798a8f2656c09af7 (diff) |
Fix synchronization
Diffstat (limited to 'pci.c')
-rw-r--r-- | pci.c | 19 |
1 files changed, 17 insertions, 2 deletions
@@ -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); |