]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
net: hns3: hns3_get_channels() can be static
[linux.git] / drivers / net / ethernet / hisilicon / hns3 / hns3_ethtool.c
1 /*
2  * Copyright (c) 2016~2017 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/string.h>
12 #include <linux/phy.h>
13
14 #include "hns3_enet.h"
15
16 struct hns3_stats {
17         char stats_string[ETH_GSTRING_LEN];
18         int stats_size;
19         int stats_offset;
20 };
21
22 /* tqp related stats */
23 #define HNS3_TQP_STAT(_string, _member) {                       \
24         .stats_string = _string,                                \
25         .stats_size = FIELD_SIZEOF(struct ring_stats, _member), \
26         .stats_offset = offsetof(struct hns3_enet_ring, stats), \
27 }                                                               \
28
29 static const struct hns3_stats hns3_txq_stats[] = {
30         /* Tx per-queue statistics */
31         HNS3_TQP_STAT("tx_io_err_cnt", io_err_cnt),
32         HNS3_TQP_STAT("tx_sw_err_cnt", sw_err_cnt),
33         HNS3_TQP_STAT("tx_seg_pkt_cnt", seg_pkt_cnt),
34         HNS3_TQP_STAT("tx_pkts", tx_pkts),
35         HNS3_TQP_STAT("tx_bytes", tx_bytes),
36         HNS3_TQP_STAT("tx_err_cnt", tx_err_cnt),
37         HNS3_TQP_STAT("tx_restart_queue", restart_queue),
38         HNS3_TQP_STAT("tx_busy", tx_busy),
39 };
40
41 #define HNS3_TXQ_STATS_COUNT ARRAY_SIZE(hns3_txq_stats)
42
43 static const struct hns3_stats hns3_rxq_stats[] = {
44         /* Rx per-queue statistics */
45         HNS3_TQP_STAT("rx_io_err_cnt", io_err_cnt),
46         HNS3_TQP_STAT("rx_sw_err_cnt", sw_err_cnt),
47         HNS3_TQP_STAT("rx_seg_pkt_cnt", seg_pkt_cnt),
48         HNS3_TQP_STAT("rx_pkts", rx_pkts),
49         HNS3_TQP_STAT("rx_bytes", rx_bytes),
50         HNS3_TQP_STAT("rx_err_cnt", rx_err_cnt),
51         HNS3_TQP_STAT("rx_reuse_pg_cnt", reuse_pg_cnt),
52         HNS3_TQP_STAT("rx_err_pkt_len", err_pkt_len),
53         HNS3_TQP_STAT("rx_non_vld_descs", non_vld_descs),
54         HNS3_TQP_STAT("rx_err_bd_num", err_bd_num),
55         HNS3_TQP_STAT("rx_l2_err", l2_err),
56         HNS3_TQP_STAT("rx_l3l4_csum_err", l3l4_csum_err),
57 };
58
59 #define HNS3_RXQ_STATS_COUNT ARRAY_SIZE(hns3_rxq_stats)
60
61 #define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT)
62
63 #define HNS3_SELF_TEST_TPYE_NUM         1
64 #define HNS3_NIC_LB_TEST_PKT_NUM        1
65 #define HNS3_NIC_LB_TEST_RING_ID        0
66 #define HNS3_NIC_LB_TEST_PACKET_SIZE    128
67
68 /* Nic loopback test err  */
69 #define HNS3_NIC_LB_TEST_NO_MEM_ERR     1
70 #define HNS3_NIC_LB_TEST_TX_CNT_ERR     2
71 #define HNS3_NIC_LB_TEST_RX_CNT_ERR     3
72
73 struct hns3_link_mode_mapping {
74         u32 hns3_link_mode;
75         u32 ethtool_link_mode;
76 };
77
78 static const struct hns3_link_mode_mapping hns3_lm_map[] = {
79         {HNS3_LM_FIBRE_BIT, ETHTOOL_LINK_MODE_FIBRE_BIT},
80         {HNS3_LM_AUTONEG_BIT, ETHTOOL_LINK_MODE_Autoneg_BIT},
81         {HNS3_LM_TP_BIT, ETHTOOL_LINK_MODE_TP_BIT},
82         {HNS3_LM_PAUSE_BIT, ETHTOOL_LINK_MODE_Pause_BIT},
83         {HNS3_LM_BACKPLANE_BIT, ETHTOOL_LINK_MODE_Backplane_BIT},
84         {HNS3_LM_10BASET_HALF_BIT, ETHTOOL_LINK_MODE_10baseT_Half_BIT},
85         {HNS3_LM_10BASET_FULL_BIT, ETHTOOL_LINK_MODE_10baseT_Full_BIT},
86         {HNS3_LM_100BASET_HALF_BIT, ETHTOOL_LINK_MODE_100baseT_Half_BIT},
87         {HNS3_LM_100BASET_FULL_BIT, ETHTOOL_LINK_MODE_100baseT_Full_BIT},
88         {HNS3_LM_1000BASET_FULL_BIT, ETHTOOL_LINK_MODE_1000baseT_Full_BIT},
89 };
90
91 static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
92 {
93         struct hnae3_handle *h = hns3_get_handle(ndev);
94         int ret;
95
96         if (!h->ae_algo->ops->set_loopback ||
97             !h->ae_algo->ops->set_promisc_mode)
98                 return -EOPNOTSUPP;
99
100         switch (loop) {
101         case HNAE3_MAC_INTER_LOOP_MAC:
102                 ret = h->ae_algo->ops->set_loopback(h, loop, true);
103                 break;
104         case HNAE3_MAC_LOOP_NONE:
105                 ret = h->ae_algo->ops->set_loopback(h,
106                         HNAE3_MAC_INTER_LOOP_MAC, false);
107                 break;
108         default:
109                 ret = -ENOTSUPP;
110                 break;
111         }
112
113         if (ret)
114                 return ret;
115
116         if (loop == HNAE3_MAC_LOOP_NONE)
117                 h->ae_algo->ops->set_promisc_mode(h, ndev->flags & IFF_PROMISC);
118         else
119                 h->ae_algo->ops->set_promisc_mode(h, 1);
120
121         return ret;
122 }
123
124 static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
125 {
126         struct hnae3_handle *h = hns3_get_handle(ndev);
127         int ret;
128
129         if (!h->ae_algo->ops->start)
130                 return -EOPNOTSUPP;
131
132         ret = h->ae_algo->ops->start(h);
133         if (ret) {
134                 netdev_err(ndev,
135                            "hns3_lb_up ae start return error: %d\n", ret);
136                 return ret;
137         }
138
139         ret = hns3_lp_setup(ndev, loop_mode);
140         usleep_range(10000, 20000);
141
142         return ret;
143 }
144
145 static int hns3_lp_down(struct net_device *ndev)
146 {
147         struct hnae3_handle *h = hns3_get_handle(ndev);
148         int ret;
149
150         if (!h->ae_algo->ops->stop)
151                 return -EOPNOTSUPP;
152
153         ret = hns3_lp_setup(ndev, HNAE3_MAC_LOOP_NONE);
154         if (ret) {
155                 netdev_err(ndev, "lb_setup return error: %d\n", ret);
156                 return ret;
157         }
158
159         h->ae_algo->ops->stop(h);
160         usleep_range(10000, 20000);
161
162         return 0;
163 }
164
165 static void hns3_lp_setup_skb(struct sk_buff *skb)
166 {
167         struct net_device *ndev = skb->dev;
168         unsigned char *packet;
169         struct ethhdr *ethh;
170         unsigned int i;
171
172         skb_reserve(skb, NET_IP_ALIGN);
173         ethh = skb_put(skb, sizeof(struct ethhdr));
174         packet = skb_put(skb, HNS3_NIC_LB_TEST_PACKET_SIZE);
175
176         memcpy(ethh->h_dest, ndev->dev_addr, ETH_ALEN);
177         eth_zero_addr(ethh->h_source);
178         ethh->h_proto = htons(ETH_P_ARP);
179         skb_reset_mac_header(skb);
180
181         for (i = 0; i < HNS3_NIC_LB_TEST_PACKET_SIZE; i++)
182                 packet[i] = (unsigned char)(i & 0xff);
183 }
184
185 static void hns3_lb_check_skb_data(struct hns3_enet_ring *ring,
186                                    struct sk_buff *skb)
187 {
188         struct hns3_enet_tqp_vector *tqp_vector = ring->tqp_vector;
189         unsigned char *packet = skb->data;
190         u32 i;
191
192         for (i = 0; i < skb->len; i++)
193                 if (packet[i] != (unsigned char)(i & 0xff))
194                         break;
195
196         /* The packet is correctly received */
197         if (i == skb->len)
198                 tqp_vector->rx_group.total_packets++;
199         else
200                 print_hex_dump(KERN_ERR, "selftest:", DUMP_PREFIX_OFFSET, 16, 1,
201                                skb->data, skb->len, true);
202
203         dev_kfree_skb_any(skb);
204 }
205
206 static u32 hns3_lb_check_rx_ring(struct hns3_nic_priv *priv, u32 budget)
207 {
208         struct hnae3_handle *h = priv->ae_handle;
209         struct hnae3_knic_private_info *kinfo;
210         u32 i, rcv_good_pkt_total = 0;
211
212         kinfo = &h->kinfo;
213         for (i = kinfo->num_tqps; i < kinfo->num_tqps * 2; i++) {
214                 struct hns3_enet_ring *ring = priv->ring_data[i].ring;
215                 struct hns3_enet_ring_group *rx_group;
216                 u64 pre_rx_pkt;
217
218                 rx_group = &ring->tqp_vector->rx_group;
219                 pre_rx_pkt = rx_group->total_packets;
220
221                 hns3_clean_rx_ring(ring, budget, hns3_lb_check_skb_data);
222
223                 rcv_good_pkt_total += (rx_group->total_packets - pre_rx_pkt);
224                 rx_group->total_packets = pre_rx_pkt;
225         }
226         return rcv_good_pkt_total;
227 }
228
229 static void hns3_lb_clear_tx_ring(struct hns3_nic_priv *priv, u32 start_ringid,
230                                   u32 end_ringid, u32 budget)
231 {
232         u32 i;
233
234         for (i = start_ringid; i <= end_ringid; i++) {
235                 struct hns3_enet_ring *ring = priv->ring_data[i].ring;
236
237                 hns3_clean_tx_ring(ring, budget);
238         }
239 }
240
241 /**
242  * hns3_lp_run_test -  run loopback test
243  * @ndev: net device
244  * @mode: loopback type
245  */
246 static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
247 {
248         struct hns3_nic_priv *priv = netdev_priv(ndev);
249         struct sk_buff *skb;
250         u32 i, good_cnt;
251         int ret_val = 0;
252
253         skb = alloc_skb(HNS3_NIC_LB_TEST_PACKET_SIZE + ETH_HLEN + NET_IP_ALIGN,
254                         GFP_KERNEL);
255         if (!skb)
256                 return HNS3_NIC_LB_TEST_NO_MEM_ERR;
257
258         skb->dev = ndev;
259         hns3_lp_setup_skb(skb);
260         skb->queue_mapping = HNS3_NIC_LB_TEST_RING_ID;
261
262         good_cnt = 0;
263         for (i = 0; i < HNS3_NIC_LB_TEST_PKT_NUM; i++) {
264                 netdev_tx_t tx_ret;
265
266                 skb_get(skb);
267                 tx_ret = hns3_nic_net_xmit(skb, ndev);
268                 if (tx_ret == NETDEV_TX_OK)
269                         good_cnt++;
270                 else
271                         netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n",
272                                    tx_ret);
273         }
274         if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
275                 ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR;
276                 netdev_err(ndev, "mode %d sent fail, cnt=0x%x, budget=0x%x\n",
277                            mode, good_cnt, HNS3_NIC_LB_TEST_PKT_NUM);
278                 goto out;
279         }
280
281         /* Allow 200 milliseconds for packets to go from Tx to Rx */
282         msleep(200);
283
284         good_cnt = hns3_lb_check_rx_ring(priv, HNS3_NIC_LB_TEST_PKT_NUM);
285         if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
286                 ret_val = HNS3_NIC_LB_TEST_RX_CNT_ERR;
287                 netdev_err(ndev, "mode %d recv fail, cnt=0x%x, budget=0x%x\n",
288                            mode, good_cnt, HNS3_NIC_LB_TEST_PKT_NUM);
289         }
290
291 out:
292         hns3_lb_clear_tx_ring(priv, HNS3_NIC_LB_TEST_RING_ID,
293                               HNS3_NIC_LB_TEST_RING_ID,
294                               HNS3_NIC_LB_TEST_PKT_NUM);
295
296         kfree_skb(skb);
297         return ret_val;
298 }
299
300 /**
301  * hns3_nic_self_test - self test
302  * @ndev: net device
303  * @eth_test: test cmd
304  * @data: test result
305  */
306 static void hns3_self_test(struct net_device *ndev,
307                            struct ethtool_test *eth_test, u64 *data)
308 {
309         struct hns3_nic_priv *priv = netdev_priv(ndev);
310         struct hnae3_handle *h = priv->ae_handle;
311         int st_param[HNS3_SELF_TEST_TPYE_NUM][2];
312         bool if_running = netif_running(ndev);
313         int test_index = 0;
314         u32 i;
315
316         /* Only do offline selftest, or pass by default */
317         if (eth_test->flags != ETH_TEST_FL_OFFLINE)
318                 return;
319
320         st_param[HNAE3_MAC_INTER_LOOP_MAC][0] = HNAE3_MAC_INTER_LOOP_MAC;
321         st_param[HNAE3_MAC_INTER_LOOP_MAC][1] =
322                         h->flags & HNAE3_SUPPORT_MAC_LOOPBACK;
323
324         if (if_running)
325                 dev_close(ndev);
326
327         set_bit(HNS3_NIC_STATE_TESTING, &priv->state);
328
329         for (i = 0; i < HNS3_SELF_TEST_TPYE_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);
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 (if_running)
350                 dev_open(ndev);
351 }
352
353 static void hns3_driv_to_eth_caps(u32 caps, struct ethtool_link_ksettings *cmd,
354                                   bool is_advertised)
355 {
356         int i;
357
358         for (i = 0; i < ARRAY_SIZE(hns3_lm_map); i++) {
359                 if (!(caps & hns3_lm_map[i].hns3_link_mode))
360                         continue;
361
362                 if (is_advertised)
363                         __set_bit(hns3_lm_map[i].ethtool_link_mode,
364                                   cmd->link_modes.advertising);
365                 else
366                         __set_bit(hns3_lm_map[i].ethtool_link_mode,
367                                   cmd->link_modes.supported);
368         }
369 }
370
371 static int hns3_get_sset_count(struct net_device *netdev, int stringset)
372 {
373         struct hnae3_handle *h = hns3_get_handle(netdev);
374         const struct hnae3_ae_ops *ops = h->ae_algo->ops;
375
376         if (!ops->get_sset_count)
377                 return -EOPNOTSUPP;
378
379         switch (stringset) {
380         case ETH_SS_STATS:
381                 return ((HNS3_TQP_STATS_COUNT * h->kinfo.num_tqps) +
382                         ops->get_sset_count(h, stringset));
383
384         case ETH_SS_TEST:
385                 return ops->get_sset_count(h, stringset);
386         }
387
388         return 0;
389 }
390
391 static void *hns3_update_strings(u8 *data, const struct hns3_stats *stats,
392                                  u32 stat_count, u32 num_tqps)
393 {
394 #define MAX_PREFIX_SIZE (8 + 4)
395         u32 size_left;
396         u32 i, j;
397         u32 n1;
398
399         for (i = 0; i < num_tqps; i++) {
400                 for (j = 0; j < stat_count; j++) {
401                         data[ETH_GSTRING_LEN - 1] = '\0';
402
403                         /* first, prepend the prefix string */
404                         n1 = snprintf(data, MAX_PREFIX_SIZE, "rcb_q%d_", i);
405                         n1 = min_t(uint, n1, MAX_PREFIX_SIZE - 1);
406                         size_left = (ETH_GSTRING_LEN - 1) - n1;
407
408                         /* now, concatenate the stats string to it */
409                         strncat(data, stats[j].stats_string, size_left);
410                         data += ETH_GSTRING_LEN;
411                 }
412         }
413
414         return data;
415 }
416
417 static u8 *hns3_get_strings_tqps(struct hnae3_handle *handle, u8 *data)
418 {
419         struct hnae3_knic_private_info *kinfo = &handle->kinfo;
420
421         /* get strings for Tx */
422         data = hns3_update_strings(data, hns3_txq_stats, HNS3_TXQ_STATS_COUNT,
423                                    kinfo->num_tqps);
424
425         /* get strings for Rx */
426         data = hns3_update_strings(data, hns3_rxq_stats, HNS3_RXQ_STATS_COUNT,
427                                    kinfo->num_tqps);
428
429         return data;
430 }
431
432 static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
433 {
434         struct hnae3_handle *h = hns3_get_handle(netdev);
435         const struct hnae3_ae_ops *ops = h->ae_algo->ops;
436         char *buff = (char *)data;
437
438         if (!ops->get_strings)
439                 return;
440
441         switch (stringset) {
442         case ETH_SS_STATS:
443                 buff = hns3_get_strings_tqps(h, buff);
444                 h->ae_algo->ops->get_strings(h, stringset, (u8 *)buff);
445                 break;
446         case ETH_SS_TEST:
447                 ops->get_strings(h, stringset, data);
448                 break;
449         }
450 }
451
452 static u64 *hns3_get_stats_tqps(struct hnae3_handle *handle, u64 *data)
453 {
454         struct hns3_nic_priv *nic_priv = (struct hns3_nic_priv *)handle->priv;
455         struct hnae3_knic_private_info *kinfo = &handle->kinfo;
456         struct hns3_enet_ring *ring;
457         u8 *stat;
458         u32 i;
459
460         /* get stats for Tx */
461         for (i = 0; i < kinfo->num_tqps; i++) {
462                 ring = nic_priv->ring_data[i].ring;
463                 for (i = 0; i < HNS3_TXQ_STATS_COUNT; i++) {
464                         stat = (u8 *)ring + hns3_txq_stats[i].stats_offset;
465                         *data++ = *(u64 *)stat;
466                 }
467         }
468
469         /* get stats for Rx */
470         for (i = 0; i < kinfo->num_tqps; i++) {
471                 ring = nic_priv->ring_data[i + kinfo->num_tqps].ring;
472                 for (i = 0; i < HNS3_RXQ_STATS_COUNT; i++) {
473                         stat = (u8 *)ring + hns3_rxq_stats[i].stats_offset;
474                         *data++ = *(u64 *)stat;
475                 }
476         }
477
478         return data;
479 }
480
481 /* hns3_get_stats - get detail statistics.
482  * @netdev: net device
483  * @stats: statistics info.
484  * @data: statistics data.
485  */
486 static void hns3_get_stats(struct net_device *netdev,
487                            struct ethtool_stats *stats, u64 *data)
488 {
489         struct hnae3_handle *h = hns3_get_handle(netdev);
490         u64 *p = data;
491
492         if (!h->ae_algo->ops->get_stats || !h->ae_algo->ops->update_stats) {
493                 netdev_err(netdev, "could not get any statistics\n");
494                 return;
495         }
496
497         h->ae_algo->ops->update_stats(h, &netdev->stats);
498
499         /* get per-queue stats */
500         p = hns3_get_stats_tqps(h, p);
501
502         /* get MAC & other misc hardware stats */
503         h->ae_algo->ops->get_stats(h, p);
504 }
505
506 static void hns3_get_drvinfo(struct net_device *netdev,
507                              struct ethtool_drvinfo *drvinfo)
508 {
509         struct hns3_nic_priv *priv = netdev_priv(netdev);
510         struct hnae3_handle *h = priv->ae_handle;
511
512         strncpy(drvinfo->version, hns3_driver_version,
513                 sizeof(drvinfo->version));
514         drvinfo->version[sizeof(drvinfo->version) - 1] = '\0';
515
516         strncpy(drvinfo->driver, h->pdev->driver->name,
517                 sizeof(drvinfo->driver));
518         drvinfo->driver[sizeof(drvinfo->driver) - 1] = '\0';
519
520         strncpy(drvinfo->bus_info, pci_name(h->pdev),
521                 sizeof(drvinfo->bus_info));
522         drvinfo->bus_info[ETHTOOL_BUSINFO_LEN - 1] = '\0';
523
524         snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "0x%08x",
525                  priv->ae_handle->ae_algo->ops->get_fw_version(h));
526 }
527
528 static u32 hns3_get_link(struct net_device *netdev)
529 {
530         struct hnae3_handle *h = hns3_get_handle(netdev);
531
532         if (h->ae_algo && h->ae_algo->ops && h->ae_algo->ops->get_status)
533                 return h->ae_algo->ops->get_status(h);
534         else
535                 return 0;
536 }
537
538 static void hns3_get_ringparam(struct net_device *netdev,
539                                struct ethtool_ringparam *param)
540 {
541         struct hns3_nic_priv *priv = netdev_priv(netdev);
542         struct hnae3_handle *h = priv->ae_handle;
543         int queue_num = h->kinfo.num_tqps;
544
545         param->tx_max_pending = HNS3_RING_MAX_PENDING;
546         param->rx_max_pending = HNS3_RING_MAX_PENDING;
547
548         param->tx_pending = priv->ring_data[0].ring->desc_num;
549         param->rx_pending = priv->ring_data[queue_num].ring->desc_num;
550 }
551
552 static void hns3_get_pauseparam(struct net_device *netdev,
553                                 struct ethtool_pauseparam *param)
554 {
555         struct hnae3_handle *h = hns3_get_handle(netdev);
556
557         if (h->ae_algo && h->ae_algo->ops && h->ae_algo->ops->get_pauseparam)
558                 h->ae_algo->ops->get_pauseparam(h, &param->autoneg,
559                         &param->rx_pause, &param->tx_pause);
560 }
561
562 static int hns3_set_pauseparam(struct net_device *netdev,
563                                struct ethtool_pauseparam *param)
564 {
565         struct hnae3_handle *h = hns3_get_handle(netdev);
566
567         if (h->ae_algo->ops->set_pauseparam)
568                 return h->ae_algo->ops->set_pauseparam(h, param->autoneg,
569                                                        param->rx_pause,
570                                                        param->tx_pause);
571         return -EOPNOTSUPP;
572 }
573
574 static int hns3_get_link_ksettings(struct net_device *netdev,
575                                    struct ethtool_link_ksettings *cmd)
576 {
577         struct hnae3_handle *h = hns3_get_handle(netdev);
578         u32 flowctrl_adv = 0;
579         u32 supported_caps;
580         u32 advertised_caps;
581         u8 media_type = HNAE3_MEDIA_TYPE_UNKNOWN;
582         u8 link_stat;
583
584         if (!h->ae_algo || !h->ae_algo->ops)
585                 return -EOPNOTSUPP;
586
587         /* 1.auto_neg & speed & duplex from cmd */
588         if (netdev->phydev)
589                 phy_ethtool_ksettings_get(netdev->phydev, cmd);
590         else if (h->ae_algo->ops->get_ksettings_an_result)
591                 h->ae_algo->ops->get_ksettings_an_result(h,
592                                                          &cmd->base.autoneg,
593                                                          &cmd->base.speed,
594                                                          &cmd->base.duplex);
595         else
596                 return -EOPNOTSUPP;
597
598         link_stat = hns3_get_link(netdev);
599         if (!link_stat) {
600                 cmd->base.speed = SPEED_UNKNOWN;
601                 cmd->base.duplex = DUPLEX_UNKNOWN;
602         }
603
604         /* 2.media_type get from bios parameter block */
605         if (h->ae_algo->ops->get_media_type) {
606                 h->ae_algo->ops->get_media_type(h, &media_type);
607
608                 switch (media_type) {
609                 case HNAE3_MEDIA_TYPE_FIBER:
610                         cmd->base.port = PORT_FIBRE;
611                         supported_caps = HNS3_LM_FIBRE_BIT |
612                                          HNS3_LM_AUTONEG_BIT |
613                                          HNS3_LM_PAUSE_BIT |
614                                          HNS3_LM_1000BASET_FULL_BIT;
615
616                         advertised_caps = supported_caps;
617                         break;
618                 case HNAE3_MEDIA_TYPE_COPPER:
619                         cmd->base.port = PORT_TP;
620                         supported_caps = HNS3_LM_TP_BIT |
621                                          HNS3_LM_AUTONEG_BIT |
622                                          HNS3_LM_PAUSE_BIT |
623                                          HNS3_LM_1000BASET_FULL_BIT |
624                                          HNS3_LM_100BASET_FULL_BIT |
625                                          HNS3_LM_100BASET_HALF_BIT |
626                                          HNS3_LM_10BASET_FULL_BIT |
627                                          HNS3_LM_10BASET_HALF_BIT;
628                         advertised_caps = supported_caps;
629                         break;
630                 case HNAE3_MEDIA_TYPE_BACKPLANE:
631                         cmd->base.port = PORT_NONE;
632                         supported_caps = HNS3_LM_BACKPLANE_BIT |
633                                          HNS3_LM_PAUSE_BIT |
634                                          HNS3_LM_AUTONEG_BIT |
635                                          HNS3_LM_1000BASET_FULL_BIT |
636                                          HNS3_LM_100BASET_FULL_BIT |
637                                          HNS3_LM_100BASET_HALF_BIT |
638                                          HNS3_LM_10BASET_FULL_BIT |
639                                          HNS3_LM_10BASET_HALF_BIT;
640
641                         advertised_caps = supported_caps;
642                         break;
643                 case HNAE3_MEDIA_TYPE_UNKNOWN:
644                 default:
645                         cmd->base.port = PORT_OTHER;
646                         supported_caps = 0;
647                         advertised_caps = 0;
648                         break;
649                 }
650
651                 if (!cmd->base.autoneg)
652                         advertised_caps &= ~HNS3_LM_AUTONEG_BIT;
653
654                 advertised_caps &= ~HNS3_LM_PAUSE_BIT;
655
656                 /* now, map driver link modes to ethtool link modes */
657                 hns3_driv_to_eth_caps(supported_caps, cmd, false);
658                 hns3_driv_to_eth_caps(advertised_caps, cmd, true);
659         }
660
661         /* 3.mdix_ctrl&mdix get from phy reg */
662         if (h->ae_algo->ops->get_mdix_mode)
663                 h->ae_algo->ops->get_mdix_mode(h, &cmd->base.eth_tp_mdix_ctrl,
664                                                &cmd->base.eth_tp_mdix);
665         /* 4.mdio_support */
666         cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22;
667
668         /* 5.get flow control setttings */
669         if (h->ae_algo->ops->get_flowctrl_adv)
670                 h->ae_algo->ops->get_flowctrl_adv(h, &flowctrl_adv);
671
672         if (flowctrl_adv & ADVERTISED_Pause)
673                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
674                                                      Pause);
675
676         if (flowctrl_adv & ADVERTISED_Asym_Pause)
677                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
678                                                      Asym_Pause);
679
680         return 0;
681 }
682
683 static int hns3_set_link_ksettings(struct net_device *netdev,
684                                    const struct ethtool_link_ksettings *cmd)
685 {
686         /* Only support ksettings_set for netdev with phy attached for now */
687         if (netdev->phydev)
688                 return phy_ethtool_ksettings_set(netdev->phydev, cmd);
689
690         return -EOPNOTSUPP;
691 }
692
693 static u32 hns3_get_rss_key_size(struct net_device *netdev)
694 {
695         struct hnae3_handle *h = hns3_get_handle(netdev);
696
697         if (!h->ae_algo || !h->ae_algo->ops ||
698             !h->ae_algo->ops->get_rss_key_size)
699                 return -EOPNOTSUPP;
700
701         return h->ae_algo->ops->get_rss_key_size(h);
702 }
703
704 static u32 hns3_get_rss_indir_size(struct net_device *netdev)
705 {
706         struct hnae3_handle *h = hns3_get_handle(netdev);
707
708         if (!h->ae_algo || !h->ae_algo->ops ||
709             !h->ae_algo->ops->get_rss_indir_size)
710                 return -EOPNOTSUPP;
711
712         return h->ae_algo->ops->get_rss_indir_size(h);
713 }
714
715 static int hns3_get_rss(struct net_device *netdev, u32 *indir, u8 *key,
716                         u8 *hfunc)
717 {
718         struct hnae3_handle *h = hns3_get_handle(netdev);
719
720         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->get_rss)
721                 return -EOPNOTSUPP;
722
723         return h->ae_algo->ops->get_rss(h, indir, key, hfunc);
724 }
725
726 static int hns3_set_rss(struct net_device *netdev, const u32 *indir,
727                         const u8 *key, const u8 hfunc)
728 {
729         struct hnae3_handle *h = hns3_get_handle(netdev);
730
731         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->set_rss)
732                 return -EOPNOTSUPP;
733
734         /* currently we only support Toeplitz hash */
735         if ((hfunc != ETH_RSS_HASH_NO_CHANGE) && (hfunc != ETH_RSS_HASH_TOP)) {
736                 netdev_err(netdev,
737                            "hash func not supported (only Toeplitz hash)\n");
738                 return -EOPNOTSUPP;
739         }
740         if (!indir) {
741                 netdev_err(netdev,
742                            "set rss failed for indir is empty\n");
743                 return -EOPNOTSUPP;
744         }
745
746         return h->ae_algo->ops->set_rss(h, indir, key, hfunc);
747 }
748
749 static int hns3_get_rxnfc(struct net_device *netdev,
750                           struct ethtool_rxnfc *cmd,
751                           u32 *rule_locs)
752 {
753         struct hnae3_handle *h = hns3_get_handle(netdev);
754
755         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->get_rss_tuple)
756                 return -EOPNOTSUPP;
757
758         switch (cmd->cmd) {
759         case ETHTOOL_GRXRINGS:
760                 cmd->data = h->kinfo.rss_size;
761                 break;
762         case ETHTOOL_GRXFH:
763                 return h->ae_algo->ops->get_rss_tuple(h, cmd);
764         default:
765                 return -EOPNOTSUPP;
766         }
767
768         return 0;
769 }
770
771 static int hns3_change_all_ring_bd_num(struct hns3_nic_priv *priv,
772                                        u32 new_desc_num)
773 {
774         struct hnae3_handle *h = priv->ae_handle;
775         int i;
776
777         h->kinfo.num_desc = new_desc_num;
778
779         for (i = 0; i < h->kinfo.num_tqps * 2; i++)
780                 priv->ring_data[i].ring->desc_num = new_desc_num;
781
782         return hns3_init_all_ring(priv);
783 }
784
785 static int hns3_set_ringparam(struct net_device *ndev,
786                               struct ethtool_ringparam *param)
787 {
788         struct hns3_nic_priv *priv = netdev_priv(ndev);
789         struct hnae3_handle *h = priv->ae_handle;
790         bool if_running = netif_running(ndev);
791         u32 old_desc_num, new_desc_num;
792         int ret;
793
794         if (param->rx_mini_pending || param->rx_jumbo_pending)
795                 return -EINVAL;
796
797         if (param->tx_pending != param->rx_pending) {
798                 netdev_err(ndev,
799                            "Descriptors of tx and rx must be equal");
800                 return -EINVAL;
801         }
802
803         if (param->tx_pending > HNS3_RING_MAX_PENDING ||
804             param->tx_pending < HNS3_RING_MIN_PENDING) {
805                 netdev_err(ndev,
806                            "Descriptors requested (Tx/Rx: %d) out of range [%d-%d]\n",
807                            param->tx_pending, HNS3_RING_MIN_PENDING,
808                            HNS3_RING_MAX_PENDING);
809                 return -EINVAL;
810         }
811
812         new_desc_num = param->tx_pending;
813
814         /* Hardware requires that its descriptors must be multiple of eight */
815         new_desc_num = ALIGN(new_desc_num, HNS3_RING_BD_MULTIPLE);
816         old_desc_num = h->kinfo.num_desc;
817         if (old_desc_num == new_desc_num)
818                 return 0;
819
820         netdev_info(ndev,
821                     "Changing descriptor count from %d to %d.\n",
822                     old_desc_num, new_desc_num);
823
824         if (if_running)
825                 dev_close(ndev);
826
827         ret = hns3_uninit_all_ring(priv);
828         if (ret)
829                 return ret;
830
831         ret = hns3_change_all_ring_bd_num(priv, new_desc_num);
832         if (ret) {
833                 ret = hns3_change_all_ring_bd_num(priv, old_desc_num);
834                 if (ret) {
835                         netdev_err(ndev,
836                                    "Revert to old bd num fail, ret=%d.\n", ret);
837                         return ret;
838                 }
839         }
840
841         if (if_running)
842                 ret = dev_open(ndev);
843
844         return ret;
845 }
846
847 static int hns3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)
848 {
849         struct hnae3_handle *h = hns3_get_handle(netdev);
850
851         if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->set_rss_tuple)
852                 return -EOPNOTSUPP;
853
854         switch (cmd->cmd) {
855         case ETHTOOL_SRXFH:
856                 return h->ae_algo->ops->set_rss_tuple(h, cmd);
857         default:
858                 return -EOPNOTSUPP;
859         }
860 }
861
862 static int hns3_nway_reset(struct net_device *netdev)
863 {
864         struct phy_device *phy = netdev->phydev;
865
866         if (!netif_running(netdev))
867                 return 0;
868
869         /* Only support nway_reset for netdev with phy attached for now */
870         if (!phy)
871                 return -EOPNOTSUPP;
872
873         if (phy->autoneg != AUTONEG_ENABLE)
874                 return -EINVAL;
875
876         return genphy_restart_aneg(phy);
877 }
878
879 static void hns3_get_channels(struct net_device *netdev,
880                               struct ethtool_channels *ch)
881 {
882         struct hnae3_handle *h = hns3_get_handle(netdev);
883
884         if (h->ae_algo->ops->get_channels)
885                 h->ae_algo->ops->get_channels(h, ch);
886 }
887
888 static const struct ethtool_ops hns3vf_ethtool_ops = {
889         .get_drvinfo = hns3_get_drvinfo,
890         .get_ringparam = hns3_get_ringparam,
891         .set_ringparam = hns3_set_ringparam,
892         .get_strings = hns3_get_strings,
893         .get_ethtool_stats = hns3_get_stats,
894         .get_sset_count = hns3_get_sset_count,
895         .get_rxnfc = hns3_get_rxnfc,
896         .get_rxfh_key_size = hns3_get_rss_key_size,
897         .get_rxfh_indir_size = hns3_get_rss_indir_size,
898         .get_rxfh = hns3_get_rss,
899         .set_rxfh = hns3_set_rss,
900         .get_link_ksettings = hns3_get_link_ksettings,
901 };
902
903 static const struct ethtool_ops hns3_ethtool_ops = {
904         .self_test = hns3_self_test,
905         .get_drvinfo = hns3_get_drvinfo,
906         .get_link = hns3_get_link,
907         .get_ringparam = hns3_get_ringparam,
908         .set_ringparam = hns3_set_ringparam,
909         .get_pauseparam = hns3_get_pauseparam,
910         .set_pauseparam = hns3_set_pauseparam,
911         .get_strings = hns3_get_strings,
912         .get_ethtool_stats = hns3_get_stats,
913         .get_sset_count = hns3_get_sset_count,
914         .get_rxnfc = hns3_get_rxnfc,
915         .set_rxnfc = hns3_set_rxnfc,
916         .get_rxfh_key_size = hns3_get_rss_key_size,
917         .get_rxfh_indir_size = hns3_get_rss_indir_size,
918         .get_rxfh = hns3_get_rss,
919         .set_rxfh = hns3_set_rss,
920         .get_link_ksettings = hns3_get_link_ksettings,
921         .set_link_ksettings = hns3_set_link_ksettings,
922         .nway_reset = hns3_nway_reset,
923         .get_channels = hns3_get_channels,
924         .set_channels = hns3_set_channels,
925 };
926
927 void hns3_ethtool_set_ops(struct net_device *netdev)
928 {
929         struct hnae3_handle *h = hns3_get_handle(netdev);
930
931         if (h->flags & HNAE3_SUPPORT_VF)
932                 netdev->ethtool_ops = &hns3vf_ethtool_ops;
933         else
934                 netdev->ethtool_ops = &hns3_ethtool_ops;
935 }