1 /*
2  * Copyright (c) 2014-2015 Hisilicon Limited.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9 
10 #include <linux/etherdevice.h>
11 #include <linux/interrupt.h>
12 #include <linux/module.h>
13 #include <linux/platform_device.h>
14 
15 #include "hns_enet.h"
16 
17 #define HNS_PHY_PAGE_MDIX	0
18 #define HNS_PHY_PAGE_LED	3
19 #define HNS_PHY_PAGE_COPPER	0
20 
21 #define HNS_PHY_PAGE_REG	22	/* Page Selection Reg. */
22 #define HNS_PHY_CSC_REG		16	/* Copper Specific Control Register */
23 #define HNS_PHY_CSS_REG		17	/* Copper Specific Status Register */
24 #define HNS_LED_FC_REG		16	/* LED Function Control Reg. */
25 #define HNS_LED_PC_REG		17	/* LED Polarity Control Reg. */
26 
27 #define HNS_LED_FORCE_ON	9
28 #define HNS_LED_FORCE_OFF	8
29 
30 #define HNS_CHIP_VERSION 660
31 #define HNS_NET_STATS_CNT 26
32 
33 #define PHY_MDIX_CTRL_S		(5)
34 #define PHY_MDIX_CTRL_M		(3 << PHY_MDIX_CTRL_S)
35 
36 #define PHY_MDIX_STATUS_B	(6)
37 #define PHY_SPEED_DUP_RESOLVE_B	(11)
38 
39 /**
40  *hns_nic_get_link - get current link status
41  *@net_dev: net_device
42  *retuen 0 - success , negative --fail
43  */
44 static u32 hns_nic_get_link(struct net_device *net_dev)
45 {
46 	struct hns_nic_priv *priv = netdev_priv(net_dev);
47 	u32 link_stat = priv->link;
48 	struct hnae_handle *h;
49 
50 	assert(priv && priv->ae_handle);
51 	h = priv->ae_handle;
52 
53 	if (priv->phy) {
54 		if (!genphy_update_link(priv->phy))
55 			link_stat = priv->phy->link;
56 		else
57 			link_stat = 0;
58 	}
59 
60 	if (h->dev && h->dev->ops && h->dev->ops->get_status)
61 		link_stat = link_stat && h->dev->ops->get_status(h);
62 	else
63 		link_stat = 0;
64 
65 	return link_stat;
66 }
67 
68 static void hns_get_mdix_mode(struct net_device *net_dev,
69 			      struct ethtool_cmd *cmd)
70 {
71 	int mdix_ctrl, mdix, retval, is_resolved;
72 	struct hns_nic_priv *priv = netdev_priv(net_dev);
73 	struct phy_device *phy_dev = priv->phy;
74 
75 	if (!phy_dev || !phy_dev->bus) {
76 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
77 		cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
78 		return;
79 	}
80 
81 	(void)mdiobus_write(phy_dev->bus, phy_dev->addr, HNS_PHY_PAGE_REG,
82 			    HNS_PHY_PAGE_MDIX);
83 
84 	retval = mdiobus_read(phy_dev->bus, phy_dev->addr, HNS_PHY_CSC_REG);
85 	mdix_ctrl = hnae_get_field(retval, PHY_MDIX_CTRL_M, PHY_MDIX_CTRL_S);
86 
87 	retval = mdiobus_read(phy_dev->bus, phy_dev->addr, HNS_PHY_CSS_REG);
88 	mdix = hnae_get_bit(retval, PHY_MDIX_STATUS_B);
89 	is_resolved = hnae_get_bit(retval, PHY_SPEED_DUP_RESOLVE_B);
90 
91 	(void)mdiobus_write(phy_dev->bus, phy_dev->addr, HNS_PHY_PAGE_REG,
92 			    HNS_PHY_PAGE_COPPER);
93 
94 	switch (mdix_ctrl) {
95 	case 0x0:
96 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI;
97 		break;
98 	case 0x1:
99 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_X;
100 		break;
101 	case 0x3:
102 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_AUTO;
103 		break;
104 	default:
105 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
106 		break;
107 	}
108 
109 	if (!is_resolved)
110 		cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
111 	else if (mdix)
112 		cmd->eth_tp_mdix = ETH_TP_MDI_X;
113 	else
114 		cmd->eth_tp_mdix = ETH_TP_MDI;
115 }
116 
117 /**
118  *hns_nic_get_settings - implement ethtool get settings
119  *@net_dev: net_device
120  *@cmd: ethtool_cmd
121  *retuen 0 - success , negative --fail
122  */
123 static int hns_nic_get_settings(struct net_device *net_dev,
124 				struct ethtool_cmd *cmd)
125 {
126 	struct hns_nic_priv *priv = netdev_priv(net_dev);
127 	struct hnae_handle *h;
128 	u32 link_stat;
129 	int ret;
130 	u8 duplex;
131 	u16 speed;
132 
133 	if (!priv || !priv->ae_handle)
134 		return -ESRCH;
135 
136 	h = priv->ae_handle;
137 	if (!h->dev || !h->dev->ops || !h->dev->ops->get_info)
138 		return -ESRCH;
139 
140 	ret = h->dev->ops->get_info(h, NULL, &speed, &duplex);
141 	if (ret < 0) {
142 		netdev_err(net_dev, "%s get_info error!\n", __func__);
143 		return -EINVAL;
144 	}
145 
146 	/* When there is no phy, autoneg is off. */
147 	cmd->autoneg = false;
148 	ethtool_cmd_speed_set(cmd, speed);
149 	cmd->duplex = duplex;
150 
151 	if (priv->phy)
152 		(void)phy_ethtool_gset(priv->phy, cmd);
153 
154 	link_stat = hns_nic_get_link(net_dev);
155 	if (!link_stat) {
156 		ethtool_cmd_speed_set(cmd, (u32)SPEED_UNKNOWN);
157 		cmd->duplex = DUPLEX_UNKNOWN;
158 	}
159 
160 	if (cmd->autoneg)
161 		cmd->advertising |= ADVERTISED_Autoneg;
162 
163 	cmd->supported |= h->if_support;
164 	if (h->phy_if == PHY_INTERFACE_MODE_SGMII) {
165 		cmd->supported |= SUPPORTED_TP;
166 		cmd->advertising |= ADVERTISED_1000baseT_Full;
167 	} else if (h->phy_if == PHY_INTERFACE_MODE_XGMII) {
168 		cmd->supported |= SUPPORTED_FIBRE;
169 		cmd->advertising |= ADVERTISED_10000baseKR_Full;
170 	}
171 
172 	if (h->port_type == HNAE_PORT_SERVICE) {
173 		cmd->port = PORT_FIBRE;
174 		cmd->supported |= SUPPORTED_Pause;
175 	} else {
176 		cmd->port = PORT_TP;
177 	}
178 
179 	cmd->transceiver = XCVR_EXTERNAL;
180 	cmd->mdio_support = (ETH_MDIO_SUPPORTS_C45 | ETH_MDIO_SUPPORTS_C22);
181 	hns_get_mdix_mode(net_dev, cmd);
182 
183 	return 0;
184 }
185 
186 /**
187  *hns_nic_set_settings - implement ethtool set settings
188  *@net_dev: net_device
189  *@cmd: ethtool_cmd
190  *retuen 0 - success , negative --fail
191  */
192 static int hns_nic_set_settings(struct net_device *net_dev,
193 				struct ethtool_cmd *cmd)
194 {
195 	struct hns_nic_priv *priv = netdev_priv(net_dev);
196 	struct hnae_handle *h;
197 	u32 speed;
198 
199 	if (!netif_running(net_dev))
200 		return -ESRCH;
201 
202 	if (!priv || !priv->ae_handle || !priv->ae_handle->dev ||
203 	    !priv->ae_handle->dev->ops)
204 		return -ENODEV;
205 
206 	h = priv->ae_handle;
207 	speed = ethtool_cmd_speed(cmd);
208 
209 	if (h->phy_if == PHY_INTERFACE_MODE_XGMII) {
210 		if (cmd->autoneg == AUTONEG_ENABLE || speed != SPEED_10000 ||
211 		    cmd->duplex != DUPLEX_FULL)
212 			return -EINVAL;
213 	} else if (h->phy_if == PHY_INTERFACE_MODE_SGMII) {
214 		if (!priv->phy && cmd->autoneg == AUTONEG_ENABLE)
215 			return -EINVAL;
216 
217 		if (speed == SPEED_1000 && cmd->duplex == DUPLEX_HALF)
218 			return -EINVAL;
219 		if (priv->phy)
220 			return phy_ethtool_sset(priv->phy, cmd);
221 
222 		if ((speed != SPEED_10 && speed != SPEED_100 &&
223 		     speed != SPEED_1000) || (cmd->duplex != DUPLEX_HALF &&
224 		     cmd->duplex != DUPLEX_FULL))
225 			return -EINVAL;
226 	} else {
227 		netdev_err(net_dev, "Not supported!");
228 		return -ENOTSUPP;
229 	}
230 
231 	if (h->dev->ops->adjust_link) {
232 		h->dev->ops->adjust_link(h, (int)speed, cmd->duplex);
233 		return 0;
234 	}
235 
236 	netdev_err(net_dev, "Not supported!");
237 	return -ENOTSUPP;
238 }
239 
240 static const char hns_nic_test_strs[][ETH_GSTRING_LEN] = {
241 	"Mac    Loopback test",
242 	"Serdes Loopback test",
243 	"Phy    Loopback test"
244 };
245 
246 static int hns_nic_config_phy_loopback(struct phy_device *phy_dev, u8 en)
247 {
248 #define COPPER_CONTROL_REG 0
249 #define PHY_LOOP_BACK BIT(14)
250 	u16 val = 0;
251 
252 	if (phy_dev->is_c45) /* c45 branch adding for XGE PHY */
253 		return -ENOTSUPP;
254 
255 	if (en) {
256 		/* speed : 1000M */
257 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
258 				    HNS_PHY_PAGE_REG, 2);
259 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
260 				    21, 0x1046);
261 		/* Force Master */
262 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
263 				    9, 0x1F00);
264 		/* Soft-reset */
265 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
266 				    0, 0x9140);
267 		/* If autoneg disabled,two soft-reset operations */
268 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
269 				    0, 0x9140);
270 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
271 				    22, 0xFA);
272 
273 		/* Default is 0x0400 */
274 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
275 				    1, 0x418);
276 
277 		/* Force 1000M Link, Default is 0x0200 */
278 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
279 				    7, 0x20C);
280 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
281 				    22, 0);
282 
283 		/* Enable MAC loop-back */
284 		val = (u16)mdiobus_read(phy_dev->bus, phy_dev->addr,
285 					COPPER_CONTROL_REG);
286 		val |= PHY_LOOP_BACK;
287 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
288 				    COPPER_CONTROL_REG, val);
289 	} else {
290 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
291 				    22, 0xFA);
292 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
293 				    1, 0x400);
294 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
295 				    7, 0x200);
296 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
297 				    22, 0);
298 
299 		val = (u16)mdiobus_read(phy_dev->bus, phy_dev->addr,
300 					COPPER_CONTROL_REG);
301 		val &= ~PHY_LOOP_BACK;
302 		(void)mdiobus_write(phy_dev->bus, phy_dev->addr,
303 				    COPPER_CONTROL_REG, val);
304 	}
305 	return 0;
306 }
307 
308 static int __lb_setup(struct net_device *ndev,
309 		      enum hnae_loop loop)
310 {
311 	int ret = 0;
312 	struct hns_nic_priv *priv = netdev_priv(ndev);
313 	struct phy_device *phy_dev = priv->phy;
314 	struct hnae_handle *h = priv->ae_handle;
315 
316 	switch (loop) {
317 	case MAC_INTERNALLOOP_PHY:
318 		if ((phy_dev) && (!phy_dev->is_c45))
319 			ret = hns_nic_config_phy_loopback(phy_dev, 0x1);
320 		break;
321 	case MAC_INTERNALLOOP_MAC:
322 		if ((h->dev->ops->set_loopback) &&
323 		    (priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII))
324 			ret = h->dev->ops->set_loopback(h, loop, 0x1);
325 		break;
326 	case MAC_INTERNALLOOP_SERDES:
327 		if (h->dev->ops->set_loopback)
328 			ret = h->dev->ops->set_loopback(h, loop, 0x1);
329 		break;
330 	case MAC_LOOP_NONE:
331 		if ((phy_dev) && (!phy_dev->is_c45))
332 			ret |= hns_nic_config_phy_loopback(phy_dev, 0x0);
333 
334 		if (h->dev->ops->set_loopback) {
335 			if (priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII)
336 				ret |= h->dev->ops->set_loopback(h,
337 					MAC_INTERNALLOOP_MAC, 0x0);
338 
339 			ret |= h->dev->ops->set_loopback(h,
340 				MAC_INTERNALLOOP_SERDES, 0x0);
341 		}
342 		break;
343 	default:
344 		ret = -EINVAL;
345 		break;
346 	}
347 
348 	return ret;
349 }
350 
351 static int __lb_up(struct net_device *ndev,
352 		   enum hnae_loop loop_mode)
353 {
354 	struct hns_nic_priv *priv = netdev_priv(ndev);
355 	struct hnae_handle *h = priv->ae_handle;
356 	int speed, duplex;
357 	int ret;
358 
359 	hns_nic_net_reset(ndev);
360 
361 	if (priv->phy) {
362 		phy_disconnect(priv->phy);
363 		msleep(100);
364 
365 		ret = hns_nic_init_phy(ndev, h);
366 		if (ret)
367 			return ret;
368 	}
369 
370 	ret = __lb_setup(ndev, loop_mode);
371 	if (ret)
372 		return ret;
373 
374 	msleep(100);
375 
376 	ret = h->dev->ops->start ? h->dev->ops->start(h) : 0;
377 	if (ret)
378 		return ret;
379 
380 	if (priv->phy)
381 		phy_start(priv->phy);
382 
383 	/* link adjust duplex*/
384 	if (priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII)
385 		speed = 1000;
386 	else
387 		speed = 10000;
388 	duplex = 1;
389 
390 	h->dev->ops->adjust_link(h, speed, duplex);
391 
392 	return 0;
393 }
394 
395 static void __lb_other_process(struct hns_nic_ring_data *ring_data,
396 			       struct sk_buff *skb)
397 {
398 	struct net_device *ndev;
399 	struct hnae_ring *ring;
400 	struct netdev_queue *dev_queue;
401 	struct sk_buff *new_skb;
402 	unsigned int frame_size;
403 	int check_ok;
404 	u32 i;
405 	char buff[33]; /* 32B data and the last character '\0' */
406 
407 	if (!ring_data) { /* Just for doing create frame*/
408 		frame_size = skb->len;
409 		memset(skb->data, 0xFF, frame_size);
410 		frame_size &= ~1ul;
411 		memset(&skb->data[frame_size / 2], 0xAA, frame_size / 2 - 1);
412 		memset(&skb->data[frame_size / 2 + 10], 0xBE,
413 		       frame_size / 2 - 11);
414 		memset(&skb->data[frame_size / 2 + 12], 0xAF,
415 		       frame_size / 2 - 13);
416 		return;
417 	}
418 
419 	ring = ring_data->ring;
420 	ndev = ring_data->napi.dev;
421 	if (is_tx_ring(ring)) { /* for tx queue reset*/
422 		dev_queue = netdev_get_tx_queue(ndev, ring_data->queue_index);
423 		netdev_tx_reset_queue(dev_queue);
424 		return;
425 	}
426 
427 	frame_size = skb->len;
428 	frame_size &= ~1ul;
429 	/* for mutl buffer*/
430 	new_skb = skb_copy(skb, GFP_ATOMIC);
431 	dev_kfree_skb_any(skb);
432 	skb = new_skb;
433 
434 	check_ok = 0;
435 	if (*(skb->data + 10) == 0xFF) { /* for rx check frame*/
436 		if ((*(skb->data + frame_size / 2 + 10) == 0xBE) &&
437 		    (*(skb->data + frame_size / 2 + 12) == 0xAF))
438 			check_ok = 1;
439 	}
440 
441 	if (check_ok) {
442 		ndev->stats.rx_packets++;
443 		ndev->stats.rx_bytes += skb->len;
444 	} else {
445 		ndev->stats.rx_frame_errors++;
446 		for (i = 0; i < skb->len; i++) {
447 			snprintf(buff + i % 16 * 2, 3, /* tailing \0*/
448 				 "%02x", *(skb->data + i));
449 			if ((i % 16 == 15) || (i == skb->len - 1))
450 				pr_info("%s\n", buff);
451 		}
452 	}
453 	dev_kfree_skb_any(skb);
454 }
455 
456 static int __lb_clean_rings(struct hns_nic_priv *priv,
457 			    int ringid0, int ringid1, int budget)
458 {
459 	int i, ret;
460 	struct hns_nic_ring_data *ring_data;
461 	struct net_device *ndev = priv->netdev;
462 	unsigned long rx_packets = ndev->stats.rx_packets;
463 	unsigned long rx_bytes = ndev->stats.rx_bytes;
464 	unsigned long rx_frame_errors = ndev->stats.rx_frame_errors;
465 
466 	for (i = ringid0; i <= ringid1; i++) {
467 		ring_data = &priv->ring_data[i];
468 		(void)ring_data->poll_one(ring_data,
469 					  budget, __lb_other_process);
470 	}
471 	ret = (int)(ndev->stats.rx_packets - rx_packets);
472 	ndev->stats.rx_packets = rx_packets;
473 	ndev->stats.rx_bytes = rx_bytes;
474 	ndev->stats.rx_frame_errors = rx_frame_errors;
475 	return ret;
476 }
477 
478 /**
479  * nic_run_loopback_test -  run loopback test
480  * @nic_dev: net device
481  * @loopback_type: loopback type
482  */
483 static int __lb_run_test(struct net_device *ndev,
484 			 enum hnae_loop loop_mode)
485 {
486 #define NIC_LB_TEST_PKT_NUM_PER_CYCLE 1
487 #define NIC_LB_TEST_RING_ID 0
488 #define NIC_LB_TEST_FRAME_SIZE 128
489 /* nic loopback test err  */
490 #define NIC_LB_TEST_NO_MEM_ERR 1
491 #define NIC_LB_TEST_TX_CNT_ERR 2
492 #define NIC_LB_TEST_RX_CNT_ERR 3
493 #define NIC_LB_TEST_RX_PKG_ERR 4
494 	struct hns_nic_priv *priv = netdev_priv(ndev);
495 	struct hnae_handle *h = priv->ae_handle;
496 	int i, j, lc, good_cnt, ret_val = 0;
497 	unsigned int size;
498 	netdev_tx_t tx_ret_val;
499 	struct sk_buff *skb;
500 
501 	size = NIC_LB_TEST_FRAME_SIZE;
502 	/* allocate test skb */
503 	skb = alloc_skb(size, GFP_KERNEL);
504 	if (!skb)
505 		return NIC_LB_TEST_NO_MEM_ERR;
506 
507 	/* place data into test skb */
508 	(void)skb_put(skb, size);
509 	__lb_other_process(NULL, skb);
510 	skb->queue_mapping = NIC_LB_TEST_RING_ID;
511 
512 	lc = 1;
513 	for (j = 0; j < lc; j++) {
514 		/* reset count of good packets */
515 		good_cnt = 0;
516 		/* place 64 packets on the transmit queue*/
517 		for (i = 0; i < NIC_LB_TEST_PKT_NUM_PER_CYCLE; i++) {
518 			(void)skb_get(skb);
519 
520 			tx_ret_val = (netdev_tx_t)hns_nic_net_xmit_hw(
521 				ndev, skb,
522 				&tx_ring_data(priv, skb->queue_mapping));
523 			if (tx_ret_val == NETDEV_TX_OK)
524 				good_cnt++;
525 			else
526 				break;
527 		}
528 		if (good_cnt != NIC_LB_TEST_PKT_NUM_PER_CYCLE) {
529 			ret_val = NIC_LB_TEST_TX_CNT_ERR;
530 			dev_err(priv->dev, "%s sent fail, cnt=0x%x, budget=0x%x\n",
531 				hns_nic_test_strs[loop_mode], good_cnt,
532 				NIC_LB_TEST_PKT_NUM_PER_CYCLE);
533 			break;
534 		}
535 
536 		/* allow 100 milliseconds for packets to go from Tx to Rx */
537 		msleep(100);
538 
539 		good_cnt = __lb_clean_rings(priv,
540 					    h->q_num, h->q_num * 2 - 1,
541 					    NIC_LB_TEST_PKT_NUM_PER_CYCLE);
542 		if (good_cnt != NIC_LB_TEST_PKT_NUM_PER_CYCLE) {
543 			ret_val = NIC_LB_TEST_RX_CNT_ERR;
544 			dev_err(priv->dev, "%s recv fail, cnt=0x%x, budget=0x%x\n",
545 				hns_nic_test_strs[loop_mode], good_cnt,
546 				NIC_LB_TEST_PKT_NUM_PER_CYCLE);
547 			break;
548 		}
549 		(void)__lb_clean_rings(priv,
550 				       NIC_LB_TEST_RING_ID, NIC_LB_TEST_RING_ID,
551 				       NIC_LB_TEST_PKT_NUM_PER_CYCLE);
552 	}
553 
554 	/* free the original skb */
555 	kfree_skb(skb);
556 
557 	return ret_val;
558 }
559 
560 static int __lb_down(struct net_device *ndev)
561 {
562 	struct hns_nic_priv *priv = netdev_priv(ndev);
563 	struct hnae_handle *h = priv->ae_handle;
564 	int ret;
565 
566 	ret = __lb_setup(ndev, MAC_LOOP_NONE);
567 	if (ret)
568 		netdev_err(ndev, "%s: __lb_setup return error(%d)!\n",
569 			   __func__,
570 			   ret);
571 
572 	if (priv->phy)
573 		phy_stop(priv->phy);
574 
575 	if (h->dev->ops->stop)
576 		h->dev->ops->stop(h);
577 
578 	usleep_range(10000, 20000);
579 	(void)__lb_clean_rings(priv, 0, h->q_num - 1, 256);
580 
581 	hns_nic_net_reset(ndev);
582 
583 	return 0;
584 }
585 
586 /**
587  * hns_nic_self_test - self test
588  * @dev: net device
589  * @eth_test: test cmd
590  * @data: test result
591  */
592 static void hns_nic_self_test(struct net_device *ndev,
593 			      struct ethtool_test *eth_test, u64 *data)
594 {
595 	struct hns_nic_priv *priv = netdev_priv(ndev);
596 	bool if_running = netif_running(ndev);
597 #define SELF_TEST_TPYE_NUM 3
598 	int st_param[SELF_TEST_TPYE_NUM][2];
599 	int i;
600 	int test_index = 0;
601 
602 	st_param[0][0] = MAC_INTERNALLOOP_MAC; /* XGE not supported lb */
603 	st_param[0][1] = (priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII);
604 	st_param[1][0] = MAC_INTERNALLOOP_SERDES;
605 	st_param[1][1] = 1; /*serdes must exist*/
606 	st_param[2][0] = MAC_INTERNALLOOP_PHY; /* only supporte phy node*/
607 	st_param[2][1] = ((!!(priv->ae_handle->phy_node)) &&
608 		(priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII));
609 
610 	if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
611 		set_bit(NIC_STATE_TESTING, &priv->state);
612 
613 		if (if_running)
614 			(void)dev_close(ndev);
615 
616 		for (i = 0; i < SELF_TEST_TPYE_NUM; i++) {
617 			if (!st_param[i][1])
618 				continue;	/* NEXT testing */
619 
620 			data[test_index] = __lb_up(ndev,
621 				(enum hnae_loop)st_param[i][0]);
622 			if (!data[test_index]) {
623 				data[test_index] = __lb_run_test(
624 					ndev, (enum hnae_loop)st_param[i][0]);
625 				(void)__lb_down(ndev);
626 			}
627 
628 			if (data[test_index])
629 				eth_test->flags |= ETH_TEST_FL_FAILED;
630 
631 			test_index++;
632 		}
633 
634 		hns_nic_net_reset(priv->netdev);
635 
636 		clear_bit(NIC_STATE_TESTING, &priv->state);
637 
638 		if (if_running)
639 			(void)dev_open(ndev);
640 	}
641 	/* Online tests aren't run; pass by default */
642 
643 	(void)msleep_interruptible(4 * 1000);
644 }
645 
646 /**
647  * hns_nic_get_drvinfo - get net driver info
648  * @dev: net device
649  * @drvinfo: driver info
650  */
651 static void hns_nic_get_drvinfo(struct net_device *net_dev,
652 				struct ethtool_drvinfo *drvinfo)
653 {
654 	struct hns_nic_priv *priv = netdev_priv(net_dev);
655 
656 	assert(priv);
657 
658 	strncpy(drvinfo->version, HNAE_DRIVER_VERSION,
659 		sizeof(drvinfo->version));
660 	drvinfo->version[sizeof(drvinfo->version) - 1] = '\0';
661 
662 	strncpy(drvinfo->driver, HNAE_DRIVER_NAME, sizeof(drvinfo->driver));
663 	drvinfo->driver[sizeof(drvinfo->driver) - 1] = '\0';
664 
665 	strncpy(drvinfo->bus_info, priv->dev->bus->name,
666 		sizeof(drvinfo->bus_info));
667 	drvinfo->bus_info[ETHTOOL_BUSINFO_LEN - 1] = '\0';
668 
669 	strncpy(drvinfo->fw_version, "N/A", ETHTOOL_FWVERS_LEN);
670 }
671 
672 /**
673  * hns_get_ringparam - get ring parameter
674  * @dev: net device
675  * @param: ethtool parameter
676  */
677 void hns_get_ringparam(struct net_device *net_dev,
678 		       struct ethtool_ringparam *param)
679 {
680 	struct hns_nic_priv *priv = netdev_priv(net_dev);
681 	struct hnae_ae_ops *ops;
682 	struct hnae_queue *queue;
683 	u32 uplimit = 0;
684 
685 	queue = priv->ae_handle->qs[0];
686 	ops = priv->ae_handle->dev->ops;
687 
688 	if (ops->get_ring_bdnum_limit)
689 		ops->get_ring_bdnum_limit(queue, &uplimit);
690 
691 	param->rx_max_pending = uplimit;
692 	param->tx_max_pending = uplimit;
693 	param->rx_pending = queue->rx_ring.desc_num;
694 	param->tx_pending = queue->tx_ring.desc_num;
695 }
696 
697 /**
698  * hns_get_pauseparam - get pause parameter
699  * @dev: net device
700  * @param: pause parameter
701  */
702 static void hns_get_pauseparam(struct net_device *net_dev,
703 			       struct ethtool_pauseparam *param)
704 {
705 	struct hns_nic_priv *priv = netdev_priv(net_dev);
706 	struct hnae_ae_ops *ops;
707 
708 	ops = priv->ae_handle->dev->ops;
709 
710 	if (ops->get_pauseparam)
711 		ops->get_pauseparam(priv->ae_handle, &param->autoneg,
712 					    &param->rx_pause, &param->tx_pause);
713 }
714 
715 /**
716  * hns_set_pauseparam - set pause parameter
717  * @dev: net device
718  * @param: pause parameter
719  *
720  * Return 0 on success, negative on failure
721  */
722 static int hns_set_pauseparam(struct net_device *net_dev,
723 			      struct ethtool_pauseparam *param)
724 {
725 	struct hns_nic_priv *priv = netdev_priv(net_dev);
726 	struct hnae_handle *h;
727 	struct hnae_ae_ops *ops;
728 
729 	assert(priv || priv->ae_handle);
730 
731 	h = priv->ae_handle;
732 	ops = h->dev->ops;
733 
734 	if (!ops->set_pauseparam)
735 		return -ESRCH;
736 
737 	return ops->set_pauseparam(priv->ae_handle, param->autoneg,
738 				   param->rx_pause, param->tx_pause);
739 }
740 
741 /**
742  * hns_get_coalesce - get coalesce info.
743  * @dev: net device
744  * @ec: coalesce info.
745  *
746  * Return 0 on success, negative on failure.
747  */
748 static int hns_get_coalesce(struct net_device *net_dev,
749 			    struct ethtool_coalesce *ec)
750 {
751 	struct hns_nic_priv *priv = netdev_priv(net_dev);
752 	struct hnae_ae_ops *ops;
753 
754 	ops = priv->ae_handle->dev->ops;
755 
756 	ec->use_adaptive_rx_coalesce = 1;
757 	ec->use_adaptive_tx_coalesce = 1;
758 
759 	if ((!ops->get_coalesce_usecs) ||
760 	    (!ops->get_rx_max_coalesced_frames))
761 		return -ESRCH;
762 
763 	ops->get_coalesce_usecs(priv->ae_handle,
764 					&ec->tx_coalesce_usecs,
765 					&ec->rx_coalesce_usecs);
766 
767 	ops->get_rx_max_coalesced_frames(
768 		priv->ae_handle,
769 		&ec->tx_max_coalesced_frames,
770 		&ec->rx_max_coalesced_frames);
771 
772 	return 0;
773 }
774 
775 /**
776  * hns_set_coalesce - set coalesce info.
777  * @dev: net device
778  * @ec: coalesce info.
779  *
780  * Return 0 on success, negative on failure.
781  */
782 static int hns_set_coalesce(struct net_device *net_dev,
783 			    struct ethtool_coalesce *ec)
784 {
785 	struct hns_nic_priv *priv = netdev_priv(net_dev);
786 	struct hnae_ae_ops *ops;
787 	int ret;
788 
789 	assert(priv || priv->ae_handle);
790 
791 	ops = priv->ae_handle->dev->ops;
792 
793 	if (ec->tx_coalesce_usecs != ec->rx_coalesce_usecs)
794 		return -EINVAL;
795 
796 	if (ec->rx_max_coalesced_frames != ec->tx_max_coalesced_frames)
797 		return -EINVAL;
798 
799 	if ((!ops->set_coalesce_usecs) ||
800 	    (!ops->set_coalesce_frames))
801 		return -ESRCH;
802 
803 	ops->set_coalesce_usecs(priv->ae_handle,
804 					ec->rx_coalesce_usecs);
805 
806 	ret = ops->set_coalesce_frames(
807 		priv->ae_handle,
808 		ec->rx_max_coalesced_frames);
809 
810 	return ret;
811 }
812 
813 /**
814  * hns_get_channels - get channel info.
815  * @dev: net device
816  * @ch: channel info.
817  */
818 void hns_get_channels(struct net_device *net_dev, struct ethtool_channels *ch)
819 {
820 	struct hns_nic_priv *priv = netdev_priv(net_dev);
821 
822 	ch->max_rx = priv->ae_handle->q_num;
823 	ch->max_tx = priv->ae_handle->q_num;
824 
825 	ch->rx_count = priv->ae_handle->q_num;
826 	ch->tx_count = priv->ae_handle->q_num;
827 }
828 
829 /**
830  * get_ethtool_stats - get detail statistics.
831  * @dev: net device
832  * @stats: statistics info.
833  * @data: statistics data.
834  */
835 void hns_get_ethtool_stats(struct net_device *netdev,
836 			   struct ethtool_stats *stats, u64 *data)
837 {
838 	u64 *p = data;
839 	struct hns_nic_priv *priv = netdev_priv(netdev);
840 	struct hnae_handle *h = priv->ae_handle;
841 	const struct rtnl_link_stats64 *net_stats;
842 	struct rtnl_link_stats64 temp;
843 
844 	if (!h->dev->ops->get_stats || !h->dev->ops->update_stats) {
845 		netdev_err(netdev, "get_stats or update_stats is null!\n");
846 		return;
847 	}
848 
849 	h->dev->ops->update_stats(h, &netdev->stats);
850 
851 	net_stats = dev_get_stats(netdev, &temp);
852 
853 	/* get netdev statistics */
854 	p[0] = net_stats->rx_packets;
855 	p[1] = net_stats->tx_packets;
856 	p[2] = net_stats->rx_bytes;
857 	p[3] = net_stats->tx_bytes;
858 	p[4] = net_stats->rx_errors;
859 	p[5] = net_stats->tx_errors;
860 	p[6] = net_stats->rx_dropped;
861 	p[7] = net_stats->tx_dropped;
862 	p[8] = net_stats->multicast;
863 	p[9] = net_stats->collisions;
864 	p[10] = net_stats->rx_over_errors;
865 	p[11] = net_stats->rx_crc_errors;
866 	p[12] = net_stats->rx_frame_errors;
867 	p[13] = net_stats->rx_fifo_errors;
868 	p[14] = net_stats->rx_missed_errors;
869 	p[15] = net_stats->tx_aborted_errors;
870 	p[16] = net_stats->tx_carrier_errors;
871 	p[17] = net_stats->tx_fifo_errors;
872 	p[18] = net_stats->tx_heartbeat_errors;
873 	p[19] = net_stats->rx_length_errors;
874 	p[20] = net_stats->tx_window_errors;
875 	p[21] = net_stats->rx_compressed;
876 	p[22] = net_stats->tx_compressed;
877 
878 	p[23] = netdev->rx_dropped.counter;
879 	p[24] = netdev->tx_dropped.counter;
880 
881 	p[25] = priv->tx_timeout_count;
882 
883 	/* get driver statistics */
884 	h->dev->ops->get_stats(h, &p[26]);
885 }
886 
887 /**
888  * get_strings: Return a set of strings that describe the requested objects
889  * @dev: net device
890  * @stats: string set ID.
891  * @data: objects data.
892  */
893 void hns_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
894 {
895 	struct hns_nic_priv *priv = netdev_priv(netdev);
896 	struct hnae_handle *h = priv->ae_handle;
897 	char *buff = (char *)data;
898 
899 	if (!h->dev->ops->get_strings) {
900 		netdev_err(netdev, "h->dev->ops->get_strings is null!\n");
901 		return;
902 	}
903 
904 	if (stringset == ETH_SS_TEST) {
905 		if (priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII) {
906 			memcpy(buff, hns_nic_test_strs[MAC_INTERNALLOOP_MAC],
907 			       ETH_GSTRING_LEN);
908 			buff += ETH_GSTRING_LEN;
909 		}
910 		memcpy(buff, hns_nic_test_strs[MAC_INTERNALLOOP_SERDES],
911 		       ETH_GSTRING_LEN);
912 		buff += ETH_GSTRING_LEN;
913 		if ((priv->phy) && (!priv->phy->is_c45))
914 			memcpy(buff, hns_nic_test_strs[MAC_INTERNALLOOP_PHY],
915 			       ETH_GSTRING_LEN);
916 
917 	} else {
918 		snprintf(buff, ETH_GSTRING_LEN, "rx_packets");
919 		buff = buff + ETH_GSTRING_LEN;
920 		snprintf(buff, ETH_GSTRING_LEN, "tx_packets");
921 		buff = buff + ETH_GSTRING_LEN;
922 		snprintf(buff, ETH_GSTRING_LEN, "rx_bytes");
923 		buff = buff + ETH_GSTRING_LEN;
924 		snprintf(buff, ETH_GSTRING_LEN, "tx_bytes");
925 		buff = buff + ETH_GSTRING_LEN;
926 		snprintf(buff, ETH_GSTRING_LEN, "rx_errors");
927 		buff = buff + ETH_GSTRING_LEN;
928 		snprintf(buff, ETH_GSTRING_LEN, "tx_errors");
929 		buff = buff + ETH_GSTRING_LEN;
930 		snprintf(buff, ETH_GSTRING_LEN, "rx_dropped");
931 		buff = buff + ETH_GSTRING_LEN;
932 		snprintf(buff, ETH_GSTRING_LEN, "tx_dropped");
933 		buff = buff + ETH_GSTRING_LEN;
934 		snprintf(buff, ETH_GSTRING_LEN, "multicast");
935 		buff = buff + ETH_GSTRING_LEN;
936 		snprintf(buff, ETH_GSTRING_LEN, "collisions");
937 		buff = buff + ETH_GSTRING_LEN;
938 		snprintf(buff, ETH_GSTRING_LEN, "rx_over_errors");
939 		buff = buff + ETH_GSTRING_LEN;
940 		snprintf(buff, ETH_GSTRING_LEN, "rx_crc_errors");
941 		buff = buff + ETH_GSTRING_LEN;
942 		snprintf(buff, ETH_GSTRING_LEN, "rx_frame_errors");
943 		buff = buff + ETH_GSTRING_LEN;
944 		snprintf(buff, ETH_GSTRING_LEN, "rx_fifo_errors");
945 		buff = buff + ETH_GSTRING_LEN;
946 		snprintf(buff, ETH_GSTRING_LEN, "rx_missed_errors");
947 		buff = buff + ETH_GSTRING_LEN;
948 		snprintf(buff, ETH_GSTRING_LEN, "tx_aborted_errors");
949 		buff = buff + ETH_GSTRING_LEN;
950 		snprintf(buff, ETH_GSTRING_LEN, "tx_carrier_errors");
951 		buff = buff + ETH_GSTRING_LEN;
952 		snprintf(buff, ETH_GSTRING_LEN, "tx_fifo_errors");
953 		buff = buff + ETH_GSTRING_LEN;
954 		snprintf(buff, ETH_GSTRING_LEN, "tx_heartbeat_errors");
955 		buff = buff + ETH_GSTRING_LEN;
956 		snprintf(buff, ETH_GSTRING_LEN, "rx_length_errors");
957 		buff = buff + ETH_GSTRING_LEN;
958 		snprintf(buff, ETH_GSTRING_LEN, "tx_window_errors");
959 		buff = buff + ETH_GSTRING_LEN;
960 		snprintf(buff, ETH_GSTRING_LEN, "rx_compressed");
961 		buff = buff + ETH_GSTRING_LEN;
962 		snprintf(buff, ETH_GSTRING_LEN, "tx_compressed");
963 		buff = buff + ETH_GSTRING_LEN;
964 		snprintf(buff, ETH_GSTRING_LEN, "netdev_rx_dropped");
965 		buff = buff + ETH_GSTRING_LEN;
966 		snprintf(buff, ETH_GSTRING_LEN, "netdev_tx_dropped");
967 		buff = buff + ETH_GSTRING_LEN;
968 
969 		snprintf(buff, ETH_GSTRING_LEN, "netdev_tx_timeout");
970 		buff = buff + ETH_GSTRING_LEN;
971 
972 		h->dev->ops->get_strings(h, stringset, (u8 *)buff);
973 	}
974 }
975 
976 /**
977  * nic_get_sset_count - get string set count witch returned by nic_get_strings.
978  * @dev: net device
979  * @stringset: string set index, 0: self test string; 1: statistics string.
980  *
981  * Return string set count.
982  */
983 int hns_get_sset_count(struct net_device *netdev, int stringset)
984 {
985 	struct hns_nic_priv *priv = netdev_priv(netdev);
986 	struct hnae_handle *h = priv->ae_handle;
987 	struct hnae_ae_ops *ops = h->dev->ops;
988 
989 	if (!ops->get_sset_count) {
990 		netdev_err(netdev, "get_sset_count is null!\n");
991 		return -EOPNOTSUPP;
992 	}
993 	if (stringset == ETH_SS_TEST) {
994 		u32 cnt = (sizeof(hns_nic_test_strs) / ETH_GSTRING_LEN);
995 
996 		if (priv->ae_handle->phy_if == PHY_INTERFACE_MODE_XGMII)
997 			cnt--;
998 
999 		if ((!priv->phy) || (priv->phy->is_c45))
1000 			cnt--;
1001 
1002 		return cnt;
1003 	} else {
1004 		return (HNS_NET_STATS_CNT + ops->get_sset_count(h, stringset));
1005 	}
1006 }
1007 
1008 /**
1009  * hns_phy_led_set - set phy LED status.
1010  * @dev: net device
1011  * @value: LED state.
1012  *
1013  * Return 0 on success, negative on failure.
1014  */
1015 int hns_phy_led_set(struct net_device *netdev, int value)
1016 {
1017 	int retval;
1018 	struct hns_nic_priv *priv = netdev_priv(netdev);
1019 	struct phy_device *phy_dev = priv->phy;
1020 
1021 	if (!phy_dev->bus) {
1022 		netdev_err(netdev, "phy_dev->bus is null!\n");
1023 		return -EINVAL;
1024 	}
1025 	retval = mdiobus_write(phy_dev->bus, phy_dev->addr,
1026 			       HNS_PHY_PAGE_REG, HNS_PHY_PAGE_LED);
1027 	retval = mdiobus_write(phy_dev->bus, phy_dev->addr, HNS_LED_FC_REG,
1028 			       value);
1029 	retval = mdiobus_write(phy_dev->bus, phy_dev->addr,
1030 			       HNS_PHY_PAGE_REG, HNS_PHY_PAGE_COPPER);
1031 	if (retval) {
1032 		netdev_err(netdev, "mdiobus_write fail !\n");
1033 		return retval;
1034 	}
1035 	return 0;
1036 }
1037 
1038 /**
1039  * nic_set_phys_id - set phy identify LED.
1040  * @dev: net device
1041  * @state: LED state.
1042  *
1043  * Return 0 on success, negative on failure.
1044  */
1045 int hns_set_phys_id(struct net_device *netdev, enum ethtool_phys_id_state state)
1046 {
1047 	struct hns_nic_priv *priv = netdev_priv(netdev);
1048 	struct hnae_handle *h = priv->ae_handle;
1049 	struct phy_device *phy_dev = priv->phy;
1050 	int ret;
1051 
1052 	if (phy_dev)
1053 		switch (state) {
1054 		case ETHTOOL_ID_ACTIVE:
1055 			ret = mdiobus_write(phy_dev->bus, phy_dev->addr,
1056 					    HNS_PHY_PAGE_REG,
1057 					    HNS_PHY_PAGE_LED);
1058 			if (ret)
1059 				return ret;
1060 
1061 			priv->phy_led_val = (u16)mdiobus_read(phy_dev->bus,
1062 							      phy_dev->addr,
1063 							      HNS_LED_FC_REG);
1064 
1065 			ret = mdiobus_write(phy_dev->bus, phy_dev->addr,
1066 					    HNS_PHY_PAGE_REG,
1067 					    HNS_PHY_PAGE_COPPER);
1068 			if (ret)
1069 				return ret;
1070 			return 2;
1071 		case ETHTOOL_ID_ON:
1072 			ret = hns_phy_led_set(netdev, HNS_LED_FORCE_ON);
1073 			if (ret)
1074 				return ret;
1075 			break;
1076 		case ETHTOOL_ID_OFF:
1077 			ret = hns_phy_led_set(netdev, HNS_LED_FORCE_OFF);
1078 			if (ret)
1079 				return ret;
1080 			break;
1081 		case ETHTOOL_ID_INACTIVE:
1082 			ret = mdiobus_write(phy_dev->bus, phy_dev->addr,
1083 					    HNS_PHY_PAGE_REG,
1084 					    HNS_PHY_PAGE_LED);
1085 			if (ret)
1086 				return ret;
1087 
1088 			ret = mdiobus_write(phy_dev->bus, phy_dev->addr,
1089 					    HNS_LED_FC_REG, priv->phy_led_val);
1090 			if (ret)
1091 				return ret;
1092 
1093 			ret = mdiobus_write(phy_dev->bus, phy_dev->addr,
1094 					    HNS_PHY_PAGE_REG,
1095 					    HNS_PHY_PAGE_COPPER);
1096 			if (ret)
1097 				return ret;
1098 			break;
1099 		default:
1100 			return -EINVAL;
1101 		}
1102 	else
1103 		switch (state) {
1104 		case ETHTOOL_ID_ACTIVE:
1105 			return h->dev->ops->set_led_id(h, HNAE_LED_ACTIVE);
1106 		case ETHTOOL_ID_ON:
1107 			return h->dev->ops->set_led_id(h, HNAE_LED_ON);
1108 		case ETHTOOL_ID_OFF:
1109 			return h->dev->ops->set_led_id(h, HNAE_LED_OFF);
1110 		case ETHTOOL_ID_INACTIVE:
1111 			return h->dev->ops->set_led_id(h, HNAE_LED_INACTIVE);
1112 		default:
1113 			return -EINVAL;
1114 		}
1115 
1116 	return 0;
1117 }
1118 
1119 /**
1120  * hns_get_regs - get net device register
1121  * @dev: net device
1122  * @cmd: ethtool cmd
1123  * @date: register data
1124  */
1125 void hns_get_regs(struct net_device *net_dev, struct ethtool_regs *cmd,
1126 		  void *data)
1127 {
1128 	struct hns_nic_priv *priv = netdev_priv(net_dev);
1129 	struct hnae_ae_ops *ops;
1130 
1131 	assert(priv || priv->ae_handle);
1132 
1133 	ops = priv->ae_handle->dev->ops;
1134 
1135 	cmd->version = HNS_CHIP_VERSION;
1136 	if (!ops->get_regs) {
1137 		netdev_err(net_dev, "ops->get_regs is null!\n");
1138 		return;
1139 	}
1140 	ops->get_regs(priv->ae_handle, data);
1141 }
1142 
1143 /**
1144  * nic_get_regs_len - get total register len.
1145  * @dev: net device
1146  *
1147  * Return total register len.
1148  */
1149 static int hns_get_regs_len(struct net_device *net_dev)
1150 {
1151 	u32 reg_num;
1152 	struct hns_nic_priv *priv = netdev_priv(net_dev);
1153 	struct hnae_ae_ops *ops;
1154 
1155 	assert(priv || priv->ae_handle);
1156 
1157 	ops = priv->ae_handle->dev->ops;
1158 	if (!ops->get_regs_len) {
1159 		netdev_err(net_dev, "ops->get_regs_len is null!\n");
1160 		return -EOPNOTSUPP;
1161 	}
1162 
1163 	reg_num = ops->get_regs_len(priv->ae_handle);
1164 	if (reg_num > 0)
1165 		return reg_num * sizeof(u32);
1166 	else
1167 		return reg_num;	/* error code */
1168 }
1169 
1170 /**
1171  * hns_nic_nway_reset - nway reset
1172  * @dev: net device
1173  *
1174  * Return 0 on success, negative on failure
1175  */
1176 static int hns_nic_nway_reset(struct net_device *netdev)
1177 {
1178 	int ret = 0;
1179 	struct hns_nic_priv *priv = netdev_priv(netdev);
1180 	struct phy_device *phy = priv->phy;
1181 
1182 	if (netif_running(netdev)) {
1183 		if (phy)
1184 			ret = genphy_restart_aneg(phy);
1185 	}
1186 
1187 	return ret;
1188 }
1189 
1190 static struct ethtool_ops hns_ethtool_ops = {
1191 	.get_drvinfo = hns_nic_get_drvinfo,
1192 	.get_link  = hns_nic_get_link,
1193 	.get_settings  = hns_nic_get_settings,
1194 	.set_settings  = hns_nic_set_settings,
1195 	.get_ringparam = hns_get_ringparam,
1196 	.get_pauseparam = hns_get_pauseparam,
1197 	.set_pauseparam = hns_set_pauseparam,
1198 	.get_coalesce = hns_get_coalesce,
1199 	.set_coalesce = hns_set_coalesce,
1200 	.get_channels = hns_get_channels,
1201 	.self_test = hns_nic_self_test,
1202 	.get_strings = hns_get_strings,
1203 	.get_sset_count = hns_get_sset_count,
1204 	.get_ethtool_stats = hns_get_ethtool_stats,
1205 	.set_phys_id = hns_set_phys_id,
1206 	.get_regs_len = hns_get_regs_len,
1207 	.get_regs = hns_get_regs,
1208 	.nway_reset = hns_nic_nway_reset,
1209 };
1210 
1211 void hns_ethtool_set_ops(struct net_device *ndev)
1212 {
1213 	ndev->ethtool_ops = &hns_ethtool_ops;
1214 }
1215