aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/cesa
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2018-07-18 00:56:25 +0000
committerConrad Meyer <cem@FreeBSD.org>2018-07-18 00:56:25 +0000
commit1b0909d51a8aa8b5ec5a61c2dc1a69642976a732 (patch)
treeb9c915e7d2ca9312b6f83308f05040a78875b6d7 /sys/dev/cesa
parent38b42191fb8cbdf348508c72b504e0dc3da1b53c (diff)
Notes
Diffstat (limited to 'sys/dev/cesa')
-rw-r--r--sys/dev/cesa/cesa.c81
-rw-r--r--sys/dev/cesa/cesa.h6
2 files changed, 8 insertions, 79 deletions
diff --git a/sys/dev/cesa/cesa.c b/sys/dev/cesa/cesa.c
index 21508d70c7f7..6cbac049bb42 100644
--- a/sys/dev/cesa/cesa.c
+++ b/sys/dev/cesa/cesa.c
@@ -80,8 +80,7 @@ static int cesa_attach(device_t);
static int cesa_attach_late(device_t);
static int cesa_detach(device_t);
static void cesa_intr(void *);
-static int cesa_newsession(device_t, u_int32_t *, struct cryptoini *);
-static int cesa_freesession(device_t, u_int64_t);
+static int cesa_newsession(device_t, crypto_session_t, struct cryptoini *);
static int cesa_process(device_t, struct cryptop *, int);
static struct resource_spec cesa_res_spec[] = {
@@ -99,7 +98,6 @@ static device_method_t cesa_methods[] = {
/* Crypto device methods */
DEVMETHOD(cryptodev_newsession, cesa_newsession),
- DEVMETHOD(cryptodev_freesession,cesa_freesession),
DEVMETHOD(cryptodev_process, cesa_process),
DEVMETHOD_END
@@ -233,33 +231,6 @@ cesa_sync_desc(struct cesa_softc *sc, bus_dmasync_op_t op)
cesa_sync_dma_mem(&sc->sc_requests_cdm, op);
}
-static struct cesa_session *
-cesa_alloc_session(struct cesa_softc *sc)
-{
- struct cesa_session *cs;
-
- CESA_GENERIC_ALLOC_LOCKED(sc, cs, sessions);
-
- return (cs);
-}
-
-static struct cesa_session *
-cesa_get_session(struct cesa_softc *sc, uint32_t sid)
-{
-
- if (sid >= CESA_SESSIONS)
- return (NULL);
-
- return (&sc->sc_sessions[sid]);
-}
-
-static void
-cesa_free_session(struct cesa_softc *sc, struct cesa_session *cs)
-{
-
- CESA_GENERIC_FREE_LOCKED(sc, cs, sessions);
-}
-
static struct cesa_request *
cesa_alloc_request(struct cesa_softc *sc)
{
@@ -1372,14 +1343,6 @@ cesa_attach_late(device_t dev)
cr_stq);
}
- /* Initialize data structures: Sessions Pool */
- STAILQ_INIT(&sc->sc_free_sessions);
- for (i = 0; i < CESA_SESSIONS; i++) {
- sc->sc_sessions[i].cs_sid = i;
- STAILQ_INSERT_TAIL(&sc->sc_free_sessions, &sc->sc_sessions[i],
- cs_stq);
- }
-
/*
* Initialize TDMA:
* - Burst limit: 128 bytes,
@@ -1415,7 +1378,8 @@ cesa_attach_late(device_t dev)
CESA_TDMA_EMR_DATA_ERROR);
/* Register in OCF */
- sc->sc_cid = crypto_get_driverid(dev, CRYPTOCAP_F_HARDWARE);
+ sc->sc_cid = crypto_get_driverid(dev, sizeof(struct cesa_session),
+ CRYPTOCAP_F_HARDWARE);
if (sc->sc_cid < 0) {
device_printf(dev, "could not get crypto driver id\n");
goto err8;
@@ -1608,7 +1572,7 @@ cesa_intr(void *arg)
}
static int
-cesa_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
+cesa_newsession(device_t dev, crypto_session_t cses, struct cryptoini *cri)
{
struct cesa_session *cs;
struct cesa_softc *sc;
@@ -1645,9 +1609,7 @@ cesa_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
return (E2BIG);
/* Allocate session */
- cs = cesa_alloc_session(sc);
- if (!cs)
- return (ENOMEM);
+ cs = crypto_get_driver_session(cses);
/* Prepare CESA configuration */
cs->cs_config = 0;
@@ -1730,29 +1692,8 @@ cesa_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
error = cesa_set_mkey(cs, mac->cri_alg, mac->cri_key,
mac->cri_klen / 8);
- if (error) {
- cesa_free_session(sc, cs);
- return (EINVAL);
- }
-
- *sidp = cs->cs_sid;
-
- return (0);
-}
-
-static int
-cesa_freesession(device_t dev, uint64_t tid)
-{
- struct cesa_session *cs;
- struct cesa_softc *sc;
-
- sc = device_get_softc(dev);
- cs = cesa_get_session(sc, CRYPTO_SESID2LID(tid));
- if (!cs)
- return (EINVAL);
-
- /* Free session */
- cesa_free_session(sc, cs);
+ if (error)
+ return (error);
return (0);
}
@@ -1774,13 +1715,7 @@ cesa_process(device_t dev, struct cryptop *crp, int hint)
mac = NULL;
error = 0;
- /* Check session ID */
- cs = cesa_get_session(sc, CRYPTO_SESID2LID(crp->crp_sid));
- if (!cs) {
- crp->crp_etype = EINVAL;
- crypto_done(crp);
- return (0);
- }
+ cs = crypto_get_driver_session(crp->crp_session);
/* Check and parse input */
if (crp->crp_ilen > CESA_MAX_REQUEST_SIZE) {
diff --git a/sys/dev/cesa/cesa.h b/sys/dev/cesa/cesa.h
index 15048897a862..9fa35b89b18f 100644
--- a/sys/dev/cesa/cesa.h
+++ b/sys/dev/cesa/cesa.h
@@ -193,7 +193,6 @@ struct cesa_sa_desc {
};
struct cesa_session {
- uint32_t cs_sid;
uint32_t cs_config;
unsigned int cs_klen;
unsigned int cs_ivlen;
@@ -203,8 +202,6 @@ struct cesa_session {
uint8_t cs_aes_dkey[CESA_MAX_KEY_LEN];
uint8_t cs_hiv_in[CESA_MAX_HASH_LEN];
uint8_t cs_hiv_out[CESA_MAX_HASH_LEN];
-
- STAILQ_ENTRY(cesa_session) cs_stq;
};
struct cesa_request {
@@ -264,10 +261,7 @@ struct cesa_softc {
STAILQ_HEAD(, cesa_request) sc_ready_requests;
STAILQ_HEAD(, cesa_request) sc_queued_requests;
- /* Sessions pool */
struct mtx sc_sessions_lock;
- struct cesa_session sc_sessions[CESA_SESSIONS];
- STAILQ_HEAD(, cesa_session) sc_free_sessions;
/* CESA SRAM Address */
bus_addr_t sc_sram_base_pa;