Commit 27c77943 authored by David S. Miller's avatar David S. Miller

Merge branch 'hns3-cleanups'

Guangbin Huang says:

====================
net: hns3: add some cleanups

This series includes some cleanups for the HNS3 ethernet driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 49f9df5b 52d89333
...@@ -695,7 +695,7 @@ static int hns3_dbg_queue_map(struct hnae3_handle *h, char *buf, int len) ...@@ -695,7 +695,7 @@ static int hns3_dbg_queue_map(struct hnae3_handle *h, char *buf, int len)
sprintf(result[j++], "%u", i); sprintf(result[j++], "%u", i);
sprintf(result[j++], "%u", sprintf(result[j++], "%u",
h->ae_algo->ops->get_global_queue_id(h, i)); h->ae_algo->ops->get_global_queue_id(h, i));
sprintf(result[j++], "%u", sprintf(result[j++], "%d",
priv->ring[i].tqp_vector->vector_irq); priv->ring[i].tqp_vector->vector_irq);
hns3_dbg_fill_content(content, sizeof(content), queue_map_items, hns3_dbg_fill_content(content, sizeof(content), queue_map_items,
(const char **)result, (const char **)result,
......
...@@ -971,8 +971,7 @@ static u32 hns3_tx_spare_space(struct hns3_enet_ring *ring) ...@@ -971,8 +971,7 @@ static u32 hns3_tx_spare_space(struct hns3_enet_ring *ring)
/* The free tx buffer is divided into two part, so pick the /* The free tx buffer is divided into two part, so pick the
* larger one. * larger one.
*/ */
return (ntc > (tx_spare->len - ntu) ? ntc : return max(ntc, tx_spare->len - ntu) - 1;
(tx_spare->len - ntu)) - 1;
} }
static void hns3_tx_spare_update(struct hns3_enet_ring *ring) static void hns3_tx_spare_update(struct hns3_enet_ring *ring)
......
...@@ -298,33 +298,8 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode) ...@@ -298,33 +298,8 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
return ret_val; return ret_val;
} }
/** static void hns3_set_selftest_param(struct hnae3_handle *h, int (*st_param)[2])
* hns3_self_test - self test
* @ndev: net device
* @eth_test: test cmd
* @data: test result
*/
static void hns3_self_test(struct net_device *ndev,
struct ethtool_test *eth_test, u64 *data)
{ {
struct hns3_nic_priv *priv = netdev_priv(ndev);
struct hnae3_handle *h = priv->ae_handle;
int st_param[HNS3_SELF_TEST_TYPE_NUM][2];
bool if_running = netif_running(ndev);
int test_index = 0;
u32 i;
if (hns3_nic_resetting(ndev)) {
netdev_err(ndev, "dev resetting!");
return;
}
/* Only do offline selftest, or pass by default */
if (eth_test->flags != ETH_TEST_FL_OFFLINE)
return;
netif_dbg(h, drv, ndev, "self test start");
st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP; st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
st_param[HNAE3_LOOP_APP][1] = st_param[HNAE3_LOOP_APP][1] =
h->flags & HNAE3_SUPPORT_APP_LOOPBACK; h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
...@@ -341,6 +316,18 @@ static void hns3_self_test(struct net_device *ndev, ...@@ -341,6 +316,18 @@ static void hns3_self_test(struct net_device *ndev,
st_param[HNAE3_LOOP_PHY][0] = HNAE3_LOOP_PHY; st_param[HNAE3_LOOP_PHY][0] = HNAE3_LOOP_PHY;
st_param[HNAE3_LOOP_PHY][1] = st_param[HNAE3_LOOP_PHY][1] =
h->flags & HNAE3_SUPPORT_PHY_LOOPBACK; h->flags & HNAE3_SUPPORT_PHY_LOOPBACK;
}
static void hns3_selftest_prepare(struct net_device *ndev,
bool if_running, int (*st_param)[2])
{
struct hns3_nic_priv *priv = netdev_priv(ndev);
struct hnae3_handle *h = priv->ae_handle;
if (netif_msg_ifdown(h))
netdev_info(ndev, "self test start\n");
hns3_set_selftest_param(h, st_param);
if (if_running) if (if_running)
ndev->netdev_ops->ndo_stop(ndev); ndev->netdev_ops->ndo_stop(ndev);
...@@ -359,6 +346,35 @@ static void hns3_self_test(struct net_device *ndev, ...@@ -359,6 +346,35 @@ static void hns3_self_test(struct net_device *ndev,
h->ae_algo->ops->halt_autoneg(h, true); h->ae_algo->ops->halt_autoneg(h, true);
set_bit(HNS3_NIC_STATE_TESTING, &priv->state); set_bit(HNS3_NIC_STATE_TESTING, &priv->state);
}
static void hns3_selftest_restore(struct net_device *ndev, bool if_running)
{
struct hns3_nic_priv *priv = netdev_priv(ndev);
struct hnae3_handle *h = priv->ae_handle;
clear_bit(HNS3_NIC_STATE_TESTING, &priv->state);
if (h->ae_algo->ops->halt_autoneg)
h->ae_algo->ops->halt_autoneg(h, false);
#if IS_ENABLED(CONFIG_VLAN_8021Q)
if (h->ae_algo->ops->enable_vlan_filter)
h->ae_algo->ops->enable_vlan_filter(h, true);
#endif
if (if_running)
ndev->netdev_ops->ndo_open(ndev);
if (netif_msg_ifdown(h))
netdev_info(ndev, "self test end\n");
}
static void hns3_do_selftest(struct net_device *ndev, int (*st_param)[2],
struct ethtool_test *eth_test, u64 *data)
{
int test_index = 0;
u32 i;
for (i = 0; i < HNS3_SELF_TEST_TYPE_NUM; i++) { for (i = 0; i < HNS3_SELF_TEST_TYPE_NUM; i++) {
enum hnae3_loop loop_type = (enum hnae3_loop)st_param[i][0]; enum hnae3_loop loop_type = (enum hnae3_loop)st_param[i][0];
...@@ -377,21 +393,32 @@ static void hns3_self_test(struct net_device *ndev, ...@@ -377,21 +393,32 @@ static void hns3_self_test(struct net_device *ndev,
test_index++; test_index++;
} }
}
clear_bit(HNS3_NIC_STATE_TESTING, &priv->state); /**
* hns3_nic_self_test - self test
if (h->ae_algo->ops->halt_autoneg) * @ndev: net device
h->ae_algo->ops->halt_autoneg(h, false); * @eth_test: test cmd
* @data: test result
*/
static void hns3_self_test(struct net_device *ndev,
struct ethtool_test *eth_test, u64 *data)
{
int st_param[HNS3_SELF_TEST_TYPE_NUM][2];
bool if_running = netif_running(ndev);
#if IS_ENABLED(CONFIG_VLAN_8021Q) if (hns3_nic_resetting(ndev)) {
if (h->ae_algo->ops->enable_vlan_filter) netdev_err(ndev, "dev resetting!");
h->ae_algo->ops->enable_vlan_filter(h, true); return;
#endif }
if (if_running) /* Only do offline selftest, or pass by default */
ndev->netdev_ops->ndo_open(ndev); if (eth_test->flags != ETH_TEST_FL_OFFLINE)
return;
netif_dbg(h, drv, ndev, "self test end\n"); hns3_selftest_prepare(ndev, if_running, st_param);
hns3_do_selftest(ndev, st_param, eth_test, data);
hns3_selftest_restore(ndev, if_running);
} }
static void hns3_update_limit_promisc_mode(struct net_device *netdev, static void hns3_update_limit_promisc_mode(struct net_device *netdev,
......
...@@ -104,26 +104,30 @@ static int hclge_dcb_common_validate(struct hclge_dev *hdev, u8 num_tc, ...@@ -104,26 +104,30 @@ static int hclge_dcb_common_validate(struct hclge_dev *hdev, u8 num_tc,
return 0; return 0;
} }
static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets, static u8 hclge_ets_tc_changed(struct hclge_dev *hdev, struct ieee_ets *ets,
u8 *tc, bool *changed) bool *changed)
{ {
bool has_ets_tc = false; u8 max_tc_id = 0;
u32 total_ets_bw = 0;
u8 max_tc = 0;
int ret;
u8 i; u8 i;
for (i = 0; i < HNAE3_MAX_USER_PRIO; i++) { for (i = 0; i < HNAE3_MAX_USER_PRIO; i++) {
if (ets->prio_tc[i] != hdev->tm_info.prio_tc[i]) if (ets->prio_tc[i] != hdev->tm_info.prio_tc[i])
*changed = true; *changed = true;
if (ets->prio_tc[i] > max_tc) if (ets->prio_tc[i] > max_tc_id)
max_tc = ets->prio_tc[i]; max_tc_id = ets->prio_tc[i];
} }
ret = hclge_dcb_common_validate(hdev, max_tc + 1, ets->prio_tc); /* return max tc number, max tc id need to plus 1 */
if (ret) return max_tc_id + 1;
return ret; }
static int hclge_ets_sch_mode_validate(struct hclge_dev *hdev,
struct ieee_ets *ets, bool *changed)
{
bool has_ets_tc = false;
u32 total_ets_bw = 0;
u8 i;
for (i = 0; i < hdev->tc_max; i++) { for (i = 0; i < hdev->tc_max; i++) {
switch (ets->tc_tsa[i]) { switch (ets->tc_tsa[i]) {
...@@ -148,7 +152,26 @@ static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets, ...@@ -148,7 +152,26 @@ static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets,
if (has_ets_tc && total_ets_bw != BW_PERCENT) if (has_ets_tc && total_ets_bw != BW_PERCENT)
return -EINVAL; return -EINVAL;
*tc = max_tc + 1; return 0;
}
static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets,
u8 *tc, bool *changed)
{
u8 tc_num;
int ret;
tc_num = hclge_ets_tc_changed(hdev, ets, changed);
ret = hclge_dcb_common_validate(hdev, tc_num, ets->prio_tc);
if (ret)
return ret;
ret = hclge_ets_sch_mode_validate(hdev, ets, changed);
if (ret)
return ret;
*tc = tc_num;
if (*tc != hdev->tm_info.num_tc) if (*tc != hdev->tm_info.num_tc)
*changed = true; *changed = true;
......
...@@ -926,26 +926,45 @@ static int hclge_dbg_dump_tm_nodes(struct hclge_dev *hdev, char *buf, int len) ...@@ -926,26 +926,45 @@ static int hclge_dbg_dump_tm_nodes(struct hclge_dev *hdev, char *buf, int len)
return 0; return 0;
} }
static const struct hclge_dbg_item tm_pri_items[] = {
{ "ID", 4 },
{ "MODE", 2 },
{ "DWRR", 2 },
{ "C_IR_B", 2 },
{ "C_IR_U", 2 },
{ "C_IR_S", 2 },
{ "C_BS_B", 2 },
{ "C_BS_S", 2 },
{ "C_FLAG", 2 },
{ "C_RATE(Mbps)", 2 },
{ "P_IR_B", 2 },
{ "P_IR_U", 2 },
{ "P_IR_S", 2 },
{ "P_BS_B", 2 },
{ "P_BS_S", 2 },
{ "P_FLAG", 2 },
{ "P_RATE(Mbps)", 0 }
};
static int hclge_dbg_dump_tm_pri(struct hclge_dev *hdev, char *buf, int len) static int hclge_dbg_dump_tm_pri(struct hclge_dev *hdev, char *buf, int len)
{ {
struct hclge_tm_shaper_para c_shaper_para; char data_str[ARRAY_SIZE(tm_pri_items)][HCLGE_DBG_DATA_STR_LEN];
struct hclge_tm_shaper_para p_shaper_para; struct hclge_tm_shaper_para c_shaper_para, p_shaper_para;
u8 pri_num, sch_mode, weight; char *result[ARRAY_SIZE(tm_pri_items)], *sch_mode_str;
char *sch_mode_str; char content[HCLGE_DBG_TM_INFO_LEN];
int pos = 0; u8 pri_num, sch_mode, weight, i, j;
int ret; int pos, ret;
u8 i;
ret = hclge_tm_get_pri_num(hdev, &pri_num); ret = hclge_tm_get_pri_num(hdev, &pri_num);
if (ret) if (ret)
return ret; return ret;
pos += scnprintf(buf + pos, len - pos, for (i = 0; i < ARRAY_SIZE(tm_pri_items); i++)
"ID MODE DWRR C_IR_B C_IR_U C_IR_S C_BS_B "); result[i] = &data_str[i][0];
pos += scnprintf(buf + pos, len - pos,
"C_BS_S C_FLAG C_RATE(Mbps) P_IR_B P_IR_U "); hclge_dbg_fill_content(content, sizeof(content), tm_pri_items,
pos += scnprintf(buf + pos, len - pos, NULL, ARRAY_SIZE(tm_pri_items));
"P_IR_S P_BS_B P_BS_S P_FLAG P_RATE(Mbps)\n"); pos = scnprintf(buf, len, "%s", content);
for (i = 0; i < pri_num; i++) { for (i = 0; i < pri_num; i++) {
ret = hclge_tm_get_pri_sch_mode(hdev, i, &sch_mode); ret = hclge_tm_get_pri_sch_mode(hdev, i, &sch_mode);
...@@ -971,21 +990,16 @@ static int hclge_dbg_dump_tm_pri(struct hclge_dev *hdev, char *buf, int len) ...@@ -971,21 +990,16 @@ static int hclge_dbg_dump_tm_pri(struct hclge_dev *hdev, char *buf, int len)
sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" : sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" :
"sp"; "sp";
pos += scnprintf(buf + pos, len - pos, j = 0;
"%04u %4s %3u %3u %3u %3u ", sprintf(result[j++], "%04u", i);
i, sch_mode_str, weight, c_shaper_para.ir_b, sprintf(result[j++], "%4s", sch_mode_str);
c_shaper_para.ir_u, c_shaper_para.ir_s); sprintf(result[j++], "%3u", weight);
pos += scnprintf(buf + pos, len - pos, hclge_dbg_fill_shaper_content(&c_shaper_para, result, &j);
"%3u %3u %1u %6u ", hclge_dbg_fill_shaper_content(&p_shaper_para, result, &j);
c_shaper_para.bs_b, c_shaper_para.bs_s, hclge_dbg_fill_content(content, sizeof(content), tm_pri_items,
c_shaper_para.flag, c_shaper_para.rate); (const char **)result,
pos += scnprintf(buf + pos, len - pos, ARRAY_SIZE(tm_pri_items));
"%3u %3u %3u %3u %3u ", pos += scnprintf(buf + pos, len - pos, "%s", content);
p_shaper_para.ir_b, p_shaper_para.ir_u,
p_shaper_para.ir_s, p_shaper_para.bs_b,
p_shaper_para.bs_s);
pos += scnprintf(buf + pos, len - pos, "%1u %6u\n",
p_shaper_para.flag, p_shaper_para.rate);
} }
return 0; return 0;
......
...@@ -127,7 +127,7 @@ static inline struct hclge_dev *hclge_ptp_get_hdev(struct ptp_clock_info *info) ...@@ -127,7 +127,7 @@ static inline struct hclge_dev *hclge_ptp_get_hdev(struct ptp_clock_info *info)
} }
bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb); bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb);
void hclge_ptp_clean_tx_hwts(struct hclge_dev *dev); void hclge_ptp_clean_tx_hwts(struct hclge_dev *hdev);
void hclge_ptp_get_rx_hwts(struct hnae3_handle *handle, struct sk_buff *skb, void hclge_ptp_get_rx_hwts(struct hnae3_handle *handle, struct sk_buff *skb,
u32 nsec, u32 sec); u32 nsec, u32 sec);
int hclge_ptp_get_cfg(struct hclge_dev *hdev, struct ifreq *ifr); int hclge_ptp_get_cfg(struct hclge_dev *hdev, struct ifreq *ifr);
......
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