Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2512a624 authored by Harsh Jain's avatar Harsh Jain Committed by Herbert Xu
Browse files

crypto: chcr - Pass lcb bit setting to firmware



GCM and CBC mode of operation requires Last Cipher Block.
This patch set lcb bit in WR header when required.

Signed-off-by: default avatarHarsh Jain <harsh@chelsio.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 7c742df5
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -518,7 +518,8 @@ static inline void create_wreq(struct chcr_context *ctx,
			       void *req, struct sk_buff *skb,
			       int kctx_len, int hash_sz,
			       int is_iv,
			       unsigned int sc_len)
			       unsigned int sc_len,
			       unsigned int lcb)
{
	struct uld_ctx *u_ctx = ULD_CTX(ctx);
	int iv_loc = IV_DSGL;
@@ -543,7 +544,8 @@ static inline void create_wreq(struct chcr_context *ctx,
	chcr_req->wreq.cookie = cpu_to_be64((uintptr_t)req);
	chcr_req->wreq.rx_chid_to_rx_q_id =
		FILL_WR_RX_Q_ID(ctx->dev->rx_channel_id, qid,
				is_iv ? iv_loc : IV_NOP, ctx->tx_qidx);
				is_iv ? iv_loc : IV_NOP, !!lcb,
				ctx->tx_qidx);

	chcr_req->ulptx.cmd_dest = FILL_ULPTX_CMD_DEST(ctx->dev->tx_channel_id,
						       qid);
@@ -652,7 +654,8 @@ static struct sk_buff
	write_buffer_to_skb(skb, &frags, reqctx->iv, ivsize);
	write_sg_to_skb(skb, &frags, req->src, req->nbytes);
	create_wreq(ctx, chcr_req, req, skb, kctx_len, 0, 1,
			sizeof(struct cpl_rx_phys_dsgl) + phys_dsgl);
			sizeof(struct cpl_rx_phys_dsgl) + phys_dsgl,
			ablkctx->ciph_mode == CHCR_SCMD_CIPHER_MODE_AES_CBC);
	reqctx->skb = skb;
	skb_get(skb);
	return skb;
@@ -923,7 +926,7 @@ static struct sk_buff *create_hash_wr(struct ahash_request *req,
		write_sg_to_skb(skb, &frags, req->src, param->sg_len);

	create_wreq(ctx, chcr_req, req, skb, kctx_len, hash_size_in_response, 0,
			DUMMY_BYTES);
			DUMMY_BYTES, 0);
	req_ctx->skb = skb;
	skb_get(skb);
	return skb;
@@ -1508,7 +1511,7 @@ static struct sk_buff *create_authenc_wr(struct aead_request *req,
	write_buffer_to_skb(skb, &frags, req->iv, ivsize);
	write_sg_to_skb(skb, &frags, src, req->cryptlen);
	create_wreq(ctx, chcr_req, req, skb, kctx_len, size, 1,
		   sizeof(struct cpl_rx_phys_dsgl) + dst_size);
		   sizeof(struct cpl_rx_phys_dsgl) + dst_size, 0);
	reqctx->skb = skb;
	skb_get(skb);

@@ -1804,7 +1807,7 @@ static struct sk_buff *create_aead_ccm_wr(struct aead_request *req,
	skb_set_transport_header(skb, transhdr_len);
	frags = fill_aead_req_fields(skb, req, src, ivsize, aeadctx);
	create_wreq(ctx, chcr_req, req, skb, kctx_len, 0, 1,
		    sizeof(struct cpl_rx_phys_dsgl) + dst_size);
		    sizeof(struct cpl_rx_phys_dsgl) + dst_size, 0);
	reqctx->skb = skb;
	skb_get(skb);
	return skb;
@@ -1950,7 +1953,8 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req,
	write_buffer_to_skb(skb, &frags, reqctx->iv, ivsize);
	write_sg_to_skb(skb, &frags, src, req->cryptlen);
	create_wreq(ctx, chcr_req, req, skb, kctx_len, size, 1,
			sizeof(struct cpl_rx_phys_dsgl) + dst_size);
			sizeof(struct cpl_rx_phys_dsgl) + dst_size,
			reqctx->verify);
	reqctx->skb = skb;
	skb_get(skb);
	return skb;
+2 −2
Original line number Diff line number Diff line
@@ -185,11 +185,11 @@
			FW_CRYPTO_LOOKASIDE_WR_CCTX_LOC_V(1) | \
			FW_CRYPTO_LOOKASIDE_WR_CCTX_SIZE_V((ctx_len)))

#define FILL_WR_RX_Q_ID(cid, qid, wr_iv, fid) \
#define FILL_WR_RX_Q_ID(cid, qid, wr_iv, lcb, fid) \
		htonl( \
			FW_CRYPTO_LOOKASIDE_WR_RX_CHID_V((cid)) | \
			FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID_V((qid)) | \
			FW_CRYPTO_LOOKASIDE_WR_LCB_V(0) | \
			FW_CRYPTO_LOOKASIDE_WR_LCB_V((lcb)) | \
			FW_CRYPTO_LOOKASIDE_WR_IV_V((wr_iv)) | \
			FW_CRYPTO_LOOKASIDE_WR_FQIDX_V(fid))