Commit 1ae4cd3c authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'bnxt_en-misc-fixes'

Michael Chan says:

====================
bnxt_en: Misc. fixes

4 miscellaneous driver fixes covering PM resume, SKB recycling,
wrong return value check, and PTP HWTSTAMP_FILTER_ALL.
====================

Link: https://lore.kernel.org/r/20231208001658.14230-1-michael.chan@broadcom.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 9c25aae0 c13e268c
...@@ -1748,16 +1748,32 @@ static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, ...@@ -1748,16 +1748,32 @@ static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi, static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi,
struct sk_buff *skb) struct sk_buff *skb)
{ {
skb_mark_for_recycle(skb);
if (skb->dev != bp->dev) { if (skb->dev != bp->dev) {
/* this packet belongs to a vf-rep */ /* this packet belongs to a vf-rep */
bnxt_vf_rep_rx(bp, skb); bnxt_vf_rep_rx(bp, skb);
return; return;
} }
skb_record_rx_queue(skb, bnapi->index); skb_record_rx_queue(skb, bnapi->index);
skb_mark_for_recycle(skb);
napi_gro_receive(&bnapi->napi, skb); napi_gro_receive(&bnapi->napi, skb);
} }
static bool bnxt_rx_ts_valid(struct bnxt *bp, u32 flags,
struct rx_cmp_ext *rxcmp1, u32 *cmpl_ts)
{
u32 ts = le32_to_cpu(rxcmp1->rx_cmp_timestamp);
if (BNXT_PTP_RX_TS_VALID(flags))
goto ts_valid;
if (!bp->ptp_all_rx_tstamp || !ts || !BNXT_ALL_RX_TS_VALID(flags))
return false;
ts_valid:
*cmpl_ts = ts;
return true;
}
/* returns the following: /* returns the following:
* 1 - 1 packet successfully received * 1 - 1 packet successfully received
* 0 - successful TPA_START, packet not completed yet * 0 - successful TPA_START, packet not completed yet
...@@ -1783,6 +1799,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, ...@@ -1783,6 +1799,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
struct sk_buff *skb; struct sk_buff *skb;
struct xdp_buff xdp; struct xdp_buff xdp;
u32 flags, misc; u32 flags, misc;
u32 cmpl_ts;
void *data; void *data;
int rc = 0; int rc = 0;
...@@ -2005,10 +2022,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, ...@@ -2005,10 +2022,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
} }
} }
if (unlikely((flags & RX_CMP_FLAGS_ITYPES_MASK) == if (bnxt_rx_ts_valid(bp, flags, rxcmp1, &cmpl_ts)) {
RX_CMP_FLAGS_ITYPE_PTP_W_TS) || bp->ptp_all_rx_tstamp) {
if (bp->flags & BNXT_FLAG_CHIP_P5) { if (bp->flags & BNXT_FLAG_CHIP_P5) {
u32 cmpl_ts = le32_to_cpu(rxcmp1->rx_cmp_timestamp);
u64 ns, ts; u64 ns, ts;
if (!bnxt_get_rx_ts_p5(bp, &ts, cmpl_ts)) { if (!bnxt_get_rx_ts_p5(bp, &ts, cmpl_ts)) {
...@@ -10731,10 +10746,8 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, ...@@ -10731,10 +10746,8 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
bnxt_free_mem(bp, irq_re_init); bnxt_free_mem(bp, irq_re_init);
} }
int bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) void bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
{ {
int rc = 0;
if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
/* If we get here, it means firmware reset is in progress /* If we get here, it means firmware reset is in progress
* while we are trying to close. We can safely proceed with * while we are trying to close. We can safely proceed with
...@@ -10749,15 +10762,18 @@ int bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) ...@@ -10749,15 +10762,18 @@ int bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
#ifdef CONFIG_BNXT_SRIOV #ifdef CONFIG_BNXT_SRIOV
if (bp->sriov_cfg) { if (bp->sriov_cfg) {
int rc;
rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait, rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait,
!bp->sriov_cfg, !bp->sriov_cfg,
BNXT_SRIOV_CFG_WAIT_TMO); BNXT_SRIOV_CFG_WAIT_TMO);
if (rc) if (!rc)
netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete!\n"); netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete, proceeding to close!\n");
else if (rc < 0)
netdev_warn(bp->dev, "SRIOV config operation interrupted, proceeding to close!\n");
} }
#endif #endif
__bnxt_close_nic(bp, irq_re_init, link_re_init); __bnxt_close_nic(bp, irq_re_init, link_re_init);
return rc;
} }
static int bnxt_close(struct net_device *dev) static int bnxt_close(struct net_device *dev)
...@@ -13940,6 +13956,8 @@ static int bnxt_resume(struct device *device) ...@@ -13940,6 +13956,8 @@ static int bnxt_resume(struct device *device)
if (rc) if (rc)
goto resume_exit; goto resume_exit;
bnxt_clear_reservations(bp, true);
if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) { if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) {
rc = -ENODEV; rc = -ENODEV;
goto resume_exit; goto resume_exit;
......
...@@ -161,7 +161,7 @@ struct rx_cmp { ...@@ -161,7 +161,7 @@ struct rx_cmp {
#define RX_CMP_FLAGS_ERROR (1 << 6) #define RX_CMP_FLAGS_ERROR (1 << 6)
#define RX_CMP_FLAGS_PLACEMENT (7 << 7) #define RX_CMP_FLAGS_PLACEMENT (7 << 7)
#define RX_CMP_FLAGS_RSS_VALID (1 << 10) #define RX_CMP_FLAGS_RSS_VALID (1 << 10)
#define RX_CMP_FLAGS_UNUSED (1 << 11) #define RX_CMP_FLAGS_PKT_METADATA_PRESENT (1 << 11)
#define RX_CMP_FLAGS_ITYPES_SHIFT 12 #define RX_CMP_FLAGS_ITYPES_SHIFT 12
#define RX_CMP_FLAGS_ITYPES_MASK 0xf000 #define RX_CMP_FLAGS_ITYPES_MASK 0xf000
#define RX_CMP_FLAGS_ITYPE_UNKNOWN (0 << 12) #define RX_CMP_FLAGS_ITYPE_UNKNOWN (0 << 12)
...@@ -188,6 +188,12 @@ struct rx_cmp { ...@@ -188,6 +188,12 @@ struct rx_cmp {
__le32 rx_cmp_rss_hash; __le32 rx_cmp_rss_hash;
}; };
#define BNXT_PTP_RX_TS_VALID(flags) \
(((flags) & RX_CMP_FLAGS_ITYPES_MASK) == RX_CMP_FLAGS_ITYPE_PTP_W_TS)
#define BNXT_ALL_RX_TS_VALID(flags) \
!((flags) & RX_CMP_FLAGS_PKT_METADATA_PRESENT)
#define RX_CMP_HASH_VALID(rxcmp) \ #define RX_CMP_HASH_VALID(rxcmp) \
((rxcmp)->rx_cmp_len_flags_type & cpu_to_le32(RX_CMP_FLAGS_RSS_VALID)) ((rxcmp)->rx_cmp_len_flags_type & cpu_to_le32(RX_CMP_FLAGS_RSS_VALID))
...@@ -2375,7 +2381,7 @@ int bnxt_open_nic(struct bnxt *, bool, bool); ...@@ -2375,7 +2381,7 @@ int bnxt_open_nic(struct bnxt *, bool, bool);
int bnxt_half_open_nic(struct bnxt *bp); int bnxt_half_open_nic(struct bnxt *bp);
void bnxt_half_close_nic(struct bnxt *bp); void bnxt_half_close_nic(struct bnxt *bp);
void bnxt_reenable_sriov(struct bnxt *bp); void bnxt_reenable_sriov(struct bnxt *bp);
int bnxt_close_nic(struct bnxt *, bool, bool); void bnxt_close_nic(struct bnxt *, bool, bool);
void bnxt_get_ring_err_stats(struct bnxt *bp, void bnxt_get_ring_err_stats(struct bnxt *bp,
struct bnxt_total_ring_err_stats *stats); struct bnxt_total_ring_err_stats *stats);
int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words, int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words,
......
...@@ -449,15 +449,8 @@ static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change, ...@@ -449,15 +449,8 @@ static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change,
return -ENODEV; return -ENODEV;
} }
bnxt_ulp_stop(bp); bnxt_ulp_stop(bp);
if (netif_running(bp->dev)) { if (netif_running(bp->dev))
rc = bnxt_close_nic(bp, true, true); bnxt_close_nic(bp, true, true);
if (rc) {
NL_SET_ERR_MSG_MOD(extack, "Failed to close");
dev_close(bp->dev);
rtnl_unlock();
break;
}
}
bnxt_vf_reps_free(bp); bnxt_vf_reps_free(bp);
rc = bnxt_hwrm_func_drv_unrgtr(bp); rc = bnxt_hwrm_func_drv_unrgtr(bp);
if (rc) { if (rc) {
......
...@@ -165,8 +165,7 @@ static int bnxt_set_coalesce(struct net_device *dev, ...@@ -165,8 +165,7 @@ static int bnxt_set_coalesce(struct net_device *dev,
reset_coalesce: reset_coalesce:
if (test_bit(BNXT_STATE_OPEN, &bp->state)) { if (test_bit(BNXT_STATE_OPEN, &bp->state)) {
if (update_stats) { if (update_stats) {
rc = bnxt_close_nic(bp, true, false); bnxt_close_nic(bp, true, false);
if (!rc)
rc = bnxt_open_nic(bp, true, false); rc = bnxt_open_nic(bp, true, false);
} else { } else {
rc = bnxt_hwrm_set_coal(bp); rc = bnxt_hwrm_set_coal(bp);
...@@ -972,12 +971,7 @@ static int bnxt_set_channels(struct net_device *dev, ...@@ -972,12 +971,7 @@ static int bnxt_set_channels(struct net_device *dev,
* before PF unload * before PF unload
*/ */
} }
rc = bnxt_close_nic(bp, true, false); bnxt_close_nic(bp, true, false);
if (rc) {
netdev_err(bp->dev, "Set channel failure rc :%x\n",
rc);
return rc;
}
} }
if (sh) { if (sh) {
...@@ -4042,12 +4036,7 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest, ...@@ -4042,12 +4036,7 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
bnxt_run_fw_tests(bp, test_mask, &test_results); bnxt_run_fw_tests(bp, test_mask, &test_results);
} else { } else {
bnxt_ulp_stop(bp); bnxt_ulp_stop(bp);
rc = bnxt_close_nic(bp, true, false); bnxt_close_nic(bp, true, false);
if (rc) {
etest->flags |= ETH_TEST_FL_FAILED;
bnxt_ulp_start(bp, rc);
return;
}
bnxt_run_fw_tests(bp, test_mask, &test_results); bnxt_run_fw_tests(bp, test_mask, &test_results);
buf[BNXT_MACLPBK_TEST_IDX] = 1; buf[BNXT_MACLPBK_TEST_IDX] = 1;
......
...@@ -521,8 +521,7 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp) ...@@ -521,8 +521,7 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
if (netif_running(bp->dev)) { if (netif_running(bp->dev)) {
if (ptp->rx_filter == HWTSTAMP_FILTER_ALL) { if (ptp->rx_filter == HWTSTAMP_FILTER_ALL) {
rc = bnxt_close_nic(bp, false, false); bnxt_close_nic(bp, false, false);
if (!rc)
rc = bnxt_open_nic(bp, false, false); rc = bnxt_open_nic(bp, false, false);
} else { } else {
bnxt_ptp_cfg_tstamp_filters(bp); bnxt_ptp_cfg_tstamp_filters(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