@ -168,8 +168,6 @@ struct omap_sham_hmac_ctx {
} ;
struct omap_sham_ctx {
struct omap_sham_dev * dd ;
unsigned long flags ;
/* fallback stuff */
@ -916,27 +914,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
return 0 ;
}
struct omap_sham_dev * omap_sham_find_dev ( struct omap_sham_reqctx * ctx )
{
struct omap_sham_dev * dd ;
if ( ctx - > dd )
return ctx - > dd ;
spin_lock_bh ( & sham . lock ) ;
dd = list_first_entry ( & sham . dev_list , struct omap_sham_dev , list ) ;
list_move_tail ( & dd - > list , & sham . dev_list ) ;
ctx - > dd = dd ;
spin_unlock_bh ( & sham . lock ) ;
return dd ;
}
static int omap_sham_init ( struct ahash_request * req )
{
struct crypto_ahash * tfm = crypto_ahash_reqtfm ( req ) ;
struct omap_sham_ctx * tctx = crypto_ahash_ctx ( tfm ) ;
struct omap_sham_reqctx * ctx = ahash_request_ctx ( req ) ;
struct omap_sham_dev * dd = NULL , * tmp ;
struct omap_sham_dev * dd ;
int bs = 0 ;
spin_lock_bh ( & sham . lock ) ;
if ( ! tctx - > dd ) {
list_for_each_entry ( tmp , & sham . dev_list , list ) {
dd = tmp ;
break ;
}
tctx - > dd = dd ;
} else {
dd = tctx - > dd ;
}
spin_unlock_bh ( & sham . lock ) ;
ctx - > dd = NULL ;
ctx - > dd = dd ;
dd = omap_sham_find_dev ( ctx ) ;
if ( ! dd )
return - ENODEV ;
ctx - > flags = 0 ;
@ -1186,8 +1192,7 @@ err1:
static int omap_sham_enqueue ( struct ahash_request * req , unsigned int op )
{
struct omap_sham_reqctx * ctx = ahash_request_ctx ( req ) ;
struct omap_sham_ctx * tctx = crypto_tfm_ctx ( req - > base . tfm ) ;
struct omap_sham_dev * dd = tctx - > dd ;
struct omap_sham_dev * dd = ctx - > dd ;
ctx - > op = op ;
@ -1197,7 +1202,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
static int omap_sham_update ( struct ahash_request * req )
{
struct omap_sham_reqctx * ctx = ahash_request_ctx ( req ) ;
struct omap_sham_dev * dd = ctx - > dd ;
struct omap_sham_dev * dd = omap_sham_find_dev ( ctx ) ;
if ( ! req - > nbytes )
return 0 ;
@ -1302,21 +1307,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
struct omap_sham_hmac_ctx * bctx = tctx - > base ;
int bs = crypto_shash_blocksize ( bctx - > shash ) ;
int ds = crypto_shash_digestsize ( bctx - > shash ) ;
struct omap_sham_dev * dd = NULL , * tmp ;
int err , i ;
spin_lock_bh ( & sham . lock ) ;
if ( ! tctx - > dd ) {
list_for_each_entry ( tmp , & sham . dev_list , list ) {
dd = tmp ;
break ;
}
tctx - > dd = dd ;
} else {
dd = tctx - > dd ;
}
spin_unlock_bh ( & sham . lock ) ;
err = crypto_shash_setkey ( tctx - > fallback , key , keylen ) ;
if ( err )
return err ;
@ -1334,7 +1326,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
memset ( bctx - > ipad + keylen , 0 , bs - keylen ) ;
if ( ! test_bit ( FLAGS_AUTO_XOR , & dd - > flags ) ) {
if ( ! test_bit ( FLAGS_AUTO_XOR , & sham . flags ) ) {
memcpy ( bctx - > opad , bctx - > ipad , bs ) ;
for ( i = 0 ; i < bs ; i + + ) {
@ -2073,6 +2065,7 @@ static int omap_sham_probe(struct platform_device *pdev)
}
dd - > flags | = dd - > pdata - > flags ;
sham . flags | = dd - > pdata - > flags ;
pm_runtime_use_autosuspend ( dev ) ;
pm_runtime_set_autosuspend_delay ( dev , DEFAULT_AUTOSUSPEND_DELAY ) ;
@ -2098,6 +2091,9 @@ static int omap_sham_probe(struct platform_device *pdev)
spin_unlock ( & sham . lock ) ;
for ( i = 0 ; i < dd - > pdata - > algs_info_size ; i + + ) {
if ( dd - > pdata - > algs_info [ i ] . registered )
break ;
for ( j = 0 ; j < dd - > pdata - > algs_info [ i ] . size ; j + + ) {
struct ahash_alg * alg ;
@ -2143,9 +2139,11 @@ static int omap_sham_remove(struct platform_device *pdev)
list_del ( & dd - > list ) ;
spin_unlock ( & sham . lock ) ;
for ( i = dd - > pdata - > algs_info_size - 1 ; i > = 0 ; i - - )
for ( j = dd - > pdata - > algs_info [ i ] . registered - 1 ; j > = 0 ; j - - )
for ( j = dd - > pdata - > algs_info [ i ] . registered - 1 ; j > = 0 ; j - - ) {
crypto_unregister_ahash (
& dd - > pdata - > algs_info [ i ] . algs_list [ j ] ) ;
dd - > pdata - > algs_info [ i ] . registered - - ;
}
tasklet_kill ( & dd - > done_task ) ;
pm_runtime_disable ( & pdev - > dev ) ;