xref: /linux/drivers/crypto/hifn_795x.c (revision f7d0561ea1dadec5462846520b1f4fb304294fd5)
1 /*
2  * 2007+ Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19 
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/mod_devicetable.h>
23 #include <linux/interrupt.h>
24 #include <linux/pci.h>
25 #include <linux/slab.h>
26 #include <linux/delay.h>
27 #include <linux/mm.h>
28 #include <linux/highmem.h>
29 #include <linux/crypto.h>
30 
31 #include <crypto/algapi.h>
32 
33 #include <asm/kmap_types.h>
34 
35 #undef dprintk
36 
37 #define HIFN_TEST
38 //#define HIFN_DEBUG
39 
40 #ifdef HIFN_DEBUG
41 #define dprintk(f, a...) 	printk(f, ##a)
42 #else
43 #define dprintk(f, a...)	do {} while (0)
44 #endif
45 
46 static atomic_t hifn_dev_number;
47 
48 #define ACRYPTO_OP_DECRYPT	0
49 #define ACRYPTO_OP_ENCRYPT	1
50 #define ACRYPTO_OP_HMAC		2
51 #define ACRYPTO_OP_RNG		3
52 
53 #define ACRYPTO_MODE_ECB		0
54 #define ACRYPTO_MODE_CBC		1
55 #define ACRYPTO_MODE_CFB		2
56 #define ACRYPTO_MODE_OFB		3
57 
58 #define ACRYPTO_TYPE_AES_128	0
59 #define ACRYPTO_TYPE_AES_192	1
60 #define ACRYPTO_TYPE_AES_256	2
61 #define ACRYPTO_TYPE_3DES	3
62 #define ACRYPTO_TYPE_DES	4
63 
64 #define PCI_VENDOR_ID_HIFN		0x13A3
65 #define PCI_DEVICE_ID_HIFN_7955		0x0020
66 #define	PCI_DEVICE_ID_HIFN_7956		0x001d
67 
68 /* I/O region sizes */
69 
70 #define HIFN_BAR0_SIZE			0x1000
71 #define HIFN_BAR1_SIZE			0x2000
72 #define HIFN_BAR2_SIZE			0x8000
73 
74 /* DMA registres */
75 
76 #define HIFN_DMA_CRA 			0x0C	/* DMA Command Ring Address */
77 #define HIFN_DMA_SDRA 			0x1C	/* DMA Source Data Ring Address */
78 #define HIFN_DMA_RRA			0x2C	/* DMA Result Ring Address */
79 #define HIFN_DMA_DDRA			0x3C	/* DMA Destination Data Ring Address */
80 #define HIFN_DMA_STCTL			0x40	/* DMA Status and Control */
81 #define HIFN_DMA_INTREN 		0x44	/* DMA Interrupt Enable */
82 #define HIFN_DMA_CFG1			0x48	/* DMA Configuration #1 */
83 #define HIFN_DMA_CFG2			0x6C	/* DMA Configuration #2 */
84 #define HIFN_CHIP_ID			0x98	/* Chip ID */
85 
86 /*
87  * Processing Unit Registers (offset from BASEREG0)
88  */
89 #define	HIFN_0_PUDATA		0x00	/* Processing Unit Data */
90 #define	HIFN_0_PUCTRL		0x04	/* Processing Unit Control */
91 #define	HIFN_0_PUISR		0x08	/* Processing Unit Interrupt Status */
92 #define	HIFN_0_PUCNFG		0x0c	/* Processing Unit Configuration */
93 #define	HIFN_0_PUIER		0x10	/* Processing Unit Interrupt Enable */
94 #define	HIFN_0_PUSTAT		0x14	/* Processing Unit Status/Chip ID */
95 #define	HIFN_0_FIFOSTAT		0x18	/* FIFO Status */
96 #define	HIFN_0_FIFOCNFG		0x1c	/* FIFO Configuration */
97 #define	HIFN_0_SPACESIZE	0x20	/* Register space size */
98 
99 /* Processing Unit Control Register (HIFN_0_PUCTRL) */
100 #define	HIFN_PUCTRL_CLRSRCFIFO	0x0010	/* clear source fifo */
101 #define	HIFN_PUCTRL_STOP	0x0008	/* stop pu */
102 #define	HIFN_PUCTRL_LOCKRAM	0x0004	/* lock ram */
103 #define	HIFN_PUCTRL_DMAENA	0x0002	/* enable dma */
104 #define	HIFN_PUCTRL_RESET	0x0001	/* Reset processing unit */
105 
106 /* Processing Unit Interrupt Status Register (HIFN_0_PUISR) */
107 #define	HIFN_PUISR_CMDINVAL	0x8000	/* Invalid command interrupt */
108 #define	HIFN_PUISR_DATAERR	0x4000	/* Data error interrupt */
109 #define	HIFN_PUISR_SRCFIFO	0x2000	/* Source FIFO ready interrupt */
110 #define	HIFN_PUISR_DSTFIFO	0x1000	/* Destination FIFO ready interrupt */
111 #define	HIFN_PUISR_DSTOVER	0x0200	/* Destination overrun interrupt */
112 #define	HIFN_PUISR_SRCCMD	0x0080	/* Source command interrupt */
113 #define	HIFN_PUISR_SRCCTX	0x0040	/* Source context interrupt */
114 #define	HIFN_PUISR_SRCDATA	0x0020	/* Source data interrupt */
115 #define	HIFN_PUISR_DSTDATA	0x0010	/* Destination data interrupt */
116 #define	HIFN_PUISR_DSTRESULT	0x0004	/* Destination result interrupt */
117 
118 /* Processing Unit Configuration Register (HIFN_0_PUCNFG) */
119 #define	HIFN_PUCNFG_DRAMMASK	0xe000	/* DRAM size mask */
120 #define	HIFN_PUCNFG_DSZ_256K	0x0000	/* 256k dram */
121 #define	HIFN_PUCNFG_DSZ_512K	0x2000	/* 512k dram */
122 #define	HIFN_PUCNFG_DSZ_1M	0x4000	/* 1m dram */
123 #define	HIFN_PUCNFG_DSZ_2M	0x6000	/* 2m dram */
124 #define	HIFN_PUCNFG_DSZ_4M	0x8000	/* 4m dram */
125 #define	HIFN_PUCNFG_DSZ_8M	0xa000	/* 8m dram */
126 #define	HIFN_PUNCFG_DSZ_16M	0xc000	/* 16m dram */
127 #define	HIFN_PUCNFG_DSZ_32M	0xe000	/* 32m dram */
128 #define	HIFN_PUCNFG_DRAMREFRESH	0x1800	/* DRAM refresh rate mask */
129 #define	HIFN_PUCNFG_DRFR_512	0x0000	/* 512 divisor of ECLK */
130 #define	HIFN_PUCNFG_DRFR_256	0x0800	/* 256 divisor of ECLK */
131 #define	HIFN_PUCNFG_DRFR_128	0x1000	/* 128 divisor of ECLK */
132 #define	HIFN_PUCNFG_TCALLPHASES	0x0200	/* your guess is as good as mine... */
133 #define	HIFN_PUCNFG_TCDRVTOTEM	0x0100	/* your guess is as good as mine... */
134 #define	HIFN_PUCNFG_BIGENDIAN	0x0080	/* DMA big endian mode */
135 #define	HIFN_PUCNFG_BUS32	0x0040	/* Bus width 32bits */
136 #define	HIFN_PUCNFG_BUS16	0x0000	/* Bus width 16 bits */
137 #define	HIFN_PUCNFG_CHIPID	0x0020	/* Allow chipid from PUSTAT */
138 #define	HIFN_PUCNFG_DRAM	0x0010	/* Context RAM is DRAM */
139 #define	HIFN_PUCNFG_SRAM	0x0000	/* Context RAM is SRAM */
140 #define	HIFN_PUCNFG_COMPSING	0x0004	/* Enable single compression context */
141 #define	HIFN_PUCNFG_ENCCNFG	0x0002	/* Encryption configuration */
142 
143 /* Processing Unit Interrupt Enable Register (HIFN_0_PUIER) */
144 #define	HIFN_PUIER_CMDINVAL	0x8000	/* Invalid command interrupt */
145 #define	HIFN_PUIER_DATAERR	0x4000	/* Data error interrupt */
146 #define	HIFN_PUIER_SRCFIFO	0x2000	/* Source FIFO ready interrupt */
147 #define	HIFN_PUIER_DSTFIFO	0x1000	/* Destination FIFO ready interrupt */
148 #define	HIFN_PUIER_DSTOVER	0x0200	/* Destination overrun interrupt */
149 #define	HIFN_PUIER_SRCCMD	0x0080	/* Source command interrupt */
150 #define	HIFN_PUIER_SRCCTX	0x0040	/* Source context interrupt */
151 #define	HIFN_PUIER_SRCDATA	0x0020	/* Source data interrupt */
152 #define	HIFN_PUIER_DSTDATA	0x0010	/* Destination data interrupt */
153 #define	HIFN_PUIER_DSTRESULT	0x0004	/* Destination result interrupt */
154 
155 /* Processing Unit Status Register/Chip ID (HIFN_0_PUSTAT) */
156 #define	HIFN_PUSTAT_CMDINVAL	0x8000	/* Invalid command interrupt */
157 #define	HIFN_PUSTAT_DATAERR	0x4000	/* Data error interrupt */
158 #define	HIFN_PUSTAT_SRCFIFO	0x2000	/* Source FIFO ready interrupt */
159 #define	HIFN_PUSTAT_DSTFIFO	0x1000	/* Destination FIFO ready interrupt */
160 #define	HIFN_PUSTAT_DSTOVER	0x0200	/* Destination overrun interrupt */
161 #define	HIFN_PUSTAT_SRCCMD	0x0080	/* Source command interrupt */
162 #define	HIFN_PUSTAT_SRCCTX	0x0040	/* Source context interrupt */
163 #define	HIFN_PUSTAT_SRCDATA	0x0020	/* Source data interrupt */
164 #define	HIFN_PUSTAT_DSTDATA	0x0010	/* Destination data interrupt */
165 #define	HIFN_PUSTAT_DSTRESULT	0x0004	/* Destination result interrupt */
166 #define	HIFN_PUSTAT_CHIPREV	0x00ff	/* Chip revision mask */
167 #define	HIFN_PUSTAT_CHIPENA	0xff00	/* Chip enabled mask */
168 #define	HIFN_PUSTAT_ENA_2	0x1100	/* Level 2 enabled */
169 #define	HIFN_PUSTAT_ENA_1	0x1000	/* Level 1 enabled */
170 #define	HIFN_PUSTAT_ENA_0	0x3000	/* Level 0 enabled */
171 #define	HIFN_PUSTAT_REV_2	0x0020	/* 7751 PT6/2 */
172 #define	HIFN_PUSTAT_REV_3	0x0030	/* 7751 PT6/3 */
173 
174 /* FIFO Status Register (HIFN_0_FIFOSTAT) */
175 #define	HIFN_FIFOSTAT_SRC	0x7f00	/* Source FIFO available */
176 #define	HIFN_FIFOSTAT_DST	0x007f	/* Destination FIFO available */
177 
178 /* FIFO Configuration Register (HIFN_0_FIFOCNFG) */
179 #define	HIFN_FIFOCNFG_THRESHOLD	0x0400	/* must be written as 1 */
180 
181 /*
182  * DMA Interface Registers (offset from BASEREG1)
183  */
184 #define	HIFN_1_DMA_CRAR		0x0c	/* DMA Command Ring Address */
185 #define	HIFN_1_DMA_SRAR		0x1c	/* DMA Source Ring Address */
186 #define	HIFN_1_DMA_RRAR		0x2c	/* DMA Result Ring Address */
187 #define	HIFN_1_DMA_DRAR		0x3c	/* DMA Destination Ring Address */
188 #define	HIFN_1_DMA_CSR		0x40	/* DMA Status and Control */
189 #define	HIFN_1_DMA_IER		0x44	/* DMA Interrupt Enable */
190 #define	HIFN_1_DMA_CNFG		0x48	/* DMA Configuration */
191 #define	HIFN_1_PLL		0x4c	/* 795x: PLL config */
192 #define	HIFN_1_7811_RNGENA	0x60	/* 7811: rng enable */
193 #define	HIFN_1_7811_RNGCFG	0x64	/* 7811: rng config */
194 #define	HIFN_1_7811_RNGDAT	0x68	/* 7811: rng data */
195 #define	HIFN_1_7811_RNGSTS	0x6c	/* 7811: rng status */
196 #define	HIFN_1_7811_MIPSRST	0x94	/* 7811: MIPS reset */
197 #define	HIFN_1_REVID		0x98	/* Revision ID */
198 #define	HIFN_1_UNLOCK_SECRET1	0xf4
199 #define	HIFN_1_UNLOCK_SECRET2	0xfc
200 #define	HIFN_1_PUB_RESET	0x204	/* Public/RNG Reset */
201 #define	HIFN_1_PUB_BASE		0x300	/* Public Base Address */
202 #define	HIFN_1_PUB_OPLEN	0x304	/* Public Operand Length */
203 #define	HIFN_1_PUB_OP		0x308	/* Public Operand */
204 #define	HIFN_1_PUB_STATUS	0x30c	/* Public Status */
205 #define	HIFN_1_PUB_IEN		0x310	/* Public Interrupt enable */
206 #define	HIFN_1_RNG_CONFIG	0x314	/* RNG config */
207 #define	HIFN_1_RNG_DATA		0x318	/* RNG data */
208 #define	HIFN_1_PUB_MEM		0x400	/* start of Public key memory */
209 #define	HIFN_1_PUB_MEMEND	0xbff	/* end of Public key memory */
210 
211 /* DMA Status and Control Register (HIFN_1_DMA_CSR) */
212 #define	HIFN_DMACSR_D_CTRLMASK	0xc0000000	/* Destinition Ring Control */
213 #define	HIFN_DMACSR_D_CTRL_NOP	0x00000000	/* Dest. Control: no-op */
214 #define	HIFN_DMACSR_D_CTRL_DIS	0x40000000	/* Dest. Control: disable */
215 #define	HIFN_DMACSR_D_CTRL_ENA	0x80000000	/* Dest. Control: enable */
216 #define	HIFN_DMACSR_D_ABORT	0x20000000	/* Destinition Ring PCIAbort */
217 #define	HIFN_DMACSR_D_DONE	0x10000000	/* Destinition Ring Done */
218 #define	HIFN_DMACSR_D_LAST	0x08000000	/* Destinition Ring Last */
219 #define	HIFN_DMACSR_D_WAIT	0x04000000	/* Destinition Ring Waiting */
220 #define	HIFN_DMACSR_D_OVER	0x02000000	/* Destinition Ring Overflow */
221 #define	HIFN_DMACSR_R_CTRL	0x00c00000	/* Result Ring Control */
222 #define	HIFN_DMACSR_R_CTRL_NOP	0x00000000	/* Result Control: no-op */
223 #define	HIFN_DMACSR_R_CTRL_DIS	0x00400000	/* Result Control: disable */
224 #define	HIFN_DMACSR_R_CTRL_ENA	0x00800000	/* Result Control: enable */
225 #define	HIFN_DMACSR_R_ABORT	0x00200000	/* Result Ring PCI Abort */
226 #define	HIFN_DMACSR_R_DONE	0x00100000	/* Result Ring Done */
227 #define	HIFN_DMACSR_R_LAST	0x00080000	/* Result Ring Last */
228 #define	HIFN_DMACSR_R_WAIT	0x00040000	/* Result Ring Waiting */
229 #define	HIFN_DMACSR_R_OVER	0x00020000	/* Result Ring Overflow */
230 #define	HIFN_DMACSR_S_CTRL	0x0000c000	/* Source Ring Control */
231 #define	HIFN_DMACSR_S_CTRL_NOP	0x00000000	/* Source Control: no-op */
232 #define	HIFN_DMACSR_S_CTRL_DIS	0x00004000	/* Source Control: disable */
233 #define	HIFN_DMACSR_S_CTRL_ENA	0x00008000	/* Source Control: enable */
234 #define	HIFN_DMACSR_S_ABORT	0x00002000	/* Source Ring PCI Abort */
235 #define	HIFN_DMACSR_S_DONE	0x00001000	/* Source Ring Done */
236 #define	HIFN_DMACSR_S_LAST	0x00000800	/* Source Ring Last */
237 #define	HIFN_DMACSR_S_WAIT	0x00000400	/* Source Ring Waiting */
238 #define	HIFN_DMACSR_ILLW	0x00000200	/* Illegal write (7811 only) */
239 #define	HIFN_DMACSR_ILLR	0x00000100	/* Illegal read (7811 only) */
240 #define	HIFN_DMACSR_C_CTRL	0x000000c0	/* Command Ring Control */
241 #define	HIFN_DMACSR_C_CTRL_NOP	0x00000000	/* Command Control: no-op */
242 #define	HIFN_DMACSR_C_CTRL_DIS	0x00000040	/* Command Control: disable */
243 #define	HIFN_DMACSR_C_CTRL_ENA	0x00000080	/* Command Control: enable */
244 #define	HIFN_DMACSR_C_ABORT	0x00000020	/* Command Ring PCI Abort */
245 #define	HIFN_DMACSR_C_DONE	0x00000010	/* Command Ring Done */
246 #define	HIFN_DMACSR_C_LAST	0x00000008	/* Command Ring Last */
247 #define	HIFN_DMACSR_C_WAIT	0x00000004	/* Command Ring Waiting */
248 #define	HIFN_DMACSR_PUBDONE	0x00000002	/* Public op done (7951 only) */
249 #define	HIFN_DMACSR_ENGINE	0x00000001	/* Command Ring Engine IRQ */
250 
251 /* DMA Interrupt Enable Register (HIFN_1_DMA_IER) */
252 #define	HIFN_DMAIER_D_ABORT	0x20000000	/* Destination Ring PCIAbort */
253 #define	HIFN_DMAIER_D_DONE	0x10000000	/* Destination Ring Done */
254 #define	HIFN_DMAIER_D_LAST	0x08000000	/* Destination Ring Last */
255 #define	HIFN_DMAIER_D_WAIT	0x04000000	/* Destination Ring Waiting */
256 #define	HIFN_DMAIER_D_OVER	0x02000000	/* Destination Ring Overflow */
257 #define	HIFN_DMAIER_R_ABORT	0x00200000	/* Result Ring PCI Abort */
258 #define	HIFN_DMAIER_R_DONE	0x00100000	/* Result Ring Done */
259 #define	HIFN_DMAIER_R_LAST	0x00080000	/* Result Ring Last */
260 #define	HIFN_DMAIER_R_WAIT	0x00040000	/* Result Ring Waiting */
261 #define	HIFN_DMAIER_R_OVER	0x00020000	/* Result Ring Overflow */
262 #define	HIFN_DMAIER_S_ABORT	0x00002000	/* Source Ring PCI Abort */
263 #define	HIFN_DMAIER_S_DONE	0x00001000	/* Source Ring Done */
264 #define	HIFN_DMAIER_S_LAST	0x00000800	/* Source Ring Last */
265 #define	HIFN_DMAIER_S_WAIT	0x00000400	/* Source Ring Waiting */
266 #define	HIFN_DMAIER_ILLW	0x00000200	/* Illegal write (7811 only) */
267 #define	HIFN_DMAIER_ILLR	0x00000100	/* Illegal read (7811 only) */
268 #define	HIFN_DMAIER_C_ABORT	0x00000020	/* Command Ring PCI Abort */
269 #define	HIFN_DMAIER_C_DONE	0x00000010	/* Command Ring Done */
270 #define	HIFN_DMAIER_C_LAST	0x00000008	/* Command Ring Last */
271 #define	HIFN_DMAIER_C_WAIT	0x00000004	/* Command Ring Waiting */
272 #define	HIFN_DMAIER_PUBDONE	0x00000002	/* public op done (7951 only) */
273 #define	HIFN_DMAIER_ENGINE	0x00000001	/* Engine IRQ */
274 
275 /* DMA Configuration Register (HIFN_1_DMA_CNFG) */
276 #define	HIFN_DMACNFG_BIGENDIAN	0x10000000	/* big endian mode */
277 #define	HIFN_DMACNFG_POLLFREQ	0x00ff0000	/* Poll frequency mask */
278 #define	HIFN_DMACNFG_UNLOCK	0x00000800
279 #define	HIFN_DMACNFG_POLLINVAL	0x00000700	/* Invalid Poll Scalar */
280 #define	HIFN_DMACNFG_LAST	0x00000010	/* Host control LAST bit */
281 #define	HIFN_DMACNFG_MODE	0x00000004	/* DMA mode */
282 #define	HIFN_DMACNFG_DMARESET	0x00000002	/* DMA Reset # */
283 #define	HIFN_DMACNFG_MSTRESET	0x00000001	/* Master Reset # */
284 
285 #define	HIFN_PLL_7956		0x00001d18	/* 7956 PLL config value */
286 
287 /* Public key reset register (HIFN_1_PUB_RESET) */
288 #define	HIFN_PUBRST_RESET	0x00000001	/* reset public/rng unit */
289 
290 /* Public base address register (HIFN_1_PUB_BASE) */
291 #define	HIFN_PUBBASE_ADDR	0x00003fff	/* base address */
292 
293 /* Public operand length register (HIFN_1_PUB_OPLEN) */
294 #define	HIFN_PUBOPLEN_MOD_M	0x0000007f	/* modulus length mask */
295 #define	HIFN_PUBOPLEN_MOD_S	0		/* modulus length shift */
296 #define	HIFN_PUBOPLEN_EXP_M	0x0003ff80	/* exponent length mask */
297 #define	HIFN_PUBOPLEN_EXP_S	7		/* exponent lenght shift */
298 #define	HIFN_PUBOPLEN_RED_M	0x003c0000	/* reducend length mask */
299 #define	HIFN_PUBOPLEN_RED_S	18		/* reducend length shift */
300 
301 /* Public operation register (HIFN_1_PUB_OP) */
302 #define	HIFN_PUBOP_AOFFSET_M	0x0000007f	/* A offset mask */
303 #define	HIFN_PUBOP_AOFFSET_S	0		/* A offset shift */
304 #define	HIFN_PUBOP_BOFFSET_M	0x00000f80	/* B offset mask */
305 #define	HIFN_PUBOP_BOFFSET_S	7		/* B offset shift */
306 #define	HIFN_PUBOP_MOFFSET_M	0x0003f000	/* M offset mask */
307 #define	HIFN_PUBOP_MOFFSET_S	12		/* M offset shift */
308 #define	HIFN_PUBOP_OP_MASK	0x003c0000	/* Opcode: */
309 #define	HIFN_PUBOP_OP_NOP	0x00000000	/*  NOP */
310 #define	HIFN_PUBOP_OP_ADD	0x00040000	/*  ADD */
311 #define	HIFN_PUBOP_OP_ADDC	0x00080000	/*  ADD w/carry */
312 #define	HIFN_PUBOP_OP_SUB	0x000c0000	/*  SUB */
313 #define	HIFN_PUBOP_OP_SUBC	0x00100000	/*  SUB w/carry */
314 #define	HIFN_PUBOP_OP_MODADD	0x00140000	/*  Modular ADD */
315 #define	HIFN_PUBOP_OP_MODSUB	0x00180000	/*  Modular SUB */
316 #define	HIFN_PUBOP_OP_INCA	0x001c0000	/*  INC A */
317 #define	HIFN_PUBOP_OP_DECA	0x00200000	/*  DEC A */
318 #define	HIFN_PUBOP_OP_MULT	0x00240000	/*  MULT */
319 #define	HIFN_PUBOP_OP_MODMULT	0x00280000	/*  Modular MULT */
320 #define	HIFN_PUBOP_OP_MODRED	0x002c0000	/*  Modular RED */
321 #define	HIFN_PUBOP_OP_MODEXP	0x00300000	/*  Modular EXP */
322 
323 /* Public status register (HIFN_1_PUB_STATUS) */
324 #define	HIFN_PUBSTS_DONE	0x00000001	/* operation done */
325 #define	HIFN_PUBSTS_CARRY	0x00000002	/* carry */
326 
327 /* Public interrupt enable register (HIFN_1_PUB_IEN) */
328 #define	HIFN_PUBIEN_DONE	0x00000001	/* operation done interrupt */
329 
330 /* Random number generator config register (HIFN_1_RNG_CONFIG) */
331 #define	HIFN_RNGCFG_ENA		0x00000001	/* enable rng */
332 
333 #define HIFN_NAMESIZE			32
334 #define HIFN_MAX_RESULT_ORDER		5
335 
336 #define	HIFN_D_CMD_RSIZE		24*4
337 #define	HIFN_D_SRC_RSIZE		80*4
338 #define	HIFN_D_DST_RSIZE		80*4
339 #define	HIFN_D_RES_RSIZE		24*4
340 
341 #define HIFN_QUEUE_LENGTH		HIFN_D_CMD_RSIZE-5
342 
343 #define AES_MIN_KEY_SIZE		16
344 #define AES_MAX_KEY_SIZE		32
345 
346 #define HIFN_DES_KEY_LENGTH		8
347 #define HIFN_3DES_KEY_LENGTH		24
348 #define HIFN_MAX_CRYPT_KEY_LENGTH	AES_MAX_KEY_SIZE
349 #define HIFN_IV_LENGTH			8
350 #define HIFN_AES_IV_LENGTH		16
351 #define	HIFN_MAX_IV_LENGTH		HIFN_AES_IV_LENGTH
352 
353 #define HIFN_MAC_KEY_LENGTH		64
354 #define HIFN_MD5_LENGTH			16
355 #define HIFN_SHA1_LENGTH		20
356 #define HIFN_MAC_TRUNC_LENGTH		12
357 
358 #define	HIFN_MAX_COMMAND		(8 + 8 + 8 + 64 + 260)
359 #define	HIFN_MAX_RESULT			(8 + 4 + 4 + 20 + 4)
360 #define HIFN_USED_RESULT		12
361 
362 struct hifn_desc
363 {
364 	volatile u32		l;
365 	volatile u32		p;
366 };
367 
368 struct hifn_dma {
369 	struct hifn_desc	cmdr[HIFN_D_CMD_RSIZE+1];
370 	struct hifn_desc	srcr[HIFN_D_SRC_RSIZE+1];
371 	struct hifn_desc	dstr[HIFN_D_DST_RSIZE+1];
372 	struct hifn_desc	resr[HIFN_D_RES_RSIZE+1];
373 
374 	u8			command_bufs[HIFN_D_CMD_RSIZE][HIFN_MAX_COMMAND];
375 	u8			result_bufs[HIFN_D_CMD_RSIZE][HIFN_MAX_RESULT];
376 
377 	u64			test_src, test_dst;
378 
379 	/*
380 	 *  Our current positions for insertion and removal from the descriptor
381 	 *  rings.
382 	 */
383 	volatile int		cmdi, srci, dsti, resi;
384 	volatile int		cmdu, srcu, dstu, resu;
385 	int			cmdk, srck, dstk, resk;
386 };
387 
388 #define HIFN_FLAG_CMD_BUSY	(1<<0)
389 #define HIFN_FLAG_SRC_BUSY	(1<<1)
390 #define HIFN_FLAG_DST_BUSY	(1<<2)
391 #define HIFN_FLAG_RES_BUSY	(1<<3)
392 #define HIFN_FLAG_OLD_KEY	(1<<4)
393 
394 #define HIFN_DEFAULT_ACTIVE_NUM	5
395 
396 struct hifn_device
397 {
398 	char			name[HIFN_NAMESIZE];
399 
400 	int			irq;
401 
402 	struct pci_dev		*pdev;
403 	void __iomem		*bar[3];
404 
405 	unsigned long		result_mem;
406 	dma_addr_t		dst;
407 
408 	void			*desc_virt;
409 	dma_addr_t		desc_dma;
410 
411 	u32			dmareg;
412 
413 	void 			*sa[HIFN_D_RES_RSIZE];
414 
415 	spinlock_t		lock;
416 
417 	void 			*priv;
418 
419 	u32			flags;
420 	int			active, started;
421 	struct delayed_work	work;
422 	unsigned long		reset;
423 	unsigned long		success;
424 	unsigned long		prev_success;
425 
426 	u8			snum;
427 
428 	struct crypto_queue 	queue;
429 	struct list_head	alg_list;
430 };
431 
432 #define	HIFN_D_LENGTH			0x0000ffff
433 #define	HIFN_D_NOINVALID		0x01000000
434 #define	HIFN_D_MASKDONEIRQ		0x02000000
435 #define	HIFN_D_DESTOVER			0x04000000
436 #define	HIFN_D_OVER			0x08000000
437 #define	HIFN_D_LAST			0x20000000
438 #define	HIFN_D_JUMP			0x40000000
439 #define	HIFN_D_VALID			0x80000000
440 
441 struct hifn_base_command
442 {
443 	volatile u16		masks;
444 	volatile u16		session_num;
445 	volatile u16		total_source_count;
446 	volatile u16		total_dest_count;
447 };
448 
449 #define	HIFN_BASE_CMD_COMP		0x0100	/* enable compression engine */
450 #define	HIFN_BASE_CMD_PAD		0x0200	/* enable padding engine */
451 #define	HIFN_BASE_CMD_MAC		0x0400	/* enable MAC engine */
452 #define	HIFN_BASE_CMD_CRYPT		0x0800	/* enable crypt engine */
453 #define	HIFN_BASE_CMD_DECODE		0x2000
454 #define	HIFN_BASE_CMD_SRCLEN_M		0xc000
455 #define	HIFN_BASE_CMD_SRCLEN_S		14
456 #define	HIFN_BASE_CMD_DSTLEN_M		0x3000
457 #define	HIFN_BASE_CMD_DSTLEN_S		12
458 #define	HIFN_BASE_CMD_LENMASK_HI	0x30000
459 #define	HIFN_BASE_CMD_LENMASK_LO	0x0ffff
460 
461 /*
462  * Structure to help build up the command data structure.
463  */
464 struct hifn_crypt_command
465 {
466 	volatile u16 		masks;
467 	volatile u16 		header_skip;
468 	volatile u16 		source_count;
469 	volatile u16 		reserved;
470 };
471 
472 #define	HIFN_CRYPT_CMD_ALG_MASK		0x0003		/* algorithm: */
473 #define	HIFN_CRYPT_CMD_ALG_DES		0x0000		/*   DES */
474 #define	HIFN_CRYPT_CMD_ALG_3DES		0x0001		/*   3DES */
475 #define	HIFN_CRYPT_CMD_ALG_RC4		0x0002		/*   RC4 */
476 #define	HIFN_CRYPT_CMD_ALG_AES		0x0003		/*   AES */
477 #define	HIFN_CRYPT_CMD_MODE_MASK	0x0018		/* Encrypt mode: */
478 #define	HIFN_CRYPT_CMD_MODE_ECB		0x0000		/*   ECB */
479 #define	HIFN_CRYPT_CMD_MODE_CBC		0x0008		/*   CBC */
480 #define	HIFN_CRYPT_CMD_MODE_CFB		0x0010		/*   CFB */
481 #define	HIFN_CRYPT_CMD_MODE_OFB		0x0018		/*   OFB */
482 #define	HIFN_CRYPT_CMD_CLR_CTX		0x0040		/* clear context */
483 #define	HIFN_CRYPT_CMD_KSZ_MASK		0x0600		/* AES key size: */
484 #define	HIFN_CRYPT_CMD_KSZ_128		0x0000		/*  128 bit */
485 #define	HIFN_CRYPT_CMD_KSZ_192		0x0200		/*  192 bit */
486 #define	HIFN_CRYPT_CMD_KSZ_256		0x0400		/*  256 bit */
487 #define	HIFN_CRYPT_CMD_NEW_KEY		0x0800		/* expect new key */
488 #define	HIFN_CRYPT_CMD_NEW_IV		0x1000		/* expect new iv */
489 #define	HIFN_CRYPT_CMD_SRCLEN_M		0xc000
490 #define	HIFN_CRYPT_CMD_SRCLEN_S		14
491 
492 /*
493  * Structure to help build up the command data structure.
494  */
495 struct hifn_mac_command
496 {
497 	volatile u16 		masks;
498 	volatile u16 		header_skip;
499 	volatile u16 		source_count;
500 	volatile u16 		reserved;
501 };
502 
503 #define	HIFN_MAC_CMD_ALG_MASK		0x0001
504 #define	HIFN_MAC_CMD_ALG_SHA1		0x0000
505 #define	HIFN_MAC_CMD_ALG_MD5		0x0001
506 #define	HIFN_MAC_CMD_MODE_MASK		0x000c
507 #define	HIFN_MAC_CMD_MODE_HMAC		0x0000
508 #define	HIFN_MAC_CMD_MODE_SSL_MAC	0x0004
509 #define	HIFN_MAC_CMD_MODE_HASH		0x0008
510 #define	HIFN_MAC_CMD_MODE_FULL		0x0004
511 #define	HIFN_MAC_CMD_TRUNC		0x0010
512 #define	HIFN_MAC_CMD_RESULT		0x0020
513 #define	HIFN_MAC_CMD_APPEND		0x0040
514 #define	HIFN_MAC_CMD_SRCLEN_M		0xc000
515 #define	HIFN_MAC_CMD_SRCLEN_S		14
516 
517 /*
518  * MAC POS IPsec initiates authentication after encryption on encodes
519  * and before decryption on decodes.
520  */
521 #define	HIFN_MAC_CMD_POS_IPSEC		0x0200
522 #define	HIFN_MAC_CMD_NEW_KEY		0x0800
523 
524 struct hifn_comp_command
525 {
526 	volatile u16 		masks;
527 	volatile u16 		header_skip;
528 	volatile u16 		source_count;
529 	volatile u16 		reserved;
530 };
531 
532 #define	HIFN_COMP_CMD_SRCLEN_M		0xc000
533 #define	HIFN_COMP_CMD_SRCLEN_S		14
534 #define	HIFN_COMP_CMD_ONE		0x0100	/* must be one */
535 #define	HIFN_COMP_CMD_CLEARHIST		0x0010	/* clear history */
536 #define	HIFN_COMP_CMD_UPDATEHIST	0x0008	/* update history */
537 #define	HIFN_COMP_CMD_LZS_STRIP0	0x0004	/* LZS: strip zero */
538 #define	HIFN_COMP_CMD_MPPC_RESTART	0x0004	/* MPPC: restart */
539 #define	HIFN_COMP_CMD_ALG_MASK		0x0001	/* compression mode: */
540 #define	HIFN_COMP_CMD_ALG_MPPC		0x0001	/*   MPPC */
541 #define	HIFN_COMP_CMD_ALG_LZS		0x0000	/*   LZS */
542 
543 struct hifn_base_result
544 {
545 	volatile u16 		flags;
546 	volatile u16 		session;
547 	volatile u16 		src_cnt;		/* 15:0 of source count */
548 	volatile u16 		dst_cnt;		/* 15:0 of dest count */
549 };
550 
551 #define	HIFN_BASE_RES_DSTOVERRUN	0x0200	/* destination overrun */
552 #define	HIFN_BASE_RES_SRCLEN_M		0xc000	/* 17:16 of source count */
553 #define	HIFN_BASE_RES_SRCLEN_S		14
554 #define	HIFN_BASE_RES_DSTLEN_M		0x3000	/* 17:16 of dest count */
555 #define	HIFN_BASE_RES_DSTLEN_S		12
556 
557 struct hifn_comp_result
558 {
559 	volatile u16 		flags;
560 	volatile u16 		crc;
561 };
562 
563 #define	HIFN_COMP_RES_LCB_M		0xff00	/* longitudinal check byte */
564 #define	HIFN_COMP_RES_LCB_S		8
565 #define	HIFN_COMP_RES_RESTART		0x0004	/* MPPC: restart */
566 #define	HIFN_COMP_RES_ENDMARKER		0x0002	/* LZS: end marker seen */
567 #define	HIFN_COMP_RES_SRC_NOTZERO	0x0001	/* source expired */
568 
569 struct hifn_mac_result
570 {
571 	volatile u16 		flags;
572 	volatile u16 		reserved;
573 	/* followed by 0, 6, 8, or 10 u16's of the MAC, then crypt */
574 };
575 
576 #define	HIFN_MAC_RES_MISCOMPARE		0x0002	/* compare failed */
577 #define	HIFN_MAC_RES_SRC_NOTZERO	0x0001	/* source expired */
578 
579 struct hifn_crypt_result
580 {
581 	volatile u16 		flags;
582 	volatile u16 		reserved;
583 };
584 
585 #define	HIFN_CRYPT_RES_SRC_NOTZERO	0x0001	/* source expired */
586 
587 #ifndef HIFN_POLL_FREQUENCY
588 #define	HIFN_POLL_FREQUENCY	0x1
589 #endif
590 
591 #ifndef HIFN_POLL_SCALAR
592 #define	HIFN_POLL_SCALAR	0x0
593 #endif
594 
595 #define	HIFN_MAX_SEGLEN 	0xffff		/* maximum dma segment len */
596 #define	HIFN_MAX_DMALEN		0x3ffff		/* maximum dma length */
597 
598 struct hifn_crypto_alg
599 {
600 	struct list_head	entry;
601 	struct crypto_alg	alg;
602 	struct hifn_device	*dev;
603 };
604 
605 #define ASYNC_SCATTERLIST_CACHE	16
606 
607 #define ASYNC_FLAGS_MISALIGNED	(1<<0)
608 
609 struct ablkcipher_walk
610 {
611 	struct scatterlist	cache[ASYNC_SCATTERLIST_CACHE];
612 	u32			flags;
613 	int			num;
614 };
615 
616 struct hifn_context
617 {
618 	u8			key[HIFN_MAX_CRYPT_KEY_LENGTH], *iv;
619 	struct hifn_device	*dev;
620 	unsigned int		keysize, ivsize;
621 	u8			op, type, mode, unused;
622 	struct ablkcipher_walk	walk;
623 	atomic_t		sg_num;
624 };
625 
626 #define crypto_alg_to_hifn(alg)	container_of(alg, struct hifn_crypto_alg, alg)
627 
628 static inline u32 hifn_read_0(struct hifn_device *dev, u32 reg)
629 {
630 	u32 ret;
631 
632 	ret = readl((char *)(dev->bar[0]) + reg);
633 
634 	return ret;
635 }
636 
637 static inline u32 hifn_read_1(struct hifn_device *dev, u32 reg)
638 {
639 	u32 ret;
640 
641 	ret = readl((char *)(dev->bar[1]) + reg);
642 
643 	return ret;
644 }
645 
646 static inline void hifn_write_0(struct hifn_device *dev, u32 reg, u32 val)
647 {
648 	writel(val, (char *)(dev->bar[0]) + reg);
649 }
650 
651 static inline void hifn_write_1(struct hifn_device *dev, u32 reg, u32 val)
652 {
653 	writel(val, (char *)(dev->bar[1]) + reg);
654 }
655 
656 static void hifn_wait_puc(struct hifn_device *dev)
657 {
658 	int i;
659 	u32 ret;
660 
661 	for (i=10000; i > 0; --i) {
662 		ret = hifn_read_0(dev, HIFN_0_PUCTRL);
663 		if (!(ret & HIFN_PUCTRL_RESET))
664 			break;
665 
666 		udelay(1);
667 	}
668 
669 	if (!i)
670 		dprintk("%s: Failed to reset PUC unit.\n", dev->name);
671 }
672 
673 static void hifn_reset_puc(struct hifn_device *dev)
674 {
675 	hifn_write_0(dev, HIFN_0_PUCTRL, HIFN_PUCTRL_DMAENA);
676 	hifn_wait_puc(dev);
677 }
678 
679 static void hifn_stop_device(struct hifn_device *dev)
680 {
681 	hifn_write_1(dev, HIFN_1_DMA_CSR,
682 		HIFN_DMACSR_D_CTRL_DIS | HIFN_DMACSR_R_CTRL_DIS |
683 		HIFN_DMACSR_S_CTRL_DIS | HIFN_DMACSR_C_CTRL_DIS);
684 	hifn_write_0(dev, HIFN_0_PUIER, 0);
685 	hifn_write_1(dev, HIFN_1_DMA_IER, 0);
686 }
687 
688 static void hifn_reset_dma(struct hifn_device *dev, int full)
689 {
690 	hifn_stop_device(dev);
691 
692 	/*
693 	 * Setting poll frequency and others to 0.
694 	 */
695 	hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET |
696 			HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE);
697 	mdelay(1);
698 
699 	/*
700 	 * Reset DMA.
701 	 */
702 	if (full) {
703 		hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MODE);
704 		mdelay(1);
705 	} else {
706 		hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MODE |
707 				HIFN_DMACNFG_MSTRESET);
708 		hifn_reset_puc(dev);
709 	}
710 
711 	hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET |
712 			HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE);
713 
714 	hifn_reset_puc(dev);
715 }
716 
717 static u32 hifn_next_signature(u_int32_t a, u_int cnt)
718 {
719 	int i;
720 	u32 v;
721 
722 	for (i = 0; i < cnt; i++) {
723 
724 		/* get the parity */
725 		v = a & 0x80080125;
726 		v ^= v >> 16;
727 		v ^= v >> 8;
728 		v ^= v >> 4;
729 		v ^= v >> 2;
730 		v ^= v >> 1;
731 
732 		a = (v & 1) ^ (a << 1);
733 	}
734 
735 	return a;
736 }
737 
738 static struct pci2id {
739 	u_short		pci_vendor;
740 	u_short		pci_prod;
741 	char		card_id[13];
742 } pci2id[] = {
743 	{
744 		PCI_VENDOR_ID_HIFN,
745 		PCI_DEVICE_ID_HIFN_7955,
746 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
747 		  0x00, 0x00, 0x00, 0x00, 0x00 }
748 	},
749 	{
750 		PCI_VENDOR_ID_HIFN,
751 		PCI_DEVICE_ID_HIFN_7956,
752 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
753 		  0x00, 0x00, 0x00, 0x00, 0x00 }
754 	}
755 };
756 
757 static int hifn_init_pubrng(struct hifn_device *dev)
758 {
759 	int i;
760 
761 	hifn_write_1(dev, HIFN_1_PUB_RESET, hifn_read_1(dev, HIFN_1_PUB_RESET) |
762 			HIFN_PUBRST_RESET);
763 
764 	for (i=100; i > 0; --i) {
765 		mdelay(1);
766 
767 		if ((hifn_read_1(dev, HIFN_1_PUB_RESET) & HIFN_PUBRST_RESET) == 0)
768 			break;
769 	}
770 
771 	if (!i)
772 		dprintk("Chip %s: Failed to initialise public key engine.\n",
773 				dev->name);
774 	else {
775 		hifn_write_1(dev, HIFN_1_PUB_IEN, HIFN_PUBIEN_DONE);
776 		dev->dmareg |= HIFN_DMAIER_PUBDONE;
777 		hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg);
778 
779 		dprintk("Chip %s: Public key engine has been sucessfully "
780 				"initialised.\n", dev->name);
781 	}
782 
783 	/*
784 	 * Enable RNG engine.
785 	 */
786 
787 	hifn_write_1(dev, HIFN_1_RNG_CONFIG,
788 			hifn_read_1(dev, HIFN_1_RNG_CONFIG) | HIFN_RNGCFG_ENA);
789 	dprintk("Chip %s: RNG engine has been successfully initialised.\n",
790 			dev->name);
791 
792 	return 0;
793 }
794 
795 static int hifn_enable_crypto(struct hifn_device *dev)
796 {
797 	u32 dmacfg, addr;
798 	char *offtbl = NULL;
799 	int i;
800 
801 	for (i = 0; i < sizeof(pci2id)/sizeof(pci2id[0]); i++) {
802 		if (pci2id[i].pci_vendor == dev->pdev->vendor &&
803 				pci2id[i].pci_prod == dev->pdev->device) {
804 			offtbl = pci2id[i].card_id;
805 			break;
806 		}
807 	}
808 
809 	if (offtbl == NULL) {
810 		dprintk("Chip %s: Unknown card!\n", dev->name);
811 		return -ENODEV;
812 	}
813 
814 	dmacfg = hifn_read_1(dev, HIFN_1_DMA_CNFG);
815 
816 	hifn_write_1(dev, HIFN_1_DMA_CNFG,
817 			HIFN_DMACNFG_UNLOCK | HIFN_DMACNFG_MSTRESET |
818 			HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE);
819 	mdelay(1);
820 	addr = hifn_read_1(dev, HIFN_1_UNLOCK_SECRET1);
821 	mdelay(1);
822 	hifn_write_1(dev, HIFN_1_UNLOCK_SECRET2, 0);
823 	mdelay(1);
824 
825 	for (i=0; i<12; ++i) {
826 		addr = hifn_next_signature(addr, offtbl[i] + 0x101);
827 		hifn_write_1(dev, HIFN_1_UNLOCK_SECRET2, addr);
828 
829 		mdelay(1);
830 	}
831 	hifn_write_1(dev, HIFN_1_DMA_CNFG, dmacfg);
832 
833 	dprintk("Chip %s: %s.\n", dev->name, pci_name(dev->pdev));
834 
835 	return 0;
836 }
837 
838 static void hifn_init_dma(struct hifn_device *dev)
839 {
840 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
841 	u32 dptr = dev->desc_dma;
842 	int i;
843 
844 	for (i=0; i<HIFN_D_CMD_RSIZE; ++i)
845 		dma->cmdr[i].p = __cpu_to_le32(dptr +
846 				offsetof(struct hifn_dma, command_bufs[i][0]));
847 	for (i=0; i<HIFN_D_RES_RSIZE; ++i)
848 		dma->resr[i].p = __cpu_to_le32(dptr +
849 				offsetof(struct hifn_dma, result_bufs[i][0]));
850 
851 	/*
852 	 * Setup LAST descriptors.
853 	 */
854 	dma->cmdr[HIFN_D_CMD_RSIZE].p = __cpu_to_le32(dptr +
855 			offsetof(struct hifn_dma, cmdr[0]));
856 	dma->srcr[HIFN_D_SRC_RSIZE].p = __cpu_to_le32(dptr +
857 			offsetof(struct hifn_dma, srcr[0]));
858 	dma->dstr[HIFN_D_DST_RSIZE].p = __cpu_to_le32(dptr +
859 			offsetof(struct hifn_dma, dstr[0]));
860 	dma->resr[HIFN_D_RES_RSIZE].p = __cpu_to_le32(dptr +
861 			offsetof(struct hifn_dma, resr[0]));
862 
863 	dma->cmdu = dma->srcu = dma->dstu = dma->resu = 0;
864 	dma->cmdi = dma->srci = dma->dsti = dma->resi = 0;
865 	dma->cmdk = dma->srck = dma->dstk = dma->resk = 0;
866 }
867 
868 static void hifn_init_registers(struct hifn_device *dev)
869 {
870 	u32 dptr = dev->desc_dma;
871 
872 	/* Initialization magic... */
873 	hifn_write_0(dev, HIFN_0_PUCTRL, HIFN_PUCTRL_DMAENA);
874 	hifn_write_0(dev, HIFN_0_FIFOCNFG, HIFN_FIFOCNFG_THRESHOLD);
875 	hifn_write_0(dev, HIFN_0_PUIER, HIFN_PUIER_DSTOVER);
876 
877 	/* write all 4 ring address registers */
878 	hifn_write_1(dev, HIFN_1_DMA_CRAR, __cpu_to_le32(dptr +
879 				offsetof(struct hifn_dma, cmdr[0])));
880 	hifn_write_1(dev, HIFN_1_DMA_SRAR, __cpu_to_le32(dptr +
881 				offsetof(struct hifn_dma, srcr[0])));
882 	hifn_write_1(dev, HIFN_1_DMA_DRAR, __cpu_to_le32(dptr +
883 				offsetof(struct hifn_dma, dstr[0])));
884 	hifn_write_1(dev, HIFN_1_DMA_RRAR, __cpu_to_le32(dptr +
885 				offsetof(struct hifn_dma, resr[0])));
886 
887 	mdelay(2);
888 #if 0
889 	hifn_write_1(dev, HIFN_1_DMA_CSR,
890 	    HIFN_DMACSR_D_CTRL_DIS | HIFN_DMACSR_R_CTRL_DIS |
891 	    HIFN_DMACSR_S_CTRL_DIS | HIFN_DMACSR_C_CTRL_DIS |
892 	    HIFN_DMACSR_D_ABORT | HIFN_DMACSR_D_DONE | HIFN_DMACSR_D_LAST |
893 	    HIFN_DMACSR_D_WAIT | HIFN_DMACSR_D_OVER |
894 	    HIFN_DMACSR_R_ABORT | HIFN_DMACSR_R_DONE | HIFN_DMACSR_R_LAST |
895 	    HIFN_DMACSR_R_WAIT | HIFN_DMACSR_R_OVER |
896 	    HIFN_DMACSR_S_ABORT | HIFN_DMACSR_S_DONE | HIFN_DMACSR_S_LAST |
897 	    HIFN_DMACSR_S_WAIT |
898 	    HIFN_DMACSR_C_ABORT | HIFN_DMACSR_C_DONE | HIFN_DMACSR_C_LAST |
899 	    HIFN_DMACSR_C_WAIT |
900 	    HIFN_DMACSR_ENGINE |
901 	    HIFN_DMACSR_PUBDONE);
902 #else
903 	hifn_write_1(dev, HIFN_1_DMA_CSR,
904 	    HIFN_DMACSR_C_CTRL_ENA | HIFN_DMACSR_S_CTRL_ENA |
905 	    HIFN_DMACSR_D_CTRL_ENA | HIFN_DMACSR_R_CTRL_ENA |
906 	    HIFN_DMACSR_D_ABORT | HIFN_DMACSR_D_DONE | HIFN_DMACSR_D_LAST |
907 	    HIFN_DMACSR_D_WAIT | HIFN_DMACSR_D_OVER |
908 	    HIFN_DMACSR_R_ABORT | HIFN_DMACSR_R_DONE | HIFN_DMACSR_R_LAST |
909 	    HIFN_DMACSR_R_WAIT | HIFN_DMACSR_R_OVER |
910 	    HIFN_DMACSR_S_ABORT | HIFN_DMACSR_S_DONE | HIFN_DMACSR_S_LAST |
911 	    HIFN_DMACSR_S_WAIT |
912 	    HIFN_DMACSR_C_ABORT | HIFN_DMACSR_C_DONE | HIFN_DMACSR_C_LAST |
913 	    HIFN_DMACSR_C_WAIT |
914 	    HIFN_DMACSR_ENGINE |
915 	    HIFN_DMACSR_PUBDONE);
916 #endif
917 	hifn_read_1(dev, HIFN_1_DMA_CSR);
918 
919 	dev->dmareg |= HIFN_DMAIER_R_DONE | HIFN_DMAIER_C_ABORT |
920 	    HIFN_DMAIER_D_OVER | HIFN_DMAIER_R_OVER |
921 	    HIFN_DMAIER_S_ABORT | HIFN_DMAIER_D_ABORT | HIFN_DMAIER_R_ABORT |
922 	    HIFN_DMAIER_ENGINE;
923 	dev->dmareg &= ~HIFN_DMAIER_C_WAIT;
924 
925 	hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg);
926 	hifn_read_1(dev, HIFN_1_DMA_IER);
927 #if 0
928 	hifn_write_0(dev, HIFN_0_PUCNFG, HIFN_PUCNFG_ENCCNFG |
929 		    HIFN_PUCNFG_DRFR_128 | HIFN_PUCNFG_TCALLPHASES |
930 		    HIFN_PUCNFG_TCDRVTOTEM | HIFN_PUCNFG_BUS32 |
931 		    HIFN_PUCNFG_DRAM);
932 #else
933 	hifn_write_0(dev, HIFN_0_PUCNFG, 0x10342);
934 #endif
935 	hifn_write_1(dev, HIFN_1_PLL, HIFN_PLL_7956);
936 
937 	hifn_write_0(dev, HIFN_0_PUISR, HIFN_PUISR_DSTOVER);
938 	hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET |
939 	    HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE | HIFN_DMACNFG_LAST |
940 	    ((HIFN_POLL_FREQUENCY << 16 ) & HIFN_DMACNFG_POLLFREQ) |
941 	    ((HIFN_POLL_SCALAR << 8) & HIFN_DMACNFG_POLLINVAL));
942 }
943 
944 static int hifn_setup_base_command(struct hifn_device *dev, u8 *buf,
945 		unsigned dlen, unsigned slen, u16 mask, u8 snum)
946 {
947 	struct hifn_base_command *base_cmd;
948 	u8 *buf_pos = buf;
949 
950 	base_cmd = (struct hifn_base_command *)buf_pos;
951 	base_cmd->masks = __cpu_to_le16(mask);
952 	base_cmd->total_source_count =
953 		__cpu_to_le16(slen & HIFN_BASE_CMD_LENMASK_LO);
954 	base_cmd->total_dest_count =
955 		__cpu_to_le16(dlen & HIFN_BASE_CMD_LENMASK_LO);
956 
957 	dlen >>= 16;
958 	slen >>= 16;
959 	base_cmd->session_num = __cpu_to_le16(snum |
960 	    ((slen << HIFN_BASE_CMD_SRCLEN_S) & HIFN_BASE_CMD_SRCLEN_M) |
961 	    ((dlen << HIFN_BASE_CMD_DSTLEN_S) & HIFN_BASE_CMD_DSTLEN_M));
962 
963 	return sizeof(struct hifn_base_command);
964 }
965 
966 static int hifn_setup_crypto_command(struct hifn_device *dev,
967 		u8 *buf, unsigned dlen, unsigned slen,
968 		u8 *key, int keylen, u8 *iv, int ivsize, u16 mode)
969 {
970 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
971 	struct hifn_crypt_command *cry_cmd;
972 	u8 *buf_pos = buf;
973 	u16 cmd_len;
974 
975 	cry_cmd = (struct hifn_crypt_command *)buf_pos;
976 
977 	cry_cmd->source_count = __cpu_to_le16(dlen & 0xffff);
978 	dlen >>= 16;
979 	cry_cmd->masks = __cpu_to_le16(mode |
980 			((dlen << HIFN_CRYPT_CMD_SRCLEN_S) &
981 			 HIFN_CRYPT_CMD_SRCLEN_M));
982 	cry_cmd->header_skip = 0;
983 	cry_cmd->reserved = 0;
984 
985 	buf_pos += sizeof(struct hifn_crypt_command);
986 
987 	dma->cmdu++;
988 	if (dma->cmdu > 1) {
989 		dev->dmareg |= HIFN_DMAIER_C_WAIT;
990 		hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg);
991 	}
992 
993 	if (keylen) {
994 		memcpy(buf_pos, key, keylen);
995 		buf_pos += keylen;
996 	}
997 	if (ivsize) {
998 		memcpy(buf_pos, iv, ivsize);
999 		buf_pos += ivsize;
1000 	}
1001 
1002 	cmd_len = buf_pos - buf;
1003 
1004 	return cmd_len;
1005 }
1006 
1007 static int hifn_setup_src_desc(struct hifn_device *dev, struct page *page,
1008 		unsigned int offset, unsigned int size)
1009 {
1010 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1011 	int idx;
1012 	dma_addr_t addr;
1013 
1014 	addr = pci_map_page(dev->pdev, page, offset, size, PCI_DMA_TODEVICE);
1015 
1016 	idx = dma->srci;
1017 
1018 	dma->srcr[idx].p = __cpu_to_le32(addr);
1019 	dma->srcr[idx].l = __cpu_to_le32(size) | HIFN_D_VALID |
1020 			HIFN_D_MASKDONEIRQ | HIFN_D_NOINVALID | HIFN_D_LAST;
1021 
1022 	if (++idx == HIFN_D_SRC_RSIZE) {
1023 		dma->srcr[idx].l = __cpu_to_le32(HIFN_D_VALID |
1024 				HIFN_D_JUMP |
1025 				HIFN_D_MASKDONEIRQ | HIFN_D_LAST);
1026 		idx = 0;
1027 	}
1028 
1029 	dma->srci = idx;
1030 	dma->srcu++;
1031 
1032 	if (!(dev->flags & HIFN_FLAG_SRC_BUSY)) {
1033 		hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_S_CTRL_ENA);
1034 		dev->flags |= HIFN_FLAG_SRC_BUSY;
1035 	}
1036 
1037 	return size;
1038 }
1039 
1040 static void hifn_setup_res_desc(struct hifn_device *dev)
1041 {
1042 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1043 
1044 	dma->resr[dma->resi].l = __cpu_to_le32(HIFN_USED_RESULT |
1045 			HIFN_D_VALID | HIFN_D_LAST);
1046 	/*
1047 	 * dma->resr[dma->resi].l = __cpu_to_le32(HIFN_MAX_RESULT | HIFN_D_VALID |
1048 	 *					HIFN_D_LAST | HIFN_D_NOINVALID);
1049 	 */
1050 
1051 	if (++dma->resi == HIFN_D_RES_RSIZE) {
1052 		dma->resr[HIFN_D_RES_RSIZE].l = __cpu_to_le32(HIFN_D_VALID |
1053 				HIFN_D_JUMP | HIFN_D_MASKDONEIRQ | HIFN_D_LAST);
1054 		dma->resi = 0;
1055 	}
1056 
1057 	dma->resu++;
1058 
1059 	if (!(dev->flags & HIFN_FLAG_RES_BUSY)) {
1060 		hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_R_CTRL_ENA);
1061 		dev->flags |= HIFN_FLAG_RES_BUSY;
1062 	}
1063 }
1064 
1065 static void hifn_setup_dst_desc(struct hifn_device *dev, struct page *page,
1066 		unsigned offset, unsigned size)
1067 {
1068 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1069 	int idx;
1070 	dma_addr_t addr;
1071 
1072 	addr = pci_map_page(dev->pdev, page, offset, size, PCI_DMA_FROMDEVICE);
1073 
1074 	idx = dma->dsti;
1075 	dma->dstr[idx].p = __cpu_to_le32(addr);
1076 	dma->dstr[idx].l = __cpu_to_le32(size |	HIFN_D_VALID |
1077 			HIFN_D_MASKDONEIRQ | HIFN_D_NOINVALID | HIFN_D_LAST);
1078 
1079 	if (++idx == HIFN_D_DST_RSIZE) {
1080 		dma->dstr[idx].l = __cpu_to_le32(HIFN_D_VALID |
1081 				HIFN_D_JUMP | HIFN_D_MASKDONEIRQ |
1082 				HIFN_D_LAST | HIFN_D_NOINVALID);
1083 		idx = 0;
1084 	}
1085 	dma->dsti = idx;
1086 	dma->dstu++;
1087 
1088 	if (!(dev->flags & HIFN_FLAG_DST_BUSY)) {
1089 		hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_D_CTRL_ENA);
1090 		dev->flags |= HIFN_FLAG_DST_BUSY;
1091 	}
1092 }
1093 
1094 static int hifn_setup_dma(struct hifn_device *dev, struct page *spage, unsigned int soff,
1095 		struct page *dpage, unsigned int doff, unsigned int nbytes, void *priv,
1096 		struct hifn_context *ctx)
1097 {
1098 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1099 	int cmd_len, sa_idx;
1100 	u8 *buf, *buf_pos;
1101 	u16 mask;
1102 
1103 	dprintk("%s: spage: %p, soffset: %u, dpage: %p, doffset: %u, nbytes: %u, priv: %p, ctx: %p.\n",
1104 			dev->name, spage, soff, dpage, doff, nbytes, priv, ctx);
1105 
1106 	sa_idx = dma->resi;
1107 
1108 	hifn_setup_src_desc(dev, spage, soff, nbytes);
1109 
1110 	buf_pos = buf = dma->command_bufs[dma->cmdi];
1111 
1112 	mask = 0;
1113 	switch (ctx->op) {
1114 		case ACRYPTO_OP_DECRYPT:
1115 			mask = HIFN_BASE_CMD_CRYPT | HIFN_BASE_CMD_DECODE;
1116 			break;
1117 		case ACRYPTO_OP_ENCRYPT:
1118 			mask = HIFN_BASE_CMD_CRYPT;
1119 			break;
1120 		case ACRYPTO_OP_HMAC:
1121 			mask = HIFN_BASE_CMD_MAC;
1122 			break;
1123 		default:
1124 			goto err_out;
1125 	}
1126 
1127 	buf_pos += hifn_setup_base_command(dev, buf_pos, nbytes,
1128 			nbytes, mask, dev->snum);
1129 
1130 	if (ctx->op == ACRYPTO_OP_ENCRYPT || ctx->op == ACRYPTO_OP_DECRYPT) {
1131 		u16 md = 0;
1132 
1133 		if (ctx->keysize)
1134 			md |= HIFN_CRYPT_CMD_NEW_KEY;
1135 		if (ctx->iv && ctx->mode != ACRYPTO_MODE_ECB)
1136 			md |= HIFN_CRYPT_CMD_NEW_IV;
1137 
1138 		switch (ctx->mode) {
1139 			case ACRYPTO_MODE_ECB:
1140 				md |= HIFN_CRYPT_CMD_MODE_ECB;
1141 				break;
1142 			case ACRYPTO_MODE_CBC:
1143 				md |= HIFN_CRYPT_CMD_MODE_CBC;
1144 				break;
1145 			case ACRYPTO_MODE_CFB:
1146 				md |= HIFN_CRYPT_CMD_MODE_CFB;
1147 				break;
1148 			case ACRYPTO_MODE_OFB:
1149 				md |= HIFN_CRYPT_CMD_MODE_OFB;
1150 				break;
1151 			default:
1152 				goto err_out;
1153 		}
1154 
1155 		switch (ctx->type) {
1156 			case ACRYPTO_TYPE_AES_128:
1157 				if (ctx->keysize != 16)
1158 					goto err_out;
1159 				md |= HIFN_CRYPT_CMD_KSZ_128 |
1160 					HIFN_CRYPT_CMD_ALG_AES;
1161 				break;
1162 			case ACRYPTO_TYPE_AES_192:
1163 				if (ctx->keysize != 24)
1164 					goto err_out;
1165 				md |= HIFN_CRYPT_CMD_KSZ_192 |
1166 					HIFN_CRYPT_CMD_ALG_AES;
1167 				break;
1168 			case ACRYPTO_TYPE_AES_256:
1169 				if (ctx->keysize != 32)
1170 					goto err_out;
1171 				md |= HIFN_CRYPT_CMD_KSZ_256 |
1172 					HIFN_CRYPT_CMD_ALG_AES;
1173 				break;
1174 			case ACRYPTO_TYPE_3DES:
1175 				if (ctx->keysize != 24)
1176 					goto err_out;
1177 				md |= HIFN_CRYPT_CMD_ALG_3DES;
1178 				break;
1179 			case ACRYPTO_TYPE_DES:
1180 				if (ctx->keysize != 8)
1181 					goto err_out;
1182 				md |= HIFN_CRYPT_CMD_ALG_DES;
1183 				break;
1184 			default:
1185 				goto err_out;
1186 		}
1187 
1188 		buf_pos += hifn_setup_crypto_command(dev, buf_pos,
1189 				nbytes, nbytes, ctx->key, ctx->keysize,
1190 				ctx->iv, ctx->ivsize, md);
1191 	}
1192 
1193 	dev->sa[sa_idx] = priv;
1194 
1195 	cmd_len = buf_pos - buf;
1196 	dma->cmdr[dma->cmdi].l = __cpu_to_le32(cmd_len | HIFN_D_VALID |
1197 			HIFN_D_LAST | HIFN_D_MASKDONEIRQ);
1198 
1199 	if (++dma->cmdi == HIFN_D_CMD_RSIZE) {
1200 		dma->cmdr[dma->cmdi].l = __cpu_to_le32(HIFN_MAX_COMMAND |
1201 			HIFN_D_VALID | HIFN_D_LAST |
1202 			HIFN_D_MASKDONEIRQ | HIFN_D_JUMP);
1203 		dma->cmdi = 0;
1204 	} else
1205 		dma->cmdr[dma->cmdi-1].l |= __cpu_to_le32(HIFN_D_VALID);
1206 
1207 	if (!(dev->flags & HIFN_FLAG_CMD_BUSY)) {
1208 		hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_C_CTRL_ENA);
1209 		dev->flags |= HIFN_FLAG_CMD_BUSY;
1210 	}
1211 
1212 	hifn_setup_dst_desc(dev, dpage, doff, nbytes);
1213 	hifn_setup_res_desc(dev);
1214 
1215 	return 0;
1216 
1217 err_out:
1218 	return -EINVAL;
1219 }
1220 
1221 static int ablkcipher_walk_init(struct ablkcipher_walk *w,
1222 		int num, gfp_t gfp_flags)
1223 {
1224 	int i;
1225 
1226 	num = min(ASYNC_SCATTERLIST_CACHE, num);
1227 	sg_init_table(w->cache, num);
1228 
1229 	w->num = 0;
1230 	for (i=0; i<num; ++i) {
1231 		struct page *page = alloc_page(gfp_flags);
1232 		struct scatterlist *s;
1233 
1234 		if (!page)
1235 			break;
1236 
1237 		s = &w->cache[i];
1238 
1239 		sg_set_page(s, page, PAGE_SIZE, 0);
1240 		w->num++;
1241 	}
1242 
1243 	return i;
1244 }
1245 
1246 static void ablkcipher_walk_exit(struct ablkcipher_walk *w)
1247 {
1248 	int i;
1249 
1250 	for (i=0; i<w->num; ++i) {
1251 		struct scatterlist *s = &w->cache[i];
1252 
1253 		__free_page(sg_page(s));
1254 
1255 		s->length = 0;
1256 	}
1257 
1258 	w->num = 0;
1259 }
1260 
1261 static int ablkcipher_add(void *daddr, unsigned int *drestp, struct scatterlist *src,
1262 		unsigned int size, unsigned int *nbytesp)
1263 {
1264 	unsigned int copy, drest = *drestp, nbytes = *nbytesp;
1265 	int idx = 0;
1266 	void *saddr;
1267 
1268 	if (drest < size || size > nbytes)
1269 		return -EINVAL;
1270 
1271 	while (size) {
1272 		copy = min(drest, src->length);
1273 
1274 		saddr = kmap_atomic(sg_page(src), KM_SOFTIRQ1);
1275 		memcpy(daddr, saddr + src->offset, copy);
1276 		kunmap_atomic(saddr, KM_SOFTIRQ1);
1277 
1278 		size -= copy;
1279 		drest -= copy;
1280 		nbytes -= copy;
1281 		daddr += copy;
1282 
1283 		dprintk("%s: copy: %u, size: %u, drest: %u, nbytes: %u.\n",
1284 				__func__, copy, size, drest, nbytes);
1285 
1286 		src++;
1287 		idx++;
1288 	}
1289 
1290 	*nbytesp = nbytes;
1291 	*drestp = drest;
1292 
1293 	return idx;
1294 }
1295 
1296 static int ablkcipher_walk(struct ablkcipher_request *req,
1297 		struct ablkcipher_walk *w)
1298 {
1299 	unsigned blocksize =
1300 		crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(req));
1301 	unsigned alignmask =
1302 		crypto_ablkcipher_alignmask(crypto_ablkcipher_reqtfm(req));
1303 	struct scatterlist *src, *dst, *t;
1304 	void *daddr;
1305 	unsigned int nbytes = req->nbytes, offset, copy, diff;
1306 	int idx, tidx, err;
1307 
1308 	tidx = idx = 0;
1309 	offset = 0;
1310 	while (nbytes) {
1311 		if (idx >= w->num && (w->flags & ASYNC_FLAGS_MISALIGNED))
1312 			return -EINVAL;
1313 
1314 		src = &req->src[idx];
1315 		dst = &req->dst[idx];
1316 
1317 		dprintk("\n%s: slen: %u, dlen: %u, soff: %u, doff: %u, offset: %u, "
1318 				"blocksize: %u, nbytes: %u.\n",
1319 				__func__, src->length, dst->length, src->offset,
1320 				dst->offset, offset, blocksize, nbytes);
1321 
1322 		if (src->length & (blocksize - 1) ||
1323 				src->offset & (alignmask - 1) ||
1324 				dst->length & (blocksize - 1) ||
1325 				dst->offset & (alignmask - 1) ||
1326 				offset) {
1327 			unsigned slen = src->length - offset;
1328 			unsigned dlen = PAGE_SIZE;
1329 
1330 			t = &w->cache[idx];
1331 
1332 			daddr = kmap_atomic(sg_page(t), KM_SOFTIRQ0);
1333 			err = ablkcipher_add(daddr, &dlen, src, slen, &nbytes);
1334 			if (err < 0)
1335 				goto err_out_unmap;
1336 
1337 			idx += err;
1338 
1339 			copy = slen & ~(blocksize - 1);
1340 			diff = slen & (blocksize - 1);
1341 
1342 			if (dlen < nbytes) {
1343 				/*
1344 				 * Destination page does not have enough space
1345 				 * to put there additional blocksized chunk,
1346 				 * so we mark that page as containing only
1347 				 * blocksize aligned chunks:
1348 				 * 	t->length = (slen & ~(blocksize - 1));
1349 				 * and increase number of bytes to be processed
1350 				 * in next chunk:
1351 				 * 	nbytes += diff;
1352 				 */
1353 				nbytes += diff;
1354 
1355 				/*
1356 				 * Temporary of course...
1357 				 * Kick author if you will catch this one.
1358 				 */
1359 				printk(KERN_ERR "%s: dlen: %u, nbytes: %u,"
1360 					"slen: %u, offset: %u.\n",
1361 					__func__, dlen, nbytes, slen, offset);
1362 				printk(KERN_ERR "%s: please contact author to fix this "
1363 					"issue, generally you should not catch "
1364 					"this path under any condition but who "
1365 					"knows how did you use crypto code.\n"
1366 					"Thank you.\n",	__func__);
1367 				BUG();
1368 			} else {
1369 				copy += diff + nbytes;
1370 
1371 				src = &req->src[idx];
1372 
1373 				err = ablkcipher_add(daddr + slen, &dlen, src, nbytes, &nbytes);
1374 				if (err < 0)
1375 					goto err_out_unmap;
1376 
1377 				idx += err;
1378 			}
1379 
1380 			t->length = copy;
1381 			t->offset = offset;
1382 
1383 			kunmap_atomic(daddr, KM_SOFTIRQ0);
1384 		} else {
1385 			nbytes -= src->length;
1386 			idx++;
1387 		}
1388 
1389 		tidx++;
1390 	}
1391 
1392 	return tidx;
1393 
1394 err_out_unmap:
1395 	kunmap_atomic(daddr, KM_SOFTIRQ0);
1396 	return err;
1397 }
1398 
1399 static int hifn_setup_session(struct ablkcipher_request *req)
1400 {
1401 	struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm);
1402 	struct hifn_device *dev = ctx->dev;
1403 	struct page *spage, *dpage;
1404 	unsigned long soff, doff, flags;
1405 	unsigned int nbytes = req->nbytes, idx = 0, len;
1406 	int err = -EINVAL, sg_num;
1407 	struct scatterlist *src, *dst, *t;
1408 	unsigned blocksize =
1409 		crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(req));
1410 	unsigned alignmask =
1411 		crypto_ablkcipher_alignmask(crypto_ablkcipher_reqtfm(req));
1412 
1413 	if (ctx->iv && !ctx->ivsize && ctx->mode != ACRYPTO_MODE_ECB)
1414 		goto err_out_exit;
1415 
1416 	ctx->walk.flags = 0;
1417 
1418 	while (nbytes) {
1419 		src = &req->src[idx];
1420 		dst = &req->dst[idx];
1421 
1422 		if (src->length & (blocksize - 1) ||
1423 				src->offset & (alignmask - 1) ||
1424 				dst->length & (blocksize - 1) ||
1425 				dst->offset & (alignmask - 1)) {
1426 			ctx->walk.flags |= ASYNC_FLAGS_MISALIGNED;
1427 		}
1428 
1429 		nbytes -= src->length;
1430 		idx++;
1431 	}
1432 
1433 	if (ctx->walk.flags & ASYNC_FLAGS_MISALIGNED) {
1434 		err = ablkcipher_walk_init(&ctx->walk, idx, GFP_ATOMIC);
1435 		if (err < 0)
1436 			return err;
1437 	}
1438 
1439 	nbytes = req->nbytes;
1440 	idx = 0;
1441 
1442 	sg_num = ablkcipher_walk(req, &ctx->walk);
1443 
1444 	atomic_set(&ctx->sg_num, sg_num);
1445 
1446 	spin_lock_irqsave(&dev->lock, flags);
1447 	if (dev->started + sg_num > HIFN_QUEUE_LENGTH) {
1448 		err = -EAGAIN;
1449 		goto err_out;
1450 	}
1451 
1452 	dev->snum++;
1453 	dev->started += sg_num;
1454 
1455 	while (nbytes) {
1456 		src = &req->src[idx];
1457 		dst = &req->dst[idx];
1458 		t = &ctx->walk.cache[idx];
1459 
1460 		if (t->length) {
1461 			spage = dpage = sg_page(t);
1462 			soff = doff = 0;
1463 			len = t->length;
1464 		} else {
1465 			spage = sg_page(src);
1466 			soff = src->offset;
1467 
1468 			dpage = sg_page(dst);
1469 			doff = dst->offset;
1470 
1471 			len = dst->length;
1472 		}
1473 
1474 		idx++;
1475 
1476 		err = hifn_setup_dma(dev, spage, soff, dpage, doff, nbytes,
1477 				req, ctx);
1478 		if (err)
1479 			goto err_out;
1480 
1481 		nbytes -= len;
1482 	}
1483 
1484 	dev->active = HIFN_DEFAULT_ACTIVE_NUM;
1485 	spin_unlock_irqrestore(&dev->lock, flags);
1486 
1487 	return 0;
1488 
1489 err_out:
1490 	spin_unlock_irqrestore(&dev->lock, flags);
1491 err_out_exit:
1492 	if (err && printk_ratelimit())
1493 		dprintk("%s: iv: %p [%d], key: %p [%d], mode: %u, op: %u, "
1494 				"type: %u, err: %d.\n",
1495 			dev->name, ctx->iv, ctx->ivsize,
1496 			ctx->key, ctx->keysize,
1497 			ctx->mode, ctx->op, ctx->type, err);
1498 
1499 	return err;
1500 }
1501 
1502 static int hifn_test(struct hifn_device *dev, int encdec, u8 snum)
1503 {
1504 	int n, err;
1505 	u8 src[16];
1506 	struct hifn_context ctx;
1507 	u8 fips_aes_ecb_from_zero[16] = {
1508 		0x66, 0xE9, 0x4B, 0xD4,
1509 		0xEF, 0x8A, 0x2C, 0x3B,
1510 		0x88, 0x4C, 0xFA, 0x59,
1511 		0xCA, 0x34, 0x2B, 0x2E};
1512 
1513 	memset(src, 0, sizeof(src));
1514 	memset(ctx.key, 0, sizeof(ctx.key));
1515 
1516 	ctx.dev = dev;
1517 	ctx.keysize = 16;
1518 	ctx.ivsize = 0;
1519 	ctx.iv = NULL;
1520 	ctx.op = (encdec)?ACRYPTO_OP_ENCRYPT:ACRYPTO_OP_DECRYPT;
1521 	ctx.mode = ACRYPTO_MODE_ECB;
1522 	ctx.type = ACRYPTO_TYPE_AES_128;
1523 	atomic_set(&ctx.sg_num, 1);
1524 
1525 	err = hifn_setup_dma(dev,
1526 			virt_to_page(src), offset_in_page(src),
1527 			virt_to_page(src), offset_in_page(src),
1528 			sizeof(src), NULL, &ctx);
1529 	if (err)
1530 		goto err_out;
1531 
1532 	msleep(200);
1533 
1534 	dprintk("%s: decoded: ", dev->name);
1535 	for (n=0; n<sizeof(src); ++n)
1536 		dprintk("%02x ", src[n]);
1537 	dprintk("\n");
1538 	dprintk("%s: FIPS   : ", dev->name);
1539 	for (n=0; n<sizeof(fips_aes_ecb_from_zero); ++n)
1540 		dprintk("%02x ", fips_aes_ecb_from_zero[n]);
1541 	dprintk("\n");
1542 
1543 	if (!memcmp(src, fips_aes_ecb_from_zero, sizeof(fips_aes_ecb_from_zero))) {
1544 		printk(KERN_INFO "%s: AES 128 ECB test has been successfully "
1545 				"passed.\n", dev->name);
1546 		return 0;
1547 	}
1548 
1549 err_out:
1550 	printk(KERN_INFO "%s: AES 128 ECB test has been failed.\n", dev->name);
1551 	return -1;
1552 }
1553 
1554 static int hifn_start_device(struct hifn_device *dev)
1555 {
1556 	int err;
1557 
1558 	hifn_reset_dma(dev, 1);
1559 
1560 	err = hifn_enable_crypto(dev);
1561 	if (err)
1562 		return err;
1563 
1564 	hifn_reset_puc(dev);
1565 
1566 	hifn_init_dma(dev);
1567 
1568 	hifn_init_registers(dev);
1569 
1570 	hifn_init_pubrng(dev);
1571 
1572 	return 0;
1573 }
1574 
1575 static int ablkcipher_get(void *saddr, unsigned int *srestp, unsigned int offset,
1576 		struct scatterlist *dst, unsigned int size, unsigned int *nbytesp)
1577 {
1578 	unsigned int srest = *srestp, nbytes = *nbytesp, copy;
1579 	void *daddr;
1580 	int idx = 0;
1581 
1582 	if (srest < size || size > nbytes)
1583 		return -EINVAL;
1584 
1585 	while (size) {
1586 
1587 		copy = min(dst->length, srest);
1588 
1589 		daddr = kmap_atomic(sg_page(dst), KM_IRQ0);
1590 		memcpy(daddr + dst->offset + offset, saddr, copy);
1591 		kunmap_atomic(daddr, KM_IRQ0);
1592 
1593 		nbytes -= copy;
1594 		size -= copy;
1595 		srest -= copy;
1596 		saddr += copy;
1597 		offset = 0;
1598 
1599 		dprintk("%s: copy: %u, size: %u, srest: %u, nbytes: %u.\n",
1600 				__func__, copy, size, srest, nbytes);
1601 
1602 		dst++;
1603 		idx++;
1604 	}
1605 
1606 	*nbytesp = nbytes;
1607 	*srestp = srest;
1608 
1609 	return idx;
1610 }
1611 
1612 static void hifn_process_ready(struct ablkcipher_request *req, int error)
1613 {
1614 	struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm);
1615 	struct hifn_device *dev;
1616 
1617 	dprintk("%s: req: %p, ctx: %p.\n", __func__, req, ctx);
1618 
1619 	dev = ctx->dev;
1620 	dprintk("%s: req: %p, started: %d, sg_num: %d.\n",
1621 		__func__, req, dev->started, atomic_read(&ctx->sg_num));
1622 
1623 	if (--dev->started < 0)
1624 		BUG();
1625 
1626 	if (atomic_dec_and_test(&ctx->sg_num)) {
1627 		unsigned int nbytes = req->nbytes;
1628 		int idx = 0, err;
1629 		struct scatterlist *dst, *t;
1630 		void *saddr;
1631 
1632 		if (ctx->walk.flags & ASYNC_FLAGS_MISALIGNED) {
1633 			while (nbytes) {
1634 				t = &ctx->walk.cache[idx];
1635 				dst = &req->dst[idx];
1636 
1637 				dprintk("\n%s: sg_page(t): %p, t->length: %u, "
1638 					"sg_page(dst): %p, dst->length: %u, "
1639 					"nbytes: %u.\n",
1640 					__func__, sg_page(t), t->length,
1641 					sg_page(dst), dst->length, nbytes);
1642 
1643 				if (!t->length) {
1644 					nbytes -= dst->length;
1645 					idx++;
1646 					continue;
1647 				}
1648 
1649 				saddr = kmap_atomic(sg_page(t), KM_IRQ1);
1650 
1651 				err = ablkcipher_get(saddr, &t->length, t->offset,
1652 						dst, nbytes, &nbytes);
1653 				if (err < 0) {
1654 					kunmap_atomic(saddr, KM_IRQ1);
1655 					break;
1656 				}
1657 
1658 				idx += err;
1659 				kunmap_atomic(saddr, KM_IRQ1);
1660 			}
1661 
1662 			ablkcipher_walk_exit(&ctx->walk);
1663 		}
1664 
1665 		req->base.complete(&req->base, error);
1666 	}
1667 }
1668 
1669 static void hifn_check_for_completion(struct hifn_device *dev, int error)
1670 {
1671 	int i;
1672 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1673 
1674 	for (i=0; i<HIFN_D_RES_RSIZE; ++i) {
1675 		struct hifn_desc *d = &dma->resr[i];
1676 
1677 		if (!(d->l & __cpu_to_le32(HIFN_D_VALID)) && dev->sa[i]) {
1678 			dev->success++;
1679 			dev->reset = 0;
1680 			hifn_process_ready(dev->sa[i], error);
1681 			dev->sa[i] = NULL;
1682 		}
1683 
1684 		if (d->l & __cpu_to_le32(HIFN_D_DESTOVER | HIFN_D_OVER))
1685 			if (printk_ratelimit())
1686 				printk("%s: overflow detected [d: %u, o: %u] "
1687 						"at %d resr: l: %08x, p: %08x.\n",
1688 					dev->name,
1689 					!!(d->l & __cpu_to_le32(HIFN_D_DESTOVER)),
1690 					!!(d->l & __cpu_to_le32(HIFN_D_OVER)),
1691 					i, d->l, d->p);
1692 	}
1693 }
1694 
1695 static void hifn_clear_rings(struct hifn_device *dev)
1696 {
1697 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1698 	int i, u;
1699 
1700 	dprintk("%s: ring cleanup 1: i: %d.%d.%d.%d, u: %d.%d.%d.%d, "
1701 			"k: %d.%d.%d.%d.\n",
1702 			dev->name,
1703 			dma->cmdi, dma->srci, dma->dsti, dma->resi,
1704 			dma->cmdu, dma->srcu, dma->dstu, dma->resu,
1705 			dma->cmdk, dma->srck, dma->dstk, dma->resk);
1706 
1707 	i = dma->resk; u = dma->resu;
1708 	while (u != 0) {
1709 		if (dma->resr[i].l & __cpu_to_le32(HIFN_D_VALID))
1710 			break;
1711 
1712 		if (i != HIFN_D_RES_RSIZE)
1713 			u--;
1714 
1715 		if (++i == (HIFN_D_RES_RSIZE + 1))
1716 			i = 0;
1717 	}
1718 	dma->resk = i; dma->resu = u;
1719 
1720 	i = dma->srck; u = dma->srcu;
1721 	while (u != 0) {
1722 		if (i == HIFN_D_SRC_RSIZE)
1723 			i = 0;
1724 		if (dma->srcr[i].l & __cpu_to_le32(HIFN_D_VALID))
1725 			break;
1726 		i++, u--;
1727 	}
1728 	dma->srck = i; dma->srcu = u;
1729 
1730 	i = dma->cmdk; u = dma->cmdu;
1731 	while (u != 0) {
1732 		if (dma->cmdr[i].l & __cpu_to_le32(HIFN_D_VALID))
1733 			break;
1734 		if (i != HIFN_D_CMD_RSIZE)
1735 			u--;
1736 		if (++i == (HIFN_D_CMD_RSIZE + 1))
1737 			i = 0;
1738 	}
1739 	dma->cmdk = i; dma->cmdu = u;
1740 
1741 	i = dma->dstk; u = dma->dstu;
1742 	while (u != 0) {
1743 		if (i == HIFN_D_DST_RSIZE)
1744 			i = 0;
1745 		if (dma->dstr[i].l & __cpu_to_le32(HIFN_D_VALID))
1746 			break;
1747 		i++, u--;
1748 	}
1749 	dma->dstk = i; dma->dstu = u;
1750 
1751 	dprintk("%s: ring cleanup 2: i: %d.%d.%d.%d, u: %d.%d.%d.%d, "
1752 			"k: %d.%d.%d.%d.\n",
1753 			dev->name,
1754 			dma->cmdi, dma->srci, dma->dsti, dma->resi,
1755 			dma->cmdu, dma->srcu, dma->dstu, dma->resu,
1756 			dma->cmdk, dma->srck, dma->dstk, dma->resk);
1757 }
1758 
1759 static void hifn_work(struct work_struct *work)
1760 {
1761 	struct delayed_work *dw = container_of(work, struct delayed_work, work);
1762 	struct hifn_device *dev = container_of(dw, struct hifn_device, work);
1763 	unsigned long flags;
1764 	int reset = 0;
1765 	u32 r = 0;
1766 
1767 	spin_lock_irqsave(&dev->lock, flags);
1768 	if (dev->active == 0) {
1769 		struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1770 
1771 		if (dma->cmdu == 0 && (dev->flags & HIFN_FLAG_CMD_BUSY)) {
1772 			dev->flags &= ~HIFN_FLAG_CMD_BUSY;
1773 			r |= HIFN_DMACSR_C_CTRL_DIS;
1774 		}
1775 		if (dma->srcu == 0 && (dev->flags & HIFN_FLAG_SRC_BUSY)) {
1776 			dev->flags &= ~HIFN_FLAG_SRC_BUSY;
1777 			r |= HIFN_DMACSR_S_CTRL_DIS;
1778 		}
1779 		if (dma->dstu == 0 && (dev->flags & HIFN_FLAG_DST_BUSY)) {
1780 			dev->flags &= ~HIFN_FLAG_DST_BUSY;
1781 			r |= HIFN_DMACSR_D_CTRL_DIS;
1782 		}
1783 		if (dma->resu == 0 && (dev->flags & HIFN_FLAG_RES_BUSY)) {
1784 			dev->flags &= ~HIFN_FLAG_RES_BUSY;
1785 			r |= HIFN_DMACSR_R_CTRL_DIS;
1786 		}
1787 		if (r)
1788 			hifn_write_1(dev, HIFN_1_DMA_CSR, r);
1789 	} else
1790 		dev->active--;
1791 
1792 	if (dev->prev_success == dev->success && dev->started)
1793 		reset = 1;
1794 	dev->prev_success = dev->success;
1795 	spin_unlock_irqrestore(&dev->lock, flags);
1796 
1797 	if (reset) {
1798 		dprintk("%s: r: %08x, active: %d, started: %d, "
1799 				"success: %lu: reset: %d.\n",
1800 			dev->name, r, dev->active, dev->started,
1801 			dev->success, reset);
1802 
1803 		if (++dev->reset >= 5) {
1804 			dprintk("%s: really hard reset.\n", dev->name);
1805 			hifn_reset_dma(dev, 1);
1806 			hifn_stop_device(dev);
1807 			hifn_start_device(dev);
1808 			dev->reset = 0;
1809 		}
1810 
1811 		spin_lock_irqsave(&dev->lock, flags);
1812 		hifn_check_for_completion(dev, -EBUSY);
1813 		hifn_clear_rings(dev);
1814 		dev->started = 0;
1815 		spin_unlock_irqrestore(&dev->lock, flags);
1816 	}
1817 
1818 	schedule_delayed_work(&dev->work, HZ);
1819 }
1820 
1821 static irqreturn_t hifn_interrupt(int irq, void *data)
1822 {
1823 	struct hifn_device *dev = (struct hifn_device *)data;
1824 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1825 	u32 dmacsr, restart;
1826 
1827 	dmacsr = hifn_read_1(dev, HIFN_1_DMA_CSR);
1828 
1829 	dprintk("%s: 1 dmacsr: %08x, dmareg: %08x, res: %08x [%d], "
1830 			"i: %d.%d.%d.%d, u: %d.%d.%d.%d.\n",
1831 		dev->name, dmacsr, dev->dmareg, dmacsr & dev->dmareg, dma->cmdi,
1832 		dma->cmdu, dma->srcu, dma->dstu, dma->resu,
1833 		dma->cmdi, dma->srci, dma->dsti, dma->resi);
1834 
1835 	if ((dmacsr & dev->dmareg) == 0)
1836 		return IRQ_NONE;
1837 
1838 	hifn_write_1(dev, HIFN_1_DMA_CSR, dmacsr & dev->dmareg);
1839 
1840 	if (dmacsr & HIFN_DMACSR_ENGINE)
1841 		hifn_write_0(dev, HIFN_0_PUISR, hifn_read_0(dev, HIFN_0_PUISR));
1842 	if (dmacsr & HIFN_DMACSR_PUBDONE)
1843 		hifn_write_1(dev, HIFN_1_PUB_STATUS,
1844 			hifn_read_1(dev, HIFN_1_PUB_STATUS) | HIFN_PUBSTS_DONE);
1845 
1846 	restart = dmacsr & (HIFN_DMACSR_R_OVER | HIFN_DMACSR_D_OVER);
1847 	if (restart) {
1848 		u32 puisr = hifn_read_0(dev, HIFN_0_PUISR);
1849 
1850 		if (printk_ratelimit())
1851 			printk("%s: overflow: r: %d, d: %d, puisr: %08x, d: %u.\n",
1852 				dev->name, !!(dmacsr & HIFN_DMACSR_R_OVER),
1853 				!!(dmacsr & HIFN_DMACSR_D_OVER),
1854 				puisr, !!(puisr & HIFN_PUISR_DSTOVER));
1855 		if (!!(puisr & HIFN_PUISR_DSTOVER))
1856 			hifn_write_0(dev, HIFN_0_PUISR, HIFN_PUISR_DSTOVER);
1857 		hifn_write_1(dev, HIFN_1_DMA_CSR, dmacsr & (HIFN_DMACSR_R_OVER |
1858 					HIFN_DMACSR_D_OVER));
1859 	}
1860 
1861 	restart = dmacsr & (HIFN_DMACSR_C_ABORT | HIFN_DMACSR_S_ABORT |
1862 			HIFN_DMACSR_D_ABORT | HIFN_DMACSR_R_ABORT);
1863 	if (restart) {
1864 		if (printk_ratelimit())
1865 			printk("%s: abort: c: %d, s: %d, d: %d, r: %d.\n",
1866 				dev->name, !!(dmacsr & HIFN_DMACSR_C_ABORT),
1867 				!!(dmacsr & HIFN_DMACSR_S_ABORT),
1868 				!!(dmacsr & HIFN_DMACSR_D_ABORT),
1869 				!!(dmacsr & HIFN_DMACSR_R_ABORT));
1870 		hifn_reset_dma(dev, 1);
1871 		hifn_init_dma(dev);
1872 		hifn_init_registers(dev);
1873 	}
1874 
1875 	if ((dmacsr & HIFN_DMACSR_C_WAIT) && (dma->cmdu == 0)) {
1876 		dprintk("%s: wait on command.\n", dev->name);
1877 		dev->dmareg &= ~(HIFN_DMAIER_C_WAIT);
1878 		hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg);
1879 	}
1880 
1881 	hifn_check_for_completion(dev, 0);
1882 	hifn_clear_rings(dev);
1883 
1884 	return IRQ_HANDLED;
1885 }
1886 
1887 static void hifn_flush(struct hifn_device *dev)
1888 {
1889 	unsigned long flags;
1890 	struct crypto_async_request *async_req;
1891 	struct hifn_context *ctx;
1892 	struct ablkcipher_request *req;
1893 	struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
1894 	int i;
1895 
1896 	spin_lock_irqsave(&dev->lock, flags);
1897 	for (i=0; i<HIFN_D_RES_RSIZE; ++i) {
1898 		struct hifn_desc *d = &dma->resr[i];
1899 
1900 		if (dev->sa[i]) {
1901 			hifn_process_ready(dev->sa[i],
1902 				(d->l & __cpu_to_le32(HIFN_D_VALID))?-ENODEV:0);
1903 		}
1904 	}
1905 
1906 	while ((async_req = crypto_dequeue_request(&dev->queue))) {
1907 		ctx = crypto_tfm_ctx(async_req->tfm);
1908 		req = container_of(async_req, struct ablkcipher_request, base);
1909 
1910 		hifn_process_ready(req, -ENODEV);
1911 	}
1912 	spin_unlock_irqrestore(&dev->lock, flags);
1913 }
1914 
1915 static int hifn_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
1916 		unsigned int len)
1917 {
1918 	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
1919 	struct hifn_context *ctx = crypto_tfm_ctx(tfm);
1920 	struct hifn_device *dev = ctx->dev;
1921 
1922 	if (len > HIFN_MAX_CRYPT_KEY_LENGTH) {
1923 		crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
1924 		return -1;
1925 	}
1926 
1927 	dev->flags &= ~HIFN_FLAG_OLD_KEY;
1928 
1929 	memcpy(ctx->key, key, len);
1930 	ctx->keysize = len;
1931 
1932 	return 0;
1933 }
1934 
1935 static int hifn_handle_req(struct ablkcipher_request *req)
1936 {
1937 	struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm);
1938 	struct hifn_device *dev = ctx->dev;
1939 	int err = -EAGAIN;
1940 
1941 	if (dev->started + DIV_ROUND_UP(req->nbytes, PAGE_SIZE) <= HIFN_QUEUE_LENGTH)
1942 		err = hifn_setup_session(req);
1943 
1944 	if (err == -EAGAIN) {
1945 		unsigned long flags;
1946 
1947 		spin_lock_irqsave(&dev->lock, flags);
1948 		err = ablkcipher_enqueue_request(&dev->queue, req);
1949 		spin_unlock_irqrestore(&dev->lock, flags);
1950 	}
1951 
1952 	return err;
1953 }
1954 
1955 static int hifn_setup_crypto_req(struct ablkcipher_request *req, u8 op,
1956 		u8 type, u8 mode)
1957 {
1958 	struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm);
1959 	unsigned ivsize;
1960 
1961 	ivsize = crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(req));
1962 
1963 	if (req->info && mode != ACRYPTO_MODE_ECB) {
1964 		if (type == ACRYPTO_TYPE_AES_128)
1965 			ivsize = HIFN_AES_IV_LENGTH;
1966 		else if (type == ACRYPTO_TYPE_DES)
1967 			ivsize = HIFN_DES_KEY_LENGTH;
1968 		else if (type == ACRYPTO_TYPE_3DES)
1969 			ivsize = HIFN_3DES_KEY_LENGTH;
1970 	}
1971 
1972 	if (ctx->keysize != 16 && type == ACRYPTO_TYPE_AES_128) {
1973 		if (ctx->keysize == 24)
1974 			type = ACRYPTO_TYPE_AES_192;
1975 		else if (ctx->keysize == 32)
1976 			type = ACRYPTO_TYPE_AES_256;
1977 	}
1978 
1979 	ctx->op = op;
1980 	ctx->mode = mode;
1981 	ctx->type = type;
1982 	ctx->iv = req->info;
1983 	ctx->ivsize = ivsize;
1984 
1985 	/*
1986 	 * HEAVY TODO: needs to kick Herbert XU to write documentation.
1987 	 * HEAVY TODO: needs to kick Herbert XU to write documentation.
1988 	 * HEAVY TODO: needs to kick Herbert XU to write documentation.
1989 	 */
1990 
1991 	return hifn_handle_req(req);
1992 }
1993 
1994 static int hifn_process_queue(struct hifn_device *dev)
1995 {
1996 	struct crypto_async_request *async_req;
1997 	struct hifn_context *ctx;
1998 	struct ablkcipher_request *req;
1999 	unsigned long flags;
2000 	int err = 0;
2001 
2002 	while (dev->started < HIFN_QUEUE_LENGTH) {
2003 		spin_lock_irqsave(&dev->lock, flags);
2004 		async_req = crypto_dequeue_request(&dev->queue);
2005 		spin_unlock_irqrestore(&dev->lock, flags);
2006 
2007 		if (!async_req)
2008 			break;
2009 
2010 		ctx = crypto_tfm_ctx(async_req->tfm);
2011 		req = container_of(async_req, struct ablkcipher_request, base);
2012 
2013 		err = hifn_handle_req(req);
2014 		if (err)
2015 			break;
2016 	}
2017 
2018 	return err;
2019 }
2020 
2021 static int hifn_setup_crypto(struct ablkcipher_request *req, u8 op,
2022 		u8 type, u8 mode)
2023 {
2024 	int err;
2025 	struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm);
2026 	struct hifn_device *dev = ctx->dev;
2027 
2028 	err = hifn_setup_crypto_req(req, op, type, mode);
2029 	if (err)
2030 		return err;
2031 
2032 	if (dev->started < HIFN_QUEUE_LENGTH &&	dev->queue.qlen)
2033 		err = hifn_process_queue(dev);
2034 
2035 	return err;
2036 }
2037 
2038 /*
2039  * AES ecryption functions.
2040  */
2041 static inline int hifn_encrypt_aes_ecb(struct ablkcipher_request *req)
2042 {
2043 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2044 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_ECB);
2045 }
2046 static inline int hifn_encrypt_aes_cbc(struct ablkcipher_request *req)
2047 {
2048 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2049 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CBC);
2050 }
2051 static inline int hifn_encrypt_aes_cfb(struct ablkcipher_request *req)
2052 {
2053 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2054 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CFB);
2055 }
2056 static inline int hifn_encrypt_aes_ofb(struct ablkcipher_request *req)
2057 {
2058 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2059 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_OFB);
2060 }
2061 
2062 /*
2063  * AES decryption functions.
2064  */
2065 static inline int hifn_decrypt_aes_ecb(struct ablkcipher_request *req)
2066 {
2067 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2068 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_ECB);
2069 }
2070 static inline int hifn_decrypt_aes_cbc(struct ablkcipher_request *req)
2071 {
2072 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2073 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CBC);
2074 }
2075 static inline int hifn_decrypt_aes_cfb(struct ablkcipher_request *req)
2076 {
2077 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2078 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CFB);
2079 }
2080 static inline int hifn_decrypt_aes_ofb(struct ablkcipher_request *req)
2081 {
2082 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2083 			ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_OFB);
2084 }
2085 
2086 /*
2087  * DES ecryption functions.
2088  */
2089 static inline int hifn_encrypt_des_ecb(struct ablkcipher_request *req)
2090 {
2091 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2092 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_ECB);
2093 }
2094 static inline int hifn_encrypt_des_cbc(struct ablkcipher_request *req)
2095 {
2096 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2097 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_CBC);
2098 }
2099 static inline int hifn_encrypt_des_cfb(struct ablkcipher_request *req)
2100 {
2101 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2102 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_CFB);
2103 }
2104 static inline int hifn_encrypt_des_ofb(struct ablkcipher_request *req)
2105 {
2106 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2107 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_OFB);
2108 }
2109 
2110 /*
2111  * DES decryption functions.
2112  */
2113 static inline int hifn_decrypt_des_ecb(struct ablkcipher_request *req)
2114 {
2115 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2116 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_ECB);
2117 }
2118 static inline int hifn_decrypt_des_cbc(struct ablkcipher_request *req)
2119 {
2120 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2121 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_CBC);
2122 }
2123 static inline int hifn_decrypt_des_cfb(struct ablkcipher_request *req)
2124 {
2125 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2126 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_CFB);
2127 }
2128 static inline int hifn_decrypt_des_ofb(struct ablkcipher_request *req)
2129 {
2130 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2131 			ACRYPTO_TYPE_DES, ACRYPTO_MODE_OFB);
2132 }
2133 
2134 /*
2135  * 3DES ecryption functions.
2136  */
2137 static inline int hifn_encrypt_3des_ecb(struct ablkcipher_request *req)
2138 {
2139 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2140 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_ECB);
2141 }
2142 static inline int hifn_encrypt_3des_cbc(struct ablkcipher_request *req)
2143 {
2144 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2145 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CBC);
2146 }
2147 static inline int hifn_encrypt_3des_cfb(struct ablkcipher_request *req)
2148 {
2149 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2150 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CFB);
2151 }
2152 static inline int hifn_encrypt_3des_ofb(struct ablkcipher_request *req)
2153 {
2154 	return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT,
2155 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_OFB);
2156 }
2157 
2158 /*
2159  * 3DES decryption functions.
2160  */
2161 static inline int hifn_decrypt_3des_ecb(struct ablkcipher_request *req)
2162 {
2163 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2164 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_ECB);
2165 }
2166 static inline int hifn_decrypt_3des_cbc(struct ablkcipher_request *req)
2167 {
2168 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2169 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CBC);
2170 }
2171 static inline int hifn_decrypt_3des_cfb(struct ablkcipher_request *req)
2172 {
2173 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2174 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CFB);
2175 }
2176 static inline int hifn_decrypt_3des_ofb(struct ablkcipher_request *req)
2177 {
2178 	return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT,
2179 			ACRYPTO_TYPE_3DES, ACRYPTO_MODE_OFB);
2180 }
2181 
2182 struct hifn_alg_template
2183 {
2184 	char name[CRYPTO_MAX_ALG_NAME];
2185 	char drv_name[CRYPTO_MAX_ALG_NAME];
2186 	unsigned int bsize;
2187 	struct ablkcipher_alg ablkcipher;
2188 };
2189 
2190 static struct hifn_alg_template hifn_alg_templates[] = {
2191 	/*
2192 	 * 3DES ECB, CBC, CFB and OFB modes.
2193 	 */
2194 	{
2195 		.name = "cfb(des3_ede)", .drv_name = "hifn-3des", .bsize = 8,
2196 		.ablkcipher = {
2197 			.min_keysize	=	HIFN_3DES_KEY_LENGTH,
2198 			.max_keysize	=	HIFN_3DES_KEY_LENGTH,
2199 			.setkey		=	hifn_setkey,
2200 			.encrypt	=	hifn_encrypt_3des_cfb,
2201 			.decrypt	=	hifn_decrypt_3des_cfb,
2202 		},
2203 	},
2204 	{
2205 		.name = "ofb(des3_ede)", .drv_name = "hifn-3des", .bsize = 8,
2206 		.ablkcipher = {
2207 			.min_keysize	=	HIFN_3DES_KEY_LENGTH,
2208 			.max_keysize	=	HIFN_3DES_KEY_LENGTH,
2209 			.setkey		=	hifn_setkey,
2210 			.encrypt	=	hifn_encrypt_3des_ofb,
2211 			.decrypt	=	hifn_decrypt_3des_ofb,
2212 		},
2213 	},
2214 	{
2215 		.name = "cbc(des3_ede)", .drv_name = "hifn-3des", .bsize = 8,
2216 		.ablkcipher = {
2217 			.min_keysize	=	HIFN_3DES_KEY_LENGTH,
2218 			.max_keysize	=	HIFN_3DES_KEY_LENGTH,
2219 			.setkey		=	hifn_setkey,
2220 			.encrypt	=	hifn_encrypt_3des_cbc,
2221 			.decrypt	=	hifn_decrypt_3des_cbc,
2222 		},
2223 	},
2224 	{
2225 		.name = "ecb(des3_ede)", .drv_name = "hifn-3des", .bsize = 8,
2226 		.ablkcipher = {
2227 			.min_keysize	=	HIFN_3DES_KEY_LENGTH,
2228 			.max_keysize	=	HIFN_3DES_KEY_LENGTH,
2229 			.setkey		=	hifn_setkey,
2230 			.encrypt	=	hifn_encrypt_3des_ecb,
2231 			.decrypt	=	hifn_decrypt_3des_ecb,
2232 		},
2233 	},
2234 
2235 	/*
2236 	 * DES ECB, CBC, CFB and OFB modes.
2237 	 */
2238 	{
2239 		.name = "cfb(des)", .drv_name = "hifn-des", .bsize = 8,
2240 		.ablkcipher = {
2241 			.min_keysize	=	HIFN_DES_KEY_LENGTH,
2242 			.max_keysize	=	HIFN_DES_KEY_LENGTH,
2243 			.setkey		=	hifn_setkey,
2244 			.encrypt	=	hifn_encrypt_des_cfb,
2245 			.decrypt	=	hifn_decrypt_des_cfb,
2246 		},
2247 	},
2248 	{
2249 		.name = "ofb(des)", .drv_name = "hifn-des", .bsize = 8,
2250 		.ablkcipher = {
2251 			.min_keysize	=	HIFN_DES_KEY_LENGTH,
2252 			.max_keysize	=	HIFN_DES_KEY_LENGTH,
2253 			.setkey		=	hifn_setkey,
2254 			.encrypt	=	hifn_encrypt_des_ofb,
2255 			.decrypt	=	hifn_decrypt_des_ofb,
2256 		},
2257 	},
2258 	{
2259 		.name = "cbc(des)", .drv_name = "hifn-des", .bsize = 8,
2260 		.ablkcipher = {
2261 			.min_keysize	=	HIFN_DES_KEY_LENGTH,
2262 			.max_keysize	=	HIFN_DES_KEY_LENGTH,
2263 			.setkey		=	hifn_setkey,
2264 			.encrypt	=	hifn_encrypt_des_cbc,
2265 			.decrypt	=	hifn_decrypt_des_cbc,
2266 		},
2267 	},
2268 	{
2269 		.name = "ecb(des)", .drv_name = "hifn-des", .bsize = 8,
2270 		.ablkcipher = {
2271 			.min_keysize	=	HIFN_DES_KEY_LENGTH,
2272 			.max_keysize	=	HIFN_DES_KEY_LENGTH,
2273 			.setkey		=	hifn_setkey,
2274 			.encrypt	=	hifn_encrypt_des_ecb,
2275 			.decrypt	=	hifn_decrypt_des_ecb,
2276 		},
2277 	},
2278 
2279 	/*
2280 	 * AES ECB, CBC, CFB and OFB modes.
2281 	 */
2282 	{
2283 		.name = "ecb(aes)", .drv_name = "hifn-aes", .bsize = 16,
2284 		.ablkcipher = {
2285 			.min_keysize	=	AES_MIN_KEY_SIZE,
2286 			.max_keysize	=	AES_MAX_KEY_SIZE,
2287 			.setkey		=	hifn_setkey,
2288 			.encrypt	=	hifn_encrypt_aes_ecb,
2289 			.decrypt	=	hifn_decrypt_aes_ecb,
2290 		},
2291 	},
2292 	{
2293 		.name = "cbc(aes)", .drv_name = "hifn-aes", .bsize = 16,
2294 		.ablkcipher = {
2295 			.min_keysize	=	AES_MIN_KEY_SIZE,
2296 			.max_keysize	=	AES_MAX_KEY_SIZE,
2297 			.setkey		=	hifn_setkey,
2298 			.encrypt	=	hifn_encrypt_aes_cbc,
2299 			.decrypt	=	hifn_decrypt_aes_cbc,
2300 		},
2301 	},
2302 	{
2303 		.name = "cfb(aes)", .drv_name = "hifn-aes", .bsize = 16,
2304 		.ablkcipher = {
2305 			.min_keysize	=	AES_MIN_KEY_SIZE,
2306 			.max_keysize	=	AES_MAX_KEY_SIZE,
2307 			.setkey		=	hifn_setkey,
2308 			.encrypt	=	hifn_encrypt_aes_cfb,
2309 			.decrypt	=	hifn_decrypt_aes_cfb,
2310 		},
2311 	},
2312 	{
2313 		.name = "ofb(aes)", .drv_name = "hifn-aes", .bsize = 16,
2314 		.ablkcipher = {
2315 			.min_keysize	=	AES_MIN_KEY_SIZE,
2316 			.max_keysize	=	AES_MAX_KEY_SIZE,
2317 			.setkey		=	hifn_setkey,
2318 			.encrypt	=	hifn_encrypt_aes_ofb,
2319 			.decrypt	=	hifn_decrypt_aes_ofb,
2320 		},
2321 	},
2322 };
2323 
2324 static int hifn_cra_init(struct crypto_tfm *tfm)
2325 {
2326 	struct crypto_alg *alg = tfm->__crt_alg;
2327 	struct hifn_crypto_alg *ha = crypto_alg_to_hifn(alg);
2328 	struct hifn_context *ctx = crypto_tfm_ctx(tfm);
2329 
2330 	ctx->dev = ha->dev;
2331 
2332 	return 0;
2333 }
2334 
2335 static int hifn_alg_alloc(struct hifn_device *dev, struct hifn_alg_template *t)
2336 {
2337 	struct hifn_crypto_alg *alg;
2338 	int err;
2339 
2340 	alg = kzalloc(sizeof(struct hifn_crypto_alg), GFP_KERNEL);
2341 	if (!alg)
2342 		return -ENOMEM;
2343 
2344 	snprintf(alg->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s", t->name);
2345 	snprintf(alg->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", t->drv_name);
2346 
2347 	alg->alg.cra_priority = 300;
2348 	alg->alg.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_ASYNC;
2349 	alg->alg.cra_blocksize = t->bsize;
2350 	alg->alg.cra_ctxsize = sizeof(struct hifn_context);
2351 	alg->alg.cra_alignmask = 15;
2352 	if (t->bsize == 8)
2353 		alg->alg.cra_alignmask = 3;
2354 	alg->alg.cra_type = &crypto_ablkcipher_type;
2355 	alg->alg.cra_module = THIS_MODULE;
2356 	alg->alg.cra_u.ablkcipher = t->ablkcipher;
2357 	alg->alg.cra_init = hifn_cra_init;
2358 
2359 	alg->dev = dev;
2360 
2361 	list_add_tail(&alg->entry, &dev->alg_list);
2362 
2363 	err = crypto_register_alg(&alg->alg);
2364 	if (err) {
2365 		list_del(&alg->entry);
2366 		kfree(alg);
2367 	}
2368 
2369 	return err;
2370 }
2371 
2372 static void hifn_unregister_alg(struct hifn_device *dev)
2373 {
2374 	struct hifn_crypto_alg *a, *n;
2375 
2376 	list_for_each_entry_safe(a, n, &dev->alg_list, entry) {
2377 		list_del(&a->entry);
2378 		crypto_unregister_alg(&a->alg);
2379 		kfree(a);
2380 	}
2381 }
2382 
2383 static int hifn_register_alg(struct hifn_device *dev)
2384 {
2385 	int i, err;
2386 
2387 	for (i=0; i<ARRAY_SIZE(hifn_alg_templates); ++i) {
2388 		err = hifn_alg_alloc(dev, &hifn_alg_templates[i]);
2389 		if (err)
2390 			goto err_out_exit;
2391 	}
2392 
2393 	return 0;
2394 
2395 err_out_exit:
2396 	hifn_unregister_alg(dev);
2397 	return err;
2398 }
2399 
2400 static int hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2401 {
2402 	int err, i;
2403 	struct hifn_device *dev;
2404 	char name[8];
2405 
2406 	err = pci_enable_device(pdev);
2407 	if (err)
2408 		return err;
2409 	pci_set_master(pdev);
2410 
2411 	err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
2412 	if (err)
2413 		goto err_out_disable_pci_device;
2414 
2415 	snprintf(name, sizeof(name), "hifn%d",
2416 			atomic_inc_return(&hifn_dev_number)-1);
2417 
2418 	err = pci_request_regions(pdev, name);
2419 	if (err)
2420 		goto err_out_disable_pci_device;
2421 
2422 	if (pci_resource_len(pdev, 0) < HIFN_BAR0_SIZE ||
2423 	    pci_resource_len(pdev, 1) < HIFN_BAR1_SIZE ||
2424 	    pci_resource_len(pdev, 2) < HIFN_BAR2_SIZE) {
2425 		dprintk("%s: Broken hardware - I/O regions are too small.\n",
2426 				pci_name(pdev));
2427 		err = -ENODEV;
2428 		goto err_out_free_regions;
2429 	}
2430 
2431 	dev = kzalloc(sizeof(struct hifn_device) + sizeof(struct crypto_alg),
2432 			GFP_KERNEL);
2433 	if (!dev) {
2434 		err = -ENOMEM;
2435 		goto err_out_free_regions;
2436 	}
2437 
2438 	INIT_LIST_HEAD(&dev->alg_list);
2439 
2440 	snprintf(dev->name, sizeof(dev->name), "%s", name);
2441 	spin_lock_init(&dev->lock);
2442 
2443 	for (i=0; i<3; ++i) {
2444 		unsigned long addr, size;
2445 
2446 		addr = pci_resource_start(pdev, i);
2447 		size = pci_resource_len(pdev, i);
2448 
2449 		dev->bar[i] = ioremap_nocache(addr, size);
2450 		if (!dev->bar[i])
2451 			goto err_out_unmap_bars;
2452 	}
2453 
2454 	dev->result_mem = __get_free_pages(GFP_KERNEL, HIFN_MAX_RESULT_ORDER);
2455 	if (!dev->result_mem) {
2456 		dprintk("Failed to allocate %d pages for result_mem.\n",
2457 				HIFN_MAX_RESULT_ORDER);
2458 		goto err_out_unmap_bars;
2459 	}
2460 	memset((void *)dev->result_mem, 0, PAGE_SIZE*(1<<HIFN_MAX_RESULT_ORDER));
2461 
2462 	dev->dst = pci_map_single(pdev, (void *)dev->result_mem,
2463 			PAGE_SIZE << HIFN_MAX_RESULT_ORDER, PCI_DMA_FROMDEVICE);
2464 
2465 	dev->desc_virt = pci_alloc_consistent(pdev, sizeof(struct hifn_dma),
2466 			&dev->desc_dma);
2467 	if (!dev->desc_virt) {
2468 		dprintk("Failed to allocate descriptor rings.\n");
2469 		goto err_out_free_result_pages;
2470 	}
2471 	memset(dev->desc_virt, 0, sizeof(struct hifn_dma));
2472 
2473 	dev->pdev = pdev;
2474 	dev->irq = pdev->irq;
2475 
2476 	for (i=0; i<HIFN_D_RES_RSIZE; ++i)
2477 		dev->sa[i] = NULL;
2478 
2479 	pci_set_drvdata(pdev, dev);
2480 
2481 	crypto_init_queue(&dev->queue, 1);
2482 
2483 	err = request_irq(dev->irq, hifn_interrupt, IRQF_SHARED, dev->name, dev);
2484 	if (err) {
2485 		dprintk("Failed to request IRQ%d: err: %d.\n", dev->irq, err);
2486 		dev->irq = 0;
2487 		goto err_out_free_desc;
2488 	}
2489 
2490 	err = hifn_start_device(dev);
2491 	if (err)
2492 		goto err_out_free_irq;
2493 
2494 	err = hifn_test(dev, 1, 0);
2495 	if (err)
2496 		goto err_out_stop_device;
2497 
2498 	err = hifn_register_alg(dev);
2499 	if (err)
2500 		goto err_out_stop_device;
2501 
2502 	INIT_DELAYED_WORK(&dev->work, hifn_work);
2503 	schedule_delayed_work(&dev->work, HZ);
2504 
2505 	dprintk("HIFN crypto accelerator card at %s has been "
2506 			"successfully registered as %s.\n",
2507 			pci_name(pdev), dev->name);
2508 
2509 	return 0;
2510 
2511 err_out_stop_device:
2512 	hifn_reset_dma(dev, 1);
2513 	hifn_stop_device(dev);
2514 err_out_free_irq:
2515 	free_irq(dev->irq, dev->name);
2516 err_out_free_desc:
2517 	pci_free_consistent(pdev, sizeof(struct hifn_dma),
2518 			dev->desc_virt, dev->desc_dma);
2519 
2520 err_out_free_result_pages:
2521 	pci_unmap_single(pdev, dev->dst, PAGE_SIZE << HIFN_MAX_RESULT_ORDER,
2522 			PCI_DMA_FROMDEVICE);
2523 	free_pages(dev->result_mem, HIFN_MAX_RESULT_ORDER);
2524 
2525 err_out_unmap_bars:
2526 	for (i=0; i<3; ++i)
2527 		if (dev->bar[i])
2528 			iounmap(dev->bar[i]);
2529 
2530 err_out_free_regions:
2531 	pci_release_regions(pdev);
2532 
2533 err_out_disable_pci_device:
2534 	pci_disable_device(pdev);
2535 
2536 	return err;
2537 }
2538 
2539 static void hifn_remove(struct pci_dev *pdev)
2540 {
2541 	int i;
2542 	struct hifn_device *dev;
2543 
2544 	dev = pci_get_drvdata(pdev);
2545 
2546 	if (dev) {
2547 		cancel_delayed_work(&dev->work);
2548 		flush_scheduled_work();
2549 
2550 		hifn_unregister_alg(dev);
2551 		hifn_reset_dma(dev, 1);
2552 		hifn_stop_device(dev);
2553 
2554 		free_irq(dev->irq, dev->name);
2555 
2556 		hifn_flush(dev);
2557 
2558 		pci_free_consistent(pdev, sizeof(struct hifn_dma),
2559 				dev->desc_virt, dev->desc_dma);
2560 		pci_unmap_single(pdev, dev->dst,
2561 				PAGE_SIZE << HIFN_MAX_RESULT_ORDER,
2562 				PCI_DMA_FROMDEVICE);
2563 		free_pages(dev->result_mem, HIFN_MAX_RESULT_ORDER);
2564 		for (i=0; i<3; ++i)
2565 			if (dev->bar[i])
2566 				iounmap(dev->bar[i]);
2567 
2568 		kfree(dev);
2569 	}
2570 
2571 	pci_release_regions(pdev);
2572 	pci_disable_device(pdev);
2573 }
2574 
2575 static struct pci_device_id hifn_pci_tbl[] = {
2576 	{ PCI_DEVICE(PCI_VENDOR_ID_HIFN, PCI_DEVICE_ID_HIFN_7955) },
2577 	{ PCI_DEVICE(PCI_VENDOR_ID_HIFN, PCI_DEVICE_ID_HIFN_7956) },
2578 	{ 0 }
2579 };
2580 MODULE_DEVICE_TABLE(pci, hifn_pci_tbl);
2581 
2582 static struct pci_driver hifn_pci_driver = {
2583 	.name     = "hifn795x",
2584 	.id_table = hifn_pci_tbl,
2585 	.probe    = hifn_probe,
2586 	.remove   = __devexit_p(hifn_remove),
2587 };
2588 
2589 static int __devinit hifn_init(void)
2590 {
2591 	int err;
2592 
2593 	err = pci_register_driver(&hifn_pci_driver);
2594 	if (err < 0) {
2595 		dprintk("Failed to register PCI driver for %s device.\n",
2596 				hifn_pci_driver.name);
2597 		return -ENODEV;
2598 	}
2599 
2600 	printk(KERN_INFO "Driver for HIFN 795x crypto accelerator chip "
2601 			"has been successfully registered.\n");
2602 
2603 	return 0;
2604 }
2605 
2606 static void __devexit hifn_fini(void)
2607 {
2608 	pci_unregister_driver(&hifn_pci_driver);
2609 
2610 	printk(KERN_INFO "Driver for HIFN 795x crypto accelerator chip "
2611 			"has been successfully unregistered.\n");
2612 }
2613 
2614 module_init(hifn_init);
2615 module_exit(hifn_fini);
2616 
2617 MODULE_LICENSE("GPL");
2618 MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
2619 MODULE_DESCRIPTION("Driver for HIFN 795x crypto accelerator chip.");
2620