Merge branch 'bnxt_en-Bug-fixes'
Michael Chan says: ==================== bnxt_en: Bug fixes. This short series fixes resource related logic in the driver, mostly affecting the RDMA driver under corner cases. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
a104d18def
|
@ -5913,12 +5913,12 @@ unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp)
|
|||
return bp->hw_resc.max_cp_rings;
|
||||
}
|
||||
|
||||
void bnxt_set_max_func_cp_rings(struct bnxt *bp, unsigned int max)
|
||||
unsigned int bnxt_get_max_func_cp_rings_for_en(struct bnxt *bp)
|
||||
{
|
||||
bp->hw_resc.max_cp_rings = max;
|
||||
return bp->hw_resc.max_cp_rings - bnxt_get_ulp_msix_num(bp);
|
||||
}
|
||||
|
||||
unsigned int bnxt_get_max_func_irqs(struct bnxt *bp)
|
||||
static unsigned int bnxt_get_max_func_irqs(struct bnxt *bp)
|
||||
{
|
||||
struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
|
||||
|
||||
|
@ -6684,6 +6684,8 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
|
|||
hw_resc->resv_rx_rings = 0;
|
||||
hw_resc->resv_hw_ring_grps = 0;
|
||||
hw_resc->resv_vnics = 0;
|
||||
bp->tx_nr_rings = 0;
|
||||
bp->rx_nr_rings = 0;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
@ -8629,7 +8631,8 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
|
|||
|
||||
*max_tx = hw_resc->max_tx_rings;
|
||||
*max_rx = hw_resc->max_rx_rings;
|
||||
*max_cp = min_t(int, hw_resc->max_irqs, hw_resc->max_cp_rings);
|
||||
*max_cp = min_t(int, bnxt_get_max_func_cp_rings_for_en(bp),
|
||||
hw_resc->max_irqs);
|
||||
*max_cp = min_t(int, *max_cp, hw_resc->max_stat_ctxs);
|
||||
max_ring_grps = hw_resc->max_hw_ring_grps;
|
||||
if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) {
|
||||
|
@ -8769,20 +8772,25 @@ static int bnxt_init_dflt_ring_mode(struct bnxt *bp)
|
|||
if (bp->tx_nr_rings)
|
||||
return 0;
|
||||
|
||||
bnxt_ulp_irq_stop(bp);
|
||||
bnxt_clear_int_mode(bp);
|
||||
rc = bnxt_set_dflt_rings(bp, true);
|
||||
if (rc) {
|
||||
netdev_err(bp->dev, "Not enough rings available.\n");
|
||||
return rc;
|
||||
goto init_dflt_ring_err;
|
||||
}
|
||||
rc = bnxt_init_int_mode(bp);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto init_dflt_ring_err;
|
||||
|
||||
bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
|
||||
if (bnxt_rfs_supported(bp) && bnxt_rfs_capable(bp)) {
|
||||
bp->flags |= BNXT_FLAG_RFS;
|
||||
bp->dev->features |= NETIF_F_NTUPLE;
|
||||
}
|
||||
return 0;
|
||||
init_dflt_ring_err:
|
||||
bnxt_ulp_irq_restart(bp, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int bnxt_restore_pf_fw_resources(struct bnxt *bp)
|
||||
|
|
|
@ -1481,8 +1481,7 @@ int bnxt_hwrm_set_coal(struct bnxt *);
|
|||
unsigned int bnxt_get_max_func_stat_ctxs(struct bnxt *bp);
|
||||
void bnxt_set_max_func_stat_ctxs(struct bnxt *bp, unsigned int max);
|
||||
unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp);
|
||||
void bnxt_set_max_func_cp_rings(struct bnxt *bp, unsigned int max);
|
||||
unsigned int bnxt_get_max_func_irqs(struct bnxt *bp);
|
||||
unsigned int bnxt_get_max_func_cp_rings_for_en(struct bnxt *bp);
|
||||
int bnxt_get_avail_msix(struct bnxt *bp, int num);
|
||||
int bnxt_reserve_rings(struct bnxt *bp);
|
||||
void bnxt_tx_disable(struct bnxt *bp);
|
||||
|
|
|
@ -451,7 +451,7 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs)
|
|||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_VF_RESOURCE_CFG, -1, -1);
|
||||
|
||||
vf_cp_rings = hw_resc->max_cp_rings - bp->cp_nr_rings;
|
||||
vf_cp_rings = bnxt_get_max_func_cp_rings_for_en(bp) - bp->cp_nr_rings;
|
||||
vf_stat_ctx = hw_resc->max_stat_ctxs - bp->num_stat_ctxs;
|
||||
if (bp->flags & BNXT_FLAG_AGG_RINGS)
|
||||
vf_rx_rings = hw_resc->max_rx_rings - bp->rx_nr_rings * 2;
|
||||
|
@ -549,7 +549,8 @@ static int bnxt_hwrm_func_cfg(struct bnxt *bp, int num_vfs)
|
|||
max_stat_ctxs = hw_resc->max_stat_ctxs;
|
||||
|
||||
/* Remaining rings are distributed equally amongs VF's for now */
|
||||
vf_cp_rings = (hw_resc->max_cp_rings - bp->cp_nr_rings) / num_vfs;
|
||||
vf_cp_rings = (bnxt_get_max_func_cp_rings_for_en(bp) -
|
||||
bp->cp_nr_rings) / num_vfs;
|
||||
vf_stat_ctx = (max_stat_ctxs - bp->num_stat_ctxs) / num_vfs;
|
||||
if (bp->flags & BNXT_FLAG_AGG_RINGS)
|
||||
vf_rx_rings = (hw_resc->max_rx_rings - bp->rx_nr_rings * 2) /
|
||||
|
@ -643,7 +644,7 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)
|
|||
*/
|
||||
vfs_supported = *num_vfs;
|
||||
|
||||
avail_cp = hw_resc->max_cp_rings - bp->cp_nr_rings;
|
||||
avail_cp = bnxt_get_max_func_cp_rings_for_en(bp) - bp->cp_nr_rings;
|
||||
avail_stat = hw_resc->max_stat_ctxs - bp->num_stat_ctxs;
|
||||
avail_cp = min_t(int, avail_cp, avail_stat);
|
||||
|
||||
|
|
|
@ -169,7 +169,6 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, int ulp_id,
|
|||
edev->ulp_tbl[ulp_id].msix_requested = avail_msix;
|
||||
}
|
||||
bnxt_fill_msix_vecs(bp, ent);
|
||||
bnxt_set_max_func_cp_rings(bp, max_cp_rings - avail_msix);
|
||||
edev->flags |= BNXT_EN_FLAG_MSIX_REQUESTED;
|
||||
return avail_msix;
|
||||
}
|
||||
|
@ -178,7 +177,6 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id)
|
|||
{
|
||||
struct net_device *dev = edev->net;
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
int max_cp_rings, msix_requested;
|
||||
|
||||
ASSERT_RTNL();
|
||||
if (ulp_id != BNXT_ROCE_ULP)
|
||||
|
@ -187,9 +185,6 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id)
|
|||
if (!(edev->flags & BNXT_EN_FLAG_MSIX_REQUESTED))
|
||||
return 0;
|
||||
|
||||
max_cp_rings = bnxt_get_max_func_cp_rings(bp);
|
||||
msix_requested = edev->ulp_tbl[ulp_id].msix_requested;
|
||||
bnxt_set_max_func_cp_rings(bp, max_cp_rings + msix_requested);
|
||||
edev->ulp_tbl[ulp_id].msix_requested = 0;
|
||||
edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED;
|
||||
if (netif_running(dev)) {
|
||||
|
@ -220,21 +215,6 @@ int bnxt_get_ulp_msix_base(struct bnxt *bp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void bnxt_subtract_ulp_resources(struct bnxt *bp, int ulp_id)
|
||||
{
|
||||
ASSERT_RTNL();
|
||||
if (bnxt_ulp_registered(bp->edev, ulp_id)) {
|
||||
struct bnxt_en_dev *edev = bp->edev;
|
||||
unsigned int msix_req, max;
|
||||
|
||||
msix_req = edev->ulp_tbl[ulp_id].msix_requested;
|
||||
max = bnxt_get_max_func_cp_rings(bp);
|
||||
bnxt_set_max_func_cp_rings(bp, max - msix_req);
|
||||
max = bnxt_get_max_func_stat_ctxs(bp);
|
||||
bnxt_set_max_func_stat_ctxs(bp, max - 1);
|
||||
}
|
||||
}
|
||||
|
||||
static int bnxt_send_msg(struct bnxt_en_dev *edev, int ulp_id,
|
||||
struct bnxt_fw_msg *fw_msg)
|
||||
{
|
||||
|
|
|
@ -90,7 +90,6 @@ static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev, int ulp_id)
|
|||
|
||||
int bnxt_get_ulp_msix_num(struct bnxt *bp);
|
||||
int bnxt_get_ulp_msix_base(struct bnxt *bp);
|
||||
void bnxt_subtract_ulp_resources(struct bnxt *bp, int ulp_id);
|
||||
void bnxt_ulp_stop(struct bnxt *bp);
|
||||
void bnxt_ulp_start(struct bnxt *bp);
|
||||
void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);
|
||||
|
|
Загрузка…
Ссылка в новой задаче