Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / drivers / net / ethernet / intel / ice / ice_ethtool.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2018, Intel Corporation. */
3
4 /* ethtool support for ice */
5
6 #include "ice.h"
7 #include "ice_lib.h"
8 #include "ice_dcb_lib.h"
9
10 struct ice_stats {
11         char stat_string[ETH_GSTRING_LEN];
12         int sizeof_stat;
13         int stat_offset;
14 };
15
16 #define ICE_STAT(_type, _name, _stat) { \
17         .stat_string = _name, \
18         .sizeof_stat = FIELD_SIZEOF(_type, _stat), \
19         .stat_offset = offsetof(_type, _stat) \
20 }
21
22 #define ICE_VSI_STAT(_name, _stat) \
23                 ICE_STAT(struct ice_vsi, _name, _stat)
24 #define ICE_PF_STAT(_name, _stat) \
25                 ICE_STAT(struct ice_pf, _name, _stat)
26
27 static int ice_q_stats_len(struct net_device *netdev)
28 {
29         struct ice_netdev_priv *np = netdev_priv(netdev);
30
31         return ((np->vsi->alloc_txq + np->vsi->alloc_rxq) *
32                 (sizeof(struct ice_q_stats) / sizeof(u64)));
33 }
34
35 #define ICE_PF_STATS_LEN        ARRAY_SIZE(ice_gstrings_pf_stats)
36 #define ICE_VSI_STATS_LEN       ARRAY_SIZE(ice_gstrings_vsi_stats)
37
38 #define ICE_PFC_STATS_LEN ( \
39                 (FIELD_SIZEOF(struct ice_pf, stats.priority_xoff_rx) + \
40                  FIELD_SIZEOF(struct ice_pf, stats.priority_xon_rx) + \
41                  FIELD_SIZEOF(struct ice_pf, stats.priority_xoff_tx) + \
42                  FIELD_SIZEOF(struct ice_pf, stats.priority_xon_tx)) \
43                  / sizeof(u64))
44 #define ICE_ALL_STATS_LEN(n)    (ICE_PF_STATS_LEN + ICE_PFC_STATS_LEN + \
45                                  ICE_VSI_STATS_LEN + ice_q_stats_len(n))
46
47 static const struct ice_stats ice_gstrings_vsi_stats[] = {
48         ICE_VSI_STAT("rx_unicast", eth_stats.rx_unicast),
49         ICE_VSI_STAT("tx_unicast", eth_stats.tx_unicast),
50         ICE_VSI_STAT("rx_multicast", eth_stats.rx_multicast),
51         ICE_VSI_STAT("tx_multicast", eth_stats.tx_multicast),
52         ICE_VSI_STAT("rx_broadcast", eth_stats.rx_broadcast),
53         ICE_VSI_STAT("tx_broadcast", eth_stats.tx_broadcast),
54         ICE_VSI_STAT("rx_bytes", eth_stats.rx_bytes),
55         ICE_VSI_STAT("tx_bytes", eth_stats.tx_bytes),
56         ICE_VSI_STAT("rx_dropped", eth_stats.rx_discards),
57         ICE_VSI_STAT("rx_unknown_protocol", eth_stats.rx_unknown_protocol),
58         ICE_VSI_STAT("rx_alloc_fail", rx_buf_failed),
59         ICE_VSI_STAT("rx_pg_alloc_fail", rx_page_failed),
60         ICE_VSI_STAT("tx_errors", eth_stats.tx_errors),
61         ICE_VSI_STAT("tx_linearize", tx_linearize),
62 };
63
64 enum ice_ethtool_test_id {
65         ICE_ETH_TEST_REG = 0,
66         ICE_ETH_TEST_EEPROM,
67         ICE_ETH_TEST_INTR,
68         ICE_ETH_TEST_LOOP,
69         ICE_ETH_TEST_LINK,
70 };
71
72 static const char ice_gstrings_test[][ETH_GSTRING_LEN] = {
73         "Register test  (offline)",
74         "EEPROM test    (offline)",
75         "Interrupt test (offline)",
76         "Loopback test  (offline)",
77         "Link test   (on/offline)",
78 };
79
80 #define ICE_TEST_LEN (sizeof(ice_gstrings_test) / ETH_GSTRING_LEN)
81
82 /* These PF_STATs might look like duplicates of some NETDEV_STATs,
83  * but they aren't. This device is capable of supporting multiple
84  * VSIs/netdevs on a single PF. The NETDEV_STATs are for individual
85  * netdevs whereas the PF_STATs are for the physical function that's
86  * hosting these netdevs.
87  *
88  * The PF_STATs are appended to the netdev stats only when ethtool -S
89  * is queried on the base PF netdev.
90  */
91 static const struct ice_stats ice_gstrings_pf_stats[] = {
92         ICE_PF_STAT("rx_bytes.nic", stats.eth.rx_bytes),
93         ICE_PF_STAT("tx_bytes.nic", stats.eth.tx_bytes),
94         ICE_PF_STAT("rx_unicast.nic", stats.eth.rx_unicast),
95         ICE_PF_STAT("tx_unicast.nic", stats.eth.tx_unicast),
96         ICE_PF_STAT("rx_multicast.nic", stats.eth.rx_multicast),
97         ICE_PF_STAT("tx_multicast.nic", stats.eth.tx_multicast),
98         ICE_PF_STAT("rx_broadcast.nic", stats.eth.rx_broadcast),
99         ICE_PF_STAT("tx_broadcast.nic", stats.eth.tx_broadcast),
100         ICE_PF_STAT("tx_errors.nic", stats.eth.tx_errors),
101         ICE_PF_STAT("rx_size_64.nic", stats.rx_size_64),
102         ICE_PF_STAT("tx_size_64.nic", stats.tx_size_64),
103         ICE_PF_STAT("rx_size_127.nic", stats.rx_size_127),
104         ICE_PF_STAT("tx_size_127.nic", stats.tx_size_127),
105         ICE_PF_STAT("rx_size_255.nic", stats.rx_size_255),
106         ICE_PF_STAT("tx_size_255.nic", stats.tx_size_255),
107         ICE_PF_STAT("rx_size_511.nic", stats.rx_size_511),
108         ICE_PF_STAT("tx_size_511.nic", stats.tx_size_511),
109         ICE_PF_STAT("rx_size_1023.nic", stats.rx_size_1023),
110         ICE_PF_STAT("tx_size_1023.nic", stats.tx_size_1023),
111         ICE_PF_STAT("rx_size_1522.nic", stats.rx_size_1522),
112         ICE_PF_STAT("tx_size_1522.nic", stats.tx_size_1522),
113         ICE_PF_STAT("rx_size_big.nic", stats.rx_size_big),
114         ICE_PF_STAT("tx_size_big.nic", stats.tx_size_big),
115         ICE_PF_STAT("link_xon_rx.nic", stats.link_xon_rx),
116         ICE_PF_STAT("link_xon_tx.nic", stats.link_xon_tx),
117         ICE_PF_STAT("link_xoff_rx.nic", stats.link_xoff_rx),
118         ICE_PF_STAT("link_xoff_tx.nic", stats.link_xoff_tx),
119         ICE_PF_STAT("tx_dropped_link_down.nic", stats.tx_dropped_link_down),
120         ICE_PF_STAT("rx_undersize.nic", stats.rx_undersize),
121         ICE_PF_STAT("rx_fragments.nic", stats.rx_fragments),
122         ICE_PF_STAT("rx_oversize.nic", stats.rx_oversize),
123         ICE_PF_STAT("rx_jabber.nic", stats.rx_jabber),
124         ICE_PF_STAT("rx_csum_bad.nic", hw_csum_rx_error),
125         ICE_PF_STAT("rx_length_errors.nic", stats.rx_len_errors),
126         ICE_PF_STAT("rx_dropped.nic", stats.eth.rx_discards),
127         ICE_PF_STAT("rx_crc_errors.nic", stats.crc_errors),
128         ICE_PF_STAT("illegal_bytes.nic", stats.illegal_bytes),
129         ICE_PF_STAT("mac_local_faults.nic", stats.mac_local_faults),
130         ICE_PF_STAT("mac_remote_faults.nic", stats.mac_remote_faults),
131 };
132
133 static const u32 ice_regs_dump_list[] = {
134         PFGEN_STATE,
135         PRTGEN_STATUS,
136         QRX_CTRL(0),
137         QINT_TQCTL(0),
138         QINT_RQCTL(0),
139         PFINT_OICR_ENA,
140         QRX_ITR(0),
141         PF0INT_ITR_0(0),
142         PF0INT_ITR_1(0),
143         PF0INT_ITR_2(0),
144 };
145
146 struct ice_priv_flag {
147         char name[ETH_GSTRING_LEN];
148         u32 bitno;                      /* bit position in pf->flags */
149 };
150
151 #define ICE_PRIV_FLAG(_name, _bitno) { \
152         .name = _name, \
153         .bitno = _bitno, \
154 }
155
156 static const struct ice_priv_flag ice_gstrings_priv_flags[] = {
157         ICE_PRIV_FLAG("link-down-on-close", ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA),
158         ICE_PRIV_FLAG("fw-lldp-agent", ICE_FLAG_FW_LLDP_AGENT),
159 };
160
161 #define ICE_PRIV_FLAG_ARRAY_SIZE        ARRAY_SIZE(ice_gstrings_priv_flags)
162
163 static void
164 ice_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
165 {
166         struct ice_netdev_priv *np = netdev_priv(netdev);
167         struct ice_vsi *vsi = np->vsi;
168         struct ice_pf *pf = vsi->back;
169
170         strlcpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver));
171         strlcpy(drvinfo->version, ice_drv_ver, sizeof(drvinfo->version));
172         strlcpy(drvinfo->fw_version, ice_nvm_version_str(&pf->hw),
173                 sizeof(drvinfo->fw_version));
174         strlcpy(drvinfo->bus_info, pci_name(pf->pdev),
175                 sizeof(drvinfo->bus_info));
176         drvinfo->n_priv_flags = ICE_PRIV_FLAG_ARRAY_SIZE;
177 }
178
179 static int ice_get_regs_len(struct net_device __always_unused *netdev)
180 {
181         return sizeof(ice_regs_dump_list);
182 }
183
184 static void
185 ice_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p)
186 {
187         struct ice_netdev_priv *np = netdev_priv(netdev);
188         struct ice_pf *pf = np->vsi->back;
189         struct ice_hw *hw = &pf->hw;
190         u32 *regs_buf = (u32 *)p;
191         int i;
192
193         regs->version = 1;
194
195         for (i = 0; i < ARRAY_SIZE(ice_regs_dump_list); ++i)
196                 regs_buf[i] = rd32(hw, ice_regs_dump_list[i]);
197 }
198
199 static u32 ice_get_msglevel(struct net_device *netdev)
200 {
201         struct ice_netdev_priv *np = netdev_priv(netdev);
202         struct ice_pf *pf = np->vsi->back;
203
204 #ifndef CONFIG_DYNAMIC_DEBUG
205         if (pf->hw.debug_mask)
206                 netdev_info(netdev, "hw debug_mask: 0x%llX\n",
207                             pf->hw.debug_mask);
208 #endif /* !CONFIG_DYNAMIC_DEBUG */
209
210         return pf->msg_enable;
211 }
212
213 static void ice_set_msglevel(struct net_device *netdev, u32 data)
214 {
215         struct ice_netdev_priv *np = netdev_priv(netdev);
216         struct ice_pf *pf = np->vsi->back;
217
218 #ifndef CONFIG_DYNAMIC_DEBUG
219         if (ICE_DBG_USER & data)
220                 pf->hw.debug_mask = data;
221         else
222                 pf->msg_enable = data;
223 #else
224         pf->msg_enable = data;
225 #endif /* !CONFIG_DYNAMIC_DEBUG */
226 }
227
228 static int ice_get_eeprom_len(struct net_device *netdev)
229 {
230         struct ice_netdev_priv *np = netdev_priv(netdev);
231         struct ice_pf *pf = np->vsi->back;
232
233         return (int)(pf->hw.nvm.sr_words * sizeof(u16));
234 }
235
236 static int
237 ice_get_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom,
238                u8 *bytes)
239 {
240         struct ice_netdev_priv *np = netdev_priv(netdev);
241         u16 first_word, last_word, nwords;
242         struct ice_vsi *vsi = np->vsi;
243         struct ice_pf *pf = vsi->back;
244         struct ice_hw *hw = &pf->hw;
245         enum ice_status status;
246         struct device *dev;
247         int ret = 0;
248         u16 *buf;
249
250         dev = &pf->pdev->dev;
251
252         eeprom->magic = hw->vendor_id | (hw->device_id << 16);
253
254         first_word = eeprom->offset >> 1;
255         last_word = (eeprom->offset + eeprom->len - 1) >> 1;
256         nwords = last_word - first_word + 1;
257
258         buf = devm_kcalloc(dev, nwords, sizeof(u16), GFP_KERNEL);
259         if (!buf)
260                 return -ENOMEM;
261
262         status = ice_read_sr_buf(hw, first_word, &nwords, buf);
263         if (status) {
264                 dev_err(dev, "ice_read_sr_buf failed, err %d aq_err %d\n",
265                         status, hw->adminq.sq_last_status);
266                 eeprom->len = sizeof(u16) * nwords;
267                 ret = -EIO;
268                 goto out;
269         }
270
271         memcpy(bytes, (u8 *)buf + (eeprom->offset & 1), eeprom->len);
272 out:
273         devm_kfree(dev, buf);
274         return ret;
275 }
276
277 /**
278  * ice_active_vfs - check if there are any active VFs
279  * @pf: board private structure
280  *
281  * Returns true if an active VF is found, otherwise returns false
282  */
283 static bool ice_active_vfs(struct ice_pf *pf)
284 {
285         struct ice_vf *vf = pf->vf;
286         int i;
287
288         for (i = 0; i < pf->num_alloc_vfs; i++, vf++)
289                 if (test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states))
290                         return true;
291         return false;
292 }
293
294 /**
295  * ice_link_test - perform a link test on a given net_device
296  * @netdev: network interface device structure
297  *
298  * This function performs one of the self-tests required by ethtool.
299  * Returns 0 on success, non-zero on failure.
300  */
301 static u64 ice_link_test(struct net_device *netdev)
302 {
303         struct ice_netdev_priv *np = netdev_priv(netdev);
304         enum ice_status status;
305         bool link_up = false;
306
307         netdev_info(netdev, "link test\n");
308         status = ice_get_link_status(np->vsi->port_info, &link_up);
309         if (status) {
310                 netdev_err(netdev, "link query error, status = %d\n", status);
311                 return 1;
312         }
313
314         if (!link_up)
315                 return 2;
316
317         return 0;
318 }
319
320 /**
321  * ice_eeprom_test - perform an EEPROM test on a given net_device
322  * @netdev: network interface device structure
323  *
324  * This function performs one of the self-tests required by ethtool.
325  * Returns 0 on success, non-zero on failure.
326  */
327 static u64 ice_eeprom_test(struct net_device *netdev)
328 {
329         struct ice_netdev_priv *np = netdev_priv(netdev);
330         struct ice_pf *pf = np->vsi->back;
331
332         netdev_info(netdev, "EEPROM test\n");
333         return !!(ice_nvm_validate_checksum(&pf->hw));
334 }
335
336 /**
337  * ice_reg_pattern_test
338  * @hw: pointer to the HW struct
339  * @reg: reg to be tested
340  * @mask: bits to be touched
341  */
342 static int ice_reg_pattern_test(struct ice_hw *hw, u32 reg, u32 mask)
343 {
344         struct ice_pf *pf = (struct ice_pf *)hw->back;
345         static const u32 patterns[] = {
346                 0x5A5A5A5A, 0xA5A5A5A5,
347                 0x00000000, 0xFFFFFFFF
348         };
349         u32 val, orig_val;
350         int i;
351
352         orig_val = rd32(hw, reg);
353         for (i = 0; i < ARRAY_SIZE(patterns); ++i) {
354                 u32 pattern = patterns[i] & mask;
355
356                 wr32(hw, reg, pattern);
357                 val = rd32(hw, reg);
358                 if (val == pattern)
359                         continue;
360                 dev_err(&pf->pdev->dev,
361                         "%s: reg pattern test failed - reg 0x%08x pat 0x%08x val 0x%08x\n"
362                         , __func__, reg, pattern, val);
363                 return 1;
364         }
365
366         wr32(hw, reg, orig_val);
367         val = rd32(hw, reg);
368         if (val != orig_val) {
369                 dev_err(&pf->pdev->dev,
370                         "%s: reg restore test failed - reg 0x%08x orig 0x%08x val 0x%08x\n"
371                         , __func__, reg, orig_val, val);
372                 return 1;
373         }
374
375         return 0;
376 }
377
378 /**
379  * ice_reg_test - perform a register test on a given net_device
380  * @netdev: network interface device structure
381  *
382  * This function performs one of the self-tests required by ethtool.
383  * Returns 0 on success, non-zero on failure.
384  */
385 static u64 ice_reg_test(struct net_device *netdev)
386 {
387         struct ice_netdev_priv *np = netdev_priv(netdev);
388         struct ice_hw *hw = np->vsi->port_info->hw;
389         u32 int_elements = hw->func_caps.common_cap.num_msix_vectors ?
390                 hw->func_caps.common_cap.num_msix_vectors - 1 : 1;
391         struct ice_diag_reg_test_info {
392                 u32 address;
393                 u32 mask;
394                 u32 elem_num;
395                 u32 elem_size;
396         } ice_reg_list[] = {
397                 {GLINT_ITR(0, 0), 0x00000fff, int_elements,
398                         GLINT_ITR(0, 1) - GLINT_ITR(0, 0)},
399                 {GLINT_ITR(1, 0), 0x00000fff, int_elements,
400                         GLINT_ITR(1, 1) - GLINT_ITR(1, 0)},
401                 {GLINT_ITR(0, 0), 0x00000fff, int_elements,
402                         GLINT_ITR(2, 1) - GLINT_ITR(2, 0)},
403                 {GLINT_CTL, 0xffff0001, 1, 0}
404         };
405         int i;
406
407         netdev_dbg(netdev, "Register test\n");
408         for (i = 0; i < ARRAY_SIZE(ice_reg_list); ++i) {
409                 u32 j;
410
411                 for (j = 0; j < ice_reg_list[i].elem_num; ++j) {
412                         u32 mask = ice_reg_list[i].mask;
413                         u32 reg = ice_reg_list[i].address +
414                                 (j * ice_reg_list[i].elem_size);
415
416                         /* bail on failure (non-zero return) */
417                         if (ice_reg_pattern_test(hw, reg, mask))
418                                 return 1;
419                 }
420         }
421
422         return 0;
423 }
424
425 /**
426  * ice_lbtest_prepare_rings - configure Tx/Rx test rings
427  * @vsi: pointer to the VSI structure
428  *
429  * Function configures rings of a VSI for loopback test without
430  * enabling interrupts or informing the kernel about new queues.
431  *
432  * Returns 0 on success, negative on failure.
433  */
434 static int ice_lbtest_prepare_rings(struct ice_vsi *vsi)
435 {
436         int status;
437
438         status = ice_vsi_setup_tx_rings(vsi);
439         if (status)
440                 goto err_setup_tx_ring;
441
442         status = ice_vsi_setup_rx_rings(vsi);
443         if (status)
444                 goto err_setup_rx_ring;
445
446         status = ice_vsi_cfg(vsi);
447         if (status)
448                 goto err_setup_rx_ring;
449
450         status = ice_vsi_start_rx_rings(vsi);
451         if (status)
452                 goto err_start_rx_ring;
453
454         return status;
455
456 err_start_rx_ring:
457         ice_vsi_free_rx_rings(vsi);
458 err_setup_rx_ring:
459         ice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, 0);
460 err_setup_tx_ring:
461         ice_vsi_free_tx_rings(vsi);
462
463         return status;
464 }
465
466 /**
467  * ice_lbtest_disable_rings - disable Tx/Rx test rings after loopback test
468  * @vsi: pointer to the VSI structure
469  *
470  * Function stops and frees VSI rings after a loopback test.
471  * Returns 0 on success, negative on failure.
472  */
473 static int ice_lbtest_disable_rings(struct ice_vsi *vsi)
474 {
475         int status;
476
477         status = ice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, 0);
478         if (status)
479                 netdev_err(vsi->netdev, "Failed to stop Tx rings, VSI %d error %d\n",
480                            vsi->vsi_num, status);
481
482         status = ice_vsi_stop_rx_rings(vsi);
483         if (status)
484                 netdev_err(vsi->netdev, "Failed to stop Rx rings, VSI %d error %d\n",
485                            vsi->vsi_num, status);
486
487         ice_vsi_free_tx_rings(vsi);
488         ice_vsi_free_rx_rings(vsi);
489
490         return status;
491 }
492
493 /**
494  * ice_lbtest_create_frame - create test packet
495  * @pf: pointer to the PF structure
496  * @ret_data: allocated frame buffer
497  * @size: size of the packet data
498  *
499  * Function allocates a frame with a test pattern on specific offsets.
500  * Returns 0 on success, non-zero on failure.
501  */
502 static int ice_lbtest_create_frame(struct ice_pf *pf, u8 **ret_data, u16 size)
503 {
504         u8 *data;
505
506         if (!pf)
507                 return -EINVAL;
508
509         data = devm_kzalloc(&pf->pdev->dev, size, GFP_KERNEL);
510         if (!data)
511                 return -ENOMEM;
512
513         /* Since the ethernet test frame should always be at least
514          * 64 bytes long, fill some octets in the payload with test data.
515          */
516         memset(data, 0xFF, size);
517         data[32] = 0xDE;
518         data[42] = 0xAD;
519         data[44] = 0xBE;
520         data[46] = 0xEF;
521
522         *ret_data = data;
523
524         return 0;
525 }
526
527 /**
528  * ice_lbtest_check_frame - verify received loopback frame
529  * @frame: pointer to the raw packet data
530  *
531  * Function verifies received test frame with a pattern.
532  * Returns true if frame matches the pattern, false otherwise.
533  */
534 static bool ice_lbtest_check_frame(u8 *frame)
535 {
536         /* Validate bytes of a frame under offsets chosen earlier */
537         if (frame[32] == 0xDE &&
538             frame[42] == 0xAD &&
539             frame[44] == 0xBE &&
540             frame[46] == 0xEF &&
541             frame[48] == 0xFF)
542                 return true;
543
544         return false;
545 }
546
547 /**
548  * ice_diag_send - send test frames to the test ring
549  * @tx_ring: pointer to the transmit ring
550  * @data: pointer to the raw packet data
551  * @size: size of the packet to send
552  *
553  * Function sends loopback packets on a test Tx ring.
554  */
555 static int ice_diag_send(struct ice_ring *tx_ring, u8 *data, u16 size)
556 {
557         struct ice_tx_desc *tx_desc;
558         struct ice_tx_buf *tx_buf;
559         dma_addr_t dma;
560         u64 td_cmd;
561
562         tx_desc = ICE_TX_DESC(tx_ring, tx_ring->next_to_use);
563         tx_buf = &tx_ring->tx_buf[tx_ring->next_to_use];
564
565         dma = dma_map_single(tx_ring->dev, data, size, DMA_TO_DEVICE);
566         if (dma_mapping_error(tx_ring->dev, dma))
567                 return -EINVAL;
568
569         tx_desc->buf_addr = cpu_to_le64(dma);
570
571         /* These flags are required for a descriptor to be pushed out */
572         td_cmd = (u64)(ICE_TX_DESC_CMD_EOP | ICE_TX_DESC_CMD_RS);
573         tx_desc->cmd_type_offset_bsz =
574                 cpu_to_le64(ICE_TX_DESC_DTYPE_DATA |
575                             (td_cmd << ICE_TXD_QW1_CMD_S) |
576                             ((u64)0 << ICE_TXD_QW1_OFFSET_S) |
577                             ((u64)size << ICE_TXD_QW1_TX_BUF_SZ_S) |
578                             ((u64)0 << ICE_TXD_QW1_L2TAG1_S));
579
580         tx_buf->next_to_watch = tx_desc;
581
582         /* Force memory write to complete before letting h/w know
583          * there are new descriptors to fetch.
584          */
585         wmb();
586
587         tx_ring->next_to_use++;
588         if (tx_ring->next_to_use >= tx_ring->count)
589                 tx_ring->next_to_use = 0;
590
591         writel_relaxed(tx_ring->next_to_use, tx_ring->tail);
592
593         /* Wait until the packets get transmitted to the receive queue. */
594         usleep_range(1000, 2000);
595         dma_unmap_single(tx_ring->dev, dma, size, DMA_TO_DEVICE);
596
597         return 0;
598 }
599
600 #define ICE_LB_FRAME_SIZE 64
601 /**
602  * ice_lbtest_receive_frames - receive and verify test frames
603  * @rx_ring: pointer to the receive ring
604  *
605  * Function receives loopback packets and verify their correctness.
606  * Returns number of received valid frames.
607  */
608 static int ice_lbtest_receive_frames(struct ice_ring *rx_ring)
609 {
610         struct ice_rx_buf *rx_buf;
611         int valid_frames, i;
612         u8 *received_buf;
613
614         valid_frames = 0;
615
616         for (i = 0; i < rx_ring->count; i++) {
617                 union ice_32b_rx_flex_desc *rx_desc;
618
619                 rx_desc = ICE_RX_DESC(rx_ring, i);
620
621                 if (!(rx_desc->wb.status_error0 &
622                     cpu_to_le16(ICE_TX_DESC_CMD_EOP | ICE_TX_DESC_CMD_RS)))
623                         continue;
624
625                 rx_buf = &rx_ring->rx_buf[i];
626                 received_buf = page_address(rx_buf->page);
627
628                 if (ice_lbtest_check_frame(received_buf))
629                         valid_frames++;
630         }
631
632         return valid_frames;
633 }
634
635 /**
636  * ice_loopback_test - perform a loopback test on a given net_device
637  * @netdev: network interface device structure
638  *
639  * This function performs one of the self-tests required by ethtool.
640  * Returns 0 on success, non-zero on failure.
641  */
642 static u64 ice_loopback_test(struct net_device *netdev)
643 {
644         struct ice_netdev_priv *np = netdev_priv(netdev);
645         struct ice_vsi *orig_vsi = np->vsi, *test_vsi;
646         struct ice_pf *pf = orig_vsi->back;
647         struct ice_ring *tx_ring, *rx_ring;
648         u8 broadcast[ETH_ALEN], ret = 0;
649         int num_frames, valid_frames;
650         LIST_HEAD(tmp_list);
651         u8 *tx_frame;
652         int i;
653
654         netdev_info(netdev, "loopback test\n");
655
656         test_vsi = ice_lb_vsi_setup(pf, pf->hw.port_info);
657         if (!test_vsi) {
658                 netdev_err(netdev, "Failed to create a VSI for the loopback test");
659                 return 1;
660         }
661
662         test_vsi->netdev = netdev;
663         tx_ring = test_vsi->tx_rings[0];
664         rx_ring = test_vsi->rx_rings[0];
665
666         if (ice_lbtest_prepare_rings(test_vsi)) {
667                 ret = 2;
668                 goto lbtest_vsi_close;
669         }
670
671         if (ice_alloc_rx_bufs(rx_ring, rx_ring->count)) {
672                 ret = 3;
673                 goto lbtest_rings_dis;
674         }
675
676         /* Enable MAC loopback in firmware */
677         if (ice_aq_set_mac_loopback(&pf->hw, true, NULL)) {
678                 ret = 4;
679                 goto lbtest_mac_dis;
680         }
681
682         /* Test VSI needs to receive broadcast packets */
683         eth_broadcast_addr(broadcast);
684         if (ice_add_mac_to_list(test_vsi, &tmp_list, broadcast)) {
685                 ret = 5;
686                 goto lbtest_mac_dis;
687         }
688
689         if (ice_add_mac(&pf->hw, &tmp_list)) {
690                 ret = 6;
691                 goto free_mac_list;
692         }
693
694         if (ice_lbtest_create_frame(pf, &tx_frame, ICE_LB_FRAME_SIZE)) {
695                 ret = 7;
696                 goto remove_mac_filters;
697         }
698
699         num_frames = min_t(int, tx_ring->count, 32);
700         for (i = 0; i < num_frames; i++) {
701                 if (ice_diag_send(tx_ring, tx_frame, ICE_LB_FRAME_SIZE)) {
702                         ret = 8;
703                         goto lbtest_free_frame;
704                 }
705         }
706
707         valid_frames = ice_lbtest_receive_frames(rx_ring);
708         if (!valid_frames)
709                 ret = 9;
710         else if (valid_frames != num_frames)
711                 ret = 10;
712
713 lbtest_free_frame:
714         devm_kfree(&pf->pdev->dev, tx_frame);
715 remove_mac_filters:
716         if (ice_remove_mac(&pf->hw, &tmp_list))
717                 netdev_err(netdev, "Could not remove MAC filter for the test VSI");
718 free_mac_list:
719         ice_free_fltr_list(&pf->pdev->dev, &tmp_list);
720 lbtest_mac_dis:
721         /* Disable MAC loopback after the test is completed. */
722         if (ice_aq_set_mac_loopback(&pf->hw, false, NULL))
723                 netdev_err(netdev, "Could not disable MAC loopback\n");
724 lbtest_rings_dis:
725         if (ice_lbtest_disable_rings(test_vsi))
726                 netdev_err(netdev, "Could not disable test rings\n");
727 lbtest_vsi_close:
728         test_vsi->netdev = NULL;
729         if (ice_vsi_release(test_vsi))
730                 netdev_err(netdev, "Failed to remove the test VSI");
731
732         return ret;
733 }
734
735 /**
736  * ice_intr_test - perform an interrupt test on a given net_device
737  * @netdev: network interface device structure
738  *
739  * This function performs one of the self-tests required by ethtool.
740  * Returns 0 on success, non-zero on failure.
741  */
742 static u64 ice_intr_test(struct net_device *netdev)
743 {
744         struct ice_netdev_priv *np = netdev_priv(netdev);
745         struct ice_pf *pf = np->vsi->back;
746         u16 swic_old = pf->sw_int_count;
747
748         netdev_info(netdev, "interrupt test\n");
749
750         wr32(&pf->hw, GLINT_DYN_CTL(pf->oicr_idx),
751              GLINT_DYN_CTL_SW_ITR_INDX_M |
752              GLINT_DYN_CTL_INTENA_MSK_M |
753              GLINT_DYN_CTL_SWINT_TRIG_M);
754
755         usleep_range(1000, 2000);
756         return (swic_old == pf->sw_int_count);
757 }
758
759 /**
760  * ice_self_test - handler function for performing a self-test by ethtool
761  * @netdev: network interface device structure
762  * @eth_test: ethtool_test structure
763  * @data: required by ethtool.self_test
764  *
765  * This function is called after invoking 'ethtool -t devname' command where
766  * devname is the name of the network device on which ethtool should operate.
767  * It performs a set of self-tests to check if a device works properly.
768  */
769 static void
770 ice_self_test(struct net_device *netdev, struct ethtool_test *eth_test,
771               u64 *data)
772 {
773         struct ice_netdev_priv *np = netdev_priv(netdev);
774         bool if_running = netif_running(netdev);
775         struct ice_pf *pf = np->vsi->back;
776
777         if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
778                 netdev_info(netdev, "offline testing starting\n");
779
780                 set_bit(__ICE_TESTING, pf->state);
781
782                 if (ice_active_vfs(pf)) {
783                         dev_warn(&pf->pdev->dev,
784                                  "Please take active VFs and Netqueues offline and restart the adapter before running NIC diagnostics\n");
785                         data[ICE_ETH_TEST_REG] = 1;
786                         data[ICE_ETH_TEST_EEPROM] = 1;
787                         data[ICE_ETH_TEST_INTR] = 1;
788                         data[ICE_ETH_TEST_LOOP] = 1;
789                         data[ICE_ETH_TEST_LINK] = 1;
790                         eth_test->flags |= ETH_TEST_FL_FAILED;
791                         clear_bit(__ICE_TESTING, pf->state);
792                         goto skip_ol_tests;
793                 }
794                 /* If the device is online then take it offline */
795                 if (if_running)
796                         /* indicate we're in test mode */
797                         ice_stop(netdev);
798
799                 data[ICE_ETH_TEST_LINK] = ice_link_test(netdev);
800                 data[ICE_ETH_TEST_EEPROM] = ice_eeprom_test(netdev);
801                 data[ICE_ETH_TEST_INTR] = ice_intr_test(netdev);
802                 data[ICE_ETH_TEST_LOOP] = ice_loopback_test(netdev);
803                 data[ICE_ETH_TEST_REG] = ice_reg_test(netdev);
804
805                 if (data[ICE_ETH_TEST_LINK] ||
806                     data[ICE_ETH_TEST_EEPROM] ||
807                     data[ICE_ETH_TEST_LOOP] ||
808                     data[ICE_ETH_TEST_INTR] ||
809                     data[ICE_ETH_TEST_REG])
810                         eth_test->flags |= ETH_TEST_FL_FAILED;
811
812                 clear_bit(__ICE_TESTING, pf->state);
813
814                 if (if_running) {
815                         int status = ice_open(netdev);
816
817                         if (status) {
818                                 dev_err(&pf->pdev->dev,
819                                         "Could not open device %s, err %d",
820                                         pf->int_name, status);
821                         }
822                 }
823         } else {
824                 /* Online tests */
825                 netdev_info(netdev, "online testing starting\n");
826
827                 data[ICE_ETH_TEST_LINK] = ice_link_test(netdev);
828                 if (data[ICE_ETH_TEST_LINK])
829                         eth_test->flags |= ETH_TEST_FL_FAILED;
830
831                 /* Offline only tests, not run in online; pass by default */
832                 data[ICE_ETH_TEST_REG] = 0;
833                 data[ICE_ETH_TEST_EEPROM] = 0;
834                 data[ICE_ETH_TEST_INTR] = 0;
835                 data[ICE_ETH_TEST_LOOP] = 0;
836         }
837
838 skip_ol_tests:
839         netdev_info(netdev, "testing finished\n");
840 }
841
842 static void ice_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
843 {
844         struct ice_netdev_priv *np = netdev_priv(netdev);
845         struct ice_vsi *vsi = np->vsi;
846         char *p = (char *)data;
847         unsigned int i;
848
849         switch (stringset) {
850         case ETH_SS_STATS:
851                 for (i = 0; i < ICE_VSI_STATS_LEN; i++) {
852                         snprintf(p, ETH_GSTRING_LEN, "%s",
853                                  ice_gstrings_vsi_stats[i].stat_string);
854                         p += ETH_GSTRING_LEN;
855                 }
856
857                 ice_for_each_alloc_txq(vsi, i) {
858                         snprintf(p, ETH_GSTRING_LEN,
859                                  "tx_queue_%u_packets", i);
860                         p += ETH_GSTRING_LEN;
861                         snprintf(p, ETH_GSTRING_LEN, "tx_queue_%u_bytes", i);
862                         p += ETH_GSTRING_LEN;
863                 }
864
865                 ice_for_each_alloc_rxq(vsi, i) {
866                         snprintf(p, ETH_GSTRING_LEN,
867                                  "rx_queue_%u_packets", i);
868                         p += ETH_GSTRING_LEN;
869                         snprintf(p, ETH_GSTRING_LEN, "rx_queue_%u_bytes", i);
870                         p += ETH_GSTRING_LEN;
871                 }
872
873                 if (vsi->type != ICE_VSI_PF)
874                         return;
875
876                 for (i = 0; i < ICE_PF_STATS_LEN; i++) {
877                         snprintf(p, ETH_GSTRING_LEN, "%s",
878                                  ice_gstrings_pf_stats[i].stat_string);
879                         p += ETH_GSTRING_LEN;
880                 }
881
882                 for (i = 0; i < ICE_MAX_USER_PRIORITY; i++) {
883                         snprintf(p, ETH_GSTRING_LEN,
884                                  "tx_priority_%u_xon.nic", i);
885                         p += ETH_GSTRING_LEN;
886                         snprintf(p, ETH_GSTRING_LEN,
887                                  "tx_priority_%u_xoff.nic", i);
888                         p += ETH_GSTRING_LEN;
889                 }
890                 for (i = 0; i < ICE_MAX_USER_PRIORITY; i++) {
891                         snprintf(p, ETH_GSTRING_LEN,
892                                  "rx_priority_%u_xon.nic", i);
893                         p += ETH_GSTRING_LEN;
894                         snprintf(p, ETH_GSTRING_LEN,
895                                  "rx_priority_%u_xoff.nic", i);
896                         p += ETH_GSTRING_LEN;
897                 }
898                 break;
899         case ETH_SS_TEST:
900                 memcpy(data, ice_gstrings_test, ICE_TEST_LEN * ETH_GSTRING_LEN);
901                 break;
902         case ETH_SS_PRIV_FLAGS:
903                 for (i = 0; i < ICE_PRIV_FLAG_ARRAY_SIZE; i++) {
904                         snprintf(p, ETH_GSTRING_LEN, "%s",
905                                  ice_gstrings_priv_flags[i].name);
906                         p += ETH_GSTRING_LEN;
907                 }
908                 break;
909         default:
910                 break;
911         }
912 }
913
914 static int
915 ice_set_phys_id(struct net_device *netdev, enum ethtool_phys_id_state state)
916 {
917         struct ice_netdev_priv *np = netdev_priv(netdev);
918         bool led_active;
919
920         switch (state) {
921         case ETHTOOL_ID_ACTIVE:
922                 led_active = true;
923                 break;
924         case ETHTOOL_ID_INACTIVE:
925                 led_active = false;
926                 break;
927         default:
928                 return -EINVAL;
929         }
930
931         if (ice_aq_set_port_id_led(np->vsi->port_info, !led_active, NULL))
932                 return -EIO;
933
934         return 0;
935 }
936
937 /**
938  * ice_set_fec_cfg - Set link FEC options
939  * @netdev: network interface device structure
940  * @req_fec: FEC mode to configure
941  */
942 static int ice_set_fec_cfg(struct net_device *netdev, enum ice_fec_mode req_fec)
943 {
944         struct ice_netdev_priv *np = netdev_priv(netdev);
945         struct ice_aqc_set_phy_cfg_data config = { 0 };
946         struct ice_aqc_get_phy_caps_data *caps;
947         struct ice_vsi *vsi = np->vsi;
948         u8 sw_cfg_caps, sw_cfg_fec;
949         struct ice_port_info *pi;
950         enum ice_status status;
951         int err = 0;
952
953         pi = vsi->port_info;
954         if (!pi)
955                 return -EOPNOTSUPP;
956
957         /* Changing the FEC parameters is not supported if not the PF VSI */
958         if (vsi->type != ICE_VSI_PF) {
959                 netdev_info(netdev, "Changing FEC parameters only supported for PF VSI\n");
960                 return -EOPNOTSUPP;
961         }
962
963         /* Get last SW configuration */
964         caps = devm_kzalloc(&vsi->back->pdev->dev, sizeof(*caps), GFP_KERNEL);
965         if (!caps)
966                 return -ENOMEM;
967
968         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG,
969                                      caps, NULL);
970         if (status) {
971                 err = -EAGAIN;
972                 goto done;
973         }
974
975         /* Copy SW configuration returned from PHY caps to PHY config */
976         ice_copy_phy_caps_to_cfg(caps, &config);
977         sw_cfg_caps = caps->caps;
978         sw_cfg_fec = caps->link_fec_options;
979
980         /* Get toloplogy caps, then copy PHY FEC topoloy caps to PHY config */
981         memset(caps, 0, sizeof(*caps));
982
983         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
984                                      caps, NULL);
985         if (status) {
986                 err = -EAGAIN;
987                 goto done;
988         }
989
990         config.caps |= (caps->caps & ICE_AQC_PHY_EN_AUTO_FEC);
991         config.link_fec_opt = caps->link_fec_options;
992
993         ice_cfg_phy_fec(&config, req_fec);
994
995         /* If FEC mode has changed, then set PHY configuration and enable AN. */
996         if ((config.caps & ICE_AQ_PHY_ENA_AUTO_FEC) !=
997             (sw_cfg_caps & ICE_AQC_PHY_EN_AUTO_FEC) ||
998             config.link_fec_opt != sw_cfg_fec) {
999                 if (caps->caps & ICE_AQC_PHY_AN_MODE)
1000                         config.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
1001
1002                 status = ice_aq_set_phy_cfg(pi->hw, pi->lport, &config, NULL);
1003
1004                 if (status)
1005                         err = -EAGAIN;
1006         }
1007
1008 done:
1009         devm_kfree(&vsi->back->pdev->dev, caps);
1010         return err;
1011 }
1012
1013 /**
1014  * ice_set_fecparam - Set FEC link options
1015  * @netdev: network interface device structure
1016  * @fecparam: Ethtool structure to retrieve FEC parameters
1017  */
1018 static int
1019 ice_set_fecparam(struct net_device *netdev, struct ethtool_fecparam *fecparam)
1020 {
1021         struct ice_netdev_priv *np = netdev_priv(netdev);
1022         struct ice_vsi *vsi = np->vsi;
1023         enum ice_fec_mode fec;
1024
1025         switch (fecparam->fec) {
1026         case ETHTOOL_FEC_AUTO:
1027                 fec = ICE_FEC_AUTO;
1028                 break;
1029         case ETHTOOL_FEC_RS:
1030                 fec = ICE_FEC_RS;
1031                 break;
1032         case ETHTOOL_FEC_BASER:
1033                 fec = ICE_FEC_BASER;
1034                 break;
1035         case ETHTOOL_FEC_OFF:
1036         case ETHTOOL_FEC_NONE:
1037                 fec = ICE_FEC_NONE;
1038                 break;
1039         default:
1040                 dev_warn(&vsi->back->pdev->dev, "Unsupported FEC mode: %d\n",
1041                          fecparam->fec);
1042                 return -EINVAL;
1043         }
1044
1045         return ice_set_fec_cfg(netdev, fec);
1046 }
1047
1048 /**
1049  * ice_get_fecparam - Get link FEC options
1050  * @netdev: network interface device structure
1051  * @fecparam: Ethtool structure to retrieve FEC parameters
1052  */
1053 static int
1054 ice_get_fecparam(struct net_device *netdev, struct ethtool_fecparam *fecparam)
1055 {
1056         struct ice_netdev_priv *np = netdev_priv(netdev);
1057         struct ice_aqc_get_phy_caps_data *caps;
1058         struct ice_link_status *link_info;
1059         struct ice_vsi *vsi = np->vsi;
1060         struct ice_port_info *pi;
1061         enum ice_status status;
1062         int err = 0;
1063
1064         pi = vsi->port_info;
1065
1066         if (!pi)
1067                 return -EOPNOTSUPP;
1068         link_info = &pi->phy.link_info;
1069
1070         /* Set FEC mode based on negotiated link info */
1071         switch (link_info->fec_info) {
1072         case ICE_AQ_LINK_25G_KR_FEC_EN:
1073                 fecparam->active_fec = ETHTOOL_FEC_BASER;
1074                 break;
1075         case ICE_AQ_LINK_25G_RS_528_FEC_EN:
1076                 /* fall through */
1077         case ICE_AQ_LINK_25G_RS_544_FEC_EN:
1078                 fecparam->active_fec = ETHTOOL_FEC_RS;
1079                 break;
1080         default:
1081                 fecparam->active_fec = ETHTOOL_FEC_OFF;
1082                 break;
1083         }
1084
1085         caps = devm_kzalloc(&vsi->back->pdev->dev, sizeof(*caps), GFP_KERNEL);
1086         if (!caps)
1087                 return -ENOMEM;
1088
1089         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
1090                                      caps, NULL);
1091         if (status) {
1092                 err = -EAGAIN;
1093                 goto done;
1094         }
1095
1096         /* Set supported/configured FEC modes based on PHY capability */
1097         if (caps->caps & ICE_AQC_PHY_EN_AUTO_FEC)
1098                 fecparam->fec |= ETHTOOL_FEC_AUTO;
1099         if (caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN ||
1100             caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ ||
1101             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN ||
1102             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_REQ)
1103                 fecparam->fec |= ETHTOOL_FEC_BASER;
1104         if (caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_528_REQ ||
1105             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_544_REQ ||
1106             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN)
1107                 fecparam->fec |= ETHTOOL_FEC_RS;
1108         if (caps->link_fec_options == 0)
1109                 fecparam->fec |= ETHTOOL_FEC_OFF;
1110
1111 done:
1112         devm_kfree(&vsi->back->pdev->dev, caps);
1113         return err;
1114 }
1115
1116 /**
1117  * ice_get_priv_flags - report device private flags
1118  * @netdev: network interface device structure
1119  *
1120  * The get string set count and the string set should be matched for each
1121  * flag returned.  Add new strings for each flag to the ice_gstrings_priv_flags
1122  * array.
1123  *
1124  * Returns a u32 bitmap of flags.
1125  */
1126 static u32 ice_get_priv_flags(struct net_device *netdev)
1127 {
1128         struct ice_netdev_priv *np = netdev_priv(netdev);
1129         struct ice_vsi *vsi = np->vsi;
1130         struct ice_pf *pf = vsi->back;
1131         u32 i, ret_flags = 0;
1132
1133         for (i = 0; i < ICE_PRIV_FLAG_ARRAY_SIZE; i++) {
1134                 const struct ice_priv_flag *priv_flag;
1135
1136                 priv_flag = &ice_gstrings_priv_flags[i];
1137
1138                 if (test_bit(priv_flag->bitno, pf->flags))
1139                         ret_flags |= BIT(i);
1140         }
1141
1142         return ret_flags;
1143 }
1144
1145 /**
1146  * ice_set_priv_flags - set private flags
1147  * @netdev: network interface device structure
1148  * @flags: bit flags to be set
1149  */
1150 static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
1151 {
1152         struct ice_netdev_priv *np = netdev_priv(netdev);
1153         DECLARE_BITMAP(change_flags, ICE_PF_FLAGS_NBITS);
1154         DECLARE_BITMAP(orig_flags, ICE_PF_FLAGS_NBITS);
1155         struct ice_vsi *vsi = np->vsi;
1156         struct ice_pf *pf = vsi->back;
1157         int ret = 0;
1158         u32 i;
1159
1160         if (flags > BIT(ICE_PRIV_FLAG_ARRAY_SIZE))
1161                 return -EINVAL;
1162
1163         set_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags);
1164
1165         bitmap_copy(orig_flags, pf->flags, ICE_PF_FLAGS_NBITS);
1166         for (i = 0; i < ICE_PRIV_FLAG_ARRAY_SIZE; i++) {
1167                 const struct ice_priv_flag *priv_flag;
1168
1169                 priv_flag = &ice_gstrings_priv_flags[i];
1170
1171                 if (flags & BIT(i))
1172                         set_bit(priv_flag->bitno, pf->flags);
1173                 else
1174                         clear_bit(priv_flag->bitno, pf->flags);
1175         }
1176
1177         bitmap_xor(change_flags, pf->flags, orig_flags, ICE_PF_FLAGS_NBITS);
1178
1179         if (test_bit(ICE_FLAG_FW_LLDP_AGENT, change_flags)) {
1180                 if (!test_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags)) {
1181                         enum ice_status status;
1182
1183                         /* Disable FW LLDP engine */
1184                         status = ice_cfg_lldp_mib_change(&pf->hw, false);
1185
1186                         /* If unregistering for LLDP events fails, this is
1187                          * not an error state, as there shouldn't be any
1188                          * events to respond to.
1189                          */
1190                         if (status)
1191                                 dev_info(&pf->pdev->dev,
1192                                          "Failed to unreg for LLDP events\n");
1193
1194                         /* The AQ call to stop the FW LLDP agent will generate
1195                          * an error if the agent is already stopped.
1196                          */
1197                         status = ice_aq_stop_lldp(&pf->hw, true, true, NULL);
1198                         if (status)
1199                                 dev_warn(&pf->pdev->dev,
1200                                          "Fail to stop LLDP agent\n");
1201                         /* Use case for having the FW LLDP agent stopped
1202                          * will likely not need DCB, so failure to init is
1203                          * not a concern of ethtool
1204                          */
1205                         status = ice_init_pf_dcb(pf, true);
1206                         if (status)
1207                                 dev_warn(&pf->pdev->dev, "Fail to init DCB\n");
1208
1209                         /* Forward LLDP packets to default VSI so that they
1210                          * are passed up the stack
1211                          */
1212                         ice_cfg_sw_lldp(vsi, false, true);
1213                 } else {
1214                         enum ice_status status;
1215                         bool dcbx_agent_status;
1216
1217                         /* AQ command to start FW LLDP agent will return an
1218                          * error if the agent is already started
1219                          */
1220                         status = ice_aq_start_lldp(&pf->hw, true, NULL);
1221                         if (status)
1222                                 dev_warn(&pf->pdev->dev,
1223                                          "Fail to start LLDP Agent\n");
1224
1225                         /* AQ command to start FW DCBX agent will fail if
1226                          * the agent is already started
1227                          */
1228                         status = ice_aq_start_stop_dcbx(&pf->hw, true,
1229                                                         &dcbx_agent_status,
1230                                                         NULL);
1231                         if (status)
1232                                 dev_dbg(&pf->pdev->dev,
1233                                         "Failed to start FW DCBX\n");
1234
1235                         dev_info(&pf->pdev->dev, "FW DCBX agent is %s\n",
1236                                  dcbx_agent_status ? "ACTIVE" : "DISABLED");
1237
1238                         /* Failure to configure MIB change or init DCB is not
1239                          * relevant to ethtool.  Print notification that
1240                          * registration/init failed but do not return error
1241                          * state to ethtool
1242                          */
1243                         status = ice_init_pf_dcb(pf, true);
1244                         if (status)
1245                                 dev_dbg(&pf->pdev->dev, "Fail to init DCB\n");
1246
1247                         /* Remove rule to direct LLDP packets to default VSI.
1248                          * The FW LLDP engine will now be consuming them.
1249                          */
1250                         ice_cfg_sw_lldp(vsi, false, false);
1251
1252                         /* Register for MIB change events */
1253                         status = ice_cfg_lldp_mib_change(&pf->hw, true);
1254                         if (status)
1255                                 dev_dbg(&pf->pdev->dev,
1256                                         "Fail to enable MIB change events\n");
1257                 }
1258         }
1259         clear_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags);
1260         return ret;
1261 }
1262
1263 static int ice_get_sset_count(struct net_device *netdev, int sset)
1264 {
1265         switch (sset) {
1266         case ETH_SS_STATS:
1267                 /* The number (and order) of strings reported *must* remain
1268                  * constant for a given netdevice. This function must not
1269                  * report a different number based on run time parameters
1270                  * (such as the number of queues in use, or the setting of
1271                  * a private ethtool flag). This is due to the nature of the
1272                  * ethtool stats API.
1273                  *
1274                  * Userspace programs such as ethtool must make 3 separate
1275                  * ioctl requests, one for size, one for the strings, and
1276                  * finally one for the stats. Since these cross into
1277                  * userspace, changes to the number or size could result in
1278                  * undefined memory access or incorrect string<->value
1279                  * correlations for statistics.
1280                  *
1281                  * Even if it appears to be safe, changes to the size or
1282                  * order of strings will suffer from race conditions and are
1283                  * not safe.
1284                  */
1285                 return ICE_ALL_STATS_LEN(netdev);
1286         case ETH_SS_TEST:
1287                 return ICE_TEST_LEN;
1288         case ETH_SS_PRIV_FLAGS:
1289                 return ICE_PRIV_FLAG_ARRAY_SIZE;
1290         default:
1291                 return -EOPNOTSUPP;
1292         }
1293 }
1294
1295 static void
1296 ice_get_ethtool_stats(struct net_device *netdev,
1297                       struct ethtool_stats __always_unused *stats, u64 *data)
1298 {
1299         struct ice_netdev_priv *np = netdev_priv(netdev);
1300         struct ice_vsi *vsi = np->vsi;
1301         struct ice_pf *pf = vsi->back;
1302         struct ice_ring *ring;
1303         unsigned int j;
1304         int i = 0;
1305         char *p;
1306
1307         ice_update_pf_stats(pf);
1308         ice_update_vsi_stats(vsi);
1309
1310         for (j = 0; j < ICE_VSI_STATS_LEN; j++) {
1311                 p = (char *)vsi + ice_gstrings_vsi_stats[j].stat_offset;
1312                 data[i++] = (ice_gstrings_vsi_stats[j].sizeof_stat ==
1313                              sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
1314         }
1315
1316         /* populate per queue stats */
1317         rcu_read_lock();
1318
1319         ice_for_each_alloc_txq(vsi, j) {
1320                 ring = READ_ONCE(vsi->tx_rings[j]);
1321                 if (ring) {
1322                         data[i++] = ring->stats.pkts;
1323                         data[i++] = ring->stats.bytes;
1324                 } else {
1325                         data[i++] = 0;
1326                         data[i++] = 0;
1327                 }
1328         }
1329
1330         ice_for_each_alloc_rxq(vsi, j) {
1331                 ring = READ_ONCE(vsi->rx_rings[j]);
1332                 if (ring) {
1333                         data[i++] = ring->stats.pkts;
1334                         data[i++] = ring->stats.bytes;
1335                 } else {
1336                         data[i++] = 0;
1337                         data[i++] = 0;
1338                 }
1339         }
1340
1341         rcu_read_unlock();
1342
1343         if (vsi->type != ICE_VSI_PF)
1344                 return;
1345
1346         for (j = 0; j < ICE_PF_STATS_LEN; j++) {
1347                 p = (char *)pf + ice_gstrings_pf_stats[j].stat_offset;
1348                 data[i++] = (ice_gstrings_pf_stats[j].sizeof_stat ==
1349                              sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
1350         }
1351
1352         for (j = 0; j < ICE_MAX_USER_PRIORITY; j++) {
1353                 data[i++] = pf->stats.priority_xon_tx[j];
1354                 data[i++] = pf->stats.priority_xoff_tx[j];
1355         }
1356
1357         for (j = 0; j < ICE_MAX_USER_PRIORITY; j++) {
1358                 data[i++] = pf->stats.priority_xon_rx[j];
1359                 data[i++] = pf->stats.priority_xoff_rx[j];
1360         }
1361 }
1362
1363 /**
1364  * ice_phy_type_to_ethtool - convert the phy_types to ethtool link modes
1365  * @netdev: network interface device structure
1366  * @ks: ethtool link ksettings struct to fill out
1367  */
1368 static void
1369 ice_phy_type_to_ethtool(struct net_device *netdev,
1370                         struct ethtool_link_ksettings *ks)
1371 {
1372         struct ice_netdev_priv *np = netdev_priv(netdev);
1373         struct ice_link_status *hw_link_info;
1374         bool need_add_adv_mode = false;
1375         struct ice_vsi *vsi = np->vsi;
1376         u64 phy_types_high;
1377         u64 phy_types_low;
1378
1379         hw_link_info = &vsi->port_info->phy.link_info;
1380         phy_types_low = vsi->port_info->phy.phy_type_low;
1381         phy_types_high = vsi->port_info->phy.phy_type_high;
1382
1383         ethtool_link_ksettings_zero_link_mode(ks, supported);
1384         ethtool_link_ksettings_zero_link_mode(ks, advertising);
1385
1386         if (phy_types_low & ICE_PHY_TYPE_LOW_100BASE_TX ||
1387             phy_types_low & ICE_PHY_TYPE_LOW_100M_SGMII) {
1388                 ethtool_link_ksettings_add_link_mode(ks, supported,
1389                                                      100baseT_Full);
1390                 if (!hw_link_info->req_speeds ||
1391                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_100MB)
1392                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1393                                                              100baseT_Full);
1394         }
1395         if (phy_types_low & ICE_PHY_TYPE_LOW_1000BASE_T ||
1396             phy_types_low & ICE_PHY_TYPE_LOW_1G_SGMII) {
1397                 ethtool_link_ksettings_add_link_mode(ks, supported,
1398                                                      1000baseT_Full);
1399                 if (!hw_link_info->req_speeds ||
1400                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_1000MB)
1401                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1402                                                              1000baseT_Full);
1403         }
1404         if (phy_types_low & ICE_PHY_TYPE_LOW_1000BASE_KX) {
1405                 ethtool_link_ksettings_add_link_mode(ks, supported,
1406                                                      1000baseKX_Full);
1407                 if (!hw_link_info->req_speeds ||
1408                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_1000MB)
1409                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1410                                                              1000baseKX_Full);
1411         }
1412         if (phy_types_low & ICE_PHY_TYPE_LOW_1000BASE_SX ||
1413             phy_types_low & ICE_PHY_TYPE_LOW_1000BASE_LX) {
1414                 ethtool_link_ksettings_add_link_mode(ks, supported,
1415                                                      1000baseX_Full);
1416                 if (!hw_link_info->req_speeds ||
1417                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_1000MB)
1418                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1419                                                              1000baseX_Full);
1420         }
1421         if (phy_types_low & ICE_PHY_TYPE_LOW_2500BASE_T) {
1422                 ethtool_link_ksettings_add_link_mode(ks, supported,
1423                                                      2500baseT_Full);
1424                 if (!hw_link_info->req_speeds ||
1425                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_2500MB)
1426                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1427                                                              2500baseT_Full);
1428         }
1429         if (phy_types_low & ICE_PHY_TYPE_LOW_2500BASE_X ||
1430             phy_types_low & ICE_PHY_TYPE_LOW_2500BASE_KX) {
1431                 ethtool_link_ksettings_add_link_mode(ks, supported,
1432                                                      2500baseX_Full);
1433                 if (!hw_link_info->req_speeds ||
1434                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_2500MB)
1435                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1436                                                              2500baseX_Full);
1437         }
1438         if (phy_types_low & ICE_PHY_TYPE_LOW_5GBASE_T ||
1439             phy_types_low & ICE_PHY_TYPE_LOW_5GBASE_KR) {
1440                 ethtool_link_ksettings_add_link_mode(ks, supported,
1441                                                      5000baseT_Full);
1442                 if (!hw_link_info->req_speeds ||
1443                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_5GB)
1444                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1445                                                              5000baseT_Full);
1446         }
1447         if (phy_types_low & ICE_PHY_TYPE_LOW_10GBASE_T ||
1448             phy_types_low & ICE_PHY_TYPE_LOW_10G_SFI_DA ||
1449             phy_types_low & ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC ||
1450             phy_types_low & ICE_PHY_TYPE_LOW_10G_SFI_C2C) {
1451                 ethtool_link_ksettings_add_link_mode(ks, supported,
1452                                                      10000baseT_Full);
1453                 if (!hw_link_info->req_speeds ||
1454                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_10GB)
1455                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1456                                                              10000baseT_Full);
1457         }
1458         if (phy_types_low & ICE_PHY_TYPE_LOW_10GBASE_KR_CR1) {
1459                 ethtool_link_ksettings_add_link_mode(ks, supported,
1460                                                      10000baseKR_Full);
1461                 if (!hw_link_info->req_speeds ||
1462                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_10GB)
1463                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1464                                                              10000baseKR_Full);
1465         }
1466         if (phy_types_low & ICE_PHY_TYPE_LOW_10GBASE_SR) {
1467                 ethtool_link_ksettings_add_link_mode(ks, supported,
1468                                                      10000baseSR_Full);
1469                 if (!hw_link_info->req_speeds ||
1470                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_10GB)
1471                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1472                                                              10000baseSR_Full);
1473         }
1474         if (phy_types_low & ICE_PHY_TYPE_LOW_10GBASE_LR) {
1475                 ethtool_link_ksettings_add_link_mode(ks, supported,
1476                                                      10000baseLR_Full);
1477                 if (!hw_link_info->req_speeds ||
1478                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_10GB)
1479                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1480                                                              10000baseLR_Full);
1481         }
1482         if (phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_T ||
1483             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_CR ||
1484             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_CR_S ||
1485             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_CR1 ||
1486             phy_types_low & ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC ||
1487             phy_types_low & ICE_PHY_TYPE_LOW_25G_AUI_C2C) {
1488                 ethtool_link_ksettings_add_link_mode(ks, supported,
1489                                                      25000baseCR_Full);
1490                 if (!hw_link_info->req_speeds ||
1491                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_25GB)
1492                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1493                                                              25000baseCR_Full);
1494         }
1495         if (phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_SR ||
1496             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_LR) {
1497                 ethtool_link_ksettings_add_link_mode(ks, supported,
1498                                                      25000baseSR_Full);
1499                 if (!hw_link_info->req_speeds ||
1500                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_25GB)
1501                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1502                                                              25000baseSR_Full);
1503         }
1504         if (phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_KR ||
1505             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_KR_S ||
1506             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_KR1) {
1507                 ethtool_link_ksettings_add_link_mode(ks, supported,
1508                                                      25000baseKR_Full);
1509                 if (!hw_link_info->req_speeds ||
1510                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_25GB)
1511                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1512                                                              25000baseKR_Full);
1513         }
1514         if (phy_types_low & ICE_PHY_TYPE_LOW_40GBASE_KR4) {
1515                 ethtool_link_ksettings_add_link_mode(ks, supported,
1516                                                      40000baseKR4_Full);
1517                 if (!hw_link_info->req_speeds ||
1518                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_40GB)
1519                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1520                                                              40000baseKR4_Full);
1521         }
1522         if (phy_types_low & ICE_PHY_TYPE_LOW_40GBASE_CR4 ||
1523             phy_types_low & ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC ||
1524             phy_types_low & ICE_PHY_TYPE_LOW_40G_XLAUI) {
1525                 ethtool_link_ksettings_add_link_mode(ks, supported,
1526                                                      40000baseCR4_Full);
1527                 if (!hw_link_info->req_speeds ||
1528                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_40GB)
1529                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1530                                                              40000baseCR4_Full);
1531         }
1532         if (phy_types_low & ICE_PHY_TYPE_LOW_40GBASE_SR4) {
1533                 ethtool_link_ksettings_add_link_mode(ks, supported,
1534                                                      40000baseSR4_Full);
1535                 if (!hw_link_info->req_speeds ||
1536                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_40GB)
1537                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1538                                                              40000baseSR4_Full);
1539         }
1540         if (phy_types_low & ICE_PHY_TYPE_LOW_40GBASE_LR4) {
1541                 ethtool_link_ksettings_add_link_mode(ks, supported,
1542                                                      40000baseLR4_Full);
1543                 if (!hw_link_info->req_speeds ||
1544                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_40GB)
1545                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1546                                                              40000baseLR4_Full);
1547         }
1548         if (phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_CR2 ||
1549             phy_types_low & ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC ||
1550             phy_types_low & ICE_PHY_TYPE_LOW_50G_LAUI2 ||
1551             phy_types_low & ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC ||
1552             phy_types_low & ICE_PHY_TYPE_LOW_50G_AUI2 ||
1553             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_CP ||
1554             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_SR ||
1555             phy_types_low & ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC ||
1556             phy_types_low & ICE_PHY_TYPE_LOW_50G_AUI1) {
1557                 ethtool_link_ksettings_add_link_mode(ks, supported,
1558                                                      50000baseCR2_Full);
1559                 if (!hw_link_info->req_speeds ||
1560                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_50GB)
1561                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1562                                                              50000baseCR2_Full);
1563         }
1564         if (phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_KR2 ||
1565             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4) {
1566                 ethtool_link_ksettings_add_link_mode(ks, supported,
1567                                                      50000baseKR2_Full);
1568                 if (!hw_link_info->req_speeds ||
1569                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_50GB)
1570                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1571                                                              50000baseKR2_Full);
1572         }
1573         if (phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_SR2 ||
1574             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_LR2 ||
1575             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_FR ||
1576             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_LR) {
1577                 ethtool_link_ksettings_add_link_mode(ks, supported,
1578                                                      50000baseSR2_Full);
1579                 if (!hw_link_info->req_speeds ||
1580                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_50GB)
1581                         ethtool_link_ksettings_add_link_mode(ks, advertising,
1582                                                              50000baseSR2_Full);
1583         }
1584         if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CR4 ||
1585             phy_types_low & ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC ||
1586             phy_types_low & ICE_PHY_TYPE_LOW_100G_CAUI4 ||
1587             phy_types_low & ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC ||
1588             phy_types_low & ICE_PHY_TYPE_LOW_100G_AUI4 ||
1589             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 ||
1590             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CP2  ||
1591             phy_types_high & ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC ||
1592             phy_types_high & ICE_PHY_TYPE_HIGH_100G_CAUI2 ||
1593             phy_types_high & ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC ||
1594             phy_types_high & ICE_PHY_TYPE_HIGH_100G_AUI2) {
1595                 ethtool_link_ksettings_add_link_mode(ks, supported,
1596                                                      100000baseCR4_Full);
1597                 if (!hw_link_info->req_speeds ||
1598                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_100GB)
1599                         need_add_adv_mode = true;
1600         }
1601         if (need_add_adv_mode) {
1602                 need_add_adv_mode = false;
1603                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1604                                                      100000baseCR4_Full);
1605         }
1606         if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_SR4 ||
1607             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_SR2) {
1608                 ethtool_link_ksettings_add_link_mode(ks, supported,
1609                                                      100000baseSR4_Full);
1610                 if (!hw_link_info->req_speeds ||
1611                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_100GB)
1612                         need_add_adv_mode = true;
1613         }
1614         if (need_add_adv_mode) {
1615                 need_add_adv_mode = false;
1616                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1617                                                      100000baseSR4_Full);
1618         }
1619         if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_LR4 ||
1620             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_DR) {
1621                 ethtool_link_ksettings_add_link_mode(ks, supported,
1622                                                      100000baseLR4_ER4_Full);
1623                 if (!hw_link_info->req_speeds ||
1624                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_100GB)
1625                         need_add_adv_mode = true;
1626         }
1627         if (need_add_adv_mode) {
1628                 need_add_adv_mode = false;
1629                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1630                                                      100000baseLR4_ER4_Full);
1631         }
1632         if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_KR4 ||
1633             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 ||
1634             phy_types_high & ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4) {
1635                 ethtool_link_ksettings_add_link_mode(ks, supported,
1636                                                      100000baseKR4_Full);
1637                 if (!hw_link_info->req_speeds ||
1638                     hw_link_info->req_speeds & ICE_AQ_LINK_SPEED_100GB)
1639                         need_add_adv_mode = true;
1640         }
1641         if (need_add_adv_mode)
1642                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1643                                                      100000baseKR4_Full);
1644
1645         /* Autoneg PHY types */
1646         if (phy_types_low & ICE_PHY_TYPE_LOW_100BASE_TX ||
1647             phy_types_low & ICE_PHY_TYPE_LOW_1000BASE_T ||
1648             phy_types_low & ICE_PHY_TYPE_LOW_1000BASE_KX ||
1649             phy_types_low & ICE_PHY_TYPE_LOW_2500BASE_T ||
1650             phy_types_low & ICE_PHY_TYPE_LOW_2500BASE_KX ||
1651             phy_types_low & ICE_PHY_TYPE_LOW_5GBASE_T ||
1652             phy_types_low & ICE_PHY_TYPE_LOW_5GBASE_KR ||
1653             phy_types_low & ICE_PHY_TYPE_LOW_10GBASE_T ||
1654             phy_types_low & ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 ||
1655             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_T ||
1656             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_CR ||
1657             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_CR_S ||
1658             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_CR1 ||
1659             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_KR ||
1660             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_KR_S ||
1661             phy_types_low & ICE_PHY_TYPE_LOW_25GBASE_KR1 ||
1662             phy_types_low & ICE_PHY_TYPE_LOW_40GBASE_CR4 ||
1663             phy_types_low & ICE_PHY_TYPE_LOW_40GBASE_KR4) {
1664                 ethtool_link_ksettings_add_link_mode(ks, supported,
1665                                                      Autoneg);
1666                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1667                                                      Autoneg);
1668         }
1669         if (phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_CR2 ||
1670             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_KR2 ||
1671             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_CP ||
1672             phy_types_low & ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4) {
1673                 ethtool_link_ksettings_add_link_mode(ks, supported,
1674                                                      Autoneg);
1675                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1676                                                      Autoneg);
1677         }
1678         if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CR4 ||
1679             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_KR4 ||
1680             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 ||
1681             phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CP2) {
1682                 ethtool_link_ksettings_add_link_mode(ks, supported,
1683                                                      Autoneg);
1684                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1685                                                      Autoneg);
1686         }
1687 }
1688
1689 #define TEST_SET_BITS_TIMEOUT   50
1690 #define TEST_SET_BITS_SLEEP_MAX 2000
1691 #define TEST_SET_BITS_SLEEP_MIN 1000
1692
1693 /**
1694  * ice_get_settings_link_up - Get Link settings for when link is up
1695  * @ks: ethtool ksettings to fill in
1696  * @netdev: network interface device structure
1697  */
1698 static void
1699 ice_get_settings_link_up(struct ethtool_link_ksettings *ks,
1700                          struct net_device *netdev)
1701 {
1702         struct ice_netdev_priv *np = netdev_priv(netdev);
1703         struct ice_port_info *pi = np->vsi->port_info;
1704         struct ethtool_link_ksettings cap_ksettings;
1705         struct ice_link_status *link_info;
1706         struct ice_vsi *vsi = np->vsi;
1707         bool unrecog_phy_high = false;
1708         bool unrecog_phy_low = false;
1709
1710         link_info = &vsi->port_info->phy.link_info;
1711
1712         /* Initialize supported and advertised settings based on PHY settings */
1713         switch (link_info->phy_type_low) {
1714         case ICE_PHY_TYPE_LOW_100BASE_TX:
1715                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1716                 ethtool_link_ksettings_add_link_mode(ks, supported,
1717                                                      100baseT_Full);
1718                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1719                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1720                                                      100baseT_Full);
1721                 break;
1722         case ICE_PHY_TYPE_LOW_100M_SGMII:
1723                 ethtool_link_ksettings_add_link_mode(ks, supported,
1724                                                      100baseT_Full);
1725                 break;
1726         case ICE_PHY_TYPE_LOW_1000BASE_T:
1727                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1728                 ethtool_link_ksettings_add_link_mode(ks, supported,
1729                                                      1000baseT_Full);
1730                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1731                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1732                                                      1000baseT_Full);
1733                 break;
1734         case ICE_PHY_TYPE_LOW_1G_SGMII:
1735                 ethtool_link_ksettings_add_link_mode(ks, supported,
1736                                                      1000baseT_Full);
1737                 break;
1738         case ICE_PHY_TYPE_LOW_1000BASE_SX:
1739         case ICE_PHY_TYPE_LOW_1000BASE_LX:
1740                 ethtool_link_ksettings_add_link_mode(ks, supported,
1741                                                      1000baseX_Full);
1742                 break;
1743         case ICE_PHY_TYPE_LOW_1000BASE_KX:
1744                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1745                 ethtool_link_ksettings_add_link_mode(ks, supported,
1746                                                      1000baseKX_Full);
1747                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1748                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1749                                                      1000baseKX_Full);
1750                 break;
1751         case ICE_PHY_TYPE_LOW_2500BASE_T:
1752                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1753                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1754                 ethtool_link_ksettings_add_link_mode(ks, supported,
1755                                                      2500baseT_Full);
1756                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1757                                                      2500baseT_Full);
1758                 break;
1759         case ICE_PHY_TYPE_LOW_2500BASE_X:
1760                 ethtool_link_ksettings_add_link_mode(ks, supported,
1761                                                      2500baseX_Full);
1762                 break;
1763         case ICE_PHY_TYPE_LOW_2500BASE_KX:
1764                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1765                 ethtool_link_ksettings_add_link_mode(ks, supported,
1766                                                      2500baseX_Full);
1767                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1768                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1769                                                      2500baseX_Full);
1770                 break;
1771         case ICE_PHY_TYPE_LOW_5GBASE_T:
1772         case ICE_PHY_TYPE_LOW_5GBASE_KR:
1773                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1774                 ethtool_link_ksettings_add_link_mode(ks, supported,
1775                                                      5000baseT_Full);
1776                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1777                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1778                                                      5000baseT_Full);
1779                 break;
1780         case ICE_PHY_TYPE_LOW_10GBASE_T:
1781                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1782                 ethtool_link_ksettings_add_link_mode(ks, supported,
1783                                                      10000baseT_Full);
1784                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1785                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1786                                                      10000baseT_Full);
1787                 break;
1788         case ICE_PHY_TYPE_LOW_10G_SFI_DA:
1789         case ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC:
1790         case ICE_PHY_TYPE_LOW_10G_SFI_C2C:
1791                 ethtool_link_ksettings_add_link_mode(ks, supported,
1792                                                      10000baseT_Full);
1793                 break;
1794         case ICE_PHY_TYPE_LOW_10GBASE_SR:
1795                 ethtool_link_ksettings_add_link_mode(ks, supported,
1796                                                      10000baseSR_Full);
1797                 break;
1798         case ICE_PHY_TYPE_LOW_10GBASE_LR:
1799                 ethtool_link_ksettings_add_link_mode(ks, supported,
1800                                                      10000baseLR_Full);
1801                 break;
1802         case ICE_PHY_TYPE_LOW_10GBASE_KR_CR1:
1803                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1804                 ethtool_link_ksettings_add_link_mode(ks, supported,
1805                                                      10000baseKR_Full);
1806                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1807                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1808                                                      10000baseKR_Full);
1809                 break;
1810         case ICE_PHY_TYPE_LOW_25GBASE_T:
1811         case ICE_PHY_TYPE_LOW_25GBASE_CR:
1812         case ICE_PHY_TYPE_LOW_25GBASE_CR_S:
1813         case ICE_PHY_TYPE_LOW_25GBASE_CR1:
1814                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1815                 ethtool_link_ksettings_add_link_mode(ks, supported,
1816                                                      25000baseCR_Full);
1817                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1818                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1819                                                      25000baseCR_Full);
1820                 break;
1821         case ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC:
1822         case ICE_PHY_TYPE_LOW_25G_AUI_C2C:
1823                 ethtool_link_ksettings_add_link_mode(ks, supported,
1824                                                      25000baseCR_Full);
1825                 break;
1826         case ICE_PHY_TYPE_LOW_25GBASE_SR:
1827         case ICE_PHY_TYPE_LOW_25GBASE_LR:
1828                 ethtool_link_ksettings_add_link_mode(ks, supported,
1829                                                      25000baseSR_Full);
1830                 break;
1831         case ICE_PHY_TYPE_LOW_25GBASE_KR:
1832         case ICE_PHY_TYPE_LOW_25GBASE_KR1:
1833         case ICE_PHY_TYPE_LOW_25GBASE_KR_S:
1834                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1835                 ethtool_link_ksettings_add_link_mode(ks, supported,
1836                                                      25000baseKR_Full);
1837                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1838                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1839                                                      25000baseKR_Full);
1840                 break;
1841         case ICE_PHY_TYPE_LOW_40GBASE_CR4:
1842                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1843                 ethtool_link_ksettings_add_link_mode(ks, supported,
1844                                                      40000baseCR4_Full);
1845                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1846                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1847                                                      40000baseCR4_Full);
1848                 break;
1849         case ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC:
1850         case ICE_PHY_TYPE_LOW_40G_XLAUI:
1851                 ethtool_link_ksettings_add_link_mode(ks, supported,
1852                                                      40000baseCR4_Full);
1853                 break;
1854         case ICE_PHY_TYPE_LOW_40GBASE_SR4:
1855                 ethtool_link_ksettings_add_link_mode(ks, supported,
1856                                                      40000baseSR4_Full);
1857                 break;
1858         case ICE_PHY_TYPE_LOW_40GBASE_LR4:
1859                 ethtool_link_ksettings_add_link_mode(ks, supported,
1860                                                      40000baseLR4_Full);
1861                 break;
1862         case ICE_PHY_TYPE_LOW_40GBASE_KR4:
1863                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1864                 ethtool_link_ksettings_add_link_mode(ks, supported,
1865                                                      40000baseKR4_Full);
1866                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1867                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1868                                                      40000baseKR4_Full);
1869                 break;
1870         case ICE_PHY_TYPE_LOW_50GBASE_CR2:
1871         case ICE_PHY_TYPE_LOW_50GBASE_CP:
1872                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1873                 ethtool_link_ksettings_add_link_mode(ks, supported,
1874                                                      50000baseCR2_Full);
1875                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1876                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1877                                                      50000baseCR2_Full);
1878                 break;
1879         case ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC:
1880         case ICE_PHY_TYPE_LOW_50G_LAUI2:
1881         case ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC:
1882         case ICE_PHY_TYPE_LOW_50G_AUI2:
1883         case ICE_PHY_TYPE_LOW_50GBASE_SR:
1884         case ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC:
1885         case ICE_PHY_TYPE_LOW_50G_AUI1:
1886                 ethtool_link_ksettings_add_link_mode(ks, supported,
1887                                                      50000baseCR2_Full);
1888                 break;
1889         case ICE_PHY_TYPE_LOW_50GBASE_KR2:
1890         case ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4:
1891                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1892                 ethtool_link_ksettings_add_link_mode(ks, supported,
1893                                                      50000baseKR2_Full);
1894                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1895                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1896                                                      50000baseKR2_Full);
1897                 break;
1898         case ICE_PHY_TYPE_LOW_50GBASE_SR2:
1899         case ICE_PHY_TYPE_LOW_50GBASE_LR2:
1900         case ICE_PHY_TYPE_LOW_50GBASE_FR:
1901         case ICE_PHY_TYPE_LOW_50GBASE_LR:
1902                 ethtool_link_ksettings_add_link_mode(ks, supported,
1903                                                      50000baseSR2_Full);
1904                 break;
1905         case ICE_PHY_TYPE_LOW_100GBASE_CR4:
1906                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1907                 ethtool_link_ksettings_add_link_mode(ks, supported,
1908                                                      100000baseCR4_Full);
1909                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1910                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1911                                                      100000baseCR4_Full);
1912                 break;
1913         case ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC:
1914         case ICE_PHY_TYPE_LOW_100G_CAUI4:
1915         case ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC:
1916         case ICE_PHY_TYPE_LOW_100G_AUI4:
1917         case ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4:
1918                 ethtool_link_ksettings_add_link_mode(ks, supported,
1919                                                      100000baseCR4_Full);
1920                 break;
1921         case ICE_PHY_TYPE_LOW_100GBASE_CP2:
1922                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1923                 ethtool_link_ksettings_add_link_mode(ks, supported,
1924                                                      100000baseCR4_Full);
1925                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1926                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1927                                                      100000baseCR4_Full);
1928                 break;
1929         case ICE_PHY_TYPE_LOW_100GBASE_SR4:
1930         case ICE_PHY_TYPE_LOW_100GBASE_SR2:
1931                 ethtool_link_ksettings_add_link_mode(ks, supported,
1932                                                      100000baseSR4_Full);
1933                 break;
1934         case ICE_PHY_TYPE_LOW_100GBASE_LR4:
1935         case ICE_PHY_TYPE_LOW_100GBASE_DR:
1936                 ethtool_link_ksettings_add_link_mode(ks, supported,
1937                                                      100000baseLR4_ER4_Full);
1938                 break;
1939         case ICE_PHY_TYPE_LOW_100GBASE_KR4:
1940         case ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4:
1941                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1942                 ethtool_link_ksettings_add_link_mode(ks, supported,
1943                                                      100000baseKR4_Full);
1944                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1945                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1946                                                      100000baseKR4_Full);
1947                 break;
1948         default:
1949                 unrecog_phy_low = true;
1950         }
1951
1952         switch (link_info->phy_type_high) {
1953         case ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4:
1954                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
1955                 ethtool_link_ksettings_add_link_mode(ks, supported,
1956                                                      100000baseKR4_Full);
1957                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
1958                 ethtool_link_ksettings_add_link_mode(ks, advertising,
1959                                                      100000baseKR4_Full);
1960                 break;
1961         case ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC:
1962         case ICE_PHY_TYPE_HIGH_100G_CAUI2:
1963         case ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC:
1964         case ICE_PHY_TYPE_HIGH_100G_AUI2:
1965                 ethtool_link_ksettings_add_link_mode(ks, supported,
1966                                                      100000baseCR4_Full);
1967                 break;
1968         default:
1969                 unrecog_phy_high = true;
1970         }
1971
1972         if (unrecog_phy_low && unrecog_phy_high) {
1973                 /* if we got here and link is up something bad is afoot */
1974                 netdev_info(netdev,
1975                             "WARNING: Unrecognized PHY_Low (0x%llx).\n",
1976                             (u64)link_info->phy_type_low);
1977                 netdev_info(netdev,
1978                             "WARNING: Unrecognized PHY_High (0x%llx).\n",
1979                             (u64)link_info->phy_type_high);
1980         }
1981
1982         /* Now that we've worked out everything that could be supported by the
1983          * current PHY type, get what is supported by the NVM and intersect
1984          * them to get what is truly supported
1985          */
1986         memset(&cap_ksettings, 0, sizeof(cap_ksettings));
1987         ice_phy_type_to_ethtool(netdev, &cap_ksettings);
1988         ethtool_intersect_link_masks(ks, &cap_ksettings);
1989
1990         switch (link_info->link_speed) {
1991         case ICE_AQ_LINK_SPEED_100GB:
1992                 ks->base.speed = SPEED_100000;
1993                 break;
1994         case ICE_AQ_LINK_SPEED_50GB:
1995                 ks->base.speed = SPEED_50000;
1996                 break;
1997         case ICE_AQ_LINK_SPEED_40GB:
1998                 ks->base.speed = SPEED_40000;
1999                 break;
2000         case ICE_AQ_LINK_SPEED_25GB:
2001                 ks->base.speed = SPEED_25000;
2002                 break;
2003         case ICE_AQ_LINK_SPEED_20GB:
2004                 ks->base.speed = SPEED_20000;
2005                 break;
2006         case ICE_AQ_LINK_SPEED_10GB:
2007                 ks->base.speed = SPEED_10000;
2008                 break;
2009         case ICE_AQ_LINK_SPEED_5GB:
2010                 ks->base.speed = SPEED_5000;
2011                 break;
2012         case ICE_AQ_LINK_SPEED_2500MB:
2013                 ks->base.speed = SPEED_2500;
2014                 break;
2015         case ICE_AQ_LINK_SPEED_1000MB:
2016                 ks->base.speed = SPEED_1000;
2017                 break;
2018         case ICE_AQ_LINK_SPEED_100MB:
2019                 ks->base.speed = SPEED_100;
2020                 break;
2021         default:
2022                 netdev_info(netdev,
2023                             "WARNING: Unrecognized link_speed (0x%x).\n",
2024                             link_info->link_speed);
2025                 break;
2026         }
2027         ks->base.duplex = DUPLEX_FULL;
2028
2029         if (link_info->an_info & ICE_AQ_AN_COMPLETED)
2030                 ethtool_link_ksettings_add_link_mode(ks, lp_advertising,
2031                                                      Autoneg);
2032
2033         /* Set flow control negotiated Rx/Tx pause */
2034         switch (pi->fc.current_mode) {
2035         case ICE_FC_FULL:
2036                 ethtool_link_ksettings_add_link_mode(ks, lp_advertising, Pause);
2037                 break;
2038         case ICE_FC_TX_PAUSE:
2039                 ethtool_link_ksettings_add_link_mode(ks, lp_advertising, Pause);
2040                 ethtool_link_ksettings_add_link_mode(ks, lp_advertising,
2041                                                      Asym_Pause);
2042                 break;
2043         case ICE_FC_RX_PAUSE:
2044                 ethtool_link_ksettings_add_link_mode(ks, lp_advertising,
2045                                                      Asym_Pause);
2046                 break;
2047         case ICE_FC_PFC:
2048                 /* fall through */
2049         default:
2050                 ethtool_link_ksettings_del_link_mode(ks, lp_advertising, Pause);
2051                 ethtool_link_ksettings_del_link_mode(ks, lp_advertising,
2052                                                      Asym_Pause);
2053                 break;
2054         }
2055 }
2056
2057 /**
2058  * ice_get_settings_link_down - Get the Link settings when link is down
2059  * @ks: ethtool ksettings to fill in
2060  * @netdev: network interface device structure
2061  *
2062  * Reports link settings that can be determined when link is down
2063  */
2064 static void
2065 ice_get_settings_link_down(struct ethtool_link_ksettings *ks,
2066                            struct net_device *netdev)
2067 {
2068         /* link is down and the driver needs to fall back on
2069          * supported PHY types to figure out what info to display
2070          */
2071         ice_phy_type_to_ethtool(netdev, ks);
2072
2073         /* With no link, speed and duplex are unknown */
2074         ks->base.speed = SPEED_UNKNOWN;
2075         ks->base.duplex = DUPLEX_UNKNOWN;
2076 }
2077
2078 /**
2079  * ice_get_link_ksettings - Get Link Speed and Duplex settings
2080  * @netdev: network interface device structure
2081  * @ks: ethtool ksettings
2082  *
2083  * Reports speed/duplex settings based on media_type
2084  */
2085 static int
2086 ice_get_link_ksettings(struct net_device *netdev,
2087                        struct ethtool_link_ksettings *ks)
2088 {
2089         struct ice_netdev_priv *np = netdev_priv(netdev);
2090         struct ice_aqc_get_phy_caps_data *caps;
2091         struct ice_link_status *hw_link_info;
2092         struct ice_vsi *vsi = np->vsi;
2093         enum ice_status status;
2094         int err = 0;
2095
2096         ethtool_link_ksettings_zero_link_mode(ks, supported);
2097         ethtool_link_ksettings_zero_link_mode(ks, advertising);
2098         ethtool_link_ksettings_zero_link_mode(ks, lp_advertising);
2099         hw_link_info = &vsi->port_info->phy.link_info;
2100
2101         /* set speed and duplex */
2102         if (hw_link_info->link_info & ICE_AQ_LINK_UP)
2103                 ice_get_settings_link_up(ks, netdev);
2104         else
2105                 ice_get_settings_link_down(ks, netdev);
2106
2107         /* set autoneg settings */
2108         ks->base.autoneg = (hw_link_info->an_info & ICE_AQ_AN_COMPLETED) ?
2109                 AUTONEG_ENABLE : AUTONEG_DISABLE;
2110
2111         /* set media type settings */
2112         switch (vsi->port_info->phy.media_type) {
2113         case ICE_MEDIA_FIBER:
2114                 ethtool_link_ksettings_add_link_mode(ks, supported, FIBRE);
2115                 ks->base.port = PORT_FIBRE;
2116                 break;
2117         case ICE_MEDIA_BASET:
2118                 ethtool_link_ksettings_add_link_mode(ks, supported, TP);
2119                 ethtool_link_ksettings_add_link_mode(ks, advertising, TP);
2120                 ks->base.port = PORT_TP;
2121                 break;
2122         case ICE_MEDIA_BACKPLANE:
2123                 ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
2124                 ethtool_link_ksettings_add_link_mode(ks, supported, Backplane);
2125                 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
2126                 ethtool_link_ksettings_add_link_mode(ks, advertising,
2127                                                      Backplane);
2128                 ks->base.port = PORT_NONE;
2129                 break;
2130         case ICE_MEDIA_DA:
2131                 ethtool_link_ksettings_add_link_mode(ks, supported, FIBRE);
2132                 ethtool_link_ksettings_add_link_mode(ks, advertising, FIBRE);
2133                 ks->base.port = PORT_DA;
2134                 break;
2135         default:
2136                 ks->base.port = PORT_OTHER;
2137                 break;
2138         }
2139
2140         /* flow control is symmetric and always supported */
2141         ethtool_link_ksettings_add_link_mode(ks, supported, Pause);
2142
2143         caps = devm_kzalloc(&vsi->back->pdev->dev, sizeof(*caps), GFP_KERNEL);
2144         if (!caps)
2145                 return -ENOMEM;
2146
2147         status = ice_aq_get_phy_caps(vsi->port_info, false,
2148                                      ICE_AQC_REPORT_SW_CFG, caps, NULL);
2149         if (status) {
2150                 err = -EIO;
2151                 goto done;
2152         }
2153
2154         /* Set the advertised flow control based on the PHY capability */
2155         if ((caps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) &&
2156             (caps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE)) {
2157                 ethtool_link_ksettings_add_link_mode(ks, advertising, Pause);
2158                 ethtool_link_ksettings_add_link_mode(ks, advertising,
2159                                                      Asym_Pause);
2160         } else if (caps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) {
2161                 ethtool_link_ksettings_add_link_mode(ks, advertising,
2162                                                      Asym_Pause);
2163         } else if (caps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE) {
2164                 ethtool_link_ksettings_add_link_mode(ks, advertising, Pause);
2165                 ethtool_link_ksettings_add_link_mode(ks, advertising,
2166                                                      Asym_Pause);
2167         } else {
2168                 ethtool_link_ksettings_del_link_mode(ks, advertising, Pause);
2169                 ethtool_link_ksettings_del_link_mode(ks, advertising,
2170                                                      Asym_Pause);
2171         }
2172
2173         /* Set advertised FEC modes based on PHY capability */
2174         ethtool_link_ksettings_add_link_mode(ks, advertising, FEC_NONE);
2175
2176         if (caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ ||
2177             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_REQ)
2178                 ethtool_link_ksettings_add_link_mode(ks, advertising,
2179                                                      FEC_BASER);
2180         if (caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_528_REQ ||
2181             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_544_REQ)
2182                 ethtool_link_ksettings_add_link_mode(ks, advertising, FEC_RS);
2183
2184         status = ice_aq_get_phy_caps(vsi->port_info, false,
2185                                      ICE_AQC_REPORT_TOPO_CAP, caps, NULL);
2186         if (status) {
2187                 err = -EIO;
2188                 goto done;
2189         }
2190
2191         /* Set supported FEC modes based on PHY capability */
2192         ethtool_link_ksettings_add_link_mode(ks, supported, FEC_NONE);
2193
2194         if (caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN ||
2195             caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN)
2196                 ethtool_link_ksettings_add_link_mode(ks, supported, FEC_BASER);
2197         if (caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN)
2198                 ethtool_link_ksettings_add_link_mode(ks, supported, FEC_RS);
2199
2200 done:
2201         devm_kfree(&vsi->back->pdev->dev, caps);
2202         return err;
2203 }
2204
2205 /**
2206  * ice_ksettings_find_adv_link_speed - Find advertising link speed
2207  * @ks: ethtool ksettings
2208  */
2209 static u16
2210 ice_ksettings_find_adv_link_speed(const struct ethtool_link_ksettings *ks)
2211 {
2212         u16 adv_link_speed = 0;
2213
2214         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2215                                                   100baseT_Full))
2216                 adv_link_speed |= ICE_AQ_LINK_SPEED_100MB;
2217         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2218                                                   1000baseX_Full))
2219                 adv_link_speed |= ICE_AQ_LINK_SPEED_1000MB;
2220         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2221                                                   1000baseT_Full) ||
2222             ethtool_link_ksettings_test_link_mode(ks, advertising,
2223                                                   1000baseKX_Full))
2224                 adv_link_speed |= ICE_AQ_LINK_SPEED_1000MB;
2225         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2226                                                   2500baseT_Full))
2227                 adv_link_speed |= ICE_AQ_LINK_SPEED_2500MB;
2228         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2229                                                   2500baseX_Full))
2230                 adv_link_speed |= ICE_AQ_LINK_SPEED_2500MB;
2231         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2232                                                   5000baseT_Full))
2233                 adv_link_speed |= ICE_AQ_LINK_SPEED_5GB;
2234         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2235                                                   10000baseT_Full) ||
2236             ethtool_link_ksettings_test_link_mode(ks, advertising,
2237                                                   10000baseKR_Full))
2238                 adv_link_speed |= ICE_AQ_LINK_SPEED_10GB;
2239         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2240                                                   10000baseSR_Full) ||
2241             ethtool_link_ksettings_test_link_mode(ks, advertising,
2242                                                   10000baseLR_Full))
2243                 adv_link_speed |= ICE_AQ_LINK_SPEED_10GB;
2244         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2245                                                   25000baseCR_Full) ||
2246             ethtool_link_ksettings_test_link_mode(ks, advertising,
2247                                                   25000baseSR_Full) ||
2248             ethtool_link_ksettings_test_link_mode(ks, advertising,
2249                                                   25000baseKR_Full))
2250                 adv_link_speed |= ICE_AQ_LINK_SPEED_25GB;
2251         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2252                                                   40000baseCR4_Full) ||
2253             ethtool_link_ksettings_test_link_mode(ks, advertising,
2254                                                   40000baseSR4_Full) ||
2255             ethtool_link_ksettings_test_link_mode(ks, advertising,
2256                                                   40000baseLR4_Full) ||
2257             ethtool_link_ksettings_test_link_mode(ks, advertising,
2258                                                   40000baseKR4_Full))
2259                 adv_link_speed |= ICE_AQ_LINK_SPEED_40GB;
2260         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2261                                                   50000baseCR2_Full) ||
2262             ethtool_link_ksettings_test_link_mode(ks, advertising,
2263                                                   50000baseKR2_Full))
2264                 adv_link_speed |= ICE_AQ_LINK_SPEED_50GB;
2265         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2266                                                   50000baseSR2_Full))
2267                 adv_link_speed |= ICE_AQ_LINK_SPEED_50GB;
2268         if (ethtool_link_ksettings_test_link_mode(ks, advertising,
2269                                                   100000baseCR4_Full) ||
2270             ethtool_link_ksettings_test_link_mode(ks, advertising,
2271                                                   100000baseSR4_Full) ||
2272             ethtool_link_ksettings_test_link_mode(ks, advertising,
2273                                                   100000baseLR4_ER4_Full) ||
2274             ethtool_link_ksettings_test_link_mode(ks, advertising,
2275                                                   100000baseKR4_Full))
2276                 adv_link_speed |= ICE_AQ_LINK_SPEED_100GB;
2277
2278         return adv_link_speed;
2279 }
2280
2281 /**
2282  * ice_setup_autoneg
2283  * @p: port info
2284  * @ks: ethtool_link_ksettings
2285  * @config: configuration that will be sent down to FW
2286  * @autoneg_enabled: autonegotiation is enabled or not
2287  * @autoneg_changed: will there a change in autonegotiation
2288  * @netdev: network interface device structure
2289  *
2290  * Setup PHY autonegotiation feature
2291  */
2292 static int
2293 ice_setup_autoneg(struct ice_port_info *p, struct ethtool_link_ksettings *ks,
2294                   struct ice_aqc_set_phy_cfg_data *config,
2295                   u8 autoneg_enabled, u8 *autoneg_changed,
2296                   struct net_device *netdev)
2297 {
2298         int err = 0;
2299
2300         *autoneg_changed = 0;
2301
2302         /* Check autoneg */
2303         if (autoneg_enabled == AUTONEG_ENABLE) {
2304                 /* If autoneg was not already enabled */
2305                 if (!(p->phy.link_info.an_info & ICE_AQ_AN_COMPLETED)) {
2306                         /* If autoneg is not supported, return error */
2307                         if (!ethtool_link_ksettings_test_link_mode(ks,
2308                                                                    supported,
2309                                                                    Autoneg)) {
2310                                 netdev_info(netdev, "Autoneg not supported on this phy.\n");
2311                                 err = -EINVAL;
2312                         } else {
2313                                 /* Autoneg is allowed to change */
2314                                 config->caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
2315                                 *autoneg_changed = 1;
2316                         }
2317                 }
2318         } else {
2319                 /* If autoneg is currently enabled */
2320                 if (p->phy.link_info.an_info & ICE_AQ_AN_COMPLETED) {
2321                         /* If autoneg is supported 10GBASE_T is the only PHY
2322                          * that can disable it, so otherwise return error
2323                          */
2324                         if (ethtool_link_ksettings_test_link_mode(ks,
2325                                                                   supported,
2326                                                                   Autoneg)) {
2327                                 netdev_info(netdev, "Autoneg cannot be disabled on this phy\n");
2328                                 err = -EINVAL;
2329                         } else {
2330                                 /* Autoneg is allowed to change */
2331                                 config->caps &= ~ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
2332                                 *autoneg_changed = 1;
2333                         }
2334                 }
2335         }
2336
2337         return err;
2338 }
2339
2340 /**
2341  * ice_set_link_ksettings - Set Speed and Duplex
2342  * @netdev: network interface device structure
2343  * @ks: ethtool ksettings
2344  *
2345  * Set speed/duplex per media_types advertised/forced
2346  */
2347 static int
2348 ice_set_link_ksettings(struct net_device *netdev,
2349                        const struct ethtool_link_ksettings *ks)
2350 {
2351         u8 autoneg, timeout = TEST_SET_BITS_TIMEOUT, lport = 0;
2352         struct ice_netdev_priv *np = netdev_priv(netdev);
2353         struct ethtool_link_ksettings safe_ks, copy_ks;
2354         struct ice_aqc_get_phy_caps_data *abilities;
2355         u16 adv_link_speed, curr_link_speed, idx;
2356         struct ice_aqc_set_phy_cfg_data config;
2357         struct ice_pf *pf = np->vsi->back;
2358         struct ice_port_info *p;
2359         u8 autoneg_changed = 0;
2360         enum ice_status status;
2361         u64 phy_type_high;
2362         u64 phy_type_low;
2363         int err = 0;
2364         bool linkup;
2365
2366         p = np->vsi->port_info;
2367
2368         if (!p)
2369                 return -EOPNOTSUPP;
2370
2371         /* Check if this is LAN VSI */
2372         ice_for_each_vsi(pf, idx)
2373                 if (pf->vsi[idx]->type == ICE_VSI_PF) {
2374                         if (np->vsi != pf->vsi[idx])
2375                                 return -EOPNOTSUPP;
2376                         break;
2377                 }
2378
2379         if (p->phy.media_type != ICE_MEDIA_BASET &&
2380             p->phy.media_type != ICE_MEDIA_FIBER &&
2381             p->phy.media_type != ICE_MEDIA_BACKPLANE &&
2382             p->phy.media_type != ICE_MEDIA_DA &&
2383             p->phy.link_info.link_info & ICE_AQ_LINK_UP)
2384                 return -EOPNOTSUPP;
2385
2386         /* copy the ksettings to copy_ks to avoid modifying the original */
2387         memcpy(&copy_ks, ks, sizeof(copy_ks));
2388
2389         /* save autoneg out of ksettings */
2390         autoneg = copy_ks.base.autoneg;
2391
2392         memset(&safe_ks, 0, sizeof(safe_ks));
2393
2394         /* Get link modes supported by hardware.*/
2395         ice_phy_type_to_ethtool(netdev, &safe_ks);
2396
2397         /* and check against modes requested by user.
2398          * Return an error if unsupported mode was set.
2399          */
2400         if (!bitmap_subset(copy_ks.link_modes.advertising,
2401                            safe_ks.link_modes.supported,
2402                            __ETHTOOL_LINK_MODE_MASK_NBITS))
2403                 return -EINVAL;
2404
2405         /* get our own copy of the bits to check against */
2406         memset(&safe_ks, 0, sizeof(safe_ks));
2407         safe_ks.base.cmd = copy_ks.base.cmd;
2408         safe_ks.base.link_mode_masks_nwords =
2409                 copy_ks.base.link_mode_masks_nwords;
2410         ice_get_link_ksettings(netdev, &safe_ks);
2411
2412         /* set autoneg back to what it currently is */
2413         copy_ks.base.autoneg = safe_ks.base.autoneg;
2414         /* we don't compare the speed */
2415         copy_ks.base.speed = safe_ks.base.speed;
2416
2417         /* If copy_ks.base and safe_ks.base are not the same now, then they are
2418          * trying to set something that we do not support.
2419          */
2420         if (memcmp(&copy_ks.base, &safe_ks.base, sizeof(copy_ks.base)))
2421                 return -EOPNOTSUPP;
2422
2423         while (test_and_set_bit(__ICE_CFG_BUSY, pf->state)) {
2424                 timeout--;
2425                 if (!timeout)
2426                         return -EBUSY;
2427                 usleep_range(TEST_SET_BITS_SLEEP_MIN, TEST_SET_BITS_SLEEP_MAX);
2428         }
2429
2430         abilities = devm_kzalloc(&pf->pdev->dev, sizeof(*abilities),
2431                                  GFP_KERNEL);
2432         if (!abilities)
2433                 return -ENOMEM;
2434
2435         /* Get the current PHY config */
2436         status = ice_aq_get_phy_caps(p, false, ICE_AQC_REPORT_SW_CFG, abilities,
2437                                      NULL);
2438         if (status) {
2439                 err = -EAGAIN;
2440                 goto done;
2441         }
2442
2443         /* Copy abilities to config in case autoneg is not set below */
2444         memset(&config, 0, sizeof(config));
2445         config.caps = abilities->caps & ~ICE_AQC_PHY_AN_MODE;
2446         if (abilities->caps & ICE_AQC_PHY_AN_MODE)
2447                 config.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
2448
2449         /* Check autoneg */
2450         err = ice_setup_autoneg(p, &safe_ks, &config, autoneg, &autoneg_changed,
2451                                 netdev);
2452
2453         if (err)
2454                 goto done;
2455
2456         /* Call to get the current link speed */
2457         p->phy.get_link_info = true;
2458         status = ice_get_link_status(p, &linkup);
2459         if (status) {
2460                 err = -EAGAIN;
2461                 goto done;
2462         }
2463
2464         curr_link_speed = p->phy.link_info.link_speed;
2465         adv_link_speed = ice_ksettings_find_adv_link_speed(ks);
2466
2467         /* If speed didn't get set, set it to what it currently is.
2468          * This is needed because if advertise is 0 (as it is when autoneg
2469          * is disabled) then speed won't get set.
2470          */
2471         if (!adv_link_speed)
2472                 adv_link_speed = curr_link_speed;
2473
2474         /* Convert the advertise link speeds to their corresponded PHY_TYPE */
2475         ice_update_phy_type(&phy_type_low, &phy_type_high, adv_link_speed);
2476
2477         if (!autoneg_changed && adv_link_speed == curr_link_speed) {
2478                 netdev_info(netdev, "Nothing changed, exiting without setting anything.\n");
2479                 goto done;
2480         }
2481
2482         /* copy over the rest of the abilities */
2483         config.low_power_ctrl = abilities->low_power_ctrl;
2484         config.eee_cap = abilities->eee_cap;
2485         config.eeer_value = abilities->eeer_value;
2486         config.link_fec_opt = abilities->link_fec_options;
2487
2488         /* save the requested speeds */
2489         p->phy.link_info.req_speeds = adv_link_speed;
2490
2491         /* set link and auto negotiation so changes take effect */
2492         config.caps |= ICE_AQ_PHY_ENA_LINK;
2493
2494         if (phy_type_low || phy_type_high) {
2495                 config.phy_type_high = cpu_to_le64(phy_type_high) &
2496                         abilities->phy_type_high;
2497                 config.phy_type_low = cpu_to_le64(phy_type_low) &
2498                         abilities->phy_type_low;
2499         } else {
2500                 err = -EAGAIN;
2501                 netdev_info(netdev, "Nothing changed. No PHY_TYPE is corresponded to advertised link speed.\n");
2502                 goto done;
2503         }
2504
2505         /* If link is up put link down */
2506         if (p->phy.link_info.link_info & ICE_AQ_LINK_UP) {
2507                 /* Tell the OS link is going down, the link will go
2508                  * back up when fw says it is ready asynchronously
2509                  */
2510                 ice_print_link_msg(np->vsi, false);
2511                 netif_carrier_off(netdev);
2512                 netif_tx_stop_all_queues(netdev);
2513         }
2514
2515         /* make the aq call */
2516         status = ice_aq_set_phy_cfg(&pf->hw, lport, &config, NULL);
2517         if (status) {
2518                 netdev_info(netdev, "Set phy config failed,\n");
2519                 err = -EAGAIN;
2520         }
2521
2522 done:
2523         devm_kfree(&pf->pdev->dev, abilities);
2524         clear_bit(__ICE_CFG_BUSY, pf->state);
2525
2526         return err;
2527 }
2528
2529 /**
2530  * ice_get_rxnfc - command to get Rx flow classification rules
2531  * @netdev: network interface device structure
2532  * @cmd: ethtool rxnfc command
2533  * @rule_locs: buffer to rturn Rx flow classification rules
2534  *
2535  * Returns Success if the command is supported.
2536  */
2537 static int
2538 ice_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd,
2539               u32 __always_unused *rule_locs)
2540 {
2541         struct ice_netdev_priv *np = netdev_priv(netdev);
2542         struct ice_vsi *vsi = np->vsi;
2543         int ret = -EOPNOTSUPP;
2544
2545         switch (cmd->cmd) {
2546         case ETHTOOL_GRXRINGS:
2547                 cmd->data = vsi->rss_size;
2548                 ret = 0;
2549                 break;
2550         default:
2551                 break;
2552         }
2553
2554         return ret;
2555 }
2556
2557 static void
2558 ice_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
2559 {
2560         struct ice_netdev_priv *np = netdev_priv(netdev);
2561         struct ice_vsi *vsi = np->vsi;
2562
2563         ring->rx_max_pending = ICE_MAX_NUM_DESC;
2564         ring->tx_max_pending = ICE_MAX_NUM_DESC;
2565         ring->rx_pending = vsi->rx_rings[0]->count;
2566         ring->tx_pending = vsi->tx_rings[0]->count;
2567
2568         /* Rx mini and jumbo rings are not supported */
2569         ring->rx_mini_max_pending = 0;
2570         ring->rx_jumbo_max_pending = 0;
2571         ring->rx_mini_pending = 0;
2572         ring->rx_jumbo_pending = 0;
2573 }
2574
2575 static int
2576 ice_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
2577 {
2578         struct ice_ring *tx_rings = NULL, *rx_rings = NULL;
2579         struct ice_netdev_priv *np = netdev_priv(netdev);
2580         struct ice_vsi *vsi = np->vsi;
2581         struct ice_pf *pf = vsi->back;
2582         int i, timeout = 50, err = 0;
2583         u32 new_rx_cnt, new_tx_cnt;
2584
2585         if (ring->tx_pending > ICE_MAX_NUM_DESC ||
2586             ring->tx_pending < ICE_MIN_NUM_DESC ||
2587             ring->rx_pending > ICE_MAX_NUM_DESC ||
2588             ring->rx_pending < ICE_MIN_NUM_DESC) {
2589                 netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d] (increment %d)\n",
2590                            ring->tx_pending, ring->rx_pending,
2591                            ICE_MIN_NUM_DESC, ICE_MAX_NUM_DESC,
2592                            ICE_REQ_DESC_MULTIPLE);
2593                 return -EINVAL;
2594         }
2595
2596         new_tx_cnt = ALIGN(ring->tx_pending, ICE_REQ_DESC_MULTIPLE);
2597         if (new_tx_cnt != ring->tx_pending)
2598                 netdev_info(netdev,
2599                             "Requested Tx descriptor count rounded up to %d\n",
2600                             new_tx_cnt);
2601         new_rx_cnt = ALIGN(ring->rx_pending, ICE_REQ_DESC_MULTIPLE);
2602         if (new_rx_cnt != ring->rx_pending)
2603                 netdev_info(netdev,
2604                             "Requested Rx descriptor count rounded up to %d\n",
2605                             new_rx_cnt);
2606
2607         /* if nothing to do return success */
2608         if (new_tx_cnt == vsi->tx_rings[0]->count &&
2609             new_rx_cnt == vsi->rx_rings[0]->count) {
2610                 netdev_dbg(netdev, "Nothing to change, descriptor count is same as requested\n");
2611                 return 0;
2612         }
2613
2614         while (test_and_set_bit(__ICE_CFG_BUSY, pf->state)) {
2615                 timeout--;
2616                 if (!timeout)
2617                         return -EBUSY;
2618                 usleep_range(1000, 2000);
2619         }
2620
2621         /* set for the next time the netdev is started */
2622         if (!netif_running(vsi->netdev)) {
2623                 for (i = 0; i < vsi->alloc_txq; i++)
2624                         vsi->tx_rings[i]->count = new_tx_cnt;
2625                 for (i = 0; i < vsi->alloc_rxq; i++)
2626                         vsi->rx_rings[i]->count = new_rx_cnt;
2627                 netdev_dbg(netdev, "Link is down, descriptor count change happens when link is brought up\n");
2628                 goto done;
2629         }
2630
2631         if (new_tx_cnt == vsi->tx_rings[0]->count)
2632                 goto process_rx;
2633
2634         /* alloc updated Tx resources */
2635         netdev_info(netdev, "Changing Tx descriptor count from %d to %d\n",
2636                     vsi->tx_rings[0]->count, new_tx_cnt);
2637
2638         tx_rings = devm_kcalloc(&pf->pdev->dev, vsi->alloc_txq,
2639                                 sizeof(*tx_rings), GFP_KERNEL);
2640         if (!tx_rings) {
2641                 err = -ENOMEM;
2642                 goto done;
2643         }
2644
2645         for (i = 0; i < vsi->alloc_txq; i++) {
2646                 /* clone ring and setup updated count */
2647                 tx_rings[i] = *vsi->tx_rings[i];
2648                 tx_rings[i].count = new_tx_cnt;
2649                 tx_rings[i].desc = NULL;
2650                 tx_rings[i].tx_buf = NULL;
2651                 err = ice_setup_tx_ring(&tx_rings[i]);
2652                 if (err) {
2653                         while (i) {
2654                                 i--;
2655                                 ice_clean_tx_ring(&tx_rings[i]);
2656                         }
2657                         devm_kfree(&pf->pdev->dev, tx_rings);
2658                         goto done;
2659                 }
2660         }
2661
2662 process_rx:
2663         if (new_rx_cnt == vsi->rx_rings[0]->count)
2664                 goto process_link;
2665
2666         /* alloc updated Rx resources */
2667         netdev_info(netdev, "Changing Rx descriptor count from %d to %d\n",
2668                     vsi->rx_rings[0]->count, new_rx_cnt);
2669
2670         rx_rings = devm_kcalloc(&pf->pdev->dev, vsi->alloc_rxq,
2671                                 sizeof(*rx_rings), GFP_KERNEL);
2672         if (!rx_rings) {
2673                 err = -ENOMEM;
2674                 goto done;
2675         }
2676
2677         for (i = 0; i < vsi->alloc_rxq; i++) {
2678                 /* clone ring and setup updated count */
2679                 rx_rings[i] = *vsi->rx_rings[i];
2680                 rx_rings[i].count = new_rx_cnt;
2681                 rx_rings[i].desc = NULL;
2682                 rx_rings[i].rx_buf = NULL;
2683                 /* this is to allow wr32 to have something to write to
2684                  * during early allocation of Rx buffers
2685                  */
2686                 rx_rings[i].tail = vsi->back->hw.hw_addr + PRTGEN_STATUS;
2687
2688                 err = ice_setup_rx_ring(&rx_rings[i]);
2689                 if (err)
2690                         goto rx_unwind;
2691
2692                 /* allocate Rx buffers */
2693                 err = ice_alloc_rx_bufs(&rx_rings[i],
2694                                         ICE_DESC_UNUSED(&rx_rings[i]));
2695 rx_unwind:
2696                 if (err) {
2697                         while (i) {
2698                                 i--;
2699                                 ice_free_rx_ring(&rx_rings[i]);
2700                         }
2701                         devm_kfree(&pf->pdev->dev, rx_rings);
2702                         err = -ENOMEM;
2703                         goto free_tx;
2704                 }
2705         }
2706
2707 process_link:
2708         /* Bring interface down, copy in the new ring info, then restore the
2709          * interface. if VSI is up, bring it down and then back up
2710          */
2711         if (!test_and_set_bit(__ICE_DOWN, vsi->state)) {
2712                 ice_down(vsi);
2713
2714                 if (tx_rings) {
2715                         for (i = 0; i < vsi->alloc_txq; i++) {
2716                                 ice_free_tx_ring(vsi->tx_rings[i]);
2717                                 *vsi->tx_rings[i] = tx_rings[i];
2718                         }
2719                         devm_kfree(&pf->pdev->dev, tx_rings);
2720                 }
2721
2722                 if (rx_rings) {
2723                         for (i = 0; i < vsi->alloc_rxq; i++) {
2724                                 ice_free_rx_ring(vsi->rx_rings[i]);
2725                                 /* copy the real tail offset */
2726                                 rx_rings[i].tail = vsi->rx_rings[i]->tail;
2727                                 /* this is to fake out the allocation routine
2728                                  * into thinking it has to realloc everything
2729                                  * but the recycling logic will let us re-use
2730                                  * the buffers allocated above
2731                                  */
2732                                 rx_rings[i].next_to_use = 0;
2733                                 rx_rings[i].next_to_clean = 0;
2734                                 rx_rings[i].next_to_alloc = 0;
2735                                 *vsi->rx_rings[i] = rx_rings[i];
2736                         }
2737                         devm_kfree(&pf->pdev->dev, rx_rings);
2738                 }
2739
2740                 ice_up(vsi);
2741         }
2742         goto done;
2743
2744 free_tx:
2745         /* error cleanup if the Rx allocations failed after getting Tx */
2746         if (tx_rings) {
2747                 for (i = 0; i < vsi->alloc_txq; i++)
2748                         ice_free_tx_ring(&tx_rings[i]);
2749                 devm_kfree(&pf->pdev->dev, tx_rings);
2750         }
2751
2752 done:
2753         clear_bit(__ICE_CFG_BUSY, pf->state);
2754         return err;
2755 }
2756
2757 static int ice_nway_reset(struct net_device *netdev)
2758 {
2759         /* restart autonegotiation */
2760         struct ice_netdev_priv *np = netdev_priv(netdev);
2761         struct ice_vsi *vsi = np->vsi;
2762         struct ice_port_info *pi;
2763         enum ice_status status;
2764
2765         pi = vsi->port_info;
2766         /* If VSI state is up, then restart autoneg with link up */
2767         if (!test_bit(__ICE_DOWN, vsi->back->state))
2768                 status = ice_aq_set_link_restart_an(pi, true, NULL);
2769         else
2770                 status = ice_aq_set_link_restart_an(pi, false, NULL);
2771
2772         if (status) {
2773                 netdev_info(netdev, "link restart failed, err %d aq_err %d\n",
2774                             status, pi->hw->adminq.sq_last_status);
2775                 return -EIO;
2776         }
2777
2778         return 0;
2779 }
2780
2781 /**
2782  * ice_get_pauseparam - Get Flow Control status
2783  * @netdev: network interface device structure
2784  * @pause: ethernet pause (flow control) parameters
2785  *
2786  * Get requested flow control status from PHY capability.
2787  * If autoneg is true, then ethtool will send the ETHTOOL_GSET ioctl which
2788  * is handled by ice_get_link_ksettings. ice_get_link_ksettings will report
2789  * the negotiated Rx/Tx pause via lp_advertising.
2790  */
2791 static void
2792 ice_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
2793 {
2794         struct ice_netdev_priv *np = netdev_priv(netdev);
2795         struct ice_port_info *pi = np->vsi->port_info;
2796         struct ice_aqc_get_phy_caps_data *pcaps;
2797         struct ice_vsi *vsi = np->vsi;
2798         struct ice_dcbx_cfg *dcbx_cfg;
2799         enum ice_status status;
2800
2801         /* Initialize pause params */
2802         pause->rx_pause = 0;
2803         pause->tx_pause = 0;
2804
2805         dcbx_cfg = &pi->local_dcbx_cfg;
2806
2807         pcaps = devm_kzalloc(&vsi->back->pdev->dev, sizeof(*pcaps),
2808                              GFP_KERNEL);
2809         if (!pcaps)
2810                 return;
2811
2812         /* Get current PHY config */
2813         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG, pcaps,
2814                                      NULL);
2815         if (status)
2816                 goto out;
2817
2818         pause->autoneg = ((pcaps->caps & ICE_AQC_PHY_AN_MODE) ?
2819                         AUTONEG_ENABLE : AUTONEG_DISABLE);
2820
2821         if (dcbx_cfg->pfc.pfcena)
2822                 /* PFC enabled so report LFC as off */
2823                 goto out;
2824
2825         if (pcaps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE)
2826                 pause->tx_pause = 1;
2827         if (pcaps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE)
2828                 pause->rx_pause = 1;
2829
2830 out:
2831         devm_kfree(&vsi->back->pdev->dev, pcaps);
2832 }
2833
2834 /**
2835  * ice_set_pauseparam - Set Flow Control parameter
2836  * @netdev: network interface device structure
2837  * @pause: return Tx/Rx flow control status
2838  */
2839 static int
2840 ice_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
2841 {
2842         struct ice_netdev_priv *np = netdev_priv(netdev);
2843         struct ice_aqc_get_phy_caps_data *pcaps;
2844         struct ice_link_status *hw_link_info;
2845         struct ice_pf *pf = np->vsi->back;
2846         struct ice_dcbx_cfg *dcbx_cfg;
2847         struct ice_vsi *vsi = np->vsi;
2848         struct ice_hw *hw = &pf->hw;
2849         struct ice_port_info *pi;
2850         enum ice_status status;
2851         u8 aq_failures;
2852         bool link_up;
2853         int err = 0;
2854         u32 is_an;
2855
2856         pi = vsi->port_info;
2857         hw_link_info = &pi->phy.link_info;
2858         dcbx_cfg = &pi->local_dcbx_cfg;
2859         link_up = hw_link_info->link_info & ICE_AQ_LINK_UP;
2860
2861         /* Changing the port's flow control is not supported if this isn't the
2862          * PF VSI
2863          */
2864         if (vsi->type != ICE_VSI_PF) {
2865                 netdev_info(netdev, "Changing flow control parameters only supported for PF VSI\n");
2866                 return -EOPNOTSUPP;
2867         }
2868
2869         /* Get pause param reports configured and negotiated flow control pause
2870          * when ETHTOOL_GLINKSETTINGS is defined. Since ETHTOOL_GLINKSETTINGS is
2871          * defined get pause param pause->autoneg reports SW configured setting,
2872          * so compare pause->autoneg with SW configured to prevent the user from
2873          * using set pause param to chance autoneg.
2874          */
2875         pcaps = kzalloc(sizeof(*pcaps), GFP_KERNEL);
2876         if (!pcaps)
2877                 return -ENOMEM;
2878
2879         /* Get current PHY config */
2880         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG, pcaps,
2881                                      NULL);
2882         if (status) {
2883                 kfree(pcaps);
2884                 return -EIO;
2885         }
2886
2887         is_an = ((pcaps->caps & ICE_AQC_PHY_AN_MODE) ?
2888                         AUTONEG_ENABLE : AUTONEG_DISABLE);
2889
2890         kfree(pcaps);
2891
2892         if (pause->autoneg != is_an) {
2893                 netdev_info(netdev, "To change autoneg please use: ethtool -s <dev> autoneg <on|off>\n");
2894                 return -EOPNOTSUPP;
2895         }
2896
2897         /* If we have link and don't have autoneg */
2898         if (!test_bit(__ICE_DOWN, pf->state) &&
2899             !(hw_link_info->an_info & ICE_AQ_AN_COMPLETED)) {
2900                 /* Send message that it might not necessarily work*/
2901                 netdev_info(netdev, "Autoneg did not complete so changing settings may not result in an actual change.\n");
2902         }
2903
2904         if (dcbx_cfg->pfc.pfcena) {
2905                 netdev_info(netdev, "Priority flow control enabled. Cannot set link flow control.\n");
2906                 return -EOPNOTSUPP;
2907         }
2908         if (pause->rx_pause && pause->tx_pause)
2909                 pi->fc.req_mode = ICE_FC_FULL;
2910         else if (pause->rx_pause && !pause->tx_pause)
2911                 pi->fc.req_mode = ICE_FC_RX_PAUSE;
2912         else if (!pause->rx_pause && pause->tx_pause)
2913                 pi->fc.req_mode = ICE_FC_TX_PAUSE;
2914         else if (!pause->rx_pause && !pause->tx_pause)
2915                 pi->fc.req_mode = ICE_FC_NONE;
2916         else
2917                 return -EINVAL;
2918
2919         /* Set the FC mode and only restart AN if link is up */
2920         status = ice_set_fc(pi, &aq_failures, link_up);
2921
2922         if (aq_failures & ICE_SET_FC_AQ_FAIL_GET) {
2923                 netdev_info(netdev, "Set fc failed on the get_phy_capabilities call with err %d aq_err %d\n",
2924                             status, hw->adminq.sq_last_status);
2925                 err = -EAGAIN;
2926         } else if (aq_failures & ICE_SET_FC_AQ_FAIL_SET) {
2927                 netdev_info(netdev, "Set fc failed on the set_phy_config call with err %d aq_err %d\n",
2928                             status, hw->adminq.sq_last_status);
2929                 err = -EAGAIN;
2930         } else if (aq_failures & ICE_SET_FC_AQ_FAIL_UPDATE) {
2931                 netdev_info(netdev, "Set fc failed on the get_link_info call with err %d aq_err %d\n",
2932                             status, hw->adminq.sq_last_status);
2933                 err = -EAGAIN;
2934         }
2935
2936         if (!test_bit(__ICE_DOWN, pf->state)) {
2937                 /* Give it a little more time to try to come back. If still
2938                  * down, restart autoneg link or reinitialize the interface.
2939                  */
2940                 msleep(75);
2941                 if (!test_bit(__ICE_DOWN, pf->state))
2942                         return ice_nway_reset(netdev);
2943
2944                 ice_down(vsi);
2945                 ice_up(vsi);
2946         }
2947
2948         return err;
2949 }
2950
2951 /**
2952  * ice_get_rxfh_key_size - get the RSS hash key size
2953  * @netdev: network interface device structure
2954  *
2955  * Returns the table size.
2956  */
2957 static u32 ice_get_rxfh_key_size(struct net_device __always_unused *netdev)
2958 {
2959         return ICE_VSIQF_HKEY_ARRAY_SIZE;
2960 }
2961
2962 /**
2963  * ice_get_rxfh_indir_size - get the Rx flow hash indirection table size
2964  * @netdev: network interface device structure
2965  *
2966  * Returns the table size.
2967  */
2968 static u32 ice_get_rxfh_indir_size(struct net_device *netdev)
2969 {
2970         struct ice_netdev_priv *np = netdev_priv(netdev);
2971
2972         return np->vsi->rss_table_size;
2973 }
2974
2975 /**
2976  * ice_get_rxfh - get the Rx flow hash indirection table
2977  * @netdev: network interface device structure
2978  * @indir: indirection table
2979  * @key: hash key
2980  * @hfunc: hash function
2981  *
2982  * Reads the indirection table directly from the hardware.
2983  */
2984 static int
2985 ice_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, u8 *hfunc)
2986 {
2987         struct ice_netdev_priv *np = netdev_priv(netdev);
2988         struct ice_vsi *vsi = np->vsi;
2989         struct ice_pf *pf = vsi->back;
2990         int ret = 0, i;
2991         u8 *lut;
2992
2993         if (hfunc)
2994                 *hfunc = ETH_RSS_HASH_TOP;
2995
2996         if (!indir)
2997                 return 0;
2998
2999         if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) {
3000                 /* RSS not supported return error here */
3001                 netdev_warn(netdev, "RSS is not configured on this VSI!\n");
3002                 return -EIO;
3003         }
3004
3005         lut = devm_kzalloc(&pf->pdev->dev, vsi->rss_table_size, GFP_KERNEL);
3006         if (!lut)
3007                 return -ENOMEM;
3008
3009         if (ice_get_rss(vsi, key, lut, vsi->rss_table_size)) {
3010                 ret = -EIO;
3011                 goto out;
3012         }
3013
3014         for (i = 0; i < vsi->rss_table_size; i++)
3015                 indir[i] = (u32)(lut[i]);
3016
3017 out:
3018         devm_kfree(&pf->pdev->dev, lut);
3019         return ret;
3020 }
3021
3022 /**
3023  * ice_set_rxfh - set the Rx flow hash indirection table
3024  * @netdev: network interface device structure
3025  * @indir: indirection table
3026  * @key: hash key
3027  * @hfunc: hash function
3028  *
3029  * Returns -EINVAL if the table specifies an invalid queue ID, otherwise
3030  * returns 0 after programming the table.
3031  */
3032 static int
3033 ice_set_rxfh(struct net_device *netdev, const u32 *indir, const u8 *key,
3034              const u8 hfunc)
3035 {
3036         struct ice_netdev_priv *np = netdev_priv(netdev);
3037         struct ice_vsi *vsi = np->vsi;
3038         struct ice_pf *pf = vsi->back;
3039         u8 *seed = NULL;
3040
3041         if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
3042                 return -EOPNOTSUPP;
3043
3044         if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) {
3045                 /* RSS not supported return error here */
3046                 netdev_warn(netdev, "RSS is not configured on this VSI!\n");
3047                 return -EIO;
3048         }
3049
3050         if (key) {
3051                 if (!vsi->rss_hkey_user) {
3052                         vsi->rss_hkey_user =
3053                                 devm_kzalloc(&pf->pdev->dev,
3054                                              ICE_VSIQF_HKEY_ARRAY_SIZE,
3055                                              GFP_KERNEL);
3056                         if (!vsi->rss_hkey_user)
3057                                 return -ENOMEM;
3058                 }
3059                 memcpy(vsi->rss_hkey_user, key, ICE_VSIQF_HKEY_ARRAY_SIZE);
3060                 seed = vsi->rss_hkey_user;
3061         }
3062
3063         if (!vsi->rss_lut_user) {
3064                 vsi->rss_lut_user = devm_kzalloc(&pf->pdev->dev,
3065                                                  vsi->rss_table_size,
3066                                                  GFP_KERNEL);
3067                 if (!vsi->rss_lut_user)
3068                         return -ENOMEM;
3069         }
3070
3071         /* Each 32 bits pointed by 'indir' is stored with a lut entry */
3072         if (indir) {
3073                 int i;
3074
3075                 for (i = 0; i < vsi->rss_table_size; i++)
3076                         vsi->rss_lut_user[i] = (u8)(indir[i]);
3077         } else {
3078                 ice_fill_rss_lut(vsi->rss_lut_user, vsi->rss_table_size,
3079                                  vsi->rss_size);
3080         }
3081
3082         if (ice_set_rss(vsi, seed, vsi->rss_lut_user, vsi->rss_table_size))
3083                 return -EIO;
3084
3085         return 0;
3086 }
3087
3088 enum ice_container_type {
3089         ICE_RX_CONTAINER,
3090         ICE_TX_CONTAINER,
3091 };
3092
3093 /**
3094  * ice_get_rc_coalesce - get ITR values for specific ring container
3095  * @ec: ethtool structure to fill with driver's coalesce settings
3096  * @c_type: container type, Rx or Tx
3097  * @rc: ring container that the ITR values will come from
3098  *
3099  * Query the device for ice_ring_container specific ITR values. This is
3100  * done per ice_ring_container because each q_vector can have 1 or more rings
3101  * and all of said ring(s) will have the same ITR values.
3102  *
3103  * Returns 0 on success, negative otherwise.
3104  */
3105 static int
3106 ice_get_rc_coalesce(struct ethtool_coalesce *ec, enum ice_container_type c_type,
3107                     struct ice_ring_container *rc)
3108 {
3109         struct ice_pf *pf;
3110
3111         if (!rc->ring)
3112                 return -EINVAL;
3113
3114         pf = rc->ring->vsi->back;
3115
3116         switch (c_type) {
3117         case ICE_RX_CONTAINER:
3118                 ec->use_adaptive_rx_coalesce = ITR_IS_DYNAMIC(rc->itr_setting);
3119                 ec->rx_coalesce_usecs = rc->itr_setting & ~ICE_ITR_DYNAMIC;
3120                 ec->rx_coalesce_usecs_high = rc->ring->q_vector->intrl;
3121                 break;
3122         case ICE_TX_CONTAINER:
3123                 ec->use_adaptive_tx_coalesce = ITR_IS_DYNAMIC(rc->itr_setting);
3124                 ec->tx_coalesce_usecs = rc->itr_setting & ~ICE_ITR_DYNAMIC;
3125                 break;
3126         default:
3127                 dev_dbg(&pf->pdev->dev, "Invalid c_type %d\n", c_type);
3128                 return -EINVAL;
3129         }
3130
3131         return 0;
3132 }
3133
3134 /**
3135  * ice_get_q_coalesce - get a queue's ITR/INTRL (coalesce) settings
3136  * @vsi: VSI associated to the queue for getting ITR/INTRL (coalesce) settings
3137  * @ec: coalesce settings to program the device with
3138  * @q_num: update ITR/INTRL (coalesce) settings for this queue number/index
3139  *
3140  * Return 0 on success, and negative under the following conditions:
3141  * 1. Getting Tx or Rx ITR/INTRL (coalesce) settings failed.
3142  * 2. The q_num passed in is not a valid number/index for Tx and Rx rings.
3143  */
3144 static int
3145 ice_get_q_coalesce(struct ice_vsi *vsi, struct ethtool_coalesce *ec, int q_num)
3146 {
3147         if (q_num < vsi->num_rxq && q_num < vsi->num_txq) {
3148                 if (ice_get_rc_coalesce(ec, ICE_RX_CONTAINER,
3149                                         &vsi->rx_rings[q_num]->q_vector->rx))
3150                         return -EINVAL;
3151                 if (ice_get_rc_coalesce(ec, ICE_TX_CONTAINER,
3152                                         &vsi->tx_rings[q_num]->q_vector->tx))
3153                         return -EINVAL;
3154         } else if (q_num < vsi->num_rxq) {
3155                 if (ice_get_rc_coalesce(ec, ICE_RX_CONTAINER,
3156                                         &vsi->rx_rings[q_num]->q_vector->rx))
3157                         return -EINVAL;
3158         } else if (q_num < vsi->num_txq) {
3159                 if (ice_get_rc_coalesce(ec, ICE_TX_CONTAINER,
3160                                         &vsi->tx_rings[q_num]->q_vector->tx))
3161                         return -EINVAL;
3162         } else {
3163                 return -EINVAL;
3164         }
3165
3166         return 0;
3167 }
3168
3169 /**
3170  * __ice_get_coalesce - get ITR/INTRL values for the device
3171  * @netdev: pointer to the netdev associated with this query
3172  * @ec: ethtool structure to fill with driver's coalesce settings
3173  * @q_num: queue number to get the coalesce settings for
3174  *
3175  * If the caller passes in a negative q_num then we return coalesce settings
3176  * based on queue number 0, else use the actual q_num passed in.
3177  */
3178 static int
3179 __ice_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec,
3180                    int q_num)
3181 {
3182         struct ice_netdev_priv *np = netdev_priv(netdev);
3183         struct ice_vsi *vsi = np->vsi;
3184
3185         if (q_num < 0)
3186                 q_num = 0;
3187
3188         if (ice_get_q_coalesce(vsi, ec, q_num))
3189                 return -EINVAL;
3190
3191         return 0;
3192 }
3193
3194 static int
3195 ice_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec)
3196 {
3197         return __ice_get_coalesce(netdev, ec, -1);
3198 }
3199
3200 static int
3201 ice_get_per_q_coalesce(struct net_device *netdev, u32 q_num,
3202                        struct ethtool_coalesce *ec)
3203 {
3204         return __ice_get_coalesce(netdev, ec, q_num);
3205 }
3206
3207 /**
3208  * ice_set_rc_coalesce - set ITR values for specific ring container
3209  * @c_type: container type, Rx or Tx
3210  * @ec: ethtool structure from user to update ITR settings
3211  * @rc: ring container that the ITR values will come from
3212  * @vsi: VSI associated to the ring container
3213  *
3214  * Set specific ITR values. This is done per ice_ring_container because each
3215  * q_vector can have 1 or more rings and all of said ring(s) will have the same
3216  * ITR values.
3217  *
3218  * Returns 0 on success, negative otherwise.
3219  */
3220 static int
3221 ice_set_rc_coalesce(enum ice_container_type c_type, struct ethtool_coalesce *ec,
3222                     struct ice_ring_container *rc, struct ice_vsi *vsi)
3223 {
3224         const char *c_type_str = (c_type == ICE_RX_CONTAINER) ? "rx" : "tx";
3225         u32 use_adaptive_coalesce, coalesce_usecs;
3226         struct ice_pf *pf = vsi->back;
3227         u16 itr_setting;
3228
3229         if (!rc->ring)
3230                 return -EINVAL;
3231
3232         switch (c_type) {
3233         case ICE_RX_CONTAINER:
3234                 if (ec->rx_coalesce_usecs_high > ICE_MAX_INTRL ||
3235                     (ec->rx_coalesce_usecs_high &&
3236                      ec->rx_coalesce_usecs_high < pf->hw.intrl_gran)) {
3237                         netdev_info(vsi->netdev,
3238                                     "Invalid value, %s-usecs-high valid values are 0 (disabled), %d-%d\n",
3239                                     c_type_str, pf->hw.intrl_gran,
3240                                     ICE_MAX_INTRL);
3241                         return -EINVAL;
3242                 }
3243                 if (ec->rx_coalesce_usecs_high != rc->ring->q_vector->intrl) {
3244                         rc->ring->q_vector->intrl = ec->rx_coalesce_usecs_high;
3245                         wr32(&pf->hw, GLINT_RATE(rc->ring->q_vector->reg_idx),
3246                              ice_intrl_usec_to_reg(ec->rx_coalesce_usecs_high,
3247                                                    pf->hw.intrl_gran));
3248                 }
3249
3250                 use_adaptive_coalesce = ec->use_adaptive_rx_coalesce;
3251                 coalesce_usecs = ec->rx_coalesce_usecs;
3252
3253                 break;
3254         case ICE_TX_CONTAINER:
3255                 if (ec->tx_coalesce_usecs_high) {
3256                         netdev_info(vsi->netdev,
3257                                     "setting %s-usecs-high is not supported\n",
3258                                     c_type_str);
3259                         return -EINVAL;
3260                 }
3261
3262                 use_adaptive_coalesce = ec->use_adaptive_tx_coalesce;
3263                 coalesce_usecs = ec->tx_coalesce_usecs;
3264
3265                 break;
3266         default:
3267                 dev_dbg(&pf->pdev->dev, "Invalid container type %d\n", c_type);
3268                 return -EINVAL;
3269         }
3270
3271         itr_setting = rc->itr_setting & ~ICE_ITR_DYNAMIC;
3272         if (coalesce_usecs != itr_setting && use_adaptive_coalesce) {
3273                 netdev_info(vsi->netdev,
3274                             "%s interrupt throttling cannot be changed if adaptive-%s is enabled\n",
3275                             c_type_str, c_type_str);
3276                 return -EINVAL;
3277         }
3278
3279         if (coalesce_usecs > ICE_ITR_MAX) {
3280                 netdev_info(vsi->netdev,
3281                             "Invalid value, %s-usecs range is 0-%d\n",
3282                             c_type_str, ICE_ITR_MAX);
3283                 return -EINVAL;
3284         }
3285
3286         /* hardware only supports an ITR granularity of 2us */
3287         if (coalesce_usecs % 2 != 0) {
3288                 netdev_info(vsi->netdev,
3289                             "Invalid value, %s-usecs must be even\n",
3290                             c_type_str);
3291                 return -EINVAL;
3292         }
3293
3294         if (use_adaptive_coalesce) {
3295                 rc->itr_setting |= ICE_ITR_DYNAMIC;
3296         } else {
3297                 /* store user facing value how it was set */
3298                 rc->itr_setting = coalesce_usecs;
3299                 /* set to static and convert to value HW understands */
3300                 rc->target_itr =
3301                         ITR_TO_REG(ITR_REG_ALIGN(rc->itr_setting));
3302         }
3303
3304         return 0;
3305 }
3306
3307 /**
3308  * ice_set_q_coalesce - set a queue's ITR/INTRL (coalesce) settings
3309  * @vsi: VSI associated to the queue that need updating
3310  * @ec: coalesce settings to program the device with
3311  * @q_num: update ITR/INTRL (coalesce) settings for this queue number/index
3312  *
3313  * Return 0 on success, and negative under the following conditions:
3314  * 1. Setting Tx or Rx ITR/INTRL (coalesce) settings failed.
3315  * 2. The q_num passed in is not a valid number/index for Tx and Rx rings.
3316  */
3317 static int
3318 ice_set_q_coalesce(struct ice_vsi *vsi, struct ethtool_coalesce *ec, int q_num)
3319 {
3320         if (q_num < vsi->num_rxq && q_num < vsi->num_txq) {
3321                 if (ice_set_rc_coalesce(ICE_RX_CONTAINER, ec,
3322                                         &vsi->rx_rings[q_num]->q_vector->rx,
3323                                         vsi))
3324                         return -EINVAL;
3325
3326                 if (ice_set_rc_coalesce(ICE_TX_CONTAINER, ec,
3327                                         &vsi->tx_rings[q_num]->q_vector->tx,
3328                                         vsi))
3329                         return -EINVAL;
3330         } else if (q_num < vsi->num_rxq) {
3331                 if (ice_set_rc_coalesce(ICE_RX_CONTAINER, ec,
3332                                         &vsi->rx_rings[q_num]->q_vector->rx,
3333                                         vsi))
3334                         return -EINVAL;
3335         } else if (q_num < vsi->num_txq) {
3336                 if (ice_set_rc_coalesce(ICE_TX_CONTAINER, ec,
3337                                         &vsi->tx_rings[q_num]->q_vector->tx,
3338                                         vsi))
3339                         return -EINVAL;
3340         } else {
3341                 return -EINVAL;
3342         }
3343
3344         return 0;
3345 }
3346
3347 /**
3348  * __ice_set_coalesce - set ITR/INTRL values for the device
3349  * @netdev: pointer to the netdev associated with this query
3350  * @ec: ethtool structure to fill with driver's coalesce settings
3351  * @q_num: queue number to get the coalesce settings for
3352  *
3353  * If the caller passes in a negative q_num then we set the coalesce settings
3354  * for all Tx/Rx queues, else use the actual q_num passed in.
3355  */
3356 static int
3357 __ice_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec,
3358                    int q_num)
3359 {
3360         struct ice_netdev_priv *np = netdev_priv(netdev);
3361         struct ice_vsi *vsi = np->vsi;
3362
3363         if (q_num < 0) {
3364                 int v_idx;
3365
3366                 ice_for_each_q_vector(vsi, v_idx) {
3367                         /* In some cases if DCB is configured the num_[rx|tx]q
3368                          * can be less than vsi->num_q_vectors. This check
3369                          * accounts for that so we don't report a false failure
3370                          */
3371                         if (v_idx >= vsi->num_rxq && v_idx >= vsi->num_txq)
3372                                 goto set_complete;
3373
3374                         if (ice_set_q_coalesce(vsi, ec, v_idx))
3375                                 return -EINVAL;
3376                 }
3377                 goto set_complete;
3378         }
3379
3380         if (ice_set_q_coalesce(vsi, ec, q_num))
3381                 return -EINVAL;
3382
3383 set_complete:
3384
3385         return 0;
3386 }
3387
3388 static int
3389 ice_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec)
3390 {
3391         return __ice_set_coalesce(netdev, ec, -1);
3392 }
3393
3394 static int
3395 ice_set_per_q_coalesce(struct net_device *netdev, u32 q_num,
3396                        struct ethtool_coalesce *ec)
3397 {
3398         return __ice_set_coalesce(netdev, ec, q_num);
3399 }
3400
3401 static const struct ethtool_ops ice_ethtool_ops = {
3402         .get_link_ksettings     = ice_get_link_ksettings,
3403         .set_link_ksettings     = ice_set_link_ksettings,
3404         .get_drvinfo            = ice_get_drvinfo,
3405         .get_regs_len           = ice_get_regs_len,
3406         .get_regs               = ice_get_regs,
3407         .get_msglevel           = ice_get_msglevel,
3408         .set_msglevel           = ice_set_msglevel,
3409         .self_test              = ice_self_test,
3410         .get_link               = ethtool_op_get_link,
3411         .get_eeprom_len         = ice_get_eeprom_len,
3412         .get_eeprom             = ice_get_eeprom,
3413         .get_coalesce           = ice_get_coalesce,
3414         .set_coalesce           = ice_set_coalesce,
3415         .get_strings            = ice_get_strings,
3416         .set_phys_id            = ice_set_phys_id,
3417         .get_ethtool_stats      = ice_get_ethtool_stats,
3418         .get_priv_flags         = ice_get_priv_flags,
3419         .set_priv_flags         = ice_set_priv_flags,
3420         .get_sset_count         = ice_get_sset_count,
3421         .get_rxnfc              = ice_get_rxnfc,
3422         .get_ringparam          = ice_get_ringparam,
3423         .set_ringparam          = ice_set_ringparam,
3424         .nway_reset             = ice_nway_reset,
3425         .get_pauseparam         = ice_get_pauseparam,
3426         .set_pauseparam         = ice_set_pauseparam,
3427         .get_rxfh_key_size      = ice_get_rxfh_key_size,
3428         .get_rxfh_indir_size    = ice_get_rxfh_indir_size,
3429         .get_rxfh               = ice_get_rxfh,
3430         .set_rxfh               = ice_set_rxfh,
3431         .get_ts_info            = ethtool_op_get_ts_info,
3432         .get_per_queue_coalesce = ice_get_per_q_coalesce,
3433         .set_per_queue_coalesce = ice_set_per_q_coalesce,
3434         .get_fecparam           = ice_get_fecparam,
3435         .set_fecparam           = ice_set_fecparam,
3436 };
3437
3438 static const struct ethtool_ops ice_ethtool_safe_mode_ops = {
3439         .get_link_ksettings     = ice_get_link_ksettings,
3440         .set_link_ksettings     = ice_set_link_ksettings,
3441         .get_drvinfo            = ice_get_drvinfo,
3442         .get_regs_len           = ice_get_regs_len,
3443         .get_regs               = ice_get_regs,
3444         .get_msglevel           = ice_get_msglevel,
3445         .set_msglevel           = ice_set_msglevel,
3446         .get_eeprom_len         = ice_get_eeprom_len,
3447         .get_eeprom             = ice_get_eeprom,
3448         .get_strings            = ice_get_strings,
3449         .get_ethtool_stats      = ice_get_ethtool_stats,
3450         .get_sset_count         = ice_get_sset_count,
3451         .get_ringparam          = ice_get_ringparam,
3452         .set_ringparam          = ice_set_ringparam,
3453         .nway_reset             = ice_nway_reset,
3454 };
3455
3456 /**
3457  * ice_set_ethtool_safe_mode_ops - setup safe mode ethtool ops
3458  * @netdev: network interface device structure
3459  */
3460 void ice_set_ethtool_safe_mode_ops(struct net_device *netdev)
3461 {
3462         netdev->ethtool_ops = &ice_ethtool_safe_mode_ops;
3463 }
3464
3465 /**
3466  * ice_set_ethtool_ops - setup netdev ethtool ops
3467  * @netdev: network interface device structure
3468  *
3469  * setup netdev ethtool ops with ice specific ops
3470  */
3471 void ice_set_ethtool_ops(struct net_device *netdev)
3472 {
3473         netdev->ethtool_ops = &ice_ethtool_ops;
3474 }