Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Mar 2009 18:07:09 -0600
From:      Scott Long <scottl@samsco.org>
To:        Robert Noland <rnoland@freebsd.org>
Cc:        freebsd-current@freebsd.org, "Arno J. Klaassen" <arno@heho.snv.jussieu.fr>
Subject:   Re: msi broken?
Message-ID:  <49B700AD.7010500@samsco.org>
In-Reply-To: <1236728841.2091.5.camel@balrog.2hip.net>
References:  <wp1vt5bhc4.fsf@heho.snv.jussieu.fr>	<200903101425.28608.jhb@freebsd.org>	<wpab7tp5jj.fsf@heho.snv.jussieu.fr>	<200903101637.31039.jhb@freebsd.org>	<wpmybtj6h5.fsf@heho.snv.jussieu.fr> <1236728841.2091.5.camel@balrog.2hip.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Robert Noland wrote:
> On Wed, 2009-03-11 at 00:36 +0100, Arno J. Klaassen wrote:
>> John Baldwin <jhb@freebsd.org> writes:
>>
>>> On Tuesday 10 March 2009 3:00:00 pm Arno J. Klaassen wrote:
>>>> John Baldwin <jhb@freebsd.org> writes:
>>>>
>>>>> On Tuesday 10 March 2009 10:08:59 am Arno J. Klaassen wrote:
>>>>>> Hello,
>>>>>>
>>>>>> when upgrading this morning from a March 1 -current, if_bge
>>>>>> stopped working (and irq256: bge0 not showing up in
>>>>>> vmstat -i ). Setting hw.pci.enable_msi="0" makes it work again.
>>>>> Can you get a verbose dmesg (boot -v) with MSI enabled?
>>> Ok, so you are getting MSI interrupts assigned and routed ok.  Can you try 
>>> disabling the code that sets the INTx_MASK flag in the PCI command register 
>>> in sys/dev/pci/pci.c:pci_setup_intr()?
>> grr : "rid" sure is 1 for the if_bge interrupt. Please tell me which
>> lines of code set the INTx_MASK flag. Thanx, more tomorrow.
> 
> if rid is 0, the chip should be using INTx.  if rid > 0 then it should
> be using MSI.
> 
> 
>                         }
>                         mte->mte_handlers++;
>                 }
> #if 0 /* Comment this out/*
>                 /* Make sure that INTx is disabled if we are using MSI/MSIX */
>                 pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS);
> #endif
>         bad:
>                 if (error) {
>                         (void)bus_generic_teardown_intr(dev, child, irq,
>                             cookie);
>                         return (error);
> 
> robert.
> 

If this turns out to help this particular gentleman, then I'd like to
suggest a further test of having the bge driver explicitly reset the
the INTxDIS bit after calling bus_setup_intr().  If that works, then I
strongly suggest that we treat this as a localized quirk that drivers
will need to manage for themselves, and not something that the PCI layer
should try to control.  It might be possible to set up some sort of
hint system for drivers to programatically tell the PCI layer to treat
this bit special for a particular device instance.  What I don't want
to see is the PCI layer growing yet another hidden quirk table of
PCI IDs.  This kind of quirk knowledge belongs in the driver.

Scott




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49B700AD.7010500>