* [PATCH 1/3] I2C: DaVinci: move dev_debug line for more output
@ 2008-04-30 23:53 Troy Kisky
[not found] ` <1209599638-17057-1-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: Troy Kisky @ 2008-04-30 23:53 UTC (permalink / raw)
To: i2c-GZX6beZjE8VD60Wz+7aTrA; +Cc: Kevin Hilman
Previously the dev_dbg only printed if no error.
Printing also on an error is more useful
Signed-off-by: Troy Kisky <troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>
Signed-off-by: Kevin Hilman <khilman-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org>
---
drivers/i2c/busses/i2c-davinci.c | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 7a60afb..fd97cca 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -341,12 +341,10 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
for (i = 0; i < num; i++) {
ret = i2c_davinci_xfer_msg(adap, &msgs[i], (i == (num - 1)));
+ dev_dbg(dev->dev, "%s [%d/%d] ret: %d\n", __func__, i + 1, num, ret);
if (ret < 0)
return ret;
}
-
- dev_dbg(dev->dev, "%s:%d ret: %d\n", __func__, __LINE__, ret);
-
return num;
}
--
1.5.4
_______________________________________________
i2c mailing list
i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
http://lists.lm-sensors.org/mailman/listinfo/i2c
^ permalink raw reply related [flat|nested] 7+ messages in thread[parent not found: <1209599638-17057-1-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>]
* [PATCH 2/3] I2C: DaVinci: initialize cmd_complete sooner [not found] ` <1209599638-17057-1-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> @ 2008-04-30 23:53 ` Troy Kisky [not found] ` <1209599638-17057-2-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> 2008-05-02 13:46 ` [PATCH 1/3] I2C: DaVinci: move dev_debug line for more output Jean Delvare 1 sibling, 1 reply; 7+ messages in thread From: Troy Kisky @ 2008-04-30 23:53 UTC (permalink / raw) To: i2c-GZX6beZjE8VD60Wz+7aTrA; +Cc: Kevin Hilman If an interrupt happens before an I2c master read/write, complete is called on uninitialized structure. Signed-off-by: Troy Kisky <troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> Signed-off-by: Kevin Hilman <khilman-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org> --- drivers/i2c/busses/i2c-davinci.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index fd97cca..77c9822 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -260,7 +260,7 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) davinci_i2c_write_reg(dev, DAVINCI_I2C_CNT_REG, dev->buf_len); - init_completion(&dev->cmd_complete); + INIT_COMPLETION(dev->cmd_complete); dev->cmd_err = 0; /* Take I2C out of reset, configure it as master and set the @@ -476,6 +476,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) goto err_release_region; } + init_completion(&dev->cmd_complete); dev->dev = get_device(&pdev->dev); dev->irq = irq->start; platform_set_drvdata(pdev, dev); -- 1.5.4 _______________________________________________ i2c mailing list i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org http://lists.lm-sensors.org/mailman/listinfo/i2c ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <1209599638-17057-2-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>]
* [PATCH 3/3] I2C: DaVinci: fix signal handling bug [not found] ` <1209599638-17057-2-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> @ 2008-04-30 23:53 ` Troy Kisky [not found] ` <1209599638-17057-3-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Troy Kisky @ 2008-04-30 23:53 UTC (permalink / raw) To: i2c-GZX6beZjE8VD60Wz+7aTrA; +Cc: Kevin Hilman If wait_for_completion_interruptible_timeout exits due to a signal, the i2c bus was locking up. Signed-off-by: Troy Kisky <troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> Signed-off-by: Kevin Hilman <khilman-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org> --- drivers/i2c/busses/i2c-davinci.c | 62 +++++++++++++++++++++++++++++++------ 1 files changed, 52 insertions(+), 10 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 77c9822..c44ef4a 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -85,6 +85,7 @@ #define DAVINCI_I2C_MDR_MST (1 << 10) #define DAVINCI_I2C_MDR_TRX (1 << 9) #define DAVINCI_I2C_MDR_XA (1 << 8) +#define DAVINCI_I2C_MDR_RM (1 << 7) #define DAVINCI_I2C_MDR_IRS (1 << 5) #define DAVINCI_I2C_IMR_AAS (1 << 6) @@ -112,6 +113,7 @@ struct davinci_i2c_dev { u8 *buf; size_t buf_len; int irq; + u8 terminate; struct i2c_adapter adapter; }; @@ -283,20 +285,34 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) MOD_REG_BIT(w, DAVINCI_I2C_IMR_XRDY, 1); davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); + dev->terminate = 0; /* write the data into mode register */ davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); r = wait_for_completion_interruptible_timeout(&dev->cmd_complete, DAVINCI_I2C_TIMEOUT); - dev->buf_len = 0; - if (r < 0) - return r; - if (r == 0) { dev_err(dev->dev, "controller timed out\n"); i2c_davinci_init(dev); + dev->buf_len = 0; return -ETIMEDOUT; } + if (dev->buf_len) { + /* This should be 0 if all bytes were transferred + * or dev->cmd_err denotes an error. + * A signal may have aborted the transfer. + */ + if (r >= 0) { + dev_err(dev->dev, "abnormal termination buf_len=%i\n", + dev->buf_len); + r = -EREMOTEIO; + } + dev->terminate = 1; + wmb(); + dev->buf_len = 0; + } + if (r < 0) + return r; /* no error */ if (likely(!dev->cmd_err)) @@ -353,6 +369,27 @@ static u32 i2c_davinci_func(struct i2c_adapter *adap) return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); } +static void terminate_read(struct davinci_i2c_dev *dev) +{ + u16 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); + w |= DAVINCI_I2C_MDR_NACK; + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); + + /* Throw away data */ + davinci_i2c_read_reg(dev, DAVINCI_I2C_DRR_REG); + if (!dev->terminate) + dev_err(dev->dev, "RDR IRQ while no data requested\n"); +} +static void terminate_write(struct davinci_i2c_dev *dev) +{ + u16 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); + w |= DAVINCI_I2C_MDR_RM | DAVINCI_I2C_MDR_STP; + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); + + if (!dev->terminate) + dev_err(dev->dev, "TDR IRQ while no data to send\n"); +} + /* * Interrupt service routine. This gets called whenever an I2C interrupt * occurs. @@ -373,12 +410,15 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) switch (stat) { case DAVINCI_I2C_IVR_AL: + /* Arbitration lost, must retry */ dev->cmd_err |= DAVINCI_I2C_STR_AL; + dev->buf_len = 0; complete(&dev->cmd_complete); break; case DAVINCI_I2C_IVR_NACK: dev->cmd_err |= DAVINCI_I2C_STR_NACK; + dev->buf_len = 0; complete(&dev->cmd_complete); break; @@ -400,9 +440,10 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, DAVINCI_I2C_IMR_RRDY); - } else - dev_err(dev->dev, "RDR IRQ while no " - "data requested\n"); + } else { + /* signal can terminate transfer */ + terminate_read(dev); + } break; case DAVINCI_I2C_IVR_XRDY: @@ -419,9 +460,10 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); - } else - dev_err(dev->dev, "TDR IRQ while no data to " - "send\n"); + } else { + /* signal can terminate transfer */ + terminate_write(dev); + } break; case DAVINCI_I2C_IVR_SCD: -- 1.5.4 _______________________________________________ i2c mailing list i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org http://lists.lm-sensors.org/mailman/listinfo/i2c ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <1209599638-17057-3-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>]
* Re: [PATCH 3/3] I2C: DaVinci: fix signal handling bug [not found] ` <1209599638-17057-3-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> @ 2008-05-02 14:05 ` Jean Delvare [not found] ` <20080502160540.2367669e-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Jean Delvare @ 2008-05-02 14:05 UTC (permalink / raw) To: Troy Kisky; +Cc: i2c-GZX6beZjE8VD60Wz+7aTrA, Kevin Hilman Hi Troy, On Wed, 30 Apr 2008 16:53:58 -0700, Troy Kisky wrote: > If wait_for_completion_interruptible_timeout exits due > to a signal, the i2c bus was locking up. > > Signed-off-by: Troy Kisky <troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> > Signed-off-by: Kevin Hilman <khilman-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org> > --- > drivers/i2c/busses/i2c-davinci.c | 62 +++++++++++++++++++++++++++++++------ > 1 files changed, 52 insertions(+), 10 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c > index 77c9822..c44ef4a 100644 > --- a/drivers/i2c/busses/i2c-davinci.c > +++ b/drivers/i2c/busses/i2c-davinci.c > @@ -85,6 +85,7 @@ > #define DAVINCI_I2C_MDR_MST (1 << 10) > #define DAVINCI_I2C_MDR_TRX (1 << 9) > #define DAVINCI_I2C_MDR_XA (1 << 8) > +#define DAVINCI_I2C_MDR_RM (1 << 7) > #define DAVINCI_I2C_MDR_IRS (1 << 5) > > #define DAVINCI_I2C_IMR_AAS (1 << 6) > @@ -112,6 +113,7 @@ struct davinci_i2c_dev { > u8 *buf; > size_t buf_len; > int irq; > + u8 terminate; > struct i2c_adapter adapter; > }; > > @@ -283,20 +285,34 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) > MOD_REG_BIT(w, DAVINCI_I2C_IMR_XRDY, 1); > davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); > > + dev->terminate = 0; > /* write the data into mode register */ > davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); > > r = wait_for_completion_interruptible_timeout(&dev->cmd_complete, > DAVINCI_I2C_TIMEOUT); > - dev->buf_len = 0; > - if (r < 0) > - return r; > - > if (r == 0) { > dev_err(dev->dev, "controller timed out\n"); > i2c_davinci_init(dev); > + dev->buf_len = 0; > return -ETIMEDOUT; > } > + if (dev->buf_len) { > + /* This should be 0 if all bytes were transferred > + * or dev->cmd_err denotes an error. > + * A signal may have aborted the transfer. > + */ > + if (r >= 0) { > + dev_err(dev->dev, "abnormal termination buf_len=%i\n", > + dev->buf_len); > + r = -EREMOTEIO; > + } > + dev->terminate = 1; > + wmb(); > + dev->buf_len = 0; > + } > + if (r < 0) > + return r; > > /* no error */ > if (likely(!dev->cmd_err)) > @@ -353,6 +369,27 @@ static u32 i2c_davinci_func(struct i2c_adapter *adap) > return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); > } > > +static void terminate_read(struct davinci_i2c_dev *dev) > +{ > + u16 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); > + w |= DAVINCI_I2C_MDR_NACK; > + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); > + > + /* Throw away data */ > + davinci_i2c_read_reg(dev, DAVINCI_I2C_DRR_REG); > + if (!dev->terminate) > + dev_err(dev->dev, "RDR IRQ while no data requested\n"); > +} > +static void terminate_write(struct davinci_i2c_dev *dev) > +{ > + u16 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); > + w |= DAVINCI_I2C_MDR_RM | DAVINCI_I2C_MDR_STP; > + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); > + > + if (!dev->terminate) > + dev_err(dev->dev, "TDR IRQ while no data to send\n"); > +} > + > /* > * Interrupt service routine. This gets called whenever an I2C interrupt > * occurs. > @@ -373,12 +410,15 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) > > switch (stat) { > case DAVINCI_I2C_IVR_AL: > + /* Arbitration lost, must retry */ > dev->cmd_err |= DAVINCI_I2C_STR_AL; > + dev->buf_len = 0; > complete(&dev->cmd_complete); > break; > > case DAVINCI_I2C_IVR_NACK: > dev->cmd_err |= DAVINCI_I2C_STR_NACK; > + dev->buf_len = 0; > complete(&dev->cmd_complete); > break; > > @@ -400,9 +440,10 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) > davinci_i2c_write_reg(dev, > DAVINCI_I2C_STR_REG, > DAVINCI_I2C_IMR_RRDY); > - } else > - dev_err(dev->dev, "RDR IRQ while no " > - "data requested\n"); > + } else { > + /* signal can terminate transfer */ > + terminate_read(dev); > + } > break; > > case DAVINCI_I2C_IVR_XRDY: > @@ -419,9 +460,10 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) > davinci_i2c_write_reg(dev, > DAVINCI_I2C_IMR_REG, > w); > - } else > - dev_err(dev->dev, "TDR IRQ while no data to " > - "send\n"); > + } else { > + /* signal can terminate transfer */ > + terminate_write(dev); > + } > break; > > case DAVINCI_I2C_IVR_SCD: Looks much better than your first attempt. I'm taking this in my i2c tree, thanks. -- Jean Delvare _______________________________________________ i2c mailing list i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org http://lists.lm-sensors.org/mailman/listinfo/i2c ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <20080502160540.2367669e-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>]
* Re: [PATCH 3/3] I2C: DaVinci: fix signal handling bug [not found] ` <20080502160540.2367669e-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org> @ 2008-05-02 20:41 ` Troy Kisky [not found] ` <481B7C87.5020405-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Troy Kisky @ 2008-05-02 20:41 UTC (permalink / raw) To: Jean Delvare; +Cc: i2c-GZX6beZjE8VD60Wz+7aTrA Jean Delvare wrote: > > Looks much better than your first attempt. I'm taking this in my i2c > tree, thanks. > Thanks for all your efforts in improving this driver. Troy _______________________________________________ i2c mailing list i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org http://lists.lm-sensors.org/mailman/listinfo/i2c ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <481B7C87.5020405-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>]
* Re: [PATCH 3/3] I2C: DaVinci: fix signal handling bug [not found] ` <481B7C87.5020405-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> @ 2008-05-02 20:47 ` Jean Delvare 0 siblings, 0 replies; 7+ messages in thread From: Jean Delvare @ 2008-05-02 20:47 UTC (permalink / raw) To: Troy Kisky; +Cc: i2c-GZX6beZjE8VD60Wz+7aTrA On Fri, 02 May 2008 13:41:43 -0700, Troy Kisky wrote: > Jean Delvare wrote: > > > > Looks much better than your first attempt. I'm taking this in my i2c > > tree, thanks. > > > > Thanks for all your efforts in improving this driver. Well, thank _you_ for your patience in improving the patches to make them better :) -- Jean Delvare _______________________________________________ i2c mailing list i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org http://lists.lm-sensors.org/mailman/listinfo/i2c ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] I2C: DaVinci: move dev_debug line for more output [not found] ` <1209599638-17057-1-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> 2008-04-30 23:53 ` [PATCH 2/3] I2C: DaVinci: initialize cmd_complete sooner Troy Kisky @ 2008-05-02 13:46 ` Jean Delvare 1 sibling, 0 replies; 7+ messages in thread From: Jean Delvare @ 2008-05-02 13:46 UTC (permalink / raw) To: Troy Kisky; +Cc: i2c-GZX6beZjE8VD60Wz+7aTrA, Kevin Hilman On Wed, 30 Apr 2008 16:53:56 -0700, Troy Kisky wrote: > Previously the dev_dbg only printed if no error. > Printing also on an error is more useful > > Signed-off-by: Troy Kisky <troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org> > Signed-off-by: Kevin Hilman <khilman-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org> > --- > drivers/i2c/busses/i2c-davinci.c | 4 +--- > 1 files changed, 1 insertions(+), 3 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c > index 7a60afb..fd97cca 100644 > --- a/drivers/i2c/busses/i2c-davinci.c > +++ b/drivers/i2c/busses/i2c-davinci.c > @@ -341,12 +341,10 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) > > for (i = 0; i < num; i++) { > ret = i2c_davinci_xfer_msg(adap, &msgs[i], (i == (num - 1))); > + dev_dbg(dev->dev, "%s [%d/%d] ret: %d\n", __func__, i + 1, num, ret); > if (ret < 0) > return ret; > } > - > - dev_dbg(dev->dev, "%s:%d ret: %d\n", __func__, __LINE__, ret); > - > return num; > } > Applied (after folding the long line), thanks. -- Jean Delvare _______________________________________________ i2c mailing list i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org http://lists.lm-sensors.org/mailman/listinfo/i2c ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-05-02 20:47 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-30 23:53 [PATCH 1/3] I2C: DaVinci: move dev_debug line for more output Troy Kisky
[not found] ` <1209599638-17057-1-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>
2008-04-30 23:53 ` [PATCH 2/3] I2C: DaVinci: initialize cmd_complete sooner Troy Kisky
[not found] ` <1209599638-17057-2-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>
2008-04-30 23:53 ` [PATCH 3/3] I2C: DaVinci: fix signal handling bug Troy Kisky
[not found] ` <1209599638-17057-3-git-send-email-troy.kisky-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>
2008-05-02 14:05 ` Jean Delvare
[not found] ` <20080502160540.2367669e-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-05-02 20:41 ` Troy Kisky
[not found] ` <481B7C87.5020405-Q5RJGjKts06CY9SHAMCTRUEOCMrvLtNR@public.gmane.org>
2008-05-02 20:47 ` Jean Delvare
2008-05-02 13:46 ` [PATCH 1/3] I2C: DaVinci: move dev_debug line for more output Jean Delvare
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox