• Iuliana Prodan's avatar
    crypto: engine - support for parallel requests based on retry mechanism · 6a89f492
    Iuliana Prodan authored
    Added support for executing multiple requests, in parallel,
    for crypto engine based on a retry mechanism.
    If hardware was unable to execute a backlog request, enqueue it
    back in front of crypto-engine queue, to keep the order
    of requests.
    
    A new variable is added, retry_support (this is to keep the
    backward compatibility of crypto-engine) , which keeps track
    whether the hardware has support for retry mechanism and,
    also, if can run multiple requests.
    
    If do_one_request() returns:
    >= 0: hardware executed the request successfully;
    < 0: this is the old error path. If hardware has support for retry
    mechanism, the request is put back in front of crypto-engine queue.
    For backwards compatibility, if the retry support is not available,
    the crypto-engine will work as before.
    If hardware queue is full (-ENOSPC), requeue request regardless
    of MAY_BACKLOG flag.
    If hardware throws any other error code (like -EIO, -EINVAL,
    -ENOMEM, etc.) only MAY_BACKLOG requests are enqueued back into
    crypto-engine's queue, since the others can be dropped.
    
    The new crypto_engine_alloc_init_and_set function, initializes
    crypto-engine, sets the maximum size for crypto-engine software
    queue (not hardcoded anymore) and the retry_support variable
    is set, by default, to false.
    On crypto_pump_requests(), if do_one_request() returns >= 0,
    a new request is send to hardware, until there is no space in
    hardware and do_one_request() returns < 0.
    
    By default, retry_support is false and crypto-engine will
    work as before - will send requests to hardware,
    one-by-one, on crypto_pump_requests(), and complete it, on
    crypto_finalize_request(), and so on.
    
    To support multiple requests, in each driver, retry_support
    must be set on true, and if do_one_request() returns an error
    the request must not be freed, since it will be enqueued back
    into crypto-engine's queue.
    
    When all drivers, that use crypto-engine now, will be updated for
    retry mechanism, the retry_support variable can be removed.
    Signed-off-by: default avatarIuliana Prodan <iuliana.prodan@nxp.com>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    6a89f492
crypto_engine.c 14.7 KB