[flashrom] [PATCH] ICH SPI Preop handling

FENG Yu Ning fengyuning1984 at gmail.com
Wed Sep 16 17:49:29 CEST 2009


Carl-Daniel Hailfinger wrote:
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
>
> Index: flashrom-ich9_multicommand_preop/ichspi.c
> ===================================================================
> --- flashrom-ich9_multicommand_preop/ichspi.c   (Revision 725)
> +++ flashrom-ich9_multicommand_preop/ichspi.c   (Arbeitskopie)
> @@ -745,18 +745,25 @@
>  int ich_spi_send_multicommand(struct spi_command *spicommands)
>  {
>        int ret = 0;
> +       int oppos, preoppos;
>        while ((spicommands->writecnt || spicommands->readcnt) && !ret) {
> +               /* Will the next loop iteration be taken? */
> +               if ((spicommands + 1)->writecnt || (spicommands + 1)->readcnt) {

Are we sure there is a (spicommands + 1)?

> +                       preoppos = find_preop(curopcodes, spicommands->writearr[0]);
> +                       oppos = find_opcode(curopcodes, (spicommands + 1)->writearr[0]);
> +                       /* Is the current op a preop for the next op? */

s/current op/current byte/
easier to parse?

> +                       if ((oppos != -1) && (preoppos != -1) &&
> +                           (curopcodes->opcode[oppos].atomic == preoppos)) {
> +                               printf_debug("opcode 0x%02x will be run as PREOP\n",
> +                                            spicommands->writearr[0]);
> +                               ret = 0;
> +                               spicommands++;
> +                               continue;
> +                       }
> +               }
> +
>                ret = ich_spi_send_command(spicommands->writecnt, spicommands->readcnt,
>                                           spicommands->writearr, spicommands->readarr);
> -               /* This awful hack needs to be smarter.
> -                */
> -               if ((ret == SPI_INVALID_OPCODE) &&
> -                   ((spicommands->writearr[0] == JEDEC_WREN) ||
> -                    (spicommands->writearr[0] == JEDEC_EWSR))) {
> -                       printf_debug(" due to SPI master limitation, ignoring"
> -                                    " and hoping it will be run as PREOP\n");
> -                       ret = 0;
> -               }
>                spicommands++;
>        }
>        return ret;
>

I will write it this way:

int ich_spi_send_multicommand(struct spi_command *cmd)
{
        int ret, op, pre;
        /* better if I could write cmd->wcnt, cmd->rcnt */
        for (; cmd->writecnt || cmd->readcnt; cmd++) {
                /* if we are sure there is a (cmd + 1) */
                if ((cmd + 1)->writecnt || (cmd + 1)->readcnt) {
                        /* my bad to invent this eye-hurting 'curopcodes' */
                        pre = find_preop (curopcodes,  cmd->writearr[0]);
                        op  = find_opcode(curopcodes, (cmd + 1)->writearr[0]);
                        if ((op != -1) && (pre != -1) &&
                            /* see struct _OPCODE comments, atomic
value is error prone.
                               I am considering flattening struct
OPCODES, so that we can
                               write curop[i].atomic and curpre[i]
instead of this looong
                               expression */
                            (curopcodes->opcode[op].atomic-- == pre))
                                continue;
                }

                ret = ich_spi_send_command(cmd->writecnt, cmd->readcnt,
                                           cmd->writearr, cmd->readarr);
                if (ret) break;
        }
        return ret;
}

do you think it is easier to read?

yu ning




More information about the flashrom mailing list