Merge branch 'bnxt_en-Bug-fixes'
Michael Chan says: ==================== bnxt_en: Bug fixes. Most of the bug fixes are related to the new 57500 chips, including some initialization and counter fixes, disabling RDMA support, and a workaround for occasional missing interrupts. The last patch from Vasundhara fixes the year/month parameters for firmware coredump. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e371357f07
|
@ -1675,7 +1675,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
|||
} else {
|
||||
if (rxcmp1->rx_cmp_cfa_code_errors_v2 & RX_CMP_L4_CS_ERR_BITS) {
|
||||
if (dev->features & NETIF_F_RXCSUM)
|
||||
cpr->rx_l4_csum_errors++;
|
||||
bnapi->cp_ring.rx_l4_csum_errors++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8714,6 +8714,26 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int bnxt_dbg_hwrm_ring_info_get(struct bnxt *bp, u8 ring_type,
|
||||
u32 ring_id, u32 *prod, u32 *cons)
|
||||
{
|
||||
struct hwrm_dbg_ring_info_get_output *resp = bp->hwrm_cmd_resp_addr;
|
||||
struct hwrm_dbg_ring_info_get_input req = {0};
|
||||
int rc;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_DBG_RING_INFO_GET, -1, -1);
|
||||
req.ring_type = ring_type;
|
||||
req.fw_ring_id = cpu_to_le32(ring_id);
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
if (!rc) {
|
||||
*prod = le32_to_cpu(resp->producer_index);
|
||||
*cons = le32_to_cpu(resp->consumer_index);
|
||||
}
|
||||
mutex_unlock(&bp->hwrm_cmd_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void bnxt_dump_tx_sw_state(struct bnxt_napi *bnapi)
|
||||
{
|
||||
struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
|
||||
|
@ -8821,6 +8841,11 @@ static void bnxt_timer(struct timer_list *t)
|
|||
bnxt_queue_sp_work(bp);
|
||||
}
|
||||
}
|
||||
|
||||
if ((bp->flags & BNXT_FLAG_CHIP_P5) && netif_carrier_ok(dev)) {
|
||||
set_bit(BNXT_RING_COAL_NOW_SP_EVENT, &bp->sp_event);
|
||||
bnxt_queue_sp_work(bp);
|
||||
}
|
||||
bnxt_restart_timer:
|
||||
mod_timer(&bp->timer, jiffies + bp->current_interval);
|
||||
}
|
||||
|
@ -8851,6 +8876,44 @@ static void bnxt_reset(struct bnxt *bp, bool silent)
|
|||
bnxt_rtnl_unlock_sp(bp);
|
||||
}
|
||||
|
||||
static void bnxt_chk_missed_irq(struct bnxt *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
|
||||
return;
|
||||
|
||||
for (i = 0; i < bp->cp_nr_rings; i++) {
|
||||
struct bnxt_napi *bnapi = bp->bnapi[i];
|
||||
struct bnxt_cp_ring_info *cpr;
|
||||
u32 fw_ring_id;
|
||||
int j;
|
||||
|
||||
if (!bnapi)
|
||||
continue;
|
||||
|
||||
cpr = &bnapi->cp_ring;
|
||||
for (j = 0; j < 2; j++) {
|
||||
struct bnxt_cp_ring_info *cpr2 = cpr->cp_ring_arr[j];
|
||||
u32 val[2];
|
||||
|
||||
if (!cpr2 || cpr2->has_more_work ||
|
||||
!bnxt_has_work(bp, cpr2))
|
||||
continue;
|
||||
|
||||
if (cpr2->cp_raw_cons != cpr2->last_cp_raw_cons) {
|
||||
cpr2->last_cp_raw_cons = cpr2->cp_raw_cons;
|
||||
continue;
|
||||
}
|
||||
fw_ring_id = cpr2->cp_ring_struct.fw_ring_id;
|
||||
bnxt_dbg_hwrm_ring_info_get(bp,
|
||||
DBG_RING_INFO_GET_REQ_RING_TYPE_L2_CMPL,
|
||||
fw_ring_id, &val[0], &val[1]);
|
||||
cpr->missed_irqs++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void bnxt_cfg_ntp_filters(struct bnxt *);
|
||||
|
||||
static void bnxt_sp_task(struct work_struct *work)
|
||||
|
@ -8930,6 +8993,9 @@ static void bnxt_sp_task(struct work_struct *work)
|
|||
if (test_and_clear_bit(BNXT_FLOW_STATS_SP_EVENT, &bp->sp_event))
|
||||
bnxt_tc_flow_stats_work(bp);
|
||||
|
||||
if (test_and_clear_bit(BNXT_RING_COAL_NOW_SP_EVENT, &bp->sp_event))
|
||||
bnxt_chk_missed_irq(bp);
|
||||
|
||||
/* These functions below will clear BNXT_STATE_IN_SP_TASK. They
|
||||
* must be the last functions to be called before exiting.
|
||||
*/
|
||||
|
@ -10087,6 +10153,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
}
|
||||
|
||||
bnxt_hwrm_func_qcfg(bp);
|
||||
bnxt_hwrm_vnic_qcaps(bp);
|
||||
bnxt_hwrm_port_led_qcaps(bp);
|
||||
bnxt_ethtool_init(bp);
|
||||
bnxt_dcb_init(bp);
|
||||
|
@ -10120,7 +10187,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
|
||||
}
|
||||
|
||||
bnxt_hwrm_vnic_qcaps(bp);
|
||||
if (bnxt_rfs_supported(bp)) {
|
||||
dev->hw_features |= NETIF_F_NTUPLE;
|
||||
if (bnxt_rfs_capable(bp)) {
|
||||
|
|
|
@ -798,6 +798,8 @@ struct bnxt_cp_ring_info {
|
|||
u8 had_work_done:1;
|
||||
u8 has_more_work:1;
|
||||
|
||||
u32 last_cp_raw_cons;
|
||||
|
||||
struct bnxt_coal rx_ring_coal;
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
|
@ -816,6 +818,7 @@ struct bnxt_cp_ring_info {
|
|||
dma_addr_t hw_stats_map;
|
||||
u32 hw_stats_ctx_id;
|
||||
u64 rx_l4_csum_errors;
|
||||
u64 missed_irqs;
|
||||
|
||||
struct bnxt_ring_struct cp_ring_struct;
|
||||
|
||||
|
@ -1527,6 +1530,7 @@ struct bnxt {
|
|||
#define BNXT_LINK_SPEED_CHNG_SP_EVENT 14
|
||||
#define BNXT_FLOW_STATS_SP_EVENT 15
|
||||
#define BNXT_UPDATE_PHY_SP_EVENT 16
|
||||
#define BNXT_RING_COAL_NOW_SP_EVENT 17
|
||||
|
||||
struct bnxt_hw_resc hw_resc;
|
||||
struct bnxt_pf_info pf;
|
||||
|
|
|
@ -137,7 +137,7 @@ reset_coalesce:
|
|||
return rc;
|
||||
}
|
||||
|
||||
#define BNXT_NUM_STATS 21
|
||||
#define BNXT_NUM_STATS 22
|
||||
|
||||
#define BNXT_RX_STATS_ENTRY(counter) \
|
||||
{ BNXT_RX_STATS_OFFSET(counter), __stringify(counter) }
|
||||
|
@ -384,6 +384,7 @@ static void bnxt_get_ethtool_stats(struct net_device *dev,
|
|||
for (k = 0; k < stat_fields; j++, k++)
|
||||
buf[j] = le64_to_cpu(hw_stats[k]);
|
||||
buf[j++] = cpr->rx_l4_csum_errors;
|
||||
buf[j++] = cpr->missed_irqs;
|
||||
|
||||
bnxt_sw_func_stats[RX_TOTAL_DISCARDS].counter +=
|
||||
le64_to_cpu(cpr->hw_stats->rx_discard_pkts);
|
||||
|
@ -468,6 +469,8 @@ static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
|
|||
buf += ETH_GSTRING_LEN;
|
||||
sprintf(buf, "[%d]: rx_l4_csum_errors", i);
|
||||
buf += ETH_GSTRING_LEN;
|
||||
sprintf(buf, "[%d]: missed_irqs", i);
|
||||
buf += ETH_GSTRING_LEN;
|
||||
}
|
||||
for (i = 0; i < BNXT_NUM_SW_FUNC_STATS; i++) {
|
||||
strcpy(buf, bnxt_sw_func_stats[i].string);
|
||||
|
@ -2942,8 +2945,8 @@ bnxt_fill_coredump_record(struct bnxt *bp, struct bnxt_coredump_record *record,
|
|||
record->asic_state = 0;
|
||||
strlcpy(record->system_name, utsname()->nodename,
|
||||
sizeof(record->system_name));
|
||||
record->year = cpu_to_le16(tm.tm_year);
|
||||
record->month = cpu_to_le16(tm.tm_mon);
|
||||
record->year = cpu_to_le16(tm.tm_year + 1900);
|
||||
record->month = cpu_to_le16(tm.tm_mon + 1);
|
||||
record->day = cpu_to_le16(tm.tm_mday);
|
||||
record->hour = cpu_to_le16(tm.tm_hour);
|
||||
record->minute = cpu_to_le16(tm.tm_min);
|
||||
|
|
|
@ -43,6 +43,9 @@ static int bnxt_register_dev(struct bnxt_en_dev *edev, int ulp_id,
|
|||
if (ulp_id == BNXT_ROCE_ULP) {
|
||||
unsigned int max_stat_ctxs;
|
||||
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
max_stat_ctxs = bnxt_get_max_func_stat_ctxs(bp);
|
||||
if (max_stat_ctxs <= BNXT_MIN_ROCE_STAT_CTXS ||
|
||||
bp->num_stat_ctxs == max_stat_ctxs)
|
||||
|
|
Loading…
Reference in New Issue