@@ -63,6 +63,14 @@ static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
63
63
ptr -> eptr = upper_32_bits (dma_addr );
64
64
}
65
65
66
+ static void copy_talitos_ptr (struct talitos_ptr * dst_ptr ,
67
+ struct talitos_ptr * src_ptr , bool is_sec1 )
68
+ {
69
+ dst_ptr -> ptr = src_ptr -> ptr ;
70
+ if (!is_sec1 )
71
+ dst_ptr -> eptr = src_ptr -> eptr ;
72
+ }
73
+
66
74
static void to_talitos_ptr_len (struct talitos_ptr * ptr , unsigned int len ,
67
75
bool is_sec1 )
68
76
{
@@ -1083,21 +1091,20 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1083
1091
sg_count = dma_map_sg (dev , areq -> src , edesc -> src_nents ?: 1 ,
1084
1092
(areq -> src == areq -> dst ) ? DMA_BIDIRECTIONAL
1085
1093
: DMA_TO_DEVICE );
1086
-
1087
1094
/* hmac data */
1088
1095
desc -> ptr [1 ].len = cpu_to_be16 (areq -> assoclen );
1089
1096
if (sg_count > 1 &&
1090
1097
(ret = sg_to_link_tbl_offset (areq -> src , sg_count , 0 ,
1091
1098
areq -> assoclen ,
1092
1099
& edesc -> link_tbl [tbl_off ])) > 1 ) {
1093
- tbl_off += ret ;
1094
-
1095
1100
to_talitos_ptr (& desc -> ptr [1 ], edesc -> dma_link_tbl + tbl_off *
1096
1101
sizeof (struct talitos_ptr ), 0 );
1097
1102
desc -> ptr [1 ].j_extent = DESC_PTR_LNKTBL_JUMP ;
1098
1103
1099
1104
dma_sync_single_for_device (dev , edesc -> dma_link_tbl ,
1100
1105
edesc -> dma_len , DMA_BIDIRECTIONAL );
1106
+
1107
+ tbl_off += ret ;
1101
1108
} else {
1102
1109
to_talitos_ptr (& desc -> ptr [1 ], sg_dma_address (areq -> src ), 0 );
1103
1110
desc -> ptr [1 ].j_extent = 0 ;
@@ -1126,20 +1133,24 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1126
1133
if (edesc -> desc .hdr & DESC_HDR_MODE1_MDEU_CICV )
1127
1134
sg_link_tbl_len += authsize ;
1128
1135
1129
- if (sg_count > 1 &&
1130
- (ret = sg_to_link_tbl_offset (areq -> src , sg_count , areq -> assoclen ,
1131
- sg_link_tbl_len ,
1132
- & edesc -> link_tbl [tbl_off ])) > 1 ) {
1133
- tbl_off += ret ;
1136
+ if (sg_count == 1 ) {
1137
+ to_talitos_ptr (& desc -> ptr [4 ], sg_dma_address (areq -> src ) +
1138
+ areq -> assoclen , 0 );
1139
+ } else if ((ret = sg_to_link_tbl_offset (areq -> src , sg_count ,
1140
+ areq -> assoclen , sg_link_tbl_len ,
1141
+ & edesc -> link_tbl [tbl_off ])) >
1142
+ 1 ) {
1134
1143
desc -> ptr [4 ].j_extent |= DESC_PTR_LNKTBL_JUMP ;
1135
1144
to_talitos_ptr (& desc -> ptr [4 ], edesc -> dma_link_tbl +
1136
1145
tbl_off *
1137
1146
sizeof (struct talitos_ptr ), 0 );
1138
1147
dma_sync_single_for_device (dev , edesc -> dma_link_tbl ,
1139
1148
edesc -> dma_len ,
1140
1149
DMA_BIDIRECTIONAL );
1141
- } else
1142
- to_talitos_ptr (& desc -> ptr [4 ], sg_dma_address (areq -> src ), 0 );
1150
+ tbl_off += ret ;
1151
+ } else {
1152
+ copy_talitos_ptr (& desc -> ptr [4 ], & edesc -> link_tbl [tbl_off ], 0 );
1153
+ }
1143
1154
1144
1155
/* cipher out */
1145
1156
desc -> ptr [5 ].len = cpu_to_be16 (cryptlen );
@@ -1151,11 +1162,13 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1151
1162
1152
1163
edesc -> icv_ool = false;
1153
1164
1154
- if (sg_count > 1 &&
1155
- (sg_count = sg_to_link_tbl_offset (areq -> dst , sg_count ,
1165
+ if (sg_count == 1 ) {
1166
+ to_talitos_ptr (& desc -> ptr [5 ], sg_dma_address (areq -> dst ) +
1167
+ areq -> assoclen , 0 );
1168
+ } else if ((sg_count =
1169
+ sg_to_link_tbl_offset (areq -> dst , sg_count ,
1156
1170
areq -> assoclen , cryptlen ,
1157
- & edesc -> link_tbl [tbl_off ])) >
1158
- 1 ) {
1171
+ & edesc -> link_tbl [tbl_off ])) > 1 ) {
1159
1172
struct talitos_ptr * tbl_ptr = & edesc -> link_tbl [tbl_off ];
1160
1173
1161
1174
to_talitos_ptr (& desc -> ptr [5 ], edesc -> dma_link_tbl +
@@ -1178,8 +1191,9 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1178
1191
edesc -> dma_len , DMA_BIDIRECTIONAL );
1179
1192
1180
1193
edesc -> icv_ool = true;
1181
- } else
1182
- to_talitos_ptr (& desc -> ptr [5 ], sg_dma_address (areq -> dst ), 0 );
1194
+ } else {
1195
+ copy_talitos_ptr (& desc -> ptr [5 ], & edesc -> link_tbl [tbl_off ], 0 );
1196
+ }
1183
1197
1184
1198
/* iv out */
1185
1199
map_single_talitos_ptr (dev , & desc -> ptr [6 ], ivsize , ctx -> iv ,
@@ -2629,21 +2643,11 @@ struct talitos_crypto_alg {
2629
2643
struct talitos_alg_template algt ;
2630
2644
};
2631
2645
2632
- static int talitos_cra_init (struct crypto_tfm * tfm )
2646
+ static int talitos_init_common (struct talitos_ctx * ctx ,
2647
+ struct talitos_crypto_alg * talitos_alg )
2633
2648
{
2634
- struct crypto_alg * alg = tfm -> __crt_alg ;
2635
- struct talitos_crypto_alg * talitos_alg ;
2636
- struct talitos_ctx * ctx = crypto_tfm_ctx (tfm );
2637
2649
struct talitos_private * priv ;
2638
2650
2639
- if ((alg -> cra_flags & CRYPTO_ALG_TYPE_MASK ) == CRYPTO_ALG_TYPE_AHASH )
2640
- talitos_alg = container_of (__crypto_ahash_alg (alg ),
2641
- struct talitos_crypto_alg ,
2642
- algt .alg .hash );
2643
- else
2644
- talitos_alg = container_of (alg , struct talitos_crypto_alg ,
2645
- algt .alg .crypto );
2646
-
2647
2651
/* update context with ptr to dev */
2648
2652
ctx -> dev = talitos_alg -> dev ;
2649
2653
@@ -2661,10 +2665,33 @@ static int talitos_cra_init(struct crypto_tfm *tfm)
2661
2665
return 0 ;
2662
2666
}
2663
2667
2668
+ static int talitos_cra_init (struct crypto_tfm * tfm )
2669
+ {
2670
+ struct crypto_alg * alg = tfm -> __crt_alg ;
2671
+ struct talitos_crypto_alg * talitos_alg ;
2672
+ struct talitos_ctx * ctx = crypto_tfm_ctx (tfm );
2673
+
2674
+ if ((alg -> cra_flags & CRYPTO_ALG_TYPE_MASK ) == CRYPTO_ALG_TYPE_AHASH )
2675
+ talitos_alg = container_of (__crypto_ahash_alg (alg ),
2676
+ struct talitos_crypto_alg ,
2677
+ algt .alg .hash );
2678
+ else
2679
+ talitos_alg = container_of (alg , struct talitos_crypto_alg ,
2680
+ algt .alg .crypto );
2681
+
2682
+ return talitos_init_common (ctx , talitos_alg );
2683
+ }
2684
+
2664
2685
static int talitos_cra_init_aead (struct crypto_aead * tfm )
2665
2686
{
2666
- talitos_cra_init (crypto_aead_tfm (tfm ));
2667
- return 0 ;
2687
+ struct aead_alg * alg = crypto_aead_alg (tfm );
2688
+ struct talitos_crypto_alg * talitos_alg ;
2689
+ struct talitos_ctx * ctx = crypto_aead_ctx (tfm );
2690
+
2691
+ talitos_alg = container_of (alg , struct talitos_crypto_alg ,
2692
+ algt .alg .aead );
2693
+
2694
+ return talitos_init_common (ctx , talitos_alg );
2668
2695
}
2669
2696
2670
2697
static int talitos_cra_init_ahash (struct crypto_tfm * tfm )
0 commit comments