Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
[linux-2.6-microblaze.git] / drivers / net / ethernet / hisilicon / hns3 / hns3_ethtool.c
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
8 #include "hns3_enet.h"
9
10 struct hns3_stats {
11         char stats_string[ETH_GSTRING_LEN];
12         int stats_offset;
13 };
14
15 /* tqp related stats */
16 #define HNS3_TQP_STAT(_string, _member) {                       \
17         .stats_string = _string,                                \
18         .stats_offset = offsetof(struct hns3_enet_ring, stats) +\
19                         offsetof(struct ring_stats, _member),   \
20 }
21
22 static const struct hns3_stats hns3_txq_stats[] = {
23         /* Tx per-queue statistics */
24         HNS3_TQP_STAT("io_err_cnt", io_err_cnt),
25         HNS3_TQP_STAT("dropped", sw_err_cnt),
26         HNS3_TQP_STAT("seg_pkt_cnt", seg_pkt_cnt),
27         HNS3_TQP_STAT("packets", tx_pkts),
28         HNS3_TQP_STAT("bytes", tx_bytes),
29         HNS3_TQP_STAT("errors", tx_err_cnt),
30         HNS3_TQP_STAT("wake", restart_queue),
31         HNS3_TQP_STAT("busy", tx_busy),
32 };
33
34 #define HNS3_TXQ_STATS_COUNT ARRAY_SIZE(hns3_txq_stats)
35
36 static const struct hns3_stats hns3_rxq_stats[] = {
37         /* Rx per-queue statistics */
38         HNS3_TQP_STAT("io_err_cnt", io_err_cnt),
39         HNS3_TQP_STAT("dropped", sw_err_cnt),
40         HNS3_TQP_STAT("seg_pkt_cnt", seg_pkt_cnt),
41         HNS3_TQP_STAT("packets", rx_pkts),
42         HNS3_TQP_STAT("bytes", rx_bytes),
43         HNS3_TQP_STAT("errors", rx_err_cnt),
44         HNS3_TQP_STAT("reuse_pg_cnt", reuse_pg_cnt),
45         HNS3_TQP_STAT("err_pkt_len", err_pkt_len),
46         HNS3_TQP_STAT("non_vld_descs", non_vld_descs),
47         HNS3_TQP_STAT("err_bd_num", err_bd_num),
48         HNS3_TQP_STAT("l2_err", l2_err),
49         HNS3_TQP_STAT("l3l4_csum_err", l3l4_csum_err),
50 };
51
52 #define HNS3_RXQ_STATS_COUNT ARRAY_SIZE(hns3_rxq_stats)
53
54 #define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT)
55
56 #define HNS3_SELF_TEST_TYPE_NUM         3
57 #define HNS3_NIC_LB_TEST_PKT_NUM        1
58 #define HNS3_NIC_LB_TEST_RING_ID        0
59 #define HNS3_NIC_LB_TEST_PACKET_SIZE    128
60
61 /* Nic loopback test err  */
62 #define HNS3_NIC_LB_TEST_NO_MEM_ERR     1
63 #define HNS3_NIC_LB_TEST_TX_CNT_ERR     2
64 #define HNS3_NIC_LB_TEST_RX_CNT_ERR     3
65
66 struct hns3_link_mode_mapping {
67         u32 hns3_link_mode;
68         u32 ethtool_link_mode;
69 };
70
71 static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
72 {
73         struct hnae3_handle *h = hns3_get_handle(ndev);
74         bool vlan_filter_enable;
75         int ret;
76
77         if (!h->ae_algo->ops->set_loopback ||
78             !h->ae_algo->ops->set_promisc_mode)
79                 return -EOPNOTSUPP;
80
81         switch (loop) {
82         case HNAE3_LOOP_SERIAL_SERDES:
83         case HNAE3_LOOP_PARALLEL_SERDES:
84         case HNAE3_LOOP_APP:
85                 ret = h->ae_algo->ops->set_loopback(h, loop, en);
86                 break;
87         default:
88                 ret = -ENOTSUPP;
89                 break;
90         }
91
92         if (ret)
93                 return ret;
94
95         if (en) {
96                 h->ae_algo->ops->set_promisc_mode(h, true, true);
97         } else {
98                 /* recover promisc mode before loopback test */
99                 hns3_update_promisc_mode(ndev, h->netdev_flags);
100                 vlan_filter_enable = ndev->flags & IFF_PROMISC ? false : true;
101                 hns3_enable_vlan_filter(ndev, vlan_filter_enable);
102         }
103
104         return ret;
105 }
106
107 static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
108 {
109         struct hnae3_handle *h = hns3_get_handle(ndev);
110         int ret;
111
112         ret = hns3_nic_reset_all_ring(h);
113         if (ret)
114                 return ret;
115
116         ret = hns3_lp_setup(ndev, loop_mode, true);
117         usleep_range(10000, 20000);
118
119         return 0;
120 }
121
122 static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode)
123 {
124         int ret;
125
126         ret = hns3_lp_setup(ndev, loop_mode, false);
127         if (ret) {
128                 netdev_err(ndev, "lb_setup return error: %d\n", ret);
129                 return ret;
130         }
131
132         usleep_range(10000, 20000);
133
134         return 0;
135 }
136
137 static void hns3_lp_setup_skb(struct sk_buff *skb)
138 {
139         struct net_device *ndev = skb->dev;
140         unsigned char *packet;
141         struct ethhdr *ethh;
142         unsigned int i;
143
144         skb_reserve(skb, NET_IP_ALIGN);
145         ethh = skb_put(skb, sizeof(struct ethhdr));
146         packet = skb_put(skb, HNS3_NIC_LB_TEST_PACKET_SIZE);
147
148         memcpy(ethh->h_dest, ndev->dev_addr, ETH_ALEN);
149         ethh->h_dest[5] += 0x1f;
150         eth_zero_addr(ethh->h_source);
151         ethh->h_proto = htons(ETH_P_ARP);
152         skb_reset_mac_header(skb);
153
154         for (i = 0; i < HNS3_NIC_LB_TEST_PACKET_SIZE; i++)
155                 packet[i] = (unsigned char)(i & 0xff);
156 }
157
158 static void hns3_lb_check_skb_data(struct hns3_enet_ring *ring,
159                                    struct sk_buff *skb)
160 {
161         struct hns3_enet_tqp_vector *tqp_vector = ring->tqp_vector;
162         unsigned char *packet = skb->data;
163         u32 i;
164
165         for (i = 0; i < skb->len; i++)
166                 if (packet[i] != (unsigned char)(i & 0xff))
167                         break;
168
169         /* The packet is correctly received */
170         if (i == skb->len)
171                 tqp_vector->rx_group.total_packets++;
172         else
173                 print_hex_dump(KERN_ERR, "selftest:", DUMP_PREFIX_OFFSET, 16, 1,
174                                skb->data, skb->len, true);
175
176         dev_kfree_skb_any(skb);
177 }
178
179 static u32 hns3_lb_check_rx_ring(struct hns3_nic_priv *priv, u32 budget)
180 {
181         struct hnae3_handle *h = priv->ae_handle;
182         struct hnae3_knic_private_info *kinfo;
183         u32 i, rcv_good_pkt_total = 0;
184
185         kinfo = &h->kinfo;
186         for (i = kinfo->num_tqps; i < kinfo->num_tqps * 2; i++) {
187                 struct hns3_enet_ring *ring = priv->ring_data[i].ring;
188                 struct hns3_enet_ring_group *rx_group;
189                 u64 pre_rx_pkt;
190
191                 rx_group = &ring->tqp_vector->rx_group;
192                 pre_rx_pkt = rx_group->total_packets;
193
194                 preempt_disable();
195                 hns3_clean_rx_ring(ring, budget, hns3_lb_check_skb_data);
196                 preempt_enable();
197
198                 rcv_good_pkt_total += (rx_group->total_packets - pre_rx_pkt);
199                 rx_group->total_packets = pre_rx_pkt;
200         }
201         return rcv_good_pkt_total;
202 }
203
204 static void hns3_lb_clear_tx_ring(struct hns3_nic_priv *priv, u32 start_ringid,
205                                   u32 end_ringid, u32 budget)
206 {
207         u32 i;
208
209         for (i = start_ringid; i <= end_ringid; i++) {
210                 struct hns3_enet_ring *ring = priv->ring_data[i].ring;
211
212                 hns3_clean_tx_ring(ring);
213         }
214 }
215
216 /**
217  * hns3_lp_run_test -  run loopback test
218  * @ndev: net device
219  * @mode: loopback type
220  */
221 static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
222 {
223         struct hns3_nic_priv *priv = netdev_priv(ndev);
224         struct sk_buff *skb;
225         u32 i, good_cnt;
226         int ret_val = 0;
227
228         skb = alloc_skb(HNS3_NIC_LB_TEST_PACKET_SIZE + ETH_HLEN + NET_IP_ALIGN,
229                         GFP_KERNEL);
230         if (!skb)
231                 return HNS3_NIC_LB_TEST_NO_MEM_ERR;
232
233         skb->dev = ndev;
234         hns3_lp_setup_skb(skb);
235         skb->queue_mapping = HNS3_NIC_LB_TEST_RING_ID;
236
237         good_cnt = 0;
238         for (i = 0; i < HNS3_NIC_LB_TEST_PKT_NUM; i++) {
239                 netdev_tx_t tx_ret;
240
241                 skb_get(skb);
242                 tx_ret = hns3_nic_net_xmit(skb, ndev);
243                 if (tx_ret == NETDEV_TX_OK)
244                         good_cnt++;
245                 else
246                         netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n",
247                                    tx_ret);
248         }
249         if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
250                 ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR;
251                 netdev_err(ndev, "mode %d sent fail, cnt=0x%x, budget=0x%x\n",
252                            mode, good_cnt, HNS3_NIC_LB_TEST_PKT_NUM);
253                 goto out;
254         }
255
256         /* Allow 200 milliseconds for packets to go from Tx to Rx */
257         msleep(200);
258
259         good_cnt = hns3_lb_check_rx_ring(priv, HNS3_NIC_LB_TEST_PKT_NUM);
260         if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
261                 ret_val = HNS3_NIC_LB_TEST_RX_CNT_ERR;
262                 netdev_err(ndev, "mode %d recv fail, cnt=0x%x, budget=0x%x\n",
263                            mode, good_cnt, HNS3_NIC_LB_TEST_PKT_NUM);
264         }
265
266 out:
267         hns3_lb_clear_tx_ring(priv, HNS3_NIC_LB_TEST_RING_ID,
268                               HNS3_NIC_LB_TEST_RING_ID,
269                               HNS3_NIC_LB_TEST_PKT_NUM);
270
271         kfree_skb(skb);
272         return ret_val;
273 }
274
275 /**
276  * hns3_nic_self_test - self test
277  * @ndev: net device
278  * @eth_test: test cmd
279  * @data: test result
280  */
281 static void hns3_self_test(struct net_device *ndev,
282                            struct ethtool_test *eth_test, u64 *data)
283 {
284         struct hns3_nic_priv *priv = netdev_priv(ndev);
285         struct hnae3_handle *h = priv->ae_handle;
286         int st_param[HNS3_SELF_TEST_TYPE_NUM][2];
287         bool if_running = netif_running(ndev);
288 #if IS_ENABLED(CONFIG_VLAN_8021Q)
289         bool dis_vlan_filter;
290 #endif
291         int test_index = 0;
292         u32 i;
293
294         if (hns3_nic_resetting(ndev)) {
295                 netdev_err(ndev, "dev resetting!");
296                 return;
297         }
298
299         /* Only do offline selftest, or pass by default */
300         if (eth_test->flags != ETH_TEST_FL_OFFLINE)
301                 return;
302
303         st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
304         st_param[HNAE3_LOOP_APP][1] =
305                         h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
306
307         st_param[HNAE3_LOOP_SERIAL_SERDES][0] = HNAE3_LOOP_SERIAL_SERDES;
308         st_param[HNAE3_LOOP_SERIAL_SERDES][1] =
309                         h->flags & HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
310
311         st_param[HNAE3_LOOP_PARALLEL_SERDES][0] =
312                         HNAE3_LOOP_PARALLEL_SERDES;
313         st_param[HNAE3_LOOP_PARALLEL_SERDES][1] =
314                         h->flags & HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
315
316         if (if_running)
317                 ndev->netdev_ops->ndo_stop(ndev);
318
319 #if IS_ENABLED(CONFIG_VLAN_8021Q)
320         /* Disable the vlan filter for selftest does not support it */
321         dis_vlan_filter = (ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) &&
322                                 h->ae_algo->ops->enable_vlan_filter;
323         if (dis_vlan_filter)
324                 h->ae_algo->ops->enable_vlan_filter(h, false);
325 #endif
326
327         set_bit(HNS3_NIC_STATE_TESTING, &priv->state);
328
329         for (i = 0; i < HNS3_SELF_TEST_TYPE_NUM; i++) {
330                 enum hnae3_loop loop_type = (enum hnae3_loop)st_param[i][0];
331
332                 if (!st_param[i][1])
333                         continue;
334
335                 data[test_index] = hns3_lp_up(ndev, loop_type);
336                 if (!data[test_index]) {
337                         data[test_index] = hns3_lp_run_test(ndev, loop_type);
338                         hns3_lp_down(ndev, loop_type);
339                 }
340
341                 if (data[test_index])
342                         eth_test->flags |= ETH_TEST_FL_FAILED;
343
344                 test_index++;
345         }
346
347         clear_bit(HNS3_NIC_STATE_TESTING, &priv->state);
348
349 #if IS_ENABLED(CONFIG_VLAN_8021Q)
350         if (dis_vlan_filter)
351                 h->ae_algo->ops->enable_vlan_filter(h, true);
352 #endif
353
354         if (if_running)
355                 ndev->netdev_ops->ndo_open(ndev);
356 }
357
358 static int hns3_get_sset_count(struct net_device *netdev, int stringset)
359 {
360         struct hnae3_handle *h = hns3_get_handle(netdev);
361         const struct hnae3_ae_ops *ops = h->ae_algo->ops;
362
363         if (!ops->get_sset_count)
364                 return -EOPNOTSUPP;
365
366         switch (stringset) {
367         case ETH_SS_STATS:
368                 return ((HNS3_TQP_STATS_COUNT * h->kinfo.num_tqps) +
369                         ops->get_sset_count(h, stringset));
370
371         case ETH_SS_TEST:
372                 return ops->get_sset_count(h, stringset);
373
374         default:
375                 return -EOPNOTSUPP;
376         }
377 }
378
379 static void *hns3_update_strings(u8 *data, const struct hns3_stats *stats,
380                 u32 stat_count, u32 num_tqps, const char *prefix)
381 {
382 #define MAX_PREFIX_SIZE (6 + 4)
383         u32 size_left;
384         u32 i, j;
385         u32 n1;
386
387         for (i = 0; i < num_tqps; i++) {
388                 for (j = 0; j < stat_count; j++) {
389                         data[ETH_GSTRING_LEN - 1] = '\0';
390
391                         /* first, prepend the prefix string */
392                         n1 = snprintf(data, MAX_PREFIX_SIZE, "%s%d_",
393                                       prefix, i);
394                         n1 = min_t(uint, n1, MAX_PREFIX_SIZE - 1);
395                         size_left = (ETH_GSTRING_LEN - 1) - n1;
396
397                         /* now, concatenate the stats string to it */
398                         strncat(data, stats[j].stats_string, size_left);
399                         data += ETH_GSTRING_LEN;
400                 }
401         }
402
403         return data;
404 }
405
406 static u8 *hns3_get_strings_tqps(struct hnae3_handle *handle, u8 *data)
407 {
408         struct hnae3_knic_private_info *kinfo = &handle->kinfo;
409         const char tx_prefix[] = "txq";
410         const char rx_prefix[] = "rxq";
411
412         /* get strings for Tx */
413         data = hns3_update_strings(data, hns3_txq_stats, HNS3_TXQ_STATS_COUNT,
414                                    kinfo->num_tqps, tx_prefix);
415
416         /* get strings for Rx */
417         data = hns3_update_strings(data, hns3_rxq_stats, HNS3_RXQ_STATS_COUNT,
418                                    kinfo->num_tqps, rx_prefix);
419
420         return data;
421 }
422
423 static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
424 {
425         struct hnae3_handle *h = hns3_get_handle(netdev);
426         const struct hnae3_ae_ops *ops = h->ae_algo->ops;
427         char *buff = (char *)data;
428
429         if (!ops->get_strings)
430                 return;
431
432         switch (stringset) {
433         case ETH_SS_STATS:
434                 buff = hns3_get_strings_tqps(h, buff);
435                 h->ae_algo->ops->get_strings(h, stringset, (u8 *)buff);
436                 break;
437         case ETH_SS_TEST:
438                 ops->get_strings(h, stringset, data);
439                 break;
440         default:
441                 break;
442         }
443 }
444
445 static u64 *hns3_get_stats_tqps(struct hnae3_handle *handle, u64 *data)
446 {
447         struct hns3_nic_priv *nic_priv = (struct hns3_nic_priv *)handle->priv;
448         struct hnae3_knic_private_info *kinfo = &handle->kinfo;
449         struct hns3_enet_ring *ring;
450         u8 *stat;
451         int i, j;
452
453         /* get stats for Tx */
454         for (i = 0; i < kinfo->num_tqps; i++) {
455                 ring = nic_priv->ring_data[i].ring;
456                 for (j = 0; j < HNS3_TXQ_STATS_COUNT; j++) {
457                         stat = (u8 *)ring + hns3_txq_stats[j].stats_offset;
458                         *data++ = *(u64 *)stat;
459                 }
460         }
461
462         /* get stats for Rx */
463         for (i = 0; i < kinfo->num_tqps; i++) {
464                 ring = nic_priv->ring_data[i + kinfo->num_tqps].ring;
465                 for (j = 0; j < HNS3_RXQ_STATS_COUNT; j++) {
466                         stat = (u8 *)ring + hns3_rxq_stats[j].stats_offset;
467                         *data++ = *(u64 *)stat;
468                 }
469         }
470
471         return data;
472 }
473
474 /* hns3_get_stats - get detail statistics.
475  * @netdev: net device
476  * @stats: statistics info.
477  * @data: statistics data.
478  */
479 static void hns3_get_stats(struct net_device *netdev,
480                            struct ethtool_stats *stats, u64 *data)
481 {
482         struct hnae3_handle *h = hns3_get_handle(netdev);
483         u64 *p = data;
484
485         if (!h->ae_algo->ops->get_stats || !h->ae_algo->ops->update_stats) {
486                 netdev_err(netdev, "could not get any statistics\n");
487                 return;
488         }
489
490         h->ae_algo->ops->update_stats(h, &netdev->stats);
491
492         /* get per-queue stats */
493         p = hns3_get_stats_tqps(h, p);
494
495         /* get MAC & other misc hardware stats */
496         h->ae_algo->ops->get_stats(h, p);
497 }
498
499 static void hns3_get_drvinfo(struct net_device *netdev,
500                              struct ethtool_drvinfo *drvinfo)
501 {
502         struct hns3_nic_priv *priv = netdev_priv(netdev);
503         struct hnae3_handle *h = priv->ae_handle;
504
505         strncpy(drvinfo->version, hns3_driver_version,
506                 sizeof(drvinfo->version));
507         drvinfo->version[sizeof(drvinfo->version) - 1] = '\0';
508
509         strncpy(drvinfo->driver, h->pdev->driver->name,
510                 sizeof(drvinfo->driver));
511         drvinfo->driver[sizeof(drvinfo->driver) - 1] = '\0';
512
513         strncpy(drvinfo->bus_info, pci_name(h->pdev),
514                 sizeof(drvinfo->bus_info));
515         drvinfo->bus_info[ETHTOOL_BUSINFO_LEN - 1] = '\0';
516
517         snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "0x%08x",
518                  priv->ae_handle->ae_algo->ops->get_fw_version(h));
519 }
520
521 static u32 hns3_get_link(struct net_device *netdev)
522 {
523         struct hnae3_handle *h = hns3_get_handle(netdev);
524
525         if (h->ae_algo && h->ae_algo->ops && h->ae_algo->ops->get_status)
526                 return h->ae_algo->ops->get_status(h);
527         else
528                 return 0;
529 }
530
531 static void hns3_get_ringparam(struct net_device *netdev,
532                                struct ethtool_ringparam *param)
533 {
534         struct hns3_nic_priv *priv = netdev_priv(netdev);
535         struct hnae3_handle *h = priv->ae_handle;
536         int queue_num = h->kinfo.num_tqps;
537
538         if (hns3_nic_resetting(netdev)) {
539                 netdev_err(netdev, "dev resetting!");
540                 return;
541         }
542
543         param->tx_max_pending = HNS3_RING_MAX_PENDING;
544         param->rx_max_pending = HNS3_RING_MAX_PENDING;
545
546         param->tx_pending = priv->ring_data[0].ring->desc_num;
547         param->rx_pending = priv->ring_data[queue_num].ring->desc_num;
548 }
549
550 static void hns3_get_pauseparam(struct net_device *netdev,
551                                 struct ethtool_pauseparam *param)
552 {
553         struct hnae3_handle *h = hns3_get_handle(netdev);
554
555         if (h->ae_algo && h->ae_algo->ops && h->ae_algo->ops->get_pauseparam)
556                 h->ae_algo->ops->get_pauseparam(h, &param->autoneg,
557                         &param->rx_pause, &param->tx_pause);
558 }
559
560 static int hns3_set_pauseparam(struct net_device *netdev,
561                                struct ethtool_pauseparam *param)
562 {
563         struct hnae3_handle *h = hns3_get_handle(netdev);
564
565         if (h->ae_algo->ops->set_pauseparam)
566                 return h->ae_algo->ops->set_pauseparam(h, param->autoneg,
567                                                        param->rx_pause,
568                                                        param->tx_pause);
569         return -EOPNOTSUPP;
570 }
571
572 static void hns3_get_ksettings(struct hnae3_handle *h,
573                                struct ethtool_link_ksettings *cmd)
574 {
575         const struct hnae3_ae_ops *ops = h->ae_algo->ops;
576
577         /* 1.auto_neg & speed & duplex from cmd */
578         if (ops->get_ksettings_an_result)
579                 ops->get_ksettings_an_result(h,
580                                              &cmd->base.autoneg,
581                                              &cmd->base.speed,
582                                              &cmd->base.duplex);
583
584         /* 2.get link mode*/
585         if (ops->get_link_mode)
586                 ops->get_link_mode(h,
587                                    cmd->link_modes.supported,
588                                    cmd->link_modes.advertising);
589
590         /* 3.mdix_ctrl&mdix get from phy reg */
591         if (ops->get_mdix_mode)
592                 ops->get_mdix_mode(h, &cmd->base.eth_tp_mdix_ctrl,
593                                    &cmd->base.eth_tp_mdix);
594 }
595
596 static int hns3_get_link_ksettings(struct net_device *netdev,
597                                    struct ethtool_link_ksettings *cmd)
598 {
599         struct hnae3_handle *h = hns3_get_handle(netdev);
600         const struct hnae3_ae_ops *ops;
601         u8 media_type;
602         u8 link_stat;
603
604         if (!h->ae_algo || !h->ae_algo->ops)
605                 return -EOPNOTSUPP;
606
607         ops = h->ae_algo->ops;
608         if (ops->get_media_type)
609                 ops->get_media_type(h, &media_type);
610         else
611                 return -EOPNOTSUPP;
612
613         switch (media_type) {
614         case HNAE3_MEDIA_TYPE_NONE:
615                 cmd->base.port = PORT_NONE;
616                 hns3_get_ksettings(h, cmd);
617                 break;
618         case HNAE3_MEDIA_TYPE_FIBER:
619                 cmd->base.port = PORT_FIBRE;
620                 hns3_get_ksettings(h, cmd);
621                 break;
622         case HNAE3_MEDIA_TYPE_COPPER:
623                 if (!netdev->phydev)
624                         return -EOPNOTSUPP;
625
626                 cmd->base.port = PORT_TP;
627                 phy_ethtool_ksettings_get(netdev->phydev, cmd);
628
629                 break;
630         default:
631
632                 netdev_warn(netdev, "Unknown media type");
633                 return 0;
634         }
635
636         /* mdio_support */
637         cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22;
638
639         link_stat = hns3_get_link(netdev);
640         if (!link_stat) {
641                 cmd->base.speed = SPEED_UNKNOWN;
642                 cmd->base.duplex = DUPLEX_UNKNOWN;
643         }
644
645         return 0;
646 }
647
648 static int hns3_set_link_ksettings(struct net_device *netdev,
649                                    const struct ethtool_link_ksettings *cmd)
650 {
651         /* Only support ksettings_set for netdev with phy attached for now */
652         if (netdev->phydev)
653                 return phy_ethtool_ksettings_set(netdev->phydev, cmd);
654
655         return -EOPNOTSUPP;
656 }
657
658 static u32 hns3_get_rss_key_size(struct net_device *netdev)
659 {
660         struct hnae3_handle *h = hns3_get_handle(netdev);
661
662         if (!h->ae_algo || !h->ae_algo->ops ||
663             !h->ae_algo->ops->get_rss_key_size)
664                 return 0;
665
666         return h->ae_algo->ops->get_rss_key_size(h);
667 }
668
669 static u32 hns3_get_rss_indir_size(struct net_device *netdev)
670 {
671         struct hnae3_handle *h = hns3_get_handle(netdev);
672
673         if (!h->ae_algo || !h->ae_algo->ops ||
674             !h->ae_algo->ops->get_rss_indir_size)
675                 return 0;
676
677         return h->ae_algo->ops->get_rss_indir_size(h);
678 }
679
680 static int hns3_get_rss(struct net_device *netdev, u32 *indir, u8 *key,
681                         u8 *hfunc)
682 {
683         struct hnae3_handle *h = hns3_get_handle(netdev);
684
685         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->get_rss)
686                 return -EOPNOTSUPP;
687
688         return h->ae_algo->ops->get_rss(h, indir, key, hfunc);
689 }
690
691 static int hns3_set_rss(struct net_device *netdev, const u32 *indir,
692                         const u8 *key, const u8 hfunc)
693 {
694         struct hnae3_handle *h = hns3_get_handle(netdev);
695
696         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->set_rss)
697                 return -EOPNOTSUPP;
698
699         if ((h->pdev->revision == 0x20 &&
700              hfunc != ETH_RSS_HASH_TOP) || (hfunc != ETH_RSS_HASH_NO_CHANGE &&
701              hfunc != ETH_RSS_HASH_TOP && hfunc != ETH_RSS_HASH_XOR)) {
702                 netdev_err(netdev, "hash func not supported\n");
703                 return -EOPNOTSUPP;
704         }
705
706         if (!indir) {
707                 netdev_err(netdev,
708                            "set rss failed for indir is empty\n");
709                 return -EOPNOTSUPP;
710         }
711
712         return h->ae_algo->ops->set_rss(h, indir, key, hfunc);
713 }
714
715 static int hns3_get_rxnfc(struct net_device *netdev,
716                           struct ethtool_rxnfc *cmd,
717                           u32 *rule_locs)
718 {
719         struct hnae3_handle *h = hns3_get_handle(netdev);
720
721         if (!h->ae_algo || !h->ae_algo->ops)
722                 return -EOPNOTSUPP;
723
724         switch (cmd->cmd) {
725         case ETHTOOL_GRXRINGS:
726                 cmd->data = h->kinfo.num_tqps;
727                 return 0;
728         case ETHTOOL_GRXFH:
729                 if (h->ae_algo->ops->get_rss_tuple)
730                         return h->ae_algo->ops->get_rss_tuple(h, cmd);
731                 return -EOPNOTSUPP;
732         case ETHTOOL_GRXCLSRLCNT:
733                 if (h->ae_algo->ops->get_fd_rule_cnt)
734                         return h->ae_algo->ops->get_fd_rule_cnt(h, cmd);
735                 return -EOPNOTSUPP;
736         case ETHTOOL_GRXCLSRULE:
737                 if (h->ae_algo->ops->get_fd_rule_info)
738                         return h->ae_algo->ops->get_fd_rule_info(h, cmd);
739                 return -EOPNOTSUPP;
740         case ETHTOOL_GRXCLSRLALL:
741                 if (h->ae_algo->ops->get_fd_all_rules)
742                         return h->ae_algo->ops->get_fd_all_rules(h, cmd,
743                                                                  rule_locs);
744                 return -EOPNOTSUPP;
745         default:
746                 return -EOPNOTSUPP;
747         }
748 }
749
750 static int hns3_change_all_ring_bd_num(struct hns3_nic_priv *priv,
751                                        u32 new_desc_num)
752 {
753         struct hnae3_handle *h = priv->ae_handle;
754         int i;
755
756         h->kinfo.num_desc = new_desc_num;
757
758         for (i = 0; i < h->kinfo.num_tqps * 2; i++)
759                 priv->ring_data[i].ring->desc_num = new_desc_num;
760
761         return hns3_init_all_ring(priv);
762 }
763
764 static int hns3_set_ringparam(struct net_device *ndev,
765                               struct ethtool_ringparam *param)
766 {
767         struct hns3_nic_priv *priv = netdev_priv(ndev);
768         struct hnae3_handle *h = priv->ae_handle;
769         bool if_running = netif_running(ndev);
770         u32 old_desc_num, new_desc_num;
771         int ret;
772
773         if (hns3_nic_resetting(ndev))
774                 return -EBUSY;
775
776         if (param->rx_mini_pending || param->rx_jumbo_pending)
777                 return -EINVAL;
778
779         if (param->tx_pending != param->rx_pending) {
780                 netdev_err(ndev,
781                            "Descriptors of tx and rx must be equal");
782                 return -EINVAL;
783         }
784
785         if (param->tx_pending > HNS3_RING_MAX_PENDING ||
786             param->tx_pending < HNS3_RING_MIN_PENDING) {
787                 netdev_err(ndev,
788                            "Descriptors requested (Tx/Rx: %d) out of range [%d-%d]\n",
789                            param->tx_pending, HNS3_RING_MIN_PENDING,
790                            HNS3_RING_MAX_PENDING);
791                 return -EINVAL;
792         }
793
794         new_desc_num = param->tx_pending;
795
796         /* Hardware requires that its descriptors must be multiple of eight */
797         new_desc_num = ALIGN(new_desc_num, HNS3_RING_BD_MULTIPLE);
798         old_desc_num = h->kinfo.num_desc;
799         if (old_desc_num == new_desc_num)
800                 return 0;
801
802         netdev_info(ndev,
803                     "Changing descriptor count from %d to %d.\n",
804                     old_desc_num, new_desc_num);
805
806         if (if_running)
807                 dev_close(ndev);
808
809         ret = hns3_uninit_all_ring(priv);
810         if (ret)
811                 return ret;
812
813         ret = hns3_change_all_ring_bd_num(priv, new_desc_num);
814         if (ret) {
815                 ret = hns3_change_all_ring_bd_num(priv, old_desc_num);
816                 if (ret) {
817                         netdev_err(ndev,
818                                    "Revert to old bd num fail, ret=%d.\n", ret);
819                         return ret;
820                 }
821         }
822
823         if (if_running)
824                 ret = dev_open(ndev, NULL);
825
826         return ret;
827 }
828
829 static int hns3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)
830 {
831         struct hnae3_handle *h = hns3_get_handle(netdev);
832
833         if (!h->ae_algo || !h->ae_algo->ops)
834                 return -EOPNOTSUPP;
835
836         switch (cmd->cmd) {
837         case ETHTOOL_SRXFH:
838                 if (h->ae_algo->ops->set_rss_tuple)
839                         return h->ae_algo->ops->set_rss_tuple(h, cmd);
840                 return -EOPNOTSUPP;
841         case ETHTOOL_SRXCLSRLINS:
842                 if (h->ae_algo->ops->add_fd_entry)
843                         return h->ae_algo->ops->add_fd_entry(h, cmd);
844                 return -EOPNOTSUPP;
845         case ETHTOOL_SRXCLSRLDEL:
846                 if (h->ae_algo->ops->del_fd_entry)
847                         return h->ae_algo->ops->del_fd_entry(h, cmd);
848                 return -EOPNOTSUPP;
849         default:
850                 return -EOPNOTSUPP;
851         }
852 }
853
854 static int hns3_nway_reset(struct net_device *netdev)
855 {
856         struct phy_device *phy = netdev->phydev;
857
858         if (!netif_running(netdev))
859                 return 0;
860
861         /* Only support nway_reset for netdev with phy attached for now */
862         if (!phy)
863                 return -EOPNOTSUPP;
864
865         if (phy->autoneg != AUTONEG_ENABLE)
866                 return -EINVAL;
867
868         return genphy_restart_aneg(phy);
869 }
870
871 static void hns3_get_channels(struct net_device *netdev,
872                               struct ethtool_channels *ch)
873 {
874         struct hnae3_handle *h = hns3_get_handle(netdev);
875
876         if (h->ae_algo->ops->get_channels)
877                 h->ae_algo->ops->get_channels(h, ch);
878 }
879
880 static int hns3_get_coalesce_per_queue(struct net_device *netdev, u32 queue,
881                                        struct ethtool_coalesce *cmd)
882 {
883         struct hns3_enet_tqp_vector *tx_vector, *rx_vector;
884         struct hns3_nic_priv *priv = netdev_priv(netdev);
885         struct hnae3_handle *h = priv->ae_handle;
886         u16 queue_num = h->kinfo.num_tqps;
887
888         if (hns3_nic_resetting(netdev))
889                 return -EBUSY;
890
891         if (queue >= queue_num) {
892                 netdev_err(netdev,
893                            "Invalid queue value %d! Queue max id=%d\n",
894                            queue, queue_num - 1);
895                 return -EINVAL;
896         }
897
898         tx_vector = priv->ring_data[queue].ring->tqp_vector;
899         rx_vector = priv->ring_data[queue_num + queue].ring->tqp_vector;
900
901         cmd->use_adaptive_tx_coalesce =
902                         tx_vector->tx_group.coal.gl_adapt_enable;
903         cmd->use_adaptive_rx_coalesce =
904                         rx_vector->rx_group.coal.gl_adapt_enable;
905
906         cmd->tx_coalesce_usecs = tx_vector->tx_group.coal.int_gl;
907         cmd->rx_coalesce_usecs = rx_vector->rx_group.coal.int_gl;
908
909         cmd->tx_coalesce_usecs_high = h->kinfo.int_rl_setting;
910         cmd->rx_coalesce_usecs_high = h->kinfo.int_rl_setting;
911
912         return 0;
913 }
914
915 static int hns3_get_coalesce(struct net_device *netdev,
916                              struct ethtool_coalesce *cmd)
917 {
918         return hns3_get_coalesce_per_queue(netdev, 0, cmd);
919 }
920
921 static int hns3_check_gl_coalesce_para(struct net_device *netdev,
922                                        struct ethtool_coalesce *cmd)
923 {
924         u32 rx_gl, tx_gl;
925
926         if (cmd->rx_coalesce_usecs > HNS3_INT_GL_MAX) {
927                 netdev_err(netdev,
928                            "Invalid rx-usecs value, rx-usecs range is 0-%d\n",
929                            HNS3_INT_GL_MAX);
930                 return -EINVAL;
931         }
932
933         if (cmd->tx_coalesce_usecs > HNS3_INT_GL_MAX) {
934                 netdev_err(netdev,
935                            "Invalid tx-usecs value, tx-usecs range is 0-%d\n",
936                            HNS3_INT_GL_MAX);
937                 return -EINVAL;
938         }
939
940         rx_gl = hns3_gl_round_down(cmd->rx_coalesce_usecs);
941         if (rx_gl != cmd->rx_coalesce_usecs) {
942                 netdev_info(netdev,
943                             "rx_usecs(%d) rounded down to %d, because it must be multiple of 2.\n",
944                             cmd->rx_coalesce_usecs, rx_gl);
945         }
946
947         tx_gl = hns3_gl_round_down(cmd->tx_coalesce_usecs);
948         if (tx_gl != cmd->tx_coalesce_usecs) {
949                 netdev_info(netdev,
950                             "tx_usecs(%d) rounded down to %d, because it must be multiple of 2.\n",
951                             cmd->tx_coalesce_usecs, tx_gl);
952         }
953
954         return 0;
955 }
956
957 static int hns3_check_rl_coalesce_para(struct net_device *netdev,
958                                        struct ethtool_coalesce *cmd)
959 {
960         u32 rl;
961
962         if (cmd->tx_coalesce_usecs_high != cmd->rx_coalesce_usecs_high) {
963                 netdev_err(netdev,
964                            "tx_usecs_high must be same as rx_usecs_high.\n");
965                 return -EINVAL;
966         }
967
968         if (cmd->rx_coalesce_usecs_high > HNS3_INT_RL_MAX) {
969                 netdev_err(netdev,
970                            "Invalid usecs_high value, usecs_high range is 0-%d\n",
971                            HNS3_INT_RL_MAX);
972                 return -EINVAL;
973         }
974
975         rl = hns3_rl_round_down(cmd->rx_coalesce_usecs_high);
976         if (rl != cmd->rx_coalesce_usecs_high) {
977                 netdev_info(netdev,
978                             "usecs_high(%d) rounded down to %d, because it must be multiple of 4.\n",
979                             cmd->rx_coalesce_usecs_high, rl);
980         }
981
982         return 0;
983 }
984
985 static int hns3_check_coalesce_para(struct net_device *netdev,
986                                     struct ethtool_coalesce *cmd)
987 {
988         int ret;
989
990         ret = hns3_check_gl_coalesce_para(netdev, cmd);
991         if (ret) {
992                 netdev_err(netdev,
993                            "Check gl coalesce param fail. ret = %d\n", ret);
994                 return ret;
995         }
996
997         ret = hns3_check_rl_coalesce_para(netdev, cmd);
998         if (ret) {
999                 netdev_err(netdev,
1000                            "Check rl coalesce param fail. ret = %d\n", ret);
1001                 return ret;
1002         }
1003
1004         if (cmd->use_adaptive_tx_coalesce == 1 ||
1005             cmd->use_adaptive_rx_coalesce == 1) {
1006                 netdev_info(netdev,
1007                             "adaptive-tx=%d and adaptive-rx=%d, tx_usecs or rx_usecs will changed dynamically.\n",
1008                             cmd->use_adaptive_tx_coalesce,
1009                             cmd->use_adaptive_rx_coalesce);
1010         }
1011
1012         return 0;
1013 }
1014
1015 static void hns3_set_coalesce_per_queue(struct net_device *netdev,
1016                                         struct ethtool_coalesce *cmd,
1017                                         u32 queue)
1018 {
1019         struct hns3_enet_tqp_vector *tx_vector, *rx_vector;
1020         struct hns3_nic_priv *priv = netdev_priv(netdev);
1021         struct hnae3_handle *h = priv->ae_handle;
1022         int queue_num = h->kinfo.num_tqps;
1023
1024         tx_vector = priv->ring_data[queue].ring->tqp_vector;
1025         rx_vector = priv->ring_data[queue_num + queue].ring->tqp_vector;
1026
1027         tx_vector->tx_group.coal.gl_adapt_enable =
1028                                 cmd->use_adaptive_tx_coalesce;
1029         rx_vector->rx_group.coal.gl_adapt_enable =
1030                                 cmd->use_adaptive_rx_coalesce;
1031
1032         tx_vector->tx_group.coal.int_gl = cmd->tx_coalesce_usecs;
1033         rx_vector->rx_group.coal.int_gl = cmd->rx_coalesce_usecs;
1034
1035         hns3_set_vector_coalesce_tx_gl(tx_vector,
1036                                        tx_vector->tx_group.coal.int_gl);
1037         hns3_set_vector_coalesce_rx_gl(rx_vector,
1038                                        rx_vector->rx_group.coal.int_gl);
1039
1040         hns3_set_vector_coalesce_rl(tx_vector, h->kinfo.int_rl_setting);
1041         hns3_set_vector_coalesce_rl(rx_vector, h->kinfo.int_rl_setting);
1042 }
1043
1044 static int hns3_set_coalesce(struct net_device *netdev,
1045                              struct ethtool_coalesce *cmd)
1046 {
1047         struct hnae3_handle *h = hns3_get_handle(netdev);
1048         u16 queue_num = h->kinfo.num_tqps;
1049         int ret;
1050         int i;
1051
1052         if (hns3_nic_resetting(netdev))
1053                 return -EBUSY;
1054
1055         ret = hns3_check_coalesce_para(netdev, cmd);
1056         if (ret)
1057                 return ret;
1058
1059         h->kinfo.int_rl_setting =
1060                 hns3_rl_round_down(cmd->rx_coalesce_usecs_high);
1061
1062         for (i = 0; i < queue_num; i++)
1063                 hns3_set_coalesce_per_queue(netdev, cmd, i);
1064
1065         return 0;
1066 }
1067
1068 static int hns3_get_regs_len(struct net_device *netdev)
1069 {
1070         struct hnae3_handle *h = hns3_get_handle(netdev);
1071
1072         if (!h->ae_algo->ops->get_regs_len)
1073                 return -EOPNOTSUPP;
1074
1075         return h->ae_algo->ops->get_regs_len(h);
1076 }
1077
1078 static void hns3_get_regs(struct net_device *netdev,
1079                           struct ethtool_regs *cmd, void *data)
1080 {
1081         struct hnae3_handle *h = hns3_get_handle(netdev);
1082
1083         if (!h->ae_algo->ops->get_regs)
1084                 return;
1085
1086         h->ae_algo->ops->get_regs(h, &cmd->version, data);
1087 }
1088
1089 static int hns3_set_phys_id(struct net_device *netdev,
1090                             enum ethtool_phys_id_state state)
1091 {
1092         struct hnae3_handle *h = hns3_get_handle(netdev);
1093
1094         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->set_led_id)
1095                 return -EOPNOTSUPP;
1096
1097         return h->ae_algo->ops->set_led_id(h, state);
1098 }
1099
1100 static const struct ethtool_ops hns3vf_ethtool_ops = {
1101         .get_drvinfo = hns3_get_drvinfo,
1102         .get_ringparam = hns3_get_ringparam,
1103         .set_ringparam = hns3_set_ringparam,
1104         .get_strings = hns3_get_strings,
1105         .get_ethtool_stats = hns3_get_stats,
1106         .get_sset_count = hns3_get_sset_count,
1107         .get_rxnfc = hns3_get_rxnfc,
1108         .set_rxnfc = hns3_set_rxnfc,
1109         .get_rxfh_key_size = hns3_get_rss_key_size,
1110         .get_rxfh_indir_size = hns3_get_rss_indir_size,
1111         .get_rxfh = hns3_get_rss,
1112         .set_rxfh = hns3_set_rss,
1113         .get_link_ksettings = hns3_get_link_ksettings,
1114         .get_channels = hns3_get_channels,
1115         .get_coalesce = hns3_get_coalesce,
1116         .set_coalesce = hns3_set_coalesce,
1117         .get_link = hns3_get_link,
1118 };
1119
1120 static const struct ethtool_ops hns3_ethtool_ops = {
1121         .self_test = hns3_self_test,
1122         .get_drvinfo = hns3_get_drvinfo,
1123         .get_link = hns3_get_link,
1124         .get_ringparam = hns3_get_ringparam,
1125         .set_ringparam = hns3_set_ringparam,
1126         .get_pauseparam = hns3_get_pauseparam,
1127         .set_pauseparam = hns3_set_pauseparam,
1128         .get_strings = hns3_get_strings,
1129         .get_ethtool_stats = hns3_get_stats,
1130         .get_sset_count = hns3_get_sset_count,
1131         .get_rxnfc = hns3_get_rxnfc,
1132         .set_rxnfc = hns3_set_rxnfc,
1133         .get_rxfh_key_size = hns3_get_rss_key_size,
1134         .get_rxfh_indir_size = hns3_get_rss_indir_size,
1135         .get_rxfh = hns3_get_rss,
1136         .set_rxfh = hns3_set_rss,
1137         .get_link_ksettings = hns3_get_link_ksettings,
1138         .set_link_ksettings = hns3_set_link_ksettings,
1139         .nway_reset = hns3_nway_reset,
1140         .get_channels = hns3_get_channels,
1141         .set_channels = hns3_set_channels,
1142         .get_coalesce = hns3_get_coalesce,
1143         .set_coalesce = hns3_set_coalesce,
1144         .get_regs_len = hns3_get_regs_len,
1145         .get_regs = hns3_get_regs,
1146         .set_phys_id = hns3_set_phys_id,
1147 };
1148
1149 void hns3_ethtool_set_ops(struct net_device *netdev)
1150 {
1151         struct hnae3_handle *h = hns3_get_handle(netdev);
1152
1153         if (h->flags & HNAE3_SUPPORT_VF)
1154                 netdev->ethtool_ops = &hns3vf_ethtool_ops;
1155         else
1156                 netdev->ethtool_ops = &hns3_ethtool_ops;
1157 }