hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c
....@@ -144,6 +144,7 @@
144144 int max_ecc_strength;
145145 u32 *oob_buf;
146146 u32 *page_buf;
147
+ struct mtd_info *mtd;
147148 };
148149
149150 static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl)
....@@ -338,7 +339,7 @@
338339 if (bch_st & NANDC_V9_BCH0_ST_ERR ||
339340 bch_st & NANDC_V9_BCH1_ST_ERR) {
340341 mtd->ecc_stats.failed++;
341
- max_bitflips = -1;
342
+ max_bitflips = 0;
342343 } else {
343344 ret = NANDC_V9_ECC_ERR_CNT0(bch_st);
344345 mtd->ecc_stats.corrected += ret;
....@@ -584,15 +585,6 @@
584585 if (max_strength > nfc->max_ecc_strength)
585586 max_strength = nfc->max_ecc_strength;
586587
587
- nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA);
588
- if (!nfc->page_buf)
589
- return -ENOMEM;
590
- nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA);
591
- if (!nfc->oob_buf) {
592
- kfree(nfc->page_buf);
593
- return -ENOMEM;
594
- }
595
-
596588 for (i = 0; i < ARRAY_SIZE(strengths); i++)
597589 if (max_strength >= strengths[i])
598590 break;
....@@ -602,6 +594,15 @@
602594 return -ENOTSUPP;
603595 }
604596
597
+ nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize));
598
+ if (!nfc->page_buf)
599
+ return -ENOMEM;
600
+ nfc->oob_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128));
601
+ if (!nfc->oob_buf) {
602
+ free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize));
603
+ return -ENOMEM;
604
+ }
605
+ nfc->mtd = mtd;
605606 nfc->ecc_mode = strengths[i];
606607 rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode);
607608
....@@ -936,10 +937,11 @@
936937 static int rk_nfc_remove(struct platform_device *pdev)
937938 {
938939 struct rk_nfc *nfc = platform_get_drvdata(pdev);
940
+ struct nand_chip *nand = mtd_to_nand(nfc->mtd);
939941
940942 rk_nand_chips_cleanup(nfc);
941
- kfree(nfc->page_buf);
942
- kfree(nfc->oob_buf);
943
+ free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize));
944
+ free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128));
943945 clk_disable_unprepare(nfc->clk);
944946 clk_disable_unprepare(nfc->hclk);
945947 if (!(IS_ERR(nfc->gclk)))