| From 1f08ae1c897d1e4aabaaaf0c20854244d84f3e36 Mon Sep 17 00:00:00 2001 |
| From: Manish Chopra <manishc@marvell.com> |
| Date: Mon, 28 Jan 2019 10:05:05 -0800 |
| Subject: qed: Fix LACP pdu drops for VFs |
| |
| [ Upstream commit ff9296966e5e00b0d0d00477b2365a178f0f06a3 ] |
| |
| VF is always configured to drop control frames |
| (with reserved mac addresses) but to work LACP |
| on the VFs, it would require LACP control frames |
| to be forwarded or transmitted successfully. |
| |
| This patch fixes this in such a way that trusted VFs |
| (marked through ndo_set_vf_trust) would be allowed to |
| pass the control frames such as LACP pdus. |
| |
| Signed-off-by: Manish Chopra <manishc@marvell.com> |
| Signed-off-by: Ariel Elior <aelior@marvell.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/qlogic/qed/qed_l2.c | 5 +++++ |
| drivers/net/ethernet/qlogic/qed/qed_l2.h | 3 +++ |
| drivers/net/ethernet/qlogic/qed/qed_sriov.c | 10 ++++++++-- |
| 3 files changed, 16 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c |
| index b8baa6fcef8e..e68ca83ae915 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_l2.c |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c |
| @@ -748,6 +748,11 @@ int qed_sp_vport_update(struct qed_hwfn *p_hwfn, |
| return rc; |
| } |
| |
| + if (p_params->update_ctl_frame_check) { |
| + p_cmn->ctl_frame_mac_check_en = p_params->mac_chk_en; |
| + p_cmn->ctl_frame_ethtype_check_en = p_params->ethtype_chk_en; |
| + } |
| + |
| /* Update mcast bins for VFs, PF doesn't use this functionality */ |
| qed_sp_update_mcast_bin(p_hwfn, p_ramrod, p_params); |
| |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.h b/drivers/net/ethernet/qlogic/qed/qed_l2.h |
| index 8d80f1095d17..7127d5aaac42 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_l2.h |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_l2.h |
| @@ -219,6 +219,9 @@ struct qed_sp_vport_update_params { |
| struct qed_rss_params *rss_params; |
| struct qed_filter_accept_flags accept_flags; |
| struct qed_sge_tpa_params *sge_tpa_params; |
| + u8 update_ctl_frame_check; |
| + u8 mac_chk_en; |
| + u8 ethtype_chk_en; |
| }; |
| |
| int qed_sp_vport_update(struct qed_hwfn *p_hwfn, |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_sriov.c b/drivers/net/ethernet/qlogic/qed/qed_sriov.c |
| index ca6290fa0f30..71a7af134dd8 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_sriov.c |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_sriov.c |
| @@ -1969,7 +1969,9 @@ static void qed_iov_vf_mbx_start_vport(struct qed_hwfn *p_hwfn, |
| params.vport_id = vf->vport_id; |
| params.max_buffers_per_cqe = start->max_buffers_per_cqe; |
| params.mtu = vf->mtu; |
| - params.check_mac = true; |
| + |
| + /* Non trusted VFs should enable control frame filtering */ |
| + params.check_mac = !vf->p_vf_info.is_trusted_configured; |
| |
| rc = qed_sp_eth_vport_start(p_hwfn, ¶ms); |
| if (rc) { |
| @@ -5130,6 +5132,9 @@ static void qed_iov_handle_trust_change(struct qed_hwfn *hwfn) |
| params.opaque_fid = vf->opaque_fid; |
| params.vport_id = vf->vport_id; |
| |
| + params.update_ctl_frame_check = 1; |
| + params.mac_chk_en = !vf_info->is_trusted_configured; |
| + |
| if (vf_info->rx_accept_mode & mask) { |
| flags->update_rx_mode_config = 1; |
| flags->rx_accept_filter = vf_info->rx_accept_mode; |
| @@ -5147,7 +5152,8 @@ static void qed_iov_handle_trust_change(struct qed_hwfn *hwfn) |
| } |
| |
| if (flags->update_rx_mode_config || |
| - flags->update_tx_mode_config) |
| + flags->update_tx_mode_config || |
| + params.update_ctl_frame_check) |
| qed_sp_vport_update(hwfn, ¶ms, |
| QED_SPQ_MODE_EBLOCK, NULL); |
| } |
| -- |
| 2.19.1 |
| |