[PATCH V3 2/6] pxa3xx_nand: rework irq logic

Lei Wen adrian.wenl at gmail.com
Sun Feb 13 10:46:05 EST 2011


Hi Eric,

On Sun, Feb 13, 2011 at 5:46 PM, Eric Miao <eric.y.miao at gmail.com> wrote:
> Hi Lei,
>
> I like this idea very much. There are several places for improvement,
> though, you mind take a look?
>
>>  static int pxa3xx_nand_dev_ready(struct mtd_info *mtd)
>> @@ -580,14 +582,12 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
>>  {
>>        struct pxa3xx_nand_info *info = mtd->priv;
>>        const struct pxa3xx_nand_cmdset *cmdset = info->cmdset;
>> -       int ret;
>> +       int ret, exec_cmd = 0;
>>
>>        info->use_dma = (use_dma) ? 1 : 0;
>>        info->use_ecc = 0;
>>        info->data_size = 0;
>> -       info->state = STATE_READY;
>> -
>> -       init_completion(&info->cmd_complete);
>> +       info->state = 0;
>>
>>        switch (command) {
>>        case NAND_CMD_READOOB:
>> @@ -596,14 +596,12 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
>>                info->buf_start = mtd->writesize + column;
>>                memset(info->data_buff, 0xFF, info->buf_count);
>>
>> -               if (prepare_read_prog_cmd(info, cmdset->read1, column, page_addr))
>> -                       break;
>> -
>> -               pxa3xx_nand_do_cmd(info, NDSR_RDDREQ | NDSR_DBERR | NDSR_SBERR);
>> -
>> +               prepare_read_prog_cmd(info, cmdset->read1, column, page_addr);
>>                /* We only are OOB, so if the data has error, does not matter */
>>                if (info->retcode == ERR_DBERR)
>>                        info->retcode = ERR_NONE;
>
> Note the above statement is executed after a do_cmd() is done, so
> info->retcode contains a valid return code. While the actual code
> to perform the command has been moved to below.

It is my fault not delete those line here...
In my following 0004 patch, I would unify the prepare step into one function.
BTW, for OOB data, I think we also shouldn't omit the DB error.
Like BCH crc algorithm, it also protect the oob area, so it is reasonable to
be aware that area...
>
> For each transaction, there are three steps:
>
>  1. prepare/fill the command
>  2. perform the command
>  3. handle the return status
>
> I actually though of merging steps 2) and 3) together, but step
> 3) could be different, and that the timeout for different type of
> commands might be different, that's why I introduced the do_cmd()
> function.

I agree. :)
That is what I want to do in this patch set, unify the prepare behavior
into one function, and then execute it.

>
>> +
>> +               exec_cmd = 1;
>
> Maybe for those cases where commands are not executed, just simply
> return will avoid introducing this exec_cmd variable.

For I unify the prepare process into one function according to different
command, simply return would be unable to notify the execute action...
The exec_cmd would be made as the return value for the prepare function.

>
> .....
>
>> @@ -807,10 +795,7 @@ static int __readid(struct pxa3xx_nand_info *info, uint32_t *id)
>>        uint32_t ndcr;
>>        uint8_t  id_buff[8];
>>
>
> I saw __readid() is replaced by pxa3xx_nand_cmdfunc(NAND_CMD_READID)
> in the code below.  Is it possible to completely remove this function
> now??

I made the remove behavior in the patch 0003. :)

Thanks,
Lei



More information about the linux-mtd mailing list