Lines Matching +full:self +full:- +full:advertising

1 // SPDX-License-Identifier: GPL-2.0
34 return ((np->vsi->alloc_txq + np->vsi->alloc_rxq) * in ice_q_stats_len()
93 * The PF_STATs are appended to the netdev stats only when ethtool -S
153 u32 bitno; /* bit position in pf->flags */
162 ICE_PRIV_FLAG("link-down-on-close", ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA),
163 ICE_PRIV_FLAG("fw-lldp-agent", ICE_FLAG_FW_LLDP_AGENT),
164 ICE_PRIV_FLAG("vf-true-promisc-support",
166 ICE_PRIV_FLAG("mdd-auto-reset-vf", ICE_FLAG_MDD_AUTO_RESET_VF),
167 ICE_PRIV_FLAG("legacy-rx", ICE_FLAG_LEGACY_RX),
176 struct ice_vsi *vsi = np->vsi; in ice_get_drvinfo()
177 struct ice_pf *pf = vsi->back; in ice_get_drvinfo()
178 struct ice_hw *hw = &pf->hw; in ice_get_drvinfo()
182 nvm = &hw->flash.nvm; in ice_get_drvinfo()
183 orom = &hw->flash.orom; in ice_get_drvinfo()
185 strscpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver)); in ice_get_drvinfo()
190 snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), in ice_get_drvinfo()
191 "%x.%02x 0x%x %d.%d.%d", nvm->major, nvm->minor, in ice_get_drvinfo()
192 nvm->eetrack, orom->major, orom->build, orom->patch); in ice_get_drvinfo()
194 strscpy(drvinfo->bus_info, pci_name(pf->pdev), in ice_get_drvinfo()
195 sizeof(drvinfo->bus_info)); in ice_get_drvinfo()
196 drvinfo->n_priv_flags = ICE_PRIV_FLAG_ARRAY_SIZE; in ice_get_drvinfo()
208 struct ice_pf *pf = np->vsi->back; in ice_get_regs()
209 struct ice_hw *hw = &pf->hw; in ice_get_regs()
213 regs->version = 1; in ice_get_regs()
222 struct ice_pf *pf = np->vsi->back; in ice_get_msglevel()
225 if (pf->hw.debug_mask) in ice_get_msglevel()
227 pf->hw.debug_mask); in ice_get_msglevel()
230 return pf->msg_enable; in ice_get_msglevel()
236 struct ice_pf *pf = np->vsi->back; in ice_set_msglevel()
240 pf->hw.debug_mask = data; in ice_set_msglevel()
242 pf->msg_enable = data; in ice_set_msglevel()
244 pf->msg_enable = data; in ice_set_msglevel()
251 struct ice_pf *pf = np->vsi->back; in ice_get_eeprom_len()
253 return (int)pf->hw.flash.flash_size; in ice_get_eeprom_len()
261 struct ice_vsi *vsi = np->vsi; in ice_get_eeprom()
262 struct ice_pf *pf = vsi->back; in ice_get_eeprom()
263 struct ice_hw *hw = &pf->hw; in ice_get_eeprom()
271 eeprom->magic = hw->vendor_id | (hw->device_id << 16); in ice_get_eeprom()
273 eeprom->cmd, eeprom->offset, eeprom->len); in ice_get_eeprom()
275 buf = kzalloc(eeprom->len, GFP_KERNEL); in ice_get_eeprom()
277 return -ENOMEM; in ice_get_eeprom()
283 ice_aq_str(hw->adminq.sq_last_status)); in ice_get_eeprom()
284 ret = -EIO; in ice_get_eeprom()
288 status = ice_read_flat_nvm(hw, eeprom->offset, &eeprom->len, buf, in ice_get_eeprom()
293 ice_aq_str(hw->adminq.sq_last_status)); in ice_get_eeprom()
294 ret = -EIO; in ice_get_eeprom()
298 memcpy(bytes, buf, eeprom->len); in ice_get_eeprom()
307 * ice_active_vfs - check if there are any active VFs
317 struct ice_vf *vf = &pf->vf[i]; in ice_active_vfs()
319 if (test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) in ice_active_vfs()
327 * ice_link_test - perform a link test on a given net_device
330 * This function performs one of the self-tests required by ethtool.
331 * Returns 0 on success, non-zero on failure.
340 status = ice_get_link_status(np->vsi->port_info, &link_up); in ice_link_test()
354 * ice_eeprom_test - perform an EEPROM test on a given net_device
357 * This function performs one of the self-tests required by ethtool.
358 * Returns 0 on success, non-zero on failure.
363 struct ice_pf *pf = np->vsi->back; in ice_eeprom_test()
366 return !!(ice_nvm_validate_checksum(&pf->hw)); in ice_eeprom_test()
377 struct ice_pf *pf = (struct ice_pf *)hw->back; in ice_reg_pattern_test()
394 dev_err(dev, "%s: reg pattern test failed - reg 0x%08x pat 0x%08x val 0x%08x\n" in ice_reg_pattern_test()
402 dev_err(dev, "%s: reg restore test failed - reg 0x%08x orig 0x%08x val 0x%08x\n" in ice_reg_pattern_test()
411 * ice_reg_test - perform a register test on a given net_device
414 * This function performs one of the self-tests required by ethtool.
415 * Returns 0 on success, non-zero on failure.
420 struct ice_hw *hw = np->vsi->port_info->hw; in ice_reg_test()
421 u32 int_elements = hw->func_caps.common_cap.num_msix_vectors ? in ice_reg_test()
422 hw->func_caps.common_cap.num_msix_vectors - 1 : 1; in ice_reg_test()
430 GLINT_ITR(0, 1) - GLINT_ITR(0, 0)}, in ice_reg_test()
432 GLINT_ITR(1, 1) - GLINT_ITR(1, 0)}, in ice_reg_test()
434 GLINT_ITR(2, 1) - GLINT_ITR(2, 0)}, in ice_reg_test()
448 /* bail on failure (non-zero return) */ in ice_reg_test()
458 * ice_lbtest_prepare_rings - configure Tx/Rx test rings
499 * ice_lbtest_disable_rings - disable Tx/Rx test rings after loopback test
511 netdev_err(vsi->netdev, "Failed to stop Tx rings, VSI %d error %d\n", in ice_lbtest_disable_rings()
512 vsi->vsi_num, status); in ice_lbtest_disable_rings()
516 netdev_err(vsi->netdev, "Failed to stop Rx rings, VSI %d error %d\n", in ice_lbtest_disable_rings()
517 vsi->vsi_num, status); in ice_lbtest_disable_rings()
526 * ice_lbtest_create_frame - create test packet
532 * Returns 0 on success, non-zero on failure.
539 return -EINVAL; in ice_lbtest_create_frame()
543 return -ENOMEM; in ice_lbtest_create_frame()
560 * ice_lbtest_check_frame - verify received loopback frame
580 * ice_diag_send - send test frames to the test ring
594 tx_desc = ICE_TX_DESC(tx_ring, tx_ring->next_to_use); in ice_diag_send()
595 tx_buf = &tx_ring->tx_buf[tx_ring->next_to_use]; in ice_diag_send()
597 dma = dma_map_single(tx_ring->dev, data, size, DMA_TO_DEVICE); in ice_diag_send()
598 if (dma_mapping_error(tx_ring->dev, dma)) in ice_diag_send()
599 return -EINVAL; in ice_diag_send()
601 tx_desc->buf_addr = cpu_to_le64(dma); in ice_diag_send()
605 tx_desc->cmd_type_offset_bsz = in ice_diag_send()
612 tx_buf->next_to_watch = tx_desc; in ice_diag_send()
619 tx_ring->next_to_use++; in ice_diag_send()
620 if (tx_ring->next_to_use >= tx_ring->count) in ice_diag_send()
621 tx_ring->next_to_use = 0; in ice_diag_send()
623 writel_relaxed(tx_ring->next_to_use, tx_ring->tail); in ice_diag_send()
627 dma_unmap_single(tx_ring->dev, dma, size, DMA_TO_DEVICE); in ice_diag_send()
634 * ice_lbtest_receive_frames - receive and verify test frames
648 for (i = 0; i < rx_ring->count; i++) { in ice_lbtest_receive_frames()
653 if (!(rx_desc->wb.status_error0 & in ice_lbtest_receive_frames()
657 rx_buf = &rx_ring->rx_buf[i]; in ice_lbtest_receive_frames()
658 received_buf = page_address(rx_buf->page) + rx_buf->page_offset; in ice_lbtest_receive_frames()
668 * ice_loopback_test - perform a loopback test on a given net_device
671 * This function performs one of the self-tests required by ethtool.
672 * Returns 0 on success, non-zero on failure.
677 struct ice_vsi *orig_vsi = np->vsi, *test_vsi; in ice_loopback_test()
678 struct ice_pf *pf = orig_vsi->back; in ice_loopback_test()
689 test_vsi = ice_lb_vsi_setup(pf, pf->hw.port_info); in ice_loopback_test()
695 test_vsi->netdev = netdev; in ice_loopback_test()
696 tx_ring = test_vsi->tx_rings[0]; in ice_loopback_test()
697 rx_ring = test_vsi->rx_rings[0]; in ice_loopback_test()
704 if (ice_alloc_rx_bufs(rx_ring, rx_ring->count)) { in ice_loopback_test()
710 if (ice_aq_set_mac_loopback(&pf->hw, true, NULL)) { in ice_loopback_test()
727 num_frames = min_t(int, tx_ring->count, 32); in ice_loopback_test()
748 if (ice_aq_set_mac_loopback(&pf->hw, false, NULL)) in ice_loopback_test()
754 test_vsi->netdev = NULL; in ice_loopback_test()
762 * ice_intr_test - perform an interrupt test on a given net_device
765 * This function performs one of the self-tests required by ethtool.
766 * Returns 0 on success, non-zero on failure.
771 struct ice_pf *pf = np->vsi->back; in ice_intr_test()
772 u16 swic_old = pf->sw_int_count; in ice_intr_test()
776 wr32(&pf->hw, GLINT_DYN_CTL(pf->oicr_idx), in ice_intr_test()
782 return (swic_old == pf->sw_int_count); in ice_intr_test()
786 * ice_self_test - handler function for performing a self-test by ethtool
791 * This function is called after invoking 'ethtool -t devname' command where
793 * It performs a set of self-tests to check if a device works properly.
801 struct ice_pf *pf = np->vsi->back; in ice_self_test()
806 if (eth_test->flags == ETH_TEST_FL_OFFLINE) { in ice_self_test()
809 set_bit(ICE_TESTING, pf->state); in ice_self_test()
818 eth_test->flags |= ETH_TEST_FL_FAILED; in ice_self_test()
819 clear_bit(ICE_TESTING, pf->state); in ice_self_test()
838 eth_test->flags |= ETH_TEST_FL_FAILED; in ice_self_test()
840 clear_bit(ICE_TESTING, pf->state); in ice_self_test()
847 pf->int_name, status); in ice_self_test()
856 eth_test->flags |= ETH_TEST_FL_FAILED; in ice_self_test()
872 struct ice_vsi *vsi = np->vsi; in ice_get_strings()
892 if (vsi->type != ICE_VSI_PF) in ice_get_strings()
934 return -EINVAL; in ice_set_phys_id()
937 if (ice_aq_set_port_id_led(np->vsi->port_info, !led_active, NULL)) in ice_set_phys_id()
938 return -EIO; in ice_set_phys_id()
944 * ice_set_fec_cfg - Set link FEC options
952 struct ice_vsi *vsi = np->vsi; in ice_set_fec_cfg()
955 pi = vsi->port_info; in ice_set_fec_cfg()
957 return -EOPNOTSUPP; in ice_set_fec_cfg()
960 if (vsi->type != ICE_VSI_PF) { in ice_set_fec_cfg()
962 return -EOPNOTSUPP; in ice_set_fec_cfg()
966 if (pi->phy.curr_user_fec_req == req_fec) in ice_set_fec_cfg()
973 memcpy(&config, &pi->phy.curr_user_phy_cfg, sizeof(config)); in ice_set_fec_cfg()
978 if (ice_aq_set_phy_cfg(pi->hw, pi, &config, NULL)) in ice_set_fec_cfg()
979 return -EAGAIN; in ice_set_fec_cfg()
982 pi->phy.curr_user_fec_req = req_fec; in ice_set_fec_cfg()
988 * ice_set_fecparam - Set FEC link options
996 struct ice_vsi *vsi = np->vsi; in ice_set_fecparam()
999 switch (fecparam->fec) { in ice_set_fecparam()
1014 dev_warn(ice_pf_to_dev(vsi->back), "Unsupported FEC mode: %d\n", in ice_set_fecparam()
1015 fecparam->fec); in ice_set_fecparam()
1016 return -EINVAL; in ice_set_fecparam()
1023 * ice_get_fecparam - Get link FEC options
1033 struct ice_vsi *vsi = np->vsi; in ice_get_fecparam()
1038 pi = vsi->port_info; in ice_get_fecparam()
1041 return -EOPNOTSUPP; in ice_get_fecparam()
1042 link_info = &pi->phy.link_info; in ice_get_fecparam()
1045 switch (link_info->fec_info) { in ice_get_fecparam()
1047 fecparam->active_fec = ETHTOOL_FEC_BASER; in ice_get_fecparam()
1051 fecparam->active_fec = ETHTOOL_FEC_RS; in ice_get_fecparam()
1054 fecparam->active_fec = ETHTOOL_FEC_OFF; in ice_get_fecparam()
1060 return -ENOMEM; in ice_get_fecparam()
1065 err = -EAGAIN; in ice_get_fecparam()
1070 if (caps->caps & ICE_AQC_PHY_EN_AUTO_FEC) in ice_get_fecparam()
1071 fecparam->fec |= ETHTOOL_FEC_AUTO; in ice_get_fecparam()
1072 if (caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN || in ice_get_fecparam()
1073 caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ || in ice_get_fecparam()
1074 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN || in ice_get_fecparam()
1075 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_REQ) in ice_get_fecparam()
1076 fecparam->fec |= ETHTOOL_FEC_BASER; in ice_get_fecparam()
1077 if (caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_528_REQ || in ice_get_fecparam()
1078 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_544_REQ || in ice_get_fecparam()
1079 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN) in ice_get_fecparam()
1080 fecparam->fec |= ETHTOOL_FEC_RS; in ice_get_fecparam()
1081 if (caps->link_fec_options == 0) in ice_get_fecparam()
1082 fecparam->fec |= ETHTOOL_FEC_OFF; in ice_get_fecparam()
1090 * ice_nway_reset - restart autonegotiation
1096 struct ice_vsi *vsi = np->vsi; in ice_nway_reset()
1100 if (!test_bit(ICE_DOWN, vsi->back->state)) in ice_nway_reset()
1109 * ice_get_priv_flags - report device private flags
1121 struct ice_vsi *vsi = np->vsi; in ice_get_priv_flags()
1122 struct ice_pf *pf = vsi->back; in ice_get_priv_flags()
1130 if (test_bit(priv_flag->bitno, pf->flags)) in ice_get_priv_flags()
1138 * ice_set_priv_flags - set private flags
1147 struct ice_vsi *vsi = np->vsi; in ice_set_priv_flags()
1148 struct ice_pf *pf = vsi->back; in ice_set_priv_flags()
1154 return -EINVAL; in ice_set_priv_flags()
1157 set_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags); in ice_set_priv_flags()
1159 bitmap_copy(orig_flags, pf->flags, ICE_PF_FLAGS_NBITS); in ice_set_priv_flags()
1166 set_bit(priv_flag->bitno, pf->flags); in ice_set_priv_flags()
1168 clear_bit(priv_flag->bitno, pf->flags); in ice_set_priv_flags()
1171 bitmap_xor(change_flags, pf->flags, orig_flags, ICE_PF_FLAGS_NBITS); in ice_set_priv_flags()
1173 /* Do not allow change to link-down-on-close when Total Port Shutdown in ice_set_priv_flags()
1177 test_bit(ICE_FLAG_TOTAL_PORT_SHUTDOWN_ENA, pf->flags)) { in ice_set_priv_flags()
1178 dev_err(dev, "Setting link-down-on-close not supported on this port\n"); in ice_set_priv_flags()
1179 set_bit(ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA, pf->flags); in ice_set_priv_flags()
1180 ret = -EINVAL; in ice_set_priv_flags()
1185 if (!test_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags)) { in ice_set_priv_flags()
1189 status = ice_cfg_lldp_mib_change(&pf->hw, false); in ice_set_priv_flags()
1201 status = ice_aq_stop_lldp(&pf->hw, true, true, NULL); in ice_set_priv_flags()
1212 pf->dcbx_cap &= ~DCB_CAP_DCBX_LLD_MANAGED; in ice_set_priv_flags()
1213 pf->dcbx_cap |= DCB_CAP_DCBX_HOST; in ice_set_priv_flags()
1226 status = ice_aq_start_lldp(&pf->hw, true, NULL); in ice_set_priv_flags()
1233 status = ice_aq_start_stop_dcbx(&pf->hw, true, in ice_set_priv_flags()
1252 status = ice_cfg_lldp_mib_change(&pf->hw, true); in ice_set_priv_flags()
1256 pf->dcbx_cap &= ~DCB_CAP_DCBX_HOST; in ice_set_priv_flags()
1257 pf->dcbx_cap |= DCB_CAP_DCBX_LLD_MANAGED; in ice_set_priv_flags()
1272 …dev_err(dev, "Changing vf-true-promisc-support flag while VF(s) are in promiscuous mode not suppor… in ice_set_priv_flags()
1274 change_bit(ICE_FLAG_VF_TRUE_PROMISC_ENA, pf->flags); in ice_set_priv_flags()
1275 ret = -EAGAIN; in ice_set_priv_flags()
1278 clear_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags); in ice_set_priv_flags()
1297 * undefined memory access or incorrect string<->value in ice_get_sset_count()
1310 return -EOPNOTSUPP; in ice_get_sset_count()
1319 struct ice_vsi *vsi = np->vsi; in ice_get_ethtool_stats()
1320 struct ice_pf *pf = vsi->back; in ice_get_ethtool_stats()
1339 ring = READ_ONCE(vsi->tx_rings[j]); in ice_get_ethtool_stats()
1341 data[i++] = ring->stats.pkts; in ice_get_ethtool_stats()
1342 data[i++] = ring->stats.bytes; in ice_get_ethtool_stats()
1350 ring = READ_ONCE(vsi->rx_rings[j]); in ice_get_ethtool_stats()
1352 data[i++] = ring->stats.pkts; in ice_get_ethtool_stats()
1353 data[i++] = ring->stats.bytes; in ice_get_ethtool_stats()
1362 if (vsi->type != ICE_VSI_PF) in ice_get_ethtool_stats()
1372 data[i++] = pf->stats.priority_xon_tx[j]; in ice_get_ethtool_stats()
1373 data[i++] = pf->stats.priority_xoff_tx[j]; in ice_get_ethtool_stats()
1377 data[i++] = pf->stats.priority_xon_rx[j]; in ice_get_ethtool_stats()
1378 data[i++] = pf->stats.priority_xoff_rx[j]; in ice_get_ethtool_stats()
1449 ethtool_link_ksettings_add_link_mode(ks, advertising,\
1454 * ice_phy_type_to_ethtool - convert the phy_types to ethtool link modes
1463 struct ice_vsi *vsi = np->vsi; in ice_phy_type_to_ethtool()
1464 struct ice_pf *pf = vsi->back; in ice_phy_type_to_ethtool()
1473 req_speeds = vsi->port_info->phy.link_info.req_speeds; in ice_phy_type_to_ethtool()
1478 * media. The Advertising link mode is either 1. the user requested in ice_phy_type_to_ethtool()
1482 * and Advertising link modes are the media PHY type or the speed in ice_phy_type_to_ethtool()
1485 if (test_bit(ICE_FLAG_LINK_LENIENT_MODE_ENA, pf->flags)) { in ice_phy_type_to_ethtool()
1486 phy_types_low = le64_to_cpu(pf->nvm_phy_type_lo); in ice_phy_type_to_ethtool()
1487 phy_types_high = le64_to_cpu(pf->nvm_phy_type_hi); in ice_phy_type_to_ethtool()
1494 if (ice_fw_supports_link_override(&pf->hw) && in ice_phy_type_to_ethtool()
1495 !ice_fw_supports_report_dflt_cfg(&pf->hw)) { in ice_phy_type_to_ethtool()
1498 ldo = &pf->link_dflt_override; in ice_phy_type_to_ethtool()
1500 * Advertising link mode is the intersection of the PHY in ice_phy_type_to_ethtool()
1503 if (ldo->options & ICE_LINK_OVERRIDE_EN && in ice_phy_type_to_ethtool()
1504 (ldo->phy_type_low || ldo->phy_type_high)) { in ice_phy_type_to_ethtool()
1506 le64_to_cpu(pf->nvm_phy_type_lo) & in ice_phy_type_to_ethtool()
1507 ldo->phy_type_low; in ice_phy_type_to_ethtool()
1509 le64_to_cpu(pf->nvm_phy_type_hi) & in ice_phy_type_to_ethtool()
1510 ldo->phy_type_high; in ice_phy_type_to_ethtool()
1515 phy_types_low = vsi->port_info->phy.phy_type_low; in ice_phy_type_to_ethtool()
1516 phy_types_high = vsi->port_info->phy.phy_type_high; in ice_phy_type_to_ethtool()
1519 /* If Advertising link mode PHY type is not using override PHY type, in ice_phy_type_to_ethtool()
1523 advert_phy_type_lo = vsi->port_info->phy.phy_type_low; in ice_phy_type_to_ethtool()
1524 advert_phy_type_hi = vsi->port_info->phy.phy_type_high; in ice_phy_type_to_ethtool()
1528 ethtool_link_ksettings_zero_link_mode(ks, advertising); in ice_phy_type_to_ethtool()
1783 * ice_get_settings_link_up - Get Link settings for when link is up
1792 struct ice_port_info *pi = np->vsi->port_info; in ice_get_settings_link_up()
1794 struct ice_vsi *vsi = np->vsi; in ice_get_settings_link_up()
1796 link_info = &vsi->port_info->phy.link_info; in ice_get_settings_link_up()
1801 switch (link_info->link_speed) { in ice_get_settings_link_up()
1803 ks->base.speed = SPEED_100000; in ice_get_settings_link_up()
1806 ks->base.speed = SPEED_50000; in ice_get_settings_link_up()
1809 ks->base.speed = SPEED_40000; in ice_get_settings_link_up()
1812 ks->base.speed = SPEED_25000; in ice_get_settings_link_up()
1815 ks->base.speed = SPEED_20000; in ice_get_settings_link_up()
1818 ks->base.speed = SPEED_10000; in ice_get_settings_link_up()
1821 ks->base.speed = SPEED_5000; in ice_get_settings_link_up()
1824 ks->base.speed = SPEED_2500; in ice_get_settings_link_up()
1827 ks->base.speed = SPEED_1000; in ice_get_settings_link_up()
1830 ks->base.speed = SPEED_100; in ice_get_settings_link_up()
1834 link_info->link_speed); in ice_get_settings_link_up()
1837 ks->base.duplex = DUPLEX_FULL; in ice_get_settings_link_up()
1839 if (link_info->an_info & ICE_AQ_AN_COMPLETED) in ice_get_settings_link_up()
1844 switch (pi->fc.current_mode) { in ice_get_settings_link_up()
1867 * ice_get_settings_link_down - Get the Link settings when link is down
1883 ks->base.speed = SPEED_UNKNOWN; in ice_get_settings_link_down()
1884 ks->base.duplex = DUPLEX_UNKNOWN; in ice_get_settings_link_down()
1888 * ice_get_link_ksettings - Get Link Speed and Duplex settings
1901 struct ice_vsi *vsi = np->vsi; in ice_get_link_ksettings()
1906 ethtool_link_ksettings_zero_link_mode(ks, advertising); in ice_get_link_ksettings()
1908 hw_link_info = &vsi->port_info->phy.link_info; in ice_get_link_ksettings()
1911 if (hw_link_info->link_info & ICE_AQ_LINK_UP) in ice_get_link_ksettings()
1917 ks->base.autoneg = (hw_link_info->an_info & ICE_AQ_AN_COMPLETED) ? in ice_get_link_ksettings()
1921 switch (vsi->port_info->phy.media_type) { in ice_get_link_ksettings()
1924 ks->base.port = PORT_FIBRE; in ice_get_link_ksettings()
1928 ethtool_link_ksettings_add_link_mode(ks, advertising, TP); in ice_get_link_ksettings()
1929 ks->base.port = PORT_TP; in ice_get_link_ksettings()
1933 ethtool_link_ksettings_add_link_mode(ks, advertising, in ice_get_link_ksettings()
1935 ks->base.port = PORT_NONE; in ice_get_link_ksettings()
1939 ethtool_link_ksettings_add_link_mode(ks, advertising, FIBRE); in ice_get_link_ksettings()
1940 ks->base.port = PORT_DA; in ice_get_link_ksettings()
1943 ks->base.port = PORT_OTHER; in ice_get_link_ksettings()
1952 return -ENOMEM; in ice_get_link_ksettings()
1954 status = ice_aq_get_phy_caps(vsi->port_info, false, in ice_get_link_ksettings()
1957 err = -EIO; in ice_get_link_ksettings()
1962 if ((caps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) && in ice_get_link_ksettings()
1963 (caps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE)) { in ice_get_link_ksettings()
1964 ethtool_link_ksettings_add_link_mode(ks, advertising, Pause); in ice_get_link_ksettings()
1965 ethtool_link_ksettings_add_link_mode(ks, advertising, in ice_get_link_ksettings()
1967 } else if (caps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) { in ice_get_link_ksettings()
1968 ethtool_link_ksettings_add_link_mode(ks, advertising, in ice_get_link_ksettings()
1970 } else if (caps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE) { in ice_get_link_ksettings()
1971 ethtool_link_ksettings_add_link_mode(ks, advertising, Pause); in ice_get_link_ksettings()
1972 ethtool_link_ksettings_add_link_mode(ks, advertising, in ice_get_link_ksettings()
1975 ethtool_link_ksettings_del_link_mode(ks, advertising, Pause); in ice_get_link_ksettings()
1976 ethtool_link_ksettings_del_link_mode(ks, advertising, in ice_get_link_ksettings()
1981 ethtool_link_ksettings_add_link_mode(ks, advertising, FEC_NONE); in ice_get_link_ksettings()
1983 if (caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ || in ice_get_link_ksettings()
1984 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_REQ) in ice_get_link_ksettings()
1985 ethtool_link_ksettings_add_link_mode(ks, advertising, in ice_get_link_ksettings()
1987 if (caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_528_REQ || in ice_get_link_ksettings()
1988 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_544_REQ) in ice_get_link_ksettings()
1989 ethtool_link_ksettings_add_link_mode(ks, advertising, FEC_RS); in ice_get_link_ksettings()
1991 status = ice_aq_get_phy_caps(vsi->port_info, false, in ice_get_link_ksettings()
1994 err = -EIO; in ice_get_link_ksettings()
2001 if (caps->link_fec_options & ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN || in ice_get_link_ksettings()
2002 caps->link_fec_options & ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN) in ice_get_link_ksettings()
2004 if (caps->link_fec_options & ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN) in ice_get_link_ksettings()
2010 ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg); in ice_get_link_ksettings()
2019 * ice_ksettings_find_adv_link_speed - Find advertising link speed
2027 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2030 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2033 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2035 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2038 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2041 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2044 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2047 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2049 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2052 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2054 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2057 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2059 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2061 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2064 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2066 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2068 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2070 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2073 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2075 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2078 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2081 if (ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2083 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2085 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2087 ethtool_link_ksettings_test_link_mode(ks, advertising, in ice_ksettings_find_adv_link_speed()
2118 if (!(p->phy.link_info.an_info & ICE_AQ_AN_COMPLETED)) { in ice_setup_autoneg()
2124 err = -EINVAL; in ice_setup_autoneg()
2127 config->caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT; in ice_setup_autoneg()
2133 if (p->phy.link_info.an_info & ICE_AQ_AN_COMPLETED) { in ice_setup_autoneg()
2141 err = -EINVAL; in ice_setup_autoneg()
2144 config->caps &= ~ICE_AQ_PHY_ENA_AUTO_LINK_UPDT; in ice_setup_autoneg()
2154 * ice_set_link_ksettings - Set Speed and Duplex
2171 struct ice_pf *pf = np->vsi->back; in ice_set_link_ksettings()
2180 pi = np->vsi->port_info; in ice_set_link_ksettings()
2183 return -EIO; in ice_set_link_ksettings()
2185 if (pi->phy.media_type != ICE_MEDIA_BASET && in ice_set_link_ksettings()
2186 pi->phy.media_type != ICE_MEDIA_FIBER && in ice_set_link_ksettings()
2187 pi->phy.media_type != ICE_MEDIA_BACKPLANE && in ice_set_link_ksettings()
2188 pi->phy.media_type != ICE_MEDIA_DA && in ice_set_link_ksettings()
2189 pi->phy.link_info.link_info & ICE_AQ_LINK_UP) in ice_set_link_ksettings()
2190 return -EOPNOTSUPP; in ice_set_link_ksettings()
2194 return -ENOMEM; in ice_set_link_ksettings()
2197 if (ice_fw_supports_report_dflt_cfg(pi->hw)) in ice_set_link_ksettings()
2204 err = -EIO; in ice_set_link_ksettings()
2217 if (!bitmap_subset(copy_ks.link_modes.advertising, in ice_set_link_ksettings()
2220 if (!test_bit(ICE_FLAG_LINK_LENIENT_MODE_ENA, pf->flags)) in ice_set_link_ksettings()
2222 err = -EOPNOTSUPP; in ice_set_link_ksettings()
2242 err = -EOPNOTSUPP; in ice_set_link_ksettings()
2246 while (test_and_set_bit(ICE_CFG_BUSY, pf->state)) { in ice_set_link_ksettings()
2247 timeout--; in ice_set_link_ksettings()
2249 err = -EBUSY; in ice_set_link_ksettings()
2259 config = pi->phy.curr_user_phy_cfg; in ice_set_link_ksettings()
2271 pi->phy.get_link_info = true; in ice_set_link_ksettings()
2274 err = -EIO; in ice_set_link_ksettings()
2278 curr_link_speed = pi->phy.link_info.link_speed; in ice_set_link_ksettings()
2297 pi->phy.link_info.req_speeds = adv_link_speed; in ice_set_link_ksettings()
2305 err = -EOPNOTSUPP; in ice_set_link_ksettings()
2313 phy_caps->phy_type_high; in ice_set_link_ksettings()
2315 phy_caps->phy_type_low; in ice_set_link_ksettings()
2322 if (test_bit(ICE_FLAG_LINK_LENIENT_MODE_ENA, pf->flags)) { in ice_set_link_ksettings()
2324 pf->nvm_phy_type_hi; in ice_set_link_ksettings()
2326 pf->nvm_phy_type_lo; in ice_set_link_ksettings()
2329 err = -EOPNOTSUPP; in ice_set_link_ksettings()
2335 if (pi->phy.link_info.link_info & ICE_AQ_LINK_UP) { in ice_set_link_ksettings()
2339 ice_print_link_msg(np->vsi, false); in ice_set_link_ksettings()
2345 status = ice_aq_set_phy_cfg(&pf->hw, pi, &config, NULL); in ice_set_link_ksettings()
2348 err = -EIO; in ice_set_link_ksettings()
2353 pi->phy.curr_user_speed_req = adv_link_speed; in ice_set_link_ksettings()
2356 clear_bit(ICE_CFG_BUSY, pf->state); in ice_set_link_ksettings()
2362 * ice_parse_hdrs - parses headers from RSS hash input
2372 switch (nfc->flow_type) { in ice_parse_hdrs()
2411 * ice_parse_hash_flds - parses hash fields from RSS hash input
2421 if (nfc->data & RXH_IP_SRC || nfc->data & RXH_IP_DST) { in ice_parse_hash_flds()
2422 switch (nfc->flow_type) { in ice_parse_hash_flds()
2426 if (nfc->data & RXH_IP_SRC) in ice_parse_hash_flds()
2428 if (nfc->data & RXH_IP_DST) in ice_parse_hash_flds()
2434 if (nfc->data & RXH_IP_SRC) in ice_parse_hash_flds()
2436 if (nfc->data & RXH_IP_DST) in ice_parse_hash_flds()
2444 if (nfc->data & RXH_L4_B_0_1 || nfc->data & RXH_L4_B_2_3) { in ice_parse_hash_flds()
2445 switch (nfc->flow_type) { in ice_parse_hash_flds()
2448 if (nfc->data & RXH_L4_B_0_1) in ice_parse_hash_flds()
2450 if (nfc->data & RXH_L4_B_2_3) in ice_parse_hash_flds()
2455 if (nfc->data & RXH_L4_B_0_1) in ice_parse_hash_flds()
2457 if (nfc->data & RXH_L4_B_2_3) in ice_parse_hash_flds()
2462 if (nfc->data & RXH_L4_B_0_1) in ice_parse_hash_flds()
2464 if (nfc->data & RXH_L4_B_2_3) in ice_parse_hash_flds()
2476 * ice_set_rss_hash_opt - Enable/Disable flow types for RSS hash
2485 struct ice_pf *pf = vsi->back; in ice_set_rss_hash_opt()
2494 vsi->vsi_num); in ice_set_rss_hash_opt()
2495 return -EINVAL; in ice_set_rss_hash_opt()
2501 vsi->vsi_num); in ice_set_rss_hash_opt()
2502 return -EINVAL; in ice_set_rss_hash_opt()
2508 vsi->vsi_num); in ice_set_rss_hash_opt()
2509 return -EINVAL; in ice_set_rss_hash_opt()
2512 status = ice_add_rss_cfg(&pf->hw, vsi->idx, hashed_flds, hdrs); in ice_set_rss_hash_opt()
2515 vsi->vsi_num, ice_stat_str(status)); in ice_set_rss_hash_opt()
2516 return -EINVAL; in ice_set_rss_hash_opt()
2523 * ice_get_rss_hash_opt - Retrieve hash fields for a given flow-type
2530 struct ice_pf *pf = vsi->back; in ice_get_rss_hash_opt()
2537 nfc->data = 0; in ice_get_rss_hash_opt()
2540 vsi->vsi_num); in ice_get_rss_hash_opt()
2547 vsi->vsi_num); in ice_get_rss_hash_opt()
2551 hash_flds = ice_get_rss_cfg(&pf->hw, vsi->idx, hdrs); in ice_get_rss_hash_opt()
2554 vsi->vsi_num); in ice_get_rss_hash_opt()
2560 nfc->data |= (u64)RXH_IP_SRC; in ice_get_rss_hash_opt()
2564 nfc->data |= (u64)RXH_IP_DST; in ice_get_rss_hash_opt()
2569 nfc->data |= (u64)RXH_L4_B_0_1; in ice_get_rss_hash_opt()
2574 nfc->data |= (u64)RXH_L4_B_2_3; in ice_get_rss_hash_opt()
2578 * ice_set_rxnfc - command to set Rx flow rules.
2587 struct ice_vsi *vsi = np->vsi; in ice_set_rxnfc()
2589 switch (cmd->cmd) { in ice_set_rxnfc()
2599 return -EOPNOTSUPP; in ice_set_rxnfc()
2603 * ice_get_rxnfc - command to get Rx flow classification rules
2615 struct ice_vsi *vsi = np->vsi; in ice_get_rxnfc()
2616 int ret = -EOPNOTSUPP; in ice_get_rxnfc()
2619 hw = &vsi->back->hw; in ice_get_rxnfc()
2621 switch (cmd->cmd) { in ice_get_rxnfc()
2623 cmd->data = vsi->rss_size; in ice_get_rxnfc()
2627 cmd->rule_cnt = hw->fdir_active_fltr; in ice_get_rxnfc()
2629 cmd->data = ice_get_fdir_cnt_all(hw); in ice_get_rxnfc()
2653 struct ice_vsi *vsi = np->vsi; in ice_get_ringparam()
2655 ring->rx_max_pending = ICE_MAX_NUM_DESC; in ice_get_ringparam()
2656 ring->tx_max_pending = ICE_MAX_NUM_DESC; in ice_get_ringparam()
2657 ring->rx_pending = vsi->rx_rings[0]->count; in ice_get_ringparam()
2658 ring->tx_pending = vsi->tx_rings[0]->count; in ice_get_ringparam()
2661 ring->rx_mini_max_pending = 0; in ice_get_ringparam()
2662 ring->rx_jumbo_max_pending = 0; in ice_get_ringparam()
2663 ring->rx_mini_pending = 0; in ice_get_ringparam()
2664 ring->rx_jumbo_pending = 0; in ice_get_ringparam()
2673 struct ice_vsi *vsi = np->vsi; in ice_set_ringparam()
2674 struct ice_pf *pf = vsi->back; in ice_set_ringparam()
2678 if (ring->tx_pending > ICE_MAX_NUM_DESC || in ice_set_ringparam()
2679 ring->tx_pending < ICE_MIN_NUM_DESC || in ice_set_ringparam()
2680 ring->rx_pending > ICE_MAX_NUM_DESC || in ice_set_ringparam()
2681 ring->rx_pending < ICE_MIN_NUM_DESC) { in ice_set_ringparam()
2682 …netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d] (increment %d)\n", in ice_set_ringparam()
2683 ring->tx_pending, ring->rx_pending, in ice_set_ringparam()
2686 return -EINVAL; in ice_set_ringparam()
2689 new_tx_cnt = ALIGN(ring->tx_pending, ICE_REQ_DESC_MULTIPLE); in ice_set_ringparam()
2690 if (new_tx_cnt != ring->tx_pending) in ice_set_ringparam()
2693 new_rx_cnt = ALIGN(ring->rx_pending, ICE_REQ_DESC_MULTIPLE); in ice_set_ringparam()
2694 if (new_rx_cnt != ring->rx_pending) in ice_set_ringparam()
2699 if (new_tx_cnt == vsi->tx_rings[0]->count && in ice_set_ringparam()
2700 new_rx_cnt == vsi->rx_rings[0]->count) { in ice_set_ringparam()
2706 * disallow changing the number of descriptors -- regardless in ice_set_ringparam()
2710 return -EBUSY; in ice_set_ringparam()
2712 while (test_and_set_bit(ICE_CFG_BUSY, pf->state)) { in ice_set_ringparam()
2713 timeout--; in ice_set_ringparam()
2715 return -EBUSY; in ice_set_ringparam()
2720 if (!netif_running(vsi->netdev)) { in ice_set_ringparam()
2721 for (i = 0; i < vsi->alloc_txq; i++) in ice_set_ringparam()
2722 vsi->tx_rings[i]->count = new_tx_cnt; in ice_set_ringparam()
2723 for (i = 0; i < vsi->alloc_rxq; i++) in ice_set_ringparam()
2724 vsi->rx_rings[i]->count = new_rx_cnt; in ice_set_ringparam()
2726 for (i = 0; i < vsi->num_xdp_txq; i++) in ice_set_ringparam()
2727 vsi->xdp_rings[i]->count = new_tx_cnt; in ice_set_ringparam()
2728 vsi->num_tx_desc = (u16)new_tx_cnt; in ice_set_ringparam()
2729 vsi->num_rx_desc = (u16)new_rx_cnt; in ice_set_ringparam()
2734 if (new_tx_cnt == vsi->tx_rings[0]->count) in ice_set_ringparam()
2739 vsi->tx_rings[0]->count, new_tx_cnt); in ice_set_ringparam()
2741 tx_rings = kcalloc(vsi->num_txq, sizeof(*tx_rings), GFP_KERNEL); in ice_set_ringparam()
2743 err = -ENOMEM; in ice_set_ringparam()
2749 tx_rings[i] = *vsi->tx_rings[i]; in ice_set_ringparam()
2755 while (i--) in ice_set_ringparam()
2767 vsi->xdp_rings[0]->count, new_tx_cnt); in ice_set_ringparam()
2769 xdp_rings = kcalloc(vsi->num_xdp_txq, sizeof(*xdp_rings), GFP_KERNEL); in ice_set_ringparam()
2771 err = -ENOMEM; in ice_set_ringparam()
2775 for (i = 0; i < vsi->num_xdp_txq; i++) { in ice_set_ringparam()
2777 xdp_rings[i] = *vsi->xdp_rings[i]; in ice_set_ringparam()
2783 while (i--) in ice_set_ringparam()
2792 if (new_rx_cnt == vsi->rx_rings[0]->count) in ice_set_ringparam()
2797 vsi->rx_rings[0]->count, new_rx_cnt); in ice_set_ringparam()
2799 rx_rings = kcalloc(vsi->num_rxq, sizeof(*rx_rings), GFP_KERNEL); in ice_set_ringparam()
2801 err = -ENOMEM; in ice_set_ringparam()
2807 rx_rings[i] = *vsi->rx_rings[i]; in ice_set_ringparam()
2814 rx_rings[i].tail = vsi->back->hw.hw_addr + PRTGEN_STATUS; in ice_set_ringparam()
2826 i--; in ice_set_ringparam()
2830 err = -ENOMEM; in ice_set_ringparam()
2839 if (!test_and_set_bit(ICE_VSI_DOWN, vsi->state)) { in ice_set_ringparam()
2844 ice_free_tx_ring(vsi->tx_rings[i]); in ice_set_ringparam()
2845 *vsi->tx_rings[i] = tx_rings[i]; in ice_set_ringparam()
2852 ice_free_rx_ring(vsi->rx_rings[i]); in ice_set_ringparam()
2854 rx_rings[i].tail = vsi->rx_rings[i]->tail; in ice_set_ringparam()
2857 * but the recycling logic will let us re-use in ice_set_ringparam()
2863 *vsi->rx_rings[i] = rx_rings[i]; in ice_set_ringparam()
2869 for (i = 0; i < vsi->num_xdp_txq; i++) { in ice_set_ringparam()
2870 ice_free_tx_ring(vsi->xdp_rings[i]); in ice_set_ringparam()
2871 *vsi->xdp_rings[i] = xdp_rings[i]; in ice_set_ringparam()
2876 vsi->num_tx_desc = new_tx_cnt; in ice_set_ringparam()
2877 vsi->num_rx_desc = new_rx_cnt; in ice_set_ringparam()
2891 clear_bit(ICE_CFG_BUSY, pf->state); in ice_set_ringparam()
2896 * ice_get_pauseparam - Get Flow Control status
2909 struct ice_port_info *pi = np->vsi->port_info; in ice_get_pauseparam()
2915 pause->rx_pause = 0; in ice_get_pauseparam()
2916 pause->tx_pause = 0; in ice_get_pauseparam()
2918 dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; in ice_get_pauseparam()
2930 pause->autoneg = ice_is_phy_caps_an_enabled(pcaps) ? AUTONEG_ENABLE : in ice_get_pauseparam()
2933 if (dcbx_cfg->pfc.pfcena) in ice_get_pauseparam()
2937 if (pcaps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) in ice_get_pauseparam()
2938 pause->tx_pause = 1; in ice_get_pauseparam()
2939 if (pcaps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE) in ice_get_pauseparam()
2940 pause->rx_pause = 1; in ice_get_pauseparam()
2947 * ice_set_pauseparam - Set Flow Control parameter
2957 struct ice_pf *pf = np->vsi->back; in ice_set_pauseparam()
2959 struct ice_vsi *vsi = np->vsi; in ice_set_pauseparam()
2960 struct ice_hw *hw = &pf->hw; in ice_set_pauseparam()
2968 pi = vsi->port_info; in ice_set_pauseparam()
2969 hw_link_info = &pi->phy.link_info; in ice_set_pauseparam()
2970 dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; in ice_set_pauseparam()
2971 link_up = hw_link_info->link_info & ICE_AQ_LINK_UP; in ice_set_pauseparam()
2976 if (vsi->type != ICE_VSI_PF) { in ice_set_pauseparam()
2978 return -EOPNOTSUPP; in ice_set_pauseparam()
2983 * defined get pause param pause->autoneg reports SW configured setting, in ice_set_pauseparam()
2984 * so compare pause->autoneg with SW configured to prevent the user from in ice_set_pauseparam()
2989 return -ENOMEM; in ice_set_pauseparam()
2996 return -EIO; in ice_set_pauseparam()
3004 if (pause->autoneg != is_an) { in ice_set_pauseparam()
3005 netdev_info(netdev, "To change autoneg please use: ethtool -s <dev> autoneg <on|off>\n"); in ice_set_pauseparam()
3006 return -EOPNOTSUPP; in ice_set_pauseparam()
3010 if (!test_bit(ICE_DOWN, pf->state) && in ice_set_pauseparam()
3011 !(hw_link_info->an_info & ICE_AQ_AN_COMPLETED)) { in ice_set_pauseparam()
3016 if (dcbx_cfg->pfc.pfcena) { in ice_set_pauseparam()
3018 return -EOPNOTSUPP; in ice_set_pauseparam()
3020 if (pause->rx_pause && pause->tx_pause) in ice_set_pauseparam()
3021 pi->fc.req_mode = ICE_FC_FULL; in ice_set_pauseparam()
3022 else if (pause->rx_pause && !pause->tx_pause) in ice_set_pauseparam()
3023 pi->fc.req_mode = ICE_FC_RX_PAUSE; in ice_set_pauseparam()
3024 else if (!pause->rx_pause && pause->tx_pause) in ice_set_pauseparam()
3025 pi->fc.req_mode = ICE_FC_TX_PAUSE; in ice_set_pauseparam()
3026 else if (!pause->rx_pause && !pause->tx_pause) in ice_set_pauseparam()
3027 pi->fc.req_mode = ICE_FC_NONE; in ice_set_pauseparam()
3029 return -EINVAL; in ice_set_pauseparam()
3037 ice_aq_str(hw->adminq.sq_last_status)); in ice_set_pauseparam()
3038 err = -EAGAIN; in ice_set_pauseparam()
3042 ice_aq_str(hw->adminq.sq_last_status)); in ice_set_pauseparam()
3043 err = -EAGAIN; in ice_set_pauseparam()
3047 ice_aq_str(hw->adminq.sq_last_status)); in ice_set_pauseparam()
3048 err = -EAGAIN; in ice_set_pauseparam()
3055 * ice_get_rxfh_key_size - get the RSS hash key size
3066 * ice_get_rxfh_indir_size - get the Rx flow hash indirection table size
3075 return np->vsi->rss_table_size; in ice_get_rxfh_indir_size()
3079 * ice_get_rxfh - get the Rx flow hash indirection table
3091 struct ice_vsi *vsi = np->vsi; in ice_get_rxfh()
3092 struct ice_pf *pf = vsi->back; in ice_get_rxfh()
3102 if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) { in ice_get_rxfh()
3105 return -EIO; in ice_get_rxfh()
3108 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in ice_get_rxfh()
3110 return -ENOMEM; in ice_get_rxfh()
3116 err = ice_get_rss_lut(vsi, lut, vsi->rss_table_size); in ice_get_rxfh()
3120 for (i = 0; i < vsi->rss_table_size; i++) in ice_get_rxfh()
3129 * ice_set_rxfh - set the Rx flow hash indirection table
3135 * Returns -EINVAL if the table specifies an invalid queue ID, otherwise
3143 struct ice_vsi *vsi = np->vsi; in ice_set_rxfh()
3144 struct ice_pf *pf = vsi->back; in ice_set_rxfh()
3150 return -EOPNOTSUPP; in ice_set_rxfh()
3152 if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) { in ice_set_rxfh()
3155 return -EIO; in ice_set_rxfh()
3159 if (!vsi->rss_hkey_user) { in ice_set_rxfh()
3160 vsi->rss_hkey_user = in ice_set_rxfh()
3163 if (!vsi->rss_hkey_user) in ice_set_rxfh()
3164 return -ENOMEM; in ice_set_rxfh()
3166 memcpy(vsi->rss_hkey_user, key, ICE_VSIQF_HKEY_ARRAY_SIZE); in ice_set_rxfh()
3168 err = ice_set_rss_key(vsi, vsi->rss_hkey_user); in ice_set_rxfh()
3173 if (!vsi->rss_lut_user) { in ice_set_rxfh()
3174 vsi->rss_lut_user = devm_kzalloc(dev, vsi->rss_table_size, in ice_set_rxfh()
3176 if (!vsi->rss_lut_user) in ice_set_rxfh()
3177 return -ENOMEM; in ice_set_rxfh()
3184 for (i = 0; i < vsi->rss_table_size; i++) in ice_set_rxfh()
3185 vsi->rss_lut_user[i] = (u8)(indir[i]); in ice_set_rxfh()
3187 ice_fill_rss_lut(vsi->rss_lut_user, vsi->rss_table_size, in ice_set_rxfh()
3188 vsi->rss_size); in ice_set_rxfh()
3191 err = ice_set_rss_lut(vsi, vsi->rss_lut_user, vsi->rss_table_size); in ice_set_rxfh()
3204 if (!test_bit(ICE_FLAG_PTP, pf->flags)) in ice_get_ts_info()
3207 info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | in ice_get_ts_info()
3214 info->phc_index = ice_get_ptp_clock_index(pf); in ice_get_ts_info()
3216 info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON); in ice_get_ts_info()
3218 info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | BIT(HWTSTAMP_FILTER_ALL); in ice_get_ts_info()
3224 * ice_get_max_txq - return the maximum number of Tx queues for in a PF
3229 return min3(pf->num_lan_msix, (u16)num_online_cpus(), in ice_get_max_txq()
3230 (u16)pf->hw.func_caps.common_cap.num_txq); in ice_get_max_txq()
3234 * ice_get_max_rxq - return the maximum number of Rx queues for in a PF
3239 return min3(pf->num_lan_msix, (u16)num_online_cpus(), in ice_get_max_rxq()
3240 (u16)pf->hw.func_caps.common_cap.num_rxq); in ice_get_max_rxq()
3244 * ice_get_combined_cnt - return the current number of combined channels
3256 struct ice_q_vector *q_vector = vsi->q_vectors[q_idx]; in ice_get_combined_cnt()
3258 if (q_vector->rx.ring && q_vector->tx.ring) in ice_get_combined_cnt()
3266 * ice_get_channels - get the current and max supported channels
3274 struct ice_vsi *vsi = np->vsi; in ice_get_channels()
3275 struct ice_pf *pf = vsi->back; in ice_get_channels()
3278 ch->max_rx = ice_get_max_rxq(pf); in ice_get_channels()
3279 ch->max_tx = ice_get_max_txq(pf); in ice_get_channels()
3280 ch->max_combined = min_t(int, ch->max_rx, ch->max_tx); in ice_get_channels()
3283 ch->combined_count = ice_get_combined_cnt(vsi); in ice_get_channels()
3284 ch->rx_count = vsi->num_rxq - ch->combined_count; in ice_get_channels()
3285 ch->tx_count = vsi->num_txq - ch->combined_count; in ice_get_channels()
3288 ch->other_count = test_bit(ICE_FLAG_FD_ENA, pf->flags) ? 1 : 0; in ice_get_channels()
3289 ch->max_other = ch->other_count; in ice_get_channels()
3293 * ice_get_valid_rss_size - return valid number of RSS queues
3299 struct ice_hw_common_caps *caps = &hw->func_caps.common_cap; in ice_get_valid_rss_size()
3301 return min_t(int, new_size, BIT(caps->rss_table_entry_width)); in ice_get_valid_rss_size()
3305 * ice_vsi_set_dflt_rss_lut - set default RSS LUT with requested RSS size
3313 struct ice_pf *pf = vsi->back; in ice_vsi_set_dflt_rss_lut()
3320 hw = &pf->hw; in ice_vsi_set_dflt_rss_lut()
3323 return -EINVAL; in ice_vsi_set_dflt_rss_lut()
3325 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in ice_vsi_set_dflt_rss_lut()
3327 return -ENOMEM; in ice_vsi_set_dflt_rss_lut()
3330 if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) in ice_vsi_set_dflt_rss_lut()
3331 vsi->rss_size = 1; in ice_vsi_set_dflt_rss_lut()
3333 vsi->rss_size = ice_get_valid_rss_size(hw, req_rss_size); in ice_vsi_set_dflt_rss_lut()
3336 ice_fill_rss_lut(lut, vsi->rss_table_size, vsi->rss_size); in ice_vsi_set_dflt_rss_lut()
3337 err = ice_set_rss_lut(vsi, lut, vsi->rss_table_size); in ice_vsi_set_dflt_rss_lut()
3340 ice_aq_str(hw->adminq.sq_last_status)); in ice_vsi_set_dflt_rss_lut()
3347 * ice_set_channels - set the number channels
3354 struct ice_vsi *vsi = np->vsi; in ice_set_channels()
3355 struct ice_pf *pf = vsi->back; in ice_set_channels()
3362 return -EOPNOTSUPP; in ice_set_channels()
3365 if (ch->other_count != (test_bit(ICE_FLAG_FD_ENA, pf->flags) ? 1U : 0U)) in ice_set_channels()
3366 return -EINVAL; in ice_set_channels()
3368 if (test_bit(ICE_FLAG_FD_ENA, pf->flags) && pf->hw.fdir_active_fltr) { in ice_set_channels()
3370 return -EOPNOTSUPP; in ice_set_channels()
3376 * value on cmd line but we get non-zero value anyway via in ice_set_channels()
3380 if (ch->rx_count == vsi->num_rxq - curr_combined) in ice_set_channels()
3381 ch->rx_count = 0; in ice_set_channels()
3382 if (ch->tx_count == vsi->num_txq - curr_combined) in ice_set_channels()
3383 ch->tx_count = 0; in ice_set_channels()
3384 if (ch->combined_count == curr_combined) in ice_set_channels()
3385 ch->combined_count = 0; in ice_set_channels()
3387 if (!(ch->combined_count || (ch->rx_count && ch->tx_count))) { in ice_set_channels()
3389 return -EINVAL; in ice_set_channels()
3392 new_rx = ch->combined_count + ch->rx_count; in ice_set_channels()
3393 new_tx = ch->combined_count + ch->tx_count; in ice_set_channels()
3398 return -EINVAL; in ice_set_channels()
3403 return -EINVAL; in ice_set_channels()
3412 vsi->rss_size = ice_get_valid_rss_size(&pf->hw, new_rx); in ice_set_channels()
3418 * ice_get_wol - get current Wake on LAN configuration
3425 struct ice_pf *pf = np->vsi->back; in ice_get_wol()
3427 if (np->vsi->type != ICE_VSI_PF) in ice_get_wol()
3431 if (ice_is_wol_supported(&pf->hw)) { in ice_get_wol()
3432 wol->supported = WAKE_MAGIC; in ice_get_wol()
3433 wol->wolopts = pf->wol_ena ? WAKE_MAGIC : 0; in ice_get_wol()
3435 wol->supported = 0; in ice_get_wol()
3436 wol->wolopts = 0; in ice_get_wol()
3441 * ice_set_wol - set Wake on LAN on supported device
3448 struct ice_vsi *vsi = np->vsi; in ice_set_wol()
3449 struct ice_pf *pf = vsi->back; in ice_set_wol()
3451 if (vsi->type != ICE_VSI_PF || !ice_is_wol_supported(&pf->hw)) in ice_set_wol()
3452 return -EOPNOTSUPP; in ice_set_wol()
3455 if (wol->wolopts && wol->wolopts != WAKE_MAGIC) in ice_set_wol()
3456 return -EOPNOTSUPP; in ice_set_wol()
3459 if (pf->wol_ena != !!wol->wolopts) { in ice_set_wol()
3460 pf->wol_ena = !!wol->wolopts; in ice_set_wol()
3461 device_set_wakeup_enable(ice_pf_to_dev(pf), pf->wol_ena); in ice_set_wol()
3463 pf->wol_ena ? "en" : "dis"); in ice_set_wol()
3475 * ice_get_rc_coalesce - get ITR values for specific ring container
3490 if (!rc->ring) in ice_get_rc_coalesce()
3491 return -EINVAL; in ice_get_rc_coalesce()
3495 ec->use_adaptive_rx_coalesce = ITR_IS_DYNAMIC(rc); in ice_get_rc_coalesce()
3496 ec->rx_coalesce_usecs = rc->itr_setting; in ice_get_rc_coalesce()
3497 ec->rx_coalesce_usecs_high = rc->ring->q_vector->intrl; in ice_get_rc_coalesce()
3500 ec->use_adaptive_tx_coalesce = ITR_IS_DYNAMIC(rc); in ice_get_rc_coalesce()
3501 ec->tx_coalesce_usecs = rc->itr_setting; in ice_get_rc_coalesce()
3504 dev_dbg(ice_pf_to_dev(rc->ring->vsi->back), "Invalid c_type %d\n", c_type); in ice_get_rc_coalesce()
3505 return -EINVAL; in ice_get_rc_coalesce()
3512 * ice_get_q_coalesce - get a queue's ITR/INTRL (coalesce) settings
3524 if (q_num < vsi->num_rxq && q_num < vsi->num_txq) { in ice_get_q_coalesce()
3526 &vsi->rx_rings[q_num]->q_vector->rx)) in ice_get_q_coalesce()
3527 return -EINVAL; in ice_get_q_coalesce()
3529 &vsi->tx_rings[q_num]->q_vector->tx)) in ice_get_q_coalesce()
3530 return -EINVAL; in ice_get_q_coalesce()
3531 } else if (q_num < vsi->num_rxq) { in ice_get_q_coalesce()
3533 &vsi->rx_rings[q_num]->q_vector->rx)) in ice_get_q_coalesce()
3534 return -EINVAL; in ice_get_q_coalesce()
3535 } else if (q_num < vsi->num_txq) { in ice_get_q_coalesce()
3537 &vsi->tx_rings[q_num]->q_vector->tx)) in ice_get_q_coalesce()
3538 return -EINVAL; in ice_get_q_coalesce()
3540 return -EINVAL; in ice_get_q_coalesce()
3547 * __ice_get_coalesce - get ITR/INTRL values for the device
3560 struct ice_vsi *vsi = np->vsi; in __ice_get_coalesce()
3566 return -EINVAL; in __ice_get_coalesce()
3576 return __ice_get_coalesce(netdev, ec, -1); in ice_get_coalesce()
3587 * ice_set_rc_coalesce - set ITR values for specific ring container
3605 struct ice_pf *pf = vsi->back; in ice_set_rc_coalesce()
3608 if (!rc->ring) in ice_set_rc_coalesce()
3609 return -EINVAL; in ice_set_rc_coalesce()
3613 if (ec->rx_coalesce_usecs_high > ICE_MAX_INTRL || in ice_set_rc_coalesce()
3614 (ec->rx_coalesce_usecs_high && in ice_set_rc_coalesce()
3615 ec->rx_coalesce_usecs_high < pf->hw.intrl_gran)) { in ice_set_rc_coalesce()
3616 netdev_info(vsi->netdev, "Invalid value, %s-usecs-high valid values are 0 (disabled), %d-%d\n", in ice_set_rc_coalesce()
3617 c_type_str, pf->hw.intrl_gran, in ice_set_rc_coalesce()
3619 return -EINVAL; in ice_set_rc_coalesce()
3621 if (ec->rx_coalesce_usecs_high != rc->ring->q_vector->intrl && in ice_set_rc_coalesce()
3622 (ec->use_adaptive_rx_coalesce || ec->use_adaptive_tx_coalesce)) { in ice_set_rc_coalesce()
3623 …netdev_info(vsi->netdev, "Invalid value, %s-usecs-high cannot be changed if adaptive-tx or adaptiv… in ice_set_rc_coalesce()
3625 return -EINVAL; in ice_set_rc_coalesce()
3627 if (ec->rx_coalesce_usecs_high != rc->ring->q_vector->intrl) { in ice_set_rc_coalesce()
3628 rc->ring->q_vector->intrl = ec->rx_coalesce_usecs_high; in ice_set_rc_coalesce()
3629 ice_write_intrl(rc->ring->q_vector, in ice_set_rc_coalesce()
3630 ec->rx_coalesce_usecs_high); in ice_set_rc_coalesce()
3633 use_adaptive_coalesce = ec->use_adaptive_rx_coalesce; in ice_set_rc_coalesce()
3634 coalesce_usecs = ec->rx_coalesce_usecs; in ice_set_rc_coalesce()
3638 use_adaptive_coalesce = ec->use_adaptive_tx_coalesce; in ice_set_rc_coalesce()
3639 coalesce_usecs = ec->tx_coalesce_usecs; in ice_set_rc_coalesce()
3645 return -EINVAL; in ice_set_rc_coalesce()
3648 itr_setting = rc->itr_setting; in ice_set_rc_coalesce()
3650 netdev_info(vsi->netdev, "%s interrupt throttling cannot be changed if adaptive-%s is enabled\n", in ice_set_rc_coalesce()
3652 return -EINVAL; in ice_set_rc_coalesce()
3656 netdev_info(vsi->netdev, "Invalid value, %s-usecs range is 0-%d\n", in ice_set_rc_coalesce()
3658 return -EINVAL; in ice_set_rc_coalesce()
3662 rc->itr_mode = ITR_DYNAMIC; in ice_set_rc_coalesce()
3664 rc->itr_mode = ITR_STATIC; in ice_set_rc_coalesce()
3666 rc->itr_setting = coalesce_usecs; in ice_set_rc_coalesce()
3673 ice_flush(&pf->hw); in ice_set_rc_coalesce()
3680 * ice_set_q_coalesce - set a queue's ITR/INTRL (coalesce) settings
3692 if (q_num < vsi->num_rxq && q_num < vsi->num_txq) { in ice_set_q_coalesce()
3694 &vsi->rx_rings[q_num]->q_vector->rx, in ice_set_q_coalesce()
3696 return -EINVAL; in ice_set_q_coalesce()
3699 &vsi->tx_rings[q_num]->q_vector->tx, in ice_set_q_coalesce()
3701 return -EINVAL; in ice_set_q_coalesce()
3702 } else if (q_num < vsi->num_rxq) { in ice_set_q_coalesce()
3704 &vsi->rx_rings[q_num]->q_vector->rx, in ice_set_q_coalesce()
3706 return -EINVAL; in ice_set_q_coalesce()
3707 } else if (q_num < vsi->num_txq) { in ice_set_q_coalesce()
3709 &vsi->tx_rings[q_num]->q_vector->tx, in ice_set_q_coalesce()
3711 return -EINVAL; in ice_set_q_coalesce()
3713 return -EINVAL; in ice_set_q_coalesce()
3720 * ice_print_if_odd_usecs - print message if user tries to set odd [tx|rx]-usecs
3724 * @coalesce_usecs: requested value of [tx|rx]-usecs
3725 * @c_type_str: either "rx" or "tx" to match user set field of [tx|rx]-usecs
3736 …netdev_info(netdev, "User set %s-usecs to %d, device only supports even values. Rounding down and … in ice_print_if_odd_usecs()
3742 * __ice_set_coalesce - set ITR/INTRL values for the device
3755 struct ice_vsi *vsi = np->vsi; in __ice_set_coalesce()
3758 struct ice_q_vector *q_vector = vsi->q_vectors[0]; in __ice_set_coalesce()
3762 ice_print_if_odd_usecs(netdev, q_vector->rx.itr_setting, in __ice_set_coalesce()
3763 ec->use_adaptive_rx_coalesce, in __ice_set_coalesce()
3764 ec->rx_coalesce_usecs, "rx"); in __ice_set_coalesce()
3766 ice_print_if_odd_usecs(netdev, q_vector->tx.itr_setting, in __ice_set_coalesce()
3767 ec->use_adaptive_tx_coalesce, in __ice_set_coalesce()
3768 ec->tx_coalesce_usecs, "tx"); in __ice_set_coalesce()
3773 * can be less than vsi->num_q_vectors. This check in __ice_set_coalesce()
3776 if (v_idx >= vsi->num_rxq && v_idx >= vsi->num_txq) in __ice_set_coalesce()
3780 return -EINVAL; in __ice_set_coalesce()
3786 return -EINVAL; in __ice_set_coalesce()
3797 return __ice_set_coalesce(netdev, ec, -1); in ice_set_coalesce()
3820 * ice_get_module_info - get SFF module type and revision information
3829 struct ice_vsi *vsi = np->vsi; in ice_get_module_info()
3830 struct ice_pf *pf = vsi->back; in ice_get_module_info()
3831 struct ice_hw *hw = &pf->hw; in ice_get_module_info()
3841 return -EIO; in ice_get_module_info()
3849 return -EIO; in ice_get_module_info()
3854 return -EIO; in ice_get_module_info()
3857 modinfo->type = ETH_MODULE_SFF_8079; in ice_get_module_info()
3858 modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; in ice_get_module_info()
3861 modinfo->type = ETH_MODULE_SFF_8472; in ice_get_module_info()
3862 modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; in ice_get_module_info()
3864 modinfo->type = ETH_MODULE_SFF_8079; in ice_get_module_info()
3865 modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; in ice_get_module_info()
3874 return -EIO; in ice_get_module_info()
3877 /* Module is SFF-8636 compliant */ in ice_get_module_info()
3878 modinfo->type = ETH_MODULE_SFF_8636; in ice_get_module_info()
3879 modinfo->eeprom_len = ICE_MODULE_QSFP_MAX_LEN; in ice_get_module_info()
3881 modinfo->type = ETH_MODULE_SFF_8436; in ice_get_module_info()
3882 modinfo->eeprom_len = ICE_MODULE_QSFP_MAX_LEN; in ice_get_module_info()
3887 return -EINVAL; in ice_get_module_info()
3893 * ice_get_module_eeprom - fill buffer with SFF EEPROM contents
3906 struct ice_vsi *vsi = np->vsi; in ice_get_module_eeprom()
3907 struct ice_pf *pf = vsi->back; in ice_get_module_eeprom()
3908 struct ice_hw *hw = &pf->hw; in ice_get_module_eeprom()
3915 if (!ee || !ee->len || !data) in ice_get_module_eeprom()
3916 return -EINVAL; in ice_get_module_eeprom()
3921 return -EIO; in ice_get_module_eeprom()
3926 memset(data, 0, ee->len); in ice_get_module_eeprom()
3927 for (i = 0; i < ee->len; i += SFF_READ_BLOCK_SIZE) { in ice_get_module_eeprom()
3928 offset = i + ee->offset; in ice_get_module_eeprom()
3934 offset -= ETH_MODULE_SFF_8079_LEN; in ice_get_module_eeprom()
3940 offset -= ETH_MODULE_SFF_8436_LEN / 2; in ice_get_module_eeprom()
3973 if ((i + SFF_READ_BLOCK_SIZE) < ee->len) in ice_get_module_eeprom()
4050 * ice_set_ethtool_safe_mode_ops - setup safe mode ethtool ops
4055 netdev->ethtool_ops = &ice_ethtool_safe_mode_ops; in ice_set_ethtool_safe_mode_ops()
4059 * ice_set_ethtool_ops - setup netdev ethtool ops
4066 netdev->ethtool_ops = &ice_ethtool_ops; in ice_set_ethtool_ops()