* [PATCH] i2c-designware: fix RX FIFO overrun @ 2013-04-19 18:05 Josef Ahmad 2013-04-19 20:43 ` Bryan O'Donoghue 2013-04-22 7:19 ` Mika Westerberg 0 siblings, 2 replies; 17+ messages in thread From: Josef Ahmad @ 2013-04-19 18:05 UTC (permalink / raw) To: Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, Mika Westerberg, linux-i2c, linux-kernel Cc: Dirk Brandewie >From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 From: Josef Ahmad <josef.ahmad@linux.intel.com> Date: Fri, 19 Apr 2013 17:28:10 +0100 Subject: [PATCH] i2c-designware: fix RX FIFO overrun i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive to/from the bus into the TX FIFO. For master-rx transactions, the maximum amount of data that can be received is calculated depending solely on TX and RX FIFO load. This is racy - TX FIFO may contain master-rx data yet to be processed, which will eventually land into the RX FIFO. This data is not taken into account and the function may request more data than the controller is actually capable of storing. This patch ensures the driver takes into account the outstanding master-rx data in TX FIFO to prevent RX FIFO overrun. Signed-off-by: Josef Ahmad <josef.ahmad@linux.intel.com> --- drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- drivers/i2c/busses/i2c-designware-core.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 94fd818..8dbeef1 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -426,8 +426,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) cmd |= BIT(9); if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { + + /* avoid rx buffer overrun */ + if (rx_limit - dev->rx_outstanding <= 0) + break; + dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); rx_limit--; + dev->rx_outstanding++; } else dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); tx_limit--; buf_len--; @@ -480,8 +486,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) rx_valid = dw_readl(dev, DW_IC_RXFLR); - for (; len > 0 && rx_valid > 0; len--, rx_valid--) + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { *buf++ = dw_readl(dev, DW_IC_DATA_CMD); + dev->rx_outstanding--; + } if (len > 0) { dev->status |= STATUS_READ_IN_PROGRESS; @@ -539,6 +547,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev->msg_err = 0; dev->status = STATUS_IDLE; dev->abort_source = 0; + dev->rx_outstanding = 0; ret = i2c_dw_wait_bus_not_busy(dev); if (ret < 0) diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 9c1840e..e761ad1 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h @@ -60,6 +60,7 @@ * @adapter: i2c subsystem adapter node * @tx_fifo_depth: depth of the hardware tx fifo * @rx_fifo_depth: depth of the hardware rx fifo + * @rx_outstanding: current master-rx elements in tx fifo */ struct dw_i2c_dev { struct device *dev; @@ -88,6 +89,7 @@ struct dw_i2c_dev { u32 master_cfg; unsigned int tx_fifo_depth; unsigned int rx_fifo_depth; + int rx_outstanding; }; #define ACCESS_SWAP 0x00000001 -- 1.7.0.7 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-04-19 18:05 [PATCH] i2c-designware: fix RX FIFO overrun Josef Ahmad @ 2013-04-19 20:43 ` Bryan O'Donoghue [not found] ` <5171AC7D.70503-SyKdqv6vbfZdzvEItQ6vdLNAH6kLmebB@public.gmane.org> 2013-04-22 7:19 ` Mika Westerberg 1 sibling, 1 reply; 17+ messages in thread From: Bryan O'Donoghue @ 2013-04-19 20:43 UTC (permalink / raw) To: Josef Ahmad Cc: Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, Mika Westerberg, linux-i2c, linux-kernel, Dirk Brandewie Josef. This fixes a real bug for us does it not, some failure case with a sustained amount of traffic ? Bryan ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <5171AC7D.70503-SyKdqv6vbfZdzvEItQ6vdLNAH6kLmebB@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <5171AC7D.70503-SyKdqv6vbfZdzvEItQ6vdLNAH6kLmebB@public.gmane.org> @ 2013-04-19 21:20 ` Josef Ahmad 0 siblings, 0 replies; 17+ messages in thread From: Josef Ahmad @ 2013-04-19 21:20 UTC (permalink / raw) To: Bryan O'Donoghue Cc: Josef Ahmad, Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, Mika Westerberg, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie It does. The bug appears with fairly-sized read transactions (in the order of kB) returning corrupted data. Josef > Josef. > > This fixes a real bug for us does it not, some failure case with a > sustained amount of traffic ? > > > Bryan > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-04-19 18:05 [PATCH] i2c-designware: fix RX FIFO overrun Josef Ahmad 2013-04-19 20:43 ` Bryan O'Donoghue @ 2013-04-22 7:19 ` Mika Westerberg [not found] ` <20130422071943.GK1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> 1 sibling, 1 reply; 17+ messages in thread From: Mika Westerberg @ 2013-04-22 7:19 UTC (permalink / raw) To: Josef Ahmad Cc: Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie On Fri, Apr 19, 2013 at 07:05:30PM +0100, Josef Ahmad wrote: > >From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 > From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Date: Fri, 19 Apr 2013 17:28:10 +0100 > Subject: [PATCH] i2c-designware: fix RX FIFO overrun > > i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive > to/from the bus into the TX FIFO. > For master-rx transactions, the maximum amount of data that can be > received is calculated depending solely on TX and RX FIFO load. > > This is racy - TX FIFO may contain master-rx data yet to be > processed, which will eventually land into the RX FIFO. This > data is not taken into account and the function may request more > data than the controller is actually capable of storing. > > This patch ensures the driver takes into account the outstanding > master-rx data in TX FIFO to prevent RX FIFO overrun. Can you add something to the changelog to show what the error looks like (a dump from dmesg for example)? > Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > --- > drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- > drivers/i2c/busses/i2c-designware-core.h | 2 ++ > 2 files changed, 12 insertions(+), 1 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c > index 94fd818..8dbeef1 100644 > --- a/drivers/i2c/busses/i2c-designware-core.c > +++ b/drivers/i2c/busses/i2c-designware-core.c > @@ -426,8 +426,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) > cmd |= BIT(9); > > if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { > + > + /* avoid rx buffer overrun */ > + if (rx_limit - dev->rx_outstanding <= 0) > + break; > + > dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); > rx_limit--; > + dev->rx_outstanding++; Instead of adding a new variable, is there something preventing a use of DW_IC_STATUS bits RFNE and TFNF? > } else > dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); > tx_limit--; buf_len--; > @@ -480,8 +486,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) > > rx_valid = dw_readl(dev, DW_IC_RXFLR); > > - for (; len > 0 && rx_valid > 0; len--, rx_valid--) > + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { > *buf++ = dw_readl(dev, DW_IC_DATA_CMD); > + dev->rx_outstanding--; > + } > > if (len > 0) { > dev->status |= STATUS_READ_IN_PROGRESS; > @@ -539,6 +547,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) > dev->msg_err = 0; > dev->status = STATUS_IDLE; > dev->abort_source = 0; > + dev->rx_outstanding = 0; > > ret = i2c_dw_wait_bus_not_busy(dev); > if (ret < 0) ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20130422071943.GK1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <20130422071943.GK1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> @ 2013-04-22 11:30 ` Josef Ahmad [not found] ` <53398.163.33.213.79.1366630241.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> 0 siblings, 1 reply; 17+ messages in thread From: Josef Ahmad @ 2013-04-22 11:30 UTC (permalink / raw) To: Mika Westerberg Cc: Josef Ahmad, Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie > On Fri, Apr 19, 2013 at 07:05:30PM +0100, Josef Ahmad wrote: >> >From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 >> From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> >> Date: Fri, 19 Apr 2013 17:28:10 +0100 >> Subject: [PATCH] i2c-designware: fix RX FIFO overrun >> >> i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive >> to/from the bus into the TX FIFO. >> For master-rx transactions, the maximum amount of data that can be >> received is calculated depending solely on TX and RX FIFO load. >> >> This is racy - TX FIFO may contain master-rx data yet to be >> processed, which will eventually land into the RX FIFO. This >> data is not taken into account and the function may request more >> data than the controller is actually capable of storing. >> >> This patch ensures the driver takes into account the outstanding >> master-rx data in TX FIFO to prevent RX FIFO overrun. > > Can you add something to the changelog to show what the error looks like > (a dump from dmesg for example)? > The issue is, the data is silently corrupted and not notified to the I2C core driver. The master-rx transaction returns success and the RX buffer overflow is not reported by the driver, which will read dropped data. FWIW, I have a simple test application receiving well-known data from a slave in a single transaction, and comparing received to expected data. Here's the outcome of three runs: [19/03/13 20:30:14] i2c-error : rcv'd message != ref msg (first diff @byte 33) [19/03/13 20:30:43] i2c-error : rcv'd message != ref msg (first diff @byte 108) [19/03/13 20:31:24] i2c-error : rcv'd message != ref msg (first diff @byte 133) >> Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> >> --- >> drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- >> drivers/i2c/busses/i2c-designware-core.h | 2 ++ >> 2 files changed, 12 insertions(+), 1 deletions(-) >> >> diff --git a/drivers/i2c/busses/i2c-designware-core.c >> b/drivers/i2c/busses/i2c-designware-core.c >> index 94fd818..8dbeef1 100644 >> --- a/drivers/i2c/busses/i2c-designware-core.c >> +++ b/drivers/i2c/busses/i2c-designware-core.c >> @@ -426,8 +426,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) >> cmd |= BIT(9); >> >> if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { >> + >> + /* avoid rx buffer overrun */ >> + if (rx_limit - dev->rx_outstanding <= 0) >> + break; >> + >> dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); >> rx_limit--; >> + dev->rx_outstanding++; > > Instead of adding a new variable, is there something preventing a use of > DW_IC_STATUS bits RFNE and TFNF? > DW_IC_STATUS bits won't give information of the type of elements (read or write) that are in the fifos. What we need here is more specific information, i.e. how many RX elements are currently in TX fifo. The register set doesn't provide this information to my knowledge, so I had to work it out externally with a status variable. Consider this example with 8-byte fifos (E=empty, R=read, W=write elements): State of the fifos: +-----------------+ TX -> | E E E E E W W R | +-----------------+ +-----------------+ RX | E E R R R R R R | <- +-----------------+ Now, say the transaction requires to pump 2 additional R elements into TX fifo. We need to ensure that at this stage only 1 of the 2 R elements is actually put into TX fifo: this way we we won't saturate the RX fifo. Failing to do so exposes a race condition: if we don't read RX quickly enough, the R element + the new 2 R elements in the TX fifo will land into the RX, resulting in an element being dropped. >> } else >> dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); >> tx_limit--; buf_len--; >> @@ -480,8 +486,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) >> >> rx_valid = dw_readl(dev, DW_IC_RXFLR); >> >> - for (; len > 0 && rx_valid > 0; len--, rx_valid--) >> + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { >> *buf++ = dw_readl(dev, DW_IC_DATA_CMD); >> + dev->rx_outstanding--; >> + } >> >> if (len > 0) { >> dev->status |= STATUS_READ_IN_PROGRESS; >> @@ -539,6 +547,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg >> msgs[], int num) >> dev->msg_err = 0; >> dev->status = STATUS_IDLE; >> dev->abort_source = 0; >> + dev->rx_outstanding = 0; >> >> ret = i2c_dw_wait_bus_not_busy(dev); >> if (ret < 0) > ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <53398.163.33.213.79.1366630241.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <53398.163.33.213.79.1366630241.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> @ 2013-04-22 12:28 ` Mika Westerberg [not found] ` <20130422122808.GO1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 17+ messages in thread From: Mika Westerberg @ 2013-04-22 12:28 UTC (permalink / raw) To: Josef Ahmad Cc: Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie On Mon, Apr 22, 2013 at 04:30:41AM -0700, Josef Ahmad wrote: > > On Fri, Apr 19, 2013 at 07:05:30PM +0100, Josef Ahmad wrote: > >> >From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 > >> From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > >> Date: Fri, 19 Apr 2013 17:28:10 +0100 > >> Subject: [PATCH] i2c-designware: fix RX FIFO overrun > >> > >> i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive > >> to/from the bus into the TX FIFO. > >> For master-rx transactions, the maximum amount of data that can be > >> received is calculated depending solely on TX and RX FIFO load. > >> > >> This is racy - TX FIFO may contain master-rx data yet to be > >> processed, which will eventually land into the RX FIFO. This > >> data is not taken into account and the function may request more > >> data than the controller is actually capable of storing. > >> > >> This patch ensures the driver takes into account the outstanding > >> master-rx data in TX FIFO to prevent RX FIFO overrun. > > > > Can you add something to the changelog to show what the error looks like > > (a dump from dmesg for example)? > > > > The issue is, the data is silently corrupted and not notified to the I2C core > driver. > The master-rx transaction returns success and the RX buffer overflow is not > reported by the driver, which will read dropped data. OK. > FWIW, I have a simple test application receiving well-known data from a slave > in a single transaction, and comparing received to expected data. > Here's the outcome of three runs: > > [19/03/13 20:30:14] i2c-error : rcv'd message != ref msg (first diff > @byte 33) > [19/03/13 20:30:43] i2c-error : rcv'd message != ref msg (first diff > @byte 108) > [19/03/13 20:31:24] i2c-error : rcv'd message != ref msg (first diff > @byte 133) > > >> Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > >> --- > >> drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- > >> drivers/i2c/busses/i2c-designware-core.h | 2 ++ > >> 2 files changed, 12 insertions(+), 1 deletions(-) > >> > >> diff --git a/drivers/i2c/busses/i2c-designware-core.c > >> b/drivers/i2c/busses/i2c-designware-core.c > >> index 94fd818..8dbeef1 100644 > >> --- a/drivers/i2c/busses/i2c-designware-core.c > >> +++ b/drivers/i2c/busses/i2c-designware-core.c > >> @@ -426,8 +426,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) > >> cmd |= BIT(9); > >> > >> if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { > >> + > >> + /* avoid rx buffer overrun */ > >> + if (rx_limit - dev->rx_outstanding <= 0) > >> + break; > >> + > >> dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); > >> rx_limit--; > >> + dev->rx_outstanding++; > > > > Instead of adding a new variable, is there something preventing a use of > > DW_IC_STATUS bits RFNE and TFNF? > > > > DW_IC_STATUS bits won't give information of the type of elements (read or > write) that are in the fifos. > What we need here is more specific information, i.e. how many RX elements are > currently in TX fifo. The register set doesn't provide this information to my > knowledge, so I had to work it out externally with a status variable. > > Consider this example with 8-byte fifos (E=empty, R=read, W=write elements): > > State of the fifos: > +-----------------+ > TX -> | E E E E E W W R | > +-----------------+ > +-----------------+ > RX | E E R R R R R R | <- > +-----------------+ > > Now, say the transaction requires to pump 2 additional R elements into TX > fifo. We need to ensure that at this stage only 1 of the 2 R elements is > actually put into TX fifo: this way we we won't saturate the RX fifo. > Failing to do so exposes a race condition: if we don't read RX quickly > enough, > the R element + the new 2 R elements in the TX fifo will land into the RX, > resulting in an element being dropped. Thanks for the explanation. Makes sense to me now. Feel free to add my Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20130422122808.GO1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <20130422122808.GO1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> @ 2013-04-22 14:08 ` Josef Ahmad 2013-04-23 16:35 ` Wolfram Sang 0 siblings, 1 reply; 17+ messages in thread From: Josef Ahmad @ 2013-04-22 14:08 UTC (permalink / raw) To: Mika Westerberg Cc: Josef Ahmad, Wolfram Sang, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie >From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Date: Fri, 19 Apr 2013 17:28:10 +0100 Subject: [PATCH] i2c-designware: fix RX FIFO overrun i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive to/from the bus into the TX FIFO. For master-rx transactions, the maximum amount of data that can be received is calculated depending solely on TX and RX FIFO load. This is racy - TX FIFO may contain master-rx data yet to be processed, which will eventually land into the RX FIFO. This data is not taken into account and the function may request more data than the controller is actually capable of storing. This patch ensures the driver takes into account the outstanding master-rx data in TX FIFO to prevent RX FIFO overrun. Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> --- drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- drivers/i2c/busses/i2c-designware-core.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 94fd818..8dbeef1 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -426,8 +426,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) cmd |= BIT(9); if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { + + /* avoid rx buffer overrun */ + if (rx_limit - dev->rx_outstanding <= 0) + break; + dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); rx_limit--; + dev->rx_outstanding++; } else dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); tx_limit--; buf_len--; @@ -480,8 +486,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) rx_valid = dw_readl(dev, DW_IC_RXFLR); - for (; len > 0 && rx_valid > 0; len--, rx_valid--) + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { *buf++ = dw_readl(dev, DW_IC_DATA_CMD); + dev->rx_outstanding--; + } if (len > 0) { dev->status |= STATUS_READ_IN_PROGRESS; @@ -539,6 +547,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev->msg_err = 0; dev->status = STATUS_IDLE; dev->abort_source = 0; + dev->rx_outstanding = 0; ret = i2c_dw_wait_bus_not_busy(dev); if (ret < 0) diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 9c1840e..e761ad1 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h @@ -60,6 +60,7 @@ * @adapter: i2c subsystem adapter node * @tx_fifo_depth: depth of the hardware tx fifo * @rx_fifo_depth: depth of the hardware rx fifo + * @rx_outstanding: current master-rx elements in tx fifo */ struct dw_i2c_dev { struct device *dev; @@ -88,6 +89,7 @@ struct dw_i2c_dev { u32 master_cfg; unsigned int tx_fifo_depth; unsigned int rx_fifo_depth; + int rx_outstanding; }; #define ACCESS_SWAP 0x00000001 -- 1.7.0.7 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-04-22 14:08 ` Josef Ahmad @ 2013-04-23 16:35 ` Wolfram Sang [not found] ` <20130423163543.GB3228-z923LK4zBo2bacvFa/9K2g@public.gmane.org> 0 siblings, 1 reply; 17+ messages in thread From: Wolfram Sang @ 2013-04-23 16:35 UTC (permalink / raw) To: Josef Ahmad Cc: Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie On Mon, Apr 22, 2013 at 03:08:59PM +0100, Josef Ahmad wrote: > From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 > From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Date: Fri, 19 Apr 2013 17:28:10 +0100 > Subject: [PATCH] i2c-designware: fix RX FIFO overrun > > i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive > to/from the bus into the TX FIFO. > For master-rx transactions, the maximum amount of data that can be > received is calculated depending solely on TX and RX FIFO load. > > This is racy - TX FIFO may contain master-rx data yet to be > processed, which will eventually land into the RX FIFO. This > data is not taken into account and the function may request more > data than the controller is actually capable of storing. > > This patch ensures the driver takes into account the outstanding > master-rx data in TX FIFO to prevent RX FIFO overrun. > > Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> This driver had a major cleanup meanwhile. Could you rebase your patch on top of my for-next branch? I guess this version should make it into stable? ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20130423163543.GB3228-z923LK4zBo2bacvFa/9K2g@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <20130423163543.GB3228-z923LK4zBo2bacvFa/9K2g@public.gmane.org> @ 2013-04-23 17:44 ` Josef Ahmad [not found] ` <51465.163.33.213.85.1366739082.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> 0 siblings, 1 reply; 17+ messages in thread From: Josef Ahmad @ 2013-04-23 17:44 UTC (permalink / raw) To: Wolfram Sang Cc: Josef Ahmad, Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie > On Mon, Apr 22, 2013 at 03:08:59PM +0100, Josef Ahmad wrote: >> From a969728248c3b439dc97a69e7dac133b5efa34e7 Mon Sep 17 00:00:00 2001 >> From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> >> Date: Fri, 19 Apr 2013 17:28:10 +0100 >> Subject: [PATCH] i2c-designware: fix RX FIFO overrun >> >> i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive >> to/from the bus into the TX FIFO. >> For master-rx transactions, the maximum amount of data that can be >> received is calculated depending solely on TX and RX FIFO load. >> >> This is racy - TX FIFO may contain master-rx data yet to be >> processed, which will eventually land into the RX FIFO. This >> data is not taken into account and the function may request more >> data than the controller is actually capable of storing. >> >> This patch ensures the driver takes into account the outstanding >> master-rx data in TX FIFO to prevent RX FIFO overrun. >> >> Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> >> Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > > This driver had a major cleanup meanwhile. Could you rebase your patch > on top of my for-next branch? I guess this version should make it into > stable? > Hi Wolfram This patch applies just fine on top of your i2c-embedded/for-next branch. ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <51465.163.33.213.85.1366739082.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <51465.163.33.213.85.1366739082.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> @ 2013-04-23 18:27 ` Wolfram Sang [not found] ` <20130423182707.GA3649-z923LK4zBo2bacvFa/9K2g@public.gmane.org> 0 siblings, 1 reply; 17+ messages in thread From: Wolfram Sang @ 2013-04-23 18:27 UTC (permalink / raw) To: Josef Ahmad Cc: Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie > > This driver had a major cleanup meanwhile. Could you rebase your patch > > on top of my for-next branch? I guess this version should make it into > > stable? > > > > This patch applies just fine on top of your i2c-embedded/for-next branch. i2c-embedded? Ah, this one is outdated. Please check git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/for-next. Thanks, Wolfram ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20130423182707.GA3649-z923LK4zBo2bacvFa/9K2g@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <20130423182707.GA3649-z923LK4zBo2bacvFa/9K2g@public.gmane.org> @ 2013-04-24 10:11 ` Josef Ahmad 2013-04-25 17:43 ` Wolfram Sang 0 siblings, 1 reply; 17+ messages in thread From: Josef Ahmad @ 2013-04-24 10:11 UTC (permalink / raw) To: Wolfram Sang Cc: Josef Ahmad, Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie >From 8a4773d0c0df6fe2e816ad37fde30a2d90a1ad31 Mon Sep 17 00:00:00 2001 From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Date: Fri, 19 Apr 2013 17:28:10 +0100 Subject: [PATCH] i2c-designware: fix RX FIFO overrun i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive to/from the bus into the TX FIFO. For master-rx transactions, the maximum amount of data that can be received is calculated depending solely on TX and RX FIFO load. This is racy - TX FIFO may contain master-rx data yet to be processed, which will eventually land into the RX FIFO. This data is not taken into account and the function may request more data than the controller is actually capable of storing. This patch ensures the driver takes into account the outstanding master-rx data in TX FIFO to prevent RX FIFO overrun. Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> --- drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- drivers/i2c/busses/i2c-designware-core.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 21fbb34..1f06c8e 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -448,8 +448,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) cmd |= BIT(9); if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { + + /* avoid rx buffer overrun */ + if (rx_limit - dev->rx_outstanding <= 0) + break; + dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); rx_limit--; + dev->rx_outstanding++; } else dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); tx_limit--; buf_len--; @@ -502,8 +508,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) rx_valid = dw_readl(dev, DW_IC_RXFLR); - for (; len > 0 && rx_valid > 0; len--, rx_valid--) + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { *buf++ = dw_readl(dev, DW_IC_DATA_CMD); + dev->rx_outstanding--; + } if (len > 0) { dev->status |= STATUS_READ_IN_PROGRESS; @@ -561,6 +569,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev->msg_err = 0; dev->status = STATUS_IDLE; dev->abort_source = 0; + dev->rx_outstanding = 0; ret = i2c_dw_wait_bus_not_busy(dev); if (ret < 0) diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 9c1840e..e761ad1 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h @@ -60,6 +60,7 @@ * @adapter: i2c subsystem adapter node * @tx_fifo_depth: depth of the hardware tx fifo * @rx_fifo_depth: depth of the hardware rx fifo + * @rx_outstanding: current master-rx elements in tx fifo */ struct dw_i2c_dev { struct device *dev; @@ -88,6 +89,7 @@ struct dw_i2c_dev { u32 master_cfg; unsigned int tx_fifo_depth; unsigned int rx_fifo_depth; + int rx_outstanding; }; #define ACCESS_SWAP 0x00000001 -- 1.7.0.7 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-04-24 10:11 ` Josef Ahmad @ 2013-04-25 17:43 ` Wolfram Sang [not found] ` <20130425174348.GA3612-z923LK4zBo2bacvFa/9K2g@public.gmane.org> 2013-05-08 13:34 ` Josef Ahmad 0 siblings, 2 replies; 17+ messages in thread From: Wolfram Sang @ 2013-04-25 17:43 UTC (permalink / raw) To: Josef Ahmad Cc: Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie On Wed, Apr 24, 2013 at 11:11:38AM +0100, Josef Ahmad wrote: > From 8a4773d0c0df6fe2e816ad37fde30a2d90a1ad31 Mon Sep 17 00:00:00 2001 > From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Date: Fri, 19 Apr 2013 17:28:10 +0100 > Subject: [PATCH] i2c-designware: fix RX FIFO overrun > > i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive > to/from the bus into the TX FIFO. > For master-rx transactions, the maximum amount of data that can be > received is calculated depending solely on TX and RX FIFO load. > > This is racy - TX FIFO may contain master-rx data yet to be > processed, which will eventually land into the RX FIFO. This > data is not taken into account and the function may request more > data than the controller is actually capable of storing. > > This patch ensures the driver takes into account the outstanding > master-rx data in TX FIFO to prevent RX FIFO overrun. > > Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Still can't apply :( Whitespace problems in the patch context :( ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20130425174348.GA3612-z923LK4zBo2bacvFa/9K2g@public.gmane.org>]
* Re: [PATCH] i2c-designware: fix RX FIFO overrun [not found] ` <20130425174348.GA3612-z923LK4zBo2bacvFa/9K2g@public.gmane.org> @ 2013-05-08 13:31 ` Josef Ahmad 0 siblings, 0 replies; 17+ messages in thread From: Josef Ahmad @ 2013-05-08 13:31 UTC (permalink / raw) To: Wolfram Sang Cc: Josef Ahmad, Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie Sorry for late reply. Bad UA configuration. Will resend straight away. Thanks, Josef On Thu, 25 Apr 2013, Wolfram Sang wrote: > > Still can't apply :( Whitespace problems in the patch context :( > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-04-25 17:43 ` Wolfram Sang [not found] ` <20130425174348.GA3612-z923LK4zBo2bacvFa/9K2g@public.gmane.org> @ 2013-05-08 13:34 ` Josef Ahmad 2013-05-17 8:23 ` Wolfram Sang 1 sibling, 1 reply; 17+ messages in thread From: Josef Ahmad @ 2013-05-08 13:34 UTC (permalink / raw) To: Wolfram Sang Cc: Josef Ahmad, Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c, linux-kernel, Dirk Brandewie >From 8a4773d0c0df6fe2e816ad37fde30a2d90a1ad31 Mon Sep 17 00:00:00 2001 From: Josef Ahmad <josef.ahmad@linux.intel.com> Date: Fri, 19 Apr 2013 17:28:10 +0100 Subject: [PATCH] i2c-designware: fix RX FIFO overrun i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive to/from the bus into the TX FIFO. For master-rx transactions, the maximum amount of data that can be received is calculated depending solely on TX and RX FIFO load. This is racy - TX FIFO may contain master-rx data yet to be processed, which will eventually land into the RX FIFO. This data is not taken into account and the function may request more data than the controller is actually capable of storing. This patch ensures the driver takes into account the outstanding master-rx data in TX FIFO to prevent RX FIFO overrun. Signed-off-by: Josef Ahmad <josef.ahmad@linux.intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> --- drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- drivers/i2c/busses/i2c-designware-core.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 21fbb34..1f06c8e 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -448,8 +448,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) cmd |= BIT(9); if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { + + /* avoid rx buffer overrun */ + if (rx_limit - dev->rx_outstanding <= 0) + break; + dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); rx_limit--; + dev->rx_outstanding++; } else dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); tx_limit--; buf_len--; @@ -502,8 +508,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) rx_valid = dw_readl(dev, DW_IC_RXFLR); - for (; len > 0 && rx_valid > 0; len--, rx_valid--) + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { *buf++ = dw_readl(dev, DW_IC_DATA_CMD); + dev->rx_outstanding--; + } if (len > 0) { dev->status |= STATUS_READ_IN_PROGRESS; @@ -561,6 +569,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev->msg_err = 0; dev->status = STATUS_IDLE; dev->abort_source = 0; + dev->rx_outstanding = 0; ret = i2c_dw_wait_bus_not_busy(dev); if (ret < 0) diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 9c1840e..e761ad1 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h @@ -60,6 +60,7 @@ * @adapter: i2c subsystem adapter node * @tx_fifo_depth: depth of the hardware tx fifo * @rx_fifo_depth: depth of the hardware rx fifo + * @rx_outstanding: current master-rx elements in tx fifo */ struct dw_i2c_dev { struct device *dev; @@ -88,6 +89,7 @@ struct dw_i2c_dev { u32 master_cfg; unsigned int tx_fifo_depth; unsigned int rx_fifo_depth; + int rx_outstanding; }; #define ACCESS_SWAP 0x00000001 -- 1.7.0.7 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-05-08 13:34 ` Josef Ahmad @ 2013-05-17 8:23 ` Wolfram Sang 2013-05-17 8:32 ` Wolfram Sang 0 siblings, 1 reply; 17+ messages in thread From: Wolfram Sang @ 2013-05-17 8:23 UTC (permalink / raw) To: Josef Ahmad Cc: Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie On Wed, May 08, 2013 at 02:34:36PM +0100, Josef Ahmad wrote: > From 8a4773d0c0df6fe2e816ad37fde30a2d90a1ad31 Mon Sep 17 00:00:00 2001 > From: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Date: Fri, 19 Apr 2013 17:28:10 +0100 > Subject: [PATCH] i2c-designware: fix RX FIFO overrun > > i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive > to/from the bus into the TX FIFO. > For master-rx transactions, the maximum amount of data that can be > received is calculated depending solely on TX and RX FIFO load. > > This is racy - TX FIFO may contain master-rx data yet to be > processed, which will eventually land into the RX FIFO. This > data is not taken into account and the function may request more > data than the controller is actually capable of storing. > > This patch ensures the driver takes into account the outstanding > master-rx data in TX FIFO to prevent RX FIFO overrun. > > Signed-off-by: Josef Ahmad <josef.ahmad-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Acked-by: Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Applied to for-current, thanks! ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-05-17 8:23 ` Wolfram Sang @ 2013-05-17 8:32 ` Wolfram Sang 2013-05-17 10:59 ` Josef Ahmad 0 siblings, 1 reply; 17+ messages in thread From: Wolfram Sang @ 2013-05-17 8:32 UTC (permalink / raw) To: Josef Ahmad Cc: Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie > Applied to for-current, thanks! Added stable, too. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] i2c-designware: fix RX FIFO overrun 2013-05-17 8:32 ` Wolfram Sang @ 2013-05-17 10:59 ` Josef Ahmad 0 siblings, 0 replies; 17+ messages in thread From: Josef Ahmad @ 2013-05-17 10:59 UTC (permalink / raw) To: Wolfram Sang Cc: Josef Ahmad, Mika Westerberg, Ben Dooks, Jean Delvare, Stefan Roese, Axel Lin, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dirk Brandewie >> Applied to for-current, thanks! > > Added stable, too. > Thanks Wolfram. ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2013-05-17 10:59 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-19 18:05 [PATCH] i2c-designware: fix RX FIFO overrun Josef Ahmad
2013-04-19 20:43 ` Bryan O'Donoghue
[not found] ` <5171AC7D.70503-SyKdqv6vbfZdzvEItQ6vdLNAH6kLmebB@public.gmane.org>
2013-04-19 21:20 ` Josef Ahmad
2013-04-22 7:19 ` Mika Westerberg
[not found] ` <20130422071943.GK1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-04-22 11:30 ` Josef Ahmad
[not found] ` <53398.163.33.213.79.1366630241.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2013-04-22 12:28 ` Mika Westerberg
[not found] ` <20130422122808.GO1283-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-04-22 14:08 ` Josef Ahmad
2013-04-23 16:35 ` Wolfram Sang
[not found] ` <20130423163543.GB3228-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-04-23 17:44 ` Josef Ahmad
[not found] ` <51465.163.33.213.85.1366739082.squirrel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2013-04-23 18:27 ` Wolfram Sang
[not found] ` <20130423182707.GA3649-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-04-24 10:11 ` Josef Ahmad
2013-04-25 17:43 ` Wolfram Sang
[not found] ` <20130425174348.GA3612-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-05-08 13:31 ` Josef Ahmad
2013-05-08 13:34 ` Josef Ahmad
2013-05-17 8:23 ` Wolfram Sang
2013-05-17 8:32 ` Wolfram Sang
2013-05-17 10:59 ` Josef Ahmad
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).