|
@@ -241,6 +241,11 @@ static const struct net_device_ops bnxt_vf_rep_netdev_ops = {
|
|
.ndo_get_phys_port_name = bnxt_vf_rep_get_phys_port_name
|
|
.ndo_get_phys_port_name = bnxt_vf_rep_get_phys_port_name
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+bool bnxt_dev_is_vf_rep(struct net_device *dev)
|
|
|
|
+{
|
|
|
|
+ return dev->netdev_ops == &bnxt_vf_rep_netdev_ops;
|
|
|
|
+}
|
|
|
|
+
|
|
/* Called when the parent PF interface is closed:
|
|
/* Called when the parent PF interface is closed:
|
|
* As the mode transition from SWITCHDEV to LEGACY
|
|
* As the mode transition from SWITCHDEV to LEGACY
|
|
* happens under the rtnl_lock() this routine is safe
|
|
* happens under the rtnl_lock() this routine is safe
|
|
@@ -376,6 +381,26 @@ static void bnxt_vf_rep_netdev_init(struct bnxt *bp, struct bnxt_vf_rep *vf_rep,
|
|
ether_addr_copy(dev->dev_addr, dev->perm_addr);
|
|
ether_addr_copy(dev->dev_addr, dev->perm_addr);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[])
|
|
|
|
+{
|
|
|
|
+ struct pci_dev *pdev = bp->pdev;
|
|
|
|
+ int pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN);
|
|
|
|
+ u32 dw;
|
|
|
|
+
|
|
|
|
+ if (!pos) {
|
|
|
|
+ netdev_info(bp->dev, "Unable do read adapter's DSN");
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* DSN (two dw) is at an offset of 4 from the cap pos */
|
|
|
|
+ pos += 4;
|
|
|
|
+ pci_read_config_dword(pdev, pos, &dw);
|
|
|
|
+ put_unaligned_le32(dw, &dsn[0]);
|
|
|
|
+ pci_read_config_dword(pdev, pos + 4, &dw);
|
|
|
|
+ put_unaligned_le32(dw, &dsn[4]);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int bnxt_vf_reps_create(struct bnxt *bp)
|
|
static int bnxt_vf_reps_create(struct bnxt *bp)
|
|
{
|
|
{
|
|
u16 *cfa_code_map = NULL, num_vfs = pci_num_vf(bp->pdev);
|
|
u16 *cfa_code_map = NULL, num_vfs = pci_num_vf(bp->pdev);
|
|
@@ -440,6 +465,11 @@ static int bnxt_vf_reps_create(struct bnxt *bp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* Read the adapter's DSN to use as the eswitch switch_id */
|
|
|
|
+ rc = bnxt_pcie_dsn_get(bp, bp->switch_id);
|
|
|
|
+ if (rc)
|
|
|
|
+ goto err;
|
|
|
|
+
|
|
/* publish cfa_code_map only after all VF-reps have been initialized */
|
|
/* publish cfa_code_map only after all VF-reps have been initialized */
|
|
bp->cfa_code_map = cfa_code_map;
|
|
bp->cfa_code_map = cfa_code_map;
|
|
bp->eswitch_mode = DEVLINK_ESWITCH_MODE_SWITCHDEV;
|
|
bp->eswitch_mode = DEVLINK_ESWITCH_MODE_SWITCHDEV;
|