No data received with Intel Corporation Gigabit CT Desktop
Adapter (82574L)
Wiktor Niesiobedzki
bsd at vink.pl
Sat Apr 30 06:42:13 UTC 2011
2011/4/29 Wiktor Niesiobedzki <bsd at vink.pl>:
> 2011/4/28 Jack Vogel <jfvogel at gmail.com>:
>> On Thu, Apr 28, 2011 at 2:28 PM, John Baldwin <jhb at freebsd.org> wrote:
>>>
>>> On Thursday, April 28, 2011 5:17:11 pm Wiktor Niesiobedzki wrote:
>>> > Though they mention that HT MSI windows is disabled. I'm not sure,
>>> > whether this matters.
>>>
>>> Yes, that is probably what breaks this.
>>>
>>> --
>>> John Baldwin
>>
>> Opps, missed that, thanks John. So, disable MSIX and MSI using sysctl,
>> then the driver should use legacy when it loads.
>>
>> Still, I'd get a different motherboard, sucks to not have MSIX :(
>>
>
> Thanks for hints. I've disabled MSIX and MSI:
> kadlubek# sysctl hw.pci | grep msi
> hw.pci.honor_msi_blacklist: 1
> hw.pci.enable_msix: 0
> hw.pci.enable_msi: 0
>
Ok, I found other way round about this. I've did some source code
reading and found following tunable:
hw.em.enable_msix=0
When set in loader.conf to 0, then the card magically starts to work
properly. The only thing in our code in em_setup_msix(), that raises
my doubts, is the following code path:
int rid = PCIR_BAR(EM_MSIX_BAR);
adapter->msix_mem = bus_alloc_resource_any(dev,
SYS_RES_MEMORY, &rid, RF_ACTIVE);
...
bus_release_resource(dev, SYS_RES_MEMORY,
PCIR_BAR(EM_MSIX_BAR), adapter->msix_mem);
Though manpage for bus_release_resource specifies, that rid needs to
be exactly the same, as this returned by bus_alloc_resource.
Changing the bus_release_resource to use rid instead of
PCIR_BAR(EM_MSIX_BAR) makes the card working, with sysctl settings:
hw.pci.enable_msix: 0
hw.pci.enable_msi: 0
instead of hw.em.enable_msix=0
The only thing that worries me, that when I don't have MSIX disabled
(anyway), then driver succeeds with the MSI-X allocation. Shouldn't we
in em_setup_msix check, how many vectors we have allocated with
pci_alloc_msix and if this is 0, then fallback to MSI/Legacy?
Or maybe pci_alloc_msix should report an error, when no
PCIB_ALLOC_MSIX succeded?
Cheers,
Wiktor Niesiobedzki
More information about the freebsd-stable
mailing list