.. | .. |
---|
144 | 144 | int max_ecc_strength; |
---|
145 | 145 | u32 *oob_buf; |
---|
146 | 146 | u32 *page_buf; |
---|
| 147 | + struct mtd_info *mtd; |
---|
147 | 148 | }; |
---|
148 | 149 | |
---|
149 | 150 | static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl) |
---|
.. | .. |
---|
338 | 339 | if (bch_st & NANDC_V9_BCH0_ST_ERR || |
---|
339 | 340 | bch_st & NANDC_V9_BCH1_ST_ERR) { |
---|
340 | 341 | mtd->ecc_stats.failed++; |
---|
341 | | - max_bitflips = -1; |
---|
| 342 | + max_bitflips = 0; |
---|
342 | 343 | } else { |
---|
343 | 344 | ret = NANDC_V9_ECC_ERR_CNT0(bch_st); |
---|
344 | 345 | mtd->ecc_stats.corrected += ret; |
---|
.. | .. |
---|
584 | 585 | if (max_strength > nfc->max_ecc_strength) |
---|
585 | 586 | max_strength = nfc->max_ecc_strength; |
---|
586 | 587 | |
---|
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 | | - |
---|
596 | 588 | for (i = 0; i < ARRAY_SIZE(strengths); i++) |
---|
597 | 589 | if (max_strength >= strengths[i]) |
---|
598 | 590 | break; |
---|
.. | .. |
---|
602 | 594 | return -ENOTSUPP; |
---|
603 | 595 | } |
---|
604 | 596 | |
---|
| 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; |
---|
605 | 606 | nfc->ecc_mode = strengths[i]; |
---|
606 | 607 | rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode); |
---|
607 | 608 | |
---|
.. | .. |
---|
936 | 937 | static int rk_nfc_remove(struct platform_device *pdev) |
---|
937 | 938 | { |
---|
938 | 939 | struct rk_nfc *nfc = platform_get_drvdata(pdev); |
---|
| 940 | + struct nand_chip *nand = mtd_to_nand(nfc->mtd); |
---|
939 | 941 | |
---|
940 | 942 | 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)); |
---|
943 | 945 | clk_disable_unprepare(nfc->clk); |
---|
944 | 946 | clk_disable_unprepare(nfc->hclk); |
---|
945 | 947 | if (!(IS_ERR(nfc->gclk))) |
---|