diff mbox

PCI: fix SR-IOV function dependency link problem

Message ID 1242810717-1436-1-git-send-email-yu.zhao@intel.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Yu Zhao May 20, 2009, 9:11 a.m. UTC
PCIe root complex integrated endpoint does not implement ARI, so this
kind of endpoint uses 3-bit function number. The function dependency
link of the integrated endpoint should be calculated using the device
number plus the value from function dependency link register.

Normal endpoint always implements ARI and the function dependency link
register contains 8-bit function number (i.e. `devfn' from software's
perspective).

Signed-off-by: Yu Zhao <yu.zhao@intel.com>
---
 drivers/pci/iov.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

Comments

Jesse Barnes June 11, 2009, 6:27 p.m. UTC | #1
On Wed, 20 May 2009 17:11:57 +0800
Yu Zhao <yu.zhao@intel.com> wrote:

> PCIe root complex integrated endpoint does not implement ARI, so this
> kind of endpoint uses 3-bit function number. The function dependency
> link of the integrated endpoint should be calculated using the device
> number plus the value from function dependency link register.
> 
> Normal endpoint always implements ARI and the function dependency link
> register contains 8-bit function number (i.e. `devfn' from software's
> perspective).
> 
> Signed-off-by: Yu Zhao <yu.zhao@intel.com>
> ---
>  drivers/pci/iov.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> index b497daa..e87fe95 100644
> --- a/drivers/pci/iov.c
> +++ b/drivers/pci/iov.c
> @@ -487,6 +487,8 @@ found:
>  	iov->self = dev;
>  	pci_read_config_dword(dev, pos + PCI_SRIOV_CAP, &iov->cap);
>  	pci_read_config_byte(dev, pos + PCI_SRIOV_FUNC_LINK,
> &iov->link);
> +	if (dev->pcie_type == PCI_EXP_TYPE_RC_END)
> +		iov->link = PCI_DEVFN(PCI_SLOT(dev->devfn),
> iov->link); 
>  	if (pdev)
>  		iov->dev = pci_dev_get(pdev);

Applied to my linux-next branch, thanks Yu.
diff mbox

Patch

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index b497daa..e87fe95 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -487,6 +487,8 @@  found:
 	iov->self = dev;
 	pci_read_config_dword(dev, pos + PCI_SRIOV_CAP, &iov->cap);
 	pci_read_config_byte(dev, pos + PCI_SRIOV_FUNC_LINK, &iov->link);
+	if (dev->pcie_type == PCI_EXP_TYPE_RC_END)
+		iov->link = PCI_DEVFN(PCI_SLOT(dev->devfn), iov->link);
 
 	if (pdev)
 		iov->dev = pci_dev_get(pdev);