diff options
-rw-r--r-- | drivers/crypto/ccp/ccp-dev.c | 15 | ||||
-rw-r--r-- | drivers/crypto/ccp/ccp-pci.c | 3 | ||||
-rw-r--r-- | include/linux/ccp.h | 12 |
3 files changed, 29 insertions, 1 deletions
diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c index b2038a7e91e1..c3bc21264600 100644 --- a/drivers/crypto/ccp/ccp-dev.c +++ b/drivers/crypto/ccp/ccp-dev.c @@ -552,6 +552,7 @@ static const struct x86_cpu_id ccp_support[] = { static int __init ccp_mod_init(void) { struct cpuinfo_x86 *cpuinfo = &boot_cpu_data; + int ret; if (!x86_match_cpu(ccp_support)) return -ENODEV; @@ -560,7 +561,19 @@ static int __init ccp_mod_init(void) case 22: if ((cpuinfo->x86_model < 48) || (cpuinfo->x86_model > 63)) return -ENODEV; - return ccp_pci_init(); + + ret = ccp_pci_init(); + if (ret) + return ret; + + /* Don't leave the driver loaded if init failed */ + if (!ccp_get_device()) { + ccp_pci_exit(); + return -ENODEV; + } + + return 0; + break; } diff --git a/drivers/crypto/ccp/ccp-pci.c b/drivers/crypto/ccp/ccp-pci.c index f08c16d370cd..93319f9db753 100644 --- a/drivers/crypto/ccp/ccp-pci.c +++ b/drivers/crypto/ccp/ccp-pci.c @@ -267,6 +267,9 @@ static void ccp_pci_remove(struct pci_dev *pdev) struct device *dev = &pdev->dev; struct ccp_device *ccp = dev_get_drvdata(dev); + if (!ccp) + return; + ccp_destroy(ccp); pci_iounmap(pdev, ccp->io_map); diff --git a/include/linux/ccp.h b/include/linux/ccp.h index 12f1cfdbd3a3..b941ab9f762b 100644 --- a/include/linux/ccp.h +++ b/include/linux/ccp.h @@ -23,6 +23,9 @@ struct ccp_device; struct ccp_cmd; +#if defined(CONFIG_CRYPTO_DEV_CCP_DD) || \ + defined(CONFIG_CRYPTO_DEV_CCP_DD_MODULE) + /** * ccp_enqueue_cmd - queue an operation for processing by the CCP * @@ -48,6 +51,15 @@ struct ccp_cmd; */ int ccp_enqueue_cmd(struct ccp_cmd *cmd); +#else /* CONFIG_CRYPTO_DEV_CCP_DD is not enabled */ + +static inline int ccp_enqueue_cmd(struct ccp_cmd *cmd) +{ + return -ENODEV; +} + +#endif /* CONFIG_CRYPTO_DEV_CCP_DD */ + /***** AES engine *****/ /** |