hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c
....@@ -149,6 +149,7 @@
149149 int max_ecc_strength;
150150 u32 *oob_buf;
151151 u32 *page_buf;
152
+ struct mtd_info *mtd;
152153 };
153154
154155 static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl)
....@@ -348,7 +349,7 @@
348349 if (bch_st & NANDC_V6_BCH0_ST_ERR ||
349350 bch_st & NANDC_V6_BCH1_ST_ERR) {
350351 mtd->ecc_stats.failed++;
351
- max_bitflips = -1;
352
+ max_bitflips = 0;
352353 } else {
353354 ret = NANDC_V6_ECC_ERR_CNT0(bch_st);
354355 mtd->ecc_stats.corrected += ret;
....@@ -599,15 +600,6 @@
599600 if (max_strength > nfc->max_ecc_strength)
600601 max_strength = nfc->max_ecc_strength;
601602
602
- nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA);
603
- if (!nfc->page_buf)
604
- return -ENOMEM;
605
- nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA);
606
- if (!nfc->oob_buf) {
607
- kfree(nfc->page_buf);
608
- return -ENOMEM;
609
- }
610
-
611603 for (i = 0; i < ARRAY_SIZE(strengths); i++)
612604 if (max_strength >= strengths[i])
613605 break;
....@@ -617,6 +609,15 @@
617609 return -ENOTSUPP;
618610 }
619611
612
+ nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize));
613
+ if (!nfc->page_buf)
614
+ return -ENOMEM;
615
+ nfc->oob_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128));
616
+ if (!nfc->oob_buf) {
617
+ free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize));
618
+ return -ENOMEM;
619
+ }
620
+ nfc->mtd = mtd;
620621 nfc->ecc_mode = strengths[i];
621622 rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode);
622623
....@@ -951,10 +952,11 @@
951952 static int rk_nfc_remove(struct platform_device *pdev)
952953 {
953954 struct rk_nfc *nfc = platform_get_drvdata(pdev);
955
+ struct nand_chip *nand = mtd_to_nand(nfc->mtd);
954956
955957 rk_nand_chips_cleanup(nfc);
956
- kfree(nfc->page_buf);
957
- kfree(nfc->oob_buf);
958
+ free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize));
959
+ free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128));
958960 clk_disable_unprepare(nfc->clk);
959961 clk_disable_unprepare(nfc->hclk);
960962 if (!(IS_ERR(nfc->gclk)))