Commit 44715423 authored by David S. Miller's avatar David S. Miller

Merge branch 'bnxt_en-Updates-for-net-next'

Michael Chan says:

====================
bnxt_en: Updates for net-next.

This patch series adds TC Flower tunnel decap and rewrite actions in
the first 4 patches.  The next 3 patches integrates the recently
added error recovery with the RDMA driver by calling the proper
hooks to stop and start.

v2: Fix pointer alignment issue in patch #1.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents e43ea83c 6a68749d
...@@ -8762,6 +8762,8 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) ...@@ -8762,6 +8762,8 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
} }
if (resc_reinit || fw_reset) { if (resc_reinit || fw_reset) {
if (fw_reset) { if (fw_reset) {
if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
bnxt_ulp_stop(bp);
rc = bnxt_fw_init_one(bp); rc = bnxt_fw_init_one(bp);
if (rc) { if (rc) {
set_bit(BNXT_STATE_ABORT_ERR, &bp->state); set_bit(BNXT_STATE_ABORT_ERR, &bp->state);
...@@ -9224,13 +9226,16 @@ static int bnxt_open(struct net_device *dev) ...@@ -9224,13 +9226,16 @@ static int bnxt_open(struct net_device *dev)
if (rc) { if (rc) {
bnxt_hwrm_if_change(bp, false); bnxt_hwrm_if_change(bp, false);
} else { } else {
if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state) && if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state)) {
BNXT_PF(bp)) { if (BNXT_PF(bp)) {
struct bnxt_pf_info *pf = &bp->pf; struct bnxt_pf_info *pf = &bp->pf;
int n = pf->active_vfs; int n = pf->active_vfs;
if (n) if (n)
bnxt_cfg_hw_sriov(bp, &n, true); bnxt_cfg_hw_sriov(bp, &n, true);
}
if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
bnxt_ulp_start(bp, 0);
} }
bnxt_hwmon_open(bp); bnxt_hwmon_open(bp);
} }
...@@ -9927,12 +9932,15 @@ static void bnxt_reset_task(struct bnxt *bp, bool silent) ...@@ -9927,12 +9932,15 @@ static void bnxt_reset_task(struct bnxt *bp, bool silent)
if (netif_running(bp->dev)) { if (netif_running(bp->dev)) {
int rc; int rc;
if (!silent) if (silent) {
bnxt_close_nic(bp, false, false);
bnxt_open_nic(bp, false, false);
} else {
bnxt_ulp_stop(bp); bnxt_ulp_stop(bp);
bnxt_close_nic(bp, false, false); bnxt_close_nic(bp, true, false);
rc = bnxt_open_nic(bp, false, false); rc = bnxt_open_nic(bp, true, false);
if (!silent && !rc) bnxt_ulp_start(bp, rc);
bnxt_ulp_start(bp); }
} }
} }
...@@ -10048,8 +10056,8 @@ static void bnxt_reset(struct bnxt *bp, bool silent) ...@@ -10048,8 +10056,8 @@ static void bnxt_reset(struct bnxt *bp, bool silent)
static void bnxt_fw_reset_close(struct bnxt *bp) static void bnxt_fw_reset_close(struct bnxt *bp)
{ {
bnxt_ulp_stop(bp);
__bnxt_close_nic(bp, true, false); __bnxt_close_nic(bp, true, false);
bnxt_ulp_irq_stop(bp);
bnxt_clear_int_mode(bp); bnxt_clear_int_mode(bp);
bnxt_hwrm_func_drv_unrgtr(bp); bnxt_hwrm_func_drv_unrgtr(bp);
bnxt_free_ctx_mem(bp); bnxt_free_ctx_mem(bp);
...@@ -10731,13 +10739,13 @@ static void bnxt_fw_reset_task(struct work_struct *work) ...@@ -10731,13 +10739,13 @@ static void bnxt_fw_reset_task(struct work_struct *work)
clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
dev_close(bp->dev); dev_close(bp->dev);
} }
bnxt_ulp_irq_restart(bp, rc);
rtnl_unlock();
bp->fw_reset_state = 0; bp->fw_reset_state = 0;
/* Make sure fw_reset_state is 0 before clearing the flag */ /* Make sure fw_reset_state is 0 before clearing the flag */
smp_mb__before_atomic(); smp_mb__before_atomic();
clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
bnxt_ulp_start(bp, rc);
rtnl_unlock();
break; break;
} }
return; return;
...@@ -10945,7 +10953,7 @@ static int bnxt_setup_tc_block_cb(enum tc_setup_type type, void *type_data, ...@@ -10945,7 +10953,7 @@ static int bnxt_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
} }
} }
static LIST_HEAD(bnxt_block_cb_list); LIST_HEAD(bnxt_block_cb_list);
static int bnxt_setup_tc(struct net_device *dev, enum tc_setup_type type, static int bnxt_setup_tc(struct net_device *dev, enum tc_setup_type type,
void *type_data) void *type_data)
...@@ -11893,6 +11901,7 @@ static int bnxt_suspend(struct device *device) ...@@ -11893,6 +11901,7 @@ static int bnxt_suspend(struct device *device)
int rc = 0; int rc = 0;
rtnl_lock(); rtnl_lock();
bnxt_ulp_stop(bp);
if (netif_running(dev)) { if (netif_running(dev)) {
netif_device_detach(dev); netif_device_detach(dev);
rc = bnxt_close(dev); rc = bnxt_close(dev);
...@@ -11926,6 +11935,7 @@ static int bnxt_resume(struct device *device) ...@@ -11926,6 +11935,7 @@ static int bnxt_resume(struct device *device)
} }
resume_exit: resume_exit:
bnxt_ulp_start(bp, rc);
rtnl_unlock(); rtnl_unlock();
return rc; return rc;
} }
...@@ -12005,10 +12015,9 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) ...@@ -12005,10 +12015,9 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
if (!err && netif_running(netdev)) if (!err && netif_running(netdev))
err = bnxt_open(netdev); err = bnxt_open(netdev);
if (!err) { if (!err)
result = PCI_ERS_RESULT_RECOVERED; result = PCI_ERS_RESULT_RECOVERED;
bnxt_ulp_start(bp); bnxt_ulp_start(bp, err);
}
} }
if (result != PCI_ERS_RESULT_RECOVERED && netif_running(netdev)) if (result != PCI_ERS_RESULT_RECOVERED && netif_running(netdev))
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#include <linux/firmware/broadcom/tee_bnxt_fw.h> #include <linux/firmware/broadcom/tee_bnxt_fw.h>
#endif #endif
extern struct list_head bnxt_block_cb_list;
struct page_pool; struct page_pool;
struct tx_bd { struct tx_bd {
...@@ -1244,6 +1246,14 @@ struct bnxt_tc_flow_stats { ...@@ -1244,6 +1246,14 @@ struct bnxt_tc_flow_stats {
u64 bytes; u64 bytes;
}; };
#ifdef CONFIG_BNXT_FLOWER_OFFLOAD
struct bnxt_flower_indr_block_cb_priv {
struct net_device *tunnel_netdev;
struct bnxt *bp;
struct list_head list;
};
#endif
struct bnxt_tc_info { struct bnxt_tc_info {
bool enabled; bool enabled;
...@@ -1821,6 +1831,8 @@ struct bnxt { ...@@ -1821,6 +1831,8 @@ struct bnxt {
u16 *cfa_code_map; /* cfa_code -> vf_idx map */ u16 *cfa_code_map; /* cfa_code -> vf_idx map */
u8 switch_id[8]; u8 switch_id[8];
struct bnxt_tc_info *tc_info; struct bnxt_tc_info *tc_info;
struct list_head tc_indr_block_list;
struct notifier_block tc_netdev_nb;
struct dentry *debugfs_pdev; struct dentry *debugfs_pdev;
struct device *hwmon_dev; struct device *hwmon_dev;
}; };
......
...@@ -62,6 +62,12 @@ struct bnxt_tc_tunnel_key { ...@@ -62,6 +62,12 @@ struct bnxt_tc_tunnel_key {
__be32 id; __be32 id;
}; };
#define bnxt_eth_addr_key_mask_invalid(eth_addr, eth_addr_mask) \
((is_wildcard(&(eth_addr)[0], ETH_ALEN) && \
is_wildcard(&(eth_addr)[ETH_ALEN], ETH_ALEN)) || \
(is_wildcard(&(eth_addr_mask)[0], ETH_ALEN) && \
is_wildcard(&(eth_addr_mask)[ETH_ALEN], ETH_ALEN)))
struct bnxt_tc_actions { struct bnxt_tc_actions {
u32 flags; u32 flags;
#define BNXT_TC_ACTION_FLAG_FWD BIT(0) #define BNXT_TC_ACTION_FLAG_FWD BIT(0)
...@@ -71,6 +77,8 @@ struct bnxt_tc_actions { ...@@ -71,6 +77,8 @@ struct bnxt_tc_actions {
#define BNXT_TC_ACTION_FLAG_DROP BIT(5) #define BNXT_TC_ACTION_FLAG_DROP BIT(5)
#define BNXT_TC_ACTION_FLAG_TUNNEL_ENCAP BIT(6) #define BNXT_TC_ACTION_FLAG_TUNNEL_ENCAP BIT(6)
#define BNXT_TC_ACTION_FLAG_TUNNEL_DECAP BIT(7) #define BNXT_TC_ACTION_FLAG_TUNNEL_DECAP BIT(7)
#define BNXT_TC_ACTION_FLAG_L2_REWRITE BIT(8)
#define BNXT_TC_ACTION_FLAG_NAT_XLATE BIT(9)
u16 dst_fid; u16 dst_fid;
struct net_device *dst_dev; struct net_device *dst_dev;
...@@ -79,6 +87,18 @@ struct bnxt_tc_actions { ...@@ -79,6 +87,18 @@ struct bnxt_tc_actions {
/* tunnel encap */ /* tunnel encap */
struct ip_tunnel_key tun_encap_key; struct ip_tunnel_key tun_encap_key;
#define PEDIT_OFFSET_SMAC_LAST_4_BYTES 0x8
__be16 l2_rewrite_dmac[3];
__be16 l2_rewrite_smac[3];
struct {
bool src_xlate; /* true => translate src,
* false => translate dst
* Mutually exclusive, i.e cannot set both
*/
bool l3_is_ipv4; /* false means L3 is ipv6 */
struct bnxt_tc_l3_key l3;
struct bnxt_tc_l4_key l4;
} nat;
}; };
struct bnxt_tc_flow { struct bnxt_tc_flow {
......
...@@ -182,7 +182,7 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id) ...@@ -182,7 +182,7 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id)
edev->ulp_tbl[ulp_id].msix_requested = 0; edev->ulp_tbl[ulp_id].msix_requested = 0;
edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED; edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED;
if (netif_running(dev)) { if (netif_running(dev) && !(edev->flags & BNXT_EN_FLAG_ULP_STOPPED)) {
bnxt_close_nic(bp, true, false); bnxt_close_nic(bp, true, false);
bnxt_open_nic(bp, true, false); bnxt_open_nic(bp, true, false);
} }
...@@ -266,6 +266,7 @@ void bnxt_ulp_stop(struct bnxt *bp) ...@@ -266,6 +266,7 @@ void bnxt_ulp_stop(struct bnxt *bp)
if (!edev) if (!edev)
return; return;
edev->flags |= BNXT_EN_FLAG_ULP_STOPPED;
for (i = 0; i < BNXT_MAX_ULP; i++) { for (i = 0; i < BNXT_MAX_ULP; i++) {
struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; struct bnxt_ulp *ulp = &edev->ulp_tbl[i];
...@@ -276,7 +277,7 @@ void bnxt_ulp_stop(struct bnxt *bp) ...@@ -276,7 +277,7 @@ void bnxt_ulp_stop(struct bnxt *bp)
} }
} }
void bnxt_ulp_start(struct bnxt *bp) void bnxt_ulp_start(struct bnxt *bp, int err)
{ {
struct bnxt_en_dev *edev = bp->edev; struct bnxt_en_dev *edev = bp->edev;
struct bnxt_ulp_ops *ops; struct bnxt_ulp_ops *ops;
...@@ -285,6 +286,11 @@ void bnxt_ulp_start(struct bnxt *bp) ...@@ -285,6 +286,11 @@ void bnxt_ulp_start(struct bnxt *bp)
if (!edev) if (!edev)
return; return;
edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED;
if (err)
return;
for (i = 0; i < BNXT_MAX_ULP; i++) { for (i = 0; i < BNXT_MAX_ULP; i++) {
struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; struct bnxt_ulp *ulp = &edev->ulp_tbl[i];
......
...@@ -64,6 +64,7 @@ struct bnxt_en_dev { ...@@ -64,6 +64,7 @@ struct bnxt_en_dev {
#define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \ #define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \
BNXT_EN_FLAG_ROCEV2_CAP) BNXT_EN_FLAG_ROCEV2_CAP)
#define BNXT_EN_FLAG_MSIX_REQUESTED 0x4 #define BNXT_EN_FLAG_MSIX_REQUESTED 0x4
#define BNXT_EN_FLAG_ULP_STOPPED 0x8
const struct bnxt_en_ops *en_ops; const struct bnxt_en_ops *en_ops;
struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP]; struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP];
}; };
...@@ -92,7 +93,7 @@ int bnxt_get_ulp_msix_num(struct bnxt *bp); ...@@ -92,7 +93,7 @@ int bnxt_get_ulp_msix_num(struct bnxt *bp);
int bnxt_get_ulp_msix_base(struct bnxt *bp); int bnxt_get_ulp_msix_base(struct bnxt *bp);
int bnxt_get_ulp_stat_ctxs(struct bnxt *bp); int bnxt_get_ulp_stat_ctxs(struct bnxt *bp);
void bnxt_ulp_stop(struct bnxt *bp); void bnxt_ulp_stop(struct bnxt *bp);
void bnxt_ulp_start(struct bnxt *bp); void bnxt_ulp_start(struct bnxt *bp, int err);
void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs); void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);
void bnxt_ulp_shutdown(struct bnxt *bp); void bnxt_ulp_shutdown(struct bnxt *bp);
void bnxt_ulp_irq_stop(struct bnxt *bp); void bnxt_ulp_irq_stop(struct bnxt *bp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment