@@ -44,6 +44,11 @@ struct caam_rng_ctx {
44
44
struct kfifo fifo ;
45
45
};
46
46
47
+ struct caam_rng_job_ctx {
48
+ struct completion * done ;
49
+ int * err ;
50
+ };
51
+
47
52
static struct caam_rng_ctx * to_caam_rng_ctx (struct hwrng * r )
48
53
{
49
54
return (struct caam_rng_ctx * )r -> priv ;
@@ -52,12 +57,12 @@ static struct caam_rng_ctx *to_caam_rng_ctx(struct hwrng *r)
52
57
static void caam_rng_done (struct device * jrdev , u32 * desc , u32 err ,
53
58
void * context )
54
59
{
55
- struct completion * done = context ;
60
+ struct caam_rng_job_ctx * jctx = context ;
56
61
57
62
if (err )
58
- caam_jr_strstatus (jrdev , err );
63
+ * jctx -> err = caam_jr_strstatus (jrdev , err );
59
64
60
- complete (done );
65
+ complete (jctx -> done );
61
66
}
62
67
63
68
static u32 * caam_init_desc (u32 * desc , dma_addr_t dst_dma , int len )
@@ -80,7 +85,11 @@ static int caam_rng_read_one(struct device *jrdev,
80
85
struct completion * done )
81
86
{
82
87
dma_addr_t dst_dma ;
83
- int err ;
88
+ int err , ret = 0 ;
89
+ struct caam_rng_job_ctx jctx = {
90
+ .done = done ,
91
+ .err = & ret ,
92
+ };
84
93
85
94
len = min_t (int , len , CAAM_RNG_MAX_FIFO_STORE_SIZE );
86
95
@@ -93,15 +102,15 @@ static int caam_rng_read_one(struct device *jrdev,
93
102
init_completion (done );
94
103
err = caam_jr_enqueue (jrdev ,
95
104
caam_init_desc (desc , dst_dma , len ),
96
- caam_rng_done , done );
105
+ caam_rng_done , & jctx );
97
106
if (err == - EINPROGRESS ) {
98
107
wait_for_completion (done );
99
108
err = 0 ;
100
109
}
101
110
102
111
dma_unmap_single (jrdev , dst_dma , len , DMA_FROM_DEVICE );
103
112
104
- return err ?: len ;
113
+ return err ?: ( ret ?: len ) ;
105
114
}
106
115
107
116
static void caam_rng_fill_async (struct caam_rng_ctx * ctx )
0 commit comments