| #ifndef _CRYPTO_LRW_H | 
 | #define _CRYPTO_LRW_H | 
 |  | 
 | #include <crypto/b128ops.h> | 
 |  | 
 | struct scatterlist; | 
 | struct gf128mul_64k; | 
 | struct blkcipher_desc; | 
 |  | 
 | #define LRW_BLOCK_SIZE 16 | 
 |  | 
 | struct lrw_table_ctx { | 
 | 	/* optimizes multiplying a random (non incrementing, as at the | 
 | 	 * start of a new sector) value with key2, we could also have | 
 | 	 * used 4k optimization tables or no optimization at all. In the | 
 | 	 * latter case we would have to store key2 here */ | 
 | 	struct gf128mul_64k *table; | 
 | 	/* stores: | 
 | 	 *  key2*{ 0,0,...0,0,0,0,1 }, key2*{ 0,0,...0,0,0,1,1 }, | 
 | 	 *  key2*{ 0,0,...0,0,1,1,1 }, key2*{ 0,0,...0,1,1,1,1 } | 
 | 	 *  key2*{ 0,0,...1,1,1,1,1 }, etc | 
 | 	 * needed for optimized multiplication of incrementing values | 
 | 	 * with key2 */ | 
 | 	be128 mulinc[128]; | 
 | }; | 
 |  | 
 | int lrw_init_table(struct lrw_table_ctx *ctx, const u8 *tweak); | 
 | void lrw_free_table(struct lrw_table_ctx *ctx); | 
 |  | 
 | struct lrw_crypt_req { | 
 | 	be128 *tbuf; | 
 | 	unsigned int tbuflen; | 
 |  | 
 | 	struct lrw_table_ctx *table_ctx; | 
 | 	void *crypt_ctx; | 
 | 	void (*crypt_fn)(void *ctx, u8 *blks, unsigned int nbytes); | 
 | }; | 
 |  | 
 | int lrw_crypt(struct blkcipher_desc *desc, struct scatterlist *dst, | 
 | 	      struct scatterlist *src, unsigned int nbytes, | 
 | 	      struct lrw_crypt_req *req); | 
 |  | 
 | #endif  /* _CRYPTO_LRW_H */ |