未验证 提交 cbad7a99 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!940 net: hns3: related bugfixes, refactoring, and cleanup

Merge Pull Request from: @svishen 
 
This pull request for hns3 related bugfixes, refactoring, and cleanup

(1)perf: pmu: fix set wrong filter mode for running events issue
(2)net: hns3: fix GRE checksum offload issue
(3)net: hns3: fix the imp capability bit cannot exceed 32 bits issue
(4)net: hns3: add tm flush when setting tm
(5)net: hns3: refactor hclge_update_desc_vfid for extension
(6)net: hns3: fix strncpy() not using dest-buf length as length issue
(7)net: hns3: restore user pause configure when disable autoneg

issue:
https://gitee.com/openeuler/kernel/issues/I7B8SA 
 
Link:https://gitee.com/openeuler/kernel/pulls/940 

Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/pkt_sched.h> #include <linux/pkt_sched.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/bitmap.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#define HNAE3_MOD_VERSION "1.0" #define HNAE3_MOD_VERSION "1.0"
...@@ -104,6 +105,7 @@ enum HNAE3_DEV_CAP_BITS { ...@@ -104,6 +105,7 @@ enum HNAE3_DEV_CAP_BITS {
HNAE3_DEV_SUPPORT_WOL_B, HNAE3_DEV_SUPPORT_WOL_B,
HNAE3_DEV_SUPPORT_VF_FAULT_B, HNAE3_DEV_SUPPORT_VF_FAULT_B,
HNAE3_DEV_SUPPORT_NOTIFY_PKT_B, HNAE3_DEV_SUPPORT_NOTIFY_PKT_B,
HNAE3_DEV_SUPPORT_TM_FLUSH_B,
}; };
#define hnae3_ae_dev_fd_supported(ae_dev) \ #define hnae3_ae_dev_fd_supported(ae_dev) \
...@@ -178,6 +180,9 @@ enum HNAE3_DEV_CAP_BITS { ...@@ -178,6 +180,9 @@ enum HNAE3_DEV_CAP_BITS {
#define hnae3_ae_dev_notify_pkt_supported(ae_dev) \ #define hnae3_ae_dev_notify_pkt_supported(ae_dev) \
test_bit(HNAE3_DEV_SUPPORT_NOTIFY_PKT_B, (ae_dev)->caps) test_bit(HNAE3_DEV_SUPPORT_NOTIFY_PKT_B, (ae_dev)->caps)
#define hnae3_ae_dev_tm_flush_supported(hdev) \
test_bit(HNAE3_DEV_SUPPORT_TM_FLUSH_B, (hdev)->ae_dev->caps)
enum HNAE3_PF_CAP_BITS { enum HNAE3_PF_CAP_BITS {
HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0, HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0,
}; };
...@@ -421,7 +426,7 @@ struct hnae3_ae_dev { ...@@ -421,7 +426,7 @@ struct hnae3_ae_dev {
unsigned long hw_err_reset_req; unsigned long hw_err_reset_req;
struct hnae3_dev_specs dev_specs; struct hnae3_dev_specs dev_specs;
u32 dev_version; u32 dev_version;
unsigned long caps[BITS_TO_LONGS(HNAE3_DEV_CAPS_MAX_NUM)]; DECLARE_BITMAP(caps, HNAE3_DEV_CAPS_MAX_NUM);
void *priv; void *priv;
}; };
......
...@@ -157,6 +157,7 @@ static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = { ...@@ -157,6 +157,7 @@ static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = {
{HCLGE_COMM_CAP_WOL_B, HNAE3_DEV_SUPPORT_WOL_B}, {HCLGE_COMM_CAP_WOL_B, HNAE3_DEV_SUPPORT_WOL_B},
{HCLGE_COMM_CAP_VF_FAULT_B, HNAE3_DEV_SUPPORT_VF_FAULT_B}, {HCLGE_COMM_CAP_VF_FAULT_B, HNAE3_DEV_SUPPORT_VF_FAULT_B},
{HCLGE_COMM_CAP_NOTIFY_PKT_B, HNAE3_DEV_SUPPORT_NOTIFY_PKT_B}, {HCLGE_COMM_CAP_NOTIFY_PKT_B, HNAE3_DEV_SUPPORT_NOTIFY_PKT_B},
{HCLGE_COMM_CAP_TM_FLUSH_B, HNAE3_DEV_SUPPORT_TM_FLUSH_B},
}; };
static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = { static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {
...@@ -172,6 +173,20 @@ static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = { ...@@ -172,6 +173,20 @@ static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {
{HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B}, {HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
}; };
static void
hclge_comm_capability_to_bitmap(unsigned long *bitmap, __le32 *caps)
{
const unsigned int words = HCLGE_COMM_QUERY_CAP_LENGTH;
u32 val[HCLGE_COMM_QUERY_CAP_LENGTH];
unsigned int i;
for (i = 0; i < words; i++)
val[i] = __le32_to_cpu(caps[i]);
bitmap_from_arr32(bitmap, val,
HCLGE_COMM_QUERY_CAP_LENGTH * BITS_PER_TYPE(u32));
}
static void static void
hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf, hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
struct hclge_comm_query_version_cmd *cmd) struct hclge_comm_query_version_cmd *cmd)
...@@ -180,11 +195,12 @@ hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf, ...@@ -180,11 +195,12 @@ hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps; is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps;
u32 size = is_pf ? ARRAY_SIZE(hclge_pf_cmd_caps) : u32 size = is_pf ? ARRAY_SIZE(hclge_pf_cmd_caps) :
ARRAY_SIZE(hclge_vf_cmd_caps); ARRAY_SIZE(hclge_vf_cmd_caps);
u32 caps, i; DECLARE_BITMAP(caps, HCLGE_COMM_QUERY_CAP_LENGTH * BITS_PER_TYPE(u32));
u32 i;
caps = __le32_to_cpu(cmd->caps[0]); hclge_comm_capability_to_bitmap(caps, cmd->caps);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
if (hnae3_get_bit(caps, caps_map[i].imp_bit)) if (test_bit(caps_map[i].imp_bit, caps))
set_bit(caps_map[i].local_bit, ae_dev->caps); set_bit(caps_map[i].local_bit, ae_dev->caps);
} }
......
...@@ -153,6 +153,7 @@ enum hclge_opcode_type { ...@@ -153,6 +153,7 @@ enum hclge_opcode_type {
HCLGE_OPC_TM_INTERNAL_STS = 0x0850, HCLGE_OPC_TM_INTERNAL_STS = 0x0850,
HCLGE_OPC_TM_INTERNAL_CNT = 0x0851, HCLGE_OPC_TM_INTERNAL_CNT = 0x0851,
HCLGE_OPC_TM_INTERNAL_STS_1 = 0x0852, HCLGE_OPC_TM_INTERNAL_STS_1 = 0x0852,
HCLGE_OPC_TM_FLUSH = 0x0872,
/* Packet buffer allocate commands */ /* Packet buffer allocate commands */
HCLGE_OPC_TX_BUFF_ALLOC = 0x0901, HCLGE_OPC_TX_BUFF_ALLOC = 0x0901,
...@@ -350,6 +351,7 @@ enum HCLGE_COMM_CAP_BITS { ...@@ -350,6 +351,7 @@ enum HCLGE_COMM_CAP_BITS {
HCLGE_COMM_CAP_LANE_NUM_B = 27, HCLGE_COMM_CAP_LANE_NUM_B = 27,
HCLGE_COMM_CAP_WOL_B = 28, HCLGE_COMM_CAP_WOL_B = 28,
HCLGE_COMM_CAP_NOTIFY_PKT_B = 29, HCLGE_COMM_CAP_NOTIFY_PKT_B = 29,
HCLGE_COMM_CAP_TM_FLUSH_B = 31,
}; };
enum HCLGE_COMM_API_CAP_BITS { enum HCLGE_COMM_API_CAP_BITS {
......
...@@ -415,6 +415,9 @@ static struct hns3_dbg_cap_info hns3_dbg_cap[] = { ...@@ -415,6 +415,9 @@ static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
}, { }, {
.name = "support vf fault detect", .name = "support vf fault detect",
.cap_bit = HNAE3_DEV_SUPPORT_VF_FAULT_B, .cap_bit = HNAE3_DEV_SUPPORT_VF_FAULT_B,
}, {
.name = "support tm flush",
.cap_bit = HNAE3_DEV_SUPPORT_TM_FLUSH_B,
} }
}; };
...@@ -442,19 +445,36 @@ static void hns3_dbg_fill_content(char *content, u16 len, ...@@ -442,19 +445,36 @@ static void hns3_dbg_fill_content(char *content, u16 len,
const struct hns3_dbg_item *items, const struct hns3_dbg_item *items,
const char **result, u16 size) const char **result, u16 size)
{ {
#define HNS3_DBG_LINE_END_LEN 2
char *pos = content; char *pos = content;
u16 item_len;
u16 i; u16 i;
if (!len) {
return;
} else if (len <= HNS3_DBG_LINE_END_LEN) {
*pos++ = '\0';
return;
}
memset(content, ' ', len); memset(content, ' ', len);
for (i = 0; i < size; i++) { len -= HNS3_DBG_LINE_END_LEN;
if (result)
strncpy(pos, result[i], strlen(result[i]));
else
strncpy(pos, items[i].name, strlen(items[i].name));
pos += strlen(items[i].name) + items[i].interval; for (i = 0; i < size; i++) {
item_len = strlen(items[i].name) + items[i].interval;
if (len < item_len)
break;
if (result) {
if (item_len < strlen(result[i]))
break;
memcpy(pos, result[i], strlen(result[i]));
} else {
memcpy(pos, items[i].name, strlen(items[i].name));
}
pos += item_len;
len -= item_len;
} }
*pos++ = '\n'; *pos++ = '\n';
*pos++ = '\0'; *pos++ = '\0';
} }
......
...@@ -3547,15 +3547,19 @@ static void hns3_set_default_feature(struct net_device *netdev) ...@@ -3547,15 +3547,19 @@ static void hns3_set_default_feature(struct net_device *netdev)
netdev->priv_flags |= IFF_UNICAST_FLT; netdev->priv_flags |= IFF_UNICAST_FLT;
netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 |
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_SCTP_CRC | NETIF_F_FRAGLIST; NETIF_F_SCTP_CRC | NETIF_F_FRAGLIST;
if (pdev->revision == HNAE3_DEVICE_VERSION_V2) {
netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
netdev->features |= NETIF_F_GSO_GRE_CSUM;
netdev->features |= NETIF_F_GSO_GRE;
}
if (hnae3_ae_dev_gro_supported(ae_dev)) if (hnae3_ae_dev_gro_supported(ae_dev))
netdev->features |= NETIF_F_GRO_HW; netdev->features |= NETIF_F_GRO_HW;
......
...@@ -216,6 +216,10 @@ static int hclge_notify_down_uinit(struct hclge_dev *hdev) ...@@ -216,6 +216,10 @@ static int hclge_notify_down_uinit(struct hclge_dev *hdev)
if (ret) if (ret)
return ret; return ret;
ret = hclge_tm_flush_cfg(hdev, true);
if (ret)
return ret;
return hclge_notify_client(hdev, HNAE3_UNINIT_CLIENT); return hclge_notify_client(hdev, HNAE3_UNINIT_CLIENT);
} }
...@@ -227,6 +231,10 @@ static int hclge_notify_init_up(struct hclge_dev *hdev) ...@@ -227,6 +231,10 @@ static int hclge_notify_init_up(struct hclge_dev *hdev)
if (ret) if (ret)
return ret; return ret;
ret = hclge_tm_flush_cfg(hdev, false);
if (ret)
return ret;
return hclge_notify_client(hdev, HNAE3_UP_CLIENT); return hclge_notify_client(hdev, HNAE3_UP_CLIENT);
} }
...@@ -313,6 +321,7 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc) ...@@ -313,6 +321,7 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
struct net_device *netdev = h->kinfo.netdev; struct net_device *netdev = h->kinfo.netdev;
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
u8 i, j, pfc_map, *prio_tc; u8 i, j, pfc_map, *prio_tc;
int last_bad_ret = 0;
int ret; int ret;
if (!(hdev->dcbx_cap & DCB_CAP_DCBX_VER_IEEE)) if (!(hdev->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
...@@ -350,13 +359,28 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc) ...@@ -350,13 +359,28 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
if (ret) if (ret)
return ret; return ret;
ret = hclge_buffer_alloc(hdev); ret = hclge_tm_flush_cfg(hdev, true);
if (ret) { if (ret)
hclge_notify_client(hdev, HNAE3_UP_CLIENT);
return ret; return ret;
}
return hclge_notify_client(hdev, HNAE3_UP_CLIENT); /* No matter whether the following operations are performed
* successfully or not, disabling the tm flush and notify
* the network status to up are necessary.
* Do not return immediately.
*/
ret = hclge_buffer_alloc(hdev);
if (ret)
last_bad_ret = ret;
ret = hclge_tm_flush_cfg(hdev, false);
if (ret)
last_bad_ret = ret;
ret = hclge_notify_client(hdev, HNAE3_UP_CLIENT);
if (ret)
last_bad_ret = ret;
return last_bad_ret;
} }
static int hclge_ieee_setapp(struct hnae3_handle *h, struct dcb_app *app) static int hclge_ieee_setapp(struct hnae3_handle *h, struct dcb_app *app)
......
...@@ -87,16 +87,35 @@ static void hclge_dbg_fill_content(char *content, u16 len, ...@@ -87,16 +87,35 @@ static void hclge_dbg_fill_content(char *content, u16 len,
const struct hclge_dbg_item *items, const struct hclge_dbg_item *items,
const char **result, u16 size) const char **result, u16 size)
{ {
#define HCLGE_DBG_LINE_END_LEN 2
char *pos = content; char *pos = content;
u16 item_len;
u16 i; u16 i;
if (!len) {
return;
} else if (len <= HCLGE_DBG_LINE_END_LEN) {
*pos++ = '\0';
return;
}
memset(content, ' ', len); memset(content, ' ', len);
len -= HCLGE_DBG_LINE_END_LEN;
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
if (result) item_len = strlen(items[i].name) + items[i].interval;
strncpy(pos, result[i], strlen(result[i])); if (len < item_len)
else break;
strncpy(pos, items[i].name, strlen(items[i].name));
pos += strlen(items[i].name) + items[i].interval; if (result) {
if (item_len < strlen(result[i]))
break;
memcpy(pos, result[i], strlen(result[i]));
} else {
memcpy(pos, items[i].name, strlen(items[i].name));
}
pos += item_len;
len -= item_len;
} }
*pos++ = '\n'; *pos++ = '\n';
*pos++ = '\0'; *pos++ = '\0';
......
...@@ -8626,16 +8626,16 @@ static int hclge_update_desc_vfid(struct hclge_desc *desc, int vfid, bool clr) ...@@ -8626,16 +8626,16 @@ static int hclge_update_desc_vfid(struct hclge_desc *desc, int vfid, bool clr)
word_num = vfid / 32; word_num = vfid / 32;
bit_num = vfid % 32; bit_num = vfid % 32;
if (clr) if (clr)
desc[1].data[word_num] &= cpu_to_le32(~(1 << bit_num)); desc[0].data[word_num] &= cpu_to_le32(~(1 << bit_num));
else else
desc[1].data[word_num] |= cpu_to_le32(1 << bit_num); desc[0].data[word_num] |= cpu_to_le32(1 << bit_num);
} else { } else {
word_num = (vfid - HCLGE_VF_NUM_IN_FIRST_DESC) / 32; word_num = (vfid - HCLGE_VF_NUM_IN_FIRST_DESC) / 32;
bit_num = vfid % 32; bit_num = vfid % 32;
if (clr) if (clr)
desc[2].data[word_num] &= cpu_to_le32(~(1 << bit_num)); desc[1].data[word_num] &= cpu_to_le32(~(1 << bit_num));
else else
desc[2].data[word_num] |= cpu_to_le32(1 << bit_num); desc[1].data[word_num] |= cpu_to_le32(1 << bit_num);
} }
return 0; return 0;
...@@ -9148,7 +9148,7 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport, ...@@ -9148,7 +9148,7 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport,
memset(desc[1].data, 0, sizeof(desc[0].data)); memset(desc[1].data, 0, sizeof(desc[0].data));
memset(desc[2].data, 0, sizeof(desc[0].data)); memset(desc[2].data, 0, sizeof(desc[0].data));
} }
status = hclge_update_desc_vfid(desc, vport->vport_id, false); status = hclge_update_desc_vfid(&desc[1], vport->vport_id, false);
if (status) if (status)
return status; return status;
status = hclge_add_mac_vlan_tbl(vport, &req, desc); status = hclge_add_mac_vlan_tbl(vport, &req, desc);
...@@ -9201,7 +9201,8 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport, ...@@ -9201,7 +9201,8 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport,
status = hclge_lookup_mac_vlan_tbl(vport, &req, desc, true); status = hclge_lookup_mac_vlan_tbl(vport, &req, desc, true);
if (!status) { if (!status) {
/* This mac addr exist, remove this handle's VFID for it */ /* This mac addr exist, remove this handle's VFID for it */
status = hclge_update_desc_vfid(desc, vport->vport_id, true); status = hclge_update_desc_vfid(&desc[1], vport->vport_id,
true);
if (status) if (status)
return status; return status;
...@@ -11391,9 +11392,12 @@ int hclge_cfg_flowctrl(struct hclge_dev *hdev) ...@@ -11391,9 +11392,12 @@ int hclge_cfg_flowctrl(struct hclge_dev *hdev)
u32 rx_pause, tx_pause; u32 rx_pause, tx_pause;
u8 flowctl; u8 flowctl;
if (!phydev->link || !phydev->autoneg) if (!phydev->link)
return 0; return 0;
if (!phydev->autoneg)
return hclge_mac_pause_setup_hw(hdev);
local_advertising = linkmode_adv_to_lcl_adv_t(phydev->advertising); local_advertising = linkmode_adv_to_lcl_adv_t(phydev->advertising);
if (phydev->pause) if (phydev->pause)
......
...@@ -1484,7 +1484,11 @@ int hclge_tm_schd_setup_hw(struct hclge_dev *hdev) ...@@ -1484,7 +1484,11 @@ int hclge_tm_schd_setup_hw(struct hclge_dev *hdev)
return ret; return ret;
/* Cfg schd mode for each level schd */ /* Cfg schd mode for each level schd */
return hclge_tm_schd_mode_hw(hdev); ret = hclge_tm_schd_mode_hw(hdev);
if (ret)
return ret;
return hclge_tm_flush_cfg(hdev, false);
} }
static int hclge_pause_param_setup_hw(struct hclge_dev *hdev) static int hclge_pause_param_setup_hw(struct hclge_dev *hdev)
...@@ -1548,7 +1552,7 @@ static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc) ...@@ -1548,7 +1552,7 @@ static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc)
return 0; return 0;
} }
static int hclge_mac_pause_setup_hw(struct hclge_dev *hdev) int hclge_mac_pause_setup_hw(struct hclge_dev *hdev)
{ {
bool tx_en, rx_en; bool tx_en, rx_en;
...@@ -2114,3 +2118,28 @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev, ...@@ -2114,3 +2118,28 @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev,
return 0; return 0;
} }
int hclge_tm_flush_cfg(struct hclge_dev *hdev, bool enable)
{
struct hclge_desc desc;
int ret;
if (!hnae3_ae_dev_tm_flush_supported(hdev))
return 0;
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TM_FLUSH, false);
desc.data[0] = cpu_to_le32(enable ? HCLGE_TM_FLUSH_EN_MSK : 0);
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) {
dev_err(&hdev->pdev->dev,
"failed to config tm flush, ret = %d\n", ret);
return ret;
}
if (enable)
msleep(HCLGE_TM_FLUSH_TIME_MS);
return ret;
}
...@@ -33,6 +33,9 @@ enum hclge_opcode_type; ...@@ -33,6 +33,9 @@ enum hclge_opcode_type;
#define HCLGE_DSCP_MAP_TC_BD_NUM 2 #define HCLGE_DSCP_MAP_TC_BD_NUM 2
#define HCLGE_DSCP_TC_SHIFT(n) (((n) & 1) * 4) #define HCLGE_DSCP_TC_SHIFT(n) (((n) & 1) * 4)
#define HCLGE_TM_FLUSH_TIME_MS 10
#define HCLGE_TM_FLUSH_EN_MSK BIT(0)
struct hclge_pg_to_pri_link_cmd { struct hclge_pg_to_pri_link_cmd {
u8 pg_id; u8 pg_id;
u8 rsvd1[3]; u8 rsvd1[3];
...@@ -244,6 +247,7 @@ int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap, ...@@ -244,6 +247,7 @@ int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
int hclge_pause_param_cfg(struct hclge_dev *hdev, const u8 *addr, int hclge_pause_param_cfg(struct hclge_dev *hdev, const u8 *addr,
u8 pause_trans_gap, u16 pause_trans_time); u8 pause_trans_gap, u16 pause_trans_time);
int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr); int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr);
int hclge_mac_pause_setup_hw(struct hclge_dev *hdev);
void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats); void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats); void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats);
int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate); int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate);
...@@ -274,4 +278,5 @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev, ...@@ -274,4 +278,5 @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev,
struct hclge_tm_shaper_para *para); struct hclge_tm_shaper_para *para);
int hclge_up_to_tc_map(struct hclge_dev *hdev); int hclge_up_to_tc_map(struct hclge_dev *hdev);
int hclge_dscp_to_tc_map(struct hclge_dev *hdev); int hclge_dscp_to_tc_map(struct hclge_dev *hdev);
int hclge_tm_flush_cfg(struct hclge_dev *hdev, bool enable);
#endif #endif
...@@ -1001,12 +1001,13 @@ static bool ...@@ -1001,12 +1001,13 @@ static bool
hns3_pmu_is_enabled_port_tc_mode(struct perf_event *event, hns3_pmu_is_enabled_port_tc_mode(struct perf_event *event,
struct hns3_pmu_event_attr *pmu_event) struct hns3_pmu_event_attr *pmu_event)
{ {
u16 bdf = hns3_pmu_get_bdf(event);
u8 tc_id = hns3_pmu_get_tc(event); u8 tc_id = hns3_pmu_get_tc(event);
if (!(pmu_event->filter_support & HNS3_PMU_FILTER_SUPPORT_PORT_TC)) if (!(pmu_event->filter_support & HNS3_PMU_FILTER_SUPPORT_PORT_TC))
return false; return false;
return tc_id != HNS3_PMU_FILTER_ALL_TC; return (tc_id != HNS3_PMU_FILTER_ALL_TC) && (!bdf);
} }
static bool static bool
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册