cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hns3_ethtool.c (57915B)


      1// SPDX-License-Identifier: GPL-2.0+
      2// Copyright (c) 2016-2017 Hisilicon Limited.
      3
      4#include <linux/etherdevice.h>
      5#include <linux/string.h>
      6#include <linux/phy.h>
      7#include <linux/sfp.h>
      8
      9#include "hns3_enet.h"
     10#include "hns3_ethtool.h"
     11
     12/* tqp related stats */
     13#define HNS3_TQP_STAT(_string, _member)	{			\
     14	.stats_string = _string,				\
     15	.stats_offset = offsetof(struct hns3_enet_ring, stats) +\
     16			offsetof(struct ring_stats, _member),   \
     17}
     18
     19static const struct hns3_stats hns3_txq_stats[] = {
     20	/* Tx per-queue statistics */
     21	HNS3_TQP_STAT("dropped", sw_err_cnt),
     22	HNS3_TQP_STAT("seg_pkt_cnt", seg_pkt_cnt),
     23	HNS3_TQP_STAT("packets", tx_pkts),
     24	HNS3_TQP_STAT("bytes", tx_bytes),
     25	HNS3_TQP_STAT("more", tx_more),
     26	HNS3_TQP_STAT("push", tx_push),
     27	HNS3_TQP_STAT("mem_doorbell", tx_mem_doorbell),
     28	HNS3_TQP_STAT("wake", restart_queue),
     29	HNS3_TQP_STAT("busy", tx_busy),
     30	HNS3_TQP_STAT("copy", tx_copy),
     31	HNS3_TQP_STAT("vlan_err", tx_vlan_err),
     32	HNS3_TQP_STAT("l4_proto_err", tx_l4_proto_err),
     33	HNS3_TQP_STAT("l2l3l4_err", tx_l2l3l4_err),
     34	HNS3_TQP_STAT("tso_err", tx_tso_err),
     35	HNS3_TQP_STAT("over_max_recursion", over_max_recursion),
     36	HNS3_TQP_STAT("hw_limitation", hw_limitation),
     37	HNS3_TQP_STAT("bounce", tx_bounce),
     38	HNS3_TQP_STAT("spare_full", tx_spare_full),
     39	HNS3_TQP_STAT("copy_bits_err", copy_bits_err),
     40	HNS3_TQP_STAT("sgl", tx_sgl),
     41	HNS3_TQP_STAT("skb2sgl_err", skb2sgl_err),
     42	HNS3_TQP_STAT("map_sg_err", map_sg_err),
     43};
     44
     45#define HNS3_TXQ_STATS_COUNT ARRAY_SIZE(hns3_txq_stats)
     46
     47static const struct hns3_stats hns3_rxq_stats[] = {
     48	/* Rx per-queue statistics */
     49	HNS3_TQP_STAT("dropped", sw_err_cnt),
     50	HNS3_TQP_STAT("seg_pkt_cnt", seg_pkt_cnt),
     51	HNS3_TQP_STAT("packets", rx_pkts),
     52	HNS3_TQP_STAT("bytes", rx_bytes),
     53	HNS3_TQP_STAT("errors", rx_err_cnt),
     54	HNS3_TQP_STAT("reuse_pg_cnt", reuse_pg_cnt),
     55	HNS3_TQP_STAT("err_pkt_len", err_pkt_len),
     56	HNS3_TQP_STAT("err_bd_num", err_bd_num),
     57	HNS3_TQP_STAT("l2_err", l2_err),
     58	HNS3_TQP_STAT("l3l4_csum_err", l3l4_csum_err),
     59	HNS3_TQP_STAT("csum_complete", csum_complete),
     60	HNS3_TQP_STAT("multicast", rx_multicast),
     61	HNS3_TQP_STAT("non_reuse_pg", non_reuse_pg),
     62	HNS3_TQP_STAT("frag_alloc_err", frag_alloc_err),
     63	HNS3_TQP_STAT("frag_alloc", frag_alloc),
     64};
     65
     66#define HNS3_PRIV_FLAGS_LEN ARRAY_SIZE(hns3_priv_flags)
     67
     68#define HNS3_RXQ_STATS_COUNT ARRAY_SIZE(hns3_rxq_stats)
     69
     70#define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT)
     71
     72#define HNS3_SELF_TEST_TYPE_NUM         4
     73#define HNS3_NIC_LB_TEST_PKT_NUM	1
     74#define HNS3_NIC_LB_TEST_RING_ID	0
     75#define HNS3_NIC_LB_TEST_PACKET_SIZE	128
     76#define HNS3_NIC_LB_SETUP_USEC		10000
     77
     78/* Nic loopback test err  */
     79#define HNS3_NIC_LB_TEST_NO_MEM_ERR	1
     80#define HNS3_NIC_LB_TEST_TX_CNT_ERR	2
     81#define HNS3_NIC_LB_TEST_RX_CNT_ERR	3
     82
     83static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
     84{
     85	struct hnae3_handle *h = hns3_get_handle(ndev);
     86	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
     87	int ret;
     88
     89	if (!h->ae_algo->ops->set_loopback ||
     90	    !h->ae_algo->ops->set_promisc_mode)
     91		return -EOPNOTSUPP;
     92
     93	switch (loop) {
     94	case HNAE3_LOOP_SERIAL_SERDES:
     95	case HNAE3_LOOP_PARALLEL_SERDES:
     96	case HNAE3_LOOP_APP:
     97	case HNAE3_LOOP_PHY:
     98		ret = h->ae_algo->ops->set_loopback(h, loop, en);
     99		break;
    100	default:
    101		ret = -ENOTSUPP;
    102		break;
    103	}
    104
    105	if (ret || ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
    106		return ret;
    107
    108	if (en)
    109		h->ae_algo->ops->set_promisc_mode(h, true, true);
    110	else
    111		/* recover promisc mode before loopback test */
    112		hns3_request_update_promisc_mode(h);
    113
    114	return ret;
    115}
    116
    117static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
    118{
    119	struct hnae3_handle *h = hns3_get_handle(ndev);
    120	int ret;
    121
    122	ret = hns3_nic_reset_all_ring(h);
    123	if (ret)
    124		return ret;
    125
    126	ret = hns3_lp_setup(ndev, loop_mode, true);
    127	usleep_range(HNS3_NIC_LB_SETUP_USEC, HNS3_NIC_LB_SETUP_USEC * 2);
    128
    129	return ret;
    130}
    131
    132static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode)
    133{
    134	int ret;
    135
    136	ret = hns3_lp_setup(ndev, loop_mode, false);
    137	if (ret) {
    138		netdev_err(ndev, "lb_setup return error: %d\n", ret);
    139		return ret;
    140	}
    141
    142	usleep_range(HNS3_NIC_LB_SETUP_USEC, HNS3_NIC_LB_SETUP_USEC * 2);
    143
    144	return 0;
    145}
    146
    147static void hns3_lp_setup_skb(struct sk_buff *skb)
    148{
    149#define	HNS3_NIC_LB_DST_MAC_ADDR	0x1f
    150
    151	struct net_device *ndev = skb->dev;
    152	struct hnae3_handle *handle;
    153	struct hnae3_ae_dev *ae_dev;
    154	unsigned char *packet;
    155	struct ethhdr *ethh;
    156	unsigned int i;
    157
    158	skb_reserve(skb, NET_IP_ALIGN);
    159	ethh = skb_put(skb, sizeof(struct ethhdr));
    160	packet = skb_put(skb, HNS3_NIC_LB_TEST_PACKET_SIZE);
    161
    162	memcpy(ethh->h_dest, ndev->dev_addr, ETH_ALEN);
    163
    164	/* The dst mac addr of loopback packet is the same as the host'
    165	 * mac addr, the SSU component may loop back the packet to host
    166	 * before the packet reaches mac or serdes, which will defect
    167	 * the purpose of mac or serdes selftest.
    168	 */
    169	handle = hns3_get_handle(ndev);
    170	ae_dev = pci_get_drvdata(handle->pdev);
    171	if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
    172		ethh->h_dest[5] += HNS3_NIC_LB_DST_MAC_ADDR;
    173	eth_zero_addr(ethh->h_source);
    174	ethh->h_proto = htons(ETH_P_ARP);
    175	skb_reset_mac_header(skb);
    176
    177	for (i = 0; i < HNS3_NIC_LB_TEST_PACKET_SIZE; i++)
    178		packet[i] = (unsigned char)(i & 0xff);
    179}
    180
    181static void hns3_lb_check_skb_data(struct hns3_enet_ring *ring,
    182				   struct sk_buff *skb)
    183{
    184	struct hns3_enet_tqp_vector *tqp_vector = ring->tqp_vector;
    185	unsigned char *packet = skb->data;
    186	u32 len = skb_headlen(skb);
    187	u32 i;
    188
    189	len = min_t(u32, len, HNS3_NIC_LB_TEST_PACKET_SIZE);
    190
    191	for (i = 0; i < len; i++)
    192		if (packet[i] != (unsigned char)(i & 0xff))
    193			break;
    194
    195	/* The packet is correctly received */
    196	if (i == HNS3_NIC_LB_TEST_PACKET_SIZE)
    197		tqp_vector->rx_group.total_packets++;
    198	else
    199		print_hex_dump(KERN_ERR, "selftest:", DUMP_PREFIX_OFFSET, 16, 1,
    200			       skb->data, len, true);
    201
    202	dev_kfree_skb_any(skb);
    203}
    204
    205static u32 hns3_lb_check_rx_ring(struct hns3_nic_priv *priv, u32 budget)
    206{
    207	struct hnae3_handle *h = priv->ae_handle;
    208	struct hnae3_knic_private_info *kinfo;
    209	u32 i, rcv_good_pkt_total = 0;
    210
    211	kinfo = &h->kinfo;
    212	for (i = kinfo->num_tqps; i < kinfo->num_tqps * 2; i++) {
    213		struct hns3_enet_ring *ring = &priv->ring[i];
    214		struct hns3_enet_ring_group *rx_group;
    215		u64 pre_rx_pkt;
    216
    217		rx_group = &ring->tqp_vector->rx_group;
    218		pre_rx_pkt = rx_group->total_packets;
    219
    220		preempt_disable();
    221		hns3_clean_rx_ring(ring, budget, hns3_lb_check_skb_data);
    222		preempt_enable();
    223
    224		rcv_good_pkt_total += (rx_group->total_packets - pre_rx_pkt);
    225		rx_group->total_packets = pre_rx_pkt;
    226	}
    227	return rcv_good_pkt_total;
    228}
    229
    230static void hns3_lb_clear_tx_ring(struct hns3_nic_priv *priv, u32 start_ringid,
    231				  u32 end_ringid, u32 budget)
    232{
    233	u32 i;
    234
    235	for (i = start_ringid; i <= end_ringid; i++) {
    236		struct hns3_enet_ring *ring = &priv->ring[i];
    237
    238		hns3_clean_tx_ring(ring, 0);
    239	}
    240}
    241
    242/**
    243 * hns3_lp_run_test - run loopback test
    244 * @ndev: net device
    245 * @mode: loopback type
    246 *
    247 * Return: %0 for success or a NIC loopback test error code on failure
    248 */
    249static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
    250{
    251	struct hns3_nic_priv *priv = netdev_priv(ndev);
    252	struct sk_buff *skb;
    253	u32 i, good_cnt;
    254	int ret_val = 0;
    255
    256	skb = alloc_skb(HNS3_NIC_LB_TEST_PACKET_SIZE + ETH_HLEN + NET_IP_ALIGN,
    257			GFP_KERNEL);
    258	if (!skb)
    259		return HNS3_NIC_LB_TEST_NO_MEM_ERR;
    260
    261	skb->dev = ndev;
    262	hns3_lp_setup_skb(skb);
    263	skb->queue_mapping = HNS3_NIC_LB_TEST_RING_ID;
    264
    265	good_cnt = 0;
    266	for (i = 0; i < HNS3_NIC_LB_TEST_PKT_NUM; i++) {
    267		netdev_tx_t tx_ret;
    268
    269		skb_get(skb);
    270		tx_ret = hns3_nic_net_xmit(skb, ndev);
    271		if (tx_ret == NETDEV_TX_OK) {
    272			good_cnt++;
    273		} else {
    274			kfree_skb(skb);
    275			netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n",
    276				   tx_ret);
    277		}
    278	}
    279	if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
    280		ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR;
    281		netdev_err(ndev, "mode %d sent fail, cnt=0x%x, budget=0x%x\n",
    282			   mode, good_cnt, HNS3_NIC_LB_TEST_PKT_NUM);
    283		goto out;
    284	}
    285
    286	/* Allow 200 milliseconds for packets to go from Tx to Rx */
    287	msleep(200);
    288
    289	good_cnt = hns3_lb_check_rx_ring(priv, HNS3_NIC_LB_TEST_PKT_NUM);
    290	if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
    291		ret_val = HNS3_NIC_LB_TEST_RX_CNT_ERR;
    292		netdev_err(ndev, "mode %d recv fail, cnt=0x%x, budget=0x%x\n",
    293			   mode, good_cnt, HNS3_NIC_LB_TEST_PKT_NUM);
    294	}
    295
    296out:
    297	hns3_lb_clear_tx_ring(priv, HNS3_NIC_LB_TEST_RING_ID,
    298			      HNS3_NIC_LB_TEST_RING_ID,
    299			      HNS3_NIC_LB_TEST_PKT_NUM);
    300
    301	kfree_skb(skb);
    302	return ret_val;
    303}
    304
    305static void hns3_set_selftest_param(struct hnae3_handle *h, int (*st_param)[2])
    306{
    307	st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
    308	st_param[HNAE3_LOOP_APP][1] =
    309			h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
    310
    311	st_param[HNAE3_LOOP_SERIAL_SERDES][0] = HNAE3_LOOP_SERIAL_SERDES;
    312	st_param[HNAE3_LOOP_SERIAL_SERDES][1] =
    313			h->flags & HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
    314
    315	st_param[HNAE3_LOOP_PARALLEL_SERDES][0] =
    316			HNAE3_LOOP_PARALLEL_SERDES;
    317	st_param[HNAE3_LOOP_PARALLEL_SERDES][1] =
    318			h->flags & HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
    319
    320	st_param[HNAE3_LOOP_PHY][0] = HNAE3_LOOP_PHY;
    321	st_param[HNAE3_LOOP_PHY][1] =
    322			h->flags & HNAE3_SUPPORT_PHY_LOOPBACK;
    323}
    324
    325static void hns3_selftest_prepare(struct net_device *ndev,
    326				  bool if_running, int (*st_param)[2])
    327{
    328	struct hns3_nic_priv *priv = netdev_priv(ndev);
    329	struct hnae3_handle *h = priv->ae_handle;
    330
    331	if (netif_msg_ifdown(h))
    332		netdev_info(ndev, "self test start\n");
    333
    334	hns3_set_selftest_param(h, st_param);
    335
    336	if (if_running)
    337		ndev->netdev_ops->ndo_stop(ndev);
    338
    339#if IS_ENABLED(CONFIG_VLAN_8021Q)
    340	/* Disable the vlan filter for selftest does not support it */
    341	if (h->ae_algo->ops->enable_vlan_filter &&
    342	    ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER)
    343		h->ae_algo->ops->enable_vlan_filter(h, false);
    344#endif
    345
    346	/* Tell firmware to stop mac autoneg before loopback test start,
    347	 * otherwise loopback test may be failed when the port is still
    348	 * negotiating.
    349	 */
    350	if (h->ae_algo->ops->halt_autoneg)
    351		h->ae_algo->ops->halt_autoneg(h, true);
    352
    353	set_bit(HNS3_NIC_STATE_TESTING, &priv->state);
    354}
    355
    356static void hns3_selftest_restore(struct net_device *ndev, bool if_running)
    357{
    358	struct hns3_nic_priv *priv = netdev_priv(ndev);
    359	struct hnae3_handle *h = priv->ae_handle;
    360
    361	clear_bit(HNS3_NIC_STATE_TESTING, &priv->state);
    362
    363	if (h->ae_algo->ops->halt_autoneg)
    364		h->ae_algo->ops->halt_autoneg(h, false);
    365
    366#if IS_ENABLED(CONFIG_VLAN_8021Q)
    367	if (h->ae_algo->ops->enable_vlan_filter &&
    368	    ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER)
    369		h->ae_algo->ops->enable_vlan_filter(h, true);
    370#endif
    371
    372	if (if_running)
    373		ndev->netdev_ops->ndo_open(ndev);
    374
    375	if (netif_msg_ifdown(h))
    376		netdev_info(ndev, "self test end\n");
    377}
    378
    379static void hns3_do_selftest(struct net_device *ndev, int (*st_param)[2],
    380			     struct ethtool_test *eth_test, u64 *data)
    381{
    382	int test_index = 0;
    383	u32 i;
    384
    385	for (i = 0; i < HNS3_SELF_TEST_TYPE_NUM; i++) {
    386		enum hnae3_loop loop_type = (enum hnae3_loop)st_param[i][0];
    387
    388		if (!st_param[i][1])
    389			continue;
    390
    391		data[test_index] = hns3_lp_up(ndev, loop_type);
    392		if (!data[test_index])
    393			data[test_index] = hns3_lp_run_test(ndev, loop_type);
    394
    395		hns3_lp_down(ndev, loop_type);
    396
    397		if (data[test_index])
    398			eth_test->flags |= ETH_TEST_FL_FAILED;
    399
    400		test_index++;
    401	}
    402}
    403
    404/**
    405 * hns3_self_test - self test
    406 * @ndev: net device
    407 * @eth_test: test cmd
    408 * @data: test result
    409 */
    410static void hns3_self_test(struct net_device *ndev,
    411			   struct ethtool_test *eth_test, u64 *data)
    412{
    413	int st_param[HNS3_SELF_TEST_TYPE_NUM][2];
    414	bool if_running = netif_running(ndev);
    415
    416	if (hns3_nic_resetting(ndev)) {
    417		netdev_err(ndev, "dev resetting!");
    418		return;
    419	}
    420
    421	/* Only do offline selftest, or pass by default */
    422	if (eth_test->flags != ETH_TEST_FL_OFFLINE)
    423		return;
    424
    425	hns3_selftest_prepare(ndev, if_running, st_param);
    426	hns3_do_selftest(ndev, st_param, eth_test, data);
    427	hns3_selftest_restore(ndev, if_running);
    428}
    429
    430static void hns3_update_limit_promisc_mode(struct net_device *netdev,
    431					   bool enable)
    432{
    433	struct hnae3_handle *handle = hns3_get_handle(netdev);
    434
    435	if (enable)
    436		set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
    437	else
    438		clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
    439
    440	hns3_request_update_promisc_mode(handle);
    441}
    442
    443static const struct hns3_pflag_desc hns3_priv_flags[HNAE3_PFLAG_MAX] = {
    444	{ "limit_promisc",	hns3_update_limit_promisc_mode }
    445};
    446
    447static int hns3_get_sset_count(struct net_device *netdev, int stringset)
    448{
    449	struct hnae3_handle *h = hns3_get_handle(netdev);
    450	const struct hnae3_ae_ops *ops = h->ae_algo->ops;
    451
    452	if (!ops->get_sset_count)
    453		return -EOPNOTSUPP;
    454
    455	switch (stringset) {
    456	case ETH_SS_STATS:
    457		return ((HNS3_TQP_STATS_COUNT * h->kinfo.num_tqps) +
    458			ops->get_sset_count(h, stringset));
    459
    460	case ETH_SS_TEST:
    461		return ops->get_sset_count(h, stringset);
    462
    463	case ETH_SS_PRIV_FLAGS:
    464		return HNAE3_PFLAG_MAX;
    465
    466	default:
    467		return -EOPNOTSUPP;
    468	}
    469}
    470
    471static void *hns3_update_strings(u8 *data, const struct hns3_stats *stats,
    472		u32 stat_count, u32 num_tqps, const char *prefix)
    473{
    474#define MAX_PREFIX_SIZE (6 + 4)
    475	u32 size_left;
    476	u32 i, j;
    477	u32 n1;
    478
    479	for (i = 0; i < num_tqps; i++) {
    480		for (j = 0; j < stat_count; j++) {
    481			data[ETH_GSTRING_LEN - 1] = '\0';
    482
    483			/* first, prepend the prefix string */
    484			n1 = scnprintf(data, MAX_PREFIX_SIZE, "%s%u_",
    485				       prefix, i);
    486			size_left = (ETH_GSTRING_LEN - 1) - n1;
    487
    488			/* now, concatenate the stats string to it */
    489			strncat(data, stats[j].stats_string, size_left);
    490			data += ETH_GSTRING_LEN;
    491		}
    492	}
    493
    494	return data;
    495}
    496
    497static u8 *hns3_get_strings_tqps(struct hnae3_handle *handle, u8 *data)
    498{
    499	struct hnae3_knic_private_info *kinfo = &handle->kinfo;
    500	const char tx_prefix[] = "txq";
    501	const char rx_prefix[] = "rxq";
    502
    503	/* get strings for Tx */
    504	data = hns3_update_strings(data, hns3_txq_stats, HNS3_TXQ_STATS_COUNT,
    505				   kinfo->num_tqps, tx_prefix);
    506
    507	/* get strings for Rx */
    508	data = hns3_update_strings(data, hns3_rxq_stats, HNS3_RXQ_STATS_COUNT,
    509				   kinfo->num_tqps, rx_prefix);
    510
    511	return data;
    512}
    513
    514static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
    515{
    516	struct hnae3_handle *h = hns3_get_handle(netdev);
    517	const struct hnae3_ae_ops *ops = h->ae_algo->ops;
    518	char *buff = (char *)data;
    519	int i;
    520
    521	if (!ops->get_strings)
    522		return;
    523
    524	switch (stringset) {
    525	case ETH_SS_STATS:
    526		buff = hns3_get_strings_tqps(h, buff);
    527		ops->get_strings(h, stringset, (u8 *)buff);
    528		break;
    529	case ETH_SS_TEST:
    530		ops->get_strings(h, stringset, data);
    531		break;
    532	case ETH_SS_PRIV_FLAGS:
    533		for (i = 0; i < HNS3_PRIV_FLAGS_LEN; i++) {
    534			snprintf(buff, ETH_GSTRING_LEN, "%s",
    535				 hns3_priv_flags[i].name);
    536			buff += ETH_GSTRING_LEN;
    537		}
    538		break;
    539	default:
    540		break;
    541	}
    542}
    543
    544static u64 *hns3_get_stats_tqps(struct hnae3_handle *handle, u64 *data)
    545{
    546	struct hns3_nic_priv *nic_priv = (struct hns3_nic_priv *)handle->priv;
    547	struct hnae3_knic_private_info *kinfo = &handle->kinfo;
    548	struct hns3_enet_ring *ring;
    549	u8 *stat;
    550	int i, j;
    551
    552	/* get stats for Tx */
    553	for (i = 0; i < kinfo->num_tqps; i++) {
    554		ring = &nic_priv->ring[i];
    555		for (j = 0; j < HNS3_TXQ_STATS_COUNT; j++) {
    556			stat = (u8 *)ring + hns3_txq_stats[j].stats_offset;
    557			*data++ = *(u64 *)stat;
    558		}
    559	}
    560
    561	/* get stats for Rx */
    562	for (i = 0; i < kinfo->num_tqps; i++) {
    563		ring = &nic_priv->ring[i + kinfo->num_tqps];
    564		for (j = 0; j < HNS3_RXQ_STATS_COUNT; j++) {
    565			stat = (u8 *)ring + hns3_rxq_stats[j].stats_offset;
    566			*data++ = *(u64 *)stat;
    567		}
    568	}
    569
    570	return data;
    571}
    572
    573/* hns3_get_stats - get detail statistics.
    574 * @netdev: net device
    575 * @stats: statistics info.
    576 * @data: statistics data.
    577 */
    578static void hns3_get_stats(struct net_device *netdev,
    579			   struct ethtool_stats *stats, u64 *data)
    580{
    581	struct hnae3_handle *h = hns3_get_handle(netdev);
    582	u64 *p = data;
    583
    584	if (hns3_nic_resetting(netdev)) {
    585		netdev_err(netdev, "dev resetting, could not get stats\n");
    586		return;
    587	}
    588
    589	if (!h->ae_algo->ops->get_stats || !h->ae_algo->ops->update_stats) {
    590		netdev_err(netdev, "could not get any statistics\n");
    591		return;
    592	}
    593
    594	h->ae_algo->ops->update_stats(h, &netdev->stats);
    595
    596	/* get per-queue stats */
    597	p = hns3_get_stats_tqps(h, p);
    598
    599	/* get MAC & other misc hardware stats */
    600	h->ae_algo->ops->get_stats(h, p);
    601}
    602
    603static void hns3_get_drvinfo(struct net_device *netdev,
    604			     struct ethtool_drvinfo *drvinfo)
    605{
    606	struct hns3_nic_priv *priv = netdev_priv(netdev);
    607	struct hnae3_handle *h = priv->ae_handle;
    608	u32 fw_version;
    609
    610	if (!h->ae_algo->ops->get_fw_version) {
    611		netdev_err(netdev, "could not get fw version!\n");
    612		return;
    613	}
    614
    615	strncpy(drvinfo->driver, dev_driver_string(&h->pdev->dev),
    616		sizeof(drvinfo->driver));
    617	drvinfo->driver[sizeof(drvinfo->driver) - 1] = '\0';
    618
    619	strncpy(drvinfo->bus_info, pci_name(h->pdev),
    620		sizeof(drvinfo->bus_info));
    621	drvinfo->bus_info[ETHTOOL_BUSINFO_LEN - 1] = '\0';
    622
    623	fw_version = priv->ae_handle->ae_algo->ops->get_fw_version(h);
    624
    625	snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
    626		 "%lu.%lu.%lu.%lu",
    627		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
    628				 HNAE3_FW_VERSION_BYTE3_SHIFT),
    629		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE2_MASK,
    630				 HNAE3_FW_VERSION_BYTE2_SHIFT),
    631		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE1_MASK,
    632				 HNAE3_FW_VERSION_BYTE1_SHIFT),
    633		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
    634				 HNAE3_FW_VERSION_BYTE0_SHIFT));
    635}
    636
    637static u32 hns3_get_link(struct net_device *netdev)
    638{
    639	struct hnae3_handle *h = hns3_get_handle(netdev);
    640
    641	if (h->ae_algo->ops->get_status)
    642		return h->ae_algo->ops->get_status(h);
    643	else
    644		return 0;
    645}
    646
    647static void hns3_get_ringparam(struct net_device *netdev,
    648			       struct ethtool_ringparam *param,
    649			       struct kernel_ethtool_ringparam *kernel_param,
    650			       struct netlink_ext_ack *extack)
    651{
    652	struct hns3_nic_priv *priv = netdev_priv(netdev);
    653	struct hnae3_handle *h = priv->ae_handle;
    654	int rx_queue_index = h->kinfo.num_tqps;
    655
    656	if (hns3_nic_resetting(netdev) || !priv->ring) {
    657		netdev_err(netdev, "failed to get ringparam value, due to dev resetting or uninited\n");
    658		return;
    659	}
    660
    661	param->tx_max_pending = HNS3_RING_MAX_PENDING;
    662	param->rx_max_pending = HNS3_RING_MAX_PENDING;
    663
    664	param->tx_pending = priv->ring[0].desc_num;
    665	param->rx_pending = priv->ring[rx_queue_index].desc_num;
    666	kernel_param->rx_buf_len = priv->ring[rx_queue_index].buf_size;
    667	kernel_param->tx_push = test_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE,
    668					 &priv->state);
    669}
    670
    671static void hns3_get_pauseparam(struct net_device *netdev,
    672				struct ethtool_pauseparam *param)
    673{
    674	struct hnae3_handle *h = hns3_get_handle(netdev);
    675	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
    676
    677	if (!test_bit(HNAE3_DEV_SUPPORT_PAUSE_B, ae_dev->caps))
    678		return;
    679
    680	if (h->ae_algo->ops->get_pauseparam)
    681		h->ae_algo->ops->get_pauseparam(h, &param->autoneg,
    682			&param->rx_pause, &param->tx_pause);
    683}
    684
    685static int hns3_set_pauseparam(struct net_device *netdev,
    686			       struct ethtool_pauseparam *param)
    687{
    688	struct hnae3_handle *h = hns3_get_handle(netdev);
    689	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
    690
    691	if (!test_bit(HNAE3_DEV_SUPPORT_PAUSE_B, ae_dev->caps))
    692		return -EOPNOTSUPP;
    693
    694	netif_dbg(h, drv, netdev,
    695		  "set pauseparam: autoneg=%u, rx:%u, tx:%u\n",
    696		  param->autoneg, param->rx_pause, param->tx_pause);
    697
    698	if (h->ae_algo->ops->set_pauseparam)
    699		return h->ae_algo->ops->set_pauseparam(h, param->autoneg,
    700						       param->rx_pause,
    701						       param->tx_pause);
    702	return -EOPNOTSUPP;
    703}
    704
    705static void hns3_get_ksettings(struct hnae3_handle *h,
    706			       struct ethtool_link_ksettings *cmd)
    707{
    708	const struct hnae3_ae_ops *ops = h->ae_algo->ops;
    709
    710	/* 1.auto_neg & speed & duplex from cmd */
    711	if (ops->get_ksettings_an_result)
    712		ops->get_ksettings_an_result(h,
    713					     &cmd->base.autoneg,
    714					     &cmd->base.speed,
    715					     &cmd->base.duplex);
    716
    717	/* 2.get link mode */
    718	if (ops->get_link_mode)
    719		ops->get_link_mode(h,
    720				   cmd->link_modes.supported,
    721				   cmd->link_modes.advertising);
    722
    723	/* 3.mdix_ctrl&mdix get from phy reg */
    724	if (ops->get_mdix_mode)
    725		ops->get_mdix_mode(h, &cmd->base.eth_tp_mdix_ctrl,
    726				   &cmd->base.eth_tp_mdix);
    727}
    728
    729static int hns3_get_link_ksettings(struct net_device *netdev,
    730				   struct ethtool_link_ksettings *cmd)
    731{
    732	struct hnae3_handle *h = hns3_get_handle(netdev);
    733	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
    734	const struct hnae3_ae_ops *ops;
    735	u8 module_type;
    736	u8 media_type;
    737	u8 link_stat;
    738
    739	ops = h->ae_algo->ops;
    740	if (ops->get_media_type)
    741		ops->get_media_type(h, &media_type, &module_type);
    742	else
    743		return -EOPNOTSUPP;
    744
    745	switch (media_type) {
    746	case HNAE3_MEDIA_TYPE_NONE:
    747		cmd->base.port = PORT_NONE;
    748		hns3_get_ksettings(h, cmd);
    749		break;
    750	case HNAE3_MEDIA_TYPE_FIBER:
    751		if (module_type == HNAE3_MODULE_TYPE_CR)
    752			cmd->base.port = PORT_DA;
    753		else
    754			cmd->base.port = PORT_FIBRE;
    755
    756		hns3_get_ksettings(h, cmd);
    757		break;
    758	case HNAE3_MEDIA_TYPE_BACKPLANE:
    759		cmd->base.port = PORT_NONE;
    760		hns3_get_ksettings(h, cmd);
    761		break;
    762	case HNAE3_MEDIA_TYPE_COPPER:
    763		cmd->base.port = PORT_TP;
    764		if (test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps) &&
    765		    ops->get_phy_link_ksettings)
    766			ops->get_phy_link_ksettings(h, cmd);
    767		else if (!netdev->phydev)
    768			hns3_get_ksettings(h, cmd);
    769		else
    770			phy_ethtool_ksettings_get(netdev->phydev, cmd);
    771		break;
    772	default:
    773
    774		netdev_warn(netdev, "Unknown media type");
    775		return 0;
    776	}
    777
    778	/* mdio_support */
    779	cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22;
    780
    781	link_stat = hns3_get_link(netdev);
    782	if (!link_stat) {
    783		cmd->base.speed = SPEED_UNKNOWN;
    784		cmd->base.duplex = DUPLEX_UNKNOWN;
    785	}
    786
    787	return 0;
    788}
    789
    790static int hns3_check_ksettings_param(const struct net_device *netdev,
    791				      const struct ethtool_link_ksettings *cmd)
    792{
    793	struct hnae3_handle *handle = hns3_get_handle(netdev);
    794	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
    795	u8 module_type = HNAE3_MODULE_TYPE_UNKNOWN;
    796	u8 media_type = HNAE3_MEDIA_TYPE_UNKNOWN;
    797	u8 autoneg;
    798	u32 speed;
    799	u8 duplex;
    800	int ret;
    801
    802	/* hw doesn't support use specified speed and duplex to negotiate,
    803	 * unnecessary to check them when autoneg on.
    804	 */
    805	if (cmd->base.autoneg)
    806		return 0;
    807
    808	if (ops->get_ksettings_an_result) {
    809		ops->get_ksettings_an_result(handle, &autoneg, &speed, &duplex);
    810		if (cmd->base.autoneg == autoneg && cmd->base.speed == speed &&
    811		    cmd->base.duplex == duplex)
    812			return 0;
    813	}
    814
    815	if (ops->get_media_type)
    816		ops->get_media_type(handle, &media_type, &module_type);
    817
    818	if (cmd->base.duplex == DUPLEX_HALF &&
    819	    media_type != HNAE3_MEDIA_TYPE_COPPER) {
    820		netdev_err(netdev,
    821			   "only copper port supports half duplex!");
    822		return -EINVAL;
    823	}
    824
    825	if (ops->check_port_speed) {
    826		ret = ops->check_port_speed(handle, cmd->base.speed);
    827		if (ret) {
    828			netdev_err(netdev, "unsupported speed\n");
    829			return ret;
    830		}
    831	}
    832
    833	return 0;
    834}
    835
    836static int hns3_set_link_ksettings(struct net_device *netdev,
    837				   const struct ethtool_link_ksettings *cmd)
    838{
    839	struct hnae3_handle *handle = hns3_get_handle(netdev);
    840	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
    841	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
    842	int ret;
    843
    844	/* Chip don't support this mode. */
    845	if (cmd->base.speed == SPEED_1000 && cmd->base.duplex == DUPLEX_HALF)
    846		return -EINVAL;
    847
    848	netif_dbg(handle, drv, netdev,
    849		  "set link(%s): autoneg=%u, speed=%u, duplex=%u\n",
    850		  netdev->phydev ? "phy" : "mac",
    851		  cmd->base.autoneg, cmd->base.speed, cmd->base.duplex);
    852
    853	/* Only support ksettings_set for netdev with phy attached for now */
    854	if (netdev->phydev) {
    855		if (cmd->base.speed == SPEED_1000 &&
    856		    cmd->base.autoneg == AUTONEG_DISABLE)
    857			return -EINVAL;
    858
    859		return phy_ethtool_ksettings_set(netdev->phydev, cmd);
    860	} else if (test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps) &&
    861		   ops->set_phy_link_ksettings) {
    862		return ops->set_phy_link_ksettings(handle, cmd);
    863	}
    864
    865	if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
    866		return -EOPNOTSUPP;
    867
    868	ret = hns3_check_ksettings_param(netdev, cmd);
    869	if (ret)
    870		return ret;
    871
    872	if (ops->set_autoneg) {
    873		ret = ops->set_autoneg(handle, cmd->base.autoneg);
    874		if (ret)
    875			return ret;
    876	}
    877
    878	/* hw doesn't support use specified speed and duplex to negotiate,
    879	 * ignore them when autoneg on.
    880	 */
    881	if (cmd->base.autoneg) {
    882		netdev_info(netdev,
    883			    "autoneg is on, ignore the speed and duplex\n");
    884		return 0;
    885	}
    886
    887	if (ops->cfg_mac_speed_dup_h)
    888		ret = ops->cfg_mac_speed_dup_h(handle, cmd->base.speed,
    889					       cmd->base.duplex);
    890
    891	return ret;
    892}
    893
    894static u32 hns3_get_rss_key_size(struct net_device *netdev)
    895{
    896	struct hnae3_handle *h = hns3_get_handle(netdev);
    897
    898	if (!h->ae_algo->ops->get_rss_key_size)
    899		return 0;
    900
    901	return h->ae_algo->ops->get_rss_key_size(h);
    902}
    903
    904static u32 hns3_get_rss_indir_size(struct net_device *netdev)
    905{
    906	struct hnae3_handle *h = hns3_get_handle(netdev);
    907	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
    908
    909	return ae_dev->dev_specs.rss_ind_tbl_size;
    910}
    911
    912static int hns3_get_rss(struct net_device *netdev, u32 *indir, u8 *key,
    913			u8 *hfunc)
    914{
    915	struct hnae3_handle *h = hns3_get_handle(netdev);
    916
    917	if (!h->ae_algo->ops->get_rss)
    918		return -EOPNOTSUPP;
    919
    920	return h->ae_algo->ops->get_rss(h, indir, key, hfunc);
    921}
    922
    923static int hns3_set_rss(struct net_device *netdev, const u32 *indir,
    924			const u8 *key, const u8 hfunc)
    925{
    926	struct hnae3_handle *h = hns3_get_handle(netdev);
    927	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
    928
    929	if (!h->ae_algo->ops->set_rss)
    930		return -EOPNOTSUPP;
    931
    932	if ((ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 &&
    933	     hfunc != ETH_RSS_HASH_TOP) || (hfunc != ETH_RSS_HASH_NO_CHANGE &&
    934	     hfunc != ETH_RSS_HASH_TOP && hfunc != ETH_RSS_HASH_XOR)) {
    935		netdev_err(netdev, "hash func not supported\n");
    936		return -EOPNOTSUPP;
    937	}
    938
    939	if (!indir) {
    940		netdev_err(netdev,
    941			   "set rss failed for indir is empty\n");
    942		return -EOPNOTSUPP;
    943	}
    944
    945	return h->ae_algo->ops->set_rss(h, indir, key, hfunc);
    946}
    947
    948static int hns3_get_rxnfc(struct net_device *netdev,
    949			  struct ethtool_rxnfc *cmd,
    950			  u32 *rule_locs)
    951{
    952	struct hnae3_handle *h = hns3_get_handle(netdev);
    953
    954	switch (cmd->cmd) {
    955	case ETHTOOL_GRXRINGS:
    956		cmd->data = h->kinfo.num_tqps;
    957		return 0;
    958	case ETHTOOL_GRXFH:
    959		if (h->ae_algo->ops->get_rss_tuple)
    960			return h->ae_algo->ops->get_rss_tuple(h, cmd);
    961		return -EOPNOTSUPP;
    962	case ETHTOOL_GRXCLSRLCNT:
    963		if (h->ae_algo->ops->get_fd_rule_cnt)
    964			return h->ae_algo->ops->get_fd_rule_cnt(h, cmd);
    965		return -EOPNOTSUPP;
    966	case ETHTOOL_GRXCLSRULE:
    967		if (h->ae_algo->ops->get_fd_rule_info)
    968			return h->ae_algo->ops->get_fd_rule_info(h, cmd);
    969		return -EOPNOTSUPP;
    970	case ETHTOOL_GRXCLSRLALL:
    971		if (h->ae_algo->ops->get_fd_all_rules)
    972			return h->ae_algo->ops->get_fd_all_rules(h, cmd,
    973								 rule_locs);
    974		return -EOPNOTSUPP;
    975	default:
    976		return -EOPNOTSUPP;
    977	}
    978}
    979
    980static const struct hns3_reset_type_map hns3_reset_type[] = {
    981	{ETH_RESET_MGMT, HNAE3_IMP_RESET},
    982	{ETH_RESET_ALL, HNAE3_GLOBAL_RESET},
    983	{ETH_RESET_DEDICATED, HNAE3_FUNC_RESET},
    984};
    985
    986static const struct hns3_reset_type_map hns3vf_reset_type[] = {
    987	{ETH_RESET_DEDICATED, HNAE3_VF_FUNC_RESET},
    988};
    989
    990static int hns3_set_reset(struct net_device *netdev, u32 *flags)
    991{
    992	enum hnae3_reset_type rst_type = HNAE3_NONE_RESET;
    993	struct hnae3_handle *h = hns3_get_handle(netdev);
    994	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
    995	const struct hnae3_ae_ops *ops = h->ae_algo->ops;
    996	const struct hns3_reset_type_map *rst_type_map;
    997	enum ethtool_reset_flags rst_flags;
    998	u32 i, size;
    999
   1000	if (ops->ae_dev_resetting && ops->ae_dev_resetting(h))
   1001		return -EBUSY;
   1002
   1003	if (!ops->set_default_reset_request || !ops->reset_event)
   1004		return -EOPNOTSUPP;
   1005
   1006	if (h->flags & HNAE3_SUPPORT_VF) {
   1007		rst_type_map = hns3vf_reset_type;
   1008		size = ARRAY_SIZE(hns3vf_reset_type);
   1009	} else {
   1010		rst_type_map = hns3_reset_type;
   1011		size = ARRAY_SIZE(hns3_reset_type);
   1012	}
   1013
   1014	for (i = 0; i < size; i++) {
   1015		if (rst_type_map[i].rst_flags == *flags) {
   1016			rst_type = rst_type_map[i].rst_type;
   1017			rst_flags = rst_type_map[i].rst_flags;
   1018			break;
   1019		}
   1020	}
   1021
   1022	if (rst_type == HNAE3_NONE_RESET ||
   1023	    (rst_type == HNAE3_IMP_RESET &&
   1024	     ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2))
   1025		return -EOPNOTSUPP;
   1026
   1027	netdev_info(netdev, "Setting reset type %d\n", rst_type);
   1028
   1029	ops->set_default_reset_request(ae_dev, rst_type);
   1030
   1031	ops->reset_event(h->pdev, h);
   1032
   1033	*flags &= ~rst_flags;
   1034
   1035	return 0;
   1036}
   1037
   1038static void hns3_change_all_ring_bd_num(struct hns3_nic_priv *priv,
   1039					u32 tx_desc_num, u32 rx_desc_num)
   1040{
   1041	struct hnae3_handle *h = priv->ae_handle;
   1042	int i;
   1043
   1044	h->kinfo.num_tx_desc = tx_desc_num;
   1045	h->kinfo.num_rx_desc = rx_desc_num;
   1046
   1047	for (i = 0; i < h->kinfo.num_tqps; i++) {
   1048		priv->ring[i].desc_num = tx_desc_num;
   1049		priv->ring[i + h->kinfo.num_tqps].desc_num = rx_desc_num;
   1050	}
   1051}
   1052
   1053static struct hns3_enet_ring *hns3_backup_ringparam(struct hns3_nic_priv *priv)
   1054{
   1055	struct hnae3_handle *handle = priv->ae_handle;
   1056	struct hns3_enet_ring *tmp_rings;
   1057	int i;
   1058
   1059	tmp_rings = kcalloc(handle->kinfo.num_tqps * 2,
   1060			    sizeof(struct hns3_enet_ring), GFP_KERNEL);
   1061	if (!tmp_rings)
   1062		return NULL;
   1063
   1064	for (i = 0; i < handle->kinfo.num_tqps * 2; i++) {
   1065		memcpy(&tmp_rings[i], &priv->ring[i],
   1066		       sizeof(struct hns3_enet_ring));
   1067		tmp_rings[i].skb = NULL;
   1068	}
   1069
   1070	return tmp_rings;
   1071}
   1072
   1073static int hns3_check_ringparam(struct net_device *ndev,
   1074				struct ethtool_ringparam *param,
   1075				struct kernel_ethtool_ringparam *kernel_param)
   1076{
   1077#define RX_BUF_LEN_2K 2048
   1078#define RX_BUF_LEN_4K 4096
   1079
   1080	struct hns3_nic_priv *priv = netdev_priv(ndev);
   1081
   1082	if (hns3_nic_resetting(ndev) || !priv->ring) {
   1083		netdev_err(ndev, "failed to set ringparam value, due to dev resetting or uninited\n");
   1084		return -EBUSY;
   1085	}
   1086
   1087
   1088	if (param->rx_mini_pending || param->rx_jumbo_pending)
   1089		return -EINVAL;
   1090
   1091	if (kernel_param->rx_buf_len != RX_BUF_LEN_2K &&
   1092	    kernel_param->rx_buf_len != RX_BUF_LEN_4K) {
   1093		netdev_err(ndev, "Rx buf len only support 2048 and 4096\n");
   1094		return -EINVAL;
   1095	}
   1096
   1097	if (param->tx_pending > HNS3_RING_MAX_PENDING ||
   1098	    param->tx_pending < HNS3_RING_MIN_PENDING ||
   1099	    param->rx_pending > HNS3_RING_MAX_PENDING ||
   1100	    param->rx_pending < HNS3_RING_MIN_PENDING) {
   1101		netdev_err(ndev, "Queue depth out of range [%d-%d]\n",
   1102			   HNS3_RING_MIN_PENDING, HNS3_RING_MAX_PENDING);
   1103		return -EINVAL;
   1104	}
   1105
   1106	return 0;
   1107}
   1108
   1109static bool
   1110hns3_is_ringparam_changed(struct net_device *ndev,
   1111			  struct ethtool_ringparam *param,
   1112			  struct kernel_ethtool_ringparam *kernel_param,
   1113			  struct hns3_ring_param *old_ringparam,
   1114			  struct hns3_ring_param *new_ringparam)
   1115{
   1116	struct hns3_nic_priv *priv = netdev_priv(ndev);
   1117	struct hnae3_handle *h = priv->ae_handle;
   1118	u16 queue_num = h->kinfo.num_tqps;
   1119
   1120	new_ringparam->tx_desc_num = ALIGN(param->tx_pending,
   1121					   HNS3_RING_BD_MULTIPLE);
   1122	new_ringparam->rx_desc_num = ALIGN(param->rx_pending,
   1123					   HNS3_RING_BD_MULTIPLE);
   1124	old_ringparam->tx_desc_num = priv->ring[0].desc_num;
   1125	old_ringparam->rx_desc_num = priv->ring[queue_num].desc_num;
   1126	old_ringparam->rx_buf_len = priv->ring[queue_num].buf_size;
   1127	new_ringparam->rx_buf_len = kernel_param->rx_buf_len;
   1128
   1129	if (old_ringparam->tx_desc_num == new_ringparam->tx_desc_num &&
   1130	    old_ringparam->rx_desc_num == new_ringparam->rx_desc_num &&
   1131	    old_ringparam->rx_buf_len == new_ringparam->rx_buf_len) {
   1132		netdev_info(ndev, "descriptor number and rx buffer length not changed\n");
   1133		return false;
   1134	}
   1135
   1136	return true;
   1137}
   1138
   1139static int hns3_change_rx_buf_len(struct net_device *ndev, u32 rx_buf_len)
   1140{
   1141	struct hns3_nic_priv *priv = netdev_priv(ndev);
   1142	struct hnae3_handle *h = priv->ae_handle;
   1143	int i;
   1144
   1145	h->kinfo.rx_buf_len = rx_buf_len;
   1146
   1147	for (i = 0; i < h->kinfo.num_tqps; i++) {
   1148		h->kinfo.tqp[i]->buf_size = rx_buf_len;
   1149		priv->ring[i + h->kinfo.num_tqps].buf_size = rx_buf_len;
   1150	}
   1151
   1152	return 0;
   1153}
   1154
   1155static int hns3_set_tx_push(struct net_device *netdev, u32 tx_push)
   1156{
   1157	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1158	struct hnae3_handle *h = hns3_get_handle(netdev);
   1159	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
   1160	u32 old_state = test_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
   1161
   1162	if (!test_bit(HNAE3_DEV_SUPPORT_TX_PUSH_B, ae_dev->caps) && tx_push)
   1163		return -EOPNOTSUPP;
   1164
   1165	if (tx_push == old_state)
   1166		return 0;
   1167
   1168	netdev_dbg(netdev, "Changing tx push from %s to %s\n",
   1169		   old_state ? "on" : "off", tx_push ? "on" : "off");
   1170
   1171	if (tx_push)
   1172		set_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
   1173	else
   1174		clear_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
   1175
   1176	return 0;
   1177}
   1178
   1179static int hns3_set_ringparam(struct net_device *ndev,
   1180			      struct ethtool_ringparam *param,
   1181			      struct kernel_ethtool_ringparam *kernel_param,
   1182			      struct netlink_ext_ack *extack)
   1183{
   1184	struct hns3_ring_param old_ringparam, new_ringparam;
   1185	struct hns3_nic_priv *priv = netdev_priv(ndev);
   1186	struct hnae3_handle *h = priv->ae_handle;
   1187	struct hns3_enet_ring *tmp_rings;
   1188	bool if_running = netif_running(ndev);
   1189	int ret, i;
   1190
   1191	ret = hns3_check_ringparam(ndev, param, kernel_param);
   1192	if (ret)
   1193		return ret;
   1194
   1195	ret = hns3_set_tx_push(ndev, kernel_param->tx_push);
   1196	if (ret)
   1197		return ret;
   1198
   1199	if (!hns3_is_ringparam_changed(ndev, param, kernel_param,
   1200				       &old_ringparam, &new_ringparam))
   1201		return 0;
   1202
   1203	tmp_rings = hns3_backup_ringparam(priv);
   1204	if (!tmp_rings) {
   1205		netdev_err(ndev, "backup ring param failed by allocating memory fail\n");
   1206		return -ENOMEM;
   1207	}
   1208
   1209	netdev_info(ndev,
   1210		    "Changing Tx/Rx ring depth from %u/%u to %u/%u, Changing rx buffer len from %u to %u\n",
   1211		    old_ringparam.tx_desc_num, old_ringparam.rx_desc_num,
   1212		    new_ringparam.tx_desc_num, new_ringparam.rx_desc_num,
   1213		    old_ringparam.rx_buf_len, new_ringparam.rx_buf_len);
   1214
   1215	if (if_running)
   1216		ndev->netdev_ops->ndo_stop(ndev);
   1217
   1218	hns3_change_all_ring_bd_num(priv, new_ringparam.tx_desc_num,
   1219				    new_ringparam.rx_desc_num);
   1220	hns3_change_rx_buf_len(ndev, new_ringparam.rx_buf_len);
   1221	ret = hns3_init_all_ring(priv);
   1222	if (ret) {
   1223		netdev_err(ndev, "set ringparam fail, revert to old value(%d)\n",
   1224			   ret);
   1225
   1226		hns3_change_rx_buf_len(ndev, old_ringparam.rx_buf_len);
   1227		hns3_change_all_ring_bd_num(priv, old_ringparam.tx_desc_num,
   1228					    old_ringparam.rx_desc_num);
   1229		for (i = 0; i < h->kinfo.num_tqps * 2; i++)
   1230			memcpy(&priv->ring[i], &tmp_rings[i],
   1231			       sizeof(struct hns3_enet_ring));
   1232	} else {
   1233		for (i = 0; i < h->kinfo.num_tqps * 2; i++)
   1234			hns3_fini_ring(&tmp_rings[i]);
   1235	}
   1236
   1237	kfree(tmp_rings);
   1238
   1239	if (if_running)
   1240		ret = ndev->netdev_ops->ndo_open(ndev);
   1241
   1242	return ret;
   1243}
   1244
   1245static int hns3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)
   1246{
   1247	struct hnae3_handle *h = hns3_get_handle(netdev);
   1248
   1249	switch (cmd->cmd) {
   1250	case ETHTOOL_SRXFH:
   1251		if (h->ae_algo->ops->set_rss_tuple)
   1252			return h->ae_algo->ops->set_rss_tuple(h, cmd);
   1253		return -EOPNOTSUPP;
   1254	case ETHTOOL_SRXCLSRLINS:
   1255		if (h->ae_algo->ops->add_fd_entry)
   1256			return h->ae_algo->ops->add_fd_entry(h, cmd);
   1257		return -EOPNOTSUPP;
   1258	case ETHTOOL_SRXCLSRLDEL:
   1259		if (h->ae_algo->ops->del_fd_entry)
   1260			return h->ae_algo->ops->del_fd_entry(h, cmd);
   1261		return -EOPNOTSUPP;
   1262	default:
   1263		return -EOPNOTSUPP;
   1264	}
   1265}
   1266
   1267static int hns3_nway_reset(struct net_device *netdev)
   1268{
   1269	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1270	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
   1271	struct phy_device *phy = netdev->phydev;
   1272	int autoneg;
   1273
   1274	if (!netif_running(netdev))
   1275		return 0;
   1276
   1277	if (hns3_nic_resetting(netdev)) {
   1278		netdev_err(netdev, "dev resetting!");
   1279		return -EBUSY;
   1280	}
   1281
   1282	if (!ops->get_autoneg || !ops->restart_autoneg)
   1283		return -EOPNOTSUPP;
   1284
   1285	autoneg = ops->get_autoneg(handle);
   1286	if (autoneg != AUTONEG_ENABLE) {
   1287		netdev_err(netdev,
   1288			   "Autoneg is off, don't support to restart it\n");
   1289		return -EINVAL;
   1290	}
   1291
   1292	netif_dbg(handle, drv, netdev,
   1293		  "nway reset (using %s)\n", phy ? "phy" : "mac");
   1294
   1295	if (phy)
   1296		return genphy_restart_aneg(phy);
   1297
   1298	return ops->restart_autoneg(handle);
   1299}
   1300
   1301static void hns3_get_channels(struct net_device *netdev,
   1302			      struct ethtool_channels *ch)
   1303{
   1304	struct hnae3_handle *h = hns3_get_handle(netdev);
   1305
   1306	if (h->ae_algo->ops->get_channels)
   1307		h->ae_algo->ops->get_channels(h, ch);
   1308}
   1309
   1310static int hns3_get_coalesce(struct net_device *netdev,
   1311			     struct ethtool_coalesce *cmd,
   1312			     struct kernel_ethtool_coalesce *kernel_coal,
   1313			     struct netlink_ext_ack *extack)
   1314{
   1315	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1316	struct hns3_enet_coalesce *tx_coal = &priv->tx_coal;
   1317	struct hns3_enet_coalesce *rx_coal = &priv->rx_coal;
   1318	struct hnae3_handle *h = priv->ae_handle;
   1319
   1320	if (hns3_nic_resetting(netdev))
   1321		return -EBUSY;
   1322
   1323	cmd->use_adaptive_tx_coalesce = tx_coal->adapt_enable;
   1324	cmd->use_adaptive_rx_coalesce = rx_coal->adapt_enable;
   1325
   1326	cmd->tx_coalesce_usecs = tx_coal->int_gl;
   1327	cmd->rx_coalesce_usecs = rx_coal->int_gl;
   1328
   1329	cmd->tx_coalesce_usecs_high = h->kinfo.int_rl_setting;
   1330	cmd->rx_coalesce_usecs_high = h->kinfo.int_rl_setting;
   1331
   1332	cmd->tx_max_coalesced_frames = tx_coal->int_ql;
   1333	cmd->rx_max_coalesced_frames = rx_coal->int_ql;
   1334
   1335	kernel_coal->use_cqe_mode_tx = (priv->tx_cqe_mode ==
   1336					DIM_CQ_PERIOD_MODE_START_FROM_CQE);
   1337	kernel_coal->use_cqe_mode_rx = (priv->rx_cqe_mode ==
   1338					DIM_CQ_PERIOD_MODE_START_FROM_CQE);
   1339
   1340	return 0;
   1341}
   1342
   1343static int hns3_check_gl_coalesce_para(struct net_device *netdev,
   1344				       struct ethtool_coalesce *cmd)
   1345{
   1346	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1347	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1348	u32 rx_gl, tx_gl;
   1349
   1350	if (cmd->rx_coalesce_usecs > ae_dev->dev_specs.max_int_gl) {
   1351		netdev_err(netdev,
   1352			   "invalid rx-usecs value, rx-usecs range is 0-%u\n",
   1353			   ae_dev->dev_specs.max_int_gl);
   1354		return -EINVAL;
   1355	}
   1356
   1357	if (cmd->tx_coalesce_usecs > ae_dev->dev_specs.max_int_gl) {
   1358		netdev_err(netdev,
   1359			   "invalid tx-usecs value, tx-usecs range is 0-%u\n",
   1360			   ae_dev->dev_specs.max_int_gl);
   1361		return -EINVAL;
   1362	}
   1363
   1364	/* device version above V3(include V3), GL uses 1us unit,
   1365	 * so the round down is not needed.
   1366	 */
   1367	if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
   1368		return 0;
   1369
   1370	rx_gl = hns3_gl_round_down(cmd->rx_coalesce_usecs);
   1371	if (rx_gl != cmd->rx_coalesce_usecs) {
   1372		netdev_info(netdev,
   1373			    "rx_usecs(%u) rounded down to %u, because it must be multiple of 2.\n",
   1374			    cmd->rx_coalesce_usecs, rx_gl);
   1375	}
   1376
   1377	tx_gl = hns3_gl_round_down(cmd->tx_coalesce_usecs);
   1378	if (tx_gl != cmd->tx_coalesce_usecs) {
   1379		netdev_info(netdev,
   1380			    "tx_usecs(%u) rounded down to %u, because it must be multiple of 2.\n",
   1381			    cmd->tx_coalesce_usecs, tx_gl);
   1382	}
   1383
   1384	return 0;
   1385}
   1386
   1387static int hns3_check_rl_coalesce_para(struct net_device *netdev,
   1388				       struct ethtool_coalesce *cmd)
   1389{
   1390	u32 rl;
   1391
   1392	if (cmd->tx_coalesce_usecs_high != cmd->rx_coalesce_usecs_high) {
   1393		netdev_err(netdev,
   1394			   "tx_usecs_high must be same as rx_usecs_high.\n");
   1395		return -EINVAL;
   1396	}
   1397
   1398	if (cmd->rx_coalesce_usecs_high > HNS3_INT_RL_MAX) {
   1399		netdev_err(netdev,
   1400			   "Invalid usecs_high value, usecs_high range is 0-%d\n",
   1401			   HNS3_INT_RL_MAX);
   1402		return -EINVAL;
   1403	}
   1404
   1405	rl = hns3_rl_round_down(cmd->rx_coalesce_usecs_high);
   1406	if (rl != cmd->rx_coalesce_usecs_high) {
   1407		netdev_info(netdev,
   1408			    "usecs_high(%u) rounded down to %u, because it must be multiple of 4.\n",
   1409			    cmd->rx_coalesce_usecs_high, rl);
   1410	}
   1411
   1412	return 0;
   1413}
   1414
   1415static int hns3_check_ql_coalesce_param(struct net_device *netdev,
   1416					struct ethtool_coalesce *cmd)
   1417{
   1418	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1419	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1420
   1421	if ((cmd->tx_max_coalesced_frames || cmd->rx_max_coalesced_frames) &&
   1422	    !ae_dev->dev_specs.int_ql_max) {
   1423		netdev_err(netdev, "coalesced frames is not supported\n");
   1424		return -EOPNOTSUPP;
   1425	}
   1426
   1427	if (cmd->tx_max_coalesced_frames > ae_dev->dev_specs.int_ql_max ||
   1428	    cmd->rx_max_coalesced_frames > ae_dev->dev_specs.int_ql_max) {
   1429		netdev_err(netdev,
   1430			   "invalid coalesced_frames value, range is 0-%u\n",
   1431			   ae_dev->dev_specs.int_ql_max);
   1432		return -ERANGE;
   1433	}
   1434
   1435	return 0;
   1436}
   1437
   1438static int
   1439hns3_check_cqe_coalesce_param(struct net_device *netdev,
   1440			      struct kernel_ethtool_coalesce *kernel_coal)
   1441{
   1442	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1443	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1444
   1445	if ((kernel_coal->use_cqe_mode_tx || kernel_coal->use_cqe_mode_rx) &&
   1446	    !hnae3_ae_dev_cq_supported(ae_dev)) {
   1447		netdev_err(netdev, "coalesced cqe mode is not supported\n");
   1448		return -EOPNOTSUPP;
   1449	}
   1450
   1451	return 0;
   1452}
   1453
   1454static int
   1455hns3_check_coalesce_para(struct net_device *netdev,
   1456			 struct ethtool_coalesce *cmd,
   1457			 struct kernel_ethtool_coalesce *kernel_coal)
   1458{
   1459	int ret;
   1460
   1461	ret = hns3_check_cqe_coalesce_param(netdev, kernel_coal);
   1462	if (ret)
   1463		return ret;
   1464
   1465	ret = hns3_check_gl_coalesce_para(netdev, cmd);
   1466	if (ret) {
   1467		netdev_err(netdev,
   1468			   "Check gl coalesce param fail. ret = %d\n", ret);
   1469		return ret;
   1470	}
   1471
   1472	ret = hns3_check_rl_coalesce_para(netdev, cmd);
   1473	if (ret) {
   1474		netdev_err(netdev,
   1475			   "Check rl coalesce param fail. ret = %d\n", ret);
   1476		return ret;
   1477	}
   1478
   1479	return hns3_check_ql_coalesce_param(netdev, cmd);
   1480}
   1481
   1482static void hns3_set_coalesce_per_queue(struct net_device *netdev,
   1483					struct ethtool_coalesce *cmd,
   1484					u32 queue)
   1485{
   1486	struct hns3_enet_tqp_vector *tx_vector, *rx_vector;
   1487	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1488	struct hnae3_handle *h = priv->ae_handle;
   1489	int queue_num = h->kinfo.num_tqps;
   1490
   1491	tx_vector = priv->ring[queue].tqp_vector;
   1492	rx_vector = priv->ring[queue_num + queue].tqp_vector;
   1493
   1494	tx_vector->tx_group.coal.adapt_enable =
   1495				cmd->use_adaptive_tx_coalesce;
   1496	rx_vector->rx_group.coal.adapt_enable =
   1497				cmd->use_adaptive_rx_coalesce;
   1498
   1499	tx_vector->tx_group.coal.int_gl = cmd->tx_coalesce_usecs;
   1500	rx_vector->rx_group.coal.int_gl = cmd->rx_coalesce_usecs;
   1501
   1502	tx_vector->tx_group.coal.int_ql = cmd->tx_max_coalesced_frames;
   1503	rx_vector->rx_group.coal.int_ql = cmd->rx_max_coalesced_frames;
   1504
   1505	hns3_set_vector_coalesce_tx_gl(tx_vector,
   1506				       tx_vector->tx_group.coal.int_gl);
   1507	hns3_set_vector_coalesce_rx_gl(rx_vector,
   1508				       rx_vector->rx_group.coal.int_gl);
   1509
   1510	hns3_set_vector_coalesce_rl(tx_vector, h->kinfo.int_rl_setting);
   1511	hns3_set_vector_coalesce_rl(rx_vector, h->kinfo.int_rl_setting);
   1512
   1513	if (tx_vector->tx_group.coal.ql_enable)
   1514		hns3_set_vector_coalesce_tx_ql(tx_vector,
   1515					       tx_vector->tx_group.coal.int_ql);
   1516	if (rx_vector->rx_group.coal.ql_enable)
   1517		hns3_set_vector_coalesce_rx_ql(rx_vector,
   1518					       rx_vector->rx_group.coal.int_ql);
   1519}
   1520
   1521static int hns3_set_coalesce(struct net_device *netdev,
   1522			     struct ethtool_coalesce *cmd,
   1523			     struct kernel_ethtool_coalesce *kernel_coal,
   1524			     struct netlink_ext_ack *extack)
   1525{
   1526	struct hnae3_handle *h = hns3_get_handle(netdev);
   1527	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1528	struct hns3_enet_coalesce *tx_coal = &priv->tx_coal;
   1529	struct hns3_enet_coalesce *rx_coal = &priv->rx_coal;
   1530	u16 queue_num = h->kinfo.num_tqps;
   1531	enum dim_cq_period_mode tx_mode;
   1532	enum dim_cq_period_mode rx_mode;
   1533	int ret;
   1534	int i;
   1535
   1536	if (hns3_nic_resetting(netdev))
   1537		return -EBUSY;
   1538
   1539	ret = hns3_check_coalesce_para(netdev, cmd, kernel_coal);
   1540	if (ret)
   1541		return ret;
   1542
   1543	h->kinfo.int_rl_setting =
   1544		hns3_rl_round_down(cmd->rx_coalesce_usecs_high);
   1545
   1546	tx_coal->adapt_enable = cmd->use_adaptive_tx_coalesce;
   1547	rx_coal->adapt_enable = cmd->use_adaptive_rx_coalesce;
   1548
   1549	tx_coal->int_gl = cmd->tx_coalesce_usecs;
   1550	rx_coal->int_gl = cmd->rx_coalesce_usecs;
   1551
   1552	tx_coal->int_ql = cmd->tx_max_coalesced_frames;
   1553	rx_coal->int_ql = cmd->rx_max_coalesced_frames;
   1554
   1555	for (i = 0; i < queue_num; i++)
   1556		hns3_set_coalesce_per_queue(netdev, cmd, i);
   1557
   1558	tx_mode = kernel_coal->use_cqe_mode_tx ?
   1559		  DIM_CQ_PERIOD_MODE_START_FROM_CQE :
   1560		  DIM_CQ_PERIOD_MODE_START_FROM_EQE;
   1561	rx_mode = kernel_coal->use_cqe_mode_rx ?
   1562		  DIM_CQ_PERIOD_MODE_START_FROM_CQE :
   1563		  DIM_CQ_PERIOD_MODE_START_FROM_EQE;
   1564	hns3_cq_period_mode_init(priv, tx_mode, rx_mode);
   1565
   1566	return 0;
   1567}
   1568
   1569static int hns3_get_regs_len(struct net_device *netdev)
   1570{
   1571	struct hnae3_handle *h = hns3_get_handle(netdev);
   1572
   1573	if (!h->ae_algo->ops->get_regs_len)
   1574		return -EOPNOTSUPP;
   1575
   1576	return h->ae_algo->ops->get_regs_len(h);
   1577}
   1578
   1579static void hns3_get_regs(struct net_device *netdev,
   1580			  struct ethtool_regs *cmd, void *data)
   1581{
   1582	struct hnae3_handle *h = hns3_get_handle(netdev);
   1583
   1584	if (!h->ae_algo->ops->get_regs)
   1585		return;
   1586
   1587	h->ae_algo->ops->get_regs(h, &cmd->version, data);
   1588}
   1589
   1590static int hns3_set_phys_id(struct net_device *netdev,
   1591			    enum ethtool_phys_id_state state)
   1592{
   1593	struct hnae3_handle *h = hns3_get_handle(netdev);
   1594
   1595	if (!h->ae_algo->ops->set_led_id)
   1596		return -EOPNOTSUPP;
   1597
   1598	return h->ae_algo->ops->set_led_id(h, state);
   1599}
   1600
   1601static u32 hns3_get_msglevel(struct net_device *netdev)
   1602{
   1603	struct hnae3_handle *h = hns3_get_handle(netdev);
   1604
   1605	return h->msg_enable;
   1606}
   1607
   1608static void hns3_set_msglevel(struct net_device *netdev, u32 msg_level)
   1609{
   1610	struct hnae3_handle *h = hns3_get_handle(netdev);
   1611
   1612	h->msg_enable = msg_level;
   1613}
   1614
   1615/* Translate local fec value into ethtool value. */
   1616static unsigned int loc_to_eth_fec(u8 loc_fec)
   1617{
   1618	u32 eth_fec = 0;
   1619
   1620	if (loc_fec & BIT(HNAE3_FEC_AUTO))
   1621		eth_fec |= ETHTOOL_FEC_AUTO;
   1622	if (loc_fec & BIT(HNAE3_FEC_RS))
   1623		eth_fec |= ETHTOOL_FEC_RS;
   1624	if (loc_fec & BIT(HNAE3_FEC_BASER))
   1625		eth_fec |= ETHTOOL_FEC_BASER;
   1626
   1627	/* if nothing is set, then FEC is off */
   1628	if (!eth_fec)
   1629		eth_fec = ETHTOOL_FEC_OFF;
   1630
   1631	return eth_fec;
   1632}
   1633
   1634/* Translate ethtool fec value into local value. */
   1635static unsigned int eth_to_loc_fec(unsigned int eth_fec)
   1636{
   1637	u32 loc_fec = 0;
   1638
   1639	if (eth_fec & ETHTOOL_FEC_OFF)
   1640		return loc_fec;
   1641
   1642	if (eth_fec & ETHTOOL_FEC_AUTO)
   1643		loc_fec |= BIT(HNAE3_FEC_AUTO);
   1644	if (eth_fec & ETHTOOL_FEC_RS)
   1645		loc_fec |= BIT(HNAE3_FEC_RS);
   1646	if (eth_fec & ETHTOOL_FEC_BASER)
   1647		loc_fec |= BIT(HNAE3_FEC_BASER);
   1648
   1649	return loc_fec;
   1650}
   1651
   1652static int hns3_get_fecparam(struct net_device *netdev,
   1653			     struct ethtool_fecparam *fec)
   1654{
   1655	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1656	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1657	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
   1658	u8 fec_ability;
   1659	u8 fec_mode;
   1660
   1661	if (!test_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps))
   1662		return -EOPNOTSUPP;
   1663
   1664	if (!ops->get_fec)
   1665		return -EOPNOTSUPP;
   1666
   1667	ops->get_fec(handle, &fec_ability, &fec_mode);
   1668
   1669	fec->fec = loc_to_eth_fec(fec_ability);
   1670	fec->active_fec = loc_to_eth_fec(fec_mode);
   1671
   1672	return 0;
   1673}
   1674
   1675static int hns3_set_fecparam(struct net_device *netdev,
   1676			     struct ethtool_fecparam *fec)
   1677{
   1678	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1679	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1680	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
   1681	u32 fec_mode;
   1682
   1683	if (!test_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps))
   1684		return -EOPNOTSUPP;
   1685
   1686	if (!ops->set_fec)
   1687		return -EOPNOTSUPP;
   1688	fec_mode = eth_to_loc_fec(fec->fec);
   1689
   1690	netif_dbg(handle, drv, netdev, "set fecparam: mode=%u\n", fec_mode);
   1691
   1692	return ops->set_fec(handle, fec_mode);
   1693}
   1694
   1695static int hns3_get_module_info(struct net_device *netdev,
   1696				struct ethtool_modinfo *modinfo)
   1697{
   1698#define HNS3_SFF_8636_V1_3 0x03
   1699
   1700	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1701	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1702	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
   1703	struct hns3_sfp_type sfp_type;
   1704	int ret;
   1705
   1706	if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
   1707	    !ops->get_module_eeprom)
   1708		return -EOPNOTSUPP;
   1709
   1710	memset(&sfp_type, 0, sizeof(sfp_type));
   1711	ret = ops->get_module_eeprom(handle, 0, sizeof(sfp_type) / sizeof(u8),
   1712				     (u8 *)&sfp_type);
   1713	if (ret)
   1714		return ret;
   1715
   1716	switch (sfp_type.type) {
   1717	case SFF8024_ID_SFP:
   1718		modinfo->type = ETH_MODULE_SFF_8472;
   1719		modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
   1720		break;
   1721	case SFF8024_ID_QSFP_8438:
   1722		modinfo->type = ETH_MODULE_SFF_8436;
   1723		modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
   1724		break;
   1725	case SFF8024_ID_QSFP_8436_8636:
   1726		if (sfp_type.ext_type < HNS3_SFF_8636_V1_3) {
   1727			modinfo->type = ETH_MODULE_SFF_8436;
   1728			modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
   1729		} else {
   1730			modinfo->type = ETH_MODULE_SFF_8636;
   1731			modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
   1732		}
   1733		break;
   1734	case SFF8024_ID_QSFP28_8636:
   1735		modinfo->type = ETH_MODULE_SFF_8636;
   1736		modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
   1737		break;
   1738	default:
   1739		netdev_err(netdev, "Optical module unknown: %#x\n",
   1740			   sfp_type.type);
   1741		return -EINVAL;
   1742	}
   1743
   1744	return 0;
   1745}
   1746
   1747static int hns3_get_module_eeprom(struct net_device *netdev,
   1748				  struct ethtool_eeprom *ee, u8 *data)
   1749{
   1750	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1751	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
   1752	const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
   1753
   1754	if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
   1755	    !ops->get_module_eeprom)
   1756		return -EOPNOTSUPP;
   1757
   1758	if (!ee->len)
   1759		return -EINVAL;
   1760
   1761	memset(data, 0, ee->len);
   1762
   1763	return ops->get_module_eeprom(handle, ee->offset, ee->len, data);
   1764}
   1765
   1766static u32 hns3_get_priv_flags(struct net_device *netdev)
   1767{
   1768	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1769
   1770	return handle->priv_flags;
   1771}
   1772
   1773static int hns3_check_priv_flags(struct hnae3_handle *h, u32 changed)
   1774{
   1775	u32 i;
   1776
   1777	for (i = 0; i < HNAE3_PFLAG_MAX; i++)
   1778		if ((changed & BIT(i)) && !test_bit(i, &h->supported_pflags)) {
   1779			netdev_err(h->netdev, "%s is unsupported\n",
   1780				   hns3_priv_flags[i].name);
   1781			return -EOPNOTSUPP;
   1782		}
   1783
   1784	return 0;
   1785}
   1786
   1787static int hns3_set_priv_flags(struct net_device *netdev, u32 pflags)
   1788{
   1789	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1790	u32 changed = pflags ^ handle->priv_flags;
   1791	int ret;
   1792	u32 i;
   1793
   1794	ret = hns3_check_priv_flags(handle, changed);
   1795	if (ret)
   1796		return ret;
   1797
   1798	for (i = 0; i < HNAE3_PFLAG_MAX; i++) {
   1799		if (changed & BIT(i)) {
   1800			bool enable = !(handle->priv_flags & BIT(i));
   1801
   1802			if (enable)
   1803				handle->priv_flags |= BIT(i);
   1804			else
   1805				handle->priv_flags &= ~BIT(i);
   1806			hns3_priv_flags[i].handler(netdev, enable);
   1807		}
   1808	}
   1809
   1810	return 0;
   1811}
   1812
   1813static int hns3_get_tunable(struct net_device *netdev,
   1814			    const struct ethtool_tunable *tuna,
   1815			    void *data)
   1816{
   1817	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1818	struct hnae3_handle *h = priv->ae_handle;
   1819	int ret = 0;
   1820
   1821	switch (tuna->id) {
   1822	case ETHTOOL_TX_COPYBREAK:
   1823		/* all the tx rings have the same tx_copybreak */
   1824		*(u32 *)data = priv->tx_copybreak;
   1825		break;
   1826	case ETHTOOL_RX_COPYBREAK:
   1827		*(u32 *)data = priv->rx_copybreak;
   1828		break;
   1829	case ETHTOOL_TX_COPYBREAK_BUF_SIZE:
   1830		*(u32 *)data = h->kinfo.tx_spare_buf_size;
   1831		break;
   1832	default:
   1833		ret = -EOPNOTSUPP;
   1834		break;
   1835	}
   1836
   1837	return ret;
   1838}
   1839
   1840static int hns3_set_tx_spare_buf_size(struct net_device *netdev,
   1841				      u32 data)
   1842{
   1843	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1844	struct hnae3_handle *h = priv->ae_handle;
   1845	int ret;
   1846
   1847	h->kinfo.tx_spare_buf_size = data;
   1848
   1849	ret = hns3_reset_notify(h, HNAE3_DOWN_CLIENT);
   1850	if (ret)
   1851		return ret;
   1852
   1853	ret = hns3_reset_notify(h, HNAE3_UNINIT_CLIENT);
   1854	if (ret)
   1855		return ret;
   1856
   1857	ret = hns3_reset_notify(h, HNAE3_INIT_CLIENT);
   1858	if (ret)
   1859		return ret;
   1860
   1861	ret = hns3_reset_notify(h, HNAE3_UP_CLIENT);
   1862	if (ret)
   1863		hns3_reset_notify(h, HNAE3_UNINIT_CLIENT);
   1864
   1865	return ret;
   1866}
   1867
   1868static int hns3_set_tunable(struct net_device *netdev,
   1869			    const struct ethtool_tunable *tuna,
   1870			    const void *data)
   1871{
   1872	struct hns3_nic_priv *priv = netdev_priv(netdev);
   1873	u32 old_tx_spare_buf_size, new_tx_spare_buf_size;
   1874	struct hnae3_handle *h = priv->ae_handle;
   1875	int i, ret = 0;
   1876
   1877	if (hns3_nic_resetting(netdev) || !priv->ring) {
   1878		netdev_err(netdev, "failed to set tunable value, dev resetting!");
   1879		return -EBUSY;
   1880	}
   1881
   1882	switch (tuna->id) {
   1883	case ETHTOOL_TX_COPYBREAK:
   1884		priv->tx_copybreak = *(u32 *)data;
   1885
   1886		for (i = 0; i < h->kinfo.num_tqps; i++)
   1887			priv->ring[i].tx_copybreak = priv->tx_copybreak;
   1888
   1889		break;
   1890	case ETHTOOL_RX_COPYBREAK:
   1891		priv->rx_copybreak = *(u32 *)data;
   1892
   1893		for (i = h->kinfo.num_tqps; i < h->kinfo.num_tqps * 2; i++)
   1894			priv->ring[i].rx_copybreak = priv->rx_copybreak;
   1895
   1896		break;
   1897	case ETHTOOL_TX_COPYBREAK_BUF_SIZE:
   1898		old_tx_spare_buf_size = h->kinfo.tx_spare_buf_size;
   1899		new_tx_spare_buf_size = *(u32 *)data;
   1900		netdev_info(netdev, "request to set tx spare buf size from %u to %u\n",
   1901			    old_tx_spare_buf_size, new_tx_spare_buf_size);
   1902		ret = hns3_set_tx_spare_buf_size(netdev, new_tx_spare_buf_size);
   1903		if (ret ||
   1904		    (!priv->ring->tx_spare && new_tx_spare_buf_size != 0)) {
   1905			int ret1;
   1906
   1907			netdev_warn(netdev, "change tx spare buf size fail, revert to old value\n");
   1908			ret1 = hns3_set_tx_spare_buf_size(netdev,
   1909							  old_tx_spare_buf_size);
   1910			if (ret1) {
   1911				netdev_err(netdev, "revert to old tx spare buf size fail\n");
   1912				return ret1;
   1913			}
   1914
   1915			return ret;
   1916		}
   1917
   1918		if (!priv->ring->tx_spare)
   1919			netdev_info(netdev, "the active tx spare buf size is 0, disable tx spare buffer\n");
   1920		else
   1921			netdev_info(netdev, "the active tx spare buf size is %u, due to page order\n",
   1922				    priv->ring->tx_spare->len);
   1923
   1924		break;
   1925	default:
   1926		ret = -EOPNOTSUPP;
   1927		break;
   1928	}
   1929
   1930	return ret;
   1931}
   1932
   1933#define HNS3_ETHTOOL_COALESCE	(ETHTOOL_COALESCE_USECS |		\
   1934				 ETHTOOL_COALESCE_USE_ADAPTIVE |	\
   1935				 ETHTOOL_COALESCE_RX_USECS_HIGH |	\
   1936				 ETHTOOL_COALESCE_TX_USECS_HIGH |	\
   1937				 ETHTOOL_COALESCE_MAX_FRAMES |		\
   1938				 ETHTOOL_COALESCE_USE_CQE)
   1939
   1940#define HNS3_ETHTOOL_RING	(ETHTOOL_RING_USE_RX_BUF_LEN |		\
   1941				 ETHTOOL_RING_USE_TX_PUSH)
   1942
   1943static int hns3_get_ts_info(struct net_device *netdev,
   1944			    struct ethtool_ts_info *info)
   1945{
   1946	struct hnae3_handle *handle = hns3_get_handle(netdev);
   1947
   1948	if (handle->ae_algo->ops->get_ts_info)
   1949		return handle->ae_algo->ops->get_ts_info(handle, info);
   1950
   1951	return ethtool_op_get_ts_info(netdev, info);
   1952}
   1953
   1954static const struct hns3_ethtool_link_ext_state_mapping
   1955hns3_link_ext_state_map[] = {
   1956	{1, ETHTOOL_LINK_EXT_STATE_AUTONEG,
   1957		ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD},
   1958	{2, ETHTOOL_LINK_EXT_STATE_AUTONEG,
   1959		ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED},
   1960
   1961	{256, ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE,
   1962		ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT},
   1963	{257, ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE,
   1964		ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY},
   1965	{512, ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE,
   1966		ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT},
   1967
   1968	{513, ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH,
   1969		ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK},
   1970	{514, ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH,
   1971		ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED},
   1972	{515, ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH,
   1973		ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED},
   1974
   1975	{768, ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY,
   1976		ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS},
   1977	{769, ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY,
   1978		ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST},
   1979	{770, ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY,
   1980		ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS},
   1981
   1982	{1024, ETHTOOL_LINK_EXT_STATE_NO_CABLE, 0},
   1983	{1025, ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE,
   1984		ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE},
   1985
   1986	{1026, ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE, 0},
   1987};
   1988
   1989static int hns3_get_link_ext_state(struct net_device *netdev,
   1990				   struct ethtool_link_ext_state_info *info)
   1991{
   1992	const struct hns3_ethtool_link_ext_state_mapping *map;
   1993	struct hnae3_handle *h = hns3_get_handle(netdev);
   1994	u32 status_code, i;
   1995	int ret;
   1996
   1997	if (netif_carrier_ok(netdev))
   1998		return -ENODATA;
   1999
   2000	if (!h->ae_algo->ops->get_link_diagnosis_info)
   2001		return -EOPNOTSUPP;
   2002
   2003	ret = h->ae_algo->ops->get_link_diagnosis_info(h, &status_code);
   2004	if (ret)
   2005		return ret;
   2006
   2007	for (i = 0; i < ARRAY_SIZE(hns3_link_ext_state_map); i++) {
   2008		map = &hns3_link_ext_state_map[i];
   2009		if (map->status_code == status_code) {
   2010			info->link_ext_state = map->link_ext_state;
   2011			info->__link_ext_substate = map->link_ext_substate;
   2012			return 0;
   2013		}
   2014	}
   2015
   2016	return -ENODATA;
   2017}
   2018
   2019static const struct ethtool_ops hns3vf_ethtool_ops = {
   2020	.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
   2021	.supported_ring_params = HNS3_ETHTOOL_RING,
   2022	.get_drvinfo = hns3_get_drvinfo,
   2023	.get_ringparam = hns3_get_ringparam,
   2024	.set_ringparam = hns3_set_ringparam,
   2025	.get_strings = hns3_get_strings,
   2026	.get_ethtool_stats = hns3_get_stats,
   2027	.get_sset_count = hns3_get_sset_count,
   2028	.get_rxnfc = hns3_get_rxnfc,
   2029	.set_rxnfc = hns3_set_rxnfc,
   2030	.get_rxfh_key_size = hns3_get_rss_key_size,
   2031	.get_rxfh_indir_size = hns3_get_rss_indir_size,
   2032	.get_rxfh = hns3_get_rss,
   2033	.set_rxfh = hns3_set_rss,
   2034	.get_link_ksettings = hns3_get_link_ksettings,
   2035	.get_channels = hns3_get_channels,
   2036	.set_channels = hns3_set_channels,
   2037	.get_coalesce = hns3_get_coalesce,
   2038	.set_coalesce = hns3_set_coalesce,
   2039	.get_regs_len = hns3_get_regs_len,
   2040	.get_regs = hns3_get_regs,
   2041	.get_link = hns3_get_link,
   2042	.get_msglevel = hns3_get_msglevel,
   2043	.set_msglevel = hns3_set_msglevel,
   2044	.get_priv_flags = hns3_get_priv_flags,
   2045	.set_priv_flags = hns3_set_priv_flags,
   2046	.get_tunable = hns3_get_tunable,
   2047	.set_tunable = hns3_set_tunable,
   2048	.reset = hns3_set_reset,
   2049};
   2050
   2051static const struct ethtool_ops hns3_ethtool_ops = {
   2052	.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
   2053	.supported_ring_params = HNS3_ETHTOOL_RING,
   2054	.self_test = hns3_self_test,
   2055	.get_drvinfo = hns3_get_drvinfo,
   2056	.get_link = hns3_get_link,
   2057	.get_ringparam = hns3_get_ringparam,
   2058	.set_ringparam = hns3_set_ringparam,
   2059	.get_pauseparam = hns3_get_pauseparam,
   2060	.set_pauseparam = hns3_set_pauseparam,
   2061	.get_strings = hns3_get_strings,
   2062	.get_ethtool_stats = hns3_get_stats,
   2063	.get_sset_count = hns3_get_sset_count,
   2064	.get_rxnfc = hns3_get_rxnfc,
   2065	.set_rxnfc = hns3_set_rxnfc,
   2066	.get_rxfh_key_size = hns3_get_rss_key_size,
   2067	.get_rxfh_indir_size = hns3_get_rss_indir_size,
   2068	.get_rxfh = hns3_get_rss,
   2069	.set_rxfh = hns3_set_rss,
   2070	.get_link_ksettings = hns3_get_link_ksettings,
   2071	.set_link_ksettings = hns3_set_link_ksettings,
   2072	.nway_reset = hns3_nway_reset,
   2073	.get_channels = hns3_get_channels,
   2074	.set_channels = hns3_set_channels,
   2075	.get_coalesce = hns3_get_coalesce,
   2076	.set_coalesce = hns3_set_coalesce,
   2077	.get_regs_len = hns3_get_regs_len,
   2078	.get_regs = hns3_get_regs,
   2079	.set_phys_id = hns3_set_phys_id,
   2080	.get_msglevel = hns3_get_msglevel,
   2081	.set_msglevel = hns3_set_msglevel,
   2082	.get_fecparam = hns3_get_fecparam,
   2083	.set_fecparam = hns3_set_fecparam,
   2084	.get_module_info = hns3_get_module_info,
   2085	.get_module_eeprom = hns3_get_module_eeprom,
   2086	.get_priv_flags = hns3_get_priv_flags,
   2087	.set_priv_flags = hns3_set_priv_flags,
   2088	.get_ts_info = hns3_get_ts_info,
   2089	.get_tunable = hns3_get_tunable,
   2090	.set_tunable = hns3_set_tunable,
   2091	.reset = hns3_set_reset,
   2092	.get_link_ext_state = hns3_get_link_ext_state,
   2093};
   2094
   2095void hns3_ethtool_set_ops(struct net_device *netdev)
   2096{
   2097	struct hnae3_handle *h = hns3_get_handle(netdev);
   2098
   2099	if (h->flags & HNAE3_SUPPORT_VF)
   2100		netdev->ethtool_ops = &hns3vf_ethtool_ops;
   2101	else
   2102		netdev->ethtool_ops = &hns3_ethtool_ops;
   2103}