pci_alloc_msi error

lixin.pang at emc.com lixin.pang at emc.com
Fri Dec 9 14:31:15 UTC 2011


Thanks John,  It turned that it's blacklisted.  The reason is that some how it does not recognizes it as pcie or pcix chipset.  

I noticed that the MSI_CAP_NXT ptr is null for our PCI device, is that the reason why it doesn't recognize it as pcie or pcix?  I looked at the code, pci_read_extcap is the only place that the pcie_chipset and pcix_chipset got set.  

I changed the parameter pci_honor_msi_blacklist to 0 and everything worked.

Lixin

-----Original Message-----
From: John Baldwin [mailto:jhb at freebsd.org] 
Sent: Friday, December 09, 2011 8:02 AM
To: freebsd-drivers at freebsd.org
Cc: pang, lixin
Subject: Re: pci_alloc_msi error

On Thursday, December 08, 2011 8:56:39 pm lixin.pang at emc.com wrote:
> I'm writing a PCI device driver for freebsd 7.3.  In the driver attach
function,
> 
> pci_enable_busmaster(dev) returns 0,
> 
> pci_msi_count(dev) returns 1,
> 
> however, error = pci_alloc_msi(dev, &msi) failed with error == 6 
> (device not
configured).

I assume you set msi to 1 before you called it?  (It is both an input and output parameter.)

> Am I missing any steps before calling pci_alloc_msi?

I don't believe so.  The reasons I see that pci_alloc_msi() will fail with ENXIO are:

- the driver has allocated its INTx IRQ via bus_alloc_resource() of rid 0
  of the SYS_RES_IRQ type
- the driver has already allocated MSI or MSI-X IRQs
- MSI is blacklisted for the system or for a parent PCI-PCI bridge
- APIC mode is disabled or your system has an unsupported CPU (only
  Intel, AMD, and certain VIA CPUs are known to work, other CPUs
  might work, we just haven't heard of it).
- The system is completely out of MSI IRQ tokens (there are 512 of
  these, so this is doubtful)

--
John Baldwin



More information about the freebsd-drivers mailing list