@@ -272,6 +272,7 @@ struct stm32_fmc2_nfc {
272272 struct sg_table dma_data_sg ;
273273 struct sg_table dma_ecc_sg ;
274274 u8 * ecc_buf ;
275+ dma_addr_t dma_ecc_addr ;
275276 int dma_ecc_len ;
276277 u32 tx_dma_max_burst ;
277278 u32 rx_dma_max_burst ;
@@ -902,17 +903,10 @@ static int stm32_fmc2_nfc_xfer(struct nand_chip *chip, const u8 *buf,
902903
903904 if (!write_data && !raw ) {
904905 /* Configure DMA ECC status */
905- p = nfc -> ecc_buf ;
906906 for_each_sg (nfc -> dma_ecc_sg .sgl , sg , eccsteps , s ) {
907- sg_set_buf (sg , p , nfc -> dma_ecc_len );
908- p += nfc -> dma_ecc_len ;
909- }
910-
911- ret = dma_map_sg (nfc -> dev , nfc -> dma_ecc_sg .sgl ,
912- eccsteps , dma_data_dir );
913- if (!ret ) {
914- ret = - EIO ;
915- goto err_unmap_data ;
907+ sg_dma_address (sg ) = nfc -> dma_ecc_addr +
908+ s * nfc -> dma_ecc_len ;
909+ sg_dma_len (sg ) = nfc -> dma_ecc_len ;
916910 }
917911
918912 desc_ecc = dmaengine_prep_slave_sg (nfc -> dma_ecc_ch ,
@@ -921,15 +915,15 @@ static int stm32_fmc2_nfc_xfer(struct nand_chip *chip, const u8 *buf,
921915 DMA_PREP_INTERRUPT );
922916 if (!desc_ecc ) {
923917 ret = - ENOMEM ;
924- goto err_unmap_ecc ;
918+ goto err_unmap_data ;
925919 }
926920
927921 reinit_completion (& nfc -> dma_ecc_complete );
928922 desc_ecc -> callback = stm32_fmc2_nfc_dma_callback ;
929923 desc_ecc -> callback_param = & nfc -> dma_ecc_complete ;
930924 ret = dma_submit_error (dmaengine_submit (desc_ecc ));
931925 if (ret )
932- goto err_unmap_ecc ;
926+ goto err_unmap_data ;
933927
934928 dma_async_issue_pending (nfc -> dma_ecc_ch );
935929 }
@@ -949,7 +943,7 @@ static int stm32_fmc2_nfc_xfer(struct nand_chip *chip, const u8 *buf,
949943 if (!write_data && !raw )
950944 dmaengine_terminate_all (nfc -> dma_ecc_ch );
951945 ret = - ETIMEDOUT ;
952- goto err_unmap_ecc ;
946+ goto err_unmap_data ;
953947 }
954948
955949 /* Wait DMA data transfer completion */
@@ -969,11 +963,6 @@ static int stm32_fmc2_nfc_xfer(struct nand_chip *chip, const u8 *buf,
969963 }
970964 }
971965
972- err_unmap_ecc :
973- if (!write_data && !raw )
974- dma_unmap_sg (nfc -> dev , nfc -> dma_ecc_sg .sgl ,
975- eccsteps , dma_data_dir );
976-
977966err_unmap_data :
978967 dma_unmap_sg (nfc -> dev , nfc -> dma_data_sg .sgl , eccsteps , dma_data_dir );
979968
@@ -996,9 +985,21 @@ static int stm32_fmc2_nfc_seq_write(struct nand_chip *chip, const u8 *buf,
996985
997986 /* Write oob */
998987 if (oob_required ) {
999- ret = nand_change_write_column_op (chip , mtd -> writesize ,
1000- chip -> oob_poi , mtd -> oobsize ,
1001- false);
988+ unsigned int offset_in_page = mtd -> writesize ;
989+ const void * buf = chip -> oob_poi ;
990+ unsigned int len = mtd -> oobsize ;
991+
992+ if (!raw ) {
993+ struct mtd_oob_region oob_free ;
994+
995+ mtd_ooblayout_free (mtd , 0 , & oob_free );
996+ offset_in_page += oob_free .offset ;
997+ buf += oob_free .offset ;
998+ len = oob_free .length ;
999+ }
1000+
1001+ ret = nand_change_write_column_op (chip , offset_in_page ,
1002+ buf , len , false);
10021003 if (ret )
10031004 return ret ;
10041005 }
@@ -1610,7 +1611,8 @@ static int stm32_fmc2_nfc_dma_setup(struct stm32_fmc2_nfc *nfc)
16101611 return ret ;
16111612
16121613 /* Allocate a buffer to store ECC status registers */
1613- nfc -> ecc_buf = devm_kzalloc (nfc -> dev , FMC2_MAX_ECC_BUF_LEN , GFP_KERNEL );
1614+ nfc -> ecc_buf = dmam_alloc_coherent (nfc -> dev , FMC2_MAX_ECC_BUF_LEN ,
1615+ & nfc -> dma_ecc_addr , GFP_KERNEL );
16141616 if (!nfc -> ecc_buf )
16151617 return - ENOMEM ;
16161618
0 commit comments