Commit 2f5ee72e authored by Corentin Labbe's avatar Corentin Labbe Committed by Herbert Xu

crypto: cavium/zip - register algorithm only if hardware is present

On my renesas salavator-X, I saw some cavium driver failing crypto
self-tests.
But salvator does not have such hardware.
This is due to cavium/zip driver registering algorithms even if hardware
is not present.
The solution is to move algorithm registration in the probe function.
This permits also to simplify module init/exit by using
module_pci_driver.
Signed-off-by: default avatarCorentin Labbe <clabbe@baylibre.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 53e748c2
...@@ -55,6 +55,11 @@ static const struct pci_device_id zip_id_table[] = { ...@@ -55,6 +55,11 @@ static const struct pci_device_id zip_id_table[] = {
{ 0, } { 0, }
}; };
static void zip_debugfs_init(void);
static void zip_debugfs_exit(void);
static int zip_register_compression_device(void);
static void zip_unregister_compression_device(void);
void zip_reg_write(u64 val, u64 __iomem *addr) void zip_reg_write(u64 val, u64 __iomem *addr)
{ {
writeq(val, addr); writeq(val, addr);
...@@ -235,6 +240,15 @@ static int zip_init_hw(struct zip_device *zip) ...@@ -235,6 +240,15 @@ static int zip_init_hw(struct zip_device *zip)
return 0; return 0;
} }
static void zip_reset(struct zip_device *zip)
{
union zip_cmd_ctl cmd_ctl;
cmd_ctl.u_reg64 = 0x0ull;
cmd_ctl.s.reset = 1; /* Forces ZIP cores to do reset */
zip_reg_write(cmd_ctl.u_reg64, (zip->reg_base + ZIP_CMD_CTL));
}
static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
...@@ -282,8 +296,21 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -282,8 +296,21 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err) if (err)
goto err_release_regions; goto err_release_regions;
/* Register with the Kernel Crypto Interface */
err = zip_register_compression_device();
if (err < 0) {
zip_err("ZIP: Kernel Crypto Registration failed\n");
goto err_register;
}
/* comp-decomp statistics are handled with debugfs interface */
zip_debugfs_init();
return 0; return 0;
err_register:
zip_reset(zip);
err_release_regions: err_release_regions:
if (zip->reg_base) if (zip->reg_base)
iounmap(zip->reg_base); iounmap(zip->reg_base);
...@@ -305,16 +332,17 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -305,16 +332,17 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
static void zip_remove(struct pci_dev *pdev) static void zip_remove(struct pci_dev *pdev)
{ {
struct zip_device *zip = pci_get_drvdata(pdev); struct zip_device *zip = pci_get_drvdata(pdev);
union zip_cmd_ctl cmd_ctl;
int q = 0; int q = 0;
if (!zip) if (!zip)
return; return;
zip_debugfs_exit();
zip_unregister_compression_device();
if (zip->reg_base) { if (zip->reg_base) {
cmd_ctl.u_reg64 = 0x0ull; zip_reset(zip);
cmd_ctl.s.reset = 1; /* Forces ZIP cores to do reset */
zip_reg_write(cmd_ctl.u_reg64, (zip->reg_base + ZIP_CMD_CTL));
iounmap(zip->reg_base); iounmap(zip->reg_base);
} }
...@@ -585,7 +613,7 @@ DEFINE_SHOW_ATTRIBUTE(zip_regs); ...@@ -585,7 +613,7 @@ DEFINE_SHOW_ATTRIBUTE(zip_regs);
/* Root directory for thunderx_zip debugfs entry */ /* Root directory for thunderx_zip debugfs entry */
static struct dentry *zip_debugfs_root; static struct dentry *zip_debugfs_root;
static void __init zip_debugfs_init(void) static void zip_debugfs_init(void)
{ {
if (!debugfs_initialized()) if (!debugfs_initialized())
return; return;
...@@ -604,7 +632,7 @@ static void __init zip_debugfs_init(void) ...@@ -604,7 +632,7 @@ static void __init zip_debugfs_init(void)
} }
static void __exit zip_debugfs_exit(void) static void zip_debugfs_exit(void)
{ {
debugfs_remove_recursive(zip_debugfs_root); debugfs_remove_recursive(zip_debugfs_root);
} }
...@@ -615,48 +643,7 @@ static void __exit zip_debugfs_exit(void) { } ...@@ -615,48 +643,7 @@ static void __exit zip_debugfs_exit(void) { }
#endif #endif
/* debugfs - end */ /* debugfs - end */
static int __init zip_init_module(void) module_pci_driver(zip_driver);
{
int ret;
zip_msg("%s\n", DRV_NAME);
ret = pci_register_driver(&zip_driver);
if (ret < 0) {
zip_err("ZIP: pci_register_driver() failed\n");
return ret;
}
/* Register with the Kernel Crypto Interface */
ret = zip_register_compression_device();
if (ret < 0) {
zip_err("ZIP: Kernel Crypto Registration failed\n");
goto err_pci_unregister;
}
/* comp-decomp statistics are handled with debugfs interface */
zip_debugfs_init();
return ret;
err_pci_unregister:
pci_unregister_driver(&zip_driver);
return ret;
}
static void __exit zip_cleanup_module(void)
{
zip_debugfs_exit();
/* Unregister from the kernel crypto interface */
zip_unregister_compression_device();
/* Unregister this driver for pci zip devices */
pci_unregister_driver(&zip_driver);
}
module_init(zip_init_module);
module_exit(zip_cleanup_module);
MODULE_AUTHOR("Cavium Inc"); MODULE_AUTHOR("Cavium Inc");
MODULE_DESCRIPTION("Cavium Inc ThunderX ZIP Driver"); MODULE_DESCRIPTION("Cavium Inc ThunderX ZIP Driver");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment