Linux-libre 4.4.228-gnu
[librecmc/linux-libre.git] / drivers / net / ethernet / hisilicon / hns / hns_ae_adapt.c
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/netdevice.h>
12 #include <linux/spinlock.h>
13
14 #include "hnae.h"
15 #include "hns_dsaf_mac.h"
16 #include "hns_dsaf_main.h"
17 #include "hns_dsaf_ppe.h"
18 #include "hns_dsaf_rcb.h"
19
20 #define AE_NAME_PORT_ID_IDX 6
21 #define ETH_STATIC_REG   1
22 #define ETH_DUMP_REG     5
23 #define ETH_GSTRING_LEN 32
24
25 static struct hns_mac_cb *hns_get_mac_cb(struct hnae_handle *handle)
26 {
27         struct  hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
28
29         return vf_cb->mac_cb;
30 }
31
32 /**
33  * hns_ae_map_eport_to_dport - translate enet port id to dsaf port id
34  * @port_id: enet port id
35  *: debug port 0-1, service port 2 -7 (dsaf mode only 2)
36  * return: dsaf port id
37  *: service ports 0 - 5, debug port 6-7
38  **/
39 static int hns_ae_map_eport_to_dport(u32 port_id)
40 {
41         int port_index;
42
43         if (port_id < DSAF_DEBUG_NW_NUM)
44                 port_index = port_id + DSAF_SERVICE_PORT_NUM_PER_DSAF;
45         else
46                 port_index = port_id - DSAF_DEBUG_NW_NUM;
47
48         return port_index;
49 }
50
51 static struct dsaf_device *hns_ae_get_dsaf_dev(struct hnae_ae_dev *dev)
52 {
53         return container_of(dev, struct dsaf_device, ae_dev);
54 }
55
56 static struct hns_ppe_cb *hns_get_ppe_cb(struct hnae_handle *handle)
57 {
58         int ppe_index;
59         int ppe_common_index;
60         struct ppe_common_cb *ppe_comm;
61         struct  hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
62
63         if (vf_cb->port_index < DSAF_SERVICE_PORT_NUM_PER_DSAF) {
64                 ppe_index = vf_cb->port_index;
65                 ppe_common_index = 0;
66         } else {
67                 ppe_index = 0;
68                 ppe_common_index =
69                         vf_cb->port_index - DSAF_SERVICE_PORT_NUM_PER_DSAF + 1;
70         }
71         ppe_comm = vf_cb->dsaf_dev->ppe_common[ppe_common_index];
72         return &ppe_comm->ppe_cb[ppe_index];
73 }
74
75 static int hns_ae_get_q_num_per_vf(
76         struct dsaf_device *dsaf_dev, int port)
77 {
78         int common_idx = hns_dsaf_get_comm_idx_by_port(port);
79
80         return dsaf_dev->rcb_common[common_idx]->max_q_per_vf;
81 }
82
83 static int hns_ae_get_vf_num_per_port(
84         struct dsaf_device *dsaf_dev, int port)
85 {
86         int common_idx = hns_dsaf_get_comm_idx_by_port(port);
87
88         return dsaf_dev->rcb_common[common_idx]->max_vfn;
89 }
90
91 static struct ring_pair_cb *hns_ae_get_base_ring_pair(
92         struct dsaf_device *dsaf_dev, int port)
93 {
94         int common_idx = hns_dsaf_get_comm_idx_by_port(port);
95         struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[common_idx];
96         int q_num = rcb_comm->max_q_per_vf;
97         int vf_num = rcb_comm->max_vfn;
98
99         if (common_idx == HNS_DSAF_COMM_SERVICE_NW_IDX)
100                 return &rcb_comm->ring_pair_cb[port * q_num * vf_num];
101         else
102                 return &rcb_comm->ring_pair_cb[0];
103 }
104
105 static struct ring_pair_cb *hns_ae_get_ring_pair(struct hnae_queue *q)
106 {
107         return container_of(q, struct ring_pair_cb, q);
108 }
109
110 struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
111                                       u32 port_id)
112 {
113         int port_idx;
114         int vfnum_per_port;
115         int qnum_per_vf;
116         int i;
117         struct dsaf_device *dsaf_dev;
118         struct hnae_handle *ae_handle;
119         struct ring_pair_cb *ring_pair_cb;
120         struct hnae_vf_cb *vf_cb;
121
122         dsaf_dev = hns_ae_get_dsaf_dev(dev);
123         port_idx = hns_ae_map_eport_to_dport(port_id);
124
125         ring_pair_cb = hns_ae_get_base_ring_pair(dsaf_dev, port_idx);
126         vfnum_per_port = hns_ae_get_vf_num_per_port(dsaf_dev, port_idx);
127         qnum_per_vf = hns_ae_get_q_num_per_vf(dsaf_dev, port_idx);
128
129         vf_cb = kzalloc(sizeof(*vf_cb) +
130                         qnum_per_vf * sizeof(struct hnae_queue *), GFP_KERNEL);
131         if (unlikely(!vf_cb)) {
132                 dev_err(dsaf_dev->dev, "malloc vf_cb fail!\n");
133                 ae_handle = ERR_PTR(-ENOMEM);
134                 goto handle_err;
135         }
136         ae_handle = &vf_cb->ae_handle;
137         /* ae_handle Init  */
138         ae_handle->owner_dev = dsaf_dev->dev;
139         ae_handle->dev = dev;
140         ae_handle->q_num = qnum_per_vf;
141
142         /* find ring pair, and set vf id*/
143         for (ae_handle->vf_id = 0;
144                 ae_handle->vf_id < vfnum_per_port; ae_handle->vf_id++) {
145                 if (!ring_pair_cb->used_by_vf)
146                         break;
147                 ring_pair_cb += qnum_per_vf;
148         }
149         if (ae_handle->vf_id >= vfnum_per_port) {
150                 dev_err(dsaf_dev->dev, "malloc queue fail!\n");
151                 ae_handle = ERR_PTR(-EINVAL);
152                 goto vf_id_err;
153         }
154
155         ae_handle->qs = (struct hnae_queue **)(&ae_handle->qs + 1);
156         for (i = 0; i < qnum_per_vf; i++) {
157                 ae_handle->qs[i] = &ring_pair_cb->q;
158                 ae_handle->qs[i]->rx_ring.q = ae_handle->qs[i];
159                 ae_handle->qs[i]->tx_ring.q = ae_handle->qs[i];
160
161                 ring_pair_cb->used_by_vf = 1;
162                 if (port_idx < DSAF_SERVICE_PORT_NUM_PER_DSAF)
163                         ring_pair_cb->port_id_in_dsa = port_idx;
164                 else
165                         ring_pair_cb->port_id_in_dsa = 0;
166
167                 ring_pair_cb++;
168         }
169
170         vf_cb->dsaf_dev = dsaf_dev;
171         vf_cb->port_index = port_idx;
172         vf_cb->mac_cb = &dsaf_dev->mac_cb[port_idx];
173
174         ae_handle->phy_if = vf_cb->mac_cb->phy_if;
175         ae_handle->phy_node = vf_cb->mac_cb->phy_node;
176         ae_handle->if_support = vf_cb->mac_cb->if_support;
177         ae_handle->port_type = vf_cb->mac_cb->mac_type;
178
179         return ae_handle;
180 vf_id_err:
181         kfree(vf_cb);
182 handle_err:
183         return ae_handle;
184 }
185
186 static void hns_ae_put_handle(struct hnae_handle *handle)
187 {
188         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
189         int i;
190
191         for (i = 0; i < handle->q_num; i++)
192                 hns_ae_get_ring_pair(handle->qs[i])->used_by_vf = 0;
193
194         kfree(vf_cb);
195 }
196
197 static void hns_ae_ring_enable_all(struct hnae_handle *handle, int val)
198 {
199         int q_num = handle->q_num;
200         int i;
201
202         for (i = 0; i < q_num; i++)
203                 hns_rcb_ring_enable_hw(handle->qs[i], val);
204 }
205
206 static void hns_ae_init_queue(struct hnae_queue *q)
207 {
208         struct ring_pair_cb *ring =
209                 container_of(q, struct ring_pair_cb, q);
210
211         hns_rcb_init_hw(ring);
212 }
213
214 static void hns_ae_fini_queue(struct hnae_queue *q)
215 {
216         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(q->handle);
217
218         if (vf_cb->mac_cb->mac_type == HNAE_PORT_SERVICE)
219                 hns_rcb_reset_ring_hw(q);
220 }
221
222 static int hns_ae_set_mac_address(struct hnae_handle *handle, void *p)
223 {
224         int ret;
225         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
226
227         if (!p || !is_valid_ether_addr((const u8 *)p)) {
228                 dev_err(handle->owner_dev, "is not valid ether addr !\n");
229                 return -EADDRNOTAVAIL;
230         }
231
232         ret = hns_mac_change_vf_addr(mac_cb, handle->vf_id, p);
233         if (ret != 0) {
234                 dev_err(handle->owner_dev,
235                         "set_mac_address fail, ret=%d!\n", ret);
236                 return ret;
237         }
238
239         return 0;
240 }
241
242 static int hns_ae_set_multicast_one(struct hnae_handle *handle, void *addr)
243 {
244         int ret;
245         char *mac_addr = (char *)addr;
246         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
247
248         assert(mac_cb);
249
250         if (mac_cb->mac_type != HNAE_PORT_SERVICE)
251                 return 0;
252
253         ret = hns_mac_set_multi(mac_cb, mac_cb->mac_id, mac_addr, ENABLE);
254         if (ret) {
255                 dev_err(handle->owner_dev,
256                         "mac add mul_mac:%pM port%d  fail, ret = %#x!\n",
257                         mac_addr, mac_cb->mac_id, ret);
258                 return ret;
259         }
260
261         ret = hns_mac_set_multi(mac_cb, DSAF_BASE_INNER_PORT_NUM,
262                                 mac_addr, ENABLE);
263         if (ret)
264                 dev_err(handle->owner_dev,
265                         "mac add mul_mac:%pM port%d  fail, ret = %#x!\n",
266                         mac_addr, DSAF_BASE_INNER_PORT_NUM, ret);
267
268         return ret;
269 }
270
271 static int hns_ae_set_mtu(struct hnae_handle *handle, int new_mtu)
272 {
273         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
274
275         return hns_mac_set_mtu(mac_cb, new_mtu);
276 }
277
278 static int hns_ae_start(struct hnae_handle *handle)
279 {
280         int ret;
281         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
282
283         ret = hns_mac_vm_config_bc_en(mac_cb, 0, ENABLE);
284         if (ret)
285                 return ret;
286
287         hns_ae_ring_enable_all(handle, 1);
288         msleep(100);
289
290         hns_mac_start(mac_cb);
291
292         return 0;
293 }
294
295 void hns_ae_stop(struct hnae_handle *handle)
296 {
297         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
298
299         /* just clean tx fbd, neednot rx fbd*/
300         hns_rcb_wait_fbd_clean(handle->qs, handle->q_num, RCB_INT_FLAG_TX);
301
302         msleep(20);
303
304         hns_mac_stop(mac_cb);
305
306         usleep_range(10000, 20000);
307
308         hns_ae_ring_enable_all(handle, 0);
309
310         (void)hns_mac_vm_config_bc_en(mac_cb, 0, DISABLE);
311 }
312
313 static void hns_ae_reset(struct hnae_handle *handle)
314 {
315         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
316
317         if (vf_cb->mac_cb->mac_type == HNAE_PORT_DEBUG) {
318                 u8 ppe_common_index =
319                         vf_cb->port_index - DSAF_SERVICE_PORT_NUM_PER_DSAF + 1;
320
321                 hns_mac_reset(vf_cb->mac_cb);
322                 hns_ppe_reset_common(vf_cb->dsaf_dev, ppe_common_index);
323         }
324 }
325
326 void hns_ae_toggle_ring_irq(struct hnae_ring *ring, u32 mask)
327 {
328         u32 flag;
329
330         if (is_tx_ring(ring))
331                 flag = RCB_INT_FLAG_TX;
332         else
333                 flag = RCB_INT_FLAG_RX;
334
335         hns_rcb_int_clr_hw(ring->q, flag);
336         hns_rcb_int_ctrl_hw(ring->q, flag, mask);
337 }
338
339 static void hns_ae_toggle_queue_status(struct hnae_queue *queue, u32 val)
340 {
341         hns_rcb_start(queue, val);
342 }
343
344 static int hns_ae_get_link_status(struct hnae_handle *handle)
345 {
346         u32 link_status;
347         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
348
349         hns_mac_get_link_status(mac_cb, &link_status);
350
351         return !!link_status;
352 }
353
354 static int hns_ae_get_mac_info(struct hnae_handle *handle,
355                                u8 *auto_neg, u16 *speed, u8 *duplex)
356 {
357         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
358
359         return hns_mac_get_port_info(mac_cb, auto_neg, speed, duplex);
360 }
361
362 static void hns_ae_adjust_link(struct hnae_handle *handle, int speed,
363                                int duplex)
364 {
365         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
366
367         hns_mac_adjust_link(mac_cb, speed, duplex);
368 }
369
370 static void hns_ae_get_ring_bdnum_limit(struct hnae_queue *queue,
371                                         u32 *uplimit)
372 {
373         *uplimit = HNS_RCB_RING_MAX_PENDING_BD;
374 }
375
376 static void hns_ae_get_pauseparam(struct hnae_handle *handle,
377                                   u32 *auto_neg, u32 *rx_en, u32 *tx_en)
378 {
379         assert(handle);
380
381         hns_mac_get_autoneg(hns_get_mac_cb(handle), auto_neg);
382
383         hns_mac_get_pauseparam(hns_get_mac_cb(handle), rx_en, tx_en);
384 }
385
386 static int hns_ae_set_autoneg(struct hnae_handle *handle, u8 enable)
387 {
388         assert(handle);
389
390         return hns_mac_set_autoneg(hns_get_mac_cb(handle), enable);
391 }
392
393 static void hns_ae_set_promisc_mode(struct hnae_handle *handle, u32 en)
394 {
395         hns_dsaf_set_promisc_mode(hns_ae_get_dsaf_dev(handle->dev), en);
396 }
397
398 static int hns_ae_get_autoneg(struct hnae_handle *handle)
399 {
400         u32     auto_neg;
401
402         assert(handle);
403
404         hns_mac_get_autoneg(hns_get_mac_cb(handle), &auto_neg);
405
406         return auto_neg;
407 }
408
409 static int hns_ae_set_pauseparam(struct hnae_handle *handle,
410                                  u32 autoneg, u32 rx_en, u32 tx_en)
411 {
412         struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
413         int ret;
414
415         ret = hns_mac_set_autoneg(mac_cb, autoneg);
416         if (ret)
417                 return ret;
418
419         return hns_mac_set_pauseparam(mac_cb, rx_en, tx_en);
420 }
421
422 static void hns_ae_get_coalesce_usecs(struct hnae_handle *handle,
423                                       u32 *tx_usecs, u32 *rx_usecs)
424 {
425         int port;
426
427         port = hns_ae_map_eport_to_dport(handle->eport_id);
428
429         *tx_usecs = hns_rcb_get_coalesce_usecs(
430                 hns_ae_get_dsaf_dev(handle->dev),
431                 hns_dsaf_get_comm_idx_by_port(port));
432         *rx_usecs = hns_rcb_get_coalesce_usecs(
433                 hns_ae_get_dsaf_dev(handle->dev),
434                 hns_dsaf_get_comm_idx_by_port(port));
435 }
436
437 static void hns_ae_get_rx_max_coalesced_frames(struct hnae_handle *handle,
438                                                u32 *tx_frames, u32 *rx_frames)
439 {
440         int port;
441
442         assert(handle);
443
444         port = hns_ae_map_eport_to_dport(handle->eport_id);
445
446         *tx_frames = hns_rcb_get_coalesced_frames(
447                 hns_ae_get_dsaf_dev(handle->dev), port);
448         *rx_frames = hns_rcb_get_coalesced_frames(
449                 hns_ae_get_dsaf_dev(handle->dev), port);
450 }
451
452 static void hns_ae_set_coalesce_usecs(struct hnae_handle *handle,
453                                       u32 timeout)
454 {
455         int port;
456
457         assert(handle);
458
459         port = hns_ae_map_eport_to_dport(handle->eport_id);
460
461         hns_rcb_set_coalesce_usecs(hns_ae_get_dsaf_dev(handle->dev),
462                                    port, timeout);
463 }
464
465 static int  hns_ae_set_coalesce_frames(struct hnae_handle *handle,
466                                        u32 coalesce_frames)
467 {
468         int port;
469         int ret;
470
471         assert(handle);
472
473         port = hns_ae_map_eport_to_dport(handle->eport_id);
474
475         ret = hns_rcb_set_coalesced_frames(hns_ae_get_dsaf_dev(handle->dev),
476                                            port, coalesce_frames);
477         return ret;
478 }
479
480 void hns_ae_update_stats(struct hnae_handle *handle,
481                          struct net_device_stats *net_stats)
482 {
483         int port;
484         int idx;
485         struct dsaf_device *dsaf_dev;
486         struct hns_mac_cb *mac_cb;
487         struct hns_ppe_cb *ppe_cb;
488         struct hnae_queue *queue;
489         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
490         u64 tx_bytes = 0, rx_bytes = 0, tx_packets = 0, rx_packets = 0;
491         u64 rx_errors = 0, tx_errors = 0, tx_dropped = 0;
492         u64 rx_missed_errors = 0;
493
494         dsaf_dev = hns_ae_get_dsaf_dev(handle->dev);
495         if (!dsaf_dev)
496                 return;
497         port = vf_cb->port_index;
498         ppe_cb = hns_get_ppe_cb(handle);
499         mac_cb = hns_get_mac_cb(handle);
500
501         for (idx = 0; idx < handle->q_num; idx++) {
502                 queue = handle->qs[idx];
503                 hns_rcb_update_stats(queue);
504
505                 tx_bytes += queue->tx_ring.stats.tx_bytes;
506                 tx_packets += queue->tx_ring.stats.tx_pkts;
507                 rx_bytes += queue->rx_ring.stats.rx_bytes;
508                 rx_packets += queue->rx_ring.stats.rx_pkts;
509
510                 rx_errors += queue->rx_ring.stats.err_pkt_len
511                                 + queue->rx_ring.stats.l2_err
512                                 + queue->rx_ring.stats.l3l4_csum_err;
513         }
514
515         hns_ppe_update_stats(ppe_cb);
516         rx_missed_errors = ppe_cb->hw_stats.rx_drop_no_buf;
517         tx_errors += ppe_cb->hw_stats.tx_err_checksum
518                 + ppe_cb->hw_stats.tx_err_fifo_empty;
519
520         if (mac_cb->mac_type == HNAE_PORT_SERVICE) {
521                 hns_dsaf_update_stats(dsaf_dev, port);
522                 /* for port upline direction, i.e., rx. */
523                 rx_missed_errors += dsaf_dev->hw_stats[port].bp_drop;
524                 rx_missed_errors += dsaf_dev->hw_stats[port].pad_drop;
525                 rx_missed_errors += dsaf_dev->hw_stats[port].crc_false;
526
527                 /* for port downline direction, i.e., tx. */
528                 port = port + DSAF_PPE_INODE_BASE;
529                 hns_dsaf_update_stats(dsaf_dev, port);
530                 tx_dropped += dsaf_dev->hw_stats[port].bp_drop;
531                 tx_dropped += dsaf_dev->hw_stats[port].pad_drop;
532                 tx_dropped += dsaf_dev->hw_stats[port].crc_false;
533                 tx_dropped += dsaf_dev->hw_stats[port].rslt_drop;
534                 tx_dropped += dsaf_dev->hw_stats[port].vlan_drop;
535                 tx_dropped += dsaf_dev->hw_stats[port].stp_drop;
536         }
537
538         hns_mac_update_stats(mac_cb);
539         rx_errors += mac_cb->hw_stats.rx_fifo_overrun_err;
540
541         tx_errors += mac_cb->hw_stats.tx_bad_pkts
542                 + mac_cb->hw_stats.tx_fragment_err
543                 + mac_cb->hw_stats.tx_jabber_err
544                 + mac_cb->hw_stats.tx_underrun_err
545                 + mac_cb->hw_stats.tx_crc_err;
546
547         net_stats->tx_bytes = tx_bytes;
548         net_stats->tx_packets = tx_packets;
549         net_stats->rx_bytes = rx_bytes;
550         net_stats->rx_dropped = 0;
551         net_stats->rx_packets = rx_packets;
552         net_stats->rx_errors = rx_errors;
553         net_stats->tx_errors = tx_errors;
554         net_stats->tx_dropped = tx_dropped;
555         net_stats->rx_missed_errors = rx_missed_errors;
556         net_stats->rx_crc_errors = mac_cb->hw_stats.rx_fcs_err;
557         net_stats->rx_frame_errors = mac_cb->hw_stats.rx_align_err;
558         net_stats->rx_fifo_errors = mac_cb->hw_stats.rx_fifo_overrun_err;
559         net_stats->rx_length_errors = mac_cb->hw_stats.rx_len_err;
560         net_stats->multicast = mac_cb->hw_stats.rx_mc_pkts;
561 }
562
563 void hns_ae_get_stats(struct hnae_handle *handle, u64 *data)
564 {
565         int idx;
566         struct hns_mac_cb *mac_cb;
567         struct hns_ppe_cb *ppe_cb;
568         u64 *p = data;
569         struct  hnae_vf_cb *vf_cb;
570
571         if (!handle || !data) {
572                 pr_err("hns_ae_get_stats NULL handle or data pointer!\n");
573                 return;
574         }
575
576         vf_cb = hns_ae_get_vf_cb(handle);
577         mac_cb = hns_get_mac_cb(handle);
578         ppe_cb = hns_get_ppe_cb(handle);
579
580         for (idx = 0; idx < handle->q_num; idx++) {
581                 hns_rcb_get_stats(handle->qs[idx], p);
582                 p += hns_rcb_get_ring_sset_count((int)ETH_SS_STATS);
583         }
584
585         hns_ppe_get_stats(ppe_cb, p);
586         p += hns_ppe_get_sset_count((int)ETH_SS_STATS);
587
588         hns_mac_get_stats(mac_cb, p);
589         p += hns_mac_get_sset_count(mac_cb, (int)ETH_SS_STATS);
590
591         if (mac_cb->mac_type == HNAE_PORT_SERVICE)
592                 hns_dsaf_get_stats(vf_cb->dsaf_dev, p, vf_cb->port_index);
593 }
594
595 void hns_ae_get_strings(struct hnae_handle *handle,
596                         u32 stringset, u8 *data)
597 {
598         int port;
599         int idx;
600         struct hns_mac_cb *mac_cb;
601         struct hns_ppe_cb *ppe_cb;
602         u8 *p = data;
603         struct  hnae_vf_cb *vf_cb;
604
605         assert(handle);
606
607         vf_cb = hns_ae_get_vf_cb(handle);
608         port = vf_cb->port_index;
609         mac_cb = hns_get_mac_cb(handle);
610         ppe_cb = hns_get_ppe_cb(handle);
611
612         for (idx = 0; idx < handle->q_num; idx++) {
613                 hns_rcb_get_strings(stringset, p, idx);
614                 p += ETH_GSTRING_LEN * hns_rcb_get_ring_sset_count(stringset);
615         }
616
617         hns_ppe_get_strings(ppe_cb, stringset, p);
618         p += ETH_GSTRING_LEN * hns_ppe_get_sset_count(stringset);
619
620         hns_mac_get_strings(mac_cb, stringset, p);
621         p += ETH_GSTRING_LEN * hns_mac_get_sset_count(mac_cb, stringset);
622
623         if (mac_cb->mac_type == HNAE_PORT_SERVICE)
624                 hns_dsaf_get_strings(stringset, p, port);
625 }
626
627 int hns_ae_get_sset_count(struct hnae_handle *handle, int stringset)
628 {
629         u32 sset_count = 0;
630         struct hns_mac_cb *mac_cb;
631
632         assert(handle);
633
634         mac_cb = hns_get_mac_cb(handle);
635
636         sset_count += hns_rcb_get_ring_sset_count(stringset) * handle->q_num;
637         sset_count += hns_ppe_get_sset_count(stringset);
638         sset_count += hns_mac_get_sset_count(mac_cb, stringset);
639
640         if (mac_cb->mac_type == HNAE_PORT_SERVICE)
641                 sset_count += hns_dsaf_get_sset_count(stringset);
642
643         return sset_count;
644 }
645
646 static int hns_ae_config_loopback(struct hnae_handle *handle,
647                                   enum hnae_loop loop, int en)
648 {
649         int ret;
650         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
651
652         switch (loop) {
653         case MAC_INTERNALLOOP_SERDES:
654                 ret = hns_mac_config_sds_loopback(vf_cb->mac_cb, en);
655                 break;
656         case MAC_INTERNALLOOP_MAC:
657                 ret = hns_mac_config_mac_loopback(vf_cb->mac_cb, loop, en);
658                 break;
659         default:
660                 ret = -EINVAL;
661         }
662         return ret;
663 }
664
665 void hns_ae_update_led_status(struct hnae_handle *handle)
666 {
667         struct hns_mac_cb *mac_cb;
668
669         assert(handle);
670         mac_cb = hns_get_mac_cb(handle);
671         if (!mac_cb->cpld_vaddr)
672                 return;
673         hns_set_led_opt(mac_cb);
674 }
675
676 int hns_ae_cpld_set_led_id(struct hnae_handle *handle,
677                            enum hnae_led_state status)
678 {
679         struct hns_mac_cb *mac_cb;
680
681         assert(handle);
682
683         mac_cb = hns_get_mac_cb(handle);
684
685         return hns_cpld_led_set_id(mac_cb, status);
686 }
687
688 void hns_ae_get_regs(struct hnae_handle *handle, void *data)
689 {
690         u32 *p = data;
691         u32 rcb_com_idx;
692         int i;
693         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
694         struct hns_ppe_cb *ppe_cb = hns_get_ppe_cb(handle);
695
696         hns_ppe_get_regs(ppe_cb, p);
697         p += hns_ppe_get_regs_count();
698
699         rcb_com_idx = hns_dsaf_get_comm_idx_by_port(vf_cb->port_index);
700         hns_rcb_get_common_regs(vf_cb->dsaf_dev->rcb_common[rcb_com_idx], p);
701         p += hns_rcb_get_common_regs_count();
702
703         for (i = 0; i < handle->q_num; i++) {
704                 hns_rcb_get_ring_regs(handle->qs[i], p);
705                 p += hns_rcb_get_ring_regs_count();
706         }
707
708         hns_mac_get_regs(vf_cb->mac_cb, p);
709         p += hns_mac_get_regs_count(vf_cb->mac_cb);
710
711         if (vf_cb->mac_cb->mac_type == HNAE_PORT_SERVICE)
712                 hns_dsaf_get_regs(vf_cb->dsaf_dev, vf_cb->port_index, p);
713 }
714
715 int hns_ae_get_regs_len(struct hnae_handle *handle)
716 {
717         u32 total_num;
718         struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
719
720         total_num = hns_ppe_get_regs_count();
721         total_num += hns_rcb_get_common_regs_count();
722         total_num += hns_rcb_get_ring_regs_count() * handle->q_num;
723         total_num += hns_mac_get_regs_count(vf_cb->mac_cb);
724
725         if (vf_cb->mac_cb->mac_type == HNAE_PORT_SERVICE)
726                 total_num += hns_dsaf_get_regs_count();
727
728         return total_num;
729 }
730
731 static struct hnae_ae_ops hns_dsaf_ops = {
732         .get_handle = hns_ae_get_handle,
733         .put_handle = hns_ae_put_handle,
734         .init_queue = hns_ae_init_queue,
735         .fini_queue = hns_ae_fini_queue,
736         .start = hns_ae_start,
737         .stop = hns_ae_stop,
738         .reset = hns_ae_reset,
739         .toggle_ring_irq = hns_ae_toggle_ring_irq,
740         .toggle_queue_status = hns_ae_toggle_queue_status,
741         .get_status = hns_ae_get_link_status,
742         .get_info = hns_ae_get_mac_info,
743         .adjust_link = hns_ae_adjust_link,
744         .set_loopback = hns_ae_config_loopback,
745         .get_ring_bdnum_limit = hns_ae_get_ring_bdnum_limit,
746         .get_pauseparam = hns_ae_get_pauseparam,
747         .set_autoneg = hns_ae_set_autoneg,
748         .get_autoneg = hns_ae_get_autoneg,
749         .set_pauseparam = hns_ae_set_pauseparam,
750         .get_coalesce_usecs = hns_ae_get_coalesce_usecs,
751         .get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames,
752         .set_coalesce_usecs = hns_ae_set_coalesce_usecs,
753         .set_coalesce_frames = hns_ae_set_coalesce_frames,
754         .set_promisc_mode = hns_ae_set_promisc_mode,
755         .set_mac_addr = hns_ae_set_mac_address,
756         .set_mc_addr = hns_ae_set_multicast_one,
757         .set_mtu = hns_ae_set_mtu,
758         .update_stats = hns_ae_update_stats,
759         .get_stats = hns_ae_get_stats,
760         .get_strings = hns_ae_get_strings,
761         .get_sset_count = hns_ae_get_sset_count,
762         .update_led_status = hns_ae_update_led_status,
763         .set_led_id = hns_ae_cpld_set_led_id,
764         .get_regs = hns_ae_get_regs,
765         .get_regs_len = hns_ae_get_regs_len
766 };
767
768 int hns_dsaf_ae_init(struct dsaf_device *dsaf_dev)
769 {
770         struct hnae_ae_dev *ae_dev = &dsaf_dev->ae_dev;
771
772         ae_dev->ops = &hns_dsaf_ops;
773         ae_dev->dev = dsaf_dev->dev;
774
775         return hnae_ae_register(ae_dev, THIS_MODULE);
776 }
777
778 void hns_dsaf_ae_uninit(struct dsaf_device *dsaf_dev)
779 {
780         hnae_ae_unregister(&dsaf_dev->ae_dev);
781 }