root/drivers/net/ethernet/intel/ice/ice_ethtool.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ice_q_stats_len
  2. ice_get_drvinfo
  3. ice_get_regs_len
  4. ice_get_regs
  5. ice_get_msglevel
  6. ice_set_msglevel
  7. ice_get_eeprom_len
  8. ice_get_eeprom
  9. ice_active_vfs
  10. ice_link_test
  11. ice_eeprom_test
  12. ice_reg_pattern_test
  13. ice_reg_test
  14. ice_lbtest_prepare_rings
  15. ice_lbtest_disable_rings
  16. ice_lbtest_create_frame
  17. ice_lbtest_check_frame
  18. ice_diag_send
  19. ice_lbtest_receive_frames
  20. ice_loopback_test
  21. ice_intr_test
  22. ice_self_test
  23. ice_get_strings
  24. ice_set_phys_id
  25. ice_set_fec_cfg
  26. ice_set_fecparam
  27. ice_get_fecparam
  28. ice_get_priv_flags
  29. ice_set_priv_flags
  30. ice_get_sset_count
  31. ice_get_ethtool_stats
  32. ice_phy_type_to_ethtool
  33. ice_get_settings_link_up
  34. ice_get_settings_link_down
  35. ice_get_link_ksettings
  36. ice_ksettings_find_adv_link_speed
  37. ice_setup_autoneg
  38. ice_set_link_ksettings
  39. ice_get_rxnfc
  40. ice_get_ringparam
  41. ice_set_ringparam
  42. ice_nway_reset
  43. ice_get_pauseparam
  44. ice_set_pauseparam
  45. ice_get_rxfh_key_size
  46. ice_get_rxfh_indir_size
  47. ice_get_rxfh
  48. ice_set_rxfh
  49. ice_get_rc_coalesce
  50. ice_get_q_coalesce
  51. __ice_get_coalesce
  52. ice_get_coalesce
  53. ice_get_per_q_coalesce
  54. ice_set_rc_coalesce
  55. ice_set_q_coalesce
  56. __ice_set_coalesce
  57. ice_set_coalesce
  58. ice_set_per_q_coalesce
  59. ice_set_ethtool_safe_mode_ops
  60. ice_set_ethtool_ops

   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 }

/* [<][>][^][v][top][bottom][index][help] */