| From 5b9aedcd0afc7c0d94875c9708a77b9deac5cea4 Mon Sep 17 00:00:00 2001 |
| From: "Chopra, Manish" <Manish.Chopra@cavium.com> |
| Date: Fri, 2 Jun 2017 06:52:54 -0700 |
| Subject: qlcnic: Fix tunnel offload for 82xx adapters |
| |
| [ Upstream commit 4bd7ef0b033721b659b9357057e76d1ced95c1da ] |
| |
| Qlogic's 82xx series adapter doesn't support |
| tunnel offloads, driver incorrectly assumes that it is |
| supported and causes firmware hang while running tunnel IO. |
| |
| This patch fixes this by not advertising tunnel offloads |
| for 82xx adapters. |
| |
| Signed-off-by: Manish Chopra <manish.chopra@cavium.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 26 +++++++++++++++++-- |
| .../ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 2 ++ |
| .../net/ethernet/qlogic/qlcnic/qlcnic_main.c | 2 ++ |
| .../qlogic/qlcnic/qlcnic_sriov_common.c | 2 ++ |
| 4 files changed, 30 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h |
| index 5ddadcd0c8db..f1242ab32ca6 100644 |
| --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h |
| +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h |
| @@ -1825,22 +1825,44 @@ struct qlcnic_hardware_ops { |
| u32 (*get_cap_size)(void *, int); |
| void (*set_sys_info)(void *, int, u32); |
| void (*store_cap_mask)(void *, u32); |
| + bool (*encap_rx_offload) (struct qlcnic_adapter *adapter); |
| + bool (*encap_tx_offload) (struct qlcnic_adapter *adapter); |
| }; |
| |
| extern struct qlcnic_nic_template qlcnic_vf_ops; |
| |
| -static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter) |
| +static inline bool qlcnic_83xx_encap_tx_offload(struct qlcnic_adapter *adapter) |
| { |
| return adapter->ahw->extra_capability[0] & |
| QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD; |
| } |
| |
| -static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter) |
| +static inline bool qlcnic_83xx_encap_rx_offload(struct qlcnic_adapter *adapter) |
| { |
| return adapter->ahw->extra_capability[0] & |
| QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD; |
| } |
| |
| +static inline bool qlcnic_82xx_encap_tx_offload(struct qlcnic_adapter *adapter) |
| +{ |
| + return false; |
| +} |
| + |
| +static inline bool qlcnic_82xx_encap_rx_offload(struct qlcnic_adapter *adapter) |
| +{ |
| + return false; |
| +} |
| + |
| +static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter) |
| +{ |
| + return adapter->ahw->hw_ops->encap_rx_offload(adapter); |
| +} |
| + |
| +static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter) |
| +{ |
| + return adapter->ahw->hw_ops->encap_tx_offload(adapter); |
| +} |
| + |
| static inline int qlcnic_start_firmware(struct qlcnic_adapter *adapter) |
| { |
| return adapter->nic_ops->start_firmware(adapter); |
| diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c |
| index 05d32e86bcf7..35c5ac41c0a1 100644 |
| --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c |
| +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c |
| @@ -242,6 +242,8 @@ static struct qlcnic_hardware_ops qlcnic_83xx_hw_ops = { |
| .get_cap_size = qlcnic_83xx_get_cap_size, |
| .set_sys_info = qlcnic_83xx_set_sys_info, |
| .store_cap_mask = qlcnic_83xx_store_cap_mask, |
| + .encap_rx_offload = qlcnic_83xx_encap_rx_offload, |
| + .encap_tx_offload = qlcnic_83xx_encap_tx_offload, |
| }; |
| |
| static struct qlcnic_nic_template qlcnic_83xx_ops = { |
| diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c |
| index 3ae3968b0edf..ebf5ead16939 100644 |
| --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c |
| +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c |
| @@ -632,6 +632,8 @@ static struct qlcnic_hardware_ops qlcnic_hw_ops = { |
| .get_cap_size = qlcnic_82xx_get_cap_size, |
| .set_sys_info = qlcnic_82xx_set_sys_info, |
| .store_cap_mask = qlcnic_82xx_store_cap_mask, |
| + .encap_rx_offload = qlcnic_82xx_encap_rx_offload, |
| + .encap_tx_offload = qlcnic_82xx_encap_tx_offload, |
| }; |
| |
| static int qlcnic_check_multi_tx_capability(struct qlcnic_adapter *adapter) |
| diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c |
| index 2f656f395f39..c58180f40844 100644 |
| --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c |
| +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c |
| @@ -77,6 +77,8 @@ static struct qlcnic_hardware_ops qlcnic_sriov_vf_hw_ops = { |
| .free_mac_list = qlcnic_sriov_vf_free_mac_list, |
| .enable_sds_intr = qlcnic_83xx_enable_sds_intr, |
| .disable_sds_intr = qlcnic_83xx_disable_sds_intr, |
| + .encap_rx_offload = qlcnic_83xx_encap_rx_offload, |
| + .encap_tx_offload = qlcnic_83xx_encap_tx_offload, |
| }; |
| |
| static struct qlcnic_nic_template qlcnic_sriov_vf_ops = { |
| -- |
| 2.17.1 |
| |