mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Merge branch 'net-mana-refactor-gf-stats-handling-and-add-rx_missed_errors-counter'
Erni Sri Satya Vennela says: ==================== net: mana: Refactor GF stats handling and add rx_missed_errors counter Restructure mana_query_gf_stats() to operate on the per-VF mana_context, instead of per-port statistics. Introduce mana_ethtool_hc_stats to isolate hardware counter statistics and update the "ethtool -S <interface>" output to expose all relevant counters while preserving backward compatibility. Add support for the standard rx_missed_errors counter by mapping it to the hardware's hc_rx_discards_no_wqe metric. Refresh statistics every 2 seconds. ==================== Link: https://patch.msgid.link/1763120599-6331-1-git-send-email-ernis@linux.microsoft.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -534,6 +534,11 @@ static void mana_get_stats64(struct net_device *ndev,
|
||||
|
||||
netdev_stats_to_stats64(st, &ndev->stats);
|
||||
|
||||
if (apc->ac->hwc_timeout_occurred)
|
||||
netdev_warn_once(ndev, "HWC timeout occurred\n");
|
||||
|
||||
st->rx_missed_errors = apc->ac->hc_stats.hc_rx_discards_no_wqe;
|
||||
|
||||
for (q = 0; q < num_queues; q++) {
|
||||
rx_stats = &apc->rxqs[q]->stats;
|
||||
|
||||
@@ -2809,11 +2814,12 @@ int mana_config_rss(struct mana_port_context *apc, enum TRI_STATE rx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mana_query_gf_stats(struct mana_port_context *apc)
|
||||
int mana_query_gf_stats(struct mana_context *ac)
|
||||
{
|
||||
struct gdma_context *gc = ac->gdma_dev->gdma_context;
|
||||
struct mana_query_gf_stat_resp resp = {};
|
||||
struct mana_query_gf_stat_req req = {};
|
||||
struct net_device *ndev = apc->ndev;
|
||||
struct device *dev = gc->dev;
|
||||
int err;
|
||||
|
||||
mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_GF_STAT,
|
||||
@@ -2847,52 +2853,54 @@ void mana_query_gf_stats(struct mana_port_context *apc)
|
||||
STATISTICS_FLAGS_HC_TX_BCAST_BYTES |
|
||||
STATISTICS_FLAGS_TX_ERRORS_GDMA_ERROR;
|
||||
|
||||
err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
|
||||
err = mana_send_request(ac, &req, sizeof(req), &resp,
|
||||
sizeof(resp));
|
||||
if (err) {
|
||||
netdev_err(ndev, "Failed to query GF stats: %d\n", err);
|
||||
return;
|
||||
dev_err(dev, "Failed to query GF stats: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
err = mana_verify_resp_hdr(&resp.hdr, MANA_QUERY_GF_STAT,
|
||||
sizeof(resp));
|
||||
if (err || resp.hdr.status) {
|
||||
netdev_err(ndev, "Failed to query GF stats: %d, 0x%x\n", err,
|
||||
resp.hdr.status);
|
||||
return;
|
||||
dev_err(dev, "Failed to query GF stats: %d, 0x%x\n", err,
|
||||
resp.hdr.status);
|
||||
return err;
|
||||
}
|
||||
|
||||
apc->eth_stats.hc_rx_discards_no_wqe = resp.rx_discards_nowqe;
|
||||
apc->eth_stats.hc_rx_err_vport_disabled = resp.rx_err_vport_disabled;
|
||||
apc->eth_stats.hc_rx_bytes = resp.hc_rx_bytes;
|
||||
apc->eth_stats.hc_rx_ucast_pkts = resp.hc_rx_ucast_pkts;
|
||||
apc->eth_stats.hc_rx_ucast_bytes = resp.hc_rx_ucast_bytes;
|
||||
apc->eth_stats.hc_rx_bcast_pkts = resp.hc_rx_bcast_pkts;
|
||||
apc->eth_stats.hc_rx_bcast_bytes = resp.hc_rx_bcast_bytes;
|
||||
apc->eth_stats.hc_rx_mcast_pkts = resp.hc_rx_mcast_pkts;
|
||||
apc->eth_stats.hc_rx_mcast_bytes = resp.hc_rx_mcast_bytes;
|
||||
apc->eth_stats.hc_tx_err_gf_disabled = resp.tx_err_gf_disabled;
|
||||
apc->eth_stats.hc_tx_err_vport_disabled = resp.tx_err_vport_disabled;
|
||||
apc->eth_stats.hc_tx_err_inval_vportoffset_pkt =
|
||||
ac->hc_stats.hc_rx_discards_no_wqe = resp.rx_discards_nowqe;
|
||||
ac->hc_stats.hc_rx_err_vport_disabled = resp.rx_err_vport_disabled;
|
||||
ac->hc_stats.hc_rx_bytes = resp.hc_rx_bytes;
|
||||
ac->hc_stats.hc_rx_ucast_pkts = resp.hc_rx_ucast_pkts;
|
||||
ac->hc_stats.hc_rx_ucast_bytes = resp.hc_rx_ucast_bytes;
|
||||
ac->hc_stats.hc_rx_bcast_pkts = resp.hc_rx_bcast_pkts;
|
||||
ac->hc_stats.hc_rx_bcast_bytes = resp.hc_rx_bcast_bytes;
|
||||
ac->hc_stats.hc_rx_mcast_pkts = resp.hc_rx_mcast_pkts;
|
||||
ac->hc_stats.hc_rx_mcast_bytes = resp.hc_rx_mcast_bytes;
|
||||
ac->hc_stats.hc_tx_err_gf_disabled = resp.tx_err_gf_disabled;
|
||||
ac->hc_stats.hc_tx_err_vport_disabled = resp.tx_err_vport_disabled;
|
||||
ac->hc_stats.hc_tx_err_inval_vportoffset_pkt =
|
||||
resp.tx_err_inval_vport_offset_pkt;
|
||||
apc->eth_stats.hc_tx_err_vlan_enforcement =
|
||||
ac->hc_stats.hc_tx_err_vlan_enforcement =
|
||||
resp.tx_err_vlan_enforcement;
|
||||
apc->eth_stats.hc_tx_err_eth_type_enforcement =
|
||||
ac->hc_stats.hc_tx_err_eth_type_enforcement =
|
||||
resp.tx_err_ethtype_enforcement;
|
||||
apc->eth_stats.hc_tx_err_sa_enforcement = resp.tx_err_SA_enforcement;
|
||||
apc->eth_stats.hc_tx_err_sqpdid_enforcement =
|
||||
ac->hc_stats.hc_tx_err_sa_enforcement = resp.tx_err_SA_enforcement;
|
||||
ac->hc_stats.hc_tx_err_sqpdid_enforcement =
|
||||
resp.tx_err_SQPDID_enforcement;
|
||||
apc->eth_stats.hc_tx_err_cqpdid_enforcement =
|
||||
ac->hc_stats.hc_tx_err_cqpdid_enforcement =
|
||||
resp.tx_err_CQPDID_enforcement;
|
||||
apc->eth_stats.hc_tx_err_mtu_violation = resp.tx_err_mtu_violation;
|
||||
apc->eth_stats.hc_tx_err_inval_oob = resp.tx_err_inval_oob;
|
||||
apc->eth_stats.hc_tx_bytes = resp.hc_tx_bytes;
|
||||
apc->eth_stats.hc_tx_ucast_pkts = resp.hc_tx_ucast_pkts;
|
||||
apc->eth_stats.hc_tx_ucast_bytes = resp.hc_tx_ucast_bytes;
|
||||
apc->eth_stats.hc_tx_bcast_pkts = resp.hc_tx_bcast_pkts;
|
||||
apc->eth_stats.hc_tx_bcast_bytes = resp.hc_tx_bcast_bytes;
|
||||
apc->eth_stats.hc_tx_mcast_pkts = resp.hc_tx_mcast_pkts;
|
||||
apc->eth_stats.hc_tx_mcast_bytes = resp.hc_tx_mcast_bytes;
|
||||
apc->eth_stats.hc_tx_err_gdma = resp.tx_err_gdma;
|
||||
ac->hc_stats.hc_tx_err_mtu_violation = resp.tx_err_mtu_violation;
|
||||
ac->hc_stats.hc_tx_err_inval_oob = resp.tx_err_inval_oob;
|
||||
ac->hc_stats.hc_tx_bytes = resp.hc_tx_bytes;
|
||||
ac->hc_stats.hc_tx_ucast_pkts = resp.hc_tx_ucast_pkts;
|
||||
ac->hc_stats.hc_tx_ucast_bytes = resp.hc_tx_ucast_bytes;
|
||||
ac->hc_stats.hc_tx_bcast_pkts = resp.hc_tx_bcast_pkts;
|
||||
ac->hc_stats.hc_tx_bcast_bytes = resp.hc_tx_bcast_bytes;
|
||||
ac->hc_stats.hc_tx_mcast_pkts = resp.hc_tx_mcast_pkts;
|
||||
ac->hc_stats.hc_tx_mcast_bytes = resp.hc_tx_mcast_bytes;
|
||||
ac->hc_stats.hc_tx_err_gdma = resp.tx_err_gdma;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mana_query_phy_stats(struct mana_port_context *apc)
|
||||
@@ -3427,6 +3435,24 @@ int mana_rdma_service_event(struct gdma_context *gc, enum gdma_service_type even
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define MANA_GF_STATS_PERIOD (2 * HZ)
|
||||
|
||||
static void mana_gf_stats_work_handler(struct work_struct *work)
|
||||
{
|
||||
struct mana_context *ac =
|
||||
container_of(to_delayed_work(work), struct mana_context, gf_stats_work);
|
||||
int err;
|
||||
|
||||
err = mana_query_gf_stats(ac);
|
||||
if (err == -ETIMEDOUT) {
|
||||
/* HWC timeout detected - reset stats and stop rescheduling */
|
||||
ac->hwc_timeout_occurred = true;
|
||||
memset(&ac->hc_stats, 0, sizeof(ac->hc_stats));
|
||||
return;
|
||||
}
|
||||
schedule_delayed_work(&ac->gf_stats_work, MANA_GF_STATS_PERIOD);
|
||||
}
|
||||
|
||||
int mana_probe(struct gdma_dev *gd, bool resuming)
|
||||
{
|
||||
struct gdma_context *gc = gd->gdma_context;
|
||||
@@ -3519,6 +3545,10 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
|
||||
}
|
||||
|
||||
err = add_adev(gd, "eth");
|
||||
|
||||
INIT_DELAYED_WORK(&ac->gf_stats_work, mana_gf_stats_work_handler);
|
||||
schedule_delayed_work(&ac->gf_stats_work, MANA_GF_STATS_PERIOD);
|
||||
|
||||
out:
|
||||
if (err) {
|
||||
mana_remove(gd, false);
|
||||
@@ -3543,6 +3573,7 @@ void mana_remove(struct gdma_dev *gd, bool suspending)
|
||||
int i;
|
||||
|
||||
disable_work_sync(&ac->link_change_work);
|
||||
cancel_delayed_work_sync(&ac->gf_stats_work);
|
||||
|
||||
/* adev currently doesn't support suspending, always remove it */
|
||||
if (gd->adev)
|
||||
|
||||
@@ -15,59 +15,6 @@ struct mana_stats_desc {
|
||||
static const struct mana_stats_desc mana_eth_stats[] = {
|
||||
{"stop_queue", offsetof(struct mana_ethtool_stats, stop_queue)},
|
||||
{"wake_queue", offsetof(struct mana_ethtool_stats, wake_queue)},
|
||||
{"hc_rx_discards_no_wqe", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_discards_no_wqe)},
|
||||
{"hc_rx_err_vport_disabled", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_err_vport_disabled)},
|
||||
{"hc_rx_bytes", offsetof(struct mana_ethtool_stats, hc_rx_bytes)},
|
||||
{"hc_rx_ucast_pkts", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_ucast_pkts)},
|
||||
{"hc_rx_ucast_bytes", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_ucast_bytes)},
|
||||
{"hc_rx_bcast_pkts", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_bcast_pkts)},
|
||||
{"hc_rx_bcast_bytes", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_bcast_bytes)},
|
||||
{"hc_rx_mcast_pkts", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_mcast_pkts)},
|
||||
{"hc_rx_mcast_bytes", offsetof(struct mana_ethtool_stats,
|
||||
hc_rx_mcast_bytes)},
|
||||
{"hc_tx_err_gf_disabled", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_gf_disabled)},
|
||||
{"hc_tx_err_vport_disabled", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_vport_disabled)},
|
||||
{"hc_tx_err_inval_vportoffset_pkt",
|
||||
offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_inval_vportoffset_pkt)},
|
||||
{"hc_tx_err_vlan_enforcement", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_vlan_enforcement)},
|
||||
{"hc_tx_err_eth_type_enforcement",
|
||||
offsetof(struct mana_ethtool_stats, hc_tx_err_eth_type_enforcement)},
|
||||
{"hc_tx_err_sa_enforcement", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_sa_enforcement)},
|
||||
{"hc_tx_err_sqpdid_enforcement",
|
||||
offsetof(struct mana_ethtool_stats, hc_tx_err_sqpdid_enforcement)},
|
||||
{"hc_tx_err_cqpdid_enforcement",
|
||||
offsetof(struct mana_ethtool_stats, hc_tx_err_cqpdid_enforcement)},
|
||||
{"hc_tx_err_mtu_violation", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_mtu_violation)},
|
||||
{"hc_tx_err_inval_oob", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_inval_oob)},
|
||||
{"hc_tx_err_gdma", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_err_gdma)},
|
||||
{"hc_tx_bytes", offsetof(struct mana_ethtool_stats, hc_tx_bytes)},
|
||||
{"hc_tx_ucast_pkts", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_ucast_pkts)},
|
||||
{"hc_tx_ucast_bytes", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_ucast_bytes)},
|
||||
{"hc_tx_bcast_pkts", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_bcast_pkts)},
|
||||
{"hc_tx_bcast_bytes", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_bcast_bytes)},
|
||||
{"hc_tx_mcast_pkts", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_mcast_pkts)},
|
||||
{"hc_tx_mcast_bytes", offsetof(struct mana_ethtool_stats,
|
||||
hc_tx_mcast_bytes)},
|
||||
{"tx_cq_err", offsetof(struct mana_ethtool_stats, tx_cqe_err)},
|
||||
{"tx_cqe_unknown_type", offsetof(struct mana_ethtool_stats,
|
||||
tx_cqe_unknown_type)},
|
||||
@@ -77,6 +24,62 @@ static const struct mana_stats_desc mana_eth_stats[] = {
|
||||
rx_cqe_unknown_type)},
|
||||
};
|
||||
|
||||
static const struct mana_stats_desc mana_hc_stats[] = {
|
||||
{"hc_rx_discards_no_wqe", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_discards_no_wqe)},
|
||||
{"hc_rx_err_vport_disabled", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_err_vport_disabled)},
|
||||
{"hc_rx_bytes", offsetof(struct mana_ethtool_hc_stats, hc_rx_bytes)},
|
||||
{"hc_rx_ucast_pkts", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_ucast_pkts)},
|
||||
{"hc_rx_ucast_bytes", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_ucast_bytes)},
|
||||
{"hc_rx_bcast_pkts", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_bcast_pkts)},
|
||||
{"hc_rx_bcast_bytes", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_bcast_bytes)},
|
||||
{"hc_rx_mcast_pkts", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_mcast_pkts)},
|
||||
{"hc_rx_mcast_bytes", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_rx_mcast_bytes)},
|
||||
{"hc_tx_err_gf_disabled", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_gf_disabled)},
|
||||
{"hc_tx_err_vport_disabled", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_vport_disabled)},
|
||||
{"hc_tx_err_inval_vportoffset_pkt",
|
||||
offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_inval_vportoffset_pkt)},
|
||||
{"hc_tx_err_vlan_enforcement", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_vlan_enforcement)},
|
||||
{"hc_tx_err_eth_type_enforcement",
|
||||
offsetof(struct mana_ethtool_hc_stats, hc_tx_err_eth_type_enforcement)},
|
||||
{"hc_tx_err_sa_enforcement", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_sa_enforcement)},
|
||||
{"hc_tx_err_sqpdid_enforcement",
|
||||
offsetof(struct mana_ethtool_hc_stats, hc_tx_err_sqpdid_enforcement)},
|
||||
{"hc_tx_err_cqpdid_enforcement",
|
||||
offsetof(struct mana_ethtool_hc_stats, hc_tx_err_cqpdid_enforcement)},
|
||||
{"hc_tx_err_mtu_violation", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_mtu_violation)},
|
||||
{"hc_tx_err_inval_oob", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_inval_oob)},
|
||||
{"hc_tx_err_gdma", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_err_gdma)},
|
||||
{"hc_tx_bytes", offsetof(struct mana_ethtool_hc_stats, hc_tx_bytes)},
|
||||
{"hc_tx_ucast_pkts", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_ucast_pkts)},
|
||||
{"hc_tx_ucast_bytes", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_ucast_bytes)},
|
||||
{"hc_tx_bcast_pkts", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_bcast_pkts)},
|
||||
{"hc_tx_bcast_bytes", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_bcast_bytes)},
|
||||
{"hc_tx_mcast_pkts", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_mcast_pkts)},
|
||||
{"hc_tx_mcast_bytes", offsetof(struct mana_ethtool_hc_stats,
|
||||
hc_tx_mcast_bytes)},
|
||||
};
|
||||
|
||||
static const struct mana_stats_desc mana_phy_stats[] = {
|
||||
{ "hc_rx_pkt_drop_phy", offsetof(struct mana_ethtool_phy_stats, rx_pkt_drop_phy) },
|
||||
{ "hc_tx_pkt_drop_phy", offsetof(struct mana_ethtool_phy_stats, tx_pkt_drop_phy) },
|
||||
@@ -138,7 +141,7 @@ static int mana_get_sset_count(struct net_device *ndev, int stringset)
|
||||
if (stringset != ETH_SS_STATS)
|
||||
return -EINVAL;
|
||||
|
||||
return ARRAY_SIZE(mana_eth_stats) + ARRAY_SIZE(mana_phy_stats) +
|
||||
return ARRAY_SIZE(mana_eth_stats) + ARRAY_SIZE(mana_phy_stats) + ARRAY_SIZE(mana_hc_stats) +
|
||||
num_queues * (MANA_STATS_RX_COUNT + MANA_STATS_TX_COUNT);
|
||||
}
|
||||
|
||||
@@ -150,10 +153,12 @@ static void mana_get_strings(struct net_device *ndev, u32 stringset, u8 *data)
|
||||
|
||||
if (stringset != ETH_SS_STATS)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mana_eth_stats); i++)
|
||||
ethtool_puts(&data, mana_eth_stats[i].name);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mana_hc_stats); i++)
|
||||
ethtool_puts(&data, mana_hc_stats[i].name);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mana_phy_stats); i++)
|
||||
ethtool_puts(&data, mana_phy_stats[i].name);
|
||||
|
||||
@@ -186,6 +191,7 @@ static void mana_get_ethtool_stats(struct net_device *ndev,
|
||||
struct mana_port_context *apc = netdev_priv(ndev);
|
||||
unsigned int num_queues = apc->num_queues;
|
||||
void *eth_stats = &apc->eth_stats;
|
||||
void *hc_stats = &apc->ac->hc_stats;
|
||||
void *phy_stats = &apc->phy_stats;
|
||||
struct mana_stats_rx *rx_stats;
|
||||
struct mana_stats_tx *tx_stats;
|
||||
@@ -207,8 +213,6 @@ static void mana_get_ethtool_stats(struct net_device *ndev,
|
||||
|
||||
if (!apc->port_is_up)
|
||||
return;
|
||||
/* we call mana function to update stats from GDMA */
|
||||
mana_query_gf_stats(apc);
|
||||
|
||||
/* We call this mana function to get the phy stats from GDMA and includes
|
||||
* aggregate tx/rx drop counters, Per-TC(Traffic Channel) tx/rx and pause
|
||||
@@ -219,6 +223,9 @@ static void mana_get_ethtool_stats(struct net_device *ndev,
|
||||
for (q = 0; q < ARRAY_SIZE(mana_eth_stats); q++)
|
||||
data[i++] = *(u64 *)(eth_stats + mana_eth_stats[q].offset);
|
||||
|
||||
for (q = 0; q < ARRAY_SIZE(mana_hc_stats); q++)
|
||||
data[i++] = *(u64 *)(hc_stats + mana_hc_stats[q].offset);
|
||||
|
||||
for (q = 0; q < ARRAY_SIZE(mana_phy_stats); q++)
|
||||
data[i++] = *(u64 *)(phy_stats + mana_phy_stats[q].offset);
|
||||
|
||||
|
||||
@@ -592,6 +592,9 @@ enum {
|
||||
#define GDMA_DRV_CAP_FLAG_1_HANDLE_RECONFIG_EQE BIT(17)
|
||||
#define GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE BIT(6)
|
||||
|
||||
/* Driver can send HWC periodically to query stats */
|
||||
#define GDMA_DRV_CAP_FLAG_1_PERIODIC_STATS_QUERY BIT(21)
|
||||
|
||||
#define GDMA_DRV_CAP_FLAGS1 \
|
||||
(GDMA_DRV_CAP_FLAG_1_EQ_SHARING_MULTI_VPORT | \
|
||||
GDMA_DRV_CAP_FLAG_1_NAPI_WKDONE_FIX | \
|
||||
@@ -601,7 +604,8 @@ enum {
|
||||
GDMA_DRV_CAP_FLAG_1_DYNAMIC_IRQ_ALLOC_SUPPORT | \
|
||||
GDMA_DRV_CAP_FLAG_1_SELF_RESET_ON_EQE | \
|
||||
GDMA_DRV_CAP_FLAG_1_HANDLE_RECONFIG_EQE | \
|
||||
GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE)
|
||||
GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE | \
|
||||
GDMA_DRV_CAP_FLAG_1_PERIODIC_STATS_QUERY)
|
||||
|
||||
#define GDMA_DRV_CAP_FLAGS2 0
|
||||
|
||||
|
||||
@@ -375,6 +375,13 @@ struct mana_tx_qp {
|
||||
struct mana_ethtool_stats {
|
||||
u64 stop_queue;
|
||||
u64 wake_queue;
|
||||
u64 tx_cqe_err;
|
||||
u64 tx_cqe_unknown_type;
|
||||
u64 rx_coalesced_err;
|
||||
u64 rx_cqe_unknown_type;
|
||||
};
|
||||
|
||||
struct mana_ethtool_hc_stats {
|
||||
u64 hc_rx_discards_no_wqe;
|
||||
u64 hc_rx_err_vport_disabled;
|
||||
u64 hc_rx_bytes;
|
||||
@@ -402,10 +409,6 @@ struct mana_ethtool_stats {
|
||||
u64 hc_tx_mcast_pkts;
|
||||
u64 hc_tx_mcast_bytes;
|
||||
u64 hc_tx_err_gdma;
|
||||
u64 tx_cqe_err;
|
||||
u64 tx_cqe_unknown_type;
|
||||
u64 rx_coalesced_err;
|
||||
u64 rx_cqe_unknown_type;
|
||||
};
|
||||
|
||||
struct mana_ethtool_phy_stats {
|
||||
@@ -473,9 +476,14 @@ struct mana_context {
|
||||
u16 num_ports;
|
||||
u8 bm_hostmode;
|
||||
|
||||
struct mana_ethtool_hc_stats hc_stats;
|
||||
struct mana_eq *eqs;
|
||||
struct dentry *mana_eqs_debugfs;
|
||||
|
||||
/* Workqueue for querying hardware stats */
|
||||
struct delayed_work gf_stats_work;
|
||||
bool hwc_timeout_occurred;
|
||||
|
||||
struct net_device *ports[MAX_PORTS_IN_MANA_DEV];
|
||||
|
||||
/* Link state change work */
|
||||
@@ -577,7 +585,7 @@ u32 mana_run_xdp(struct net_device *ndev, struct mana_rxq *rxq,
|
||||
struct bpf_prog *mana_xdp_get(struct mana_port_context *apc);
|
||||
void mana_chn_setxdp(struct mana_port_context *apc, struct bpf_prog *prog);
|
||||
int mana_bpf(struct net_device *ndev, struct netdev_bpf *bpf);
|
||||
void mana_query_gf_stats(struct mana_port_context *apc);
|
||||
int mana_query_gf_stats(struct mana_context *ac);
|
||||
int mana_query_link_cfg(struct mana_port_context *apc);
|
||||
int mana_set_bw_clamp(struct mana_port_context *apc, u32 speed,
|
||||
int enable_clamping);
|
||||
|
||||
Reference in New Issue
Block a user