Commit 2b5ea294 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'bnxt_en-Bug-fixes'



Michael Chan says:

=====================
bnxt_en: Bug fixes

3 patches that fix some issues in the firmware reset logic, starting
with a small patch to refactor the code that re-enables SRIOV.  The
last patch fixes a TC queue mapping issue.
====================

Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 14b41a29 18e4960c
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -7893,7 +7893,7 @@ static void bnxt_setup_msix(struct bnxt *bp)
	int tcs, i;

	tcs = netdev_get_num_tc(dev);
	if (tcs > 1) {
	if (tcs) {
		int i, off, count;

		for (i = 0; i < tcs; i++) {
@@ -9241,6 +9241,17 @@ void bnxt_half_close_nic(struct bnxt *bp)
	bnxt_free_mem(bp, false);
}

static void bnxt_reenable_sriov(struct bnxt *bp)
{
	if (BNXT_PF(bp)) {
		struct bnxt_pf_info *pf = &bp->pf;
		int n = pf->active_vfs;

		if (n)
			bnxt_cfg_hw_sriov(bp, &n, true);
	}
}

static int bnxt_open(struct net_device *dev)
{
	struct bnxt *bp = netdev_priv(dev);
@@ -9259,15 +9270,10 @@ static int bnxt_open(struct net_device *dev)
		bnxt_hwrm_if_change(bp, false);
	} else {
		if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state)) {
			if (BNXT_PF(bp)) {
				struct bnxt_pf_info *pf = &bp->pf;
				int n = pf->active_vfs;

				if (n)
					bnxt_cfg_hw_sriov(bp, &n, true);
			}
			if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
			if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
				bnxt_ulp_start(bp, 0);
				bnxt_reenable_sriov(bp);
			}
		}
		bnxt_hwmon_open(bp);
	}
@@ -9307,10 +9313,6 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
	bnxt_debug_dev_exit(bp);
	bnxt_disable_napi(bp);
	del_timer_sync(&bp->timer);
	if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) &&
	    pci_is_enabled(bp->pdev))
		pci_disable_device(bp->pdev);

	bnxt_free_skbs(bp);

	/* Save ring stats before shutdown */
@@ -10096,9 +10098,16 @@ static void bnxt_reset(struct bnxt *bp, bool silent)
static void bnxt_fw_reset_close(struct bnxt *bp)
{
	bnxt_ulp_stop(bp);
	/* When firmware is fatal state, disable PCI device to prevent
	 * any potential bad DMAs before freeing kernel memory.
	 */
	if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
		pci_disable_device(bp->pdev);
	__bnxt_close_nic(bp, true, false);
	bnxt_clear_int_mode(bp);
	bnxt_hwrm_func_drv_unrgtr(bp);
	if (pci_is_enabled(bp->pdev))
		pci_disable_device(bp->pdev);
	bnxt_free_ctx_mem(bp);
	kfree(bp->ctx);
	bp->ctx = NULL;
@@ -10831,6 +10840,8 @@ static void bnxt_fw_reset_task(struct work_struct *work)
		smp_mb__before_atomic();
		clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
		bnxt_ulp_start(bp, rc);
		if (!rc)
			bnxt_reenable_sriov(bp);
		bnxt_dl_health_recovery_done(bp);
		bnxt_dl_health_status_update(bp, true);
		rtnl_unlock();