From: Brendan McGrath <redmcg@redmandi.dyndns.org>
To: Kyle Sanderson <kyle.leet@gmail.com>
Cc: Mauro Carvalho Chehab <mchehab@osg.samsung.com>,
Hans Verkuil <hans.verkuil@cisco.com>,
Linux-Media <linux-media@vger.kernel.org>,
Linux-Kernal <linux-kernel@vger.kernel.org>,
torvalds@linux-foundation.org
Subject: Re: [PATCHv5] [media] saa7164: use an MSI interrupt when available
Date: Fri, 05 Jun 2015 15:09:48 +1000 [thread overview]
Message-ID: <55712F1C.7040909@redmandi.dyndns.org> (raw)
In-Reply-To: <CACsaVZL9WFAb8eWjzJ9LOL2jz1nNB7sFOdE0LuEqGrOT515mvg@mail.gmail.com>
Hi Kyle,
Great to hear you haven't had any problems since applying this patch!
I'm looking forward to seeing it in the Linux master branch too.
Version 5 of the patch has been accepted and committed to the media tree
by Mauro:
http://git.linuxtv.org/cgit.cgi/media_tree.git/commit/?id=77978089ddc90347644cc057e6b6cd169ac9abd4
I'm guessing it will therefore go in to the main Linux tree with the
release of kernel version v4.2? (or it can be submitted as a fix for
v4.1 - but I have no idea how a patch is selected on that criteria).
Hopefully someone can confirm or elaborate.
Regards,
Brendan McGrath
On 05/06/15 14:42, Kyle Sanderson wrote:
> This has been plaguing users for years (there's a number of threads on
> the Ubuntu board). I've been using revision 1 of the patch without
> issue since early February. This is from having to constantly reboot
> the system to flawless recording. If something has been outstanding
> from Brendan, please let me know and I'll happily make the requested
> changes.
>
> Can we please merge this? There are at-least three consumers in this
> thread alone that have confirmed this fixes the saa7164 driver for the
> HVR-2250 device.
> Kyle.
>
> PS: I can't seem to source out who owns this in the MAINTAINERS file?
>
> On Thu, Apr 9, 2015 at 11:39 PM, Brendan McGrath
> <redmcg@redmandi.dyndns.org> wrote:
>> Enhances driver to use an MSI interrupt when available.
>>
>> Adds the module option 'enable_msi' (type bool) which by default is
>> enabled. Can be set to 'N' to disable.
>>
>> Fixes (or can reduce the occurrence of) a crash which is most commonly
>> reported when both digital tuners of the saa7164 chip is in use. A
>> reported example can be found here:
>> http://permalink.gmane.org/gmane.linux.drivers.video-input-infrastructure/83948
>>
>> Reviewed-by: Steven Toth <stoth@kernellabs.com>
>> Signed-off-by: Brendan McGrath <redmcg@redmandi.dyndns.org>
>> ---
>> Changes since v4:
>> - improved readability by taking on suggestions made by Mauro
>> - the msi variable in the saa7164_dev structure is now a bool
>>
>> Thanks Mauro - good suggestions and I think I've taken on board all of them.
>>
>> drivers/media/pci/saa7164/saa7164-core.c | 66 ++++++++++++++++++++++++++++----
>> drivers/media/pci/saa7164/saa7164.h | 1 +
>> 2 files changed, 60 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/media/pci/saa7164/saa7164-core.c b/drivers/media/pci/saa7164/saa7164-core.c
>> index 9cf3c6c..5e4a9f0 100644
>> --- a/drivers/media/pci/saa7164/saa7164-core.c
>> +++ b/drivers/media/pci/saa7164/saa7164-core.c
>> @@ -85,6 +85,11 @@ module_param(guard_checking, int, 0644);
>> MODULE_PARM_DESC(guard_checking,
>> "enable dma sanity checking for buffer overruns");
>>
>> +static bool enable_msi = true;
>> +module_param(enable_msi, bool, 0444);
>> +MODULE_PARM_DESC(enable_msi,
>> + "enable the use of an msi interrupt if available");
>> +
>> static unsigned int saa7164_devcount;
>>
>> static DEFINE_MUTEX(devlist);
>> @@ -1184,6 +1189,39 @@ static int saa7164_thread_function(void *data)
>> return 0;
>> }
>>
>> +static bool saa7164_enable_msi(struct pci_dev *pci_dev, struct saa7164_dev *dev)
>> +{
>> + int err;
>> +
>> + if (!enable_msi) {
>> + printk(KERN_WARNING "%s() MSI disabled by module parameter 'enable_msi'"
>> + , __func__);
>> + return false;
>> + }
>> +
>> + err = pci_enable_msi(pci_dev);
>> +
>> + if (err) {
>> + printk(KERN_ERR "%s() Failed to enable MSI interrupt."
>> + " Falling back to a shared IRQ\n", __func__);
>> + return false;
>> + }
>> +
>> + /* no error - so request an msi interrupt */
>> + err = request_irq(pci_dev->irq, saa7164_irq, 0,
>> + dev->name, dev);
>> +
>> + if (err) {
>> + /* fall back to legacy interrupt */
>> + printk(KERN_ERR "%s() Failed to get an MSI interrupt."
>> + " Falling back to a shared IRQ\n", __func__);
>> + pci_disable_msi(pci_dev);
>> + return false;
>> + }
>> +
>> + return true;
>> +}
>> +
>> static int saa7164_initdev(struct pci_dev *pci_dev,
>> const struct pci_device_id *pci_id)
>> {
>> @@ -1230,13 +1268,22 @@ static int saa7164_initdev(struct pci_dev *pci_dev,
>> goto fail_irq;
>> }
>>
>> - err = request_irq(pci_dev->irq, saa7164_irq,
>> - IRQF_SHARED, dev->name, dev);
>> - if (err < 0) {
>> - printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name,
>> - pci_dev->irq);
>> - err = -EIO;
>> - goto fail_irq;
>> + /* irq bit */
>> + if (saa7164_enable_msi(pci_dev, dev)) {
>> + dev->msi = true;
>> + } else {
>> + /* if we have an error (i.e. we don't have an interrupt)
>> + or msi is not enabled - fallback to shared interrupt */
>> +
>> + err = request_irq(pci_dev->irq, saa7164_irq,
>> + IRQF_SHARED, dev->name, dev);
>> +
>> + if (err < 0) {
>> + printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name,
>> + pci_dev->irq);
>> + err = -EIO;
>> + goto fail_irq;
>> + }
>> }
>>
>> pci_set_drvdata(pci_dev, dev);
>> @@ -1439,6 +1486,11 @@ static void saa7164_finidev(struct pci_dev *pci_dev)
>> /* unregister stuff */
>> free_irq(pci_dev->irq, dev);
>>
>> + if (dev->msi) {
>> + pci_disable_msi(pci_dev);
>> + dev->msi = false;
>> + }
>> +
>> pci_disable_device(pci_dev);
>>
>> mutex_lock(&devlist);
>> diff --git a/drivers/media/pci/saa7164/saa7164.h b/drivers/media/pci/saa7164/saa7164.h
>> index cd1a07c..75a3f51 100644
>> --- a/drivers/media/pci/saa7164/saa7164.h
>> +++ b/drivers/media/pci/saa7164/saa7164.h
>> @@ -459,6 +459,7 @@ struct saa7164_dev {
>> /* Interrupt status and ack registers */
>> u32 int_status;
>> u32 int_ack;
>> + bool msi;
>>
>> struct cmd cmds[SAA_CMD_MAX_MSG_UNITS];
>> struct mutex lock;
>> --
>> 1.9.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
prev parent reply other threads:[~2015-06-05 5:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <54EFAC4B.6080002@redmandi.dyndns.org>
2015-03-01 0:14 ` [PATCHv3] [media] saa7164: use an MSI interrupt when available Brendan McGrath
2015-03-04 3:42 ` catchall
2015-03-14 3:27 ` [PATCHv4] " Brendan McGrath
2015-04-08 20:43 ` Mauro Carvalho Chehab
2015-04-10 6:39 ` [PATCHv5] " Brendan McGrath
2015-06-05 4:42 ` Kyle Sanderson
2015-06-05 5:09 ` Brendan McGrath [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55712F1C.7040909@redmandi.dyndns.org \
--to=redmcg@redmandi.dyndns.org \
--cc=hans.verkuil@cisco.com \
--cc=kyle.leet@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@osg.samsung.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).