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
27static u32 get_msglevel(struct net_device *dev)
28{
29	return netdev2adap(dev)->msg_enable;
30}
31
32static void set_msglevel(struct net_device *dev, u32 val)
33{
34	netdev2adap(dev)->msg_enable = val;
35}
36
37static const char stats_strings[][ETH_GSTRING_LEN] = {
38	"TxOctetsOK         ",
39	"TxFramesOK         ",
40	"TxBroadcastFrames  ",
41	"TxMulticastFrames  ",
42	"TxUnicastFrames    ",
43	"TxErrorFrames      ",
44
45	"TxFrames64         ",
46	"TxFrames65To127    ",
47	"TxFrames128To255   ",
48	"TxFrames256To511   ",
49	"TxFrames512To1023  ",
50	"TxFrames1024To1518 ",
51	"TxFrames1519ToMax  ",
52
53	"TxFramesDropped    ",
54	"TxPauseFrames      ",
55	"TxPPP0Frames       ",
56	"TxPPP1Frames       ",
57	"TxPPP2Frames       ",
58	"TxPPP3Frames       ",
59	"TxPPP4Frames       ",
60	"TxPPP5Frames       ",
61	"TxPPP6Frames       ",
62	"TxPPP7Frames       ",
63
64	"RxOctetsOK         ",
65	"RxFramesOK         ",
66	"RxBroadcastFrames  ",
67	"RxMulticastFrames  ",
68	"RxUnicastFrames    ",
69
70	"RxFramesTooLong    ",
71	"RxJabberErrors     ",
72	"RxFCSErrors        ",
73	"RxLengthErrors     ",
74	"RxSymbolErrors     ",
75	"RxRuntFrames       ",
76
77	"RxFrames64         ",
78	"RxFrames65To127    ",
79	"RxFrames128To255   ",
80	"RxFrames256To511   ",
81	"RxFrames512To1023  ",
82	"RxFrames1024To1518 ",
83	"RxFrames1519ToMax  ",
84
85	"RxPauseFrames      ",
86	"RxPPP0Frames       ",
87	"RxPPP1Frames       ",
88	"RxPPP2Frames       ",
89	"RxPPP3Frames       ",
90	"RxPPP4Frames       ",
91	"RxPPP5Frames       ",
92	"RxPPP6Frames       ",
93	"RxPPP7Frames       ",
94
95	"RxBG0FramesDropped ",
96	"RxBG1FramesDropped ",
97	"RxBG2FramesDropped ",
98	"RxBG3FramesDropped ",
99	"RxBG0FramesTrunc   ",
100	"RxBG1FramesTrunc   ",
101	"RxBG2FramesTrunc   ",
102	"RxBG3FramesTrunc   ",
103
104	"TSO                ",
105	"TxCsumOffload      ",
106	"RxCsumGood         ",
107	"VLANextractions    ",
108	"VLANinsertions     ",
109	"GROpackets         ",
110	"GROmerged          ",
111	"WriteCoalSuccess   ",
112	"WriteCoalFail      ",
113};
114
115static int get_sset_count(struct net_device *dev, int sset)
116{
117	switch (sset) {
118	case ETH_SS_STATS:
119		return ARRAY_SIZE(stats_strings);
120	default:
121		return -EOPNOTSUPP;
122	}
123}
124
125static int get_regs_len(struct net_device *dev)
126{
127	struct adapter *adap = netdev2adap(dev);
128
129	return t4_get_regs_len(adap);
130}
131
132static int get_eeprom_len(struct net_device *dev)
133{
134	return EEPROMSIZE;
135}
136
137static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
138{
139	struct adapter *adapter = netdev2adap(dev);
140	u32 exprom_vers;
141
142	strlcpy(info->driver, cxgb4_driver_name, sizeof(info->driver));
143	strlcpy(info->version, cxgb4_driver_version,
144		sizeof(info->version));
145	strlcpy(info->bus_info, pci_name(adapter->pdev),
146		sizeof(info->bus_info));
147
148	if (adapter->params.fw_vers)
149		snprintf(info->fw_version, sizeof(info->fw_version),
150			 "%u.%u.%u.%u, TP %u.%u.%u.%u",
151			 FW_HDR_FW_VER_MAJOR_G(adapter->params.fw_vers),
152			 FW_HDR_FW_VER_MINOR_G(adapter->params.fw_vers),
153			 FW_HDR_FW_VER_MICRO_G(adapter->params.fw_vers),
154			 FW_HDR_FW_VER_BUILD_G(adapter->params.fw_vers),
155			 FW_HDR_FW_VER_MAJOR_G(adapter->params.tp_vers),
156			 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers),
157			 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers),
158			 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers));
159
160	if (!t4_get_exprom_version(adapter, &exprom_vers))
161		snprintf(info->erom_version, sizeof(info->erom_version),
162			 "%u.%u.%u.%u",
163			 FW_HDR_FW_VER_MAJOR_G(exprom_vers),
164			 FW_HDR_FW_VER_MINOR_G(exprom_vers),
165			 FW_HDR_FW_VER_MICRO_G(exprom_vers),
166			 FW_HDR_FW_VER_BUILD_G(exprom_vers));
167}
168
169static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
170{
171	if (stringset == ETH_SS_STATS)
172		memcpy(data, stats_strings, sizeof(stats_strings));
173}
174
175/* port stats maintained per queue of the port. They should be in the same
176 * order as in stats_strings above.
177 */
178struct queue_port_stats {
179	u64 tso;
180	u64 tx_csum;
181	u64 rx_csum;
182	u64 vlan_ex;
183	u64 vlan_ins;
184	u64 gro_pkts;
185	u64 gro_merged;
186};
187
188static void collect_sge_port_stats(const struct adapter *adap,
189				   const struct port_info *p,
190				   struct queue_port_stats *s)
191{
192	int i;
193	const struct sge_eth_txq *tx = &adap->sge.ethtxq[p->first_qset];
194	const struct sge_eth_rxq *rx = &adap->sge.ethrxq[p->first_qset];
195
196	memset(s, 0, sizeof(*s));
197	for (i = 0; i < p->nqsets; i++, rx++, tx++) {
198		s->tso += tx->tso;
199		s->tx_csum += tx->tx_cso;
200		s->rx_csum += rx->stats.rx_cso;
201		s->vlan_ex += rx->stats.vlan_ex;
202		s->vlan_ins += tx->vlan_ins;
203		s->gro_pkts += rx->stats.lro_pkts;
204		s->gro_merged += rx->stats.lro_merged;
205	}
206}
207
208static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
209		      u64 *data)
210{
211	struct port_info *pi = netdev_priv(dev);
212	struct adapter *adapter = pi->adapter;
213	u32 val1, val2;
214
215	t4_get_port_stats(adapter, pi->tx_chan, (struct port_stats *)data);
216
217	data += sizeof(struct port_stats) / sizeof(u64);
218	collect_sge_port_stats(adapter, pi, (struct queue_port_stats *)data);
219	data += sizeof(struct queue_port_stats) / sizeof(u64);
220	if (!is_t4(adapter->params.chip)) {
221		t4_write_reg(adapter, SGE_STAT_CFG_A, STATSOURCE_T5_V(7));
222		val1 = t4_read_reg(adapter, SGE_STAT_TOTAL_A);
223		val2 = t4_read_reg(adapter, SGE_STAT_MATCH_A);
224		*data = val1 - val2;
225		data++;
226		*data = val2;
227		data++;
228	} else {
229		memset(data, 0, 2 * sizeof(u64));
230		*data += 2;
231	}
232}
233
234static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
235		     void *buf)
236{
237	struct adapter *adap = netdev2adap(dev);
238	size_t buf_size;
239
240	buf_size = t4_get_regs_len(adap);
241	regs->version = mk_adap_vers(adap);
242	t4_get_regs(adap, buf, buf_size);
243}
244
245static int restart_autoneg(struct net_device *dev)
246{
247	struct port_info *p = netdev_priv(dev);
248
249	if (!netif_running(dev))
250		return -EAGAIN;
251	if (p->link_cfg.autoneg != AUTONEG_ENABLE)
252		return -EINVAL;
253	t4_restart_aneg(p->adapter, p->adapter->fn, p->tx_chan);
254	return 0;
255}
256
257static int identify_port(struct net_device *dev,
258			 enum ethtool_phys_id_state state)
259{
260	unsigned int val;
261	struct adapter *adap = netdev2adap(dev);
262
263	if (state == ETHTOOL_ID_ACTIVE)
264		val = 0xffff;
265	else if (state == ETHTOOL_ID_INACTIVE)
266		val = 0;
267	else
268		return -EINVAL;
269
270	return t4_identify_port(adap, adap->fn, netdev2pinfo(dev)->viid, val);
271}
272
273static unsigned int from_fw_linkcaps(enum fw_port_type type, unsigned int caps)
274{
275	unsigned int v = 0;
276
277	if (type == FW_PORT_TYPE_BT_SGMII || type == FW_PORT_TYPE_BT_XFI ||
278	    type == FW_PORT_TYPE_BT_XAUI) {
279		v |= SUPPORTED_TP;
280		if (caps & FW_PORT_CAP_SPEED_100M)
281			v |= SUPPORTED_100baseT_Full;
282		if (caps & FW_PORT_CAP_SPEED_1G)
283			v |= SUPPORTED_1000baseT_Full;
284		if (caps & FW_PORT_CAP_SPEED_10G)
285			v |= SUPPORTED_10000baseT_Full;
286	} else if (type == FW_PORT_TYPE_KX4 || type == FW_PORT_TYPE_KX) {
287		v |= SUPPORTED_Backplane;
288		if (caps & FW_PORT_CAP_SPEED_1G)
289			v |= SUPPORTED_1000baseKX_Full;
290		if (caps & FW_PORT_CAP_SPEED_10G)
291			v |= SUPPORTED_10000baseKX4_Full;
292	} else if (type == FW_PORT_TYPE_KR) {
293		v |= SUPPORTED_Backplane | SUPPORTED_10000baseKR_Full;
294	} else if (type == FW_PORT_TYPE_BP_AP) {
295		v |= SUPPORTED_Backplane | SUPPORTED_10000baseR_FEC |
296		     SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full;
297	} else if (type == FW_PORT_TYPE_BP4_AP) {
298		v |= SUPPORTED_Backplane | SUPPORTED_10000baseR_FEC |
299		     SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full |
300		     SUPPORTED_10000baseKX4_Full;
301	} else if (type == FW_PORT_TYPE_FIBER_XFI ||
302		   type == FW_PORT_TYPE_FIBER_XAUI ||
303		   type == FW_PORT_TYPE_SFP ||
304		   type == FW_PORT_TYPE_QSFP_10G ||
305		   type == FW_PORT_TYPE_QSA) {
306		v |= SUPPORTED_FIBRE;
307		if (caps & FW_PORT_CAP_SPEED_1G)
308			v |= SUPPORTED_1000baseT_Full;
309		if (caps & FW_PORT_CAP_SPEED_10G)
310			v |= SUPPORTED_10000baseT_Full;
311	} else if (type == FW_PORT_TYPE_BP40_BA ||
312		   type == FW_PORT_TYPE_QSFP) {
313		v |= SUPPORTED_40000baseSR4_Full;
314		v |= SUPPORTED_FIBRE;
315	}
316
317	if (caps & FW_PORT_CAP_ANEG)
318		v |= SUPPORTED_Autoneg;
319	return v;
320}
321
322static unsigned int to_fw_linkcaps(unsigned int caps)
323{
324	unsigned int v = 0;
325
326	if (caps & ADVERTISED_100baseT_Full)
327		v |= FW_PORT_CAP_SPEED_100M;
328	if (caps & ADVERTISED_1000baseT_Full)
329		v |= FW_PORT_CAP_SPEED_1G;
330	if (caps & ADVERTISED_10000baseT_Full)
331		v |= FW_PORT_CAP_SPEED_10G;
332	if (caps & ADVERTISED_40000baseSR4_Full)
333		v |= FW_PORT_CAP_SPEED_40G;
334	return v;
335}
336
337static int get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
338{
339	const struct port_info *p = netdev_priv(dev);
340
341	if (p->port_type == FW_PORT_TYPE_BT_SGMII ||
342	    p->port_type == FW_PORT_TYPE_BT_XFI ||
343	    p->port_type == FW_PORT_TYPE_BT_XAUI) {
344		cmd->port = PORT_TP;
345	} else if (p->port_type == FW_PORT_TYPE_FIBER_XFI ||
346		   p->port_type == FW_PORT_TYPE_FIBER_XAUI) {
347		cmd->port = PORT_FIBRE;
348	} else if (p->port_type == FW_PORT_TYPE_SFP ||
349		   p->port_type == FW_PORT_TYPE_QSFP_10G ||
350		   p->port_type == FW_PORT_TYPE_QSA ||
351		   p->port_type == FW_PORT_TYPE_QSFP) {
352		if (p->mod_type == FW_PORT_MOD_TYPE_LR ||
353		    p->mod_type == FW_PORT_MOD_TYPE_SR ||
354		    p->mod_type == FW_PORT_MOD_TYPE_ER ||
355		    p->mod_type == FW_PORT_MOD_TYPE_LRM)
356			cmd->port = PORT_FIBRE;
357		else if (p->mod_type == FW_PORT_MOD_TYPE_TWINAX_PASSIVE ||
358			 p->mod_type == FW_PORT_MOD_TYPE_TWINAX_ACTIVE)
359			cmd->port = PORT_DA;
360		else
361			cmd->port = PORT_OTHER;
362	} else {
363		cmd->port = PORT_OTHER;
364	}
365
366	if (p->mdio_addr >= 0) {
367		cmd->phy_address = p->mdio_addr;
368		cmd->transceiver = XCVR_EXTERNAL;
369		cmd->mdio_support = p->port_type == FW_PORT_TYPE_BT_SGMII ?
370			MDIO_SUPPORTS_C22 : MDIO_SUPPORTS_C45;
371	} else {
372		cmd->phy_address = 0;  /* not really, but no better option */
373		cmd->transceiver = XCVR_INTERNAL;
374		cmd->mdio_support = 0;
375	}
376
377	cmd->supported = from_fw_linkcaps(p->port_type, p->link_cfg.supported);
378	cmd->advertising = from_fw_linkcaps(p->port_type,
379					    p->link_cfg.advertising);
380	ethtool_cmd_speed_set(cmd,
381			      netif_carrier_ok(dev) ? p->link_cfg.speed : 0);
382	cmd->duplex = DUPLEX_FULL;
383	cmd->autoneg = p->link_cfg.autoneg;
384	cmd->maxtxpkt = 0;
385	cmd->maxrxpkt = 0;
386	return 0;
387}
388
389static unsigned int speed_to_caps(int speed)
390{
391	if (speed == 100)
392		return FW_PORT_CAP_SPEED_100M;
393	if (speed == 1000)
394		return FW_PORT_CAP_SPEED_1G;
395	if (speed == 10000)
396		return FW_PORT_CAP_SPEED_10G;
397	if (speed == 40000)
398		return FW_PORT_CAP_SPEED_40G;
399	return 0;
400}
401
402static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
403{
404	unsigned int cap;
405	struct port_info *p = netdev_priv(dev);
406	struct link_config *lc = &p->link_cfg;
407	u32 speed = ethtool_cmd_speed(cmd);
408
409	if (cmd->duplex != DUPLEX_FULL)     /* only full-duplex supported */
410		return -EINVAL;
411
412	if (!(lc->supported & FW_PORT_CAP_ANEG)) {
413		/* PHY offers a single speed.  See if that's what's
414		 * being requested.
415		 */
416		if (cmd->autoneg == AUTONEG_DISABLE &&
417		    (lc->supported & speed_to_caps(speed)))
418			return 0;
419		return -EINVAL;
420	}
421
422	if (cmd->autoneg == AUTONEG_DISABLE) {
423		cap = speed_to_caps(speed);
424
425		if (!(lc->supported & cap) ||
426		    (speed == 1000) ||
427		    (speed == 10000) ||
428		    (speed == 40000))
429			return -EINVAL;
430		lc->requested_speed = cap;
431		lc->advertising = 0;
432	} else {
433		cap = to_fw_linkcaps(cmd->advertising);
434		if (!(lc->supported & cap))
435			return -EINVAL;
436		lc->requested_speed = 0;
437		lc->advertising = cap | FW_PORT_CAP_ANEG;
438	}
439	lc->autoneg = cmd->autoneg;
440
441	if (netif_running(dev))
442		return t4_link_start(p->adapter, p->adapter->fn, p->tx_chan,
443				     lc);
444	return 0;
445}
446
447static void get_pauseparam(struct net_device *dev,
448			   struct ethtool_pauseparam *epause)
449{
450	struct port_info *p = netdev_priv(dev);
451
452	epause->autoneg = (p->link_cfg.requested_fc & PAUSE_AUTONEG) != 0;
453	epause->rx_pause = (p->link_cfg.fc & PAUSE_RX) != 0;
454	epause->tx_pause = (p->link_cfg.fc & PAUSE_TX) != 0;
455}
456
457static int set_pauseparam(struct net_device *dev,
458			  struct ethtool_pauseparam *epause)
459{
460	struct port_info *p = netdev_priv(dev);
461	struct link_config *lc = &p->link_cfg;
462
463	if (epause->autoneg == AUTONEG_DISABLE)
464		lc->requested_fc = 0;
465	else if (lc->supported & FW_PORT_CAP_ANEG)
466		lc->requested_fc = PAUSE_AUTONEG;
467	else
468		return -EINVAL;
469
470	if (epause->rx_pause)
471		lc->requested_fc |= PAUSE_RX;
472	if (epause->tx_pause)
473		lc->requested_fc |= PAUSE_TX;
474	if (netif_running(dev))
475		return t4_link_start(p->adapter, p->adapter->fn, p->tx_chan,
476				     lc);
477	return 0;
478}
479
480static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
481{
482	const struct port_info *pi = netdev_priv(dev);
483	const struct sge *s = &pi->adapter->sge;
484
485	e->rx_max_pending = MAX_RX_BUFFERS;
486	e->rx_mini_max_pending = MAX_RSPQ_ENTRIES;
487	e->rx_jumbo_max_pending = 0;
488	e->tx_max_pending = MAX_TXQ_ENTRIES;
489
490	e->rx_pending = s->ethrxq[pi->first_qset].fl.size - 8;
491	e->rx_mini_pending = s->ethrxq[pi->first_qset].rspq.size;
492	e->rx_jumbo_pending = 0;
493	e->tx_pending = s->ethtxq[pi->first_qset].q.size;
494}
495
496static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
497{
498	int i;
499	const struct port_info *pi = netdev_priv(dev);
500	struct adapter *adapter = pi->adapter;
501	struct sge *s = &adapter->sge;
502
503	if (e->rx_pending > MAX_RX_BUFFERS || e->rx_jumbo_pending ||
504	    e->tx_pending > MAX_TXQ_ENTRIES ||
505	    e->rx_mini_pending > MAX_RSPQ_ENTRIES ||
506	    e->rx_mini_pending < MIN_RSPQ_ENTRIES ||
507	    e->rx_pending < MIN_FL_ENTRIES || e->tx_pending < MIN_TXQ_ENTRIES)
508		return -EINVAL;
509
510	if (adapter->flags & FULL_INIT_DONE)
511		return -EBUSY;
512
513	for (i = 0; i < pi->nqsets; ++i) {
514		s->ethtxq[pi->first_qset + i].q.size = e->tx_pending;
515		s->ethrxq[pi->first_qset + i].fl.size = e->rx_pending + 8;
516		s->ethrxq[pi->first_qset + i].rspq.size = e->rx_mini_pending;
517	}
518	return 0;
519}
520
521/**
522 * set_rx_intr_params - set a net devices's RX interrupt holdoff paramete!
523 * @dev: the network device
524 * @us: the hold-off time in us, or 0 to disable timer
525 * @cnt: the hold-off packet count, or 0 to disable counter
526 *
527 * Set the RX interrupt hold-off parameters for a network device.
528 */
529static int set_rx_intr_params(struct net_device *dev,
530			      unsigned int us, unsigned int cnt)
531{
532	int i, err;
533	struct port_info *pi = netdev_priv(dev);
534	struct adapter *adap = pi->adapter;
535	struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
536
537	for (i = 0; i < pi->nqsets; i++, q++) {
538		err = cxgb4_set_rspq_intr_params(&q->rspq, us, cnt);
539		if (err)
540			return err;
541	}
542	return 0;
543}
544
545static int set_adaptive_rx_setting(struct net_device *dev, int adaptive_rx)
546{
547	int i;
548	struct port_info *pi = netdev_priv(dev);
549	struct adapter *adap = pi->adapter;
550	struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
551
552	for (i = 0; i < pi->nqsets; i++, q++)
553		q->rspq.adaptive_rx = adaptive_rx;
554
555	return 0;
556}
557
558static int get_adaptive_rx_setting(struct net_device *dev)
559{
560	struct port_info *pi = netdev_priv(dev);
561	struct adapter *adap = pi->adapter;
562	struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
563
564	return q->rspq.adaptive_rx;
565}
566
567static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
568{
569	set_adaptive_rx_setting(dev, c->use_adaptive_rx_coalesce);
570	return set_rx_intr_params(dev, c->rx_coalesce_usecs,
571				  c->rx_max_coalesced_frames);
572}
573
574static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
575{
576	const struct port_info *pi = netdev_priv(dev);
577	const struct adapter *adap = pi->adapter;
578	const struct sge_rspq *rq = &adap->sge.ethrxq[pi->first_qset].rspq;
579
580	c->rx_coalesce_usecs = qtimer_val(adap, rq);
581	c->rx_max_coalesced_frames = (rq->intr_params & QINTR_CNT_EN) ?
582		adap->sge.counter_val[rq->pktcnt_idx] : 0;
583	c->use_adaptive_rx_coalesce = get_adaptive_rx_setting(dev);
584	return 0;
585}
586
587/**
588 *	eeprom_ptov - translate a physical EEPROM address to virtual
589 *	@phys_addr: the physical EEPROM address
590 *	@fn: the PCI function number
591 *	@sz: size of function-specific area
592 *
593 *	Translate a physical EEPROM address to virtual.  The first 1K is
594 *	accessed through virtual addresses starting at 31K, the rest is
595 *	accessed through virtual addresses starting at 0.
596 *
597 *	The mapping is as follows:
598 *	[0..1K) -> [31K..32K)
599 *	[1K..1K+A) -> [31K-A..31K)
600 *	[1K+A..ES) -> [0..ES-A-1K)
601 *
602 *	where A = @fn * @sz, and ES = EEPROM size.
603 */
604static int eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz)
605{
606	fn *= sz;
607	if (phys_addr < 1024)
608		return phys_addr + (31 << 10);
609	if (phys_addr < 1024 + fn)
610		return 31744 - fn + phys_addr - 1024;
611	if (phys_addr < EEPROMSIZE)
612		return phys_addr - 1024 - fn;
613	return -EINVAL;
614}
615
616/* The next two routines implement eeprom read/write from physical addresses.
617 */
618static int eeprom_rd_phys(struct adapter *adap, unsigned int phys_addr, u32 *v)
619{
620	int vaddr = eeprom_ptov(phys_addr, adap->fn, EEPROMPFSIZE);
621
622	if (vaddr >= 0)
623		vaddr = pci_read_vpd(adap->pdev, vaddr, sizeof(u32), v);
624	return vaddr < 0 ? vaddr : 0;
625}
626
627static int eeprom_wr_phys(struct adapter *adap, unsigned int phys_addr, u32 v)
628{
629	int vaddr = eeprom_ptov(phys_addr, adap->fn, EEPROMPFSIZE);
630
631	if (vaddr >= 0)
632		vaddr = pci_write_vpd(adap->pdev, vaddr, sizeof(u32), &v);
633	return vaddr < 0 ? vaddr : 0;
634}
635
636#define EEPROM_MAGIC 0x38E2F10C
637
638static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e,
639		      u8 *data)
640{
641	int i, err = 0;
642	struct adapter *adapter = netdev2adap(dev);
643	u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL);
644
645	if (!buf)
646		return -ENOMEM;
647
648	e->magic = EEPROM_MAGIC;
649	for (i = e->offset & ~3; !err && i < e->offset + e->len; i += 4)
650		err = eeprom_rd_phys(adapter, i, (u32 *)&buf[i]);
651
652	if (!err)
653		memcpy(data, buf + e->offset, e->len);
654	kfree(buf);
655	return err;
656}
657
658static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
659		      u8 *data)
660{
661	u8 *buf;
662	int err = 0;
663	u32 aligned_offset, aligned_len, *p;
664	struct adapter *adapter = netdev2adap(dev);
665
666	if (eeprom->magic != EEPROM_MAGIC)
667		return -EINVAL;
668
669	aligned_offset = eeprom->offset & ~3;
670	aligned_len = (eeprom->len + (eeprom->offset & 3) + 3) & ~3;
671
672	if (adapter->fn > 0) {
673		u32 start = 1024 + adapter->fn * EEPROMPFSIZE;
674
675		if (aligned_offset < start ||
676		    aligned_offset + aligned_len > start + EEPROMPFSIZE)
677			return -EPERM;
678	}
679
680	if (aligned_offset != eeprom->offset || aligned_len != eeprom->len) {
681		/* RMW possibly needed for first or last words.
682		 */
683		buf = kmalloc(aligned_len, GFP_KERNEL);
684		if (!buf)
685			return -ENOMEM;
686		err = eeprom_rd_phys(adapter, aligned_offset, (u32 *)buf);
687		if (!err && aligned_len > 4)
688			err = eeprom_rd_phys(adapter,
689					     aligned_offset + aligned_len - 4,
690					     (u32 *)&buf[aligned_len - 4]);
691		if (err)
692			goto out;
693		memcpy(buf + (eeprom->offset & 3), data, eeprom->len);
694	} else {
695		buf = data;
696	}
697
698	err = t4_seeprom_wp(adapter, false);
699	if (err)
700		goto out;
701
702	for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
703		err = eeprom_wr_phys(adapter, aligned_offset, *p);
704		aligned_offset += 4;
705	}
706
707	if (!err)
708		err = t4_seeprom_wp(adapter, true);
709out:
710	if (buf != data)
711		kfree(buf);
712	return err;
713}
714
715static int set_flash(struct net_device *netdev, struct ethtool_flash *ef)
716{
717	int ret;
718	const struct firmware *fw;
719	struct adapter *adap = netdev2adap(netdev);
720	unsigned int mbox = PCIE_FW_MASTER_M + 1;
721
722	ef->data[sizeof(ef->data) - 1] = '\0';
723	ret = request_firmware(&fw, ef->data, adap->pdev_dev);
724	if (ret < 0)
725		return ret;
726
727	/* If the adapter has been fully initialized then we'll go ahead and
728	 * try to get the firmware's cooperation in upgrading to the new
729	 * firmware image otherwise we'll try to do the entire job from the
730	 * host ... and we always "force" the operation in this path.
731	 */
732	if (adap->flags & FULL_INIT_DONE)
733		mbox = adap->mbox;
734
735	ret = t4_fw_upgrade(adap, mbox, fw->data, fw->size, 1);
736	release_firmware(fw);
737	if (!ret)
738		dev_info(adap->pdev_dev,
739			 "loaded firmware %s, reload cxgb4 driver\n", ef->data);
740	return ret;
741}
742
743#define WOL_SUPPORTED (WAKE_BCAST | WAKE_MAGIC)
744#define BCAST_CRC 0xa0ccc1a6
745
746static void get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
747{
748	wol->supported = WAKE_BCAST | WAKE_MAGIC;
749	wol->wolopts = netdev2adap(dev)->wol;
750	memset(&wol->sopass, 0, sizeof(wol->sopass));
751}
752
753static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
754{
755	int err = 0;
756	struct port_info *pi = netdev_priv(dev);
757
758	if (wol->wolopts & ~WOL_SUPPORTED)
759		return -EINVAL;
760	t4_wol_magic_enable(pi->adapter, pi->tx_chan,
761			    (wol->wolopts & WAKE_MAGIC) ? dev->dev_addr : NULL);
762	if (wol->wolopts & WAKE_BCAST) {
763		err = t4_wol_pat_enable(pi->adapter, pi->tx_chan, 0xfe, ~0ULL,
764					~0ULL, 0, false);
765		if (!err)
766			err = t4_wol_pat_enable(pi->adapter, pi->tx_chan, 1,
767						~6ULL, ~0ULL, BCAST_CRC, true);
768	} else {
769		t4_wol_pat_enable(pi->adapter, pi->tx_chan, 0, 0, 0, 0, false);
770	}
771	return err;
772}
773
774static u32 get_rss_table_size(struct net_device *dev)
775{
776	const struct port_info *pi = netdev_priv(dev);
777
778	return pi->rss_size;
779}
780
781static int get_rss_table(struct net_device *dev, u32 *p, u8 *key, u8 *hfunc)
782{
783	const struct port_info *pi = netdev_priv(dev);
784	unsigned int n = pi->rss_size;
785
786	if (hfunc)
787		*hfunc = ETH_RSS_HASH_TOP;
788	if (!p)
789		return 0;
790	while (n--)
791		p[n] = pi->rss[n];
792	return 0;
793}
794
795static int set_rss_table(struct net_device *dev, const u32 *p, const u8 *key,
796			 const u8 hfunc)
797{
798	unsigned int i;
799	struct port_info *pi = netdev_priv(dev);
800
801	/* We require at least one supported parameter to be changed and no
802	 * change in any of the unsupported parameters
803	 */
804	if (key ||
805	    (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP))
806		return -EOPNOTSUPP;
807	if (!p)
808		return 0;
809
810	for (i = 0; i < pi->rss_size; i++)
811		pi->rss[i] = p[i];
812	if (pi->adapter->flags & FULL_INIT_DONE)
813		return cxgb4_write_rss(pi, pi->rss);
814	return 0;
815}
816
817static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
818		     u32 *rules)
819{
820	const struct port_info *pi = netdev_priv(dev);
821
822	switch (info->cmd) {
823	case ETHTOOL_GRXFH: {
824		unsigned int v = pi->rss_mode;
825
826		info->data = 0;
827		switch (info->flow_type) {
828		case TCP_V4_FLOW:
829			if (v & FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN_F)
830				info->data = RXH_IP_SRC | RXH_IP_DST |
831					     RXH_L4_B_0_1 | RXH_L4_B_2_3;
832			else if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F)
833				info->data = RXH_IP_SRC | RXH_IP_DST;
834			break;
835		case UDP_V4_FLOW:
836			if ((v & FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN_F) &&
837			    (v & FW_RSS_VI_CONFIG_CMD_UDPEN_F))
838				info->data = RXH_IP_SRC | RXH_IP_DST |
839					     RXH_L4_B_0_1 | RXH_L4_B_2_3;
840			else if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F)
841				info->data = RXH_IP_SRC | RXH_IP_DST;
842			break;
843		case SCTP_V4_FLOW:
844		case AH_ESP_V4_FLOW:
845		case IPV4_FLOW:
846			if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F)
847				info->data = RXH_IP_SRC | RXH_IP_DST;
848			break;
849		case TCP_V6_FLOW:
850			if (v & FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN_F)
851				info->data = RXH_IP_SRC | RXH_IP_DST |
852					     RXH_L4_B_0_1 | RXH_L4_B_2_3;
853			else if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F)
854				info->data = RXH_IP_SRC | RXH_IP_DST;
855			break;
856		case UDP_V6_FLOW:
857			if ((v & FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN_F) &&
858			    (v & FW_RSS_VI_CONFIG_CMD_UDPEN_F))
859				info->data = RXH_IP_SRC | RXH_IP_DST |
860					     RXH_L4_B_0_1 | RXH_L4_B_2_3;
861			else if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F)
862				info->data = RXH_IP_SRC | RXH_IP_DST;
863			break;
864		case SCTP_V6_FLOW:
865		case AH_ESP_V6_FLOW:
866		case IPV6_FLOW:
867			if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F)
868				info->data = RXH_IP_SRC | RXH_IP_DST;
869			break;
870		}
871		return 0;
872	}
873	case ETHTOOL_GRXRINGS:
874		info->data = pi->nqsets;
875		return 0;
876	}
877	return -EOPNOTSUPP;
878}
879
880static const struct ethtool_ops cxgb_ethtool_ops = {
881	.get_settings      = get_settings,
882	.set_settings      = set_settings,
883	.get_drvinfo       = get_drvinfo,
884	.get_msglevel      = get_msglevel,
885	.set_msglevel      = set_msglevel,
886	.get_ringparam     = get_sge_param,
887	.set_ringparam     = set_sge_param,
888	.get_coalesce      = get_coalesce,
889	.set_coalesce      = set_coalesce,
890	.get_eeprom_len    = get_eeprom_len,
891	.get_eeprom        = get_eeprom,
892	.set_eeprom        = set_eeprom,
893	.get_pauseparam    = get_pauseparam,
894	.set_pauseparam    = set_pauseparam,
895	.get_link          = ethtool_op_get_link,
896	.get_strings       = get_strings,
897	.set_phys_id       = identify_port,
898	.nway_reset        = restart_autoneg,
899	.get_sset_count    = get_sset_count,
900	.get_ethtool_stats = get_stats,
901	.get_regs_len      = get_regs_len,
902	.get_regs          = get_regs,
903	.get_wol           = get_wol,
904	.set_wol           = set_wol,
905	.get_rxnfc         = get_rxnfc,
906	.get_rxfh_indir_size = get_rss_table_size,
907	.get_rxfh	   = get_rss_table,
908	.set_rxfh	   = set_rss_table,
909	.flash_device      = set_flash,
910};
911
912void cxgb4_set_ethtool_ops(struct net_device *netdev)
913{
914	netdev->ethtool_ops = &cxgb_ethtool_ops;
915}
916