Re: I2C retries

2018-08-30 Thread Christopher Collins
On Thu, Aug 30, 2018 at 11:35:44AM -0700, Vipul Rahane wrote:
> Hey,
> 
> I think that’s a really great idea. One thing I would add is that we
> definitely should honor timeouts in any of the retries. Also, a way to
> disable the retries should be a good idea. Probably making it a syscfg
> which when set to 0 does not do any retries.

Yes, the `timo` parameter should apply to each retry.  That said, I
think a timeout should only occur if there is something wrong with the
I2C bus (e.g., the problem we've seen with the nRF52:
https://github.com/apache/mynewt-core/blob/1702cdeed8d8f718ed75f40961b9b2f37bae2ff3/hw/mcu/nordic/nrf52xxx/src/hal_i2c.c#L314-L325).

> I am assuming the errors codes will be HAL_I2C_ERR_ error codes,
> so all the mcus would have to return the same error codes on errors.

Yes, sounds good.

> Personally, I like calling them retries than tries since if they are
> set to 0 the operation still happens once, but that’s just me.

`retries` it is, then :).

Chris


Re: I2C retries

2018-08-30 Thread Vipul Rahane
Sorry, just read Will’s comment.

Did not want to repeat it. 

- Vipul

> On Aug 30, 2018, at 11:35 AM, Vipul Rahane  wrote:
> 
> Hey,
> 
> I think that’s a really great idea. One thing I would add is that we 
> definitely should honor timeouts in any of the retries. Also, a way to 
> disable the retries should be a good idea. Probably making it a syscfg which 
> when set to 0 does not do any retries.
> 
> I am assuming the errors codes will be HAL_I2C_ERR_ error codes, so all 
> the mcus would have to return the same error codes on errors.
> 
> Personally, I like calling them retries than tries since if they are set to 0 
> the operation still happens once, but that’s just me.
> 
> Regards,
> Vipul Rahane
> 
>> On Aug 30, 2018, at 9:48 AM, will sanfilippo  wrote:
>> 
>> I think my only comment is tries vs retries. You always want to make at 
>> least one try so you would have to set that to 1 every time right? I like 
>> retries personally but that is just me. Mainly because you would never allow 
>> zero for tries.
>> 
>> 
>>> On Aug 30, 2018, at 9:21 AM, Christopher Collins  wrote:
>>> 
>>> On Wed, Aug 29, 2018 at 10:06:37PM -0500, Greg Stein wrote:
 On Wed, Aug 29, 2018 at 8:59 PM Christopher Collins 
 wrote:
 
> Hello all,
> 
> I noticed the HAL master I2C API does not include any retry logic.  As
> you probably know, in I2C, the default state of the SCL line is NACK.
> 
 
 Euh... ACK/NACK is on SDA while the master cycles SCL.
>>> 
>>> Yes, you are right.  Thanks for the correction.
>>> 
>>> [...]
>>> 
 Or that something monkeyed the bus, so the peripheral decided to stop
 receiving/processing. ... Your basic point holds: a peripheral might just
 go away for any number of reasons. I wouldn't even bother with the on_dnack
 flag. Seems better to consider retry at the whole-packet level. It all gets
 sent, or it did not and should be retried.
>>> 
>>> Thank you for the insight.  I am starting to think you are right -
>>> retries should be done by the low-level HAL implementation.  So, my
>>> current thinking is that we should make the following changes:
>>> 
>>> 1. Define a common set of error code for the I2C HAL [1].
>>> 2. Add a single member to the `hal_i2c_master_data` struct: `tries` [2]
>>> 3. Modify the HAL I2C implementations so that they retry up to (tries-1)
>>> times when an unexpected NACK is recieved.
>>> 
>>> [1] We should do the same for the other HAL APIs (i.e., non-I2C), but
>>> that can come later.
>>> 
>>> [2] I prefer specifying number of tries rather than number of retries.
>>> I think it helps avoid some ambiguity.
>>> 
>>> All comments welcome.
>>> 
>>> Thanks,
>>> Chris
>> 
> 



Re: I2C retries

2018-08-30 Thread Vipul Rahane
Hey,

I think that’s a really great idea. One thing I would add is that we definitely 
should honor timeouts in any of the retries. Also, a way to disable the retries 
should be a good idea. Probably making it a syscfg which when set to 0 does not 
do any retries.

I am assuming the errors codes will be HAL_I2C_ERR_ error codes, so all the 
mcus would have to return the same error codes on errors.

Personally, I like calling them retries than tries since if they are set to 0 
the operation still happens once, but that’s just me.

Regards,
Vipul Rahane

> On Aug 30, 2018, at 9:48 AM, will sanfilippo  wrote:
> 
> I think my only comment is tries vs retries. You always want to make at least 
> one try so you would have to set that to 1 every time right? I like retries 
> personally but that is just me. Mainly because you would never allow zero for 
> tries.
> 
> 
>> On Aug 30, 2018, at 9:21 AM, Christopher Collins  wrote:
>> 
>> On Wed, Aug 29, 2018 at 10:06:37PM -0500, Greg Stein wrote:
>>> On Wed, Aug 29, 2018 at 8:59 PM Christopher Collins 
>>> wrote:
>>> 
 Hello all,
 
 I noticed the HAL master I2C API does not include any retry logic.  As
 you probably know, in I2C, the default state of the SCL line is NACK.
 
>>> 
>>> Euh... ACK/NACK is on SDA while the master cycles SCL.
>> 
>> Yes, you are right.  Thanks for the correction.
>> 
>> [...]
>> 
>>> Or that something monkeyed the bus, so the peripheral decided to stop
>>> receiving/processing. ... Your basic point holds: a peripheral might just
>>> go away for any number of reasons. I wouldn't even bother with the on_dnack
>>> flag. Seems better to consider retry at the whole-packet level. It all gets
>>> sent, or it did not and should be retried.
>> 
>> Thank you for the insight.  I am starting to think you are right -
>> retries should be done by the low-level HAL implementation.  So, my
>> current thinking is that we should make the following changes:
>> 
>> 1. Define a common set of error code for the I2C HAL [1].
>> 2. Add a single member to the `hal_i2c_master_data` struct: `tries` [2]
>> 3. Modify the HAL I2C implementations so that they retry up to (tries-1)
>> times when an unexpected NACK is recieved.
>> 
>> [1] We should do the same for the other HAL APIs (i.e., non-I2C), but
>> that can come later.
>> 
>> [2] I prefer specifying number of tries rather than number of retries.
>> I think it helps avoid some ambiguity.
>> 
>> All comments welcome.
>> 
>> Thanks,
>> Chris
> 



Re: I2C retries

2018-08-30 Thread Christopher Collins
On Thu, Aug 30, 2018 at 09:48:32AM -0700, will sanfilippo wrote:
> I think my only comment is tries vs retries. You always want to make
> at least one try so you would have to set that to 1 every time right?
> I like retries personally but that is just me. Mainly because you
> would never allow zero for tries.

That's a good point.  I don't feel too strongly about this.  I think my
mind just prefers to see a `3` in the code when something is attempted
up to three times.

If any other HAL APIs specify tries / retries, we should stay consistent
with them.  Otherwise, I am fine with either.

Chris


Re: I2C retries

2018-08-30 Thread Christopher Collins
On Thu, Aug 30, 2018 at 07:47:34PM +0300, marko kiiskila wrote:
> > On Aug 30, 2018, at 7:21 PM, Christopher Collins  wrote:
> > [1] We should do the same for the other HAL APIs (i.e., non-I2C), but
> > that can come later.
> 
> Not sure this makes sense for other ones, as i2c is the only one with
> ACK.

Perhaps we don't need dedicated status code for the other APIs, but I
think we want to make sure the implementations don't return MCU-specific
errors.

Chris


Re: I2C retries

2018-08-30 Thread marko kiiskila



> On Aug 30, 2018, at 7:21 PM, Christopher Collins  wrote:
> 
> On Wed, Aug 29, 2018 at 10:06:37PM -0500, Greg Stein wrote:
>> On Wed, Aug 29, 2018 at 8:59 PM Christopher Collins 
>> wrote:
>> 
>>> Hello all,
>>> 
>>> I noticed the HAL master I2C API does not include any retry logic.  As
>>> you probably know, in I2C, the default state of the SCL line is NACK.
>>> 
>> 
>> Euh... ACK/NACK is on SDA while the master cycles SCL.
> 
> Yes, you are right.  Thanks for the correction.
> 
> [...]
> 
>> Or that something monkeyed the bus, so the peripheral decided to stop
>> receiving/processing. ... Your basic point holds: a peripheral might just
>> go away for any number of reasons. I wouldn't even bother with the on_dnack
>> flag. Seems better to consider retry at the whole-packet level. It all gets
>> sent, or it did not and should be retried.
> 
> Thank you for the insight.  I am starting to think you are right -
> retries should be done by the low-level HAL implementation.  So, my
> current thinking is that we should make the following changes:
> 
> 1. Define a common set of error code for the I2C HAL [1].
> 2. Add a single member to the `hal_i2c_master_data` struct: `tries` [2]
> 3. Modify the HAL I2C implementations so that they retry up to (tries-1)
> times when an unexpected NACK is recieved.

Sounds good. Extending the struct seems like the natural place to do it.
I don’t think we should worry about binary compatibility.

> [1] We should do the same for the other HAL APIs (i.e., non-I2C), but
> that can come later.

Not sure this makes sense for other ones, as i2c is the only one with
ACK.

> 
> [2] I prefer specifying number of tries rather than number of retries.
> I think it helps avoid some ambiguity.

Seems fine to me.

> 
> All comments welcome.
> 
> Thanks,
> Chris