@@ -1093,11 +1093,12 @@ static void ipsec_esp_decrypt_hwauth_done(struct device *dev,
1093
1093
*/
1094
1094
static int sg_to_link_tbl_offset (struct scatterlist * sg , int sg_count ,
1095
1095
unsigned int offset , int datalen , int elen ,
1096
- struct talitos_ptr * link_tbl_ptr )
1096
+ struct talitos_ptr * link_tbl_ptr , int align )
1097
1097
{
1098
1098
int n_sg = elen ? sg_count + 1 : sg_count ;
1099
1099
int count = 0 ;
1100
1100
int cryptlen = datalen + elen ;
1101
+ int padding = ALIGN (cryptlen , align ) - cryptlen ;
1101
1102
1102
1103
while (cryptlen && sg && n_sg -- ) {
1103
1104
unsigned int len = sg_dma_len (sg );
@@ -1121,7 +1122,7 @@ static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count,
1121
1122
offset += datalen ;
1122
1123
}
1123
1124
to_talitos_ptr (link_tbl_ptr + count ,
1124
- sg_dma_address (sg ) + offset , len , 0 );
1125
+ sg_dma_address (sg ) + offset , sg_next ( sg ) ? len : len + padding , 0 );
1125
1126
to_talitos_ptr_ext_set (link_tbl_ptr + count , 0 , 0 );
1126
1127
count ++ ;
1127
1128
cryptlen -= len ;
@@ -1144,33 +1145,34 @@ static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src,
1144
1145
unsigned int len , struct talitos_edesc * edesc ,
1145
1146
struct talitos_ptr * ptr , int sg_count ,
1146
1147
unsigned int offset , int tbl_off , int elen ,
1147
- bool force )
1148
+ bool force , int align )
1148
1149
{
1149
1150
struct talitos_private * priv = dev_get_drvdata (dev );
1150
1151
bool is_sec1 = has_ftr_sec1 (priv );
1152
+ int aligned_len = ALIGN (len , align );
1151
1153
1152
1154
if (!src ) {
1153
1155
to_talitos_ptr (ptr , 0 , 0 , is_sec1 );
1154
1156
return 1 ;
1155
1157
}
1156
1158
to_talitos_ptr_ext_set (ptr , elen , is_sec1 );
1157
1159
if (sg_count == 1 && !force ) {
1158
- to_talitos_ptr (ptr , sg_dma_address (src ) + offset , len , is_sec1 );
1160
+ to_talitos_ptr (ptr , sg_dma_address (src ) + offset , aligned_len , is_sec1 );
1159
1161
return sg_count ;
1160
1162
}
1161
1163
if (is_sec1 ) {
1162
- to_talitos_ptr (ptr , edesc -> dma_link_tbl + offset , len , is_sec1 );
1164
+ to_talitos_ptr (ptr , edesc -> dma_link_tbl + offset , aligned_len , is_sec1 );
1163
1165
return sg_count ;
1164
1166
}
1165
1167
sg_count = sg_to_link_tbl_offset (src , sg_count , offset , len , elen ,
1166
- & edesc -> link_tbl [tbl_off ]);
1168
+ & edesc -> link_tbl [tbl_off ], align );
1167
1169
if (sg_count == 1 && !force ) {
1168
1170
/* Only one segment now, so no link tbl needed*/
1169
1171
copy_talitos_ptr (ptr , & edesc -> link_tbl [tbl_off ], is_sec1 );
1170
1172
return sg_count ;
1171
1173
}
1172
1174
to_talitos_ptr (ptr , edesc -> dma_link_tbl +
1173
- tbl_off * sizeof (struct talitos_ptr ), len , is_sec1 );
1175
+ tbl_off * sizeof (struct talitos_ptr ), aligned_len , is_sec1 );
1174
1176
to_talitos_ptr_ext_or (ptr , DESC_PTR_LNKTBL_JUMP , is_sec1 );
1175
1177
1176
1178
return sg_count ;
@@ -1182,7 +1184,7 @@ static int talitos_sg_map(struct device *dev, struct scatterlist *src,
1182
1184
unsigned int offset , int tbl_off )
1183
1185
{
1184
1186
return talitos_sg_map_ext (dev , src , len , edesc , ptr , sg_count , offset ,
1185
- tbl_off , 0 , false);
1187
+ tbl_off , 0 , false, 1 );
1186
1188
}
1187
1189
1188
1190
/*
@@ -1251,7 +1253,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1251
1253
1252
1254
ret = talitos_sg_map_ext (dev , areq -> src , cryptlen , edesc , & desc -> ptr [4 ],
1253
1255
sg_count , areq -> assoclen , tbl_off , elen ,
1254
- false);
1256
+ false, 1 );
1255
1257
1256
1258
if (ret > 1 ) {
1257
1259
tbl_off += ret ;
@@ -1271,7 +1273,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1271
1273
elen = 0 ;
1272
1274
ret = talitos_sg_map_ext (dev , areq -> dst , cryptlen , edesc , & desc -> ptr [5 ],
1273
1275
sg_count , areq -> assoclen , tbl_off , elen ,
1274
- is_ipsec_esp && !encrypt );
1276
+ is_ipsec_esp && !encrypt , 1 );
1275
1277
tbl_off += ret ;
1276
1278
1277
1279
if (!encrypt && is_ipsec_esp ) {
@@ -1577,6 +1579,8 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
1577
1579
bool sync_needed = false;
1578
1580
struct talitos_private * priv = dev_get_drvdata (dev );
1579
1581
bool is_sec1 = has_ftr_sec1 (priv );
1582
+ bool is_ctr = (desc -> hdr & DESC_HDR_SEL0_MASK ) == DESC_HDR_SEL0_AESU &&
1583
+ (desc -> hdr & DESC_HDR_MODE0_AESU_MASK ) == DESC_HDR_MODE0_AESU_CTR ;
1580
1584
1581
1585
/* first DWORD empty */
1582
1586
@@ -1597,8 +1601,8 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
1597
1601
/*
1598
1602
* cipher in
1599
1603
*/
1600
- sg_count = talitos_sg_map (dev , areq -> src , cryptlen , edesc ,
1601
- & desc -> ptr [ 3 ], sg_count , 0 , 0 );
1604
+ sg_count = talitos_sg_map_ext (dev , areq -> src , cryptlen , edesc , & desc -> ptr [ 3 ] ,
1605
+ sg_count , 0 , 0 , 0 , false, is_ctr ? 16 : 1 );
1602
1606
if (sg_count > 1 )
1603
1607
sync_needed = true;
1604
1608
0 commit comments