From e5f5e16a5864fbea229a928b2506e04b192c9861 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 30 Jan 2022 15:43:34 +0100 Subject: [PATCH] 5.16-stable patches added patches: i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch i40e-fix-issue-when-maximum-queues-is-exceeded.patch i40e-fix-queues-reservation-for-xdp.patch i40e-fix-unsigned-stat-widths.patch i40e-increase-delay-to-1-s-after-global-emp-reset.patch usb-roles-fix-include-linux-usb-role.h-compile-issue.patch --- ...failed-to-init-adminq-while-vf-reset.patch | 120 +++++++++++ ...ssue-when-maximum-queues-is-exceeded.patch | 195 ++++++++++++++++++ .../i40e-fix-queues-reservation-for-xdp.patch | 89 ++++++++ .../i40e-fix-unsigned-stat-widths.patch | 70 +++++++ ...-delay-to-1-s-after-global-emp-reset.patch | 47 +++++ queue-5.16/series | 6 + ...clude-linux-usb-role.h-compile-issue.patch | 35 ++++ 7 files changed, 562 insertions(+) create mode 100644 queue-5.16/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch create mode 100644 queue-5.16/i40e-fix-issue-when-maximum-queues-is-exceeded.patch create mode 100644 queue-5.16/i40e-fix-queues-reservation-for-xdp.patch create mode 100644 queue-5.16/i40e-fix-unsigned-stat-widths.patch create mode 100644 queue-5.16/i40e-increase-delay-to-1-s-after-global-emp-reset.patch create mode 100644 queue-5.16/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch diff --git a/queue-5.16/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch b/queue-5.16/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch new file mode 100644 index 00000000000..f10c37cd5e2 --- /dev/null +++ b/queue-5.16/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch @@ -0,0 +1,120 @@ +From 0f344c8129a5337dae50e31b817dd50a60ff238c Mon Sep 17 00:00:00 2001 +From: Karen Sornek +Date: Thu, 2 Dec 2021 12:52:01 +0100 +Subject: i40e: Fix for failed to init adminq while VF reset + +From: Karen Sornek + +commit 0f344c8129a5337dae50e31b817dd50a60ff238c upstream. + +Fix for failed to init adminq: -53 while VF is resetting via MAC +address changing procedure. +Added sync module to avoid reading deadbeef value in reinit adminq +during software reset. +Without this patch it is possible to trigger VF reset procedure +during reinit adminq. This resulted in an incorrect reading of +value from the AQP registers and generated the -53 error. + +Fixes: 5c3c48ac6bf5 ("i40e: implement virtual device interface") +Signed-off-by: Grzegorz Szczurek +Signed-off-by: Karen Sornek +Tested-by: Konrad Jankowski +Signed-off-by: Tony Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/i40e/i40e_register.h | 3 + + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 44 ++++++++++++++++++++- + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h | 1 + 3 files changed, 46 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/intel/i40e/i40e_register.h ++++ b/drivers/net/ethernet/intel/i40e/i40e_register.h +@@ -413,6 +413,9 @@ + #define I40E_VFINT_DYN_CTLN(_INTVF) (0x00024800 + ((_INTVF) * 4)) /* _i=0...511 */ /* Reset: VFR */ + #define I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT 1 + #define I40E_VFINT_DYN_CTLN_CLEARPBA_MASK I40E_MASK(0x1, I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT) ++#define I40E_VFINT_ICR0_ADMINQ_SHIFT 30 ++#define I40E_VFINT_ICR0_ADMINQ_MASK I40E_MASK(0x1, I40E_VFINT_ICR0_ADMINQ_SHIFT) ++#define I40E_VFINT_ICR0_ENA(_VF) (0x0002C000 + ((_VF) * 4)) /* _i=0...127 */ /* Reset: CORER */ + #define I40E_VPINT_AEQCTL(_VF) (0x0002B800 + ((_VF) * 4)) /* _i=0...127 */ /* Reset: CORER */ + #define I40E_VPINT_AEQCTL_MSIX_INDX_SHIFT 0 + #define I40E_VPINT_AEQCTL_ITR_INDX_SHIFT 11 +--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +@@ -1377,6 +1377,32 @@ static i40e_status i40e_config_vf_promis + } + + /** ++ * i40e_sync_vfr_reset ++ * @hw: pointer to hw struct ++ * @vf_id: VF identifier ++ * ++ * Before trigger hardware reset, we need to know if no other process has ++ * reserved the hardware for any reset operations. This check is done by ++ * examining the status of the RSTAT1 register used to signal the reset. ++ **/ ++static int i40e_sync_vfr_reset(struct i40e_hw *hw, int vf_id) ++{ ++ u32 reg; ++ int i; ++ ++ for (i = 0; i < I40E_VFR_WAIT_COUNT; i++) { ++ reg = rd32(hw, I40E_VFINT_ICR0_ENA(vf_id)) & ++ I40E_VFINT_ICR0_ADMINQ_MASK; ++ if (reg) ++ return 0; ++ ++ usleep_range(100, 200); ++ } ++ ++ return -EAGAIN; ++} ++ ++/** + * i40e_trigger_vf_reset + * @vf: pointer to the VF structure + * @flr: VFLR was issued or not +@@ -1390,9 +1416,11 @@ static void i40e_trigger_vf_reset(struct + struct i40e_pf *pf = vf->pf; + struct i40e_hw *hw = &pf->hw; + u32 reg, reg_idx, bit_idx; ++ bool vf_active; ++ u32 radq; + + /* warn the VF */ +- clear_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states); ++ vf_active = test_and_clear_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states); + + /* Disable VF's configuration API during reset. The flag is re-enabled + * in i40e_alloc_vf_res(), when it's safe again to access VF's VSI. +@@ -1406,7 +1434,19 @@ static void i40e_trigger_vf_reset(struct + * just need to clean up, so don't hit the VFRTRIG register. + */ + if (!flr) { +- /* reset VF using VPGEN_VFRTRIG reg */ ++ /* Sync VFR reset before trigger next one */ ++ radq = rd32(hw, I40E_VFINT_ICR0_ENA(vf->vf_id)) & ++ I40E_VFINT_ICR0_ADMINQ_MASK; ++ if (vf_active && !radq) ++ /* waiting for finish reset by virtual driver */ ++ if (i40e_sync_vfr_reset(hw, vf->vf_id)) ++ dev_info(&pf->pdev->dev, ++ "Reset VF %d never finished\n", ++ vf->vf_id); ++ ++ /* Reset VF using VPGEN_VFRTRIG reg. It is also setting ++ * in progress state in rstat1 register. ++ */ + reg = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_id)); + reg |= I40E_VPGEN_VFRTRIG_VFSWR_MASK; + wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_id), reg); +--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h ++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +@@ -19,6 +19,7 @@ + #define I40E_MAX_VF_PROMISC_FLAGS 3 + + #define I40E_VF_STATE_WAIT_COUNT 20 ++#define I40E_VFR_WAIT_COUNT 100 + + /* Various queue ctrls */ + enum i40e_queue_ctrl { diff --git a/queue-5.16/i40e-fix-issue-when-maximum-queues-is-exceeded.patch b/queue-5.16/i40e-fix-issue-when-maximum-queues-is-exceeded.patch new file mode 100644 index 00000000000..59ced961b85 --- /dev/null +++ b/queue-5.16/i40e-fix-issue-when-maximum-queues-is-exceeded.patch @@ -0,0 +1,195 @@ +From d701658a50a471591094b3eb3961b4926cc8f104 Mon Sep 17 00:00:00 2001 +From: Jedrzej Jagielski +Date: Fri, 5 Nov 2021 11:17:00 +0000 +Subject: i40e: Fix issue when maximum queues is exceeded + +From: Jedrzej Jagielski + +commit d701658a50a471591094b3eb3961b4926cc8f104 upstream. + +Before this patch VF interface vanished when +maximum queue number was exceeded. Driver tried +to add next queues even if there was not enough +space. PF sent incorrect number of queues to +the VF when there were not enough of them. + +Add an additional condition introduced to check +available space in 'qp_pile' before proceeding. +This condition makes it impossible to add queues +if they number is greater than the number resulting +from available space. +Also add the search for free space in PF queue +pair piles. + +Without this patch VF interfaces are not seen +when available space for queues has been +exceeded and following logs appears permanently +in dmesg: +"Unable to get VF config (-32)". +"VF 62 failed opcode 3, retval: -5" +"Unable to get VF config due to PF error condition, not retrying" + +Fixes: 7daa6bf3294e ("i40e: driver core headers") +Fixes: 41c445ff0f48 ("i40e: main driver core") +Signed-off-by: Jaroslaw Gawin +Signed-off-by: Slawomir Laba +Signed-off-by: Jedrzej Jagielski +Tested-by: Konrad Jankowski +Signed-off-by: Tony Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/i40e/i40e.h | 1 + drivers/net/ethernet/intel/i40e/i40e_main.c | 14 ---- + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 59 +++++++++++++++++++++ + 3 files changed, 61 insertions(+), 13 deletions(-) + +--- a/drivers/net/ethernet/intel/i40e/i40e.h ++++ b/drivers/net/ethernet/intel/i40e/i40e.h +@@ -174,7 +174,6 @@ enum i40e_interrupt_policy { + + struct i40e_lump_tracking { + u16 num_entries; +- u16 search_hint; + u16 list[0]; + #define I40E_PILE_VALID_BIT 0x8000 + #define I40E_IWARP_IRQ_PILE_ID (I40E_PILE_VALID_BIT - 2) +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -196,10 +196,6 @@ int i40e_free_virt_mem_d(struct i40e_hw + * @id: an owner id to stick on the items assigned + * + * Returns the base item index of the lump, or negative for error +- * +- * The search_hint trick and lack of advanced fit-finding only work +- * because we're highly likely to have all the same size lump requests. +- * Linear search time and any fragmentation should be minimal. + **/ + static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile, + u16 needed, u16 id) +@@ -214,8 +210,7 @@ static int i40e_get_lump(struct i40e_pf + return -EINVAL; + } + +- /* start the linear search with an imperfect hint */ +- i = pile->search_hint; ++ i = 0; + while (i < pile->num_entries) { + /* skip already allocated entries */ + if (pile->list[i] & I40E_PILE_VALID_BIT) { +@@ -234,7 +229,6 @@ static int i40e_get_lump(struct i40e_pf + for (j = 0; j < needed; j++) + pile->list[i+j] = id | I40E_PILE_VALID_BIT; + ret = i; +- pile->search_hint = i + j; + break; + } + +@@ -257,7 +251,7 @@ static int i40e_put_lump(struct i40e_lum + { + int valid_id = (id | I40E_PILE_VALID_BIT); + int count = 0; +- int i; ++ u16 i; + + if (!pile || index >= pile->num_entries) + return -EINVAL; +@@ -269,8 +263,6 @@ static int i40e_put_lump(struct i40e_lum + count++; + } + +- if (count && index < pile->search_hint) +- pile->search_hint = index; + + return count; + } +@@ -11786,7 +11778,6 @@ static int i40e_init_interrupt_scheme(st + return -ENOMEM; + + pf->irq_pile->num_entries = vectors; +- pf->irq_pile->search_hint = 0; + + /* track first vector for misc interrupts, ignore return */ + (void)i40e_get_lump(pf, pf->irq_pile, 1, I40E_PILE_VALID_BIT - 1); +@@ -12589,7 +12580,6 @@ static int i40e_sw_init(struct i40e_pf * + goto sw_init_done; + } + pf->qp_pile->num_entries = pf->hw.func_caps.num_tx_qp; +- pf->qp_pile->search_hint = 0; + + pf->tx_timeout_recovery_level = 1; + +--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +@@ -2618,6 +2618,59 @@ error_param: + } + + /** ++ * i40e_check_enough_queue - find big enough queue number ++ * @vf: pointer to the VF info ++ * @needed: the number of items needed ++ * ++ * Returns the base item index of the queue, or negative for error ++ **/ ++static int i40e_check_enough_queue(struct i40e_vf *vf, u16 needed) ++{ ++ unsigned int i, cur_queues, more, pool_size; ++ struct i40e_lump_tracking *pile; ++ struct i40e_pf *pf = vf->pf; ++ struct i40e_vsi *vsi; ++ ++ vsi = pf->vsi[vf->lan_vsi_idx]; ++ cur_queues = vsi->alloc_queue_pairs; ++ ++ /* if current allocated queues are enough for need */ ++ if (cur_queues >= needed) ++ return vsi->base_queue; ++ ++ pile = pf->qp_pile; ++ if (cur_queues > 0) { ++ /* if the allocated queues are not zero ++ * just check if there are enough queues for more ++ * behind the allocated queues. ++ */ ++ more = needed - cur_queues; ++ for (i = vsi->base_queue + cur_queues; ++ i < pile->num_entries; i++) { ++ if (pile->list[i] & I40E_PILE_VALID_BIT) ++ break; ++ ++ if (more-- == 1) ++ /* there is enough */ ++ return vsi->base_queue; ++ } ++ } ++ ++ pool_size = 0; ++ for (i = 0; i < pile->num_entries; i++) { ++ if (pile->list[i] & I40E_PILE_VALID_BIT) { ++ pool_size = 0; ++ continue; ++ } ++ if (needed <= ++pool_size) ++ /* there is enough */ ++ return i; ++ } ++ ++ return -ENOMEM; ++} ++ ++/** + * i40e_vc_request_queues_msg + * @vf: pointer to the VF info + * @msg: pointer to the msg buffer +@@ -2651,6 +2704,12 @@ static int i40e_vc_request_queues_msg(st + req_pairs - cur_pairs, + pf->queues_left); + vfres->num_queue_pairs = pf->queues_left + cur_pairs; ++ } else if (i40e_check_enough_queue(vf, req_pairs) < 0) { ++ dev_warn(&pf->pdev->dev, ++ "VF %d requested %d more queues, but there is not enough for it.\n", ++ vf->vf_id, ++ req_pairs - cur_pairs); ++ vfres->num_queue_pairs = cur_pairs; + } else { + /* successful request */ + vf->num_req_queues = req_pairs; diff --git a/queue-5.16/i40e-fix-queues-reservation-for-xdp.patch b/queue-5.16/i40e-fix-queues-reservation-for-xdp.patch new file mode 100644 index 00000000000..2df696815e6 --- /dev/null +++ b/queue-5.16/i40e-fix-queues-reservation-for-xdp.patch @@ -0,0 +1,89 @@ +From 92947844b8beee988c0ce17082b705c2f75f0742 Mon Sep 17 00:00:00 2001 +From: Sylwester Dziedziuch +Date: Fri, 26 Nov 2021 11:11:22 +0100 +Subject: i40e: Fix queues reservation for XDP + +From: Sylwester Dziedziuch + +commit 92947844b8beee988c0ce17082b705c2f75f0742 upstream. + +When XDP was configured on a system with large number of CPUs +and X722 NIC there was a call trace with NULL pointer dereference. + +i40e 0000:87:00.0: failed to get tracking for 256 queues for VSI 0 err -12 +i40e 0000:87:00.0: setup of MAIN VSI failed + +BUG: kernel NULL pointer dereference, address: 0000000000000000 +RIP: 0010:i40e_xdp+0xea/0x1b0 [i40e] +Call Trace: +? i40e_reconfig_rss_queues+0x130/0x130 [i40e] +dev_xdp_install+0x61/0xe0 +dev_xdp_attach+0x18a/0x4c0 +dev_change_xdp_fd+0x1e6/0x220 +do_setlink+0x616/0x1030 +? ahci_port_stop+0x80/0x80 +? ata_qc_issue+0x107/0x1e0 +? lock_timer_base+0x61/0x80 +? __mod_timer+0x202/0x380 +rtnl_setlink+0xe5/0x170 +? bpf_lsm_binder_transaction+0x10/0x10 +? security_capable+0x36/0x50 +rtnetlink_rcv_msg+0x121/0x350 +? rtnl_calcit.isra.0+0x100/0x100 +netlink_rcv_skb+0x50/0xf0 +netlink_unicast+0x1d3/0x2a0 +netlink_sendmsg+0x22a/0x440 +sock_sendmsg+0x5e/0x60 +__sys_sendto+0xf0/0x160 +? __sys_getsockname+0x7e/0xc0 +? _copy_from_user+0x3c/0x80 +? __sys_setsockopt+0xc8/0x1a0 +__x64_sys_sendto+0x20/0x30 +do_syscall_64+0x33/0x40 +entry_SYSCALL_64_after_hwframe+0x44/0xae +RIP: 0033:0x7f83fa7a39e0 + +This was caused by PF queue pile fragmentation due to +flow director VSI queue being placed right after main VSI. +Because of this main VSI was not able to resize its +queue allocation for XDP resulting in no queues allocated +for main VSI when XDP was turned on. + +Fix this by always allocating last queue in PF queue pile +for a flow director VSI. + +Fixes: 41c445ff0f48 ("i40e: main driver core") +Fixes: 74608d17fe29 ("i40e: add support for XDP_TX action") +Signed-off-by: Sylwester Dziedziuch +Signed-off-by: Mateusz Palczewski +Reviewed-by: Maciej Fijalkowski +Tested-by: Kiran Bhandare +Signed-off-by: Tony Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -210,6 +210,20 @@ static int i40e_get_lump(struct i40e_pf + return -EINVAL; + } + ++ /* Allocate last queue in the pile for FDIR VSI queue ++ * so it doesn't fragment the qp_pile ++ */ ++ if (pile == pf->qp_pile && pf->vsi[id]->type == I40E_VSI_FDIR) { ++ if (pile->list[pile->num_entries - 1] & I40E_PILE_VALID_BIT) { ++ dev_err(&pf->pdev->dev, ++ "Cannot allocate queue %d for I40E_VSI_FDIR\n", ++ pile->num_entries - 1); ++ return -ENOMEM; ++ } ++ pile->list[pile->num_entries - 1] = id | I40E_PILE_VALID_BIT; ++ return pile->num_entries - 1; ++ } ++ + i = 0; + while (i < pile->num_entries) { + /* skip already allocated entries */ diff --git a/queue-5.16/i40e-fix-unsigned-stat-widths.patch b/queue-5.16/i40e-fix-unsigned-stat-widths.patch new file mode 100644 index 00000000000..422c0fa533e --- /dev/null +++ b/queue-5.16/i40e-fix-unsigned-stat-widths.patch @@ -0,0 +1,70 @@ +From 3b8428b84539c78fdc8006c17ebd25afd4722d51 Mon Sep 17 00:00:00 2001 +From: Joe Damato +Date: Wed, 8 Dec 2021 17:56:33 -0800 +Subject: i40e: fix unsigned stat widths + +From: Joe Damato + +commit 3b8428b84539c78fdc8006c17ebd25afd4722d51 upstream. + +Change i40e_update_vsi_stats and struct i40e_vsi to use u64 fields to match +the width of the stats counters in struct i40e_rx_queue_stats. + +Update debugfs code to use the correct format specifier for u64. + +Fixes: 41c445ff0f48 ("i40e: main driver core") +Signed-off-by: Joe Damato +Reported-by: kernel test robot +Tested-by: Gurucharan G +Signed-off-by: Tony Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/i40e/i40e.h | 8 ++++---- + drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +- + drivers/net/ethernet/intel/i40e/i40e_main.c | 4 ++-- + 3 files changed, 7 insertions(+), 7 deletions(-) + +--- a/drivers/net/ethernet/intel/i40e/i40e.h ++++ b/drivers/net/ethernet/intel/i40e/i40e.h +@@ -847,12 +847,12 @@ struct i40e_vsi { + struct rtnl_link_stats64 net_stats_offsets; + struct i40e_eth_stats eth_stats; + struct i40e_eth_stats eth_stats_offsets; +- u32 tx_restart; +- u32 tx_busy; ++ u64 tx_restart; ++ u64 tx_busy; + u64 tx_linearize; + u64 tx_force_wb; +- u32 rx_buf_failed; +- u32 rx_page_failed; ++ u64 rx_buf_failed; ++ u64 rx_page_failed; + + /* These are containers of ring pointers, allocated at run-time */ + struct i40e_ring **rx_rings; +--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +@@ -240,7 +240,7 @@ static void i40e_dbg_dump_vsi_seid(struc + (unsigned long int)vsi->net_stats_offsets.rx_compressed, + (unsigned long int)vsi->net_stats_offsets.tx_compressed); + dev_info(&pf->pdev->dev, +- " tx_restart = %d, tx_busy = %d, rx_buf_failed = %d, rx_page_failed = %d\n", ++ " tx_restart = %llu, tx_busy = %llu, rx_buf_failed = %llu, rx_page_failed = %llu\n", + vsi->tx_restart, vsi->tx_busy, + vsi->rx_buf_failed, vsi->rx_page_failed); + rcu_read_lock(); +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -778,9 +778,9 @@ static void i40e_update_vsi_stats(struct + struct rtnl_link_stats64 *ns; /* netdev stats */ + struct i40e_eth_stats *oes; + struct i40e_eth_stats *es; /* device's eth stats */ +- u32 tx_restart, tx_busy; ++ u64 tx_restart, tx_busy; + struct i40e_ring *p; +- u32 rx_page, rx_buf; ++ u64 rx_page, rx_buf; + u64 bytes, packets; + unsigned int start; + u64 tx_linearize; diff --git a/queue-5.16/i40e-increase-delay-to-1-s-after-global-emp-reset.patch b/queue-5.16/i40e-increase-delay-to-1-s-after-global-emp-reset.patch new file mode 100644 index 00000000000..851b307f082 --- /dev/null +++ b/queue-5.16/i40e-increase-delay-to-1-s-after-global-emp-reset.patch @@ -0,0 +1,47 @@ +From 9b13bd53134c9ddd544a790125199fdbdb505e67 Mon Sep 17 00:00:00 2001 +From: Jedrzej Jagielski +Date: Thu, 28 Oct 2021 13:51:14 +0000 +Subject: i40e: Increase delay to 1 s after global EMP reset + +From: Jedrzej Jagielski + +commit 9b13bd53134c9ddd544a790125199fdbdb505e67 upstream. + +Recently simplified i40e_rebuild causes that FW sometimes +is not ready after NVM update, the ping does not return. + +Increase the delay in case of EMP reset. +Old delay of 300 ms was introduced for specific cards for 710 series. +Now it works for all the cards and delay was increased. + +Fixes: 1fa51a650e1d ("i40e: Add delay after EMP reset for firmware to recover") +Signed-off-by: Arkadiusz Kubalewski +Signed-off-by: Jedrzej Jagielski +Tested-by: Gurucharan G +Signed-off-by: Tony Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -10574,15 +10574,9 @@ static void i40e_rebuild(struct i40e_pf + } + i40e_get_oem_version(&pf->hw); + +- if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) && +- ((hw->aq.fw_maj_ver == 4 && hw->aq.fw_min_ver <= 33) || +- hw->aq.fw_maj_ver < 4) && hw->mac.type == I40E_MAC_XL710) { +- /* The following delay is necessary for 4.33 firmware and older +- * to recover after EMP reset. 200 ms should suffice but we +- * put here 300 ms to be sure that FW is ready to operate +- * after reset. +- */ +- mdelay(300); ++ if (test_and_clear_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state)) { ++ /* The following delay is necessary for firmware update. */ ++ mdelay(1000); + } + + /* re-verify the eeprom if we just had an EMP reset */ diff --git a/queue-5.16/series b/queue-5.16/series index b7eb42c8582..817fe815635 100644 --- a/queue-5.16/series +++ b/queue-5.16/series @@ -93,3 +93,9 @@ x86-cpu-add-xeon-icelake-d-to-list-of-cpus-that-support-ppin.patch powerpc-32s-allocate-one-256k-ibat-instead-of-two-consecutives-128k-ibats.patch powerpc-32s-fix-kasan_init_region-for-kasan.patch powerpc-32-fix-boot-failure-with-gcc-latent-entropy-plugin.patch +i40e-increase-delay-to-1-s-after-global-emp-reset.patch +i40e-fix-issue-when-maximum-queues-is-exceeded.patch +i40e-fix-queues-reservation-for-xdp.patch +i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch +i40e-fix-unsigned-stat-widths.patch +usb-roles-fix-include-linux-usb-role.h-compile-issue.patch diff --git a/queue-5.16/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch b/queue-5.16/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch new file mode 100644 index 00000000000..868a8cfea40 --- /dev/null +++ b/queue-5.16/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch @@ -0,0 +1,35 @@ +From 945c37ed564770c78dfe6b9f08bed57a1b4e60ef Mon Sep 17 00:00:00 2001 +From: Linyu Yuan +Date: Mon, 10 Jan 2022 20:43:28 +0800 +Subject: usb: roles: fix include/linux/usb/role.h compile issue + +From: Linyu Yuan + +commit 945c37ed564770c78dfe6b9f08bed57a1b4e60ef upstream. + +when CONFIG_USB_ROLE_SWITCH is not defined, +add usb_role_switch_find_by_fwnode() definition which return NULL. + +Fixes: c6919d5e0cd1 ("usb: roles: Add usb_role_switch_find_by_fwnode()") +Signed-off-by: Linyu Yuan +Link: https://lore.kernel.org/r/1641818608-25039-1-git-send-email-quic_linyyuan@quicinc.com +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/usb/role.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/include/linux/usb/role.h ++++ b/include/linux/usb/role.h +@@ -92,6 +92,12 @@ fwnode_usb_role_switch_get(struct fwnode + static inline void usb_role_switch_put(struct usb_role_switch *sw) { } + + static inline struct usb_role_switch * ++usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode) ++{ ++ return NULL; ++} ++ ++static inline struct usb_role_switch * + usb_role_switch_register(struct device *parent, + const struct usb_role_switch_desc *desc) + { -- 2.47.2