aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/ccp/ccp-pci.c
diff options
context:
space:
mode:
authorGary R Hook <gary.hook@amd.com>2017-04-21 10:50:05 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2017-04-24 18:11:06 +0800
commit7b537b24e76a1e8e6d7ea91483a45d5b1426809b (patch)
treee5c8d1e19681b15efee9a99c084c96a10ed8db97 /drivers/crypto/ccp/ccp-pci.c
parentcrypto: crypto4xx - rename ce_ring_contol to ce_ring_control (diff)
downloadlinux-dev-7b537b24e76a1e8e6d7ea91483a45d5b1426809b.tar.xz
linux-dev-7b537b24e76a1e8e6d7ea91483a45d5b1426809b.zip
crypto: ccp - Change ISR handler method for a v3 CCP
The CCP has the ability to perform several operations simultaneously, but only one interrupt. When implemented as a PCI device and using MSI-X/MSI interrupts, use a tasklet model to service interrupts. By disabling and enabling interrupts from the CCP, coupled with the queuing that tasklets provide, we can ensure that all events (occurring on the device) are recognized and serviced. This change fixes a problem wherein 2 or more busy queues can cause notification bits to change state while a (CCP) interrupt is being serviced, but after the queue state has been evaluated. This results in the event being 'lost' and the queue hanging, waiting to be serviced. Since the status bits are never fully de-asserted, the CCP never generates another interrupt (all bits zero -> one or more bits one), and no further CCP operations will be executed. Cc: <stable@vger.kernel.org> # 4.9.x+ Signed-off-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to '')
-rw-r--r--drivers/crypto/ccp/ccp-pci.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/crypto/ccp/ccp-pci.c b/drivers/crypto/ccp/ccp-pci.c
index 28a9996c1085..e880d4cf4ada 100644
--- a/drivers/crypto/ccp/ccp-pci.c
+++ b/drivers/crypto/ccp/ccp-pci.c
@@ -69,6 +69,7 @@ static int ccp_get_msix_irqs(struct ccp_device *ccp)
goto e_irq;
}
}
+ ccp->use_tasklet = true;
return 0;
@@ -100,6 +101,7 @@ static int ccp_get_msi_irq(struct ccp_device *ccp)
dev_notice(dev, "unable to allocate MSI IRQ (%d)\n", ret);
goto e_msi;
}
+ ccp->use_tasklet = true;
return 0;