43e0bc59f3a9944d8a7e092d901121d2376e8005
[cascardo/linux.git] / drivers / net / ethernet / chelsio / cxgb4 / cxgb4_ethtool.c
1 /*
2  *  Copyright (C) 2013-2015 Chelsio Communications.  All rights reserved.
3  *
4  *  This program is free software; you can redistribute it and/or modify it
5  *  under the terms and conditions of the GNU General Public License,
6  *  version 2, as published by the Free Software Foundation.
7  *
8  *  This program is distributed in the hope it will be useful, but WITHOUT
9  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  *  more details.
12  *
13  *  The full GNU General Public License is included in this distribution in
14  *  the file called "COPYING".
15  *
16  */
17
18 #include <linux/firmware.h>
19 #include <linux/mdio.h>
20
21 #include "cxgb4.h"
22 #include "t4_regs.h"
23 #include "t4fw_api.h"
24
25 #define EEPROM_MAGIC 0x38E2F10C
26
27 static u32 get_msglevel(struct net_device *dev)
28 {
29         return netdev2adap(dev)->msg_enable;
30 }
31
32 static void set_msglevel(struct net_device *dev, u32 val)
33 {
34         netdev2adap(dev)->msg_enable = val;
35 }
36
37 static const char stats_strings[][ETH_GSTRING_LEN] = {
38         "tx_octets_ok           ",
39         "tx_frames_ok           ",
40         "tx_broadcast_frames    ",
41         "tx_multicast_frames    ",
42         "tx_unicast_frames      ",
43         "tx_error_frames        ",
44
45         "tx_frames_64           ",
46         "tx_frames_65_to_127    ",
47         "tx_frames_128_to_255   ",
48         "tx_frames_256_to_511   ",
49         "tx_frames_512_to_1023  ",
50         "tx_frames_1024_to_1518 ",
51         "tx_frames_1519_to_max  ",
52
53         "tx_frames_dropped      ",
54         "tx_pause_frames        ",
55         "tx_ppp0_frames         ",
56         "tx_ppp1_frames         ",
57         "tx_ppp2_frames         ",
58         "tx_ppp3_frames         ",
59         "tx_ppp4_frames         ",
60         "tx_ppp5_frames         ",
61         "tx_ppp6_frames         ",
62         "tx_ppp7_frames         ",
63
64         "rx_octets_ok           ",
65         "rx_frames_ok           ",
66         "rx_broadcast_frames    ",
67         "rx_multicast_frames    ",
68         "rx_unicast_frames      ",
69
70         "rx_frames_too_long     ",
71         "rx_jabber_errors       ",
72         "rx_fcs_errors          ",
73         "rx_length_errors       ",
74         "rx_symbol_errors       ",
75         "rx_runt_frames         ",
76
77         "rx_frames_64           ",
78         "rx_frames_65_to_127    ",
79         "rx_frames_128_to_255   ",
80         "rx_frames_256_to_511   ",
81         "rx_frames_512_to_1023  ",
82         "rx_frames_1024_to_1518 ",
83         "rx_frames_1519_to_max  ",
84
85         "rx_pause_frames        ",
86         "rx_ppp0_frames         ",
87         "rx_ppp1_frames         ",
88         "rx_ppp2_frames         ",
89         "rx_ppp3_frames         ",
90         "rx_ppp4_frames         ",
91         "rx_ppp5_frames         ",
92         "rx_ppp6_frames         ",
93         "rx_ppp7_frames         ",
94
95         "rx_bg0_frames_dropped  ",
96         "rx_bg1_frames_dropped  ",
97         "rx_bg2_frames_dropped  ",
98         "rx_bg3_frames_dropped  ",
99         "rx_bg0_frames_trunc    ",
100         "rx_bg1_frames_trunc    ",
101         "rx_bg2_frames_trunc    ",
102         "rx_bg3_frames_trunc    ",
103
104         "tso                    ",
105         "tx_csum_offload        ",
106         "rx_csum_good           ",
107         "vlan_extractions       ",
108         "vlan_insertions        ",
109         "gro_packets            ",
110         "gro_merged             ",
111 };
112
113 static char adapter_stats_strings[][ETH_GSTRING_LEN] = {
114         "db_drop                ",
115         "db_full                ",
116         "db_empty               ",
117         "tcp_ipv4_out_rsts      ",
118         "tcp_ipv4_in_segs       ",
119         "tcp_ipv4_out_segs      ",
120         "tcp_ipv4_retrans_segs  ",
121         "tcp_ipv6_out_rsts      ",
122         "tcp_ipv6_in_segs       ",
123         "tcp_ipv6_out_segs      ",
124         "tcp_ipv6_retrans_segs  ",
125         "usm_ddp_frames         ",
126         "usm_ddp_octets         ",
127         "usm_ddp_drops          ",
128         "rdma_no_rqe_mod_defer  ",
129         "rdma_no_rqe_pkt_defer  ",
130         "tp_err_ofld_no_neigh   ",
131         "tp_err_ofld_cong_defer ",
132         "write_coal_success     ",
133         "write_coal_fail        ",
134 };
135
136 static char channel_stats_strings[][ETH_GSTRING_LEN] = {
137         "--------Channel--------- ",
138         "tp_cpl_requests        ",
139         "tp_cpl_responses       ",
140         "tp_mac_in_errs         ",
141         "tp_hdr_in_errs         ",
142         "tp_tcp_in_errs         ",
143         "tp_tcp6_in_errs        ",
144         "tp_tnl_cong_drops      ",
145         "tp_tnl_tx_drops        ",
146         "tp_ofld_vlan_drops     ",
147         "tp_ofld_chan_drops     ",
148         "fcoe_octets_ddp        ",
149         "fcoe_frames_ddp        ",
150         "fcoe_frames_drop       ",
151 };
152
153 static char loopback_stats_strings[][ETH_GSTRING_LEN] = {
154         "-------Loopback----------- ",
155         "octets_ok              ",
156         "frames_ok              ",
157         "bcast_frames           ",
158         "mcast_frames           ",
159         "ucast_frames           ",
160         "error_frames           ",
161         "frames_64              ",
162         "frames_65_to_127       ",
163         "frames_128_to_255      ",
164         "frames_256_to_511      ",
165         "frames_512_to_1023     ",
166         "frames_1024_to_1518    ",
167         "frames_1519_to_max     ",
168         "frames_dropped         ",
169         "bg0_frames_dropped     ",
170         "bg1_frames_dropped     ",
171         "bg2_frames_dropped     ",
172         "bg3_frames_dropped     ",
173         "bg0_frames_trunc       ",
174         "bg1_frames_trunc       ",
175         "bg2_frames_trunc       ",
176         "bg3_frames_trunc       ",
177 };
178
179 static int get_sset_count(struct net_device *dev, int sset)
180 {
181         switch (sset) {
182         case ETH_SS_STATS:
183                 return ARRAY_SIZE(stats_strings) +
184                        ARRAY_SIZE(adapter_stats_strings) +
185                        ARRAY_SIZE(channel_stats_strings) +
186                        ARRAY_SIZE(loopback_stats_strings);
187         default:
188                 return -EOPNOTSUPP;
189         }
190 }
191
192 static int get_regs_len(struct net_device *dev)
193 {
194         struct adapter *adap = netdev2adap(dev);
195
196         return t4_get_regs_len(adap);
197 }
198
199 static int get_eeprom_len(struct net_device *dev)
200 {
201         return EEPROMSIZE;
202 }
203
204 static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
205 {
206         struct adapter *adapter = netdev2adap(dev);
207         u32 exprom_vers;
208
209         strlcpy(info->driver, cxgb4_driver_name, sizeof(info->driver));
210         strlcpy(info->version, cxgb4_driver_version,
211                 sizeof(info->version));
212         strlcpy(info->bus_info, pci_name(adapter->pdev),
213                 sizeof(info->bus_info));
214
215         if (adapter->params.fw_vers)
216                 snprintf(info->fw_version, sizeof(info->fw_version),
217                          "%u.%u.%u.%u, TP %u.%u.%u.%u",
218                          FW_HDR_FW_VER_MAJOR_G(adapter->params.fw_vers),
219                          FW_HDR_FW_VER_MINOR_G(adapter->params.fw_vers),
220                          FW_HDR_FW_VER_MICRO_G(adapter->params.fw_vers),
221                          FW_HDR_FW_VER_BUILD_G(adapter->params.fw_vers),
222                          FW_HDR_FW_VER_MAJOR_G(adapter->params.tp_vers),
223                          FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers),
224                          FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers),
225                          FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers));
226
227         if (!t4_get_exprom_version(adapter, &exprom_vers))
228                 snprintf(info->erom_version, sizeof(info->erom_version),
229                          "%u.%u.%u.%u",
230                          FW_HDR_FW_VER_MAJOR_G(exprom_vers),
231                          FW_HDR_FW_VER_MINOR_G(exprom_vers),
232                          FW_HDR_FW_VER_MICRO_G(exprom_vers),
233                          FW_HDR_FW_VER_BUILD_G(exprom_vers));
234 }
235
236 static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
237 {
238         if (stringset == ETH_SS_STATS) {
239                 memcpy(data, stats_strings, sizeof(stats_strings));
240                 data += sizeof(stats_strings);
241                 memcpy(data, adapter_stats_strings,
242                        sizeof(adapter_stats_strings));
243                 data += sizeof(adapter_stats_strings);
244                 memcpy(data, channel_stats_strings,
245                        sizeof(channel_stats_strings));
246                 data += sizeof(channel_stats_strings);
247                 memcpy(data, loopback_stats_strings,
248                        sizeof(loopback_stats_strings));
249         }
250 }
251
252 /* port stats maintained per queue of the port. They should be in the same
253  * order as in stats_strings above.
254  */
255 struct queue_port_stats {
256         u64 tso;
257         u64 tx_csum;
258         u64 rx_csum;
259         u64 vlan_ex;
260         u64 vlan_ins;
261         u64 gro_pkts;
262         u64 gro_merged;
263 };
264
265 struct adapter_stats {
266         u64 db_drop;
267         u64 db_full;
268         u64 db_empty;
269         u64 tcp_v4_out_rsts;
270         u64 tcp_v4_in_segs;
271         u64 tcp_v4_out_segs;
272         u64 tcp_v4_retrans_segs;
273         u64 tcp_v6_out_rsts;
274         u64 tcp_v6_in_segs;
275         u64 tcp_v6_out_segs;
276         u64 tcp_v6_retrans_segs;
277         u64 frames;
278         u64 octets;
279         u64 drops;
280         u64 rqe_dfr_mod;
281         u64 rqe_dfr_pkt;
282         u64 ofld_no_neigh;
283         u64 ofld_cong_defer;
284         u64 wc_success;
285         u64 wc_fail;
286 };
287
288 struct channel_stats {
289         u64 cpl_req;
290         u64 cpl_rsp;
291         u64 mac_in_errs;
292         u64 hdr_in_errs;
293         u64 tcp_in_errs;
294         u64 tcp6_in_errs;
295         u64 tnl_cong_drops;
296         u64 tnl_tx_drops;
297         u64 ofld_vlan_drops;
298         u64 ofld_chan_drops;
299         u64 octets_ddp;
300         u64 frames_ddp;
301         u64 frames_drop;
302 };
303
304 static void collect_sge_port_stats(const struct adapter *adap,
305                                    const struct port_info *p,
306                                    struct queue_port_stats *s)
307 {
308         int i;
309         const struct sge_eth_txq *tx = &adap->sge.ethtxq[p->first_qset];
310         const struct sge_eth_rxq *rx = &adap->sge.ethrxq[p->first_qset];
311
312         memset(s, 0, sizeof(*s));
313         for (i = 0; i < p->nqsets; i++, rx++, tx++) {
314                 s->tso += tx->tso;
315                 s->tx_csum += tx->tx_cso;
316                 s->rx_csum += rx->stats.rx_cso;
317                 s->vlan_ex += rx->stats.vlan_ex;
318                 s->vlan_ins += tx->vlan_ins;
319                 s->gro_pkts += rx->stats.lro_pkts;
320                 s->gro_merged += rx->stats.lro_merged;
321         }
322 }
323
324 static void collect_adapter_stats(struct adapter *adap, struct adapter_stats *s)
325 {
326         struct tp_tcp_stats v4, v6;
327         struct tp_rdma_stats rdma_stats;
328         struct tp_err_stats err_stats;
329         struct tp_usm_stats usm_stats;
330         u64 val1, val2;
331
332         memset(s, 0, sizeof(*s));
333
334         spin_lock(&adap->stats_lock);
335         t4_tp_get_tcp_stats(adap, &v4, &v6);
336         t4_tp_get_rdma_stats(adap, &rdma_stats);
337         t4_get_usm_stats(adap, &usm_stats);
338         t4_tp_get_err_stats(adap, &err_stats);
339         spin_unlock(&adap->stats_lock);
340
341         s->db_drop = adap->db_stats.db_drop;
342         s->db_full = adap->db_stats.db_full;
343         s->db_empty = adap->db_stats.db_empty;
344
345         s->tcp_v4_out_rsts = v4.tcp_out_rsts;
346         s->tcp_v4_in_segs = v4.tcp_in_segs;
347         s->tcp_v4_out_segs = v4.tcp_out_segs;
348         s->tcp_v4_retrans_segs = v4.tcp_retrans_segs;
349         s->tcp_v6_out_rsts = v6.tcp_out_rsts;
350         s->tcp_v6_in_segs = v6.tcp_in_segs;
351         s->tcp_v6_out_segs = v6.tcp_out_segs;
352         s->tcp_v6_retrans_segs = v6.tcp_retrans_segs;
353
354         if (is_offload(adap)) {
355                 s->frames = usm_stats.frames;
356                 s->octets = usm_stats.octets;
357                 s->drops = usm_stats.drops;
358                 s->rqe_dfr_mod = rdma_stats.rqe_dfr_mod;
359                 s->rqe_dfr_pkt = rdma_stats.rqe_dfr_pkt;
360         }
361
362         s->ofld_no_neigh = err_stats.ofld_no_neigh;
363         s->ofld_cong_defer = err_stats.ofld_cong_defer;
364
365         if (!is_t4(adap->params.chip)) {
366                 int v;
367
368                 v = t4_read_reg(adap, SGE_STAT_CFG_A);
369                 if (STATSOURCE_T5_G(v) == 7) {
370                         val2 = t4_read_reg(adap, SGE_STAT_MATCH_A);
371                         val1 = t4_read_reg(adap, SGE_STAT_TOTAL_A);
372                         s->wc_success = val1 - val2;
373                         s->wc_fail = val2;
374                 }
375         }
376 }
377
378 static void collect_channel_stats(struct adapter *adap, struct channel_stats *s,
379                                   u8 i)
380 {
381         struct tp_cpl_stats cpl_stats;
382         struct tp_err_stats err_stats;
383         struct tp_fcoe_stats fcoe_stats;
384
385         memset(s, 0, sizeof(*s));
386
387         spin_lock(&adap->stats_lock);
388         t4_tp_get_cpl_stats(adap, &cpl_stats);
389         t4_tp_get_err_stats(adap, &err_stats);
390         t4_get_fcoe_stats(adap, i, &fcoe_stats);
391         spin_unlock(&adap->stats_lock);
392
393         s->cpl_req = cpl_stats.req[i];
394         s->cpl_rsp = cpl_stats.rsp[i];
395         s->mac_in_errs = err_stats.mac_in_errs[i];
396         s->hdr_in_errs = err_stats.hdr_in_errs[i];
397         s->tcp_in_errs = err_stats.tcp_in_errs[i];
398         s->tcp6_in_errs = err_stats.tcp6_in_errs[i];
399         s->tnl_cong_drops = err_stats.tnl_cong_drops[i];
400         s->tnl_tx_drops = err_stats.tnl_tx_drops[i];
401         s->ofld_vlan_drops = err_stats.ofld_vlan_drops[i];
402         s->ofld_chan_drops = err_stats.ofld_chan_drops[i];
403         s->octets_ddp = fcoe_stats.octets_ddp;
404         s->frames_ddp = fcoe_stats.frames_ddp;
405         s->frames_drop = fcoe_stats.frames_drop;
406 }
407
408 static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
409                       u64 *data)
410 {
411         struct port_info *pi = netdev_priv(dev);
412         struct adapter *adapter = pi->adapter;
413         struct lb_port_stats s;
414         int i;
415         u64 *p0;
416
417         t4_get_port_stats_offset(adapter, pi->tx_chan,
418                                  (struct port_stats *)data,
419                                  &pi->stats_base);
420
421         data += sizeof(struct port_stats) / sizeof(u64);
422         collect_sge_port_stats(adapter, pi, (struct queue_port_stats *)data);
423         data += sizeof(struct queue_port_stats) / sizeof(u64);
424         collect_adapter_stats(adapter, (struct adapter_stats *)data);
425         data += sizeof(struct adapter_stats) / sizeof(u64);
426
427         *data++ = (u64)pi->port_id;
428         collect_channel_stats(adapter, (struct channel_stats *)data,
429                               pi->port_id);
430         data += sizeof(struct channel_stats) / sizeof(u64);
431
432         *data++ = (u64)pi->port_id;
433         memset(&s, 0, sizeof(s));
434         t4_get_lb_stats(adapter, pi->port_id, &s);
435
436         p0 = &s.octets;
437         for (i = 0; i < ARRAY_SIZE(loopback_stats_strings) - 1; i++)
438                 *data++ = (unsigned long long)*p0++;
439 }
440
441 static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
442                      void *buf)
443 {
444         struct adapter *adap = netdev2adap(dev);
445         size_t buf_size;
446
447         buf_size = t4_get_regs_len(adap);
448         regs->version = mk_adap_vers(adap);
449         t4_get_regs(adap, buf, buf_size);
450 }
451
452 static int restart_autoneg(struct net_device *dev)
453 {
454         struct port_info *p = netdev_priv(dev);
455
456         if (!netif_running(dev))
457                 return -EAGAIN;
458         if (p->link_cfg.autoneg != AUTONEG_ENABLE)
459                 return -EINVAL;
460         t4_restart_aneg(p->adapter, p->adapter->pf, p->tx_chan);
461         return 0;
462 }
463
464 static int identify_port(struct net_device *dev,
465                          enum ethtool_phys_id_state state)
466 {
467         unsigned int val;
468         struct adapter *adap = netdev2adap(dev);
469
470         if (state == ETHTOOL_ID_ACTIVE)
471                 val = 0xffff;
472         else if (state == ETHTOOL_ID_INACTIVE)
473                 val = 0;
474         else
475                 return -EINVAL;
476
477         return t4_identify_port(adap, adap->pf, netdev2pinfo(dev)->viid, val);
478 }
479
480 static unsigned int from_fw_linkcaps(enum fw_port_type type, unsigned int caps)
481 {
482         unsigned int v = 0;
483
484         if (type == FW_PORT_TYPE_BT_SGMII || type == FW_PORT_TYPE_BT_XFI ||
485             type == FW_PORT_TYPE_BT_XAUI) {
486                 v |= SUPPORTED_TP;
487                 if (caps & FW_PORT_CAP_SPEED_100M)
488                         v |= SUPPORTED_100baseT_Full;
489                 if (caps & FW_PORT_CAP_SPEED_1G)
490                         v |= SUPPORTED_1000baseT_Full;
491                 if (caps & FW_PORT_CAP_SPEED_10G)
492                         v |= SUPPORTED_10000baseT_Full;
493         } else if (type == FW_PORT_TYPE_KX4 || type == FW_PORT_TYPE_KX) {
494                 v |= SUPPORTED_Backplane;
495                 if (caps & FW_PORT_CAP_SPEED_1G)
496                         v |= SUPPORTED_1000baseKX_Full;
497                 if (caps & FW_PORT_CAP_SPEED_10G)
498                         v |= SUPPORTED_10000baseKX4_Full;
499         } else if (type == FW_PORT_TYPE_KR) {
500                 v |= SUPPORTED_Backplane | SUPPORTED_10000baseKR_Full;
501         } else if (type == FW_PORT_TYPE_BP_AP) {
502                 v |= SUPPORTED_Backplane | SUPPORTED_10000baseR_FEC |
503                      SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full;
504         } else if (type == FW_PORT_TYPE_BP4_AP) {
505                 v |= SUPPORTED_Backplane | SUPPORTED_10000baseR_FEC |
506                      SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full |
507                      SUPPORTED_10000baseKX4_Full;
508         } else if (type == FW_PORT_TYPE_FIBER_XFI ||
509                    type == FW_PORT_TYPE_FIBER_XAUI ||
510                    type == FW_PORT_TYPE_SFP ||
511                    type == FW_PORT_TYPE_QSFP_10G ||
512                    type == FW_PORT_TYPE_QSA) {
513                 v |= SUPPORTED_FIBRE;
514                 if (caps & FW_PORT_CAP_SPEED_1G)
515                         v |= SUPPORTED_1000baseT_Full;
516                 if (caps & FW_PORT_CAP_SPEED_10G)
517                         v |= SUPPORTED_10000baseT_Full;
518         } else if (type == FW_PORT_TYPE_BP40_BA ||
519                    type == FW_PORT_TYPE_QSFP) {
520                 v |= SUPPORTED_40000baseSR4_Full;
521                 v |= SUPPORTED_FIBRE;
522         }
523
524         if (caps & FW_PORT_CAP_ANEG)
525                 v |= SUPPORTED_Autoneg;
526         return v;
527 }
528
529 static unsigned int to_fw_linkcaps(unsigned int caps)
530 {
531         unsigned int v = 0;
532
533         if (caps & ADVERTISED_100baseT_Full)
534                 v |= FW_PORT_CAP_SPEED_100M;
535         if (caps & ADVERTISED_1000baseT_Full)
536                 v |= FW_PORT_CAP_SPEED_1G;
537         if (caps & ADVERTISED_10000baseT_Full)
538                 v |= FW_PORT_CAP_SPEED_10G;
539         if (caps & ADVERTISED_40000baseSR4_Full)
540                 v |= FW_PORT_CAP_SPEED_40G;
541         return v;
542 }
543
544 static int get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
545 {
546         const struct port_info *p = netdev_priv(dev);
547
548         if (p->port_type == FW_PORT_TYPE_BT_SGMII ||
549             p->port_type == FW_PORT_TYPE_BT_XFI ||
550             p->port_type == FW_PORT_TYPE_BT_XAUI) {
551                 cmd->port = PORT_TP;
552         } else if (p->port_type == FW_PORT_TYPE_FIBER_XFI ||
553                    p->port_type == FW_PORT_TYPE_FIBER_XAUI) {
554                 cmd->port = PORT_FIBRE;
555         } else if (p->port_type == FW_PORT_TYPE_SFP ||
556                    p->port_type == FW_PORT_TYPE_QSFP_10G ||
557                    p->port_type == FW_PORT_TYPE_QSA ||
558                    p->port_type == FW_PORT_TYPE_QSFP) {
559                 if (p->mod_type == FW_PORT_MOD_TYPE_LR ||
560                     p->mod_type == FW_PORT_MOD_TYPE_SR ||
561                     p->mod_type == FW_PORT_MOD_TYPE_ER ||
562                     p->mod_type == FW_PORT_MOD_TYPE_LRM)
563                         cmd->port = PORT_FIBRE;
564                 else if (p->mod_type == FW_PORT_MOD_TYPE_TWINAX_PASSIVE ||
565                          p->mod_type == FW_PORT_MOD_TYPE_TWINAX_ACTIVE)
566                         cmd->port = PORT_DA;
567                 else
568                         cmd->port = PORT_OTHER;
569         } else {
570                 cmd->port = PORT_OTHER;
571         }
572
573         if (p->mdio_addr >= 0) {
574                 cmd->phy_address = p->mdio_addr;
575                 cmd->transceiver = XCVR_EXTERNAL;
576                 cmd->mdio_support = p->port_type == FW_PORT_TYPE_BT_SGMII ?
577                         MDIO_SUPPORTS_C22 : MDIO_SUPPORTS_C45;
578         } else {
579                 cmd->phy_address = 0;  /* not really, but no better option */
580                 cmd->transceiver = XCVR_INTERNAL;
581                 cmd->mdio_support = 0;
582         }
583
584         cmd->supported = from_fw_linkcaps(p->port_type, p->link_cfg.supported);
585         cmd->advertising = from_fw_linkcaps(p->port_type,
586                                             p->link_cfg.advertising);
587         ethtool_cmd_speed_set(cmd,
588                               netif_carrier_ok(dev) ? p->link_cfg.speed : 0);
589         cmd->duplex = DUPLEX_FULL;
590         cmd->autoneg = p->link_cfg.autoneg;
591         cmd->maxtxpkt = 0;
592         cmd->maxrxpkt = 0;
593         return 0;
594 }
595
596 static unsigned int speed_to_caps(int speed)
597 {
598         if (speed == 100)
599                 return FW_PORT_CAP_SPEED_100M;
600         if (speed == 1000)
601                 return FW_PORT_CAP_SPEED_1G;
602         if (speed == 10000)
603                 return FW_PORT_CAP_SPEED_10G;
604         if (speed == 40000)
605                 return FW_PORT_CAP_SPEED_40G;
606         return 0;
607 }
608
609 static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
610 {
611         unsigned int cap;
612         struct port_info *p = netdev_priv(dev);
613         struct link_config *lc = &p->link_cfg;
614         u32 speed = ethtool_cmd_speed(cmd);
615         struct link_config old_lc;
616         int ret;
617
618         if (cmd->duplex != DUPLEX_FULL)     /* only full-duplex supported */
619                 return -EINVAL;
620
621         if (!(lc->supported & FW_PORT_CAP_ANEG)) {
622                 /* PHY offers a single speed.  See if that's what's
623                  * being requested.
624                  */
625                 if (cmd->autoneg == AUTONEG_DISABLE &&
626                     (lc->supported & speed_to_caps(speed)))
627                         return 0;
628                 return -EINVAL;
629         }
630
631         old_lc = *lc;
632         if (cmd->autoneg == AUTONEG_DISABLE) {
633                 cap = speed_to_caps(speed);
634
635                 if (!(lc->supported & cap))
636                         return -EINVAL;
637                 lc->requested_speed = cap;
638                 lc->advertising = 0;
639         } else {
640                 cap = to_fw_linkcaps(cmd->advertising);
641                 if (!(lc->supported & cap))
642                         return -EINVAL;
643                 lc->requested_speed = 0;
644                 lc->advertising = cap | FW_PORT_CAP_ANEG;
645         }
646         lc->autoneg = cmd->autoneg;
647
648         /* If the firmware rejects the Link Configuration request, back out
649          * the changes and report the error.
650          */
651         ret = t4_link_l1cfg(p->adapter, p->adapter->mbox, p->tx_chan, lc);
652         if (ret)
653                 *lc = old_lc;
654
655         return ret;
656 }
657
658 static void get_pauseparam(struct net_device *dev,
659                            struct ethtool_pauseparam *epause)
660 {
661         struct port_info *p = netdev_priv(dev);
662
663         epause->autoneg = (p->link_cfg.requested_fc & PAUSE_AUTONEG) != 0;
664         epause->rx_pause = (p->link_cfg.fc & PAUSE_RX) != 0;
665         epause->tx_pause = (p->link_cfg.fc & PAUSE_TX) != 0;
666 }
667
668 static int set_pauseparam(struct net_device *dev,
669                           struct ethtool_pauseparam *epause)
670 {
671         struct port_info *p = netdev_priv(dev);
672         struct link_config *lc = &p->link_cfg;
673
674         if (epause->autoneg == AUTONEG_DISABLE)
675                 lc->requested_fc = 0;
676         else if (lc->supported & FW_PORT_CAP_ANEG)
677                 lc->requested_fc = PAUSE_AUTONEG;
678         else
679                 return -EINVAL;
680
681         if (epause->rx_pause)
682                 lc->requested_fc |= PAUSE_RX;
683         if (epause->tx_pause)
684                 lc->requested_fc |= PAUSE_TX;
685         if (netif_running(dev))
686                 return t4_link_l1cfg(p->adapter, p->adapter->pf, p->tx_chan,
687                                      lc);
688         return 0;
689 }
690
691 static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
692 {
693         const struct port_info *pi = netdev_priv(dev);
694         const struct sge *s = &pi->adapter->sge;
695
696         e->rx_max_pending = MAX_RX_BUFFERS;
697         e->rx_mini_max_pending = MAX_RSPQ_ENTRIES;
698         e->rx_jumbo_max_pending = 0;
699         e->tx_max_pending = MAX_TXQ_ENTRIES;
700
701         e->rx_pending = s->ethrxq[pi->first_qset].fl.size - 8;
702         e->rx_mini_pending = s->ethrxq[pi->first_qset].rspq.size;
703         e->rx_jumbo_pending = 0;
704         e->tx_pending = s->ethtxq[pi->first_qset].q.size;
705 }
706
707 static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
708 {
709         int i;
710         const struct port_info *pi = netdev_priv(dev);
711         struct adapter *adapter = pi->adapter;
712         struct sge *s = &adapter->sge;
713
714         if (e->rx_pending > MAX_RX_BUFFERS || e->rx_jumbo_pending ||
715             e->tx_pending > MAX_TXQ_ENTRIES ||
716             e->rx_mini_pending > MAX_RSPQ_ENTRIES ||
717             e->rx_mini_pending < MIN_RSPQ_ENTRIES ||
718             e->rx_pending < MIN_FL_ENTRIES || e->tx_pending < MIN_TXQ_ENTRIES)
719                 return -EINVAL;
720
721         if (adapter->flags & FULL_INIT_DONE)
722                 return -EBUSY;
723
724         for (i = 0; i < pi->nqsets; ++i) {
725                 s->ethtxq[pi->first_qset + i].q.size = e->tx_pending;
726                 s->ethrxq[pi->first_qset + i].fl.size = e->rx_pending + 8;
727                 s->ethrxq[pi->first_qset + i].rspq.size = e->rx_mini_pending;
728         }
729         return 0;
730 }
731
732 /**
733  * set_rx_intr_params - set a net devices's RX interrupt holdoff paramete!
734  * @dev: the network device
735  * @us: the hold-off time in us, or 0 to disable timer
736  * @cnt: the hold-off packet count, or 0 to disable counter
737  *
738  * Set the RX interrupt hold-off parameters for a network device.
739  */
740 static int set_rx_intr_params(struct net_device *dev,
741                               unsigned int us, unsigned int cnt)
742 {
743         int i, err;
744         struct port_info *pi = netdev_priv(dev);
745         struct adapter *adap = pi->adapter;
746         struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
747
748         for (i = 0; i < pi->nqsets; i++, q++) {
749                 err = cxgb4_set_rspq_intr_params(&q->rspq, us, cnt);
750                 if (err)
751                         return err;
752         }
753         return 0;
754 }
755
756 static int set_adaptive_rx_setting(struct net_device *dev, int adaptive_rx)
757 {
758         int i;
759         struct port_info *pi = netdev_priv(dev);
760         struct adapter *adap = pi->adapter;
761         struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
762
763         for (i = 0; i < pi->nqsets; i++, q++)
764                 q->rspq.adaptive_rx = adaptive_rx;
765
766         return 0;
767 }
768
769 static int get_adaptive_rx_setting(struct net_device *dev)
770 {
771         struct port_info *pi = netdev_priv(dev);
772         struct adapter *adap = pi->adapter;
773         struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
774
775         return q->rspq.adaptive_rx;
776 }
777
778 static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
779 {
780         set_adaptive_rx_setting(dev, c->use_adaptive_rx_coalesce);
781         return set_rx_intr_params(dev, c->rx_coalesce_usecs,
782                                   c->rx_max_coalesced_frames);
783 }
784
785 static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
786 {
787         const struct port_info *pi = netdev_priv(dev);
788         const struct adapter *adap = pi->adapter;
789         const struct sge_rspq *rq = &adap->sge.ethrxq[pi->first_qset].rspq;
790
791         c->rx_coalesce_usecs = qtimer_val(adap, rq);
792         c->rx_max_coalesced_frames = (rq->intr_params & QINTR_CNT_EN_F) ?
793                 adap->sge.counter_val[rq->pktcnt_idx] : 0;
794         c->use_adaptive_rx_coalesce = get_adaptive_rx_setting(dev);
795         return 0;
796 }
797
798 /**
799  *      eeprom_ptov - translate a physical EEPROM address to virtual
800  *      @phys_addr: the physical EEPROM address
801  *      @fn: the PCI function number
802  *      @sz: size of function-specific area
803  *
804  *      Translate a physical EEPROM address to virtual.  The first 1K is
805  *      accessed through virtual addresses starting at 31K, the rest is
806  *      accessed through virtual addresses starting at 0.
807  *
808  *      The mapping is as follows:
809  *      [0..1K) -> [31K..32K)
810  *      [1K..1K+A) -> [31K-A..31K)
811  *      [1K+A..ES) -> [0..ES-A-1K)
812  *
813  *      where A = @fn * @sz, and ES = EEPROM size.
814  */
815 static int eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz)
816 {
817         fn *= sz;
818         if (phys_addr < 1024)
819                 return phys_addr + (31 << 10);
820         if (phys_addr < 1024 + fn)
821                 return 31744 - fn + phys_addr - 1024;
822         if (phys_addr < EEPROMSIZE)
823                 return phys_addr - 1024 - fn;
824         return -EINVAL;
825 }
826
827 /* The next two routines implement eeprom read/write from physical addresses.
828  */
829 static int eeprom_rd_phys(struct adapter *adap, unsigned int phys_addr, u32 *v)
830 {
831         int vaddr = eeprom_ptov(phys_addr, adap->pf, EEPROMPFSIZE);
832
833         if (vaddr >= 0)
834                 vaddr = pci_read_vpd(adap->pdev, vaddr, sizeof(u32), v);
835         return vaddr < 0 ? vaddr : 0;
836 }
837
838 static int eeprom_wr_phys(struct adapter *adap, unsigned int phys_addr, u32 v)
839 {
840         int vaddr = eeprom_ptov(phys_addr, adap->pf, EEPROMPFSIZE);
841
842         if (vaddr >= 0)
843                 vaddr = pci_write_vpd(adap->pdev, vaddr, sizeof(u32), &v);
844         return vaddr < 0 ? vaddr : 0;
845 }
846
847 #define EEPROM_MAGIC 0x38E2F10C
848
849 static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e,
850                       u8 *data)
851 {
852         int i, err = 0;
853         struct adapter *adapter = netdev2adap(dev);
854         u8 *buf = t4_alloc_mem(EEPROMSIZE);
855
856         if (!buf)
857                 return -ENOMEM;
858
859         e->magic = EEPROM_MAGIC;
860         for (i = e->offset & ~3; !err && i < e->offset + e->len; i += 4)
861                 err = eeprom_rd_phys(adapter, i, (u32 *)&buf[i]);
862
863         if (!err)
864                 memcpy(data, buf + e->offset, e->len);
865         t4_free_mem(buf);
866         return err;
867 }
868
869 static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
870                       u8 *data)
871 {
872         u8 *buf;
873         int err = 0;
874         u32 aligned_offset, aligned_len, *p;
875         struct adapter *adapter = netdev2adap(dev);
876
877         if (eeprom->magic != EEPROM_MAGIC)
878                 return -EINVAL;
879
880         aligned_offset = eeprom->offset & ~3;
881         aligned_len = (eeprom->len + (eeprom->offset & 3) + 3) & ~3;
882
883         if (adapter->pf > 0) {
884                 u32 start = 1024 + adapter->pf * EEPROMPFSIZE;
885
886                 if (aligned_offset < start ||
887                     aligned_offset + aligned_len > start + EEPROMPFSIZE)
888                         return -EPERM;
889         }
890
891         if (aligned_offset != eeprom->offset || aligned_len != eeprom->len) {
892                 /* RMW possibly needed for first or last words.
893                  */
894                 buf = t4_alloc_mem(aligned_len);
895                 if (!buf)
896                         return -ENOMEM;
897                 err = eeprom_rd_phys(adapter, aligned_offset, (u32 *)buf);
898                 if (!err && aligned_len > 4)
899                         err = eeprom_rd_phys(adapter,
900                                              aligned_offset + aligned_len - 4,
901                                              (u32 *)&buf[aligned_len - 4]);
902                 if (err)
903                         goto out;
904                 memcpy(buf + (eeprom->offset & 3), data, eeprom->len);
905         } else {
906                 buf = data;
907         }
908
909         err = t4_seeprom_wp(adapter, false);
910         if (err)
911                 goto out;
912
913         for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
914                 err = eeprom_wr_phys(adapter, aligned_offset, *p);
915                 aligned_offset += 4;
916         }
917
918         if (!err)
919                 err = t4_seeprom_wp(adapter, true);
920 out:
921         if (buf != data)
922                 t4_free_mem(buf);
923         return err;
924 }
925
926 static int set_flash(struct net_device *netdev, struct ethtool_flash *ef)
927 {
928         int ret;
929         const struct firmware *fw;
930         struct adapter *adap = netdev2adap(netdev);
931         unsigned int mbox = PCIE_FW_MASTER_M + 1;
932         u32 pcie_fw;
933         unsigned int master;
934         u8 master_vld = 0;
935
936         pcie_fw = t4_read_reg(adap, PCIE_FW_A);
937         master = PCIE_FW_MASTER_G(pcie_fw);
938         if (pcie_fw & PCIE_FW_MASTER_VLD_F)
939                 master_vld = 1;
940         /* if csiostor is the master return */
941         if (master_vld && (master != adap->pf)) {
942                 dev_warn(adap->pdev_dev,
943                          "cxgb4 driver needs to be loaded as MASTER to support FW flash\n");
944                 return -EOPNOTSUPP;
945         }
946
947         ef->data[sizeof(ef->data) - 1] = '\0';
948         ret = request_firmware(&fw, ef->data, adap->pdev_dev);
949         if (ret < 0)
950                 return ret;
951
952         /* If the adapter has been fully initialized then we'll go ahead and
953          * try to get the firmware's cooperation in upgrading to the new
954          * firmware image otherwise we'll try to do the entire job from the
955          * host ... and we always "force" the operation in this path.
956          */
957         if (adap->flags & FULL_INIT_DONE)
958                 mbox = adap->mbox;
959
960         ret = t4_fw_upgrade(adap, mbox, fw->data, fw->size, 1);
961         release_firmware(fw);
962         if (!ret)
963                 dev_info(adap->pdev_dev,
964                          "loaded firmware %s, reload cxgb4 driver\n", ef->data);
965         return ret;
966 }
967
968 static int get_ts_info(struct net_device *dev, struct ethtool_ts_info *ts_info)
969 {
970         ts_info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
971                                    SOF_TIMESTAMPING_RX_SOFTWARE |
972                                    SOF_TIMESTAMPING_SOFTWARE;
973
974         ts_info->so_timestamping |= SOF_TIMESTAMPING_RX_HARDWARE |
975                                     SOF_TIMESTAMPING_RAW_HARDWARE;
976
977         ts_info->phc_index = -1;
978
979         return 0;
980 }
981
982 static u32 get_rss_table_size(struct net_device *dev)
983 {
984         const struct port_info *pi = netdev_priv(dev);
985
986         return pi->rss_size;
987 }
988
989 static int get_rss_table(struct net_device *dev, u32 *p, u8 *key, u8 *hfunc)
990 {
991         const struct port_info *pi = netdev_priv(dev);
992         unsigned int n = pi->rss_size;
993
994         if (hfunc)
995                 *hfunc = ETH_RSS_HASH_TOP;
996         if (!p)
997                 return 0;
998         while (n--)
999                 p[n] = pi->rss[n];
1000         return 0;
1001 }
1002
1003 static int set_rss_table(struct net_device *dev, const u32 *p, const u8 *key,
1004                          const u8 hfunc)
1005 {
1006         unsigned int i;
1007         struct port_info *pi = netdev_priv(dev);
1008
1009         /* We require at least one supported parameter to be changed and no
1010          * change in any of the unsupported parameters
1011          */
1012         if (key ||
1013             (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP))
1014                 return -EOPNOTSUPP;
1015         if (!p)
1016                 return 0;
1017
1018         /* Interface must be brought up atleast once */
1019         if (pi->adapter->flags & FULL_INIT_DONE) {
1020                 for (i = 0; i < pi->rss_size; i++)
1021                         pi->rss[i] = p[i];
1022
1023                 return cxgb4_write_rss(pi, pi->rss);
1024         }
1025
1026         return -EPERM;
1027 }
1028
1029 static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
1030                      u32 *rules)
1031 {
1032         const struct port_info *pi = netdev_priv(dev);
1033
1034         switch (info->cmd) {
1035         case ETHTOOL_GRXFH: {
1036                 unsigned int v = pi->rss_mode;
1037
1038                 info->data = 0;
1039                 switch (info->flow_type) {
1040                 case TCP_V4_FLOW:
1041                         if (v & FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN_F)
1042                                 info->data = RXH_IP_SRC | RXH_IP_DST |
1043                                              RXH_L4_B_0_1 | RXH_L4_B_2_3;
1044                         else if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F)
1045                                 info->data = RXH_IP_SRC | RXH_IP_DST;
1046                         break;
1047                 case UDP_V4_FLOW:
1048                         if ((v & FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN_F) &&
1049                             (v & FW_RSS_VI_CONFIG_CMD_UDPEN_F))
1050                                 info->data = RXH_IP_SRC | RXH_IP_DST |
1051                                              RXH_L4_B_0_1 | RXH_L4_B_2_3;
1052                         else if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F)
1053                                 info->data = RXH_IP_SRC | RXH_IP_DST;
1054                         break;
1055                 case SCTP_V4_FLOW:
1056                 case AH_ESP_V4_FLOW:
1057                 case IPV4_FLOW:
1058                         if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F)
1059                                 info->data = RXH_IP_SRC | RXH_IP_DST;
1060                         break;
1061                 case TCP_V6_FLOW:
1062                         if (v & FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN_F)
1063                                 info->data = RXH_IP_SRC | RXH_IP_DST |
1064                                              RXH_L4_B_0_1 | RXH_L4_B_2_3;
1065                         else if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F)
1066                                 info->data = RXH_IP_SRC | RXH_IP_DST;
1067                         break;
1068                 case UDP_V6_FLOW:
1069                         if ((v & FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN_F) &&
1070                             (v & FW_RSS_VI_CONFIG_CMD_UDPEN_F))
1071                                 info->data = RXH_IP_SRC | RXH_IP_DST |
1072                                              RXH_L4_B_0_1 | RXH_L4_B_2_3;
1073                         else if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F)
1074                                 info->data = RXH_IP_SRC | RXH_IP_DST;
1075                         break;
1076                 case SCTP_V6_FLOW:
1077                 case AH_ESP_V6_FLOW:
1078                 case IPV6_FLOW:
1079                         if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F)
1080                                 info->data = RXH_IP_SRC | RXH_IP_DST;
1081                         break;
1082                 }
1083                 return 0;
1084         }
1085         case ETHTOOL_GRXRINGS:
1086                 info->data = pi->nqsets;
1087                 return 0;
1088         }
1089         return -EOPNOTSUPP;
1090 }
1091
1092 static const struct ethtool_ops cxgb_ethtool_ops = {
1093         .get_settings      = get_settings,
1094         .set_settings      = set_settings,
1095         .get_drvinfo       = get_drvinfo,
1096         .get_msglevel      = get_msglevel,
1097         .set_msglevel      = set_msglevel,
1098         .get_ringparam     = get_sge_param,
1099         .set_ringparam     = set_sge_param,
1100         .get_coalesce      = get_coalesce,
1101         .set_coalesce      = set_coalesce,
1102         .get_eeprom_len    = get_eeprom_len,
1103         .get_eeprom        = get_eeprom,
1104         .set_eeprom        = set_eeprom,
1105         .get_pauseparam    = get_pauseparam,
1106         .set_pauseparam    = set_pauseparam,
1107         .get_link          = ethtool_op_get_link,
1108         .get_strings       = get_strings,
1109         .set_phys_id       = identify_port,
1110         .nway_reset        = restart_autoneg,
1111         .get_sset_count    = get_sset_count,
1112         .get_ethtool_stats = get_stats,
1113         .get_regs_len      = get_regs_len,
1114         .get_regs          = get_regs,
1115         .get_rxnfc         = get_rxnfc,
1116         .get_rxfh_indir_size = get_rss_table_size,
1117         .get_rxfh          = get_rss_table,
1118         .set_rxfh          = set_rss_table,
1119         .flash_device      = set_flash,
1120         .get_ts_info       = get_ts_info
1121 };
1122
1123 void cxgb4_set_ethtool_ops(struct net_device *netdev)
1124 {
1125         netdev->ethtool_ops = &cxgb_ethtool_ops;
1126 }