RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-07-02 Thread Paul Walmsley
Hello Ulrik,

On Thu, 25 Jun 2009, Hald, Ulrik Bech wrote:

  -Original Message-
  From: Menon, Nishanth
  Sent: Tuesday, June 23, 2009 3:27 PM
  To: Paul Walmsley; Hald, Ulrik Bech
  Cc: Pakaravoor, Jagadeesh; linux-omap@vger.kernel.org
  Subject: RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR
  event
  
  Paul, Ulrik,
  
  Just adding my view to this discussion:
   -Original Message-
   From: linux-omap-ow...@vger.kernel.org [mailto:linux-omap-
   ow...@vger.kernel.org] On Behalf Of Paul Walmsley
   Sent: Tuesday, June 23, 2009 9:05 PM
   To: Hald, Ulrik Bech
   Cc: Pakaravoor, Jagadeesh; linux-omap@vger.kernel.org
   Subject: RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR
   event

+   u8 stat2 = 0;
+   stat2 = omap_i2c_read_reg(dev,
  OMAP_I2C_STAT_REG);
+   if (stat2  OMAP_I2C_STAT_BB)
+   return IRQ_HANDLED;
  
   Why use stat2? Why not just test stat again?
 
  Stat is read at the beginning of the ISR, what if BB bit gets
  cleared/set a while later, not along with RDR, as a corner case?

 If that is possible, then the comment in this patch needs to be
   changed:

  + /* 3430 I2C Errata 1.15
  +  * RDR could be set when the bus is busy,
  then
  +  * ignore the interrupt, and clear the bit.
  +  */

 This implies that the state of the BB bit is important when the RDR
   bit is
 set.  The closest sample we have for that is the contents of the
   'stat'
 variable.

If I understand it correctly, you're concerned that the wording of the
comment lets one think, that the state of the bus is critical at the
moment the RDR interrupt is set? I guess you're right about that,
  since
the wording could be a little misleading.
  
   My concern is that the comment and the code seem to conflict.
  
The point of the errata workaround is only to prevent handling of the
RDR interrupt, if the bus is busy at the time when the RDR is to be
handled. It doesn't matter if BB has been set/cleared before that.
   
So maybe, the wording of the comment should be:
   
/* 3430 I2C Errata 1.15, 2430 I2C Errata 1.67:
 * RDR should not be handled when bus is busy */
   
?
  
   Yes, that is better.
  
  If we keep it this way, re-reading the register; what could be the
  potential problem?

 It doesn't match the definition of the erratum as expressed in the
 comment.  Is it possible for the RDR bit to be erroneously set when
  BB
   =
 0?
   
Yes, the nature of the errata is that the RDR interrupt could be
spurious. Although, if the bus is not busy and the RDR is set
erroneously (there are no bytes in the FIFO to be drained), then the
normal isr code would just leave and do nothing, which is what we also
need in the errata work around.
  
   Okay.  So it looks like there is a unfixable race here.  Is it possible
   for BB to be 0 during the stat2 read, then for BB to go to 1 immediately
   afterwards?  Then the rest of the RDR handler would be entered.  If this
   is possible, what will the ISR do -- will it hang?
  
   If this assessment of the problem is accurate, the stat2 read shrinks
   the race window, and then indeed seems useful.
  
  
  
  a)   why would bus be busy? - answer bus is busy before a transaction
  starts - each transaction is an atomic operation. If someone goofs around
  with signal while a master is sending/receiving data, there is
  AL(Arbitration Lost).. not Bus busy.
  
 But couldn't the BB bit be set by the I2C controller to signal a new receive 
 transaction has started, while the ISR is still in the process of handling 
 the RDR interrupt?
 
 Anyway, when I look at the code below where the patch is introduced:
 ..
   if (dev-fifo_size) {
   if (stat  OMAP_I2C_STAT_RRDY)
   num_bytes = dev-fifo_size;
   else
   num_bytes = omap_i2c_read_reg(dev,
   OMAP_I2C_BUFSTAT_REG);
   }
   while (num_bytes) {
   num_bytes--;
   w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG);
   if (dev-buf_len) {
   *dev-buf++ = w;
   dev-buf_len--;
   /* Data reg from 2430 is 8 bit wide */
   if (!cpu_is_omap2430() 
   !cpu_is_omap34xx()) {
   if (dev-buf_len

RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-07-02 Thread Paul Walmsley
On Thu, 2 Jul 2009, Paul Walmsley wrote:

 That looks correct on 2430, 3430 where the I2C controller has a FIFO.  
 But for 2420, dev-fifo_size == 0, which causes num_bytes = 1, which will 
 attempt a single read from the I2C controller.  (This assumes that the bug 
 is present on 2420 - do you know if the erratum applies there also?)

Thinking about this further, this shouldn't apply to 2420 since it is 
using the FIFO-less rev 2 I2C, and therefore won't have the RDR bit.
So, I agree with Ulrik: no patch seems necessary for this erratum.

 
 
 - Paul
 --
 To unsubscribe from this list: send the line unsubscribe linux-omap in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 


- Paul
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-06-23 Thread Hald, Ulrik Bech
Hi Paul,

 -Original Message-
 From: Paul Walmsley [mailto:p...@pwsan.com]
 Sent: Monday, June 22, 2009 10:20 PM
 To: Pakaravoor, Jagadeesh
 Cc: Hald, Ulrik Bech; linux-omap@vger.kernel.org
 Subject: RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR
 event
 
 Hello Jagadeesh,
 
 On Tue, 23 Jun 2009, Pakaravoor, Jagadeesh wrote:
 
+   u8 stat2 = 0;
+   stat2 = omap_i2c_read_reg(dev, 
OMAP_I2C_STAT_REG);
+   if (stat2  OMAP_I2C_STAT_BB)
+   return IRQ_HANDLED;
  
   Why use stat2? Why not just test stat again?
 
  Stat is read at the beginning of the ISR, what if BB bit gets
  cleared/set a while later, not along with RDR, as a corner case?
 
 If that is possible, then the comment in this patch needs to be changed:
 
  + /* 3430 I2C Errata 1.15
  +  * RDR could be set when the bus is busy, then
  +  * ignore the interrupt, and clear the bit.
  +  */
 
 This implies that the state of the BB bit is important when the RDR bit is
 set.  The closest sample we have for that is the contents of the 'stat'
 variable.
 
If I understand it correctly, you're concerned that the wording of the comment 
lets one think, that the state of the bus is critical at the moment the RDR 
interrupt is set? I guess you're right about that, since the wording could be a 
little misleading.

The point of the errata workaround is only to prevent handling of the RDR 
interrupt, if the bus is busy at the time when the RDR is to be handled. It 
doesn't matter if BB has been set/cleared before that.

So maybe, the wording of the comment should be:

/* 3430 I2C Errata 1.15, 2430 I2C Errata 1.67:
 * RDR should not be handled when bus is busy */

?

  If we keep it this way, re-reading the register; what could be the
  potential problem?
 
 It doesn't match the definition of the erratum as expressed in the
 comment.  Is it possible for the RDR bit to be erroneously set when BB =
 0?

Yes, the nature of the errata is that the RDR interrupt could be spurious. 
Although, if the bus is not busy and the RDR is set erroneously (there are no 
bytes in the FIFO to be drained), then the normal isr code would just leave and 
do nothing, which is what we also need in the errata work around.

 
 
 - Paul

/Ulrik
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-06-23 Thread Paul Walmsley
Hello Ulrik,

On Tue, 23 Jun 2009, Hald, Ulrik Bech wrote:

  -Original Message-
  From: Paul Walmsley [mailto:p...@pwsan.com]
  Sent: Monday, June 22, 2009 10:20 PM
  To: Pakaravoor, Jagadeesh
  Cc: Hald, Ulrik Bech; linux-omap@vger.kernel.org
  Subject: RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR
  event
  
  Hello Jagadeesh,
  
  On Tue, 23 Jun 2009, Pakaravoor, Jagadeesh wrote:
  
 + u8 stat2 = 0;
 + stat2 = omap_i2c_read_reg(dev, 
 OMAP_I2C_STAT_REG);
 + if (stat2  OMAP_I2C_STAT_BB)
 + return IRQ_HANDLED;
   
Why use stat2? Why not just test stat again?
  
   Stat is read at the beginning of the ISR, what if BB bit gets
   cleared/set a while later, not along with RDR, as a corner case?
  
  If that is possible, then the comment in this patch needs to be changed:
  
   + /* 3430 I2C Errata 1.15
   +  * RDR could be set when the bus is busy, then
   +  * ignore the interrupt, and clear the bit.
   +  */
  
  This implies that the state of the BB bit is important when the RDR bit is
  set.  The closest sample we have for that is the contents of the 'stat'
  variable.
  
 If I understand it correctly, you're concerned that the wording of the 
 comment lets one think, that the state of the bus is critical at the 
 moment the RDR interrupt is set? I guess you're right about that, since 
 the wording could be a little misleading.

My concern is that the comment and the code seem to conflict.

 The point of the errata workaround is only to prevent handling of the 
 RDR interrupt, if the bus is busy at the time when the RDR is to be 
 handled. It doesn't matter if BB has been set/cleared before that.
 
 So maybe, the wording of the comment should be:
 
 /* 3430 I2C Errata 1.15, 2430 I2C Errata 1.67:
  * RDR should not be handled when bus is busy */
 
 ?

Yes, that is better.

   If we keep it this way, re-reading the register; what could be the
   potential problem?
  
  It doesn't match the definition of the erratum as expressed in the
  comment.  Is it possible for the RDR bit to be erroneously set when BB =
  0?
 
 Yes, the nature of the errata is that the RDR interrupt could be 
 spurious. Although, if the bus is not busy and the RDR is set 
 erroneously (there are no bytes in the FIFO to be drained), then the 
 normal isr code would just leave and do nothing, which is what we also 
 need in the errata work around.

Okay.  So it looks like there is a unfixable race here.  Is it possible 
for BB to be 0 during the stat2 read, then for BB to go to 1 immediately 
afterwards?  Then the rest of the RDR handler would be entered.  If this 
is possible, what will the ISR do -- will it hang?

If this assessment of the problem is accurate, the stat2 read shrinks 
the race window, and then indeed seems useful.


- Paul
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-06-23 Thread Menon, Nishanth
Paul, Ulrik,

Just adding my view to this discussion:
 -Original Message-
 From: linux-omap-ow...@vger.kernel.org [mailto:linux-omap-
 ow...@vger.kernel.org] On Behalf Of Paul Walmsley
 Sent: Tuesday, June 23, 2009 9:05 PM
 To: Hald, Ulrik Bech
 Cc: Pakaravoor, Jagadeesh; linux-omap@vger.kernel.org
 Subject: RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR
 event
  
  +   u8 stat2 = 0;
  +   stat2 = omap_i2c_read_reg(dev, 
  OMAP_I2C_STAT_REG);
  +   if (stat2  OMAP_I2C_STAT_BB)
  +   return IRQ_HANDLED;

 Why use stat2? Why not just test stat again?
   
Stat is read at the beginning of the ISR, what if BB bit gets
cleared/set a while later, not along with RDR, as a corner case?
  
   If that is possible, then the comment in this patch needs to be
 changed:
  
+ /* 3430 I2C Errata 1.15
+  * RDR could be set when the bus is busy, then
+  * ignore the interrupt, and clear the bit.
+  */
  
   This implies that the state of the BB bit is important when the RDR
 bit is
   set.  The closest sample we have for that is the contents of the
 'stat'
   variable.
  
  If I understand it correctly, you're concerned that the wording of the
  comment lets one think, that the state of the bus is critical at the
  moment the RDR interrupt is set? I guess you're right about that, since
  the wording could be a little misleading.
 
 My concern is that the comment and the code seem to conflict.
 
  The point of the errata workaround is only to prevent handling of the
  RDR interrupt, if the bus is busy at the time when the RDR is to be
  handled. It doesn't matter if BB has been set/cleared before that.
 
  So maybe, the wording of the comment should be:
 
  /* 3430 I2C Errata 1.15, 2430 I2C Errata 1.67:
   * RDR should not be handled when bus is busy */
 
  ?
 
 Yes, that is better.
 
If we keep it this way, re-reading the register; what could be the
potential problem?
  
   It doesn't match the definition of the erratum as expressed in the
   comment.  Is it possible for the RDR bit to be erroneously set when BB
 =
   0?
 
  Yes, the nature of the errata is that the RDR interrupt could be
  spurious. Although, if the bus is not busy and the RDR is set
  erroneously (there are no bytes in the FIFO to be drained), then the
  normal isr code would just leave and do nothing, which is what we also
  need in the errata work around.
 
 Okay.  So it looks like there is a unfixable race here.  Is it possible
 for BB to be 0 during the stat2 read, then for BB to go to 1 immediately
 afterwards?  Then the rest of the RDR handler would be entered.  If this
 is possible, what will the ISR do -- will it hang?
 
 If this assessment of the problem is accurate, the stat2 read shrinks
 the race window, and then indeed seems useful.
 
 

a)   why would bus be busy? - answer bus is busy before a transaction 
starts - each transaction is an atomic operation. If someone goofs around with 
signal while a master is sending/receiving data, there is AL(Arbitration 
Lost).. not Bus busy.

b)   Look at the flow in TRM figure 18-13 I2C Master Reciever Mode, 
interrupt mode - where does BB get checked by the h/w? Not in the middle of 
the transaction..

Apologies if I am wrong, so am not entirely following the discussion here..

Regards,
Nishanth Menon
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-06-23 Thread Paul Walmsley
On Tue, 23 Jun 2009, Paul Walmsley wrote:

 Okay.  So it looks like there is a unfixable race here.  Is it possible 
 for BB to be 0 during the stat2 read, then for BB to go to 1 immediately 
 afterwards?  Then the rest of the RDR handler would be entered.  If this 
 is possible, what will the ISR do -- will it hang?

By the way, it would also be helpful if you could check what the certain 
rare conditions are that erratum 1.15 refers to that cause this 
problem...


- Paul
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-06-22 Thread Kevin Hilman
Ulrik Bech Hald u...@ti.com writes:

 Under certain rare conditions, I2C_STAT[13].RDR bit may be set,
 and the corresponding interrupt fire, even when there is no
 data in the receive FIFO, or the I2C data transfer is still
 ongoing. These spurious RDR events must be ignored by the
 software.

 A check for OMAP_I2C_STAT_BB is introduced in the ISR to
 prevent further processing of RDR interrupt, if the bus is busy.

 Signed-off-by: Ulrik Bech Hald u...@ti.com
 Signed-off-by: Jagadeesh Bhaskar Pakaravoor j-pakarav...@ti.com

Minor CodingStyle comments below...

 ---
  drivers/i2c/busses/i2c-omap.c |9 +
  1 files changed, 9 insertions(+), 0 deletions(-)

 diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
 index ece0125..88feea1 100644
 --- a/drivers/i2c/busses/i2c-omap.c
 +++ b/drivers/i2c/busses/i2c-omap.c
 @@ -668,6 +668,15 @@ omap_i2c_isr(int this_irq, void *dev_id)
   omap_i2c_complete_cmd(dev, err);
   if (stat  (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) {
   u8 num_bytes = 1;

But the local variable define here, followed by a blank line, and
the assignment to zero is unnecessary.

 + /* 3430 I2C Errata 1.15
 +  * RDR could be set when the bus is busy, then
 +  * ignore the interrupt, and clear the bit.
 +  */

Move the '*/' to the end of the previous line. 

 + u8 stat2 = 0;
 + stat2 = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
 + if (stat2  OMAP_I2C_STAT_BB)
 + return IRQ_HANDLED;
 +
   if (dev-fifo_size) {
   if (stat  OMAP_I2C_STAT_RRDY)
   num_bytes = dev-fifo_size;
 -- 
 1.5.4.3

 --
 To unsubscribe from this list: send the line unsubscribe linux-omap in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 1/1] i2c:OMAP3:Errata workaround for spurious RDR event

2009-06-22 Thread Paul Walmsley
Hello Ulrik, Jagadeesh, 

On Mon, 22 Jun 2009, Ulrik Bech Hald wrote:

 Under certain rare conditions, I2C_STAT[13].RDR bit may be set,
 and the corresponding interrupt fire, even when there is no
 data in the receive FIFO, or the I2C data transfer is still
 ongoing. These spurious RDR events must be ignored by the
 software.
 
 A check for OMAP_I2C_STAT_BB is introduced in the ISR to
 prevent further processing of RDR interrupt, if the bus is busy.
 
 Signed-off-by: Ulrik Bech Hald u...@ti.com
 Signed-off-by: Jagadeesh Bhaskar Pakaravoor j-pakarav...@ti.com
 ---
  drivers/i2c/busses/i2c-omap.c |9 +
  1 files changed, 9 insertions(+), 0 deletions(-)
 
 diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
 index ece0125..88feea1 100644
 --- a/drivers/i2c/busses/i2c-omap.c
 +++ b/drivers/i2c/busses/i2c-omap.c
 @@ -668,6 +668,15 @@ omap_i2c_isr(int this_irq, void *dev_id)
   omap_i2c_complete_cmd(dev, err);
   if (stat  (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) {
   u8 num_bytes = 1;
 + /* 3430 I2C Errata 1.15
 +  * RDR could be set when the bus is busy, then
 +  * ignore the interrupt, and clear the bit.
 +  */
 + u8 stat2 = 0;
 + stat2 = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
 + if (stat2  OMAP_I2C_STAT_BB)
 + return IRQ_HANDLED;

Why use stat2? Why not just test stat again?


 +
   if (dev-fifo_size) {
   if (stat  OMAP_I2C_STAT_RRDY)
   num_bytes = dev-fifo_size;
 -- 
 1.5.4.3
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-omap in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 


- Paul
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html