* [PATCH 0/4] i2c-i801: Make interrupt mode more robust
@ 2014-11-10 21:26 Jean Delvare
[not found] ` <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
0 siblings, 1 reply; 12+ messages in thread
From: Jean Delvare @ 2014-11-10 21:26 UTC (permalink / raw)
To: Linux I2C; +Cc: Wolfram Sang
Hi all,
This is a patch series aiming at making the interrupt mode of the
i2c-i801 driver more robust. A number of driver lock-ups have been
reported on a few systems over the past few years, all related to
interrupt mode. So let's make it more tolerant to unreliable hardware
or whatever the actual problem is.
i2c-i801: Use wait_event_timeout to wait for interrupts
i2c-i801: Fallback to polling if request_irq() fails
i2c-i801: Check if interrupts are disabled
i2c-i801: Drop useless debug message
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 12+ messages in thread[parent not found: <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* [PATCH 1/4] i2c-i801: Use wait_event_timeout to wait for interrupts [not found] ` <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> @ 2014-11-10 21:30 ` Jean Delvare 2014-11-10 21:31 ` [PATCH 2/4] i2c-i801: Fallback to polling if request_irq() fails Jean Delvare ` (2 subsequent siblings) 3 siblings, 0 replies; 12+ messages in thread From: Jean Delvare @ 2014-11-10 21:30 UTC (permalink / raw) To: Linux I2C; +Cc: Wolfram Sang Some systems have been reported to have trouble with interrupts. Use wait_event_timeout() instead of wait_event() so we don't get stuck in that case, and log the problem. Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> --- drivers/i2c/busses/i2c-i801.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:26:47.212135115 +0100 +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:18.040417276 +0100 @@ -2,7 +2,7 @@ Copyright (c) 1998 - 2002 Frodo Looijaard <frodol-B0qZmFHriGg@public.gmane.org>, Philip Edelbrock <phil-KXOFo5pg7o1l57MIdRCFDg@public.gmane.org>, and Mark D. Studebaker <mdsxyz123-/E1597aS9LQAvxtiuMwx3w@public.gmane.org> - Copyright (C) 2007 - 2012 Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> + Copyright (C) 2007 - 2014 Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> Copyright (C) 2010 Intel Corporation, David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org> @@ -373,6 +373,7 @@ static int i801_transaction(struct i801_ { int status; int result; + const struct i2c_adapter *adap = &priv->adapter; result = i801_check_pre(priv); if (result < 0) @@ -381,7 +382,14 @@ static int i801_transaction(struct i801_ if (priv->features & FEATURE_IRQ) { outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START, SMBHSTCNT(priv)); - wait_event(priv->waitq, (status = priv->status)); + result = wait_event_timeout(priv->waitq, + (status = priv->status), + adap->timeout); + if (!result) { + status = -ETIMEDOUT; + dev_warn(&priv->pci_dev->dev, + "Timeout waiting for interrupt!\n"); + } priv->status = 0; return i801_check_post(priv, status); } @@ -529,6 +537,7 @@ static int i801_block_transaction_byte_b int smbcmd; int status; int result; + const struct i2c_adapter *adap = &priv->adapter; result = i801_check_pre(priv); if (result < 0) @@ -557,7 +566,14 @@ static int i801_block_transaction_byte_b priv->data = &data->block[1]; outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); - wait_event(priv->waitq, (status = priv->status)); + result = wait_event_timeout(priv->waitq, + (status = priv->status), + adap->timeout); + if (!result) { + status = -ETIMEDOUT; + dev_warn(&priv->pci_dev->dev, + "Timeout waiting for interrupt!\n"); + } priv->status = 0; return i801_check_post(priv, status); } @@ -1215,6 +1231,9 @@ static int i801_probe(struct pci_dev *de outb_p(inb_p(SMBAUXCTL(priv)) & ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); + /* Default timeout in interrupt mode: 200 ms */ + priv->adapter.timeout = HZ / 5; + if (priv->features & FEATURE_IRQ) { init_waitqueue_head(&priv->waitq); -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/4] i2c-i801: Fallback to polling if request_irq() fails [not found] ` <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> 2014-11-10 21:30 ` [PATCH 1/4] i2c-i801: Use wait_event_timeout to wait for interrupts Jean Delvare @ 2014-11-10 21:31 ` Jean Delvare [not found] ` <20141110223104.6419229d-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> 2014-11-10 21:31 ` [PATCH 3/4] i2c-i801: Check if interrupts are disabled Jean Delvare 2014-11-10 21:32 ` [PATCH 4/4] i2c-i801: Drop useless debug message Jean Delvare 3 siblings, 1 reply; 12+ messages in thread From: Jean Delvare @ 2014-11-10 21:31 UTC (permalink / raw) To: Linux I2C; +Cc: Wolfram Sang The i2c-i801 driver can work without interrupts, so there is no reason to make a request_irq failure fatal. Instead we can simply fallback to polling. Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> --- drivers/i2c/busses/i2c-i801.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:42.788955868 +0100 +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:44.416991298 +0100 @@ -1242,9 +1242,11 @@ static int i801_probe(struct pci_dev *de if (err) { dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", dev->irq, err); - goto exit_release; + priv->features &= ~FEATURE_IRQ; + dev_info(&dev->dev, "SMBus using polling\n"); + } else { + dev_info(&dev->dev, "SMBus using PCI interrupt\n"); } - dev_info(&dev->dev, "SMBus using PCI Interrupt\n"); } /* set up the sysfs linkage to our parent device */ @@ -1272,7 +1274,6 @@ static int i801_probe(struct pci_dev *de exit_free_irq: if (priv->features & FEATURE_IRQ) free_irq(dev->irq, priv); -exit_release: pci_release_region(dev, SMBBAR); exit: kfree(priv); -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <20141110223104.6419229d-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* Re: [PATCH 2/4] i2c-i801: Fallback to polling if request_irq() fails [not found] ` <20141110223104.6419229d-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> @ 2014-11-11 10:57 ` Wolfram Sang 2014-11-11 13:55 ` Jean Delvare 0 siblings, 1 reply; 12+ messages in thread From: Wolfram Sang @ 2014-11-11 10:57 UTC (permalink / raw) To: Jean Delvare; +Cc: Linux I2C [-- Attachment #1: Type: text/plain, Size: 1623 bytes --] On Mon, Nov 10, 2014 at 10:31:04PM +0100, Jean Delvare wrote: > The i2c-i801 driver can work without interrupts, so there is no reason > to make a request_irq failure fatal. Instead we can simply fallback > to polling. > > Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> > Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> > --- > drivers/i2c/busses/i2c-i801.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:42.788955868 +0100 > +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:44.416991298 +0100 > @@ -1242,9 +1242,11 @@ static int i801_probe(struct pci_dev *de > if (err) { > dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", > dev->irq, err); > - goto exit_release; > + priv->features &= ~FEATURE_IRQ; > + dev_info(&dev->dev, "SMBus using polling\n"); Shouldn't this message also be printed for !FEATURE_IRQ? I'd think it should be moved to another place. We can also deduce from the dev_err above that polling will be used, no? > + } else { > + dev_info(&dev->dev, "SMBus using PCI interrupt\n"); > } > - dev_info(&dev->dev, "SMBus using PCI Interrupt\n"); > } > > /* set up the sysfs linkage to our parent device */ > @@ -1272,7 +1274,6 @@ static int i801_probe(struct pci_dev *de > exit_free_irq: > if (priv->features & FEATURE_IRQ) > free_irq(dev->irq, priv); > -exit_release: > pci_release_region(dev, SMBBAR); > exit: > kfree(priv); > > -- > Jean Delvare > SUSE L3 Support [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/4] i2c-i801: Fallback to polling if request_irq() fails 2014-11-11 10:57 ` Wolfram Sang @ 2014-11-11 13:55 ` Jean Delvare 0 siblings, 0 replies; 12+ messages in thread From: Jean Delvare @ 2014-11-11 13:55 UTC (permalink / raw) To: Wolfram Sang; +Cc: Linux I2C Hi Wolfram, Thanks for the quick review, very appreciated. On Tue, 11 Nov 2014 11:57:34 +0100, Wolfram Sang wrote: > On Mon, Nov 10, 2014 at 10:31:04PM +0100, Jean Delvare wrote: > > The i2c-i801 driver can work without interrupts, so there is no reason > > to make a request_irq failure fatal. Instead we can simply fallback > > to polling. > > > > Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> > > Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> > > --- > > drivers/i2c/busses/i2c-i801.c | 7 ++++--- > > 1 file changed, 4 insertions(+), 3 deletions(-) > > > > --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:42.788955868 +0100 > > +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:44.416991298 +0100 > > @@ -1242,9 +1242,11 @@ static int i801_probe(struct pci_dev *de > > if (err) { > > dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", > > dev->irq, err); > > - goto exit_release; > > + priv->features &= ~FEATURE_IRQ; > > + dev_info(&dev->dev, "SMBus using polling\n"); > > Shouldn't this message also be printed for !FEATURE_IRQ? I'd think it > should be moved to another place. Good point, I'll rework that part of the code and resubmit. > We can also deduce from the dev_err > above that polling will be used, no? Having to deduce things doesn't make my supporter's life easy. Given the problems that have been reported by the i2c-i801 driver users lately, I'd rather be verbose during initialization to make bug reports easier to analyze. > > + } else { > > + dev_info(&dev->dev, "SMBus using PCI interrupt\n"); > > } > > - dev_info(&dev->dev, "SMBus using PCI Interrupt\n"); > > } > > > > /* set up the sysfs linkage to our parent device */ > > @@ -1272,7 +1274,6 @@ static int i801_probe(struct pci_dev *de > > exit_free_irq: > > if (priv->features & FEATURE_IRQ) > > free_irq(dev->irq, priv); > > -exit_release: > > pci_release_region(dev, SMBBAR); > > exit: > > kfree(priv); > > -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/4] i2c-i801: Check if interrupts are disabled [not found] ` <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> 2014-11-10 21:30 ` [PATCH 1/4] i2c-i801: Use wait_event_timeout to wait for interrupts Jean Delvare 2014-11-10 21:31 ` [PATCH 2/4] i2c-i801: Fallback to polling if request_irq() fails Jean Delvare @ 2014-11-10 21:31 ` Jean Delvare [not found] ` <20141110223139.02aafde4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> 2014-11-10 21:32 ` [PATCH 4/4] i2c-i801: Drop useless debug message Jean Delvare 3 siblings, 1 reply; 12+ messages in thread From: Jean Delvare @ 2014-11-10 21:31 UTC (permalink / raw) To: Linux I2C; +Cc: Wolfram Sang There is a control bit in the PCI configuration space which disables interrupts. If this bit is set, the driver should not try to make use of interrupts, it won't receive any. Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> --- drivers/i2c/busses/i2c-i801.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:44.416991298 +0100 +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:46.915045662 +0100 @@ -110,12 +110,16 @@ /* PCI Address Constants */ #define SMBBAR 4 +#define SMBPCICTL 0x004 #define SMBPCISTS 0x006 #define SMBHSTCFG 0x040 /* Host status bits for SMBPCISTS */ #define SMBPCISTS_INTS 0x08 +/* Control bits for SMBPCICTL */ +#define SMBPCICTL_INTDIS 0x0400 + /* Host configuration bits for SMBHSTCFG */ #define SMBHSTCFG_HST_EN 1 #define SMBHSTCFG_SMB_SMI_EN 2 @@ -1235,6 +1239,23 @@ static int i801_probe(struct pci_dev *de priv->adapter.timeout = HZ / 5; if (priv->features & FEATURE_IRQ) { + u16 pcictl, pcists; + + /* Complain if an interrupt is already pending */ + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); + if (pcists & SMBPCISTS_INTS) + dev_warn(&dev->dev, "An interrupt is pending!\n"); + + /* Check if interrupts have been disabled */ + pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); + if (pcictl & SMBPCICTL_INTDIS) { + dev_warn(&dev->dev, + "Interrupts are disabled, will use polling\n"); + priv->features &= ~FEATURE_IRQ; + } + } + + if (priv->features & FEATURE_IRQ) { init_waitqueue_head(&priv->waitq); err = request_irq(dev->irq, i801_isr, IRQF_SHARED, -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <20141110223139.02aafde4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* Re: [PATCH 3/4] i2c-i801: Check if interrupts are disabled [not found] ` <20141110223139.02aafde4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> @ 2014-11-11 10:58 ` Wolfram Sang 2014-11-11 14:32 ` Jean Delvare 0 siblings, 1 reply; 12+ messages in thread From: Wolfram Sang @ 2014-11-11 10:58 UTC (permalink / raw) To: Jean Delvare; +Cc: Linux I2C [-- Attachment #1: Type: text/plain, Size: 2097 bytes --] On Mon, Nov 10, 2014 at 10:31:39PM +0100, Jean Delvare wrote: > There is a control bit in the PCI configuration space which disables > interrupts. If this bit is set, the driver should not try to make use > of interrupts, it won't receive any. > > Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> > Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> > --- > drivers/i2c/busses/i2c-i801.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:44.416991298 +0100 > +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:46.915045662 +0100 > @@ -110,12 +110,16 @@ > > /* PCI Address Constants */ > #define SMBBAR 4 > +#define SMBPCICTL 0x004 > #define SMBPCISTS 0x006 > #define SMBHSTCFG 0x040 > > /* Host status bits for SMBPCISTS */ > #define SMBPCISTS_INTS 0x08 > > +/* Control bits for SMBPCICTL */ > +#define SMBPCICTL_INTDIS 0x0400 > + > /* Host configuration bits for SMBHSTCFG */ > #define SMBHSTCFG_HST_EN 1 > #define SMBHSTCFG_SMB_SMI_EN 2 > @@ -1235,6 +1239,23 @@ static int i801_probe(struct pci_dev *de > priv->adapter.timeout = HZ / 5; > > if (priv->features & FEATURE_IRQ) { > + u16 pcictl, pcists; > + > + /* Complain if an interrupt is already pending */ > + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); > + if (pcists & SMBPCISTS_INTS) > + dev_warn(&dev->dev, "An interrupt is pending!\n"); You think it is better to not clear it? > + > + /* Check if interrupts have been disabled */ > + pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); > + if (pcictl & SMBPCICTL_INTDIS) { > + dev_warn(&dev->dev, > + "Interrupts are disabled, will use polling\n"); I'd say it is more info than warning? > + priv->features &= ~FEATURE_IRQ; > + } > + } > + > + if (priv->features & FEATURE_IRQ) { > init_waitqueue_head(&priv->waitq); > > err = request_irq(dev->irq, i801_isr, IRQF_SHARED, > > -- > Jean Delvare > SUSE L3 Support [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/4] i2c-i801: Check if interrupts are disabled 2014-11-11 10:58 ` Wolfram Sang @ 2014-11-11 14:32 ` Jean Delvare [not found] ` <20141111153214.39dfaeb8-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> 0 siblings, 1 reply; 12+ messages in thread From: Jean Delvare @ 2014-11-11 14:32 UTC (permalink / raw) To: Wolfram Sang; +Cc: Linux I2C Hi Wolfram, On Tue, 11 Nov 2014 11:58:54 +0100, Wolfram Sang wrote: > On Mon, Nov 10, 2014 at 10:31:39PM +0100, Jean Delvare wrote: > > There is a control bit in the PCI configuration space which disables > > interrupts. If this bit is set, the driver should not try to make use > > of interrupts, it won't receive any. > > > > Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> > > Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> > > --- > > drivers/i2c/busses/i2c-i801.c | 21 +++++++++++++++++++++ > > 1 file changed, 21 insertions(+) > > > > --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:44.416991298 +0100 > > +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 22:29:46.915045662 +0100 > > @@ -110,12 +110,16 @@ > > > > /* PCI Address Constants */ > > #define SMBBAR 4 > > +#define SMBPCICTL 0x004 > > #define SMBPCISTS 0x006 > > #define SMBHSTCFG 0x040 > > > > /* Host status bits for SMBPCISTS */ > > #define SMBPCISTS_INTS 0x08 > > > > +/* Control bits for SMBPCICTL */ > > +#define SMBPCICTL_INTDIS 0x0400 > > + > > /* Host configuration bits for SMBHSTCFG */ > > #define SMBHSTCFG_HST_EN 1 > > #define SMBHSTCFG_SMB_SMI_EN 2 > > @@ -1235,6 +1239,23 @@ static int i801_probe(struct pci_dev *de > > priv->adapter.timeout = HZ / 5; > > > > if (priv->features & FEATURE_IRQ) { > > + u16 pcictl, pcists; > > + > > + /* Complain if an interrupt is already pending */ > > + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); > > + if (pcists & SMBPCISTS_INTS) > > + dev_warn(&dev->dev, "An interrupt is pending!\n"); > > You think it is better to not clear it? I admit I did not think about it. As I am trying to better understand the few mysterious failure cases that have been reported to me, I just wanted to log everything out of the ordinary. I have no idea what's considered the right thing to do in such a situation. Do you believe that clearing the interrupt is the appropriate action in that case? > > + > > + /* Check if interrupts have been disabled */ > > + pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); > > + if (pcictl & SMBPCICTL_INTDIS) { > > + dev_warn(&dev->dev, > > + "Interrupts are disabled, will use polling\n"); > > I'd say it is more info than warning? Correct, I'll change it. > > + priv->features &= ~FEATURE_IRQ; > > + } > > + } > > + > > + if (priv->features & FEATURE_IRQ) { > > init_waitqueue_head(&priv->waitq); > > > > err = request_irq(dev->irq, i801_isr, IRQF_SHARED, Thanks again, -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <20141111153214.39dfaeb8-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* Re: [PATCH 3/4] i2c-i801: Check if interrupts are disabled [not found] ` <20141111153214.39dfaeb8-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> @ 2014-11-11 14:41 ` Wolfram Sang 2014-11-11 20:06 ` Jean Delvare 0 siblings, 1 reply; 12+ messages in thread From: Wolfram Sang @ 2014-11-11 14:41 UTC (permalink / raw) To: Jean Delvare; +Cc: Linux I2C [-- Attachment #1: Type: text/plain, Size: 927 bytes --] > > > + if (pcists & SMBPCISTS_INTS) > > > + dev_warn(&dev->dev, "An interrupt is pending!\n"); > > > > You think it is better to not clear it? > > I admit I did not think about it. As I am trying to better understand > the few mysterious failure cases that have been reported to me, I just > wanted to log everything out of the ordinary. I have no idea what's > considered the right thing to do in such a situation. Do you believe > that clearing the interrupt is the appropriate action in that case? Depends on the driver, I'd say (which I haven't looked at in detail). If this causes the irq handler to be called as soon as the irq is registered, and if the state machine gets confused then, then it should be cleared beforehand, of course. If this is not the case, then it might be better to be less intrusive, spit the warning, and wait for somebody to show up with this message in the logs. [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/4] i2c-i801: Check if interrupts are disabled 2014-11-11 14:41 ` Wolfram Sang @ 2014-11-11 20:06 ` Jean Delvare [not found] ` <20141111210646.02b77c68-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> 0 siblings, 1 reply; 12+ messages in thread From: Jean Delvare @ 2014-11-11 20:06 UTC (permalink / raw) To: Wolfram Sang; +Cc: Linux I2C On Tue, 11 Nov 2014 15:41:07 +0100, Wolfram Sang wrote: > > > > > + if (pcists & SMBPCISTS_INTS) > > > > + dev_warn(&dev->dev, "An interrupt is pending!\n"); > > > > > > You think it is better to not clear it? > > > > I admit I did not think about it. As I am trying to better understand > > the few mysterious failure cases that have been reported to me, I just > > wanted to log everything out of the ordinary. I have no idea what's > > considered the right thing to do in such a situation. Do you believe > > that clearing the interrupt is the appropriate action in that case? > > Depends on the driver, I'd say (which I haven't looked at in detail). If > this causes the irq handler to be called as soon as the irq is > registered, and if the state machine gets confused then, then it should > be cleared beforehand, of course. The driver should survive just fine if the irq handler is called early, but lacking the context, it won't do anything useful. Essentially it will clear the interrupt and wake up an empty queue. My actual concern is that I don't know what that would mean if an interrupt is pending at driver load time. If this is a leftover from a previous driver removal, or from the machine initialization (BIOS) then clearing it would be the right thing to do. But this could also mean that something (e.g. ACPI) is using the hardware and we should not. That being said, hitting the very moment where an interrupt is pending would be pretty random, so we can hardly rely on that anyway. Or this could mean that the interrupt setup is wrong somehow and we can't trust the SMBPCISTS_INTS because it is always set. At this point I just don't know. Another thing I am wondering about, and thinking about it again (I wrote this code several months ago) this is probably the reason why I added the test in the first place: can a new interrupt be triggered as long as the previous one has not been cleared? If not, that could explain why the driver sometimes didn't work at all in interrupt mode on some systems. > If this is not the case, then it might be better to be less intrusive, > spit the warning, and wait for somebody to show up with this message in > the logs. That was my intent, yes. We can always add an action later when we understand the situation better. If we ever get such a report, which might in fact never happen. Thanks, -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <20141111210646.02b77c68-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* Re: [PATCH 3/4] i2c-i801: Check if interrupts are disabled [not found] ` <20141111210646.02b77c68-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> @ 2014-11-11 20:13 ` Wolfram Sang 0 siblings, 0 replies; 12+ messages in thread From: Wolfram Sang @ 2014-11-11 20:13 UTC (permalink / raw) To: Jean Delvare; +Cc: Linux I2C [-- Attachment #1: Type: text/plain, Size: 368 bytes --] > > If this is not the case, then it might be better to be less intrusive, > > spit the warning, and wait for somebody to show up with this message in > > the logs. > > That was my intent, yes. We can always add an action later when we > understand the situation better. If we ever get such a report, which > might in fact never happen. Let's do it then! [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] i2c-i801: Drop useless debug message [not found] ` <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org> ` (2 preceding siblings ...) 2014-11-10 21:31 ` [PATCH 3/4] i2c-i801: Check if interrupts are disabled Jean Delvare @ 2014-11-10 21:32 ` Jean Delvare 3 siblings, 0 replies; 12+ messages in thread From: Jean Delvare @ 2014-11-10 21:32 UTC (permalink / raw) To: Linux I2C; +Cc: Wolfram Sang Don't log the host status register value in i801_isr(), it has very little value and fills up the log when debugging is enabled. Signed-off-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org> Cc: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> --- drivers/i2c/busses/i2c-i801.c | 3 --- 1 file changed, 3 deletions(-) --- linux-3.18-rc4.orig/drivers/i2c/busses/i2c-i801.c 2014-11-10 19:54:05.042326020 +0100 +++ linux-3.18-rc4/drivers/i2c/busses/i2c-i801.c 2014-11-10 19:56:51.562907696 +0100 @@ -507,9 +507,6 @@ static irqreturn_t i801_isr(int irq, voi return IRQ_NONE; status = inb_p(SMBHSTSTS(priv)); - if (status != 0x42) - dev_dbg(&priv->pci_dev->dev, "irq: status = %02x\n", status); - if (status & SMBHSTSTS_BYTE_DONE) i801_isr_byte_done(priv); -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2014-11-11 20:13 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-10 21:26 [PATCH 0/4] i2c-i801: Make interrupt mode more robust Jean Delvare
[not found] ` <20141110222655.13660613-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2014-11-10 21:30 ` [PATCH 1/4] i2c-i801: Use wait_event_timeout to wait for interrupts Jean Delvare
2014-11-10 21:31 ` [PATCH 2/4] i2c-i801: Fallback to polling if request_irq() fails Jean Delvare
[not found] ` <20141110223104.6419229d-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2014-11-11 10:57 ` Wolfram Sang
2014-11-11 13:55 ` Jean Delvare
2014-11-10 21:31 ` [PATCH 3/4] i2c-i801: Check if interrupts are disabled Jean Delvare
[not found] ` <20141110223139.02aafde4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2014-11-11 10:58 ` Wolfram Sang
2014-11-11 14:32 ` Jean Delvare
[not found] ` <20141111153214.39dfaeb8-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2014-11-11 14:41 ` Wolfram Sang
2014-11-11 20:06 ` Jean Delvare
[not found] ` <20141111210646.02b77c68-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2014-11-11 20:13 ` Wolfram Sang
2014-11-10 21:32 ` [PATCH 4/4] i2c-i801: Drop useless debug message Jean Delvare
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).