bnxt_en: Add SR-IOV support for 57500 chips.
There are some minor differences when assigning VF resources on the new chips. The MSIX (NQ) resource has to be assigned and ring group is not needed on the new chips. Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
36d65be9a8
commit
b16b689186
@ -118,6 +118,7 @@ enum board_idx {
|
||||
NETXTREME_E_VF,
|
||||
NETXTREME_C_VF,
|
||||
NETXTREME_S_VF,
|
||||
NETXTREME_E_P5_VF,
|
||||
};
|
||||
|
||||
/* indexed by enum above */
|
||||
@ -160,6 +161,7 @@ static const struct {
|
||||
[NETXTREME_E_VF] = { "Broadcom NetXtreme-E Ethernet Virtual Function" },
|
||||
[NETXTREME_C_VF] = { "Broadcom NetXtreme-C Ethernet Virtual Function" },
|
||||
[NETXTREME_S_VF] = { "Broadcom NetXtreme-S Ethernet Virtual Function" },
|
||||
[NETXTREME_E_P5_VF] = { "Broadcom BCM5750X NetXtreme-E Ethernet Virtual Function" },
|
||||
};
|
||||
|
||||
static const struct pci_device_id bnxt_pci_tbl[] = {
|
||||
@ -210,6 +212,7 @@ static const struct pci_device_id bnxt_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16dc), .driver_data = NETXTREME_E_VF },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e1), .driver_data = NETXTREME_C_VF },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e5), .driver_data = NETXTREME_C_VF },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x1807), .driver_data = NETXTREME_E_P5_VF },
|
||||
{ PCI_VDEVICE(BROADCOM, 0xd800), .driver_data = NETXTREME_S_VF },
|
||||
#endif
|
||||
{ 0 }
|
||||
@ -237,7 +240,7 @@ static struct workqueue_struct *bnxt_pf_wq;
|
||||
static bool bnxt_vf_pciid(enum board_idx idx)
|
||||
{
|
||||
return (idx == NETXTREME_C_VF || idx == NETXTREME_E_VF ||
|
||||
idx == NETXTREME_S_VF);
|
||||
idx == NETXTREME_S_VF || idx == NETXTREME_E_P5_VF);
|
||||
}
|
||||
|
||||
#define DB_CP_REARM_FLAGS (DB_KEY_CP | DB_IDX_VALID)
|
||||
@ -5356,7 +5359,7 @@ static int bnxt_hwrm_reserve_rings(struct bnxt *bp, int tx, int rx, int grp,
|
||||
vnic);
|
||||
}
|
||||
|
||||
static int bnxt_nq_rings_in_use(struct bnxt *bp)
|
||||
int bnxt_nq_rings_in_use(struct bnxt *bp)
|
||||
{
|
||||
int cp = bp->cp_nr_rings;
|
||||
int ulp_msix, ulp_base;
|
||||
|
@ -1686,6 +1686,7 @@ int bnxt_hwrm_func_rgtr_async_events(struct bnxt *bp, unsigned long *bmap,
|
||||
int bmap_size);
|
||||
int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id);
|
||||
int __bnxt_hwrm_get_tx_rings(struct bnxt *bp, u16 fid, int *tx_rings);
|
||||
int bnxt_nq_rings_in_use(struct bnxt *bp);
|
||||
int bnxt_hwrm_set_coal(struct bnxt *);
|
||||
unsigned int bnxt_get_max_func_stat_ctxs(struct bnxt *bp);
|
||||
unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp);
|
||||
|
@ -448,16 +448,22 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs)
|
||||
u16 vf_stat_ctx, vf_vnics, vf_ring_grps;
|
||||
struct bnxt_pf_info *pf = &bp->pf;
|
||||
int i, rc = 0, min = 1;
|
||||
u16 vf_msix = 0;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_VF_RESOURCE_CFG, -1, -1);
|
||||
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5) {
|
||||
vf_msix = hw_resc->max_nqs - bnxt_nq_rings_in_use(bp);
|
||||
vf_ring_grps = 0;
|
||||
} else {
|
||||
vf_ring_grps = hw_resc->max_hw_ring_grps - bp->rx_nr_rings;
|
||||
}
|
||||
vf_cp_rings = bnxt_get_avail_cp_rings_for_en(bp);
|
||||
vf_stat_ctx = bnxt_get_avail_stat_ctxs_for_en(bp);
|
||||
if (bp->flags & BNXT_FLAG_AGG_RINGS)
|
||||
vf_rx_rings = hw_resc->max_rx_rings - bp->rx_nr_rings * 2;
|
||||
else
|
||||
vf_rx_rings = hw_resc->max_rx_rings - bp->rx_nr_rings;
|
||||
vf_ring_grps = hw_resc->max_hw_ring_grps - bp->rx_nr_rings;
|
||||
vf_tx_rings = hw_resc->max_tx_rings - bp->tx_nr_rings;
|
||||
vf_vnics = hw_resc->max_vnics - bp->nr_vnics;
|
||||
vf_vnics = min_t(u16, vf_vnics, vf_rx_rings);
|
||||
@ -476,7 +482,8 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs)
|
||||
req.min_l2_ctxs = cpu_to_le16(min);
|
||||
req.min_vnics = cpu_to_le16(min);
|
||||
req.min_stat_ctx = cpu_to_le16(min);
|
||||
req.min_hw_ring_grps = cpu_to_le16(min);
|
||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
|
||||
req.min_hw_ring_grps = cpu_to_le16(min);
|
||||
} else {
|
||||
vf_cp_rings /= num_vfs;
|
||||
vf_tx_rings /= num_vfs;
|
||||
@ -500,6 +507,8 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs)
|
||||
req.max_vnics = cpu_to_le16(vf_vnics);
|
||||
req.max_stat_ctx = cpu_to_le16(vf_stat_ctx);
|
||||
req.max_hw_ring_grps = cpu_to_le16(vf_ring_grps);
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5)
|
||||
req.max_msix = cpu_to_le16(vf_msix / num_vfs);
|
||||
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
for (i = 0; i < num_vfs; i++) {
|
||||
@ -525,6 +534,8 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs)
|
||||
hw_resc->max_rsscos_ctxs -= pf->active_vfs;
|
||||
hw_resc->max_stat_ctxs -= le16_to_cpu(req.min_stat_ctx) * n;
|
||||
hw_resc->max_vnics -= le16_to_cpu(req.min_vnics) * n;
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5)
|
||||
hw_resc->max_irqs -= vf_msix * n;
|
||||
|
||||
rc = pf->active_vfs;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user