-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
crypto: nx - prevent nx 842 load if no hw driver
Change the nx-842 common driver to wait for loading of both platform drivers, and fail loading if the platform driver pointer is not set. Add an independent platform driver pointer, that the platform drivers set if they find they are able to load (i.e. if they find their platform devicetree node(s)). The problem is currently, the main nx-842 driver will stay loaded even if there is no platform driver and thus no possible way it can do any compression or decompression. This allows the crypto 842-nx driver to load even if it won't actually work. For crypto compression users (e.g. zswap) that expect an available crypto compression driver to actually work, this is bad. This patch fixes that, so the 842-nx crypto compression driver won't load if it doesn't have the driver and hardware available to perform the compression. Signed-off-by: Dan Streetman <ddstreet@ieee.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
- Loading branch information
Dan Streetman
authored and
Herbert Xu
committed
Jun 3, 2015
1 parent
f614e54
commit 3e648cb
Showing
6 changed files
with
148 additions
and
135 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
|
||
#include "nx-842.h" | ||
|
||
/* this is needed, separate from the main nx-842.c driver, because that main | ||
* driver loads the platform drivers during its init(), and it expects one | ||
* (or none) of the platform drivers to set this pointer to its driver. | ||
* That means this pointer can't be in the main nx-842 driver, because it | ||
* wouldn't be accessible until after the main driver loaded, which wouldn't | ||
* be possible as it's waiting for the platform driver to load. So place it | ||
* here. | ||
*/ | ||
static struct nx842_driver *driver; | ||
static DEFINE_SPINLOCK(driver_lock); | ||
|
||
struct nx842_driver *nx842_platform_driver(void) | ||
{ | ||
return driver; | ||
} | ||
EXPORT_SYMBOL_GPL(nx842_platform_driver); | ||
|
||
bool nx842_platform_driver_set(struct nx842_driver *_driver) | ||
{ | ||
bool ret = false; | ||
|
||
spin_lock(&driver_lock); | ||
|
||
if (!driver) { | ||
driver = _driver; | ||
ret = true; | ||
} else | ||
WARN(1, "can't set platform driver, already set to %s\n", | ||
driver->name); | ||
|
||
spin_unlock(&driver_lock); | ||
return ret; | ||
} | ||
EXPORT_SYMBOL_GPL(nx842_platform_driver_set); | ||
|
||
/* only call this from the platform driver exit function */ | ||
void nx842_platform_driver_unset(struct nx842_driver *_driver) | ||
{ | ||
spin_lock(&driver_lock); | ||
|
||
if (driver == _driver) | ||
driver = NULL; | ||
else if (driver) | ||
WARN(1, "can't unset platform driver %s, currently set to %s\n", | ||
_driver->name, driver->name); | ||
else | ||
WARN(1, "can't unset platform driver, already unset\n"); | ||
|
||
spin_unlock(&driver_lock); | ||
} | ||
EXPORT_SYMBOL_GPL(nx842_platform_driver_unset); | ||
|
||
bool nx842_platform_driver_get(void) | ||
{ | ||
bool ret = false; | ||
|
||
spin_lock(&driver_lock); | ||
|
||
if (driver) | ||
ret = try_module_get(driver->owner); | ||
|
||
spin_unlock(&driver_lock); | ||
|
||
return ret; | ||
} | ||
EXPORT_SYMBOL_GPL(nx842_platform_driver_get); | ||
|
||
void nx842_platform_driver_put(void) | ||
{ | ||
spin_lock(&driver_lock); | ||
|
||
if (driver) | ||
module_put(driver->owner); | ||
|
||
spin_unlock(&driver_lock); | ||
} | ||
EXPORT_SYMBOL_GPL(nx842_platform_driver_put); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Dan Streetman <ddstreet@ieee.org>"); | ||
MODULE_DESCRIPTION("842 H/W Compression platform driver"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.