Source
24
24
* software compressors. You probably do not want to use this software
25
25
* compression. If you have access to the PowerPC 842 compression hardware, you
26
26
* want to use the 842 hardware compression interface, which is at:
27
27
* drivers/crypto/nx/nx-842-crypto.c
28
28
*/
29
29
30
30
#include <linux/init.h>
31
31
#include <linux/module.h>
32
32
#include <linux/crypto.h>
33
33
#include <linux/sw842.h>
34
+
#include <crypto/internal/scompress.h>
34
35
35
36
struct crypto842_ctx {
36
-
char wmem[SW842_MEM_COMPRESS]; /* working memory for compress */
37
+
void *wmem; /* working memory for compress */
37
38
};
38
39
40
+
static void *crypto842_alloc_ctx(struct crypto_scomp *tfm)
41
+
{
42
+
void *ctx;
43
+
44
+
ctx = kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL);
45
+
if (!ctx)
46
+
return ERR_PTR(-ENOMEM);
47
+
48
+
return ctx;
49
+
}
50
+
51
+
static int crypto842_init(struct crypto_tfm *tfm)
52
+
{
53
+
struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm);
54
+
55
+
ctx->wmem = crypto842_alloc_ctx(NULL);
56
+
if (IS_ERR(ctx->wmem))
57
+
return -ENOMEM;
58
+
59
+
return 0;
60
+
}
61
+
62
+
static void crypto842_free_ctx(struct crypto_scomp *tfm, void *ctx)
63
+
{
64
+
kfree(ctx);
65
+
}
66
+
67
+
static void crypto842_exit(struct crypto_tfm *tfm)
68
+
{
69
+
struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm);
70
+
71
+
crypto842_free_ctx(NULL, ctx->wmem);
72
+
}
73
+
39
74
static int crypto842_compress(struct crypto_tfm *tfm,
40
75
const u8 *src, unsigned int slen,
41
76
u8 *dst, unsigned int *dlen)
42
77
{
43
78
struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm);
44
79
45
80
return sw842_compress(src, slen, dst, dlen, ctx->wmem);
46
81
}
47
82
83
+
static int crypto842_scompress(struct crypto_scomp *tfm,
84
+
const u8 *src, unsigned int slen,
85
+
u8 *dst, unsigned int *dlen, void *ctx)
86
+
{
87
+
return sw842_compress(src, slen, dst, dlen, ctx);
88
+
}
89
+
48
90
static int crypto842_decompress(struct crypto_tfm *tfm,
49
91
const u8 *src, unsigned int slen,
50
92
u8 *dst, unsigned int *dlen)
51
93
{
52
94
return sw842_decompress(src, slen, dst, dlen);
53
95
}
54
96
97
+
static int crypto842_sdecompress(struct crypto_scomp *tfm,
98
+
const u8 *src, unsigned int slen,
99
+
u8 *dst, unsigned int *dlen, void *ctx)
100
+
{
101
+
return sw842_decompress(src, slen, dst, dlen);
102
+
}
103
+
55
104
static struct crypto_alg alg = {
56
105
.cra_name = "842",
57
106
.cra_driver_name = "842-generic",
58
107
.cra_priority = 100,
59
108
.cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
60
109
.cra_ctxsize = sizeof(struct crypto842_ctx),
61
110
.cra_module = THIS_MODULE,
111
+
.cra_init = crypto842_init,
112
+
.cra_exit = crypto842_exit,
62
113
.cra_u = { .compress = {
63
114
.coa_compress = crypto842_compress,
64
115
.coa_decompress = crypto842_decompress } }
65
116
};
66
117
118
+
static struct scomp_alg scomp = {
119
+
.alloc_ctx = crypto842_alloc_ctx,
120
+
.free_ctx = crypto842_free_ctx,
121
+
.compress = crypto842_scompress,
122
+
.decompress = crypto842_sdecompress,
123
+
.base = {
124
+
.cra_name = "842",
125
+
.cra_driver_name = "842-scomp",
126
+
.cra_priority = 100,
127
+
.cra_module = THIS_MODULE,
128
+
}
129
+
};
130
+
67
131
static int __init crypto842_mod_init(void)
68
132
{
69
-
return crypto_register_alg(&alg);
133
+
int ret;
134
+
135
+
ret = crypto_register_alg(&alg);
136
+
if (ret)
137
+
return ret;
138
+
139
+
ret = crypto_register_scomp(&scomp);
140
+
if (ret) {
141
+
crypto_unregister_alg(&alg);
142
+
return ret;
143
+
}
144
+
145
+
return ret;
70
146
}
71
147
module_init(crypto842_mod_init);
72
148
73
149
static void __exit crypto842_mod_exit(void)
74
150
{
75
151
crypto_unregister_alg(&alg);
152
+
crypto_unregister_scomp(&scomp);
76
153
}
77
154
module_exit(crypto842_mod_exit);
78
155
79
156
MODULE_LICENSE("GPL");
80
157
MODULE_DESCRIPTION("842 Software Compression Algorithm");
81
158
MODULE_ALIAS_CRYPTO("842");
82
159
MODULE_ALIAS_CRYPTO("842-generic");
83
160
MODULE_AUTHOR("Dan Streetman <ddstreet@ieee.org>");