@@ -1061,8 +1061,16 @@ mv_xor_channel_add(struct mv_xor_device *xordev,
1061
1061
*/
1062
1062
mv_chan -> dummy_src_addr = dma_map_single (dma_dev -> dev ,
1063
1063
mv_chan -> dummy_src , MV_XOR_MIN_BYTE_COUNT , DMA_FROM_DEVICE );
1064
+ if (dma_mapping_error (dma_dev -> dev , mv_chan -> dummy_src_addr ))
1065
+ return ERR_PTR (- ENOMEM );
1066
+
1064
1067
mv_chan -> dummy_dst_addr = dma_map_single (dma_dev -> dev ,
1065
1068
mv_chan -> dummy_dst , MV_XOR_MIN_BYTE_COUNT , DMA_TO_DEVICE );
1069
+ if (dma_mapping_error (dma_dev -> dev , mv_chan -> dummy_dst_addr )) {
1070
+ ret = - ENOMEM ;
1071
+ goto err_unmap_src ;
1072
+ }
1073
+
1066
1074
1067
1075
/* allocate coherent memory for hardware descriptors
1068
1076
* note: writecombine gives slightly better performance, but
@@ -1071,8 +1079,10 @@ mv_xor_channel_add(struct mv_xor_device *xordev,
1071
1079
mv_chan -> dma_desc_pool_virt =
1072
1080
dma_alloc_wc (& pdev -> dev , MV_XOR_POOL_SIZE , & mv_chan -> dma_desc_pool ,
1073
1081
GFP_KERNEL );
1074
- if (!mv_chan -> dma_desc_pool_virt )
1075
- return ERR_PTR (- ENOMEM );
1082
+ if (!mv_chan -> dma_desc_pool_virt ) {
1083
+ ret = - ENOMEM ;
1084
+ goto err_unmap_dst ;
1085
+ }
1076
1086
1077
1087
/* discover transaction capabilities from the platform data */
1078
1088
dma_dev -> cap_mask = cap_mask ;
@@ -1155,6 +1165,13 @@ mv_xor_channel_add(struct mv_xor_device *xordev,
1155
1165
err_free_dma :
1156
1166
dma_free_coherent (& pdev -> dev , MV_XOR_POOL_SIZE ,
1157
1167
mv_chan -> dma_desc_pool_virt , mv_chan -> dma_desc_pool );
1168
+ err_unmap_dst :
1169
+ dma_unmap_single (dma_dev -> dev , mv_chan -> dummy_dst_addr ,
1170
+ MV_XOR_MIN_BYTE_COUNT , DMA_TO_DEVICE );
1171
+ err_unmap_src :
1172
+ dma_unmap_single (dma_dev -> dev , mv_chan -> dummy_src_addr ,
1173
+ MV_XOR_MIN_BYTE_COUNT , DMA_FROM_DEVICE );
1174
+
1158
1175
return ERR_PTR (ret );
1159
1176
}
1160
1177
0 commit comments