|
@@ -24,6 +24,7 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/string.h>
|
|
|
#include <linux/uaccess.h>
|
|
|
+#include <linux/completion.h>
|
|
|
|
|
|
/*
|
|
|
* Autoloaded crypto modules should only use a prefixed name to avoid allowing
|
|
@@ -467,6 +468,45 @@ struct crypto_alg {
|
|
|
struct module *cra_module;
|
|
|
} CRYPTO_MINALIGN_ATTR;
|
|
|
|
|
|
+/*
|
|
|
+ * A helper struct for waiting for completion of async crypto ops
|
|
|
+ */
|
|
|
+struct crypto_wait {
|
|
|
+ struct completion completion;
|
|
|
+ int err;
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * Macro for declaring a crypto op async wait object on stack
|
|
|
+ */
|
|
|
+#define DECLARE_CRYPTO_WAIT(_wait) \
|
|
|
+ struct crypto_wait _wait = { \
|
|
|
+ COMPLETION_INITIALIZER_ONSTACK((_wait).completion), 0 }
|
|
|
+
|
|
|
+/*
|
|
|
+ * Async ops completion helper functioons
|
|
|
+ */
|
|
|
+void crypto_req_done(struct crypto_async_request *req, int err);
|
|
|
+
|
|
|
+static inline int crypto_wait_req(int err, struct crypto_wait *wait)
|
|
|
+{
|
|
|
+ switch (err) {
|
|
|
+ case -EINPROGRESS:
|
|
|
+ case -EBUSY:
|
|
|
+ wait_for_completion(&wait->completion);
|
|
|
+ reinit_completion(&wait->completion);
|
|
|
+ err = wait->err;
|
|
|
+ break;
|
|
|
+ };
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void crypto_init_wait(struct crypto_wait *wait)
|
|
|
+{
|
|
|
+ init_completion(&wait->completion);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Algorithm registration interface.
|
|
|
*/
|