drivers/crypto/inside-secure/eip93/eip93-main.c

Source file repositories/reference/linux-study-clean/drivers/crypto/inside-secure/eip93/eip93-main.c

File Facts

System
Linux kernel
Corpus path
drivers/crypto/inside-secure/eip93/eip93-main.c
Extension
.c
Size
13989 bytes
Lines
517
Domain
Driver Families
Bucket
drivers/crypto
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (eip93_algs[j]->type) {
		case EIP93_ALG_TYPE_SKCIPHER:
			crypto_unregister_skcipher(&eip93_algs[j]->alg.skcipher);
			break;
		case EIP93_ALG_TYPE_AEAD:
			crypto_unregister_aead(&eip93_algs[j]->alg.aead);
			break;
		case EIP93_ALG_TYPE_HASH:
			crypto_unregister_ahash(&eip93_algs[j]->alg.ahash);
			break;
		}
	}
}

static int eip93_register_algs(struct eip93_device *eip93, u32 supported_algo_flags)
{
	unsigned int i;
	int ret = 0;

	for (i = 0; i < ARRAY_SIZE(eip93_algs); i++) {
		u32 alg_flags = eip93_algs[i]->flags;

		eip93_algs[i]->eip93 = eip93;

		if (!eip93_algo_is_supported(alg_flags, supported_algo_flags))
			continue;

		if (IS_AES(alg_flags) && !IS_HMAC(alg_flags)) {
			if (supported_algo_flags & EIP93_PE_OPTION_AES_KEY128)
				eip93_algs[i]->alg.skcipher.max_keysize =
					AES_KEYSIZE_128;

			if (supported_algo_flags & EIP93_PE_OPTION_AES_KEY192)
				eip93_algs[i]->alg.skcipher.max_keysize =
					AES_KEYSIZE_192;

			if (supported_algo_flags & EIP93_PE_OPTION_AES_KEY256)
				eip93_algs[i]->alg.skcipher.max_keysize =
					AES_KEYSIZE_256;

			if (IS_RFC3686(alg_flags))
				eip93_algs[i]->alg.skcipher.max_keysize +=
					CTR_RFC3686_NONCE_SIZE;
		}

		switch (eip93_algs[i]->type) {
		case EIP93_ALG_TYPE_SKCIPHER:
			ret = crypto_register_skcipher(&eip93_algs[i]->alg.skcipher);
			break;
		case EIP93_ALG_TYPE_AEAD:
			ret = crypto_register_aead(&eip93_algs[i]->alg.aead);
			break;
		case EIP93_ALG_TYPE_HASH:
			ret = crypto_register_ahash(&eip93_algs[i]->alg.ahash);
			break;
		}
		if (ret)
			goto fail;
	}

	return 0;

fail:
	eip93_unregister_algs(supported_algo_flags, i);

	return ret;
}

static void eip93_handle_result_descriptor(struct eip93_device *eip93)
{
	struct crypto_async_request *async;
	struct eip93_descriptor *rdesc;
	u16 desc_flags, crypto_idr;
	bool last_entry;
	int handled, left, err;
	u32 pe_ctrl_stat;
	u32 pe_length;

get_more:
	handled = 0;

	left = readl(eip93->base + EIP93_REG_PE_RD_COUNT) & EIP93_PE_RD_COUNT;

	if (!left) {
		eip93_irq_clear(eip93, EIP93_INT_RDR_THRESH);
		eip93_irq_enable(eip93, EIP93_INT_RDR_THRESH);
		return;
	}

	last_entry = false;

Annotation

Implementation Notes