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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxx
> > 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-owner@xxxxxxxxxxxxxxx [mailto:linux-omap-
> > > owner@xxxxxxxxxxxxxxx] On Behalf Of Paul Walmsley
> > > Sent: Tuesday, June 23, 2009 9:05 PM
> > > To: Hald, Ulrik Bech
> > > Cc: Pakaravoor, Jagadeesh; linux-omap@xxxxxxxxxxxxxxx
> > > 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) {
> 							*dev->buf++ = w >> 8;
> 							dev->buf_len--;
> 						}
> 					}
> 				} else {
> 					if (stat & OMAP_I2C_STAT_RRDY)
> 						dev_err(dev->dev,
> 							"RRDY IRQ while no data"
> 								" requested\n");
> 					if (stat & OMAP_I2C_STAT_RDR)
> 						dev_err(dev->dev,
> 							"RDR IRQ while no data"
> 								" requested\n");
> 					break;
> 				}
> 			}
> ..
> 
> ... is there really a need for the patch in the first place? The data 
> extraction from the FIFO is handled the same way for both RDR and RRDY 
> interrupts. The only difference is what num_bytes is set to. Sure, RDR 
> could be set spuriously, but if we're handling it the same way as RRDY 
> what's the problem? If data is ready in the FIFO, we extract only what 
> is there. If no data is ready, we simply leave.

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?)


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

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux