Commit 6a4f2947 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Refactor hardware resource data structures.

In preparation for new firmware APIs to allocate hardware resources,
add a new struct bnxt_hw_resc to hold various min, max and reserved
resources.  This new structure is common for PFs and VFs.
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 80fcaf46
...@@ -4540,7 +4540,7 @@ static int bnxt_hwrm_reserve_tx_rings(struct bnxt *bp, int *tx_rings) ...@@ -4540,7 +4540,7 @@ static int bnxt_hwrm_reserve_tx_rings(struct bnxt *bp, int *tx_rings)
rc = __bnxt_hwrm_get_tx_rings(bp, 0xffff, tx_rings); rc = __bnxt_hwrm_get_tx_rings(bp, 0xffff, tx_rings);
mutex_unlock(&bp->hwrm_cmd_lock); mutex_unlock(&bp->hwrm_cmd_lock);
if (!rc) if (!rc)
bp->tx_reserved_rings = *tx_rings; bp->hw_resc.resv_tx_rings = *tx_rings;
return rc; return rc;
} }
...@@ -4796,6 +4796,8 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -4796,6 +4796,8 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
int rc = 0; int rc = 0;
struct hwrm_func_qcaps_input req = {0}; struct hwrm_func_qcaps_input req = {0};
struct hwrm_func_qcaps_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_func_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
u32 flags;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QCAPS, -1, -1); bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QCAPS, -1, -1);
req.fid = cpu_to_le16(0xffff); req.fid = cpu_to_le16(0xffff);
...@@ -4805,16 +4807,27 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -4805,16 +4807,27 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
if (rc) if (rc)
goto hwrm_func_qcaps_exit; goto hwrm_func_qcaps_exit;
if (resp->flags & cpu_to_le32(FUNC_QCAPS_RESP_FLAGS_ROCE_V1_SUPPORTED)) flags = le32_to_cpu(resp->flags);
if (flags & FUNC_QCAPS_RESP_FLAGS_ROCE_V1_SUPPORTED)
bp->flags |= BNXT_FLAG_ROCEV1_CAP; bp->flags |= BNXT_FLAG_ROCEV1_CAP;
if (resp->flags & cpu_to_le32(FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED)) if (flags & FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED)
bp->flags |= BNXT_FLAG_ROCEV2_CAP; bp->flags |= BNXT_FLAG_ROCEV2_CAP;
bp->tx_push_thresh = 0; bp->tx_push_thresh = 0;
if (resp->flags & if (flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED)
cpu_to_le32(FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED))
bp->tx_push_thresh = BNXT_TX_PUSH_THRESH; bp->tx_push_thresh = BNXT_TX_PUSH_THRESH;
hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
hw_resc->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
hw_resc->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
hw_resc->max_rx_rings = le16_to_cpu(resp->max_rx_rings);
hw_resc->max_hw_ring_grps = le32_to_cpu(resp->max_hw_ring_grps);
if (!hw_resc->max_hw_ring_grps)
hw_resc->max_hw_ring_grps = hw_resc->max_tx_rings;
hw_resc->max_l2_ctxs = le16_to_cpu(resp->max_l2_ctxs);
hw_resc->max_vnics = le16_to_cpu(resp->max_vnics);
hw_resc->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
if (BNXT_PF(bp)) { if (BNXT_PF(bp)) {
struct bnxt_pf_info *pf = &bp->pf; struct bnxt_pf_info *pf = &bp->pf;
...@@ -4822,16 +4835,6 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -4822,16 +4835,6 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
pf->port_id = le16_to_cpu(resp->port_id); pf->port_id = le16_to_cpu(resp->port_id);
bp->dev->dev_port = pf->port_id; bp->dev->dev_port = pf->port_id;
memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN); memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN);
pf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
pf->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
pf->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
pf->max_rx_rings = le16_to_cpu(resp->max_rx_rings);
pf->max_hw_ring_grps = le32_to_cpu(resp->max_hw_ring_grps);
if (!pf->max_hw_ring_grps)
pf->max_hw_ring_grps = pf->max_tx_rings;
pf->max_l2_ctxs = le16_to_cpu(resp->max_l2_ctxs);
pf->max_vnics = le16_to_cpu(resp->max_vnics);
pf->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
pf->first_vf_id = le16_to_cpu(resp->first_vf_id); pf->first_vf_id = le16_to_cpu(resp->first_vf_id);
pf->max_vfs = le16_to_cpu(resp->max_vfs); pf->max_vfs = le16_to_cpu(resp->max_vfs);
pf->max_encap_records = le32_to_cpu(resp->max_encap_records); pf->max_encap_records = le32_to_cpu(resp->max_encap_records);
...@@ -4840,26 +4843,13 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -4840,26 +4843,13 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
pf->max_tx_wm_flows = le32_to_cpu(resp->max_tx_wm_flows); pf->max_tx_wm_flows = le32_to_cpu(resp->max_tx_wm_flows);
pf->max_rx_em_flows = le32_to_cpu(resp->max_rx_em_flows); pf->max_rx_em_flows = le32_to_cpu(resp->max_rx_em_flows);
pf->max_rx_wm_flows = le32_to_cpu(resp->max_rx_wm_flows); pf->max_rx_wm_flows = le32_to_cpu(resp->max_rx_wm_flows);
if (resp->flags & if (flags & FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED)
cpu_to_le32(FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED))
bp->flags |= BNXT_FLAG_WOL_CAP; bp->flags |= BNXT_FLAG_WOL_CAP;
} else { } else {
#ifdef CONFIG_BNXT_SRIOV #ifdef CONFIG_BNXT_SRIOV
struct bnxt_vf_info *vf = &bp->vf; struct bnxt_vf_info *vf = &bp->vf;
vf->fw_fid = le16_to_cpu(resp->fid); vf->fw_fid = le16_to_cpu(resp->fid);
vf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
vf->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
vf->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
vf->max_rx_rings = le16_to_cpu(resp->max_rx_rings);
vf->max_hw_ring_grps = le32_to_cpu(resp->max_hw_ring_grps);
if (!vf->max_hw_ring_grps)
vf->max_hw_ring_grps = vf->max_tx_rings;
vf->max_l2_ctxs = le16_to_cpu(resp->max_l2_ctxs);
vf->max_vnics = le16_to_cpu(resp->max_vnics);
vf->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
memcpy(vf->mac_addr, resp->mac_address, ETH_ALEN); memcpy(vf->mac_addr, resp->mac_address, ETH_ALEN);
#endif #endif
} }
...@@ -5226,7 +5216,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init) ...@@ -5226,7 +5216,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
rc); rc);
goto err_out; goto err_out;
} }
if (bp->tx_reserved_rings != bp->tx_nr_rings) { if (bp->hw_resc.resv_tx_rings != bp->tx_nr_rings) {
int tx = bp->tx_nr_rings; int tx = bp->tx_nr_rings;
if (bnxt_hwrm_reserve_tx_rings(bp, &tx) || if (bnxt_hwrm_reserve_tx_rings(bp, &tx) ||
...@@ -5454,79 +5444,45 @@ static int bnxt_setup_int_mode(struct bnxt *bp) ...@@ -5454,79 +5444,45 @@ static int bnxt_setup_int_mode(struct bnxt *bp)
#ifdef CONFIG_RFS_ACCEL #ifdef CONFIG_RFS_ACCEL
static unsigned int bnxt_get_max_func_rss_ctxs(struct bnxt *bp) static unsigned int bnxt_get_max_func_rss_ctxs(struct bnxt *bp)
{ {
#if defined(CONFIG_BNXT_SRIOV) return bp->hw_resc.max_rsscos_ctxs;
if (BNXT_VF(bp))
return bp->vf.max_rsscos_ctxs;
#endif
return bp->pf.max_rsscos_ctxs;
} }
static unsigned int bnxt_get_max_func_vnics(struct bnxt *bp) static unsigned int bnxt_get_max_func_vnics(struct bnxt *bp)
{ {
#if defined(CONFIG_BNXT_SRIOV) return bp->hw_resc.max_vnics;
if (BNXT_VF(bp))
return bp->vf.max_vnics;
#endif
return bp->pf.max_vnics;
} }
#endif #endif
unsigned int bnxt_get_max_func_stat_ctxs(struct bnxt *bp) unsigned int bnxt_get_max_func_stat_ctxs(struct bnxt *bp)
{ {
#if defined(CONFIG_BNXT_SRIOV) return bp->hw_resc.max_stat_ctxs;
if (BNXT_VF(bp))
return bp->vf.max_stat_ctxs;
#endif
return bp->pf.max_stat_ctxs;
} }
void bnxt_set_max_func_stat_ctxs(struct bnxt *bp, unsigned int max) void bnxt_set_max_func_stat_ctxs(struct bnxt *bp, unsigned int max)
{ {
#if defined(CONFIG_BNXT_SRIOV) bp->hw_resc.max_stat_ctxs = max;
if (BNXT_VF(bp))
bp->vf.max_stat_ctxs = max;
else
#endif
bp->pf.max_stat_ctxs = max;
} }
unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp) unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp)
{ {
#if defined(CONFIG_BNXT_SRIOV) return bp->hw_resc.max_cp_rings;
if (BNXT_VF(bp))
return bp->vf.max_cp_rings;
#endif
return bp->pf.max_cp_rings;
} }
void bnxt_set_max_func_cp_rings(struct bnxt *bp, unsigned int max) void bnxt_set_max_func_cp_rings(struct bnxt *bp, unsigned int max)
{ {
#if defined(CONFIG_BNXT_SRIOV) bp->hw_resc.max_cp_rings = max;
if (BNXT_VF(bp))
bp->vf.max_cp_rings = max;
else
#endif
bp->pf.max_cp_rings = max;
} }
static unsigned int bnxt_get_max_func_irqs(struct bnxt *bp) static unsigned int bnxt_get_max_func_irqs(struct bnxt *bp)
{ {
#if defined(CONFIG_BNXT_SRIOV) struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
if (BNXT_VF(bp))
return min_t(unsigned int, bp->vf.max_irqs, return min_t(unsigned int, hw_resc->max_irqs, hw_resc->max_cp_rings);
bp->vf.max_cp_rings);
#endif
return min_t(unsigned int, bp->pf.max_irqs, bp->pf.max_cp_rings);
} }
void bnxt_set_max_func_irqs(struct bnxt *bp, unsigned int max_irqs) void bnxt_set_max_func_irqs(struct bnxt *bp, unsigned int max_irqs)
{ {
#if defined(CONFIG_BNXT_SRIOV) bp->hw_resc.max_irqs = max_irqs;
if (BNXT_VF(bp))
bp->vf.max_irqs = max_irqs;
else
#endif
bp->pf.max_irqs = max_irqs;
} }
static int bnxt_init_msix(struct bnxt *bp) static int bnxt_init_msix(struct bnxt *bp)
...@@ -7948,24 +7904,14 @@ static int bnxt_get_max_irq(struct pci_dev *pdev) ...@@ -7948,24 +7904,14 @@ static int bnxt_get_max_irq(struct pci_dev *pdev)
static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx, static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
int *max_cp) int *max_cp)
{ {
struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
int max_ring_grps = 0; int max_ring_grps = 0;
#ifdef CONFIG_BNXT_SRIOV *max_tx = hw_resc->max_tx_rings;
if (!BNXT_PF(bp)) { *max_rx = hw_resc->max_rx_rings;
*max_tx = bp->vf.max_tx_rings; *max_cp = min_t(int, hw_resc->max_irqs, hw_resc->max_cp_rings);
*max_rx = bp->vf.max_rx_rings; *max_cp = min_t(int, *max_cp, hw_resc->max_stat_ctxs);
*max_cp = min_t(int, bp->vf.max_irqs, bp->vf.max_cp_rings); max_ring_grps = hw_resc->max_hw_ring_grps;
*max_cp = min_t(int, *max_cp, bp->vf.max_stat_ctxs);
max_ring_grps = bp->vf.max_hw_ring_grps;
} else
#endif
{
*max_tx = bp->pf.max_tx_rings;
*max_rx = bp->pf.max_rx_rings;
*max_cp = min_t(int, bp->pf.max_irqs, bp->pf.max_cp_rings);
*max_cp = min_t(int, *max_cp, bp->pf.max_stat_ctxs);
max_ring_grps = bp->pf.max_hw_ring_grps;
}
if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) { if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) {
*max_cp -= 1; *max_cp -= 1;
*max_rx -= 2; *max_rx -= 2;
......
...@@ -776,19 +776,35 @@ struct bnxt_vnic_info { ...@@ -776,19 +776,35 @@ struct bnxt_vnic_info {
#define BNXT_VNIC_RFS_NEW_RSS_FLAG 0x10 #define BNXT_VNIC_RFS_NEW_RSS_FLAG 0x10
}; };
#if defined(CONFIG_BNXT_SRIOV) struct bnxt_hw_resc {
struct bnxt_vf_info { u16 min_rsscos_ctxs;
u16 fw_fid;
u8 mac_addr[ETH_ALEN];
u16 max_rsscos_ctxs; u16 max_rsscos_ctxs;
u16 min_cp_rings;
u16 max_cp_rings; u16 max_cp_rings;
u16 resv_cp_rings;
u16 min_tx_rings;
u16 max_tx_rings; u16 max_tx_rings;
u16 resv_tx_rings;
u16 min_rx_rings;
u16 max_rx_rings; u16 max_rx_rings;
u16 resv_rx_rings;
u16 min_hw_ring_grps;
u16 max_hw_ring_grps; u16 max_hw_ring_grps;
u16 resv_hw_ring_grps;
u16 min_l2_ctxs;
u16 max_l2_ctxs; u16 max_l2_ctxs;
u16 max_irqs; u16 min_vnics;
u16 max_vnics; u16 max_vnics;
u16 resv_vnics;
u16 min_stat_ctxs;
u16 max_stat_ctxs; u16 max_stat_ctxs;
u16 max_irqs;
};
#if defined(CONFIG_BNXT_SRIOV)
struct bnxt_vf_info {
u16 fw_fid;
u8 mac_addr[ETH_ALEN];
u16 vlan; u16 vlan;
u32 flags; u32 flags;
#define BNXT_VF_QOS 0x1 #define BNXT_VF_QOS 0x1
...@@ -809,15 +825,6 @@ struct bnxt_pf_info { ...@@ -809,15 +825,6 @@ struct bnxt_pf_info {
u16 fw_fid; u16 fw_fid;
u16 port_id; u16 port_id;
u8 mac_addr[ETH_ALEN]; u8 mac_addr[ETH_ALEN];
u16 max_rsscos_ctxs;
u16 max_cp_rings;
u16 max_tx_rings; /* HW assigned max tx rings for this PF */
u16 max_rx_rings; /* HW assigned max rx rings for this PF */
u16 max_hw_ring_grps;
u16 max_irqs;
u16 max_l2_ctxs;
u16 max_vnics;
u16 max_stat_ctxs;
u32 first_vf_id; u32 first_vf_id;
u16 active_vfs; u16 active_vfs;
u16 max_vfs; u16 max_vfs;
...@@ -1196,7 +1203,6 @@ struct bnxt { ...@@ -1196,7 +1203,6 @@ struct bnxt {
int tx_nr_rings; int tx_nr_rings;
int tx_nr_rings_per_tc; int tx_nr_rings_per_tc;
int tx_nr_rings_xdp; int tx_nr_rings_xdp;
int tx_reserved_rings;
int tx_wake_thresh; int tx_wake_thresh;
int tx_push_thresh; int tx_push_thresh;
...@@ -1308,6 +1314,7 @@ struct bnxt { ...@@ -1308,6 +1314,7 @@ struct bnxt {
#define BNXT_LINK_SPEED_CHNG_SP_EVENT 14 #define BNXT_LINK_SPEED_CHNG_SP_EVENT 14
#define BNXT_FLOW_STATS_SP_EVENT 15 #define BNXT_FLOW_STATS_SP_EVENT 15
struct bnxt_hw_resc hw_resc;
struct bnxt_pf_info pf; struct bnxt_pf_info pf;
#ifdef CONFIG_BNXT_SRIOV #ifdef CONFIG_BNXT_SRIOV
int nr_vfs; int nr_vfs;
......
...@@ -421,24 +421,28 @@ static int bnxt_hwrm_func_cfg(struct bnxt *bp, int num_vfs) ...@@ -421,24 +421,28 @@ static int bnxt_hwrm_func_cfg(struct bnxt *bp, int num_vfs)
{ {
u32 rc = 0, mtu, i; u32 rc = 0, mtu, i;
u16 vf_tx_rings, vf_rx_rings, vf_cp_rings, vf_stat_ctx, vf_vnics; u16 vf_tx_rings, vf_rx_rings, vf_cp_rings, vf_stat_ctx, vf_vnics;
u16 vf_ring_grps; struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
u16 vf_ring_grps, max_stat_ctxs;
struct hwrm_func_cfg_input req = {0}; struct hwrm_func_cfg_input req = {0};
struct bnxt_pf_info *pf = &bp->pf; struct bnxt_pf_info *pf = &bp->pf;
int total_vf_tx_rings = 0; int total_vf_tx_rings = 0;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1); bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1);
max_stat_ctxs = hw_resc->max_stat_ctxs;
/* Remaining rings are distributed equally amongs VF's for now */ /* Remaining rings are distributed equally amongs VF's for now */
vf_cp_rings = (pf->max_cp_rings - bp->cp_nr_rings) / num_vfs; vf_cp_rings = (hw_resc->max_cp_rings - bp->cp_nr_rings) / num_vfs;
vf_stat_ctx = (pf->max_stat_ctxs - bp->num_stat_ctxs) / num_vfs; vf_stat_ctx = (max_stat_ctxs - bp->num_stat_ctxs) / num_vfs;
if (bp->flags & BNXT_FLAG_AGG_RINGS) if (bp->flags & BNXT_FLAG_AGG_RINGS)
vf_rx_rings = (pf->max_rx_rings - bp->rx_nr_rings * 2) / vf_rx_rings = (hw_resc->max_rx_rings - bp->rx_nr_rings * 2) /
num_vfs; num_vfs;
else else
vf_rx_rings = (pf->max_rx_rings - bp->rx_nr_rings) / num_vfs; vf_rx_rings = (hw_resc->max_rx_rings - bp->rx_nr_rings) /
vf_ring_grps = (bp->pf.max_hw_ring_grps - bp->rx_nr_rings) / num_vfs; num_vfs;
vf_tx_rings = (pf->max_tx_rings - bp->tx_nr_rings) / num_vfs; vf_ring_grps = (hw_resc->max_hw_ring_grps - bp->rx_nr_rings) / num_vfs;
vf_vnics = (pf->max_vnics - bp->nr_vnics) / num_vfs; vf_tx_rings = (hw_resc->max_tx_rings - bp->tx_nr_rings) / num_vfs;
vf_vnics = (hw_resc->max_vnics - bp->nr_vnics) / num_vfs;
vf_vnics = min_t(u16, vf_vnics, vf_rx_rings); vf_vnics = min_t(u16, vf_vnics, vf_rx_rings);
req.enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_MTU | req.enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_MTU |
...@@ -486,13 +490,13 @@ static int bnxt_hwrm_func_cfg(struct bnxt *bp, int num_vfs) ...@@ -486,13 +490,13 @@ static int bnxt_hwrm_func_cfg(struct bnxt *bp, int num_vfs)
} }
mutex_unlock(&bp->hwrm_cmd_lock); mutex_unlock(&bp->hwrm_cmd_lock);
if (!rc) { if (!rc) {
pf->max_tx_rings -= total_vf_tx_rings; hw_resc->max_tx_rings -= total_vf_tx_rings;
pf->max_rx_rings -= vf_rx_rings * num_vfs; hw_resc->max_rx_rings -= vf_rx_rings * num_vfs;
pf->max_hw_ring_grps -= vf_ring_grps * num_vfs; hw_resc->max_hw_ring_grps -= vf_ring_grps * num_vfs;
pf->max_cp_rings -= vf_cp_rings * num_vfs; hw_resc->max_cp_rings -= vf_cp_rings * num_vfs;
pf->max_rsscos_ctxs -= num_vfs; hw_resc->max_rsscos_ctxs -= num_vfs;
pf->max_stat_ctxs -= vf_stat_ctx * num_vfs; hw_resc->max_stat_ctxs -= vf_stat_ctx * num_vfs;
pf->max_vnics -= vf_vnics * num_vfs; hw_resc->max_vnics -= vf_vnics * num_vfs;
} }
return rc; return rc;
} }
...@@ -501,6 +505,7 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs) ...@@ -501,6 +505,7 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)
{ {
int rc = 0, vfs_supported; int rc = 0, vfs_supported;
int min_rx_rings, min_tx_rings, min_rss_ctxs; int min_rx_rings, min_tx_rings, min_rss_ctxs;
struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
int tx_ok = 0, rx_ok = 0, rss_ok = 0; int tx_ok = 0, rx_ok = 0, rss_ok = 0;
int avail_cp, avail_stat; int avail_cp, avail_stat;
...@@ -510,8 +515,8 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs) ...@@ -510,8 +515,8 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)
*/ */
vfs_supported = *num_vfs; vfs_supported = *num_vfs;
avail_cp = bp->pf.max_cp_rings - bp->cp_nr_rings; avail_cp = hw_resc->max_cp_rings - bp->cp_nr_rings;
avail_stat = bp->pf.max_stat_ctxs - bp->num_stat_ctxs; avail_stat = hw_resc->max_stat_ctxs - bp->num_stat_ctxs;
avail_cp = min_t(int, avail_cp, avail_stat); avail_cp = min_t(int, avail_cp, avail_stat);
while (vfs_supported) { while (vfs_supported) {
...@@ -520,23 +525,24 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs) ...@@ -520,23 +525,24 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)
min_rss_ctxs = vfs_supported; min_rss_ctxs = vfs_supported;
if (bp->flags & BNXT_FLAG_AGG_RINGS) { if (bp->flags & BNXT_FLAG_AGG_RINGS) {
if (bp->pf.max_rx_rings - bp->rx_nr_rings * 2 >= if (hw_resc->max_rx_rings - bp->rx_nr_rings * 2 >=
min_rx_rings) min_rx_rings)
rx_ok = 1; rx_ok = 1;
} else { } else {
if (bp->pf.max_rx_rings - bp->rx_nr_rings >= if (hw_resc->max_rx_rings - bp->rx_nr_rings >=
min_rx_rings) min_rx_rings)
rx_ok = 1; rx_ok = 1;
} }
if (bp->pf.max_vnics - bp->nr_vnics < min_rx_rings || if (hw_resc->max_vnics - bp->nr_vnics < min_rx_rings ||
avail_cp < min_rx_rings) avail_cp < min_rx_rings)
rx_ok = 0; rx_ok = 0;
if (bp->pf.max_tx_rings - bp->tx_nr_rings >= min_tx_rings && if (hw_resc->max_tx_rings - bp->tx_nr_rings >= min_tx_rings &&
avail_cp >= min_tx_rings) avail_cp >= min_tx_rings)
tx_ok = 1; tx_ok = 1;
if (bp->pf.max_rsscos_ctxs - bp->rsscos_nr_ctxs >= min_rss_ctxs) if (hw_resc->max_rsscos_ctxs - bp->rsscos_nr_ctxs >=
min_rss_ctxs)
rss_ok = 1; rss_ok = 1;
if (tx_ok && rx_ok && rss_ok) if (tx_ok && rx_ok && rss_ok)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment