bnx2x: Obtain Bus Device Function from register
BDF was obtained from kernel but since in virtualized environment (e.g. physical device assigment in KVM) the function number may not be the real one, the info must be obtained from the device. Signed-off-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
127a425e8f
commit
c22610d000
2 changed files with 18 additions and 2 deletions
|
@ -10546,6 +10546,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
|
|||
{
|
||||
struct bnx2x *bp;
|
||||
int rc;
|
||||
u32 pci_cfg_dword;
|
||||
bool chip_is_e1x = (board_type == BCM57710 ||
|
||||
board_type == BCM57711 ||
|
||||
board_type == BCM57711E);
|
||||
|
@ -10556,7 +10557,6 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
|
|||
bp->dev = dev;
|
||||
bp->pdev = pdev;
|
||||
bp->flags = 0;
|
||||
bp->pf_num = PCI_FUNC(pdev->devfn);
|
||||
|
||||
rc = pci_enable_device(pdev);
|
||||
if (rc) {
|
||||
|
@ -10623,6 +10623,21 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
|
|||
goto err_out_release;
|
||||
}
|
||||
|
||||
/* In E1/E1H use pci device function given by kernel.
|
||||
* In E2/E3 read physical function from ME register since these chips
|
||||
* support Physical Device Assignment where kernel BDF maybe arbitrary
|
||||
* (depending on hypervisor).
|
||||
*/
|
||||
if (chip_is_e1x)
|
||||
bp->pf_num = PCI_FUNC(pdev->devfn);
|
||||
else {/* chip is E2/3*/
|
||||
pci_read_config_dword(bp->pdev,
|
||||
PCICFG_ME_REGISTER, &pci_cfg_dword);
|
||||
bp->pf_num = (u8)((pci_cfg_dword & ME_REG_ABS_PF_NUM) >>
|
||||
ME_REG_ABS_PF_NUM_SHIFT);
|
||||
}
|
||||
DP(BNX2X_MSG_SP, "me reg PF num: %d\n", bp->pf_num);
|
||||
|
||||
bnx2x_set_power_state(bp, PCI_D0);
|
||||
|
||||
/* clean indirect addresses */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue