.. | .. |
---|
149 | 149 | int max_ecc_strength; |
---|
150 | 150 | u32 *oob_buf; |
---|
151 | 151 | u32 *page_buf; |
---|
| 152 | + struct mtd_info *mtd; |
---|
152 | 153 | }; |
---|
153 | 154 | |
---|
154 | 155 | static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl) |
---|
.. | .. |
---|
348 | 349 | if (bch_st & NANDC_V6_BCH0_ST_ERR || |
---|
349 | 350 | bch_st & NANDC_V6_BCH1_ST_ERR) { |
---|
350 | 351 | mtd->ecc_stats.failed++; |
---|
351 | | - max_bitflips = -1; |
---|
| 352 | + max_bitflips = 0; |
---|
352 | 353 | } else { |
---|
353 | 354 | ret = NANDC_V6_ECC_ERR_CNT0(bch_st); |
---|
354 | 355 | mtd->ecc_stats.corrected += ret; |
---|
.. | .. |
---|
599 | 600 | if (max_strength > nfc->max_ecc_strength) |
---|
600 | 601 | max_strength = nfc->max_ecc_strength; |
---|
601 | 602 | |
---|
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 | | - |
---|
611 | 603 | for (i = 0; i < ARRAY_SIZE(strengths); i++) |
---|
612 | 604 | if (max_strength >= strengths[i]) |
---|
613 | 605 | break; |
---|
.. | .. |
---|
617 | 609 | return -ENOTSUPP; |
---|
618 | 610 | } |
---|
619 | 611 | |
---|
| 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; |
---|
620 | 621 | nfc->ecc_mode = strengths[i]; |
---|
621 | 622 | rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode); |
---|
622 | 623 | |
---|
.. | .. |
---|
951 | 952 | static int rk_nfc_remove(struct platform_device *pdev) |
---|
952 | 953 | { |
---|
953 | 954 | struct rk_nfc *nfc = platform_get_drvdata(pdev); |
---|
| 955 | + struct nand_chip *nand = mtd_to_nand(nfc->mtd); |
---|
954 | 956 | |
---|
955 | 957 | 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)); |
---|
958 | 960 | clk_disable_unprepare(nfc->clk); |
---|
959 | 961 | clk_disable_unprepare(nfc->hclk); |
---|
960 | 962 | if (!(IS_ERR(nfc->gclk))) |
---|