1 /* Intel(R) Ethernet Switch Host Interface Driver
2 * Copyright(c) 2013 - 2017 Intel Corporation.
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.
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
13 * The full GNU General Public License is included in this distribution in
14 * the file called "COPYING".
16 * Contact Information:
17 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
18 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
21 #include <linux/vmalloc.h>
26 char stat_string
[ETH_GSTRING_LEN
];
31 #define FM10K_NETDEV_STAT(_net_stat) { \
32 .stat_string = #_net_stat, \
33 .sizeof_stat = FIELD_SIZEOF(struct net_device_stats, _net_stat), \
34 .stat_offset = offsetof(struct net_device_stats, _net_stat) \
37 static const struct fm10k_stats fm10k_gstrings_net_stats
[] = {
38 FM10K_NETDEV_STAT(tx_packets
),
39 FM10K_NETDEV_STAT(tx_bytes
),
40 FM10K_NETDEV_STAT(tx_errors
),
41 FM10K_NETDEV_STAT(rx_packets
),
42 FM10K_NETDEV_STAT(rx_bytes
),
43 FM10K_NETDEV_STAT(rx_errors
),
44 FM10K_NETDEV_STAT(rx_dropped
),
46 /* detailed Rx errors */
47 FM10K_NETDEV_STAT(rx_length_errors
),
48 FM10K_NETDEV_STAT(rx_crc_errors
),
49 FM10K_NETDEV_STAT(rx_fifo_errors
),
52 #define FM10K_NETDEV_STATS_LEN ARRAY_SIZE(fm10k_gstrings_net_stats)
54 #define FM10K_STAT(_name, _stat) { \
55 .stat_string = _name, \
56 .sizeof_stat = FIELD_SIZEOF(struct fm10k_intfc, _stat), \
57 .stat_offset = offsetof(struct fm10k_intfc, _stat) \
60 static const struct fm10k_stats fm10k_gstrings_global_stats
[] = {
61 FM10K_STAT("tx_restart_queue", restart_queue
),
62 FM10K_STAT("tx_busy", tx_busy
),
63 FM10K_STAT("tx_csum_errors", tx_csum_errors
),
64 FM10K_STAT("rx_alloc_failed", alloc_failed
),
65 FM10K_STAT("rx_csum_errors", rx_csum_errors
),
67 FM10K_STAT("tx_packets_nic", tx_packets_nic
),
68 FM10K_STAT("tx_bytes_nic", tx_bytes_nic
),
69 FM10K_STAT("rx_packets_nic", rx_packets_nic
),
70 FM10K_STAT("rx_bytes_nic", rx_bytes_nic
),
71 FM10K_STAT("rx_drops_nic", rx_drops_nic
),
72 FM10K_STAT("rx_overrun_pf", rx_overrun_pf
),
73 FM10K_STAT("rx_overrun_vf", rx_overrun_vf
),
75 FM10K_STAT("swapi_status", hw
.swapi
.status
),
76 FM10K_STAT("mac_rules_used", hw
.swapi
.mac
.used
),
77 FM10K_STAT("mac_rules_avail", hw
.swapi
.mac
.avail
),
79 FM10K_STAT("reset_while_pending", hw
.mac
.reset_while_pending
),
81 FM10K_STAT("tx_hang_count", tx_timeout_count
),
84 static const struct fm10k_stats fm10k_gstrings_pf_stats
[] = {
85 FM10K_STAT("timeout", stats
.timeout
.count
),
86 FM10K_STAT("ur", stats
.ur
.count
),
87 FM10K_STAT("ca", stats
.ca
.count
),
88 FM10K_STAT("um", stats
.um
.count
),
89 FM10K_STAT("xec", stats
.xec
.count
),
90 FM10K_STAT("vlan_drop", stats
.vlan_drop
.count
),
91 FM10K_STAT("loopback_drop", stats
.loopback_drop
.count
),
92 FM10K_STAT("nodesc_drop", stats
.nodesc_drop
.count
),
95 #define FM10K_MBX_STAT(_name, _stat) { \
96 .stat_string = _name, \
97 .sizeof_stat = FIELD_SIZEOF(struct fm10k_mbx_info, _stat), \
98 .stat_offset = offsetof(struct fm10k_mbx_info, _stat) \
101 static const struct fm10k_stats fm10k_gstrings_mbx_stats
[] = {
102 FM10K_MBX_STAT("mbx_tx_busy", tx_busy
),
103 FM10K_MBX_STAT("mbx_tx_dropped", tx_dropped
),
104 FM10K_MBX_STAT("mbx_tx_messages", tx_messages
),
105 FM10K_MBX_STAT("mbx_tx_dwords", tx_dwords
),
106 FM10K_MBX_STAT("mbx_tx_mbmem_pulled", tx_mbmem_pulled
),
107 FM10K_MBX_STAT("mbx_rx_messages", rx_messages
),
108 FM10K_MBX_STAT("mbx_rx_dwords", rx_dwords
),
109 FM10K_MBX_STAT("mbx_rx_parse_err", rx_parse_err
),
110 FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed
),
113 #define FM10K_QUEUE_STAT(_name, _stat) { \
114 .stat_string = _name, \
115 .sizeof_stat = FIELD_SIZEOF(struct fm10k_ring, _stat), \
116 .stat_offset = offsetof(struct fm10k_ring, _stat) \
119 static const struct fm10k_stats fm10k_gstrings_queue_stats
[] = {
120 FM10K_QUEUE_STAT("packets", stats
.packets
),
121 FM10K_QUEUE_STAT("bytes", stats
.bytes
),
124 #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
125 #define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)
126 #define FM10K_MBX_STATS_LEN ARRAY_SIZE(fm10k_gstrings_mbx_stats)
127 #define FM10K_QUEUE_STATS_LEN ARRAY_SIZE(fm10k_gstrings_queue_stats)
129 #define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
130 FM10K_NETDEV_STATS_LEN + \
133 static const char fm10k_gstrings_test
[][ETH_GSTRING_LEN
] = {
134 "Mailbox test (on/offline)"
137 #define FM10K_TEST_LEN (sizeof(fm10k_gstrings_test) / ETH_GSTRING_LEN)
139 enum fm10k_self_test_types
{
141 FM10K_TEST_MAX
= FM10K_TEST_LEN
148 static const char fm10k_prv_flags
[FM10K_PRV_FLAG_LEN
][ETH_GSTRING_LEN
] = {
151 static void fm10k_add_stat_strings(u8
**p
, const char *prefix
,
152 const struct fm10k_stats stats
[],
153 const unsigned int size
)
157 for (i
= 0; i
< size
; i
++) {
158 snprintf(*p
, ETH_GSTRING_LEN
, "%s%s",
159 prefix
, stats
[i
].stat_string
);
160 *p
+= ETH_GSTRING_LEN
;
164 static void fm10k_get_stat_strings(struct net_device
*dev
, u8
*data
)
166 struct fm10k_intfc
*interface
= netdev_priv(dev
);
169 fm10k_add_stat_strings(&data
, "", fm10k_gstrings_net_stats
,
170 FM10K_NETDEV_STATS_LEN
);
172 fm10k_add_stat_strings(&data
, "", fm10k_gstrings_global_stats
,
173 FM10K_GLOBAL_STATS_LEN
);
175 fm10k_add_stat_strings(&data
, "", fm10k_gstrings_mbx_stats
,
176 FM10K_MBX_STATS_LEN
);
178 if (interface
->hw
.mac
.type
!= fm10k_mac_vf
)
179 fm10k_add_stat_strings(&data
, "", fm10k_gstrings_pf_stats
,
182 for (i
= 0; i
< interface
->hw
.mac
.max_queues
; i
++) {
183 char prefix
[ETH_GSTRING_LEN
];
185 snprintf(prefix
, ETH_GSTRING_LEN
, "tx_queue_%u_", i
);
186 fm10k_add_stat_strings(&data
, prefix
,
187 fm10k_gstrings_queue_stats
,
188 FM10K_QUEUE_STATS_LEN
);
190 snprintf(prefix
, ETH_GSTRING_LEN
, "rx_queue_%u_", i
);
191 fm10k_add_stat_strings(&data
, prefix
,
192 fm10k_gstrings_queue_stats
,
193 FM10K_QUEUE_STATS_LEN
);
197 static void fm10k_get_strings(struct net_device
*dev
,
198 u32 stringset
, u8
*data
)
202 memcpy(data
, fm10k_gstrings_test
,
203 FM10K_TEST_LEN
* ETH_GSTRING_LEN
);
206 fm10k_get_stat_strings(dev
, data
);
208 case ETH_SS_PRIV_FLAGS
:
209 memcpy(data
, fm10k_prv_flags
,
210 FM10K_PRV_FLAG_LEN
* ETH_GSTRING_LEN
);
215 static int fm10k_get_sset_count(struct net_device
*dev
, int sset
)
217 struct fm10k_intfc
*interface
= netdev_priv(dev
);
218 struct fm10k_hw
*hw
= &interface
->hw
;
219 int stats_len
= FM10K_STATIC_STATS_LEN
;
223 return FM10K_TEST_LEN
;
225 stats_len
+= hw
->mac
.max_queues
* 2 * FM10K_QUEUE_STATS_LEN
;
227 if (hw
->mac
.type
!= fm10k_mac_vf
)
228 stats_len
+= FM10K_PF_STATS_LEN
;
231 case ETH_SS_PRIV_FLAGS
:
232 return FM10K_PRV_FLAG_LEN
;
238 static void fm10k_add_ethtool_stats(u64
**data
, void *pointer
,
239 const struct fm10k_stats stats
[],
240 const unsigned int size
)
246 /* memory is not zero allocated so we have to clear it */
247 for (i
= 0; i
< size
; i
++)
252 for (i
= 0; i
< size
; i
++) {
253 p
= (char *)pointer
+ stats
[i
].stat_offset
;
255 switch (stats
[i
].sizeof_stat
) {
257 *((*data
)++) = *(u64
*)p
;
260 *((*data
)++) = *(u32
*)p
;
263 *((*data
)++) = *(u16
*)p
;
266 *((*data
)++) = *(u8
*)p
;
274 static void fm10k_get_ethtool_stats(struct net_device
*netdev
,
275 struct ethtool_stats __always_unused
*stats
,
278 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
279 struct net_device_stats
*net_stats
= &netdev
->stats
;
282 fm10k_update_stats(interface
);
284 fm10k_add_ethtool_stats(&data
, net_stats
, fm10k_gstrings_net_stats
,
285 FM10K_NETDEV_STATS_LEN
);
287 fm10k_add_ethtool_stats(&data
, interface
, fm10k_gstrings_global_stats
,
288 FM10K_GLOBAL_STATS_LEN
);
290 fm10k_add_ethtool_stats(&data
, &interface
->hw
.mbx
,
291 fm10k_gstrings_mbx_stats
,
292 FM10K_MBX_STATS_LEN
);
294 if (interface
->hw
.mac
.type
!= fm10k_mac_vf
) {
295 fm10k_add_ethtool_stats(&data
, interface
,
296 fm10k_gstrings_pf_stats
,
300 for (i
= 0; i
< interface
->hw
.mac
.max_queues
; i
++) {
301 struct fm10k_ring
*ring
;
303 ring
= interface
->tx_ring
[i
];
304 fm10k_add_ethtool_stats(&data
, ring
,
305 fm10k_gstrings_queue_stats
,
306 FM10K_QUEUE_STATS_LEN
);
308 ring
= interface
->rx_ring
[i
];
309 fm10k_add_ethtool_stats(&data
, ring
,
310 fm10k_gstrings_queue_stats
,
311 FM10K_QUEUE_STATS_LEN
);
315 /* If function below adds more registers this define needs to be updated */
316 #define FM10K_REGS_LEN_Q 29
318 static void fm10k_get_reg_q(struct fm10k_hw
*hw
, u32
*buff
, int i
)
322 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RDBAL(i
));
323 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RDBAH(i
));
324 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RDLEN(i
));
325 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TPH_RXCTRL(i
));
326 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RDH(i
));
327 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RDT(i
));
328 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RXQCTL(i
));
329 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RXDCTL(i
));
330 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RXINT(i
));
331 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_SRRCTL(i
));
332 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QPRC(i
));
333 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QPRDC(i
));
334 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QBRC_L(i
));
335 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QBRC_H(i
));
336 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TDBAL(i
));
337 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TDBAH(i
));
338 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TDLEN(i
));
339 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TPH_TXCTRL(i
));
340 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TDH(i
));
341 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TDT(i
));
342 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TXDCTL(i
));
343 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TXQCTL(i
));
344 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TXINT(i
));
345 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QPTC(i
));
346 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QBTC_L(i
));
347 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_QBTC_H(i
));
348 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TQDLOC(i
));
349 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_TX_SGLORT(i
));
350 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_PFVTCTL(i
));
352 BUG_ON(idx
!= FM10K_REGS_LEN_Q
);
355 /* If function above adds more registers this define needs to be updated */
356 #define FM10K_REGS_LEN_VSI 43
358 static void fm10k_get_reg_vsi(struct fm10k_hw
*hw
, u32
*buff
, int i
)
362 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_MRQC(i
));
363 for (j
= 0; j
< 10; j
++)
364 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RSSRK(i
, j
));
365 for (j
= 0; j
< 32; j
++)
366 buff
[idx
++] = fm10k_read_reg(hw
, FM10K_RETA(i
, j
));
368 BUG_ON(idx
!= FM10K_REGS_LEN_VSI
);
371 static void fm10k_get_regs(struct net_device
*netdev
,
372 struct ethtool_regs
*regs
, void *p
)
374 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
375 struct fm10k_hw
*hw
= &interface
->hw
;
379 regs
->version
= BIT(24) | (hw
->revision_id
<< 16) | hw
->device_id
;
381 switch (hw
->mac
.type
) {
383 /* General PF Registers */
384 *(buff
++) = fm10k_read_reg(hw
, FM10K_CTRL
);
385 *(buff
++) = fm10k_read_reg(hw
, FM10K_CTRL_EXT
);
386 *(buff
++) = fm10k_read_reg(hw
, FM10K_GCR
);
387 *(buff
++) = fm10k_read_reg(hw
, FM10K_GCR_EXT
);
389 for (i
= 0; i
< 8; i
++) {
390 *(buff
++) = fm10k_read_reg(hw
, FM10K_DGLORTMAP(i
));
391 *(buff
++) = fm10k_read_reg(hw
, FM10K_DGLORTDEC(i
));
394 for (i
= 0; i
< 65; i
++) {
395 fm10k_get_reg_vsi(hw
, buff
, i
);
396 buff
+= FM10K_REGS_LEN_VSI
;
399 *(buff
++) = fm10k_read_reg(hw
, FM10K_DMA_CTRL
);
400 *(buff
++) = fm10k_read_reg(hw
, FM10K_DMA_CTRL2
);
402 for (i
= 0; i
< FM10K_MAX_QUEUES_PF
; i
++) {
403 fm10k_get_reg_q(hw
, buff
, i
);
404 buff
+= FM10K_REGS_LEN_Q
;
407 *(buff
++) = fm10k_read_reg(hw
, FM10K_TPH_CTRL
);
409 for (i
= 0; i
< 8; i
++)
410 *(buff
++) = fm10k_read_reg(hw
, FM10K_INT_MAP(i
));
412 /* Interrupt Throttling Registers */
413 for (i
= 0; i
< 130; i
++)
414 *(buff
++) = fm10k_read_reg(hw
, FM10K_ITR(i
));
418 /* General VF registers */
419 *(buff
++) = fm10k_read_reg(hw
, FM10K_VFCTRL
);
420 *(buff
++) = fm10k_read_reg(hw
, FM10K_VFINT_MAP
);
421 *(buff
++) = fm10k_read_reg(hw
, FM10K_VFSYSTIME
);
423 /* Interrupt Throttling Registers */
424 for (i
= 0; i
< 8; i
++)
425 *(buff
++) = fm10k_read_reg(hw
, FM10K_VFITR(i
));
427 fm10k_get_reg_vsi(hw
, buff
, 0);
428 buff
+= FM10K_REGS_LEN_VSI
;
430 for (i
= 0; i
< FM10K_MAX_QUEUES_POOL
; i
++) {
431 if (i
< hw
->mac
.max_queues
)
432 fm10k_get_reg_q(hw
, buff
, i
);
434 memset(buff
, 0, sizeof(u32
) * FM10K_REGS_LEN_Q
);
435 buff
+= FM10K_REGS_LEN_Q
;
444 /* If function above adds more registers these define need to be updated */
445 #define FM10K_REGS_LEN_PF \
446 (162 + (65 * FM10K_REGS_LEN_VSI) + (FM10K_MAX_QUEUES_PF * FM10K_REGS_LEN_Q))
447 #define FM10K_REGS_LEN_VF \
448 (11 + FM10K_REGS_LEN_VSI + (FM10K_MAX_QUEUES_POOL * FM10K_REGS_LEN_Q))
450 static int fm10k_get_regs_len(struct net_device
*netdev
)
452 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
453 struct fm10k_hw
*hw
= &interface
->hw
;
455 switch (hw
->mac
.type
) {
457 return FM10K_REGS_LEN_PF
* sizeof(u32
);
459 return FM10K_REGS_LEN_VF
* sizeof(u32
);
465 static void fm10k_get_drvinfo(struct net_device
*dev
,
466 struct ethtool_drvinfo
*info
)
468 struct fm10k_intfc
*interface
= netdev_priv(dev
);
470 strncpy(info
->driver
, fm10k_driver_name
,
471 sizeof(info
->driver
) - 1);
472 strncpy(info
->version
, fm10k_driver_version
,
473 sizeof(info
->version
) - 1);
474 strncpy(info
->bus_info
, pci_name(interface
->pdev
),
475 sizeof(info
->bus_info
) - 1);
478 static void fm10k_get_pauseparam(struct net_device
*dev
,
479 struct ethtool_pauseparam
*pause
)
481 struct fm10k_intfc
*interface
= netdev_priv(dev
);
483 /* record fixed values for autoneg and tx pause */
487 pause
->rx_pause
= interface
->rx_pause
? 1 : 0;
490 static int fm10k_set_pauseparam(struct net_device
*dev
,
491 struct ethtool_pauseparam
*pause
)
493 struct fm10k_intfc
*interface
= netdev_priv(dev
);
494 struct fm10k_hw
*hw
= &interface
->hw
;
496 if (pause
->autoneg
|| !pause
->tx_pause
)
499 /* we can only support pause on the PF to avoid head-of-line blocking */
500 if (hw
->mac
.type
== fm10k_mac_pf
)
501 interface
->rx_pause
= pause
->rx_pause
? ~0 : 0;
502 else if (pause
->rx_pause
)
505 if (netif_running(dev
))
506 fm10k_update_rx_drop_en(interface
);
511 static u32
fm10k_get_msglevel(struct net_device
*netdev
)
513 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
515 return interface
->msg_enable
;
518 static void fm10k_set_msglevel(struct net_device
*netdev
, u32 data
)
520 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
522 interface
->msg_enable
= data
;
525 static void fm10k_get_ringparam(struct net_device
*netdev
,
526 struct ethtool_ringparam
*ring
)
528 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
530 ring
->rx_max_pending
= FM10K_MAX_RXD
;
531 ring
->tx_max_pending
= FM10K_MAX_TXD
;
532 ring
->rx_mini_max_pending
= 0;
533 ring
->rx_jumbo_max_pending
= 0;
534 ring
->rx_pending
= interface
->rx_ring_count
;
535 ring
->tx_pending
= interface
->tx_ring_count
;
536 ring
->rx_mini_pending
= 0;
537 ring
->rx_jumbo_pending
= 0;
540 static int fm10k_set_ringparam(struct net_device
*netdev
,
541 struct ethtool_ringparam
*ring
)
543 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
544 struct fm10k_ring
*temp_ring
;
546 u32 new_rx_count
, new_tx_count
;
548 if ((ring
->rx_mini_pending
) || (ring
->rx_jumbo_pending
))
551 new_tx_count
= clamp_t(u32
, ring
->tx_pending
,
552 FM10K_MIN_TXD
, FM10K_MAX_TXD
);
553 new_tx_count
= ALIGN(new_tx_count
, FM10K_REQ_TX_DESCRIPTOR_MULTIPLE
);
555 new_rx_count
= clamp_t(u32
, ring
->rx_pending
,
556 FM10K_MIN_RXD
, FM10K_MAX_RXD
);
557 new_rx_count
= ALIGN(new_rx_count
, FM10K_REQ_RX_DESCRIPTOR_MULTIPLE
);
559 if ((new_tx_count
== interface
->tx_ring_count
) &&
560 (new_rx_count
== interface
->rx_ring_count
)) {
565 while (test_and_set_bit(__FM10K_RESETTING
, interface
->state
))
566 usleep_range(1000, 2000);
568 if (!netif_running(interface
->netdev
)) {
569 for (i
= 0; i
< interface
->num_tx_queues
; i
++)
570 interface
->tx_ring
[i
]->count
= new_tx_count
;
571 for (i
= 0; i
< interface
->num_rx_queues
; i
++)
572 interface
->rx_ring
[i
]->count
= new_rx_count
;
573 interface
->tx_ring_count
= new_tx_count
;
574 interface
->rx_ring_count
= new_rx_count
;
578 /* allocate temporary buffer to store rings in */
579 i
= max_t(int, interface
->num_tx_queues
, interface
->num_rx_queues
);
580 temp_ring
= vmalloc(i
* sizeof(struct fm10k_ring
));
587 fm10k_down(interface
);
589 /* Setup new Tx resources and free the old Tx resources in that order.
590 * We can then assign the new resources to the rings via a memcpy.
591 * The advantage to this approach is that we are guaranteed to still
592 * have resources even in the case of an allocation failure.
594 if (new_tx_count
!= interface
->tx_ring_count
) {
595 for (i
= 0; i
< interface
->num_tx_queues
; i
++) {
596 memcpy(&temp_ring
[i
], interface
->tx_ring
[i
],
597 sizeof(struct fm10k_ring
));
599 temp_ring
[i
].count
= new_tx_count
;
600 err
= fm10k_setup_tx_resources(&temp_ring
[i
]);
604 fm10k_free_tx_resources(&temp_ring
[i
]);
610 for (i
= 0; i
< interface
->num_tx_queues
; i
++) {
611 fm10k_free_tx_resources(interface
->tx_ring
[i
]);
613 memcpy(interface
->tx_ring
[i
], &temp_ring
[i
],
614 sizeof(struct fm10k_ring
));
617 interface
->tx_ring_count
= new_tx_count
;
620 /* Repeat the process for the Rx rings if needed */
621 if (new_rx_count
!= interface
->rx_ring_count
) {
622 for (i
= 0; i
< interface
->num_rx_queues
; i
++) {
623 memcpy(&temp_ring
[i
], interface
->rx_ring
[i
],
624 sizeof(struct fm10k_ring
));
626 temp_ring
[i
].count
= new_rx_count
;
627 err
= fm10k_setup_rx_resources(&temp_ring
[i
]);
631 fm10k_free_rx_resources(&temp_ring
[i
]);
637 for (i
= 0; i
< interface
->num_rx_queues
; i
++) {
638 fm10k_free_rx_resources(interface
->rx_ring
[i
]);
640 memcpy(interface
->rx_ring
[i
], &temp_ring
[i
],
641 sizeof(struct fm10k_ring
));
644 interface
->rx_ring_count
= new_rx_count
;
651 clear_bit(__FM10K_RESETTING
, interface
->state
);
655 static int fm10k_get_coalesce(struct net_device
*dev
,
656 struct ethtool_coalesce
*ec
)
658 struct fm10k_intfc
*interface
= netdev_priv(dev
);
660 ec
->use_adaptive_tx_coalesce
= ITR_IS_ADAPTIVE(interface
->tx_itr
);
661 ec
->tx_coalesce_usecs
= interface
->tx_itr
& ~FM10K_ITR_ADAPTIVE
;
663 ec
->use_adaptive_rx_coalesce
= ITR_IS_ADAPTIVE(interface
->rx_itr
);
664 ec
->rx_coalesce_usecs
= interface
->rx_itr
& ~FM10K_ITR_ADAPTIVE
;
669 static int fm10k_set_coalesce(struct net_device
*dev
,
670 struct ethtool_coalesce
*ec
)
672 struct fm10k_intfc
*interface
= netdev_priv(dev
);
673 struct fm10k_q_vector
*qv
;
678 if ((ec
->rx_coalesce_usecs
> FM10K_ITR_MAX
) ||
679 (ec
->tx_coalesce_usecs
> FM10K_ITR_MAX
))
682 /* record settings */
683 tx_itr
= ec
->tx_coalesce_usecs
;
684 rx_itr
= ec
->rx_coalesce_usecs
;
686 /* set initial values for adaptive ITR */
687 if (ec
->use_adaptive_tx_coalesce
)
688 tx_itr
= FM10K_ITR_ADAPTIVE
| FM10K_TX_ITR_DEFAULT
;
690 if (ec
->use_adaptive_rx_coalesce
)
691 rx_itr
= FM10K_ITR_ADAPTIVE
| FM10K_RX_ITR_DEFAULT
;
693 /* update interface */
694 interface
->tx_itr
= tx_itr
;
695 interface
->rx_itr
= rx_itr
;
697 /* update q_vectors */
698 for (i
= 0; i
< interface
->num_q_vectors
; i
++) {
699 qv
= interface
->q_vector
[i
];
707 static int fm10k_get_rss_hash_opts(struct fm10k_intfc
*interface
,
708 struct ethtool_rxnfc
*cmd
)
712 /* Report default options for RSS on fm10k */
713 switch (cmd
->flow_type
) {
716 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
719 if (test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP
,
721 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
733 cmd
->data
|= RXH_IP_SRC
| RXH_IP_DST
;
736 if (test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP
,
738 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
739 cmd
->data
|= RXH_IP_SRC
| RXH_IP_DST
;
748 static int fm10k_get_rxnfc(struct net_device
*dev
, struct ethtool_rxnfc
*cmd
,
749 u32 __always_unused
*rule_locs
)
751 struct fm10k_intfc
*interface
= netdev_priv(dev
);
752 int ret
= -EOPNOTSUPP
;
755 case ETHTOOL_GRXRINGS
:
756 cmd
->data
= interface
->num_rx_queues
;
760 ret
= fm10k_get_rss_hash_opts(interface
, cmd
);
769 static int fm10k_set_rss_hash_opt(struct fm10k_intfc
*interface
,
770 struct ethtool_rxnfc
*nfc
)
772 int rss_ipv4_udp
= test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP
,
774 int rss_ipv6_udp
= test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP
,
777 /* RSS does not support anything other than hashing
778 * to queues on src and dst IPs and ports
780 if (nfc
->data
& ~(RXH_IP_SRC
| RXH_IP_DST
|
781 RXH_L4_B_0_1
| RXH_L4_B_2_3
))
784 switch (nfc
->flow_type
) {
787 if (!(nfc
->data
& RXH_IP_SRC
) ||
788 !(nfc
->data
& RXH_IP_DST
) ||
789 !(nfc
->data
& RXH_L4_B_0_1
) ||
790 !(nfc
->data
& RXH_L4_B_2_3
))
794 if (!(nfc
->data
& RXH_IP_SRC
) ||
795 !(nfc
->data
& RXH_IP_DST
))
797 switch (nfc
->data
& (RXH_L4_B_0_1
| RXH_L4_B_2_3
)) {
799 clear_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP
,
802 case (RXH_L4_B_0_1
| RXH_L4_B_2_3
):
803 set_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP
,
811 if (!(nfc
->data
& RXH_IP_SRC
) ||
812 !(nfc
->data
& RXH_IP_DST
))
814 switch (nfc
->data
& (RXH_L4_B_0_1
| RXH_L4_B_2_3
)) {
816 clear_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP
,
819 case (RXH_L4_B_0_1
| RXH_L4_B_2_3
):
820 set_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP
,
835 if (!(nfc
->data
& RXH_IP_SRC
) ||
836 !(nfc
->data
& RXH_IP_DST
) ||
837 (nfc
->data
& RXH_L4_B_0_1
) ||
838 (nfc
->data
& RXH_L4_B_2_3
))
845 /* If something changed we need to update the MRQC register. Note that
846 * test_bit() is guaranteed to return strictly 0 or 1, so testing for
849 if ((rss_ipv4_udp
!= test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP
,
850 interface
->flags
)) ||
851 (rss_ipv6_udp
!= test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP
,
852 interface
->flags
))) {
853 struct fm10k_hw
*hw
= &interface
->hw
;
857 /* Perform hash on these packet types */
858 mrqc
= FM10K_MRQC_IPV4
|
859 FM10K_MRQC_TCP_IPV4
|
863 if (test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP
,
865 mrqc
|= FM10K_MRQC_UDP_IPV4
;
868 if (test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP
,
870 mrqc
|= FM10K_MRQC_UDP_IPV6
;
874 /* If we enable UDP RSS display a warning that this may cause
875 * fragmented UDP packets to arrive out of order.
878 netif_warn(interface
, drv
, interface
->netdev
,
879 "enabling UDP RSS: fragmented packets may arrive out of order to the stack above\n");
881 fm10k_write_reg(hw
, FM10K_MRQC(0), mrqc
);
887 static int fm10k_set_rxnfc(struct net_device
*dev
, struct ethtool_rxnfc
*cmd
)
889 struct fm10k_intfc
*interface
= netdev_priv(dev
);
890 int ret
= -EOPNOTSUPP
;
894 ret
= fm10k_set_rss_hash_opt(interface
, cmd
);
903 static int fm10k_mbx_test(struct fm10k_intfc
*interface
, u64
*data
)
905 struct fm10k_hw
*hw
= &interface
->hw
;
906 struct fm10k_mbx_info
*mbx
= &hw
->mbx
;
907 u32 attr_flag
, test_msg
[6];
908 unsigned long timeout
;
911 /* For now this is a VF only feature */
912 if (hw
->mac
.type
!= fm10k_mac_vf
)
915 /* loop through both nested and unnested attribute types */
916 for (attr_flag
= BIT(FM10K_TEST_MSG_UNSET
);
917 attr_flag
< BIT(2 * FM10K_TEST_MSG_NESTED
);
918 attr_flag
+= attr_flag
) {
919 /* generate message to be tested */
920 fm10k_tlv_msg_test_create(test_msg
, attr_flag
);
922 fm10k_mbx_lock(interface
);
923 mbx
->test_result
= FM10K_NOT_IMPLEMENTED
;
924 err
= mbx
->ops
.enqueue_tx(hw
, mbx
, test_msg
);
925 fm10k_mbx_unlock(interface
);
927 /* wait up to 1 second for response */
928 timeout
= jiffies
+ HZ
;
933 usleep_range(500, 1000);
935 fm10k_mbx_lock(interface
);
936 mbx
->ops
.process(hw
, mbx
);
937 fm10k_mbx_unlock(interface
);
939 err
= mbx
->test_result
;
942 } while (time_is_after_jiffies(timeout
));
944 /* reporting errors */
950 *data
= err
< 0 ? (attr_flag
) : (err
> 0);
954 static void fm10k_self_test(struct net_device
*dev
,
955 struct ethtool_test
*eth_test
, u64
*data
)
957 struct fm10k_intfc
*interface
= netdev_priv(dev
);
958 struct fm10k_hw
*hw
= &interface
->hw
;
960 memset(data
, 0, sizeof(*data
) * FM10K_TEST_LEN
);
962 if (FM10K_REMOVED(hw
->hw_addr
)) {
963 netif_err(interface
, drv
, dev
,
964 "Interface removed - test blocked\n");
965 eth_test
->flags
|= ETH_TEST_FL_FAILED
;
969 if (fm10k_mbx_test(interface
, &data
[FM10K_TEST_MBX
]))
970 eth_test
->flags
|= ETH_TEST_FL_FAILED
;
973 static u32
fm10k_get_priv_flags(struct net_device
*netdev
)
978 static int fm10k_set_priv_flags(struct net_device
*netdev
, u32 priv_flags
)
980 if (priv_flags
>= BIT(FM10K_PRV_FLAG_LEN
))
986 static u32
fm10k_get_reta_size(struct net_device __always_unused
*netdev
)
988 return FM10K_RETA_SIZE
* FM10K_RETA_ENTRIES_PER_REG
;
991 void fm10k_write_reta(struct fm10k_intfc
*interface
, const u32
*indir
)
993 u16 rss_i
= interface
->ring_feature
[RING_F_RSS
].indices
;
994 struct fm10k_hw
*hw
= &interface
->hw
;
998 /* record entries to reta table */
999 for (i
= 0; i
< FM10K_RETA_SIZE
; i
++) {
1002 /* generate a new table if we weren't given one */
1003 for (j
= 0; j
< 4; j
++) {
1005 n
= indir
[4 * i
+ j
];
1007 n
= ethtool_rxfh_indir_default(4 * i
+ j
,
1018 if (interface
->reta
[i
] == reta
)
1021 interface
->reta
[i
] = reta
;
1022 fm10k_write_reg(hw
, FM10K_RETA(0, i
), reta
);
1026 static int fm10k_get_reta(struct net_device
*netdev
, u32
*indir
)
1028 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
1034 for (i
= 0; i
< FM10K_RETA_SIZE
; i
++, indir
+= 4) {
1035 u32 reta
= interface
->reta
[i
];
1037 indir
[0] = (reta
<< 24) >> 24;
1038 indir
[1] = (reta
<< 16) >> 24;
1039 indir
[2] = (reta
<< 8) >> 24;
1040 indir
[3] = (reta
) >> 24;
1046 static int fm10k_set_reta(struct net_device
*netdev
, const u32
*indir
)
1048 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
1055 /* Verify user input. */
1056 rss_i
= interface
->ring_feature
[RING_F_RSS
].indices
;
1057 for (i
= fm10k_get_reta_size(netdev
); i
--;) {
1058 if (indir
[i
] < rss_i
)
1063 fm10k_write_reta(interface
, indir
);
1068 static u32
fm10k_get_rssrk_size(struct net_device __always_unused
*netdev
)
1070 return FM10K_RSSRK_SIZE
* FM10K_RSSRK_ENTRIES_PER_REG
;
1073 static int fm10k_get_rssh(struct net_device
*netdev
, u32
*indir
, u8
*key
,
1076 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
1080 *hfunc
= ETH_RSS_HASH_TOP
;
1082 err
= fm10k_get_reta(netdev
, indir
);
1086 for (i
= 0; i
< FM10K_RSSRK_SIZE
; i
++, key
+= 4)
1087 *(__le32
*)key
= cpu_to_le32(interface
->rssrk
[i
]);
1092 static int fm10k_set_rssh(struct net_device
*netdev
, const u32
*indir
,
1093 const u8
*key
, const u8 hfunc
)
1095 struct fm10k_intfc
*interface
= netdev_priv(netdev
);
1096 struct fm10k_hw
*hw
= &interface
->hw
;
1099 /* We do not allow change in unsupported parameters */
1100 if (hfunc
!= ETH_RSS_HASH_NO_CHANGE
&& hfunc
!= ETH_RSS_HASH_TOP
)
1103 err
= fm10k_set_reta(netdev
, indir
);
1107 for (i
= 0; i
< FM10K_RSSRK_SIZE
; i
++, key
+= 4) {
1108 u32 rssrk
= le32_to_cpu(*(__le32
*)key
);
1110 if (interface
->rssrk
[i
] == rssrk
)
1113 interface
->rssrk
[i
] = rssrk
;
1114 fm10k_write_reg(hw
, FM10K_RSSRK(0, i
), rssrk
);
1120 static unsigned int fm10k_max_channels(struct net_device
*dev
)
1122 struct fm10k_intfc
*interface
= netdev_priv(dev
);
1123 unsigned int max_combined
= interface
->hw
.mac
.max_queues
;
1124 u8 tcs
= netdev_get_num_tc(dev
);
1126 /* For QoS report channels per traffic class */
1128 max_combined
= BIT((fls(max_combined
/ tcs
) - 1));
1130 return max_combined
;
1133 static void fm10k_get_channels(struct net_device
*dev
,
1134 struct ethtool_channels
*ch
)
1136 struct fm10k_intfc
*interface
= netdev_priv(dev
);
1137 struct fm10k_hw
*hw
= &interface
->hw
;
1139 /* report maximum channels */
1140 ch
->max_combined
= fm10k_max_channels(dev
);
1142 /* report info for other vector */
1143 ch
->max_other
= NON_Q_VECTORS(hw
);
1144 ch
->other_count
= ch
->max_other
;
1146 /* record RSS queues */
1147 ch
->combined_count
= interface
->ring_feature
[RING_F_RSS
].indices
;
1150 static int fm10k_set_channels(struct net_device
*dev
,
1151 struct ethtool_channels
*ch
)
1153 struct fm10k_intfc
*interface
= netdev_priv(dev
);
1154 unsigned int count
= ch
->combined_count
;
1155 struct fm10k_hw
*hw
= &interface
->hw
;
1157 /* verify they are not requesting separate vectors */
1158 if (!count
|| ch
->rx_count
|| ch
->tx_count
)
1161 /* verify other_count has not changed */
1162 if (ch
->other_count
!= NON_Q_VECTORS(hw
))
1165 /* verify the number of channels does not exceed hardware limits */
1166 if (count
> fm10k_max_channels(dev
))
1169 interface
->ring_feature
[RING_F_RSS
].limit
= count
;
1171 /* use setup TC to update any traffic class queue mapping */
1172 return fm10k_setup_tc(dev
, netdev_get_num_tc(dev
));
1175 static const struct ethtool_ops fm10k_ethtool_ops
= {
1176 .get_strings
= fm10k_get_strings
,
1177 .get_sset_count
= fm10k_get_sset_count
,
1178 .get_ethtool_stats
= fm10k_get_ethtool_stats
,
1179 .get_drvinfo
= fm10k_get_drvinfo
,
1180 .get_link
= ethtool_op_get_link
,
1181 .get_pauseparam
= fm10k_get_pauseparam
,
1182 .set_pauseparam
= fm10k_set_pauseparam
,
1183 .get_msglevel
= fm10k_get_msglevel
,
1184 .set_msglevel
= fm10k_set_msglevel
,
1185 .get_ringparam
= fm10k_get_ringparam
,
1186 .set_ringparam
= fm10k_set_ringparam
,
1187 .get_coalesce
= fm10k_get_coalesce
,
1188 .set_coalesce
= fm10k_set_coalesce
,
1189 .get_rxnfc
= fm10k_get_rxnfc
,
1190 .set_rxnfc
= fm10k_set_rxnfc
,
1191 .get_regs
= fm10k_get_regs
,
1192 .get_regs_len
= fm10k_get_regs_len
,
1193 .self_test
= fm10k_self_test
,
1194 .get_priv_flags
= fm10k_get_priv_flags
,
1195 .set_priv_flags
= fm10k_set_priv_flags
,
1196 .get_rxfh_indir_size
= fm10k_get_reta_size
,
1197 .get_rxfh_key_size
= fm10k_get_rssrk_size
,
1198 .get_rxfh
= fm10k_get_rssh
,
1199 .set_rxfh
= fm10k_set_rssh
,
1200 .get_channels
= fm10k_get_channels
,
1201 .set_channels
= fm10k_set_channels
,
1202 .get_ts_info
= ethtool_op_get_ts_info
,
1205 void fm10k_set_ethtool_ops(struct net_device
*dev
)
1207 dev
->ethtool_ops
= &fm10k_ethtool_ops
;