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: Corentin Labbe <clabbe@baylibre.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
committed by
Herbert Xu
parent
53e748c275
commit
2f5ee72ee9
@@ -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)
|
|||||||
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)
|
|||||||
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 @@ err_free_device:
|
|||||||
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);
|
|||||||
/* 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)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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) { }
|
|||||||
#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");
|
||||||
|
|||||||
Reference in New Issue
Block a user