Error handling in spi-nor and dealing with short reads/writes

Heiner Kallweit hkallweit1 at gmail.com
Wed Nov 18 12:54:55 PST 2015


Am 18.11.2015 um 01:45 schrieb Brian Norris:
> Hi Heiner,
> 
> I see you've sent followup patches for this already. Haven't had a
> chance to look at them fully yet, but I can answer a bit.
> 
> On Wed, Oct 07, 2015 at 09:41:37PM +0200, Heiner Kallweit wrote:
>> I stumbled across some missing error handling in spi-nor and when having a look at the
>> list archive I found some proposed patches and related discussions.
> 
> Looking at this?
> 
> http://lists.infradead.org/pipermail/linux-mtd/2015-August/061058.html

Yes, I refered to this mail thread. Especially this mail:
https://lkml.org/lkml/2015/5/22/94
> 
> (Unfortunately, this series got dropped by patchwork:
> http://patchwork.ozlabs.org/project/linux-mtd/list/)
> 
>> However it seems like there was no result, at least I didn't find accepted patches
>> dealing with this issue.
> 
> Yes, they haven't been accepted yet. IIRC, they partly had to do with
> buggy SPI drivers, and so it was hard to get things straight when the
> submitter just wanted to paper over driver bugs. I haven't had the
> incentive or time to properly revisit the later versions of those
> patches. But I may review/merge them soon, and it looks like that may
> conflict with your patches.
> 
> It'd be great if you could review those patches.
> 
Sure, I'll have a look.

>> To summarize few issues:
>>
>> 1. I didn't find any clear definition how the read / write callbacks in spi_nor and mtd_info
>>    are supposed to handle the retlen argument (returning the actual length of the current
>>    transfer or adding it to the current value of *retlen).
> 
> Yeah...they're not extremely well specified. mtd_info, at least, has a
> fairly well established de facto specification, but spi-nor might be a
> bit more inconsistent.
> 
>>    Maybe due to this missing specification there are different implementations of the read
>>    callback in spi_nor:
>>    m25p80_read: sets *retlen to the actual length of the current transfer
>>    nxp_spifi_read: adds it to *retlen
>>    fsl_qspi_read: adds it to *retlen
>>    Luckily this has no impact so far as mtd_read initializes *retlen to 0 before calling
>>    the _read callback (once).
> 
> Right, all MTD users assume that the core MTD code initializes *retlen.
> That was done because otherwise, the initialization was done
> inconsistently across all drivers.
> 
>> 2. The write callback in spi_nor is defined with a void return type and doesn't allow to
>>    handle the case of a failing transfer.
> 
> That one has been odd to me.
> 
>> 3. It's unclear at which layer incomplete reads/writes are acceptable (and therefore which
>>    layer can / should loop to assemble chunks).
> 
> Yep.
> 
>> My 2ct:
>>
>> 1. They should return the actual length of the current transfer in *retlen.
> 
> Seems reasonable.
> 
>>    In case of a partial transfer they should return an error (e.g. -EIO or -EMSGSIZE).
>>    This allows the caller to identify a partial transfer and the amount of
>>    bytes successfully transferred. Then the caller can decide whether he wants
>>    to retry for the failed part of the transfer and later assemble the chunks.
> 
> I don't think we want to handle both errors and *retlen; those are
> mutually exclusive. If we have to negotiate a max message size for some
> reason, that's a different story.

I have to admit that when thinking about assembling read chunks I had the fsl-espi
controller in mind which has a 64K message size limitation.
Currently this limitation is handled in the controller driver using ugly implicit
assumptions (bytes 2-4 in a message are assumed to be a SPI NOR 3-byte address etc.)

I'll send a proposal for handling such limitations in a structured way and I'll
involve Mark as it touches the spi_master struct.
> 
>> 2. Make it return int (like _write in mtd_info).
> 
> I assume 'it' is spi_nor->_write() callback. Then yes.
> 
>> 3. I prefer to handle read chunks in spi_nor_read (submitted a related patch already).
> 
> Sounds OK.
> 
>>    Not sure whether it would make sense to add chunk handling also for writes.
>>    I'm not aware of any controller which is not able to transfer at least a single page
>>    at once.
> 
> At most, we should just make sure the error reporting and *retlen
> handling is correct, and if drivers run into problems, then we can talk.
> For one, you sometimes get less wear reliability from NOR flash when
> writing in smaller-than-page-size chunks, so we shouldn't encourage it.
> 
>> This is meant as a RfC. Also I may have missed important parts of the discussion.
>> Appreciate any hint or comment.
> 
> Brian
> 
Heiner




More information about the linux-mtd mailing list