Patchwork Possible bug in onenand_base ?

login
register
mail settings
Submitter Enric Balletbò i Serra
Date July 12, 2010, 2:59 p.m.
Message ID <AANLkTikDPqoO_VGJtBKWHutPOb60XAIUAYOu7kIRxMyQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/58620/
State New
Headers show

Comments

Enric Balletbò i Serra - July 12, 2010, 2:59 p.m.
Hello,

2010/7/8 Artem Bityutskiy <dedekind1@gmail.com>:
> On Thu, 2010-07-08 at 12:11 +0200, Enric Balletbò i Serra wrote:
>> Hello,
>>
>> 2010/7/8 Artem Bityutskiy <dedekind1@gmail.com>:
>> > On Thu, 2010-07-08 at 11:55 +0200, Enric Balletbò i Serra wrote:
>> >> Hello,
>> >>
>> >> I made new tests regarding this issue. Looks like the problem is
>> >> reading from the OneNAND device.
>> >
>> > Did you try older kernel and then bisecting who is responsible for the
>> > breakage?
>>
>> Yes, before commit
>>
>> 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: Flex-OneNAND support)
>>
>> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=5988af2319781bc8e0ce418affec4e09cfa77907
>>
>> my  OneNAND is working, after the commit, the OneNAND support is broken.
>
> Ok, we could revert it, but it is better to fix it. CCing the author of
> the commit.


Comparing the onenand_base.c file before commit

  5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: Flex-OneNAND support)

and after the commit I made a little patch which seems solves the
issue. The patch has two parts.

The first part replaces line 380 with  'page = (int) (addr >>
this->page_shift);' like before apply the Flex-OneNAND support. I
suppose this is not the better solution, but with this the nandtest
tool works for me. Maybe the author of the commit can clarify this.

The second part (1964) adds two lines which I think are missed when
the Flex-OneNAND support was applied.

                if (ONENAND_IS_2PLANE(this)) {
                        /* Make the even block number */
@@ -1961,6 +1961,9 @@ static int onenand_write_ops_nolock(struct
mtd_info *mtd, loff_t to,

                        /* In partial page write we don't update bufferram */
                        onenand_update_bufferram(mtd, to, !ret && !subpage);
+                       ONENAND_SET_BUFFERRAM1(this);
+                       onenand_update_bufferram(mtd, to +
this->writesize, !ret && !subpage);
+
                        if (ret) {
                                printk(KERN_ERR "%s: write failed %d\n",
                                        __func__, ret);

Best regards,

Enric

Patch

diff --git a/drivers/mtd/onenand/onenand_base.c
b/drivers/mtd/onenand/onenand_base.c
index 26caf25..a39d906 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -377,7 +377,7 @@  static int onenand_command(struct mtd_info *mtd,
int cmd, loff_t addr, size_t le

        default:
                block = onenand_block(this, addr);
-               page = (int) (addr - onenand_addr(this, block)) >>
this->page_shift;
+               page = (int) (addr >> this->page_shift);